From 48b9504b37594524b361d3509cb353ab0391d4a4 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 10 Jan 2026 22:54:34 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=BF=D0=B5=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D1=82=D1=8C=20FINDDIR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Find.asm | 30 +++++++++++++++++++++--------- DSS/FS/FAT.asm | 26 +++++++++++++------------- DSS/ToDo.txt | 2 ++ SHELL/build.txt | 2 +- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index c0268a5..93ab841 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -23,7 +23,7 @@ F_FIRST_FN: CALL F_FIRST.INIT_VARS JR F_FIRST.begin ; F_FIRST: CALL .INIT_VARS -.begin: CALL SetPath_GetName +.begin: CALL SetPath_GetName ;!FIXIT не дублируется ли после DIR_PATH_CHECK выше? ;CALL LOADDIR RET C CALL MASK @@ -31,6 +31,7 @@ F_FIRST: CALL .INIT_VARS LD A,(.SEARCH_ATTRIBUT) CALL SEARCH.Custom RET C + ; что-то нашлось PUSH DE ; record index может и не нужно LD HL,CORE_BUFFERS.MASKARE .DTABUF+1: LD DE,0 @@ -45,8 +46,7 @@ F_FIRST: CALL .INIT_VARS ;LD BC,FAT_DIRECTORY_RECORD ;ADD IX,BC LD (F_NEXT.CURHND),IX - ; record index может и не нужно - POP HL + POP HL ; record index ;!FIXIT нет проверки на переполнение ; надеемся, что FAT без косяков ;INC HL @@ -66,6 +66,9 @@ F_FIRST: CALL .INIT_VARS LDIR .exit: LD A,F_NEXT.NO_NEXT.NO LD (F_NEXT.NO_NEXT),A +.FindCounter+1: LD HL,0 + INC HL + LD (.FindCounter),HL XOR A RET .FIND_M2: ;!TODO LFN @@ -78,6 +81,8 @@ F_FIRST: CALL .INIT_VARS ; .INIT_VARS: LD (.SEARCH_ATTRIBUT),A LD (.DTABUF),DE + LD DE,0 + LD (.FindCounter),DE LD A,B LD (.FNDMODE),A RET @@ -102,12 +107,23 @@ F_NEXT: ; XOR A ; F_NEXT.NO_NEXT.YES LD (F_NEXT.NO_NEXT),A - LD A,(HL) + ; проверка на режим кучи файлов или не больше 512 + LD A,(F_FIRST.FindCounter + 1) ; старший байт счётчика + CP 2 + JR C,.nextSearch + ; + LD A,(F_FIRST.FNDMODE) ;!FIXIT big dir - неправильно использовать это, надо новую переменную + RLA + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + CCF + RET C + ; ; +.nextSearch: LD A,(HL) PUSH HL CALL .NSEARCH POP HL RET C - ; + ; что-то нашлось PUSH DE EX DE,HL JP F_FIRST.FIND_S @@ -124,10 +140,6 @@ 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 JP SEARCH.next_record ; /* diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index ca904b1..c45ae5b 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -2119,9 +2119,10 @@ DELETE_LFN_RECORDS: ;----------------------------------------------------------------------; ; Поиск записи каталога в списке каталога -; вход: a = атрибут записи +; вход: a = атрибут записи (.Custom) +; (CORE_BUFFERS.MASKARE) - маска для поиска ; выход: de = индекс записи в списке каталога -; (HANDBUF) = file's direcory record +; (HANDBUF) = file's directory record ; CF - каталог не найден SEARCH: .Dir: ;LD A,FAT_ATTR.DIRECTORY @@ -2212,11 +2213,10 @@ SEARCH: ADD IX,DE JR NC,.loop ; -.error_too_many_files: ; [ ] big dir - LD A,(F_FIRST.FNDMODE) ;!FIXIT big dir - неправильно использовать это, надо новую переменную - RLA - JR NC,.ErrorTooManyFiles + ; LD A,(F_FIRST.FNDMODE) ;!FIXIT big dir - неправильно использовать это, надо новую переменную + ; RLA + ; JR NC,.error_too_many_files ; ; CF=1 ; !FIXIT root dir in LOADDIR @@ -2238,12 +2238,12 @@ SEARCH: SCF RET ; -.ErrorTooManyFiles: - POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - SCF - RET +; .error_too_many_files: +; POP AF +; OUT (SLOT3),A +; LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR +; SCF +; RET ; ;----------------------------------------------------------------------; @@ -2770,7 +2770,7 @@ LOAD_SAVE_DIR_PREPARE: ;----------------------------------------------------------------------; - ASSERT 0, "TODO! GET_ADDR_IN_DIR_CACHE" +; ASSERT 0, "TODO! GET_ADDR_IN_DIR_CACHE" ;!TODO ; .DIRSIZE помешает если в кэш будет другая страница? ; LOAD_SAVE_DIR_PREPARE возможно не нужен, нужно только установить правильное смещение в FM diff --git a/DSS/ToDo.txt b/DSS/ToDo.txt index ef779ef..74211e0 100644 --- a/DSS/ToDo.txt +++ b/DSS/ToDo.txt @@ -1,5 +1,6 @@ По полным директориям. ;[x] LOADDIR после READ выходить с CF, если прочитано 0 +;[ ] FINDDIR - пока работает только с тем, что было загружено в кэш и мало что находит, если страниц больше 1. ;[ ] Переделать WRITE_DIR_HANDLE для работы с любой записью в каталоге (сейчас ищет первую пустую, чтоб записать в неё) ;[ ] Все изменения в записях каталога делать в буфере CORE_BUFFERS.HANDBUF и сохранять через WRITE_DIR_HANDLE ;[x] Переменная DirBlock показывающая какой блок директории в кэш. @@ -11,6 +12,7 @@ Перелопатить +;[ ] FINDDIR ;[ ] LOAD_SAVE_DIR_PREPARE ;[ ] LOADDIR ;[ ] SAVEDIR diff --git a/SHELL/build.txt b/SHELL/build.txt index 1bc9029..2b9f7e8 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -531 \ No newline at end of file +532 \ No newline at end of file