From ce4125e4c666d564658e9cdabbd79186bf6aa304 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 25 Nov 2023 08:26:45 +1000 Subject: [PATCH] dir.asm: pause scrolling, full info key '/f' --- SHELL/Commands/DIR.ASM | 281 +++++++++++++++++++++++++++++++-------- SHELL/Commands/PAUSE.ASM | 3 + SHELL/Messages/main.asm | 12 +- SHELL/build.txt | 2 +- 4 files changed, 240 insertions(+), 58 deletions(-) diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 45ffc1f..54b02cb 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -26,33 +26,56 @@ cmd_dir: call read_disk_info ; прочитать метку и серийный номер диска ; pop de + ld a,#ff + ld (.key_p),a ld hl,0 ld (D88DC),hl ld (D88DE),hl ld (D88E0),hl ld (dir_number),hl + ex de,hl - ld a,(hl) - or a - jr nz,1F ; задана маска имен - ld hl,mask_fname ; "*.*" - ;ld de,T9186 ; буфер -1: ld de,work_buffer1 ; 80 + ld de,work_buffer1 ; 80 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS + ; + ld a,(work_buffer1) + or a + jr nz,1F ; задана маска имен + ; + ld hl,mask_fname ; "*.*" + ld de,work_buffer1 + call copy_string ; [ ] 1/10/23 - ld hl,work_buffer1 ; имя файла +1: ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер ld a,#37 ; атрибут (все, кроме метки тома) ld bc,0*256 + Dss.F_First ; f_first (формат 11) RST ToDSS JR C,.dir_empty ;R14 CALL .Print_Header + ; + LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE + PUSH AF ; цикл вывода списка файлов/папок -.loop: ld hl,work_buffer1 ; 80 - ld de,33 - add hl,de +.loop: POP AF +.key_p+1: and #ff + dec a + jr nz,.skip_wait + ld de,MAIN_MSG.PAUSE + call MESSAGE ; вывести строку + ld c,Dss.WaitKey + rst ToDSS + ld a,32-1 +.skip_wait: + PUSH AF + ; + ld hl,work_buffer1+33 ; 80 + ;push af + ;ld de,33 + ;add hl,de call A88E2 + ; ld ix,work_buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and FAT_ATTR.DIRECTORY ; папка ? @@ -109,53 +132,61 @@ cmd_dir: ld c,Dss.F_Next ; поиск след. RST ToDSS jr nc,.loop ; назад в цикл, если не конец списка + pop af ; лишнее ; Десятичный вывод .print: ld hl,(D88DC) ld ix,PRM1 ; буфер call A8964 + ; ld hl,(D88DE) ; мл. разряд exx 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,$+4 - ld a,"," ; разд. разрядов - ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,$+4 - ld a,"," ; разд. разрядов - ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,$+4 - ld a,"," ; разд. разрядов - ld (de),a - inc de - ldi - ldi - ldi + ; + ;;;;;;;;;;;;; +; 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 + ;;;;;;;;;;;;; + ; ; [ ] вывод количества папок ; [ ] вывод общего количества свободного места ld hl,T8B46 ; "0 000 000 000" @@ -173,6 +204,24 @@ cmd_dir: ;xor a ;ld (de),a ; + ; + LD A,(read_disk_info.full) + OR A + ld hl,has_not_full_info + JR Z,.skip_full_space + ; + ld hl,(free_space) ; мл. разряд + exx + ld hl,(free_space+2) ; ст. разряд + exx + CALL Size2Char + ld hl,T8B46 ; "0 000 000 000" + ; +.skip_full_space: + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем), макс.15 симв. + ; + ; ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s) %2 bytes" jp MESSAGE ; вывести строку @@ -197,7 +246,7 @@ cmd_dir: ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." ;!HARDCODE номер строки MSG0 JP MESSAGE ; вывести строку ; - +; ; Подготовить строку списка файлов/папок A88E2: ld bc,8 @@ -440,6 +489,7 @@ D88DC: dw 0 D88DE: dw 0 D88E0: dw 0 dir_number: dw 0 +free_space: dword 0 ; T8B2E: db "000000000" @@ -461,7 +511,31 @@ read_disk_info: ; Файловая система ; Серийный номер диска ; Метка диска в BPB - + EX AF,AF' + LD A,(.full) + OR A + JR Z,.no_full_space_option + ; + ; (DE*A)*BC + ;PUSH HL ; общее кол-во кластеров + ;PUSH DE ; свободных кластеров + PUSH BC ; размер сектора в байтах + EX AF,AF' + LD C,A ; A - размер кластера в секторах + CALL Mult16X8 + ; A:HL = DE*A + ; + EX DE,HL + LD H,0 + LD L,A + POP BC + CALL Mult32 + LD (free_space+2),HL + EX DE,HL + LD (free_space),HL + ; + ; +.no_full_space_option: ; parse LD D,0 LD HL,work_buffer @@ -602,11 +676,13 @@ volume_string_no: db "has no label",0 volume_string_yes: db "has label",0 - +has_not_full_info: + db ' (?)',0 ; cmd_dir_options: ; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) DB 'f' : DW cmd_dir_freeSpace + ;DB 'p' : DW cmd_dir_pause .Size EQU ($-cmd_dir_options)/3 .paramLength equ 3 ; @@ -635,4 +711,105 @@ cmd_dir_freeSpace: POP BC POP DE jp cmd_dir.parse -; \ No newline at end of file +; +; cmd_dir_pause: +; xor a +; ld (cmd_dir.key_p),a +; jp cmd_dir.parse +/////////////////////////////////////////////////////////////////////////////////////// +Size2Char: + 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 +/////////////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------; +;Процедура умножения (16*8bit) +;На вход: DE*C +;На выход:A+HL-результат +Mult16X8: + SUB A + LD L,A + LD H,A + CP C + RET Z + OR D + OR E + RET Z + LD A,C + LD C,#00 + LD B,#08 +Mlt16x8: + ADD HL,HL + RLA + JR NC,1F + ADD HL,DE + ADC A,C +1: DJNZ Mlt16x8 + RET +;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +;Процедура умножения (32bit) +;На вход: HL+DE*BC +;На выход:HL+DE-результат +Mult32: + PUSH IX + LD IX,#0000 + LD A,#20 + EX DE,HL +mul32b: + ADD IX,IX + ADC HL,HL + RL E + RL D + JR NC,noadd1 + ADD IX,BC + JR NC,noadd1 + INC HL +noadd1: + DEC A + JR NZ,mul32b + LD E,LX + LD D,HX + POP IX + RET +;----------------------------------------------------------------------; +/////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 6debe1d..84cf4e3 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -6,6 +6,9 @@ cmd_pause: ld de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." call MESSAGE ; вывод строки + LD A,LF + LD C,Dss.PutChar + RST ToDSS ld c,Dss.WaitKey ; ждем нажатия клавиши JP ToDSS ;ret diff --git a/SHELL/Messages/main.asm b/SHELL/Messages/main.asm index 24315db..9754937 100644 --- a/SHELL/Messages/main.asm +++ b/SHELL/Messages/main.asm @@ -13,6 +13,7 @@ MAIN_MSG: .DIR_3 EQU 10 .HELP EQU 11 .CALCULATING EQU 12 +.CRLF EQU 13 .TABLE: db 0 /* 0 */ db "Volume in drive %1 %4 %5",CR,LF @@ -21,21 +22,22 @@ MAIN_MSG: /* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 /* 2 */ db "Current date: %1",CR,LF,0 /* 3 */ db "Current time: %1",CR,LF,0 -/* 4 */ db "Press any key to continue . . .",CR,LF,LF,0 +/* 4 */ db "Press any key to continue . . .",CR,0 /* 5 */ db "Invalid parametr",CR,LF,0 /* 6 */ db "Echo is %1",CR,LF,0 /* 7 */ db "on",0 /* 8 */ db "off",0 -/* 9 */ db " %1 File(s) %2 bytes",CR,LF - db " %3 Dir(s)",CR,LF,LF,0 -; db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 -/* 10 */ db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME +/* 9 */ db " %1 File(s) %2 bytes",CR,LF + db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 +; db " %3 Dir(s)",CR,LF,LF,0 +/* 10 */ db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME /* 11 */ DB "COMMANDS:",CR,LF,CR,LF DB "DIR REN | RENAME PATH HELP ",CR,LF DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF DB "MD | MKDIR TIME ECHO EXIT ",CR,LF DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 /* 12 */ DB "Calculating free space...",CR,0 +/* 13 */ DB CR,LF,0 ;R11 DB 0 DZ "Unknown command" diff --git a/SHELL/build.txt b/SHELL/build.txt index 83981c0..05cf258 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -175 \ No newline at end of file +201 \ No newline at end of file