subttl	emdisp.asm - Emulator Dispatch Tables
	page
;
;	 IBM/Microsoft Confidential
;
;	 Copyright (c) IBM Corporation 1987, 1989
;	 Copyright (c) Microsoft Corporation 1987, 1989
;
;	 All Rights Reserved
;
;Revision History:  (also see emulator.hst)
;
;    1/21/92  JWM   Minor modifications for DOSX32 emulator
;    8/23/91  TP    Direct dispatch off of 6-bit opcode
;   10/30/89  WAJ   Added this header.
;
;*******************************************************************************

;*********************************************************************;
;								      ;
;		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)
;	       Jump through table to operation, using MF, Arith and Op bits
;	    ELSE (Register format)
;	       Jump through table to operation, using MF, Arith and Op bits

	ALIGN	4

;*********************************************************************;
;
; Memory address calculation tables

EA386Tab	label	dword			; Uses |r/m|MOD+1| for indexing
	dd	NoEffectiveAddress
	dd	Exx00			; eax
	dd	Exx01
	dd	Exx10
	dd	NoEffectiveAddress
	dd	Exx00			; ecx
	dd	Exx01
	dd	Exx10
	dd	NoEffectiveAddress
	dd	Exx00			; edx
	dd	Exx01
	dd	Exx10
	dd	NoEffectiveAddress
	dd	Exx00			; ebx
	dd	Exx01
	dd	Exx10
	dd	NoEffectiveAddress
	dd	SIB00			; esp (S-I-B follows)
	dd	SIB01
	dd	SIB10
	dd	NoEffectiveAddress
	dd	Direct386		; ebp (00 = direct addressing)
	dd	Exx01
	dd	Exx10
	dd	NoEffectiveAddress
	dd	Exx00			; esi
	dd	Exx01
	dd	Exx10
	dd	NoEffectiveAddress
	dd	Exx00			; edi
	dd	Exx01
	dd	Exx10

;*********************************************************************;
;
;Opcode dispatching tables
;Indexed by  | op1 | op2 |0 0|  (op1 = MF|Arith)

	public	tOpRegDisp
tOpRegDisp	label	dword
	dd	eFADDtop
	dd	eFMULtop
	dd	eFCOM
	dd	eFCOMP
	dd	eFSUBtop
	dd	eFSUBRtop
	dd	eFDIVtop
	dd	eFDIVRtop

	dd	eFLDreg
	dd	eFXCH
	dd	eFNOP		;UNDONE: also reserved on 387
	dd	eFSTP		;Special form 1
	dd	GroupFCHS	;FCHS,FABS,FTST,FXAM
	dd	GroupFLD1	;FLD1,FLDL2T,FLDL2E,FLDPI,FLDLG2,FLDLN2,FLDZ
	dd	GroupF2XM1	;F2XM1,FYL2X,FPTAN,FPATAN,FXTRACT,FPREM1,FDECSTP,FINCSTP
	dd	GroupFPREM	;FPREM,FYL2XP1,FSQRT,FSINCOS,FRNDINT,FSCALE,FSIN,FCOS

	dd	UNUSED
	dd	UNUSED
	dd	UNUSED
	dd	UNUSED
	dd	UNUSED
	dd	eFUCOMPP	;UNDONE: also reserved on 387
	dd	UNUSED
	dd	UNUSED

	dd	UNUSED
	dd	UNUSED
	dd	UNUSED
	dd	UNUSED
	dd	GroupFENI	;FENI,FDISI,FCLEX,FINIT
	dd	UNUSED
	dd	UNUSED
	dd	UNUSED

	dd	eFADDreg
	dd	eFMULreg
	dd	eFCOM		;Special form  2
	dd	eFCOMP		;Special form  3
	dd	eFSUBRreg
	dd	eFSUBreg
	dd	eFDIVRreg
	dd	eFDIVreg

	dd	eFFREE
	dd	eFXCH		;Special form 4
	dd	eFST
	dd	eFSTP
	dd	eFUCOM
	dd	eFUCOMP
	dd	UNUSED
	dd	UNUSED

	dd	eFADDPreg
	dd	eFMULPreg
	dd	eFCOMP		;Special form 5
	dd	eFCOMPP		;UNDONE: also reserved on 387
	dd	eFSUBRPreg
	dd	eFSUBPreg
	dd	eFDIVRPreg
	dd	eFDIVPreg

	dd	eFFREE		;Special form 6 UNDONE: "and pop stack"?
	dd	eFXCH		;Special form 7
	dd	eFSTP		;Special form 8
	dd	eFSTP		;Special form 9
	dd	eFSTSWax	;UNDONE: also reserved on 387
	dd	UNUSED
	dd	UNUSED
	dd	UNUSED


