]>
wirehaze git hosting - MS-DOS.git/blob - v2.0/source/DEBUASM.ASM
3 ; Code for the UASSEMble command in the debugger
13 CODE SEGMENT PUBLIC BYTE 'CODE'
16 CONST
SEGMENT PUBLIC BYTE
19 EXTRN NSEG
:WORD,SISAVE
:WORD,BPSAVE
:WORD,DISAVE
:WORD
20 EXTRN BXSAVE
:WORD,DSSAVE
:WORD,ESSAVE
:WORD,CSSAVE
:WORD,IPSAVE
:WORD
21 EXTRN SSSAVE
:WORD,CXSAVE
:WORD,SPSAVE
:WORD,FSAVE:WORD
22 EXTRN DISTAB
:WORD,SHFTAB
:WORD,IMMTAB
:WORD,GRP1TAB
:WORD,GRP2TAB
:WORD
23 EXTRN DBMN
:BYTE,ESCMN
:BYTE,DISPB
:WORD,STACK:BYTE,REG8
:BYTE
24 EXTRN REG16
:BYTE,SREG
:BYTE,SIZ8
:BYTE,SEGTAB
:WORD,M8087_TAB
:BYTE
25 EXTRN FI_TAB
:BYTE,SIZE_TAB
:BYTE,MD9_TAB
:BYTE,MD9_TAB2
:BYTE
26 EXTRN MDB_TAB
:BYTE,MDB_TAB2
:BYTE,MDD_TAB
:BYTE,MDD_TAB2
:BYTE
31 DATA SEGMENT PUBLIC BYTE
33 EXTRN DISADD
:BYTE,DISCNT
:WORD,BYTCNT
:BYTE,TEMP
:BYTE,AWORD
:BYTE
34 EXTRN MIDFLD
:BYTE,MODE
:BYTE,REGMEM
:BYTE,OPCODE
:WORD,OPBUF
:BYTE
39 DG GROUP
CODE,CONST
,DATA
42 CODE SEGMENT PUBLIC BYTE 'CODE'
43 ASSUME
CS:DG
,DS:DG
,ES:DG
,SS:DG
47 PUBLIC DISASLN
,MEMIMM
,JMPCALL
,SIGNIMM
,ALUFROMREG
,WORDTOALU
48 PUBLIC GRP2
,PREFIX
,OUTVARW
,GRP1
,SSPRE
,MOVSEGTO
,DSPRE
,SHIFT
49 PUBLIC ESPRE
,IMMED
,CSPRE
,OUTVARB
,CHK10
,ACCIMM
,INT3,INVARB
50 PUBLIC MOVSEGFROM
,LOADACC
,OUTFIXB
,XCHGAX
,REGIMMW
,SHORTJMP
51 PUBLIC SAV8
,M8087
,M8087_DB
,M8087_DF
,M8087_D9
,M8087_DD
52 PUBLIC SAV16
,SAVHEX
,INFIXW
,REGIMMB
,OUTFIXW
,SHIFTV
,LONGJMP
53 PUBLIC INVARW
,STOREACC
,INFIXB
,NOOPERANDS
,ALUTOREG
54 PUBLIC SEGOP
,REGOP
,GETADDR
56 EXTRN CRLF
:NEAR,PRINTMES
:NEAR,BLANK
:NEAR,TAB
:NEAR,OUT:NEAR
57 EXTRN HEX
:NEAR,DEFAULT
:NEAR,OUTSI
:NEAR,OUTDI
:NEAR
60 MOV BP,[CSSAVE
] ; Default code segment
61 MOV DI,OFFSET DG
:DISADD
; Default address
62 MOV CX,DISPB
; Default length
66 MOV WORD PTR [DISADD
],DX ; Displacement of disassembly
67 MOV WORD PTR [DISADD
+2],AX ; Segment
68 MOV WORD PTR [DISCNT
],CX ; No. of bytes (but whole instructions)
70 CALL DISASLN
; Disassemble one line
72 TEST [DISCNT
],-1 ; See if we've used up the range
76 GOTDIS: PUSH DS ; RE-GET LAST BYTE
78 LDS SI,DWORD PTR [DISADD
]
86 LDS SI,DWORD PTR [DISADD
]
87 LODSB ; Get the next byte of code
89 MOV WORD PTR [DISADD
],SI ; Update pointer
91 CALL HEX
; Display each code byte
93 OR SI,SI ; Check if range exhausted
94 JZ ENDRNG
; If so, don't wrap around
95 DEC SI ; Count off the bytes
98 INC BYTE PTR[BYTCNT
] ; Keep track of no. of bytes per line
102 DSPRE: INC BYTE PTR [NSEG
+1]
103 SSPRE: INC BYTE PTR [NSEG
+1]
104 CSPRE: INC BYTE PTR [NSEG
+1]
105 ESPRE: INC BYTE PTR [NSEG
+1]
108 POP BX ; Dump off return address
113 LDS SI,DWORD PTR [DISADD
]
114 CALL OUTSI
; Show disassembly address
118 MOV BYTE PTR [BYTCNT
],0 ; Count of code bytes per line
119 MOV DI,OFFSET DG
:OPBUF
; Point to operand buffer
121 MOV CX,OPBUFLEN
-1 ; Don't do last byte which has end marker
122 REP STOSB ; Initialize operand buffer to blanks
123 MOV BYTE PTR [DI]," "+80H
124 CALL GETDIS
; Get opcode
127 AND AL,1 ; Mask to "W" bit
129 MOV AL,BL ; Restore opcode
131 SHL BX,1 ; Multiply opcode by 4
132 ADD BX,OFFSET DG
:DISTAB
133 MOV DX,[BX] ; Get pointer to mnemonic from table
134 MOV [OPCODE
],DX ; Save it until line is complete
135 MOV DI,OFFSET DG
:OPBUF
; Initialize for opcode routines
136 CALL WORD PTR [BX+2] ; Dispatch to opcode routine
138 MOV SI,OFFSET DG
:DISADD
139 MOV AH,[BYTCNT
] ; See how many bytes in this instruction
140 ADD AH,AH ; Each uses two characters
141 MOV AL,14 ; Amount of space we want to use
142 SUB AL,AH ; See how many fill characters needed
144 XCHG CX,AX ; Parameter for TAB needed in CX
147 OR SI,SI ; MAKE SURE THERE IS SOMETHING TO PRINT
149 CALL PRINTMES
; Print opcode mnemonic
152 NOOPC: MOV SI,OFFSET DG
:OPBUF
153 JMP PRINTMES
; and the operand buffer
156 CALL GETDIS
; Get the address mode byte
158 AND AL,7 ; Mask to "r/m" field
164 AND AL,7 ; Mask to center 3-bit field
169 MOV [MODE
],AH ; Leaving 2-bit "MOD" field
173 MOV BX,OFFSET DG
:IMMTAB
190 TEST BYTE PTR [AWORD
],-1
198 MOV DI,OFFSET DG
:TEMP
204 MOV SI,OFFSET DG
:TEMP
212 CALL GETDIS
; Get low byte
214 CALL GETDIS
; Get high byte
216 CALL SAVHEX
; Convert and store high byte
242 MOV BX,OFFSET DG
:IMMTAB
248 CALL GETDIS
; Get signed 8-bit number
250 MOV DX,AX ; Save true 16-bit value in DX
255 JNS POSITIV
; OK if positive
257 NEG AH ; Get magnitude if negative
271 MOV SI,OFFSET DG
:REG8
272 CMP BYTE PTR [AWORD
],1
275 MOV SI,OFFSET DG
:REG16
289 MOV SI,OFFSET DG
:SREG
297 MOV BYTE PTR [AWORD
],1
307 MOV BYTE PTR [AWORD
],1
315 MOV BYTE PTR [AWORD
],1
323 CMP BYTE PTR [MODE
],3
327 MOV BYTE PTR [NSEG
],3
328 MOV BYTE PTR [DI],"["
332 CMP BYTE PTR [MODE
],0
333 JE DIRECT
; Mode=0 and R/M=6 means direct addr.
346 MOV BYTE PTR [NSEG
],2 ; Change default to Stack Segment
357 JAE DOMODE
; No index register
358 AND DL,1 ; Even for SI, odd for DI
367 JZ CLOSADD
; If no displacement, then done
370 CALL SAVD8
; Signed 8-bit displacement
400 ADD AX,WORD PTR [DISADD
]
413 ADD DX,WORD PTR [DISADD
]
433 MOV BYTE PTR [NSEG
],3
444 MOV BYTE PTR [AWORD
],0
447 MOV BYTE PTR [AWORD
],1
453 MOV BYTE PTR [DI],"3"
456 ; 8087 instructions whose first byte is 0dfh
461 MOV SI,OFFSET DG
:MDF_TAB
464 ; 8087 instructions whose first byte is 0ddh
469 MOV SI,OFFSET DG
:MDD_TAB
478 MOV SI,OFFSET DG
:MDD_TAB2
483 ; 8087 instructions whose first byte is 0dbh
488 MOV SI,OFFSET DG
:MDB_TAB
502 MOV SI,OFFSET DG
:MDB_TAB2
505 ; 8087 instructions whose first byte is 0d9h
511 MOV SI,OFFSET DG
:MD9_TAB
546 CMP AL,11010000B ; CHECK FOR FNOP
556 CALL GOTDIS
; GET THE MODE BYTE
557 MOV SI,OFFSET DG
:MD9_TAB2
562 ; entry point for the remaining 8087 instructions
566 CALL PUTFI
; PUT FIRST PART OF OPCODE
568 CMP BYTE PTR [MODE
],11B ; CHECK FOR REGISTER MODE
570 CALL PUTMN
; PUT MIDDLE PART OF OPCODE
571 NO3: MOV AL,9 ; OUTPUT A TAB
574 CALL PUTSIZE
; OUTPUT THE OPERAND SIZE
578 TEST AL,100000B ; D BIT SET?
580 TEST AL,000100B ; FDIV OR FSUB?
582 XOR AL,1 ; REVERSE SENSE OF R
583 MOV DL,AL ; SAVE CHANGE
584 MPUT: CALL PUTMN
; PUT MIDDLE PART OF OPCODE
602 ; output 8087 registers in the form st(n),st
613 ; output 8087 registers in the form st,st(n)
630 ; output an 8087 mnemonic
632 PUTMN: MOV SI,OFFSET DG
:M8087_TAB
637 ; output either 'FI' or 'F' for first byte of opcode
639 PUTFI: MOV SI,OFFSET DG
:FI_TAB
642 ; output size (dword, tbyte, etc.)
644 PUTSIZE:MOV SI,OFFSET DG
:SIZE_TAB
645 PUTFI2: CMP BYTE PTR [MODE
],11B ; check if 8087 register
647 AND AL,111000B ; LOOK FOR INVALID FORM OF 0DAH OPERANDS
651 CMP AL,110011B ; FCOMPP
653 CMP BYTE PTR [REGMEM
],1
661 PUTFI3: CMP AL,111101B
670 NOTQU: CMP AL,011101B
685 ; SI POINTS TO A TABLE OF TEXT SEPARATED BY "$"
686 ; CL = WHICH ELEMENT IN THE TABLE YOU WISH TO COPY TO [DI]
699 CMP AL,'@' ; THIS MEANS RESVERED OP-CODE
702 JMP SHORT ESC0P
; GO DO AN ESCAPE COMMAND
719 CMP BYTE PTR [MODE
],3
731 MOV DL,AL ; SAVE RESULT
734 ESC0P: POP DI ; CLEAN UP STACK
735 ESC0: MOV WORD PTR [OPCODE
],OFFSET DG
:ESCMN
737 MOV DI,OFFSET DG
:OPBUF
742 CMP BYTE PTR [MODE
],3
744 MOV BYTE PTR [AWORD
],1
794 PUTAL: MOV AX,"A"+4C00H
; "AL"
796 PUTAX: MOV AX,"A"+5800H
; "AX"
798 PUTDX: MOV AX,"D"+5800H
; "DX"
803 MOV BX,OFFSET DG
:SHFTAB
806 CMP BYTE PTR [MODE
],3
808 MOV SI,OFFSET DG
:SIZE_TAB
810 TEST BYTE PTR [AWORD
],-1
821 MOV WORD PTR [DI],"C"+4C00H
; "CL"
842 MOV BX,OFFSET DG
:GRP1TAB
851 MOV BX,OFFSET DG
:GRP2TAB