mirror of
https://github.com/microsoft/MS-DOS.git
synced 2025-01-22 17:22:44 -05:00
953 lines
24 KiB
NASM
953 lines
24 KiB
NASM
|
TITLE PART5 - COMMAND Transient routines.
|
|||
|
|
|||
|
INCLUDE COMSW.ASM
|
|||
|
|
|||
|
.xlist
|
|||
|
.xcref
|
|||
|
INCLUDE DOSSYM.ASM
|
|||
|
INCLUDE DEVSYM.ASM
|
|||
|
INCLUDE COMSEG.ASM
|
|||
|
.list
|
|||
|
.cref
|
|||
|
|
|||
|
INCLUDE COMEQU.ASM
|
|||
|
|
|||
|
CODERES SEGMENT PUBLIC
|
|||
|
|
|||
|
IF IBMVER
|
|||
|
EXTRN EXEC_WAIT:NEAR
|
|||
|
ENDIF
|
|||
|
|
|||
|
CODERES ENDS
|
|||
|
|
|||
|
|
|||
|
DATARES SEGMENT PUBLIC
|
|||
|
EXTRN BATCH:WORD,BATLOC:DWORD,BATBYT:BYTE,ECHOFLAG:BYTE
|
|||
|
EXTRN SINGLECOM:WORD,RE_OUTSTR:BYTE,PIPEFLAG:BYTE,PIPEPTR:WORD
|
|||
|
EXTRN RE_INSTR:BYTE,RE_OUT_APP:BYTE,PARMBUF:BYTE,PIPESTR:BYTE
|
|||
|
EXTRN LTPA:WORD,ENVIRSEG:WORD
|
|||
|
DATARES ENDS
|
|||
|
|
|||
|
TRANDATA SEGMENT PUBLIC
|
|||
|
EXTRN PIPEEMES:BYTE,NULPATH:BYTE,NOSPACE:BYTE
|
|||
|
EXTRN DBACK:BYTE,PROMPT_TABLE:BYTE
|
|||
|
TRANDATA ENDS
|
|||
|
|
|||
|
TRANSPACE SEGMENT PUBLIC
|
|||
|
EXTRN PATHCNT:WORD,PATHPOS:WORD,PATHSW:WORD
|
|||
|
EXTRN DESTISDIR:BYTE,DESTTAIL:WORD,DESTINFO:BYTE
|
|||
|
EXTRN BATHAND:WORD,RESSEG:WORD,TPA:WORD,SWITCHAR:BYTE
|
|||
|
EXTRN BYTCNT:WORD,COMBUF:BYTE,DIRBUF:BYTE,CHARBUF:BYTE
|
|||
|
|
|||
|
|
|||
|
IF KANJI
|
|||
|
EXTRN KPARSE:BYTE
|
|||
|
ENDIF
|
|||
|
|
|||
|
TRANSPACE ENDS
|
|||
|
|
|||
|
|
|||
|
TRANCODE SEGMENT PUBLIC BYTE
|
|||
|
ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING
|
|||
|
|
|||
|
IF KANJI
|
|||
|
EXTRN TESTKANJ:NEAR
|
|||
|
ENDIF
|
|||
|
|
|||
|
EXTRN CERROR:NEAR,UPCONV:NEAR,PIPEERRSYN:NEAR,SETREST1:NEAR
|
|||
|
EXTRN SWITCH:NEAR,SETREST1:NEAR,BATCLOSE:NEAR,MOVE_NAME:NEAR
|
|||
|
EXTRN FIND_PROMPT:NEAR,FIND_PATH:NEAR,DELETE_PATH:NEAR
|
|||
|
EXTRN STORE_CHAR:NEAR,SCAN_DOUBLE_NULL:NEAR,SCASB2:NEAR
|
|||
|
EXTRN PRINT_DRIVE:NEAR,SAVUDIR:NEAR,CRLF2:NEAR,PAUSE:NEAR
|
|||
|
|
|||
|
PUBLIC PRINT_B,PRINT_G,DISPSIZE,GETNUM,OUTBYTE
|
|||
|
PUBLIC DELIM,OUT,OUT2,SETPATH,PATHCRUNCH
|
|||
|
PUBLIC CRPRINT,SCANOFF,FCB_TO_ASCZ
|
|||
|
PUBLIC PRINT_L,PATH,PATHCHRCMP,PRINT_ESC,PRINT_BACK
|
|||
|
PUBLIC PRINT_EQ,PRINT,ZPRINT,PRINT_PROMPT
|
|||
|
PUBLIC DISP32BITS,ERROR_PRINT,ERROR_OUTPUT
|
|||
|
PUBLIC FREE_TPA,ALLOC_TPA,PRESCAN,GETBATBYT
|
|||
|
|
|||
|
|
|||
|
FREE_TPA:
|
|||
|
ASSUME DS:TRANGROUP,ES:NOTHING
|
|||
|
PUSH ES
|
|||
|
MOV ES,[TPA]
|
|||
|
MOV AH,DEALLOC
|
|||
|
INT int_command ; Make lots of free memory
|
|||
|
POP ES
|
|||
|
return
|
|||
|
|
|||
|
ALLOC_TPA:
|
|||
|
ASSUME DS:TRANGROUP,ES:RESGROUP
|
|||
|
MOV BX,0FFFFH ; Re-allocate the transient
|
|||
|
MOV AH,ALLOC
|
|||
|
INT int_command
|
|||
|
MOV AH,ALLOC
|
|||
|
INT int_command
|
|||
|
MOV [LTPA],AX ; Re-compute evrything
|
|||
|
MOV [TPA],AX
|
|||
|
MOV BX,AX
|
|||
|
MOV AX,CS
|
|||
|
SUB AX,BX
|
|||
|
MOV DX,16
|
|||
|
MUL DX
|
|||
|
OR DX,DX
|
|||
|
JZ SAVSIZ2
|
|||
|
MOV AX,-1
|
|||
|
SAVSIZ2:
|
|||
|
MOV [BYTCNT],AX
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
PRESCAN: ; Cook the input buffer
|
|||
|
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
|||
|
XOR CX,CX
|
|||
|
MOV ES,[RESSEG]
|
|||
|
ASSUME ES:RESGROUP
|
|||
|
MOV SI,OFFSET TRANGROUP:COMBUF+2
|
|||
|
MOV DI,SI
|
|||
|
|
|||
|
CountQuotes:
|
|||
|
LODSB ; get a byte
|
|||
|
CMP AL,22h ; is it a quote?
|
|||
|
JNZ CountEnd ; no, try for end of road
|
|||
|
INC CH ; bump count
|
|||
|
JMP CountQuotes ; go get next char
|
|||
|
CountEnd:
|
|||
|
CMP AL,13 ; end of road?
|
|||
|
JNZ CountQuotes ; no, go back for next char
|
|||
|
|
|||
|
IF KANJI
|
|||
|
PUSH CX ; save count
|
|||
|
MOV SI,DI ; get back beginning of buffer
|
|||
|
KanjiScan:
|
|||
|
LODSB ; get a byte
|
|||
|
CALL TestKanj ; is it a leadin byte
|
|||
|
JZ KanjiQuote ; no, check for quotes
|
|||
|
MOV AH,AL ; save leadin
|
|||
|
LODSB ; get trailing byte
|
|||
|
CMP AX,8140h ; is it Kanji space
|
|||
|
JNZ KanjiScan ; no, go get next
|
|||
|
MOV [SI-2],2020h ; replace with spaces
|
|||
|
JMP KanjiScan ; go get next char
|
|||
|
KanjiQuote:
|
|||
|
CMP AL,22h ; beginning of quoted string
|
|||
|
JNZ KanjiEnd ; no, check for end
|
|||
|
DEC CH ; drop count
|
|||
|
JZ KanjiScan ; if count is zero, no quoting
|
|||
|
KanjiQuoteLoop:
|
|||
|
LODSB ; get next byte
|
|||
|
CMP AL,22h ; is it another quote
|
|||
|
JNZ KanjiQuoteLoop ; no, get another
|
|||
|
DEC CH ; yes, drop count
|
|||
|
JMP KanjiScan ; go get next char
|
|||
|
KanjiEnd:
|
|||
|
CMP AL,13 ; end of line character?
|
|||
|
JNZ KanjiScan ; go back to beginning
|
|||
|
POP CX ; get back original count
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV SI,DI ; restore pointer to begining
|
|||
|
PRESCANLP:
|
|||
|
LODSB
|
|||
|
|
|||
|
IF KANJI
|
|||
|
CALL TESTKANJ
|
|||
|
JZ NOTKANJ6
|
|||
|
MOV [DI],AL
|
|||
|
INC DI ; fake STOSB into DS
|
|||
|
LODSB ; grab second byte
|
|||
|
MOV [DI],AL ; fake stosb into DS
|
|||
|
INC DI
|
|||
|
INC CL
|
|||
|
INC CL
|
|||
|
JMP PRESCANLP
|
|||
|
NOTKANJ6:
|
|||
|
ENDIF
|
|||
|
|
|||
|
CMP AL,22H ; " character
|
|||
|
JNZ TRYGREATER
|
|||
|
DEC CH
|
|||
|
JZ TRYGREATER
|
|||
|
QLOOP:
|
|||
|
MOV [DI],AL
|
|||
|
INC DI
|
|||
|
INC CL
|
|||
|
LODSB
|
|||
|
CMP AL,22H ; " character
|
|||
|
JNZ QLOOP
|
|||
|
DEC CH
|
|||
|
|
|||
|
TRYGREATER:
|
|||
|
CMP AL,'>'
|
|||
|
JNZ NOOUT
|
|||
|
CMP BYTE PTR [SI],'>'
|
|||
|
JNZ NOAPPND
|
|||
|
LODSB
|
|||
|
INC [RE_OUT_APP] ; Flag >>
|
|||
|
NOAPPND:
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,0DH
|
|||
|
JNZ GOTREOFIL
|
|||
|
MOV WORD PTR [RE_OUTSTR],09H ; Cause an error later
|
|||
|
JMP SHORT PRESCANEND
|
|||
|
GOTREOFIL:
|
|||
|
PUSH DI
|
|||
|
MOV DI,OFFSET RESGROUP:RE_OUTSTR
|
|||
|
SETREOUTSTR: ; Get the output redirection name
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
JZ GOTRESTR
|
|||
|
CALL DELIM
|
|||
|
JZ GOTRESTR
|
|||
|
CMP AL,[SWITCHAR]
|
|||
|
JZ GOTRESTR
|
|||
|
STOSB ; store it into resgroup
|
|||
|
JMP SHORT SETREOUTSTR
|
|||
|
|
|||
|
NOOUT:
|
|||
|
CMP AL,'<'
|
|||
|
JNZ CHKPIPE
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,0DH
|
|||
|
JNZ GOTREIFIL
|
|||
|
MOV WORD PTR [RE_INSTR],09H ; Cause an error later
|
|||
|
JMP SHORT PRESCANEND
|
|||
|
GOTREIFIL:
|
|||
|
PUSH DI
|
|||
|
MOV DI,OFFSET RESGROUP:RE_INSTR
|
|||
|
JMP SHORT SETREOUTSTR ; Get the input redirection name
|
|||
|
|
|||
|
CHKPIPE:
|
|||
|
MOV AH,AL
|
|||
|
CMP AH,'|'
|
|||
|
JNZ CONTPRESCAN
|
|||
|
INC [PIPEFLAG]
|
|||
|
CALL SCANOFF
|
|||
|
CMP AL,0DH
|
|||
|
JZ PIPEERRSYNJ5
|
|||
|
CMP AL,'|' ; Double '|'?
|
|||
|
JNZ CONTPRESCAN
|
|||
|
PIPEERRSYNJ5:
|
|||
|
PUSH ES
|
|||
|
POP DS ; DS->RESGROUP
|
|||
|
JMP PIPEERRSYN
|
|||
|
|
|||
|
GOTRESTR:
|
|||
|
XCHG AH,AL
|
|||
|
CMP BYTE PTR ES:[DI-1],':' ; Trailing ':' OK on devices
|
|||
|
JNZ NOTTRAILCOL
|
|||
|
DEC DI ; Back up over trailing ':'
|
|||
|
NOTTRAILCOL:
|
|||
|
XOR AL,AL
|
|||
|
STOSB ; NUL terminate the string
|
|||
|
POP DI ; Remember the start
|
|||
|
CONTPRESCAN:
|
|||
|
MOV [DI],AH ; "delete" the redirection string
|
|||
|
INC DI
|
|||
|
CMP AH,0DH
|
|||
|
JZ PRESCANEND
|
|||
|
INC CL
|
|||
|
JMP PRESCANLP
|
|||
|
PRESCANEND:
|
|||
|
CMP [PIPEFLAG],0
|
|||
|
JZ ISNOPIPE
|
|||
|
MOV DI,OFFSET RESGROUP:PIPESTR
|
|||
|
MOV [PIPEPTR],DI
|
|||
|
MOV SI,OFFSET TRANGROUP:COMBUF+2
|
|||
|
CALL SCANOFF
|
|||
|
PIPESETLP: ; Transfer the pipe into the resident pipe buffer
|
|||
|
LODSB
|
|||
|
STOSB
|
|||
|
CMP AL,0DH
|
|||
|
JNZ PIPESETLP
|
|||
|
ISNOPIPE:
|
|||
|
MOV [COMBUF+1],CL
|
|||
|
CMP [PIPEFLAG],0
|
|||
|
PUSH CS
|
|||
|
POP ES
|
|||
|
return
|
|||
|
|
|||
|
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
|||
|
|
|||
|
PATHCHRCMP:
|
|||
|
CMP [SWITCHAR],'/'
|
|||
|
JZ NOSLASHT
|
|||
|
CMP AL,'/'
|
|||
|
retz
|
|||
|
NOSLASHT:
|
|||
|
CMP AL,'\'
|
|||
|
return
|
|||
|
|
|||
|
PATHCRUNCH:
|
|||
|
; Drive taken from FCB
|
|||
|
; DI = Dirsave pointer
|
|||
|
;
|
|||
|
; Zero set if path dir, CHDIR to this dir, FCB filled with ?
|
|||
|
; NZ set if path/file, CHDIR to file, FCB has file (parsed fill ' ')
|
|||
|
; [DESTTAIL] points to parse point
|
|||
|
; Carry set if no CHDIRs worked, FCB not altered.
|
|||
|
; DESTISDIR set non zero if PATHCHRs in path (via SETPATH)
|
|||
|
|
|||
|
MOV DL,DS:[FCB]
|
|||
|
CALL SAVUDIR
|
|||
|
CALL SETPATH
|
|||
|
TEST [DESTINFO],2
|
|||
|
JNZ TRYPEEL ; If ? or * cannot be pure dir
|
|||
|
MOV AH,CHDIR
|
|||
|
INT int_command
|
|||
|
JC TRYPEEL
|
|||
|
CALL SETREST1
|
|||
|
MOV AL,"?" ; *.* is default file spec if pure dir
|
|||
|
MOV DI,5DH
|
|||
|
MOV CX,11
|
|||
|
REP STOSB
|
|||
|
XOR AL,AL ; Set zero
|
|||
|
return
|
|||
|
|
|||
|
TRYPEEL:
|
|||
|
MOV SI,[PATHPOS]
|
|||
|
DEC SI ; Point at NUL
|
|||
|
MOV AL,[SI-1]
|
|||
|
|
|||
|
IF KANJI
|
|||
|
CMP [KPARSE],0
|
|||
|
JNZ DELSTRT ; Last char is second KANJI byte, might be '\'
|
|||
|
ENDIF
|
|||
|
|
|||
|
CALL PATHCHRCMP
|
|||
|
JZ PEELFAIL ; Trailing '/'
|
|||
|
|
|||
|
IF KANJI
|
|||
|
DELSTRT:
|
|||
|
MOV CX,SI
|
|||
|
MOV SI,DX
|
|||
|
PUSH DX
|
|||
|
DELLOOP:
|
|||
|
CMP SI,CX
|
|||
|
JZ GOTDELE
|
|||
|
LODSB
|
|||
|
CALL TESTKANJ
|
|||
|
JZ NOTKANJ8
|
|||
|
INC SI
|
|||
|
JMP DELLOOP
|
|||
|
|
|||
|
NOTKANJ8:
|
|||
|
CALL PATHCHRCMP
|
|||
|
JNZ DELLOOP
|
|||
|
MOV DX,SI
|
|||
|
DEC DX
|
|||
|
JMP DELLOOP
|
|||
|
|
|||
|
GOTDELE:
|
|||
|
MOV SI,DX
|
|||
|
POP DX
|
|||
|
CMP SI,DX
|
|||
|
JZ BADRET
|
|||
|
MOV CX,SI
|
|||
|
MOV SI,DX
|
|||
|
DELLOOP2: ; Set value of KPARSE
|
|||
|
CMP SI,CX
|
|||
|
JZ KSET
|
|||
|
MOV [KPARSE],0
|
|||
|
LODSB
|
|||
|
CALL TESTKANJ
|
|||
|
JZ DELLOOP2
|
|||
|
INC SI
|
|||
|
INC [KPARSE]
|
|||
|
JMP DELLOOP2
|
|||
|
|
|||
|
KSET:
|
|||
|
ELSE
|
|||
|
DELLOOP:
|
|||
|
CMP SI,DX
|
|||
|
JZ BADRET
|
|||
|
MOV AL,[SI]
|
|||
|
CALL PATHCHRCMP
|
|||
|
JZ TRYCD
|
|||
|
DEC SI
|
|||
|
JMP SHORT DELLOOP
|
|||
|
ENDIF
|
|||
|
|
|||
|
TRYCD:
|
|||
|
CMP BYTE PTR [SI+1],'.'
|
|||
|
JZ PEELFAIL ; If . or .., pure cd should have worked
|
|||
|
mov al,[si-1]
|
|||
|
CMP al,DRVCHAR ; Special case dDRVCHAR,DIRCHARfile
|
|||
|
JZ BADRET
|
|||
|
|
|||
|
IF KANJI
|
|||
|
CMP [KPARSE],0
|
|||
|
JNZ NOTDOUBLESL ; Last char is second KANJI byte, might be '\'
|
|||
|
ENDIF
|
|||
|
|
|||
|
CALL PATHCHRCMP
|
|||
|
JNZ NOTDOUBLESL
|
|||
|
PEELFAIL:
|
|||
|
STC ; //
|
|||
|
return
|
|||
|
NOTDOUBLESL:
|
|||
|
MOV BYTE PTR [SI],0
|
|||
|
MOV AH,CHDIR
|
|||
|
INT int_command
|
|||
|
JNC CDSUCC
|
|||
|
return
|
|||
|
|
|||
|
BADRET:
|
|||
|
MOV AL,[SI]
|
|||
|
CALL PATHCHRCMP ; Special case 'DIRCHAR'file
|
|||
|
STC
|
|||
|
retnz
|
|||
|
XOR BL,BL
|
|||
|
XCHG BL,[SI+1]
|
|||
|
MOV AH,CHDIR
|
|||
|
INT int_command
|
|||
|
retc
|
|||
|
MOV [SI+1],BL
|
|||
|
CDSUCC:
|
|||
|
CALL SETREST1
|
|||
|
INC SI ; Reset zero
|
|||
|
MOV [DESTTAIL],SI
|
|||
|
MOV DI,FCB
|
|||
|
MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 02H ; Parse with default drive
|
|||
|
INT int_command
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
DISPSIZE:
|
|||
|
MOV SI,WORD PTR[DIRBUF+29+7]
|
|||
|
MOV DI,WORD PTR[DIRBUF+31+7]
|
|||
|
|
|||
|
DISP32BITS:
|
|||
|
; Prints the 32-bit number DI:SI on the console in decimal. Uses a total
|
|||
|
; of 9 digit positions with leading blanks.
|
|||
|
XOR AX,AX
|
|||
|
MOV BX,AX
|
|||
|
MOV BP,AX
|
|||
|
MOV CX,32
|
|||
|
CONVLP:
|
|||
|
SHL SI,1
|
|||
|
RCL DI,1
|
|||
|
XCHG AX,BP
|
|||
|
CALL CONVWRD
|
|||
|
XCHG AX,BP
|
|||
|
XCHG AX,BX
|
|||
|
CALL CONVWRD
|
|||
|
XCHG AX,BX
|
|||
|
ADC AL,0
|
|||
|
LOOP CONVLP
|
|||
|
|
|||
|
; Conversion complete. Print 9-digit number.
|
|||
|
|
|||
|
MOV DI,OFFSET TRANGROUP:CHARBUF
|
|||
|
MOV CX,1810H ; Allow leading zero blanking for 8 digits
|
|||
|
XCHG DX,AX
|
|||
|
CALL DIGIT
|
|||
|
XCHG AX,BX
|
|||
|
CALL OUTWORD
|
|||
|
XCHG AX,BP
|
|||
|
CALL OUTWORD
|
|||
|
XOR AX,AX
|
|||
|
STOSB
|
|||
|
MOV DX,OFFSET TRANGROUP:CHARBUF
|
|||
|
JMP ZPRINT
|
|||
|
|
|||
|
OUTWORD:
|
|||
|
PUSH AX
|
|||
|
MOV DL,AH
|
|||
|
CALL OUTBYTE
|
|||
|
POP DX
|
|||
|
OUTBYTE:
|
|||
|
MOV DH,DL
|
|||
|
SHR DL,1
|
|||
|
SHR DL,1
|
|||
|
SHR DL,1
|
|||
|
SHR DL,1
|
|||
|
CALL DIGIT
|
|||
|
MOV DL,DH
|
|||
|
DIGIT:
|
|||
|
AND DL,0FH
|
|||
|
JZ BLANKZER
|
|||
|
MOV CL,0
|
|||
|
BLANKZER:
|
|||
|
DEC CH
|
|||
|
AND CL,CH
|
|||
|
OR DL,30H
|
|||
|
SUB DL,CL
|
|||
|
MOV AL,DL
|
|||
|
STOSB
|
|||
|
return
|
|||
|
|
|||
|
CONVWRD:
|
|||
|
ADC AL,AL
|
|||
|
DAA
|
|||
|
XCHG AL,AH
|
|||
|
ADC AL,AL
|
|||
|
DAA
|
|||
|
XCHG AL,AH
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
GETBATBYT:
|
|||
|
; Get one byte from the batch file and return it in AL. End-of-file
|
|||
|
; returns <CR> and ends batch mode. DS must be set to resident segment.
|
|||
|
; AH, CX, DX destroyed.
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
ADD WORD PTR [BATLOC],1 ; Add one to file location
|
|||
|
ADC WORD PTR [BATLOC+2],0
|
|||
|
PUSH BX
|
|||
|
MOV DX,OFFSET RESGROUP:BATBYT
|
|||
|
MOV BX,[BATHAND]
|
|||
|
MOV AH,READ
|
|||
|
MOV CX,1
|
|||
|
INT int_command ; Get one more byte from batch file
|
|||
|
POP BX
|
|||
|
MOV CX,AX
|
|||
|
JC BATEOF
|
|||
|
JCXZ BATEOF
|
|||
|
MOV AL,[BATBYT]
|
|||
|
CMP AL,1AH
|
|||
|
retnz
|
|||
|
BATEOF:
|
|||
|
PUSH ES
|
|||
|
MOV ES,[BATCH] ; Turn off batch
|
|||
|
MOV AH,DEALLOC
|
|||
|
INT int_command ; free up the batch piece
|
|||
|
POP ES
|
|||
|
MOV [BATCH],0 ; AFTER DEALLOC in case of ^C
|
|||
|
CALL BATCLOSE
|
|||
|
MOV AL,0DH ; If end-of-file, then end of line
|
|||
|
CMP [SINGLECOM],0FFF0H ; See if we need to set SINGLECOM
|
|||
|
JNZ NOSETSING2
|
|||
|
MOV [SINGLECOM],-1 ; Cause termination
|
|||
|
NOSETSING2:
|
|||
|
MOV [ECHOFLAG],1
|
|||
|
return
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
|
|||
|
SCANOFF:
|
|||
|
LODSB
|
|||
|
CALL DELIM
|
|||
|
JZ SCANOFF
|
|||
|
DEC SI ; Point to first non-delimiter
|
|||
|
return
|
|||
|
|
|||
|
DELIM:
|
|||
|
CMP AL," "
|
|||
|
retz
|
|||
|
CMP AL,"="
|
|||
|
retz
|
|||
|
CMP AL,","
|
|||
|
retz
|
|||
|
CMP AL,";"
|
|||
|
retz
|
|||
|
CMP AL,9 ; Check for TAB character
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
PRINT_PROMPT:
|
|||
|
PUSH DS
|
|||
|
PUSH CS
|
|||
|
POP DS ; MAKE SURE DS IS IN TRANGROUP
|
|||
|
|
|||
|
PUSH ES
|
|||
|
CALL FIND_PROMPT ; LOOK FOR PROMPT STRING
|
|||
|
JC PP0 ; CAN'T FIND ONE
|
|||
|
CMP BYTE PTR ES:[DI],0
|
|||
|
JNZ PP1
|
|||
|
PP0:
|
|||
|
CALL PRINT_DRIVE ; USE DEFAULT PROMPT
|
|||
|
MOV AL,SYM
|
|||
|
CALL OUT
|
|||
|
JMP SHORT PP5
|
|||
|
|
|||
|
PP1:
|
|||
|
MOV AL,ES:[DI] ; GET A CHAR
|
|||
|
INC DI
|
|||
|
OR AL,AL
|
|||
|
JZ PP5 ; NUL TERMINATED
|
|||
|
CMP AL,"$" ; META CHARACTER?
|
|||
|
JZ PP2 ; NOPE
|
|||
|
PPP1:
|
|||
|
CALL OUT
|
|||
|
JMP PP1
|
|||
|
|
|||
|
PP2:
|
|||
|
MOV AL,ES:[DI]
|
|||
|
INC DI
|
|||
|
MOV BX,OFFSET TRANGROUP:PROMPT_TABLE-3
|
|||
|
OR AL,AL
|
|||
|
JZ PP5
|
|||
|
|
|||
|
PP3:
|
|||
|
ADD BX,3
|
|||
|
CALL UPCONV
|
|||
|
CMP AL,[BX]
|
|||
|
JZ PP4
|
|||
|
CMP BYTE PTR [BX],0
|
|||
|
JNZ PP3
|
|||
|
JMP PP1
|
|||
|
|
|||
|
PP4:
|
|||
|
PUSH ES
|
|||
|
PUSH DI
|
|||
|
PUSH CS
|
|||
|
POP ES
|
|||
|
CALL [BX+1]
|
|||
|
POP DI
|
|||
|
POP ES
|
|||
|
JMP PP1
|
|||
|
|
|||
|
PP5:
|
|||
|
POP ES ; RESTORE SEGMENTS
|
|||
|
POP DS
|
|||
|
return
|
|||
|
|
|||
|
PRINT_BACK:
|
|||
|
MOV DX,OFFSET TRANGROUP:DBACK
|
|||
|
JMP ZPRINT
|
|||
|
|
|||
|
PRINT_EQ:
|
|||
|
MOV AL,"="
|
|||
|
JMP SHORT OUTV
|
|||
|
PRINT_ESC:
|
|||
|
MOV AL,1BH
|
|||
|
JMP SHORT OUTV
|
|||
|
PRINT_G:
|
|||
|
MOV AL,">"
|
|||
|
JMP SHORT OUTV
|
|||
|
PRINT_L:
|
|||
|
MOV AL,"<"
|
|||
|
JMP SHORT OUTV
|
|||
|
PRINT_B:
|
|||
|
MOV AL,"|"
|
|||
|
OUTV:
|
|||
|
JMP OUT
|
|||
|
|
|||
|
SETPATH:
|
|||
|
; Get an ASCIZ argument from the unformatted parms
|
|||
|
; DESTISDIR set if pathchars in string
|
|||
|
; DESTINFO set if ? or * in string
|
|||
|
MOV SI,80H
|
|||
|
LODSB
|
|||
|
XOR AH,AH
|
|||
|
MOV [PATHCNT],AX
|
|||
|
MOV [PATHPOS],SI
|
|||
|
GETPATH:
|
|||
|
MOV [DESTINFO],0
|
|||
|
MOV [DESTISDIR],0
|
|||
|
MOV SI,[PATHPOS]
|
|||
|
MOV CX,[PATHCNT]
|
|||
|
MOV DX,SI
|
|||
|
JCXZ PATHDONE
|
|||
|
PUSH CX
|
|||
|
PUSH SI
|
|||
|
CALL SWITCH
|
|||
|
MOV [PATHSW],AX
|
|||
|
POP BX
|
|||
|
SUB BX,SI
|
|||
|
POP CX
|
|||
|
ADD CX,BX
|
|||
|
MOV DX,SI
|
|||
|
SKIPPATH:
|
|||
|
|
|||
|
IF KANJI
|
|||
|
MOV [KPARSE],0
|
|||
|
SKIPPATH2:
|
|||
|
ENDIF
|
|||
|
|
|||
|
JCXZ PATHDONE
|
|||
|
DEC CX
|
|||
|
LODSB
|
|||
|
|
|||
|
IF KANJI
|
|||
|
CALL TESTKANJ
|
|||
|
JZ TESTPPSEP
|
|||
|
DEC CX
|
|||
|
INC SI
|
|||
|
INC [KPARSE]
|
|||
|
JMP SKIPPATH2
|
|||
|
|
|||
|
TESTPPSEP:
|
|||
|
ENDIF
|
|||
|
|
|||
|
CALL PATHCHRCMP
|
|||
|
JNZ TESTPMETA
|
|||
|
INC [DESTISDIR]
|
|||
|
TESTPMETA:
|
|||
|
CMP AL,'?'
|
|||
|
JNZ TESTPSTAR
|
|||
|
OR [DESTINFO],2
|
|||
|
TESTPSTAR:
|
|||
|
CMP AL,'*'
|
|||
|
JNZ TESTPDELIM
|
|||
|
OR [DESTINFO],2
|
|||
|
TESTPDELIM:
|
|||
|
CALL DELIM
|
|||
|
JZ PATHDONEDEC
|
|||
|
CMP AL,[SWITCHAR]
|
|||
|
JNZ SKIPPATH
|
|||
|
PATHDONEDEC:
|
|||
|
DEC SI
|
|||
|
PATHDONE:
|
|||
|
XOR AL,AL
|
|||
|
XCHG AL,[SI]
|
|||
|
INC SI
|
|||
|
CMP AL,0DH
|
|||
|
JNZ NOPSTORE
|
|||
|
MOV [SI],AL ;Don't loose the CR
|
|||
|
NOPSTORE:
|
|||
|
MOV [PATHPOS],SI
|
|||
|
MOV [PATHCNT],CX
|
|||
|
return
|
|||
|
|
|||
|
PGETARG:
|
|||
|
MOV SI,80H
|
|||
|
LODSB
|
|||
|
OR AL,AL
|
|||
|
retz
|
|||
|
CALL PSCANOFF
|
|||
|
CMP AL,13
|
|||
|
return
|
|||
|
|
|||
|
PSCANOFF:
|
|||
|
LODSB
|
|||
|
CALL DELIM
|
|||
|
JNZ PSCANOFFD
|
|||
|
CMP AL,';'
|
|||
|
JNZ PSCANOFF ; ';' is not a delimiter
|
|||
|
PSCANOFFD:
|
|||
|
DEC SI ; Point to first non-delimiter
|
|||
|
return
|
|||
|
|
|||
|
PATH:
|
|||
|
CALL FIND_PATH
|
|||
|
CALL PGETARG ; Pre scan for arguments
|
|||
|
JZ DISPPATH ; Print the current path
|
|||
|
CALL DELETE_PATH ; DELETE ANY OFFENDING NAME
|
|||
|
CALL SCAN_DOUBLE_NULL
|
|||
|
CALL MOVE_NAME ; MOVE IN PATH=
|
|||
|
CALL PGETARG
|
|||
|
CMP AL,';' ; NUL path argument?
|
|||
|
JZ GOTPATHS
|
|||
|
PATHSLP: ; Get the user specified path
|
|||
|
LODSB
|
|||
|
CMP AL,0DH
|
|||
|
JZ GOTPATHS
|
|||
|
|
|||
|
IF KANJI
|
|||
|
CALL TESTKANJ
|
|||
|
JZ NOTKANJ2
|
|||
|
CALL STORE_CHAR
|
|||
|
LODSB
|
|||
|
CALL STORE_CHAR
|
|||
|
JMP SHORT PATHSLP
|
|||
|
|
|||
|
NOTKANJ2:
|
|||
|
ENDIF
|
|||
|
|
|||
|
CALL UPCONV
|
|||
|
CMP AL,';' ; ';' not a delimiter on PATH
|
|||
|
JZ NOTDELIM
|
|||
|
CALL DELIM
|
|||
|
JZ GOTPATHS
|
|||
|
NOTDELIM:
|
|||
|
CALL STORE_CHAR
|
|||
|
JMP SHORT PATHSLP
|
|||
|
|
|||
|
GOTPATHS:
|
|||
|
XOR AX,AX
|
|||
|
STOSW
|
|||
|
return
|
|||
|
|
|||
|
DISPPATH:
|
|||
|
CALL PRINT_PATH
|
|||
|
CALL CRLF2
|
|||
|
return
|
|||
|
|
|||
|
PRINT_PATH:
|
|||
|
CMP BYTE PTR ES:[DI],0
|
|||
|
JNZ PATH1
|
|||
|
PATH0:
|
|||
|
MOV DX,OFFSET TRANGROUP:NULPATH
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
JMP PRINT
|
|||
|
PATH1:
|
|||
|
PUSH ES
|
|||
|
POP DS
|
|||
|
SUB DI,5
|
|||
|
MOV DX,DI
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
CALL SCASB2 ; LOOK FOR NUL
|
|||
|
CMP CX,0FFH
|
|||
|
JZ PATH0
|
|||
|
JMP ZPRINT
|
|||
|
|
|||
|
FCB_TO_ASCZ: ; Convert DS:SI to ASCIZ ES:DI
|
|||
|
MOV CX,8
|
|||
|
MAINNAME:
|
|||
|
LODSB
|
|||
|
CMP AL,' '
|
|||
|
JZ SKIPSPC
|
|||
|
STOSB
|
|||
|
SKIPSPC:
|
|||
|
LOOP MAINNAME
|
|||
|
LODSB
|
|||
|
CMP AL,' '
|
|||
|
JZ GOTNAME
|
|||
|
MOV AH,AL
|
|||
|
MOV AL,'.'
|
|||
|
STOSB
|
|||
|
XCHG AL,AH
|
|||
|
STOSB
|
|||
|
MOV CL,2
|
|||
|
EXTNAME:
|
|||
|
LODSB
|
|||
|
CMP AL,' '
|
|||
|
JZ GOTNAME
|
|||
|
STOSB
|
|||
|
LOOP EXTNAME
|
|||
|
|
|||
|
GOTNAME:
|
|||
|
XOR AL,AL
|
|||
|
STOSB
|
|||
|
return
|
|||
|
|
|||
|
GETNUM:
|
|||
|
CALL INDIG
|
|||
|
retc
|
|||
|
MOV AH,AL ; Save first digit
|
|||
|
CALL INDIG ; Another digit?
|
|||
|
JC OKRET
|
|||
|
AAD ; Convert unpacked BCD to decimal
|
|||
|
MOV AH,AL
|
|||
|
OKRET:
|
|||
|
OR AL,1
|
|||
|
return
|
|||
|
|
|||
|
INDIG:
|
|||
|
MOV AL,BYTE PTR[SI]
|
|||
|
SUB AL,"0"
|
|||
|
retc
|
|||
|
CMP AL,10
|
|||
|
CMC
|
|||
|
retc
|
|||
|
INC SI
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
OUT2: ; Output binary number as two ASCII digits
|
|||
|
AAM ; Convert binary to unpacked BCD
|
|||
|
XCHG AL,AH
|
|||
|
OR AX,3030H ; Add "0" bias to both digits
|
|||
|
CMP AL,"0" ; Is MSD zero?
|
|||
|
JNZ NOSUP
|
|||
|
SUB AL,BH ; Suppress leading zero if enabled
|
|||
|
NOSUP:
|
|||
|
MOV BH,0 ; Disable zero suppression
|
|||
|
STOSW
|
|||
|
return
|
|||
|
|
|||
|
OUT:
|
|||
|
; Print char in AL without affecting registers
|
|||
|
XCHG AX,DX
|
|||
|
PUSH AX
|
|||
|
CALL OUT_CHAR
|
|||
|
POP AX
|
|||
|
XCHG AX,DX
|
|||
|
return
|
|||
|
|
|||
|
OUT_CHAR:
|
|||
|
PUSH DS
|
|||
|
PUSH DX
|
|||
|
PUSH CX
|
|||
|
PUSH BX
|
|||
|
PUSH AX
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV BX,OFFSET TRANGROUP:CHARBUF
|
|||
|
MOV [BX],DL
|
|||
|
MOV DX,BX
|
|||
|
MOV BX,1
|
|||
|
MOV CX,BX
|
|||
|
MOV AH,WRITE
|
|||
|
INT int_command
|
|||
|
POP AX
|
|||
|
POP BX
|
|||
|
POP CX
|
|||
|
POP DX
|
|||
|
POP DS
|
|||
|
return
|
|||
|
|
|||
|
|
|||
|
ERROR_PRINT:
|
|||
|
PUSH AX
|
|||
|
PUSH BX
|
|||
|
MOV AL,"$"
|
|||
|
MOV BX,2 ;STD ERROR
|
|||
|
JMP SHORT STRING_OUT
|
|||
|
|
|||
|
CRPRINT:
|
|||
|
PUSH AX
|
|||
|
MOV AL,13
|
|||
|
JMP SHORT Z$PRINT
|
|||
|
PRINT: ;$ TERMINATED STRING
|
|||
|
PUSH AX
|
|||
|
MOV AL,"$"
|
|||
|
JMP SHORT Z$PRINT
|
|||
|
ZPRINT:
|
|||
|
PUSH AX
|
|||
|
XOR AX,AX ;NUL TERMINATED STRING
|
|||
|
Z$PRINT:
|
|||
|
PUSH BX
|
|||
|
MOV BX,1 ;STD CON OUT
|
|||
|
;
|
|||
|
; output string terminated by AL to handle BX, DS:DX points to string
|
|||
|
;
|
|||
|
STRING_OUT:
|
|||
|
PUSH CX
|
|||
|
PUSH DI
|
|||
|
MOV DI,DX
|
|||
|
MOV CX,-1
|
|||
|
PUSH ES
|
|||
|
PUSH DS
|
|||
|
POP ES
|
|||
|
REPNZ SCASB ; LOOK FOR TERMINATOR
|
|||
|
POP ES
|
|||
|
NEG CX
|
|||
|
DEC CX
|
|||
|
DEC CX
|
|||
|
;
|
|||
|
; WRITE CHARS AT DS:DX TO HANDLE IN BX, COUNT IN CX
|
|||
|
;
|
|||
|
MOV AH,WRITE
|
|||
|
INT int_command
|
|||
|
JC ERROR_OUTPUT
|
|||
|
CMP AX,CX
|
|||
|
JNZ ERROR_OUTPUT
|
|||
|
POP DI
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
return
|
|||
|
|
|||
|
ERROR_OUTPUT:
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
MOV ES,[RESSEG]
|
|||
|
ASSUME ES:RESGROUP
|
|||
|
MOV DX,OFFSET TRANGROUP:NOSPACE
|
|||
|
CMP [PIPEFLAG],0
|
|||
|
JZ GO_TO_ERROR
|
|||
|
MOV [PIPEFLAG],0
|
|||
|
MOV DX,OFFSET TRANGROUP:PIPEEMES
|
|||
|
GO_TO_ERROR:
|
|||
|
JMP CERROR
|
|||
|
|
|||
|
|
|||
|
TRANCODE ENDS
|
|||
|
END
|
|||
|
|