summaryrefslogtreecommitdiff
path: root/v2.0/source/TCODE5.ASM
diff options
context:
space:
mode:
authorGravatar Rich Turner1983-08-12 17:53:34 -0700
committerGravatar Rich Turner2018-09-21 17:53:34 -0700
commit80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 (patch)
treeee4357f7f3dd0f2ded59b9c6e7384432d85e7ec9 /v2.0/source/TCODE5.ASM
parentMS-DOS v1.25 Release (diff)
downloadms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.gz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.xz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.zip
MS-DOS v2.0 Release
Diffstat (limited to 'v2.0/source/TCODE5.ASM')
-rw-r--r--v2.0/source/TCODE5.ASM953
1 files changed, 953 insertions, 0 deletions
diff --git a/v2.0/source/TCODE5.ASM b/v2.0/source/TCODE5.ASM
new file mode 100644
index 0000000..63fb3cf
--- /dev/null
+++ b/v2.0/source/TCODE5.ASM
@@ -0,0 +1,953 @@
1TITLE PART5 - 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
17 IF IBMVER
18 EXTRN EXEC_WAIT:NEAR
19 ENDIF
20
21CODERES ENDS
22
23
24DATARES 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
29DATARES ENDS
30
31TRANDATA SEGMENT PUBLIC
32 EXTRN PIPEEMES:BYTE,NULPATH:BYTE,NOSPACE:BYTE
33 EXTRN DBACK:BYTE,PROMPT_TABLE:BYTE
34TRANDATA ENDS
35
36TRANSPACE 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
41
42
43 IF KANJI
44 EXTRN KPARSE:BYTE
45 ENDIF
46
47TRANSPACE ENDS
48
49
50TRANCODE SEGMENT PUBLIC BYTE
51ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING
52
53 IF KANJI
54 EXTRN TESTKANJ:NEAR
55 ENDIF
56
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
62
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
70
71
72FREE_TPA:
73ASSUME DS:TRANGROUP,ES:NOTHING
74 PUSH ES
75 MOV ES,[TPA]
76 MOV AH,DEALLOC
77 INT int_command ; Make lots of free memory
78 POP ES
79 return
80
81ALLOC_TPA:
82ASSUME DS:TRANGROUP,ES:RESGROUP
83 MOV BX,0FFFFH ; Re-allocate the transient
84 MOV AH,ALLOC
85 INT int_command
86 MOV AH,ALLOC
87 INT int_command
88 MOV [LTPA],AX ; Re-compute evrything
89 MOV [TPA],AX
90 MOV BX,AX
91 MOV AX,CS
92 SUB AX,BX
93 MOV DX,16
94 MUL DX
95 OR DX,DX
96 JZ SAVSIZ2
97 MOV AX,-1
98SAVSIZ2:
99 MOV [BYTCNT],AX
100 return
101
102
103PRESCAN: ; Cook the input buffer
104ASSUME DS:TRANGROUP,ES:TRANGROUP
105 XOR CX,CX
106 MOV ES,[RESSEG]
107ASSUME ES:RESGROUP
108 MOV SI,OFFSET TRANGROUP:COMBUF+2
109 MOV DI,SI
110
111CountQuotes:
112 LODSB ; get a byte
113 CMP AL,22h ; is it a quote?
114 JNZ CountEnd ; no, try for end of road
115 INC CH ; bump count
116 JMP CountQuotes ; go get next char
117CountEnd:
118 CMP AL,13 ; end of road?
119 JNZ CountQuotes ; no, go back for next char
120
121 IF KANJI
122 PUSH CX ; save count
123 MOV SI,DI ; get back beginning of buffer
124KanjiScan:
125 LODSB ; get a byte
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
134KanjiQuote:
135 CMP AL,22h ; beginning of quoted string
136 JNZ KanjiEnd ; no, check for end
137 DEC CH ; drop count
138 JZ KanjiScan ; if count is zero, no quoting
139KanjiQuoteLoop:
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
145KanjiEnd:
146 CMP AL,13 ; end of line character?
147 JNZ KanjiScan ; go back to beginning
148 POP CX ; get back original count
149 ENDIF
150
151 MOV SI,DI ; restore pointer to begining
152PRESCANLP:
153 LODSB
154
155 IF KANJI
156 CALL TESTKANJ
157 JZ NOTKANJ6
158 MOV [DI],AL
159 INC DI ; fake STOSB into DS
160 LODSB ; grab second byte
161 MOV [DI],AL ; fake stosb into DS
162 INC DI
163 INC CL
164 INC CL
165 JMP PRESCANLP
166NOTKANJ6:
167 ENDIF
168
169 CMP AL,22H ; " character
170 JNZ TRYGREATER
171 DEC CH
172 JZ TRYGREATER
173QLOOP:
174 MOV [DI],AL
175 INC DI
176 INC CL
177 LODSB
178 CMP AL,22H ; " character
179 JNZ QLOOP
180 DEC CH
181
182TRYGREATER:
183 CMP AL,'>'
184 JNZ NOOUT
185 CMP BYTE PTR [SI],'>'
186 JNZ NOAPPND
187 LODSB
188 INC [RE_OUT_APP] ; Flag >>
189NOAPPND:
190 CALL SCANOFF
191 CMP AL,0DH
192 JNZ GOTREOFIL
193 MOV WORD PTR [RE_OUTSTR],09H ; Cause an error later
194 JMP SHORT PRESCANEND
195GOTREOFIL:
196 PUSH DI
197 MOV DI,OFFSET RESGROUP:RE_OUTSTR
198SETREOUTSTR: ; Get the output redirection name
199 LODSB
200 CMP AL,0DH
201 JZ GOTRESTR
202 CALL DELIM
203 JZ GOTRESTR
204 CMP AL,[SWITCHAR]
205 JZ GOTRESTR
206 STOSB ; store it into resgroup
207 JMP SHORT SETREOUTSTR
208
209NOOUT:
210 CMP AL,'<'
211 JNZ CHKPIPE
212 CALL SCANOFF
213 CMP AL,0DH
214 JNZ GOTREIFIL
215 MOV WORD PTR [RE_INSTR],09H ; Cause an error later
216 JMP SHORT PRESCANEND
217GOTREIFIL:
218 PUSH DI
219 MOV DI,OFFSET RESGROUP:RE_INSTR
220 JMP SHORT SETREOUTSTR ; Get the input redirection name
221
222CHKPIPE:
223 MOV AH,AL
224 CMP AH,'|'
225 JNZ CONTPRESCAN
226 INC [PIPEFLAG]
227 CALL SCANOFF
228 CMP AL,0DH
229 JZ PIPEERRSYNJ5
230 CMP AL,'|' ; Double '|'?
231 JNZ CONTPRESCAN
232PIPEERRSYNJ5:
233 PUSH ES
234 POP DS ; DS->RESGROUP
235 JMP PIPEERRSYN
236
237GOTRESTR:
238 XCHG AH,AL
239 CMP BYTE PTR ES:[DI-1],':' ; Trailing ':' OK on devices
240 JNZ NOTTRAILCOL
241 DEC DI ; Back up over trailing ':'
242NOTTRAILCOL:
243 XOR AL,AL
244 STOSB ; NUL terminate the string
245 POP DI ; Remember the start
246CONTPRESCAN:
247 MOV [DI],AH ; "delete" the redirection string
248 INC DI
249 CMP AH,0DH
250 JZ PRESCANEND
251 INC CL
252 JMP PRESCANLP
253PRESCANEND:
254 CMP [PIPEFLAG],0
255 JZ ISNOPIPE
256 MOV DI,OFFSET RESGROUP:PIPESTR
257 MOV [PIPEPTR],DI
258 MOV SI,OFFSET TRANGROUP:COMBUF+2
259 CALL SCANOFF
260PIPESETLP: ; Transfer the pipe into the resident pipe buffer
261 LODSB
262 STOSB
263 CMP AL,0DH
264 JNZ PIPESETLP
265ISNOPIPE:
266 MOV [COMBUF+1],CL
267 CMP [PIPEFLAG],0
268 PUSH CS
269 POP ES
270 return
271
272ASSUME DS:TRANGROUP,ES:TRANGROUP
273
274PATHCHRCMP:
275 CMP [SWITCHAR],'/'
276 JZ NOSLASHT
277 CMP AL,'/'
278 retz
279NOSLASHT:
280 CMP AL,'\'
281 return
282
283PATHCRUNCH:
284; Drive taken from FCB
285; DI = Dirsave pointer
286;
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)
292
293 MOV DL,DS:[FCB]
294 CALL SAVUDIR
295 CALL SETPATH
296 TEST [DESTINFO],2
297 JNZ TRYPEEL ; If ? or * cannot be pure dir
298 MOV AH,CHDIR
299 INT int_command
300 JC TRYPEEL
301 CALL SETREST1
302 MOV AL,"?" ; *.* is default file spec if pure dir
303 MOV DI,5DH
304 MOV CX,11
305 REP STOSB
306 XOR AL,AL ; Set zero
307 return
308
309TRYPEEL:
310 MOV SI,[PATHPOS]
311 DEC SI ; Point at NUL
312 MOV AL,[SI-1]
313
314 IF KANJI
315 CMP [KPARSE],0
316 JNZ DELSTRT ; Last char is second KANJI byte, might be '\'
317 ENDIF
318
319 CALL PATHCHRCMP
320 JZ PEELFAIL ; Trailing '/'
321
322 IF KANJI
323DELSTRT:
324 MOV CX,SI
325 MOV SI,DX
326 PUSH DX
327DELLOOP:
328 CMP SI,CX
329 JZ GOTDELE
330 LODSB
331 CALL TESTKANJ
332 JZ NOTKANJ8
333 INC SI
334 JMP DELLOOP
335
336NOTKANJ8:
337 CALL PATHCHRCMP
338 JNZ DELLOOP
339 MOV DX,SI
340 DEC DX
341 JMP DELLOOP
342
343GOTDELE:
344 MOV SI,DX
345 POP DX
346 CMP SI,DX
347 JZ BADRET
348 MOV CX,SI
349 MOV SI,DX
350DELLOOP2: ; Set value of KPARSE
351 CMP SI,CX
352 JZ KSET
353 MOV [KPARSE],0
354 LODSB
355 CALL TESTKANJ
356 JZ DELLOOP2
357 INC SI
358 INC [KPARSE]
359 JMP DELLOOP2
360
361KSET:
362 ELSE
363DELLOOP:
364 CMP SI,DX
365 JZ BADRET
366 MOV AL,[SI]
367 CALL PATHCHRCMP
368 JZ TRYCD
369 DEC SI
370 JMP SHORT DELLOOP
371 ENDIF
372
373TRYCD:
374 CMP BYTE PTR [SI+1],'.'
375 JZ PEELFAIL ; If . or .., pure cd should have worked
376 mov al,[si-1]
377 CMP al,DRVCHAR ; Special case dDRVCHAR,DIRCHARfile
378 JZ BADRET
379
380 IF KANJI
381 CMP [KPARSE],0
382 JNZ NOTDOUBLESL ; Last char is second KANJI byte, might be '\'
383 ENDIF
384
385 CALL PATHCHRCMP
386 JNZ NOTDOUBLESL
387PEELFAIL:
388 STC ; //
389 return
390NOTDOUBLESL:
391 MOV BYTE PTR [SI],0
392 MOV AH,CHDIR
393 INT int_command
394 JNC CDSUCC
395 return
396
397BADRET:
398 MOV AL,[SI]
399 CALL PATHCHRCMP ; Special case 'DIRCHAR'file
400 STC
401 retnz
402 XOR BL,BL
403 XCHG BL,[SI+1]
404 MOV AH,CHDIR
405 INT int_command
406 retc
407 MOV [SI+1],BL
408CDSUCC:
409 CALL SETREST1
410 INC SI ; Reset zero
411 MOV [DESTTAIL],SI
412 MOV DI,FCB
413 MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 02H ; Parse with default drive
414 INT int_command
415 return
416
417
418DISPSIZE:
419 MOV SI,WORD PTR[DIRBUF+29+7]
420 MOV DI,WORD PTR[DIRBUF+31+7]
421
422DISP32BITS:
423; Prints the 32-bit number DI:SI on the console in decimal. Uses a total
424; of 9 digit positions with leading blanks.
425 XOR AX,AX
426 MOV BX,AX
427 MOV BP,AX
428 MOV CX,32
429CONVLP:
430 SHL SI,1
431 RCL DI,1
432 XCHG AX,BP
433 CALL CONVWRD
434 XCHG AX,BP
435 XCHG AX,BX
436 CALL CONVWRD
437 XCHG AX,BX
438 ADC AL,0
439 LOOP CONVLP
440
441; Conversion complete. Print 9-digit number.
442
443 MOV DI,OFFSET TRANGROUP:CHARBUF
444 MOV CX,1810H ; Allow leading zero blanking for 8 digits
445 XCHG DX,AX
446 CALL DIGIT
447 XCHG AX,BX
448 CALL OUTWORD
449 XCHG AX,BP
450 CALL OUTWORD
451 XOR AX,AX
452 STOSB
453 MOV DX,OFFSET TRANGROUP:CHARBUF
454 JMP ZPRINT
455
456OUTWORD:
457 PUSH AX
458 MOV DL,AH
459 CALL OUTBYTE
460 POP DX
461OUTBYTE:
462 MOV DH,DL
463 SHR DL,1
464 SHR DL,1
465 SHR DL,1
466 SHR DL,1
467 CALL DIGIT
468 MOV DL,DH
469DIGIT:
470 AND DL,0FH
471 JZ BLANKZER
472 MOV CL,0
473BLANKZER:
474 DEC CH
475 AND CL,CH
476 OR DL,30H
477 SUB DL,CL
478 MOV AL,DL
479 STOSB
480 return
481
482CONVWRD:
483 ADC AL,AL
484 DAA
485 XCHG AL,AH
486 ADC AL,AL
487 DAA
488 XCHG AL,AH
489 return
490
491
492GETBATBYT:
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.
496ASSUME DS:RESGROUP
497 ADD WORD PTR [BATLOC],1 ; Add one to file location
498 ADC WORD PTR [BATLOC+2],0
499 PUSH BX
500 MOV DX,OFFSET RESGROUP:BATBYT
501 MOV BX,[BATHAND]
502 MOV AH,READ
503 MOV CX,1
504 INT int_command ; Get one more byte from batch file
505 POP BX
506 MOV CX,AX
507 JC BATEOF
508 JCXZ BATEOF
509 MOV AL,[BATBYT]
510 CMP AL,1AH
511 retnz
512BATEOF:
513 PUSH ES
514 MOV ES,[BATCH] ; Turn off batch
515 MOV AH,DEALLOC
516 INT int_command ; free up the batch piece
517 POP ES
518 MOV [BATCH],0 ; AFTER DEALLOC in case of ^C
519 CALL BATCLOSE
520 MOV AL,0DH ; If end-of-file, then end of line
521 CMP [SINGLECOM],0FFF0H ; See if we need to set SINGLECOM
522 JNZ NOSETSING2
523 MOV [SINGLECOM],-1 ; Cause termination
524NOSETSING2:
525 MOV [ECHOFLAG],1
526 return
527ASSUME DS:TRANGROUP
528
529SCANOFF:
530 LODSB
531 CALL DELIM
532 JZ SCANOFF
533 DEC SI ; Point to first non-delimiter
534 return
535
536DELIM:
537 CMP AL," "
538 retz
539 CMP AL,"="
540 retz
541 CMP AL,","
542 retz
543 CMP AL,";"
544 retz
545 CMP AL,9 ; Check for TAB character
546 return
547
548
549PRINT_PROMPT:
550 PUSH DS
551 PUSH CS
552 POP DS ; MAKE SURE DS IS IN TRANGROUP
553
554 PUSH ES
555 CALL FIND_PROMPT ; LOOK FOR PROMPT STRING
556 JC PP0 ; CAN'T FIND ONE
557 CMP BYTE PTR ES:[DI],0
558 JNZ PP1
559PP0:
560 CALL PRINT_DRIVE ; USE DEFAULT PROMPT
561 MOV AL,SYM
562 CALL OUT
563 JMP SHORT PP5
564
565PP1:
566 MOV AL,ES:[DI] ; GET A CHAR
567 INC DI
568 OR AL,AL
569 JZ PP5 ; NUL TERMINATED
570 CMP AL,"$" ; META CHARACTER?
571 JZ PP2 ; NOPE
572PPP1:
573 CALL OUT
574 JMP PP1
575
576PP2:
577 MOV AL,ES:[DI]
578 INC DI
579 MOV BX,OFFSET TRANGROUP:PROMPT_TABLE-3
580 OR AL,AL
581 JZ PP5
582
583PP3:
584 ADD BX,3
585 CALL UPCONV
586 CMP AL,[BX]
587 JZ PP4
588 CMP BYTE PTR [BX],0
589 JNZ PP3
590 JMP PP1
591
592PP4:
593 PUSH ES
594 PUSH DI
595 PUSH CS
596 POP ES
597 CALL [BX+1]
598 POP DI
599 POP ES
600 JMP PP1
601
602PP5:
603 POP ES ; RESTORE SEGMENTS
604 POP DS
605 return
606
607PRINT_BACK:
608 MOV DX,OFFSET TRANGROUP:DBACK
609 JMP ZPRINT
610
611PRINT_EQ:
612 MOV AL,"="
613 JMP SHORT OUTV
614PRINT_ESC:
615 MOV AL,1BH
616 JMP SHORT OUTV
617PRINT_G:
618 MOV AL,">"
619 JMP SHORT OUTV
620PRINT_L:
621 MOV AL,"<"
622 JMP SHORT OUTV
623PRINT_B:
624 MOV AL,"|"
625OUTV:
626 JMP OUT
627
628SETPATH:
629; Get an ASCIZ argument from the unformatted parms
630; DESTISDIR set if pathchars in string
631; DESTINFO set if ? or * in string
632 MOV SI,80H
633 LODSB
634 XOR AH,AH
635 MOV [PATHCNT],AX
636 MOV [PATHPOS],SI
637GETPATH:
638 MOV [DESTINFO],0
639 MOV [DESTISDIR],0
640 MOV SI,[PATHPOS]
641 MOV CX,[PATHCNT]
642 MOV DX,SI
643 JCXZ PATHDONE
644 PUSH CX
645 PUSH SI
646 CALL SWITCH
647 MOV [PATHSW],AX
648 POP BX
649 SUB BX,SI
650 POP CX
651 ADD CX,BX
652 MOV DX,SI
653SKIPPATH:
654
655 IF KANJI
656 MOV [KPARSE],0
657SKIPPATH2:
658 ENDIF
659
660 JCXZ PATHDONE
661 DEC CX
662 LODSB
663
664 IF KANJI
665 CALL TESTKANJ
666 JZ TESTPPSEP
667 DEC CX
668 INC SI
669 INC [KPARSE]
670 JMP SKIPPATH2
671
672TESTPPSEP:
673 ENDIF
674
675 CALL PATHCHRCMP
676 JNZ TESTPMETA
677 INC [DESTISDIR]
678TESTPMETA:
679 CMP AL,'?'
680 JNZ TESTPSTAR
681 OR [DESTINFO],2
682TESTPSTAR:
683 CMP AL,'*'
684 JNZ TESTPDELIM
685 OR [DESTINFO],2
686TESTPDELIM:
687 CALL DELIM
688 JZ PATHDONEDEC
689 CMP AL,[SWITCHAR]
690 JNZ SKIPPATH
691PATHDONEDEC:
692 DEC SI
693PATHDONE:
694 XOR AL,AL
695 XCHG AL,[SI]
696 INC SI
697 CMP AL,0DH
698 JNZ NOPSTORE
699 MOV [SI],AL ;Don't loose the CR
700NOPSTORE:
701 MOV [PATHPOS],SI
702 MOV [PATHCNT],CX
703 return
704
705PGETARG:
706 MOV SI,80H
707 LODSB
708 OR AL,AL
709 retz
710 CALL PSCANOFF
711 CMP AL,13
712 return
713
714PSCANOFF:
715 LODSB
716 CALL DELIM
717 JNZ PSCANOFFD
718 CMP AL,';'
719 JNZ PSCANOFF ; ';' is not a delimiter
720PSCANOFFD:
721 DEC SI ; Point to first non-delimiter
722 return
723
724PATH:
725 CALL FIND_PATH
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=
731 CALL PGETARG
732 CMP AL,';' ; NUL path argument?
733 JZ GOTPATHS
734PATHSLP: ; Get the user specified path
735 LODSB
736 CMP AL,0DH
737 JZ GOTPATHS
738
739 IF KANJI
740 CALL TESTKANJ
741 JZ NOTKANJ2
742 CALL STORE_CHAR
743 LODSB
744 CALL STORE_CHAR
745 JMP SHORT PATHSLP
746
747NOTKANJ2:
748 ENDIF
749
750 CALL UPCONV
751 CMP AL,';' ; ';' not a delimiter on PATH
752 JZ NOTDELIM
753 CALL DELIM
754 JZ GOTPATHS
755NOTDELIM:
756 CALL STORE_CHAR
757 JMP SHORT PATHSLP
758
759GOTPATHS:
760 XOR AX,AX
761 STOSW
762 return
763
764DISPPATH:
765 CALL PRINT_PATH
766 CALL CRLF2
767 return
768
769PRINT_PATH:
770 CMP BYTE PTR ES:[DI],0
771 JNZ PATH1
772PATH0:
773 MOV DX,OFFSET TRANGROUP:NULPATH
774 PUSH CS
775 POP DS
776 JMP PRINT
777PATH1:
778 PUSH ES
779 POP DS
780 SUB DI,5
781 MOV DX,DI
782ASSUME DS:RESGROUP
783 CALL SCASB2 ; LOOK FOR NUL
784 CMP CX,0FFH
785 JZ PATH0
786 JMP ZPRINT
787
788FCB_TO_ASCZ: ; Convert DS:SI to ASCIZ ES:DI
789 MOV CX,8
790MAINNAME:
791 LODSB
792 CMP AL,' '
793 JZ SKIPSPC
794 STOSB
795SKIPSPC:
796 LOOP MAINNAME
797 LODSB
798 CMP AL,' '
799 JZ GOTNAME
800 MOV AH,AL
801 MOV AL,'.'
802 STOSB
803 XCHG AL,AH
804 STOSB
805 MOV CL,2
806EXTNAME:
807 LODSB
808 CMP AL,' '
809 JZ GOTNAME
810 STOSB
811 LOOP EXTNAME
812
813GOTNAME:
814 XOR AL,AL
815 STOSB
816 return
817
818GETNUM:
819 CALL INDIG
820 retc
821 MOV AH,AL ; Save first digit
822 CALL INDIG ; Another digit?
823 JC OKRET
824 AAD ; Convert unpacked BCD to decimal
825 MOV AH,AL
826OKRET:
827 OR AL,1
828 return
829
830INDIG:
831 MOV AL,BYTE PTR[SI]
832 SUB AL,"0"
833 retc
834 CMP AL,10
835 CMC
836 retc
837 INC SI
838 return
839
840
841OUT2: ; Output binary number as two ASCII digits
842 AAM ; Convert binary to unpacked BCD
843 XCHG AL,AH
844 OR AX,3030H ; Add "0" bias to both digits
845 CMP AL,"0" ; Is MSD zero?
846 JNZ NOSUP
847 SUB AL,BH ; Suppress leading zero if enabled
848NOSUP:
849 MOV BH,0 ; Disable zero suppression
850 STOSW
851 return
852
853OUT:
854; Print char in AL without affecting registers
855 XCHG AX,DX
856 PUSH AX
857 CALL OUT_CHAR
858 POP AX
859 XCHG AX,DX
860 return
861
862OUT_CHAR:
863 PUSH DS
864 PUSH DX
865 PUSH CX
866 PUSH BX
867 PUSH AX
868 PUSH CS
869 POP DS
870 MOV BX,OFFSET TRANGROUP:CHARBUF
871 MOV [BX],DL
872 MOV DX,BX
873 MOV BX,1
874 MOV CX,BX
875 MOV AH,WRITE
876 INT int_command
877 POP AX
878 POP BX
879 POP CX
880 POP DX
881 POP DS
882 return
883
884
885ERROR_PRINT:
886 PUSH AX
887 PUSH BX
888 MOV AL,"$"
889 MOV BX,2 ;STD ERROR
890 JMP SHORT STRING_OUT
891
892CRPRINT:
893 PUSH AX
894 MOV AL,13
895 JMP SHORT Z$PRINT
896PRINT: ;$ TERMINATED STRING
897 PUSH AX
898 MOV AL,"$"
899 JMP SHORT Z$PRINT
900ZPRINT:
901 PUSH AX
902 XOR AX,AX ;NUL TERMINATED STRING
903Z$PRINT:
904 PUSH BX
905 MOV BX,1 ;STD CON OUT
906;
907; output string terminated by AL to handle BX, DS:DX points to string
908;
909STRING_OUT:
910 PUSH CX
911 PUSH DI
912 MOV DI,DX
913 MOV CX,-1
914 PUSH ES
915 PUSH DS
916 POP ES
917 REPNZ SCASB ; LOOK FOR TERMINATOR
918 POP ES
919 NEG CX
920 DEC CX
921 DEC CX
922;
923; WRITE CHARS AT DS:DX TO HANDLE IN BX, COUNT IN CX
924;
925 MOV AH,WRITE
926 INT int_command
927 JC ERROR_OUTPUT
928 CMP AX,CX
929 JNZ ERROR_OUTPUT
930 POP DI
931 POP CX
932 POP BX
933 POP AX
934 return
935
936ERROR_OUTPUT:
937 PUSH CS
938 POP DS
939ASSUME DS:TRANGROUP
940 MOV ES,[RESSEG]
941ASSUME ES:RESGROUP
942 MOV DX,OFFSET TRANGROUP:NOSPACE
943 CMP [PIPEFLAG],0
944 JZ GO_TO_ERROR
945 MOV [PIPEFLAG],0
946 MOV DX,OFFSET TRANGROUP:PIPEEMES
947GO_TO_ERROR:
948 JMP CERROR
949
950
951TRANCODE ENDS
952 END
953