From 453d3d6b688c227d5b96822085db40f6ad0e0d83 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 17 Apr 2024 03:02:12 +1000 Subject: [PATCH] + new func DELETE_LFS_RECORDS --- BOOT/DSSBOOT.ASM | 6 ++--- DSS/API/Attribute.asm | 2 +- DSS/API/Close.asm | 4 +-- DSS/API/Create.asm | 4 +-- DSS/API/Delete.asm | 11 ++++---- DSS/API/Find.asm | 2 +- DSS/API/MkDir.asm | 32 +++++++++++----------- DSS/API/Rename.asm | 9 +++++-- DSS/API/RmDir.asm | 8 +++--- DSS/DSS-MAIN.ASM | 13 +++++---- DSS/FS/FAT/FAT.asm | 63 +++++++++++++++++++++++++++++++++---------- DSS/FS/FAT/FAT_X.asm | 4 +-- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- Shared_Includes | 2 +- 16 files changed, 105 insertions(+), 61 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 051747a..bf675bb 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -400,8 +400,8 @@ GETROOT: LD HL,(DIR_FRH) ; SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 - LD IX,DIR-#0020 -.SKIPNAM: LD DE,#0020 + LD IX,DIR - FAT_DIRECTORY_RECORD +.SKIPNAM: LD DE,FAT_DIRECTORY_RECORD ADD IX,DE DEC C RET Z @@ -428,7 +428,7 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD E,XL LD HL,HANDBUF EX DE,HL - LD BC,#0020 + LD BC,FAT_DIRECTORY_RECORD LDIR XOR A INC A diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 2ae2501..a26b780 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -26,7 +26,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 CALL .OPENATR ;R002 RET C ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT) ;PUSH BC ;CALL CLOSE diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index a881cb1..64844b3 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -55,7 +55,7 @@ CLOSE_FN: ; ;!TEST 9/11/23 record index ; LD HL,DIR - ; LD DE,#0020 + ; LD DE,FAT_DIRECTORY_RECORD ; LD C,(IY+_sFM.HANDLE) ; LD B,(IY+_sFM.HANDLE+1) ; JR .CLOSE2 @@ -75,7 +75,7 @@ CLOSE_FN: ;PUSH HL ;SET_PAGE_X DIRPAGE ;POP HL - LD BC,#0020 ;!HARDCODE + LD BC,FAT_DIRECTORY_RECORD LDIR OUT (SLOT3),A CALL SAVEDIR diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index f3c4ed3..acfd62b 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -54,14 +54,14 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; ; ;no_file_found -.DO: ; _sFAT_DIRECTORY_RECORD.NAME + .EXT +.DO: ; FAT_DIRECTORY_RECORD.NAME + .EXT LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR EX DE,HL .TMP+1: LD A,0 - ; _sFAT_DIRECTORY_RECORD.ATTRIBUT + ; FAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL LD BC,#0A00 ;!HARDCODE diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index a0277a7..b6d0873 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -32,15 +32,16 @@ DEL_FN: ;!TEST .DELETE: SET_PAGE_X DIRPAGE EX AF,AF' - LD (IX + _sFAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла + CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN + LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла ; fat32 - LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера - LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD A,E OR D EXX - LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) OR D OR E ; diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 1c2c86b..fa24f3b 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -42,7 +42,7 @@ F_FIRST: .FIND_S: INC DE ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes - LD BC,#0020 ;!HARDCODE размер одной записи каталога + LD BC,FAT_DIRECTORY_RECORD ADD IX,BC LD (F_NEXT.CURHND),IX LD HL,HANDBUF+12 ;!HARDCODE diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index de6133b..9735f72 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -53,14 +53,14 @@ MKDIR: EXX ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR EX DE,HL LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога - ; _sFAT_DIRECTORY_RECORD.ATTRIBUT + ; FAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL LD BC,#0800 ; b=счетчик @@ -68,7 +68,7 @@ MKDIR: .loop1: LD (HL),C INC HL DJNZ .loop1 - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H + ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H ; fat32 запись старшего номера кластера .FIRST_CLUSTER_H POP DE PUSH DE ; старший номер сектора @@ -83,12 +83,12 @@ MKDIR: POP DE ; младший номер сектора PUSH DE PUSH BC - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L + ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L LD (HL),E INC HL LD (HL),D INC HL - ; _sFAT_DIRECTORY_RECORD.F_SIZE + ; FAT_DIRECTORY_RECORD.F_SIZE LD BC,#0400 ; b=счетчик .loop2: LD (HL),C INC HL @@ -106,9 +106,9 @@ MKDIR: .loop3: INC HL LD (HL),C DJNZ .loop3 - ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD + ; скопировать байты 11..31 FAT_DIRECTORY_RECORD INC HL - LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + LD DE,HANDBUF+FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла EX DE,HL LD BC,21 ; !HARDCODE LDIR @@ -126,7 +126,7 @@ MKDIR: SET_PAGE_X DIRPAGE PUSH AF ; - LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи + LD DE,DIRPAGE.buffer + FAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи ; LD A,(DIRPAGE.buffer) CP "." @@ -134,14 +134,14 @@ MKDIR: ; ;LD IX,HANDBUF XOR A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A - LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A + LD DE,HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .copy_dir_record: EX DE,HL - LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 + LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.ATTRIBUT ; 21 LDIR POP AF OUT (SLOT3),A @@ -151,7 +151,7 @@ MKDIR: LD E,L INC DE LD (HL),0 - LD BC,512-65 ;!HARDCODE + LD BC,512-65 ;!HARDCODE sector size LDIR ; POP HL ; старший номер сектора @@ -182,7 +182,7 @@ MKDIR: JR Z,.skip_clean ; LD DE,CORE_BUFFERS.SECBUF+1 - LD BC,511 ;!HARDCODE + LD BC,511 ;!HARDCODE sector size LD (HL),0 LDIR .skip_clean: ; diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index e324224..cf18e26 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -61,12 +61,17 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 RET C SET_PAGE_X DIRPAGE - + EX AF,AF' + ; LD HL,MASKARE LD D,XH LD E,XL LD BC,11 - LDIR + LDIR + ; + CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN + ; + EX AF,AF' OUT (SLOT3),A JP SAVEDIR ; \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 0723673..9823609 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -39,9 +39,9 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 CALL SEARCH.Dir RET C ; fat32 - LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) EXX - LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы ; ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах @@ -83,13 +83,13 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 JR Z,.next_record CP #E5 ;!HARDCODE байт удаления файла JR Z,.next_record - LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов + LD DE,FAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE AND FAT_ATTR.VOLUME_ID JP Z,.error ;DIR NOT EMPTY -.next_record: LD DE,#0020 +.next_record: LD DE,FAT_DIRECTORY_RECORD ADD HL,DE DJNZ .check_dir_loop ; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 6453629..a7dd2b7 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -28,15 +28,15 @@ //SPRINTER EQU 2000 includelua 'Shared_includes/lua/Functions.lua' - INCLUDE 'defines.inc' + include 'shared_includes/structures/FileSystem.inc' include 'shared_includes/constants/sp2000.inc' + INCLUDE 'defines.inc' + include 'Structures.inc' include 'shared_includes/constants/standart_colors.inc' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' - include 'shared_includes/structures/FileSystem.inc' include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/macros.z80' - include 'Structures.inc' INCLUDE 'VERSION.INC' INCLUDE 'DSS_MACROSES.Z80' @@ -605,11 +605,14 @@ DEPLOY: ;Allocate memory DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." DRV_CONTENT: DISP 0 - INCLUDE 'DRV-MAIN.ASM' + INCLUDE 'DRV-MAIN.ASM' ENT DRV_CONTENT.SIZE EQU $-DRV_CONTENT - DISPLAY "END ADDRESS: ",/H,$ +BIN_END_ADDRESS EQU $ + + + DISPLAY "END ADDRESS: ",/H,BIN_END_ADDRESS DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512 ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!'; ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!'; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 04663f3..6b3894d 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -9,6 +9,41 @@ ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;--------------------------------------------------------------- ;----------------------------------------------------------------------; + +; [ ] удаление записи LFN +; +; вход: IX = текущая запись в странице с каталогом FAT +; для которой надо удалить записи LFS +DELETE_LFN_RECORDS: + PUSH IX + LD A,XH + AND #C0 + SUB 1 + LD C,A + ; В регистре C маска для определения выхода за пределы страницы + ; +.find_LFN: LD DE, -(FAT_DIRECTORY_RECORD) + LD A,FAT_ATTR.LFS_Entry + ; +.loop: ADD IX,DE + LD A,XH + CP C + JR Z,.beyond_boundaries + ; + LD A,FAT_ATTR.LFS_Entry + CP (IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + JR NZ,.exit + LD (IX+FAT_DIRECTORY_RECORD.NAME),#E5 + JR .loop + ; +.exit: AND A +.beyond_boundaries: ; !TODO подгрузка другой части каталога. пока заглушка + POP IX + RET + +;----------------------------------------------------------------------; + + ; Поиск записи каталога в списке каталога ; ; вход: a = атрибут записи @@ -43,12 +78,12 @@ SEARCH: ; LD DE,0 ; EXX ; -.loop: LD A,(IX+_sFAT_DIRECTORY_RECORD.NAME) +.loop: LD A,(IX+FAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены JR Z,.next_record - LD A,(IX+_sFAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) AND C JR NZ,.next_record LD HL,MASKARE @@ -93,7 +128,7 @@ SEARCH: ; INC DE ; EXX ; - LD DE,#0020 ;!HARDCODE + LD DE,FAT_DIRECTORY_RECORD ADD IX,DE JR NC,.loop .error_too_many_files: @@ -122,7 +157,7 @@ SEARCH: ; CALL LOADDIR ; POP DE ; LD HL,DIR -; LD BC,#0020 +; LD BC,FAT_DIRECTORY_RECORD ;G_HAND2: ; LD A,D ; OR E @@ -178,12 +213,12 @@ FINDDIR: PUSH AF LD IX,DIRPAGE.buffer .big_loop: - LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) + LD A,(IX + FAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error CP #E5 JR Z,.next_step - LD A,(IX + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT) AND FAT_ATTR.DIRECTORY JR Z,.next_step LD HL,MASKARE @@ -201,10 +236,10 @@ FINDDIR: INC DE DJNZ .loop ; - LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) + LD A,(IX + FAT_DIRECTORY_RECORD.NAME) CP "." JP NZ,.ADDSPEC - LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME + 1) + LD A,(IX + FAT_DIRECTORY_RECORD.NAME + 1) CP "." JP NZ,.IT_DIR LD HL,WorkDirectory @@ -231,7 +266,7 @@ FINDDIR: JP .IT_DIR ; .next_step: - LD BC,#0020 ;!HARDCODE + LD BC,FAT_DIRECTORY_RECORD ADD IX,BC JR NC,.big_loop ; @@ -293,12 +328,12 @@ FINDDIR: ; ; JP IT_DIR ; .IT_DIR:; fat32 - LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) - LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD YH,D LD YL,E - LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) - LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) POP AF OUT (SLOT3),A AND A @@ -534,7 +569,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ; LD DE,0 ; EXX ; - LD BC,#0020 + LD BC,FAT_DIRECTORY_RECORD .loop: ;LD A,(IX+00) LD A,(HL) OR A diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 5ebdb27..14a208f 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1233,12 +1233,12 @@ WRITE_DATE_TIME_TO_DIRECTORY_RECORD: CALL SYSTIME ; узнать тек. дату и время CALL MK_TIME ; закодировать время/дату POP HL - ; _sFAT_DIRECTORY_RECORD.TIME + ; FAT_DIRECTORY_RECORD.TIME LD (HL),E ; de=время INC HL LD (HL),D INC HL - ; _sFAT_DIRECTORY_RECORD.DATE + ; FAT_DIRECTORY_RECORD.DATE LD (HL),C ; день INC HL LD (HL),B ; месяц diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ee7e17f..ce82e8c 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -37,7 +37,7 @@ ; .DATE: WORD #0000 ;+ #18 +24 DATE ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE -.FS_REC _sFAT_DIRECTORY_RECORD +.FS_REC FAT_DIRECTORY_RECORD ; from Core .F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW diff --git a/DSS/build.txt b/DSS/build.txt index 0ebf2af..9f02e1c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -951 \ No newline at end of file +952 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 6bd6034..0e35f90 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -129,7 +129,7 @@ ENVADDR EQU #E400 ;FAT_CACHE EQU #C000 FMCOUNT EQU 10 ; Количество файловых манипуляторов -HANDBUF.SIZE EQU 32 ; !HARDCODE _sFAT_DIRECTORY_RECORD +HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD ;----------------------------------------------------; ; diff --git a/Shared_Includes b/Shared_Includes index 17acd88..73f764c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 17acd882094d59946a9cd430a03e736e36fea49b +Subproject commit 73f764ccd1ab8de8dea7eef3b4f5cd27e2ea8dab