356 lines
8.8 KiB
NASM
356 lines
8.8 KiB
NASM
|
||
;
|
||
;
|
||
; Copyright (C) Microsoft Corporation, 1986
|
||
;
|
||
; This Module contains Proprietary Information of Microsoft
|
||
; Corporation and should be treated as Confidential.
|
||
;
|
||
subttl emdisp.asm - Dispatch Tables
|
||
page
|
||
;*********************************************************************;
|
||
; ;
|
||
; Dispatch Tables ;
|
||
; ;
|
||
;*********************************************************************;
|
||
|
||
; dispatch tables
|
||
|
||
; These tables are based upon the layout of the 8087 instructions
|
||
;
|
||
; 8087 instruction fields: |escape|MF|Arith|MOD|Op|r/m|disp1|disp2|
|
||
; field length in bits: 5 2 1 2 3 3 8 8
|
||
;
|
||
; Disp1 and Disp2 are optional address bytes present only if MOD <> 11.
|
||
; When (MOD <> 11) r/m describes which regs (SI,DI,BX,BP) are added to
|
||
; Disp1 and Disp2 to calculate the effective address. This form
|
||
; (memory format) is used for Loads, Stores, Compares, and Arithmetic
|
||
; When using memory format MF determines the Type of the Memory operand
|
||
; i.e. Single Real, Double real, Single Integer, or Double Integer
|
||
; Arith is 0 for Arithmetic opetations (and compares), set to 1 otherwise
|
||
; Op mostly determines which type of operation to do though when not in
|
||
; memory format some of that is coded into MF and r/m
|
||
; All of the tables are set up to do a jump based upon one or more of the
|
||
; above fields. The outline for decoding instructions is:
|
||
;
|
||
; IF (memory format) THEN
|
||
; Assemble Effective Address (using MOD and r/m and EffectiveAddressTab)
|
||
; IF (Arith) THEN
|
||
; Load to the stack (using MF and FLDsdriTab)
|
||
; Do the Arithmetic Operation (using Op and ArithmeticOpTab)
|
||
; ELSE (memory format non- arithmetic)
|
||
; Do the operation (using Op and NonArithOpMemTab and
|
||
; depending on the case MF and one of the FLD or FST Tabs)
|
||
; ENDIF
|
||
; ELSE (Register format)
|
||
; IF (Arith) THEN
|
||
; Test r/m for legit Stack reference
|
||
; Do the Arithmetic Operation (using Op and ArithmeticOpTab)
|
||
; ELSE (non-arithmetic register format)
|
||
; Do the operation (using Op and NonArithOpRegTab and
|
||
; depending on the case r/m and one of:
|
||
; Constants, Miscellaneous, Transcendental, or Various Tabs)
|
||
|
||
EVEN
|
||
|
||
glb <EA286Tab>
|
||
|
||
eWORD EA286Tab ; Uses |r/m|MOD| for indexing
|
||
edw BXSI0D
|
||
edw BXSI1D
|
||
edw BXSI2D
|
||
edw NoEffectiveAddress
|
||
edw BXDI0D
|
||
edw BXDI1D
|
||
edw BXDI2D
|
||
edw NoEffectiveAddress
|
||
edw BPSI0D
|
||
edw BPSI1D
|
||
edw BPSI2D
|
||
edw NoEffectiveAddress
|
||
edw BPDI0D
|
||
edw BPDI1D
|
||
edw BPDI2D
|
||
edw NoEffectiveAddress
|
||
edw DSSI0D
|
||
edw DSSI1D
|
||
edw DSSI2D
|
||
edw NoEffectiveAddress
|
||
edw DSDI0D
|
||
edw DSDI1D
|
||
edw DSDI2D
|
||
edw NoEffectiveAddress
|
||
edw DSXI2D
|
||
edw BPXI1D
|
||
edw BPXI2D
|
||
edw NoEffectiveAddress
|
||
edw BXXI0D
|
||
edw BXXI1D
|
||
edw BXXI2D
|
||
edw NoEffectiveAddress
|
||
|
||
|
||
ifdef i386
|
||
|
||
glb <EA386Tab>
|
||
|
||
eWORD EA386Tab ; Uses |r/m|MOD| for indexing
|
||
|
||
edw Exx00 ; eax
|
||
edw Exx01
|
||
edw Exx10
|
||
edw NoEffectiveAddress
|
||
edw Exx00 ; ecx
|
||
edw Exx01
|
||
edw Exx10
|
||
edw NoEffectiveAddress
|
||
edw Exx00 ; edx
|
||
edw Exx01
|
||
edw Exx10
|
||
edw NoEffectiveAddress
|
||
edw Exx00 ; ebx
|
||
edw Exx01
|
||
edw Exx10
|
||
edw NoEffectiveAddress
|
||
edw SIB00 ; esp (S-I-B follows)
|
||
edw SIB01
|
||
edw SIB10
|
||
edw NoEffectiveAddress
|
||
edw Direct386 ; ebp (00 = direct addressing)
|
||
edw Exx01
|
||
edw Exx10
|
||
edw NoEffectiveAddress
|
||
edw Exx00 ; esi
|
||
edw Exx01
|
||
edw Exx10
|
||
edw NoEffectiveAddress
|
||
edw Exx00 ; edi
|
||
edw Exx01
|
||
edw Exx10
|
||
edw NoEffectiveAddress
|
||
|
||
endif ;i386
|
||
|
||
|
||
glb <ArithmeticOpTab>
|
||
|
||
eWORD ArithmeticOpTab ; Uses |Op| for indexing
|
||
edw ADDRQQ ;FADD
|
||
edw MUDRQQ ;FMUL
|
||
edw eFCOM ;FCOM
|
||
edw eFCOMP ;FCOMP
|
||
edw SUDRQQ ;FSUB
|
||
edw SVDRQQ ;FSUBR
|
||
edw DIDRQQ ;FDIV
|
||
edw DRDRQQ ;FDIVR
|
||
|
||
|
||
glb <NonArithOpMemTab>
|
||
|
||
eWORD NonArithOpMemTab ; Uses |Op| for indexing
|
||
edw eFLDsdri ;load(single/double,real/integer)
|
||
edw UNUSED ;reserved
|
||
edw eFSTsdri ;Store(single/double,real/integer)
|
||
edw eFSTPsdri ;Store and POP (single/double,real/integer)
|
||
edw UNUSED ;reserved
|
||
edw eFLDtempORcw ;Load(TempReal or LongInteger), FLDCW
|
||
edw UNUSED ;reserved
|
||
edw eFSTtempORcw ;Store(TempReal or LongInteger), FSTCW ,FSTSW
|
||
|
||
|
||
glb <NonArithOpRegTab>
|
||
|
||
eWORD NonArithOpRegTab ; Uses |Op| for indexing
|
||
edw eFLDregOrFFREE ;load(register), FFREE
|
||
edw eFXCHGreg ;FXCHG
|
||
edw eFSTreg ;Store(register),FNOP
|
||
edw eFSTPreg ;Store and POP (register)
|
||
edw eMISCELANEOUS ;FCHS, FABS, FTST, FXAM, FINIT, FENI, FDISI, FCLEX
|
||
edw eFLDconstants ;FLD1, FLDL2T, FLDL2E, FLDPI, FLDLG2, FLDLN2, FLDZ
|
||
edw etranscendental ;F2XM1, FYL2X, FPTAN, FPATAN, FXTRACT, FDECSTP, FINCSTP
|
||
edw eVARIOUS ;FPREM, FYL2XP1, FSQRT, FRNDINT, FSCALE
|
||
|
||
|
||
glb <FLDsdriTab>
|
||
|
||
eWORD FLDsdriTab ; Uses |MF| for indexing
|
||
edw eFLDsr ;load single real
|
||
edw eFLDdi ;load double integer
|
||
edw eFLDdr ;load double real
|
||
edw eFLDsi ;load single integer
|
||
|
||
|
||
glb <FSTsdriTab>
|
||
|
||
eWORD FSTsdriTab ; Uses |MF| for indexing
|
||
edw eFSTsr ;store single real
|
||
edw eFSTdi ;store double integer
|
||
edw eFSTdr ;store double real
|
||
edw eFSTsi ;store single integer
|
||
|
||
|
||
glb <FLDtempORcwTab>
|
||
|
||
eWORD FLDtempORcwTab ; Uses |MF| for indexing
|
||
edw eFLDCW ;load control word
|
||
edw eFLDtemp ;load temp real
|
||
edw UNUSED ;reserved
|
||
edw eFLDlongint ;load long integer
|
||
|
||
|
||
glb <FSTtempORcwTab>
|
||
|
||
eWORD FSTtempORcwTab ; Uses |MF| for indexing
|
||
edw eFSTCW ;store control word
|
||
edw eFSTtemp ;store temp real
|
||
edw eFSTSW ;store status word
|
||
edw eFSTlongint ;store long integer
|
||
|
||
|
||
glb <FLDconstantsTab>
|
||
|
||
eWORD FLDconstantsTab ; Uses |r/m| for indexing
|
||
edw eFLD1
|
||
edw eFLDL2T
|
||
edw eFLDL2E
|
||
edw eFLDPI
|
||
edw eFLDLG2
|
||
edw eFLDLN2
|
||
edw eFLDZ
|
||
edw UNUSED ;reserved
|
||
|
||
|
||
glb <TranscendentalTab>
|
||
|
||
eWORD TranscendentalTab ; Uses |r/m| for indexing
|
||
edw eF2XM1
|
||
edw eFYL2X
|
||
edw eFPTAN
|
||
edw eFPATAN
|
||
edw eFXTRACT
|
||
edw UNUSED ;reserved
|
||
edw eFDECSTP
|
||
edw eFINCSTP
|
||
|
||
|
||
glb <VariousTab>
|
||
|
||
eWORD VariousTab ; Uses |r/m| for indexing
|
||
edw eFPREM
|
||
edw eFYL2XP1
|
||
edw eFSQRT
|
||
edw UNUSED ;reserved
|
||
edw eFRNDINT
|
||
edw eFSCALE
|
||
edw UNUSED ;reserved
|
||
edw UNUSED ;reserved
|
||
|
||
|
||
glb <COMtab>
|
||
|
||
eWORD COMtab ; SI DI
|
||
edw COMvalidvalid ; valid valid
|
||
edw COMsignSI ; valid zero
|
||
edw COMincomprable ; valid NAN
|
||
edw COMsignDIinf ; valid INF
|
||
edw COMsignDI ; zero valid
|
||
edw COMequal ; zero zero
|
||
edw COMincomprable ; zero NAN
|
||
edw COMsignDIinf ; zero INF
|
||
edw COMincomprable ; NAN valid
|
||
edw COMincomprable ; NAN zero
|
||
edw COMincomprable ; NAN NAN
|
||
edw COMincomprable ; NAN INF
|
||
edw COMsignSIinf ; INF valid
|
||
edw COMsignSIinf ; INF zero
|
||
edw COMincomprable ; INF NAN
|
||
edw COMinfinf ; INF INF
|
||
|
||
|
||
glb <TSTtab>
|
||
|
||
eWORD TSTtab
|
||
edw COMsignSI ; valid
|
||
edw COMequal ; zero
|
||
edw COMincomprable ; NAN
|
||
edw COMsignSIinf ; INF
|
||
|
||
|
||
glb <ADDJMPTAB>
|
||
|
||
eWORD ADDJMPTAB
|
||
eWORD TAJRQQ
|
||
edw RADRQQ ; 0000 D Valid non-0, S Valid non-0
|
||
edw DDD ; 0001 D Valid non-0, S 0
|
||
edw SSINV ; 0010 D Valid non-0, S NAN
|
||
edw SSS ; 0011 D Valid non-0, S Inf
|
||
edw SSS ; 0100 D 0, S Valid non-0
|
||
edw DDD ; 0101 D 0, S 0
|
||
edw SSINV ; 0110 D 0, S NAN
|
||
edw SSS ; 0111 D 0, S Inf
|
||
edw DDINV ; 1000 D NAN, S Valid non-0
|
||
edw DDINV ; 1001 D NAN, S 0
|
||
edw BIGNAN ; 1010 D NAN, S NAN
|
||
edw DDINV ; 1011 D NAN, S Inf
|
||
edw DDD ; 1100 D Inf, S Valid non-0
|
||
edw DDD ; 1101 D Inf, S 0
|
||
edw SSINV ; 1110 D Inf, S NAN
|
||
edw INFINF ; 1111 D Inf, S Inf
|
||
|
||
|
||
glb <MULJMPTAB>
|
||
|
||
eWORD MULJMPTAB
|
||
eWORD TMJRQQ
|
||
edw RMDRQQ ; 0000 D Valid non-0, S Valid non-0
|
||
edw ZEROS ; 0001 D Valid non-0, S 0
|
||
edw SSINV ; 0010 D Valid non-0, S NAN
|
||
edw INFS ; 0011 D Valid non-0, S Inf
|
||
edw ZEROS ; 0100 D 0, S Valid non-0
|
||
edw ZEROS ; 0101 D 0, S 0
|
||
edw SSINV ; 0110 D 0, S NAN
|
||
edw INDINV ; 0111 D 0, S Inf
|
||
edw DDINV ; 1000 D NAN, S Valid non-0
|
||
edw DDINV ; 1001 D NAN, S 0
|
||
edw BIGNAN ; 1010 D NAN, S NAN
|
||
edw DDINV ; 1011 D NAN, S Inf
|
||
edw INFS ; 1100 D Inf, S Valid non-0
|
||
edw INDINV ; 1101 D Inf, S 0
|
||
edw SSINV ; 1110 D Inf, S NAN
|
||
edw INFS ; 1111 D Inf, S Inf
|
||
|
||
|
||
glb <DIVJMPTAB>
|
||
|
||
eWORD DIVJMPTAB
|
||
eWORD TDJRQQ
|
||
edw RDDRQQ ; 0000 D Valid non-0, S Valid non-0
|
||
edw ZEROS ; 0001 D Valid non-0, S 0
|
||
edw SSINV ; 0010 D Valid non-0, S NAN
|
||
edw INFS ; 0011 D Valid non-0, S Inf
|
||
edw DIV0 ; 0100 D 0, S Valid non-0
|
||
edw D0INDINV ; 0101 D 0, S 0
|
||
edw D0SSINV ; 0110 D 0, S NAN
|
||
edw DIV0 ; 0111 D 0, S Inf
|
||
edw DDINV ; 1000 D NAN, S Valid non-0
|
||
edw DDINV ; 1001 D NAN, S 0
|
||
edw BIGNAN ; 1010 D NAN, S NAN
|
||
edw DDINV ; 1011 D NAN, S Inf
|
||
edw ZEROS ; 1100 D Inf, S Valid non-0
|
||
edw ZEROS ; 1101 D Inf, S 0
|
||
edw SSINV ; 1110 D Inf, S NAN
|
||
edw INDINV ; 1111 D Inf, S Inf
|
||
|
||
|
||
glb <XAMtab>
|
||
|
||
; Tag Flag C3 C2 C1 C0 meaning
|
||
XAMtab DB 04H ; 00 0 0 1 0 0 Positive Normal
|
||
DB 06H ; 00 1 0 1 1 0 Negative Normal
|
||
DB 40H ; 01 0 1 0 0 0 Positive Zero
|
||
DB 42H ; 01 1 1 0 1 0 Negative Zero
|
||
DB 01H ; 10 0 0 0 0 1 Positive NAN
|
||
DB 03H ; 10 1 0 0 1 1 Negative NAN
|
||
DB 05H ; 11 0 0 1 0 1 Positive Infinity
|
||
DB 07H ; 11 1 0 1 1 1 Negative Infinity
|
||
|