From 4cebd03a1ae306d8073b616bea4e00362202f0a3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 25 Jun 2024 04:59:02 +1000 Subject: [PATCH] SHELL: new command "INFO"& Show FS in DIR. CORE: Some fixes with F_First --- DSS/API/Find.asm | 62 +++++----- DSS/API/diskINF.asm | 6 +- DSS/DSS-MAIN.ASM | 38 +++---- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 51 +++++---- SHELL/Commands/DIR.ASM | 205 +-------------------------------- SHELL/Commands/INFO.ASM | 75 ++++++++++++ SHELL/Messages/main_txt.asm | 14 ++- SHELL/Procedures/math.asm | 41 ++++--- SHELL/Procedures/shared.asm | 221 ++++++++++++++++++++++++++++++++++++ SHELL/SHELL.ASM | 4 +- SHELL/build.txt | 2 +- 12 files changed, 418 insertions(+), 303 deletions(-) create mode 100644 SHELL/Commands/INFO.ASM create mode 100644 SHELL/Procedures/shared.asm diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index ae10617..b25fa19 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -13,34 +13,32 @@ ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -F_FIRST: - LD (.TMP),A - LD (.DTABUF),DE - LD A,B - LD (.FNDMODE),A - PUSH HL - ;!TEST Current Dir ;[x] 15/10/23 - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; - CALL DIR_PATH_CHECK - RET C - ; -.old_EXE: - POP HL - CALL GETWORD - ;CALL LOADDIR - RET C - CALL MASK - RET C - LD A,(.TMP) - CALL SEARCH.Custom - RET C - LD HL,MASKARE +F_FIRST_FN: CALL F_FIRST.INIT_VARS + PUSH HL + ;!TEST Current Dir ;[x] 15/10/23 + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; + CALL DIR_PATH_CHECK + RET C + ; +.old_EXE: POP HL + JR F_FIRST.begin + ; +F_FIRST: CALL .INIT_VARS +.begin: CALL GETWORD + ;CALL LOADDIR + RET C + CALL MASK + RET C + LD A,(.TMP) + CALL SEARCH.Custom + RET C + LD HL,MASKARE .DTABUF+1: LD DE,0 LD BC,11 ;!HARDCODE @@ -78,7 +76,13 @@ F_FIRST: ; CALL GetName JR .exit - + ; +.INIT_VARS: + LD (.TMP),A + LD (.DTABUF),DE + LD A,B + LD (.FNDMODE),A + RET //////////////////////////////////////////////////////////////////////// ; ; diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 25050c3..bfc6cba 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -247,8 +247,10 @@ FAT_STRING: DB 'FAT12' GET_LABEL: PUSH DE LD HL,.LABEL_MASK ; "\*.*" имя метки LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома - LD BC,Dss.F_First.FATname ; f_first, формат 11 - RST ToDSS + LD B,high Dss.F_First.FATname + CALL F_FIRST + ;LD BC,Dss.F_First.FATname ; f_first, формат 11 + ;RST ToDSS POP DE LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL RET C diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f549401..8d69e39 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -335,16 +335,16 @@ GO_ZERO EQU #0000 ;FUNCTION ADDRESS ARRAY ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: -; 0 1 2 3 4 5 6 7 8 9 DEC HEX - DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D - DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 - DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B - DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 - DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F - DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 +; 0 1 2 3 4 5 6 7 8 9 DEC HEX + DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 + DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST_FN,low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D + DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 + DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B + DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 + DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F + DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F IFN SHORT_RSTx10_TABLE @@ -363,15 +363,15 @@ ADRST10: ;DS 512 ;,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: - DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN - DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY - DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 - DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH - DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY + DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK + DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST_FN,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN + DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY + DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY, high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 + DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH + DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT IFN SHORT_RSTx10_TABLE diff --git a/DSS/build.txt b/DSS/build.txt index 6242099..8b42f88 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -992 \ No newline at end of file +993 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 4392518..16f4265 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -493,34 +493,35 @@ EVALSTR: ld a,(hl) ; !! Не делать одну команду > 256 символов)) !! ; ; BAT-команды (не отделять от дос-команд) -BATLIST: DZ 'PAUSE' : DW cmd_pause ;CPAUSE - DZ 'REM' : DW cmd_rem ;CREM - DZ 'EXIT' : DW cmd_break ;break +BATLIST: DZ 'PAUSE' : DW cmd_pause + DZ 'REM' : DW cmd_rem + DZ 'EXIT' : DW cmd_break ; ; DSS-команды -CMDLIST: DZ 'CD' : DW cmd_chdir ;CCHDIR - DZ 'DIR' : DW cmd_dir ;DIR - DZ 'ECHO' : DW cmd_echo ;CECHO +CMDLIST: DZ 'CD' : DW cmd_chdir + DZ 'DIR' : DW cmd_dir + DZ 'ECHO' : DW cmd_echo DZ 'ECHO.' : DW cmd_echoLN - DZ 'PATH' : DW cmd_path ;CPATH - DZ 'MD' : DW cmd_mkdir ;CMKDIR - DZ 'REN' : DW cmd_rename ;CRENAM - DZ 'DEL' : DW cmd_del ;CDELET - DZ 'RD' : DW cmd_rmdir ;CRMDIR - DZ 'SET' : DW cmd_set ;CSET - DZ 'TIME' : DW cmd_time ;CTIME - DZ 'DATE' : DW cmd_date ;CDATE - DZ 'VER' : DW cmd_version ;VERS - DZ 'CLS' : DW cmd_cls ;CLS - DZ 'CHDIR' : DW cmd_chdir ;CCHDIR - DZ 'MKDIR' : DW cmd_mkdir ;CMKDIR - DZ 'RENAME' : DW cmd_rename ;CRENAM - DZ 'ERASE' : DW cmd_del ;CDELET - DZ 'RMDIR' : DW cmd_rmdir ;CRMDIR - DZ 'HELP' : DW cmd_help ;HELP - DZ 'VERSION' : DW cmd_version ;VERS - DZ 'EXIT' : DW cmd_exit ;CEXIT - DZ 'REBOOT' : DW cmd_reboot ;REBOOT + DZ 'PATH' : DW cmd_path + DZ 'MD' : DW cmd_mkdir + DZ 'REN' : DW cmd_rename + DZ 'DEL' : DW cmd_del + DZ 'RD' : DW cmd_rmdir + DZ 'INFO' : DW cmd_info + DZ 'SET' : DW cmd_set + DZ 'TIME' : DW cmd_time + DZ 'DATE' : DW cmd_date + DZ 'VER' : DW cmd_version + DZ 'CLS' : DW cmd_cls + DZ 'CHDIR' : DW cmd_chdir + DZ 'MKDIR' : DW cmd_mkdir + DZ 'RENAME' : DW cmd_rename + DZ 'ERASE' : DW cmd_del + DZ 'RMDIR' : DW cmd_rmdir + DZ 'HELP' : DW cmd_help + DZ 'VERSION' : DW cmd_version + DZ 'EXIT' : DW cmd_exit + DZ 'REBOOT' : DW cmd_reboot DB #00 diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 606d367..afdf8a5 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -106,8 +106,13 @@ cmd_dir: push de .SkipMask: LD C,Dss.CurDisk ; узнать тек. диск RST ToDSS CALL read_disk_info ; прочитать метку и серийный номер диска + JR NC,.NeXt + ; + CALL print_err_message + SCF + RET ; - CALL Print_Header +.NeXt: CALL Print_Header ; [ ] 01/10/23 ld hl,Buffers.work.free ; имя файла ld de,Buffers.work.buffer1 ; 80 буфер @@ -566,9 +571,6 @@ S_LOW: WORD 0 S_MED: WORD 0 S_HIGH: BYTE 0 dir_number: WORD 0 -free_space_low: WORD 0 -free_space_medium: WORD 0 -free_space_high: BYTE 0 ; full_space_low: WORD 0 full_space_medium: WORD 0 @@ -589,207 +591,12 @@ SIZE_BUFFER: db " " ; .bytes equ SIZE_BUFFER - $ ; -; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo -; иная логика получения метки тома - сначала ищется в корневой директории, -; если там нет, то берётся из BPB -read_disk_info: OR #80 - LD HL,Buffers.work.buffer -.full+1: LD B,0 - LD C,Dss.DskInfo - RST ToDSS - ; Файловая система - ; Серийный номер диска - ; Метка диска в BPB - ; - ; HL':HL - общее кол-во кластеров - ; DE':DE - свободных кластеров - ; A - размер кластера в секторах - ; BC - размер сектора в байтах - ; max sector (LBA28) #0FFF'FFFF - ; - EX AF,AF' - LD A,D - AND E - EXX - AND D - AND E - EXX - INC A - LD (.full),A - EX AF,AF' - ; - ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE - EXX - LD BC,0 - EXX - SRL B - RR C - RRCA - JR C,.loop2 - ; -.loop1: SLA L - RL H - EXX - RL L - RL H - RL B - EXX - ; - SLA E - RL D - EXX - RL E - RL D - RL C - EXX - ; - RRCA - JP NC,.loop1 - ; -.loop2: SLA L - RL H - EXX - RL L - RL H - RL B - EXX - ; - SLA E - RL D - EXX - RL E - RL D - RL C - EXX - ; - SRL B - RR C - JP NC,.loop2 - ; <-- B':HL'HL, C':DE':DE - EXX - LD A,C - LD (free_space_high),A - LD (free_space_medium),DE - ; - LD A,B - LD (full_space_high),A - LD (full_space_medium),HL - EXX - LD (free_space_low),DE - LD (full_space_low),HL - ; -.no_full_space_option: - ; parse - LD D,0 - LD HL,Buffers.work.buffer - ; тут в HL длина поля "Файловая система" - LD E,(HL) - ADD HL,DE - INC HL - ; длина поля "Серийный номер диска" - LD A,(HL) - LD E,A - ADD HL,DE - INC HL - PUSH HL ; указатель на длину поля "Метка диска" - CP 4 ;!HARDCODE длина поля серийного номера - JR NZ,unknown_serial - DEC HL - ; старшее слово серийника - LD D,(HL) - DEC HL - LD E,(HL) - DEC HL - PUSH HL - EX DE,HL - ld de,serial_string ; xxxx-xxxx - call hex16 - POP HL - ; - ld a,"-" - ld (de),a - INC DE - ; младшее слово серийника - LD A,(HL) - DEC HL - LD L,(HL) - LD H,A - call hex16 - ; -.get_label: ; тут в HL длина поля "Метка диска" - POP HL - LD A,(HL) - INC HL - AND A - jr z,.no_volume_label ; да - PUSH HL - LD B,A - LD A,' ' - ; -.loop: CP (HL) - JR NZ,.good_label - INC HL - DJNZ .loop - POP HL ; снимаем лишнее - ; нет метки -.no_volume_label:; %6 - ld hl,volume_string_no ; строка - ld de,Buffers.bat_params.PRM6; куда - call ncopy_string ; скопир. строку (с нулем) - XOR A - LD (Buffers.bat_params.PRM7),A - ret -.good_label: POP HL - PUSH HL ; толкаем лишнее - ; есть метка -volume_label: POP DE ; снимаем лишнее - ; %7 - ld de,Buffers.bat_params.PRM7 - ld bc,11 ;!HARDCODE длина метки - ldir - xor a - ld (de),a - ; %6 - ld hl,volume_string_yes ; строка - ld de,Buffers.bat_params.PRM6; куда - call ncopy_string ; скопир. строку (с нулем) - ret - ; -; если не удалось прочитать серийный номер диска или формат неизвестен -unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже - LD HL,serial_string - LD A,'?' - LD B,serial_string.Size -.loop: LD (HL),A - INC HL - DJNZ .loop - LD HL,serial_string+4 - LD (HL),'-' - ;POP HL ; лишнее - JP read_disk_info.get_label - ; - ;---------------; SlashMaskFname: db '\' ; ; маска файлов mask_fname: db "*.*",0 ;---------------; -; корень диска -;root_path: db 'X:\',0 - -; Серийный номер диска -serial_string: db "xxxx-xxxx" -.Size equ $-serial_string - db 0 ; закрывашка - -volume_string_no: - db "has no label",0 -volume_string_yes: - db "has label",0 -; has_not_full_info: -; db ' (?)',0 -; cmd_dir_options:; [x] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) DB 'f' : DW cmd_dir_freeSpace DB 'p' : DW cmd_dir_pause diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM new file mode 100644 index 0000000..46be1ba --- /dev/null +++ b/SHELL/Commands/INFO.ASM @@ -0,0 +1,75 @@ +;[ ] 24/06/2024 +cmd_info: LD DE,MAIN_MSG.INFO_1 ; индекс "Drive Label Serial number Size" + CALL ECHO_MESSAGE + ; + LD HL,.Collect_Msg + LD C,Dss.PChars + RST ToDSS + ; + LD A,":" + LD (Buffers.bat_params.PRM9+1),A + XOR A + LD (Buffers.bat_params.PRM9+2),A ; Drive "X:",0 + LD (read_disk_info.full),A + ; + LD C,Dss.CurDisk + RST ToDSS + LD B,C + LD C,-1 + ; +.loop: INC C + PUSH BC + LD A,C + ADD "A" + LD (Buffers.bat_params.PRM9),A + LD A,C + CALL read_disk_info + JR C,.next_drv + ; %7 - Volume label + ; serial_string - Volume serial number string + ; full_space_high \ + ; full_space_medium - Partition size + ; full_space_low / + ; + LD HL,.Collect_Msg + LD C,Dss.PChars + RST ToDSS + ; + LD HL,serial_string + LD DE,Buffers.bat_params.PRM4 ; Volume serial number string + CALL ncopy_string + ; full capacity + ld a,(full_space_high) + ld hl,(full_space_medium) ; ст. разряд + exx + ld hl,(full_space_low) ; мл. разряд + CALL PRN_DISK_SIZE + ; %5..6 - Full size + ; + ; форматирование PRM5 + LD HL,Buffers.bat_params.PRM5 - 1 + LD DE,Buffers.bat_params.PRM5 +.clear_spaces: INC HL + LD A,(HL) + CP " " + JR Z,.clear_spaces + AND A + CALL NZ,copy_string + ; +.print_info_2: LD DE,MAIN_MSG.INFO_2 ; индекс "Drive Label Serial number Size" + CALL ECHO_MESSAGE + ; +.next_drv: POP BC + DJNZ .loop + RET + ; +.Collect_Msg: DZ "Please wait, information is being collected...\r" + +/* +0 1 2 3 4 5 6 7 +01234567890123456789012345678901234567890123456789012345678901234567890123456789; +Drive File System Label Serial number Size in bytes + C: FAT32 NO NAME xxxx-xxxx 147,102,629,888. + D: FAT16 SP_SYS xxxx-xxxx 147,102,629,888. + ; +*/ diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 8dd5dcd..ce06ba4 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -22,6 +22,8 @@ MAIN_MSG: .HELP EQU .HELP_ .CALCULATING EQU .CALC_ .CRLF EQU .CRLF_ +.INFO_1 EQU .INFO_1_ +.INFO_2 EQU .INFO_2_ ; !txtCounter DEFL 0 ; ; не сдвигать____ @@ -32,7 +34,7 @@ MAIN_MSG: ; 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; stN .DIR_1_ : db "Volume in drive %1 %6 %7\r\n" - db "Volume Serial Number is %2\r\n" + db "Volume Serial Number is %2, file sistem is %8\r\n" DZ "\r\nDirectory of %3\r\n\n" stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13 stN .DATE_ : DZ "Current date: %1, %2\r\n" ; [x] вывод дня недели 26/01/2023 @@ -48,11 +50,13 @@ MAIN_MSG: stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT stN .HELP_ : db "COMMANDS:\r\n" - db "DIR REN | RENAME PATH HELP \r\n" - db "CD | CHDIR DEL | ERASE SET VER | VERSION \r\n" - db "MD | MKDIR TIME ECHO EXIT \r\n" - DZ "RD | RMDIR DATE CLS REBOOT \r\n\n" + db "CLS INFO REN = RENAME PATH HELP \r\n" + db "CD = CHDIR DEL = ERASE SET VER = VERSION \r\n" + db "MD = MKDIR TIME ECHO EXIT \r\n" + DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" + stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" + stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5.\r\n" ; ;R11 db 0 DZ "Unknown command" diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm index 21ff29d..84ae18d 100644 --- a/SHELL/Procedures/math.asm +++ b/SHELL/Procedures/math.asm @@ -1,27 +1,26 @@ ;----------------------------------------------------------------------; ; Вывод HL в hex-формате -; de=буфер ; hl=число -hex16: ld a,h - call hex8 - ld a,l -; вывод "a" -hex8: push af - rrca - rrca - rrca - rrca - call .num - pop af - ; -.num: and %0000'1111 - add a,#90 - daa - adc a,#40 - daa - ld (de),a - inc de - ret +; de=буфер +hex16_to_str: ld a,h + call hex8_to_str + ld a,l +hex8_to_str: push af + rrca + rrca + rrca + rrca + call .num + pop af + ; +.num: and %0000'1111 + add a,#90 + daa + adc a,#40 + daa + ld (de),a + inc de + ret ;----------------------------------------------------------------------; diff --git a/SHELL/Procedures/shared.asm b/SHELL/Procedures/shared.asm new file mode 100644 index 0000000..b223c6c --- /dev/null +++ b/SHELL/Procedures/shared.asm @@ -0,0 +1,221 @@ +;----------------------------------------------------------------------; +; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo +; иная логика получения метки тома - сначала ищется в корневой директории, +; если там нет, то берётся из BPB +; Вход: выставить переменную read_disk_info.full: +; 0 - не считать свободное место, !0 - считать +; Выход: +; %7 - Volume label +; serial_string - Volume serial number string +; full_space_high \ +; full_space_medium - Partition size +; full_space_low / +; %6 - "has no label" or "has label" +; +read_disk_info: OR #80 + LD HL,Buffers.work.buffer +.full+1: LD B,0 + LD C,Dss.DskInfo + RST ToDSS + RET C + ; Файловая система + ; Серийный номер диска + ; Метка диска в BPB + ; Физический номер диска, номер раздела + ; + ; HL':HL - общее кол-во кластеров + ; DE':DE - свободных кластеров + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + ; max sector (LBA28) #0FFF'FFFF + ; + EX AF,AF' + LD A,D + AND E + EXX + AND D + AND E + EXX + INC A + LD (.full),A + ; + AND H + + EX AF,AF' + ; + ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE + EXX + LD BC,0 + EXX + SRL B + RR C + RRCA + JR C,.loop2 + ; +.loop1: SLA L + RL H + EXX + RL L + RL H + RL B + EXX + ; + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + ; + RRCA + JR NC,.loop1 + ; +.loop2: SLA L + RL H + EXX + RL L + RL H + RL B + EXX + ; + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + ; + SRL B + RR C + JR NC,.loop2 + ; <-- B':HL'HL, C':DE':DE + EXX + LD A,C + LD (free_space_high),A + LD (free_space_medium),DE + ; + LD A,B + LD (full_space_high),A + LD (full_space_medium),HL + EXX + LD (free_space_low),DE + LD (full_space_low),HL + ; +.no_full_space_option: + ; parse + ; copy FS type + LD HL,Buffers.work.buffer + LD DE,Buffers.bat_params.PRM8; куда + LD B,0 + LD C,(HL) ; тут в HL длина поля "Файловая система" + INC HL + LDIR + EX DE,HL + LD (HL),0 + EX DE,HL + ; + LD D,0 + ; ; тут в HL длина поля "Файловая система" + ; LD E,(HL) + ; ADD HL,DE + ; INC HL + ; длина поля "Серийный номер диска" + LD A,(HL) + LD E,A + ADD HL,DE + INC HL + PUSH HL ; указатель на длину поля "Метка диска" + CP 4 ;!HARDCODE длина поля серийного номера + JR NZ,.unknown_serial + DEC HL + ; старшее слово серийника + LD D,(HL) + DEC HL + LD E,(HL) + DEC HL + PUSH HL + EX DE,HL + LD DE,serial_string ; xxxx-xxxx + CALL hex16_to_str + POP HL + ; + LD A,"-" + LD (DE),A + INC DE + ; младшее слово серийника + LD A,(HL) + DEC HL + LD L,(HL) + LD H,A + CALL hex16_to_str + ; +.get_label: ; тут в HL длина поля "Метка диска" + POP HL + LD A,(HL) + INC HL + AND A + JR Z,.no_volume_label ; да + PUSH HL + LD B,A + LD A,' ' + ; +.loop: CP (HL) + JR NZ,.good_label + INC HL + DJNZ .loop + POP HL ; снимаем лишнее + ; нет метки +.no_volume_label:; %6 + LD HL,volume_string_no ; строка + LD DE,Buffers.bat_params.PRM6; куда + CALL ncopy_string ; скопир. строку (с нулем) + XOR A + LD (Buffers.bat_params.PRM7),A + RET + ; +.good_label: POP HL + PUSH HL ; толкаем лишнее + ; есть метка +.volume_label: POP DE ; снимаем лишнее + ; %7 + LD DE,Buffers.bat_params.PRM7 + LD BC,11 ;!HARDCODE длина метки + LDIR + XOR A + LD (DE),A + ; %6 + LD HL,volume_string_yes ; строка + LD DE,Buffers.bat_params.PRM6; куда + XOR A + JP ncopy_string ; скопир. строку (с нулем) + ; + ; если не удалось прочитать серийный номер диска или формат неизвестен +.unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже + LD HL,serial_string + LD A,'?' + LD B,serial_string.Size +.loop3: LD (HL),A + INC HL + DJNZ .loop3 + LD HL,serial_string+4 + LD (HL),'-' + JR read_disk_info.get_label + ; +/////////////////////////////////////////////////////////////////////// +free_space_low: WORD 0 +free_space_medium: WORD 0 +free_space_high: BYTE 0 +; Серийный номер диска +serial_string: db "xxxx-xxxx" +.Size equ $-serial_string + db 0 ; закрывашка +; +volume_string_no: db "has no label",0 +; +volume_string_yes: db "has label",0 +; +; has_not_full_info: db ' (?)',0 +/////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------; \ No newline at end of file diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 3e0f8b4..14b098d 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -381,7 +381,7 @@ ncopy_string: ldi ret po or a - jr nz,$-5 ;!FIXIT $ + jr nz,.start ret ; Скопир. строку (с нулем) @@ -532,6 +532,7 @@ T8C24: db "OFF",0 include 'messages/main_txt.asm' ; сообщения include 'procedures/parsers.asm' ; функции прочесывания и выбора include 'procedures/math.asm' ; функции математические + include 'procedures/shared.asm' ; функции разные ; include 'Commands/exit.asm' ; выход в родит. процесс include 'Commands/break.asm' ; выход из парсера bat @@ -541,6 +542,7 @@ T8C24: db "OFF",0 include 'Commands/cls.asm' ; очистка экрана include 'Commands/date.asm' ; вывод или установка даты/времени include 'Commands/dir.asm' ; вывод списка директории + include 'Commands/info.asm' ; вывод информации о дисках include 'Commands/chdir.asm' ; смена тек. каталога include 'Commands/mkdir.asm' ; создание каталога include 'Commands/rmdir.asm' ; удаление каталога diff --git a/SHELL/build.txt b/SHELL/build.txt index 0ad1c6b..3cf63f9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -408 \ No newline at end of file +425 \ No newline at end of file