]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/DEBUG/DEBASM.ASM
3 ; CODE FOR THE ASSEMBLE COMMAND IN THE DEBUGGER
6 %
OUT COMPONENT
=DEBUG
, MODULE
=DEBASM
16 CODE SEGMENT PUBLIC BYTE
19 CONST
SEGMENT PUBLIC BYTE
21 EXTRN DBMN
:BYTE,CSSAVE
:WORD,REG8
:BYTE,REG16
:BYTE,SIZ8
:BYTE
22 EXTRN SYNERR_PTR
:BYTE,OPTAB
:BYTE,MAXOP
:ABS
29 DATA SEGMENT PUBLIC BYTE
31 EXTRN HINUM
:WORD,LOWNUM
:WORD,ASSEM_CNT
:BYTE
32 EXTRN ASSEM1
:BYTE,ASSEM2
:BYTE,ASSEM3
:BYTE,ASSEM4
:BYTE,ASSEM5
:BYTE
33 EXTRN ASSEM6
:BYTE,OPBUF
:BYTE,OPCODE
:WORD,REGMEM
:BYTE,INDEX
:WORD
34 EXTRN ASMADD
:BYTE,ASMSP
:WORD,MOVFLG
:BYTE,SEGFLG
:BYTE,TSTFLG
:BYTE
35 EXTRN NUMFLG
:BYTE,DIRFLG
:BYTE,BYTEBUF
:BYTE,F8087
:BYTE,DIFLG
:BYTE
36 EXTRN SIFLG
:BYTE,BXFLG
:BYTE,BPFLG
:BYTE,NEGFLG
:BYTE,MEMFLG
:BYTE
37 EXTRN REGFLG
:BYTE,AWORD
:BYTE,MIDFLD
:BYTE,MODE
:BYTE
38 EXTRN ARG_BUF
:BYTE,HEX_PTR
:BYTE
42 DG GROUP
CODE,CONST
,CSTACK
,DATA
44 CODE SEGMENT PUBLIC BYTE
45 ASSUME
CS:DG
,DS:DG
,ES:DG
,SS:DG
48 PUBLIC DB_OPER
,DW_OPER
,ASSEMLOOP
,GROUP2
,AA_OPER
,DCINC_OPER
49 PUBLIC GROUP1
,ESC_OPER
,FGROUPP
,FGROUPX
,FDE_OPER
,FGROUPZ
50 PUBLIC FD9_OPER
,FGROUP
,FDB_OPER
,FGROUPB
,FGROUP3
,FGROUP3W
51 PUBLIC FGROUPDS
,INT_OPER
,IN_OPER
,DISP8_OPER
,JMP_OPER
,NO_OPER
52 PUBLIC OUT_OPER
,L_OPER
,MOV_OPER
,POP_OPER
,PUSH_OPER
,ROTOP
53 PUBLIC TST_OPER
,EX_OPER
,GET_DATA16
,CALL_OPER
, DOORG
55 EXTRN INBUF
:NEAR,SCANB
:NEAR,SCANP
:NEAR,GETHX
:NEAR,GET_ADDRESS
:NEAR
56 EXTRN DEFAULT
:NEAR,OUTDI
:NEAR,BLANK
:NEAR,TAB
:NEAR
57 EXTRN STD_PRINTF
:NEAR,PRINTF_CRLF
:NEAR
59 ; Line by line assembler
69 MOV BP,[CSSAVE
] ; Default code segment
70 MOV DI,OFFSET DG
:ASMADD
; Default address
72 MOV WORD PTR [ASMADD
],DX ; Displacement of disassembly
73 MOV WORD PTR [ASMADD
+2],AX ; Segment
74 MOV [ASMSP
],SP ; Save sp in case of error
77 MOV SP,[ASMSP
] ; Restore sp in case of error
78 LES DI,DWORD PTR ASMADD
; GET PC
79 CALL OUTDI
; OUTPUT ADDRESS
83 MOV DI,OFFSET DG
:ARG_BUF
84 ; No spacing is needed. The format string already has one.
85 ; CALL BLANK ; SKIP A SPACE
88 MOV DX,OFFSET DG
:HEX_PTR
91 CALL INBUF
; GET A BUFFER
94 RET ; if empty just return
96 ; At this point ds:si points to the opcode mnemonic...
98 XOR CX,CX ; OP-CODE COUNT = 0
106 INC CX ; INCREMENT OP-CODE COUNT
107 CMP CX,MAXOP
; CHECK FOR END OF LIST
111 INC DI ; SCAN FOR NEXT OP-CODE...
112 CMP BYTE PTR [DI-1],0
117 INC BX ; COMPARE NEXT CHAR
118 CMP BYTE PTR [DI+BX],0 ; ARE WE DONE?
119 JNZ OPLOOP
; ..IF NOT KEEP COMPARING
124 ADD AX,OFFSET DG
:OPTAB
127 ; CX = COUNT OF CHARS IN OPCODE
128 ; BX = POINTER INTO OPCODE TABLE
131 MOV BYTE PTR [AWORD
],AL
132 MOV WORD PTR [MOVFLG
],AX ; MOVFLG + TSTFLG
133 MOV BYTE PTR [SEGFLG
],AL ; ZERO SEGMENT REGISTER FLAG
134 MOV AH,00001010B ; SET UP FOR AA_OPER
136 MOV WORD PTR [ASSEM1
],AX
137 MOV BYTE PTR [ASSEM_CNT
],1
139 ADD SI,CX ; SI POINTS TO OPERAND
142 ; 8087 INSTRUCTIONS WITH NO OPERANDS
154 MOV WORD PTR [ASSEM1
],AX
156 ; AAD AND AAM INSTRUCIONS
159 INC BYTE PTR [ASSEM_CNT
]
161 ; INSTRUCTIONS WITH NO OPERANDS
184 INC BYTE PTR [MOVFLG
] ; ALLOW SEGMENT REGISTERS
185 MOV BYTE PTR [AWORD
],2 ; MUST BE 16 BITS
192 CMP BYTE PTR [MOVFLG
],2
196 CMP BYTE PTR [MIDFLD
],0
204 CMP BYTE PTR [MIDFLD
],0
208 MOV BYTE PTR [DI+1],AL
211 ; RET AND RETF INSTRUCTIONS
218 DEC BYTE PTR [ASSEM1
] ; CHANGE OP-CODE
219 ADD BYTE PTR [ASSEM_CNT
],2 ; UPDATE LENGTH
220 MOV WORD PTR [ASSEM2
],DX ; SAVE OFFSET
235 INC BYTE PTR [ASSEM1
]
243 CMP AX,'A'+4C00H
; "AL"
245 CMP AX,'A'+5800H
; "AX"
250 INC BYTE PTR [ASSEM1
]
253 CMP WORD PTR [SI],'D'+5800H
; "DX"
258 AND BYTE PTR [ASSEM1
],11110111B
266 CMP WORD PTR [SI],'D'+5800H
; "DX"
272 AND BYTE PTR [ASSEM1
],11110111B
276 INC BYTE PTR [ASSEM_CNT
]
277 MOV BYTE PTR [ASSEM2
],DL
281 CMP AX,'A'+4C00H
; "AL"
283 CMP AX,'A'+5800H
; "AX"
285 INC BYTE PTR [ASSEM1
]
292 INC BYTE PTR [TSTFLG
]
297 MOV BYTE PTR [ASSEM1
],11111111B
298 MOV BYTE PTR [MIDFLD
],AL
301 CMP BYTE PTR [MEMFLG
],0
303 CMP BYTE PTR [REGMEM
],-1
306 ; INDIRECT JUMPS OR CALLS
309 CMP BYTE PTR [AWORD
],1
312 CMP BYTE PTR [AWORD
],4
314 OR BYTE PTR [DI+2],1000B
317 ; DIRECT JUMPS OR CALLS
323 CMP BYTE PTR [NUMFLG
],0
326 ; BL = NUMBER OF BYTES IN JUMP
335 MOV AL,10011010B ; SET UP INTER SEGMENT CALL
336 CMP BYTE PTR [TSTFLG
],0
338 MOV AL,11101010B ; FIX UP FOR JUMP
340 MOV BYTE PTR [DI+1],AL
341 CMP BL,4 ; FAR SPECIFIED?
345 CMP DX,WORD PTR [ASMADD
+2] ; DIFFERENT SEGMENT?
350 MOV AL,11101000B ; SET UP FOR INTRASEGMENT
352 MOV BYTE PTR [DI+1],AL
355 SUB AX,WORD PTR [ASMADD
]
358 CMP BYTE PTR [TSTFLG
],0
368 MOV BYTE PTR [DI+1],11101011B
374 ; CONDITIONAL JUMPS AND LOOP INSTRUCTIONS
377 MOV BP,WORD PTR [ASMADD
+2] ; GET DEFAULT DISPLACEMENT
379 SUB DX,WORD PTR [ASMADD
]
387 MOV BYTE PTR [ASSEM2
],AL
391 ; LDS, LES, AND LEA INSTRUCTIONS
397 MOV DI,OFFSET DG
:REG16
399 JZ ERRV2
; CX = 0 MEANS NO REGISTER
403 MOV BYTE PTR [MIDFLD
],AL
406 CMP BYTE PTR [AWORD
],0
411 ; DEC AND INC INSTRUCTIONS
414 MOV BYTE PTR [ASSEM1
],11111110B
415 MOV BYTE PTR [MIDFLD
],AL
418 TEST BYTE PTR [DI+1],1
451 ; 8087 ARITHMETIC INSTUCTIONS
453 ; OPERANDS THAT ALLOW THE REVERSE BIT
459 CMP BYTE PTR [MODE
],11000000B
464 OR [DI+1],AL ; IF D=1...
465 XOR BYTE PTR [DI+2],00001000B ; ...REVERSE THE SENSE OF R
468 ; HERE WHEN INSTRUCTION COULD HAVE MEMORY OR REGISTER OPERAND
471 CALL SETMID
; THIS ENTRY POINT FOR 1 MEM OPER
472 MOV BYTE PTR [DIRFLG
],0
479 CMP BYTE PTR [MODE
],11000000B
489 ; THESE 8087 INSTRUCTIONS REQUIRE A MEMORY OPERAND
491 MOV AH,5 ; MUST BE TBYTE
494 MOV AH,2 ; MUST BE WORD
497 MOV AH,-1 ; SIZE CANNOT BE SPECIFIED
502 CMP BYTE PTR [MODE
],11000000B
508 ; THESE 8087 INSTRUCTIONS REQUIRE A REGISTER OPERAND
509 FGROUPP: ; 8087 POP OPERANDS
510 MOV BYTE PTR [AWORD
],-1
513 CMP BYTE PTR [DIRFLG
],0
518 FGROUPZ: ; ENTRY POINT WHERE ARG MUST BE MEM
520 MOV BYTE PTR [DIRFLG
],0
522 CMP BYTE PTR [MODE
],11000000B
528 ; NOT, NEG, MUL, IMUL, DIV, AND IDIV INSTRUCTIONS
531 MOV [ASSEM1
],11110110B
533 MOV BYTE PTR [MIDFLD
],AL
538 ; SHIFT AND ROTATE INSTRUCTIONS
541 MOV [ASSEM1
],11010000B
542 MOV BYTE PTR [MIDFLD
],AL
546 CMP BYTE PTR [SI],'1'
548 CMP WORD PTR [SI],"LC" ; CL
553 OR BYTE PTR [ASSEM1
],10B
560 INC BYTE PTR [TSTFLG
]
565 INC BYTE PTR [TSTFLG
]
571 INC BYTE PTR [MOVFLG
]
576 ; ADD, ADC, SUB, SBB, CMP, AND, OR, XOR instructions
579 MOV BYTE PTR [ASSEM1
],10000000B
581 MOV BYTE PTR [MIDFLD
],AL
586 CALL SCANP
; POINT TO NEXT OPERAND
587 MOV AL,BYTE PTR [ASSEM_CNT
]
593 MOV BL,BYTE PTR [AWORD
]
598 OR BYTE PTR [DI+1],BL
600 CMP BYTE PTR [MEMFLG
],0
602 CMP BYTE PTR [NUMFLG
],0 ; TEST FOR IMMEDIATE DATA
604 CMP BYTE PTR [SEGFLG
],0
606 CMP BYTE PTR [TSTFLG
],2 ; XCHG?
613 ; SECOND OPERAND WAS IMMEDIATE
616 MOV AL,BYTE PTR [DI+2]
617 CMP BYTE PTR [MOVFLG
],0
621 JNZ GRP23
; not to a register
622 ; MOVE IMMEDIATE TO REGISTER
623 MOV AL,BYTE PTR [DI+1]
629 OR AL,BYTE PTR [DI+2] ; SET REGISTER
632 MOV BYTE PTR [DI+1],AL
633 MOV AX,WORD PTR [LOWNUM
]
634 MOV WORD PTR [DI+2],AX
644 JZ IMMACC
; IMMEDIATE TO ACC
646 CMP BYTE PTR [TSTFLG
],0
648 CMP BYTE PTR [MIDFLD
],1*8 ; OR?
650 CMP BYTE PTR [MIDFLD
],4*8 ; AND?
652 CMP BYTE PTR [MIDFLD
],6*8 ; XOR?
654 TEST BYTE PTR [DI+1],1 ; TEST IF BYTE OPCODE
661 JNZ GRP23
; SMALL ENOUGH?
665 OR BYTE PTR [DI+1],10B
669 MOV AL,BYTE PTR [DI+1]
671 CMP BYTE PTR [TSTFLG
],0
676 OR AL,BYTE PTR [MIDFLD
]
679 MOV BYTE PTR [DI+1],AL
688 MOV AX,WORD PTR [LOWNUM
]
691 TEST BYTE PTR [DI+1],1
697 ; SECOND OPERAND WAS MEMORY OR REGISTER
700 CMP BYTE PTR [SEGFLG
],0
701 JZ GRP28
; FIRST OPERAND WAS A SEGMENT REG
702 MOV AL,BYTE PTR [REGMEM
]
709 OR BYTE PTR [DI+2],AL
710 AND BYTE PTR [DI+1],11111110B
711 CMP BYTE PTR [MEMFLG
],0
716 AND BYTE PTR [DI+2],11000111B
717 MOV AL,BYTE PTR [DI+1] ; GET FIRST OPCODE
719 CMP BYTE PTR [MOVFLG
],0
724 CMP BYTE PTR [TSTFLG
],0
727 CMP BYTE PTR [TSTFLG
],2
731 OR AL,BYTE PTR [MIDFLD
] ; MIDFLD IS ZERO FOR TST
733 MOV BYTE PTR [DI+1],AL
734 CMP BYTE PTR [MEMFLG
],0
740 ; SECOND OPERAND WAS A REGISTER
742 MOV AL,BYTE PTR [REGMEM
]
743 TEST AL,10000B ; SEGMENT REGISTER?
745 CMP BYTE PTR [MOVFLG
],0
747 MOV BYTE PTR [DI+1],10001100B
754 OR BYTE PTR [DI+2],AL
756 ; In the case of the XCHG reg,reg and TEST reg,reg we have just built the
757 ; instruction backwards. This is because these two instructions do not have
758 ; the D bit. We need to switch R/S and REG
760 ; Good comment Aaron, except that we do NOT switch if a memory operand was
761 ; present for precisely the reason that the D bit is not present
763 CMP BYTE PTR [TSTFLG
],0
764 JZ NOSWITCH
; Not XCHG or TEST
766 ; See if there is a memory operand specified. If the MOD field is 11, then
767 ; we do perform the exchange.
773 MOV AH,BYTE PTR [DI+2]
775 SHL AH,1 ; Low three bits to middle three
778 MOV AL,BYTE PTR [DI+2]
780 SHR AL,1 ; Middle three to low three
783 OR AL,AH ; Re combine
784 AND BYTE PTR [DI+2],MASKMOD
; Zap original
785 OR BYTE PTR [DI+2],AL ; New low 6 bits
789 ; SPECIAL FORM OF THE EXCHANGE COMMAND
791 CMP BYTE PTR [TSTFLG
],2
793 TEST BYTE PTR [DI+1],1
796 MOV AL,BYTE PTR [DI+2]
798 CMP AL,MASKMOD
; MUST BE REGISTER TO REGISTER
807 SHR BYTE PTR [DI+2],CL
812 MOV BYTE PTR [DI+1],AL
816 ; SECOND OPERAND WAS A MEMORY REFERENCE
819 CMP BYTE PTR [TSTFLG
],0
821 OR BYTE PTR [DI+1],10B
823 MOV AL,BYTE PTR [DI+2]
824 CMP AL,MASKMOD
; MUST BE A REGISTER
826 CMP BYTE PTR [SEGFLG
],0
836 OR AL,BYTE PTR [MODE
]
837 OR AL,BYTE PTR [REGMEM
]
838 MOV BYTE PTR [DI+2],AL
839 MOV AX,WORD PTR [LOWNUM
]
840 MOV WORD PTR [DI+3],AX
843 MOV AL,BYTE PTR [DI+2]
858 CMP BYTE PTR [MOVFLG
],0
861 ; TEST FOR SPECIAL FORM OF MOV AX,[MEM] OR MOV [MEM],AX
863 MOV AL,[DI+1] ; GET OP-CODE
867 CMP BYTE PTR [DI+2],00000110B ; MEM TO AX OR AX TO MEM
869 MOV AL,BYTE PTR [DI+1]
873 MOV BYTE PTR [DI+1],AL
876 MOV WORD PTR [DI+2],AX
882 ; Assem error. SI points to character in the input buffer
883 ; which caused error. By subtracting from start of buffer,
884 ; we will know how far to tab over to appear directly below
885 ; it on the terminal. Then print "^ Error".
888 SUB SI,OFFSET DG
:(BYTEBUF
-10) ; How many char processed so far?
889 MOV CX,SI ; Parameter for TAB in CX
890 MOV DI,OFFSET DG
:ARG_BUF
891 CALL TAB
; Directly below bad char
893 MOV DX,OFFSET DG
:SYNERR_PTR
; Error message
897 ; assemble the different parts into an instruction
900 MOV AL,BYTE PTR [AWORD
]
908 OR BYTE PTR [DI+1],AL ; SET THE SIZE
911 CMP BYTE PTR [NUMFLG
],0 ; TEST FOR IMMEDIATE DATA
913 CMP BYTE PTR [MEMFLG
],0
917 MOV AL,BYTE PTR [REGMEM
]
920 TEST AL,10000B ; TEST IF SEGMENT REGISTER
922 CMP BYTE PTR [MOVFLG
],0
924 MOV WORD PTR [DI+1],10001110B
925 INC BYTE PTR [MOVFLG
]
926 INC BYTE PTR [SEGFLG
]
932 MOV BYTE PTR [DI+2],AL
938 OR AL,BYTE PTR [MODE
]
939 OR AL,BYTE PTR [MIDFLD
]
940 MOV BYTE PTR [DI+2],AL
941 MOV AX,WORD PTR [LOWNUM
]
942 MOV WORD PTR [DI+3],AX
946 MOV BYTE PTR [F8087
],0
950 MOV WORD PTR [LOWNUM
],AX ; OFFSET
951 MOV WORD PTR [DIFLG
],AX ; DIFLG+SIFLG
952 MOV WORD PTR [BXFLG
],AX ; BXFLG+BPFLG
953 MOV WORD PTR [NEGFLG
],AX ; NEGFLG+NUMFLG
954 MOV WORD PTR [MEMFLG
],AX ; MEMFLG+REGFLG
956 CMP BYTE PTR [F8087
],0
958 MOV AL,1 ; DEFAULT 8087 REG IS 1
960 MOV BYTE PTR [REGMEM
],AL
963 MOV BYTE PTR [NEGFLG
],0
982 ; DETERMINE THE MODE BITS
985 MOV DI,OFFSET DG
:ASSEM_CNT
986 MOV BYTE PTR [MODE
],11000000B
987 MOV BYTE PTR [ASSEM_CNT
],2
988 CMP BYTE PTR [MEMFLG
],0
997 CMP AL,0DCH ; ARITHMETIC?
999 MOV BYTE PTR [DI+1],0DEH ; ADD POP TO NULL ARG 8087
1006 MOV BYTE PTR [MODE
],0
1007 CMP BYTE PTR [NUMFLG
],0
1011 MOV AX,WORD PTR [DIFLG
]
1012 OR AX,WORD PTR [BXFLG
]
1014 MOV BYTE PTR [REGMEM
],00000110B
1018 MOV BYTE PTR [MODE
],10000000B
1023 MOV BYTE PTR [MODE
],01000000B
1025 ; DETERMINE THE REG-MEM BITS
1028 MOV BX,WORD PTR [BXFLG
]
1029 MOV CX,WORD PTR [DIFLG
]
1060 CMP BYTE PTR [MODE
],0
1062 MOV BYTE PTR [MODE
],01000000B
1068 MOV BYTE PTR [REGMEM
],DL
1080 MOV AX,WORD PTR [SI]
1087 MOV DI,OFFSET DG
:SIZ8
1088 CALL CHKREG
; LOOK FOR BYTE, WORD, DWORD, ETC.
1096 CMP BYTE PTR [F8087
],0
1098 CMP AX,"TS" ; 8087 STACK OPERAND
1100 CMP BYTE PTR [SI+2],','
1102 MOV BYTE PTR [DIRFLG
],0
1112 CMP BYTE PTR [SI+2],'R'
1122 INC BYTE PTR [MEMFLG
]
1136 INC BYTE PTR [NEGFLG
]
1140 GETREG8: ; LOOK FOR A REGISTER
1141 CMP BYTE PTR [F8087
],0
1145 CMP BYTE PTR [SI+2],'('
1147 CMP BYTE PTR [SI+4],')'
1155 INC BYTE PTR [REGFLG
]
1157 CMP WORD PTR [SI],"S,"
1159 CMP BYTE PTR [SI+2],'T'
1167 MOV DI,OFFSET DG
:REG8
1169 JZ GETREG12
; CX = 0 MEANS NO REGISTER
1170 MOV BYTE PTR [REGMEM
],AL
1171 INC BYTE PTR [REGFLG
] ; TELL EVERYONE WE FOUND A REG
1172 CMP BYTE PTR [MEMFLG
],0
1180 CMP AL,11 ; BX REGISTER?
1182 CMP WORD PTR [BXFLG
],0
1188 INC BYTE PTR [BXFLG
]
1191 CMP AL,13 ; BP REGISTER?
1193 CMP WORD PTR [BXFLG
],0
1195 INC BYTE PTR [BPFLG
]
1198 CMP AL,14 ; SI REGISTER?
1200 CMP WORD PTR [DIFLG
],0
1202 INC BYTE PTR [SIFLG
]
1205 CMP AL,15 ; DI REGISTER?
1206 JNZ ASMPOP
; *** error
1207 CMP WORD PTR [DIFLG
],0
1209 INC BYTE PTR [DIFLG
]
1212 GETREG12: ; BETTER BE A NUMBER!
1213 MOV BP,WORD PTR [ASMADD
+2]
1214 CMP BYTE PTR [MEMFLG
],0
1223 CMP BYTE PTR [AWORD
],1
1225 CMP BYTE PTR [AWORD
],CL
1231 CMP BYTE PTR [NEGFLG
],0
1235 ADD WORD PTR [LOWNUM
],DX
1236 INC BYTE PTR [NUMFLG
]
1251 LES DI,DWORD PTR ASMADD
1252 MOV SI,OFFSET DG
:ASSEM_CNT
1258 MOV WORD PTR [ASMADD
],DI
1265 TEST AL,11000B ; 16 BIT OR SEGMENT REGISTER?
1269 CMP BYTE PTR [AWORD
],0
1271 CMP BYTE PTR [AWORD
],DL
1277 MOV BYTE PTR [AWORD
],DL
1280 ; DETERMINE IF NUMBER IN AX:DX IS 8 BITS, 16 BITS, OR 32 BITS
1296 ; get first character after first space
1299 CMP BYTE PTR [SI],13
1301 CMP BYTE PTR [SI],'['
1311 ; Set up for 8087 op-codes
1314 MOV BYTE PTR [ASSEM1
],0D8H
1316 AND AL,111B ; SET MIDDLE BITS OF SECOND BYTE
1321 MOV AL,AH ; SET LOWER BITS OF FIRST BYTE
1326 MOV BYTE PTR [F8087
],1 ; INDICATE 8087 OPERAND
1327 MOV BYTE PTR [DIRFLG
],100B
1330 ; Set MF bits for 8087 op-codes
1334 TEST BYTE PTR [DI+1],10B
1336 AND BYTE PTR [DI+1],11111001B ; CLEAR MF BITS
1341 TEST BYTE PTR [DI+1],1
1352 TEST BYTE PTR [DI+1],1
1356 OR BYTE PTR [DI+1],111B
1358 OR BYTE PTR [DI+1],011B
1359 OR BYTE PTR [DI+2],101000B
1362 OR BYTE PTR [DI+1],100B
1377 MOV DI,OFFSET DG
:ASSEM_CNT
1389 MOV BH,BYTE PTR [SI]
1404 INC BYTE PTR [ASSEM_CNT
]
1422 INC BYTE PTR [ASSEM_CNT
]
1427 INC BYTE PTR [ASSEM_CNT
]
1433 MOV BP,WORD PTR ASMADD
+2
1435 MOV WORD PTR ASMADD
,DX
1436 MOV WORD PTR ASMADD
+2,AX