; Последняя редакция: 22.10.2006 ; ; - Исправлен фирм. баг, при котором строка в bat-файле, длиннее ширины ; экрана, обрезалась по ширине экрана и остаток строки не выводился. ; - Исправлен фирм. баг, при котором в команде "dir" строка выводимого ; пути имела макс. 15 символов. ; - Пофиксено неверное изменение диска/пути после ошибок выполнения команд. ; - Добавлена команда "ECHO." для вставки пустой строки. ; - Команда DIR выводит метку и серийный номер дисков. ; ; 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 work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ;!FIXIT перенести в конец work_buffer2 equ entry - 256 ; 3-й раб. буфер ;!FIXIT перенести в конец 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 0C000h ; адрес стека ds 490 ; резерв ; Версия/Модификация/Билд шелла entry: db "0.01.003" ;!FIXIT перенести в конец ;============================================================== ; Точка входа в Шелл ;============================================================== 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 save_disk_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 ; вводились дополн. параметры call CMDMODE ; (batch.asm) выполн. команду или запустить файл call save_disk_path ; узнать и сохр. тек. диск и путь ; ; Вернуться в родит. процесс back_to_parent_process: ld bc,0*256 + Dss.Exit RST 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) call save_disk_path ; узнать и сохр. тек. диск и путь 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 save_disk_path ; узнать и сохр. тек. диск и путь run_shell_loop1: call input_line call newline ; на новую строку ld a,(struct_input_line+4) ; число введ. символов or a jr z,run_shell_loop1 ; пустая ; Парсинг и выполнение команд call A82E7 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: save_disk_path: ; узнать тек. каталог ld hl,system_path ; 256 буфер сист. пути ld c,Dss.CurDir RST ToDSS save_disk: ; узнать тек. диск ld c,Dss.CurDisk RST ToDSS add a,"A" ld (screen_path),a ; 33 строка экранного пути ret ; Восстановить тек. диск и путь (после ошибки) restore_disk_path: ; уст. тек. диск ld a,(screen_path) ; 33 строка экранного пути sub "A" ld c,Dss.ChDir RST ToDSS 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 RST ToDSS 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 A8964: ld de,10000 ld a,0C8h ; 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 "shell_exec.asm" ; выполн. введ. команд с консоли include "error.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" ; софт ресет ; ;