Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

298 lines
5.7 KiB

  1. subttl emdisp.asm - Emulator Dispatch Tables
  2. page
  3. ;
  4. ; IBM/Microsoft Confidential
  5. ;
  6. ; Copyright (c) IBM Corporation 1987, 1989
  7. ; Copyright (c) Microsoft Corporation 1987, 1989
  8. ;
  9. ; All Rights Reserved
  10. ;
  11. ;Revision History: (also see emulator.hst)
  12. ;
  13. ; 1/21/92 JWM Minor modifications for DOSX32 emulator
  14. ; 8/23/91 TP Direct dispatch off of 6-bit opcode
  15. ; 10/30/89 WAJ Added this header.
  16. ;
  17. ;*******************************************************************************
  18. ;*********************************************************************;
  19. ; ;
  20. ; Dispatch Tables ;
  21. ; ;
  22. ;*********************************************************************;
  23. ; These tables are based upon the layout of the 8087 instructions
  24. ;
  25. ; 8087 instruction fields: |escape|MF|Arith|MOD|Op|r/m|disp1|disp2|
  26. ; field length in bits: 5 2 1 2 3 3 8 8
  27. ;
  28. ; Disp1 and Disp2 are optional address bytes present only if MOD <> 11.
  29. ; When (MOD <> 11) r/m describes which regs (SI,DI,BX,BP) are added to
  30. ; Disp1 and Disp2 to calculate the effective address. This form
  31. ; (memory format) is used for Loads, Stores, Compares, and Arithmetic
  32. ; When using memory format MF determines the Type of the Memory operand
  33. ; i.e. Single Real, Double real, Single Integer, or Double Integer
  34. ; Arith is 0 for Arithmetic opetations (and compares), set to 1 otherwise
  35. ; Op mostly determines which type of operation to do though when not in
  36. ; memory format some of that is coded into MF and r/m
  37. ; All of the tables are set up to do a jump based upon one or more of the
  38. ; above fields. The outline for decoding instructions is:
  39. ;
  40. ; IF (memory format) THEN
  41. ; Assemble Effective Address (using MOD and r/m and EffectiveAddressTab)
  42. ; Jump through table to operation, using MF, Arith and Op bits
  43. ; ELSE (Register format)
  44. ; Jump through table to operation, using MF, Arith and Op bits
  45. ALIGN 4
  46. ;*********************************************************************;
  47. ;
  48. ; Memory address calculation tables
  49. EA386Tab label dword ; Uses |r/m|MOD+1| for indexing
  50. dd NoEffectiveAddress
  51. dd Exx00 ; eax
  52. dd Exx01
  53. dd Exx10
  54. dd NoEffectiveAddress
  55. dd Exx00 ; ecx
  56. dd Exx01
  57. dd Exx10
  58. dd NoEffectiveAddress
  59. dd Exx00 ; edx
  60. dd Exx01
  61. dd Exx10
  62. dd NoEffectiveAddress
  63. dd Exx00 ; ebx
  64. dd Exx01
  65. dd Exx10
  66. dd NoEffectiveAddress
  67. dd SIB00 ; esp (S-I-B follows)
  68. dd SIB01
  69. dd SIB10
  70. dd NoEffectiveAddress
  71. dd Direct386 ; ebp (00 = direct addressing)
  72. dd Exx01
  73. dd Exx10
  74. dd NoEffectiveAddress
  75. dd Exx00 ; esi
  76. dd Exx01
  77. dd Exx10
  78. dd NoEffectiveAddress
  79. dd Exx00 ; edi
  80. dd Exx01
  81. dd Exx10
  82. ;*********************************************************************;
  83. ;
  84. ;Opcode dispatching tables
  85. ;Indexed by | op1 | op2 |0 0| (op1 = MF|Arith)
  86. public tOpRegDisp
  87. tOpRegDisp label dword
  88. dd eFADDtop
  89. dd eFMULtop
  90. dd eFCOM
  91. dd eFCOMP
  92. dd eFSUBtop
  93. dd eFSUBRtop
  94. dd eFDIVtop
  95. dd eFDIVRtop
  96. dd eFLDreg
  97. dd eFXCH
  98. dd eFNOP ;UNDONE: also reserved on 387
  99. dd eFSTP ;Special form 1
  100. dd GroupFCHS ;FCHS,FABS,FTST,FXAM
  101. dd GroupFLD1 ;FLD1,FLDL2T,FLDL2E,FLDPI,FLDLG2,FLDLN2,FLDZ
  102. dd GroupF2XM1 ;F2XM1,FYL2X,FPTAN,FPATAN,FXTRACT,FPREM1,FDECSTP,FINCSTP
  103. dd GroupFPREM ;FPREM,FYL2XP1,FSQRT,FSINCOS,FRNDINT,FSCALE,FSIN,FCOS
  104. dd UNUSED
  105. dd UNUSED
  106. dd UNUSED
  107. dd UNUSED
  108. dd UNUSED
  109. dd eFUCOMPP ;UNDONE: also reserved on 387
  110. dd UNUSED
  111. dd UNUSED
  112. dd UNUSED
  113. dd UNUSED
  114. dd UNUSED
  115. dd UNUSED
  116. dd GroupFENI ;FENI,FDISI,FCLEX,FINIT
  117. dd UNUSED
  118. dd UNUSED
  119. dd UNUSED
  120. dd eFADDreg
  121. dd eFMULreg
  122. dd eFCOM ;Special form 2
  123. dd eFCOMP ;Special form 3
  124. dd eFSUBRreg
  125. dd eFSUBreg
  126. dd eFDIVRreg
  127. dd eFDIVreg
  128. dd eFFREE
  129. dd eFXCH ;Special form 4
  130. dd eFST
  131. dd eFSTP
  132. dd eFUCOM
  133. dd eFUCOMP
  134. dd UNUSED
  135. dd UNUSED
  136. dd eFADDPreg
  137. dd eFMULPreg
  138. dd eFCOMP ;Special form 5
  139. dd eFCOMPP ;UNDONE: also reserved on 387
  140. dd eFSUBRPreg
  141. dd eFSUBPreg
  142. dd eFDIVRPreg
  143. dd eFDIVPreg
  144. dd eFFREE ;Special form 6 UNDONE: "and pop stack"?
  145. dd eFXCH ;Special form 7
  146. dd eFSTP ;Special form 8
  147. dd eFSTP ;Special form 9
  148. dd eFSTSWax ;UNDONE: also reserved on 387
  149. dd UNUSED
  150. dd UNUSED
  151. dd UNUSED
  152. tOpMemDisp label dword
  153. ;MF = 00 (32-bit Real), Arith = 0
  154. dd eFADD32
  155. dd eFMUL32
  156. dd eFCOM32
  157. dd eFCOMP32
  158. dd eFSUB32
  159. dd eFSUBR32
  160. dd eFDIV32
  161. dd eFDIVR32
  162. ;MF = 00 (32-bit Real), Arith = 1
  163. dd eFLD32
  164. dd UNUSED
  165. dd eFST32
  166. dd eFSTP32
  167. dd eFLDENV
  168. dd eFLDCW
  169. dd eFSTENV
  170. dd eFSTCW
  171. ;MF = 01 (32-bit Int), Arith = 0
  172. dd eFIADD32
  173. dd eFIMUL32
  174. dd eFICOM32
  175. dd eFICOMP32
  176. dd eFISUB32
  177. dd eFISUBR32
  178. dd eFIDIV32
  179. dd eFIDIVR32
  180. ;MF = 01 (32-bit Int), Arith = 1
  181. dd eFILD32
  182. dd UNUSED
  183. dd eFIST32
  184. dd eFISTP32
  185. dd UNUSED
  186. dd eFLD80
  187. dd UNUSED
  188. dd eFSTP80
  189. ;MF = 10 (64-bit Real), Arith = 0
  190. dd eFADD64
  191. dd eFMUL64
  192. dd eFCOM64
  193. dd eFCOMP64
  194. dd eFSUB64
  195. dd eFSUBR64
  196. dd eFDIV64
  197. dd eFDIVR64
  198. ;MF = 10 (64-bit Real), Arith = 1
  199. dd eFLD64
  200. dd UNUSED
  201. dd eFST64
  202. dd eFSTP64
  203. dd eFRSTOR
  204. dd UNUSED
  205. dd eFSAVE
  206. dd eFSTSW
  207. ;MF = 11 (16-bit Int), Arith = 0
  208. dd eFIADD16
  209. dd eFIMUL16
  210. dd eFICOM16
  211. dd eFICOMP16
  212. dd eFISUB16
  213. dd eFISUBR16
  214. dd eFIDIV16
  215. dd eFIDIVR16
  216. ;MF = 11 (16-bit Int), Arith = 1
  217. dd eFILD16
  218. dd UNUSED
  219. dd eFIST16
  220. dd eFISTP16
  221. dd eFBLD
  222. dd eFILD64
  223. dd eFBSTP
  224. dd eFISTP64
  225. tGroupFLD1disp label dword
  226. dd eFLD1
  227. dd eFLDL2T
  228. dd eFLDL2E
  229. dd eFLDPI
  230. dd eFLDLG2
  231. dd eFLDLN2
  232. dd eFLDZ
  233. dd UNUSED
  234. tGroupF2XM1disp label dword
  235. dd eF2XM1
  236. dd eFYL2X
  237. dd eFPTAN
  238. dd eFPATAN
  239. dd eFXTRACT
  240. dd eFPREM1
  241. dd eFDECSTP
  242. dd eFINCSTP
  243. tGroupFCHSdisp label dword
  244. dd eFCHS
  245. dd eFABS
  246. dd UNUSED
  247. dd UNUSED
  248. dd eFTST
  249. dd eFXAM
  250. dd UNUSED
  251. dd UNUSED
  252. tGroupFPREMdisp label dword
  253. dd eFPREM
  254. dd eFYL2XP1
  255. dd eFSQRT
  256. dd eFSINCOS
  257. dd eFRNDINT
  258. dd eFSCALE
  259. dd eFSIN
  260. dd eFCOS
  261. tGroupFENIdisp label dword
  262. dd eFENI
  263. dd eFDISI
  264. dd eFCLEX
  265. dd eFINIT
  266. dd eFSETPM
  267. dd UNUSED
  268. dd UNUSED
  269. dd UNUSED