From 81595cbb58969a57136346a5190707b060b73f07 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 15 Dec 2023 03:23:09 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB=D0=BA=D0=B0=20cm?= =?UTF-8?q?d=5Fbreak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 54 ++++++++++++++--------------- DSS/CHANGES.LOG | 4 +-- DSS/KEYINTER.ASM | 35 +++++++++++-------- DSS/KNOWN.BUG | 4 +-- SHELL/BATCH.ASM | 74 ++++++++++++++++++++++------------------ SHELL/Commands/BREAK.ASM | 17 ++++++--- SHELL/Commands/REM.ASM | 5 ++- SHELL/EXEC.ASM | 19 ++++++----- SHELL/SHELL.ASM | 17 ++++----- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 11 files changed, 127 insertions(+), 106 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index bd19f1c..761617c 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -61,8 +61,8 @@ BEGIN: in a,(SLOT3) ld (port+1),a ; сохр. порт push ix call save_path ; сохр. тек. диск и путь - ld c,0 ; узнать версию ДОС - rst 10h + ld c,Dss.Version ; узнать версию ДОС + RST ToDSS ex de,hl ; hl=тек. версия ld de,#013C ; 1.60 d=версия, e=модификация, bc - номер сборки. de = #013E, bc = #0064 dos ver 1.62.100 and a @@ -83,7 +83,7 @@ version_ok: xor a ; ld (disk),a ; заданный номер диска ; узнать номер boot-диска системы ld bc,0009h - rst 10h + RST ToDSS ld (boot_disk),a ; диск (A=0,B=1,..) ; проверить на совпадение дисков ld hl,disk @@ -99,7 +99,7 @@ version_ok: xor a ; add a,'A' ld (hl),a ld c,1Dh ; смена каталога - rst 10h + RST ToDSS ;-------------------------------------------- ; Чтение файла system.exe ;-------------------------------------------- @@ -109,7 +109,7 @@ version_ok: xor a ; ; освоб. блок памяти read_file_err: ld a,(id_blck) ; идентиф. блока памяти ld c,3Eh - rst 10h + RST ToDSS ld a,-1 ; код ошибки jp exit @@ -127,7 +127,7 @@ read_file1_ok: ld hl,file_handle ; ; освоб. блок памяти system.exe file_err1: ld a,(id_mem) ; идентиф. блока памяти ld c,3Eh - rst 10h + RST ToDSS jr read_file_err ; освоб. блок памяти system.dos read_file2_ok: @@ -144,7 +144,7 @@ confirm_flag+*: ld a,0 ld a,5 ; индекс строки "Insert destination disk..." call print_string ld bc,3035h ; ждем нажатия клавиши - rst 10h + RST ToDSS no_confirm: ld a,2 ; индекс строки "Installing boot loader..." call print_string ; Уст. целевой диск/путь @@ -153,7 +153,7 @@ no_confirm: ld a,2 ; add a,'A' ld (hl),a ld c,1Dh ; смена тек. каталога - rst 10h + RST ToDSS ;-------------------------------------------- ; Записать boot-загрузчик call write_boot_loader @@ -170,7 +170,7 @@ no_confirm: ld a,2 ; ok_write1: ; освободить память ld a,(id_blck) ; блок system.dos ld c,3Eh - rst 10h + RST ToDSS ; ; загр. раб. ячейки ld hl,hFile1 ; откуда @@ -184,7 +184,7 @@ ok_write1: ; push af ld a,(id_blck) ; блок system.exe ld c,3Eh - rst 10h + RST ToDSS pop af jr c,exit ; ошибка ; @@ -205,7 +205,7 @@ ok_write1: ; ld a,6 ; индекс строки "Insert system disk..." call print_string ld bc,3035h ; ждем нажатия клавиши - rst 10h + RST ToDSS xor a ; код "Ok" exit: push af call restore_path ; восст. тек. диск и путь @@ -214,7 +214,7 @@ port: ld a,-1 ; pop af ld c,41h ; выход в ДОС ld b,a - rst 10h + RST ToDSS jr $ @@ -356,7 +356,7 @@ get_drive_letter: inc hl ; буфер строки ld de,buffer ; буфер для выдел. параметра ld c,43h ; выделить параметр ком. строки - rst 10h + RST ToDSS ld de,buffer ld a,(de) inc de @@ -390,11 +390,11 @@ get_drive_err: scf ; ; сохр. тек. системный диск и путь ;---------------------------------------------------- save_path: ld c,2 ; узнать диск - rst 10h + RST ToDSS ld (sys_disk),a ld hl,sys_path ld c,1Eh ; узнать путь - rst 10h + RST ToDSS ret @@ -403,10 +403,10 @@ save_path: ld c,2 ; узн ;---------------------------------------------------- restore_path: ld a,(sys_disk) ld c,1 ; смена диска - rst 10h + RST ToDSS ld hl,sys_path ld c,1Dh ; смена пути - rst 10h + RST ToDSS ret @@ -483,7 +483,7 @@ endmess: db 0 ; вход: a=индекс строки print_string: call get_string ; поиск строки по ее индексу в 'a' ld c,5Ch ; вывод строки - rst 10h + RST ToDSS ret @@ -514,7 +514,7 @@ get_loop: ex af,af' ;==================================================== read_file: ld a,1 ; на чтение ld c,11h ; открыть файл - rst 10h + RST ToDSS jr nc,ok ; без ошибок ld a,9 ; индекс "Can't open file" call print_string @@ -524,7 +524,7 @@ ok: ld (file_handle),a ; ld hl,0 ld ix,0 ld bc,0215h ; указатель на конец файла - rst 10h + RST ToDSS ld (hsize),hl ; ст.разряд размера файла ld (lsize),ix ; мл.разряд call get_memory ; расч. и выдел. страницы под файл @@ -532,7 +532,7 @@ ok: ld (file_handle),a ; call file_to_bank ; загр. файл в страницы close_file: ld a,(file_handle) ; дескр. файла ld c,12h ; закрыть файл - rst 10h + RST ToDSS ret ; not_enough: call close_file @@ -574,7 +574,7 @@ malloc2: or a ; выделить блок памяти ld b,c ; b=число страниц ld c,3Dh - rst 10h + RST ToDSS ld (id_blck),a ; идентиф. блока ret @@ -586,7 +586,7 @@ file_to_bank: ld hl,0 ld ix,0 ld a,(file_handle) ; дескр. файла ld bc,0015h ; указатель на начало файла - rst 10h + RST ToDSS ld a,(id_blck) ; идентиф. блока памяти ld b,0 ; лог. номер страницы в блоке ld c,0C4h ; получить физ. номер страницы в блоке @@ -598,7 +598,7 @@ loop_to_bank: push af ld de,4000h ; сколько ld a,(file_handle) ; дескр. файла ld c,13h ; читать файл - rst 10h + RST ToDSS pop bc jr nc,ok_to_bank ld a,12 ; индекс "Reading error" @@ -626,7 +626,7 @@ ok_to_bank: cp -1 ; ;==================================================== write_file: ld a,20h ; атрибут "архивный" ld c,0Ah ; создать файл - rst 10h + RST ToDSS jr nc,create_ok ; без ошибок ld a,13 ; индекс "Can't create file" call print_string @@ -662,7 +662,7 @@ write_loop: push af ld de,4000h ; сколько ld a,(file_handle) ; дескр. файла ld c,14h ; запись файла - rst 10h + RST ToDSS pop bc jr nc,write_ok ld a,14 ; индекс "Writing error" @@ -689,7 +689,7 @@ write_end: pop af ; ld hl,page_buffer ; #C000 откуда ld a,(file_handle) ; дескр. файла ld c,14h ; запись файла - rst 10h + RST ToDSS ret diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index a87e1be..4ea1f7b 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -13,7 +13,7 @@ [ ] перед началом работы любой процедуры записи/чтения драйва устанавливать флаг, чтоб не было повторного вызова (из прерывания, например) [ ] блокировка файлов в файловых манипуляторах (чтоб не открывать на запись уже открытый на запись файл, например) Среднее: -[x] ;!TEST перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле +[x] перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле [ ] начать работать с функциями REMOVABLE и MEDIA CHECK rst #18. Возвращать значение #FF, если порядок букв изменился Вообще не важное: @@ -23,7 +23,7 @@ DSS 1.70.2 Изменения после версии 1.70 CORE: - [+] при чтении/записи файла не происходит "холостое" перечитывание кластеров от начала файла + [+] при чтении/записи файла не происходит "холостое" перечитывание FAT от начала файла [+] перечитывание BPB теперь делается не на каждый чих, а когда надо (и бага при загрузке с диска "B:" нет :-P ) [+] изменена работа с RAM DISK, теперь он может быть загрузочным [+] исправлены баги в функциях: WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 83a24a0..c6a7716 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -816,20 +816,27 @@ RTAB EX DE,HL ; ` ; 0 -; Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Back -; 1 2 3 4 5 6 7 8 9 A B C D E -; Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" -; F 10 11 12 13 14 15 16 17 18 19 1A 1B -; Cps,"A","S","D","F","G","H","J","K","L",";","'",Enter -; 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 -; LSh,"Z","X","C","V","B","N","M",",",".","/",RSh,#5C -; 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 -; LCl,LAt,SPC,Rat,RCl,F01,F02,F03,F04,F05,F06,F07,F08 -; 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 -; F09,F10,F11,F12,prn,scr,num,"/","*","-","+",ent,Del -; 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F -; Ins,End,Dwn,PgD,Lft,"5",Rgh,Hom,Upp,PgU -; 50 51 52 53 54 55 56 57 58 59 +; Esc, "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", Back +; 1 2 3 4 5 6 7 8 9 A B C D E + +; Tab, "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]" +; F 10 11 12 13 14 15 16 17 18 19 1A 1B + +; Cps, "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'", Enter +; 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 + +; LSh, "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/", RSh, #5C +; 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 + +; LCl, LAt, SPC, Rat, RCl, F01, F02, F03, F04, F05, F06, F07, F08 +; 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 + +; F09, F10, F11, F12, prn, scr, num, "/", "*", "-", "+", ent, Del +; 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + +; Ins, End, Dwn, PgD, Lft, "5", Rgh, Hom, Upp, PgU +; 50 51 52 53 54 55 56 57 58 59 +; ; ;================================ Esc EQU #1B diff --git a/DSS/KNOWN.BUG b/DSS/KNOWN.BUG index 1356b17..5f96bcc 100644 --- a/DSS/KNOWN.BUG +++ b/DSS/KNOWN.BUG @@ -1,9 +1,9 @@ FIXED: + function WINCOPY & WINREST не запрещают прерывания перед вызовом BIOS (используется вывод стеком!). -- при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции! + + при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции! -+ ошибка в функции SCROLL A=0. +? ошибка в функции SCROLL A=0. + ошибка при просмотре каталога в функциях установки атрибутов пропускаются системные файлы. п/п SEARCH MASK=#23 diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index c77fed2..919a011 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -13,27 +13,21 @@ echo_mode: ;T98B9: ds 256 - IF 0 - CALL RUN_BAT - CALL BATCH - CALL MAKE_BATCH_PRM_ARRAY - CALL NEWLINE - CALL CMDMODE - CALL EVALCMD - CALL RUN_BAT - ENDIF + ; IF 0 + ; CALL RUN_BAT + ; CALL BATCH + ; CALL MAKE_BATCH_PRM_ARRAY + ; CALL NEWLINE + ; CALL CMDMODE + ; CALL EVALCMD + ; CALL RUN_BAT + ; ENDIF ;------------------------------------------------- ; Запуск bat-файла ; вход: hl=имя файла ;------------------------------------------------- RUN_BAT: - ; [ ] 11/12/23 вложенные bat -;.level+1: - ; LD A,(BAT_FM) - ; OR A - ; jr nz,.new_process - ; ; call BATCH jp c,A83DD ; ошибка откр. файла (cpp.asm) ret @@ -170,30 +164,34 @@ BATCH: ; Выполнение команд BAT-файла ;--------------------------------------------------- NEWLINE: + LD (cmd_break.sp),SP ; [ ] 11/12/23 cmd_break + ; ld de,struct_input_line+5 ;!HARDCODE .ADDBAT: push de call READBAT ; прочитать 128 байт из файла в "work_buffer1" pop de + ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку + jp c,cmd_break.exit or a ; a=число прочит. байт jr nz,.BATLINE + ; ex de,hl ld de,struct_input_line+5 sbc hl,de - jr z,.exit; ;[x] убран баг с незакрытым BAT-файлом + jp z,cmd_break.exit; ;[x] убран баг с незакрытым BAT-файлом ld a,l ld (struct_input_line+4),a ; длина строки - PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break - call CMDMODE ; тест на bat-команды "rem","pause" + call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - POP HL ; [ ] 11/12/23 для баланса стека в cmd_break -.exit: ld a,(BAT_FM) ; дескр. bat-файла - ld c,Dss.Close ; закрыть файл - ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - RST ToDSS - xor a - ld (BAT_FM),a - ret + JP cmd_break.exit +; .exit: ld a,(BAT_FM) ; дескр. bat-файла +; ld c,Dss.Close ; закрыть файл +; ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat +; RST ToDSS +; xor a +; ld (BAT_FM),a +; ret ; .BATLINE: ld hl,work_buffer1 @@ -207,7 +205,7 @@ NEWLINE: sbc hl,de ld a,l ld (struct_input_line+4),a ; длина строки - call CMDMODE ; тест на bat-команды "rem","pause" + call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat ld de,struct_input_line+5 @@ -223,7 +221,12 @@ NEWLINE: ; de=куда ;------------------------------------------------- MOVWORD: -.count+1: ld a,0 ; (число прочит. байт из файла)/128 +.count+1: ld a,0 ; число прочит. байт из файла + ; [ ] 15/12/23 exit if 0 + OR A + SCF + RET Z + ; ld b,a .loop: ld a,(hl) ld (de),a @@ -243,6 +246,8 @@ MOVWORD: push de call READBAT ; прочитать 128 байт из файла pop de + ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку + RET C ;ld hl,BATBUFF ; 128 буфер (ccp.asm) "work_buffer1" ld hl,work_buffer1 ld b,a ; число прочит. байт @@ -262,13 +267,14 @@ READBAT: ld a,e ; [x] 28/09/23 JR NC,1F - XOR A + ;!TODO доделать тут нормальную проверку на облом с чтением файла, сохранять ошибку + LD A,0 ; сохраняем флаг CF ; -1: ld (MOVWORD.count),a ; (число прочит. байт из файла)/128 +1: ld (MOVWORD.count),a ; число прочит. байт из файла ret -; Тест на bat-команды "rem","pause" +; Тест на bat-команды ; должен соблюдаться баланс стека для cmd_break CMDMODE: ;xor a @@ -377,11 +383,11 @@ CMDMODE: .A8286: ex af,af' sub c ld c,a ; длина слова или строки ? - ld hl,BATLIST ; команды "pause","rem" + dos-команды + ld hl,BATLIST ; команды bat + dos-команды + ; ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - jp COMP005.start - + jp COMP.start ; должна убрать конц. пробелы и уст. длину строки, если урезалась EVALCMD: xor a diff --git a/SHELL/Commands/BREAK.ASM b/SHELL/Commands/BREAK.ASM index 3753220..147454d 100644 --- a/SHELL/Commands/BREAK.ASM +++ b/SHELL/Commands/BREAK.ASM @@ -1,8 +1,15 @@ ; [ ] 11/12/23 cmd_break: - pop hl ; восстановление баланса стека - pop hl ; восстановление баланса стека - XOR A - ld (MOVWORD.count),a + ; pop hl ; восстановление баланса стека + ; pop hl ; восстановление баланса стека + ; XOR A + ; ld (MOVWORD.count),a +.sp+1: LD SP,0 ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - JP NEWLINE.exit \ No newline at end of file +.exit: ld a,(BAT_FM) ; дескр. bat-файла + ld c,Dss.Close ; закрыть файл + RST ToDSS + xor a + ld (BAT_FM),a + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat + ret \ No newline at end of file diff --git a/SHELL/Commands/REM.ASM b/SHELL/Commands/REM.ASM index 5dbfaad..4e20788 100644 --- a/SHELL/Commands/REM.ASM +++ b/SHELL/Commands/REM.ASM @@ -3,5 +3,8 @@ ; REM. Комментарий (в bat-файле) ; ;/////////////////////////////////////////////////// -cmd_rem: ret +cmd_rem:; [ ] 15/12/23 может и не понадобится + AND A + ; + ret ; diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index eba849b..a51ebaa 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -14,13 +14,13 @@ COMP: call EVALCMD ; (batch.asm) inc hl ; struct_input_line+5 .loop: ld a,(hl) cp " " - jr nz,COMP01 + jr nz,.COMP01 inc hl dec c jr nz,.loop ret - ; -COMP01: ld d,h +.COMP01: + ld d,h ld e,l add hl,bc ld (hl),0 @@ -29,16 +29,17 @@ COMP01: ld d,h ex af,af' ld a," " cpir - jr nz,COMP005 + jr nz,.COMP005 inc c -COMP005: ex af,af' +.COMP005: + ex af,af' sub c ld c,a ld hl,CMDLIST ; список команд ДОС-а .start: call RUN_COMMAND jr nc,.skip ; NC если не найдена команда jp (hl) -.skip: ; Не дос-команды. Тест на зад`ание диска и запуск файла +.skip: ; Не дос-команды. Тест на задание диска и запуск файла ld h,d ld l,e ; hl=struct_input_line+5 @@ -54,11 +55,11 @@ COMP005: ex af,af' jr nz,RUN_EXT ; задан не диск ld a,b ; 1-й символ cp "a" - jr c,NOUP + jr c,.NOUP cp "z"+1 - jr nc,NOUP + jr nc,.NOUP and #5F ; a..z -> A..Z -NOUP: sub "A" ; номер диска +.NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; вывод сообщения diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 2a83c3f..7ad3fb7 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -117,25 +117,22 @@ shell: bit 6,a ; 6-й бит (вводились дополн. параметры) jr z,back_to_parent_process ; вводились дополн. параметры - PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break call CMDMODE ; (batch.asm) выполн. команду или запустить файл ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - POP HL ; [ ] 11/12/23 для баланса стека в cmd_break call Get_Path ; узнать и сохр. тек. диск и путь ; ; Вернуться в родит. процесс back_to_parent_process: ; [ ] 11/12/23 вложенные bat - LD B,0 - JR NC,1F + and a +.saveA: LD B,0 + JR NC,.exit LD B,A -1: ld c,Dss.Exit +.exit: ld c,Dss.Exit ;ld bc,0*256 + Dss.Exit ; JP ToDSS - ;ret - @@ -164,7 +161,7 @@ option_c: ;POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - jr back_to_parent_process ; вернуться в родит. процесс + jr back_to_parent_process.saveA ; вернуться в родит. процесс @@ -213,10 +210,10 @@ GET_CMD: ex de,hl ; hl=длина строки, de=строка add hl,de ; убрать концевые пробелы - dec hl +.loop1: dec hl ld a,(hl) cp " " - jr z,$-4 + jr z,.loop1 inc hl ld (hl),0 ; в конец ком-строки .NEXTPRM: diff --git a/SHELL/build.txt b/SHELL/build.txt index 53c7311..022e7e6 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -286 \ No newline at end of file +288 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 3bc92f2..066f9ee 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3bc92f2ea2e0080f243fdeda4e46db545e657ba1 +Subproject commit 066f9ee8b6aa8cc9d4ca5a03c8778fe5a075e304