//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; FAT 12-16 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;[BEGIN] ;//MODULE: FAT_X ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;RY01 16-11-1999 DNS ERROR READING FAT CHAIN ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- ; Установить начальный кластер для чтения R_CLUST LD HL,#0001 LD (G_CLUST.num),HL RET ; найти первый свободный кластер G_CLUST: .num+1: LD HL,#0001 .loop: INC HL ; номер кластера CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF RET Z ; ошибка ? LD A,D OR E JR NZ,.loop LD (G_CLUST.num),HL XOR A RET ; HL - CLUSTER INC_FAT: PUSH HL CALL G_CLUST POP DE RET C ; PUSH HL PUSH HL EX DE,HL ; hl=номер кластера .loop: CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL JR NC,.loop ; не конец цепочки EX DE,HL POP DE ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера ;!FIXIT <нет контроля ошибки> ; ; POP HL LD DE,(FatBuffer.ENDCLUS) ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WR_FAT? ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск ; AND A RET ;RX01 ;----------------------------------------------------------- ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl = номер кластера ; выход: hl = номер кластера ; de = номер след. кластера ; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb ;----------------------------------------------------------- R_F_FAT: EX DE,HL LD HL,(FAT_Max_Cluster) AND A SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL RET C SET_PAGE_X FATPAGE PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYP) CP "2" ; fat12 JR Z,R_F_F12 ; fat16, просто читать след. номер R_F_F16: ; LD A,H ; LD B,H ; ;AND #0F ; AND FAT_CACHE.Size_Mask_16 ; LD H,A ; LD A,B ; ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ; DUP FAT_CACHE.Degree_16 ; RRCA ; EDUP ; ;AND #0F ; AND FAT_CACHE.Part_Mask_16 ; ; ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH ; CP C ; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT ; LD DE,FATPAGE.cache ; начало кеша FAT-а ; ADD HL,DE ; на ячейку FAT CALL GET_FAT16_CELL LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) POP AF OUT (SLOT3),A ;!TODO #FFF7 - кластер с косякчными секторами LD HL,#FFEF ;!HARDCODE XOR A ; DssErr.sys.NO_ERROR SBC HL,DE ; проверка на служ. кластеры POP HL RET ; R_F_F12: CALL GET_FAT12_CELL ; LD D,H ; LD E,L ; RR H ; RR L ; сдвиг вправо через CF ; PUSH AF ; сохр. флаг ; ADD HL,DE ; CLUSTER * 1.5 ; ; ; ;!FIXIT оптимизировать ; ;IF COMPILE_UNUSED_CODE ; LD A,H ; LD B,H ; AND #1F ; LD H,A ; LD A,B ; RLCA ; RLCA ; RLCA ; AND #07 ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH ; CP C ; CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а ; ;ENDIF ; ; ; LD DE,FATPAGE.cache ; начало кеша FAT-а ; ADD HL,DE ; на ячейку FAT ; POP AF ; восст. флаг LD E,(HL) INC HL LD D,(HL) JR C,R_F_F01 LD A,D AND #0F LD D,A JP R_F_F02 ; R_F_F01: LD A,E AND #F0 RR D ; вправо на 4 битa RRA RR D RRA RR D RRA RR D RRA LD E,A R_F_F02: POP AF OUT (SLOT3),A LD HL,#0FEF XOR A ; обнуляем CF и устанавливаем код ошибки = нулю SBC HL,DE ; проверка на служ. кластеры POP HL RET ;----------------------------------------------------------- ; Записать в кеш FAT-а номер кластера ; вход: de = номер кластера ; hl = ? номер первого кластера ; выход: hl = ? номер след. кластера ; de = номер кластера ; in: HL - CLUSTER ; out: DE - (CLUSTER) ;----------------------------------------------------------- W_T_FAT: PUSH DE EX DE,HL LD HL,(FAT_Max_Cluster) AND A SBC HL,DE EX DE,HL POP DE LD A,DSS_Error.sys.DISK_FULL RET C EXX SET_PAGE_X FATPAGE EXX PUSH HL PUSH AF ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,1 ;LD (FatCache.Update),A ; LD A,(FatBuffer.FAT_TYP) CP "2" ; fat12 JR Z,W_T_F12 W_T_F16: PUSH DE ; LD A,H ; LD B,H ; ;AND #0F ; AND FAT_CACHE.Size_Mask_16 ; LD H,A ; LD A,B ; ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ; DUP FAT_CACHE.Degree_16 ; RRCA ; EDUP ; ;AND #0F ; AND FAT_CACHE.Part_Mask_16 ; ; ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ;!HARDCODE fat16 - размер записи FAT ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH ; CP C ; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT ; LD DE,FATPAGE.cache ; ADD HL,DE ; на ячейку FAT CALL GET_FAT16_CELL POP DE LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D POP AF ; восст. порт POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD LD A,1 LD (FatCache.Update),A ; XOR A RET ; ; fat12 W_T_F12: ;!FIXIT переделать на переменные FAT_CACHE PUSH DE ; LD D,H ; LD E,L ; ; ADD HL,HL ; ; ADD HL,DE ; ; RR H ; ; RR L ;CLUSTER * 1.5 ; ; PUSH AF ; RR H ; RR L ; сдвиг вправо через CF ; PUSH AF ; сохр. флаг ; ADD HL,DE ; CLUSTER * 1.5 ; ; ; ;!FIXIT оптимизировать ; ;IF COMPILE_UNUSED_CODE ; LD A,H ; LD B,H ; AND #1F ; LD H,A ; LD A,B ; RLCA ; RLCA ; RLCA ; AND #07 ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH ; CP C ; CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а ; ;ENDIF ; ; ; LD DE,FATPAGE.cache ; ADD HL,DE ; POP AF CALL GET_FAT12_CELL POP DE JR C,W_T_F01 ; номер нечётный LD (HL),E INC HL LD A,(HL) AND #F0 OR D LD (HL),A POP AF POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD LD A,1 LD (FatCache.Update),A ; AND A RET ; W_T_F01:; влево на 4 битa ;SLA E ;LD A,E ;RL D ;RLA ;RL D ;RLA ;RL D ;RLA ;RL D ;LD E,A ; ex de,hl add hl,hl add hl,hl add hl,hl add hl,hl ex de,hl ; LD A,(HL) AND #0F OR E LD (HL),A ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D POP AF POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD LD A,1 LD (FatCache.Update),A ; AND A RET ;RX01 ;RE_FAT: ; Прочитать в кеш 16 секторов FAT-а ; A - NEW FAT BLOCK READ_FAT: PUSH HL PUSH AF LD A,(FatCache.Update) OR A CALL NZ,WR_FAT.Start POP AF LD L,A LD H,0 LD (FatCache),HL ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 EDUP LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL ; LD XH,D LD XL,E ;LD IX,0 ;ADD IX,DE ; номер лог. сектора ; LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE RST ToDSS.DRV POP HL RET ; Подключить банку кеша FAT и записать его на диск WR_FAT: SET_PAGE_X FATPAGE PUSH AF CALL .Start ;!TODO нет контроля ошибок POP AF OUT (SLOT3),A RET ; Запись кеша (всего?) FAT-а на диск .Start: LD HL,(FatCache) LD H,0 ;FAT BLOCK * 16 = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 EDUP ; HL - номер лог. сектора PUSH HL LD B,H LD C,L ;BC - BLOCK OF FAT LD DE,FAT_CACHE.Sectors ADD HL,DE ;+ SIZE CASH (16 SECTORS) LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT AND A SBC HL,DE JR C,.WALLFAT EX DE,HL LD HL,FAT_CACHE.Sectors ; CF = 0 SBC HL,DE JR C,.ERR LD A,L .WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? LD H,B LD L,C LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL ; LD XH,D LD XL,E ;LD IX,0 ;ADD IX,DE ; номер лог. сектора ; LD HL,0 ; ст. разряд ;HL:IX - SECTOR OF FAT FOR SAVE LD DE,FATPAGE.cache ; откуда LD B,A ; число секторов LD C,Dss.DRV.Write ; запись секторов LD A,(FatBuffer.DRIVE) ; номер диска PUSH BC RST ToDSS.DRV POP BC ; b=число секторов POP HL LD DE,(FatBuffer.FAT2_XX) ADD HL,DE EX DE,HL ; LD XH,D LD XL,E ;LD IX,0 ;ADD IX,DE ; номер лог. сектора ; LD DE,FATPAGE.cache LD HL,0 LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write RST ToDSS.DRV AND A ;!TODO нет контроля ошибок ; .ERR: LD A,0 LD (FatCache.Update),A RET NC POP HL ; CF = 1 RET ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT16_CELL: LD A,H LD B,H ;AND #0F AND FAT_CACHE.Size_Mask_16 LD H,A LD A,B ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) DUP FAT_CACHE.Degree_16 RRCA EDUP ;AND #0F AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FatCache) ; C - BLOCK FAT IN CASH CP C CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE ; CF - чётный/нечётный адрес кластера GET_FAT12_CELL: LD D,H LD E,L RR H RR L ; сдвиг вправо через CF PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; ;IF COMPILE_UNUSED_CODE ;!FIXIT оптимизировать LD A,H LD B,H ; AND #1F ;AND FAT_CACHE.Size_Mask_16 ; LD H,A LD A,B ; RLCA RLCA RLCA ;DUP FAT_CACHE.Degree_16 ; RRCA ;EDUP AND #07 ;AND FAT_CACHE.Part_Mask_16 ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH CP C CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а ;ENDIF ; LD DE,FATPAGE.cache ADD HL,DE POP AF RET ; in: HL - CLUSTER ; out: HL:IX - SECTOR NSECTOR: LD DE,0 DEC HL DEC HL LD A,(CORE_BUFFERS.BootSector.S_P_C) XOR 1 JR Z,.skip ; RRA .loop: ADD HL,HL RL E RL D ; RRA JP NC,.loop ; .skip: EX DE,HL LD XL,E LD XH,D LD DE,(FatBuffer.DAT_FRM) ;first data sector XOR A ADD IX,DE LD D,A LD E,A ADC HL,DE ;!TODO а надо ли проверять переполнение HL:IX? RET //////////////////////////////////////////////////////////////////////// ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE MACRO _GetSavedCluster exit_to LD E,(IY+_sFM.KnownCluster_L) LD D,(IY+_sFM.KnownCluster_H) LD A,D OR E JR Z,exit_to ; PUSH DE PUSH HL PUSH BC LD E,(IY+_sFM.KnownOffset_L) LD D,(IY+_sFM.KnownOffset_H) LD A,D OR E JR Z,.noOptimization_1 ; POP HL AND A SBC HL,DE JR C,.noOptimization_2 ; LD C,L LD B,H POP HL POP DE ; EX DE,HL JP exit_to .noOptimization_1: POP BC .noOptimization_2: POP HL POP DE JP exit_to ENDM ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE MACRO _SaveGetedCluster LD (IY+_sFM.KnownCluster_L),L LD (IY+_sFM.KnownCluster_H),H POP BC LD (IY+_sFM.KnownOffset_L),C LD (IY+_sFM.KnownOffset_H),B ENDM ;; BLOK_RD.ECL2: ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP BC ; POP BC POP DE AND A RET ; ;READ SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors BLOK_RD: PUSH BC LD (READ.PointerOnBuffer),IX LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 ;!FIXIT ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb LD B,XH LD C,XL PUSH HL ;RESIDUE LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;JR NZ,BLOKRD2 PUSH BC JR Z,.ECL2 ;JP ECL2 ;RY01 JR BLOKRD0 _GetSavedCluster .enter_loop1 ; .loop1: PUSH BC CALL R_F_FAT POP BC JR C,.ECL2 ;RY01 EX DE,HL DEC BC .enter_loop1: LD A,B ; ВС - смещение внутри файла в кластерах OR C JR NZ,.loop1 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster ; POP DE POP BC LD A,(CORE_BUFFERS.BootSector.S_P_C) SUB E LD C,A ;\ CP B ; \ JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться .skip1: LD A,B ; / SUB C ; / LD B,A ;/ PUSH HL PUSH BC PUSH DE CALL NSECTOR POP DE ADD IX,DE JR NC,.skip2 INC HL .skip2: LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV JR C,.Error POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.B_P_S) ;!TEST LD A,B LD B,C .loop2: ADD HL,DE ;DEC C ;JR NZ,.loop2 DJNZ .loop2 LD (READ.PointerOnBuffer),HL POP DE ;LD A,B OR A RET Z LD B,A ; .loop4: LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A LD C,(HL) JR NC,.BLOKRD7 LD B,0 ADD A,(HL) ;0 AND CF LD C,A OR A ;CLEAR CF RET Z .BLOKRD7: EX DE,HL PUSH BC CALL R_F_FAT POP BC JR C,.ECL1 ;RY01 EX DE,HL PUSH HL PUSH BC CALL NSECTOR LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV JR C,.Error POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.B_P_S) .loop3: ADD HL,DE DEC C JR NZ,.loop3 LD (READ.PointerOnBuffer),HL POP DE JP .loop4 ; .Error: POP BC POP DE ;SCF RET ; .ECL1: AND A RET ;----------------------------------------------------------------------- ; BLOK_WR.Error: ; POP BC ; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ; POP BC ; ; BLOK_WR.ErrorWrite: ; POP BC ; POP DE ; LD A,DSS_Error.sys.WRITE_ERROR ; SCF ; RET ; ;WRITE SECTORS OF FILE ;HL:DE - FP (in sectors), IX - data in RAM ; B - Amount sectors BLOK_WR: PUSH BC LD (READ.PointerOnBuffer),IX LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC LD B,XH LD C,XL PUSH HL ;RESIDUE LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;JR NZ,BLOKWR2 PUSH BC JR NZ,.GetSavedCluster ; PUSH BC CALL G_CLUST JP C,.Error LD (IY+_sFM.ST_CLUSTER),L LD (IY+_sFM.ST_CLUSTER+1),H LD DE,(FatBuffer.ENDCLUS) CALL W_T_FAT PUSH HL ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск ; POP HL POP BC JP .WR2 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE .GetSavedCluster: _GetSavedCluster .WR2 ; .loop: PUSH BC CALL R_F_FAT JR NC,.WRB PUSH HL CALL INC_FAT POP HL JP C,.Error CALL R_F_FAT .WRB: POP BC EX DE,HL DEC BC .WR2: LD A,B OR C JR NZ,.loop ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster ; POP DE POP BC LD A,(CORE_BUFFERS.BootSector.S_P_C) SUB E LD C,A CP B JR C,.WR3 ;SIZE > RESIDUE CLUSTER LD C,B ;SIZE < CLUSTER .WR3: LD A,B SUB C LD B,A PUSH HL PUSH BC PUSH DE CALL NSECTOR POP DE ADD IX,DE JR NC,.WR4 INC HL ; DOUBLE 1 .WR4: LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.B_P_S) ; .loop2: ADD HL,DE DEC C JR NZ,.loop2 ; LD (READ.PointerOnBuffer),HL POP DE ; LD A,B OR A RET Z ; .big_loop: LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A LD C,(HL) JR NC,.WR7 LD B,0 ADD A,(HL) ;0 AND CF LD C,A OR A ;CLEAR CF RET Z .WR7: EX DE,HL PUSH BC CALL R_F_FAT JR NC,.WR9 PUSH HL CALL INC_FAT POP HL JR C,.ErrorFull CALL R_F_FAT .WR9: POP BC EX DE,HL PUSH HL PUSH BC CALL NSECTOR ; DOUBLE 1 LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.B_P_S) .loop3: ADD HL,DE DEC C JR NZ,.loop3 LD (READ.PointerOnBuffer),HL POP DE ; JP .big_loop ; .Error: POP BC POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE .ErrorWrite: POP BC POP DE LD A,DSS_Error.sys.WRITE_ERROR ;SCF RET ; .ErrorFull: POP BC LD A,DSS_Error.sys.DISK_FULL ;SCF RET //////////////////////////////////////////////////////////////////////// FatCache: WORD #0000 .Block EQU FatCache .Update EQU FatCache+1 FAT_Max_Cluster: WORD #0FF0 ; макс. число кластеров (без служ.) ;//MODULE: FAT_X ;[END] ;RX01 ;; HL - CLUSTER ;; DE - (CLUSTER) ; ;R_F_FAT EX DE,HL ; LD HL,(FAT_Max_Cluster) ; AND A ; SBC HL,DE ; EX DE,HL ; LD A,10 ; RET C ; PUSH HL ; LD A,(FAT_TYP) ; CP "2" ; JP Z,R_F_F12 ;R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH ; XOR A ;R_F_00H INC A ; HL - CLUSTER ; SBC HL,DE ; JP NC,R_F_00H ; ADD HL,DE ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; DEC A ; LD BC,(FatCache) ; A - ELEMENT OF CASH ; CP C ; CALL NZ,READ_FAT ; LD DE,FAT ; ADD HL,DE ; LD E,(HL) ; INC HL ; LD D,(HL) ; LD HL,#FFEF ; AND A ; SBC HL,DE ; POP HL ; LD A,0 ; RET ; ;R_F_F12 LD D,H ; LD E,L ; ADD HL,HL ; ADD HL,DE ; RR H ; RR L ; PUSH AF ; EX DE,HL ; LD HL,(B_P_S) ; LD B,H ; LD C,L ; ADD HL,HL ; ADD HL,BC ; EX DE,HL ; XOR A ; DE - SIZE SECTOR * 3 ;R_F_00 INC A ; HL - FAT OFFSET ; SBC HL,DE ; JP NC,R_F_00 ; ADD HL,DE ; DEC A ; ; ;WR_FAT LD HL,(FatCache) ; LD H,0 ; LD (FatCache),HL ; LD E,L ; LD D,H ; ADD HL,HL ; ADD HL,DE ; PUSH HL ; LD B,H ; LD C,L ; INC HL ; INC HL ; INC HL ; LD DE,(S_P_F) ; LD A,3 ; AND A ; SBC HL,DE ; JP C,WR_FAT1 ; EX DE,HL ; LD HL,3 ; AND A ; SBC HL,DE ; JP C,FATERR ; LD A,L ;WR_FAT1 LD H,B ; LD L,C ; LD DE,(FAT_FRM) ; ADD HL,DE ; EX DE,HL ; LD IX,0 ; ADD IX,DE ; LD DE,FAT ; LD HL,0 ; LD B,A ; LD C,6 ; LD A,(DRIVE) ; PUSH BC ; RST #18 ; POP BC ; POP HL ; LD DE,(FAT2_XX) ; ADD HL,DE ; EX DE,HL ; LD IX,0 ; ADD IX,DE ; LD DE,FAT ; LD HL,0 ; LD A,(DRIVE) ; LD C,6 ; RST #18 ; RET ////////////// OLD //////////////// ; HL - CLUSTER ; HL:IX - SECTOR ; NSECTOR: DEC HL ; DEC HL ; EX DE,HL ; LD A,(CORE_BUFFERS.BootSector.S_P_C) ; LD B,A ; LD HL,0 ; LD IX,0 ; ADD_DE1: ADD IX,DE ; JR NC,ADD_DE2 ; INC HL ; ADD_DE2: DJNZ ADD_DE1 ; LD DE,(FatBuffer.DAT_FRM) ;first data sector ; ADD IX,DE ; LD DE,#0000 ; ADC HL,DE ; RET ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////