summaryrefslogtreecommitdiff
path: root/v2.0/source/TCODE3.ASM
blob: 547c937024b67c66d431bd840cb7bde542799f99 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
TITLE   PART3 - COMMAND Transient routines.

        INCLUDE COMSW.ASM

.xlist
.xcref
        INCLUDE DOSSYM.ASM
        INCLUDE DEVSYM.ASM
        INCLUDE COMSEG.ASM
.list
.cref

        INCLUDE COMEQU.ASM


DATARES SEGMENT PUBLIC
        EXTRN   BATCH:WORD,BATLOC:DWORD
        EXTRN   RETCODE:WORD,ECHOFLAG:BYTE
        EXTRN   SINGLECOM:WORD,FORFLAG:BYTE,UFORDRV:BYTE
        EXTRN   FORSET:BYTE,FORCOM:BYTE,FORVAR:BYTE,FORPTR:WORD
        EXTRN   FORUFCB:BYTE,FORFCB:BYTE,RE_INSTR:BYTE,RE_OUT_APP:BYTE
        EXTRN   RE_OUTSTR:BYTE,PIPEFLAG:BYTE

DATARES ENDS

TRANDATA        SEGMENT PUBLIC

        EXTRN   BADLAB:BYTE,SYNTMES:BYTE,FORNESTMES:BYTE
        EXTRN   NOTFND:BYTE,FULDIR:BYTE,IFTAB:BYTE
TRANDATA        ENDS

TRANSPACE       SEGMENT PUBLIC

        EXTRN   BATHAND:WORD,RESSEG:WORD,DIRBUF:BYTE,COMBUF:BYTE
        EXTRN   GOTOLEN:WORD,IFNOTFLAG:BYTE

TRANSPACE       ENDS


TRANCODE        SEGMENT PUBLIC BYTE
ASSUME  CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING

        EXTRN   SCANOFF:NEAR,DOCOM:NEAR,DOCOM1:NEAR,CERROR:NEAR
        EXTRN   PRINT:NEAR,TCOMMAND:NEAR,DELIM:NEAR,GETBATBYT:NEAR
        EXTRN   FCB_TO_ASCZ:NEAR

        PUBLIC  GOTO,$IF,IFERLEV,SHIFT,IFEXISTS
        PUBLIC  STRCOMP,MesTran,$FOR,IFNOT
        PUBLIC  FORPROC,BATOPEN,BATCLOSE
        PUBLIC  IOSET,TESTDOREIN,TESTDOREOUT

        ASSUME  DS:RESGROUP
FORTERM:
        MOV     [FORFLAG],0
        CMP     [SINGLECOM],0FF00H
        JNZ     NOFORP2
        MOV     [SINGLECOM],-1          ; Cause a terminate
NOFORP2:
        JMP     TCOMMAND

FORPROC:
ASSUME  DS:RESGROUP
        CMP     [FORUFCB],-1
        JZ      NORMFOR
        MOV     DX,OFFSET TRANGROUP:DIRBUF
        PUSH    DS
        PUSH    CS
        POP     DS
ASSUME  DS:TRANGROUP
        MOV     AH,SET_DMA
        INT     int_command
        POP     DS
ASSUME  DS:RESGROUP
        MOV     DX,OFFSET RESGROUP:FORFCB
        MOV     AH,DIR_SEARCH_NEXT
        CMP     [FORUFCB],0
        JZ      DOFORSRCH
        MOV     AH,DIR_SEARCH_FIRST
        MOV     [FORUFCB],0
DOFORSRCH:
        INT     int_command
        OR      AL,AL
        JNZ     FORTERM
        PUSH    DS
        POP     ES
ASSUME  ES:RESGROUP
        PUSH    CS
        POP     DS
ASSUME  DS:TRANGROUP
        MOV     SI,OFFSET TRANGROUP:DIRBUF
        MOV     DI,OFFSET RESGROUP:FORSET
        MOV     [FORPTR],DI
        LODSB                   ;Get drive spec
        ADD     AL,'@'
        CMP     AL,'@'
        JZ      NDRV8
        CMP     [UFORDRV],0
        JZ      NDRV8
        MOV     AH,':'
        STOSW
NDRV8:
        CALL    FCB_TO_ASCZ
        MOV     BYTE PTR ES:[DI-1],0DH
        PUSH    ES
        POP     DS
ASSUME  DS:RESGROUP
NORMFOR:
        PUSH    CS
        POP     ES
