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