summaryrefslogtreecommitdiff
path: root/v2.0/source/TCODE2.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v2.0/source/TCODE2.ASM')
-rw-r--r--v2.0/source/TCODE2.ASM522
1 files changed, 522 insertions, 0 deletions
diff --git a/v2.0/source/TCODE2.ASM b/v2.0/source/TCODE2.ASM
new file mode 100644
index 0000000..bc2742d
--- /dev/null
+++ b/v2.0/source/TCODE2.ASM
@@ -0,0 +1,522 @@
1TITLE PART2 - COMMAND Transient routines.
2
3 INCLUDE COMSW.ASM
4
5.xlist
6.xcref
7 INCLUDE DOSSYM.ASM
8 INCLUDE DEVSYM.ASM
9 INCLUDE COMSEG.ASM
10.list
11.cref
12
13 INCLUDE COMEQU.ASM
14
15CODERES SEGMENT PUBLIC
16 EXTRN LODCOM1:NEAR
17CODERES ENDS
18
19DATARES SEGMENT PUBLIC
20 EXTRN PARENT:WORD,IO_SAVE:WORD,PERMCOM:BYTE
21 EXTRN PIPEFLAG:BYTE,ENVIRSEG:WORD
22 if ibmver
23 EXTRN SYS_CALL:DWORD
24 endif
25DATARES ENDS
26
27TRANDATA SEGMENT PUBLIC
28
29 EXTRN PATH_TEXT:BYTE,PROMPT_TEXT:BYTE
30 EXTRN BADDEV:BYTE,SYNTMES:BYTE,ENVERR:BYTE
31TRANDATA ENDS
32
33TRANSPACE SEGMENT PUBLIC
34
35 EXTRN CURDRV:BYTE,DIRCHAR:BYTE,PWDBUF:BYTE
36 EXTRN INTERNATVARS:BYTE,RESSEG:WORD,TPA:WORD
37
38TRANSPACE ENDS
39
40
41TRANCODE SEGMENT PUBLIC BYTE
42ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING
43
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
48
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
54 PUBLIC SCASB2
55
56 IF KANJI
57 PUBLIC TESTKANJ
58 ENDIF
59
60BREAK <Environment utilities>
61ASSUME DS:TRANGROUP
62
63ADD_PROMPT:
64 CALL DELETE_PROMPT ; DELETE ANY EXISTING PROMPT
65 CALL SCAN_DOUBLE_NULL
66ADD_PROMPT2:
67 PUSH SI
68 CALL GETARG
69 POP SI
70 retz ; PRE SCAN FOR ARGUMENTS
71 CALL MOVE_NAME ; MOVE IN NAME
72 CALL GETARG
73 JMP SHORT ADD_NAME
74;
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
78;
79ADD_NAME_TO_ENVIRONMENT:
80 CALL GETARG
81 JZ DISP_ENV
82;
83; check if line contains exactly one equals sign
84;
85 XOR BX,BX ;= COUNT IS 0
86 PUSH SI ;SAVE POINTER TO BEGINNING OF LINE
87EQLP:
88 LODSB ;GET A CHAR
89 CMP AL,13 ;IF CR WE'RE ALL DONE
90 JZ QUEQ
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
95 JNZ EQLP
96 INC BH ;SET BH=1 MEANS NO PARAMETERS
97 JMP EQLP ;AND LOOK FOR MORE
98QUEQ:
99 POP SI ;RESTORE BEGINNING OF LINE
100 DEC BL ;ZERO FLAG MEANS ONLY ONE EQ
101 JZ ONEQ ;GOOD LINE
102 MOV DX,OFFSET TRANGROUP:SYNTMES
103 JMP CERROR
104
105ONEQ:
106 PUSH BX
107 CALL DELETE_NAME_IN_ENVIRONMENT
108 POP BX
109 DEC BH
110 retz
111
112 CALL SCAN_DOUBLE_NULL
113 CALL MOVE_NAME
114ADD_NAME:
115 LODSB
116 CMP AL,13
117 retz
118 CALL STORE_CHAR
119 JMP ADD_NAME
120
121DISP_ENV:
122 MOV DS,[RESSEG]
123ASSUME DS:RESGROUP
124 MOV DS,[ENVIRSEG]
125ASSUME DS:NOTHING
126 XOR SI,SI
127PENVLP:
128 CMP BYTE PTR [SI],0
129 retz
130
131 MOV DX,SI
132 CALL ZPRINT
133 CALL CRLF2
134PENVLP2:
135 LODSB
136 OR AL,AL
137 JNZ PENVLP2
138 JMP PENVLP
139
140ASSUME DS:TRANGROUP
141DELETE_PATH:
142 MOV SI,OFFSET TRANGROUP:PATH_TEXT
143 JMP SHORT DELETE_NAME_IN_environment
144
145DELETE_PROMPT:
146 MOV SI,OFFSET TRANGROUP:PROMPT_TEXT
147
148DELETE_NAME_IN_environment:
149;
150; Input: DS:SI points to a "=" terminated string
151; Output: carry flag is set if name not found
152; otherwise name is deleted
153;
154 PUSH SI
155 PUSH DS
156 CALL FIND ; ES:DI POINTS TO NAME
157 JC DEL1
158 MOV SI,DI ; SAVE IT
159 CALL SCASB2 ; SCAN FOR THE NUL
160 XCHG SI,DI
161 CALL GETENVSIZ
162 SUB CX,SI
163 PUSH ES
164 POP DS ; ES:DI POINTS TO NAME, DS:SI POINTS TO NEXT NAME
165 REP MOVSB ; DELETE THE NAME
166DEL1:
167 POP DS
168 POP SI
169 return
170
171FIND_PATH:
172 MOV SI,OFFSET TRANGROUP:PATH_TEXT
173 JMP SHORT FIND_NAME_IN_environment
174
175FIND_PROMPT:
176 MOV SI,OFFSET TRANGROUP:PROMPT_TEXT
177
178FIND_NAME_IN_environment:
179;
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
184;
185 CALL FIND ; FIND THE NAME
186 retc ; CARRY MEANS NOT FOUND
187 JMP SCASB1 ; SCAN FOR = SIGN
188;
189; On return of FIND1, ES:DI points to beginning of name
190;
191FIND:
192 CLD
193 CALL COUNT0 ; CX = LENGTH OF NAME
194 MOV ES,[RESSEG]
195ASSUME ES:RESGROUP
196 MOV ES,[ENVIRSEG]
197ASSUME ES:NOTHING
198 XOR DI,DI
199FIND1:
200 PUSH CX
201 PUSH SI
202 PUSH DI
203FIND11:
204 LODSB
205
206 IF KANJI
207 CALL TESTKANJ
208 JZ NOTKANJ3
209 DEC SI
210 LODSW
211 INC DI
212 INC DI
213 CMP AX,ES:[DI-2]
214 JNZ FIND12
215 DEC CX
216 LOOP FIND11
217 JMP SHORT FIND12
218
219NOTKANJ3:
220 ENDIF
221
222 CALL UPCONV
223 INC DI
224 CMP AL,ES:[DI-1]
225 JNZ FIND12
226 LOOP FIND11
227FIND12:
228 POP DI
229 POP SI
230 POP CX
231 retz
232 PUSH CX
233 CALL SCASB2 ; SCAN FOR A NUL
234 POP CX
235 CMP BYTE PTR ES:[DI],0
236 JNZ FIND1
237 STC ; INDICATE NOT FOUND
238 return
239
240COUNT0:
241 PUSH DS
242 POP ES
243 MOV DI,SI
244
245COUNT1:
246 PUSH DI ; COUNT NUMBER OF CHARS UNTIL "="
247 CALL SCASB1
248 JMP SHORT COUNTX
249COUNT2:
250 PUSH DI ; COUNT NUMBER OF CHARS UNTIL NUL
251 CALL SCASB2
252COUNTX:
253 POP CX
254 SUB DI,CX
255 XCHG DI,CX
256 return
257
258MOVE_NAME:
259 CMP BYTE PTR DS:[SI],13
260 retz
261 LODSB
262
263 IF KANJI
264 CALL TESTKANJ
265 JZ NOTKANJ1
266 CALL STORE_CHAR
267 LODSB
268 CALL STORE_CHAR
269 JMP SHORT MOVE_NAME
270
271NOTKANJ1:
272 ENDIF
273
274 CALL UPCONV
275 CALL STORE_CHAR
276 CMP AL,"="
277 JNZ MOVE_NAME
278 return
279
280GETARG:
281 MOV SI,80H
282 LODSB
283 OR AL,AL
284 retz
285 CALL SCANOFF
286 CMP AL,13
287 return
288
289SCAN_DOUBLE_NULL:
290 MOV ES,[RESSEG]
291ASSUME ES:RESGROUP
292 MOV ES,[ENVIRSEG]
293ASSUME ES:NOTHING
294 XOR DI,DI
295SDN1:
296 CALL SCASB2
297 CMP BYTE PTR ES:[DI],0
298 JNZ SDN1
299 return
300
301SCASB1:
302 MOV AL,"=" ; SCAN FOR AN =
303 JMP SHORT SCASBX
304SCASB2:
305 XOR AL,AL ; SCAN FOR A NUL
306SCASBX:
307 MOV CX,100H
308 REPNZ SCASB
309 return
310
311 IF KANJI
312TESTKANJ:
313 CMP AL,81H
314 JB NOTLEAD
315 CMP AL,9FH
316 JBE ISLEAD
317 CMP AL,0E0H
318 JB NOTLEAD
319 CMP AL,0FCH
320 JBE ISLEAD
321NOTLEAD:
322 PUSH AX
323 XOR AX,AX ;Set zero
324 POP AX
325 return
326
327ISLEAD:
328 PUSH AX
329 XOR AX,AX ;Set zero
330 INC AX ;Reset zero
331 POP AX
332 return
333 ENDIF
334
335UPCONV:
336 CMP AL,"a"
337 JB RET22C
338 CMP AL,"z"
339 JA RET22C
340 SUB AL,20H ; Lower-case changed to upper-case
341RET22C:
342 CALL DWORD PTR CS:[INTERNATVARS.Map_call]
343 return
344;
345; STORE A CHAR IN environment, GROWING IT IF NECESSARY
346;
347STORE_CHAR:
348 PUSH CX
349 PUSH BX
350 CALL GETENVSIZ
351 MOV BX,CX
352 SUB BX,2 ; SAVE ROOM FOR DOUBLE NULL
353 CMP DI,BX
354 JB STORE1
355
356 PUSH AX
357 PUSH CX
358 PUSH BX ; Save Size of environment
359 CALL FREE_TPA
360 POP BX
361 ADD BX,2 ; Recover true environment size
362 MOV CL,4
363 SHR BX,CL ; Convert back to paragraphs
364 INC BX ; Try to grow environment by one para
365 MOV AH,SETBLOCK
366 INT int_command
367 PUSHF
368 PUSH ES
369 MOV ES,[RESSEG]
370 CALL ALLOC_TPA
371 POP ES
372 POPF
373 POP CX
374 POP AX
375 JNC STORE1
376 MOV DX,OFFSET TRANGROUP:ENVERR
377 JMP CERROR
378STORE1:
379 STOSB
380 MOV WORD PTR ES:[DI],0 ; NULL IS AT END
381 POP BX
382 POP CX
383 return
384
385GETENVSIZ:
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
389
390 PUSH ES
391 PUSH AX
392 MOV AX,ES
393 DEC AX ;Point at arena
394 MOV ES,AX
395 MOV AX,ES:[arena_size]
396 MOV CL,4
397 SHL AX,CL ;Convert to bytes
398 MOV CX,AX
399 POP AX
400 POP ES
401 return
402
403PRINT_DRIVE:
404 MOV AH,GET_DEFAULT_DRIVE
405 INT int_command
406 ADD AL,"A"
407 JMP OUT
408
409ASSUME DS:TRANGROUP,ES:TRANGROUP
410PWD:
411 CALL PRINT_DIRECTORY
412 CALL CRLF2
413 return
414
415PRINT_DEFAULT_DIRECTORY:
416 MOV BYTE PTR DS:[FCB],0
417PRINT_DIRECTORY:
418 MOV DL,DS:[FCB]
419 MOV AL,DL
420 ADD AL,'@'
421 CMP AL,'@'
422 JNZ GOTDRIVE
423 ADD AL,[CURDRV]
424 INC AL
425GOTDRIVE:
426 PUSH AX
427 MOV SI,OFFSET TRANGROUP:PWDBUF+3
428 MOV AH,CURRENT_DIR
429 INT int_command
430 JNC DPBISOK
431 PUSH CS
432 POP DS
433 JMP DRVBAD
434DPBISOK:
435 MOV DI,OFFSET TRANGROUP:PWDBUF
436 MOV DX,DI
437 POP AX
438 MOV AH,DRVCHAR
439 STOSW
440 MOV AL,[DIRCHAR]
441 STOSB
442 JMP ZPRINT
443
444$EXIT:
445 PUSH ES
446 MOV ES,[RESSEG]
447ASSUME ES:RESGROUP
448 MOV AX,[PARENT]
449 MOV WORD PTR ES:[PDB_Parent_PID],AX
450
451IF IBM
452 CMP [PERMCOM],0
453 JNZ NORESETVEC ;Don't reset the vector if a PERMCOM
454 LDS DX,DWORD PTR ES:[SYS_CALL]
455ASSUME DS:NOTHING
456 MOV AX,(SET_INTERRUPT_VECTOR SHL 8) + INT_COMMAND
457 INT int_command
458NORESETVEC:
459ENDIF
460
461 POP ES
462ASSUME ES:TRANGROUP
463 MOV ES,[TPA]
464 MOV AH,DEALLOC
465 INT int_command ; Now running in "free" space
466 MOV AX,(EXIT SHL 8)
467 INT int_command
468
469CTTY:
470 CALL SETPATH ; Get spec
471 MOV AX,(OPEN SHL 8) OR 2 ; Read and write
472 INT int_command ; Open new device
473 JC ISBADDEV
474 MOV BX,AX
475 MOV AX,IOCTL SHL 8
476 INT int_command
477 TEST DL,80H
478 JNZ DEVISOK
479 MOV AH,CLOSE ; Close initial handle
480 INT int_command
481ISBADDEV:
482 MOV DX,OFFSET TRANGROUP:BADDEV
483 CALL PRINT
484 JMP RESRET
485
486DEVISOK:
487 XOR DH,DH
488 OR DL,3 ; Make sure has CON attributes
489 MOV AX,(IOCTL SHL 8) OR 1
490 INT int_command
491 PUSH BX ; Save handle
492 MOV CX,3
493 XOR BX,BX
494ICLLOOP: ; Close basic handles
495 MOV AH,CLOSE
496 INT int_command
497 INC BX
498 LOOP ICLLOOP
499 POP BX ; Get handle
500 MOV AH,XDUP
501 INT int_command ; Dup it to 0
502 MOV AH,XDUP
503 INT int_command ; Dup to 1
504 MOV AH,XDUP
505 INT int_command ; Dup to 2
506 MOV AH,CLOSE ; Close initial handle
507 INT int_command
508RESRET:
509 MOV DS,[RESSEG]
510ASSUME DS:RESGROUP
511 PUSH DS
512 MOV AX,WORD PTR DS:[PDB_JFN_Table] ; Get new 0 and 1
513 MOV [IO_SAVE],AX
514 MOV AX,OFFSET RESGROUP:LODCOM1
515 PUSH AX
516ZMMMM PROC FAR
517 RET ; Force header to be checked
518ZMMMM ENDP
519
520TRANCODE ENDS
521 END
522