From 3c8e69329007c1132d7a15f68c0f32733826789b Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 4 Jan 2026 20:32:22 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=20=D0=BF=D0=BE=20=D1=87=D0=B0=D0=B9=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BB=D0=BE=D0=B6=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/FS/FAT.asm | 141 ++++++++++++++++++++++++++----------------------- DSS/build.txt | 2 +- 2 files changed, 76 insertions(+), 67 deletions(-) diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 206c239..88e92a7 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -468,43 +468,36 @@ FINDDIR: SET_PAGE_X DIRPAGE ;----------------------------------------------------------------------; - тут доделать ; Вход: IY - указатель на начало файлового манипулятора CHECK_ROOT_CLUSTER: - ;EX DE,HL - ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) - ; LD A,L - ; OR H - ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) - ; OR L - ; OR H - ;EX DE,HL - CALL CHECK_FIRST_CLUSTER - ; RET NZ - - ; LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) - ; CP FAT_TYPE.x32 - ; CALL Z,SET_FAT_ROOT_DIR_CLUSTER - ; ; - ; XOR A - RET + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,CHECK_FIRST_CLUSTER ; -; .fat32root: CALL SET_FAT32_ROOT_DIR_CLUSTER -; OR A -; RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -SET_FAT_ROOT_DIR_CLUSTER: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + LD BC,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) + SBC HL,BC + RET NZ + ; LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + LD BC,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) + SBC HL,BC RET ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; SET_FAT_ROOT_DIR_CLUSTER: +; EX DE,HL +; LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) +; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL +; LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) +; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL +; EX DE,HL +; RET +;----------------------------------------------------------------------; + + ;----------------------------------------------------------------------- ; вход: IY - указатель на начало файлового манипулятора ; выход: HL':HL - first cluster @@ -531,11 +524,12 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF OR A JR NZ,.SUBDIR ; - тут доделать -.REROOT: CALL SET_FAT_ROOT_DIR_CLUSTER - ;LD DE,0 ; признак root dir ; !FIXIT ; [ ] CDFS - брать первый кластер из переменной - ;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE - ;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE +.REROOT: EX DE,HL + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + EX DE,HL .reroot: CALL LOADDIR ; [ ] big dir ; CF=0 LD HL,CORE_BUFFERS.WorkDirectory @@ -561,7 +555,7 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD A,(HL) OR A DEC HL - JR Z,.REROOT + JR Z,.reroot ; .no_root: EXX LD HL,CORE_BUFFERS.MASKARE @@ -601,19 +595,20 @@ LOADDIR: ;!TODO optimize .Custom: CALL LOAD_SAVE_DIR_PREPARE .next: PUSH AF EX AF,AF' - JR NZ,.read_dir ; root dir or not + ;JR NZ,.read_dir ; root dir or not ; root dir - LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR NZ,.LoadRootDir + ;LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) + ;CP FAT_TYPE.x32 + JR Z,.LoadRootDir + CALL LOAD_SAVE_DIR_PREPARE.CalcDirSize ; fat32 - LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - ;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог - LD HL,DIRPAGE.size ; размер директории ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL + ; LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) + ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + ; LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) + ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + ; ;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог + ; LD HL,DIRPAGE.size ; размер директории ;!HARDCODE + ; LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ; .read_dir: LD HL,DIRPAGE.buffer ; куда LD DE,DIRPAGE.size ; сколько @@ -629,7 +624,7 @@ LOADDIR: ;!TODO optimize .LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H);!TODO возможно, хватит LD HL,0 LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L); номер лог. сектора LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) - LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога + LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога ; [ ] sector size 512 CP B JR NC,.RTD1 ; @@ -656,7 +651,9 @@ LOADDIR: ;!TODO optimize ;!TODO FAT procedures ;----------------------------------------------------------------------; ; Вход: -; HL - ID записи, который должен попасть в КЭШ +; HL - ID записи, который должен попасть в КЭШ +; Выход: A - Страница, которая была в SLOT3 до вызова +; ZF' - RootDir FAT12-16 LOAD_SAVE_DIR_PREPARE: ; [ ] Вход: HL - ID записи, который должен попасть в КЭШ ; [ ] Выход: HLIX - смещение в файле каталога на нужный блок по #4000 байтов @@ -693,12 +690,12 @@ LOAD_SAVE_DIR_PREPARE: LD (CORE_BUFFERS.FM_BUF.DRIVE),A ;;;;;;;; XOR A - LD D,#40 - LD E,A + ;LD D,#40 + ;LD E,A LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) EXX - LD D,A - LD E,A + ;LD D,A + ;LD E,A LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) OR H OR L @@ -706,13 +703,13 @@ LOAD_SAVE_DIR_PREPARE: OR H OR L ;;;;;;;; - PUSH AF - CALL NZ,.CalcDirSize + ;PUSH AF + ;CALL NZ,.CalcDirSize ; - LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE - EXX - LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE - POP AF + ; LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE + ; EXX + ; LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE + ;POP AF EX AF,AF' POP AF RET @@ -783,6 +780,9 @@ LOAD_SAVE_DIR_PREPARE: RR C JR NC,.loop2 ; <-- DE*BC*A = DE':DE + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE + EXX + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE RET /* 4 3 2 1 @@ -860,6 +860,12 @@ WRITE_DIR_HANDLE: POP DE RET ;----------------------------------------------------------------------; + ASSERT 0 "TODO!" +;!TODO +; .DIRSIZE помешает если в кэш будет другая страница? +; LOAD_SAVE_DIR_PREPARE возможно не нужен, нужно только установить правильное смещение в FM +; Может вообще переделать её под работу с КЭШ + ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора ; [ ] big dir получать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего @@ -867,16 +873,17 @@ SAVEDIR: ;!TODO optimize CALL LOAD_SAVE_DIR_PREPARE PUSH AF EX AF,AF' - JR NZ,.save_dir + ;JR NZ,.save_dir + JR Z,.SaveRootDir ; - LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR NZ,.SaveRootDir + ;LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) + ;CP FAT_TYPE.x32 + ;JR NZ,.SaveRootDir ; fat32 - LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + ;LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) + ;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + ;LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) + ;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL ; .save_dir: LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory @@ -1038,13 +1045,14 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) .filesRoot: DEC HL XOR A ;NEXTAD2 + ; FilesInRootDIR / FilesPerSector = sectors in RootDir .loop2: INC A JP Z,RD_BPB.UnknownBPB SBC HL,BC JR NC,.loop2 ; .skip_loop2: EX DE,HL - LD C,A ; A - sectors in DIR + LD C,A ; A - sectors in RootDir LD B,0 LD (CORE_BUFFERS.FS_Buffer.DirSizeInSectors),A @@ -1202,6 +1210,7 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD HL,#FFFF LD A,FAT_TYPE.x16 .set_vars: EXX + ;!TODO считать тут размер root-директории в байтах и хранить в FS_Buffer? LD HL,0 LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),HL LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L),HL diff --git a/DSS/build.txt b/DSS/build.txt index bf0d87a..7813681 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -4 \ No newline at end of file +5 \ No newline at end of file