From 7c01581aaefc599332b635c01a97122239f8e551 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Apr 2024 08:10:35 +1000 Subject: [PATCH] FSInfo: free clusters count DONE --- DSS/API/MkDir.asm | 3 +++ DSS/API/diskINF.asm | 41 +++++++++++++++++++++-------------------- DSS/DSS-MAIN.ASM | 27 ++++++++++++++++++++++----- DSS/FS/FAT/FAT.asm | 4 ++++ DSS/FS/FAT/FAT_X.asm | 39 ++++++++++++++++++++++++++------------- DSS/Structures.inc | 6 ++---- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 14 ++++++++++++-- SHELL/build.txt | 2 +- 9 files changed, 92 insertions(+), 46 deletions(-) diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 3ea0859..8caaccb 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -52,6 +52,9 @@ MKDIR: PUSH HL ; старший номер сектора EXX ; + XOR A ; уменьшить + CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo + ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 770ac93..3e634bf 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -133,28 +133,23 @@ DISKINF: LD C,B .CheckFreeSpace:; если GetFreeSpace не вызывается XOR A OR B - LD A,#FF - LD B,A - LD C,A + LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) EXX - LD B,A - LD C,A + LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) EXX - CALL NZ,.GetFreeSpace + CALL NZ,GetFreeSpace ; ;.FRESP2: ; A = 0 if B != 0 before .GetFreeSpace ; LD H,B LD L,C - ; LD DE,2 - ; SBC HL,DE + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL EX DE,HL EXX LD H,B LD L,C - ; LD DE,2 - ; SBC HL,DE + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL EX DE,HL EXX LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) @@ -170,8 +165,21 @@ DISKINF: LD C,B AND A RET ; -.GetFreeSpace: XOR A + ; [ ] 22/11/23 подфункция с доп.инфой +.mCOPY_LOOP: LD B,0 + EX DE,HL + LD (HL),C + EX DE,HL + INC DE + LDIR + RET + ; + +; +GetFreeSpace: LD A,1 + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A LD HL,2 ; fat32 номер кластера от которого считать + XOR A ; fat32 EXX LD H,A @@ -219,13 +227,6 @@ DISKINF: LD C,B EXX JP .loop_free_space ; - ; [ ] 22/11/23 подфункция с доп.инфой -.mCOPY_LOOP: LD B,0 - EX DE,HL - LD (HL),C - EX DE,HL - INC DE - LDIR - RET - ; + FAT_STRING: DB 'FAT12' +; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 2d8b51f..f88fd4d 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -247,8 +247,13 @@ CLEAR_BUFFER_AND_INIT_PROC: LD BC,CLEAR_ZONE.size-1 LD (HL),A LDIR - ; A = 0 - DEC A + LD HL,':'*256 + 'X' + LD (CurrentPath),HL + LD A,'\' ; + LD (CurrentDirectory),A + LD (WorkDirectory),A + ; + LD A,#FF LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; ;R07 ;R11 @@ -385,18 +390,21 @@ MASKARE: BLOCK 8,0 ; ;!TODO к буферам! ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +; 259 CurrentPath: DB 'X' DB ':' CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце ; -; !TODO допилить WorkPath? -;WorkPath: DB 'X' -; DB ':' +; 257 WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + +; 516 +*/ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; @@ -418,8 +426,17 @@ BUFFER EQU BUFFERSplace.Buffer SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER MemoryTable EQU BUFFERSplace.MemoryTable ENDMODULE +; +CurrentPath EQU CORE_BUFFERS.BUFFERSplace + _sBuffers +CurrentDirectory EQU CurrentPath + 2 +.DEPTH: EQU DIRECTORY_PATH_LENGTH +; +WorkDirectory EQU CurrentDirectory + 1 + CurrentDirectory.DEPTH +.DEPTH: EQU DIRECTORY_PATH_LENGTH +; CLEAR_ZONE.size EQU _sBuffers + ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index ba6fd0a..640ec18 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -984,6 +984,10 @@ RD_BPB: ; LD C,SLOT3 LD (G_CLUST.low),HL DEC L LD (G_CLUST.high),HL + ; + DEC HL + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL XOR A RET ; diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 200492e..e881f9d 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -70,15 +70,14 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE ; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный ; [ ] free clusters for FSInfo SET_NEW_FREE_CLUSTER: - XOR A - ;LD B,D - ;LD C,E + LD A,1 ; увеличить + CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo + ; CF=0 + ; EX DE,HL LD HL,(G_CLUST.low) SBC HL,DE EX DE,HL - ;LD D,B - ;LD E,C ; EXX LD B,D @@ -147,13 +146,25 @@ G_CLUST: ; ; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров SET_NEW_FREE_CLUSTERS: + EX AF,AF PUSH HL + PUSH DE EXX PUSH HL + PUSH DE LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD A,H + AND L EXX LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + AND H + AND L + INC A + EXX + JR Z,.no_change + EXX ; + EX AF,AF OR A JR Z,.dec_clusters ; inc clusters @@ -165,14 +176,17 @@ SET_NEW_FREE_CLUSTERS: INC HL EXX ; -.set_new: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL +.set_new: LD A,1 + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + ; + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL EXX LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL +.no_change: POP DE POP HL EXX + POP DE POP HL - LD A,1 - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A RET ; .dec_clusters: LD A,H @@ -191,10 +205,7 @@ SET_NEW_FREE_CLUSTERS: ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -INC_FAT: ; [ ] free clusters for FSInfo - ; - ; - PUSH HL ; текущий кластер +INC_FAT: PUSH HL ; текущий кластер EXX PUSH HL ; текущий кластер EXX @@ -234,7 +245,9 @@ INC_FAT: ; [ ] free clusters for FSInfo POP DE EX DE,HL ; - AND A + ; [ ] free clusters for FSInfo + XOR A ; уменьшить + CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo RET ;RX01 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 1c8cc57..cb296d1 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -104,10 +104,8 @@ .BPB_SERIAL_NUMBER DWORD #00000000 .BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS .UPD_FSINFO BYTE 0 -; IF USE_FSINFO_FAT32 -;.FREE_CLUSTERS_COUNT_L WORD #FFFF -;.FREE_CLUSTERS_COUNT_H WORD #FFFF -; ENDIF +.FREE_CLUSTERS_COUNT_L WORD #FFFF +.FREE_CLUSTERS_COUNT_H WORD #FFFF ;.FilesPerSector: BYTE #00 ; число файловых записей в секторе ;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) diff --git a/DSS/build.txt b/DSS/build.txt index c9ebe15..a637eba 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -978 \ No newline at end of file +980 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 093e313..b0e8251 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -537,9 +537,19 @@ read_disk_info: OR #80 ; max sector (LBA28) #0FFF'FFFF ; EX AF,AF' - LD A,(.full) - OR A + LD A,D + AND E + EXX + AND D + AND E + EXX + INC A JR Z,.no_full_space_option + LD (.full),A + ; ; + ; LD A,(.full) + ; OR A + ; JR Z,.no_full_space_option EX AF,AF' ; ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE diff --git a/SHELL/build.txt b/SHELL/build.txt index 136c8ca..fc72547 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -342 \ No newline at end of file +344 \ No newline at end of file