1 TITLE PART2
- COMMAND Transient routines
.
15 CODERES
SEGMENT PUBLIC
19 DATARES
SEGMENT PUBLIC
20 EXTRN PARENT
:WORD,IO_SAVE
:WORD,PERMCOM
:BYTE
21 EXTRN PIPEFLAG
:BYTE,ENVIRSEG
:WORD
27 TRANDATA
SEGMENT PUBLIC
29 EXTRN PATH_TEXT
:BYTE,PROMPT_TEXT
:BYTE
30 EXTRN BADDEV
:BYTE,SYNTMES
:BYTE,ENVERR
:BYTE
33 TRANSPACE
SEGMENT PUBLIC
35 EXTRN CURDRV
:BYTE,DIRCHAR
:BYTE,PWDBUF
:BYTE
36 EXTRN INTERNATVARS
:BYTE,RESSEG
:WORD,TPA
:WORD
41 TRANCODE
SEGMENT PUBLIC BYTE
42 ASSUME
CS:TRANGROUP
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
44 EXTRN CERROR
:NEAR,ZPRINT
:NEAR
45 EXTRN CRLF2
:NEAR,SCANOFF
:NEAR,FREE_TPA
:NEAR,ALLOC_TPA
:NEAR
46 EXTRN OUT:NEAR,DRVBAD
:NEAR,SETPATH
:NEAR,PRINT
:NEAR
47 EXTRN FCB_TO_ASCZ
:NEAR
49 PUBLIC PRINT_DRIVE
,$EXIT
,MOVE_NAME
50 PUBLIC UPCONV
,ADD_PROMPT
,CTTY
,PRINT_DEFAULT_DIRECTORY
51 PUBLIC ADD_NAME_TO_ENVIRONMENT
,PWD
,SCAN_DOUBLE_NULL
52 PUBLIC FIND_NAME_IN_ENVIRONMENT
,STORE_CHAR
53 PUBLIC FIND_PATH
,DELETE_PATH
,FIND_PROMPT
60 BREAK <Environment utilities
>
64 CALL DELETE_PROMPT
; DELETE ANY EXISTING PROMPT
70 retz
; PRE SCAN FOR ARGUMENTS
71 CALL MOVE_NAME
; MOVE IN NAME
75 ; Input: DS:SI points to a CR terminated string
76 ; Output: carry flag is set if no room
77 ; otherwise name is added to environment
79 ADD_NAME_TO_ENVIRONMENT:
83 ; check if line contains exactly one equals sign
85 XOR BX,BX ;= COUNT IS 0
86 PUSH SI ;SAVE POINTER TO BEGINNING OF LINE
89 CMP AL,13 ;IF CR WE'RE ALL DONE
91 CMP AL,"=" ;LOOK FOR = SIGN
92 JNZ EQLP
;NOT THERE, GET NEXT CHAR
93 INC BL ;OTHERWISE INCREMENT EQ COUNT
94 CMP BYTE PTR [SI],13 ;LOOK FOR CR FOLLOWING = SIGN
96 INC BH ;SET BH=1 MEANS NO PARAMETERS
97 JMP EQLP
;AND LOOK FOR MORE
99 POP SI ;RESTORE BEGINNING OF LINE
100 DEC BL ;ZERO FLAG MEANS ONLY ONE EQ
102 MOV DX,OFFSET TRANGROUP
:SYNTMES
107 CALL DELETE_NAME_IN_ENVIRONMENT
112 CALL SCAN_DOUBLE_NULL
142 MOV SI,OFFSET TRANGROUP
:PATH_TEXT
143 JMP SHORT DELETE_NAME_IN_environment
146 MOV SI,OFFSET TRANGROUP
:PROMPT_TEXT
148 DELETE_NAME_IN_environment:
150 ; Input: DS:SI points to a "=" terminated string
151 ; Output: carry flag is set if name not found
152 ; otherwise name is deleted
156 CALL FIND
; ES:DI POINTS TO NAME
159 CALL SCASB2
; SCAN FOR THE NUL
164 POP DS ; ES:DI POINTS TO NAME, DS:SI POINTS TO NEXT NAME
165 REP MOVSB ; DELETE THE NAME
172 MOV SI,OFFSET TRANGROUP
:PATH_TEXT
173 JMP SHORT FIND_NAME_IN_environment
176 MOV SI,OFFSET TRANGROUP
:PROMPT_TEXT
178 FIND_NAME_IN_environment:
180 ; Input: DS:SI points to a "=" terminated string
181 ; Output: ES:DI points to the arguments in the environment
182 ; zero is set if name not found
183 ; carry flag is set if name not valid format
185 CALL FIND
; FIND THE NAME
186 retc
; CARRY MEANS NOT FOUND
187 JMP SCASB1
; SCAN FOR = SIGN
189 ; On return of FIND1, ES:DI points to beginning of name
193 CALL COUNT0
; CX = LENGTH OF NAME
233 CALL SCASB2
; SCAN FOR A NUL
235 CMP BYTE PTR ES:[DI],0
237 STC ; INDICATE NOT FOUND
246 PUSH DI ; COUNT NUMBER OF CHARS UNTIL "="
250 PUSH DI ; COUNT NUMBER OF CHARS UNTIL NUL
259 CMP BYTE PTR DS:[SI],13
297 CMP BYTE PTR ES:[DI],0
302 MOV AL,"=" ; SCAN FOR AN =
305 XOR AL,AL ; SCAN FOR A NUL
340 SUB AL,20H
; Lower-case changed to upper-case
342 CALL DWORD PTR CS:[INTERNATVARS
.Map_call
]
345 ; STORE A CHAR IN environment, GROWING IT IF NECESSARY
352 SUB BX,2 ; SAVE ROOM FOR DOUBLE NULL
358 PUSH BX ; Save Size of environment
361 ADD BX,2 ; Recover true environment size
363 SHR BX,CL ; Convert back to paragraphs
364 INC BX ; Try to grow environment by one para
376 MOV DX,OFFSET TRANGROUP
:ENVERR
380 MOV WORD PTR ES:[DI],0 ; NULL IS AT END
386 ;Get size of environment in bytes, rounded up to paragraph boundry
387 ;ES has environment segment
388 ;Size returned in CX, all other registers preserved
393 DEC AX ;Point at arena
395 MOV AX,ES:[arena_size
]
397 SHL AX,CL ;Convert to bytes
404 MOV AH,GET_DEFAULT_DRIVE
409 ASSUME
DS:TRANGROUP
,ES:TRANGROUP
415 PRINT_DEFAULT_DIRECTORY:
416 MOV BYTE PTR DS:[FCB
],0
427 MOV SI,OFFSET TRANGROUP
:PWDBUF
+3
435 MOV DI,OFFSET TRANGROUP
:PWDBUF
449 MOV WORD PTR ES:[PDB_Parent_PID
],AX
453 JNZ NORESETVEC
;Don't reset the vector if a PERMCOM
454 LDS DX,DWORD PTR ES:[SYS_CALL
]
456 MOV AX,(SET_INTERRUPT_VECTOR
SHL 8) + INT_COMMAND
465 INT int_command
; Now running in "free" space
470 CALL SETPATH
; Get spec
471 MOV AX,(OPEN
SHL 8) OR 2 ; Read and write
472 INT int_command
; Open new device
479 MOV AH,CLOSE
; Close initial handle
482 MOV DX,OFFSET TRANGROUP
:BADDEV
488 OR DL,3 ; Make sure has CON attributes
489 MOV AX,(IOCTL
SHL 8) OR 1
491 PUSH BX ; Save handle
494 ICLLOOP: ; Close basic handles
501 INT int_command
; Dup it to 0
503 INT int_command
; Dup to 1
505 INT int_command
; Dup to 2
506 MOV AH,CLOSE
; Close initial handle
512 MOV AX,WORD PTR DS:[PDB_JFN_Table
] ; Get new 0 and 1
514 MOV AX,OFFSET RESGROUP
:LODCOM1
517 RET ; Force header to be checked