;[BEGIN] ;//MODULE: FAT_X ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R01 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-а номер кластера POP HL LD DE,(FatBuffer.ENDCLUS) ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск AND A RET ;R01 ;----------------------------------------------------------- ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl = номер кластера ; выход: hl = номер кластера ; de = номер след. кластера ; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb ;----------------------------------------------------------- ;!FIXIT отдаёт разный CF при удачном завершении в зависимости от FAT16/FAT12 R_F_FAT: EX DE,HL LD HL,(MAX_CLU) 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 LD H,A LD A,B ; bit7..4 --> bit3..0. RRCA RRCA RRCA RRCA AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) POP AF OUT (SLOT3),A LD HL,#FFEF ;!HARDCODE XOR A ; DssErr.sys.NO_ERROR SBC HL,DE ; проверка на служ. кластеры POP HL RET ;R01; HL - CLUSTER ;R01; DE - (CLUSTER) ;R01 ;R01R_F_FAT EX DE,HL ;R01 LD HL,(MAX_CLU) ;R01 AND A ;R01 SBC HL,DE ;R01 EX DE,HL ;R01 LD A,10 ;R01 RET C ;R01 PUSH HL ;R01 LD A,(FAT_TYP) ;R01 CP "2" ;R01 JP Z,R_F_F12 ;R01R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH ;R01 XOR A ;R01R_F_00H INC A ; HL - CLUSTER ;R01 SBC HL,DE ;R01 JP NC,R_F_00H ;R01 ADD HL,DE ;R01 ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ;R01 DEC A ;R01 LD BC,(FATCASH) ; A - ELEMENT OF CASH ;R01 CP C ;R01 CALL NZ,RE_FAT ;R01 LD DE,FAT ;R01 ADD HL,DE ;R01 LD E,(HL) ;R01 INC HL ;R01 LD D,(HL) ;R01 LD HL,#FFEF ;R01 AND A ;R01 SBC HL,DE ;R01 POP HL ;R01 LD A,0 ;R01 RET ;R01 ;R01R_F_F12 LD D,H ;R01 LD E,L ;R01 ADD HL,HL ;R01 ADD HL,DE ;R01 RR H ;R01 RR L ;R01 PUSH AF ;R01 EX DE,HL ;R01 LD HL,(B_P_S) ;R01 LD B,H ;R01 LD C,L ;R01 ADD HL,HL ;R01 ADD HL,BC ;R01 EX DE,HL ;R01 XOR A ; DE - SIZE SECTOR * 3 ;R01R_F_00 INC A ; HL - FAT OFFSET ;R01 SBC HL,DE ;R01 JP NC,R_F_00 ;R01 ADD HL,DE ;R01 DEC A ; R_F_F12 LD D,H ; LD E,L ; ADD HL,HL ; ADD HL,DE ; RR H ; сдвиг вправо через CF ; RR L ; CLUSTER * 1.5 ; PUSH AF ; сохр. флаг R_F_F12: 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,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_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 ; LD E,A ; RR D ; вправо на 4 битa ; RR E ; RR D ; RR E ; RR D ; RR E ; RR D ; RR E 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,(MAX_CLU) 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 LD A,1 LD (FATCASH.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 LD H,A LD A,B RRCA RRCA RRCA RRCA AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ADD HL,DE ; на ячейку FAT POP DE LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D POP AF ; восст. порт POP HL OUT (SLOT3),A XOR A RET ; ; fat12 W_T_F12: 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,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а ENDIF ; LD DE,FATPAGE.cache ADD HL,DE POP AF POP DE JP 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 AND A RET ; W_T_F01 SLA E ; RL D ; RL E ; RL D ; RL E ; RL D ; RL E ; RL D ; W_T_F01:; влево на 4 битa SLA E LD A,E RL D RLA RL D RLA RL D RLA RL D LD E,A ; LD A,(HL) AND #0F OR E LD (HL),A ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D POP AF POP HL OUT (SLOT3),A AND A RET ;R01 ; Прочитать в кеш 16 секторов FAT-а ; A - NEW FAT BLOCK RE_FAT: PUSH HL PUSH AF LD A,(FATCASH.Update) OR A CALL NZ,WR_FAT.Start POP AF LD L,A LD H,0 LD (FATCASH),HL ;FAT BLOCK * 16 = SECTOR OF FAT ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ;!TODO FATcacheSize ; LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL 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,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize 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,(FATCASH) LD H,0 ;LD (FATCASH),HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT ;!TODO FATcacheSize PUSH HL LD B,H LD C,L ;BC - BLOCK OF FAT LD DE,16 ;!HARDCODE ;!TODO FATcacheSize ADD HL,DE ;+ SIZE CASH (16 SECTORS) LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT AND A SBC HL,DE JR C,.WALLFAT EX DE,HL LD HL,16 ;!HARDCODE ; число секторов ;!TODO FATcacheSize ; CF = 0 SBC HL,DE JP C,.ERR LD A,L .WALLFAT: LD H,B LD L,C LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL LD IX,0 ;HL:IX - SECTOR OF FAT FOR SAVE ADD IX,DE ; номер лог. сектора LD HL,0 ; ст. разряд 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 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 (FATCASH.Update),A RET NC POP HL ; CF = 1 RET ;R01 ;R01WR_FAT LD HL,(FATCASH) ;R01 LD H,0 ;R01 LD (FATCASH),HL ;R01 LD E,L ;R01 LD D,H ;R01 ADD HL,HL ;R01 ADD HL,DE ;R01 PUSH HL ;R01 LD B,H ;R01 LD C,L ;R01 INC HL ;R01 INC HL ;R01 INC HL ;R01 LD DE,(S_P_F) ;R01 LD A,3 ;R01 AND A ;R01 SBC HL,DE ;R01 JP C,WR_FAT1 ;R01 EX DE,HL ;R01 LD HL,3 ;R01 AND A ;R01 SBC HL,DE ;R01 JP C,FATERR ;R01 LD A,L ;R01WR_FAT1 LD H,B ;R01 LD L,C ;R01 LD DE,(FAT_FRM) ;R01 ADD HL,DE ;R01 EX DE,HL ;R01 LD IX,0 ;R01 ADD IX,DE ;R01 LD DE,FAT ;R01 LD HL,0 ;R01 LD B,A ;R01 LD C,6 ;R01 LD A,(DRIVE) ;R01 PUSH BC ;R01 RST #18 ;R01 POP BC ;R01 POP HL ;R01 LD DE,(FAT2_XX) ;R01 ADD HL,DE ;R01 EX DE,HL ;R01 LD IX,0 ;R01 ADD IX,DE ;R01 LD DE,FAT ;R01 LD HL,0 ;R01 LD A,(DRIVE) ;R01 LD C,6 ;R01 RST #18 ;R01 RET FATCASH: WORD #0000 .Block EQU FATCASH .Update EQU FATCASH+1 MAX_CLU: WORD #0FF0 ; макс. число кластеров FAT12 (без служ.) ;//MODULE: FAT_X ;[END]