ASSUME  ES:TRANGROUP
        MOV     BX,[FORPTR]
        CMP     BYTE PTR [BX],0
        JZ      FORTERM
        MOV     SI,BX
PARMSUB0:
        LODSB
        CMP     AL,0DH
        JNZ     PARMSUB0
        MOV     DX,SI           ; DX points to next parm
        MOV     SI,OFFSET RESGROUP:FORCOM
        MOV     DI,OFFSET TRANGROUP:COMBUF+2
        XOR     CX,CX
TFORCOM:
        LODSB
        CMP     AL,'%'
        JNZ     NOFORPARM
        MOV     AH,[FORVAR]
        CMP     AH,[SI]
        JNZ     NOFORPARM
        INC     SI
        PUSH    SI
        MOV     SI,BX
PARMSUB:
        LODSB
        CMP     AL,0DH
        JZ      PARMSUBDONE
        INC     CX
        STOSB
        JMP     SHORT PARMSUB
PARMSUBDONE:
        POP     SI              ; Get back command line pointer
        JMP     TFORCOM
NOFORPARM:
        STOSB
        INC     CX
        CMP     AL,0DH
        JNZ     TFORCOM
        DEC     CX
        MOV     [COMBUF+1],CL
        MOV     [FORPTR],DX     ; Point to next set element
        TEST    [ECHOFLAG],-1
        PUSH    CS
        POP     DS
ASSUME  DS:TRANGROUP
        JZ      NOECHO3
        MOV     BYTE PTR ES:[DI-1],'$'
        MOV     DX,OFFSET TRANGROUP:COMBUF+2
        CALL    PRINT
        MOV     BYTE PTR ES:[DI-1],0DH
        JMP     DOCOM
NOECHO3:
        JMP     DOCOM1

ASSUME  DS:TRANGROUP,ES:TRANGROUP

FORNESTERR:
        PUSH    DS
        MOV     DS,[RESSEG]
ASSUME  DS:RESGROUP
        MOV     DX,OFFSET TRANGROUP:FORNESTMES
        CMP     [SINGLECOM],0FF00H
        JNZ     NOFORP3
        MOV     [SINGLECOM],-1          ; Cause termination
NOFORP3:
        POP     DS
ASSUME  DS:TRANGROUP
        JMP     CERROR

$FOR:
        MOV     SI,81H
        XOR     CX,CX
        MOV     ES,[RESSEG]
ASSUME  ES:RESGROUP
        MOV     DI,OFFSET RESGROUP:FORSET
        XOR     AL,AL
        MOV     [UFORDRV],AL
        XCHG    AL,[FORFLAG]
        OR      AL,AL
        JNZ     FORNESTERR
        MOV     [FORPTR],DI
        MOV     [FORUFCB],-1
        CALL    SCANOFF
        LODSW
        CMP     AL,'%'
        JNZ     FORERRORJ
        MOV     [FORVAR],AH
        CALL    SCANOFF
        CMP     AL,0DH
        JZ      FORERRORJ2
        LODSW
        CMP     AX,('N' SHL 8) OR 'I'
        JZ      FOROK1
        CMP     AX,('n' SHL 8) OR 'i'
        JNZ     FORERRORJ
FOROK1:
        CALL    SCANOFF
        LODSB
        CMP     AL,'('
        JNZ     FORERRORJ
        CALL    SCANOFF
        CMP     AL,')'          ; Special check for null set
        JNZ     FORSETLP
        MOV     DS,[RESSEG]
        JMP     FORTERM
FORSETLP:
        LODSB
        CMP     AL,0DH
FORERRORJ2:
        JZ  FORERRORJ3
        CMP     AL,')'
        JZ      FORSETEND
        STOSB
        CMP     AL,'*'
        JZ      SETFORSCAN
        CMP     AL,'?'
        JNZ     NOFORSCAN
SETFORSCAN:
        MOV     [FORUFCB],1
NOFORSCAN:
        CALL    DELIM
        JNZ     FORSETLP
        MOV     BYTE PTR ES:[DI-1],0DH
        CALL    SCANOFF
        JMP     FORSETLP

FORSETEND:
        MOV     AX,000DH
        CMP     BYTE PTR ES:[DI-1],0DH
        JNZ     FORSETTERM
        XOR     AX,AX
