mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-12-01 18:15:47 +00:00
677 lines
16 KiB
NASM
677 lines
16 KiB
NASM
|
TITLE PART3 - COMMAND Transient routines.
|
|||
|
|
|||
|
INCLUDE COMSW.ASM
|
|||
|
|
|||
|
.xlist
|
|||
|
.xcref
|
|||
|
INCLUDE DOSSYM.ASM
|
|||
|
INCLUDE DEVSYM.ASM
|
|||
|
INCLUDE COMSEG.ASM
|
|||
|
.list
|
|||
|
.cref
|
|||
|
|
|||
|
INCLUDE COMEQU.ASM
|
|||
|
|
|||
|
|
|||
|
DATARES SEGMENT PUBLIC
|
|||
|
EXTRN BATCH:WORD,BATLOC:DWORD
|
|||
|
EXTRN RETCODE:WORD,ECHOFLAG:BYTE
|
|||
|
EXTRN SINGLECOM:WORD,FORFLAG:BYTE,UFORDRV:BYTE
|
|||
|
EXTRN FORSET:BYTE,FORCOM:BYTE,FORVAR:BYTE,FORPTR:WORD
|
|||
|
EXTRN FORUFCB:BYTE,FORFCB:BYTE,RE_INSTR:BYTE,RE_OUT_APP:BYTE
|
|||
|
EXTRN RE_OUTSTR:BYTE,PIPEFLAG:BYTE
|
|||
|
|
|||
|
DATARES ENDS
|
|||
|
|
|||
|
TRANDATA SEGMENT PUBLIC
|
|||
|
|
|||
|
EXTRN BADLAB:BYTE,SYNTMES:BYTE,FORNESTMES:BYTE
|
|||
|
EXTRN NOTFND:BYTE,FULDIR:BYTE,IFTAB:BYTE
|
|||
|
TRANDATA ENDS
|
|||
|
|
|||
|
TRANSPACE SEGMENT PUBLIC
|
|||
|
|
|||
|
EXTRN BATHAND:WORD,RESSEG:WORD,DIRBUF:BYTE,COMBUF:BYTE
|
|||
|
EXTRN GOTOLEN:WORD,IFNOTFLAG:BYTE
|
|||
|
|
|||
|
TRANSPACE ENDS
|
|||
|
|
|||
|
|
|||
|
TRANCODE SEGMENT PUBLIC BYTE
|
|||
|
ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING
|
|||
|
|
|||
|
EXTRN SCANOFF:NEAR,DOCOM:NEAR,DOCOM1:NEAR,CERROR:NEAR
|
|||
|
EXTRN PRINT:NEAR,TCOMMAND:NEAR,DELIM:NEAR,GETBATBYT:NEAR
|
|||
|
EXTRN FCB_TO_ASCZ:NEAR
|
|||
|
|
|||
|
PUBLIC GOTO,$IF,IFERLEV,SHIFT,IFEXISTS
|
|||
|
PUBLIC STRCOMP,MesTran,$FOR,IFNOT
|
|||
|
PUBLIC FORPROC,BATOPEN,BATCLOSE
|
|||
|
PUBLIC IOSET,TESTDOREIN,TESTDOREOUT
|
|||
|
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
FORTERM:
|
|||
|
MOV [FORFLAG],0
|
|||
|
CMP [SINGLECOM],0FF00H
|
|||
|
JNZ NOFORP2
|
|||
|
MOV [SINGLECOM],-1 ; Cause a terminate
|
|||
|
NOFORP2:
|
|||
|
JMP TCOMMAND
|
|||
|
|
|||
|
FORPROC:
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
CMP [FORUFCB],-1
|
|||
|
JZ NORMFOR
|
|||
|
MOV DX,OFFSET TRANGROUP:DIRBUF
|
|||
|
PUSH DS
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
MOV AH,SET_DMA
|
|||
|
INT int_command
|
|||
|
POP DS
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
MOV DX,OFFSET RESGROUP:FORFCB
|
|||
|
MOV AH,DIR_SEARCH_NEXT
|
|||
|
CMP [FORUFCB],0
|
|||
|
JZ DOFORSRCH
|
|||
|
MOV AH,DIR_SEARCH_FIRST
|
|||
|
MOV [FORUFCB],0
|
|||
|
DOFORSRCH:
|
|||
|
INT int_command
|
|||
|
OR AL,AL
|
|||
|
JNZ FORTERM
|
|||
|
PUSH DS
|
|||
|
POP ES
|
|||
|
ASSUME ES:RESGROUP
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
MOV SI,OFFSET TRANGROUP:DIRBUF
|
|||
|
MOV DI,OFFSET RESGROUP:FORSET
|
|||
|
MOV [FORPTR],DI
|
|||
|
LODSB ;Get drive spec
|
|||
|
ADD AL,'@'
|
|||
|
CMP AL,'@'
|
|||
|
JZ NDRV8
|
|||
|
CMP [UFORDRV],0
|
|||
|
JZ NDRV8
|
|||
|
MOV AH,':'
|
|||
|
STOSW
|
|||
|
NDRV8:
|
|||
|
CALL FCB_TO_ASCZ
|
|||
|
MOV BYTE PTR ES:[DI-1],0DH
|
|||
|
PUSH ES
|
|||
|
POP DS
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
NORMFOR:
|
|||
|
PUSH CS
|
|||
|
POP ES
|
|||
|
ASSUME ES:TRANGROUP
|
|||
|
MOV BX,[FORPTR]
|
|||
|
CMP BYTE PTR [BX],0
|
|||
|
JZ FORTERM
|
|||
|
MOV SI,BX
|
|||
|
PARMSUB0:
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
JNZ PARMSUB0
|
|||
|
MOV DX,SI ; DX points to next parm
|
|||
|
MOV SI,OFFSET RESGROUP:FORCOM
|
|||
|
MOV DI,OFFSET TRANGROUP:COMBUF+2
|
|||
|
XOR CX,CX
|
|||
|
TFORCOM:
|
|||
|
LODSB
|
|||
|
CMP AL,'%'
|
|||
|
JNZ NOFORPARM
|
|||
|
MOV AH,[FORVAR]
|
|||
|
CMP AH,[SI]
|
|||
|
JNZ NOFORPARM
|
|||
|
INC SI
|
|||
|
PUSH SI
|
|||
|
MOV SI,BX
|
|||
|
PARMSUB:
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
JZ PARMSUBDONE
|
|||
|
INC CX
|
|||
|
STOSB
|
|||
|
JMP SHORT PARMSUB
|
|||
|
PARMSUBDONE:
|
|||
|
POP SI ; Get back command line pointer
|
|||
|
JMP TFORCOM
|
|||
|
NOFORPARM:
|
|||
|
STOSB
|
|||
|
INC CX
|
|||
|
CMP AL,0DH
|
|||
|
JNZ TFORCOM
|
|||
|
DEC CX
|
|||
|
MOV [COMBUF+1],CL
|
|||
|
MOV [FORPTR],DX ; Point to next set element
|
|||
|
TEST [ECHOFLAG],-1
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
JZ NOECHO3
|
|||
|
MOV BYTE PTR ES:[DI-1],'$'
|
|||
|
MOV DX,OFFSET TRANGROUP:COMBUF+2
|
|||
|
CALL PRINT
|
|||
|
MOV BYTE PTR ES:[DI-1],0DH
|
|||
|
JMP DOCOM
|
|||
|
NOECHO3:
|
|||
|
JMP DOCOM1
|
|||
|
|
|||
|
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
|||
|
|
|||
|
FORNESTERR:
|
|||
|
PUSH DS
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
MOV DX,OFFSET TRANGROUP:FORNESTMES
|
|||
|
CMP [SINGLECOM],0FF00H
|
|||
|
JNZ NOFORP3
|
|||
|
MOV [SINGLECOM],-1 ; Cause termination
|
|||
|
NOFORP3:
|
|||
|
POP DS
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
JMP CERROR
|
|||
|
|
|||
|
$FOR:
|
|||
|
MOV SI,81H
|
|||
|
XOR CX,CX
|
|||
|
MOV ES,[RESSEG]
|
|||
|
ASSUME ES:RESGROUP
|
|||
|
MOV DI,OFFSET RESGROUP:FORSET
|
|||
|
XOR AL,AL
|
|||
|
MOV [UFORDRV],AL
|
|||
|
XCHG AL,[FORFLAG]
|
|||
|
OR AL,AL
|
|||
|
JNZ FORNESTERR
|
|||
|
MOV [FORPTR],DI
|
|||
|
MOV [FORUFCB],-1
|
|||
|
CALL SCANOFF
|
|||
|
LODSW
|
|||
|
CMP AL,'%'
|
|||
|
JNZ FORERRORJ
|
|||
|
MOV [FORVAR],AH
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,0DH
|
|||
|
JZ FORERRORJ2
|
|||
|
LODSW
|
|||
|
CMP AX,('N' SHL 8) OR 'I'
|
|||
|
JZ FOROK1
|
|||
|
CMP AX,('n' SHL 8) OR 'i'
|
|||
|
JNZ FORERRORJ
|
|||
|
FOROK1:
|
|||
|
CALL SCANOFF
|
|||
|
LODSB
|
|||
|
CMP AL,'('
|
|||
|
JNZ FORERRORJ
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,')' ; Special check for null set
|
|||
|
JNZ FORSETLP
|
|||
|
MOV DS,[RESSEG]
|
|||
|
JMP FORTERM
|
|||
|
FORSETLP:
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
FORERRORJ2:
|
|||
|
JZ FORERRORJ3
|
|||
|
CMP AL,')'
|
|||
|
JZ FORSETEND
|
|||
|
STOSB
|
|||
|
CMP AL,'*'
|
|||
|
JZ SETFORSCAN
|
|||
|
CMP AL,'?'
|
|||
|
JNZ NOFORSCAN
|
|||
|
SETFORSCAN:
|
|||
|
MOV [FORUFCB],1
|
|||
|
NOFORSCAN:
|
|||
|
CALL DELIM
|
|||
|
JNZ FORSETLP
|
|||
|
MOV BYTE PTR ES:[DI-1],0DH
|
|||
|
CALL SCANOFF
|
|||
|
JMP FORSETLP
|
|||
|
|
|||
|
FORSETEND:
|
|||
|
MOV AX,000DH
|
|||
|
CMP BYTE PTR ES:[DI-1],0DH
|
|||
|
JNZ FORSETTERM
|
|||
|
XOR AX,AX
|
|||
|
FORSETTERM:
|
|||
|
STOSW
|
|||
|
CALL SCANOFF
|
|||
|
LODSW
|
|||
|
CMP AX,('O' SHL 8) OR 'D'
|
|||
|
JZ FOROK2
|
|||
|
CMP AX,('o' SHL 8) OR 'd'
|
|||
|
FORERRORJ:
|
|||
|
JNZ FORERROR
|
|||
|
FOROK2:
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,0DH
|
|||
|
FORERRORJ3:
|
|||
|
JZ FORERROR
|
|||
|
MOV DI,OFFSET RESGROUP:FORCOM
|
|||
|
FORCOMLP:
|
|||
|
LODSB
|
|||
|
STOSB
|
|||
|
CMP AL,0DH
|
|||
|
JNZ FORCOMLP
|
|||
|
INC [FORFLAG]
|
|||
|
CMP [SINGLECOM],-1
|
|||
|
JNZ NOFORP
|
|||
|
MOV [SINGLECOM],0FF00H ; Flag single command for
|
|||
|
NOFORP:
|
|||
|
CMP [FORUFCB],1
|
|||
|
retnz
|
|||
|
PUSH ES
|
|||
|
POP DS
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
MOV DI,OFFSET RESGROUP:FORFCB
|
|||
|
MOV SI,OFFSET RESGROUP:FORSET
|
|||
|
CMP BYTE PTR [SI+1],':'
|
|||
|
JNZ NOSETUDRV
|
|||
|
INC [UFORDRV]
|
|||
|
NOSETUDRV:
|
|||
|
MOV AX,PARSE_FILE_DESCRIPTOR SHL 8
|
|||
|
INT int_command
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
|||
|
|
|||
|
IFERRORP:
|
|||
|
POP AX
|
|||
|
IFERROR:
|
|||
|
FORERROR:
|
|||
|
MOV DX,OFFSET TRANGROUP:SYNTMES
|
|||
|
JMP CERROR
|
|||
|
|
|||
|
$IF:
|
|||
|
MOV [IFNOTFLAG],0
|
|||
|
MOV SI,81H
|
|||
|
IFREENT:
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,0DH
|
|||
|
JZ IFERROR
|
|||
|
MOV BP,SI
|
|||
|
MOV DI,OFFSET TRANGROUP:IFTAB ; Prepare to search if table
|
|||
|
MOV CH,0
|
|||
|
IFINDCOM:
|
|||
|
MOV SI,BP
|
|||
|
MOV CL,[DI]
|
|||
|
INC DI
|
|||
|
JCXZ IFSTRING
|
|||
|
JMP SHORT FIRSTCOMP
|
|||
|
IFCOMP:
|
|||
|
JNZ IFDIF
|
|||
|
FIRSTCOMP:
|
|||
|
LODSB
|
|||
|
MOV AH,ES:[DI]
|
|||
|
INC DI
|
|||
|
CMP AL,AH
|
|||
|
JZ IFLP
|
|||
|
OR AH,20H ; Try lower case
|
|||
|
CMP AL,AH
|
|||
|
IFLP:
|
|||
|
LOOP IFCOMP
|
|||
|
IFDIF:
|
|||
|
LAHF
|
|||
|
ADD DI,CX ; Bump to next position without affecting flags
|
|||
|
MOV BX,[DI] ; Get handler address
|
|||
|
INC DI
|
|||
|
INC DI
|
|||
|
SAHF
|
|||
|
JNZ IFINDCOM
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
IFERRORJ:
|
|||
|
JZ IFERROR
|
|||
|
CALL DELIM
|
|||
|
JNZ IFINDCOM
|
|||
|
CALL SCANOFF
|
|||
|
JMP BX
|
|||
|
|
|||
|
IFNOT:
|
|||
|
NOT [IFNOTFLAG]
|
|||
|
JMP IFREENT
|
|||
|
|
|||
|
|
|||
|
IFSTRING:
|
|||
|
PUSH SI
|
|||
|
XOR CX,CX
|
|||
|
FIRST_STRING:
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
JZ IFERRORP
|
|||
|
CALL DELIM
|
|||
|
JZ EQUAL_CHECK
|
|||
|
INC CX
|
|||
|
JMP SHORT FIRST_STRING
|
|||
|
EQUAL_CHECK:
|
|||
|
CMP AL,'='
|
|||
|
JZ EQUAL_CHECK2
|
|||
|
CMP AL,0DH
|
|||
|
JZ IFERRORP
|
|||
|
LODSB
|
|||
|
JMP SHORT EQUAL_CHECK
|
|||
|
EQUAL_CHECK2:
|
|||
|
LODSB
|
|||
|
CMP AL,'='
|
|||
|
JNZ IFERRORP
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,0DH
|
|||
|
JZ IFERRORP
|
|||
|
POP DI
|
|||
|
REPE CMPSB
|
|||
|
JZ MATCH
|
|||
|
CMP BYTE PTR [SI-1],0DH
|
|||
|
JZ IFERRORJ
|
|||
|
SKIPSTRINGEND:
|
|||
|
LODSB
|
|||
|
NOTMATCH:
|
|||
|
CMP AL,0DH
|
|||
|
IFERRORJ2:
|
|||
|
JZ IFERRORJ
|
|||
|
CALL DELIM
|
|||
|
JNZ SKIPSTRINGEND
|
|||
|
MOV AL,-1
|
|||
|
JMP SHORT IFRET
|
|||
|
MATCH:
|
|||
|
LODSB
|
|||
|
CALL DELIM
|
|||
|
JNZ NOTMATCH
|
|||
|
XOR AL,AL
|
|||
|
JMP SHORT IFRET
|
|||
|
|
|||
|
IFEXISTS:
|
|||
|
MOV DI,OFFSET TRANGROUP:DIRBUF
|
|||
|
MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 01H
|
|||
|
INT int_command
|
|||
|
MOV AH,FCB_OPEN
|
|||
|
MOV DX,DI
|
|||
|
INT int_command
|
|||
|
IFRET:
|
|||
|
TEST [IFNOTFLAG],-1
|
|||
|
JZ REALTEST
|
|||
|
NOT AL
|
|||
|
REALTEST:
|
|||
|
OR AL,AL
|
|||
|
JZ IFTRUE
|
|||
|
JMP TCOMMAND
|
|||
|
IFTRUE:
|
|||
|
CALL SCANOFF
|
|||
|
MOV CX,SI
|
|||
|
SUB CX,81H
|
|||
|
SUB DS:[80H],CL
|
|||
|
MOV CL,DS:[80H]
|
|||
|
MOV [COMBUF+1],CL
|
|||
|
MOV DI,OFFSET TRANGROUP:COMBUF+2
|
|||
|
REP MOVSB
|
|||
|
MOV AL,0DH
|
|||
|
STOSB
|
|||
|
JMP DOCOM1
|
|||
|
|
|||
|
IFERLEV:
|
|||
|
MOV BH,10
|
|||
|
XOR BL,BL
|
|||
|
GETNUMLP:
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
JZ IFERRORJ2
|
|||
|
CALL DELIM
|
|||
|
JZ GOTNUM
|
|||
|
SUB AL,'0'
|
|||
|
XCHG AL,BL
|
|||
|
MUL BH
|
|||
|
ADD AL,BL
|
|||
|
XCHG AL,BL
|
|||
|
JMP SHORT GETNUMLP
|
|||
|
GOTNUM:
|
|||
|
PUSH DS
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
MOV AH,BYTE PTR [RETCODE]
|
|||
|
POP DS
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
XOR AL,AL
|
|||
|
CMP AH,BL
|
|||
|
JAE IFRET
|
|||
|
DEC AL
|
|||
|
JMP SHORT IFRET
|
|||
|
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
|
|||
|
SHIFT:
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
MOV AX,[BATCH]
|
|||
|
TEST AX,-1
|
|||
|
retz
|
|||
|
MOV ES,AX
|
|||
|
MOV DS,AX
|
|||
|
ASSUME DS:NOTHING,ES:NOTHING
|
|||
|
XOR CX,CX
|
|||
|
MOV AX,CX
|
|||
|
MOV DI,CX
|
|||
|
DEC CX
|
|||
|
REPNZ SCASB
|
|||
|
MOV SI,DI
|
|||
|
INC SI
|
|||
|
INC SI
|
|||
|
MOV CX,9
|
|||
|
REP MOVSW ; Perform shift of existing parms
|
|||
|
CMP WORD PTR [DI],-1
|
|||
|
retz ; No new parm
|
|||
|
MOV SI,[DI]
|
|||
|
MOV WORD PTR [DI],-1 ; Assume no parm
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
SKIPCRLP:
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
JNZ SKIPCRLP
|
|||
|
CMP BYTE PTR [SI],0
|
|||
|
retz ; End of parms
|
|||
|
MOV ES:[DI],SI ; Pointer to next parm as %9
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
|||
|
GOTO:
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
TEST [BATCH],-1
|
|||
|
retz ; If not in batch mode, a nop
|
|||
|
XOR DX,DX
|
|||
|
MOV WORD PTR [BATLOC],DX ; Back to start
|
|||
|
MOV WORD PTR [BATLOC+2],DX
|
|||
|
CALL BATOPEN ; Find the batch file
|
|||
|
MOV DI,FCB+1 ; Get the label
|
|||
|
MOV CX,11
|
|||
|
MOV AL,' '
|
|||
|
REPNE SCASB
|
|||
|
JNZ NOINC
|
|||
|
INC CX
|
|||
|
NOINC:
|
|||
|
SUB CX,11
|
|||
|
NEG CX
|
|||
|
MOV [GOTOLEN],CX
|
|||
|
CALL GETBATBYT
|
|||
|
CMP AL,':'
|
|||
|
JZ CHKLABEL
|
|||
|
LABLKLP: ; Look for the label
|
|||
|
CALL GETBATBYT
|
|||
|
CMP AL,0AH
|
|||
|
JNZ LABLKTST
|
|||
|
CALL GETBATBYT
|
|||
|
CMP AL,':'
|
|||
|
JZ CHKLABEL
|
|||
|
LABLKTST:
|
|||
|
TEST [BATCH],-1
|
|||
|
JNZ LABLKLP
|
|||
|
CALL BATCLOSE
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV DX,OFFSET TRANGROUP:BADLAB
|
|||
|
JMP CERROR
|
|||
|
|
|||
|
CHKLABEL:
|
|||
|
MOV DI,FCB+1
|
|||
|
MOV CX,[GOTOLEN]
|
|||
|
NEXTCHRLP:
|
|||
|
PUSH CX
|
|||
|
CALL GETBATBYT
|
|||
|
POP CX
|
|||
|
OR AL,20H
|
|||
|
CMP AL,ES:[DI]
|
|||
|
JNZ TRYUPPER
|
|||
|
JMP SHORT NEXTLABCHR
|
|||
|
TRYUPPER:
|
|||
|
SUB AL,20H
|
|||
|
CMP AL,ES:[DI]
|
|||
|
JNZ LABLKTST
|
|||
|
NEXTLABCHR:
|
|||
|
INC DI
|
|||
|
LOOP NEXTCHRLP
|
|||
|
CALL GETBATBYT
|
|||
|
CMP AL,' '
|
|||
|
JA LABLKTST
|
|||
|
CMP AL,0DH
|
|||
|
JZ SKIPLFEED
|
|||
|
TONEXTBATLIN:
|
|||
|
CALL GETBATBYT
|
|||
|
CMP AL,0DH
|
|||
|
JNZ TONEXTBATLIN
|
|||
|
SKIPLFEED:
|
|||
|
CALL GETBATBYT
|
|||
|
BATCLOSE:
|
|||
|
MOV BX,CS:[BATHAND]
|
|||
|
MOV AH,CLOSE
|
|||
|
INT int_command
|
|||
|
return
|
|||
|
|
|||
|
BATOPEN:
|
|||
|
;Open the BATCH file, If open fails, AL is drive of batch file (A=1)
|
|||
|
ASSUME DS:RESGROUP,ES:TRANGROUP
|
|||
|
PUSH DS
|
|||
|
MOV DS,[BATCH]
|
|||
|
ASSUME DS:NOTHING
|
|||
|
XOR DX,DX
|
|||
|
MOV AX,OPEN SHL 8
|
|||
|
INT int_command ; Open the batch file
|
|||
|
JC SETERRDL
|
|||
|
POP DS
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
MOV [BATHAND],AX
|
|||
|
MOV BX,AX
|
|||
|
MOV DX,WORD PTR [BATLOC]
|
|||
|
MOV CX,WORD PTR [BATLOC+2]
|
|||
|
MOV AX,LSEEK SHL 8 ; Go to the right spot
|
|||
|
INT int_command
|
|||
|
return
|
|||
|
|
|||
|
SETERRDL:
|
|||
|
MOV BX,DX
|
|||
|
MOV AL,[BX] ; Get drive spec
|
|||
|
SUB AL,'@' ; A = 1
|
|||
|
POP DS
|
|||
|
STC ; SUB mucked over carry
|
|||
|
return
|
|||
|
|
|||
|
MESTRAN:
|
|||
|
ASSUME DS:NOTHING,ES:NOTHING
|
|||
|
LODSB
|
|||
|
CMP AL,"$"
|
|||
|
retz
|
|||
|
STOSB
|
|||
|
JMP MESTRAN
|
|||
|
IOSET:
|
|||
|
; ALL REGISTERS PRESERVED
|
|||
|
ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
|
|||
|
PUSH DS
|
|||
|
PUSH DX
|
|||
|
PUSH AX
|
|||
|
PUSH BX
|
|||
|
PUSH CX
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
CMP [PIPEFLAG],0
|
|||
|
JNZ NOREDIR ; Don't muck up the pipe
|
|||
|
CALL TESTDOREIN
|
|||
|
CALL TESTDOREOUT
|
|||
|
NOREDIR:
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
POP DX
|
|||
|
POP DS
|
|||
|
ASSUME DS:NOTHING
|
|||
|
return
|
|||
|
|
|||
|
TESTDOREIN:
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
CMP [RE_INSTR],0
|
|||
|
retz
|
|||
|
MOV DX,OFFSET RESGROUP:RE_INSTR
|
|||
|
MOV AX,(OPEN SHL 8)
|
|||
|
INT int_command
|
|||
|
MOV DX,OFFSET TRANGROUP:NOTFND
|
|||
|
JC REDIRERR
|
|||
|
MOV BX,AX
|
|||
|
MOV AL,0FFH
|
|||
|
XCHG AL,[BX.PDB_JFN_Table]
|
|||
|
MOV DS:[PDB_JFN_Table],AL
|
|||
|
return
|
|||
|
|
|||
|
REDIRERR:
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
JMP CERROR
|
|||
|
|
|||
|
TESTDOREOUT:
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
CMP [RE_OUTSTR],0
|
|||
|
JZ NOREOUT
|
|||
|
CMP [RE_OUT_APP],0
|
|||
|
JZ REOUTCRT
|
|||
|
MOV DX,OFFSET RESGROUP:RE_OUTSTR
|
|||
|
MOV AX,(OPEN SHL 8) OR 1
|
|||
|
INT int_command
|
|||
|
JC REOUTCRT
|
|||
|
XOR DX,DX
|
|||
|
XOR CX,CX
|
|||
|
MOV BX,AX
|
|||
|
MOV AX,(LSEEK SHL 8) OR 2
|
|||
|
INT int_command
|
|||
|
JMP SHORT SET_REOUT
|
|||
|
REOUTCRT:
|
|||
|
MOV DX,OFFSET RESGROUP:RE_OUTSTR
|
|||
|
XOR CX,CX
|
|||
|
MOV AH,CREAT
|
|||
|
INT int_command
|
|||
|
MOV DX,OFFSET TRANGROUP:FULDIR
|
|||
|
JC REDIRERR
|
|||
|
MOV BX,AX
|
|||
|
SET_REOUT:
|
|||
|
MOV AL,0FFH
|
|||
|
XCHG AL,[BX.PDB_JFN_Table]
|
|||
|
MOV DS:[PDB_JFN_Table+1],AL
|
|||
|
NOREOUT:
|
|||
|
return
|
|||
|
|
|||
|
STRCOMP:
|
|||
|
; Compare ASCIZ DS:SI with ES:DI.
|
|||
|
; SI,DI destroyed.
|
|||
|
CMPSB
|
|||
|
retnz ; Strings not equal
|
|||
|
cmp byte ptr [SI-1],0 ; Hit NUL terminator?
|
|||
|
retz ; Yes, strings equal
|
|||
|
jmp short STRCOMP ; Equal so far, keep going
|
|||
|
|
|||
|
|
|||
|
|
|||
|
TRANCODE ENDS
|
|||
|
END
|
|||
|
|