;!TODO fat32 ;======================================================================= ;BPB ;LD (FatBuffer.FAT2_SEC_L),HL ;LD (FatBuffer.DIR_FRL),HL ; first sector DIR ;BPB32 ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта ;FAT Max Cluster ;LD (FAT_Max_Cluster_L),HL ;======================================================================= ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; костыли MODULE SET_FAT32 ; ВХОД: HL - младшее слово номера кластера после инкремента ; ВЫХОД: HL - как и вход ; DE - старшее слово номера кластера после инкремента CHECK_INC_HIGH_CLUSTER: LD DE,(R_CLUST.FAT32) ; LD A,H OR L RET NZ ; INC DE ; !FIXIT проверять переполнение? RET ENDMODULE ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;вход: DE:HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_CELL: ;[ ] fat32 DI HALT ; FOR 8192 bytes cache ; 1 073 741 824 bytes max fat32 size ; 1073741824/8192=131072 ; 0x40000000 / 0x2000 = 0x20000 ; FOR 16384 bytes cache ; 1 073 741 824 bytes max fat32 size ; 1073741824/16384=65536 ; 0x40000000 / 0x4000 = 0x10000 /* D E H L 0xEAB1022 - block 0x1D562 D E H 0xEAB10 >>> 0x1D562 */ LD A,H LD B,H AND #0F ;AND FAT_CACHE.Size_Mask_16 ; #0F LD H,A LD A,B ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ;DUP FAT_CACHE.Degree_16 RRCA RRCA RRCA RRCA ;EDUP AND #0F ;AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH CP C CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET /* ; Прочитать в кеш 16 секторов FAT-а ; A - NEW FAT BLOCK READ_FAT32: PUSH HL PUSH AF LD A,(FatCache.Update) OR A CALL NZ,WRITE_FAT_TABLE.Start POP AF LD L,A XOR A LD H,A ;!FIXIT fat32 LD (FatCache.Block),HL LD (FatCache.Update),A ;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 ;!TODO FAT32 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 ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_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.Block) ; C - BLOCK FAT IN CASH CP C CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET R_F_F16: 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 */ ;