FORSETTERM:
        STOSW
        CALL    SCANOFF
        LODSW
        CMP     AX,('O' SHL 8) OR 'D'
        JZ      FOROK2
        CMP     AX,('o' SHL 8) OR 'd'
FORERRORJ:
        JNZ  FORERROR
FOROK2:
        CALL    SCANOFF
        CMP     AL,0DH
FORERRORJ3:
        JZ      FORERROR
        MOV     DI,OFFSET RESGROUP:FORCOM
FORCOMLP:
        LODSB
        STOSB
        CMP     AL,0DH
        JNZ     FORCOMLP
        INC     [FORFLAG]
        CMP     [SINGLECOM],-1
        JNZ     NOFORP
        MOV     [SINGLECOM],0FF00H      ; Flag single command for
NOFORP:
        CMP     [FORUFCB],1
        retnz
        PUSH    ES
        POP     DS
ASSUME  DS:RESGROUP
        MOV     DI,OFFSET RESGROUP:FORFCB
        MOV     SI,OFFSET RESGROUP:FORSET
        CMP     BYTE PTR [SI+1],':'
        JNZ     NOSETUDRV
        INC     [UFORDRV]
NOSETUDRV:
        MOV     AX,PARSE_FILE_DESCRIPTOR SHL 8
        INT     int_command
        return


ASSUME  DS:TRANGROUP,ES:TRANGROUP

IFERRORP:
        POP     AX
IFERROR:
FORERROR:
        MOV     DX,OFFSET TRANGROUP:SYNTMES
        JMP     CERROR

$IF:
        MOV     [IFNOTFLAG],0
        MOV     SI,81H
IFREENT:
        CALL    SCANOFF
        CMP     AL,0DH
        JZ      IFERROR
        MOV     BP,SI
        MOV     DI,OFFSET TRANGROUP:IFTAB     ; Prepare to search if table
        MOV     CH,0
IFINDCOM:
        MOV     SI,BP
        MOV     CL,[DI]
        INC     DI
        JCXZ    IFSTRING
        JMP     SHORT FIRSTCOMP
IFCOMP:
        JNZ     IFDIF
FIRSTCOMP:
        LODSB
        MOV     AH,ES:[DI]
        INC     DI
        CMP     AL,AH
        JZ      IFLP
        OR      AH,20H          ; Try lower case
        CMP     AL,AH
IFLP:
        LOOP    IFCOMP
IFDIF:
        LAHF
        ADD     DI,CX           ; Bump to next position without affecting flags
        MOV     BX,[DI]         ; Get handler address
        INC     DI
        INC     DI
        SAHF
        JNZ     IFINDCOM
        LODSB
        CMP     AL,0DH
IFERRORJ:
        JZ    IFERROR
        CALL    DELIM
        JNZ     IFINDCOM
        CALL    SCANOFF
        JMP     BX

IFNOT:
        NOT     [IFNOTFLAG]
        JMP     IFREENT


IFSTRING:
        PUSH    SI
        XOR     CX,CX
FIRST_STRING:
        LODSB
        CMP     AL,0DH
        JZ      IFERRORP
        CALL    DELIM
        JZ      EQUAL_CHECK
        INC     CX
        JMP     SHORT FIRST_STRING
EQUAL_CHECK:
        CMP     AL,'='
        JZ      EQUAL_CHECK2
        CMP     AL,0DH
        JZ      IFERRORP
        LODSB
        JMP     SHORT EQUAL_CHECK
EQUAL_CHECK2:
        LODSB
        CMP     AL,'='
        JNZ     IFERRORP
        CALL    SCANOFF
        CMP     AL,0DH
        JZ      IFERRORP
        POP     DI
        REPE    CMPSB
        JZ      MATCH
        CMP     BYTE PTR [SI-1],0DH
        JZ      IFERRORJ
SKIPSTRINGEND:
        LODSB
NOTMATCH:
        CMP     AL,0DH
IFERRORJ2:
        JZ   IFERRORJ
        CALL    DELIM
        JNZ     SKIPSTRINGEND
        MOV     AL,-1
        JMP     SHORT IFRET
MATCH:
        LODSB
        CALL    DELIM
        JNZ     NOTMATCH
        XOR     AL,AL
        JMP     SHORT IFRET

IFEXISTS:
        MOV     DI,OFFSET TRANGROUP:DIRBUF
        MOV     AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 01H
        INT     int_command
        MOV     AH,FCB_OPEN
        MOV     DX,DI
        INT     int_command
