]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/DEBUG/DEBUASM.ASM
3 ; Code for the UASSEMble command in the debugger
6 %
OUT COMPONENT
=DEBUG
, MODULE
=DEBUASM
14 CODE SEGMENT PUBLIC BYTE
17 CONST
SEGMENT PUBLIC BYTE
18 EXTRN SYNERR_PTR
:BYTE,UNASSEM_LN_PTR
:WORD
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,FLSAVE
: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
33 DATA SEGMENT PUBLIC BYTE
34 EXTRN DISADD
:BYTE,DISCNT
:WORD,BYTCNT
:BYTE,TEMP
:BYTE,AWORD
:BYTE
35 EXTRN MIDFLD
:BYTE,MODE
:BYTE,REGMEM
:BYTE,OPCODE
:WORD,OPBUF
:BYTE
36 EXTRN INDEX
:WORD,ARG_BUF
:BYTE,ARG_BUF_PTR
:BYTE,ARG_BUF_INDEX
:WORD
37 EXTRN OPBUF
:BYTE,OPCODE
:WORD
40 DG GROUP
CODE,CONST
,CSTACK
,DATA
42 CODE SEGMENT PUBLIC BYTE
43 ASSUME
CS:DG
,DS:DG
,ES:DG
,SS:DG
46 PUBLIC DISASLN
,MEMIMM
,JMPCALL
,SIGNIMM
,ALUFROMREG
,WORDTOALU
47 PUBLIC GRP2
,PREFIX
,OUTVARW
,GRP1
,SSPRE
,MOVSEGTO
,DSPRE
,SHIFT
48 PUBLIC ESPRE
,IMMED
,CSPRE
,OUTVARB
,CHK10
,ACCIMM
,INT3,INVARB
49 PUBLIC MOVSEGFROM
,LOADACC
,OUTFIXB
,XCHGAX
,REGIMMW
,SHORTJMP
50 PUBLIC SAV8
,M8087
,M8087_DB
,M8087_DF
,M8087_D9
,M8087_DD
51 PUBLIC SAV16
,SAVHEX
,INFIXW
,REGIMMB
,OUTFIXW
,SHIFTV
,LONGJMP
52 PUBLIC INVARW
,STOREACC
,INFIXB
,NOOPERANDS
,ALUTOREG
53 PUBLIC SEGOP
,REGOP
,GETADDR
55 EXTRN CRLF
:NEAR,BLANK
:NEAR,TAB
:NEAR,STD_PRINTF
:NEAR
56 EXTRN HEX
:NEAR,DEFAULT
:NEAR,OUTSI
:NEAR,OUTDI
:NEAR
57 EXTRN HEX_ADDRESS_ONLY
: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
77 PUSH DS ; RE-GET LAST BYTE
79 LDS SI,DWORD PTR [DISADD
]
87 LDS SI,DWORD PTR [DISADD
]
88 LODSB ; Get the next byte of code
90 MOV WORD PTR [DISADD
],SI ; Update pointer
93 MOV DI,[ARG_BUF_INDEX
]
94 CALL HEX
; Display each code byte
95 MOV [ARG_BUF_INDEX
],DI
98 OR SI,SI ; Check if range exhausted
99 JZ ENDRNG
; If so, don't wrap around
100 DEC SI ; Count off the bytes
103 INC BYTE PTR[BYTCNT
] ; Keep track of no. of bytes per line
108 INC BYTE PTR [NSEG
+1]
110 INC BYTE PTR [NSEG
+1]
112 INC BYTE PTR [NSEG
+1]
114 INC BYTE PTR [NSEG
+1]
117 POP BX ; Dump off return address
122 LDS SI,DWORD PTR [DISADD
]
123 CALL OUTSI
; Show disassembly address
125 CALL HEX_ADDRESS_ONLY
127 MOV BYTE PTR [BYTCNT
],0 ; Count of code bytes per line
128 ; Fill overflow area with zeros
129 MOV DI,OFFSET DG
:OPBUF
133 ; fill buffer with spaces
134 MOV DI,OFFSET DG
:OPBUF
138 MOV DI,OFFSET DG
:ARG_BUF
139 MOV [ARG_BUF_INDEX
],DI
140 CALL GETDIS
; Get opcode
141 MOV DI,[ARG_BUF_INDEX
]
144 AND AL,1 ; Mask to "W" bit
146 MOV AL,BL ; Restore opcode
148 SHL BX,1 ; Multiply opcode by 4
149 ADD BX,OFFSET DG
:DISTAB
150 MOV DX,[BX] ; Get pointer to mnemonic from table
152 MOV [ARG_BUF_INDEX
],DI
153 MOV DI,OFFSET DG
:OPBUF
156 MOV AH,[BYTCNT
] ; See how many bytes in this instruction
157 ADD AH,AH ; Each uses two characters
158 MOV AL,14 ; Amount of space we want to use
159 SUB AL,AH ; See how many fill characters needed
161 XCHG CX,AX ; Parameter for TAB needed in CX
162 MOV DI,[ARG_BUF_INDEX
]
177 MOV BYTE PTR [DI],0 ; nul terminate address buffer
178 MOV DX,OFFSET DG
:UNASSEM_LN_PTR
183 CALL GETDIS
; Get the address mode byte
185 AND AL,7 ; Mask to "r/m" field
191 AND AL,7 ; Mask to center 3-bit field
196 MOV [MODE
],AH ; Leaving 2-bit "MOD" field
200 MOV BX,OFFSET DG
:IMMTAB
217 TEST BYTE PTR [AWORD
],-1
225 MOV DI,OFFSET DG
:TEMP
231 MOV SI,OFFSET DG
:TEMP
240 CALL GETDIS
; Get low byte
242 CALL GETDIS
; Get high byte
244 CALL SAVHEX
; Convert and store high byte
270 MOV BX,OFFSET DG
:IMMTAB
276 CALL GETDIS
; Get signed 8-bit number
278 MOV DX,AX ; Save true 16-bit value in DX
283 JNS POSITIV
; OK if positive
285 NEG AH ; Get magnitude if negative
299 MOV SI,OFFSET DG
:REG8
300 CMP BYTE PTR [AWORD
],1
303 MOV SI,OFFSET DG
:REG16
317 MOV SI,OFFSET DG
:SREG
325 MOV BYTE PTR [AWORD
],1
335 MOV BYTE PTR [AWORD
],1
343 MOV BYTE PTR [AWORD
],1
351 CMP BYTE PTR [MODE
],3
355 MOV BYTE PTR [NSEG
],3
356 MOV BYTE PTR [DI],"["
360 CMP BYTE PTR [MODE
],0
361 JE DIRECT
; Mode=0 and R/M=6 means direct addr.
374 MOV BYTE PTR [NSEG
],2 ; Change default to Stack Segment
385 JAE DOMODE
; No index register
386 AND DL,1 ; Even for SI, odd for DI
395 JZ CLOSADD
; If no displacement, then done
398 CALL SAVD8
; Signed 8-bit displacement
428 ADD AX,WORD PTR [DISADD
]
441 ADD DX,WORD PTR [DISADD
]
461 MOV BYTE PTR [NSEG
],3
472 MOV BYTE PTR [AWORD
],0
476 MOV BYTE PTR [AWORD
],1
482 MOV BYTE PTR [DI],"3"
486 ; 8087 instructions whose first byte is 0dfh
490 MOV SI,OFFSET DG
:MDF_TAB
493 ; 8087 instructions whose first byte is 0ddh
497 MOV SI,OFFSET DG
:MDD_TAB
508 MOV SI,OFFSET DG
:MDD_TAB2
513 ; 8087 instructions whose first byte is 0dbh
517 MOV SI,OFFSET DG
:MDB_TAB
535 MOV SI,OFFSET DG
:MDB_TAB2
538 ; 8087 instructions whose first byte is 0d9h
543 MOV SI,OFFSET DG
:MD9_TAB
588 CMP AL,11010000B ; CHECK FOR FNOP
600 CALL GOTDIS
; GET THE MODE BYTE
601 MOV SI,OFFSET DG
:MD9_TAB2
607 ; entry point for the remaining 8087 instructions
610 CALL PUTFI
; PUT FIRST PART OF OPCODE
612 CMP BYTE PTR [MODE
],11B ; CHECK FOR REGISTER MODE
614 CALL PUTMN
; PUT MIDDLE PART OF OPCODE
616 MOV AL,9 ; OUTPUT A TAB
619 CALL PUTSIZE
; OUTPUT THE OPERAND SIZE
623 TEST AL,100000B ; D BIT SET?
625 TEST AL,000100B ; FDIV OR FSUB?
627 XOR AL,1 ; REVERSE SENSE OF R
628 MOV DL,AL ; SAVE CHANGE
630 CALL PUTMN
; PUT MIDDLE PART OF OPCODE
649 ; output 8087 registers in the form st(n),st
661 ; output 8087 registers in the form st,st(n)
678 ; output an 8087 mnemonic
680 MOV SI,OFFSET DG
:M8087_TAB
685 ; output either 'FI' or 'F' for first byte of opcode
687 MOV SI,OFFSET DG
:FI_TAB
690 ; output size (dword, tbyte, etc.)
692 MOV SI,OFFSET DG
:SIZE_TAB
694 CMP BYTE PTR [MODE
],11B ; check if 8087 register
696 AND AL,111000B ; LOOK FOR INVALID FORM OF 0DAH OPERANDS
700 CMP AL,110011B ; FCOMPP
702 CMP BYTE PTR [REGMEM
],1
739 ; SI POINTS TO A TABLE OF TEXT SEPARATED BY "$"
740 ; CL = WHICH ELEMENT IN THE TABLE YOU WISH TO COPY TO [DI]
757 CMP AL,'@' ; THIS MEANS RESVERED OP-CODE
760 JMP SHORT ESC0P
; GO DO AN ESCAPE COMMAND
783 CMP BYTE PTR [MODE
],3
795 MOV DL,AL ; SAVE RESULT
799 POP DI ; CLEAN UP STACK
801 MOV WORD PTR [OPCODE
],OFFSET DG
:ESCMN
803 MOV DI,OFFSET DG
:OPBUF
810 CMP BYTE PTR [MODE
],3
812 MOV BYTE PTR [AWORD
],1
844 STOSW ;IS THIS DEAD CODE? EMK
873 MOV AX,"A"+4C00H
; "AL"
877 MOV AX,"A"+5800H
; "AX"
881 MOV AX,"D"+5800H
; "DX"
887 MOV BX,OFFSET DG
:SHFTAB
890 CMP BYTE PTR [MODE
],3
892 MOV SI,OFFSET DG
:SIZE_TAB
894 TEST BYTE PTR [AWORD
],-1
906 MOV WORD PTR [DI],"C"+4C00H
; "CL"
928 MOV BX,OFFSET DG
:GRP1TAB
937 MOV BX,OFFSET DG
:GRP2TAB