From 1533b897380105cba2ffebcd61e58207982e5035 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 24 Nov 2023 05:20:54 +1000 Subject: [PATCH] DSS: +new options for Dss.DskInfo. SHELL: keys for cmd_dir in progress... --- DSS/DOS5.ASM | 2 +- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 2 +- SHELL/Commands/DATE.ASM | 4 +- SHELL/Commands/DIR.ASM | 184 +++++++++++------- SHELL/Commands/ECHO.ASM | 2 +- SHELL/Commands/HELP.ASM | 2 +- SHELL/Commands/PAUSE.ASM | 6 +- SHELL/Commands/VER.ASM | 47 +---- SHELL/ERROR.ASM | 303 ----------------------------- SHELL/{SHELL_EXEC.ASM => EXEC.ASM} | 56 +----- SHELL/Messages/errors.asm | 60 ++++++ SHELL/Messages/main.asm | 44 +++++ SHELL/Procedures/Print.ASM | 118 +++++++++++ SHELL/Procedures/math.asm | 76 ++++++++ SHELL/Procedures/parsers.asm | 113 +++++++++++ SHELL/SHELL.ASM | 51 ++--- SHELL/build.txt | 2 +- 18 files changed, 572 insertions(+), 502 deletions(-) delete mode 100644 SHELL/ERROR.ASM rename SHELL/{SHELL_EXEC.ASM => EXEC.ASM} (77%) create mode 100644 SHELL/Messages/errors.asm create mode 100644 SHELL/Messages/main.asm create mode 100644 SHELL/Procedures/Print.ASM create mode 100644 SHELL/Procedures/math.asm create mode 100644 SHELL/Procedures/parsers.asm diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 3e45047..91fe33d 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -1460,7 +1460,7 @@ SEARCH: CPL LD C,A LD IX,DIRPAGE.buffer - ;TEST 9/11/23 + ;!TEST 9/11/23 ; EXX ; LD DE,0 ; EXX diff --git a/DSS/build.txt b/DSS/build.txt index a0d1ef1..c8a110e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -620 \ No newline at end of file +621 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index f025f2a..a00c92c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -307,7 +307,7 @@ A8286: ex af,af' ld hl,BATLIST ; команды "pause","rem" + dos-команды ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - jp COMP004 + jp COMP005.start diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index ebfc58e..b6f4b53 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -67,7 +67,7 @@ cmd_dt1:ld c,Dss.SysTime pop ix pop hl call A8964 - ld de,2 ; индекс "Current date: %1" + ld de,MAIN_MSG.DATE ; индекс "Current date: %1" jp MESSAGE ; вывести строку @@ -148,5 +148,5 @@ cmd_tm1:ld c,Dss.SysTime call A8913 ; десят. вывод в буфер xor a ld (hl),a ; в конец строки - ld de,3 ; индекс "Current time: %1" + ld de,MAIN_MSG.TIME ; индекс "Current time: %1" jp MESSAGE ; вывести строку diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index f0a6352..45ffc1f 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -5,17 +5,32 @@ ;/////////////////////////////////////////////////// cmd_dir: push de - ld c,Dss.CurDisk ; узнать тек. диск + ;;;; [ ] поддержка параметров + ; зануляем все параметры на старте + xor a + ld (read_disk_info.full),a + + + ; выполняем/настраиваем все найденные параметры в строке + ld hl,cmd_dir_options + LD C,256-3 ;!HARDCODE длина строки с командой +.parse: call RUN_OPTION + jr nc,.skip + jp (hl) + ; +.skip: ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS ADD A,"A" ld (root_path),a ; номер диска SUB "A" call read_disk_info ; прочитать метку и серийный номер диска + ; pop de ld hl,0 ld (D88DC),hl ld (D88DE),hl ld (D88E0),hl + ld (dir_number),hl ex de,hl ld a,(hl) or a @@ -26,41 +41,51 @@ cmd_dir: ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ; [ ] 1/10/23 - - ; - ;ld hl,T9186 ; имя файла - ;ld de,T9186 ; буфер ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер ld a,#37 ; атрибут (все, кроме метки тома) ld bc,0*256 + Dss.F_First ; f_first (формат 11) RST ToDSS - ;R14 - ;jp c,print_err_message ; вывод сообщения DSS_Error.sys.FILE_NOT_FOUND - JR NC,.not_empty - CP DSS_Error.sys.FILE_NOT_FOUND - JP NZ,print_err_message - SCF - JP .Print_Header -.not_empty: - CALL .Print_Header - ; + JR C,.dir_empty ;R14 + CALL .Print_Header ; цикл вывода списка файлов/папок -.loop: ;ld hl,T9186 ; раб. буфер - ld hl,work_buffer1 ; 80 +.loop: ld hl,work_buffer1 ; 80 ld de,33 add hl,de call A88E2 - ;ld ix,T9186 ld ix,work_buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and FAT_ATTR.DIRECTORY ; папка ? jr z,.calc_size ; нет + ; считаем папки + ; не считаем папкой служебные "." и ".." + ld d,(ix+33) + ld e,(ix+34) + ld hl,-('..') + add hl,de + ld a,h + or l + jr z,.next + ld hl,-('. ') + add hl,de + ld a,h + or l + jr z,.next ; увеличиваем счётчик папок ld hl,(dir_number) inc hl ld (dir_number),hl jr .next + + ;;R14 +.dir_empty: + push af + CALL .Print_Header + pop af + CALL print_err_message + jr .print + ;;R14 + ; прибавить размер тек. файла .calc_size: ld hl,(D88DC) @@ -131,17 +156,27 @@ cmd_dir: ldi ldi ldi -недоделано +; [ ] вывод количества папок +; [ ] вывод общего количества свободного места ld hl,T8B46 ; "0 000 000 000" ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ld de,9 ; индекс " %1 file(s) %2 bytes" + ; + ;!TEST + ;ld hl,(dir_number) + ;ld de,PRM3 + ;call hex2dec_ascii_16bit.n10000 + ; Десятичный вывод + ld hl,(dir_number) + ld ix,PRM3 ; буфер + call A8964 + ;xor a + ;ld (de),a + ; + ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s) %2 bytes" jp MESSAGE ; вывести строку - ;R14 .Print_Header: - PUSH AF - ; ; %1 ld a,(screen_path) ; диск ld hl,PRM1 @@ -154,27 +189,16 @@ cmd_dir: ld hl,serial_string ; строка серийного номера диска ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем) - ; - ;R14 - POP AF - ld hl,screen_path - JR NC,.not_empty_2 - ; - ld a,(screen_path) - LD (.str),A - ld hl,.str ; экран. путь - ; %3 -.not_empty_2: - ; + ; %3 + ld hl,screen_path ld de,PRM3 ; 16 буфер CALL copy_string ; скопир. строку (с нулем) ; - ld de,0 ; индекс "Volume in drive %1 has no label..." ;!HARDCODE номер строки MSG0 + ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." ;!HARDCODE номер строки MSG0 JP MESSAGE ; вывести строку - -.str: DZ 'X:\ is empty' ;R14 ;!FIXIT ; + ; Подготовить строку списка файлов/папок A88E2: ld bc,8 ld de,PRM1 ; буфер @@ -186,12 +210,11 @@ A88E2: ld bc,8 ldi ldi ld (de),a - ;ld ix,T9186 ld ix,work_buffer1 call A89A4 ; вывести в буфер имя файла и его размер (у папки ) call A89FA ; вывести в буфер дату файла/папки call A8A19 ; вывести в буфер время файла/папки - ld de,10 ; индекс "%1 %2 %3 %4 %5" + ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" jp MESSAGE ; вывод строки @@ -326,7 +349,7 @@ A8A7E: ld c,2Fh inc hl ret - +;!TODO перетащить в procedures/math.asm ; Десятичный 32-х разрядный вывод A8A8F: ld ix,T8B2E ; "0000000000" exx @@ -413,9 +436,10 @@ A8B16: inc a ret ; -D88DC: dw 0 -D88DE: dw 0 -D88E0: dw 0 +D88DC: dw 0 +D88DE: dw 0 +D88E0: dw 0 +dir_number: dw 0 ; T8B2E: db "000000000" @@ -425,12 +449,14 @@ T8B46: db "0 000 000 000",0 db 0 ; -;!FIXIT перенести в DSS - FN #04: GET_BPB -; прочитать BPB диска +; [ ] теперь не лезет напрямую, делает через новый параметр функции DskInfo +; иная логика получения метки тома - сначала ищется в корневой директории, +; если там нет, то берётся из BPB read_disk_info: OR #80 LD HL,work_buffer - LD BC,Dss.DskInfo +.full+1: LD B,0 + LD C,Dss.DskInfo RST ToDSS ; Файловая система ; Серийный номер диска @@ -558,32 +584,6 @@ unknown_serial: ; - -; Вывод 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 - - ; маска файлов mask_fname: db "*.*",0 @@ -598,7 +598,41 @@ serial_string: .Size equ $-serial_string db 0 ; закрывашка -volume_string_no: ;!FIXIT сделать через PRM +volume_string_no: db "has no label",0 volume_string_yes: - db "has label",0 \ No newline at end of file + db "has label",0 + +; +cmd_dir_options: + ; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) + DB 'f' : DW cmd_dir_freeSpace +.Size EQU ($-cmd_dir_options)/3 +.paramLength equ 3 +; + +; +cmd_dir_freeSpace: + PUSH DE + PUSH BC + ; затираем найденый ключ + ld A,'/' + ex de,hl + ld bc,4 + CPDR + inc hl + ld (hl),' ' + inc hl + ld (hl),' ' + + ; ставим опцию для API DSS DskInfo + ld a,1 + ld (read_disk_info.full),a + ; выводим строку о расчёте свободного места так, чтоб она затёрлась + LD DE,MAIN_MSG.CALCULATING + CALL MESSAGE + ; возвращаемся в цикл + POP BC + POP DE + jp cmd_dir.parse +; \ No newline at end of file diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 574fac5..5974267 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -38,7 +38,7 @@ A862E: ld a,(echo_mode) ; фла call FMESAGE ; найти строку по индексу ld de,PRM1 ; куда (аргумент %1) call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ld de,6 ; индекс "Echo is %1" + ld de,MAIN_MSG.ECHO ; индекс "Echo is %1" jp MESSAGE ; A864B: ld (echo_mode),a ; флаг echo-режима diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index 782b68a..4d74175 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -4,5 +4,5 @@ ; ;/////////////////////////////////////////////////// cmd_help: - ld de,11 ; индекс "COMMANDS: ..." + ld de,MAIN_MSG.HELP ; индекс "COMMANDS: ..." jp MESSAGE diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 01a0d68..6debe1d 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -4,8 +4,8 @@ ; ;/////////////////////////////////////////////////// cmd_pause: - ld de,4 ; индекс "Press any key to continue ..." + ld de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." call MESSAGE ; вывод строки ld c,Dss.WaitKey ; ждем нажатия клавиши - RST ToDSS - ret + JP ToDSS + ;ret diff --git a/SHELL/Commands/VER.ASM b/SHELL/Commands/VER.ASM index b779bfd..f0fc837 100644 --- a/SHELL/Commands/VER.ASM +++ b/SHELL/Commands/VER.ASM @@ -16,46 +16,9 @@ cmd_version: LD DE,PRM2 CALL .Set_Ver_to_PRM ; set Shell version ;R13 - LD DE,VERSMSG + LD DE,MAIN_MSG.VERSION JP MESSAGE - ; вход: hl=число, de=буфер -.num_ver: -.num_mod: - ld ix,.tmp1__ - res 7,(ix+0) - jr .decim - - ; вход: hl=число, de=буфер -.num_build: - ld ix,.tmp1__ - res 7,(ix+0) - ld bc,100 ; 100 - call .num16 -.decim: ld bc,10 ; 10 - call .num16 - ld a,l - add a,"0" - jr .num16_exit - -.tmp1__: BYTE 0 - -.num16: ld a,'0'-1 - and a - inc a - sbc hl,bc - jr nc,$-3 - add hl,bc - cp "0" - jr z,$+6 - set 7,(ix+0) - bit 7,(ix+0) - ret z -.num16_exit: - ld (de),a ; сохр. в буфере - inc de - ret - ; ; Вход: ; L - номер версии (0..9) ; H - номер модификации (0..99) @@ -65,20 +28,20 @@ cmd_version: PUSH BC PUSH HL LD H,0 - CALL .num_ver ;decim2 номер версии (0..9) + CALL hex2dec_ascii_16bit.n10 ;decim2 номер версии (0..9) LD A,'.' LD (DE),A INC DE POP HL LD L,H LD H,0 - CALL .num_mod ;decim2 номер модификации (0..99) + CALL hex2dec_ascii_16bit.n10 ;decim2 номер модификации (0..99) POP HL LD A,'.' LD (DE),A INC DE - CALL .num_build ;decim3 номер билда (0..999) + CALL hex2dec_ascii_16bit.n100 ;decim3 номер билда (0..999) XOR A LD (DE),A RET -; +; \ No newline at end of file diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM deleted file mode 100644 index 1f0a770..0000000 --- a/SHELL/ERROR.ASM +++ /dev/null @@ -1,303 +0,0 @@ -;------------------------------------------------- -; Вывод сообщения ошибки по индексу -; вход: a=номер ошибки -;------------------------------------------------- -print_err_message: - ld e,a - ld d,0 - inc de - ld hl,ERR0 ; массив строк - ld bc,ERR0.Size ; размер массива - call LCPIR ; найти строку - call PRINTZ ; формат. вывод строки - call newline - jp newline - - - -; Вывод строки ошибки -;A850D: -invalid_param: - ld de,5 ; индекс "Invalid parametr" - jr MESSAGE - - - -;------------------------------------------------- -; Вывод сообщения ошибки по индексу -; вход: de=индекс строки -;------------------------------------------------- -MESSAGE: - call FMESAGE ; найти строку по индексу - jp PRINTZ ; формат. вывод строки - ;jp A82CC ; узнать и уст. полож. курсора - - -; Найти строку по индексу -; вход: de=индекс строки -; выход: hl=строка -FMESAGE: inc de - ld hl,MSG0 ; начало массива строк - ld bc,MSG0.Size ; размер массива -LCPIR: xor a - cpir - ret po - ret nz - ;R11 - XOR A - CP (HL) - JR Z,.no_mess - ; - dec de - ld a,d - or e - jr nz,LCPIR - ret -.no_mess: INC HL - RET - -;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована -;----------------------------------------------------------------------; -; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 -; вход: hl=буфер строки -;----------------------------------------------------------------------; -PRINTZ: ld a,(hl) - inc hl - or a - ret z - cp '%' - jr z,.check_PRM -.char: ld c,Dss.PutChar - RST ToDSS - jp PRINTZ -.bad_PRM: - ld a,'%' - jp .char -.check_PRM: - ld a,(hl) - cp '9'+1 - jr nc,.bad_PRM - inc hl - sub '1' - push hl - ;!TEST - ;ld l,a - ;ld h,0 - ;add hl,hl ;1+1=2 - ;add hl,hl ;2+2=4 - ;add hl,hl ;4+4=8 - ;add hl,hl ;8+8=16 размер отдельного подбуфера - ADD A - ADD A - ADD A - ADD A - LD L,A - LD H,0 - ; - ld bc,PRM1 ; буфер - add hl,bc - ld c,Dss.PChars ; вывод строки - RST ToDSS - pop hl - jp PRINTZ - - - -;!FIXIT перенести к общим буферам как у меня -; буферы аргументов командной строки -PRM1: BLOCK 16,0 ; аргумент %1 -PRM2: BLOCK 16,0 ; аргумент %2 -PRM3: BLOCK 16,0 ; аргумент %3 -PRM4: BLOCK 16,0 ; аргумент %4 -PRM5: BLOCK 16,0 ; аргумент %5 -PRM6: BLOCK 16,0 ; аргумент %6 -PRM7: BLOCK 16,0 ; аргумент %7 -PRM8: BLOCK 16,0 ; аргумент %8 -PRM9: BLOCK 16,0 ; аргумент %9 - - - -;!TODO не забыть заменить цифры на эти метки -DIR1MSG EQU 0 -VERSMSG EQU 1 -DATEMSG EQU 2 -TIMEMSG EQU 3 -PAUSMSG EQU 4 -ILLGMSG EQU 5 -ECHOMSG EQU 6 -ON__MSG EQU 7 -OFF_MSG EQU 8 -DIR2MSG EQU 9 -DIR3MSG EQU 10 -HELPMSG EQU 11 - -MSG0: db 0 -/* 0 */ db "Volume in drive %1 %4 %5",CR,LF - db "Volume Serial Number is %2",CR,LF - db CR,LF,"Directory of %3",CR,LF,LF,0 -/* 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 -/* 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) %4 bytes",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,0 - ;R11 - DB 0 - DZ "Unknown command" - ; -.Size EQU $-MSG0 - -/* -MSG0: DB 0 - DB "Volume in drive %1 has no label",CR,LF ; !FIXIT - DB "Volume Serial number is %2",CR,LF - DB "Directory of %3",CR,LF,CR,LF,0 - DB "Estex DSS: Version %1",CR,LF,0 ;R02 - DB "Current date: %1",CR,LF,0 - DB "Current time: %1",CR,LF,0 - DB "Press any key to continue . . .",CR,LF,0 - DB "Invalid parametr",CR,LF,0 - DB "Echo is %1",CR,LF,0 - DB "on",0 - DB "off",0 - DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 -; FILENAME EXT SIZE DATE TIME - DB "%1 %2 %3 %4 %5",CR,LF,0 - 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,0 - ;R11 - BYTE 0 - DZ "Unknown command" - ; -.Size EQU $-MSG0 - -*/ -;----------------------------------------------------------------------- -;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются -ERR0: DB #00 - DZ "Bad command or file name" - DZ "Invalid function" ; 01 - неверный номер функции - DZ "Invalid drive number" ; 02 - неправильный номер устройства - DZ "File not found" ; 03 - файл не обнаружен - DZ "Path not found" ; 04 - неверный путь - DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "Too many open files" ; 06 - нет свободного файлового манипулятора - DZ "File already exist" ; 07 - файл существует - DZ "File read only" ; 08 - файл только для чтения - DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) - DZ "No free space" ; 10 - нет свободного места на диске - DZ "Directory not empty" ; 11 - каталог не пуст - DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог - DZ "Invalid media" ; 13 - неизвестный формат - DZ "Unknown operation" ;R02 ; 14 - невозможная операция - DZ "Directory exist" ; 15 - каталог уже есть - DZ "Invalid filename" ; 16 - неверное имя - DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл - DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен - DZ "Not ready" ; 20 - нет готовности - DZ "Seek error" ; 21 - ошибка позиционирования - DZ "Sector not found" ; 22 - сектор не найден - DZ "CRC error" ; 23 - ошибка CRC - DZ "Write protect" ; 24 - защита записи - DZ "Read error" ; 25 - ошибка чтения - DZ "Write error" ; 26 - ошибка записи - DZ "Drive failure" ; 27 - сбой диска - DZ "Extended error 28" - DZ "Extended error 29" - DZ "Not enough memory" ; 30 - недостаточно памяти - DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "Extended error 32" - DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной - DZ "Extended error 34" - DZ "Too many files in directory" ; 35 - слишком много файлов в директории - DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation aborted by user" ; 37 - операция прервана пользователем - DZ "Common error" ; 38 - общая ошибка - DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения - DZ "40" - DZ "41" - DZ "42" - DZ "43" - DZ "44" - DZ "45" - DZ "46" - DZ "Wrong video mode" ; 48 - неправильный видеорежим - DZ "48" - DZ "49" - DZ "50" - ;R11 - DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: - DZ "Unknown error" - ; -.Size EQU $-ERR0 -;----------------------------------------------------------------------- -/* -; Сообщения ошибок ДОС -ERR0: db 0 - db "Bad command or file name",0 ;0 - db "Invalid function",0 ;1 - db "Invalid drive number",0 ;2 - db "File not found",0 ;3 - db "Path not found",0 ;4 - db "Invalid handle",0 ;5 - db "Too many open files",0 ;6 - db "File already exist",0 ;7 - db "File read only",0 ;8 - db "Root overflow",0 ;9 - db "No free space",0 ;10 - db "Directory not empty",0 ;11 - db "Can't delete current directory",0 ;12 - db "Invalid media",0 ;13 - db "Unknown operation",0 ;14 - db "Directory exist",0 ;15 - db "Invalid filename",0 ;16 - db "Invalid EXE-file",0 ;17 - db "Not supported EXE-file",0 ;18 - db "Access denied",0 ;19 - db "Not ready",0 ;20 - db "Seek error",0 ;21 - db "Sector not found",0 ;22 - db "CRC error",0 ;23 - db "Write protect",0 ;24 - db "Read error",0 ;25 - db "Write error",0 ;26 - db "Drive failure",0 ;27 - db "Extended error 28",0 ;28 - db "Extended error 29",0 ;29 - db "Not enough memory",0 ;30 - db "Invalid memory block",0 ;31 - db "Extended error 32",0 ;32 - db "Extended error 33",0 ;33 - db "Extended error 34",0 ;34 - db "Too many files in directory",0 ;35 список файлов - db "36",0 ;36 (слишком большая влож. папок или >= 1024 папок) - db "User abort",0 ;37 User abort (операция прервана пользователем) - db "38",0 ;38 - db "39",0 ;39 - db "40",0 ;40 - db "41",0 ;41 - db "42",0 ;42 - db "43",0 ;43 - db "44",0 ;44 - db "45",0 ;45 - db "46",0 ;46 - db "47",0 ;47 - db "48",0 ;48 - db "49",0 ;49 - db "50",0 ;50 -.Size EQU $-ERR0 -*/ diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/EXEC.ASM similarity index 77% rename from SHELL/SHELL_EXEC.ASM rename to SHELL/EXEC.ASM index a8be837..31f4e8e 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -9,11 +9,9 @@ D8374: dw 0 COMP: call EVALCMD ; (batch.asm) ld hl,struct_input_line+5 dec hl - ;ld hl,struct_input_line+4;; ld c,(hl) ; длина строки ld b,0 inc hl ; struct_input_line+5 - ;ld hl,work_buffer+256;; .loop: ld a,(hl) cp " " jr nz,COMP01 @@ -36,50 +34,11 @@ COMP01: ld d,h COMP005: ex af,af' sub c ld c,a - ld hl,CMDLIST ; список команд ДОС-а - ; de=struct_input_line+5, c=длина строки -; от bat-отработки -COMP004: push bc - push de -COMP000: ld a,(de) - cp "a" - jr c,COMP001 - cp "z"+1 - jr nc,COMP001 - and #5F ; a..z -> A..Z -COMP001: cp (hl) - jr nz,COMP002 ; не дос-команды - inc hl - inc de - dec c - jr nz,COMP000 - xor a - cp (hl) - jr nz,COMP002 - pop bc - pop bc - ld a,(de) - cp " " - jr nz,NOSPC - inc de -NOSPC: inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - jp (hl) ; на соотв. обработчик дос-команды - -; Не дос-команды. Тест на задание диска и запуск файла -COMP002: xor a - LD C,A - CPIR - inc hl - inc hl - pop de - pop bc - ld a,(hl) - or a - jr nz,COMP004 ; назад в цикл, еще не дошли конца списка дос-команд + ld hl,CMDLIST ; список команд ДОС-а +.start: call RUN_COMMAND + jr nc,.skip ; NC если не найдена команда + jp (hl) +.skip: ; Не дос-команды. Тест на зад`ание диска и запуск файла ld h,d ld l,e ; hl=struct_input_line+5 @@ -99,7 +58,7 @@ COMP002: xor a cp "z"+1 jr nc,NOUP and #5F ; a..z -> A..Z -;!!!!! тут восстанавливается директория и могут быть глюки на новом ядре +;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS @@ -241,4 +200,5 @@ RESTORE_ALL: CALL Restore_Screen ;R10 ; - RET \ No newline at end of file + RET +; \ No newline at end of file diff --git a/SHELL/Messages/errors.asm b/SHELL/Messages/errors.asm new file mode 100644 index 0000000..da24021 --- /dev/null +++ b/SHELL/Messages/errors.asm @@ -0,0 +1,60 @@ +;----------------------------------------------------------------------- +;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются +ERR0: DB #00 + DZ "Bad command or file name" + DZ "Invalid function" ; 01 - неверный номер функции + DZ "Invalid drive number" ; 02 - неправильный номер устройства + DZ "File not found" ; 03 - файл не обнаружен + DZ "Path not found" ; 04 - неверный путь + DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор + DZ "Too many open files" ; 06 - нет свободного файлового манипулятора + DZ "File already exist" ; 07 - файл существует + DZ "File read only" ; 08 - файл только для чтения + DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) + DZ "No free space" ; 10 - нет свободного места на диске + DZ "Directory not empty" ; 11 - каталог не пуст + DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог + DZ "Invalid media" ; 13 - неизвестный формат + DZ "Unknown operation" ;R02 ; 14 - невозможная операция + DZ "Directory exist" ; 15 - каталог уже есть + DZ "Invalid filename" ; 16 - неверное имя + DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл + DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла + DZ "Access denied" ; 19 - ресурс не доступен + DZ "Not ready" ; 20 - нет готовности + DZ "Seek error" ; 21 - ошибка позиционирования + DZ "Sector not found" ; 22 - сектор не найден + DZ "CRC error" ; 23 - ошибка CRC + DZ "Write protect" ; 24 - защита записи + DZ "Read error" ; 25 - ошибка чтения + DZ "Write error" ; 26 - ошибка записи + DZ "Drive failure" ; 27 - сбой диска + DZ "Extended error 28" + DZ "Extended error 29" + DZ "Not enough memory" ; 30 - недостаточно памяти + DZ "Invalid memory block" ; 31 - несуществующий блок памяти + DZ "Extended error 32" + DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной + DZ "Extended error 34" + DZ "Too many files in directory" ; 35 - слишком много файлов в директории + DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + DZ "Operation aborted by user" ; 37 - операция прервана пользователем + DZ "Common error" ; 38 - общая ошибка + DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения + DZ "40" + DZ "41" + DZ "42" + DZ "43" + DZ "44" + DZ "45" + DZ "46" + DZ "Wrong video mode" ; 48 - неправильный видеорежим + DZ "48" + DZ "49" + DZ "50" + ;R11 + DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: + DZ "Unknown error" + ; +.Size EQU $-ERR0 +;----------------------------------------------------------------------- \ No newline at end of file diff --git a/SHELL/Messages/main.asm b/SHELL/Messages/main.asm new file mode 100644 index 0000000..24315db --- /dev/null +++ b/SHELL/Messages/main.asm @@ -0,0 +1,44 @@ +;!TODO не забыть заменить цифры на эти метки +MAIN_MSG: +.DIR_1 EQU 0 +.VERSION EQU 1 +.DATE EQU 2 +.TIME EQU 3 +.PAUSE EQU 4 +.INVALID EQU 5 +.ECHO EQU 6 +.ON EQU 7 +.OFF EQU 8 +.DIR_2 EQU 9 +.DIR_3 EQU 10 +.HELP EQU 11 +.CALCULATING EQU 12 + +.TABLE: db 0 +/* 0 */ db "Volume in drive %1 %4 %5",CR,LF + db "Volume Serial Number is %2",CR,LF + db CR,LF,"Directory of %3",CR,LF,LF,0 +/* 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 +/* 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 +/* 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 + ;R11 + DB 0 + DZ "Unknown command" + ; +.TABLE.Size EQU $-.TABLE +; \ No newline at end of file diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM new file mode 100644 index 0000000..3d84414 --- /dev/null +++ b/SHELL/Procedures/Print.ASM @@ -0,0 +1,118 @@ +;------------------------------------------------- +; Вывод сообщения ошибки по индексу +; вход: a=номер ошибки +;------------------------------------------------- +print_err_message: + ld e,a + ld d,0 + inc de + ld hl,ERR0 ; массив строк + ld bc,ERR0.Size ; размер массива + call LCPIR ; найти строку + call PRINTZ ; формат. вывод строки + call newline + jp newline + + + +; Вывод строки ошибки +;A850D: +invalid_param: + ld de,MAIN_MSG.INVALID ; индекс "Invalid parametr" + jr MESSAGE + + + +;------------------------------------------------- +; Вывод сообщения ошибки по индексу +; вход: de=индекс строки +;------------------------------------------------- +MESSAGE: + call FMESAGE ; найти строку по индексу + jp PRINTZ ; формат. вывод строки + ;jp A82CC ; узнать и уст. полож. курсора + + +; Найти строку по индексу +; вход: de=индекс строки +; выход: hl=строка +FMESAGE: inc de + ld hl,MAIN_MSG.TABLE ; начало массива строк + ld bc,MAIN_MSG.TABLE.Size ; размер массива +LCPIR: xor a + cpir + ret po + ret nz + ;R11 + XOR A + CP (HL) + JR Z,.no_mess + ; + dec de + ld a,d + or e + jr nz,LCPIR + ret +.no_mess: INC HL + RET + +;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована +;----------------------------------------------------------------------; +; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 +; вход: hl=буфер строки +;----------------------------------------------------------------------; +PRINTZ: ld a,(hl) + inc hl + or a + ret z + cp '%' + jr z,.check_PRM +.char: ld c,Dss.PutChar + RST ToDSS + jp PRINTZ +.bad_PRM: + ld a,'%' + jp .char +.check_PRM: + ld a,(hl) + cp '9'+1 + jr nc,.bad_PRM + inc hl + sub '1' + push hl + ;!TEST + ;ld l,a + ;ld h,0 + ;add hl,hl ;1+1=2 + ;add hl,hl ;2+2=4 + ;add hl,hl ;4+4=8 + ;add hl,hl ;8+8=16 размер отдельного подбуфера + ADD A + ADD A + ADD A + ADD A + LD L,A + LD H,0 + ; + ld bc,PRM1 ; буфер + add hl,bc + ld c,Dss.PChars ; вывод строки + RST ToDSS + pop hl + jp PRINTZ + + + + +;!FIXIT перенести к общим буферам как у меня +; буферы аргументов командной строки +PRM1: BLOCK 16,0 ; аргумент %1 +PRM2: BLOCK 16,0 ; аргумент %2 +PRM3: BLOCK 16,0 ; аргумент %3 +PRM4: BLOCK 16,0 ; аргумент %4 +PRM5: BLOCK 16,0 ; аргумент %5 +PRM6: BLOCK 16,0 ; аргумент %6 +PRM7: BLOCK 16,0 ; аргумент %7 +PRM8: BLOCK 16,0 ; аргумент %8 +PRM9: BLOCK 16,0 ; аргумент %9 +; \ No newline at end of file diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm new file mode 100644 index 0000000..9e3ac42 --- /dev/null +++ b/SHELL/Procedures/math.asm @@ -0,0 +1,76 @@ +;----------------------------------------------------------------------; +; Вывод 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 +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +;!FIXIT есть дубль hex2dec_ascii_16bit +; вход: hl=число, de=буфер +hex2dec_ascii_16bit: +.n10: ld ix,.tmp1 + res 7,(ix+0) + jr .decim + ; +.n10000: ld ix,.tmp1 + res 7,(ix+0) + ld bc,100 + call .num16 + jr .skip1 + ; +.n1000: ld ix,.tmp1 + res 7,(ix+0) +.skip1: ld bc,100 + call .num16 + jr .skip2 + ; +.n100: ld ix,.tmp1 + res 7,(ix+0) +.skip2: ld bc,100 + call .num16 + ; +.decim: ld bc,10 + call .num16 + ld a,l + add a,"0" + jr .num16_exit + ; +.num16: ld a,'0'-1 + and a + inc a + sbc hl,bc + jr nc,$-3 + add hl,bc + cp "0" + jr z,$+6 + set 7,(ix+0) + bit 7,(ix+0) + ret z +.num16_exit: + ld (de),a ; сохр. в буфере + inc de + ret + ; +.tmp1: BYTE 0 +;----------------------------------------------------------------------; diff --git a/SHELL/Procedures/parsers.asm b/SHELL/Procedures/parsers.asm new file mode 100644 index 0000000..826fe41 --- /dev/null +++ b/SHELL/Procedures/parsers.asm @@ -0,0 +1,113 @@ +//////////////////////////////////////////////////////////////////////// +; Вход: hl - список команд формата: "строка",0,cmd_addr +; de - строка с командой +; c - длина строки +; Выход: CF=1 - в HL адрес команды на исполнение +; CF=0 - нет опознаной команды +RUN_COMMAND: + push bc + push de + ; +.loop: ld a,(de) + cp "a" + jr c,.skip + cp "z"+1 + jr nc,.skip + and %0101'1111 ; a..z -> A..Z +.skip: cp (hl) + jr nz,.not_cmd ; не команда + inc hl + inc de + dec c + jr nz,.loop + ; + xor a + cp (hl) + jr nz,.not_cmd + pop bc + pop bc + ld a,(de) + cp " " + jr nz,.no_sp + inc de +.no_sp: inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + scf ; маркер опознаной команды + ret + ;jp (hl) ; на соотв. обработчик команды +.not_cmd: + xor a + LD C,A + CPIR + inc hl + inc hl + pop de + pop bc + ld a,(hl) + or a + jr nz,RUN_COMMAND ; назад в цикл, еще не дошли конца списка дкоманд + ret + ; +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// +; Вход: hl - список ключей формата: "строка",cmd_addr +; de - строка с командой +; c - длина строки с командой +; Выход: CF=1 - в HL адрес ключа на исполнение +; CF=0 - нет опознаного ключа +RUN_OPTION: +.cont: EX DE,HL + LD B,C +.loop: LD A,(HL) + CP '/' ; + INC HL + JR Z,.got + AND A + RET Z + DJNZ .loop + ; not found key + AND A + RET + ; +.got: LD C,B + INC HL + LD A,(HL) + DEC C + CP ' ' + JR Z,.good + AND A + JR NZ,RUN_OPTION.loop + LD C,1 + ; +.good: push hl + dec hl + ld b,cmd_dir_options.Size ;!HARDCODE + ex de,hl + ld a,(de) + OR %0010'0000 + ld de,cmd_dir_options.paramLength ;!HARDCODE + ; +.find: cp (hl) + jr z,.found + add hl,de + djnz .find + ; not found + pop hl + jr RUN_OPTION + ; found +.found: pop de + LD B,C + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + scf ; маркер опознаной опции + ret + +//////////////////////////////////////////////////////////////////////// diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index a0f5008..58f6514 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -443,9 +443,9 @@ A895A: cp "0" sub "0" ret - +;!FIXIT есть дубл A8964: ld de,10000 - ld a,0C8h ; ret z + ld a,#C8 ; ret z ld (D8996),a call A898E ld de,1000 @@ -521,28 +521,33 @@ T8C21: db "ON",0 T8C24: db "OFF",0 - include "edline.asm" ; строка редактирования - include "batch.asm" ; парсинг bat-файлов - include "shell_exec.asm" ; выполн. введ. команд с консоли - include "error.asm" ; функции вывода сообщений ошибок + include 'edline.asm' ; строка редактирования + include 'batch.asm' ; парсинг bat-файлов + include 'exec.asm' ; выполн. введ. команд с консоли + include 'procedures/print.asm' ; функции вывода сообщений + include 'messages/errors.asm' ; сообщения об ошибках + include 'messages/main.asm' ; сообщения + include 'procedures/parsers.asm' ; функции прочесывания и выбора + include 'procedures/math.asm' ; функции математические + ; - include "Commands/exit.asm" ; выход в родит. процесс - include "Commands/pause.asm" ; пауза - include "Commands/rem.asm" ; комментарий - include "Commands/ver.asm" ; вывод версии ДОС - include "Commands/cls.asm" ; очистка экрана - include "Commands/date.asm" ; вывод или установка даты/времени - include "Commands/dir.asm" ; вывод списка директории - include "Commands/chdir.asm" ; смена тек. каталога - include "Commands/mkdir.asm" ; создание каталога - include "Commands/rmdir.asm" ; удаление каталога - include "Commands/del.asm" ; удаление файла - include "Commands/ren.asm" ; переименование файла или каталога - include "Commands/echo.asm" ; эхо-режим - include "Commands/help.asm" ; вывод экрана помощи - include "Commands/path.asm" ; задать сист. путь - include "Commands/set.asm" ; задать переменную окружения - include "Commands/reboot.asm" ; софт ресет + include 'Commands/exit.asm' ; выход в родит. процесс + include 'Commands/pause.asm' ; пауза + include 'Commands/rem.asm' ; комментарий + include 'Commands/ver.asm' ; вывод версии ДОС + include 'Commands/cls.asm' ; очистка экрана + include 'Commands/date.asm' ; вывод или установка даты/времени + include 'Commands/dir.asm' ; вывод списка директории + include 'Commands/chdir.asm' ; смена тек. каталога + include 'Commands/mkdir.asm' ; создание каталога + include 'Commands/rmdir.asm' ; удаление каталога + include 'Commands/del.asm' ; удаление файла + include 'Commands/ren.asm' ; переименование файла или каталога + include 'Commands/echo.asm' ; эхо-режим + include 'Commands/help.asm' ; вывод экрана помощи + include 'Commands/path.asm' ; задать сист. путь + include 'Commands/set.asm' ; задать переменную окружения + include 'Commands/reboot.asm' ; софт ресет ; DISPLAY "Empty space for buffers from ",/H,$ work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes diff --git a/SHELL/build.txt b/SHELL/build.txt index 405e057..83981c0 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -127 \ No newline at end of file +175 \ No newline at end of file