mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-11-29 17:15:47 +00:00
868 lines
21 KiB
NASM
868 lines
21 KiB
NASM
TITLE DEBUASM
|
||
|
||
; Code for the UASSEMble command in the debugger
|
||
|
||
.xlist
|
||
.xcref
|
||
INCLUDE DEBEQU.ASM
|
||
INCLUDE DOSSYM.ASM
|
||
.cref
|
||
.list
|
||
|
||
|
||
CODE SEGMENT PUBLIC BYTE 'CODE'
|
||
CODE ENDS
|
||
|
||
CONST SEGMENT PUBLIC BYTE
|
||
|
||
EXTRN SYNERR:BYTE
|
||
EXTRN NSEG:WORD,SISAVE:WORD,BPSAVE:WORD,DISAVE:WORD
|
||
EXTRN BXSAVE:WORD,DSSAVE:WORD,ESSAVE:WORD,CSSAVE:WORD,IPSAVE:WORD
|
||
EXTRN SSSAVE:WORD,CXSAVE:WORD,SPSAVE:WORD,FSAVE:WORD
|
||
EXTRN DISTAB:WORD,SHFTAB:WORD,IMMTAB:WORD,GRP1TAB:WORD,GRP2TAB:WORD
|
||
EXTRN DBMN:BYTE,ESCMN:BYTE,DISPB:WORD,STACK:BYTE,REG8:BYTE
|
||
EXTRN REG16:BYTE,SREG:BYTE,SIZ8:BYTE,SEGTAB:WORD,M8087_TAB:BYTE
|
||
EXTRN FI_TAB:BYTE,SIZE_TAB:BYTE,MD9_TAB:BYTE,MD9_TAB2:BYTE
|
||
EXTRN MDB_TAB:BYTE,MDB_TAB2:BYTE,MDD_TAB:BYTE,MDD_TAB2:BYTE
|
||
EXTRN MDF_TAB:BYTE
|
||
|
||
CONST ENDS
|
||
|
||
DATA SEGMENT PUBLIC BYTE
|
||
|
||
EXTRN DISADD:BYTE,DISCNT:WORD,BYTCNT:BYTE,TEMP:BYTE,AWORD:BYTE
|
||
EXTRN MIDFLD:BYTE,MODE:BYTE,REGMEM:BYTE,OPCODE:WORD,OPBUF:BYTE
|
||
EXTRN INDEX:WORD
|
||
|
||
DATA ENDS
|
||
|
||
DG GROUP CODE,CONST,DATA
|
||
|
||
|
||
CODE SEGMENT PUBLIC BYTE 'CODE'
|
||
ASSUME CS:DG,DS:DG,ES:DG,SS:DG
|
||
|
||
|
||
PUBLIC UNASSEM
|
||
PUBLIC DISASLN,MEMIMM,JMPCALL,SIGNIMM,ALUFROMREG,WORDTOALU
|
||
PUBLIC GRP2,PREFIX,OUTVARW,GRP1,SSPRE,MOVSEGTO,DSPRE,SHIFT
|
||
PUBLIC ESPRE,IMMED,CSPRE,OUTVARB,CHK10,ACCIMM,INT3,INVARB
|
||
PUBLIC MOVSEGFROM,LOADACC,OUTFIXB,XCHGAX,REGIMMW,SHORTJMP
|
||
PUBLIC SAV8,M8087,M8087_DB,M8087_DF,M8087_D9,M8087_DD
|
||
PUBLIC SAV16,SAVHEX,INFIXW,REGIMMB,OUTFIXW,SHIFTV,LONGJMP
|
||
PUBLIC INVARW,STOREACC,INFIXB,NOOPERANDS,ALUTOREG
|
||
PUBLIC SEGOP,REGOP,GETADDR
|
||
|
||
EXTRN CRLF:NEAR,PRINTMES:NEAR,BLANK:NEAR,TAB:NEAR,OUT:NEAR
|
||
EXTRN HEX:NEAR,DEFAULT:NEAR,OUTSI:NEAR,OUTDI:NEAR
|
||
|
||
UNASSEM:
|
||
MOV BP,[CSSAVE] ; Default code segment
|
||
MOV DI,OFFSET DG:DISADD ; Default address
|
||
MOV CX,DISPB ; Default length
|
||
SHR CX,1
|
||
SHR CX,1
|
||
CALL DEFAULT
|
||
MOV WORD PTR [DISADD],DX ; Displacement of disassembly
|
||
MOV WORD PTR [DISADD+2],AX ; Segment
|
||
MOV WORD PTR [DISCNT],CX ; No. of bytes (but whole instructions)
|
||
DISLP:
|
||
CALL DISASLN ; Disassemble one line
|
||
CALL CRLF
|
||
TEST [DISCNT],-1 ; See if we've used up the range
|
||
JNZ DISLP
|
||
RET
|
||
|
||
GOTDIS: PUSH DS ; RE-GET LAST BYTE
|
||
PUSH SI
|
||
LDS SI,DWORD PTR [DISADD]
|
||
MOV AL,[SI-1]
|
||
POP SI
|
||
POP DS
|
||
RET
|
||
|
||
GETDIS:
|
||
PUSH DS
|
||
LDS SI,DWORD PTR [DISADD]
|
||
LODSB ; Get the next byte of code
|
||
POP DS
|
||
MOV WORD PTR [DISADD],SI ; Update pointer
|
||
PUSH AX
|
||
CALL HEX ; Display each code byte
|
||
MOV SI,[DISCNT]
|
||
OR SI,SI ; Check if range exhausted
|
||
JZ ENDRNG ; If so, don't wrap around
|
||
DEC SI ; Count off the bytes
|
||
MOV [DISCNT],SI
|
||
ENDRNG:
|
||
INC BYTE PTR[BYTCNT] ; Keep track of no. of bytes per line
|
||
POP AX
|
||
RET
|
||
|
||
DSPRE: INC BYTE PTR [NSEG+1]
|
||
SSPRE: INC BYTE PTR [NSEG+1]
|
||
CSPRE: INC BYTE PTR [NSEG+1]
|
||
ESPRE: INC BYTE PTR [NSEG+1]
|
||
|
||
PREFIX:
|
||
POP BX ; Dump off return address
|
||
CALL FINLN
|
||
CALL CRLF
|
||
DISASLN:
|
||
PUSH DS
|
||
LDS SI,DWORD PTR [DISADD]
|
||
CALL OUTSI ; Show disassembly address
|
||
POP DS
|
||
CALL BLANK
|
||
DISASLN1:
|
||
MOV BYTE PTR [BYTCNT],0 ; Count of code bytes per line
|
||
MOV DI,OFFSET DG:OPBUF ; Point to operand buffer
|
||
MOV AL," "
|
||
MOV CX,OPBUFLEN-1 ; Don't do last byte which has end marker
|
||
REP STOSB ; Initialize operand buffer to blanks
|
||
MOV BYTE PTR [DI]," "+80H
|
||
CALL GETDIS ; Get opcode
|
||
MOV AH,0
|
||
MOV BX,AX
|
||
AND AL,1 ; Mask to "W" bit
|
||
MOV [AWORD],AL
|
||
MOV AL,BL ; Restore opcode
|
||
SHL BX,1
|
||
SHL BX,1 ; Multiply opcode by 4
|
||
ADD BX,OFFSET DG:DISTAB
|
||
MOV DX,[BX] ; Get pointer to mnemonic from table
|
||
MOV [OPCODE],DX ; Save it until line is complete
|
||
MOV DI,OFFSET DG:OPBUF ; Initialize for opcode routines
|
||
CALL WORD PTR [BX+2] ; Dispatch to opcode routine
|
||
FINLN:
|
||
MOV SI,OFFSET DG:DISADD
|
||
MOV AH,[BYTCNT] ; See how many bytes in this instruction
|
||
ADD AH,AH ; Each uses two characters
|
||
MOV AL,14 ; Amount of space we want to use
|
||
SUB AL,AH ; See how many fill characters needed
|
||
CBW
|
||
XCHG CX,AX ; Parameter for TAB needed in CX
|
||
CALL TAB
|
||
MOV SI,[OPCODE]
|
||
OR SI,SI ; MAKE SURE THERE IS SOMETHING TO PRINT
|
||
JZ NOOPC
|
||
CALL PRINTMES ; Print opcode mnemonic
|
||
MOV AL,9
|
||
CALL OUT ; and a tab
|
||
NOOPC: MOV SI,OFFSET DG:OPBUF
|
||
JMP PRINTMES ; and the operand buffer
|
||
|
||
GETMODE:
|
||
CALL GETDIS ; Get the address mode byte
|
||
MOV AH,AL
|
||
AND AL,7 ; Mask to "r/m" field
|
||
MOV [REGMEM],AL
|
||
SHR AH,1
|
||
SHR AH,1
|
||
SHR AH,1
|
||
MOV AL,AH
|
||
AND AL,7 ; Mask to center 3-bit field
|
||
MOV [MIDFLD],AL
|
||
SHR AH,1
|
||
SHR AH,1
|
||
SHR AH,1
|
||
MOV [MODE],AH ; Leaving 2-bit "MOD" field
|
||
RET
|
||
|
||
IMMED:
|
||
MOV BX,OFFSET DG:IMMTAB
|
||
CALL GETMNE
|
||
FINIMM:
|
||
CALL TESTREG
|
||
JMP SHORT IMM
|
||
|
||
MEMIMM:
|
||
CALL GETMODE
|
||
JMP SHORT FINIMM
|
||
|
||
ACCIMM:
|
||
XOR AL,AL
|
||
IMM1:
|
||
CALL SAVREG
|
||
IMM:
|
||
MOV AL,","
|
||
STOSB
|
||
TEST BYTE PTR [AWORD],-1
|
||
JNZ SAV16
|
||
SAV8:
|
||
CALL GETDIS
|
||
JMP SHORT SAVHEX
|
||
|
||
LONGJMP:
|
||
PUSH DI
|
||
MOV DI,OFFSET DG:TEMP
|
||
CALL SAV16
|
||
POP DI
|
||
CALL SAV16
|
||
MOV AL,":"
|
||
STOSB
|
||
MOV SI,OFFSET DG:TEMP
|
||
MOV CX,4
|
||
MOVDIG:
|
||
LODSB
|
||
STOSB
|
||
LOOP MOVDIG
|
||
RET
|
||
SAV16:
|
||
CALL GETDIS ; Get low byte
|
||
MOV DL,AL
|
||
CALL GETDIS ; Get high byte
|
||
MOV DH,AL
|
||
CALL SAVHEX ; Convert and store high byte
|
||
MOV AL,DL
|
||
SAVHEX:
|
||
MOV AH,AL
|
||
SHR AL,1
|
||
SHR AL,1
|
||
SHR AL,1
|
||
SHR AL,1
|
||
CALL SAVDIG
|
||
MOV AL,AH
|
||
SAVDIG:
|
||
AND AL,0FH
|
||
ADD AL,90H
|
||
DAA
|
||
ADC AL,40H
|
||
DAA
|
||
STOSB
|
||
RET
|
||
|
||
CHK10:
|
||
CALL GETDIS
|
||
CMP AL,10
|
||
JNZ SAVHEX
|
||
RET
|
||
|
||
SIGNIMM:
|
||
MOV BX,OFFSET DG:IMMTAB
|
||
CALL GETMNE
|
||
CALL TESTREG
|
||
MOV AL,","
|
||
STOSB
|
||
SAVD8:
|
||
CALL GETDIS ; Get signed 8-bit number
|
||
CBW
|
||
MOV DX,AX ; Save true 16-bit value in DX
|
||
MOV AH,AL
|
||
MOV AL,"+"
|
||
OR AH,AH
|
||
; JZ nosign
|
||
JNS POSITIV ; OK if positive
|
||
MOV AL,"-"
|
||
NEG AH ; Get magnitude if negative
|
||
POSITIV:
|
||
STOSB
|
||
; nosign:
|
||
MOV AL,AH
|
||
JMP SHORT SAVHEX
|
||
|
||
ALUFROMREG:
|
||
CALL GETADDR
|
||
MOV AL,","
|
||
STOSB
|
||
REGFLD:
|
||
MOV AL,[MIDFLD]
|
||
SAVREG:
|
||
MOV SI,OFFSET DG:REG8
|
||
CMP BYTE PTR [AWORD],1
|
||
JNE FNDREG
|
||
SAVREG16:
|
||
MOV SI,OFFSET DG:REG16
|
||
FNDREG:
|
||
CBW
|
||
ADD SI,AX
|
||
ADD SI,AX
|
||
MOVSW
|
||
RET
|
||
|
||
SEGOP:
|
||
SHR AL,1
|
||
SHR AL,1
|
||
SHR AL,1
|
||
SAVSEG:
|
||
AND AL,3
|
||
MOV SI,OFFSET DG:SREG
|
||
JMP SHORT FNDREG
|
||
|
||
REGOP:
|
||
AND AL,7
|
||
JMP SHORT SAVREG16
|
||
|
||
MOVSEGTO:
|
||
MOV BYTE PTR [AWORD],1
|
||
CALL GETADDR
|
||
MOV AL,","
|
||
STOSB
|
||
MOV AL,[MIDFLD]
|
||
JMP SHORT SAVSEG
|
||
|
||
MOVSEGFROM:
|
||
CALL GETMODE
|
||
CALL SAVSEG
|
||
MOV BYTE PTR [AWORD],1
|
||
JMP SHORT MEMOP2
|
||
|
||
GETADDR:
|
||
CALL GETMODE
|
||
JMP SHORT ADDRMOD
|
||
|
||
WORDTOALU:
|
||
MOV BYTE PTR [AWORD],1
|
||
ALUTOREG:
|
||
CALL GETMODE
|
||
CALL REGFLD
|
||
MEMOP2:
|
||
MOV AL,","
|
||
STOSB
|
||
ADDRMOD:
|
||
CMP BYTE PTR [MODE],3
|
||
MOV AL,[REGMEM]
|
||
JE SAVREG
|
||
XOR BX,BX
|
||
MOV BYTE PTR [NSEG],3
|
||
MOV BYTE PTR [DI],"["
|
||
INC DI
|
||
CMP AL,6
|
||
JNE NODRCT
|
||
CMP BYTE PTR [MODE],0
|
||
JE DIRECT ; Mode=0 and R/M=6 means direct addr.
|
||
NODRCT:
|
||
MOV DL,AL
|
||
CMP AL,1
|
||
JBE USEBX
|
||
CMP AL,7
|
||
JE USEBX
|
||
CMP AL,3
|
||
JBE USEBP
|
||
CMP AL,6
|
||
JNE CHKPLS
|
||
USEBP:
|
||
MOV BX,[BPSAVE]
|
||
MOV BYTE PTR [NSEG],2 ; Change default to Stack Segment
|
||
MOV AX,BPREG
|
||
SAVBASE:
|
||
STOSW
|
||
CHKPLS:
|
||
CMP DL,4
|
||
JAE NOPLUS
|
||
MOV AL,"+"
|
||
STOSB
|
||
NOPLUS:
|
||
CMP DL,6
|
||
JAE DOMODE ; No index register
|
||
AND DL,1 ; Even for SI, odd for DI
|
||
JZ USESI
|
||
ADD BX,[DISAVE]
|
||
MOV AX,DIREG
|
||
SAVINDX:
|
||
STOSW
|
||
DOMODE:
|
||
MOV AL,[MODE]
|
||
OR AL,AL
|
||
JZ CLOSADD ; If no displacement, then done
|
||
CMP AL,2
|
||
JZ ADDDIR
|
||
CALL SAVD8 ; Signed 8-bit displacement
|
||
ADDCLOS:
|
||
ADD BX,DX
|
||
CLOSADD:
|
||
MOV AL,"]"
|
||
STOSB
|
||
MOV [INDEX],BX
|
||
NOOPERANDS:
|
||
RET
|
||
|
||
ADDDIR:
|
||
MOV AL,"+"
|
||
STOSB
|
||
DIRECT:
|
||
CALL SAV16
|
||
JMP SHORT ADDCLOS
|
||
|
||
USEBX:
|
||
MOV BX,[BXSAVE]
|
||
MOV AX,BXREG
|
||
JMP SHORT SAVBASE
|
||
|
||
USESI:
|
||
ADD BX,[SISAVE]
|
||
MOV AX,SIREG
|
||
JMP SHORT SAVINDX
|
||
|
||
SHORTJMP:
|
||
CALL GETDIS
|
||
CBW
|
||
ADD AX,WORD PTR [DISADD]
|
||
XCHG DX,AX
|
||
SAVJMP:
|
||
MOV AL,DH
|
||
CALL SAVHEX
|
||
MOV AL,DL
|
||
JMP SAVHEX
|
||
|
||
JMPCALL:
|
||
CALL GETDIS
|
||
MOV DL,AL
|
||
CALL GETDIS
|
||
MOV DH,AL
|
||
ADD DX,WORD PTR [DISADD]
|
||
JMP SHORT SAVJMP
|
||
|
||
XCHGAX:
|
||
AND AL,7
|
||
CALL SAVREG16
|
||
MOV AL,","
|
||
STOSB
|
||
XOR AL,AL
|
||
JMP SAVREG16
|
||
|
||
LOADACC:
|
||
XOR AL,AL
|
||
CALL SAVREG
|
||
MOV AL,","
|
||
STOSB
|
||
MEMDIR:
|
||
MOV AL,"["
|
||
STOSB
|
||
XOR BX,BX
|
||
MOV BYTE PTR [NSEG],3
|
||
JMP DIRECT
|
||
|
||
STOREACC:
|
||
CALL MEMDIR
|
||
MOV AL,","
|
||
STOSB
|
||
XOR AL,AL
|
||
JMP SAVREG
|
||
|
||
REGIMMB:
|
||
MOV BYTE PTR [AWORD],0
|
||
JMP SHORT REGIMM
|
||
REGIMMW:
|
||
MOV BYTE PTR [AWORD],1
|
||
REGIMM:
|
||
AND AL,7
|
||
JMP IMM1
|
||
|
||
INT3:
|
||
MOV BYTE PTR [DI],"3"
|
||
RET
|
||
;
|
||
; 8087 instructions whose first byte is 0dfh
|
||
;
|
||
M8087_DF:
|
||
CALL GET64F
|
||
JZ ISDD3
|
||
MOV SI,OFFSET DG:MDF_TAB
|
||
JMP NODB3
|
||
;
|
||
; 8087 instructions whose first byte is 0ddh
|
||
;
|
||
M8087_DD:
|
||
CALL GET64F
|
||
JZ ISDD3
|
||
MOV SI,OFFSET DG:MDD_TAB
|
||
JMP NOD93
|
||
|
||
ISDD3:
|
||
MOV AL,DL
|
||
TEST AL,100B
|
||
JZ ISSTI
|
||
JMP ESC0
|
||
ISSTI: AND AL,11B
|
||
MOV SI,OFFSET DG:MDD_TAB2
|
||
MOV CL,AL
|
||
CALL MOVBYT
|
||
JMP PUTRST
|
||
;
|
||
; 8087 instructions whose first byte is 0dbh
|
||
;
|
||
M8087_DB:
|
||
CALL GET64F
|
||
JZ ISDB3
|
||
MOV SI,OFFSET DG:MDB_TAB
|
||
NODB3: CALL PUTOP
|
||
CALL PUTSIZE
|
||
JMP ADDRMOD
|
||
|
||
ISDB3:
|
||
MOV AL,DL
|
||
TEST AL,100B
|
||
JNZ ISDBIG
|
||
ESC0V: JMP ESC0
|
||
ISDBIG: CALL GOTDIS
|
||
AND AL,11111B
|
||
CMP AL,4
|
||
JAE ESC0V
|
||
MOV SI,OFFSET DG:MDB_TAB2
|
||
JMP DOBIG
|
||
;
|
||
; 8087 instructions whose first byte is 0d9h
|
||
;
|
||
M8087_D9:
|
||
CALL GET64F
|
||
JZ ISD93
|
||
|
||
MOV SI,OFFSET DG:MD9_TAB
|
||
NOD93: CALL PUTOP
|
||
AND AL,111B
|
||
CMP AL,3
|
||
JA NOSHO
|
||
MOV AL,DL
|
||
CALL PUTSIZE
|
||
NOSHO: JMP ADDRMOD
|
||
|
||
ISD93: MOV AL,DL
|
||
TEST AL,100B
|
||
JNZ ISD9BIG
|
||
AND AL,111B
|
||
OR AL,AL
|
||
JNZ NOTFLD
|
||
MOV AX,"DL"
|
||
STOSW
|
||
JMP SHORT PUTRST
|
||
NOTFLD: CMP AL,1
|
||
JNZ NOTFXCH
|
||
MOV AX,"CX"
|
||
STOSW
|
||
MOV AL,"H"
|
||
JMP SHORT PUTRST1
|
||
NOTFXCH:CMP AL,3
|
||
JNZ NOTFSTP
|
||
MOV AX,"TS"
|
||
STOSW
|
||
MOV AL,"P"
|
||
PUTRST1:STOSB
|
||
PUTRST: MOV AL,9
|
||
STOSB
|
||
JMP PUTST0
|
||
|
||
NOTFSTP:CALL GOTDIS
|
||
CMP AL,11010000B ; CHECK FOR FNOP
|
||
JZ GOTFNOP
|
||
JMP ESC0
|
||
GOTFNOP:MOV AX,"ON"
|
||
STOSW
|
||
MOV AL,"P"
|
||
STOSB
|
||
RET
|
||
|
||
ISD9BIG:
|
||
CALL GOTDIS ; GET THE MODE BYTE
|
||
MOV SI,OFFSET DG:MD9_TAB2
|
||
DOBIG: AND AL,11111B
|
||
MOV CL,AL
|
||
JMP MOVBYT
|
||
;
|
||
; entry point for the remaining 8087 instructions
|
||
;
|
||
M8087:
|
||
CALL GET64
|
||
CALL PUTFI ; PUT FIRST PART OF OPCODE
|
||
MOV AL,DL
|
||
CMP BYTE PTR [MODE],11B ; CHECK FOR REGISTER MODE
|
||
JZ MODEIS3
|
||
CALL PUTMN ; PUT MIDDLE PART OF OPCODE
|
||
NO3: MOV AL,9 ; OUTPUT A TAB
|
||
STOSB
|
||
MOV AL,DL
|
||
CALL PUTSIZE ; OUTPUT THE OPERAND SIZE
|
||
JMP ADDRMOD
|
||
|
||
MODEIS3:
|
||
TEST AL,100000B ; D BIT SET?
|
||
JZ MPUT ; NOPE...
|
||
TEST AL,000100B ; FDIV OR FSUB?
|
||
JZ MPUT ; NOPE...
|
||
XOR AL,1 ; REVERSE SENSE OF R
|
||
MOV DL,AL ; SAVE CHANGE
|
||
MPUT: CALL PUTMN ; PUT MIDDLE PART OF OPCODE
|
||
MOV AL,DL
|
||
TEST AL,010000B
|
||
JZ NOPSH
|
||
MOV AL,"P"
|
||
STOSB
|
||
NOPSH: MOV AL,9
|
||
STOSB
|
||
MOV AL,DL
|
||
AND AL,00000111B
|
||
CMP AL,2 ; FCOM
|
||
JZ PUTST0
|
||
CMP AL,3 ; FCOMP
|
||
JZ PUTST0
|
||
MOV AL,DL
|
||
TEST AL,100000B
|
||
JZ PUTSTST0
|
||
;
|
||
; output 8087 registers in the form st(n),st
|
||
;
|
||
PUTST0ST:
|
||
CALL PUTST0
|
||
MOV AL,','
|
||
ISCOMP: STOSB
|
||
|
||
PUTST: MOV AX,"TS"
|
||
STOSW
|
||
RET
|
||
;
|
||
; output 8087 registers in the form st,st(n)
|
||
;
|
||
PUTSTST0:
|
||
CALL PUTST
|
||
MOV AL,','
|
||
STOSB
|
||
|
||
PUTST0: CALL PUTST
|
||
MOV AL,"("
|
||
STOSB
|
||
MOV AL,[REGMEM]
|
||
ADD AL,"0"
|
||
STOSB
|
||
MOV AL,")"
|
||
STOSB
|
||
RET
|
||
;
|
||
; output an 8087 mnemonic
|
||
;
|
||
PUTMN: MOV SI,OFFSET DG:M8087_TAB
|
||
MOV CL,AL
|
||
AND CL,00000111B
|
||
JMP SHORT MOVBYT
|
||
;
|
||
; output either 'FI' or 'F' for first byte of opcode
|
||
;
|
||
PUTFI: MOV SI,OFFSET DG:FI_TAB
|
||
JMP SHORT PUTFI2
|
||
;
|
||
; output size (dword, tbyte, etc.)
|
||
;
|
||
PUTSIZE:MOV SI,OFFSET DG:SIZE_TAB
|
||
PUTFI2: CMP BYTE PTR [MODE],11B ; check if 8087 register
|
||
JNZ PUTFI3
|
||
AND AL,111000B ; LOOK FOR INVALID FORM OF 0DAH OPERANDS
|
||
CMP AL,010000B
|
||
JZ ESC0PJ
|
||
MOV AL,DL
|
||
CMP AL,110011B ; FCOMPP
|
||
JNZ GOFI
|
||
CMP BYTE PTR [REGMEM],1
|
||
JZ GOFI
|
||
ESC0PJ: JMP ESC0P
|
||
GOFI: XOR CL,CL
|
||
JMP SHORT MOVBYT
|
||
;
|
||
; Look for qword
|
||
;
|
||
PUTFI3: CMP AL,111101B
|
||
JZ GOTQU
|
||
CMP AL,111111B
|
||
JNZ NOTQU
|
||
GOTQU: MOV CL,2
|
||
JMP SHORT MOVBYT
|
||
;
|
||
; look for tbyte
|
||
;
|
||
NOTQU: CMP AL,011101B
|
||
JZ GOTTB
|
||
CMP AL,111100B
|
||
JZ GOTTB
|
||
CMP AL,111110B
|
||
JZ GOTTB
|
||
CMP AL,011111B
|
||
JNZ NOTTB
|
||
GOTTB: MOV CL,5
|
||
JMP SHORT MOVBYT
|
||
|
||
NOTTB: MOV CL,4
|
||
SHR AL,CL
|
||
MOV CL,AL
|
||
;
|
||
; SI POINTS TO A TABLE OF TEXT SEPARATED BY "$"
|
||
; CL = WHICH ELEMENT IN THE TABLE YOU WISH TO COPY TO [DI]
|
||
;
|
||
MOVBYT: PUSH AX
|
||
INC CL
|
||
MOVBYT1:DEC CL
|
||
JZ MOVBYT3
|
||
MOVBYT2:LODSB
|
||
CMP AL,'$'
|
||
JZ MOVBYT1
|
||
JMP MOVBYT2
|
||
MOVBYT3:LODSB
|
||
CMP AL,'$'
|
||
JZ MOVBYT5
|
||
CMP AL,'@' ; THIS MEANS RESVERED OP-CODE
|
||
JNZ MOVBYT4
|
||
POP AX
|
||
JMP SHORT ESC0P ; GO DO AN ESCAPE COMMAND
|
||
MOVBYT4:STOSB
|
||
JMP MOVBYT3
|
||
MOVBYT5:POP AX
|
||
RET
|
||
|
||
PUTOP: AND AL,111B
|
||
MOV CL,AL
|
||
CALL MOVBYT
|
||
MOV AL,9
|
||
STOSB
|
||
MOV AL,DL
|
||
RET
|
||
|
||
GET64F: CALL GET64
|
||
MOV AL,"F"
|
||
STOSB
|
||
CMP BYTE PTR [MODE],3
|
||
MOV AL,DL
|
||
RET
|
||
|
||
GET64:
|
||
AND AL,7
|
||
MOV DL,AL
|
||
CALL GETMODE
|
||
SHL DL,1
|
||
SHL DL,1
|
||
SHL DL,1
|
||
OR AL,DL
|
||
MOV DL,AL ; SAVE RESULT
|
||
RET
|
||
|
||
ESC0P: POP DI ; CLEAN UP STACK
|
||
ESC0: MOV WORD PTR [OPCODE],OFFSET DG:ESCMN
|
||
MOV AL,DL
|
||
MOV DI,OFFSET DG:OPBUF
|
||
JMP SHORT ESC1
|
||
|
||
ESC: CALL GET64
|
||
ESC1: CALL SAVHEX
|
||
CMP BYTE PTR [MODE],3
|
||
JZ SHRTESC
|
||
MOV BYTE PTR [AWORD],1
|
||
JMP MEMOP2
|
||
|
||
SHRTESC:
|
||
MOV AL,","
|
||
STOSB
|
||
MOV AL,[REGMEM]
|
||
AND AL,7
|
||
JMP SAVREG
|
||
|
||
INVARW:
|
||
CALL PUTAX
|
||
JMP SHORT INVAR
|
||
INVARB:
|
||
CALL PUTAL
|
||
INVAR: MOV AL,','
|
||
STOSB
|
||
JMP PUTDX
|
||
|
||
INFIXW:
|
||
CALL PUTAX
|
||
JMP SHORT INFIX
|
||
INFIXB:
|
||
CALL PUTAL
|
||
INFIX: MOV AL,','
|
||
STOSB
|
||
JMP SAV8
|
||
STOSW
|
||
RET
|
||
|
||
OUTVARB:
|
||
MOV BX,"LA"
|
||
JMP SHORT OUTVAR
|
||
OUTVARW:
|
||
MOV BX,"XA"
|
||
OUTVAR: CALL PUTDX
|
||
OUTFV: MOV AL,','
|
||
STOSB
|
||
MOV AX,BX
|
||
STOSW
|
||
RET
|
||
|
||
OUTFIXB:
|
||
MOV BX,"LA"
|
||
JMP SHORT OUTFIX
|
||
OUTFIXW:
|
||
MOV BX,"XA"
|
||
OUTFIX: CALL SAV8
|
||
JMP OUTFV
|
||
|
||
PUTAL: MOV AX,"A"+4C00H ; "AL"
|
||
JMP SHORT PUTX
|
||
PUTAX: MOV AX,"A"+5800H ; "AX"
|
||
JMP SHORT PUTX
|
||
PUTDX: MOV AX,"D"+5800H ; "DX"
|
||
PUTX: STOSW
|
||
RET
|
||
|
||
SHFT:
|
||
MOV BX,OFFSET DG:SHFTAB
|
||
CALL GETMNE
|
||
TESTREG:
|
||
CMP BYTE PTR [MODE],3
|
||
JZ NOFLG
|
||
MOV SI,OFFSET DG:SIZE_TAB
|
||
MOV CL,3
|
||
TEST BYTE PTR [AWORD],-1
|
||
JNZ TEST_1
|
||
INC CL
|
||
TEST_1: CALL MOVBYT
|
||
NOFLG:
|
||
JMP ADDRMOD
|
||
|
||
SHIFTV:
|
||
CALL SHFT
|
||
MOV AL,","
|
||
STOSB
|
||
MOV WORD PTR [DI],"C"+4C00H ; "CL"
|
||
RET
|
||
|
||
SHIFT:
|
||
CALL SHFT
|
||
MOV AX,"1,"
|
||
STOSW
|
||
RET
|
||
|
||
GETMNE:
|
||
CALL GETMODE
|
||
MOV DL,AL
|
||
CBW
|
||
SHL AX,1
|
||
ADD BX,AX
|
||
MOV AX,[BX]
|
||
MOV [OPCODE],AX
|
||
MOV AL,DL
|
||
RET
|
||
|
||
GRP1:
|
||
MOV BX,OFFSET DG:GRP1TAB
|
||
CALL GETMNE
|
||
OR AL,AL
|
||
JZ FINIMMJ
|
||
JMP TESTREG
|
||
FINIMMJ:
|
||
JMP FINIMM
|
||
|
||
GRP2:
|
||
MOV BX,OFFSET DG:GRP2TAB
|
||
CALL GETMNE
|
||
CMP AL,2
|
||
JB TESTREG
|
||
CMP AL,6
|
||
JAE INDIRECT
|
||
TEST AL,1
|
||
JZ INDIRECT
|
||
MOV AX,"AF" ; "FAR"
|
||
STOSW
|
||
MOV AX," R"
|
||
STOSW
|
||
INDIRECT:
|
||
JMP ADDRMOD
|
||
|
||
CODE ENDS
|
||
END UNASSEM
|
||
|