IFRET:
        TEST    [IFNOTFLAG],-1
        JZ      REALTEST
        NOT     AL
REALTEST:
        OR      AL,AL
        JZ      IFTRUE
        JMP     TCOMMAND
IFTRUE:
        CALL    SCANOFF
        MOV     CX,SI
        SUB     CX,81H
        SUB     DS:[80H],CL
        MOV     CL,DS:[80H]
        MOV     [COMBUF+1],CL
        MOV     DI,OFFSET TRANGROUP:COMBUF+2
        REP     MOVSB
        MOV     AL,0DH
        STOSB
        JMP     DOCOM1

IFERLEV:
        MOV     BH,10
        XOR     BL,BL
GETNUMLP:
        LODSB
        CMP     AL,0DH
        JZ      IFERRORJ2
        CALL    DELIM
        JZ      GOTNUM
        SUB     AL,'0'
        XCHG    AL,BL
        MUL     BH
        ADD     AL,BL
        XCHG    AL,BL
        JMP     SHORT GETNUMLP
GOTNUM:
        PUSH    DS
        MOV     DS,[RESSEG]
ASSUME  DS:RESGROUP
        MOV     AH,BYTE PTR [RETCODE]
        POP     DS
ASSUME  DS:TRANGROUP
        XOR     AL,AL
        CMP     AH,BL
        JAE     IFRET
        DEC     AL
        JMP     SHORT IFRET

ASSUME  DS:TRANGROUP

SHIFT:
        MOV     DS,[RESSEG]
ASSUME  DS:RESGROUP
        MOV     AX,[BATCH]
        TEST    AX,-1
        retz
        MOV     ES,AX
        MOV     DS,AX
ASSUME  DS:NOTHING,ES:NOTHING
        XOR     CX,CX
        MOV     AX,CX
        MOV     DI,CX
        DEC     CX
        REPNZ   SCASB
        MOV     SI,DI
        INC     SI
        INC     SI
        MOV     CX,9
        REP     MOVSW                   ; Perform shift of existing parms
        CMP     WORD PTR [DI],-1
        retz                            ; No new parm
        MOV     SI,[DI]
        MOV     WORD PTR [DI],-1        ; Assume no parm
        MOV     DS,[RESSEG]
ASSUME  DS:RESGROUP
SKIPCRLP:
        LODSB
        CMP     AL,0DH
        JNZ     SKIPCRLP
        CMP     BYTE PTR [SI],0
        retz                            ; End of parms
        MOV     ES:[DI],SI              ; Pointer to next parm as %9
        return


ASSUME  DS:TRANGROUP,ES:TRANGROUP
GOTO:
        MOV     DS,[RESSEG]
ASSUME  DS:RESGROUP
        TEST    [BATCH],-1
        retz                    ; If not in batch mode, a nop
        XOR     DX,DX
        MOV     WORD PTR [BATLOC],DX    ; Back to start
        MOV     WORD PTR [BATLOC+2],DX
        CALL    BATOPEN                 ; Find the batch file
        MOV     DI,FCB+1        ; Get the label
        MOV     CX,11
        MOV     AL,' '
        REPNE   SCASB
        JNZ     NOINC
        INC     CX
NOINC:
        SUB     CX,11
        NEG     CX
        MOV     [GOTOLEN],CX
        CALL    GETBATBYT
        CMP     AL,':'
        JZ      CHKLABEL
LABLKLP:                        ; Look for the label
        CALL    GETBATBYT
        CMP     AL,0AH
        JNZ     LABLKTST
        CALL    GETBATBYT
        CMP     AL,':'
        JZ      CHKLABEL
LABLKTST:
        TEST    [BATCH],-1
        JNZ     LABLKLP
        CALL    BATCLOSE
        PUSH    CS
        POP     DS
        MOV     DX,OFFSET TRANGROUP:BADLAB
        JMP     CERROR

CHKLABEL:
        MOV     DI,FCB+1
        MOV     CX,[GOTOLEN]
NEXTCHRLP:
        PUSH    CX
        CALL    GETBATBYT
        POP     CX
        OR      AL,20H
        CMP     AL,ES:[DI]
        JNZ     TRYUPPER
        JMP     SHORT NEXTLABCHR
TRYUPPER:
        SUB     AL,20H
        CMP     AL,ES:[DI]
        JNZ     LABLKTST
