; раб. ячейка SAVEHL: dw 0 ;------------------------------------------------------------- ; Разбор и выполнение введенных команд и имен файлов ;------------------------------------------------------------- COMP: call EVALCMD ; (batch.asm) RET C ld hl,Buffers.input_line.Path - 1 ;dec hl ld c,(hl) ; длина строки ld b,0 inc hl ; Buffers.input_line.Path .loop: ld a,(hl) cp " " jr nz,.COMP01 inc hl dec c jr nz,.loop ret .COMP01: ld d,h ld e,l add hl,bc ld (hl),0 sbc hl,bc ld a,c ex af,af' ld a," " cpir jr nz,.COMP005 inc c .COMP005: ex af,af' sub c ld c,a ld hl,CMDLIST ; список команд ДОС-а .start: call RUN_COMMAND jr nc,.skip ; NC если не найдена команда jp (hl) ; .skip: ; Не дос-команды. Тест на задание диска и запуск файла ld h,d ld l,e ; hl=Buffers.input_line.Path ld b,(hl) ;+0 1-й символ inc hl ld c,(hl) ;+1 2-й символ inc hl ld a,(hl) ;+2 3-й символ or a ; задан диск типа "x:" ? jr nz,RUN_EXT ; нет, имеем больше 2-х символов ld a,":" ; постфикс буквы диска cp c ; 2-й символ jr nz,RUN_EXT ; задан не диск ld a,b ; 1-й символ CALL COMPARE.cmp_AZ .NOUP: sub "A" ; номер диска ld (.dsk),a ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jr nc,.no_err ; cp DSS_Error.sys.MEDIA_CHANGED jp nz,print_err_message ; call print_err_message .dsk+1: ld a,0 ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; .no_err: ;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре ;!TODO доставать Buffers.sys_path отдельно для каждого диска (или в ядре сделать?) ; тест на существование папки на целевом диске IFDEF MANY_SYS_PATHES ld hl,Buffers.sys_path ; буфер сист. пути ld c,Dss.ChDir ; уст. тек. путь RST ToDSS jp nc,Get_Path ; Ok ENDIF ; ; уст. корень, нет такой папки на новом диске ld hl,Buffers.sys_path + 1 ; буфер сист. пути ld (hl),0 dec hl ld (hl),'\' ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) IFDEF MANY_SYS_PATHES ld c,Dss.ChDir ; уст. тек. путь RST ToDSS jp c,print_err_message ; вывод сообщения ENDIF ; jp Get_Path ; Ok ; задан не диск RUN_EXT: ex de,hl ; восст. адрес начала строки ld (SAVEHL),hl ; Buffers.input_line.Path ld de,EXTBF ; буфер ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS ld hl,(SAVEHL) ; имя файла jr c,RUN_EXE ; выполнить exe-файл bit 1,a ; есть расш. ? jr z,.NON_EXT ; нет ; есть расш. файла ld de,EXTBF ; буфер расш. файла ld hl,BATBF ; "BAT" ld b,3 ; длина сравнения ;!HARDCODE call COMPARE ; сравнить строки ld hl,(SAVEHL) jp z,RUN_BAT ; выполнить bat-файл (batch.asm) jr RUN_EXE ; выполнить exe-файл .NON_EXT: ld bc,Dss.Exec ; загр. и выполнить программу RST ToDSS ;[x] 01/11/23 ;!TEST PUSH AF CALL RESTORE_ALL POP AF ; ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; ld hl,(SAVEHL) cp DSS_Error.sys.FILE_NOT_FOUND jr nz,EXEERR push hl ;ld a,(D96AD) ; длина строки (inline.asm) ld a,(Buffers.input_line.Symbols_Num) ; длина строки ld b,a .loop: ld a,(hl) cp " "+1 jr c,.next inc hl djnz .loop .next: ld e,b ld d,0 add hl,de push hl ld e,4 add hl,de pop de ex de,hl ld c,b ld b,0 inc c lddr inc hl ld (hl),"." inc hl ld (hl),"B" inc hl ld (hl),"A" inc hl ld (hl),"T" pop hl jp RUN_BAT ; выполнить bat-файл (batch.asm) ; Выполнить exe-файл ; hl=имя файла RUN_EXE: ld bc,Dss.Exec ; загрузить программу, выполнить файл RST ToDSS ;[x] 01/11/23 ;!TEST PUSH AF CALL RESTORE_ALL POP AF ; ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; EXEERR: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" jp nc,print_err_message ; вывод сообщения xor a ; индекс "Bad command or file name" jp print_err_message Ret_New_Line: LD C,Dss.Cursor RST ToDSS XOR A OR E RET Z jp newline RESTORE_ALL: ;[x] 01/11/23 ;!TEST CALL Get_Path CALL .path ;R10 CALL Restore_Screen ;R10 RET ; .path: ;[x] 01/11/23 ;!TEST LD A,(Buffers.screen_path) SUB 'A' LD C,Dss.ChDisk RST ToDSS ; LD HL,Buffers.sys_path LD C,Dss.ChDir RST ToDSS RET ; ;