From 05c9224a7b76f5db53834504bd5a9ad4ebf0b3d3 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 16 Jan 2026 22:51:22 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B8=D1=82=D1=8C:=20LOAD=5F?= =?UTF-8?q?NEXT=5FDIR=5FPART=5FTO=5FDIR=5FCACHE=20WRITE=5FDIR=5FHANDLE=20;?= =?UTF-8?q?-bug:=20GenIOCTL.GetParams=20-=20=D0=B2=D1=8B=D0=B4=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D0=BD=D0=B5=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B2=D0=BE=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20FDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Close.asm | 84 +++++++++----- DSS/API/Create.asm | 18 +-- DSS/API/Execute.ASM | 2 + DSS/API/Find.asm | 8 +- DSS/API/MkDir.asm | 2 +- DSS/API/Move_FP.asm | 1 + DSS/API/Open.asm | 127 +++++++-------------- DSS/API/Read.asm | 2 +- DSS/DOS_FS.ASM | 21 ++-- DSS/FS/FAT.asm | 201 +++++++++++++++++++++++++--------- DSS/Procedures.asm | 14 +++ DSS/Structures.inc | 7 +- DSS/ToDo.txt | 10 +- DSS/build.txt | 2 +- DSS/drivers/media/fdd-drv.asm | 6 +- Shared_Includes | 2 +- 16 files changed, 301 insertions(+), 206 deletions(-) diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 77b14bb..a36ccb9 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -5,6 +5,7 @@ ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// +; [ ] big dir передавать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего ;CLOSE: CLOSE_FN: LD (.TMP),A CALL SET_FM @@ -18,8 +19,7 @@ CLOSE_FN: LD (.TMP),A ; BIT 7,(IY+_sFM.ACCESS_MODE) JR Z,.NOTMODF - ; - ; файл изменён + ; файл изменён LD E,(IY+_sFM.DIR_CLUSTER_L) LD D,(IY+_sFM.DIR_CLUSTER_L+1) PUSH DE @@ -50,44 +50,68 @@ CLOSE_FN: LD (.TMP),A ; LD L,(IY+_sFM.HANDLE) LD H,(IY+_sFM.HANDLE+1) - CALL LOADDIR.Custom ; [ ] big dir ;!FIXIT check error - ; [ ] big dir - ;!TODO отмотать кэш до нужного record index? - ; + ; CF=0 + CALL LOADDIR.Custom ; [x] big dir ;!FIXIT check error .TMP+1: LD A,0 CALL SET_FM +//////////////////////////////////////////////////////////////////////// +; ; +; SET_PAGE_X DIRPAGE +; EX AF,AF' +; LD HL,DIRPAGE.buffer +; LD DE,FAT_DIRECTORY_RECORD +; LD C,(IY+_sFM.HANDLE) +; LD B,(IY+_sFM.HANDLE+1) +; PUSH BC ; record index +; LD A,1 ; [x] big dir +; AND B +; LD B,A +; JR .next_add +; ; +; .loop_add: ADD HL,DE +; DEC BC +; LD A,B +; .next_add: OR C +; JR NZ,.loop_add +; ; +; LD D,YH +; LD E,YL +; EX DE,HL +; LD BC,FAT_DIRECTORY_RECORD +; LDIR +; EX AF,AF' +; OUT (SLOT3),A +; POP HL +; CALL SAVEDIR +; .NOTMODF: LD A,(.TMP) +; JP RES_FM +; ; +; .error: POP DE +; POP DE +; RET +//////////////////////////////////////////////////////////////////////// +; + + +//////////////////////////////////////////////////////////////////////// ; SET_PAGE_X DIRPAGE EX AF,AF' - ; [ ] big dir - ;!TEST 9/11/23 record index - LD HL,DIRPAGE.buffer - LD DE,FAT_DIRECTORY_RECORD - LD C,(IY+_sFM.HANDLE) - LD B,(IY+_sFM.HANDLE+1) - JR .CLOSE2 - ; -.CLOSE1: ADD HL,DE - DEC BC -.CLOSE2: LD A,B - OR C - JR NZ,.CLOSE1 - ;LD L,(IY+_sFM.HANDLE) - ;LD H,(IY+_sFM.HANDLE+1) - ;;;;;;;;; - LD D,YH - LD E,YL - EX DE,HL - LD BC,FAT_DIRECTORY_RECORD - LDIR + LD L,(IY+_sFM.OffsetInDirCache) + LD H,(IY+_sFM.OffsetInDirCache+1) + PUSH HL + LD E,YL + LD D,YH + EX DE,HL + LD BC,FAT_DIRECTORY_RECORD + LDIR EX AF,AF' OUT (SLOT3),A - ; [ ] big dir передавать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего + POP HL CALL SAVEDIR .NOTMODF: LD A,(.TMP) JP RES_FM ; .error: POP DE POP DE - RET -; \ No newline at end of file + RET \ No newline at end of file diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index cb1b0cf..c73681d 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -17,6 +17,7 @@ CREATE: ; Current Dir 15/10/23 ;CREATE_FN: CALL .Prepare RET C CALL SEARCH.File + ; DE - record index ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT @@ -45,16 +46,11 @@ CREATE: ; Current Dir 15/10/23 ;CREATE_FN: CALL .Prepare RET C CALL SEARCH.File - ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 - ; LD A,DSS_Error.sys.FILE_EXISTS - ; CCF - ; RET C - JR NC,.FILE_EXISTS - CP DSS_Error.sys.FILE_NOT_FOUND - SCF - RET NZ - ; + JR NC,.FILE_EXISTS ; + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ ;no_file_found .DO: ; FAT_DIRECTORY_RECORD.NAME + .EXT LD HL,CORE_BUFFERS.MASKARE @@ -72,10 +68,8 @@ CREATE: ; Current Dir 15/10/23 ;CREATE_FN: INC HL DJNZ .loop1 ; .TIME .. .DATE - CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD - ; + CALL WRITE_DATE_TIME_FOR_DIRECTORY_RECORD LD BC,#0600 - ; .loop2: LD (HL),C INC HL DJNZ .loop2 diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index cc96224..9583540 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -459,6 +459,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) CP (HL) INC HL JR Z,.YP_ESLA + ; LD (HL),A INC HL .YP_ESLA: EX DE,HL @@ -467,6 +468,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LDI CP ' '+1 JR NC,.loop + ; DEC DE XOR A LD (DE),A diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index d689123..e003f3f 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -8,8 +8,8 @@ ; B = #01 - имя найденного файла в формате DOS "filename.ext",0 ; поиск без ограничение на размер каталога: ; !TODO B = #02 - имя найденного файла в формате DOS + LFN -; !TODO B = #80 - имя найденного файла в формате 11 байт "FilenameExt" -; !TODO B = #81 - имя найденного файла в формате DOS "filename.ext",0 +; B = #80 - имя найденного файла в формате 11 байт "FilenameExt" +; B = #81 - имя найденного файла в формате DOS "filename.ext",0 ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// @@ -39,7 +39,7 @@ F_FIRST: CALL .INIT_VARS PUSH DE ; record index может и не нужно LD HL,CORE_BUFFERS.MASKARE .DTABUF+1: LD DE,0 - LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT + LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT LDIR .SEARCH_ATTRIBUT+1: LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT @@ -144,4 +144,4 @@ F_NEXT: LD DE,SEARCH.for_F_NEXT PUSH DE ; выход в SEARCH из SEARCH_RECORD_IN_DIR_CACHE JP SEARCH_RECORD_IN_DIR_CACHE.next_record -; \ No newline at end of file +//////////////////////////////////////////////////////////////////////// diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 44502fb..38b41dc 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -83,7 +83,7 @@ MKDIR: LD (HL),D INC HL ; - CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD + CALL WRITE_DATE_TIME_FOR_DIRECTORY_RECORD ; запись младшего номера кластера .FIRST_CLUSTER_L POP BC ; старший номер сектора POP DE ; младший номер сектора diff --git a/DSS/API/Move_FP.asm b/DSS/API/Move_FP.asm index 829277e..f3bb3e2 100644 --- a/DSS/API/Move_FP.asm +++ b/DSS/API/Move_FP.asm @@ -2,6 +2,7 @@ ; A - FILE MANIPULATOR MOVE_FP: CALL SET_FM RET C + ; INC B DJNZ .B_1 ;from Start File diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 09c4a7c..63f7d02 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -27,25 +27,22 @@ OPEN_FN: ; Current Dir 15/10/23 RET C .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C - ; + ; + ; IX - смещение на запись в SLOT3 DIRPAGE.buffer .FM: ; enter point from ATTRIB -;R002 ;!TEST 9/11/23 record index - PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) - ; + PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) CALL GET_FM - ;!TEST 9/11/23 record index указатель на запись в каталоге FS - POP DE - ; + POP DE RET C + ; LD A,C ; дескриптор файла EX AF,AF' - ;!TEST 9/11/23 record index указатель на запись в каталоге FS - ;POP DE - ; EXX - LD (IY+_sFM.HANDLE),E - LD (IY+_sFM.HANDLE+1),D - ; EXX - ; + LD (IY+_sFM.HANDLE),E + LD (IY+_sFM.HANDLE+1),D + LD D,XH + LD E,XL + LD (IY+_sFM.OffsetInDirCache),E + LD (IY+_sFM.OffsetInDirCache+1),D LD D,YH LD E,YL LD HL,CORE_BUFFERS.HANDBUF @@ -53,95 +50,53 @@ OPEN_FN: ; Current Dir 15/10/23 LDIR .TMP+1: LD A,0 LD (IY+_sFM.ACCESS_MODE),A - ; !FIXIT оптимизнул тут - ;LD A,(TASK) - ;LD (IY+_sFM.TASK_NUM),A - ;XOR A - ;LD (IY+_sFM.OptimizedClusters),A - ;LD (IY+_sFM.KnownCluster_L),A - ;LD (IY+_sFM.KnownCluster_L+1),A - ;LD (IY+_sFM.KnownOffset_L),A - ;LD (IY+_sFM.KnownOffset_L+1),A - ;; fat32 - ; LD (IY+_sFM.KnownCluster_H),A - ; LD (IY+_sFM.KnownCluster_H+1),A - ; LD (IY+_sFM.KnownOffset_H),A - ; LD (IY+_sFM.KnownOffset_H+1),A - ;; - ;LD (IY+_sFM.F_POSITION),A - ;LD (IY+_sFM.F_POSITION+1),A - ;LD (IY+_sFM.F_POSITION+2),A - ;LD (IY+_sFM.F_POSITION+3),A - ;LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - ;LD (IY+_sFM.DRIVE),A - ;; fat32 - ;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H - ;LD E,(HL) - ;INC HL - ;LD D,(HL) - ;LD (IY+_sFM.DIR_CLUSTER_H),E - ;LD (IY+_sFM.DIR_CLUSTER_H+1),D - ;; - ;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM - ;LD E,(HL) - ;INC HL - ;LD D,(HL) - ;LD (IY+_sFM.DIR_CLUSTER_L),E - ;LD (IY+_sFM.DIR_CLUSTER_L+1),D - ; PUSH IY POP HL LD DE,_sFM.F_POSITION ADD HL,DE - XOR A - LD (HL),A ; _sFM.F_POSITION - INC HL - LD (HL),A ; _sFM.F_POSITION + 1 - INC HL - LD (HL),A ; _sFM.F_POSITION + 2 - INC HL - LD (HL),A ; _sFM.F_POSITION + 3 - INC HL + ; Зануляем + ; _sFM.F_POSITION + ; _sFM.F_POSITION + 1 + ; _sFM.F_POSITION + 2 + ; _sFM.F_POSITION + 3 + LD BC,#0400 ; B - счетчик +.loopZ0: LD (HL),C + INC HL + DJNZ .loopZ0 ; EX DE,HL LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L - LDI ; _sFM.DIR_CLUSTER_L - LDI ; _sFM.DIR_CLUSTER_L + 1 + LDI ; _sFM.DIR_CLUSTER_L + LDI ; _sFM.DIR_CLUSTER_L + 1 LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H - LDI ; _sFM.DIR_CLUSTER_H - LDI ; _sFM.DIR_CLUSTER_H + 1 + LDI ; _sFM.DIR_CLUSTER_H + LDI ; _sFM.DIR_CLUSTER_H + 1 EX DE,HL ; INC HL INC HL LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - LD (HL),A ; _sFM.DRIVE + LD (HL),A ; _sFM.DRIVE INC HL INC HL LD A,(TASK) - LD (HL),A ; _sFM.TASK_NUM + LD (HL),A ; _sFM.TASK_NUM INC HL + ; Зануляем + ; _sFM.OptimizedClusters + ; _sFM.KnownCluster_L + ; _sFM.KnownCluster_L + 1 + ; _sFM.KnownCluster_H + ; _sFM.KnownCluster_H + 1 + ; _sFM.KnownOffset_L + ; _sFM.KnownOffset_L + 1 + ; _sFM.KnownOffset_H + ; _sFM.KnownOffset_H + 1 + LD BC,#0900 ; B - счетчик +.loopZ1: LD (HL),C + INC HL + DJNZ .loopZ1 ; - XOR A - LD (HL),A ; _sFM.OptimizedClusters - INC HL - LD (HL),A ; _sFM.KnownCluster_L - INC HL - LD (HL),A ; _sFM.KnownCluster_L + 1 - INC HL - LD (HL),A ; _sFM.KnownCluster_H - INC HL - LD (HL),A ; _sFM.KnownCluster_H + 1 - INC HL - LD (HL),A ; _sFM.KnownOffset_L - INC HL - LD (HL),A ; _sFM.KnownOffset_L + 1 - INC HL - LD (HL),A ; _sFM.KnownOffset_H - INC HL - LD (HL),A ; _sFM.KnownOffset_H + 1 - ; ; EX AF,AF' AND A - RET -; + RET \ No newline at end of file diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index c91c1f8..6fba8d1 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -6,8 +6,8 @@ READ: LD (.R_POINT),HL LD (.S_POINT),HL CALL SET_FM RET C - CALL .TEST_SIZE ; + CALL .TEST_SIZE LD A,D OR E JP Z,.NOREAD diff --git a/DSS/DOS_FS.ASM b/DSS/DOS_FS.ASM index 6087cb4..0abdb3f 100644 --- a/DSS/DOS_FS.ASM +++ b/DSS/DOS_FS.ASM @@ -367,9 +367,11 @@ FM_FIND: CP FMCOUNT+1 LD DE,CORE_BUFFERS.FM_BUF.Size AND A JR Z,.endLoop + ; .loop: ADD IY,DE DEC A JR NZ,.loop + ; .endLoop: POP DE ; A=0 OR (IY) ;+00 NAME @@ -378,29 +380,25 @@ FM_FIND: CP FMCOUNT+1 .error: XOR A LD A,DSS_Error.sys.INVALID_HANDLE RET +; + SET_FM: CALL FM_FIND + RET NZ ; no error ; error - ;LD A,DSS_Error.sys.INVALID_HANDLE - ; CF = 1 SCF - RET Z - ; no error - XOR A ;LD A,DSS_Error.sys.NO_ERROR - ; CF = 0 RET - +; RES_FM: CALL FM_FIND - ; error - ; LD A,DSS_Error.sys.INVALID_HANDLE SCF - RET Z + RET Z ; error ; no error XOR A LD (IY + _sFM.FS_REC.NAME),A RET ; + ;!TODO CHECK LOCKING GET_FM: LD B,FMCOUNT LD C,#FF @@ -411,10 +409,12 @@ GET_FM: LD B,FMCOUNT LD A,(IY + _sFM.FS_REC.NAME) OR A RET Z + ; DJNZ .loop LD A,DSS_Error.sys.NO_HANDLES SCF RET +; ;FP COMPARE ; CY - FILE POINTER > SIZE @@ -439,6 +439,7 @@ UPPER: CP 'a' RET C CP 'z' + 1 JR NC,.CheckRUS + ; .Dec: SUB #20 RET ; diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 2f06a1d..9941a61 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -2168,18 +2168,29 @@ SEARCH: +;----------------------------------------------------------------------; +; Вход: +; Выход: DE' +; +SET_RECORD_INDEX_FROM_DIR_BLOCK: + SLA A + EXX + ; record index + LD D,A + LD E,0 + EXX + RET +;----------------------------------------------------------------------; + + + ;----------------------------------------------------------------------; SEARCH_RECORD_IN_DIR_CACHE: ;CPL LD C,A LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) - LD (.StartPage),A - SLA A - ;!TEST 9/11/23 record index - EXX - LD D,A - LD E,0 - EXX + LD (LOAD_NEXT_DIR_PART_TO_DIR_CACHE.StartPage),A + CALL SET_RECORD_INDEX_FROM_DIR_BLOCK ; .loop_big: LD IX,DIRPAGE.buffer .loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME) @@ -2216,19 +2227,35 @@ SEARCH_RECORD_IN_DIR_CACHE: ;JR NZ,.next_record JR Z,.next_char ; -.next_record: ;!TEST 9/11/23 record index - EXX - INC DE - EXX - ; +.next_record: EXX + INC DE ; record index + EXX LD DE,FAT_DIRECTORY_RECORD ADD IX,DE JR NC,.loop ; - ; CF=1 + CALL LOAD_NEXT_DIR_PART_TO_DIR_CACHE + RET C + JR NZ,.loop_big + SCF + RET + ; + +.next_char: INC HL + INC DE + DJNZ .loop_compare + ; CF=0 + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; LOAD_NEXT_DIR_PART_TO_DIR_CACHE ; !FIXIT root dir in LOADDIR ; !FIXIT если в кэш были изменения? -.readDirNext: PUSH BC + ; CF=1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +LOAD_NEXT_DIR_PART_TO_DIR_CACHE: + PUSH BC EXX PUSH DE ; record index EX DE,HL @@ -2238,8 +2265,7 @@ SEARCH_RECORD_IN_DIR_CACHE: POP BC ;JR NC,.loop_big ; !FIXIT может быть ошибка чтения или при ZF - конец директории ;RET - - RET C + RET C ; если всё перебрали ; ; полный обход каталога начиная с загруженной страницы LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) @@ -2251,15 +2277,81 @@ SEARCH_RECORD_IN_DIR_CACHE: EXX .toStartPage: ; .StartPage+1: CP 0 - JR NZ,.loop_big - ; + ;JR NZ,.loop_big + ;; + ;SCF + ;RET SCF + CCF + RET ; если всё перебрали + ; +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +; [ ] big dir ;!FIXIT начинать проход с начала директории всегда, чтоб не захламлять +; !FIXIT а точно ли в нулевом FM координаты нужной директории? +; скопировать запись в список диска (каталога) de ix iy +; и сбросить кеш каталога на диск +; вход: (HANDBUF) - запись каталога +; выход: DE - record index +WRITE_DIR_HANDLE: + SET_PAGE_X DIRPAGE + EX AF,AF' + LD IX,DIRPAGE.buffer ; IX + ;!TEST 9/11/23 record index + EXX + LD DE,0 + EXX + ; + LD DE,FAT_DIRECTORY_RECORD +.loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME); IX + OR A + JR Z,.WRT_HN2 + ; + CP #E5 + JR Z,.WRT_HN2 + ; + EXX + INC DE ; record index + EXX + ADD IX,DE ; IX, + JR NC,.loop ;!FIXIT количество записей каталога = страница + ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF RET ; -.next_char: INC HL - INC DE - DJNZ .loop_compare - ; CF=0 +.WRT_HN2: EX DE,HL + LD HL,CORE_BUFFERS.HANDBUF + LD BC,CORE_BUFFERS.HANDBUF.SIZE + LDIR + EX AF,AF' + OUT (SLOT3),A + ; проверяем, увеличился ли размер данных директории + LD HL,DIRPAGE.buffer + LD BC,(SAVEDIR.DirBlkSize) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + JR NC,.SAVEDIR + ; + ; размер данных директории увеличился + LD HL,(SAVEDIR.DirBlkSize) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) + ADD HL,BC + LD (SAVEDIR.DirBlkSize),HL + AND A +.SAVEDIR: EXX + PUSH DE + EXX + ; [ ] big dir передавать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего + CALL SAVEDIR + POP DE RET ;----------------------------------------------------------------------; @@ -2811,13 +2903,12 @@ WRITE_DIR_HANDLE: EXX ; LD BC,FAT_DIRECTORY_RECORD -.loop: ;LD A,(IX+00) - LD A,(HL) +.loop: LD A,(HL) OR A JR Z,.WRT_HN2 + ; CP #E5 JR Z,.WRT_HN2 - ;ADD IX,BC ADD HL,BC JR NC,.loop ;!FIXIT количество записей каталога = страница ; @@ -2827,9 +2918,7 @@ WRITE_DIR_HANDLE: SCF RET ; -.WRT_HN2: ;LD D,XH - ;LD E,XL - EX DE,HL +.WRT_HN2: EX DE,HL LD HL,CORE_BUFFERS.HANDBUF LD BC,CORE_BUFFERS.HANDBUF.SIZE LDIR @@ -2889,47 +2978,51 @@ GET_ADDR_IN_DIR_CACHE: ;----------------------------------------------------------------------; +; !TODO оптимизировать постоянные сохранения Dir Cache ; Удаляет запись в каталоге и освобождает занятую цепочку кластеров ; Вход: IX - указатель на удаляемую запись в DIRPAGE ; в КЭШ директории должна быть загружена часть с нужной записью ;!TODO record index. возможно, что может сломаться, если больше страницы DELETE_REC_FAT: SET_PAGE_X DIRPAGE EX AF,AF' - ;CALL DELETE_LFN_RECORDS ; [ ] big dir ; [x] удаление записи LFN - LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла - ; fat32 - LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера - LD H,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) - LD A,L - OR H - EXX - LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD H,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - OR L - OR H - ; + LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) + CALL SET_RECORD_INDEX_FROM_DIR_BLOCK + ; DE' - record index + ;CALL DELETE_LFN_RECORDS ; [ ] big dir ; [x] удаление записи LFN + LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла + ; fat32 + LD L,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD H,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD A,L + OR H + EXX + LD L,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD H,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + OR L + OR H + ; EX AF,AF' OUT (SLOT3),A EX AF,AF' + ; если длина файла нулевая, то дальше ловить тут нечего. ; [ ] big dir передавать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего - JP Z,SAVEDIR ; сбросить кеш каталога на диск + EX DE,HL ; record index из SET_RECORD_INDEX_FROM_DIR_BLOCK + JP Z,SAVEDIR ; сбросить кеш каталога на диск ; если размер файла не ноль -.loop: ;EX DE,HL ; hl=номер кластера - ;EXX - ; EX DE,HL - ;EXX - CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера + PUSH HL ; record index +.loop: ; hl=номер кластера + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EXX - PUSH DE ; номер след. кластера + PUSH DE ; номер след. кластера PUSH AF - LD DE,#0000 ; номер кластера + LD DE,#0000 ; номер кластера EXX PUSH DE ; CALL SET_NEW_FREE_CLUSTER ; - LD DE,#0000 ; номер кластера - CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера + LD DE,#0000 ; номер кластера + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера POP HL EXX POP AF @@ -2938,9 +3031,11 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE EXX ;EX DE,HL JP NC,.loop + ; CALL WRITE_FAT_TABLE ; [ ] big dir передавать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего - JP SAVEDIR ; сбросить кеш каталога на диск + POP HL ; record index + JP SAVEDIR ; сбросить кеш каталога на диск ;----------------------------------------------------------------------; @@ -2948,7 +3043,7 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE ;----------------------------------------------------------------------; ; Вход: HL - адрес куда писать ; Выход: HL - адрес следующий после записаного -WRITE_DATE_TIME_TO_DIRECTORY_RECORD: +WRITE_DATE_TIME_FOR_DIRECTORY_RECORD: ; [ ] VFAT date PUSH HL CALL SYSTIME ; узнать тек. дату и время diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index da3255c..281642f 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -310,6 +310,20 @@ DIV_by_Shifts: LD L,A RET ;----------------------------------------------------------------------; +; + +;----------------------------------------------------------------------; +; ВХОД: HL - адрес в памяти для зануления +; B - количество байтов +; ВЫХОД: HL - следующий адрес +; SET_HL_MEM_ZERO: +; XOR A +; LD (HL),A +; INC HL +; DJNZ .loop +; RET +;----------------------------------------------------------------------; +; ;=============================================================================================================================== MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 8f15682..b72f70b 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -39,13 +39,13 @@ ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED ; .TIME: WORD #0000 ;+ #16 +22 TIME ; .DATE: WORD #0000 ;+ #18 +24 DATE -; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 +; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE ; from Core .F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW -.DIR_CLUSTER_H WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32 -.HANDLE WORD #0000 ;+ #28 +40 HANDLE NUMBER +.DIR_CLUSTER_H WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; fat32 +.HANDLE WORD #0000 ;+ #28 +40 HANDLE NUMBER (record index) .DRIVE BYTE #00 ;+ #2A +42 DRIVE OR CURRENT .ACCESS_MODE BYTE #00 ;+ #2B +43 ACCESS MODE .TASK_NUM BYTE #00 ;+ #2C +44 TASK @@ -54,6 +54,7 @@ .KnownCluster_H WORD #0000 ;+ #30 +48 Старшее слово номера кластера для которого известно относительное смещение внутри файла .KnownOffset_L WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. .KnownOffset_H WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.OffsetInDirCache WORD #0000 ;+ #36 +54 смещение на запись в SLOT3 DIRPAGE.buffer ENDS ;ACCESS MODE: A=0 чтение/запись diff --git a/DSS/ToDo.txt b/DSS/ToDo.txt index 766f9b8..687a091 100644 --- a/DSS/ToDo.txt +++ b/DSS/ToDo.txt @@ -22,10 +22,16 @@ ;[x] FINDDIR ;[x] LOAD_SAVE_DIR_PREPARE ;[x] LOADDIR -;[ ] SAVEDIR +;[x] DELETE_REC_FAT +;[x] SAVEDIR ;[ ] RENAME ;[ ] CLOSE_FN ;[ ] DEL_FN ;[ ] RMDIR ;[ ] OPENDIR -;[ ] DELETE_LFN_RECORDS \ No newline at end of file +;[ ] DELETE_LFN_RECORDS + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Current dir для каждого диска: +;[ ] Сохранять путь как [длина массива][RECORD_INDEX,DIR_CLUSTER][RECORD_INDEX,DIR_CLUSTER]..[RECORD_INDEX,DIR_CLUSTER] diff --git a/DSS/build.txt b/DSS/build.txt index 7813681..62f9457 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -5 \ No newline at end of file +6 \ No newline at end of file diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index 75923f4..e03e5c4 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -357,9 +357,11 @@ GenIOCTL: BIT 7,B PUSH HL PUSH DE LD A,H - LD H,0 + LD C,L + LD HL,0 + LD B,H ; -.mull_loop1: ADD HL,HL +.mull_loop1: ADD HL,BC DEC A JR NZ,.mull_loop1 ; diff --git a/Shared_Includes b/Shared_Includes index f5f85b3..2fec620 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit f5f85b3d14c65bfc2f8619b596815e350f1a9d5b +Subproject commit 2fec6202f716cfa3ed48fb9bfd79d1081cc2721b