NEXTLABCHR:
        INC     DI
        LOOP    NEXTCHRLP
        CALL    GETBATBYT
        CMP     AL,' '
        JA      LABLKTST
        CMP     AL,0DH
        JZ      SKIPLFEED
TONEXTBATLIN:
        CALL    GETBATBYT
        CMP     AL,0DH
        JNZ     TONEXTBATLIN
SKIPLFEED:
        CALL    GETBATBYT
BATCLOSE:
        MOV     BX,CS:[BATHAND]
        MOV     AH,CLOSE
        INT     int_command
        return

BATOPEN:
;Open the BATCH file, If open fails, AL is drive of batch file (A=1)
ASSUME  DS:RESGROUP,ES:TRANGROUP
        PUSH    DS
        MOV     DS,[BATCH]
ASSUME  DS:NOTHING
        XOR     DX,DX
        MOV     AX,OPEN SHL 8
        INT     int_command             ; Open the batch file
        JC      SETERRDL
        POP     DS
ASSUME  DS:RESGROUP
        MOV     [BATHAND],AX
        MOV     BX,AX
        MOV     DX,WORD PTR [BATLOC]
        MOV     CX,WORD PTR [BATLOC+2]
        MOV     AX,LSEEK SHL 8          ; Go to the right spot
        INT     int_command
        return

SETERRDL:
        MOV     BX,DX
        MOV     AL,[BX]                 ; Get drive spec
        SUB     AL,'@'                  ; A = 1
        POP     DS
        STC                             ; SUB mucked over carry
        return

MESTRAN:
ASSUME  DS:NOTHING,ES:NOTHING
        LODSB
        CMP     AL,"$"
        retz
        STOSB
        JMP     MESTRAN
IOSET:
; ALL REGISTERS PRESERVED
ASSUME  DS:NOTHING,ES:NOTHING,SS:NOTHING
        PUSH    DS
        PUSH    DX
        PUSH    AX
        PUSH    BX
        PUSH    CX
        MOV     DS,[RESSEG]
ASSUME  DS:RESGROUP
        CMP     [PIPEFLAG],0
        JNZ     NOREDIR                 ; Don't muck up the pipe
        CALL    TESTDOREIN
        CALL    TESTDOREOUT
NOREDIR:
        POP     CX
        POP     BX
        POP     AX
        POP     DX
        POP     DS
ASSUME  DS:NOTHING
        return

TESTDOREIN:
ASSUME  DS:RESGROUP
        CMP     [RE_INSTR],0
        retz
        MOV     DX,OFFSET RESGROUP:RE_INSTR
        MOV     AX,(OPEN SHL 8)
        INT     int_command
        MOV     DX,OFFSET TRANGROUP:NOTFND
        JC      REDIRERR
        MOV     BX,AX
        MOV     AL,0FFH
        XCHG    AL,[BX.PDB_JFN_Table]
        MOV     DS:[PDB_JFN_Table],AL
        return

REDIRERR:
        PUSH    CS
        POP     DS
        JMP     CERROR

TESTDOREOUT:
ASSUME  DS:RESGROUP
        CMP     [RE_OUTSTR],0
        JZ      NOREOUT
        CMP     [RE_OUT_APP],0
        JZ      REOUTCRT
        MOV     DX,OFFSET RESGROUP:RE_OUTSTR
        MOV     AX,(OPEN SHL 8) OR 1
        INT     int_command
        JC      REOUTCRT
        XOR     DX,DX
        XOR     CX,CX
        MOV     BX,AX
        MOV     AX,(LSEEK SHL 8) OR 2
        INT     int_command
        JMP     SHORT SET_REOUT
REOUTCRT:
        MOV     DX,OFFSET RESGROUP:RE_OUTSTR
        XOR     CX,CX
        MOV     AH,CREAT
        INT     int_command
        MOV     DX,OFFSET TRANGROUP:FULDIR
        JC      REDIRERR
        MOV     BX,AX
SET_REOUT:
        MOV     AL,0FFH
        XCHG    AL,[BX.PDB_JFN_Table]
        MOV     DS:[PDB_JFN_Table+1],AL
NOREOUT:
        return

STRCOMP:
; Compare ASCIZ DS:SI with ES:DI.
; SI,DI destroyed.
        CMPSB
        retnz                           ; Strings not equal
        cmp     byte ptr [SI-1],0       ; Hit NUL terminator?
        retz                            ; Yes, strings equal
        jmp     short STRCOMP           ; Equal so far, keep going



TRANCODE        ENDS
        END