From 00e9cb59f075c4a72c3989673ee14fdd88623b5a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 13 Mar 2024 03:21:17 +1000 Subject: [PATCH] =?UTF-8?q?CORE:=20=D0=B2=D1=80=D0=BE=D0=B4=D0=B5=20=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D1=8C=20=D0=BD=D0=B0=20=D0=B4=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B5=D1=82=D1=8B.=20SHELL:=20=D1=83=D0=BA=D1=80=D0=B0=D1=88?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D1=82=D0=B2=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B=20DIR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/FS/FAT/FAT.asm | 25 ++++--- DSS/FS/FAT/FAT12_16.asm | 132 +++++++++++++++++++++++++++++------- DSS/FS/FAT/FAT32.asm | 34 ++++++++-- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 85 ++++++++++------------- SHELL/Messages/main_txt.asm | 2 + SHELL/build.txt | 2 +- 7 files changed, 190 insertions(+), 92 deletions(-) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 6671bd4..ac6e380 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -544,8 +544,8 @@ RD_BPB: LD C,SLOT3 ; ADD HL,DE ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT - LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 - LD (FatBuffer.FAT2_XX),HL + LD (FatBuffer.FAT1_SEC_L),HL ; first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL //LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ; sectors in FAT //LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) @@ -557,7 +557,7 @@ RD_BPB: LD C,SLOT3 JR Z,.loop1 DEC A ADD HL,DE - LD (FatBuffer.FAT2_XX),HL + LD (FatBuffer.FAT2_SEC_L),HL ;C_DATA1 .loop1: ADD HL,DE DEC A @@ -780,7 +780,11 @@ RD_BPB: LD C,SLOT3 SET_PAGE_X FATPAGE PUSH AF - XOR A + ; [ ] fat32 + ; XOR A + ; HL = 0 + EX DE,HL + ; CALL READ_FAT_TABLE POP AF OUT (SLOT3),A @@ -820,11 +824,12 @@ FatBuffer: .READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) .BLOCK: DB #00 .DIR_CLU_L: DW #0000 -.DIR_CLU_H: DW #0000 ; fat32 +.DIR_CLU_H: DW #0000 ; [ ] fat32 .DRIVE: DB #FF -.FAT_FRM: -.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT -.FAT2_XX: DW #0000 +.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) +.FAT1_SEC_H: DW #0000 ; [ ] fat32 +.FAT2_SEC_L: DW #0000 +.FAT2_SEC_H: DW #0000 ; [ ] fat32 .DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .DIR_FRL: DW #0000 ; MSD_CAT_SEC first sector DIR .F_P_S: DB #00 ; число файловых записей в секторе @@ -834,10 +839,10 @@ FatBuffer: .CLU_LEN: .B_P_C: DW #0000 ; CLUSTER_LEN .C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ;!TODO fat32 +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? .ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #FFFF ; !TODO for fat32 +.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index e060a3c..fd418c6 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -155,6 +155,7 @@ READ_FROM_FAT: CALL GET_FAT32_CELL DI HALT + RET ;----------------------------------------------------------- ; Записать в кеш FAT-а номер кластера ; вход: hl = номер кластера в который записать @@ -253,27 +254,40 @@ WRITE_TO_FAT: .FAT32: ; [ ] fat32 DI HALT -;RX01 ;RE_FAT: -; Прочитать в кеш 16 секторов FAT-а -; A - NEW FAT BLOCK +;RX01 +; Прочитать в кеш ХХ секторов FAT-а +; [ ] fat32 + //; A - NEW FAT BLOCK +; DE - NEW FAT BLOCK +; READ_FAT_TABLE: PUSH HL - PUSH AF + ; [x] fat32 + ; PUSH AF + PUSH DE + ; LD A,(FatCache.Update) OR A CALL NZ,WRITE_FAT_TABLE.Start - POP AF - LD L,A - XOR A - LD H,A ;!FIXIT fat32 - у фат32 блоков может быть валом + ; [x] fat32 + ; POP AF + POP DE + ; + + ;[ ] fat32 + ; LD L,A + ; XOR A + ; LD H,A + EX DE,HL + ; LD (FatCache.Block),HL LD (FatCache.Update),A ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 EDUP - LD DE,(FatBuffer.FAT_FRM) + LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE EX DE,HL ; @@ -291,6 +305,7 @@ READ_FAT_TABLE: RET ; Подключить банку кеша FAT и записать его на диск +; [ ] fat32 WRITE_FAT_TABLE: SET_PAGE_X FATPAGE PUSH AF @@ -307,7 +322,6 @@ WRITE_FAT_TABLE: ADD HL,HL ;x2 EDUP ; HL - номер лог. сектора - PUSH HL LD B,H LD C,L ;BC - BLOCK OF FAT LD DE,FAT_CACHE.Sectors @@ -326,14 +340,64 @@ WRITE_FAT_TABLE: .WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? LD H,B LD L,C - LD DE,(FatBuffer.FAT_FRM) + PUSH HL ; HL - номер лог. сектора + ; + LD DE,(FatBuffer.FAT1_SEC_L) + LD B,A ; число секторов + LD C,Dss.DRV.Write ; запись секторов + PUSH BC + ; сохраняем первую копию FAT + CALL .SAVE_FAT_XX + ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 + LD DE,(FatBuffer.FAT2_SEC_L) + LD HL,(FatBuffer.FAT1_SEC_L) + AND A + SBC HL,DE + POP BC ; b=число секторов + POP HL + JR Z,.only_one_FAT + ; + ; сохраняем вторую копию FAT + CALL .SAVE_FAT_XX + AND A ;!TODO нет контроля ошибок +.only_one_FAT: +.ERR: LD A,0 + LD (FatCache.Update),A + RET + ; +.SAVE_FAT_XX: ADD HL,DE EX DE,HL - ; + ; номер лог. сектора + ;LD IX,0 + ;ADD IX,DE LD XH,D LD XL,E + ; + LD HL,0 ; ст. разряд + ; CF = ADD HL,DE + ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? + IF _FAT32_ENABLE + RL L + ENDIF + ;HL:IX - SECTOR OF FAT FOR SAVE + LD DE,FATPAGE.cache ; откуда + LD A,(FatBuffer.DRIVE) ; номер диска + JP ToDSS.DRV +/* +.WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? + LD H,B + LD L,C + PUSH HL ; HL - номер лог. сектора + ; + LD DE,(FatBuffer.FAT1_SEC_L) + ADD HL,DE + EX DE,HL + ; номер лог. сектора ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора + ;ADD IX,DE + LD XH,D + LD XL,E ; LD HL,0 ; ст. разряд ;HL:IX - SECTOR OF FAT FOR SAVE @@ -343,9 +407,18 @@ WRITE_FAT_TABLE: LD A,(FatBuffer.DRIVE) ; номер диска PUSH BC RST ToDSS.DRV - POP BC ; b=число секторов - POP HL - LD DE,(FatBuffer.FAT2_XX) + ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 + LD DE,(FatBuffer.FAT2_SEC_L) + LD HL,(FatBuffer.FAT1_SEC_L) + AND A + SBC HL,DE + POP BC ; b=число секторов + POP HL + JR Z,.only_one_FAT + ; POP BC ; b=число секторов + ; POP HL + ; LD DE,(FatBuffer.FAT2_SEC_L) + ; ADD HL,DE EX DE,HL LD XH,D @@ -363,13 +436,12 @@ WRITE_FAT_TABLE: LD C,Dss.DRV.Write RST ToDSS.DRV AND A ;!TODO нет контроля ошибок +.only_one_FAT: ; .ERR: LD A,0 LD (FatCache.Update),A - RET NC - POP HL - ; CF = 1 - RET + RET +*/ ;вход: HL - номер кластера @@ -389,8 +461,13 @@ GET_FAT16_CELL: AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH - CP C + ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; CP C + LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH + CP E + LD E,A + ; CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT @@ -427,8 +504,13 @@ GET_FAT12_CELL: AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH - CP C + ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; CP C + LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH + CP E + LD E,A + ; CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а ENDIF ; @@ -949,7 +1031,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ; RST #18 ; POP BC ; POP HL - ; LD DE,(FAT2_XX) + ; LD DE,(FAT2_SEC_L) ; ADD HL,DE ; EX DE,HL ; LD IX,0 diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm index fb744b6..fa44220 100644 --- a/DSS/FS/FAT/FAT32.asm +++ b/DSS/FS/FAT/FAT32.asm @@ -1,7 +1,7 @@ ;!TODO fat32 ;======================================================================= ;BPB - ;LD (FatBuffer.FAT2_XX),HL + ;LD (FatBuffer.FAT2_SEC_L),HL ;LD (FatBuffer.DIR_FRL),HL ; first sector DIR ;BPB32 ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта @@ -39,18 +39,38 @@ GET_FAT32_CELL: DI HALT +; FOR 8192 bytes cache +; 1 073 741 824 bytes max fat32 size +; 1073741824/8192=131072 +; 0x40000000 / 0x2000 = 0x20000 + +; FOR 16384 bytes cache +; 1 073 741 824 bytes max fat32 size +; 1073741824/16384=65536 +; 0x40000000 / 0x4000 = 0x10000 + +/* + D E H L +0xEAB1022 - block 0x1D562 + D E H +0xEAB10 >>> 0x1D562 +*/ + LD A,H LD B,H - ;AND #0F - AND FAT_CACHE.Size_Mask_16 + AND #0F + ;AND FAT_CACHE.Size_Mask_16 ; #0F LD H,A LD A,B ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) - DUP FAT_CACHE.Degree_16 + ;DUP FAT_CACHE.Degree_16 RRCA - EDUP - ;AND #0F - AND FAT_CACHE.Part_Mask_16 + RRCA + RRCA + RRCA + ;EDUP + AND #0F + ;AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH diff --git a/DSS/build.txt b/DSS/build.txt index dcdf7f5..c353035 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -942 \ No newline at end of file +943 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 6c25698..bf1dc75 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -53,7 +53,7 @@ cmd_dir: ; [ ] 1/10/23 1: ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер - ld a,#37 ; атрибут (все, кроме метки тома) + ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) ld bc,Dss.F_First.FATname ; f_first (формат 11) RST ToDSS JR C,.dir_empty ;R14 @@ -71,9 +71,11 @@ cmd_dir: ld c,Dss.WaitKey rst ToDSS dec d - jr nz,.skip_esc - xor a - ld (.key_p),a ; отменяем ESC + ld de,MAIN_MSG.DIR_ESCAPE + jp z,MESSAGE ; закончить по ESC + ;jr nz,.skip_esc + ;xor a + ;ld (.key_p),a ; отменяем ESC .skip_esc: ld a,32-1 .skip_wait: @@ -153,46 +155,6 @@ cmd_dir: ld hl,(D88E0) ; ст. разряд exx ; - ;;;;;;;;;;;;; -; call A8A8F ; десятичный 32-х разрядный вывод -; ld hl,T8B37 ; "0" -; ld a,(hl) -; cp " " -; jr nz,.not_zero -; ld a,"0" -; ld (hl),a -; .not_zero: -; ld de,T8B46 ; "0 000 000 000" -; ld hl,T8B2E ; "0000000000" -; ld a,(hl) -; ldi -; cp " " -; jr z,1F -; ld a,"," ; разд. разрядов -; 1: ld (de),a -; inc de -; ldi -; ldi -; ld a,(hl) -; ldi -; cp " " -; jr z,1F -; ld a,"," ; разд. разрядов -; 1: ld (de),a -; inc de -; ldi -; ldi -; ld a,(hl) -; ldi -; cp " " -; jr z,1F -; ld a,"," ; разд. разрядов -; 1: ld (de),a -; inc de -; ldi -; ldi -; ldi -; ret CALL Size2Char ;;;;;;;;;;;;; ; @@ -270,7 +232,14 @@ cmd_dir: ; ; Подготовить строку списка файлов/папок -A88E2: ld bc,8 +A88E2: + dec hl + ld a,(hl) + and FAT_ATTR.DIRECTORY + call z,.set_small + inc hl + ; + ld bc,8 ld de,PRM1 ; буфер ldir xor a @@ -286,13 +255,33 @@ A88E2: ld bc,8 call A8A19 ; вывести в буфер время файла/папки ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" jp MESSAGE ; вывод строки - - + ; +.set_small: + ld d,h + ld e,l + ld b,11 ;!HARDCODE длина имени DOS +.loop: inc hl + ld a,(hl) + cp 'A' + jr c,.next + cp 'Z'+1 + jr c,.letter + ; + cp 'А' ;#80 + jr c,.next + cp 'Я'+1 ;#9F + 1 + jr nc,.next +.letter: + or %0010'0000 + ld (hl),a +.next: djnz .loop + ex de,hl + ret ; Вывести в буфер имя файла и его размер (у папки ) A89A4: ld a,(ix+32) ld hl,T8B38 ; " " - and 10h ; папка ? + and FAT_ATTR.DIRECTORY ; папка ? jr nz,A89F4 ; да ld l,(ix+28) ; мл. разряд ld h,(ix+29) diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index ce7440c..6e8aa73 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -11,6 +11,7 @@ MAIN_MSG: .DATE EQU .DATE_ .TIME EQU .TIME_ .PAUSE EQU .PAUSE_ +.DIR_ESCAPE EQU .DIR_ESC_ .INVALID EQU .INV_ .ECHO EQU .ECHO_ .ON EQU .ON_ @@ -35,6 +36,7 @@ MAIN_MSG: stN .DATE_ : db "Current date: %1, %2",CR,LF,0 ; [ ] вывод дня недели 26/01/2023 stN .TIME_ : db "Current time: %1",CR,LF,0 stN .PAUSE_ : db "Press any key to continue . . .",CR,0 + stN .DIR_ESC_ : db 'Command "DIR" aborted by user ',CR,LF,CR,LF,0 stN .INV_ : db "Invalid parametr",CR,LF,0 stN .ECHO_ : db "Echo is %1",CR,LF,0 stN .ON_ : db "on",0 diff --git a/SHELL/build.txt b/SHELL/build.txt index 58dc5af..815f89d 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -303 \ No newline at end of file +311 \ No newline at end of file