From ebeb859eb128bf412411c90567bfcd47998554cb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 26 Apr 2024 06:20:12 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D1=8F=D0=BB=D0=BA=D1=83=20=D1=84?= =?UTF-8?q?=D0=B0=D1=82.=20=D0=B2=20Shell=20=D1=81=D1=87=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=20=D1=81=D0=B2=D0=BE=D0=B1=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0=20fat32,=20=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B5=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/FS/FAT/FAT_X.asm | 69 ++++++----- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/Commands/DIR.ASM | 257 +++++++++++++++++++++-------------------- SHELL/build.txt | 2 +- 5 files changed, 177 insertions(+), 155 deletions(-) diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index d256392..97fbb35 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -16,30 +16,30 @@ ; Удаляет запись в каталоге и освобождает занятую цепочку кластеров ; Вход: IX - указатель на удаляемую запись в DIRPAGE ;!TODO record index. возможно, что может сломаться, если больше страницы -DELETE_REC_FAT: SET_PAGE_X DIRPAGE +DELETE_REC_FAT: SET_PAGE_X DIRPAGE: EX AF,AF' CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла ; fat32 - LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) - LD A,E - OR D + 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 E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - OR E - OR D + 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' JP Z,SAVEDIR ; сбросить кеш каталога на диск ; если размер файла не ноль -.loop: EX DE,HL ; hl=номер кластера - EXX - EX DE,HL - EXX +.loop: ;EX DE,HL ; hl=номер кластера + ;EXX + ; EX DE,HL + ;EXX CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EXX PUSH DE ; номер след. кластера @@ -52,11 +52,13 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE ; LD DE,#0000 ; номер кластера CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - POP DE + POP HL EXX POP AF - POP DE + POP HL + ;EX DE,HL EXX + ;EX DE,HL JP NC,.loop CALL WRITE_FAT_TABLE JP SAVEDIR ; сбросить кеш каталога на диск @@ -64,17 +66,18 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE ; Установить первым известным кластером для поиска свободного. ; Установится только если меньше предыдущего ; Вход: HL':HL - cluster +; портит DE, BC' и A ; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный SET_NEW_FREE_CLUSTER: XOR A - LD B,D - LD C,E + ;LD B,D + ;LD C,E EX DE,HL LD HL,(G_CLUST.low) SBC HL,DE EX DE,HL - LD D,B - LD E,C + ;LD D,B + ;LD E,C ; EXX LD B,D @@ -327,12 +330,12 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Вход: HL - Номер первой ячейки кластера в блоке фата ; Портить только HL и A SET_FAT32_CACHE_BLOCK_CHANGED_REGION: - DEC HL - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x16 + 1 - JR C,.start - DEC HL - DEC HL + ;DEC HL + ;LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + ;CP FAT_TYPE.x16 + 1 + ;JR C,.start + ;DEC HL + ;DEC HL ; .start: LD A,H AND #38 @@ -340,6 +343,7 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: JR Z,.set_region ; .loop: SLA H + AND A SUB L JR NZ,.loop ; @@ -716,7 +720,7 @@ WRITE_FAT_TABLE: LD E,A ; .good_blk: SRL C - JR C,.SAVE_FAT_CACHE_REGION + CALL C,.SAVE_FAT_CACHE_REGION EXX ADD HL,DE EXX @@ -731,26 +735,33 @@ WRITE_FAT_TABLE: PUSH AF PUSH DE PUSH BC + PUSH HL + PUSH IX ; EXX PUSH HL + PUSH HL EXX LD B,E ; кол-во секторов POP DE ; Адрес в странице КЭШа LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write RST ToDSS.DRV - PUSH DE + ; HL:IX = Sector + Sector counter + ; DE = Address + (Sector counter * Size sector) EXX - POP HL + POP HL ; адрес в странице КЭШа LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов) EXX ; + POP IX + POP HL POP BC POP DE POP AF - DJNZ .region_loop RET + ; DJNZ .region_loop + ; RET ENDIF ;----------------------------------------------------------------------- ; diff --git a/DSS/build.txt b/DSS/build.txt index 1c4af3a..fbee9e3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -972 \ No newline at end of file +982 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 815195c..33a4515 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -29,7 +29,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE USE_FSINFO_FAT32 1 ; недоделано. А нужно ли? DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 - DEFINE FAST_FAT_CASHE 0 ; !FIXIT баги при стирании + DEFINE FAST_FAT_CASHE 1 ; !FIXIT баги при стирании SERVICE_SECTORS: .FAT12 EQU #0FEF diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index a64e308..d58bf22 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -291,7 +291,7 @@ A89A4: ld a,(ix+32) ld h,(ix+31) exx push ix - call A8A8F ; десятичный 32-х разрядный вывод + call MAKE_LN ; десятичный 32-х разрядный вывод ld hl,T8B37 ld a,(hl) cp " " @@ -299,7 +299,7 @@ A89A4: ld a,(ix+32) ld a,"0" ld (hl),a A89CD: ld de,T8B46 ; "0 000 000 000" - ld hl,T8B2E ; "0000000000" + ld hl,L32BIT_ ; "0000000000" ldi ld a," " ld (de),a @@ -411,89 +411,100 @@ A8A7E: ld c,2Fh ;!TODO перетащить в procedures/math.asm ; Десятичный 32-х разрядный вывод -A8A8F: ld ix,T8B2E ; "0000000000" - exx - ld de,3B9Ah - exx - ld de,0CA00h - call A8B15 ; 1,000,000,000 - exx - ld de,05F5h - exx - ld de,0E100h - call A8B15 ; 100,000,000...999,999,999 - exx - ld de,98h - exx - ld de,9680h - call A8B15 ; 10,000,000...99,999,999 - exx - ld de,0Fh - exx - ld de,4240h - call A8B15 ; 1,000,000...9,999,999 - exx - ld de,1 - exx - ld de,86A0h - call A8B15 ; 100,000...999,999 - exx - ld de,0 - exx - ld de,10000 - call A8B15 ; 10,000...99,999 - exx - ld de,0 - exx - ld de,1000 - call A8B15 ; 1,000...9,999 - exx - ld de,0 - exx - ld de,100 - call A8B15 ; 100..999 - exx - ld de,0 - exx - ld de,10 - call A8B15 ; 10..99 - ld a,l - add a,"0" - ld (ix+0),a - inc ix - ld hl,T8B2E ; "0000000000" - ld de,2030h ; " ","0" -A8B04: ld a,(hl) - cp e - jr nz,A8B0D - ld (hl),d - inc hl - jr A8B04 - ; -A8B0D: ld hl,T8B37 ; "0" - ld a,(hl) - cp d - ret nz - ld (hl),e - ret +; HL':HL - число для перевода +MAKE_LN: ld ix,L32BIT_ ; "0000000000" + exx + ld de,#3B9A + exx + ld de,#CA00 + ; DE':DE = 1,000,000,000 + call GET_DIG + exx + ld de,#05F5 + exx + ld de,#E100 + ; DE':DE = 100,000,000 + call GET_DIG ; 100,000,000...999,999,999 + exx + ld de,#98 + exx + ld de,#9680 + ; DE':DE = 10,000,000 + call GET_DIG ; 10,000,000...99,999,999 + exx + ld de,#0F + exx + ld de,#4240 + ; DE':DE = 1,000,000 + call GET_DIG ; 1,000,000...9,999,999 + exx + ld de,#01 + exx + ld de,#86A0 + ; DE':DE = 100,000 + call GET_DIG ; 100,000...999,999 + exx + ld de,#00 + exx + ld de,#2710 + ; DE':DE = 10,000 + call GET_DIG ; 10,000...99,999 + exx + ld de,#00 + exx + ld de,#03E8 + ; DE':DE = 1,000 + call GET_DIG ; 1,000...9,999 + exx + ld de#00 + exx + ld de,#64 + ; DE':DE = 100 + call GET_DIG ; 100..999 + exx + ld de,#00 + exx + ld de,#0A + ; DE':DE = 10 + call GET_DIG ; 10..99 + ld a,l + add a,"0" + ld (ix+0),a + inc ix + ld hl,L32BIT_ ; "0000000000" + ld de,#2030 ; " ","0" +.KILLZ: ld a,(hl) + cp e + jr nz,.KILLZ2 + ld (hl),d + inc hl + jr .KILLZ + ; +.KILLZ2: ld hl,T8B37 ; "0" + ld a,(hl) + cp d + ret nz + ld (hl),e + ret -A8B15: xor a -A8B16: inc a - sbc hl,de - exx - sbc hl,de - exx - jp nc,A8B16 - add hl,de - exx - adc hl,de - exx - dec a - add a,"0" - ld (ix+0),a - inc ix - ret +GET_DIG: xor a +.loop: inc a + sbc hl,de + exx + sbc hl,de + exx + jp nc,.loop + ; + add hl,de + exx + adc hl,de + exx + dec a + add a,"0" + ld (ix+0),a + inc ix + ret ; D88DC: WORD 0 @@ -505,11 +516,11 @@ free_space_medium: WORD 0 free_space_high: BYTE 0 ; -T8B2E: db "000000000" -T8B37: db "0" -T8B38: db " ",0 -T8B46: db "0 000 000 000",0 - db 0 +L32BIT_: db "000000000" +T8B37: db "0" +T8B38: db " ",0 +T8B46: db "0 000 000 000",0 + db 0 ; ; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo @@ -523,18 +534,17 @@ read_disk_info: OR #80 ; Файловая система ; Серийный номер диска ; Метка диска в BPB + ; + ; HL':HL - общее кол-во кластеров + ; DE':DE - свободных кластеров + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + ; max sector (LBA28) #0FFF'FFFF + ; EX AF,AF' LD A,(.full) OR A JR Z,.no_full_space_option - ; - ; max sector (LBA28) #0FFF'FFFF - ; HL - общее кол-во кластеров - ; DE - свободных кластеров low - ; DE' - свободных кластеров high - ; A - размер кластера в секторах - ; BC - размер сектора в байтах - PUSH IX ; PUSH BC ; размер сектора в байтах EX AF,AF' @@ -547,45 +557,46 @@ read_disk_info: OR #80 ; A:HL = DE*C ; ; free_clu_H * clu_size_in_sect - EXX EX AF,AF' - LD C,A - PUSH BC - CALL Mult16X8 ; DE*C = A:HL - ; max #0FFF'FFFF sectors for LBA28 - EX AF,AF' - LD D,0 - LD E,A - ADD HL,DE EXX - ; HL':HL - свободных секторов + LD C,A + CALL Mult16X8 ; DE*C = A:HL + ; A:HL = DE*C + ; max #0FFF'FFFF sectors for LBA28 + EX AF,AF' + LD D,0 + LD E,A + ADD HL,DE + EXX ; EX DE,HL + ; HL':DE - свободных секторов + ; POP BC ; размер сектора в байтах PUSH BC CALL Mult_16x16 ; DE*BC = HL:DE. EXX - POP BC - CALL Mult_16x16 ; DE*BC = HL:DE. - LD XH,D - LD XL,E - EXX - EX DE,HL - ADD IX,DE + POP BC EX DE,HL + CALL Mult_16x16 ; DE*BC = HL:DE. + LD XH,D + LD XL,E EXX - JR NC,.no_inc_HL - INC L + EX DE,HL + ADD IX,DE + EX DE,HL + EXX + JR NC,.no_inc_HL + INC L ; потому что не должно быть больше #001F'FFFF'FE00 ; при секторе в 512 байтов - ; -.no_inc_HL: LD A,L - LD (free_space_high),A - LD (free_space_medium),IX +.no_inc_HL: ; + LD A,L + LD (free_space_high),A + LD (free_space_medium),IX EXX LD (free_space_low),DE - POP IX - ; + ; .no_full_space_option: ; parse LD D,0 @@ -767,7 +778,7 @@ cmd_dir_pause: jp cmd_dir.parse /////////////////////////////////////////////////////////////////////////////////////// Size2Char: - call A8A8F ; десятичный 32-х разрядный вывод + call MAKE_LN ; десятичный 32-х разрядный вывод ld hl,T8B37 ; "0" ld a,(hl) cp " " @@ -776,7 +787,7 @@ Size2Char: ld (hl),a .not_zero: ld de,T8B46 ; "0 000 000 000" - ld hl,T8B2E ; "0000000000" + ld hl,L32BIT_ ; "0000000000" ld a,(hl) ldi cp " " diff --git a/SHELL/build.txt b/SHELL/build.txt index 194ba8c..871cae9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -320 \ No newline at end of file +323 \ No newline at end of file