Estex-DSS/SHELL/SHELL_EXEC.ASM
Anatoliy Belyanskiy fed7066721 some optimization
2023-11-08 20:36:22 +10:00

244 lines
4.6 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; à ¡. ï祩ª 
D8374: dw 0
;-------------------------------------------------------------
; <20> §¡®à ¨ ¢ë¯®«­¥­¨¥ ¢¢¥¤¥­­ëå ª®¬ ­¤ ¨ ¨¬¥­ ä ©«®¢
;-------------------------------------------------------------
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) ; ­  á®®â¢. ®¡à ¡®â稪 ¤®á-ª®¬ ­¤ë
; <20>¥ ¤®á-ª®¬ ­¤ë. ’¥áâ ­  § ¤ ­¨¥ ¤¨áª  ¨ § ¯ã᪠䠩« 
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
;[x] 01/11/23 ;!TEST
PUSH AF
CALL RESTORE_ALL
POP AF
;
;[x] 25/10/23
JP NC,Ret_New_Line ; Ok
;
ld hl,(D8374)
cp DSS_Error.sys.FILE_NOT_FOUND
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
;[x] 01/11/23 ;!TEST
PUSH AF
CALL RESTORE_ALL
POP AF
;
;[x] 25/10/23
JP NC,Ret_New_Line ; Ok
;
A83DD: 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 save_disk_path
;
LD A,(screen_path)
SUB 'A'
LD C,Dss.ChDisk
RST ToDSS
;
LD HL,system_path
LD C,Dss.ChDir
RST ToDSS
;
;R10
CALL Restore_Screen
;R10
;
RET