Estex-DSS/SHELL/BATCH.ASM
2026-05-15 07:05:18 +10:00

561 lines
12 KiB
NASM
Raw Permalink 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 "\t" ; 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,Buffers.work.buffer ; 512 ¬¥áâ­ë© ¡ãä¥à
call copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
ld hl,Buffers.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
JR NC,.good
CP DSS_Error.sys.TOO_MANY_FILES_IN_DIR
SCF
RET NZ
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET
;
.good: 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,Buffers.work.buffer2
call copy_string
;
ld hl,.shell
ld de,Buffers.input_line.Path
call copy_string
;
ld hl,Buffers.work.buffer2
ld de,Buffers.input_line.Path + .shell.size - 1
call copy_string
;
ld hl,Buffers.input_line.Path
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,Buffers.input_line.Path
.ADDBAT: push de
call READBAT ; ¯à®ç¨â âì 128 ¡ ©â ¨§ ä ©«  ¢ "Buffers.work.buffer1"
pop de
;!TODO ¤®¤¥« âì âãâ ­®à¬ «ì­ãî ¯à®¢¥àªã ­  ®¡«®¬ á ç⥭¨¥¬ ä ©« , ¢ë¢®¤¨âì ®è¨¡ªã
jp c,cmd_break.exit
or a ; a=ç¨á«® ¯à®ç¨â. ¡ ©â
jr nz,.BATLINE
;
ex de,hl
ld de,Buffers.input_line.Path
sbc hl,de
jp z,cmd_break.exit; ;[x] <Vasil> ã¡à ­ ¡ £ á ­¥§ ªàëâë¬ BAT-ä ©«®¬
ld a,l
ld (Buffers.input_line.Symbols_Num),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,Buffers.work.buffer1
.loop: call MOVWORD ; ᪮¯¨à. Buffers.work.buffer1 -> Buffers.input_line.Path
jr c,.ADDBAT
ld a,b
ld (MOVWORD.count),a ; ®áâ «®áì ¯à®¯ àá¨âì ¯à®ç¨â ­­ëå ¡ ©â®¢
push hl
ex de,hl
ld de,Buffers.input_line.Path
sbc hl,de
ld a,l
ld (Buffers.input_line.Symbols_Num),a ; ¤«¨­  áâப¨
call CMDMODE ; â¥áâ ­  bat-ª®¬ ­¤ë
; ^^^^^^^
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat
ld de,Buffers.input_line.Path
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,Buffers.work.buffer1
ld b,a ; ç¨á«® ¯à®ç¨â. ¡ ©â
or a
jr nz,.loop2
scf
ret
; ¯à®ç¨â âì 128 ¡ ©â ¨§ ä ©« 
READBAT:
ld hl,Buffers.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)
RET C
;ld ix,T96AC ; ­ã¦­®?? § ª®¬¥­â à¨« (inline.asm)
;ld hl,T96AE ;;256 ¡ãä¥à (inline.asm)
ld hl,Buffers.input_line.Path
ld a,(hl)
cp "@" ; 40h
jr nz,.A8240
dec hl
;ld hl,Buffers.input_line.Symbols_Num;;
dec (hl)
jr z,.A825B
ld c,(hl) ; ¤«¨­  áâப¨
inc hl
ld b,0
;ld hl,Buffers.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,Buffers.input_line.Path
;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,Buffers.work.buffer+256;;
ld hl,Buffers.input_line.Symbols_Num ; ¤«¨­  áâப¨
ld a,(hl)
ld b,a
inc hl ;+5
push bc
LD C,Dss.PChars
RST ToDSS
;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,(Buffers.input_line.Symbols_Num);-
;or a
;ret z
;call newline
;jr A8264
;
.A825B: ;ld a,(D96AD) ;; ¤«¨­  áâப¨ (inline.asm)
ld a,(Buffers.input_line.Symbols_Num)
or a
ret z
;A8264: ld hl,T96AE ;;256 ¡ãä¥à (inline.asm)
;ld hl,Buffers.input_line.Path
;dec hl
; ã¡à âì ª®­æ¥¢ë¥ ¯à®¡¥«ë áâப¨
ld hl,Buffers.input_line.Symbols_Num
ld c,(hl) ; hl=¤«¨­  áâப¨ (inline.asm)
ld b,0
inc hl
;ld hl,Buffers.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=Buffers.input_line.Path, c=¤«¨­  áâப¨ (¡¥§ ª®­æ. ¯à®¡¥«®¢)
; ¢ë¯®«­. ª®¬ ­¤ã ¨«¨ § ¯ãáâ¨âì ä ©«
jp COMP.start
; ¤®«¦­  ã¡à âì ª®­æ. ¯à®¡¥«ë ¨ ãáâ. ¤«¨­ã áâப¨, ¥á«¨ ã१ « áì
EVALCMD: xor a
ld hl,Buffers.input_line.Symbols_Num ;!HARDCODE
ld c,(hl)
ld b,a
inc hl
add hl,bc
ld (hl),a ; 0 ¢ ª®­¥æ áâப¨
sbc hl,bc
ld de,Buffers.work.buffer2 ; 256 ¡ãä¥à
call EVALSTR
ld hl,Buffers.work.buffer2 ;work_buffer+256
ld de,Buffers.input_line.Path ; ªã¤ 
ld bc,max_len_comline+2
.loop: LD A,C
DEC A
JR Z,.error
;
ld a,(hl)
ldi
inc b
or a
jr nz,.loop
;
dec b
ld a,b
ld (Buffers.input_line.Symbols_Num),a ; ¤«¨­  áâப¨ (edline.asm)
;and a
ret
;
.error: LD (DE),A
LD A,DSS_Error.sys.ENV_ITEM_OVERFLOW
CALL print_err_message
SCF
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
DZ 'REM' : DW cmd_rem
DZ 'EXIT' : DW cmd_break
;
; DSS-ª®¬ ­¤ë
CMDLIST: DZ 'CD' : DW cmd_chdir
DZ 'DIR' : DW cmd_dir
DZ 'ECHO' : DW cmd_echo
DZ 'ECHO.' : DW cmd_echoLN
DZ 'PATH' : DW cmd_path
DZ 'MD' : DW cmd_mkdir
DZ 'REN' : DW cmd_rename
DZ 'DEL' : DW cmd_del
DZ 'RD' : DW cmd_rmdir
DZ 'INFO' : DW cmd_info
DZ 'SET' : DW cmd_set
DZ 'TIME' : DW cmd_time
DZ 'DATE' : DW cmd_date
DZ 'VER' : DW cmd_version
DZ 'CLS' : DW cmd_cls
DZ 'CHDIR' : DW cmd_chdir
DZ 'MKDIR' : DW cmd_mkdir
DZ 'RENAME' : DW cmd_rename
DZ 'ERASE' : DW cmd_del
DZ 'RMDIR' : DW cmd_rmdir
DZ 'HELP' : DW cmd_help
DZ 'VERSION' : DW cmd_version
DZ 'EXIT' : DW cmd_exit
DZ 'REBOOT' : DW cmd_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