; раб. ячейка D8374: dw 0 ;------------------------------------------------------------- ; Разбор и выполнение введенных команд и имен файлов ;------------------------------------------------------------- COMP: call EVALCMD ; (batch.asm) ld hl,struct_input_line+5 dec hl ;ld hl,struct_input_line+4;; ld c,(hl) ; длина строки ld b,0 inc hl ; struct_input_line+5 ;ld hl,work_buffer+256;; .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 ; список команд ДОС-а ; de=struct_input_line+5, c=длина строки ; от bat-отработки COMP004: push bc push de COMP000: ld a,(de) cp "a" jr c,COMP001 cp "z"+1 jr nc,COMP001 and #5F ; a..z -> A..Z COMP001: cp (hl) jr nz,COMP002 ; не дос-команды inc hl inc de dec c jr nz,COMP000 xor a cp (hl) jr nz,COMP002 pop bc pop bc ld a,(de) cp " " jr nz,NOSPC inc de NOSPC: inc hl ld a,(hl) inc hl ld h,(hl) ld l,a jp (hl) ; на соотв. обработчик дос-команды ; Не дос-команды. Тест на задание диска и запуск файла COMP002: xor a LD C,A CPIR inc hl inc hl pop de pop bc ld a,(hl) or a jr nz,COMP004 ; назад в цикл, еще не дошли конца списка дос-команд ld h,d ld l,e ; hl=struct_input_line+5 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-й символ cp "a" jr c,NOUP cp "z"+1 jr nc,NOUP and #5F ; a..z -> A..Z ;!!!!! тут восстанавливается директория и могут быть глюки на новом ядре NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; вывод сообщения ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) ; тест на существование папки на целевом диске IFDEF MANY_SYS_PATHES ld hl,system_path ; буфер сист. пути ld c,Dss.ChDir ; уст. тек. путь RST ToDSS jp nc,save_disk_path ; Ok ENDIF ; ; уст. корень, нет такой папки на новом диске ld hl,system_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 save_disk_path ; Ok ; задан не диск RUN_EXT: ex de,hl ; восст. адрес начала строки ld (D8374),hl ; struct_input_line+5 ld de,T8C1A ; буфер ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS ld hl,(D8374) ; имя файла jr c,A83D7 ; выполнить exe-файл bit 1,a ; есть расш. ? jr z,A839D ; нет ; есть расш. файла ld de,T8C1A ; буфер расш. файла ld hl,T8C1E ; "BAT" ld b,3 ; длина сравнения call A874E ; сравнить строки ld hl,(D8374) jp z,A83E8 ; выполнить bat-файл (batch.asm) jr A83D7 ; выполнить exe-файл A839D: ld bc,0*256 + Dss.Exec ; загр. и выполнить программу RST ToDSS ;R10 CALL Restore_Screen ;R10 ret nc ; Ok ld hl,(D8374) cp 3 ; код ошибки "файл не обнаружен" jr nz,A83DD push hl ;ld a,(D96AD) ;; длина строки (inline.asm) ld a,(struct_input_line+4) ; длина строки ld b,a A83AF: ld a,(hl) cp " "+1 jr c,A83B7 inc hl djnz A83AF A83B7: 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 A83E8 ; выполнить bat-файл (batch.asm) ; Выполнить exe-файл ; hl=имя файла A83D7: ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл RST ToDSS ;R10 CALL Restore_Screen ;R10 ret nc A83DD: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" jp nc,print_err_message ; вывод сообщения xor a ; индекс "Bad command or file name" jp print_err_message