From 0a649252ab77a4f47d24958fc883d749fe4b08c7 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 3 Nov 2025 01:20:34 +1000 Subject: [PATCH] prepare for FAT "big dir" support, step 2 --- DSS/API/Find.asm | 24 ++++++++------- DSS/DOS_FS.ASM | 8 ++++- DSS/FS/FAT.asm | 68 +++++++++++++++++++++++++++++++----------- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 9 +++--- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 7 files changed, 79 insertions(+), 36 deletions(-) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 9e6b1bf..2fccf92 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -42,14 +42,14 @@ F_FIRST: CALL .INIT_VARS ; при прыжке сюда на стеке должен лежать record index .FIND_S: INC DE ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes - LD BC,FAT_DIRECTORY_RECORD - ADD IX,BC + ;LD BC,FAT_DIRECTORY_RECORD + ;ADD IX,BC LD (F_NEXT.CURHND),IX ; record index может и не нужно POP HL ;!FIXIT нет проверки на переполнение ; надеемся, что FAT без косяков - INC HL + ;INC HL LD (F_NEXT.RecordIndex),HL ; LD HL,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT @@ -60,7 +60,7 @@ F_FIRST: CALL .INIT_VARS INC DE LD HL,CORE_BUFFERS.HANDBUF .FNDMODE+1: LD A,0 - OR A + AND %0111'1111 JR NZ,.FIND_M2 LD BC,11 ;!HARDCODE LDIR @@ -114,7 +114,7 @@ F_NEXT: ; .NSEARCH: EX AF,AF' SET_PAGE_X DIRPAGE - ;PUSH AF + PUSH AF EX AF,AF' CPL LD C,A @@ -124,8 +124,12 @@ F_NEXT: EXX ; .CURHND+2: LD IX,0 ; адрес следующей записи в кэше директории - LD A,XH - OR XL - JP Z,SEARCH.error_too_many_files ; [ ] big dir - JP SEARCH.loop -; \ No newline at end of file + ;LD A,XH + ;OR XL + ;JP Z,SEARCH.error_too_many_files ; [ ] big dir + ;JP SEARCH.loop + JP SEARCH.next_record +; +/* +Любые изменения в директории убьют её. +*/ \ No newline at end of file diff --git a/DSS/DOS_FS.ASM b/DSS/DOS_FS.ASM index 2c9186b..5d472d2 100644 --- a/DSS/DOS_FS.ASM +++ b/DSS/DOS_FS.ASM @@ -278,8 +278,14 @@ DIR_PATH_CHECK: LD A,(HL) CALL FINDDIR.CHECK_SLASH LD A,DSS_Error.sys.PATH_NOT_FOUND RET C + PUSH HL LD HL,CORE_BUFFERS.CurrentPath - JP SetPath_GetName + CALL SetPath_GetName + POP HL + RET C + DEC HL + LD (HL),0 + RET ; .end: CP (HL) RET Z diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 07fe018..ef169ec 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -137,19 +137,17 @@ SEARCH: .File: LD A,FAT_ATTR.NoDIRnoVolID .Custom: EX AF,AF' ; A = 76ADLSHR SET_PAGE_X DIRPAGE - ;PUSH AF + PUSH AF EX AF,AF' ; CPL LD C,A - LD IX,DIRPAGE.buffer ;!TEST 9/11/23 record index - ; оптимизация для индекса записи в списке каталога. - ; Понадобится вернуть для перебора каталога > #4000 байт EXX LD DE,0 EXX ; +.loop_big: LD IX,DIRPAGE.buffer .loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error_file_not_found @@ -184,11 +182,10 @@ SEARCH: ; LD D,XH LD E,XL - ;!FIXIT может на выходе просто EXX? ;!TEST 9/11/23 record index - EXX - PUSH DE ; record index - EXX + ; EXX + ; PUSH DE ; record index + ; EXX ;PUSH IX ; LD HL,CORE_BUFFERS.HANDBUF @@ -196,11 +193,13 @@ SEARCH: LD BC,CORE_BUFFERS.HANDBUF.SIZE LDIR ; record index - POP DE - EX AF,AF' + ;POP DE + POP AF + ;EX AF,AF' OUT (SLOT3),A - EX AF,AF' + ;EX AF,AF' AND A + EXX ; record index RET ; .next_record: ;!TEST 9/11/23 record index @@ -209,22 +208,53 @@ SEARCH: EXX ; LD DE,FAT_DIRECTORY_RECORD - ADD IX,DE ; [ ] big dir + ADD IX,DE JR NC,.loop - ; .error_too_many_files: - EX AF,AF' + ; [ ] big dir + LD A,(F_FIRST.FNDMODE) ;!FIXIT big dir - неправильно использовать это, надо новую переменную + RLA + JR C,.readDirNext + ; + ;EX AF,AF' + POP AF OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - SCF + SCF RET ; .error_file_not_found: - EX AF,AF' + ;EX AF,AF' + POP AF OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND SCF - RET + RET + ; +; SLOT3 = DIRPAGE +; CF=1 +; A' = страница до вызова функции +; !FIXIT root dir in LOADDIR +; !FIXIT если в кэш были изменения? +.readDirNext: SBC A,A ; ZF=0 + IN A,(SLOT3) + LD B,A + EX AF,AF' + PUSH HL + PUSH BC + EXX + PUSH DE ; record index + ; + CALL LOADDIR.next + ; + POP DE + EXX + POP BC + POP HL + LD A,B + OUT (SLOT3),A + JR NC,.loop_big + JR .error_file_not_found ;----------------------------------------------------------------------; ; @@ -511,7 +541,7 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF ; [x] fat32 ;!TEST LOADDIR: ;!TODO optimize CALL LOAD_SAVE_DIR_PREPARE - PUSH AF +.next: PUSH AF EX AF,AF' JR NZ,.read_dir ; root dir or not ; root dir @@ -532,9 +562,11 @@ LOADDIR: ;!TODO optimize LD DE,#4000 ; сколько XOR A ; дескриптор CALL READ ; чтение из файла + EX AF,AF' LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов POP AF OUT (SLOT3),A + EX AF,AF' RET ; .LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 diff --git a/DSS/build.txt b/DSS/build.txt index d8263ee..e440e5c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -2 \ No newline at end of file +3 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 70dbd0c..d2b2366 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -124,10 +124,11 @@ cmd_dir: push de ; .NeXt: CALL Print_Header ; [ ] 01/10/23 - ld hl,Buffers.work.free ; имя файла - ld de,Buffers.work.buffer1 ; 80 буфер - ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) - ld bc,Dss.F_First.FATname ; f_first (формат 11) + ld hl,Buffers.work.free ; имя файла + ld de,Buffers.work.buffer1 ; 80 буфер + ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) + ;ld bc,Dss.F_First.FATname ; f_first (формат 11) + ld bc,Dss.F_First.All_FATname ; f_first (формат 11) ; [ ] bigdir RST ToDSS JR C,.Dir_Empty ;R14 ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 3c2af95..19afd4e 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -526 \ No newline at end of file +527 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 97d5ea8..f5f85b3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 97d5ea8a4b1359d49fb706f24aae6af6bb4eef66 +Subproject commit f5f85b3d14c65bfc2f8619b596815e350f1a9d5b