Estex-DSS/SHELL/BATCH.ASM
Anatoliy Belyanskiy 4fd82287e9 ...
2024-03-31 05:10:52 +10:00

546 lines
12 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.

; Ž¡à ¡®âª  BAT-ä ©«®¢
;
;fhandle
BAT_FM: db 0 ; ¤¥áªà. bat-ä ©« 
;count: db 0 ; ç¨á«® ¯à®ç¨â. ¡ ©â ¨§ ä ©« 
; ä« £ echo-०¨¬ 
echo_mode:
db true ; 1/0 on/off
; ¡ãä¥à bat-ä ©« 
;T98B9: ds 256
; IF 0
; CALL RUN_BAT
; CALL BATCH
; CALL MAKE_BATCH_PRM_ARRAY
; CALL NEWLINE
; CALL CMDMODE
; CALL EVALCMD
; CALL RUN_BAT
; ENDIF
;-------------------------------------------------
; ‡ ¯ã᪠bat-ä ©« 
; ¢å®¤: hl=¨¬ï ä ©« 
;-------------------------------------------------
RUN_BAT:
call BATCH
jp c,EXEERR ; ®è¨¡ª  ®âªà. ä ©«  (cpp.asm)
ret
;-------------------------------------------------
; ¢å®¤: b=ç¨á«® á«®¢ "ZERO".."NINE"
MAKE_BATCH_PRM_ARRAY:
dec hl
.loop: inc hl
ld a,(hl)
or a
ret z
cp " "
jr z,.loop
cp 9 ; Tab
jr z,.loop
ex de,hl
ld (hl),e
inc hl
ld (hl),d
inc hl
ex de,hl
.B_FIND_SPACE:
inc hl
ld a,(hl)
cp " "+1
jr nc,.B_FIND_SPACE
ld (hl),0
or a
ret z
djnz .loop
ret
;-------------------------------------------------
; ‡ £à㧪  ¨ ¢ë¯®«­¥­¨¥ BAT-ä ©« 
; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: "CF" - ®è¨¡ª  ®âªà. ä ©« 
;-------------------------------------------------
BATCH:
; [x] 11/12/23 ¢«®¦¥­­ë¥ bat
ld a,(BAT_FM)
or a
jr nz,.new_process
;
push hl ; á®åà. ¨¬ï bat-ä ©« 
ld de,work_buffer ; 512 ¬¥áâ­ë© ¡ãä¥à
call copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
ld hl,work_buffer ; 512 ¬¥áâ­ë© ¡ãä¥à
ld de,BAT_PRM_ARRAY ; â ¡«¨æ  㪠§ â. ­  "ZERO".."NINE"
ld b,BAT_PRM_ARRAY.TOTAL ; ç¨á«® á«®¢ "ZERO".."NINE"
call MAKE_BATCH_PRM_ARRAY
jr nz,.B_ALL_P
ld hl,NULL ; ds 2*10
ex de,hl
.B_CLR_P:
ld (hl),e
inc hl
ld (hl),d
inc hl
djnz .B_CLR_P
ex de,hl
.B_ALL_P:;-
pop hl ; ¢®ááâ. ¨¬ï bat-ä ©« 
ld a,Dss.Open.R ; ­  ç⥭¨¥
ld c,Dss.Open ; ®âªàëâì ä ©«
RST ToDSS
;push af ; á®åà. ª®¤ ®è¨¡ª¨
;call c,restore_disk_path ; ¢®ááâ. ⥪. ¤¨áª ¨ ¯ãâì
;R10
;CALL Restore_Screen
;R10
;pop af
ret c
ld (BAT_FM),a ; ¤¥áªà. bat-ä ©« 
; ¢ë¯®«­. ª®¬ ­¤ bat-ä ©« 
call NEWLINE
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat
;R10
push af
CALL Restore_Screen
pop af
;R10
xor a ;!FIXIT
ret
; [x] 11/12/23 ¢«®¦¥­­ë¥ bat
.new_process:
ld de,work_buffer2
call copy_string
;
ld hl,.shell
ld de,struct_input_line+5
call copy_string
;
ld hl,work_buffer2
ld de,struct_input_line+5 + .shell.size - 1
call copy_string
;
; ld c,Dss.CurDisk
; rst ToDSS
; add a,'A'
; ld (.shell),a
;
ld hl,struct_input_line+5
ld bc,Dss.Exec
RST ToDSS
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat
xor a
ret
;
;rst ToDSS
;
; ret nc
; CP DSS_Error.sys.FILE_NOT_FOUND
; ret nz
; jp z,A83DD ; ®è¨¡ª  ®âªà. ä ©«  (cpp.asm)
; ret
;.shell: DB '?:\SYSTEM.EXE /C ',0
.shell: DB 'SYSTEM.EXE /C ',0
.shell.size EQU $ - .shell
;!TODO
.ErrorEnv: DB 'ERRORLEVEL='
.ErrorEnv.Code: DB 'xxx',0
.ErrorEnv.Size EQU $ - .ErrorEnv
;
;---------------------------------------------------
; ‚믮«­¥­¨¥ ª®¬ ­¤ BAT-ä ©« 
;---------------------------------------------------
NEWLINE:
LD (cmd_break.sp),SP ; [x] 11/12/23 cmd_break
;
ld de,struct_input_line+5 ;!HARDCODE
.ADDBAT: push de
call READBAT ; ¯à®ç¨â âì 128 ¡ ©â ¨§ ä ©«  ¢ "work_buffer1"
pop de
;!TODO ¤®¤¥« âì âãâ ­®à¬ «ì­ãî ¯à®¢¥àªã ­  ®¡«®¬ á ç⥭¨¥¬ ä ©« , ¢ë¢®¤¨âì ®è¨¡ªã
jp c,cmd_break.exit
or a ; a=ç¨á«® ¯à®ç¨â. ¡ ©â
jr nz,.BATLINE
;
ex de,hl
ld de,struct_input_line+5
sbc hl,de
jp z,cmd_break.exit; ;[x] <Vasil> ã¡à ­ ¡ £ á ­¥§ ªàëâë¬ BAT-ä ©«®¬
ld a,l
ld (struct_input_line+4),a ; ¤«¨­  áâப¨
call CMDMODE ; â¥áâ ­  bat-ª®¬ ­¤ë
; ^^^^^^^
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat
JP cmd_break.exit
; .exit: ld a,(BAT_FM) ; ¤¥áªà. bat-ä ©« 
; ld c,Dss.Close ; § ªàëâì ä ©«
; ;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat
; RST ToDSS
; xor a
; ld (BAT_FM),a
; ret
;
.BATLINE:
ld hl,work_buffer1
.loop: call MOVWORD ; ᪮¯¨à. work_buffer1 -> struct_input_line+5
jr c,.ADDBAT
ld a,b
ld (MOVWORD.count),a ; ®áâ «®áì ¯à®¯ àá¨âì ¯à®ç¨â ­­ëå ¡ ©â®¢
push hl
ex de,hl
ld de,struct_input_line+5
sbc hl,de
ld a,l
ld (struct_input_line+4),a ; ¤«¨­  áâப¨
call CMDMODE ; â¥áâ ­  bat-ª®¬ ­¤ë
; ^^^^^^^
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat
ld de,struct_input_line+5
pop hl
jr .loop
;-------------------------------------------------
; —⥭¨¥ ¤ ­­ëå (hl) -> (de), ¯à¨ ­¥®¡å®¤¨¬®áâ¨
; ¯®¤ª çª  ¨§ ä ©« .
;
; ¢å®¤: hl=®âªã¤ 
; de=ªã¤ 
;-------------------------------------------------
MOVWORD:
.count+1: ld a,0 ; ç¨á«® ¯à®ç¨â. ¡ ©â ¨§ ä ©« 
; [x] 15/12/23 exit if 0
OR A
SCF
RET Z
;
ld b,a
.loop: ld a,(hl)
ld (de),a
cp " "
jr c,.loop_
inc hl
inc de
djnz .loop
scf
ret
; ¯à®ç¨â âì ¤®¯. ¡«®ª ¨§ ä ©« 
.loop2: ld a,(hl)
cp " "
ret nc
.loop_: inc hl
djnz .loop2
push de
call READBAT ; ¯à®ç¨â âì 128 ¡ ©â ¨§ ä ©« 
pop de
;!TODO ¤®¤¥« âì âãâ ­®à¬ «ì­ãî ¯à®¢¥àªã ­  ®¡«®¬ á ç⥭¨¥¬ ä ©« , ¢ë¢®¤¨âì ®è¨¡ªã
RET C
;ld hl,BATBUFF ; 128 ¡ãä¥à (ccp.asm) "work_buffer1"
ld hl,work_buffer1
ld b,a ; ç¨á«® ¯à®ç¨â. ¡ ©â
or a
jr nz,.loop2
scf
ret
; ¯à®ç¨â âì 128 ¡ ©â ¨§ ä ©« 
READBAT:
;ld hl,T99B9 ; 128 ¡ãä¥à ¯®¤ ¤ ­­ë¥ (ccp.asm) "work_buffer1"
ld hl,work_buffer1
ld de,128 ; ᪮«ìª®
ld a,(BAT_FM) ; ¤¥áªà. bat-ä ©« 
ld c,Dss.Read ; ç⥭¨¥ ä ©« 
RST ToDSS
ld a,e
; [x] 28/09/23
JR NC,1F
;!TODO ¤®¤¥« âì âãâ ­®à¬ «ì­ãî ¯à®¢¥àªã ­  ®¡«®¬ á ç⥭¨¥¬ ä ©« , á®åà ­ïâì ®è¨¡ªã
LD A,0 ; á®å࠭塞 ä« £ CF
;
1: ld (MOVWORD.count),a ; ç¨á«® ¯à®ç¨â. ¡ ©â ¨§ ä ©« 
ret
; ’¥áâ ­  bat-ª®¬ ­¤ë
; ¤®«¦¥­ ᮡ«î¤ âìáï ¡ « ­á á⥪  ¤«ï cmd_break
CMDMODE:
;xor a
;ld (D96A6),a ; (inline.asm)
call EVALCMD ; (batch.asm)
;ld ix,T96AC ; ­ã¦­®?? § ª®¬¥­â à¨« (inline.asm)
;ld hl,T96AE ;;256 ¡ãä¥à (inline.asm)
ld hl,struct_input_line+5
ld a,(hl)
cp "@" ; 40h
jr nz,.A8240
dec hl
;ld hl,struct_input_line+4;;
dec (hl)
jr z,.A825B
ld c,(hl) ; ¤«¨­  áâப¨
inc hl
ld b,0
;ld hl,work_buffer+256;;
ld d,h
ld e,l
inc hl
ldir
jr .A825B
;
.A8240: ld a,(echo_mode) ; ä« £ echo-०¨¬ 
or a
jr z,.A825B ; off
; ¢ë¢¥á⨠á¨áâ. ¯ãâì ¨ áâபã ᮤ¥à¦¨¬®£® bat-ä ©« 
;ld de,T96AE ;;256 ¡ãä¥à (inline.asm)
;ld de,struct_input_line+5
;call A95DE ; ¢ë¢®¤ íªà ­. ¯ã⨠á ">" (inline.asm)
; ¢ë¢¥á⨠íªà ­. ¯ãâì ¨ ¢¢¥¤. ª®¬ ­¤ã
ld c,BIOS.LP_GET_PLACE ; ã§­ âì ¯®«®¦. ªãàá®à 
RST ToBIOS
ld (YXpos),de ; Y/X ­ ç «® ª®¬-áâப¨
ld (cursor_position),de ; Y/X ¯®§¨æ¨ï ªãàá®à 
call print_compath ; ¢ë¢¥á⨠¯ãâì + ­®¢ ï è¨à¨­  ¯®«ï ¢¢®¤ 
ld de,(YXpos) ; Y/X ­ ç «® ª®¬-áâப¨
ld c,Dss.Locate ; ãáâ. ¯®«®¦. ªãàá®à 
RST ToDSS
;ld hl,work_buffer+256;;
ld hl,struct_input_line+4 ; ¤«¨­  áâப¨
ld a,(hl)
ld b,a
inc hl ;+5
push bc
ld c,BIOS.LP_PRINT_LINE2 ; ¢ë¢®¤ áâப¨ ¡¥§  âਡã⮢
RST ToBIOS
pop bc ; b=¤«¨­  áâப¨
ld a,(width_inpline) ; è¨à¨­  ¯®«ï ¢¢®¤  (76..48)
sub b
;ei
ret z ; ¯à ¢ë© ªà © íªà ­ 
jr c,.A8250; ; áâப  ¡®«ìè¥ è¨à¨­ë íªà ­ 
; § ¯®«­¨âì áâப㠤® ª®­æ  íªà ­ 
dec a ; çâ®¡ë ­¥ áà ¡®â « áªà®««¨­£ íªà ­  ;!FIXIT scroll
ld b,a ; ç¨á«® ¢ë¢®¤. ᨬ¢®«®¢
ld a," " ; ᨬ¢®«
ld c,BIOS.LP_PRINT_SYM ; ¢ë¢®¤ ᨬ¢®«  ¡¥§  âਡãâ 
RST ToBIOS
;ei
;!TEST
.A8250: call newline
;
;
;ld a,(D96AD) ;; ¤«¨­  áâப¨ (inline.asm)
;ld a,(struct_input_line+4);-
;or a
;ret z
;call newline
;jr A8264
;
.A825B: ;ld a,(D96AD) ;; ¤«¨­  áâப¨ (inline.asm)
ld a,(struct_input_line+4)
or a
ret z
;A8264: ld hl,T96AE ;;256 ¡ãä¥à (inline.asm)
;ld hl,struct_input_line+5
;dec hl
; ã¡à âì ª®­æ¥¢ë¥ ¯à®¡¥«ë áâப¨
ld hl,struct_input_line+4
ld c,(hl) ; hl=¤«¨­  áâப¨ (inline.asm)
ld b,0
inc hl
;ld hl,work_buffer+256;;
.A826C: ld a,(hl)
cp " "
jr nz,.A8276
inc hl
dec c
jr nz,.A826C
ret
;
.A8276: ld d,h
ld e,l
add hl,bc
ld (hl),b ; 0 ¢ ª®­¥æ áâப¨ (¯¥à¢®£® ª®­æ. ¯à®¡¥« )
sbc hl,bc
ld a,c
ex af,af'
ld a," "
cpir
jr nz,.A8286
inc c
.A8286: ex af,af'
sub c
ld c,a ; ¤«¨­  á«®¢  ¨«¨ áâப¨ ?
ld hl,BATLIST ; ª®¬ ­¤ë bat + dos-ª®¬ ­¤ë
;
; de=struct_input_line+5, c=¤«¨­  áâப¨ (¡¥§ ª®­æ. ¯à®¡¥«®¢)
; ¢ë¯®«­. ª®¬ ­¤ã ¨«¨ § ¯ãáâ¨âì ä ©«
jp COMP.start
; ¤®«¦­  ã¡à âì ª®­æ. ¯à®¡¥«ë ¨ ãáâ. ¤«¨­ã áâப¨, ¥á«¨ ã१ « áì
EVALCMD: xor a
ld hl,struct_input_line+4 ;!HARDCODE
ld c,(hl)
ld b,a
inc hl
add hl,bc
ld (hl),a ; 0 ¢ ª®­¥æ áâப¨
sbc hl,bc
ld de,work_buffer2 ; 256 ¡ãä¥à
call EVALSTR
ld hl,work_buffer2 ;work_buffer+256
ld de,struct_input_line+5 ; ªã¤ 
ld bc,255
.loop: ld a,(hl)
ldi
inc b
or a
jr nz,.loop
dec b
ld a,b
ld (struct_input_line+4),a ; ¤«¨­  áâப¨ (edline.asm)
and a
ret
; HL - STRING WITH %VAR%
EVALSTR: ld a,(hl)
cp "%"
jr z,.TVARIABLE
.VARL1: ldi
or a
jr nz,EVALSTR
; A=0
ld b,a
ld c,a
ld (.TVAR_PNT),bc
ret
;
.TVARIABLE:
.TVAR_PNT+1: ld bc,0
ld a,b
or c
ld a,"%"
ld (.TVAR_PNT),de
jr nz,.TVAR1
inc hl
ld a,(hl) ;!FIXIT ï ¢ console.asm ¨á¯à ¢«ï« ¡ £ á ¯ à ¬¥â஬ %A ­ ¯à¨¬¥à. ’ãâ ¬®¨ ¯à ¢ª¨ ¨«¨ ‚ á¨«ï?
cp "9"+1
jr c,.TVAR0
.TVAR2: ld a,"%" ; > "9"
dec hl
jp .VARL1
.TVAR0: cp "0"
jr c,.TVAR2 ; < "0"
; BATCH PARAM %0, %1, %2 ...
inc hl
push hl
ld (.TVAR_PNT),bc
sub "0"
add a,a
ld c,a
ld hl,BAT_PRM_ARRAY ; â ¡«¨æ  㪠§ â. ­  "ZERO".."NINE"
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
or h
jr z,.NOBTP ; NO BATCH PARM
call copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
dec de
.NOBTP: pop hl
jp EVALSTR
;
.TVAR1: push hl
ld h,d
ld l,e
dec hl
and a
sbc hl,bc
jr z,.TNOVAR
ld a,"="
ld (de),a
inc de
xor a
ld (de),a
ld d,b ; de=¡ãä¥à §­ ç¥­¨ï ¯¥à¥¬.
ld e,c
ld h,b ; hl=¨¬ï ¯¥à¥¬.
ld l,c
inc hl
ld bc,Dss.Environ.Get ; ¯®«ãç¨âì ¯¥à¥¬. ®ªà㦥­¨ï
RST ToDSS
.TNOVAR: pop hl
inc hl
ld bc,0
ld (.TVAR_PNT),bc
jp EVALSTR
; !! <09>¥ ¤¥« âì ®¤­ã ª®¬ ­¤ã > 256 ᨬ¢®«®¢)) !!
;
; BAT-ª®¬ ­¤ë (­¥ ®â¤¥«ïâì ®â ¤®á-ª®¬ ­¤)
BATLIST: DZ 'PAUSE' : DW cmd_pause ;CPAUSE
DZ 'REM' : DW cmd_rem ;CREM
DZ 'EXIT' : DW cmd_break ;break
;
; DSS-ª®¬ ­¤ë
CMDLIST: DZ 'CD' : DW cmd_chdir ;CCHDIR
DZ 'DIR' : DW cmd_dir ;DIR
DZ 'ECHO' : DW cmd_echo ;CECHO
DZ 'ECHO.' : DW cmd_echoLN
DZ 'PATH' : DW cmd_path ;CPATH
DZ 'MD' : DW cmd_mkdir ;CMKDIR
DZ 'REN' : DW cmd_rename ;CRENAM
DZ 'DEL' : DW cmd_del ;CDELET
DZ 'RD' : DW cmd_rmdir ;CRMDIR
DZ 'SET' : DW cmd_set ;CSET
DZ 'TIME' : DW cmd_time ;CTIME
DZ 'DATE' : DW cmd_date ;CDATE
DZ 'VER' : DW cmd_version ;VERS
DZ 'CLS' : DW cmd_cls ;CLS
DZ 'CHDIR' : DW cmd_chdir ;CCHDIR
DZ 'MKDIR' : DW cmd_mkdir ;CMKDIR
DZ 'RENAME' : DW cmd_rename ;CRENAM
DZ 'ERASE' : DW cmd_del ;CDELET
DZ 'RMDIR' : DW cmd_rmdir ;CRMDIR
DZ 'HELP' : DW cmd_help ;HELP
DZ 'VERSION' : DW cmd_version ;VERS
DZ 'EXIT' : DW cmd_exit ;CEXIT
DZ 'REBOOT' : DW cmd_reboot ;REBOOT
DB #00
IZERO DB "ZERO",0
IONE DB "ONE",0
ITWO DB "TWO",0
ITHREE DB "THREE",0
IFOUR DB "FOUR",0
IFIVE DB "FIVE",0
ISIX DB "SIX",0
ISEVEN DB "SEVEN",0
IEIGHT DB "EIGHT",0
ININE DB "NINE",0
BAT_PRM_ARRAY:
DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE
DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 10 ç¨á«® á«®¢ "ZERO".."NINE"
.TOTAL EQU ($-BAT_PRM_ARRAY)/4
DISPLAY "First compilation test: 10 = ",/D, BAT_PRM_ARRAY.TOTAL
ASSERT BAT_PRM_ARRAY.TOTAL = 10, "BAT_PRM_ARRAY.TOTAL"
NULL: DB 0
;TVAR_PNT: DW 0