; метки не разделять! ccp_name: db 'X:\SYSTEM.EXE ' ; шелл temp_fname: ds 13 ; буфер под имя запуск. файла ; число дос-команд count_dos_commands equ 23 ; индекс ; Команды ДОС array_dos_commands: db "CD"," " ;23 индекс (счетчика "b") db "CHDIR"," " ;22 ; изменяют список файлов db "DEL"," " ;21 db "ERASE"," " ;20 db "MD"," " ;19 db "MKDIR"," " ;18 db "RD"," " ;17 db "RMDIR"," " ;16 db "REN"," " ;15 db "RENAME"," " ;14 ; не изменяют список файлов db "CLS"," " db "DATE"," " db "DIR"," " db "ECHO"," " db "EXIT"," " db "HELP"," " db "PATH"," " db "PAUSE"," " db "REM"," " db "SET"," " db "TIME"," " db "VER"," " db "VERSION"," " count_extentions equ 4 ; кол-во расширений ; зарез. расширения файлов array_extensions: db "EXE"," " db "BAT"," " db "TRD"," " db "SCL"," " ;------------------------------------------------- ; Сравнить строки без учета регистра. ; Образец должен быть в верхнем регистре ; и заканчиваться пробелом. ; вход: de - string1 ; hl - string2 (образец) ; выход: Z - равны ; NZ - не равны ;------------------------------------------------- stricmp:ld a,(de) cp "a" jr c,$+4 and 11011111b ; сбр. 5-bit cp (hl) jr z,stricmp1 ; на след. образец ld a,(hl) ; образец inc hl cp " " jr nz,$-4 dec a ret ; совпадает stricmp1: inc hl inc de ld a,(hl) ; образец cp " "+1 jr nc,stricmp ; образец не закончен inc hl ; на след. образец ld a,(de) cp " " ret z or a ret ; Выделить и установить диск cut_disk: ld hl,work_buffer ; откуда ld de,ComLineBuff+5 ; куда ld bc,0145h rst ToDSS ld c,1 ; уст. диск rst ToDSS ret ; Выделить и установить путь cut_path: ld hl,work_buffer ; откуда ld de,ComLineBuff+5+2 ; куда push de ld bc,0245h rst ToDSS pop hl ld c,1Dh ; уст. путь rst ToDSS ret ; Выделить имя файла из строки cut_filename: ld hl,work_buffer ; откуда ld de,temp_fname ; куда ld bc,0345h ; формат "file.ext" rst ToDSS ret ;------------------------------------------------- ; Выполнить файл ; вход: work_buffer - набранная строка ;------------------------------------------------- Launch_File: xor a ; false ld (present_doscmnd),a ; сбр. флаг признака дос-команд call set_path_from_activ_panel ; уст. сист. диск и путь от акт. панели ret c ld hl,ComLineBuff+5 xor a ld (hl),a ; сбр. ячейку inc hl inc hl ld (hl),a ; +257 сбр. ячейку ; выделить расш. файла из ком-строки ld hl,work_buffer ; откуда ld de,temp_fname ; куда ld bc,0445h rst ToDSS bit 3,a ; указан диск ? push af call nz,cut_disk ; выделить и уст. диск pop af bit 2,a ; указан путь ? push af call nz,cut_path ; выделить и уст. путь pop af bit 1,a ; указано расширение ? jr z,no_file_extension ; нет ; тест на расширения файла ld b,count_extentions ; 4 кол-во расширений ld hl,array_extensions ; расширения ld de,temp_fname ; строка1 call stricmp ; сравнить строки jr z,ext_parsing ; зарез. расширения djnz $-8 jr ext_execute ; ext_parsing: ld a,b cp count_extentions ; "exe" jr z,ext_execute cp count_extentions-1 ; "bat" jr z,ext_execute cp count_extentions-2 ; "trd" ;jp z,ext_trd cp count_extentions-3 ; "scl" ;jp z,ext_scl ; обраб. др. расширений ;... ret ext_execute: no_file_extension: call cut_filename ; выделить имя файла из строки pop bc ; восст. баланс стека ld hl,ccp_name ; "system.exe " ld de,work_buffer+127;255 ; куда ld bc,temp_fname - ccp_name ; длина имени ldir ; вставить букву диска ld hl,ComLineBuff+5 ld a,(hl) ; диск задан ? or a jr nz,$+7 ; да ld a,(disk) ; диск акт. панели add a,"A" ld (de),a inc de ld a,":" ld (de),a inc de ; вставить путь ld hl,ComLineBuff+5+2 ld a,(hl) ; путь задан ? or a jr nz,$+5 ; да ld hl,(__buff) ; путь акт. панели call copy_string ; (hl) -> (de) до нуля dec de dec de ld a,(de) cp '\' jr z,$+6 inc de ld a,'\' ld (de),a inc de ; вставить имя файла ld hl,temp_fname ; откуда call copy_string ; (hl) -> (de) до нуля ; вставить хвост команды ld hl,work_buffer ld bc,2000h ; пробел/нуль ld a,(hl) inc hl cp c jr z,$+10 ; нет хвоста cp b jr nz,$-6 dec hl dec de call copy_string ; (hl) -> (de) до нуля run_dos_command: ; отработать exe/bat файлы и дос-команды call call_shell ; вызов шелла системы ld sp,stack ; стек ФМ ; "поднять" послед. строку вывода экрана ld c,8Eh ; узнать полож. курсора rst 08h cp 30 ; номер ком-строки jr c,$+10 jr z,$+5 call new_line call new_line di ld a,(page_module0) ; драйверы клавы, мышки, объекты out (SLOT0),a ei ld a,(page_module1) ; описатели панелей, раб. буферы out (SLOT1),a db 3Eh ; ld a,.. present_doscmnd: db false ; 01/00 да/нет флаг дос-команд or a jp z,cold_entry ; холодный вход в ФМ ; была дос-команда db 3Eh ; ld a,.. this_cd:db false ; признак "cd","chdir" команд or a call nz,set_path_to_activ_panel ; уст. новый путь акт. панели jp warm_entry ; теплый вход в ФМ ; новая строка new_line: ld a,0Dh call $+5 ld a,0Ah ld c,5Bh ; вывод символа на экран rst ToDSS ret ;--------------------------------------------------- ; Вызов шелла системы для отработки файлов/команд ;--------------------------------------------------- call_shell: ; скрыть мышку ФМ call hide_mouse ; выкл. вывод часов панелей ld hl,enable_clock ; флаг ld a,(hl) or a jr z,$+7 ; уже выкл. ld (clock__+1),a ; сохр. флаг (shell.asm) ld (hl),false ; восст. дос-страницу di ld a,(DSS_PAGE) out (SLOT0),a ei ; восст. системный экран ld c,0B3h ld a,(page_sys_screen) ; страница буфера call screen__ ; восст. полож. курсора сист. экрана ld de,(sys_cursor_coords+1) ; Y/X ld c,84h rst 08h ; восст. значение порта ld a,(port_89) out (PORT_Y),a ; выполнить файл ld (stack1+1),sp ld hl,work_buffer+127;255 ; имя файла ld bc,0040h rst ToDSS ; скрыть сист. мышку ld c,2 rst 30h stack1: ld sp,0 ret ;----------------------------------------------------------- ; Разбор командной строки ;----------------------------------------------------------- parsing_command_line: ld hl,what ; поле событий ld (hl),evNothing ; событие xor a ld hl,work_buffer+127;255 ; набранная строка cp (hl) ret z ; пустая ком-строка ; поиск дос-команд ld b,count_dos_commands ; число дос-команд ld hl,array_dos_commands ; массив дос-команд ld de,work_buffer+127;255 ; набранная строка call stricmp ; сравнить строки jr z,found_dos_command ; нашли djnz $-8 ; не дос-команда ld hl,work_buffer+127;255 ; откуда ld de,work_buffer ; куда call copy_string ; (hl) -> (de) до нуля jp Launch_File ; отработать файл ; ДОС-команда найдена found_dos_command: ld a,true ld (present_doscmnd),a ; уст. признак дос-команд ld a,b ld (number_command),a ; номер команды (shell.asm) cp 23 ; "cd" ? jr z,$+6 cp 22 ; "chdir" ? jr nz,dos_cmnd ld (this_cd),a ; уст. признак "cd","chdir" команд ld (change),a ; уст. флаг смены тек. диска или пути dos_cmnd: call set_path_from_activ_panel ; уст. сист. диск и путь от акт. панели ld hl,ccp_name ; "system.exe " ld de,work_buffer ; куда ld bc,temp_fname - ccp_name ; длина имени ldir ld hl,work_buffer+127;255 ; откуда call copy_string ; (hl) -> (de) до нуля ld hl,work_buffer ; готовая строка ld de,work_buffer+127;255 ; куда call copy_string ; (hl) -> (de) до нуля pop bc ; восст. баланс стека jp run_dos_command ; отработать дос-команду