-
Notifications
You must be signed in to change notification settings - Fork 136
Expand file tree
/
Copy pathASM.PRN
More file actions
3754 lines (3752 loc) · 170 KB
/
ASM.PRN
File metadata and controls
3754 lines (3752 loc) · 170 KB
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
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
0000 0001 ; Seattle Computer Products 8086 Assembler version 2.31
0000 0002 ; by Tim Paterson
0000 0003 ; Runs on the 8086 under 86-DOS
0000 0004
0000 0005 ;* * * * * * REVISION HISTORY * * * * * *
0000 0006 ;
0000 0007 ; 12/29/80 2.01 General release with 86-DOS version 0.34
0000 0008 ; 02/22/81 2.10 Increased buffer size from 128 bytes to 1024 bytes
0000 0009 ; 03/18/81 2.11 General cleanup and more documentation
0000 0010 ; 03/24/81 2.20 Modify ESC handling for full 8087 operation
0000 0011 ; 04/01/81 2.21 Fix date in HEX and PRN files; modify buffer handling
0000 0012 ; 04/03/81 2.22 Fix 2.21 buffer handling
0000 0013 ; 04/13/81 2.23 Re-open source file for listing to allow assembling CON:
0000 0014 ; 04/28/81 2.24 Allow nested IFs
0000 0015 ; 07/30/81 2.25 Add Intel string mnemonics; clean up a little
0000 0016 ; 08/02/81 2.30 Re-write pass 2:
0000 0017 ; Always report errors to console
0000 0018 ; Exact byte lengths for HEX and PRN files
0000 0019 ; 08/23/81 2.40 Add 8087 mnemonics
0000 0020 ;
0000 0021 ;* * * * * * * * * * * * * * * * * * * * *
0000 0022
0000 0023 SYMWID: EQU 10
0000 0024 FCB: EQU 5CH
0000 0025 BUFSIZ: EQU 1024 ;Source code buffer
0000 0026 LSTBUFSIZ:EQU BUFSIZ ;List file buffer
0000 0027 HEXBUFSIZ:EQU 70 ;Hex file buffer (26*2 + 5*2 + 3 + EXTRA)
0000 0028 EOL: EQU 13 ;ASCII carriage return
0000 0029 OBJECT: EQU 100H ;DEFAULT "PUT" ADDRESS
0000 0030
0000 0031 ;System call function codes
0000 0032 PRINTMES: EQU 9
0000 0033 OPEN: EQU 15
0000 0034 CLOSE: EQU 16
0000 0035 READ: EQU 20
0000 0036 SETDMA: EQU 26
0000 0037 MAKE: EQU 22
0000 0038 BLKWRT: EQU 40
0000 0039
0000 0040 ;The following equates define some token values returned by GETSYM
0000 0041 UNDEFID:EQU 0 ;Undefined identifier (including no nearby RET)
0000 0042 CONST: EQU 1 ;Constant (including $)
0000 0043 REG: EQU 2 ;8-bit register
0000 0044 XREG: EQU 3 ;16-bit register (except segment registers)
0000 0045 SREG: EQU 4 ;Segment register
0000 0046
0000 0047 ;Ouput file record definition
0000 0048 ORG 0
0000 0049 WRTPT: DS 2 ;Pointer to next byte to be written
0002 0050 BUFEND: DS 2 ;Pointer to end of buffer plus one
0004 0051 BUFSTRT:DS 2 ;Address of start of buffer
0006 0052 BUFFCB: DS 37 ;FCB for the file
002B 0053
002B 0054 ORG 100H
0100 0055 PUT 100H
0100 0056
0100 EB 75 0057 JP BEGIN
0102 0058
0102 0D 0A 53 65 61 74 74 0059 HEADER: DB 13,10,'Seattle Computer Products 8086 Assembler Version 2.31'
6C 65 20 43 6F 6D 70
75 74 65 72 20 50 72
6F 64 75 63 74 73 20
38 30 38 36 20 41 73
73 65 6D 62 6C 65 72
20 56 65 72 73 69 6F
6E 20 32 2E 33 31
0139 0D 0A 43 6F 70 79 72 0060 DB 13,10,'Copyright 1979,80,81 by Seattle Computer Products, Inc.'
69 67 68 74 20 31 39
37 39 2C 38 30 2C 38
31 20 62 79 20 53 65
61 74 74 6C 65 20 43
6F 6D 70 75 74 65 72
20 50 72 6F 64 75 63
74 73 2C 20 49 6E 63
2E
0172 0D 0A 0D 0A 24 0061 DB 13,10,13,10,'$'
0177 0062
0177 0063 BEGIN:
0177 BC 90 24 0064 MOV SP,STACK
017A BA 02 01 0065 MOV DX,HEADER
017D B4 09 0066 MOV AH,PRINTMES
017F CD 21 0067 INT 33
0181 A0 6D 00 0068 MOV AL,[FCB+17]
0184 A2 D0 1B 0069 MOV [SYMFLG],AL ;Save symbol table request flag
0187 BE 65 00 0070 MOV SI,FCB+9 ;Point to file extension
018A AC 0071 LODB ;Get source drive letter
018B E8 10 01 0072 CALL CHKDSK ;Valid drive?
018E 0A C0 0073 OR AL,AL
0190 74 03 0074 JZ DEFAULT ;If no extension, use existing drive spec
0192 A2 5C 00 0075 MOV [FCB],AL
0195 0076 DEFAULT:
0195 AC 0077 LODB ;Get HEX file drive letter
0196 3C 5A 0078 CMP AL,'Z' ;Suppress HEX file?
0198 74 03 0079 JZ L0000
019A E8 01 01 0080 CALL CHKDSK
019D 0081 L0000:
019D A2 1B 1B 0082 MOV [HEXFCB],AL
01A0 AC 0083 LODB ;Get PRN file drive letter
01A1 B4 00 0084 MOV AH,0 ;Signal no PRN file
01A3 3C 5A 0085 CMP AL,'Z' ;Suppress PRN file?
01A5 74 15 0086 JZ NOPRN
01A7 3C 59 0087 CMP AL,'Y' ;Print errors only on console?
01A9 74 11 0088 JZ NOPRN
01AB B4 02 0089 MOV AH,2
01AD 3C 58 0090 CMP AL,'X' ;PRN file to console?
01AF 74 0B 0091 JZ NOPRN
01B1 B4 04 0092 MOV AH,4
01B3 3C 50 0093 CMP AL,'P' ;PRN file to printer?
01B5 74 05 0094 JZ NOPRN
01B7 E8 E4 00 0095 CALL CHKDSK
01BA B4 80 0096 MOV AH,80H
01BC 0097 NOPRN:
01BC A2 40 1B 0098 MOV [LSTFCB],AL
01BF 88 26 EC 1B 0099 MOV [LSTDEV],AH ;Flag device for list ouput
01C3 BE 0A 1B 0100 MOV SI,EXTEND
01C6 BF 65 00 0101 MOV DI,FCB+9
01C9 A5 0102 MOVW
01CA A4 0103 MOVB ;Set extension to ASM
01CB A5 0104 MOVW ;Zero extent field
01CC BA 5C 00 0105 MOV DX,FCB
01CF B4 0F 0106 MOV AH,OPEN
01D1 CD 21 0107 INT 33
01D3 BB AF 1A 0108 MOV BX,NOFILE
01D6 0A C0 0109 OR AL,AL
01D8 74 03 0110 JZ $+5
01DA E9 97 00 0111 JMP PRERR
01DD BA 1B 1B 0112 MOV DX,HEXFCB
01E0 E8 99 00 0113 CALL MAKFIL
01E3 BA 40 1B 0114 MOV DX,LSTFCB
01E6 E8 93 00 0115 CALL MAKFIL
01E9 C6 06 7C 00 00 0116 MOV B,[FCB+32],0 ;Zero Next Record field
01EE C7 06 6A 00 00 04 0117 MOV [FCB+14],BUFSIZ ;Set record size
01F4 C7 06 3E 20 40 20 0118 MOV [BUFPT],SRCBUF ;Initialize buffer pointer
01FA C7 06 D1 1B 91 24 0119 MOV [CODE],START+1 ;POINTER TO NEXT BYTE OF INTERMEDIATE CODE
0200 C7 06 F2 1B 90 24 0120 MOV [IY],START ;POINTER TO CURRENT RELOCATION BYTE
0206 33 C0 0121 XOR AX,AX
0208 A3 65 1B 0122 MOV [PC],AX ;DEFAULT PROGRAM COUNTER
020B A3 CC 1B 0123 MOV [BASE],AX ;POINTER TO ROOT OF ID TREE=NIL
020E A3 EA 1B 0124 MOV [RETPT],AX ;Pointer to last RET record
0211 A2 E4 1B 0125 MOV [IFFLG],AL ;NOT WITHIN IF/ENDIF
0214 A2 E5 1B 0126 MOV [CHKLAB],AL ;LOOKUP ALL LABELS
0217 48 0127 DEC AX
0218 A3 E8 1B 0128 MOV [LSTRET],AX ;Location of last RET
021B A1 06 00 0129 MOV AX,[6] ;HL=END OF MEMORY
021E A3 CE 1B 0130 MOV [HEAP],AX ;BACK END OF SYMBOL TABLE SPACE
0221 C7 06 D5 1B 04 00 0131 MOV [BCOUNT],4 ;CODE BYTES PER RELOCATION BYTE
0227 0132
0227 0133 ;Assemble each line of code
0227 0134
0227 0135 LOOP:
0227 E8 8A 00 0136 CALL NEXTCHR ;Get first character on line
022A 3C 1A 0137 CMP AL,1AH
022C 74 1E 0138 JZ ENDJ
022E B0 FF 0139 MOV AL,-1 ;Flag that no tokens have been read yet
0230 A2 CB 1B 0140 MOV [SYM],AL
0233 E8 89 06 0141 CALL ASMLIN ;Assemble the line
0236 A0 CB 1B 0142 MOV AL,[SYM]
0239 3C FF 0143 CMP AL,-1 ;Any tokens found on line?
023B 75 03 0144 JNZ L0002
023D E8 67 03 0145 CALL GETSYM ;If no tokens read yet, read first one
0240 0146 L0002:
0240 3C 3B 0147 CMP AL,';'
0242 74 0B 0148 JZ ENDLN
0244 3C 0D 0149 CMP AL,EOL
0246 74 07 0150 JZ ENDLN
0248 B0 14 0151 MOV AL,14H ;Garbage at end of line error
024A EB 05 0152 JP ENDLIN
024C E9 B9 0D 0153 ENDJ: JMP END
024F 0154
024F 0155 ENDLN:
024F 32 C0 0156 XOR AL,AL ;Flag no errors on line
0251 0157 ENDLIN:
0251 0158 ;AL = error code for line. Stack depth unknown
0251 BC 90 24 0159 MOV SP,STACK
0254 E8 02 00 0160 CALL NEXLIN
0257 EB CE 0161 JP LOOP
0259 0162
0259 0163 NEXLIN:
0259 B5 C0 0164 MOV CH,0C0H ;Put end of line marker and error code (AL)
025B E8 00 08 0165 CALL PUTCD
025E E8 C7 07 0166 CALL GEN1
0261 A0 CA 1B 0167 MOV AL,[CHR]
0264 0168 GETEOL:
0264 3C 0A 0169 CMP AL,10
0266 74 35 0170 JZ RET
0268 3C 1A 0171 CMP AL,1AH
026A 74 E0 0172 JZ ENDJ
026C E8 45 00 0173 CALL NEXTCHR ;Scan over comments for linefeed
026F EB F3 0174 JP GETEOL
0271 0175
0271 0176 ABORT:
0271 BB 97 1A 0177 MOV BX,NOMEM
0274 0178 PRERR:
0274 8B D3 0179 MOV DX,BX
0276 B4 09 0180 MOV AH,PRINTMES
0278 CD 21 0181 INT 33
027A CD 20 0182 INT 32
027C 0183
027C 0184 MAKFIL:
027C 8B F2 0185 MOV SI,DX
027E AC 0186 LODB ;Get drive select byte
027F 3C 20 0187 CMP AL,20H ;If not valid, don't make file
0281 73 1A 0188 JNC RET
0283 B9 04 00 0189 MOV CX,4
0286 8B FE 0190 MOV DI,SI
0288 BE 5D 00 0191 MOV SI,FCB+1
028B F3 0192 REP
028C A5 0193 MOVW ;Copy source file name
028D B4 16 0194 MOV AH,MAKE
028F CD 21 0195 INT 33
0291 C7 45 05 01 00 0196 MOV [DI-9+14],1 ;Set record length to 1 byte
0296 BB 7D 1A 0197 MOV BX,NOSPAC
0299 0A C0 0198 OR AL,AL ;Success?
029B 75 D7 0199 JNZ PRERR
029D C3 0200 RET
029E 0201
029E 0202 CHKDSK:
029E 2C 20 0203 SUB AL,' ' ;If not present, set zero flag
02A0 74 FB 0204 JZ RET
02A2 2C 20 0205 SUB AL,20H
02A4 74 04 0206 JZ DSKERR ;Must be in range A-O
02A6 3C 10 0207 CMP AL,'P'-'@'
02A8 72 F3 0208 JC RET
02AA 0209 DSKERR:
02AA BB D0 1A 0210 MOV BX,BADDSK
02AD EB C5 0211 JP PRERR
02AF 0212
02AF 0213 ERROR:
02AF 8A C1 0214 MOV AL,CL
02B1 E9 9D FF 0215 JMP ENDLIN
02B4 0216
02B4 0217 NEXTCHR:
02B4 8B 36 3E 20 0218 MOV SI,[BUFPT]
02B8 81 FE 40 20 0219 CMP SI,SRCBUF
02BC 75 15 0220 JNZ GETCH
02BE 0221 ;Buffer empty so refill it
02BE 52 0222 PUSH DX
02BF 8B D6 0223 MOV DX,SI
02C1 B4 1A 0224 MOV AH,SETDMA
02C3 CD 21 0225 INT 33
02C5 BA 5C 00 0226 MOV DX,FCB
02C8 B4 14 0227 MOV AH,READ
02CA CD 21 0228 INT 33
02CC 5A 0229 POP DX
02CD 3C 01 0230 CMP AL,1
02CF B0 1A 0231 MOV AL,1AH ;Possibly signal End of File
02D1 74 0A 0232 JZ NOMOD ;If nothing read
02D3 0233 GETCH:
02D3 AC 0234 LODB
02D4 81 FE 40 24 0235 CMP SI,SRCBUF+BUFSIZ
02D8 75 03 0236 JNZ NOMOD
02DA BE 40 20 0237 MOV SI,SRCBUF
02DD 0238 NOMOD:
02DD 89 36 3E 20 0239 MOV [BUFPT],SI
02E1 A2 CA 1B 0240 MOV [CHR],AL
02E4 C3 0241 RET
02E5 0242
02E5 0243
02E5 0244 MROPS:
02E5 0245
02E5 0246 ; Get two operands and check for certain types, according to flag byte
02E5 0247 ; in CL. OP code in CH. Returns only if immediate operation.
02E5 0248
02E5 51 0249 PUSH CX ;Save type flags
02E6 E8 D8 00 0250 CALL GETOP
02E9 52 0251 PUSH DX ;Save first operand
02EA E8 CB 00 0252 CALL GETOP2
02ED 5B 0253 POP BX ;First op in BX, second op in DX
02EE B0 04 0254 MOV AL,SREG ;Check for a segment register
02F0 3A C7 0255 CMP AL,BH
02F2 74 41 0256 JZ SEGCHK
02F4 3A C6 0257 CMP AL,DH
02F6 74 3D 0258 JZ SEGCHK
02F8 B0 01 0259 MOV AL,CONST ;Check if the first operand is immediate
02FA B1 1A 0260 MOV CL,26
02FC 3A C7 0261 CMP AL,BH
02FE 74 AF 0262 JZ ERROR ;Error if so
0300 59 0263 POP CX ;Restore type flags
0301 3A C6 0264 CMP AL,DH ;If second operand is immediate, then done
0303 74 DF 0265 JZ RET
0305 B0 00 0266 MOV AL,UNDEFID ;Check for memory reference
0307 3A C7 0267 CMP AL,BH
0309 74 4F 0268 JZ STORE ;Is destination memory?
030B 3A C6 0269 CMP AL,DH
030D 74 55 0270 JZ LOAD ;Is source memory?
030F F6 C1 01 0271 TEST CL,1 ;Check if register-to-register operation OK
0312 B1 1B 0272 MOV CL,27
0314 74 99 0273 JZ ERROR
0316 8A C6 0274 MOV AL,DH
0318 3A C7 0275 CMP AL,BH ;Registers must be of same length
031A 0276 RR:
031A B1 16 0277 MOV CL,22
031C 75 91 0278 JNZ ERROR
031E 0279 RR1:
031E 24 01 0280 AND AL,1 ;Get register length (1=16 bits)
0320 0A C5 0281 OR AL,CH ;Or in to OP code
0322 E8 F6 06 0282 CALL PUT ;And write it
0325 59 0283 POP CX ;Dump return address
0326 8A C3 0284 MOV AL,BL
0328 02 C0 0285 ADD AL,AL ;Rotate register number into middle position
032A 02 C0 0286 ADD AL,AL
032C 02 C0 0287 ADD AL,AL
032E 0C C0 0288 OR AL,0C0H ;Set register-to-register mode
0330 0A C2 0289 OR AL,DL ;Combine with other register number
0332 E9 E6 06 0290 JMP PUT
0335 0291
0335 0292 SEGCHK:
0335 0293 ;Come here if at least one operand is a segment register
0335 59 0294 POP CX ;Restore flags
0336 F6 C1 08 0295 TEST CL,8 ;Check if segment register OK
0339 B1 16 0296 MOV CL,22
033B 74 78 0297 JZ ERR1
033D B9 03 8E 0298 MOV CX,8E03H ;Segment register move OP code
0340 B0 00 0299 MOV AL,UNDEFID
0342 3A C6 0300 CMP AL,DH ;Check if source is memory
0344 74 1E 0301 JZ LOAD
0346 3A C7 0302 CMP AL,BH ;Check if destination is memory
0348 74 10 0303 JZ STORE
034A B0 03 0304 MOV AL,XREG
034C 2A C6 0305 SUB AL,DH ;Check if source is 16-bit register
034E 74 CA 0306 JZ RR ;If so, AL must be zero
0350 B5 8C 0307 MOV CH,8CH ;Change direction
0352 87 DA 0308 XCHG DX,BX ;Flip which operand is first and second
0354 B0 03 0309 MOV AL,XREG
0356 2A C6 0310 SUB AL,DH ;Let RR perform finish the test
0358 EB C0 0311 JP RR
035A 0312
035A 0313 STORE:
035A F6 C1 04 0314 TEST CL,004H ;Check if storing is OK
035D 75 52 0315 JNZ STERR
035F 87 DA 0316 XCHG DX,BX ;If so, flip operands
0361 80 E5 FD 0317 AND CH,0FDH ; and zero direction bit
0364 0318 LOAD:
0364 B6 19 0319 MOV DH,25
0366 3A C7 0320 CMP AL,BH ;Check if memory-to-memory
0368 74 49 0321 JZ MRERR
036A 8A C7 0322 MOV AL,BH
036C 3C 02 0323 CMP AL,REG ;Check if 8-bit operation
036E 75 07 0324 JNZ XRG
0370 B6 16 0325 MOV DH,22
0372 F6 C1 01 0326 TEST CL,1 ;See if 8-bit operation is OK
0375 74 3C 0327 JZ MRERR
0377 0328 XRG:
0377 8A C2 0329 MOV AL,DL
0379 2C 06 0330 SUB AL,6 ;Check for R/M mode 6 and register 0
037B 0A C3 0331 OR AL,BL ; meaning direct load/store of accumulator
037D 75 19 0332 JNZ NOTAC
037F F6 C1 08 0333 TEST CL,8 ;See if direct load/store of accumulator
0382 74 14 0334 JZ NOTAC ; means anything in this case
0384 0335 ; Process direct load/store of accumulator
0384 8A C5 0336 MOV AL,CH
0386 24 02 0337 AND AL,2 ;Preserve direction bit only
0388 34 02 0338 XOR AL,2 ; but flip it
038A 0C A0 0339 OR AL,0A0H ;Combine with OP code
038C 8A E8 0340 MOV CH,AL
038E 8A C7 0341 MOV AL,BH ;Check byte/word operation
0390 24 01 0342 AND AL,1
0392 0A C5 0343 OR AL,CH
0394 59 0344 POP CX ;Dump return address
0395 E9 47 07 0345 JMP PUTADD ;Write the address
0398 0346
0398 0347 NOTAC:
0398 8A C7 0348 MOV AL,BH
039A 24 01 0349 AND AL,1 ;Get byte/word bit
039C 22 C1 0350 AND AL,CL ;But don't use it in word-only operations
039E 0A C5 0351 OR AL,CH ;Combine with OP code
03A0 E8 78 06 0352 CALL PUT
03A3 8A C3 0353 MOV AL,BL
03A5 02 C0 0354 ADD AL,AL ;Rotate to middle position
03A7 02 C0 0355 ADD AL,AL
03A9 02 C0 0356 ADD AL,AL
03AB 0A C2 0357 OR AL,DL ;Combine register field
03AD 59 0358 POP CX ;Dump return address
03AE E9 2E 07 0359 JMP PUTADD ;Write the address
03B1 0360
03B1 0361 STERR:
03B1 B6 1D 0362 MOV DH,29
03B3 0363 MRERR:
03B3 8A CE 0364 MOV CL,DH
03B5 0365
03B5 E9 F7 FE 0366 ERR1: JMP ERROR
03B8 0367
03B8 0368 GETOP2:
03B8 0369 ;Get the second operand: look for a comma and drop into GETOP
03B8 A0 CB 1B 0370 MOV AL,[SYM]
03BB 3C 2C 0371 CMP AL,','
03BD B1 15 0372 MOV CL,21
03BF 75 F4 0373 JNZ ERR1
03C1 0374
03C1 0375
03C1 0376 GETOP:
03C1 0377
03C1 0378 ; Get one operand. Operand may be a memory reference in brackets, a register,
03C1 0379 ; or a constant. If a flag (such as "B" for byte operation) is encountered,
03C1 0380 ; it is noted and processing continues to find the operand.
03C1 0381 ;
03C1 0382 ; On exit, AL (=DH) has the type of operand. Other information depends
03C1 0383 ; on the actual operand:
03C1 0384 ;
03C1 0385 ; AL=DH=0 Memory Reference. DL has the address mode properly prepared in
03C1 0386 ; the 8086 R/M format (middle bits zero). The constant part of the address
03C1 0387 ; is in ADDR. If an undefined label needs to be added to this, a pointer to
03C1 0388 ; its information fields is in ALABEL, otherwise ALABEL is zero.
03C1 0389 ;
03C1 0390 ; AL=DH=1 Value. The constant part is in DATA. If an undefined label needs
03C1 0391 ; to be added to this, a pointer to its information fields is in DLABEL,
03C1 0392 ; otherwise DLABEL is zero. "$" and "RET" are in this class.
03C1 0393 ;
03C1 0394 ; AL=DH=2 8-bit Register. DL has the register number.
03C1 0395 ;
03C1 0396 ; AL=DH=3 16-bit Register. DL has the register number.
03C1 0397 ;
03C1 0398 ; AL=DH=4 Segment Register. DL has the register number.
03C1 0399
03C1 E8 E3 01 0400 CALL GETSYM
03C4 0401 GETOP1:
03C4 0402 ;Enter here if we don't need a GETSYM first
03C4 3C 5B 0403 CMP AL,'[' ;Memory reference?
03C6 74 30 0404 JZ MEM
03C8 3C 05 0405 CMP AL,5 ;Flag ("B", "W", etc.)?
03CA 74 57 0406 JZ FLG
03CC 3C 02 0407 CMP AL,REG ;8-Bit register?
03CE 74 20 0408 JZ NREG
03D0 3C 03 0409 CMP AL,XREG ;16-Bit register?
03D2 74 1C 0410 JZ NREG
03D4 3C 04 0411 CMP AL,SREG ;Segment register?
03D6 74 18 0412 JZ NREG
03D8 0413 VAL: ;Must be immediate
03D8 32 C0 0414 XOR AL,AL ;No addressing modes allowed
03DA 0415 VAL1:
03DA E8 4F 00 0416 CALL GETVAL
03DD A1 75 1B 0417 MOV AX,[CON] ;Defined part
03E0 A3 71 1B 0418 MOV [DATA],AX
03E3 A1 77 1B 0419 MOV AX,[UNDEF] ;Undefined part
03E6 A3 73 1B 0420 MOV [DLABEL],AX
03E9 8A D5 0421 MOV DL,CH
03EB B6 01 0422 MOV DH,CONST
03ED 8A C6 0423 MOV AL,DH
03EF C3 0424 RET
03F0 0425 NREG:
03F0 52 0426 PUSH DX
03F1 E8 B3 01 0427 CALL GETSYM
03F4 5A 0428 POP DX
03F5 8A C6 0429 MOV AL,DH
03F7 C3 0430 RET
03F8 0431 MEM:
03F8 E8 AC 01 0432 CALL GETSYM
03FB B0 01 0433 MOV AL,1
03FD E8 2C 00 0434 CALL GETVAL
0400 A0 CB 1B 0435 MOV AL,[SYM]
0403 3C 5D 0436 CMP AL,']'
0405 B1 18 0437 MOV CL,24
0407 75 AC 0438 JNZ ERR1
0409 E8 9B 01 0439 CALL GETSYM
040C 8B 1E 75 1B 0440 MOV BX,[CON]
0410 89 1E 6D 1B 0441 MOV [ADDR],BX
0414 8B 1E 77 1B 0442 MOV BX,[UNDEF]
0418 89 1E 6F 1B 0443 MOV [ALABEL],BX
041C 8A D5 0444 MOV DL,CH
041E B6 00 0445 MOV DH,UNDEFID
0420 8A C6 0446 MOV AL,DH
0422 C3 0447 RET
0423 0448 FLG:
0423 E8 81 01 0449 CALL GETSYM
0426 3C 2C 0450 CMP AL,','
0428 74 97 0451 JZ GETOP
042A EB 98 0452 JP GETOP1
042C 0453
042C 0454
042C 0455 GETVAL:
042C 0456
042C 0457 ; Expression analyzer. On entry, if AL=0 then do not allow base or index
042C 0458 ; registers. If AL=1, we are analyzing a memory reference, so allow base
042C 0459 ; and index registers, and compute addressing mode when done. The constant
042C 0460 ; part of the expression will be found in CON. If an undefined label is to
042C 0461 ; be added to this, a pointer to its information fields will be found in
042C 0462 ; UNDEF.
042C 0463
042C 95 0464 XCHG AX,BP ;Flag is kept in BP
042D 53 0465 PUSH BX
042E BB 00 00 0466 MOV BX,0
0431 89 1E 75 1B 0467 MOV [CON],BX
0435 89 1E 77 1B 0468 MOV [UNDEF],BX
0439 5B 0469 POP BX
043A A0 CB 1B 0470 MOV AL,[SYM]
043D 3C 2B 0471 CMP AL,'+'
043F 74 09 0472 JZ PLSMNS
0441 3C 2D 0473 CMP AL,'-'
0443 74 05 0474 JZ PLSMNS
0445 B1 2B 0475 MOV CL,'+'
0447 51 0476 PUSH CX
0448 EB 08 0477 JP OPERATE
044A 0478 PLSMNS:
044A 50 0479 PUSH AX
044B 81 CD 04 00 0480 OR BP,4 ;Flag that a sign was found
044F E8 55 01 0481 CALL GETSYM
0452 0482 OPERATE:
0452 3C 01 0483 CMP AL,CONST
0454 75 03 0484 JNZ $+5
0456 E9 C3 00 0485 JMP CVAL
0459 3C 00 0486 CMP AL,UNDEFID
045B 75 03 0487 JNZ $+5
045D E9 CA 00 0488 JMP UVAL
0460 3C 22 0489 CMP AL,'"'
0462 75 03 0490 JNZ $+5
0464 E9 DE 00 0491 STRINGJ:JMP STRING
0467 3C 27 0492 CMP AL,"'"
0469 74 F9 0493 JZ STRINGJ
046B 3C 03 0494 CMP AL,XREG ;Only 16-bit register may index
046D B1 14 0495 MOV CL,20
046F 75 20 0496 JNZ ERR2
0471 F7 C5 01 00 0497 TEST BP,1 ;Check to see if indexing is OK
0475 B1 01 0498 MOV CL,1
0477 74 18 0499 JZ ERR2
0479 8A C2 0500 MOV AL,DL
047B B1 03 0501 MOV CL,3
047D 3C 03 0502 CMP AL,3 ;Check for BX
047F 74 25 0503 JZ BXJ
0481 2C 05 0504 SUB AL,5 ;Check for BP
0483 74 2A 0505 JZ BPJ
0485 FE C8 0506 DEC AL ;Check for SI
0487 B1 04 0507 MOV CL,4
0489 74 12 0508 JZ SIJ
048B FE C8 0509 DEC AL ;Check for DI
048D 74 05 0510 JZ DIJ
048F B1 02 0511 MOV CL,2 ;Invalid base/index register
0491 E9 1B FE 0512 ERR2: JMP ERROR
0494 0513 DIJ:
0494 95 0514 XCHG AX,BP
0495 A8 10 0515 TEST AL,10H ;Check if already seen index register
0497 75 F8 0516 JNZ ERR2
0499 0C 30 0517 OR AL,30H ;Flag seeing index register DI
049B EB 19 0518 JP LPCHK
049D 0519 SIJ:
049D 95 0520 XCHG AX,BP
049E A8 10 0521 TEST AL,010H ;Check if already seen index register
04A0 75 EF 0522 JNZ ERR2
04A2 0C 10 0523 OR AL,010H ;Flag seeing index register SI
04A4 EB 10 0524 JP LPCHK
04A6 0525 BXJ:
04A6 95 0526 XCHG AX,BP
04A7 A8 80 0527 TEST AL,080H ;Check if already seen base register
04A9 75 E6 0528 JNZ ERR2
04AB 0C 80 0529 OR AL,080H ;Flag seeing base register BX
04AD EB 07 0530 JP LPCHK
04AF 0531 BPJ:
04AF 95 0532 XCHG AX,BP
04B0 A8 80 0533 TEST AL,080H ;Check if already seen base register
04B2 75 DD 0534 JNZ ERR2
04B4 0C C0 0535 OR AL,0C0H ;Flag seeing base register BP
04B6 0536 LPCHK:
04B6 95 0537 XCHG AX,BP
04B7 58 0538 POP AX ;Get operator
04B8 3C 2D 0539 CMP AL,'-' ;Can't subtract a register
04BA B1 05 0540 MOV CL,5
04BC 74 D3 0541 JZ ERR2
04BE 0542 NEXTER:
04BE E8 E6 00 0543 CALL GETSYM
04C1 3C 2B 0544 CMP AL,'+'
04C3 75 03 0545 JNZ $+5
04C5 E9 82 FF 0546 PJ: JMP PLSMNS
04C8 3C 2D 0547 CMP AL,'-'
04CA 74 F9 0548 JZ PJ
04CC 95 0549 XCHG AX,BP
04CD B5 00 0550 MOV CH,0
04CF A8 10 0551 TEST AL,010H ;Test INDEX bit
04D1 D0 D0 0552 RCL AL ;BASE bit (zero flag not affected)
04D3 74 3B 0553 JZ NOIND ;Jump if not indexed, with BASE bit in carry
04D5 F5 0554 CMC
04D6 D0 D5 0555 RCL CH
04D8 D0 D0 0556 RCL AL ;BP bit
04DA D0 D5 0557 RCL CH
04DC D0 D0 0558 RCL AL ;DI bit
04DE D0 D5 0559 RCL CH ;The low 3 bits now have indexing mode
04E0 0560 MODE:
04E0 80 CD 80 0561 OR CH,080H ;If undefined label, force 16-bit displacement
04E3 F7 06 77 1B FF FF 0562 TEST [UNDEF],-1
04E9 75 1E 0563 JNZ RET
04EB 8B 1E 75 1B 0564 MOV BX,[CON]
04EF E8 18 00 0565 CALL SIGNEXT ;Check if 8-bit with sign extended
04F2 75 15 0566 JNZ RET ;If not, use 16-bit displacement
04F4 80 E5 7F 0567 AND CH,07FH ;Reset 16-bit displacement
04F7 80 CD 40 0568 OR CH,040H ;Set 8-bit displacement
04FA 0B DB 0569 OR BX,BX
04FC 75 0B 0570 JNZ RET ;Use it if not zero displacement
04FE 80 E5 07 0571 AND CH,7 ;Specify no displacement
0501 82 FD 06 0572 CMP CH,6 ;Check for BP+0 addressing mode
0504 75 03 0573 JNZ RET
0506 80 CD 40 0574 OR CH,040H ;If BP+0, use 8-bit displacement
0509 C3 0575 RET
050A 0576
050A 0577 SIGNEXT:
050A 0578 ; Return with zero flag set if value in BX is a valid sign-extended
050A 0579 ; 8-bit value. AX destroyed
050A 8A C3 0580 MOV AL,BL
050C 98 0581 CBW
050D 3B C3 0582 CMP AX,BX
050F C3 0583 RET
0510 0584
0510 0585 NOIND:
0510 B5 06 0586 MOV CH,6 ;Try direct address mode
0512 73 FB 0587 JNC RET ;If no base register, that's right
0514 D0 D0 0588 RCL AL ;Check BP bit
0516 72 C8 0589 JC MODE
0518 FE C5 0590 INC CH ;If not, must be BX
051A EB C4 0591 JP MODE
051C 0592
051C 0593 CVAL:
051C 58 0594 POP AX
051D 3C 2D 0595 CMP AL,'-'
051F 75 02 0596 JNZ ADDCON
0521 F7 DA 0597 NEG DX
0523 0598 ADDCON:
0523 01 16 75 1B 0599 ADD [CON],DX
0527 E9 94 FF 0600 JMP NEXTER
052A 0601
052A 0602 UVAL:
052A 95 0603 XCHG AX,BP
052B B1 06 0604 MOV CL,6
052D A8 08 0605 TEST AL,008H ;Check if undefined label has been seen
052F 75 11 0606 JNZ ERR30
0531 0C 08 0607 OR AL,008H ;Flag seeing undefined label
0533 95 0608 XCHG AX,BP
0534 89 1E 77 1B 0609 MOV [UNDEF],BX
0538 58 0610 POP AX
0539 3C 2B 0611 CMP AL,'+' ;Undefined label may only be added
053B B1 05 0612 MOV CL,5
053D 75 03 0613 JNZ ERR30
053F E9 7C FF 0614 JMP NEXTER
0542 0615
0542 E9 6A FD 0616 ERR30: JMP ERROR
0545 0617
0545 0618 STRING:
0545 8A E8 0619 MOV CH,AL
0547 A0 CA 1B 0620 MOV AL,[CHR]
054A 3A C5 0621 CMP AL,CH
054C B1 23 0622 MOV CL,35
054E 8A D0 0623 MOV DL,AL
0550 B6 00 0624 MOV DH,0
0552 75 03 0625 JNZ L0003
0554 E8 36 00 0626 CALL ZERLEN
0557 0627 L0003:
0557 E8 3B 00 0628 CALL GETCHR
055A 9F 0629 LAHF
055B 95 0630 XCHG AX,BP
055C 9E 0631 SAHF
055D B1 25 0632 MOV CL,37
055F A8 02 0633 TEST AL,002H
0561 74 DF 0634 JZ ERR30
0563 A8 04 0635 TEST AL,004H
0565 B1 26 0636 MOV CL,38
0567 75 D9 0637 JNZ ERR30
0569 9F 0638 LAHF
056A 95 0639 XCHG AX,BP
056B 9E 0640 SAHF
056C 0641 STRGDAT:
056C 8A C2 0642 MOV AL,DL
056E 3C 0D 0643 CMP AL,EOL
0570 B1 27 0644 MOV CL,39
0572 74 CE 0645 JZ ERR30
0574 E8 A4 04 0646 CALL PUT
0577 A0 D3 1B 0647 MOV AL,[DATSIZ]
057A 0A C0 0648 OR AL,AL
057C 75 05 0649 JNZ BYTSIZ
057E 8A C6 0650 MOV AL,DH
0580 E8 98 04 0651 CALL PUT
0583 0652 BYTSIZ:
0583 A0 CA 1B 0653 MOV AL,[CHR]
0586 8A D0 0654 MOV DL,AL
0588 E8 0A 00 0655 CALL GETCHR
058B EB DF 0656 JP STRGDAT
058D 0657 ZERLEN:
058D E8 24 FD 0658 CALL NEXTCHR
0590 3A C5 0659 CMP AL,CH
0592 75 AE 0660 JNZ ERR30
0594 C3 0661 RET
0595 0662 GETCHR:
0595 E8 1C FD 0663 CALL NEXTCHR
0598 3A C5 0664 CMP AL,CH
059A 75 F8 0665 JNZ RET
059C E8 15 FD 0666 CALL NEXTCHR
059F 3A C5 0667 CMP AL,CH
05A1 74 F1 0668 JZ RET
05A3 5B 0669 POP BX
05A4 E9 75 FF 0670 JMP CVAL
05A7 0671
05A7 0672
05A7 0673 GETSYM:
05A7 0674
05A7 0675 ; The lexical scanner. Used only in the operand field. Returns with the token
05A7 0676 ; in SYM and AL, sometimes with additional info in BX or DX.
05A7 0677 ;
05A7 0678 ; AL=SYM=0 Undefined label. BX has pointer to information fields.
05A7 0679 ;
05A7 0680 ; AL=SYM=1 Constant (or defined label). DX has value.
05A7 0681 ;
05A7 0682 ; AL=SYM=2,3,4 8-bit register, 16-bit register, or segment register,
05A7 0683 ; respectively. DL has register number.
05A7 0684 ;
05A7 0685 ; AL=SYM=5 A mode flag (such as "B" for byte operation). Also stored in
05A7 0686 ; appropriate memory location--FLAG or LONG.
05A7 0687 ;
05A7 0688 ; All other values are the ASCII code of the character. Note that this may
05A7 0689 ; never be a letter or number.
05A7 0690
05A7 E8 20 00 0691 CALL GETSY
05AA A0 CB 1B 0692 MOV AL,[SYM]
05AD C3 0693 RET
05AE 0694
05AE 0695 SCANB:
05AE A0 CA 1B 0696 MOV AL,[CHR]
05B1 0697 SCANT:
05B1 3C 20 0698 CMP AL,' '
05B3 74 04 0699 JZ NEXB
05B5 3C 09 0700 CMP AL,9
05B7 75 F4 0701 JNZ RET
05B9 0702 NEXB:
05B9 E8 F8 FC 0703 CALL NEXTCHR
05BC EB F3 0704 JP SCANT
05BE 0705
05BE 0706 DOLLAR:
05BE 8B 16 67 1B 0707 MOV DX,[OLDPC]
05C2 B0 01 0708 MOV AL,CONST
05C4 A2 CB 1B 0709 MOV [SYM],AL
05C7 0710 NEXTCHJ:
05C7 E9 EA FC 0711 JMP NEXTCHR
05CA 0712
05CA 0713 GETSY:
05CA E8 E1 FF 0714 CALL SCANB
05CD 3C 24 0715 CMP AL,'$'
05CF 74 ED 0716 JZ DOLLAR
05D1 A2 CB 1B 0717 MOV [SYM],AL
05D4 0C 20 0718 OR AL,20H
05D6 3C 7B 0719 CMP AL,'z'+1
05D8 73 ED 0720 JNC NEXTCHJ
05DA 3C 61 0721 CMP AL,'a'
05DC 72 03 0722 JC $+5
05DE E9 BF 00 0723 JMP LETTER
05E1 3C 3A 0724 CMP AL,'9'+1
05E3 73 E2 0725 JNC NEXTCHJ
05E5 3C 30 0726 CMP AL,'0'
05E7 72 DE 0727 JC NEXTCHJ
05E9 BB CB 1B 0728 MOV BX,SYM
05EC C6 07 01 0729 MOV B,[BX],CONST
05EF E8 83 00 0730 CALL READID
05F2 4B 0731 DEC BX
05F3 8A 07 0732 MOV AL,[BX]
05F5 B1 07 0733 MOV CL,7
05F7 BB 00 00 0734 MOV BX,0
05FA 3C 68 0735 CMP AL,'h'
05FC 75 03 0736 JNZ $+5
05FE E9 32 00 0737 JMP HEX
0601 FE C1 0738 INC CL
0603 C7 06 F0 1B 7A 1B 0739 MOV [IX],ID
0609 0740 DEC:
0609 8B 36 F0 1B 0741 MOV SI,[IX]
060D 8A 04 0742 MOV AL,[SI]
060F FF 06 F0 1B 0743 INC [IX]
0613 3C 3A 0744 CMP AL,'9'+1
0615 72 03 0745 JC $+5
0617 E9 95 FC 0746 JMP ERROR
061A 2C 30 0747 SUB AL,'0'
061C 8B D3 0748 MOV DX,BX
061E D1 E3 0749 SHL BX
0620 D1 E3 0750 SHL BX
0622 03 DA 0751 ADD BX,DX
0624 D1 E3 0752 SHL BX
0626 8A D0 0753 MOV DL,AL
0628 B6 00 0754 MOV DH,0
062A 03 DA 0755 ADD BX,DX
062C FE CD 0756 DEC CH
062E 75 D9 0757 JNZ DEC
0630 87 DA 0758 XCHG DX,BX
0632 C3 0759 RET
0633 0760
0633 0761 HEX:
0633 BA 7A 1B 0762 MOV DX,ID
0636 FE CD 0763 DEC CH
0638 0764 HEX1:
0638 8B F2 0765 MOV SI,DX
063A AC 0766 LODB
063B 42 0767 INC DX
063C 2C 30 0768 SUB AL,'0'
063E 3C 0A 0769 CMP AL,10
0640 72 06 0770 JC GOTIT
0642 3C 37 0771 CMP AL,'g'-'0'
0644 73 13 0772 JNC ERR4
0646 2C 27 0773 SUB AL,'a'-10-'0'
0648 0774 GOTIT:
0648 D1 E3 0775 SHL BX
064A D1 E3 0776 SHL BX
064C D1 E3 0777 SHL BX
064E D1 E3 0778 SHL BX
0650 02 D8 0779 ADD BL,AL
0652 FE CD 0780 DEC CH
0654 75 E2 0781 JNZ HEX1
0656 87 DA 0782 XCHG DX,BX
0658 C3 0783 RET
0659 0784
0659 E9 53 FC 0785 ERR4: JMP ERROR
065C 0786
065C 0787 GETLET:
065C E8 4F FF 0788 CALL SCANB
065F 3C 0D 0789 CMP AL,EOL
0661 F9 0790 STC
0662 74 F4 0791 JZ RET
0664 3C 3B 0792 CMP AL,';'
0666 F9 0793 STC
0667 74 EF 0794 JZ RET
0669 B1 0A 0795 MOV CL,10
066B 0C 20 0796 OR AL,20H
066D 3C 61 0797 CMP AL,'a'
066F 72 E8 0798 JC ERR4
0671 3C 7B 0799 CMP AL,'z'+1
0673 73 E4 0800 JNC ERR4
0675 0801 READID:
0675 BB 7A 1B 0802 MOV BX,ID
0678 B5 00 0803 MOV CH,0
067A 0804 MOREID:
067A 88 07 0805 MOV [BX],AL
067C FE C5 0806 INC CH
067E 43 0807 INC BX
067F E8 32 FC 0808 CALL NEXTCHR
0682 3C 30 0809 CMP AL,'0'
0684 72 0E 0810 JC NOMORE
0686 0C 20 0811 OR AL,20H
0688 3C 7B 0812 CMP AL,'z'+1
068A 73 08 0813 JNC NOMORE
068C 3C 3A 0814 CMP AL,'9'+1
068E 72 EA 0815 JC MOREID
0690 3C 61 0816 CMP AL,'a'
0692 73 E6 0817 JNC MOREID
0694 0818 NOMORE:
0694 8A C8 0819 MOV CL,AL
0696 8A C5 0820 MOV AL,CH
0698 A2 79 1B 0821 MOV [LENID],AL
069B 0A C0 0822 OR AL,AL
069D 8A C1 0823 MOV AL,CL
069F C3 0824 RET
06A0 0825
06A0 0826 LETTER:
06A0 E8 D2 FF 0827 CALL READID
06A3 8A C5 0828 MOV AL,CH
06A5 FE C8 0829 DEC AL
06A7 75 1B 0830 JNZ NOFLG
06A9 A0 7A 1B 0831 MOV AL,[ID]
06AC 3C 6C 0832 CMP AL,'l'
06AE B1 00 0833 MOV CL,0
06B0 BA 6C 1B 0834 MOV DX,LONG
06B3 74 23 0835 JZ BWFLAG
06B5 3C 62 0836 CMP AL,'b'
06B7 BA 6B 1B 0837 MOV DX,FLAG
06BA 74 1C 0838 JZ BWFLAG
06BC 3C 77 0839 CMP AL,'w'
06BE B1 01 0840 MOV CL,1
06C0 74 16 0841 JZ BWFLAG
06C2 32 C0 0842 XOR AL,AL
06C4 0843 NOFLG:
06C4 FE C8 0844 DEC AL
06C6 53 0845 PUSH BX
06C7 75 03 0846 JNZ L0004
06C9 E8 1F 00 0847 CALL REGCHK
06CC 0848 L0004:
06CC 5B 0849 POP BX
06CD 8A C6 0850 MOV AL,DH
06CF 74 03 0851 JZ SYMSAV
06D1 E8 B6 00 0852 CALL LOOKRET
06D4 0853 SYMSAV:
06D4 A2 CB 1B 0854 MOV [SYM],AL
06D7 C3 0855 RET
06D8 0856
06D8 0857 BWFLAG:
06D8 87 DA 0858 XCHG DX,BX
06DA 8A 07 0859 MOV AL,[BX]
06DC FE C0 0860 INC AL
06DE 88 0F 0861 MOV [BX],CL
06E0 B1 20 0862 MOV CL,32
06E2 74 03 0863 JZ $+5
06E4 E9 C8 FB 0864 JMP ERROR
06E7 B0 05 0865 MOV AL,5
06E9 EB E9 0866 JP SYMSAV
06EB 0867
06EB 0868 REGCHK:
06EB BB 7A 1B 0869 MOV BX,ID
06EE 8A 0F 0870 MOV CL,[BX]
06F0 9F 0871 LAHF
06F1 43 0872 INC BX
06F2 9E 0873 SAHF
06F3 8A 07 0874 MOV AL,[BX]
06F5 BB 52 07 0875 MOV BX,REGTAB
06F8 B6 03 0876 MOV DH,XREG
06FA B2 00 0877 MOV DL,0
06FC 3C 78 0878 CMP AL,'x'
06FE 74 3B 0879 JZ SCANREG
0700 B6 02 0880 MOV DH,REG
0702 3C 6C 0881 CMP AL,'l'
0704 74 35 0882 JZ SCANREG
0706 B2 04 0883 MOV DL,4
0708 3C 68 0884 CMP AL,'h'
070A 74 2F 0885 JZ SCANREG
070C B6 04 0886 MOV DH,SREG
070E B2 00 0887 MOV DL,0
0710 BB 56 07 0888 MOV BX,SEGTAB
0713 3C 73 0889 CMP AL,'s'
0715 74 24 0890 JZ SCANREG
0717 B6 03 0891 MOV DH,XREG
0719 3C 70 0892 CMP AL,'p'
071B 74 11 0893 JZ PREG
071D 3C 69 0894 CMP AL,'i'
071F 75 B6 0895 JNZ RET
0721 B2 06 0896 MOV DL,6
0723 8A C1 0897 MOV AL,CL
0725 3C 73 0898 CMP AL,'s'
0727 74 AE 0899 JZ RET
0729 FE C2 0900 INC DL
072B 3C 64 0901 CMP AL,'d'
072D C3 0902 RET
072E 0903 PREG:
072E B2 04 0904 MOV DL,4
0730 8A C1 0905 MOV AL,CL
0732 3C 73 0906 CMP AL,'s'
0734 74 F7 0907 JZ RET
0736 FE C2 0908 INC DL
0738 3C 62 0909 CMP AL,'b'
073A C3 0910 RET
073B 0911 SCANREG:
073B 8A C1 0912 MOV AL,CL
073D B9 04 00 0913 MOV CX,4
0740 FC 0914 UP
0741 8B FB 0915 MOV DI,BX
0743 F2 0916 REPNZ
0744 AE 0917 SCAB
0745 8B DF 0918 MOV BX,DI
0747 75 F1 0919 JNZ RET
0749 8A C1 0920 MOV AL,CL
074B 02 C2 0921 ADD AL,DL
074D 8A D0 0922 MOV DL,AL
074F 32 C0 0923 XOR AL,AL
0751 C3 0924 RET
0752 0925
0752 62 64 63 61 0926 REGTAB: DB 'bdca'
0756 0927
0756 64 73 63 65 0928 SEGTAB: DB 'dsce'
075A 0929
075A 0930 LOOK:
075A 8A 2F 0931 MOV CH,[BX]
075C 43 0932 INC BX
075D BA 7A 1B 0933 MOV DX,ID
0760 E8 F4 00 0934 CALL CPSLP
0763 74 EC 0935 JZ RET
0765 34 80 0936 XOR AL,80H
0767 8A C8 0937 MOV CL,AL
0769 4B 0938 DEC BX
076A 8A 07 0939 MOV AL,[BX]
076C 34 80 0940 XOR AL,80H
076E 3A C1 0941 CMP AL,CL
0770 73 04 0942 JNC SMALL
0772 FE C5 0943 INC CH
0774 FE C5 0944 INC CH
0776 0945 SMALL:
0776 8A D5 0946 MOV DL,CH
0778 B6 00 0947 MOV DH,0
077A 03 DA 0948 ADD BX,DX
077C 8B 17 0949 MOV DX,[BX]
077E 43 0950 INC BX
077F 8A C2 0951 MOV AL,DL
0781 0A C6 0952 OR AL,DH
0783 F9 0953 STC
0784 74 CB 0954 JZ RET
0786 87 DA 0955 XCHG DX,BX
0788 EB D0 0956 JP LOOK
078A 0957
078A 0958 LOOKRET:
078A 8A C5 0959 MOV AL,CH
078C 3C 03 0960 CMP AL,3 ;RET has 3 letters
078E 75 4D 0961 JNZ LOOKUP
0790 4B 0962 DEC BX
0791 80 0F 80 0963 OR B,[BX],080H
0794 BA 1A 1B 0964 MOV DX,RETSTR+2
0797 0965 CHKRET:
0797 8B F2 0966 MOV SI,DX
0799 AC 0967 LODB
079A 3A 07 0968 CMP AL,[BX]
079C 75 43 0969 JNZ LOOKIT
079E 4B 0970 DEC BX
079F 4A 0971 DEC DX
07A0 FE CD 0972 DEC CH
07A2 75 F3 0973 JNZ CHKRET
07A4 8B 16 E8 1B 0974 MOV DX,[LSTRET]
07A8 8A C2 0975 MOV AL,DL
07AA 22 C6 0976 AND AL,DH
07AC FE C0 0977 INC AL
07AE 74 0D 0978 JZ ALLRET
07B0 8B 1E 65 1B 0979 MOV BX,[PC]
07B4 2B DA 0980 SUB BX,DX
07B6 E8 51 FD 0981 CALL SIGNEXT
07B9 B0 01 0982 MOV AL,1
07BB 74 94 0983 JZ RET
07BD 0984 ALLRET:
07BD 8B 1E EA 1B 0985 MOV BX,[RETPT]