From ef258143e7f8a780c736fb23ede1b3ffa98076f9 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:01:15 +1000 Subject: [PATCH] =?UTF-8?q?SEARCH=5FRECORD=5FIN=5FDIR=5FCACHE=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D0=BB=D0=B8=D1=82=D1=8C=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D0=BA=D1=8D=D1=88?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B4=D0=BE=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=86=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=B8?= =?UTF-8?q?=20(=D0=BD=D0=B0=D0=BF=D0=BE=D1=80=D0=BE=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=8C=20=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=BB=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Close.asm | 2 +- DSS/API/Delete.asm | 2 +- DSS/API/Find.asm | 7 +- DSS/API/Read.asm | 7 +- DSS/API/Rename.asm | 13 +-- DSS/DOS_FS.ASM | 9 +- DSS/FS/FAT.asm | 235 +++++++++++++++++++++++---------------------- DSS/ToDo.txt | 11 ++- 8 files changed, 158 insertions(+), 128 deletions(-) diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index fe8be49..77b14bb 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -50,7 +50,7 @@ CLOSE_FN: LD (.TMP),A ; LD L,(IY+_sFM.HANDLE) LD H,(IY+_sFM.HANDLE+1) - CALL LOADDIR.Custom ; [ ] big dir + CALL LOADDIR.Custom ; [ ] big dir ;!FIXIT check error ; [ ] big dir ;!TODO отмотать кэш до нужного record index? ; diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index d5802d9..188df31 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -18,7 +18,7 @@ DEL_FN: ; Current Dir 15/10/23 ; CALL CHECK_NAME RET Z - ; + ;!FIXIT check error CALL LOADDIR ; [ ] big dir ; !FIXIT дублирует действие из SetPath_GetName? CALL SEARCH.File RET C diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 7988c5d..61aac52 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -24,10 +24,15 @@ F_FIRST_FN: CALL F_FIRST.INIT_VARS ; F_FIRST: CALL .INIT_VARS .begin: CALL SetPath_GetName ;!FIXIT не дублируется ли после DIR_PATH_CHECK выше? - ;CALL LOADDIR RET C + ; + LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) + AND A + CALL NZ,LOADDIR ;!FIXIT check error + ; CALL MASK RET C + ; LD A,(.SEARCH_ATTRIBUT) CALL SEARCH.Custom RET C diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index 60cc06b..c91c1f8 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -16,9 +16,10 @@ READ: LD (.R_POINT),HL LD A,(IY+_sFM.DRIVE) CALL OPENDSK JP C,.ERR_1 - CALL GET_OFFSET_IN_SECTORS ; + CALL GET_OFFSET_IN_SECTORS JP NZ,.ROV1 + ; .ROV4: POP BC PUSH BC SRL B @@ -29,6 +30,7 @@ READ: LD (.R_POINT),HL .R_POINT+2: LD IX,0 CALL BLOCK_READ JP C,.ERR_1 + ; LD DE,(.R_POINT) .PointerOnBuffer+1: LD HL,0 // LD HL,(READMEM) @@ -64,6 +66,7 @@ READ: LD (.R_POINT),HL LD C,SLOT3 OUT (C),B JP C,.ERR_1 + ; LD HL,CORE_BUFFERS.BUFFER LD DE,(.R_POINT) POP BC @@ -71,7 +74,6 @@ READ: LD (.R_POINT),HL LD (.R_POINT),DE .ROV6: LD HL,(.R_POINT) .S_POINT+1: LD DE,0 - ;EX DE,HL AND A SBC HL,DE PUSH HL @@ -108,7 +110,6 @@ READ: LD (.R_POINT),HL POP HL LD C,B ADC HL,BC - ; EXX POP DE LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index a78b847..3e2c87d 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -35,7 +35,7 @@ RENAME: ; Current Dir 15/10/23 RET Z ; PUSH DE - ; !FIXIT дублирует действие и директория уже загружена? + ; !FIXIT дублирует действие и директория уже загружена? ;!FIXIT check error CALL LOADDIR ; [ ] big dir ; прочитать список каталога ; LD A,FAT_ATTR.NoSYSnoVolID @@ -65,13 +65,13 @@ RENAME: ; Current Dir 15/10/23 RET C ; SET_PAGE_X DIRPAGE - EX AF,AF' + PUSH AF ; на случай переключения страницы кэша после SEARCH.Custom "new_name.ext" LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) .DirBlock+1: CP 0 -.recordIndex+1: LD DE,0 +.recordIndex+1: LD HL,0 SCF ; не пересчитывать размер директории - CALL NZ,LOADDIR.next + CALL NZ,LOADDIR.next ;!FIXIT check error ; LD HL,CORE_BUFFERS.MASKARE .recordAddr+1: LD DE,0 @@ -80,8 +80,9 @@ RENAME: ; Current Dir 15/10/23 ; ;CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN ; - EX AF,AF' + POP AF OUT (SLOT3),A + LD HL,(.recordIndex) ; [ ] big dir передавать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего JP SAVEDIR -; ; ; \ No newline at end of file +//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/DOS_FS.ASM b/DSS/DOS_FS.ASM index 9cd5da2..f09c1bc 100644 --- a/DSS/DOS_FS.ASM +++ b/DSS/DOS_FS.ASM @@ -50,8 +50,10 @@ SetPath_GetName: LD A,(HL) CP 'a' JR C,.next + ; CP 'z'+1 JR NC,.next + ; SUB %0010'0000 .next: SUB 'A' INC HL @@ -60,17 +62,20 @@ SetPath_GetName: CALL CHDISK POP HL RET C + ; LD A,(HL) OR A JR Z,.done + ; CP ' ' JR Z,.done + ; CP '\' ; SCF LD A,DSS_Error.sys.PATH_NOT_FOUND RET NZ - INC HL ; + INC HL .dir_loop: LD DE,CORE_BUFFERS.TMPNAME LD BC,256*CORE_BUFFERS.TMPNAME.Size + #FF .loop: LD A,(HL) @@ -83,7 +88,9 @@ SetPath_GetName: CP ' '+1 CCF RET NC + ; DJNZ .loop + ; LD A,DSS_Error.sys.INVALID_NAME SCF RET diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index f13f11a..2f06a1d 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -2170,11 +2170,15 @@ SEARCH: ;----------------------------------------------------------------------; SEARCH_RECORD_IN_DIR_CACHE: - ;CPL + ;CPL LD C,A + LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) + LD (.StartPage),A + SLA A ;!TEST 9/11/23 record index EXX - LD DE,0 + LD D,A + LD E,0 EXX ; .loop_big: LD IX,DIRPAGE.buffer @@ -2232,8 +2236,24 @@ SEARCH_RECORD_IN_DIR_CACHE: POP DE EXX POP BC - JR NC,.loop_big ; !FIXIT может быть ошибка чтения или при ZF - конец директории + ;JR NC,.loop_big ; !FIXIT может быть ошибка чтения или при ZF - конец директории + ;RET + + RET C ; + ; полный обход каталога начиная с загруженной страницы + LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) + AND A + JR NZ,.toStartPage + ; + EXX + LD DE,0 + EXX +.toStartPage: ; +.StartPage+1: CP 0 + JR NZ,.loop_big + ; + SCF RET ; .next_char: INC HL @@ -2252,10 +2272,10 @@ SEARCH_RECORD_IN_DIR_CACHE: FINDDIR: SET_PAGE_X DIRPAGE ; PUSH AF - ;[ ] big dir ; !FIXIT заменить на цикличный перебор директории по страницам, чтоб не делать лишних загрузок - LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) - AND A - CALL NZ,LOADDIR + ; + ;LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) + ;AND A + ;CALL NZ,LOADDIR ;!FIXIT check error ; LD A,#28 ; JR Z,... LD (SEARCH_RECORD_IN_DIR_CACHE.type),A ; search directory @@ -2491,29 +2511,22 @@ OPENDIR: ; init ; ;-------------; JP LOADDIR ;----------------------------------------------------------------------; +;!TODO optimize ; Прочитать список каталога -; вход (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) -LOADDIR: ;!TODO optimize - ;!FIXIT если HL выйдет за размеры директории и DirBlock будет некорректным? - LD HL,0 ; ID записи, который должен попасть в КЭШ +; Вход: (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) +LOADDIR: LD HL,0 ;!FIXIT если HL выйдет за размеры директории и DirBlock будет некорректным? +;[-------------] +; Вход: HL - ID записи, который должен попасть в КЭШ +; (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) .Custom: AND A ; в LOAD_SAVE_DIR_PREPARE посчитается размер каталога директории +;[-------------] +; Вход: HL - ID записи, который должен попасть в КЭШ +; (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) +; CF - не рассчитывать размер директории .next: CALL LOAD_SAVE_DIR_PREPARE PUSH AF EX AF,AF' - ;JR NZ,.read_dir ; root dir or not - ; root dir - ;LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) - ;CP FAT_TYPE.x32 JR Z,.LoadRootDirFAT12_16 - ;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 ; .read_dir: LD HL,DIRPAGE.buffer ; куда LD DE,DIRPAGE.size ; сколько @@ -2532,18 +2545,23 @@ LOADDIR: ;!TODO optimize OR E RET NZ ; читаем с начала - CALL LOADDIR -.no_more: XOR A ;!FIXIT научить этому вызывающие процедуры ; 0 - нет ошибок. признак конца каталога - SCF - RET + JR LOADDIR +; .no_more: LD A,#FF +; SCF +; RET ; .LoadRootDirFAT12_16: ; [ ] big dir LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) AND A - JR NZ,.no_more + JR Z,.ok + ; + XOR A + LD (CORE_BUFFERS.FS_Buffer.DirBlock),A + RET + ; ; - LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H);!TODO возможно, хватит LD HL,0 +.ok: 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-каталога ; [ ] sector size 512 @@ -2569,6 +2587,33 @@ LOADDIR: ;!TODO optimize +;----------------------------------------------------------------------; +; Вход: HL - ID записи, который должен попасть в КЭШ +; Выход: HLIX - смещение в файле каталога на нужный блок по #4000 байтов +; A - Номер блока DirBlock +; GET_DIRCACHE_BLOCK_ADDR: +; ; HLIX = (HL*32) & #1FC000 смещение на нужный блок по #4000 байтов +; XOR A +; LD XL,A +; LD E,A +; LD A,H +; LD H,E +; AND #FE +; RRA +; RR E +; LD D,A ; DirBlock +; RRA +; RR E +; RRA +; RR E +; LD XH,E +; LD L,A +; LD A,D +; RET +;----------------------------------------------------------------------; + + + ;----------------------------------------------------------------------; ; [ ] доделать передачу ID записи директории и загрузки по ней нужного куска в кэш ;!TODO FAT procedures @@ -2579,38 +2624,36 @@ LOADDIR: ;!TODO optimize ; ZF' - RootDir FAT12-16 LOAD_SAVE_DIR_PREPARE: PUSH AF - ; [ ] Вход: HL - ID записи, который должен попасть в КЭШ - ; [ ] Выход: HLIX - смещение в файле каталога на нужный блок по #4000 байтов + ;CALL GET_DIRCACHE_BLOCK_ADDR + ;LD (CORE_BUFFERS.FS_Buffer.DirBlock),A ; HLIX = (HL*32) & #1FC000 смещение на нужный блок по #4000 байтов - XOR A - LD XL,A - LD E,A - LD A,H - LD H,E - AND #FE - RRA - RR E - LD (CORE_BUFFERS.FS_Buffer.DirBlock),A - RRA - RR E - RRA - RR E - LD XH,E - LD L,A - ; ; + XOR A + LD XL,A + LD E,A + LD A,H + LD H,E + AND #FE + RRA + RR E + LD (CORE_BUFFERS.FS_Buffer.DirBlock),A + RRA + RR E + RRA + RR E + LD XH,E + LD L,A ; XOR A ; FILE MANIPULATOR = 0 LD B,A ; от начала файла CALL MOVE_FP - - SET_PAGE_X DIRPAGE + SET_PAGE_X DIRPAGE POP DE AND A PUSH AF ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD (CORE_BUFFERS.FM_BUF.DRIVE),A - ;;;;;;;; + ; check fat12-16 root dir XOR A LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) EXX @@ -2620,7 +2663,6 @@ LOAD_SAVE_DIR_PREPARE: EXX OR H OR L - ;;;;;;;; JR Z,.exit ; PUSH AF @@ -2631,32 +2673,8 @@ LOAD_SAVE_DIR_PREPARE: POP AF RET ; -.CalcDirSize: ; check dir cache - ;LD A,(CORE_BUFFERS.FS_Buffer.DirBlockDrive) - ;LD E,A - ;LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - ;LD (CORE_BUFFERS.FM_BUF.DRIVE),A - ;RET Z - ;; - ;CP E - ;JR NZ,.goCalc - ;; - ;EX DE,HL - ;LD HL,(CORE_BUFFERS.FS_Buffer.DirBlockStartCluster_L) - ;SBC HL,DE - ;EX DE,HL - ;JR NZ,.goCalc - ;; - ;EXX - ; EX DE,HL - ; LD HL,(CORE_BUFFERS.FS_Buffer.DirBlockStartCluster_H) - ; SBC HL,DE - ; EX DE,HL - ;EXX - ;RET Z - ; ; calc dir size in clusters -.goCalc: LD DE,0 +.CalcDirSize: LD DE,0 .loop: INC DE ; Надеемся тут на то, что спецификация выполняется и переполнения не будет PUSH DE CALL READ_FROM_FAT @@ -2669,14 +2687,14 @@ LOAD_SAVE_DIR_PREPARE: ; ; DE - размер директории в кластерах ;!FIXIT можно оптимизнуть кол-во сдвигов - ;0001 0000 0000 0000 max кол-во кластеров - ; пример - ;0000 0000 0000 0111 Clusters - ; 0100 0000 SectorsPerCluster - ;0000 0010 0000 0000 BytesPerSector - ; D' E' D E - ;0000 0000 0000 0011 1000 0000 0000 0000 - ; + ;0001 0000 0000 0000 max кол-во кластеров + ; пример + ;0000 0000 0000 0111 Clusters + ; 0100 0000 SectorsPerCluster + ;0000 0010 0000 0000 BytesPerSector + ; D' E' D E + ;0000 0000 0000 0011 1000 0000 0000 0000 + ; LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) ; DE':DE - кол-во кластеров @@ -2691,25 +2709,20 @@ LOAD_SAVE_DIR_PREPARE: RRCA JR C,.loop2 ; -.loop1: ; - SLA E +.loop1: SLA E RL D EXX RL E RL D - ;RL C EXX - ; RRCA JR NC,.loop1 ; -.loop2: ; - SLA E +.loop2: SLA E RL D EXX RL E RL D - ;RL C EXX ; SRL B @@ -2721,7 +2734,7 @@ LOAD_SAVE_DIR_PREPARE: LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE RET -/* 4 3 2 1 +/* пример 4 3 2 1 #FFFF<<5 = #1FFFE0 = 0000 0000 0001 1111 1111 1111 1110 0000 #FFFF номер записи @@ -2735,32 +2748,21 @@ LOAD_SAVE_DIR_PREPARE: ;----------------------------------------------------------------------; -; ASSERT 0, "TODO! GET_ADDR_IN_DIR_CACHE" -;!TODO -; .DIRSIZE помешает если в кэш будет другая страница? -; LOAD_SAVE_DIR_PREPARE возможно не нужен, нужно только установить правильное смещение в FM -; Может вообще переделать её под работу с КЭШ - +;!TODO optimize +;!TODO .DIRSIZE помешает если в кэш будет другая страница? +;!TODO LOAD_SAVE_DIR_PREPARE возможно не нужен, нужно только установить правильное смещение в FM +;!TODO Может вообще переделать её под работу с КЭШ +;!TODO ; [ ] big dir получать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего +; ; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -; [ ] big dir получать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего -SAVEDIR: ;!TODO optimize - SCF ; не считать размер директории +; вход: HL - ID записи, которая изменилась в КЭШ +; в кэш должна быть корректная страница директории, DirBlkSize корректный тоже +SAVEDIR: SCF ; не считать размер директории CALL LOAD_SAVE_DIR_PREPARE PUSH AF EX AF,AF' - ;JR NZ,.save_dir JR Z,.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 - ; .save_dir: LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) @@ -2779,6 +2781,7 @@ SAVEDIR: ;!TODO optimize LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors SUB B JR NC,.RTD1S + ; ADD A,B LD B,A .RTD1S: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) @@ -2967,6 +2970,7 @@ WRITE_DATE_TIME_TO_DIRECTORY_RECORD: ;----------------------------------------------------------------------; ; Преобразовать имя 8.3 -> 11 формат +; !FIXIT написать нормальное описание входа/выхода ; вход: hl = 8.3 имя ; de = буфер имени 11 симв. формата ; при ошибке CF - недоп. имя @@ -2976,7 +2980,12 @@ WRITE_DATE_TIME_TO_DIRECTORY_RECORD: ; RET: C=2 FILE WITHOUT EXTENTION ; C=1 FILE WITH EXTENTION MASK: LD HL,CORE_BUFFERS.TMPNAME +;[-------------] +; вход: hl = 8.3 имя .name: LD DE,CORE_BUFFERS.MASKARE +;[-------------] +; вход: hl = 8.3 имя +; de = буфер имени 11 симв. формата .custom: PUSH HL PUSH DE LD H,D diff --git a/DSS/ToDo.txt b/DSS/ToDo.txt index 13cebd4..766f9b8 100644 --- a/DSS/ToDo.txt +++ b/DSS/ToDo.txt @@ -1,5 +1,12 @@ -По полным директориям. -;[x] LOADDIR после READ выходить с CF, если прочитано 0 +Легенда: [ ] сделать + [x] сделано + [!] переделано и не совпадает с написанным + +По полным директориям: +;[ ] F_FIRST в .INIT_VARS запоминать диск и кластеры директории для восстановления при вызове F_NEXT +;[ ] F_NEXT если в кэш директорий не та, что была при вызове F_FIRST, то запомнить что есть, востановить, что было, +; отработать и загрузить обратно, что было на входе в функцию. А нефиг во время F_NEXT лазать по директориям. +;[!] LOADDIR после READ выходить с CF, если прочитано 0 ;[x] FINDDIR - пока работает только с тем, что было загружено в кэш и мало что находит, если страниц больше 1. ;[ ] Переделать WRITE_DIR_HANDLE для работы с любой записью в каталоге (сейчас ищет первую пустую, чтоб записать в неё) ;[ ] Все изменения в записях каталога делать в буфере CORE_BUFFERS.HANDBUF и сохранять через WRITE_DIR_HANDLE