tOpMemDisp	label	dword
;MF = 00 (32-bit Real), Arith = 0
	dd	eFADD32
	dd	eFMUL32
	dd	eFCOM32
	dd	eFCOMP32
	dd	eFSUB32
	dd	eFSUBR32
	dd	eFDIV32
	dd	eFDIVR32
;MF = 00 (32-bit Real), Arith = 1
	dd	eFLD32
	dd	UNUSED
	dd	eFST32
	dd	eFSTP32
	dd	eFLDENV
	dd	eFLDCW
	dd	eFSTENV
	dd	eFSTCW
;MF = 01 (32-bit Int), Arith = 0
	dd	eFIADD32
	dd	eFIMUL32
	dd	eFICOM32
	dd	eFICOMP32
	dd	eFISUB32
	dd	eFISUBR32
	dd	eFIDIV32
	dd	eFIDIVR32
;MF = 01 (32-bit Int), Arith = 1
	dd	eFILD32
	dd	UNUSED
	dd	eFIST32
	dd	eFISTP32
	dd	UNUSED
	dd	eFLD80
	dd	UNUSED
	dd	eFSTP80
;MF = 10 (64-bit Real), Arith = 0
	dd	eFADD64
	dd	eFMUL64
	dd	eFCOM64
	dd	eFCOMP64
	dd	eFSUB64
	dd	eFSUBR64
	dd	eFDIV64
	dd	eFDIVR64
;MF = 10 (64-bit Real), Arith = 1
	dd	eFLD64
	dd	UNUSED
	dd	eFST64
	dd	eFSTP64
	dd	eFRSTOR
	dd	UNUSED
	dd	eFSAVE
	dd	eFSTSW
;MF = 11 (16-bit Int), Arith = 0
	dd	eFIADD16
	dd	eFIMUL16
	dd	eFICOM16
	dd	eFICOMP16
	dd	eFISUB16
	dd	eFISUBR16
	dd	eFIDIV16
	dd	eFIDIVR16
;MF = 11 (16-bit Int), Arith = 1
	dd	eFILD16
	dd	UNUSED
	dd	eFIST16
	dd	eFISTP16
	dd	eFBLD
	dd	eFILD64
	dd	eFBSTP
	dd	eFISTP64


tGroupFLD1disp	label	dword
	dd	eFLD1
	dd	eFLDL2T
	dd	eFLDL2E
	dd	eFLDPI
	dd	eFLDLG2
	dd	eFLDLN2
	dd	eFLDZ
	dd	UNUSED


tGroupF2XM1disp	label	dword
	dd	eF2XM1
	dd	eFYL2X
	dd	eFPTAN
	dd	eFPATAN
	dd	eFXTRACT
	dd	eFPREM1
	dd	eFDECSTP
	dd	eFINCSTP


tGroupFCHSdisp	label	dword
	dd	eFCHS
	dd	eFABS
	dd	UNUSED
	dd	UNUSED
	dd	eFTST
	dd	eFXAM
	dd	UNUSED
	dd	UNUSED


tGroupFPREMdisp	label	dword
	dd	eFPREM
	dd	eFYL2XP1
	dd	eFSQRT
	dd	eFSINCOS
	dd	eFRNDINT
	dd	eFSCALE
	dd	eFSIN
	dd	eFCOS


tGroupFENIdisp	label	dword
	dd	eFENI
	dd	eFDISI
	dd	eFCLEX
	dd	eFINIT
	dd	eFSETPM
	dd	UNUSED
	dd	UNUSED
	dd	UNUSED