Rev 163 |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
| ?url?
; LAST UPDATE: 26.04.2023 savelij
STACK_CURR_DIR EQU 0x6000 ; á⥪ ®¬¥à®¢ ¤¨à ¯¥à¥¤ ¢å®¤®¬ ¢ ¥¥
; FAT äãªæ¨¨ ¯® ®¬¥à ¬
INIT_VAR
SETVAR Init_Fatvars ; ¨¨â FAT ¤à ©¢¥à
SETVAR Getfzap ; ¯®«ãç¨âì ®¯¨á ⥫ì ä ©«
SETVAR Getlong ; ¯®«ãç¨âì ¤«¨®¥ ¨¬ï ä ©«
SETVAR Finddir ; ©â¨ ¢á¥ ¤¨à¥ªâ®à¨¨
SETVAR Findfil ; ©â¨ ¢á¥ ä ©«ë ¯® ¬ ᪥
SETVAR Set_fil ; ãáâ ®¢ª ®¬¥à ä ©«
SETVAR Nextsec ; á«¥¤ãî騩 ᥪâ®à MP3 稯
SETVAR Openfil ; ®âªàë⨥ ä ©«
SETVAR Prvdir ; ¯à¥¤ë¤ãé ï DIR ¤«ï PLAY
SETVAR Nxtdir ; á«¥¤ãîé ï DIR ¤«ï PLAY
SETVAR Loadfil ; § £à㧪 ä ©«
INIT_VAR B512BAS
SETVAR BUF_512, 0x200 ; 200 ¡ãä¥à ᥪâ®à
SETVAR TDIRCLS, 0x400 ; 400 ¡ãä¥à ª« áâ¥à®¢ root ¤¨à¥ªâ®à¨¨
SETVAR DIR_CEP, 0x100 ; 100 楯®çª ª« áâ¥à®¢ ¯®¤¤¨à¥ªâ®à¨©
SETVAR BUF_PATH, 0x100 ; 100 ¡ãä¥à ⥪ã饣® ¯ãâ¨
SETVAR ERORDRV, WORD ; 2 ¢®§¢à â á ®è¨¡ª®© ¢ A
SETVAR FATType, BYTE ; ⨯ FAT: 0-12/1-16/2-32
SETVAR NumFATs, BYTE ; ª®«¨ç¥á⢮ FAT â ¡«¨æ
SETVAR SecPerClus, BYTE ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ¢ ª« áâ¥à¥
SETVAR RootDIRCluster, DWORD ; ®¬¥à ª« áâ¥à ª®à¥¢®© DIR
SETVAR NumSecRootDir, DWORD ; ®¬¥à ᥪâ®à ª®à¥¢®© ¤¨à¥ªâ®à¨¨
SETVAR ROOTSEC, WORD ; à §¬¥à ¢ ᥪâ®à å ROOT ¤¨à¥ªâ®à¨¨
SETVAR FATSize, DWORD ; à §¬¥à FAT â ¡«¨æë ¢ ᥪâ®à å
SETVAR StartSecVol, DWORD ; ®¬¥à áâ à⮢®£® ᥪâ®à à §¤¥«
SETVAR FirstSecData, DWORD ; ®¬¥à ᥪâ®à ç « ®¡« á⨠¤ ëå
SETVAR NumSecFAT1, DWORD ; ®¬¥à ᥪâ®à ¯¥à¢®© FAT â ¡«¨æë
SETVAR NumSecFAT2, DWORD ; ®¬¥à ᥪâ®à ¢â®à®© FAT â ¡«¨æë
SETVAR NumSec2Buf, DWORD ; ®¬¥à ᥪâ®à § £à㦥®£® ¢ ¡ãä¥à
SETVAR NumsSectorsVol, DWORD ; ª®«¨ç¥á⢮ ᥪâ®à®¢ à §¤¥«¥
SETVAR NumsClustersVol, DWORD ; ª®«¨ç¥á⢮ ª« áâ¥à®¢ à §¤¥«¥
SETVAR CurrentDIRCluster, DWORD ; ®¬¥à ª« áâ¥à ⥪ã饩 DIR
SETVAR TEK_ZAP, WORD ; ⥪ãé ï § ¯¨áì ¢ DIR
SETVAR TEK_LEV, BYTE ; £«ã¡¨ 宦¤¥¨ï ¢ ¤¨à¥ªâ®à¨ïå
SETVAR NUMSECK, BYTE ; áç¥â稪 ᥪâ®à®¢ ¢ ª« áâ¥à¥
SETVAR PAGEDIR, WORD ; ¤à¥á 㪫 ¤ ¨ï ¢ áâà ¨æ¥ ¤¨à®¢
SETVAR PAGEMP3, WORD ; ¤à¥á 㪫 ¤ ¨ï ¢ áâà ¨æ¥ ä ©«®¢
SETVAR TFILCLS, DWORD ; ⥪ã騩 ª« áâ¥à
SETVAR TEKNUMC, WORD ; ¤à¥á ⥪ã饣® ª« áâ¥à
SETVAR MPHWOST, BYTE ; ®áâ ⮪ ᥪâ®à®¢ ¢ ¯®á«¥¤¥¬ ª« áâ¥à¥
SETVAR KOL_CLS, DWORD ; ª®«-¢® ¯®«ëå ª« áâ¥à®¢ ä ©«
SETVAR KOLVMP3, WORD ; ª®«-¢® ©¤¥ëå ä ©«®¢
SETVAR KOLVDIR, WORD ; ª®«-¢® ©¤¥ëå ¤¨à®¢
SETVAR STR_MP3, WORD ; ¤à¥á 㪫 ¤ª¨ ©¤¥ëå ä ©«®¢
SETVAR STACKPREVDIR, WORD ; ¤à¥á ¢ á⥪¥ ¯à¥¤ë¤ãé¨å ¤¨à¥ªâ®à¨© ¤«ï ¢®§¢à â ¢¢¥àå
SETVAR_ALIGN
SETVAR STR_DIR, 0 ; ? ¤à¥á 㪫 ¤ª¨ ©¤¥ëå DIR
; ®¡é ï â®çª ¢å®¤ ¤«ï à ¡®âë á FAT
CALL CMP_INT
DI
EXX
PUSH IX
PUSH IY
LD (ERORDRV),SP
PUSH HL
LD HL,EXITDRV
EX (SP),HL
PUSH HL
PUSH DE
ADD A,A
LD L,A
LD H,0
LD DE,TABLFAT
ADD HL,DE
EX AF,AF'
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
POP DE
EX (SP),HL
EXX
RET
ERR_DRV LD SP,(ERORDRV)
EXITDRV POP IY
POP IX
PUSH AF
LD A,(INT_MODE)
AND A
JR Z,EXITDRV1
EI
EXITDRV1 POP AF
RET
TABLFAT DW INIT_FATVARS ; 00 ¨¨â FAT ¤à ©¢¥à
DW GETFZAP ; 01 ¯®«ãç¨âì ®¯¨á ⥫ì ä ©«
DW GETLONG ; 02 ¯®«ãç¨âì ¤«¨®¥ ¨¬ï ä ©«
DW FINDDIR ; 03 ©â¨ ¢á¥ ¤¨à¥ªâ®à¨¨
DW FINDMP3 ; 04 ©â¨ ¢á¥ ä ©«ë ¯® ¬ ᪥
DW SET_MP3 ; 05 ãáâ ®¢ª ®¬¥à ä ©«
DW NEXTSEC ; 06 á«¥¤ãî騩 ᥪâ®à MP3 稯
DW OPENFIL ; 07 ®âªàë⨥ ä ©«
DW PRVDIR ; 08 ¯à¥¤ë¤ãé ï DIR ¤«ï PLAY
DW NXTDIR ; 09 á«¥¤ãîé ï DIR ¤«ï PLAY
DW LOADFIL ; 0A § £à㧪 ä ©«
NO_LNG POP DE
LD BC,8
LDIR
LD A,(HL)
CP " "
JR Z,.NO_LNG1
EX DE,HL
LD (HL),"."
INC HL
EX DE,HL
LDI
LDI
LDI
.NO_LNG1 EX DE,HL
LD (HL),0
POP HL
RET
GETLONG PUSH HL
PUSH HL
CALL SET_MP3
CALL GETFZAP
BIT 0,E
JR Z,NO_LNG
EXX
LD C,0
EXX
.GETLNG2 DEC BC
CALL GETRZAP
LD A,(HL)
INC HL
EXX
BIT 6,C
POP HL
JR NZ,.GETLNGE_1
LD C,A
EXX
LD A,5
CALL .GETLNG1
AND A
JR Z,.GETLNGE
INC HL
INC HL
INC HL
LD A,6
CALL .GETLNG1
AND A
JR Z,.GETLNGE
INC HL
INC HL
LD A,2
CALL .GETLNG1
AND A
JR Z,.GETLNGE
EXX
PUSH HL
EXX
JR .GETLNG2
.GETLNGE EXX
.GETLNGE_1 LD (HL),0
EXX
POP HL
RET
.GETLNG1 EXX
LD B,A
EXX
.GETLNG1_3 LD D,(HL)
INC HL
LD E,(HL)
INC HL
LD A,D
OR E
RET Z
LD A,E
AND A
JR NZ,.GETLNG3
LD A,D
CP 0x80
JR C,.GETLNG5
LD D,0x5F
JR .GETLNG5
.GETLNG3 CP 4
LD A,0x5F
JR NZ,.GETLNG5
LD A,D
LD E,0xEF
LD D,0x5F
CP 1
JR Z,.GETLNG4
LD E,0xA0
CP 0x51
JR Z,.GETLNG4
SUB 0x10
LD E,0x80
JR NC,.GETLNG6
LD A,D
JR .GETLNG5
.GETLNG6 CP 0x30
JR C,.GETLNG4
LD E,0xB0
CP 0x40
JR C,.GETLNG4
LD A,D
JR .GETLNG5
.GETLNG4 ADD A,E
.GETLNG5 EXX
LD (HL),A
INC HL
DEC B
EXX
RET Z
JR .GETLNG1_3
; 401,410-44F,451
READ_SECTOR CALL CPNUMSC
JR NZ,.L1
LD HL,BUF_512
RET
.L1 LD (NumSec2Buf),DE
LD (NumSec2Buf+2),BC
LD HL,BUF_512
PUSH HL
EX AF,AF'
LD A,2
CALL COM__SD
AND A
JP NZ,ERR_DRV
POP HL
RET
; ¯à®¢¥àª 㦥 § £àã¦¥ë© á¥ªâ®à
CPNUMSC LD HL,NumSec2Buf
LD A,(HL)
INC HL
CP E
RET NZ
LD A,(HL)
INC HL
CP D
RET NZ
LD A,(HL)
INC HL
CP C
RET NZ
LD A,(HL)
CP B
RET
ENT_DIR CALL GETFZAP
BIT 4,A
EX AF,AF'
LD A,E
EX AF,AF'
LD E,A
LD D,(HL)
RET Z
EXX
EX AF,AF'
BIT 7,A
JR Z,ENT_DI2
LD HL,TEK_LEV
LD A,(HL)
AND A
EXX
RET Z
EXX
DEC A
LD (HL),A
ADD A,A
LD H,HIGH (DIR_CEP)
LD L,A
LD A,(HL)
INC L
LD H,(HL)
LD L,A
CALL ENT_DI1
EXX
LD (TEK_ZAP),HL
EXX
RET
ENT_DI2 LD HL,TEK_LEV
LD A,(HL)
INC A
CP 0x80
EXX
RET Z
EXX
LD (HL),A
DEC A
ADD A,A
LD H,HIGH (DIR_CEP)
LD L,A
LD BC,(TEK_ZAP)
LD (HL),C
INC L
LD (HL),B
ENT_DI1 EXX
LD DE,20
ADD HL,DE
LD C,(HL)
INC HL
LD B,(HL)
LD E,5
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD A,B
OR C
OR D
OR E
JR NZ,ENT_DI0
LD DE,(RootDIRCluster)
LD BC,(RootDIRCluster+2)
ENT_DI0 LD (CurrentDIRCluster),DE
LD (CurrentDIRCluster+2),BC
CALL INIRTSC
XOR A
INC A
RET
GETFZAP LD BC,(TEK_ZAP)
LD A,B
OR C
JR Z,GETRZAP
PUSH BC
DEC BC
CALL GETRZAP
POP BC
LD E,A
GETRZAP PUSH DE
CALL RDDIRSC
POP DE
CP 0xFF
LD A,E
RET Z
EX AF,AF'
LD A,C
AND 0x0F
LD E,A
LD D,0
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD DE,11
EX DE,HL
ADD HL,DE
LD L,(HL)
LD H,0
EX DE,HL
CALL CP_TWOT
JR NZ,.L1
LD D,0x80
.L1 EX AF,AF'
CP 0x0F
LD A,E
LD E,D
RET NZ
SET 0,E
RET
; ç⥨¥ ᥪâ®à DIR ¯® ®¬¥àã BC
; ¢ë室¥: A = 0xFF - ¢ë室 § ¯à¥¤¥«ë DIR
RDDIRSC PUSH BC
LD D,B
LD E,C
LD BC,0
LD A,0x10
CALL BCDE_A
LD A,E
PUSH AF
LD A,(SecPerClus)
PUSH AF
CALL BCDE_A
LD HL,TDIRCLS
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
CALL GET_DWORD
BIT 7,B
JR Z,.L1
POP AF
POP AF
POP AF
XOR A
DEC A
RET
.L1 CALL REALSEC
POP AF
DEC A
LD L,A
POP AF
AND L
LD L,A
LD H,0
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
CALL READ_SECTOR
POP BC
RET
GET_DWORD LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
RET
SET_DWORD LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
RET
INIRTSC PUSH AF
LD HL,0xFFFF
LD (NumSec2Buf + 2),HL
LD HL,TDIRCLS
LD DE,(CurrentDIRCluster)
LD BC,(CurrentDIRCluster + 2)
CALL SET_DWORD ; á®åà ¨«¨ ¢ â ¡«¨æã ®¬¥à ⥪ã饣® ª« áâ¥à
LD A,D
OR E
OR B
OR C
JR Z,LASTCLS ; ¥á«¨ ®¬¥à ª« áâ¥à 0, â® íâ® ROOT ¤¨à (¤«ï FAT12/16)
NEXTCLS PUSH HL
CALL RDFATZP ; ç¨â ¥¬ á«¥¤ã騩 ®¬¥à ª« áâ¥à ¨§ 楯®çª¨ ¤¨à¥ªâ®à¨¨
CALL LST_CLS ; ¯à®¢¥à塞 ª®¥æ 楯®çª¨
POP HL
JR C,LASTCLS
CALL SET_DWORD ; ¥á«¨ ¥ ¯®á«¥¤¨© á®åà 塞 ¢ â ¡«¨æã
JR NEXTCLS ; á«¥¤ãî騩 ®¬¥à ª« áâ¥à
LASTCLS LD BC,0xFFFF
CALL SET_DWORD ; ª« ¤¥¬ ¬ àª¥à ª®æ 楯®çª¨
INC BC
CALL RDDIRSC
LD A,(HL)
CP "."
JR NZ,INIRTS1
INC HL
LD A,(HL)
CP "."
JR Z,INIRTS1
INC BC
INIRTS1 LD (TEK_ZAP),BC
POP AF
RET
CP_TWOT LD A,(HL)
CP "."
RET NZ
INC HL
LD A,(HL)
DEC HL
CP "."
RET NZ
XOR A
RET
LST_CLS LD A,(FATType)
AND A
JR NZ,LST_CL1
LD HL,0x0FF7
SBC HL,DE
RET
LST_CL1 DEC A
JR NZ,LST_CL2
LD HL,0xFFF7
SBC HL,DE
RET
LST_CL2 PUSH BC
LD A,B
AND 0x0F
LD B,A
LD HL,0x0FFF
SBC HL,BC
POP BC
RET NZ
LD HL,0xFFF7
SBC HL,DE
RET
RDFATZP LD A,(FATType) ; ç⥨¥ § ¢¨á¨â ®â à §à冷á⨠FAT
AND A
JR Z,RDFATS0 ; ¯¥à¥å®¤ ¢¯¥à¥¤ ¤«ï FAT12
DEC A
JR Z,RDFATS1 ; ¯¥à¥å®¤ ¢¯¥à¥¤ ¤«ï FAT16
EX DE,HL ; §¤¥áì ç⥨¥ ¤«ï FTA32
ADD HL,HL
EX DE,HL
LD H,B
LD L,C
ADC HL,HL ; 㬮¦¨«¨ ®¬¥à ª« áâ¥à 2
LD A,E
LD E,D
LD D,L
LD C,H
LD B,0 ; à §¤¥«¨«¨ ®¬¥à ª« áâ¥à 256
CALL RDFATS2 ; ç¨â ¥¬ ¬« ¤è¨¥ 16 ¡¨â ¨á¯®«ì§ãï ç⥨¥ ¤«ï FAT16
INC HL
LD C,(HL)
INC HL
LD B,(HL) ; ¯à®ç¨â «¨ ¯®á«¥¤ãî騥 áâ à訥 16 ¡¨â
RET
; ç⥨¥ 16 ¡¨â®£® ®¬¥à ª« áâ¥à ¨§ 楯®çª¨ ¤«ï FAT16
RDFATS1 LD BC,0
LD A,E
LD E,D
LD D,C ; à §¤¥«¨«¨ ®¬¥à ª« áâ¥à 256, áâ à訥 16 ¡¨â =0
RDFATS2 PUSH AF ; ®¡é¥¥ ç⥨¥ 16 ¡¨â®£® ®¬¥à ª« áâ¥à ¤«ï FAT16/32
PUSH BC
LD HL,NumSecFAT1
CALL BCDEHLP ; ¯à¨¡ ¢¨«¨ ᬥ饨¥ ®â ç « FAT â ¡«¨æë
CALL READ_SECTOR ; § £à㧨«¨ ¢ëç¨á«¥ë© ®¬¥à ᥪâ®à
POP BC
POP AF
LD E,A
LD D,0
ADD HL,DE
ADD HL,DE ; ¢ëç¨á«¨«¨ ᬥ饨¥ ¤® 㦮£® ®¬¥à ¢ § £à㦥®¬ ᥪâ®à¥
LD E,(HL)
INC HL
LD D,(HL) ; ¯®«ã稫¨ 16 ¡¨â ®¬¥à ª« áâ¥à
RET
; ç⥨¥ 12 ¡¨â®£® ®¬¥à ª« áâ¥à ¨§ 楯®çª¨ ¤«ï FAT12
RDFATS0 LD H,D
LD L,E
ADD HL,HL
ADD HL,DE ; HL = HL * 3
SRL H
RR L ; HL = HL / 2 - ¢ ¨â®£¥ 㬮¦¨«¨ ®¬¥à ª« áâ¥à 1,5
LD A,E ; A - ¬ ¨â¥à¥á¥ ⮫쪮 ¡¨â ®¬¥à áâ ண® ®¬¥à ª« áâ¥à
LD E,H
LD D,0
LD B,D
LD C,D ; à §¤¥«¨«¨ ®¬¥à ª« áâ¥à 256
SRL E
PUSH AF
PUSH HL
LD DE,(NumSecFAT1)
LD BC,(NumSecFAT1 + 2)
CALL READ_SECTOR ; § £à㧨«¨ ¢ëç¨á«¥ë© ᥪâ®à
POP BC
LD A,B
AND 1
LD B,A ; BC = ᬥ饨¥ ¢ § £à㦥®¬ ᥪâ®à¥
ADD HL,BC ; HL = ¤à¥á ®âªã¤ ç¨â âì ¡ ©âë ®¬¥à ª« áâ¥à
LD B,(HL) ; ¯à®ç¨â «¨ ¬« ¤èãî ç áâì ®¬¥à ª« áâ¥à
INC HL ; ¤à¥á á«¥¤ãî饣® ¡ ©â
LD A,H
CP HIGH (BUF_512)+2 ; ¯à®¢¥àª ¯¥à¥å®¤ £à ¨æë § £à㦥®£® ᥪâ®à
JR NZ,RDFATS4
PUSH BC ; ¢ë室 § ¯à¥¤¥«ë ⥪ã饣® § £à㦥®£® ᥪâ®à
LD BC,0
INC DE
CALL READ_SECTOR ; § £à㦠¥¬ á«¥¤ãî騩 ᥪâ®à FAT â ¡«¨æë
POP BC
RDFATS4 POP AF
LD D,(HL) ; ç¨â ¥¬ áâ à訥 ¡¨âë ®¬¥à ª« áâ¥à
LD E,B ; ⥯¥àì DE = ®¬¥à á«¥¤ãî饣® ª« áâ¥à ¢ 楯®çª¥
LD BC,0
RRA ; ¯à®¢¥à塞 ¡¨â 0 áâ ண® ®¬¥à ª« áâ¥à
JR NC,RDFATS3
REPT 4
SRL D ; ᤢ¨£ ¥¬ ®¬¥à ¯à®ç¨â ®£® ®¬¥à ª« áâ¥à ¢ ¬« ¤è¨¥ 12 ¡¨â
RR E
ENDM
RDFATS3 LD A,D
AND 0x0F
LD D,A ; á¡à®á¨«¨ ¥§ ç 騥 áâ à訥 4 ¡¨â ã ¯®«ã祮£® ®¬¥à ª« áâ¥à
RET
; ¢ëç¨á«¥¨¥ ॠ«ì®£® ᥪâ®à
; ¢å®¤¥ BCDE = ®¬¥à FAT
; ¢ë室¥ BCDE = ¤à¥á ᥪâ®à
REALSEC LD A,B
OR C
OR D
OR E
JR NZ,REALSE1 ; BCDE = 0?
LD DE,(NumSecRootDir)
LD BC,(NumSecRootDir + 2)
RET
REALSE1 LD HL,0xFFFE
EX DE,HL
ADD HL,DE
EX DE,HL
INC HL
ADC HL,BC ; HLDE = ®¬¥à ª« áâ¥à - 2
LD A,(SecPerClus) ; 㦮 㬮¦¨âì à §¬¥à ª« áâ¥à
JR REALSE2
REALSE3 SLA E
RL D
RL L
RL H
REALSE2 RRCA
JR NC,REALSE3 ; 㬮¦¨«¨ à §¬¥à ª« áâ¥à
LD B,H
LD C,L
LD HL,FirstSecData
JP BCDEHLP ; ¯à¨¡ ¢¨«¨ ᬥ饨¥ ®â ç « à §¤¥«
BCDE200 LD E,D
LD D,C
LD C,B
LD B,0
LD A,2
JR BCDE_A
; BCDE >> A = BCDE
BCDE_A1 SRL B
RR C
RR D
RR E
BCDE_A RRCA
JR NC,BCDE_A1
RET
; (ADR) - BCDE = BCDE
BCDEHLM LD A,(HL)
INC HL
SUB E
LD E,A
LD A,(HL)
INC HL
SBC A,D
LD D,A
LD A,(HL)
INC HL
SBC A,C
LD C,A
LD A,(HL)
SBC A,B
LD B,A
RET
; (ADR) + BCDE = BCDE
BCDEHLP LD A,(HL)
INC HL
ADD A,E
LD E,A
LD A,(HL)
INC HL
ADC A,D
LD D,A
LD A,(HL)
INC HL
ADC A,C
LD C,A
LD A,(HL)
ADC A,B
LD B,A
RET
; HLDE + BC = HLDE
HLDEPBC EX DE,HL
ADD HL,BC
EX DE,HL
LD BC,0
ADC HL,BC
RET
; BCDE - (ADR) = BCDE
HLBCDEM LD A,E
SUB (HL)
INC HL
LD E,A
LD A,D
SBC A,(HL)
INC HL
LD D,A
LD A,C
SBC A,(HL)
INC HL
LD C,A
LD A,B
SBC A,(HL)
LD B,A
RET
; ¯à®¢¥àª 0 ᥪâ®à à §¤¥«
VALID_BOOTSEC LD HL,(BUF_512 + _BPB_BytsPerSec)
LD A,H
SUB 2
OR L
JR NZ,VALID_BOOTSEC1
LD HL,(BUF_512 + _BPB_SecPerClus)
OR L
JR Z,VALID_BOOTSEC1
NEG
AND L
CP L
JR NZ,VALID_BOOTSEC1
LD A,(BUF_512 + _BPB_NumFATs)
DEC A
CP 7
JR NC,VALID_BOOTSEC1
XOR A
RET
VALID_BOOTSEC1 OR IXH
RET
FAT_ERR LD A,0xFF
LD (FATType),A
RET
; ¨¨æ¨ «¨§ æ¨ï ¯¥à¥¬¥ëå FAT
INIT_FATVARS LD A,0xFF
LD (NumSec2Buf+3),A
LD DE,0
LD B,D
LD C,E
CALL READ_SECTOR
PUSH HL
POP IY
LD DE,0x01BE
ADD HL,DE
LD A,(HL)
AND A
JR NZ,RDFAT05
LD DE,4
ADD HL,DE
LD A,(HL)
LD B,0
CP 1
JR Z,RDFAT06
LD B,2
CP 0x0B
JR Z,RDFAT06
CP 0x0C
JR Z,RDFAT06
LD B,1
CP 6
JR Z,RDFAT06
CP 0x0E
JR NZ,RDFAT05
RDFAT06 LD A,B
LD (FATType),A
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
JR RDFAT00
RDFAT05 LD C,(IY+0x0D)
XOR A
LD E,A
LD B,8
.L4 RR C
ADC A,0
DJNZ .L4
DEC A
JR NZ,.L5
INC E
.L5 LD A,(IY+0x0E)
OR (IY+0x0F)
JR Z,.L2
INC E
.L2 LD A,(IY+0x13)
OR (IY+0x14)
JR NZ,.L3
INC E
.L3 LD A,(IY+0x20)
OR (IY+0x21)
OR (IY+0x22)
OR (IY+0x23)
JR NZ,.L6
INC E
.L6 LD A,(IY+0x15)
AND 0xF0
CP 0xF0
JR NZ,.L1
INC E
.L1 LD A,E
CP 4
JP NZ,FAT_ERR
LD A,0xFF
LD (FATType),A
LD DE,0
LD B,D
LD C,E
RDFAT00 LD (StartSecVol),DE
LD (StartSecVol + 2),BC ; ¯®«®¦¨«¨ ®¬¥à áâ à⮢®£® ᥪâ®à à §¤¥«
CALL READ_SECTOR ; § £à㧨«¨ ¥£®
LD A,(BUF_512 + _BPB_SecPerClus)
LD (SecPerClus),A
LD HL,(BUF_512 + _BPB_RsvdSecCnt)
ADD HL,DE
LD (NumSecFAT1),HL
LD HL,0
ADC HL,BC
LD (NumSecFAT1 + 2),HL
LD HL,0
LD DE,(BUF_512 + _BPB_FATSz16)
LD A,D
OR E
JR NZ,RDFAT01 ; ¥á«¨ ¥ FAT12/16 (_BPB_FATSz16 == 0)
LD DE,(BUF_512 + _BPB_FATSz32)
LD HL,(BUF_512 + _BPB_FATSz32 + 2) ; â® ¡¥à¥¬ ¨§ ᬥ饨ï +36
RDFAT01 LD (FATSize),DE
LD (FATSize + 2),HL ; ç¨á«® ᥪâ®à®¢ FAT-â ¡«¨æã
LD HL,0
LD DE,(BUF_512 + _BPB_TotSec16)
LD A,D
OR E
JR NZ,.L1 ; ¥á«¨ ¥ FAT12/16 (BPB_TOTSEC16=0)
LD DE,(BUF_512 + _BPB_TotSec32)
LD HL,(BUF_512 + _BPB_TotSec32+2)
; â® ¡¥à¥¬ ¨§ ᬥ饨ï +32
.L1 LD (NumsSectorsVol + 2),HL
LD (NumsSectorsVol),DE ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤¨áª¥/à §¤¥«¥
; ¢ëç¨á«ï¥¬ ROOTDIRSECTORS
LD DE,(BUF_512 + _BPB_RootEntCnt)
LD BC,0
LD A,D
OR E
JR Z,RDFAT03
LD A,0x10
CALL BCDE_A
; í⮠ॠ«¨§®¢ ä®à¬ã«
; ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)++(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
; ¢ HL ROOTDIRSECTORS. ¥á«¨ FAT32, â® HL=0 ¢á¥£¤
RDFAT03 PUSH DE ; ROOTDIRSECTORS
LD HL,NumSecFAT1
CALL GET_DWORD
LD A,(BUF_512 + _BPB_NumFATs)
LD (NumFATs),A
DEC A
JR Z,.L1
LD HL,FATSize
CALL BCDEHLP
LD (NumSecFAT2),DE
LD (NumSecFAT2 + 2),BC
.L1 LD HL,FATSize
CALL BCDEHLP
LD (NumSecRootDir),DE
LD (NumSecRootDir + 2),BC
POP HL
; ¤®¡ ¢«ï¥¬ à §¬¥à ROOTDIR
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
LD (FirstSecData),DE
LD (FirstSecData + 2),BC
LD HL,NumsSectorsVol
CALL BCDEHLM
LD A,(SecPerClus)
CALL BCDE_A
LD (NumsClustersVol),DE
LD (NumsClustersVol + 2),BC
LD A,(FATType)
CP 0xFF
JR NZ,RDFAT04
; ®¯à¥¤¥«¥¨¥ ⨯ FAT ¯à¨ ®âáãá⢨¨ MBR
LD HL,(BUF_512 + _BPB_FATSz16)
LD A,H
OR L
LD A,2
JR Z,.L2
LD DE,(FATSize - 1)
LD BC,(FATSize + 1)
LD E,0 ; BCDE = ª®«¨ç¥á⢮ ᥪâ®à®¢ * 0x100
LD HL,NumsClustersVol ; ª®«¨ç¥á⢮ ª« áâ¥à®¢ FAT
CALL HLBCDEM ; ª®«¨ç¥á⢮ ª« áâ¥à®¢ - (ª®«¨ç¥á⢮ ᥪâ®à®¢ * 0x100)
LD A,D
OR C
OR B
LD A,1 ; FAT16
JR Z,.L2 ; FAT16 ¥á«¨ ä« £ Z=0
XOR A ; ¨ ç¥ FAT12
.L2 LD (FATType),A
; ¤«ï FAT12/16 ROOT ª« áâ¥à = 0
; ¤«ï FAT32 ¡¥à¥¬ ¯® ᬥ饨î +44
; ¢ë室¥: BCDE -
ROOTDIR
RDFAT04 XOR A
LD (TEK_LEV),A
LD (BUF_PATH),A
; CALL INIT_PATH
LD A,(FATType)
PUSH AF
AND A
LD DE,0
LD B,D
LD C,E
JR Z,.L1 ;FAT12-NONE
DEC A
JR Z,.L1 ;FAT16
LD DE,(BUF_512 + _BPB_RootClus)
LD BC,(BUF_512 + _BPB_RootClus + 2) ;FAT32
.L1 LD (CurrentDIRCluster),DE
LD (CurrentDIRCluster + 2),BC ; ®¬¥à ⥪ã饣® ª« áâ¥à
LD (RootDIRCluster),DE
LD (RootDIRCluster + 2),BC ; ®¬¥à ª®à¥¢®£® ª« áâ¥à
LD (TEK_LEV),A
POP AF
JP INIRTSC
F_EXT DB "MP3MOD",0
CP_EXT PUSH BC
PUSH DE
PUSH HL
LD C,0
LD DE,F_EXT
.L3 LD A,(DE)
AND A
JR Z,.L2
INC C
PUSH DE
PUSH HL
CALL COMPARF
POP HL
POP DE
JR Z,.L1
INC DE
INC DE
INC DE
JR .L3
.L1 LD A,C
.L2 POP HL
POP DE
POP BC
RET
COMPARF PUSH DE
LD DE,8
ADD HL,DE
POP DE
LD B,3
.L1 LD A,(DE)
CP (HL)
RET NZ
INC HL
INC DE
DJNZ .L1
RET
OPENFIL CALL SET_MP3
CALL GETFZAP
CALL CP_EXT
PUSH AF
LD DE,0x14
ADD HL,DE
LD C,(HL)
INC HL
LD B,(HL)
LD E,5
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD (TFILCLS),DE
LD (TFILCLS+2),BC
INC HL
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
LD A,D
AND 1
OR E
EX AF,AF'
CALL BCDE200
LD A,(SecPerClus)
LD H,A
DEC A
AND E
LD L,A
EX AF,AF'
JR Z,.L1
INC L
.L1 LD A,L
LD (MPHWOST),A
LD A,H
CALL BCDE_A
LD (KOL_CLS),DE
LD (KOL_CLS+2),BC
XOR A
LD (NUMSECK),A
POP AF
RET
; ¯¥à¥¤ ç ⥪ã饣® ᥪâ®à ä ©« ¤¥ª®¤¥à MP3
NEXTSEC LD HL,KOL_CLS
LD A,(HL)
INC HL
OR (HL)
INC HL
OR (HL)
INC HL
OR (HL)
JR Z,LSTCLSF
LD DE,(TFILCLS)
LD BC,(TFILCLS+2)
PUSH DE
PUSH BC
CALL REALSEC
LD HL,(NUMSECK)
LD H,0
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
LD A,9
CALL COM__SD
AND A
JP NZ,ERR_DRV
POP BC
POP DE
LD A,(NUMSECK)
INC A
LD H,A
LD (NUMSECK),A
LD A,(SecPerClus)
CP H
LD A,0 ; ¢ë室 ¥ ¯® ®è¨¡ª¥
RET NZ
XOR A
LD (NUMSECK),A
CALL RDFATZP
LD (TFILCLS),DE
LD (TFILCLS+2),BC
LD HL,KOL_CLS
LD DE,1
LD B,D
LD C,D
CALL BCDEHLM
LD (KOL_CLS),DE
LD (KOL_CLS+2),BC
XOR A
INC A
RET
; ¯¥à¥¤ ç ¯®á«¥¤¥£® ᥪâ®à ä ©« ¤¥ª®¤¥à MP3
LSTCLSF LD DE,(TFILCLS)
LD BC,(TFILCLS+2)
CALL REALSEC
LD HL,(NUMSECK)
LD H,0
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
LD A,9
CALL COM__SD
AND A
JP NZ,ERR_DRV
LD A,(NUMSECK)
INC A
LD H,A
LD (NUMSECK),A
LD A,(MPHWOST)
AND A
RET Z
CP H
RET
; ¨¨æ¨ «¨§ æ¨ï ¯¥à¥¬¥ëå ¤«ï ⥪ã饣® ä ©«
SET_MP3 LD H,B
LD L,C
LD DE,(STR_MP3)
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC HL
PUSH HL
EX DE,HL
LD DE,CurrentDIRCluster
LDI
LDI
LDI
LDI
LD DE,(CurrentDIRCluster)
LD BC,(CurrentDIRCluster+2)
CALL INIRTSC
POP HL
LD E,(HL)
INC HL
LD D,(HL)
LD (TEK_ZAP),DE
RET
; ¯¥à¥å®¤ ¯à¥¤ë¤ãéãî ¤¨à¥ªâ®à¨î
PRVDIR LD HL,(KOLVDIR)
LD DE,2
AND A
SBC HL,DE
RET C
LD HL,(KOLVMP3)
AND A
SBC HL,DE
RET C
LD H,B
LD L,C
LD DE,(STR_MP3)
ADD HL,HL
ADD HL,HL
ADD HL,DE
PUSH HL
POP IX
LD H,B
LD L,C
LD BC,(KOLVMP3)
LD DE,0xFFFC
EXX
LD L,(IX+0)
LD H,(IX+1)
EXX
CALL PRVDIR2
CALL PRVDIR2
LD DE,4
JR NXTDIR2
PRVDIR2 EXX
LD D,H
LD E,L
LD L,(IX+0)
LD H,(IX+1)
AND A
SBC HL,DE
EX AF,AF'
ADD HL,DE
EX AF,AF'
EXX
RET NZ
LD A,H
OR L
JR Z,PRVDIR4
DEC HL
ADD IX,DE
JR PRVDIR2
PRVDIR4 LD H,B
LD L,C
DEC HL
ADD HL,HL
ADD HL,HL
LD IX,(STR_MP3)
EX DE,HL
ADD IX,DE
EX DE,HL
LD H,B
LD L,C
DEC HL
JR PRVDIR2
; ¯¥à¥å®¤ á«¥¤ãîéãî ¤¨à¥ªâ®à¨î
NXTDIR LD HL,(KOLVDIR)
LD DE,2
AND A
SBC HL,DE
RET C
LD HL,(KOLVMP3)
AND A
SBC HL,DE
RET C
LD H,B
LD L,C
LD DE,(STR_MP3)
ADD HL,HL
ADD HL,HL
ADD HL,DE
PUSH HL
POP IX
LD H,B
LD L,C
LD BC,(KOLVMP3)
LD DE,4
EXX
LD L,(IX+0)
LD H,(IX+1)
EXX
NXTDIR2 EXX
LD D,H
LD E,L
LD L,(IX+0)
LD H,(IX+1)
AND A
SBC HL,DE
EX AF,AF'
ADD HL,DE
EX AF,AF'
EXX
JR NZ,NXTDIR3
INC HL
ADD IX,DE
AND A
SBC HL,BC
EX AF,AF'
ADD HL,BC
EX AF,AF'
JR NZ,NXTDIR2
LD HL,0
LD IX,(STR_MP3)
JR NXTDIR2
NXTDIR3 LD B,H
LD C,L
RET
; ¢ª«î票¥ á«¥¤ãî饩 áâà ¨æë ¯ ¬ïâ¨
SETPAGE LD HL,BUF_PAG+0xFF
LD L,(HL)
LD A,(HL)
OUT (MPAGEX),A
LD L,0xFF
INC (HL)
RET
; £à㧨«ª MOD ¢ ¯ ¬ïâì NEOGS
LOADFIL LD HL,BUF_PAG+0xFF
LD (HL),0
IN A,(GSCFG0)
SET B_EXPAG,A
OUT (GSCFG0),A
LD IY,(SecPerClus)
; LY = ª®«-¢® ᥪâ®à®¢ ¢ ª« áâ¥à¥
LD A,IYL
CP 0x20
JR C,LDMF5
; § £à㧪 ª« áâ¥à®¢ 32 ¨ ¡®«¥¥ ᥪâ®à®¢
LD_F5 LD DE,(TFILCLS)
LD BC,(TFILCLS+2)
CALL REALSEC
LD A,IYL
AND 0xE0
RLCA
RLCA
RLCA
LD IYH,A
LD_F9 LD A,0x20
EX AF,AF'
CALL SETPAGE
LD A,3
LD HL,0xC000
CALL COM__SD
AND A
JP NZ,ERR_DRV
LD HL,0x20
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
DEC IYH
JR NZ,LD_F9
LD DE,(TFILCLS)
LD BC,(TFILCLS+2)
CALL RDFATZP
CALL LST_CLS
JR C,LD_E
LD (TFILCLS+2),BC
LD (TFILCLS),DE
JR LD_F5
LD_E IN A,(GSCFG0)
RES B_EXPAG,A
OUT (GSCFG0),A
LD A,(PG_PLAYER)
OUT (MPAG),A
LD A,(BUF_PAG+0xFF)
SRL A
ADC A,0
RET
; § £à㧪 ª« áâ¥à®¢ 16 ¨ ¬¥¥¥ ᥪâ®à®¢
LDMF5 CALL SETPAGE
LD HL,0xC000
LDMF2 LD DE,(TFILCLS)
LD BC,(TFILCLS+2)
PUSH HL
CALL REALSEC
POP HL
LDMF3 LD A,IYL
EX AF,AF'
LD A,3
CALL COM__SD
AND A
JP NZ,ERR_DRV
PUSH HL
LD BC,(TFILCLS+2)
LD DE,(TFILCLS)
CALL RDFATZP
CALL LST_CLS
POP HL
JR C,LD_E
LD (TFILCLS+2),BC
LD (TFILCLS),DE
LD A,H
AND A
JR NZ,LDMF2
JR LDMF5
; ¯®¨áª ¢á¥å ¤¨à¥ªâ®à¨© FAT
FINDDIR LD HL,STACK_CURR_DIR
LD (STACKPREVDIR),HL
LD DE,STR_DIR
LD HL,RootDIRCluster
LDI
LDI
LDI
LDI
LD (PAGEDIR),DE ; ªã¤ á«¥¤ãî騩 ®¬¥à ª« áâ¥à ¤¨àë «®¦¨âì
.L72 LD BC,0
CALL RDDIRSC
LD DE,0x20
PUSH HL
POP IX
LD A,(HL)
CP "."
JR NZ,.L3
LD A,(IX+1)
CP "."
JR Z,.NEXTDIR
INC BC
ADD IX,DE
.NEXTDIR INC BC
ADD IX,DE
.L3 LD A,IXH
CP HIGH (BUF_512) + 2
JR NZ,.L2 ; ᥪâ®à ª®ç¨«áï?
CALL RDDIRSC
JR NZ,.FNDDIR5 ; ª®¥æ DIR
LD DE,0x20
PUSH HL
POP IX
.L2 LD A,(IX+0)
AND A
JR Z,.FNDDIR5 ; ª®¥æ DIR?
CP 0xE5
JR Z,.NEXTDIR ; ä ©« 㤠«¥?
LD A,(IX + _DIR_Attr)
CP M_DIR_AttrLongName
JR Z,.NEXTDIR ; íâ® ¤«¨®¥ ¨¬ï?
CP M_DIR_VolumeID
JR Z,.NEXTDIR ; íâ® ¨¬ï à §¤¥« ?
BIT 4,(IX + _DIR_Attr)
JR Z,.NEXTDIR ; íâ® ¤¨à¥ªâ®à¨ï?
; 㪫 ¤ª ®¬¥à ª« áâ¥à ©¤¥®© DIR
LD HL,(PAGEDIR) ; ªã¤ «®¦¨âì
LD A,(IX+0x1A)
LD (HL),A
INC HL
LD A,(IX+0x1B)
LD (HL),A
INC HL
LD A,(IX+0x14)
LD (HL),A
INC HL
LD A,(IX+0x15)
LD (HL),A
INC HL ; ã«®¦¨«¨ ®¬¥à ª« áâ¥à ©¤¥®© DIR
LD (PAGEDIR),HL
LD HL,(STACKPREVDIR)
DEC HL
LD (HL),B
DEC HL
LD (HL),C ; á®åà ¨«¨ ®¬¥à ⥪ã饩 ¤¨àë
LD (STACKPREVDIR),HL
LD (TEK_ZAP),BC
CALL ENT_DIR
JP .L72
; ¢ë室 ¨§ ¤¨à¥ªâ®à¨¨ ¨ ¯à®¢¥àª ¯®¯ë⪨ ¢ë室 ¨§ ª®à¥¢®© ¤¨à¥ªâ®à¨¨
.FNDDIR5 LD A,(STACKPREVDIR + 1)
CP HIGH (STACK_CURR_DIR)
JR NC,FNDDIR0
LD BC,0
CALL RDDIRSC
PUSH HL
POP IX
LD DE,0x20
LD A,(HL)
CP "."
JR NZ,.FNDDI52
INC HL
LD A,(HL)
CP "."
JR Z,.FNDDI52
INC BC
ADD IX,DE
.FNDDI52 LD (TEK_ZAP),BC
CALL ENT_DIR ; ¢ë室 ¨§ ¤¨àë
LD HL,(STACKPREVDIR)
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD (STACKPREVDIR),HL
CALL RDDIRSC
LD A,C
AND 0x0F
LD E,A
LD D,0
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
PUSH HL
POP IX
LD DE,0x20
JP .NEXTDIR
; ¢á¥ DIR ©¤¥ë
FNDDIR0 LD HL,(PAGEDIR)
LD D,H
LD E,L
INC HL
INC HL
INC HL
LD (HL),0xFF
PUSH HL
EX DE,HL
LD DE,STR_DIR
AND A
SBC HL,DE
SRL H
RR L
SRL H
RR L
LD (KOLVDIR),HL
EX (SP),HL
INC HL
LD (STR_MP3),HL
POP HL
RET
; ¢á¥ ä ©«ë ©¤¥ë ¨«¨ ¯ ¬ïâì ª®ç¨« áì
FNDMP30 LD HL,(PAGEMP3)
LD DE,(STR_MP3)
PUSH HL
POP IX
LD (HL),0
INC L
LD (HL),0
DEC L
AND A
SBC HL,DE
SRL H
RR L
SRL H
RR L
LD DE,2
LD (KOLVMP3),HL
LD (KOLWMP3),HL
AND A
SBC HL,DE
EX AF,AF'
ADD HL,DE
EX AF,AF'
RET C
PUSH HL
LD IY,1
LD B,H
LD C,L
LD DE,0xFFFC
ADD IX,DE
DEC HL
EXX
LD L,(IX+0)
LD H,(IX+1)
EXX
FNDM030 EXX
LD D,H
LD E,L
LD L,(IX+0)
LD H,(IX+1)
AND A
SBC HL,DE
EX AF,AF'
ADD HL,DE
EX AF,AF'
EXX
JR Z,.L1
INC IY
.L1 LD A,H
OR L
JR Z,FNDM033 ; ¯ ¬ïâì ª®ç¨« áì, ¢ë室¨¬
DEC HL
ADD IX,DE
JR FNDM030
FNDM033 LD (KOLVDIR),IY ; ª®«¨ç¥á⢮ ©¤¥ëå ¤¨à¥ªâ®à¨©
POP HL
RET
; ¯®¨áª ä ©«®¢ ¯® à áè¨à¥¨î
FINDMP3 LD HL,(STR_MP3)
LD (PAGEMP3),HL
LD HL,STR_DIR
LD (PAGEDIR),HL
.FNDMP37 LD HL,(PAGEDIR)
LD (TEKNUMC),HL
LD DE,CurrentDIRCluster
LDI
LDI
LDI
LDI
LD (PAGEDIR),HL
DEC HL
BIT 7,(HL)
JP NZ,FNDMP30
LD DE,(CurrentDIRCluster)
LD BC,(CurrentDIRCluster+2)
CALL INIRTSC
LD BC,0
CALL RDDIRSC
LD DE,0x20
PUSH HL
POP IX
LD A,(HL)
CP "."
JR NZ,.ROOT
LD A,(IX+1)
CP "."
JR Z,.NEXTFILE
INC BC
ADD IX,DE
.NEXTFILE INC BC
ADD IX,DE
.ROOT LD A,IXH
CP HIGH (BUF_512) + 2
JR NZ,.FNDMP32
CALL RDDIRSC
JP NZ,.FNDMP37
LD DE,0x20
PUSH HL
POP IX
.FNDMP32 LD A,(IX+0)
AND A
JP Z,.FNDMP37 ; ª®¥æ DIR?
CP 0xE5
JR Z,.NEXTFILE ; ä ©« 㤠«¥?
LD A,(IX + _DIR_Attr)
CP M_DIR_AttrLongName
JR Z,.NEXTFILE ; íâ® ¤«¨®¥ ¨¬ï?
CP M_DIR_VolumeID
JR Z,.NEXTFILE ; íâ® ¨¬ï à §¤¥« ?
BIT 4,(IX + _DIR_Attr)
JR NZ,.NEXTFILE ; íâ® ¤¨à¥ªâ®à¨ï?
EXX
PUSH IX
POP HL
CALL CP_EXT ; ¯à®¢¥à塞 à áè¨à¥¨¥ ä ©«
EXX
AND A
JP Z,.NEXTFILE ; ¥ ᮢ¯ «®, ¯à®¤®«¦ ¥¬
LD DE,(TEKNUMC)
LD HL,(PAGEMP3)
; 㪫 ¤ª ®¯¨á ⥫ï ä ©«
; 2 ¡ ©â ¤à¥á ª« áâ¥à ¤¨àë
; 2 ¡ ©â "ॠ«ìë©" ®¬¥à ä ©«
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
LD (PAGEMP3),HL
LD A,H
AND A
JP Z,FNDMP30 ; ¯ ¬ïâì ª®ç¨« áì, ¢ë室¨¬
LD DE,0x20
JR .NEXTFILE