; Последняя редакция: 22.10.2006 ; ; - Исправлен фирм. баг, при котором строка в bat-файле, длиннее ширины ; экрана, обрезалась по ширине экрана и остаток строки не выводился. ; - Исправлен фирм. баг, при котором в команде "dir" строка выводимого ; пути имела макс. 15 символов. ; - Пофиксено неверное изменение диска/пути после ошибок выполнения команд. ; - Добавлена команда "ECHO." для вставки пустой строки. ; - Команда DIR выводит метку и серийный номер дисков. ; ; ; SYSTEM.EXE /S /P ; ; /P Primary command processor ; /S Secondary command processor ; /C Execute batch file ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] ;R14 22-09-2023 BAO Исправлен баг "File not found" в команде DIR на пустом разделе ;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION ;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти ;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET ;R07 14-12-2002 DNS PARSING BATCH LINE ;R06 12-12-2002 DNS ADD %0, %1, %2 ... ;R05 11-12-2002 DNS IMPLEMENTED %VAR% ;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE ;R03 11-12-2002 DNS NEW VERSION ;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES ;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO ;=====================================================================[] includelua 'Shared_includes/lua/Functions.lua' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'SHELL/version.inc' ; ; Program EQU section ;---------------------------------------------------------------------[] CR EQU 13 LF EQU 10 true EQU 1 false EQU 0 Loader_length EQU 0 code_addr EQU shell program_start EQU shell stack_point EQU #BFFE org_addr EQU #8000 + CLP_Buffer ;---------------------------------------------------------------------[] ; ;work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ; 128 bytes ;work_buffer2 equ entry - 256 ; 3-й раб. буфер ; 256 bytes ; org 7F00h ; db "EX" ; exe ID ; db 45h ; exe тип ; db 0 ; exe версия ; dw 512 ; 512, мл. смещ. кода ; dw 0 ; ст. смещ. кода ; dw 0 ; end-beg, первичный загрузчик ; dw 0,0,0 ; резерв ; dw entry ; адрес загрузки кода ; dw shell ; адрес передачи управления ; dw #BFFE ; адрес стека ; ds 490 ; резерв ; Версия/Модификация/Билд шелла ;entry: db "0.01.003" ;!FIXIT перенести в конец INCLUDE 'Shared_Includes/constants/EXE_Header.z80' ORG org_addr ;============================================================== ; Точка входа в Шелл ;============================================================== shell: ;!TODO merge: активировать когда буферы будут через структуру, а не нулями ;LD HL,WORK_BUFFERS ;LD DE,WORK_BUFFERS+1 ;LD BC,BUFFERS_STRUCT-1 ;LD (HL),0 ;LDIR ; ; сохр. уровень тек. шелла ld a,(ix-1) ld (cmd_exit.TASKX),a push ix call Get_Path ; сохр. тек. диск и путь pop hl ; hl=ix ; ; Тест на опции запуска самого шелла call GET_CMD ld a,(RUNMODE) ; бит-флаги опций bit 7,a ; "P" 7-й бит (идет вызов из boot-загрузчика) jr nz,FPRIMAR bit 5,a ; "S" 5-й бит (запуск 2-й копии шелла) ;jp nz,option_s jr nz,run_shell bit 4,a ; "C" 4-й бит (выполнить bat-файл) jr nz,option_c 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 LD B,A 1: ld c,Dss.Exit ;ld bc,0*256 + Dss.Exit ; JP ToDSS ;ret ;--------------------------------------------------------------- ; Опция "S". Запуск 2-й копии шелла. Без отработки AUTOEXEC.BAT. ; Можно выйти по EXIT. ;--------------------------------------------------------------- ; option_s: ; call cmd_version ; версия ДОС ; jr run_shell ;--------------------------------------------------------------- ; Опция "C". Выполнить BAT-файл. ; После выполнения файла, возвращается в родительский процесс. ;--------------------------------------------------------------- option_c: ;ld hl,T96AE ; имя bat-файла, 256 буфер (inline.asm) ;ld hl,work_buffer+256;; ld hl,struct_input_line+5 ; имя bat-файла call BATCH ; обработка bat-файла (batch.asm) ;PUSH AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата ;call save_disk_path ; узнать и сохр. тек. диск и путь ;POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat jr back_to_parent_process ; вернуться в родит. процесс ;--------------------------------------------------------------- ; Опция "P". Запуск копии шелла. С отработкой AUTOEXEC.BAT. ; С ней идет вызов шелла из boot-загрузчика. ; Можно выйти по EXIT, но не из запущенного boot-загрузчиком. ;--------------------------------------------------------------- FPRIMAR: ld c,Dss.CTRLKey ; узнать сост. клавы в данный момент RST ToDSS ld hl,autoexec_fname ; имя файла "system.bat" ld a,b and #C0 ; нажаты Shift-ы ? call z,BATCH ; нет, выполнить bat-файл (batch.asm) ;============================================================== ; Запуск копии шелла ;============================================================== run_shell: call newline run_shell_loop: ;call A82CC ; узнать и уст. полож. курсора ; вывести тек.сист. путь и войти в строку редактирования call Get_Path ; узнать и сохр. тек. диск и путь run_shell_loop1: call input_line call newline ; на новую строку ld a,(struct_input_line+4) ; число введ. символов or a jr z,run_shell_loop1 ; пустая ; Парсинг и выполнение команд call COMP jr run_shell_loop ; назад в цикл ; Тест опций шелла ; вход: hl=адрес ком-строки GET_CMD: ld e,(hl) ; длина строки inc hl ld d,0 ex de,hl ; hl=длина строки, de=строка add hl,de ; убрать концевые пробелы dec hl ld a,(hl) cp " " jr z,$-4 inc hl ld (hl),0 ; в конец ком-строки .NEXTPRM: ex de,hl ; hl=тек. адрес в строке .SKIPSP: ld a,(hl) inc hl cp " " ret c jr z,.SKIPSP dec hl cp '/' ; опция jr nz,.PROCESS ld de,work_buffer1 ; 128 буфер для параметра ld c,Dss.GSwitch ; выдел. параметр ком-строки RST ToDSS push af ex de,hl ld hl,work_buffer1 ; 128 буфер для параметра inc hl call set_option_flag ; уст. биты флагов pop af jr nc,.NEXTPRM ret ; уст. бит-флаг .PROCESS: ld a,(RUNMODE) set 6,a ; 6-й бит (вводились дополн. параметры) ;!HARDCODE ld (RUNMODE),a ; скопир. параметр из ком-строки ; в буфер строки редактирования ;copy_to_input_line: ld iy,struct_input_line ; структура буфера ~input line~ push hl call clear_inpline ; обнулить структуру "input line" pop de ; de=хвост строки .loop: ld hl,struct_input_line ; структура буфера ~input line~ ld a,(iy+2) ; X тек. полож. курсора в строке add a,(iy+3) add a,l ld l,a jr nc,1F inc h 1: inc hl inc hl inc hl inc hl inc hl ld a,(de) ; символ из строки ld (hl),a or a ret z ; конец строки inc (iy+4) ; число введ. символов inc (iy+2) ; X тек. полож. курсора в строке ld a,(width_inpline) ; ширина поля ввода cp (iy+2) ; X тек. полож. курсора в пределах строки jr nz,2F ; курсор за правым краем поля ввода inc (iy+3) ; смещ. строки за левый край dec (iy+2) ; X тек. полож. курсора в пределах строки 2: ld a,(de) ; символ из строки inc de ; продв. поток cp " " jr nc,.loop ret ; Тест на опции шелла и уст. бит-флагов ; вход: hl=строка опций set_option_flag: ld a,(RUNMODE) ; ячейка бит-флагов ld c,a ld a,(hl) cp "a" jr c,setopt1 cp "z"+1 jr nc,$+4 and 5Fh ; a..z -> A..Z setopt1: cp "P" ; запуск шелла с отраб. autoexec.bat jr nz,setopt2 set 7,c jr setopt4 ; setopt2: cp "S" ; запуск 2-й копии шелла (без отраб. autoexec.bat) jr nz,setopt3 set 5,c jr setopt4 ; setopt3: cp "C" ; выполн. bat-файл и вернуться в родит. процесс ret nz set 4,c setopt4: ld a,c ld (RUNMODE),a ret ;!TODO проверить 4 нижеидущие процедуры когда в DSS будут нормально пути запоминаться ; Сохранить тек. диск и путь ;GETPATH: Get_Path: ; узнать тек. каталог ld hl,system_path ; 256 буфер сист. пути ld c,Dss.CurDir RST ToDSS .disk: ; узнать тек. диск ld c,Dss.CurDisk RST ToDSS add a,"A" ld (screen_path),a ; 33 строка экранного пути ret ;!FIXIT убрать лишние вызовы ; Восстановить тек. диск и путь (после ошибки) restore_disk_path: ; уст. тек. диск ld a,(screen_path) ; 33 строка экранного пути sub "A" ld c,Dss.ChDisk RST ToDSS ;!FIXIT убрать лишние вызовы restore_path: ; уст. тек. каталог ld hl,system_path ; 256 буфер сист. пути ld c,Dss.ChDir RST ToDSS ret ; на новую строку ;!FIXIT сделать через .PChars ; newline: ld a,_cc.cr ; ld c,Dss.PutChar ; rst ToDSS ; ld a,_cc.lf ; ld c,Dss.PutChar ; jp ToDSS newline: push hl ld hl,MAIN_MSG.TABLE+1 ; "CR,LF,0" ld c,Dss.PChars rst ToDSS pop hl ret ; Сравнение строк ; in: de=string1 ; hl=string2 ; b=длина строки A874E: ld a,(de) cp "a" jr c,$+8 cp "z"+1 jr nc,$+4 and 5Fh ; a..z -> A..Z cp (hl) ret nz inc hl inc de djnz A874E ret ; Скопир. строку (с нулем), макс. 15 символов ; (hl) -> (de) ncopy_string: ld bc,15 ; макс. длина строки ld a,(hl) ldi ret po or a jr nz,$-5 ret ; Скопир. строку (с нулем) ; (hl) -> (de) copy_string: ld a,(hl) ldi or a jr nz,copy_string ret ; Десятичный вывод в буфер ; вход: a=число ; hl=буфер A8913: ld c,2Fh inc c sub 10 jr nc,$-3 add a,10 add a,"0" push af ld a,c ld (hl),a inc hl pop af ld (hl),a inc hl ret A893C: ld hl,0 A893F: ld a,(de) inc de or a ret z cp "." ; раздел. даты ret z cp "-" ; раздел. даты ret z cp ":" ; раздел. времени ret z ld b,h ld c,l add hl,hl add hl,hl add hl,bc add hl,hl call A895A ret c add a,l ld l,a jr nc,A893F inc h jr A893F ; char -> int A895A: cp "0" ret c cp "9"+1 ccf ret c sub "0" ret ;!FIXIT есть дубл A8964: ld de,10000 ld a,#C8 ; ret z ld (D8996),a call A898E ld de,1000 call A898E ld de,100 call A898E ld de,10 call A898E ld a,l add a,"0" ;!TEST ;ld (ix+0),a ;inc ix ;ld (ix+0),0 LD (IX+0),A LD (IX+1),0 ; ret A898E: xor a inc a sbc hl,de jr nc,$-3 add hl,de dec a D8996: ret z add a,"0" ld (ix+0),a inc ix xor a ; nop ld (D8996),a ret Restore_Screen: PUSH AF LD C,Dss.GetVMod RST ToDSS AND #80 JR Z,.exit LD BC,1 * 256 + Dss.SetVMod LD A,Dss.SetVMod.txt80x32 RST ToDSS .exit: POP AF RET ; цвет экрана шелла color_screen: db 07h ; Имя файла "autoexec.bat" autoexec_fname: db "system.bat",0 ; бит-флаги опций самого шелла RUNMODE: db 0 ; буфер расш. файла T8C1A: ds 3 db 0 T8C1E: db "BAT" ; расш. bat-файла T8C21: db "ON",0 T8C24: db "OFF",0 include 'edline.asm' ; строка редактирования include 'batch.asm' ; парсинг bat-файлов include 'exec.asm' ; выполн. введ. команд с консоли include 'procedures/print.asm' ; функции вывода сообщений include 'messages/errors_txt.asm' ; сообщения об ошибках include 'messages/main_txt.asm' ; сообщения include 'procedures/parsers.asm' ; функции прочесывания и выбора include 'procedures/math.asm' ; функции математические ; include 'Commands/exit.asm' ; выход в родит. процесс include 'Commands/break.asm' ; выход из парсера bat 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 work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes ;