;LAST UPDATE: 25.05.2013 savelij
;version 15.11.08
;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С FAT
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
RET
TABLFAT DW WC_FAT ;00 INIT FAT
DW GETFZAP ;01 HL=FILE OPISATEL
DW GETLONG ;02 GET LONGNAME
DW FINDDIR ;03 FIND ALL DIR
DW FINDMP3 ;04 FIND ALL MP3
DW SET_MP3 ;05 SET NUMBER FILES
DW NEXTSEC ;06 PLAY NEXT SECTOR
DW OPENFIL ;07 OPEN FILE
DW PRVDIR ;08 NEXT DIR 4 PLAY
DW NXTDIR ;09 PREVIOUS DIR 4 PLAY
BUF_512 EQU 0X4200
;0X200 БУФЕР СЕКТОРА
DIR_CEP EQU 0X4400
;0X100 ЦЕПОЧКА КЛАСТЕРОВ ПОДДИРЕКТОРИЙ
ERORDRV EQU 0X4500
;2 ВОЗВРАТ С ОШИБКОЙ В A
CAL_FAT EQU ERORDRV+2
;1 КАЛИБР FAT
MANYFAT EQU CAL_FAT+1
;1 КОЛИЧЕСТВО FAT-ТАБЛИЦ
BYTSSEC EQU MANYFAT+1
;1 КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
ROOTCLS EQU BYTSSEC+1
;4 СЕКТОР НАЧАЛА ROOT ДИРЕКТОРИИ
ROOTSEC EQU ROOTCLS+4
;2 РАЗМЕР В СЕКТОРАХ ROOT ДИРЕКТОРИИ
SEC_FAT EQU ROOTSEC+2
;4 КОЛИЧЕСТВО СЕКТОРОВ ОДНОЙ ФАТ
RSVDSEC EQU SEC_FAT+4
;2 РАЗМЕР РЕЗЕРВНОЙ ОБЛАСТИ
STARTRZ EQU RSVDSEC+2
;4 НАЧАЛО ДИСКА/РАЗДЕЛА
FRSTDAT EQU STARTRZ+4
;4 АДРЕС ПЕРВОГО СЕКТОРА ДАННЫХ ОТ BPB
SEC_DSC EQU FRSTDAT+4
;4 КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
CLS_DSC EQU SEC_DSC+4
;4 КОЛИЧЕСТВО КЛАСТЕРОВ НА ДИСКЕ/РАЗДЕЛЕ
FATSTAR EQU CLS_DSC+4
;2 АДРЕС ТЕКУЩЕГО FAT
FATSTR0 EQU FATSTAR+2
;4 НАЧАЛО ПЕРВОЙ FAT ТАБЛИЦЫ
FATSTR1 EQU FATSTR0+4
;4 НАЧАЛО ВТОРОЙ FAT ТАБЛИЦЫ
FILE_SZ EQU FATSTR1+4
;4 РАЗМЕР ФАЙЛА В БАЙТАХ
KOLWCLS EQU FILE_SZ+4
;4 КОЛИЧЕСТВО СВОБОДНЫХ КЛАСТЕРОВ
LST0ZAP EQU KOLWCLS+4
;4 ПЕРВЫЙ СВОБОДНЫЙ КЛАСТЕР
LSTLOAD EQU LST0ZAP+4
;4 НОМЕР СЕКТОРА ЗАГРУЖЕННОГО В БУФЕР
TEK_DIR EQU LSTLOAD+4
;4 КЛАСТЕР ТЕКУЩЕЙ DIR
TEK_ZAP EQU TEK_DIR+4
;2 ТЕКУЩАЯ ЗАПИСЬ В DIR
SAVEZAP EQU TEK_ZAP+2
;2 СОХРАНЕННАЯ ТЕКУЩАЯ ПОЗИЦИЯ
TEK_LVL EQU SAVEZAP+2
;1 ТЕКУЩИЙ УРОВЕНЬ КАТАЛОГА
KCLSDIR EQU TEK_LVL+1
;1 КОЛ-ВО КЛАСТЕРОВ ДИРЕКТОРИИ
TEK_LEV EQU KCLSDIR+1
;1 ГЛУБИНА НАХОЖДЕНИЯ В ДИРЕКТОРИЯХ
NUMSECK EQU TEK_LEV+1
;1 СЧЕТЧИК СЕКТОРОВ В КЛАСТЕРЕ
PAGEDIR EQU NUMSECK+1
;2 АДРЕС УКЛАДАНИЯ В СТРАНИЦЕ ДИРОВ
PAGEMP3 EQU PAGEDIR+2
;2 АДРЕС УКЛАДАНИЯ В СТРАНИЦЕ ФАЙЛОВ
TFILCLS EQU PAGEMP3+2
;4 ТЕКУЩИЙ КЛАСТЕР
TEKNUMC EQU TFILCLS+4
;2 АДРЕС ТЕКУЩЕГО КЛАСТЕРА
MPHWOST EQU TEKNUMC+2
;1 ОСТАТОК СЕКТОРОВ В ПОСЛЕДНЕМ КЛАСТЕРЕ
KOL_CLS EQU MPHWOST+1
;4 КОЛ-ВО ПОЛНЫХ КЛАСТЕРОВ ФАЙЛА
KOLVMP3 EQU KOL_CLS+4
;2 КОЛ-ВО НАЙДЕННЫХ ФАЙЛОВ
KOLVDIR EQU KOLVMP3+2
;2 КОЛ-ВО НАЙДЕННЫХ ДИРОВ
NO_LNG POP DE
LD BC,8
LDIR
LD A,(HL)
CP 0X20
JR Z,NO_LNG1
EX DE,HL
LD (HL),0X2E
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
LD (HL),0
EXX
POP HL
RET
GETLNG1 EXX
LD B,A
EXX
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
LOADLST LD HL,BUF_512
PUSH HL
EX AF,AF'
LD A,2
CALL COM__SD
AND A
JP NZ,ERR_DRV
POP HL
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,(ROOTCLS)
LD BC,(ROOTCLS+2)
ENT_DI0 LD (TEK_DIR),DE
LD (TEK_DIR+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'
GETFZA1 LD A,C
AND 0X0F
LD E,A
LD D,0
EX DE,HL
REPT 5
ADD HL,HL
ENDM
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,$+4
LD D,0X80
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,(BYTSSEC)
PUSH AF
CALL BCDE_A
LD A,(KCLSDIR)
DEC A
CP E
JR NC,RDDIRS3
POP BC
POP BC
POP BC
LD A,0XFF
AND A
RET
RDDIRS3 LD BC,(TEK_DIR+2)
LD A,E
AND A
LD DE,(TEK_DIR)
JR Z,RDDIRS1
RDDIRS2 PUSH AF
CALL RDFATZP
POP AF
DEC A
JR NZ,RDDIRS2
RDDIRS1 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 LOADLST
POP BC
XOR A
RET
INIRTSC PUSH AF
LD H,1
LD A,D
OR E
OR B
OR C
JR Z,LASTCLS
NEXTCLS PUSH HL
CALL RDFATZP
CALL LST_CLS
POP HL
JR Z,LASTCLS
INC H
JR NEXTCLS
LASTCLS LD A,H
LD (KCLSDIR),A
LD BC,0
CALL RDDIRSC
LD A,(HL)
CP 0X2E
JR NZ,INIRTS1
INC HL
LD A,(HL)
CP 0X2E
JR Z,INIRTS1
INC BC
INIRTS1 LD (TEK_ZAP),BC
POP AF
RET
CP_TWOT LD A,(HL)
CP 0X2E
RET NZ
INC HL
LD A,(HL)
DEC HL
CP 0X2E
RET NZ
XOR A
RET
LST_CLS LD A,(CAL_FAT)
AND A
JR NZ,LST_CL1
LD HL,0X0FFF
SBC HL,DE
RET
LST_CL1 DEC A
JR NZ,LST_CL2
LD HL,0XFFFF
SBC HL,DE
RET
LST_CL2 LD HL,0X0FFF
SBC HL,BC
RET NZ
LD HL,0XFFFF
SBC HL,DE
RET
RDFATZP LD A,(CAL_FAT)
AND A
JR Z,RDFATS0
DEC A
JR Z,RDFATS1
EX DE,HL
ADD HL,HL
EX DE,HL
LD HL,0
ADC HL,BC
ADC HL,BC
LD A,E
LD E,D
LD D,L
LD C,H
LD B,0
CALL RDFATS2
INC HL
LD C,(HL)
INC HL
LD B,(HL)
RET
RDFATS1 LD BC,0
LD A,E
LD E,D
LD D,C
RDFATS2 PUSH AF
PUSH BC
LD HL,FATSTR0
CALL BCDEHLP
CALL LOADLST
POP BC
POP AF
LD E,A
LD D,0
ADD HL,DE
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
RET
RDFATS0 LD H,D
LD L,E
ADD HL,HL
ADD HL,DE
SRL H
RR L
LD A,E
LD E,H
LD D,0
LD B,D
LD C,D
SRL E
PUSH AF
PUSH HL
LD HL,FATSTR0
CALL BCDEHLP
CALL LOADLST
POP BC
LD A,B
AND 1
LD B,A
ADD HL,BC
LD B,(HL)
INC HL
LD A,H
CP HIGH (BUF_512)+2
JR NZ,RDFATS4
PUSH BC
LD BC,0
INC DE
CALL LOADLST
POP BC
RDFATS4 POP AF
LD D,(HL)
LD E,B
LD BC,0
RRA
JR NC,RDFATS3
REPT 4
SRL D
RR E
ENDM
RDFATS3 LD A,D
AND 0X0F
LD D,A
RET
;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
;НА ВХОДЕ BCDE=НОМЕР FAT
;НА ВЫХОДЕ BCDE=АДРЕС СЕКТОРА
REALSEC LD A,B
OR C
OR D
OR E
JR NZ,REALSE1
LD HL,FATSTR1
LD DE,(SEC_FAT)
LD BC,(SEC_FAT+2)
JP BCDEHLP
REALSE1 LD HL,0XFFFE
EX DE,HL
ADD HL,DE
EX DE,HL
INC HL
ADC HL,BC
;НОМЕР КЛАСТЕРА-2
LD A,(BYTSSEC)
JR REALSE2
REALSE3 SLA E
RL D
RL L
RL H
REALSE2 RRCA
JR NC,REALSE3
;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
LD B,H
LD C,L
LD HL,STARTRZ
CALL BCDEHLP
;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
LD HL,FRSTDAT
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
FAT_ERR LD A,0XFF
LD (CAL_FAT),A
RET
;ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ FAT
WC_FAT LD DE,0
LD B,D
LD C,E
CALL LOADLST
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 (CAL_FAT),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
RR C
ADC A,0
DJNZ $-4
DEC A
JR NZ,$+3
INC E
LD A,(IY+0X0E)
OR (IY+0X0F)
JR Z,$+3
INC E
LD A,(IY+0X13)
OR (IY+0X14)
JR NZ,$+3
INC E
LD A,(IY+0X20)
OR (IY+0X21)
OR (IY+0X22)
OR (IY+0X23)
JR NZ,$+3
INC E
LD A,(IY+0X15)
AND 0XF0
CP 0XF0
JR NZ,$+3
INC E
LD A,E
CP 4
JP NZ,FAT_ERR
LD A,0XFF
LD (CAL_FAT),A
LD DE,0
LD B,D
LD C,E
RDFAT00 LD (STARTRZ),DE
LD (STARTRZ+2),BC
CALL LOADLST
PUSH HL
POP IX
LD HL,0
LD E,(IX+22)
LD D,(IX+23)
;BPB_FATSZ16
LD A,D
OR E
JR NZ,RDFAT01
;ЕСЛИ НЕ FAT12/16 (BPB_FATSZ16=0)
LD E,(IX+36)
LD D,(IX+37)
LD L,(IX+38)
LD H,(IX+39)
;BPB_FATSZ32
;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +36
RDFAT01 LD (SEC_FAT+2),HL
LD (SEC_FAT),DE
;ЧИСЛО СЕКТОРОВ НА FAT-ТАБЛИЦУ
LD HL,0
LD E,(IX+19)
LD D,(IX+20)
;BPB_TOTSEC16
LD A,D
OR E
JR NZ,RDFAT02
;ЕСЛИ НЕ FAT12/16 (BPB_TOTSEC16=0)
LD E,(IX+32)
LD D,(IX+33)
LD L,(IX+34)
LD H,(IX+35)
;BPB_TOTSEC32
;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +32
RDFAT02 LD (SEC_DSC+2),HL
LD (SEC_DSC),DE
;К-ВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
;ВЫЧИСЛЯЕМ ROOTDIRSECTORS
LD C,(IX+11)
LD B,(IX+12)
;BPB_BYTSPERSEC
LD E,(IX+17)
LD D,(IX+18)
;BPB_ROOTENTCNT
LD HL,0
LD A,D
OR E
JR Z,RDFAT03
LD B,H
LD C,L
LD A,0X10
CALL BCDE_A
EX DE,HL
;ЭТО РЕАЛИЗОВАНА ФОРМУЛА
;ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)+
;+(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
;В HL ROOTDIRSECTORS
;ЕСЛИ FAT32, ТО HL=0 ВСЕГДА
RDFAT03 PUSH HL;ROOTDIRSECTORS
LD (ROOTSEC),HL
LD A,(IX+16)
;BPB_NUMFATS
LD (MANYFAT),A
LD DE,(SEC_FAT)
LD HL,(SEC_FAT+2)
DEC A
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
DEC A
JR NZ,$-6
POP BC
;ПОЛНЫЙ РАЗМЕР FAT-ОБЛАСТИ В СЕКТОРАХ
CALL HLDEPBC
;ПРИБАВИЛИ ROOTDIRSECTORS
LD C,(IX+14)
LD B,(IX+15)
;BPB_RSVDSECCNT
LD (RSVDSEC),BC
CALL HLDEPBC
;ПРИБАВИЛИ BPB_RESVDSECCNT
LD (FRSTDAT),DE
LD (FRSTDAT+2),HL
;ПОЛОЖИЛИ НОМЕР ПЕРВОГО СЕКТОРА ДАННЫХ
LD B,H
LD C,L
LD HL,SEC_DSC
;BCDE+32-ое ЧИСЛО ПО АДРЕСУ HL
CALL BCDEHLM
;ВЫЧЛИ ИЗ ПОЛНОГО К-ВА СЕКТОРОВ РАЗДЕЛА
LD A,(IX+13)
LD (BYTSSEC),A
CALL BCDE_A
;РАЗДЕЛИЛИ НА К-ВО СЕКТОРОВ В КЛАСТЕРЕ
LD (CLS_DSC),DE
LD (CLS_DSC+2),BC
;ПОЛОЖИЛИ КОЛ-ВО КЛАСТЕРОВ НА РАЗДЕЛЕ
LD A,(CAL_FAT)
CP 0XFF
JR NZ,RDFAT04
LD HL,(CLS_DSC)
LD DE,(CLS_DSC+2)
PUSH HL
PUSH DE
ADD HL,HL
EX DE,HL
ADC HL,HL
LD B,H
LD C,L
CALL RASCHET
LD A,1
POP DE
POP HL
JR Z,RDFAT04
ADD HL,HL
EX DE,HL
ADC HL,HL
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
LD B,H
LD C,L
CALL RASCHET
LD A,2
JR Z,RDFAT04
XOR A
;ДЛЯ FAT12/16 ВЫЧИСЛЯЕМ АДРЕС ПЕРВОГО
;СЕКТОРА ДИРЕКТОРИИ
;ДЛЯ FAT32 БЕРЕМ ПО СМЕЩЕМИЮ +44
;НА ВЫХОДЕ BCDE-СЕКТОР ROOTDIR
RDFAT04 LD (CAL_FAT),A
PUSH AF
AND A
LD DE,0
LD B,D
LD C,E
JR Z,FSRROO2;FAT12-NONE
DEC A
JR Z,FSRROO2;FAT16
LD E,(IX+44)
LD D,(IX+45)
LD C,(IX+46)
LD B,(IX+47);FAT32
FSRROO2 LD (ROOTCLS),DE
LD (ROOTCLS+2),BC
;СЕКТОР ROOT ДИРЕКТОРИИ
LD (TEK_DIR),DE
LD (TEK_DIR+2),BC
FSRR121 PUSH DE
PUSH BC
LD DE,(RSVDSEC)
LD BC,0
LD HL,STARTRZ
CALL BCDEHLP
LD (FATSTR0),DE
LD (FATSTR0+2),BC
LD HL,SEC_FAT
CALL BCDEHLP
LD (FATSTR1),DE
LD (FATSTR1+2),BC
XOR A
LD (TEK_LEV),A
POP BC
POP DE
POP AF
JP INIRTSC
RASCHET CALL BCDE200
LD HL,SEC_FAT
CALL BCDEHLM
LD A,E
AND 0XF0
OR D
OR C
OR B
RET
FINDDIR LD IY,0
LD A,PG4DIR
OUT (0),A
LD HL,FORFILE
LD (PAGEDIR),HL
FNDDIR7 LD BC,0
CALL RDDIRSC
LD DE,0X20
PUSH HL
POP IX
LD A,(HL)
CP 0X2E
JR NZ,FNDDIR3
FNDDIR4 LD A,(IX+1)
CP 0X2E
JR Z,FNDDIR1
INC BC
ADD IX,DE
FNDDIR1 INC BC
ADD IX,DE
FNDDIR3 LD A,IXH
CP HIGH (BUF_512)+2
JR NZ,FNDDIR2
CALL RDDIRSC
JR NZ,FNDDIR5
LD DE,0X20
PUSH HL
POP IX
FNDDIR2 LD A,(IX+0X0B)
CP 0X0F
JR Z,FNDDIR1
CP 8
JR Z,FNDDIR1
LD A,(IX)
CP 0XE5
JR Z,FNDDIR1
AND A
JR Z,FNDDIR5
BIT 4,(IX+0X0B)
JR Z,FNDDIR1
FNDDIR6 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
LD (PAGEDIR),HL
DEC IY
DEC IY
LD (IY),C
LD (IY+1),B
LD (TEK_ZAP),BC
CALL ENT_DIR
JR FNDDIR7
FNDDIR5 LD A,IYH
AND A
JR Z,FNDDIR0
LD BC,0
CALL RDDIRSC
PUSH HL
POP IX
LD DE,0X20
LD A,(HL)
CP 0X2E
JR NZ,FNDDI52
INC HL
LD A,(HL)
CP 0X2E
JR Z,FNDDI52
INC BC
ADD IX,DE
FNDDI52 LD (TEK_ZAP),BC
CALL ENT_DIR
LD C,(IY)
LD B,(IY+1)
INC IY
INC IY
CALL RDDIRSC
LD A,C
AND 0X0F
LD E,A
LD D,0
EX DE,HL
REPT 5
ADD HL,HL
ENDM
ADD HL,DE
PUSH HL
POP IX
LD DE,0X20
JP FNDDIR1
FNDDIR0 LD HL,ROOTCLS
LD DE,(PAGEDIR)
LDI
LDI
LDI
LDI
LD H,D
LD L,E
INC HL
INC HL
INC HL
LD (HL),0XFF
EX DE,HL
LD DE,FORFILE
AND A
SBC HL,DE
SRL H
RR L
SRL H
RR L
LD (KOLVDIR),HL
LD A,PG4MP3
OUT (0),A
RET
FNDMP30 LD HL,(PAGEMP3)
LD DE,FORFILE
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 A,PG4MP3
OUT (0),A
LD IY,1
LD B,H
LD C,L
LD DE,0XFFFC
ADD IX,DE
DEC HL
EXX
LD L,(IX)
LD H,(IX+1)
EXX
FNDM030 EXX
LD D,H
LD E,L
LD L,(IX)
LD H,(IX+1)
AND A
SBC HL,DE
EX AF,AF'
ADD HL,DE
EX AF,AF'
EXX
JR Z,$+4
INC IY
LD A,H
OR L
JR Z,FNDM033
DEC HL
ADD IX,DE
JR FNDM030
FNDM033 LD (KOLVDIR),IY
POP HL
RET
FINDMP3 LD A,PG4DIR
OUT (0),A
LD HL,FORFILE
LD (PAGEDIR),HL
LD (PAGEMP3),HL
FNDMP37 LD HL,(PAGEDIR)
LD (TEKNUMC),HL
LD DE,TEK_DIR
LDI
LDI
LDI
LDI
LD (PAGEDIR),HL
DEC HL
BIT 7,(HL)
JP NZ,FNDMP30
LD DE,(TEK_DIR)
LD BC,(TEK_DIR+2)
CALL INIRTSC
LD BC,0
CALL RDDIRSC
LD DE,0X20
PUSH HL
POP IX
LD A,(HL)
CP 0X2E
JR NZ,FNDMP33
FNDMP34 LD A,(IX+1)
CP 0X2E
JR Z,FNDMP31
INC BC
ADD IX,DE
FNDMP31 INC BC
ADD IX,DE
FNDMP33 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+0X0B)
CP 0X0F
JR Z,FNDMP31
CP 8
JR Z,FNDMP31
LD A,(IX)
CP 0XE5
JR Z,FNDMP31
AND A
JR Z,FNDMP37
BIT 4,(IX+0X0B)
JR NZ,FNDMP31
EXX
PUSH IX
POP HL
CALL CP_EXT
EXX
DEC A
JP NZ,FNDMP31
LD A,PG4MP3
OUT (0),A
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,PG4DIR
OUT (0),A
LD DE,0X20
JR FNDMP31
F_EXT DB "MP3",0
CP_EXT PUSH BC
PUSH DE
PUSH HL
LD C,0
LD DE,F_EXT
CPETR2 LD A,(DE)
AND A
JR Z,CPETR1+1
INC C
PUSH DE
CALL COMPARF
POP DE
JR Z,CPETR1
INC DE
INC DE
INC DE
JR CPETR2
CPETR1 LD A,C
POP HL
POP DE
POP BC
RET
COMPARF PUSH DE
LD DE,8
ADD HL,DE
POP DE
LD B,3
LD A,(DE)
CP (HL)
RET NZ
INC HL
INC DE
DJNZ $-5
RET
OPENFIL CALL SET_MP3
CALL GETFZAP
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,(BYTSSEC)
LD H,A
DEC A
AND E
LD L,A
EX AF,AF'
JR Z,$+3
INC L
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
RET
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
POP BC
POP DE
LD A,(NUMSECK)
INC A
LD H,A
LD (NUMSECK),A
LD A,(BYTSSEC)
CP H
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
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
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,FORFILE
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC HL
PUSH HL
LD A,PG4DIR
OUT (0),A
EX DE,HL
LD DE,TEK_DIR
LDI
LDI
LDI
LDI
LD DE,(TEK_DIR)
LD BC,(TEK_DIR+2)
CALL INIRTSC
LD A,PG4MP3
OUT (0),A
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,FORFILE
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)
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)
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,FORFILE
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,FORFILE
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)
LD H,(IX+1)
EXX
NXTDIR2 EXX
LD D,H
LD E,L
LD L,(IX)
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,FORFILE
JR NXTDIR2
NXTDIR3 LD B,H
LD C,L
RET