1 TITLE PART5
- COMMAND Transient routines
.
15 CODERES
SEGMENT PUBLIC
24 DATARES
SEGMENT PUBLIC
25 EXTRN BATCH
:WORD,BATLOC
:DWORD,BATBYT
:BYTE,ECHOFLAG
:BYTE
26 EXTRN SINGLECOM
:WORD,RE_OUTSTR
:BYTE,PIPEFLAG
:BYTE,PIPEPTR
:WORD
27 EXTRN RE_INSTR
:BYTE,RE_OUT_APP
:BYTE,PARMBUF
:BYTE,PIPESTR
:BYTE
28 EXTRN LTPA
:WORD,ENVIRSEG
:WORD
31 TRANDATA
SEGMENT PUBLIC
32 EXTRN PIPEEMES
:BYTE,NULPATH
:BYTE,NOSPACE
:BYTE
33 EXTRN DBACK
:BYTE,PROMPT_TABLE
:BYTE
36 TRANSPACE
SEGMENT PUBLIC
37 EXTRN PATHCNT
:WORD,PATHPOS
:WORD,PATHSW
:WORD
38 EXTRN DESTISDIR
:BYTE,DESTTAIL
:WORD,DESTINFO
:BYTE
39 EXTRN BATHAND
:WORD,RESSEG
:WORD,TPA
:WORD,SWITCHAR
:BYTE
40 EXTRN BYTCNT
:WORD,COMBUF
:BYTE,DIRBUF
:BYTE,CHARBUF
:BYTE
50 TRANCODE
SEGMENT PUBLIC BYTE
51 ASSUME
CS:TRANGROUP
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
57 EXTRN CERROR
:NEAR,UPCONV
:NEAR,PIPEERRSYN
:NEAR,SETREST1
:NEAR
58 EXTRN SWITCH
:NEAR,SETREST1
:NEAR,BATCLOSE
:NEAR,MOVE_NAME
:NEAR
59 EXTRN FIND_PROMPT
:NEAR,FIND_PATH
:NEAR,DELETE_PATH
:NEAR
60 EXTRN STORE_CHAR
:NEAR,SCAN_DOUBLE_NULL
:NEAR,SCASB2
:NEAR
61 EXTRN PRINT_DRIVE
:NEAR,SAVUDIR
:NEAR,CRLF2
:NEAR,PAUSE:NEAR
63 PUBLIC PRINT_B
,PRINT_G
,DISPSIZE
,GETNUM
,OUTBYTE
64 PUBLIC DELIM
,OUT,OUT2
,SETPATH
,PATHCRUNCH
65 PUBLIC CRPRINT
,SCANOFF
,FCB_TO_ASCZ
66 PUBLIC PRINT_L
,PATH
,PATHCHRCMP
,PRINT_ESC
,PRINT_BACK
67 PUBLIC PRINT_EQ
,PRINT
,ZPRINT
,PRINT_PROMPT
68 PUBLIC DISP32BITS
,ERROR_PRINT
,ERROR_OUTPUT
69 PUBLIC FREE_TPA
,ALLOC_TPA
,PRESCAN
,GETBATBYT
73 ASSUME
DS:TRANGROUP
,ES:NOTHING
77 INT int_command
; Make lots of free memory
82 ASSUME
DS:TRANGROUP
,ES:RESGROUP
83 MOV BX,0FFFFH ; Re-allocate the transient
88 MOV [LTPA
],AX ; Re-compute evrything
103 PRESCAN: ; Cook the input buffer
104 ASSUME
DS:TRANGROUP
,ES:TRANGROUP
108 MOV SI,OFFSET TRANGROUP
:COMBUF
+2
113 CMP AL,22h
; is it a quote?
114 JNZ CountEnd
; no, try for end of road
116 JMP CountQuotes
; go get next char
118 CMP AL,13 ; end of road?
119 JNZ CountQuotes
; no, go back for next char
123 MOV SI,DI ; get back beginning of buffer
126 CALL TestKanj
; is it a leadin byte
127 JZ KanjiQuote
; no, check for quotes
128 MOV AH,AL ; save leadin
129 LODSB ; get trailing byte
130 CMP AX,8140h
; is it Kanji space
131 JNZ KanjiScan
; no, go get next
132 MOV [SI-2],2020h
; replace with spaces
133 JMP KanjiScan
; go get next char
135 CMP AL,22h
; beginning of quoted string
136 JNZ KanjiEnd
; no, check for end
138 JZ KanjiScan
; if count is zero, no quoting
140 LODSB ; get next byte
141 CMP AL,22h
; is it another quote
142 JNZ KanjiQuoteLoop
; no, get another
143 DEC CH ; yes, drop count
144 JMP KanjiScan
; go get next char
146 CMP AL,13 ; end of line character?
147 JNZ KanjiScan
; go back to beginning
148 POP CX ; get back original count
151 MOV SI,DI ; restore pointer to begining
159 INC DI ; fake STOSB into DS
160 LODSB ; grab second byte
161 MOV [DI],AL ; fake stosb into DS
169 CMP AL,22H
; " character
178 CMP AL,22H
; " character
185 CMP BYTE PTR [SI],'>'
188 INC [RE_OUT_APP
] ; Flag >>
193 MOV WORD PTR [RE_OUTSTR
],09H ; Cause an error later
197 MOV DI,OFFSET RESGROUP
:RE_OUTSTR
198 SETREOUTSTR: ; Get the output redirection name
206 STOSB ; store it into resgroup
207 JMP SHORT SETREOUTSTR
215 MOV WORD PTR [RE_INSTR
],09H ; Cause an error later
219 MOV DI,OFFSET RESGROUP
:RE_INSTR
220 JMP SHORT SETREOUTSTR
; Get the input redirection name
230 CMP AL,'|' ; Double '|'?
234 POP DS ; DS->RESGROUP
239 CMP BYTE PTR ES:[DI-1],':' ; Trailing ':' OK on devices
241 DEC DI ; Back up over trailing ':'
244 STOSB ; NUL terminate the string
245 POP DI ; Remember the start
247 MOV [DI],AH ; "delete" the redirection string
256 MOV DI,OFFSET RESGROUP
:PIPESTR
258 MOV SI,OFFSET TRANGROUP
:COMBUF
+2
260 PIPESETLP: ; Transfer the pipe into the resident pipe buffer
272 ASSUME
DS:TRANGROUP
,ES:TRANGROUP
284 ; Drive taken from FCB
285 ; DI = Dirsave pointer
287 ; Zero set if path dir, CHDIR to this dir, FCB filled with ?
288 ; NZ set if path/file, CHDIR to file, FCB has file (parsed fill ' ')
289 ; [DESTTAIL] points to parse point
290 ; Carry set if no CHDIRs worked, FCB not altered.
291 ; DESTISDIR set non zero if PATHCHRs in path (via SETPATH)
297 JNZ TRYPEEL ; If ? or * cannot be pure dir
302 MOV AL,"?" ; *.* is default file spec if pure dir
311 DEC SI ; Point at NUL
316 JNZ DELSTRT ; Last char is second KANJI byte, might be '\'
320 JZ PEELFAIL
; Trailing '/'
350 DELLOOP2: ; Set value of KPARSE
374 CMP BYTE PTR [SI+1],'.'
375 JZ PEELFAIL
; If . or .., pure cd should have worked
377 CMP al,DRVCHAR
; Special case dDRVCHAR,DIRCHARfile
382 JNZ NOTDOUBLESL
; Last char is second KANJI byte, might be '\'
399 CALL PATHCHRCMP
; Special case 'DIRCHAR'file
413 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR 02H ; Parse with default drive
419 MOV SI,WORD PTR[DIRBUF
+29+7]
420 MOV DI,WORD PTR[DIRBUF
+31+7]
423 ; Prints the 32-bit number DI:SI on the console in decimal. Uses a total
424 ; of 9 digit positions with leading blanks.
441 ; Conversion complete. Print 9-digit number.
443 MOV DI,OFFSET TRANGROUP
:CHARBUF
444 MOV CX,1810H
; Allow leading zero blanking for 8 digits
453 MOV DX,OFFSET TRANGROUP
:CHARBUF
493 ; Get one byte from the batch file and return it in AL. End-of-file
494 ; returns <CR> and ends batch mode. DS must be set to resident segment.
495 ; AH, CX, DX destroyed.
497 ADD WORD PTR [BATLOC
],1 ; Add one to file location
498 ADC WORD PTR [BATLOC
+2],0
500 MOV DX,OFFSET RESGROUP
:BATBYT
504 INT int_command
; Get one more byte from batch file
514 MOV ES,[BATCH
] ; Turn off batch
516 INT int_command
; free up the batch piece
518 MOV [BATCH
],0 ; AFTER DEALLOC in case of ^C
520 MOV AL,0DH ; If end-of-file, then end of line
521 CMP [SINGLECOM
],0FFF0H ; See if we need to set SINGLECOM
523 MOV [SINGLECOM
],-1 ; Cause termination
533 DEC SI ; Point to first non-delimiter
545 CMP AL,9 ; Check for TAB character
552 POP DS ; MAKE SURE DS IS IN TRANGROUP
555 CALL FIND_PROMPT
; LOOK FOR PROMPT STRING
556 JC PP0
; CAN'T FIND ONE
557 CMP BYTE PTR ES:[DI],0
560 CALL PRINT_DRIVE
; USE DEFAULT PROMPT
566 MOV AL,ES:[DI] ; GET A CHAR
569 JZ PP5
; NUL TERMINATED
570 CMP AL,"$" ; META CHARACTER?
579 MOV BX,OFFSET TRANGROUP
:PROMPT_TABLE
-3
603 POP ES ; RESTORE SEGMENTS
608 MOV DX,OFFSET TRANGROUP
:DBACK
629 ; Get an ASCIZ argument from the unformatted parms
630 ; DESTISDIR set if pathchars in string
631 ; DESTINFO set if ? or * in string
699 MOV [SI],AL ;Don't loose the CR
719 JNZ PSCANOFF
; ';' is not a delimiter
721 DEC SI ; Point to first non-delimiter
726 CALL PGETARG
; Pre scan for arguments
727 JZ DISPPATH
; Print the current path
728 CALL DELETE_PATH
; DELETE ANY OFFENDING NAME
729 CALL SCAN_DOUBLE_NULL
730 CALL MOVE_NAME
; MOVE IN PATH=
732 CMP AL,';' ; NUL path argument?
734 PATHSLP: ; Get the user specified path
751 CMP AL,';' ; ';' not a delimiter on PATH
770 CMP BYTE PTR ES:[DI],0
773 MOV DX,OFFSET TRANGROUP
:NULPATH
783 CALL SCASB2
; LOOK FOR NUL
788 FCB_TO_ASCZ: ; Convert DS:SI to ASCIZ ES:DI
821 MOV AH,AL ; Save first digit
822 CALL INDIG
; Another digit?
824 AAD ; Convert unpacked BCD to decimal
841 OUT2: ; Output binary number as two ASCII digits
842 AAM ; Convert binary to unpacked BCD
844 OR AX,3030H
; Add "0" bias to both digits
845 CMP AL,"0" ; Is MSD zero?
847 SUB AL,BH ; Suppress leading zero if enabled
849 MOV BH,0 ; Disable zero suppression
854 ; Print char in AL without affecting registers
870 MOV BX,OFFSET TRANGROUP
:CHARBUF
896 PRINT: ;$ TERMINATED STRING
902 XOR AX,AX ;NUL TERMINATED STRING
905 MOV BX,1 ;STD CON OUT
907 ; output string terminated by AL to handle BX, DS:DX points to string
917 REPNZ SCASB ; LOOK FOR TERMINATOR
923 ; WRITE CHARS AT DS:DX TO HANDLE IN BX, COUNT IN CX
942 MOV DX,OFFSET TRANGROUP
:NOSPACE
946 MOV DX,OFFSET TRANGROUP
:PIPEEMES