summaryrefslogtreecommitdiff
path: root/v2.0/source/TCODE3.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v2.0/source/TCODE3.ASM')
-rw-r--r--v2.0/source/TCODE3.ASM677
1 files changed, 677 insertions, 0 deletions
diff --git a/v2.0/source/TCODE3.ASM b/v2.0/source/TCODE3.ASM
new file mode 100644
index 0000000..547c937
--- /dev/null
+++ b/v2.0/source/TCODE3.ASM
@@ -0,0 +1,677 @@
1TITLE PART3 - 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
15
16DATARES SEGMENT PUBLIC
17 EXTRN BATCH:WORD,BATLOC:DWORD
18 EXTRN RETCODE:WORD,ECHOFLAG:BYTE
19 EXTRN SINGLECOM:WORD,FORFLAG:BYTE,UFORDRV:BYTE
20 EXTRN FORSET:BYTE,FORCOM:BYTE,FORVAR:BYTE,FORPTR:WORD
21 EXTRN FORUFCB:BYTE,FORFCB:BYTE,RE_INSTR:BYTE,RE_OUT_APP:BYTE
22 EXTRN RE_OUTSTR:BYTE,PIPEFLAG:BYTE
23
24DATARES ENDS
25
26TRANDATA SEGMENT PUBLIC
27
28 EXTRN BADLAB:BYTE,SYNTMES:BYTE,FORNESTMES:BYTE
29 EXTRN NOTFND:BYTE,FULDIR:BYTE,IFTAB:BYTE
30TRANDATA ENDS
31
32TRANSPACE SEGMENT PUBLIC
33
34 EXTRN BATHAND:WORD,RESSEG:WORD,DIRBUF:BYTE,COMBUF:BYTE
35 EXTRN GOTOLEN:WORD,IFNOTFLAG:BYTE
36
37TRANSPACE ENDS
38
39
40TRANCODE SEGMENT PUBLIC BYTE
41ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING
42
43 EXTRN SCANOFF:NEAR,DOCOM:NEAR,DOCOM1:NEAR,CERROR:NEAR
44 EXTRN PRINT:NEAR,TCOMMAND:NEAR,DELIM:NEAR,GETBATBYT:NEAR
45 EXTRN FCB_TO_ASCZ:NEAR
46
47 PUBLIC GOTO,$IF,IFERLEV,SHIFT,IFEXISTS
48 PUBLIC STRCOMP,MesTran,$FOR,IFNOT
49 PUBLIC FORPROC,BATOPEN,BATCLOSE
50 PUBLIC IOSET,TESTDOREIN,TESTDOREOUT
51
52 ASSUME DS:RESGROUP
53FORTERM:
54 MOV [FORFLAG],0
55 CMP [SINGLECOM],0FF00H
56 JNZ NOFORP2
57 MOV [SINGLECOM],-1 ; Cause a terminate
58NOFORP2:
59 JMP TCOMMAND
60
61FORPROC:
62ASSUME DS:RESGROUP
63 CMP [FORUFCB],-1
64 JZ NORMFOR
65 MOV DX,OFFSET TRANGROUP:DIRBUF
66 PUSH DS
67 PUSH CS
68 POP DS
69ASSUME DS:TRANGROUP
70 MOV AH,SET_DMA
71 INT int_command
72 POP DS
73ASSUME DS:RESGROUP
74 MOV DX,OFFSET RESGROUP:FORFCB
75 MOV AH,DIR_SEARCH_NEXT
76 CMP [FORUFCB],0
77 JZ DOFORSRCH
78 MOV AH,DIR_SEARCH_FIRST
79 MOV [FORUFCB],0
80DOFORSRCH:
81 INT int_command
82 OR AL,AL
83 JNZ FORTERM
84 PUSH DS
85 POP ES
86ASSUME ES:RESGROUP
87 PUSH CS
88 POP DS
89ASSUME DS:TRANGROUP
90 MOV SI,OFFSET TRANGROUP:DIRBUF
91 MOV DI,OFFSET RESGROUP:FORSET
92 MOV [FORPTR],DI
93 LODSB ;Get drive spec
94 ADD AL,'@'
95 CMP AL,'@'
96 JZ NDRV8
97 CMP [UFORDRV],0
98 JZ NDRV8
99 MOV AH,':'
100 STOSW
101NDRV8:
102 CALL FCB_TO_ASCZ
103 MOV BYTE PTR ES:[DI-1],0DH
104 PUSH ES
105 POP DS
106ASSUME DS:RESGROUP
107NORMFOR:
108 PUSH CS
109 POP ES
110ASSUME ES:TRANGROUP
111 MOV BX,[FORPTR]
112 CMP BYTE PTR [BX],0
113 JZ FORTERM
114 MOV SI,BX
115PARMSUB0:
116 LODSB
117 CMP AL,0DH
118 JNZ PARMSUB0
119 MOV DX,SI ; DX points to next parm
120 MOV SI,OFFSET RESGROUP:FORCOM
121 MOV DI,OFFSET TRANGROUP:COMBUF+2
122 XOR CX,CX
123TFORCOM:
124 LODSB
125 CMP AL,'%'
126 JNZ NOFORPARM
127 MOV AH,[FORVAR]
128 CMP AH,[SI]
129 JNZ NOFORPARM
130 INC SI
131 PUSH SI
132 MOV SI,BX
133PARMSUB:
134 LODSB
135 CMP AL,0DH
136 JZ PARMSUBDONE
137 INC CX
138 STOSB
139 JMP SHORT PARMSUB
140PARMSUBDONE:
141 POP SI ; Get back command line pointer
142 JMP TFORCOM
143NOFORPARM:
144 STOSB
145 INC CX
146 CMP AL,0DH
147 JNZ TFORCOM
148 DEC CX
149 MOV [COMBUF+1],CL
150 MOV [FORPTR],DX ; Point to next set element
151 TEST [ECHOFLAG],-1
152 PUSH CS
153 POP DS
154ASSUME DS:TRANGROUP
155 JZ NOECHO3
156 MOV BYTE PTR ES:[DI-1],'$'
157 MOV DX,OFFSET TRANGROUP:COMBUF+2
158 CALL PRINT
159 MOV BYTE PTR ES:[DI-1],0DH
160 JMP DOCOM
161NOECHO3:
162 JMP DOCOM1
163
164ASSUME DS:TRANGROUP,ES:TRANGROUP
165
166FORNESTERR:
167 PUSH DS
168 MOV DS,[RESSEG]
169ASSUME DS:RESGROUP
170 MOV DX,OFFSET TRANGROUP:FORNESTMES
171 CMP [SINGLECOM],0FF00H
172 JNZ NOFORP3
173 MOV [SINGLECOM],-1 ; Cause termination
174NOFORP3:
175 POP DS
176ASSUME DS:TRANGROUP
177 JMP CERROR
178
179$FOR:
180 MOV SI,81H
181 XOR CX,CX
182 MOV ES,[RESSEG]
183ASSUME ES:RESGROUP
184 MOV DI,OFFSET RESGROUP:FORSET
185 XOR AL,AL
186 MOV [UFORDRV],AL
187 XCHG AL,[FORFLAG]
188 OR AL,AL
189 JNZ FORNESTERR
190 MOV [FORPTR],DI
191 MOV [FORUFCB],-1
192 CALL SCANOFF
193 LODSW
194 CMP AL,'%'
195 JNZ FORERRORJ
196 MOV [FORVAR],AH
197 CALL SCANOFF
198 CMP AL,0DH
199 JZ FORERRORJ2
200 LODSW
201 CMP AX,('N' SHL 8) OR 'I'
202 JZ FOROK1
203 CMP AX,('n' SHL 8) OR 'i'
204 JNZ FORERRORJ
205FOROK1:
206 CALL SCANOFF
207 LODSB
208 CMP AL,'('
209 JNZ FORERRORJ
210 CALL SCANOFF
211 CMP AL,')' ; Special check for null set
212 JNZ FORSETLP
213 MOV DS,[RESSEG]
214 JMP FORTERM
215FORSETLP:
216 LODSB
217 CMP AL,0DH
218FORERRORJ2:
219 JZ FORERRORJ3
220 CMP AL,')'
221 JZ FORSETEND
222 STOSB
223 CMP AL,'*'
224 JZ SETFORSCAN
225 CMP AL,'?'
226 JNZ NOFORSCAN
227SETFORSCAN:
228 MOV [FORUFCB],1
229NOFORSCAN:
230 CALL DELIM
231 JNZ FORSETLP
232 MOV BYTE PTR ES:[DI-1],0DH
233 CALL SCANOFF
234 JMP FORSETLP
235
236FORSETEND:
237 MOV AX,000DH
238 CMP BYTE PTR ES:[DI-1],0DH
239 JNZ FORSETTERM
240 XOR AX,AX
241FORSETTERM:
242 STOSW
243 CALL SCANOFF
244 LODSW
245 CMP AX,('O' SHL 8) OR 'D'
246 JZ FOROK2
247 CMP AX,('o' SHL 8) OR 'd'
248FORERRORJ:
249 JNZ FORERROR
250FOROK2:
251 CALL SCANOFF
252 CMP AL,0DH
253FORERRORJ3:
254 JZ FORERROR
255 MOV DI,OFFSET RESGROUP:FORCOM
256FORCOMLP:
257 LODSB
258 STOSB
259 CMP AL,0DH
260 JNZ FORCOMLP
261 INC [FORFLAG]
262 CMP [SINGLECOM],-1
263 JNZ NOFORP
264 MOV [SINGLECOM],0FF00H ; Flag single command for
265NOFORP:
266 CMP [FORUFCB],1
267 retnz
268 PUSH ES
269 POP DS
270ASSUME DS:RESGROUP
271 MOV DI,OFFSET RESGROUP:FORFCB
272 MOV SI,OFFSET RESGROUP:FORSET
273 CMP BYTE PTR [SI+1],':'
274 JNZ NOSETUDRV
275 INC [UFORDRV]
276NOSETUDRV:
277 MOV AX,PARSE_FILE_DESCRIPTOR SHL 8
278 INT int_command
279 return
280
281
282ASSUME DS:TRANGROUP,ES:TRANGROUP
283
284IFERRORP:
285 POP AX
286IFERROR:
287FORERROR:
288 MOV DX,OFFSET TRANGROUP:SYNTMES
289 JMP CERROR
290
291$IF:
292 MOV [IFNOTFLAG],0
293 MOV SI,81H
294IFREENT:
295 CALL SCANOFF
296 CMP AL,0DH
297 JZ IFERROR
298 MOV BP,SI
299 MOV DI,OFFSET TRANGROUP:IFTAB ; Prepare to search if table
300 MOV CH,0
301IFINDCOM:
302 MOV SI,BP
303 MOV CL,[DI]
304 INC DI
305 JCXZ IFSTRING
306 JMP SHORT FIRSTCOMP
307IFCOMP:
308 JNZ IFDIF
309FIRSTCOMP:
310 LODSB
311 MOV AH,ES:[DI]
312 INC DI
313 CMP AL,AH
314 JZ IFLP
315 OR AH,20H ; Try lower case
316 CMP AL,AH
317IFLP:
318 LOOP IFCOMP
319IFDIF:
320 LAHF
321 ADD DI,CX ; Bump to next position without affecting flags
322 MOV BX,[DI] ; Get handler address
323 INC DI
324 INC DI
325 SAHF
326 JNZ IFINDCOM
327 LODSB
328 CMP AL,0DH
329IFERRORJ:
330 JZ IFERROR
331 CALL DELIM
332 JNZ IFINDCOM
333 CALL SCANOFF
334 JMP BX
335
336IFNOT:
337 NOT [IFNOTFLAG]
338 JMP IFREENT
339
340
341IFSTRING:
342 PUSH SI
343 XOR CX,CX
344FIRST_STRING:
345 LODSB
346 CMP AL,0DH
347 JZ IFERRORP
348 CALL DELIM
349 JZ EQUAL_CHECK
350 INC CX
351 JMP SHORT FIRST_STRING
352EQUAL_CHECK:
353 CMP AL,'='
354 JZ EQUAL_CHECK2
355 CMP AL,0DH
356 JZ IFERRORP
357 LODSB
358 JMP SHORT EQUAL_CHECK
359EQUAL_CHECK2:
360 LODSB
361 CMP AL,'='
362 JNZ IFERRORP
363 CALL SCANOFF
364 CMP AL,0DH
365 JZ IFERRORP
366 POP DI
367 REPE CMPSB
368 JZ MATCH
369 CMP BYTE PTR [SI-1],0DH
370 JZ IFERRORJ
371SKIPSTRINGEND:
372 LODSB
373NOTMATCH:
374 CMP AL,0DH
375IFERRORJ2:
376 JZ IFERRORJ
377 CALL DELIM
378 JNZ SKIPSTRINGEND
379 MOV AL,-1
380 JMP SHORT IFRET
381MATCH:
382 LODSB
383 CALL DELIM
384 JNZ NOTMATCH
385 XOR AL,AL
386 JMP SHORT IFRET
387
388IFEXISTS:
389 MOV DI,OFFSET TRANGROUP:DIRBUF
390 MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 01H
391 INT int_command
392 MOV AH,FCB_OPEN
393 MOV DX,DI
394 INT int_command
395IFRET:
396 TEST [IFNOTFLAG],-1
397 JZ REALTEST
398 NOT AL
399REALTEST:
400 OR AL,AL
401 JZ IFTRUE
402 JMP TCOMMAND
403IFTRUE:
404 CALL SCANOFF
405 MOV CX,SI
406 SUB CX,81H
407 SUB DS:[80H],CL
408 MOV CL,DS:[80H]
409 MOV [COMBUF+1],CL
410 MOV DI,OFFSET TRANGROUP:COMBUF+2
411 REP MOVSB
412 MOV AL,0DH
413 STOSB
414 JMP DOCOM1
415
416IFERLEV:
417 MOV BH,10
418 XOR BL,BL
419GETNUMLP:
420 LODSB
421 CMP AL,0DH
422 JZ IFERRORJ2
423 CALL DELIM
424 JZ GOTNUM
425 SUB AL,'0'
426 XCHG AL,BL
427 MUL BH
428 ADD AL,BL
429 XCHG AL,BL
430 JMP SHORT GETNUMLP
431GOTNUM:
432 PUSH DS
433 MOV DS,[RESSEG]
434ASSUME DS:RESGROUP
435 MOV AH,BYTE PTR [RETCODE]
436 POP DS
437ASSUME DS:TRANGROUP
438 XOR AL,AL
439 CMP AH,BL
440 JAE IFRET
441 DEC AL
442 JMP SHORT IFRET
443
444ASSUME DS:TRANGROUP
445
446SHIFT:
447 MOV DS,[RESSEG]
448ASSUME DS:RESGROUP
449 MOV AX,[BATCH]
450 TEST AX,-1
451 retz
452 MOV ES,AX
453 MOV DS,AX
454ASSUME DS:NOTHING,ES:NOTHING
455 XOR CX,CX
456 MOV AX,CX
457 MOV DI,CX
458 DEC CX
459 REPNZ SCASB
460 MOV SI,DI
461 INC SI
462 INC SI
463 MOV CX,9
464 REP MOVSW ; Perform shift of existing parms
465 CMP WORD PTR [DI],-1
466 retz ; No new parm
467 MOV SI,[DI]
468 MOV WORD PTR [DI],-1 ; Assume no parm
469 MOV DS,[RESSEG]
470ASSUME DS:RESGROUP
471SKIPCRLP:
472 LODSB
473 CMP AL,0DH
474 JNZ SKIPCRLP
475 CMP BYTE PTR [SI],0
476 retz ; End of parms
477 MOV ES:[DI],SI ; Pointer to next parm as %9
478 return
479
480
481ASSUME DS:TRANGROUP,ES:TRANGROUP
482GOTO:
483 MOV DS,[RESSEG]
484ASSUME DS:RESGROUP
485 TEST [BATCH],-1
486 retz ; If not in batch mode, a nop
487 XOR DX,DX
488 MOV WORD PTR [BATLOC],DX ; Back to start
489 MOV WORD PTR [BATLOC+2],DX
490 CALL BATOPEN ; Find the batch file
491 MOV DI,FCB+1 ; Get the label
492 MOV CX,11
493 MOV AL,' '
494 REPNE SCASB
495 JNZ NOINC
496 INC CX
497NOINC:
498 SUB CX,11
499 NEG CX
500 MOV [GOTOLEN],CX
501 CALL GETBATBYT
502 CMP AL,':'
503 JZ CHKLABEL
504LABLKLP: ; Look for the label
505 CALL GETBATBYT
506 CMP AL,0AH
507 JNZ LABLKTST
508 CALL GETBATBYT
509 CMP AL,':'
510 JZ CHKLABEL
511LABLKTST:
512 TEST [BATCH],-1
513 JNZ LABLKLP
514 CALL BATCLOSE
515 PUSH CS
516 POP DS
517 MOV DX,OFFSET TRANGROUP:BADLAB
518 JMP CERROR
519
520CHKLABEL:
521 MOV DI,FCB+1
522 MOV CX,[GOTOLEN]
523NEXTCHRLP:
524 PUSH CX
525 CALL GETBATBYT
526 POP CX
527 OR AL,20H
528 CMP AL,ES:[DI]
529 JNZ TRYUPPER
530 JMP SHORT NEXTLABCHR
531TRYUPPER:
532 SUB AL,20H
533 CMP AL,ES:[DI]
534 JNZ LABLKTST
535NEXTLABCHR:
536 INC DI
537 LOOP NEXTCHRLP
538 CALL GETBATBYT
539 CMP AL,' '
540 JA LABLKTST
541 CMP AL,0DH
542 JZ SKIPLFEED
543TONEXTBATLIN:
544 CALL GETBATBYT
545 CMP AL,0DH
546 JNZ TONEXTBATLIN
547SKIPLFEED:
548 CALL GETBATBYT
549BATCLOSE:
550 MOV BX,CS:[BATHAND]
551 MOV AH,CLOSE
552 INT int_command
553 return
554
555BATOPEN:
556;Open the BATCH file, If open fails, AL is drive of batch file (A=1)
557ASSUME DS:RESGROUP,ES:TRANGROUP
558 PUSH DS
559 MOV DS,[BATCH]
560ASSUME DS:NOTHING
561 XOR DX,DX
562 MOV AX,OPEN SHL 8
563 INT int_command ; Open the batch file
564 JC SETERRDL
565 POP DS
566ASSUME DS:RESGROUP
567 MOV [BATHAND],AX
568 MOV BX,AX
569 MOV DX,WORD PTR [BATLOC]
570 MOV CX,WORD PTR [BATLOC+2]
571 MOV AX,LSEEK SHL 8 ; Go to the right spot
572 INT int_command
573 return
574
575SETERRDL:
576 MOV BX,DX
577 MOV AL,[BX] ; Get drive spec
578 SUB AL,'@' ; A = 1
579 POP DS
580 STC ; SUB mucked over carry
581 return
582
583MESTRAN:
584ASSUME DS:NOTHING,ES:NOTHING
585 LODSB
586 CMP AL,"$"
587 retz
588 STOSB
589 JMP MESTRAN
590IOSET:
591; ALL REGISTERS PRESERVED
592ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
593 PUSH DS
594 PUSH DX
595 PUSH AX
596 PUSH BX
597 PUSH CX
598 MOV DS,[RESSEG]
599ASSUME DS:RESGROUP
600 CMP [PIPEFLAG],0
601 JNZ NOREDIR ; Don't muck up the pipe
602 CALL TESTDOREIN
603 CALL TESTDOREOUT
604NOREDIR:
605 POP CX
606 POP BX
607 POP AX
608 POP DX
609 POP DS
610ASSUME DS:NOTHING
611 return
612
613TESTDOREIN:
614ASSUME DS:RESGROUP
615 CMP [RE_INSTR],0
616 retz
617 MOV DX,OFFSET RESGROUP:RE_INSTR
618 MOV AX,(OPEN SHL 8)
619 INT int_command
620 MOV DX,OFFSET TRANGROUP:NOTFND
621 JC REDIRERR
622 MOV BX,AX
623 MOV AL,0FFH
624 XCHG AL,[BX.PDB_JFN_Table]
625 MOV DS:[PDB_JFN_Table],AL
626 return
627
628REDIRERR:
629 PUSH CS
630 POP DS
631 JMP CERROR
632
633TESTDOREOUT:
634ASSUME DS:RESGROUP
635 CMP [RE_OUTSTR],0
636 JZ NOREOUT
637 CMP [RE_OUT_APP],0
638 JZ REOUTCRT
639 MOV DX,OFFSET RESGROUP:RE_OUTSTR
640 MOV AX,(OPEN SHL 8) OR 1
641 INT int_command
642 JC REOUTCRT
643 XOR DX,DX
644 XOR CX,CX
645 MOV BX,AX
646 MOV AX,(LSEEK SHL 8) OR 2
647 INT int_command
648 JMP SHORT SET_REOUT
649REOUTCRT:
650 MOV DX,OFFSET RESGROUP:RE_OUTSTR
651 XOR CX,CX
652 MOV AH,CREAT
653 INT int_command
654 MOV DX,OFFSET TRANGROUP:FULDIR
655 JC REDIRERR
656 MOV BX,AX
657SET_REOUT:
658 MOV AL,0FFH
659 XCHG AL,[BX.PDB_JFN_Table]
660 MOV DS:[PDB_JFN_Table+1],AL
661NOREOUT:
662 return
663
664STRCOMP:
665; Compare ASCIZ DS:SI with ES:DI.
666; SI,DI destroyed.
667 CMPSB
668 retnz ; Strings not equal
669 cmp byte ptr [SI-1],0 ; Hit NUL terminator?
670 retz ; Yes, strings equal
671 jmp short STRCOMP ; Equal so far, keep going
672
673
674
675TRANCODE ENDS
676 END
677