diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index a749150..cb8c85d 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -43,7 +43,7 @@ DEL_FN: ;!TEST PUSH DE ; номер след. кластера PUSH AF LD DE,#0000 ; номер кластера - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера POP AF POP DE JP NC,.loop diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 227c22f..c2382f8 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -48,7 +48,6 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 RET C PUSH HL ; [ ] fat32 - LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE @@ -142,7 +141,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LDIR ; POP HL - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 4463af8..e91ad9e 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -41,7 +41,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX .RMD17: PUSH HL - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 05e4434..163072e 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -18,7 +18,7 @@ WRITE.RD_ONLY: WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF - LD A,(FatCache.Update) + LD A,(FatBuffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index aa511ab..05ebab6 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -120,7 +120,7 @@ DISKINF:; [ ] 22/11/23 ;.FRESP2: LD D,B LD E,C - LD HL,(FAT_Max_Cluster_L) + LD HL,(FatBuffer.MaxClusterLow) DEC HL LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index e251750..4b3075b 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -357,6 +357,7 @@ ADRST10: ;DS 512 ;,0 INCLUDE "API.ASM" INCLUDE "DOS_Proc.asm" INCLUDE "FS/FAT/FAT.ASM" + INCLUDE "FS/FAT/FAT_X.ASM" INCLUDE "DOS_FM.ASM" INCLUDE "EXECUTE.ASM" @@ -461,8 +462,11 @@ SECBUF EQU BUFFER ; -;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; -; !!!!! эта процедура затрётся после исполнения +;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +; затрётся после инициализации +;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + + ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION F_START: DI ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 0c4f187..b495a90 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -134,17 +134,11 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ; MACRO SET_PAGE_X new_page - ; IF OLD_SET_BANK - ; LD A,new_page - ; CALL BANK - - ; ELSE - LD A,(BANKTBL+new_page) - LD B,A - LD C,SLOT3 - IN A,(SLOT3) - OUT (C),B - ; ENDIF + LD A,(BANKTBL+new_page) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B ENDM ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 78187a5..97ae971 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -359,7 +359,7 @@ LOADDIR: .LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(FatBuffer.DirSizeInSectros) + LD A,(FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 @@ -464,7 +464,7 @@ SAVEDIR: .SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) LD IX,(FatBuffer.RootDirFirstSector_L) - LD A,(FatBuffer.DirSizeInSectros) + LD A,(FatBuffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512 SUB B JR NC,.RTD1S @@ -576,7 +576,7 @@ RD_BPB: LD C,SLOT3 EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (FatBuffer.DirSizeInSectros),A + LD (FatBuffer.DirSizeInSectors),A ADD HL,BC ; Start DATA area LD (FatBuffer.FirstDataSector_L),HL ; B = 0 @@ -602,13 +602,13 @@ RD_BPB: LD C,SLOT3 JP Z,DOS_X_Error.UnknownBPB SBC HL,DE JR NC,.loop4 - LD (FatBuffer.ClusterPerBank),A ; A - Clusters per bank (16k) + LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) ; ;!TODO detect fat type by clusters! ;[ ] fat32 reset fat32 variables LD HL,0 LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FAT_Max_Cluster_H),HL + LD (FatBuffer.MaxClusterHigh),HL ; LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG @@ -627,34 +627,28 @@ RD_BPB: LD C,SLOT3 JR Z,.loop6 ; CP '1' - IF _FAT32_ENABLE - JP Z,.fat1x ;[ ] fat32 - CP '2' + JP Z,.fat1x + CP '3' JP NZ,DOS_X_Error.UnknownBPB LD A,#46 ; #46-#26 = 32 fat type LD HL,#0FFF LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FAT_Max_Cluster_H),HL - LD H,#FF + LD (FatBuffer.MaxClusterHigh),HL + LD H,L JR .BPB_FAT ; - ELSE - JP NZ,DOS_X_Error.UnknownBPB - ENDIF - ; .fat1x: LD A,(HL) - CP '6' ; FAT16 - LD HL,#FFFF - JR Z,.BPB_FAT - CP '2' ; FAT12 - JP NZ,DOS_X_Error.UnknownBPB + CP '2' ; FAT16 LD HL,#0FFF + JR Z,.BPB_FAT + CP '6' ; FAT12 + JP NZ,DOS_X_Error.UnknownBPB + LD H,L .BPB_FAT: SUB #26 ; A-#26 = fat type (12, 16, 32) LD (FatBuffer.FAT_TYPE),A LD (FatBuffer.ENDCLUS_LOW),HL - ;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// ; LD HL,0 @@ -694,13 +688,13 @@ RD_BPB: LD C,SLOT3 RR L JP .S4C01 .S4C02: INC HL - LD (FAT_Max_Cluster_L),HL + LD (FatBuffer.MaxClusterLow),HL ; XOR A LD H,A LD L,A - LD (FatCache.Block),HL - LD (FatCache.Update),A + LD (FatBuffer.CacheBlock),HL + LD (FatBuffer.CacheUpdated),A SET_PAGE_X FATPAGE @@ -722,13 +716,13 @@ RD_BPB: LD C,SLOT3 CP #F0 JR C,DOS_X_Error.UnknownBPB ; ID ram-диска - #FA - CP #F8 ; !FIXIT не обязательно если винт, то не FAT12 - LD A,'6' - LD HL,#FFFF - JP Z,.BPB_FAT - ; + CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 LD A,'2' LD HL,#0FFF + JP NZ,.BPB_FAT + ; + LD A,'6' + LD H,L JP .BPB_FAT ; DOS_X_Error: @@ -745,11 +739,14 @@ DOS_X_Error: ;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' -.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) -.BLOCK: DB #00 +.DRIVE: DB #FF +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 +.CacheBlock: DW #00 +.CacheUpdated: DB #00 +;.SectorsPerBank: DB #00 +.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? .RootDirStartCluster_L: DW #0000 .RootDirStartCluster_H: DW #0000 ; [ ] fat32 -.DRIVE: DB #FF .FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) .FAT1_SEC_H: DW #0000 ; [ ] fat32 .FAT2_SEC_L: DW #0000 @@ -757,20 +754,15 @@ FatBuffer: .RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR .FilesPerSector: DB #00 ; число файловых записей в секторе -.DirSizeInSectros: DB #00 ; DIR_SEC_SIZE +.DirSizeInSectors: DB #00 ; DIR_SEC_SIZE .FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low .FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ; [ ] fat32 .BytesPerCluster: DW #0000 ; CLUSTER_LEN -.ClusterPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 -.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? .ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 +.ENDCLUS_HIGH: DW #0FFF ; [ ] fat3 +.MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) +.MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) +;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? ; -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; - INCLUDE "FAT12_16.ASM" - IF _FAT32_ENABLE - INCLUDE "FAT32.ASM" - ENDIF -; \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm deleted file mode 100644 index 34d5cdf..0000000 --- a/DSS/FS/FAT/FAT32.asm +++ /dev/null @@ -1,194 +0,0 @@ -;!TODO fat32 -;======================================================================= -;BPB - ;LD (FatBuffer.FAT2_SEC_L),HL - ;LD (FatBuffer.RootDirFirstSector_L),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 -;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -;----------------------------------------------------------------------- -;вход: HL':HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE -; -;[x] fat32 ;!TEST -GET_FAT32_CELL: - ; двигаем влево HL':H - LD A,H - EXX - LD C,A - LD A,H - AND FAT_CACHE.Size_Mask_32 ; #0F - LD H,A - LD A,C - ; - LD B,FAT_CACHE.Degree_32 ; 4 сдвига -.loop_block: - RLCA ; << H - RL L ; << L' - RL H ; << H' - DJNZ .loop_block - EXX - ; В итоге тут в HL' номер блока FAT - ; - ; HL - FAT32 OFFSET (FROM CASH) - LD A,H - AND FAT_CACHE.Size_Mask_32 ; #0F - LD H,A - ADD HL,HL - ADD HL,HL - PUSH HL ; сохраняем на случай, если READ_FAT_TABLE испортит - AND A - ; - EXX - EX DE,HL - LD HL,(FatCache.Block) ; BC - BLOCK FAT IN CASH - SBC HL,DE - CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT - POP HL - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT - RET - -; 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 - [ ] fat32 доделать тут - 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 -*/ -; \ No newline at end of file diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT_X.asm similarity index 66% rename from DSS/FS/FAT/FAT12_16.asm rename to DSS/FS/FAT/FAT_X.asm index cdb6ce8..7c5cd3d 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -14,35 +14,45 @@ ;--------------------------------------------------------------- ; Установить начальный кластер для чтения -; [ ] fat32 -R_CLUST: - LD HL,#0001 - LD (G_CLUST.num),HL - RET -.FAT32: WORD 0 +; [x] fat32 ;!TEST +R_CLUST: LD HL,#0001 + LD (G_CLUST.low),HL + DEC L + LD (G_CLUST.high),HL + RET -; найти первый свободный кластер -; [ ] fat32 -G_CLUST: -.num+1: LD HL,#0001 -.loop: INC HL ; номер кластера - ; [x] fat32 - IF _FAT32_ENABLE - LD A,(FatBuffer.FAT_TYPE) - XOR FAT_TYPE.x32 - CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER - ENDIF - ; - CALL READ_FROM_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 + +; найти первый свободный кластер ;!TODO проверить перебор кластеров +; [x] fat32 ;!TEST +G_CLUST: ; +.low+1: LD HL,#0001 +.loop: INC HL ; номер кластера + LD A,L + OR H + ; [x] fat32 + EXX +.high+1: LD HL,0 + JR NZ,.no_inc + INC HL +.no_inc: EXX + ; + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера + CP DSS_Error.sys.DISK_FULL + SCF + RET Z ; ошибка ? + EXX + LD A,D + OR E + EXX + OR D + OR E + JR NZ,.loop + LD (G_CLUST.low),HL + EXX + LD (G_CLUST.high),HL + EXX + ; XOR A + RET ; HL - CLUSTER ; [ ] fat32 @@ -60,11 +70,10 @@ INC_FAT: ; JR NC,.loop ; не конец цепочки EX DE,HL ; POP DE ; номер кластера - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера ;!FIXIT <нет контроля ошибки> ; POP HL - LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск @@ -73,6 +82,35 @@ INC_FAT: RET ;RX01 + +; вход: de = младшее слово номера кластера для сравнения с FAT_Max_Cluster +; de' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) +; [x] fat32 ;!TEST +CHECK_CLUSTER_IS_SMALLER: + LD A,(FatBuffer.FAT_TYPE) + XOR FAT_TYPE.x32 + JR NZ,.low ; Z=0 проверяем младшее слово номера кластера + ; проверяем старшее слово номера кластера + EXX + EX DE,HL + LD HL,(FatBuffer.MaxClusterHigh) + ; CF = 0 + SBC HL,DE + EX DE,HL + EXX + LD A,DSS_Error.sys.DISK_FULL + ;RET C + RET NZ ; если FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный + ; проверяем младше слово номера кластера +.low: EX DE,HL + LD HL,(FatBuffer.MaxClusterLow) + ; CF = 0 + SBC HL,DE + EX DE,HL + LD A,DSS_Error.sys.DISK_FULL + RET + ; + ;------------------------------------------------------------------------------------------------ ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl - номер кластера (младшее слово) @@ -85,278 +123,263 @@ INC_FAT: ; CF - конец цепочки ;------------------------------------------------------------------------------------------------ ;[x] fat32 ;!TEST -READ_FROM_FAT: - ;[x] fat32 - LD A,(FatBuffer.FAT_TYPE) - XOR FAT_TYPE.x32 - JR NZ,.low ; Z=0 проверяем младшее слово номера кластера - ; проверяем старшее слово номера кластера - ; !FIXIT fat32 проверять оба слова FAT_Max_Cluster - EXX - EX DE,HL - LD HL,(FAT_Max_Cluster_H) - ; CF = 0 - SBC HL,DE - EX DE,HL - EXX - LD A,DSS_Error.sys.DISK_FULL - RET C - JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - hl' != 0, то кластер корректный - ; - ; проверяем младше слово номера кластера -.low: EX DE,HL - LD HL,(FAT_Max_Cluster_L) - ; CF = 0 - SBC HL,DE - EX DE,HL - LD A,DSS_Error.sys.DISK_FULL - RET C - ; -.correct_cluster: - SET_PAGE_X FATPAGE - ; - PUSH HL - PUSH AF - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x16 - JR C,.FAT12 - JR NZ,.FAT32 - ; fat16, просто читать след. номер -.FAT16: CALL GET_FAT16_CELL - LD E,(HL) ; прочитать номер кластера - INC HL - LD D,(HL) - ; - LD HL,SERVICE_SECTORS.FAT16 -.exit: POP AF - OUT (SLOT3),A - ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR - XOR A - ; проверка на служ. кластеры - SBC HL,DE - POP HL - ; [x] fat32 - EXX - LD H,A - LD L,A - LD D,A - LD E,A - EXX - RET - ; -.FAT12: CALL GET_FAT12_CELL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,SERVICE_SECTORS.FAT12 - JR NC,.Correct_2 -.Correct_1: - LD A,E - AND #F0 - DUP 4 ; вправо на 4 битa - RR D - RRA - EDUP - LD E,A - JR .exit - ; -.Correct_2 - LD A,D - AND #0F - LD D,A - JR .exit - ; -.FAT32: ; [x] fat32 ;!TEST - EXX - PUSH HL - EXX - ; - CALL GET_FAT32_CELL - ; прочитать младшее слово номера кластера - LD E,(HL) - INC HL - LD D,(HL) - INC HL - ; прочитать старшее слово номера кластера - LD A,(HL) - INC HL - EX AF,AF' - LD A,(HL) - EXX - AND #0F - LD D,A - EX AF,AF' - LD E,A - EXX - ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR - XOR A - ; проверка на служ. кластеры младшего слова кластера - LD HL,SERVICE_SECTORS.FAT32.Low - SBC HL,DE - ; проверка на служ. кластеры старшего слова кластера - EXX - LD HL,SERVICE_SECTORS.FAT32.High - SBC HL,DE - POP HL - EXX - ; - POP BC - LD A,B - OUT (SLOT3),A - RET +READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER + RET C + ; + SET_PAGE_X FATPAGE + ; + PUSH HL + PUSH AF + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x16 + JR C,.FAT12 + JR NZ,.FAT32 + ; fat16, просто читать след. номер +.FAT16: CALL GET_FAT16_CELL + LD E,(HL) ; прочитать номер кластера + INC HL + LD D,(HL) + ; + LD HL,SERVICE_SECTORS.FAT16 +.exit: POP AF + OUT (SLOT3),A + ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR + XOR A + ; проверка на служ. кластеры + SBC HL,DE + POP HL + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX + RET + ; +.FAT12: CALL GET_FAT12_CELL + LD E,(HL) + INC HL + LD D,(HL) + LD HL,SERVICE_SECTORS.FAT12 + JR NC,.Correct_2 +.Correct_1: LD A,E + AND #F0 + DUP 4 ; вправо на 4 битa + RR D + RRA + EDUP + LD E,A + JR .exit + ; +.Correct_2: LD A,D + AND #0F + LD D,A + JR .exit + ; +.FAT32: EXX + PUSH HL + EXX + ; + CALL GET_FAT32_CELL + ; прочитать младшее слово номера кластера + LD E,(HL) + INC HL + LD D,(HL) + INC HL + ; прочитать старшее слово номера кластера + LD A,(HL) + INC HL + EX AF,AF' + LD A,(HL) + EXX + AND #0F + LD D,A + EX AF,AF' + LD E,A + EXX + ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR + XOR A + ; проверка на служ. кластеры младшего слова кластера + LD HL,SERVICE_SECTORS.FAT32.Low + SBC HL,DE + ; проверка на служ. кластеры старшего слова кластера + EXX + LD HL,SERVICE_SECTORS.FAT32.High + SBC HL,DE + POP HL + EXX + POP BC + LD A,B + OUT (SLOT3),A + RET ;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать ; hl' = старшее слово номера кластера в который записать (только для fat32) +; .Custom: ; de = младшее слово номера кластера которое вписать ; de' = старшее слово номера кластера которое вписать (только для fat32) ; выход: такой же как и вход ;------------------------------------------------------------------------------------------------ -; [ ] fat32 -WRITE_TO_FAT: - PUSH DE - EX DE,HL - LD HL,(FAT_Max_Cluster_L) - 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 - PUSH DE ; de = номер кластера который вписать - ; [x] 2/12/23 FAT не всегда мог записаться на HDD - ;LD A,1 - ;LD (FatCache.Update),A - ; - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x16 - JR C,.FAT12 - JR NZ,.FAT32 - ; -.FAT16: CALL GET_FAT16_CELL - POP DE ; de = номер кластера который вписать - LD (HL),E ; сохр. в кеше FAT-а - INC HL ; номер кластера - LD (HL),D -.exit: POP AF ; восст. порт - POP HL - OUT (SLOT3),A - ; [x] 2/12/23 FAT не всегда мог записаться на HDD - XOR A - INC A - LD (FatCache.Update),A - ; CF = 0 - RET - ; -.FAT12: ;!FIXIT переделать на переменные FAT_CACHE - CALL GET_FAT12_CELL - POP DE ; de = номер кластера который вписать - JR C,.Correct_1 ; номер нечётный - LD (HL),E - INC HL - LD A,(HL) - AND #F0 - OR D - LD (HL),A - JR .exit - ; -.Correct_1: - ; влево на 4 бит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 - XOR A - INC A - LD (FatCache.Update),A - - ; LD A,1 - ; LD (FatCache.Update),A - ; AND A - ; CF = 0 - RET -.FAT32: ; [ ] fat32 - CALL GET_FAT32_CELL - POP DE ; de = номер кластера который вписать - LD (HL),E ; сохр. в кеше FAT-а - INC HL ; номер кластера - LD (HL),D +; [x] fat32 ;!TEST +WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера + EXX + LD DE,(FatBuffer.ENDCLUS_HIGH) ; номер кластера + EXX +.Custom: PUSH DE + EXX + PUSH DE + EXX + CALL CHECK_CLUSTER_IS_SMALLER + EXX + POP DE + EXX + POP DE + RET C + ; + EXX + SET_PAGE_X FATPAGE + EXX + PUSH HL + PUSH AF + PUSH DE ; младший номер кластера который вписать + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + ;LD A,1 + ;LD (FatBuffer.CacheUpdated),A + ; + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x16 + JR C,.FAT12 + JR NZ,.FAT32 + ; +.FAT16: CALL GET_FAT16_CELL + POP DE ; младший номер кластера который вписать + LD (HL),E ; сохр. в кеше FAT-а + INC HL ; номер кластера + LD (HL),D +.exit: POP AF ; восст. порт + POP HL + OUT (SLOT3),A + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + XOR A + INC A + LD (FatBuffer.CacheUpdated),A + ; CF = 0 + RET + ; +.FAT12: ;!FIXIT переделать на переменные FAT_CACHE + CALL GET_FAT12_CELL + POP DE ; младший номер кластера который вписать + JR C,.Correct_1 ; номер нечётный + LD (HL),E + INC HL + LD A,(HL) + AND #F0 + OR D + LD (HL),A + JR .exit + ; +.Correct_1: ; влево на 4 бит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 + JR .exit + ; +.FAT32: ; [x] fat32 ;!TEST + EXX + PUSH DE ; старший номер кластера который вписать + PUSH HL ; старшее слово номера кластера в который записать + EXX + CALL GET_FAT32_CELL + EXX + POP HL ; старшее слово номера кластера в который записать + EXX + POP DE ; старший номер кластера который вписать + POP BC ; младший номер кластера который вписать + ; сохр. в кеше FAT-а номер кластера + LD (HL),C + INC HL + LD (HL),B + INC HL + LD (HL),E + INC HL + LD (HL),D + JR .exit +;;;;;;;;; - DI - HALT + +;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT +; in: HL - Cache block +; out: C:HL - logical number +GET_SECTOR_OF_FAT: + XOR A + LD B,A + LD C,A + DUP FAT_CACHE.Degree ; 4 + ADD HL,HL ;x2 + ADC A,C + EDUP + LD C,A + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + RET NZ + ADD HL,HL ;x2 + RET NC + INC C + RET +;;;;;;;;; ;RE_FAT: ;RX01 ; Прочитать в кеш ХХ секторов FAT-а -; [ ] fat32 ;!TEST +; [x] fat32 ;!TEST ; DE - NEW FAT BLOCK -READ_FAT_TABLE: - PUSH HL - ; [x] fat32 - ; PUSH AF - PUSH DE - ; - LD A,(FatCache.Update) - OR A - CALL NZ,WRITE_FAT_TABLE.Start - ; [x] fat32 - ; POP AF - POP DE - ; +READ_FAT_TABLE: PUSH HL + PUSH DE + LD A,(FatBuffer.CacheUpdated) + OR A + CALL NZ,WRITE_FAT_TABLE.Start + POP DE + ; + EX DE,HL + LD (FatBuffer.CacheBlock),HL + ; + CALL GET_SECTOR_OF_FAT + ; + LD DE,(FatBuffer.FAT1_SEC_L) + ; BC:HL - номер лог. сектора + ADD HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(FatBuffer.FAT1_SEC_H) + JR NC,.no_inc + INC HL +.no_inc: ADD HL,BC + ; HL:IX - SECTOR FAT FOR READING + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE + JR NZ,.nxt + LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE +.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS + LD A,(FatBuffer.DRIVE) ; номер диска + RST ToDSS.DRV + POP HL + RET - ;[ ] fat32 - ; LD L,A - ; XOR A - ; LD H,A - EX DE,HL - ; - LD (FatCache.Block),HL - ;LD (FatCache.Update),A - ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT - DUP FAT_CACHE.Degree ; 4 - ADD HL,HL ;x2 - EDUP - LD DE,(FatBuffer.FAT1_SEC_L) - ; номер лог. сектора - ADD HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(FatBuffer.FAT1_SEC_H) - LD DE,0 - ADC HL,DE - ; HL:IX - SECTOR FAT FOR READING - LD B,FAT_CACHE.Sectors_16 - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR NZ,.nxt - LD B,FAT_CACHE.Sectors_32 -.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS - LD A,(FatBuffer.DRIVE) ; номер диска - LD C,Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE - RST ToDSS.DRV - POP HL - RET ; Подключить банку кеша FAT и записать его на диск ; [ ] fat32 @@ -368,34 +391,32 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD HL,(FatCache.Block) - ; - ;LD H,0 - ;FAT BLOCK * 16 = SECTOR OF FAT - DUP FAT_CACHE.Degree - ADD HL,HL ;x2 - EDUP - ; HL - номер лог. сектора +.Start: LD HL,(FatBuffer.CacheBlock) + ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT + CALL GET_SECTOR_OF_FAT + ; BC:HL - номер лог. сектора + ; [ ] fat32 ;!FIXIT LD B,H - LD C,L ;BC - BLOCK OF FAT + LD C,L + ; [ ] fat32 LD DE,FAT_CACHE.Sectors_16 - ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш + ADD HL,DE ;+ SIZE CASH (16 SECTORS) + LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT AND A SBC HL,DE JR C,.WALLFAT + ; EX DE,HL LD HL,FAT_CACHE.Sectors_16 ; CF = 0 SBC HL,DE - JR C,.ERR + JR C,.ERR ;!TODO проверить LD A,L -.WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? +.WALLFAT: LD H,B LD L,C - PUSH HL ; HL - номер лог. сектора - ; + PUSH HL LD DE,(FatBuffer.FAT1_SEC_L) LD B,A ; число секторов LD C,Dss.DRV.Write ; запись секторов @@ -416,7 +437,7 @@ WRITE_FAT_TABLE: AND A ;!TODO нет контроля ошибок .only_one_FAT: .ERR: LD A,0 - LD (FatCache.Update),A + LD (FatBuffer.CacheUpdated),A RET ; .SAVE_FAT_XX: @@ -438,66 +459,50 @@ WRITE_FAT_TABLE: LD DE,FATPAGE.cache ; откуда LD A,(FatBuffer.DRIVE) ; номер диска JP ToDSS.DRV -/* -.WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? - LD H,B - LD L,C - PUSH HL ; HL - номер лог. сектора + +;----------------------------------------------------------------------- +;вход: HL':HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +; +;[x] fat32 ;!TEST +GET_FAT32_CELL: + ; двигаем влево HL':H + LD A,H + EXX + LD C,A + LD A,H + AND FAT_CACHE.Size_Mask_32 ; #0F + LD H,A + LD A,C + ; + LD B,FAT_CACHE.Degree_32 ; 4 сдвига +.loop_block: + RLCA ; << H + RL L ; << L' + RL H ; << H' + DJNZ .loop_block + EXX + ; В итоге тут в HL' номер блока FAT ; - LD DE,(FatBuffer.FAT1_SEC_L) - ADD HL,DE + ; HL - FAT32 OFFSET (FROM CASH) + LD A,H + AND FAT_CACHE.Size_Mask_32 ; #0F + LD H,A + ADD HL,HL + ADD HL,HL + PUSH HL ; [ ] fat32 сохраняем на случай, если READ_FAT_TABLE испортит + AND A + ; + EXX EX DE,HL - ; номер лог. сектора - ;LD IX,0 - ;ADD IX,DE - LD XH,D - LD XL,E - ; - 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 - ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 - LD DE,(FatBuffer.FAT2_SEC_L) - LD HL,(FatBuffer.FAT1_SEC_L) - AND A - SBC HL,DE - POP BC ; b=число секторов - POP HL - JR Z,.only_one_FAT - ; POP BC ; b=число секторов - ; POP HL - ; LD DE,(FatBuffer.FAT2_SEC_L) - ; - ADD HL,DE - EX DE,HL - LD XH,D - LD XL,E - ; - LD HL,0 - ; CF = ADD HL,DE - ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? - IF _FAT32_ENABLE - RL L - ENDIF - ; - LD DE,FATPAGE.cache - LD A,(FatBuffer.DRIVE) - LD C,Dss.DRV.Write - RST ToDSS.DRV - AND A ;!TODO нет контроля ошибок -.only_one_FAT: - ; -.ERR: LD A,0 - LD (FatCache.Update),A + LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + SBC HL,DE + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + POP HL + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT RET -*/ - - +;----------------------------------------------------------------------- ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT16_CELL: @@ -516,9 +521,9 @@ GET_FAT16_CELL: ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH + LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -526,7 +531,7 @@ GET_FAT16_CELL: LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET - +;----------------------------------------------------------------------- ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE ; CF - чётный/нечётный адрес кластера @@ -538,7 +543,7 @@ GET_FAT12_CELL: PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; - IF FAT_CACHE.Size_12 < #2000 + IF FAT_CACHE.Size_12 < #1800 ;!FIXIT оптимизировать LD A,H LD B,H @@ -559,9 +564,9 @@ GET_FAT12_CELL: ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH + LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -572,12 +577,20 @@ GET_FAT12_CELL: ADD HL,DE POP AF RET +;----------------------------------------------------------------------- -; in: DE:HL - CLUSTER -; out: HL:IX - SECTOR -NSECTOR:;[ ] fat32 - LD DE,(FAT_Max_Cluster_H) ; [ ] fat32 - заменить другой переменной + +;NSECTOR: +; in: HL':HL - CLUSTER +; out: HL:IX - SECTOR +;[ ] fat32 +CLUSTER_TO_SECTOR: + EXX + PUSH HL + EXX + POP DE + ; DE:HL - cluster DEC HL DEC HL LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) @@ -645,7 +658,7 @@ BLOCK_READ: PUSH BC ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1) ; PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово) - JP .enter_loop1 + JR .enter_loop1 ; .fast_exit_5: POP DE .fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE @@ -678,26 +691,26 @@ BLOCK_READ: PUSH BC ; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP DE - POP BC + POP BC ; B - Amount sectors CALL SaveGotCluster ; - POP DE ; остаток DIV_for_SPC - POP BC ; HL:DE - FP (in sectors) + POP DE ; D = 0, E = остаток DIV_for_SPC + POP BC ; B = Amount sectors ; (SP) = (RET) - ; + ; работа с остатком от деления LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) 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 + LD C,A + CP B + JR C,.skip1 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +.skip1: LD A,B + SUB C + LD B,A + PUSH HL ; номер кластера младшая часть PUSH BC PUSH DE - CALL NSECTOR + CALL CLUSTER_TO_SECTOR POP DE ADD IX,DE JR NC,.skip2 @@ -745,7 +758,7 @@ BLOCK_READ: PUSH BC EX DE,HL PUSH HL PUSH BC - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C @@ -826,7 +839,6 @@ BLOK_WR: PUSH BC LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H EXX ; - LD DE,(FatBuffer.ENDCLUS_LOW) CALL WRITE_TO_FAT ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;PUSH HL @@ -903,7 +915,7 @@ BLOK_WR: PUSH BC PUSH HL PUSH BC PUSH DE - CALL NSECTOR + CALL CLUSTER_TO_SECTOR POP DE ADD IX,DE JR NC,.WR4 @@ -954,7 +966,7 @@ BLOK_WR: PUSH BC EX DE,HL PUSH HL PUSH BC - CALL NSECTOR + CALL CLUSTER_TO_SECTOR ; DOUBLE 1 LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) @@ -988,53 +1000,53 @@ BLOK_WR: PUSH BC ;SCF RET -/* -;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -; Вход: HL - первый кластер файла (младшее слово) -; BC - смещение в файле в кластерах (младшее слово) -; Выход: HL - известный кластер файла для отсчёта (младшее слово) -; BC - оставшееся смещение в файле в кластерах (младшее слово) -GetSavedCluster: - INC B - ;PUSH DE ; первый кластер файла (старшее слово) - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_L+1) - LD A,E - OR D - RET Z - ; - DEC B - PUSH DE ; KnownCluster_H - PUSH HL ; первый кластер файла (младшее слово) - PUSH BC ; смещение в файле в кластерах - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_L+1) - LD A,D - OR E - JR Z,.noOptimization_3 - ; - POP HL ; смещение в файле в кластерах - SBC HL,DE - JR C,.noOptimization_2 - LD C,L - LD B,H - POP DE ; баланс стека - POP HL - ; оптимизация: HL - не первый кластер файла, а KnownCluster - ; BC - расстояние до требуемого смещения от KnownCluster - ; - INC B - RET - ; -.noOptimization_3: - POP BC -.noOptimization_2: - POP HL -.noOptimization_1: - POP DE - INC B - RET -*/ + +; ;GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; ; Вход: HL - первый кластер файла (младшее слово) +; ; BC - смещение в файле в кластерах (младшее слово) +; ; Выход: HL - известный кластер файла для отсчёта (младшее слово) +; ; BC - оставшееся смещение в файле в кластерах (младшее слово) +; GetSavedCluster: +; INC B +; ;PUSH DE ; первый кластер файла (старшее слово) +; LD E,(IY+_sFM.KnownCluster_L) +; LD D,(IY+_sFM.KnownCluster_L+1) +; LD A,E +; OR D +; RET Z +; ; +; DEC B +; PUSH DE ; KnownCluster_H +; PUSH HL ; первый кластер файла (младшее слово) +; PUSH BC ; смещение в файле в кластерах +; LD E,(IY+_sFM.KnownOffset_L) +; LD D,(IY+_sFM.KnownOffset_L+1) +; LD A,D +; OR E +; JR Z,.noOptimization_3 +; ; +; POP HL ; смещение в файле в кластерах +; SBC HL,DE +; JR C,.noOptimization_2 +; LD C,L +; LD B,H +; POP DE ; баланс стека +; POP HL +; ; оптимизация: HL - не первый кластер файла, а KnownCluster +; ; BC - расстояние до требуемого смещения от KnownCluster +; ; +; INC B +; RET +; ; +; .noOptimization_3: +; POP BC +; .noOptimization_2: +; POP HL +; .noOptimization_1: +; POP DE +; INC B +; RET + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ; Вход: DE - смещение в файле в кластерах (старшее слово) @@ -1131,11 +1143,23 @@ SaveGotCluster: LD A,C //////////////////////////////////////////////////////////////////////// -FatCache: ;WORD #0000 -.Block WORD #0000 -.Update BYTE 0 -FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) -FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) +;!TODO fat32 +;======================================================================= +;BPB + ;LD (FatBuffer.FAT2_SEC_L),HL + ;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR +;BPB32 + ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта +;FAT Max Cluster + ;LD (FatBuffer.MaxClusterLow),HL +;======================================================================= + + +;FatCache: +;.Block WORD #0000 +;.Update BYTE 0 +;FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) +;FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) ;//MODULE: FAT_X ;[END] @@ -1258,7 +1282,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ////////////// OLD //////////////// ; HL - CLUSTER ; HL:IX - SECTOR -; NSECTOR: DEC HL +; CLUSTER_TO_SECTOR: DEC HL ; DEC HL ; EX DE,HL ; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index b1f5015..08a538c 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -1,3 +1,4 @@ +;!TODO привести к общему виду в одну инструкцию, проверить корректность ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- @@ -7,167 +8,167 @@ ; ; Disk Driver Specification ver. 2.20 ;[]===========================================================[0] -;Procedure : Initialization +;Procedure: Initialization ; -;Function : Initialization device(s) +;Function: Initialization device(s) ; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver +;Input: C = #00 +; IX = Environment +; +;Output: A = Amount drive support ;[]===========================================================[0] ;[]===========================================================[1] -;Procedure : Open +;Procedure: Open ; -;Function : Open disk +;Function: Open disk ; -;Input : C = 01h -; A - Drive -;Output : None +;Input: C = #01 +; A = Drive ; +;Output: None ;[]===========================================================[1] ;[]===========================================================[2] -;Procedure : Close +;Procedure: Close ; -;Function : Close disk +;Function: Close disk ; -;Input : C = 02h -; A - Drive -;Output : None +;Input: C = #02 +; A = Drive ; +;Output: None ;[]===========================================================[2] ;[]===========================================================[3] -;Procedure : Media check +;Procedure: Media check ; -;Function : Checking change line +;Function: Checking change line ; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed +;Input: C = #03 +; A = Drive ; +;Output: A = #00 disk no changed +; #FF disk changed ;[]===========================================================[3] ;[]===========================================================[4] -;Procedure : Get BPB +;Procedure: Get BPB ; -;Function : Get Block Parameters BIOS +;Function: Get Block Parameters BIOS ; -;Input : C = 04h -; DE - Address -;Output : None +;Input: C = #04 +; A = Drive +; DE = Address ; +;Output: None ;[]===========================================================[4] ;[]===========================================================[5] -;Procedure : Input +;Procedure: Read ; -;Function : Input from disk +;Function: Read from disk ; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None +;Input: C = #05 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A = Drive ; +;Output: None ;[]===========================================================[5] ;[]===========================================================[6] -;Procedure : Output +;Procedure: Write ; -;Function : Output to disk +;Function: Write to disk ; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None +;Input: C = #06 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count ; +;Output: None ;[]===========================================================[6] ;[]===========================================================[7] -;Procedure : Removable +;Procedure: Removable ; -;Function : Checking change line +;Function: Checking change line ; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable +;Input: C = #07 +; A = Drive ; +;Output: A = #00 Removable +; A = #FF Non-removable ;[]===========================================================[7] ;[]===========================================================[8] -;Procedure : Generic IOCTL +;Procedure: Generic IOCTL ; -;Function : Generic Input Output Control +;Function: Generic Input Output Control ; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : +;Input: C = #08 +; B = Subcommand +; DE = #55AA Magic Number ; +;Subcommands: #00 - Get Device Parameters +; #01 - Read track +; #02 - Test track +; #80 - Set Device Parameters +; #81 - Write track +; #82 - Format track +;Output: ;[]===========================================================[8] ;[]===========================================================[9] -;Procedure : Read Long +;Procedure: Read Long ; -;Function : Reading sectors from disk +;Function: Reading sectors from disk ; -;Input : C = 0Ah -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address +;Input: C = #0A +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page ; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address ;[]===========================================================[9] ;[]===========================================================[10] -;Procedure : Write Long +;Procedure: Write Long ; -;Function : Writing sectors to disk +;Function: Writing sectors to disk ; -;Input : C = 0Bh -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address +;Input: C = #0B +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page ; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address ;[]===========================================================[10] ; ; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED +; 0 (#00) - NO ERRORS +; 1 (#01) - BAD COMMAND +; 2 (#02) - BAD DRIVE NUMBER +; 3 (#03) - UNKNOW FORMAT +; 4 (#04) - NOT READY +; 5 (#05) - SEEK ERROR +; 6 (#06) - SECTOR NOT FOUND +; 7 (#07) - CRC ERROR +; 8 (#08) - WRITE PROTECT +; 9 (#09) - READ ERROR +; 10 (#0A) - WRITE ERROR +; 11 (#0B) - FAILURE +; 12 (#0C) - BUSY (DEVICE OPENED) +; 13 (#0D) - RESERVED ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 @@ -286,7 +287,7 @@ SELHDD: PUSH DE ; LD L,A LOGDRV_ENTRY_FIND LOGDRV - ; + ; !HARDCODE LD C,(IY+1) LD B,(IY+2) LD E,(IY+3) @@ -431,14 +432,14 @@ CHEK_H: ;LD A,#FF RET -;HL:IX - SECTOR ; DE - ADDRESS +; A - DRIVE GBPB_H: PUSH IY PUSH DE LD L,A ; LOGDRV_ENTRY_FIND LOGDRV - ; + ; !HARDCODE LD E,(IY+1) LD D,(IY+2) LD L,(IY+3) @@ -469,7 +470,7 @@ LREADH: PUSH IY ; DE - ADDRESS ; B - COUNTER ; A'- PAGE -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;WRITE SECTOR LWRITEH: PUSH IY @@ -482,7 +483,7 @@ LWRITEH: ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;WRITE SECTOR WRITEH: PUSH IY CALL SELHDD @@ -494,7 +495,7 @@ WRITEH: PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;READ SECTOR READH: PUSH IY CALL SELHDD @@ -506,7 +507,7 @@ READH: PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;CHECK SECTOR CHECKH: PUSH IY CALL SELHDD diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index af304f2..9ff323a 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -9,6 +9,7 @@ ; DISK DRIVER SPECIFICATION +; !FIXIT некорректная! ;--------------------------------------------- ; COMMAND 00h (INITIALIZATION) ; diff --git a/DSS/build.txt b/DSS/build.txt index b475567..0c8ddea 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -945 \ No newline at end of file +955 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 2b165fe..c9607c3 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -66,7 +66,7 @@ FAT_CACHE: ; for FAT32 .Size_32 EQU #4000 .Sectors_32 EQU .Size_32 / .Sector_Size ; #20 -.Degree_32 EQU .Degree +.Degree_32 EQU 5 .Size_Mask_32 EQU #0F .Part_Mask_32 EQU #0F .bytes_record_32 EQU 2