home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / MISC / PASM386C.ZIP / DASM386.SEQ < prev    next >
Encoding:
Text File  |  1989-09-30  |  52.7 KB  |  1,757 lines

  1. \ Dasm386.Seq            80386/80386SX Disassembler
  2.  
  3. Comment:
  4.  
  5. \ Pasm386.seq Version 1.0
  6. \
  7. \       Updated 30 Sep 89, Gene Czarcinski
  8. \               - Enhance to support 386 opcodes (for PASM386)
  9. \               - restructure source to make it more readable
  10. \                 and updatable.
  11. \               - Add support for the 8087/80287/80387
  12. \               - Add support for Extended Size Registers and operands.
  13. \               - Add support for Extended Addressing Size (32 bit, etc.)
  14. \                 including new base/index registers, "scaling", and
  15. \                 32-bit displacement/addresses.
  16. \               - add BEHEADing
  17.  
  18. ** Note:        The "code error checking" in this disassembler is NOT
  19.                 complete.  That is, a correct program (no bad opcodes or
  20.                 options) will be correct but incorrect opcodes, etc. may
  21.                 NOT be interpreted correctly.  For example, currently
  22.                 invalid 386 control registers are defined as correct.
  23.  
  24. ** Note:        Pasm386 does NOT need a 286 or 386 to load and execute.
  25.  
  26.  
  27. \ DIS8086.SEQ   8086 Disassembler  by Charles Curley
  28.  
  29.   PREFIX  \ Conversion by  Bill Muench  9 September 88  Fixes
  30.  
  31. \ More 'Not Used' Trapped
  32. \ XCHGA for NOP  FES for 8reg INC DEC
  33. \ REP REPNE  MUL/DIV  POP CS  ESC
  34.  
  35. Comment;
  36.  
  37. \ ===========================================================================
  38. \ ===========================================================================
  39.  
  40. ONLY FORTH ALSO DEFINITIONS
  41.  
  42. DECIMAL
  43. WARNING OFF
  44. PreFix
  45.  
  46. VOCABULARY DASM386
  47.  
  48. Dasm386 also Definitions
  49.  
  50. HEADERLESS      \ ***********************************************************
  51.  
  52. \ ===========================================================================
  53. \ ===========================================================================
  54.  
  55. \ For Speed:
  56.  
  57. CODE 2/S        ( n ct - n'| shift n right ct )
  58.   POP CX
  59.   POP AX
  60.   SHR AX, CL
  61.   1PUSH
  62. END-CODE
  63.  
  64. CODE 2*S        ( n ct - n'| shift n left  ct )
  65.   POP CX
  66.   POP AX
  67.   SHL AX, CL
  68.   1PUSH
  69. END-CODE
  70.  
  71. CODE SEXT       ( n - n' | sign extend byte to word )
  72.   POP AX
  73.   CBW
  74.   1PUSH
  75. END-CODE
  76.  
  77. \ Locate existing INTerrupts
  78.  
  79. CODE #INT2@     ( int# - seg off )
  80.                 POP AX        \ int#
  81.                 MOV AH, # $35 \ cmd
  82.                 PUSH ES       \ save ES
  83.                 INT $21       \ DOS
  84.                 POP AX        \ get ES
  85.                 PUSH ES       \ seg
  86.                 PUSH BX       \ off
  87.                 MOV ES, AX    \ restore ES
  88.                 NEXT
  89. END-CODE
  90.  
  91. \ ===========================================================================
  92.  
  93. : (.H2)         ( n -- )        \ 2 hex digits
  94.                 0 <# # # #>
  95.                 type ;
  96.  
  97. : .H2           (.H2) space ;
  98.  
  99. : (.H4)         ( n -- )        \ 4 hex digits
  100.                 0 <# # # # # #>
  101.                 type ;
  102.  
  103. : .H4           (.H4) space ;
  104.  
  105. : COL           ( n )
  106.                 dup #OUT @ <= if CR then
  107.                 #OUT @ - SPACES ;
  108.  
  109. VARIABLE SYMBOLIC \ Show registers as FORTH registers
  110.   SYMBOLIC ON
  111.  
  112. VARIABLE ID0      \ DisAssembly NAME delay in ms
  113.   700 ID0 !
  114.  
  115. Variable Osize          \ Operand Size Flag
  116.          Osize off
  117.  
  118. Variable Asize          \ Address Size Flag
  119.          Asize off
  120.  
  121. VARIABLE CP     \ Current Pointer to Instruction "data" being processed
  122. VARIABLE OPS    \ operand count
  123. VARIABLE DISP   \ 2nd operand ext, flag, ct
  124.  
  125. \ ===========================================================================
  126.  
  127. : .NA           ( n )                   \ unknown opcode
  128.                 ."   ??? " .h2 ;
  129.  
  130. : .NA0          ( n - n )               \ more of unknown opcode
  131.                 DUP .NA ;
  132.  
  133. : .NA1          ( op ext )              \ unknown "sub" opcode
  134.                 SWAP .NA .h2 ;
  135.  
  136. : .NA2          ( op1 op2 ext )         \ unknown "sub" opcode
  137.                 rot  .NA
  138.                 swap .h2 .h2 ;
  139.  
  140. \ Avoid name conflicts *************************
  141.  
  142. : LOOPP         [COMPILE] LOOP ; IMMEDIATE
  143.  
  144. : LEAVEE        [COMPILE] LEAVE ; Immediate
  145.  
  146. : ANDD          AND ;
  147.  
  148. : ORR           OR ;
  149.  
  150. : XORR          XOR ;
  151.  
  152. : NOTT          NOT ;
  153.  
  154. : Osize@        Osize @ ;
  155.  
  156. : Asize@        Asize @ ;
  157.  
  158. : T@            ( a - w )
  159.                 DUMPSEG @ swap @L ;
  160.  
  161. : TC@           ( a - n )
  162.                 DUMPSEG @ swap C@L ;
  163.  
  164. : NEXTB         ( - n )                 \ get next byte, bump current-pointer
  165.                 CP @ TC@ 1 CP +! ;
  166.  
  167. : NEXTW         ( - w )                 \ get next word, bump current-pointer
  168.                 CP @ T@  2 CP +! ;
  169.  
  170. \ ===========================================================================
  171.  
  172. : DUMP|         ( a n )
  173.                 BOUNDS DO
  174.                     I TC@ .h2
  175.                 LOOPP ;
  176.  
  177. : %type         ( a n )
  178.                 BOUNDS DO
  179.                      I TC@
  180.                      DUP
  181.                      $7F $20
  182.                      OVER - >R - R>
  183.                      U< IF
  184.                          DROP ASCII ~
  185.                      THEN
  186.                      EMIT
  187.                 LOOPP ;
  188.  
  189. \ ===========================================================================
  190.  
  191. : .#
  192.                 ."  # " ;
  193.  
  194. : .,
  195.                 ." , " ;
  196.  
  197. : ?.,           ( op - op )
  198.                 DUP $0C7 ANDD 6
  199.                 <> IF
  200.                      .,
  201.                 THEN ;
  202.  
  203. : .FAR
  204.                 ." FAR " ;
  205.  
  206. \ ===========================================================================
  207.  
  208. : NULL ;
  209.  
  210. : .ID|          ( nf \ no trailing space )
  211.                 DUP 1+
  212.                 DUP YC@
  213.                 ROT YC@
  214.                 31 AND 0 ?DO
  215.                    DUP 127 AND
  216.                    FEMIT 128 AND
  217.                    IF
  218.                         ASCII _ 128 OR
  219.                    ELSE
  220.                         1+ DUP YC@
  221.                    THEN
  222.                 LOOP
  223.                 2DROP ;
  224.  
  225. : ID.L          ( a )
  226.                 #OUT @ SWAP
  227.                 .ID|
  228.                 #OUT @ - 8 +
  229.                 SPACES ;
  230.  
  231. : SELF.L        ( Left Justified Self-doc! )
  232.                 CREATE
  233.                       LAST @ ,
  234.                 DOES>
  235.                       @ ID.L ;
  236.  
  237. : .SELF         ( Self-doc! )
  238.                 CREATE
  239.                       LAST @ ,
  240.                 DOES>
  241.                       @ .ID| ;
  242.  
  243.  
  244. \ ===========================================================================
  245.  
  246. HEADERS         \ ***********************************************************
  247.  
  248. \ Register Definitions
  249.  
  250. .self  EAX      .self  EBX      .self  ECX      .self  EDX
  251. .self  ESI      .self  EDI      .self  ESP      .self  EBP
  252. .self  CR0      .self  CR1      .self  CR2      .self  CR3
  253. .self  CR4      .self  CR5      .self  CR6      .self  CR7
  254. .self  DR0      .self  DR1      .self  DR2      .self  DR3
  255. .self  DR4      .self  DR5      .self  DR6      .self  DR7
  256. .self  TR0      .self  TR1      .self  TR2      .self  TR3
  257. .self  TR4      .self  TR5      .self  TR6      .self  TR7
  258.  
  259. .self ST
  260. .self ST(0)     .self ST(1)     .self ST(2)     .self ST(3)
  261. .self ST(4)     .self ST(5)     .self ST(6)     .self ST(7)
  262.  
  263. .self ES        .self CS        .self SS        .self  DS
  264. .self FS        .self GS
  265.  
  266. .SELF AL        .SELF AX        .SELF [BX+SI]   .self [EAX]
  267. .SELF CL        .SELF CX        .SELF [BX+DI]   .self [ECX]
  268. .SELF DL        .SELF DX        .SELF [BP+SI]   .self [EDX]
  269. .SELF BL        .SELF BX        .SELF [BP+DI]   .self [EBX]
  270. .SELF AH        .SELF SP        .SELF [SI]
  271. .SELF CH        .SELF BP        .SELF [DI]      .self [EBP]
  272. .SELF DH        .SELF SI        .SELF [BP]      .self [ESI]
  273. .SELF BH        .SELF DI        .SELF [BX]      .self [EDI]
  274.  
  275. .self *1        .self *2        .self *4        .self *8
  276. .SELF BYTE      .SELF WORD      .self DWORD
  277. .self BCD       .self REAL*4    .self REAL*8    .self REAL_TEMP
  278. .self Integer*2 .self Integer*4 .self Integer*8
  279.  
  280. \ ===========================================================================
  281.  
  282. \ Instruction Opcode Mnemonics
  283.  
  284. self.l  FADD    self.l  FMUL    self.l  FCOM    self.l  FCOMP
  285. self.l  FSUB    self.l  FSUBR   self.l  FDIV    self.l  FDIVR
  286. self.l  FUCOM   self.l  FUCOMP  self.l  FUCOMPP
  287. self.l  FSUBRP  self.l  FSUBP   self.l  FDIVRP  self.l  FDIVP
  288. self.l  FADDP   self.l  FMULP   self.l  FCOMPP
  289. self.l  FCLEX   self.l  FINIT
  290. self.l  FENI    self.l  FDISI   self.l  FSETPM  self.l  FFREEP
  291. self.l  FFREE   self.l  FXCH    self.l  FST     self.l  FSTP
  292. self.l  FLD     self.l  FNOP    self.l  FSAVE   self.l  FSTSW
  293. self.l  FCHS    self.l  FABS    self.l  FTST    self.l  FXAM
  294. self.l  FLD1    self.l  FLDL2T  self.l  FLDL2E  self.l  FLDPI
  295. self.l  FLDLG2  self.l  FLDLN2  self.l  FLDZ    self.l  FRSTOR
  296. self.l  F2XM1   self.l  FYL2X   self.l  FPTAN   self.l  FPATAN
  297. self.l  FXTRACT self.l  FPREM1  self.l  FDECSTP self.l  FINCSTP
  298. self.l  FPREM   self.l  FYL2XP1 self.l  FSQRT   self.l  FSINCOS
  299. self.l  FRNDINT self.l  FSCALE  self.l  FSIN    self.l  FCOS
  300. self.l  FLDENV  self.l  FLDCW   self.l  FSTENV  self.l  FSTCW
  301.  
  302. self.l CLTS
  303. self.l SGDT     self.l SIDT
  304. self.l LGDT     self.l LIDT
  305. self.l SMSW     self.l LMSW
  306. self.l SLDT     self.l STR
  307. self.l LLDT     self.l LTR
  308. self.l VERR     self.l VERW
  309.  
  310. self.l LSS      self.l LFS      self.l LGS
  311. self.l BSF      self.l BSR
  312. self.l BT       self.l BTS
  313. self.l BTR      self.l BTC
  314. self.l MOVSX    self.l MOVZX
  315. self.l SHLD     self.l SHRD
  316.  
  317. self.l INS      self.l OUTS
  318. self.l BOUND    self.l ARPL
  319. SELF.L LES      SELF.L LDS
  320. SELF.L INTO     SELF.L IRET
  321. SELF.L ENTER    SELF.L LEAVE
  322.  
  323. SELF.L JA       SELF.L JAE      SELF.L JB       SELF.L JBE
  324. SELF.L JE       SELF.L JG       SELF.L JGE      SELF.L JL
  325. SELF.L JLE      SELF.L JNE      SELF.L JNO      SELF.L JNS
  326. SELF.L JO       SELF.L JPE      SELF.L JPO      SELF.L JS
  327.  
  328. SELF.L SETA     SELF.L SETAE    SELF.L SETB     SELF.L SETBE
  329. SELF.L SETE     SELF.L SETG     SELF.L SETGE    SELF.L SETL
  330. SELF.L SETLE    SELF.L SETNE    SELF.L SETNO    SELF.L SETNS
  331. SELF.L SETO     SELF.L SETPE    SELF.L SETPO    SELF.L SETS
  332.  
  333. self.l AAM      self.l AAD      self.l XLAT
  334. SELF.L XCHG     SELF.L CBW      SELF.L CWD
  335. SELF.L JMP      SELF.L CALL
  336. SELF.L WAIT  SELF.L PUSHF  SELF.L POPF  SELF.L SAHF
  337. SELF.L LAHF  SELF.L TEST
  338. self.l MOVS     self.l CMPS     self.l STOS     self.l LODS
  339. self.l SCAS
  340. self.l RET      self.l INT
  341. SELF.L IN       SELF.L OUT
  342. SELF.L LOOPE    SELF.L LOOP     SELF.L LOOPNE
  343. self.l JCXZ     self.l JECXZ
  344. SELF.L NOT  SELF.L NEG  SELF.L MUL  SELF.L IMUL
  345. SELF.L DIV  SELF.L IDIV SELF.L REP  SELF.L REPNE
  346. SELF.L LOCK SELF.L HLT  SELF.L CMC
  347. SELF.L CLC      SELF.L STC      SELF.L CLI      SELF.L STI
  348. SELF.L CLD      SELF.L STD
  349. self.l LAR      self.l LSL
  350.  
  351. SELF.L DAA      SELF.L DAS      SELF.L AAA      SELF.L AAS
  352. SELF.L ADD      SELF.L ADC      SELF.L AND      SELF.L XOR
  353. SELF.L OR       SELF.L SBB      SELF.L SUB      SELF.L CMP
  354. SELF.L ROL  SELF.L ROR  SELF.L RCL  SELF.L RCR
  355. SELF.L SHL  SELF.L SHR  SELF.L SAR
  356. self.l INC      self.l DEC
  357. SELF.L LEA      SELF.L MOV
  358.  
  359. self.l PUSH     self.l POP      SELF.L PUSHA    SELF.L POPA
  360.  
  361. \ ===========================================================================
  362.  
  363. SELF.L NEXT   SELF.L 1PUSH  SELF.L 2PUSH
  364. SELF.L BRAN1  SELF.L PLOOP
  365.  
  366.  
  367. HEADERLESS      \ ***********************************************************
  368.  
  369. \ ===========================================================================
  370.  
  371. : ?DISP         ( op ext - op ext | ?MOD disp )
  372.                 DUP 6 2/S ?DUP
  373.                 0= IF                           ( MOD=0 )
  374.                      DUP 7 ANDD                 ( ?R/M )
  375.                      6 = 2 ANDD
  376.                 THEN
  377.                 DUP 3 = IF                      ( MOD=3 )
  378.                      DROP 0
  379.                 THEN
  380.                 DISP ! ;
  381.  
  382. CREATE  SYMBOLS    ASSEMBLER
  383.         >NEXT ,
  384.         >NEXT 1- ,
  385.         >NEXT 2- ,
  386.         ' BRANCH >BODY ,
  387.        ' (LOOP) 5 + ,
  388.  
  389. HERE SYMBOLS - 2/   CONSTANT SYMBOLCT
  390.  
  391. : ?SYMBOL       ( a - a ? | if n = -1 no symbol else index )
  392.                 TRUE
  393.                 DUMPSEG @ ?CS: =
  394.                 SYMBOLIC @ 0<>
  395.                 ANDD IF
  396.                       SYMBOLCT 0 DO             ( if in code segment )
  397.                             OVER I 2*
  398.                             SYMBOLS +
  399.                             @ = IF
  400.                                  DROP
  401.                                  I
  402.                                  LEAVEE
  403.                             THEN
  404.                       LOOPP
  405.                 THEN ;
  406.  
  407. : .SYMBOL       ( a | name or value )
  408.                 ?SYMBOL DUP 0< IF
  409.                      DROP .H4
  410.                      EXIT
  411.                 THEN
  412.                 NIP
  413.                 EXEC: NEXT 1PUSH 2PUSH BRAN1 PLOOP ;
  414.  
  415. : .SIZE         ( op )
  416.                 1 ANDD Osize@ 2 ANDD ORR Exec:
  417.                         BYTE  WORD
  418.                         BYTE DWORD ;
  419.  
  420. : .memSIZE      ( op ext -- op ext )
  421.                 dup $C0 ANDD $C0 <> if
  422.                         over .SIZE space
  423.                 then ;
  424.  
  425. : .WORD/DWORD   ( -- )
  426.                 Osize@ if DWORD else WORD then
  427.                 space ;
  428.  
  429. : .8REG         ( ext )
  430.                 7 ANDD
  431.                 EXEC: AL CL DL BL AH CH DH BH ;
  432.  
  433. : .16REG        ( ext )
  434.                 7 ANDD Osize@ $08 ANDD ORR
  435.                 EXEC: AX CX DX BX SP BP SI DI
  436.                       EAX ECX EDX EBX ESP EBP ESI EDI ;
  437.  
  438. : .R8/16        ( op ext )
  439.                 SWAP 1 ANDD
  440.                 EXEC: .8REG .16REG ;
  441.  
  442. : .R/M          ( op ext - op ext )
  443.                 2DUP
  444.                 .R8/16 ;
  445.  
  446. : .REG          ( op ext - op ext )
  447.                 2DUP 3 2/S
  448.                 .R8/16 ;
  449.  
  450. : .AL/X         ( op )
  451.                 1 ANDD Osize@ 2 ANDD ORR
  452.                 EXEC: AL AX AL EAX ;
  453.  
  454. \ ===========================================================================
  455.  
  456. : 0DISP ." 0 " ;
  457.  
  458. : BDISP                                         \ byte displacement
  459.                 CP @ DISP @ +
  460.                 TC@
  461.                 1 OPS +!
  462.                 .h2 ;
  463.  
  464. : WDISP                                         \ word displacement
  465.                 CP @ DISP @ +
  466.                 T@ .H4
  467.                 2 OPS +! ;
  468.  
  469. : DDISP                                         \ word displacement
  470.                 CP @ DISP @ + dup
  471.                 T@
  472.                 swap 2 +
  473.                 T@
  474.                 .H4 .H4
  475.                 4 OPS +! ;
  476.  
  477. \ ===========================================================================
  478.  
  479. : .DISP         ( op ext - op ext )
  480.                 DUP 6 2/S 3 ANDD
  481.                 EXEC: 0DISP BDISP WDISP .R/M ;
  482.  
  483. : .DISP32       ( op ext - op ext )
  484.                 6 2/S 3 ANDD
  485.                 EXEC: 0DISP BDISP DDISP .R/M ;
  486.  
  487. \ ===========================================================================
  488.  
  489. : BIMM          ( byte immediate )
  490.                 .#
  491.                 CP @ DISP @ +
  492.                 TC@
  493.                 1 OPS +!
  494.                 .h2 ;
  495.  
  496. : WIMM          ( word immediate )
  497.                 .#
  498.                 CP @ DISP @ +
  499.                 T@
  500.                 Osize@ if
  501.                         CP @ DISP @ + 2 +
  502.                         T@ .H4
  503.                         2 OPS +!
  504.                 then
  505.                 .H4
  506.                 2 OPS +! ;
  507.  
  508. : .IMM          ( op )
  509.                 1 ANDD IF
  510.                      WIMM
  511.                 else
  512.                      BIMM
  513.                 then ;
  514.  
  515. \ ===========================================================================
  516.  
  517. : .MREG32regs   ( n  -- )
  518.                 7 ANDD Exec:
  519.                         [EAX] [ECX] [EDX] [EBX] NULL [EBP] [ESI] [EDI] ;
  520.  
  521. : .MREG32-2     ( op ext | 2nd byte of extended addr - SSndxBASE )
  522.                 NEXTB                           \ SS-Index-Base
  523.                 dup $C7 ANDD 5 = if
  524.                      DDISP
  525.                 else
  526.                      over .DISP32
  527.                      dup  .MREG32regs
  528.                 then
  529.                 dup 3 2/S 7 ANDD .MREG32regs
  530.                 6 2/S 3 ANDD Exec:
  531.                         *1 *2 *4 *8 ;
  532.  
  533. : .MREG32       ( op ext | 32 bit address )
  534.                 DUP $C7 ANDD 5 = IF             \ MOD=0 R/M=6
  535.                      DDISP
  536.                      EXIT
  537.                 THEN
  538.                 dup $07 ANDD 4 = if
  539.                      .MREG32-2
  540.                      exit
  541.                 then
  542.                 dup .DISP32
  543.                 dup .MREG32regs ;
  544.  
  545. : .MREG         ( op ext - op ext | reg + disp )
  546.                 dup $C0 ANDD $C0 = IF           \ MOD=3
  547.                      .R/M
  548.                      EXIT
  549.                 THEN
  550.                 Asize@ if
  551.                      .MREG32
  552.                      exit
  553.                 then
  554.                 DUP $C7 ANDD 6 = IF             \ MOD=0 R/M=6
  555.                      WDISP
  556.                      EXIT
  557.                 THEN
  558.                 .DISP
  559.                 DUP 7 ANDD                      \ MOD=1 or 2
  560.                 EXEC: [BX+SI] [BX+DI] [BP+SI] [BP+DI] [SI] [DI] [BP] [BX] ;
  561.  
  562. \ ===========================================================================
  563.  
  564. : .SEG          ( op )
  565.                 3 2/S 3 ANDD
  566.                 EXEC: ES CS SS DS ;
  567.  
  568. \ ===========================================================================
  569.  
  570. : P/P_1         ( op )
  571.                 DUP 1 ANDD
  572.                 EXEC: PUSH POP ;
  573.  
  574. : P/P           ( op )
  575.                 P/P_1 .SEG ;
  576.  
  577. : .ADJ          ( op )
  578.                 3 2/S 3 ANDD
  579.                 EXEC: DAA DAS AAA AAS ;
  580.  
  581. : P/SEG         ( op | push  seg override )
  582.                 DUP 5 2/S 1 ANDD
  583.                 EXEC: P/P .na  ;
  584.  
  585. : P/ADJ         ( op | pop  adjust )
  586.                 DUP 5 2/S 1 ANDD
  587.                 EXEC: P/P .ADJ ;
  588.  
  589. : .ALU          ( op )
  590.                 3 2/S 7 ANDD
  591.                 EXEC: ADD OR ADC SBB AND SUB XOR CMP ;
  592.  
  593. : ALU           ( op - op )
  594.                 DUP .ALU
  595.                 DUP 4 ANDD IF
  596.                       DUP .AL/X ., .IMM
  597.                       EXIT
  598.                 THEN
  599.                 NEXTB
  600.                 OVER 2 ANDD IF
  601.                       .REG ., .MREG
  602.                 ELSE
  603.                       .MREG ?., .REG
  604.                 THEN
  605.                 2DROP ;
  606.  
  607. \ ===========================================================================
  608.  
  609. : 00-3F         ( op - op | 00-3F )
  610.                 DUP 7 ANDD
  611.                 EXEC: ALU ALU ALU ALU ALU ALU P/SEG P/ADJ ;
  612.  
  613. \ ===========================================================================
  614. \ ===========================================================================
  615.  
  616.  
  617. : 40-5F_1       ( op | 40-5F )
  618.                 DUP 3 2/S 3 ANDD Exec:
  619.                       INC  DEC PUSH POP ;
  620.  
  621. : 40-5F         ( op | 40-5F )
  622.                 40-5F_1 .16REG ;
  623.  
  624. \ ===========================================================================
  625.  
  626. : PUSHi
  627.                 PUSH
  628.                 dup $68 = IF
  629.                      drop Wimm
  630.                      exit
  631.                 THEN
  632.                 dup $6A = IF
  633.                      drop Bimm
  634.                      exit
  635.                 THEN
  636.                .NA ;
  637.  
  638. : Pall          ( op )
  639.                 1 ANDD Exec: PUSHA POPA ;
  640.  
  641. : 6C-6D         ( op )
  642.                 INS  .Size  ;
  643.  
  644. : 6E-6F         ( op )
  645.                 OUTS .Size  ;
  646.  
  647. : i62           ( op )
  648.                 drop BOUND
  649.                 NEXTB .MREG
  650.                 drop ;
  651.  
  652. : i63           ( op )
  653.                 drop ARPL
  654.                 NEXTB .MREG
  655.                 drop ;
  656.  
  657.  
  658. : IMUL6x        ( op )
  659.                 IMUL
  660.                 dup .SIZE space
  661.                 NEXTB .MREG drop
  662.                 .#
  663.                 2 ANDD 0= if
  664.                      NEXTW
  665.                 else
  666.                      NEXTB
  667.                 then
  668.                 .H4 ;
  669.  
  670. : 60-6F         ( op )
  671.                 dup $0f andd Exec:
  672.                       Pall  Pall
  673.                       i62   i63
  674.                       .na   .na
  675.                       .na   .na
  676.                       PUSHi IMUL6x
  677.                       PUSHi IMUL6x
  678.                       6C-6D 6C-6D
  679.                       6E-6F 6E-6F ;
  680.  
  681. \ ===========================================================================
  682.  
  683. : .BR|          ( op )
  684.                 15 ANDD
  685.                 EXEC: JO JNO JB  JAE JE JNE JBE JA
  686.                       JS JNS JPE JPO JL JGE JLE JG ;
  687.  
  688. : 70-7F         ( op | 70-7F branch & dest )
  689.                 .BR|
  690.                 NEXTB SEXT CP @ + .SYMBOL ;
  691.  
  692. \ ===========================================================================
  693.  
  694. : 40-7F         ( op | 40-7F )
  695.                 DUP 4 2/S 3 ANDD Exec:
  696.                         40-5F           \ 4x
  697.                         40-5F           \ 5x
  698.                         60-6F           \ 6x
  699.                         70-7F ;         \ 7x
  700.  
  701.  
  702. \ ===========================================================================
  703. \ ===========================================================================
  704.  
  705. : ALU#1         ( op | 80-81 )
  706.                 NEXTB
  707.                 DUP .ALU
  708.                 .memSIZE
  709.                 .MREG ?.,
  710.                 ?DISP
  711.                 DROP
  712.                 .IMM ;
  713.  
  714. : ALU#2c        ( op ext )
  715.                 .NA1 ;
  716.  
  717. : ALU#2b        ( op ext )
  718.                 dup .ALU
  719.                 .memSIZE
  720.                 .MREG ?.,
  721.                 ?DISP BIMM
  722.                 2DROP ;
  723.  
  724. : ALU#2         ( op | 82-83 )
  725.                 NEXTB
  726.                 DUP
  727.                 3 2/S 7 ANDD Exec:
  728.                         ALU#2b ALU#2c           \ ADD, ???
  729.                         ALU#2b ALU#2b           \ ADC, SBB
  730.                         ALU#2c ALU#2b           \ ???, SUB
  731.                         ALU#2c ALU#2b ;         \ ???, CMP
  732.  
  733. \ ===========================================================================
  734.  
  735.  
  736. : 84-85         ( op | r/m reg )
  737.                 TEST
  738.                 NEXTB
  739.                 .MREG ?.,
  740.                 .REG
  741.                 2DROP ;
  742.  
  743. : 86-87         ( op | r/m reg )
  744.                 XCHG
  745.                 NEXTB
  746.                 .MREG ?.,
  747.                 .REG
  748.                 2DROP ;
  749.  
  750.  
  751. \ ===========================================================================
  752.  
  753. : MOVRM/REG     ( op | 88-89 )
  754.                 MOV
  755.                 NEXTB
  756.                 .MREG ?.,
  757.                 .REG
  758.                 2DROP ;
  759.  
  760. : MOVD          ( op | 8A-8B )
  761.                 MOV
  762.                 NEXTB
  763.                 .REG .,
  764.                 .MREG
  765.                 2DROP ;
  766.  
  767.  
  768. : MOVS>M        ( op | 8C-8F )
  769.                 NEXTB
  770.                 OVER $8D = IF
  771.                      LEA
  772.                      .REG .,
  773.                      .MREG
  774.                 ELSE
  775.                      OVER $8F = IF
  776.                           DUP $38 ANDD IF
  777.                                .NA1
  778.                                EXIT
  779.                           THEN
  780.                           [ ' POP >NAME ] LITERAL
  781.                           ID.L .MREG
  782.                      ELSE                       ( 8C 8E )
  783.                           DUP $20 ANDD IF
  784.                                .NA1
  785.                                EXIT
  786.                           THEN
  787.                           MOV SWAP 1 ORR        ( Force 16bit moves only )
  788.                           SWAP OVER 2 ANDD IF   ( 8E )
  789.                                DUP .SEG .,
  790.                                .MREG
  791.                           ELSE                  ( 8C )
  792.                                .MREG ?., DUP
  793.                                .SEG
  794.                           THEN
  795.                      THEN
  796.                 THEN
  797.                 2DROP ;
  798.  
  799.  
  800. \ ===========================================================================
  801.  
  802. : 8MOVS         ( op | 80-8F )
  803.                 DUP 2/ 7 ANDD Exec:
  804.                       ALU#1     ALU#2
  805.                       84-85     86-87
  806.                       MOVRM/REG MOVD
  807.                       MOVS>M    MOVS>M ;
  808.  
  809. \ ===========================================================================
  810.  
  811.  
  812. : INTER                                 \ interseg jmp or call
  813.                 .FAR
  814.                 NEXTW
  815.                 NEXTW
  816.                 .H4
  817.                 .SYMBOL ;
  818.  
  819. : CALLI         ( interseg call )
  820.                 CALL
  821.                 INTER ;
  822.  
  823. : XCHGA         ( op | 90-97 )
  824.                 DUP $90 = IF
  825.                      ." NOP "
  826.                      DROP
  827.                 ELSE
  828.                      XCHG
  829.                      .16REG .,
  830.                      Osize@ if EAX else AX then
  831.                 THEN ;
  832.  
  833. : 98-9F         ( op | 98-9F )
  834.                 7 ANDD Exec:
  835.                         CBW   CWD  CALLI WAIT
  836.                         PUSHF POPF SAHF  LAHF ;
  837.  
  838. \ ===========================================================================
  839.  
  840. : 90S           ( op | 90-9F )
  841.                 DUP 3 2/S 1 ANDD
  842.                 EXEC: XCHGA 98-9F ;
  843.  
  844. \ ===========================================================================
  845.  
  846. : A0-A3         ( op | A0-A3 )
  847.                 MOV
  848.                 DUP 2 ANDD IF
  849.                      WDISP .AL/X
  850.                 ELSE
  851.                      .AL/X ., WDISP
  852.                 THEN ;
  853.  
  854. : A4-A5         ( op | A4-A5 )
  855.                 MOVS    .SIZE ;
  856.  
  857. : A6-A7         ( op | A6-A7 )
  858.                 CMPS    .SIZE ;
  859.  
  860. : A8-A9         ( op | A8-A9 )
  861.                 TEST
  862.                 DUP .AL/X ., .IMM ;
  863.  
  864. : AA-AB         ( op | AA-AB )
  865.                 STOS    .SIZE ;
  866.  
  867. : AC-AD         ( op | AC-AD )
  868.                 LODS    .SIZE ;
  869.  
  870. : AE-AF         ( op | AE-AF )
  871.                 SCAS    .SIZE ;
  872.  
  873. : A0S           ( op | A0-AF )
  874.                 DUP 2/ 7 ANDD Exec:
  875.                         A0-A3 A0-A3 A4-A5 A6-A7
  876.                         A8-A9 AA-AB AC-AD AE-AF ;
  877.  
  878. \ ===========================================================================
  879.  
  880. : MOV#          ( op | B0-BF )
  881.                 MOV
  882.                 DUP 8 ANDD IF
  883.                      .16REG ., WIMM
  884.                 ELSE
  885.                      .8REG  ., BIMM
  886.                 THEN ;
  887.  
  888. \ ===========================================================================
  889.  
  890. : 80-BF         ( op | 80-BF )
  891.                 DUP 4 2/S 3 ANDD Exec:
  892.                         8MOVS           \ 8x
  893.                         90S             \ 9x
  894.                         A0S             \ Ax
  895.                         MOV# ;          \ Bx
  896.  
  897. \ ===========================================================================
  898. \ ===========================================================================
  899.  
  900.  
  901. : .SHIFTS       ( ext )
  902.                 3 2/S 7 ANDD
  903.                 EXEC: ROL ROR RCL RCR SHL SHR .NA0 SAR ;
  904.  
  905. : Shift+Immed   ( op | C0-C1 )
  906.                 NEXTB
  907.                 DUP 3 2/S 7 ANDD
  908.                 6 = IF                  \ 110 is invalid
  909.                      .NA1
  910.                      EXIT
  911.                 THEN
  912.                 DUP .SHIFTS             \ print opcode
  913.                 .MREG                   \ and operand
  914.                 2DROP                   \ opcode and extension
  915.                 ., Bimm ;               \ Immediate code
  916.  
  917.  
  918. : Enter/Leave   ( op | C8-C9 )
  919.                 $C8 = IF                \ Enter
  920.                      ENTER
  921.                      NEXTW  space .H4
  922.                      NEXTB  space .H2
  923.                 ELSE                    \ Leave
  924.                      LEAVE
  925.                 THEN ;
  926.  
  927. : CxRET         ( op | C2-C3 CA-CB )
  928.                 RET
  929.                 DUP 8 ANDD IF
  930.                      .FAR
  931.                 THEN
  932.                 1 ANDD 0= IF
  933.                      WDISP ( ??? ) ." +SP"
  934.                 THEN ;
  935.  
  936. : .L/L          ( op )
  937.                 1 ANDD
  938.                 EXEC: LES LDS ;
  939.  
  940. : LES/LDS       ( op | C4-C5 )
  941.                 DUP .L/L
  942.                 NEXTB
  943.                 .REG .,
  944.                 .MREG
  945.                 2DROP ;
  946.  
  947. : MOV#R/M       ( op | C6-C7 )
  948.                 NEXTB
  949.                 DUP $38 ANDD IF
  950.                     .NA1
  951.                     EXIT
  952.                 THEN
  953.                 MOV
  954.                 .memSIZE
  955.                 .MREG ?.,
  956.                 ?DISP DROP
  957.                 .IMM ;
  958.  
  959. : CC-CD         ( op | CC-CD )
  960.                 INT
  961.                 1 ANDD IF
  962.                      NEXTB
  963.                 ELSE
  964.                      3
  965.                 THEN
  966.                 .H2 ;
  967.  
  968. : INTO/IRET     ( op | CE-CF )
  969.                 1 ANDD
  970.                 EXEC: INTO IRET ;
  971.  
  972. \ ===========================================================================
  973.  
  974. : C0S           ( op | C0-CF )
  975.                 DUP 2/ $07 ANDD Exec:
  976.                         Shift+Immed CxRET  LES/LDS MOV#R/M
  977.                         Enter/Leave CxRET  CC-CD   INTO/IRET ;
  978.  
  979. \ ===========================================================================
  980. \ ===========================================================================
  981.  
  982. : SHIFTS        ( op | D0-D3 )          \ 2-byte code, $D0-$D3 plus 2nd byte for ModnnnR/M
  983.                 NEXTB
  984.                 DUP 3 2/S 7 ANDD
  985.                 6 = IF                  \ 110 is invalid
  986.                      .NA1
  987.                      EXIT
  988.                 THEN
  989.                 DUP .SHIFTS             \ print opcode
  990.                 .memSIZE                \ and operand size
  991.                 .MREG ?.,               \ and operand
  992.                 DROP
  993.                 2 ANDD IF               \ $D2 and $D3 by CL
  994.                      CL
  995.                 ELSE
  996.                      .# 1 .H2
  997.                 THEN ;
  998.  
  999. : iD4           ( op | D4 )             \ ASCII adjust for multiply
  1000.                 AAM NEXTB
  1001.                 2DROP ;
  1002.  
  1003. : iD5           ( op | D5 )             \ ASCII adjust for divide
  1004.                 AAD NEXTB
  1005.                 2DROP ;
  1006.  
  1007. : iD7           ( op | D7 )
  1008.                 XLAT
  1009.                 DROP ;
  1010.  
  1011. \ ===========================================================================
  1012.  
  1013. : .ST(i)        ( ext )
  1014.                 dup 7 ANDD Exec:
  1015.                         ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7) ;
  1016.  
  1017. : .ST,          ST ., space ;
  1018.  
  1019. : .ST_1         ( n )
  1020.                 dup 3 2/S 7 ANDD Exec:
  1021.                       .ST, .ST, NULL NULL .ST, .ST, .ST, .ST, ;
  1022.  
  1023. : Ftype_2       ( op ext )
  1024.                 dup 3 2/S 1 ANDD Exec:
  1025.                         BCD Integer*8 ;
  1026.  
  1027. : Ftype         ( op ext )
  1028.                 over $07 ANDD 2*
  1029.                 over $20 ANDD 0<> if 1+ then
  1030.                 exec:
  1031.                         REAL*4    REAL*4    REAL*4    NULL
  1032.                         Integer*4 Integer*4 Integer*4 REAL_TEMP
  1033.                         REAL*8    REAL*8    REAL*8    NULL
  1034.                         Integer*2 Integer*2 Integer*2 Ftype_2 ;
  1035.  
  1036. : Fmath         ( ext )
  1037.                 dup 3 2/S 7 ANDD Exec:
  1038.                         FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR ;
  1039.  
  1040. : Fxx           ( op ext )
  1041.                 ." F:"
  1042.                 2dup swap (.h2) ." -" (.h2) ."  " ;
  1043.  
  1044. : F0mod11       ( ext )
  1045.                 Fmath .ST_1 .ST(i) ;
  1046.  
  1047. : F1mod11       ( ext )
  1048.                 dup 3 2/S 7 ANDD
  1049.                 dup 0 = if drop FLD  .ST(i) exit then
  1050.                 dup 1 = if drop FXCH .ST(i) exit then
  1051.                 dup 2 = if drop FNOP        exit then
  1052.                 dup 3 = if drop FSTP .ST(i) exit then
  1053.                 dup $1f ANDD Exec:
  1054.                         FCHS  FABS    Fxx    Fxx     FTST    FXAM   Fxx     Fxx
  1055.                         FLD1  FLDL2T  FLDL2E FLDPI   FLDLG2  FLDLN2 FLDZ    Fxx
  1056.                         F2XM1 FYL2X   FPTAN  FPATAN  FXTRACT FPREM1 FDECSTP FINCSTP
  1057.                         FPREM FYL2XP1 FSQRT  FSINCOS FRNDINT FSCALE FSIN    FCOS ;
  1058.  
  1059. : F2mod11       ( ext )
  1060.                 dup $E9 = if FUCOMPP exit then
  1061.                 Fxx ;
  1062.  
  1063. : F3mod11       ( ext )
  1064.                 dup $E4 > if Fxx exit then
  1065.                 dup $07 ANDD Exec:
  1066.                         FENI FDISI FCLEX FINIT FSETPM ;
  1067.  
  1068. : F4mod11       ( ext )
  1069.                 Fmath .ST(i) ., space ST ;
  1070.  
  1071. : F5mod11op     ( n )
  1072.                 Exec:   FFREE FXCH FST FSTP FUCOM FUCOMP ;
  1073.  
  1074. : F5mod11       ( ext )
  1075.                 dup 3 2/S 7 ANDD
  1076.                 dup 5 > if
  1077.                      drop Fxx exit
  1078.                 then
  1079.                 F5mod11op .ST(i) ;
  1080.  
  1081. : F6mod11P      ( ext )
  1082.                 dup 3 2/S 7 ANDD Exec:
  1083.                         FADDP  FMULP  FCOMP  Fxx
  1084.                         FSUBP  FSUBRP FDIVP  FDIVRP ;
  1085.  
  1086. : F6mod11       ( ext )
  1087.                 dup $D9 = if FCOMPP exit then
  1088.                 F6mod11P  .st(i) ., space ST ;
  1089.  
  1090. : F7mod11op     ( n )
  1091.                 Exec:   FFREEP FXCH FSTP FSTP ;
  1092.  
  1093.  
  1094. : F7mod11       ( ext )
  1095.                 dup $E0 = if FSTSW AX exit then
  1096.                 dup 3 2/S 7 ANDD
  1097.                 dup 3 > if
  1098.                      drop Fxx exit
  1099.                 then
  1100.                 F7mod11op .ST(i) ;
  1101.  
  1102. : Fmod11        ( op ext )
  1103.                 over 7 ANDD Exec:
  1104.                         F0mod11 F1mod11 F2mod11 F3mod11
  1105.                         F4mod11 F5mod11 F6mod11 F7mod11 ;
  1106.  
  1107. : Fodd          ( op ext )
  1108.                 over 1 2/S 3 ANDD 3 2*S
  1109.                 over 3 2/S 7 ANDD
  1110.                 ORR Exec:
  1111.                         FLD Fxx FST FSTP FLDENV FLDCW FSTENV FSTCW
  1112.                         FLD Fxx FST FSTP Fxx    FLD   Fxx    FSTP
  1113.                         FLD Fxx FST FSTP FRSTOR Fxx   FSAVE  FSTSW
  1114.                         FLD Fxx FST FSTP FLD    FLD   FSTP   FSTP ;
  1115.  
  1116. : F_387         ( op -- )               \ Floating Point CoProcessor
  1117.                 NEXTB                   \ a 2-byte instruction
  1118.                 dup $C0 ANDD $C0 = if
  1119.                      Fmod11
  1120.                 else
  1121.                      over 1 ANDD 0= if
  1122.                           Fmath
  1123.                      else
  1124.                           Fodd
  1125.                      then
  1126.                      #out @ >R
  1127.                      Ftype
  1128.                      #out @ R> <> if
  1129.                           2 spaces
  1130.                      then
  1131.                      .MREG
  1132.                 then
  1133.                 2DROP ;
  1134.  
  1135. \ ===========================================================================
  1136.  
  1137. : D0S           ( op | D0-DF )
  1138.                 DUP $0F ANDD
  1139.                 EXEC: SHIFTS SHIFTS SHIFTS SHIFTS
  1140.                       iD4    iD5    .NA    iD7
  1141.                       F_387  F_387  F_387  F_387
  1142.                       F_387  F_387  F_387  F_387 ;
  1143.  
  1144. \ ===========================================================================
  1145. \ ===========================================================================
  1146.  
  1147. : .LOOPj        Osize@ if JECXZ else JCXZ then ;
  1148.  
  1149. : .LOOP         ( op )
  1150.                 3 ANDD
  1151.                 EXEC: LOOPNE LOOPE LOOP .LOOPj ;
  1152.  
  1153. : LOOPS         ( op | E0-E3 )
  1154.                 .LOOP NEXTB
  1155.                 SEXT CP @ + .SYMBOL ;
  1156.  
  1157.  
  1158. : IO#           ( op | E4-E7 )          \ IN/OUT with immediate port number
  1159.                 DUP 2 ANDD IF
  1160.                      OUT BIMM .AL/X
  1161.                      EXIT
  1162.                 THEN
  1163.                 IN .AL/X ., BIMM ;
  1164.  
  1165. : IOX           ( op | EC-EF )          \ IN/OUT with port in DX
  1166.                 DUP 2 ANDD IF
  1167.                      OUT DX ., .AL/X
  1168.                      EXIT
  1169.                 THEN
  1170.                 IN .AL/X ., DX ;
  1171.  
  1172.  
  1173. : .CALL         ( op )
  1174.                 3 ANDD
  1175.                 EXEC: CALL JMP JMP JMP ;
  1176.  
  1177. : CALLS         ( op | E8-EB )
  1178.                 DUP .CALL DUP
  1179.                 2 ANDD IF
  1180.                     DUP 1 ANDD IF
  1181.                         NEXTB SEXT CP @ + .SYMBOL
  1182.                     ELSE
  1183.                         INTER
  1184.                     THEN
  1185.                 ELSE
  1186.                     NEXTW CP @ + .SYMBOL
  1187.                                 ( make smart about DEBUG's tricks and E0 )
  1188.                     DUP $0E9 = CP @ C@
  1189.                     $0E0 = ANDD IF
  1190.                          1 CP +!
  1191.                     THEN
  1192.                 THEN
  1193.                 DROP ;
  1194.  
  1195. \ ===========================================================================
  1196.  
  1197. : E0S           ( op | E0-EF )
  1198.                 DUP 2 2/S 3 ANDD
  1199.                 EXEC: LOOPS IO# CALLS IOX ;
  1200.  
  1201. \ ===========================================================================
  1202. \ ===========================================================================
  1203.  
  1204.  
  1205.  
  1206.  
  1207. : F6-F7test     ( op ext | F6-F7 )
  1208.                 TEST
  1209.                 .memSIZE
  1210.                 .MREG ?.,
  1211.                 ?DISP
  1212.                 .IMM
  1213.                 drop ;
  1214.  
  1215.  
  1216. : .MUL/DIV      ( ext )
  1217.                 3 2/S 3 ANDD
  1218.                 EXEC: MUL IMUL DIV IDIV ;
  1219.  
  1220. : MUL/DIV       ( op ext | F6-F7 )
  1221.                 DUP .MUL/DIV
  1222.                 .memSIZE
  1223.                 .MREG
  1224.                 2DROP ;
  1225.  
  1226. : .NOT/NEG      ( ext )
  1227.                 3 2/S 1 ANDD
  1228.                 EXEC: NOT NEG ;
  1229.  
  1230. : NOT/NEG       ( op ext | F6-F7 )
  1231.                 DUP .NOT/NEG
  1232.                 .memSIZE
  1233.                 .MREG
  1234.                 2DROP ;
  1235.  
  1236. : F6-F7S        ( op | F6-F7 )                  \ opcode was $F6 or $F7,
  1237.                 NEXTB                           \ look at next byte (subcode)
  1238.                 DUP 3 2/S 7 ANDD
  1239.                 EXEC: F6-F7test .NA1 NOT/NEG NOT/NEG
  1240.                       MUL/DIV MUL/DIV MUL/DIV MUL/DIV ;
  1241.  
  1242. \ ===========================================================================
  1243.  
  1244. : .FES          ( ext )
  1245.                 3 2/S 1 ANDD
  1246.                 EXEC: INC DEC ;
  1247.  
  1248. : FES           ( op | FE )                     \ opcode was $FE, look at next byte
  1249.                 NEXTB
  1250.                 DUP 3 2/S
  1251.                 6 ANDD IF                       \ only 000 and 001 are valid
  1252.                      .NA1 EXIT
  1253.                 THEN
  1254.                 DUP
  1255.                 .FES                            \ INC/DEC op-subcode
  1256.                 .MREG                           \ operand
  1257.                 $C0 ANDD $C0 <> IF              \ size of operand
  1258.                      dup space .SIZE
  1259.                 THEN
  1260.                 DROP ;                          \ done
  1261.  
  1262. \ ===========================================================================
  1263.  
  1264. : .FF_CALL/JMP  ( ext )
  1265.                 2/ 1 ANDD
  1266.                 EXEC: JMP CALL ;
  1267.  
  1268. : FF_CALL/JMP   ( op ext | FF )
  1269.                 DUP 3 2/S DUP .FF_CALL/JMP
  1270.                 1 ANDD IF
  1271.                      .FAR
  1272.                 THEN
  1273.                 .MREG 2DROP ;
  1274.  
  1275. : FF_PUSH       ( op ext | FF )
  1276.                 DUP 4 ANDD IF
  1277.                      PUSH .MREG 2DROP EXIT
  1278.                 THEN
  1279.                 .NA1 ;
  1280.  
  1281. : .FF_INC       ( op ext )
  1282.                 3 2/S 1 ANDD
  1283.                 EXEC: INC DEC ;
  1284.  
  1285. : FF_INC        ( op ext | FF )
  1286.                 DUP .FF_INC                     \ INC or DEC
  1287.                 .MREG                           \ operand
  1288.                 $C0 ANDD $C0 <> IF              \ size of operand
  1289.                      dup space .SIZE
  1290.                 THEN
  1291.                 DROP ;                          \ trash opcode and done
  1292.  
  1293. : FFS           ( op | FF )                     \ opcode was $FF, look at next byte
  1294.                 NEXTB
  1295.                 DUP 4 2/S 3 ANDD
  1296.                 EXEC: FF_INC  FF_CALL/JMP  FF_CALL/JMP  FF_PUSH ;
  1297.  
  1298. : .NAF1         ( a - a )
  1299.                 DUMPSEG @ OVER C@L .NA ;
  1300.  
  1301. : F0S           ( op | F0-FF )
  1302.                 DUP 15 ANDD
  1303.                 DUP 7 ANDD
  1304.                 6 < IF
  1305.                    NIP
  1306.                 THEN
  1307.                 EXEC: LOCK .NAF1 REPNE  REP  HLT  CMC  F6-F7S F6-F7S
  1308.                       CLC  STC   CLI    STI  CLD  STD  FES    FFS ;
  1309.  
  1310. \ ===========================================================================
  1311.  
  1312. : C0-FF         ( op | C0-FF )
  1313.                 DUP 4 2/S 3 ANDD Exec:
  1314.                       C0S D0S E0S F0S ;
  1315.  
  1316. \ ===========================================================================
  1317. \ ===========================================================================
  1318.  
  1319. : x06           ( op1 op2 | 06 )
  1320.                 CLTS 2drop ;
  1321.  
  1322. : x02_1         1 ANDD Exec: LAR LSL ;
  1323.  
  1324. : x02           ( op1 op2 | 0f02-0f03 )
  1325.                 x02_1 drop
  1326.                 1 NEXTB
  1327.                 dup 3 2/S .16REG .,
  1328.                 .MREG 2drop ;
  1329.  
  1330.  
  1331. : x01_1         Exec: SGDT SIDT LGDT LIDT SMSW SMSW LMSW LMSW ;
  1332.  
  1333. : x01           ( op1 op2 | 0f01 )
  1334.                 NEXTB
  1335.                 dup 3 2/S 7 ANDD
  1336.                 dup 5 = IF
  1337.                         drop .NA2 exit
  1338.                 then
  1339.                 dup 7 = if
  1340.                         drop .NA2 exit
  1341.                 then
  1342.                 x01_1
  1343.                 >r 2drop r>
  1344.                 .MREG drop ;
  1345.  
  1346.  
  1347. : x00_1         Exec: SLDT STR  LLDT LTR  VERR VERW VERR VERW ;
  1348.  
  1349. : x00           ( op1 op2 | 0f00 )
  1350.                 NEXTB
  1351.                 dup 3 2/S 7 ANDD
  1352.                 dup 6 >= IF
  1353.                         drop .NA2 exit
  1354.                 then
  1355.                 x00_1
  1356.                 >r 2drop r>
  1357.                 .MREG drop ;
  1358.  
  1359. : x00S          ( op1 op2 -- )
  1360.                 dup $0f ANDD Exec:
  1361.                         x00  x01  x02  x02
  1362.                         .na1 .na1 X06  .na1
  1363.                         .na1 .na1 .na1 .na1
  1364.                         .na1 .na1 .na1 .na1 ;
  1365.  
  1366. \ ===========================================================================
  1367.  
  1368. : .Exx  7 ANDD Exec: EAX ECX EDX EBX ESP EBP ESI EDI ;
  1369. : .CRx  7 ANDD Exec: CR0 CR1 CR2 CR3 CR4 CR5 CR6 CR7 ;
  1370. : .DRx  7 ANDD Exec: DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7 ;
  1371. : .TRx  7 ANDD Exec: TR0 TR1 TR2 TR3 TR4 TR5 TR6 TR7 ;
  1372.  
  1373. : x20           ( op1 op2 | 0f20 )      \ e.g., MOV EAX, CR0
  1374.                 MOV NEXTB
  1375.                 dup $C0 ANDD $C0 <> if
  1376.                         .NA2 exit
  1377.                 then
  1378.                 dup
  1379.                 .Exx
  1380.                 .,
  1381.                 3 2/S .CRx
  1382.                 2drop ;
  1383.  
  1384. : x21           ( op1 op2 | 0f21 )      \ e.g., MOV EAX, DR0
  1385.                 MOV NEXTB
  1386.                 dup $C0 ANDD $C0 <> if
  1387.                         .NA2 exit
  1388.                 then
  1389.                 dup
  1390.                 .Exx
  1391.                 .,
  1392.                 3 2/S .DRx
  1393.                 2drop ;
  1394.  
  1395. : x22           ( op1 op2 | 0f22 )      \ e.g., MOV CR0, EAX
  1396.                 MOV NEXTB
  1397.                 dup $C0 ANDD $C0 <> if
  1398.                         .NA2 exit
  1399.                 then
  1400.                 dup
  1401.                 3 2/S .CRx
  1402.                 .,
  1403.                 .Exx
  1404.                 2drop ;
  1405.  
  1406. : x23           ( op1 op2 | 0f23 )      \ e.g., MOV DR0, EAX
  1407.                 MOV NEXTB
  1408.                 dup $C0 ANDD $C0 <> if
  1409.                         .NA2 exit
  1410.                 then
  1411.                 dup
  1412.                 3 2/S .DRx
  1413.                 .,
  1414.                 .Exx
  1415.                 2drop ;
  1416.  
  1417. : x24           ( op1 op2 | 0f24 )      \ e.g., MOV EAX, TR6
  1418.                 MOV NEXTB
  1419.                 dup $C0 ANDD $C0 <> if
  1420.                         .NA2 exit
  1421.                 then
  1422.                 dup
  1423.                 .Exx
  1424.                 .,
  1425.                 3 2/S .TRx
  1426.                 2drop ;
  1427.  
  1428. : x26           ( op1 op2 | 0f26 )      \ e.g., MOV TR6, EAX
  1429.                 MOV NEXTB
  1430.                 dup $C0 ANDD $C0 <> if
  1431.                         .NA2 exit
  1432.                 then
  1433.                 dup
  1434.                 3 2/S .TRx
  1435.                 .,
  1436.                 .Exx
  1437.                 2drop ;
  1438.  
  1439.  
  1440. : x20S          ( op1 op2 -- )
  1441.                 dup $0f ANDD Exec:
  1442.                         x20  x21  x22  x23
  1443.                         x24  .na1 x26  .na1
  1444.                         .na1 .na1 .na1 .na1
  1445.                         .na1 .na1 .na1 .na1 ;
  1446.  
  1447.  
  1448. \ ===========================================================================
  1449.  
  1450. : 0F/00-3F      ( op1 op2 -- )
  1451.                 DUP 4 2/S 3 ANDD Exec:
  1452.                       x00S .NA1 x20S .NA1 ;
  1453.  
  1454. \ ===========================================================================
  1455. \ ===========================================================================
  1456.  
  1457. : BTcom                         \ common for BT, BTR, BTC, BTS
  1458.                 2drop
  1459.                 NEXTB
  1460.                 .MREG ?.,
  1461.                 3 2/S .16REG ;
  1462.  
  1463.  
  1464. \ ===========================================================================
  1465. \ ===========================================================================
  1466.  
  1467. : x80S          ( op1 op2 -- )          \ 2-byte displacement conditional jumps
  1468.                 .BR|  drop
  1469.                 ." LONG  "
  1470.                 NEXTW CP @ + .h4 ;
  1471.  
  1472. \ ===========================================================================
  1473.  
  1474. : .SET|         ( op )
  1475.                 15 ANDD
  1476.                 EXEC: SETO SETNO SETB  SETAE SETE SETNE SETBE SETA
  1477.                       SETS SETNS SETPE SETPO SETL SETGE SETLE SETG ;
  1478.  
  1479. : x90S          ( op1 op2 -- )
  1480.                 .SET| drop
  1481.                 NEXTB .MREG
  1482.                 drop ;
  1483.  
  1484. \ ===========================================================================
  1485.  
  1486.  
  1487. : xA0           push fs 2drop ;
  1488. : xA1           pop  fs 2drop ;
  1489. : xA8           push gs 2drop ;
  1490. : xA9           pop  gs 2drop ;
  1491.  
  1492. : xA3           ( op1 op2 )
  1493.                 BT
  1494.                 BTcom ;
  1495.  
  1496. : xAB           ( op1 op2 )
  1497.                 BTS
  1498.                 BTcom ;
  1499.  
  1500. : sh_dbl        ( op1 op2 -- )          \ common
  1501.                 1                       \ to fake out .MREG
  1502.                 NEXTB
  1503.                 .Word/Dword
  1504.                 .MREG ?.,
  1505.                 3 2/S .16reg .,
  1506.                 drop                    \ the fake
  1507.                 1 ANDD 0= IF
  1508.                          OPS @ CP +!  OPS off
  1509.                          NEXTB .# .h2
  1510.                 else
  1511.                         ."  CL"
  1512.                 then
  1513.                 drop ;
  1514.  
  1515. : xA4           ( op1 op2 | 0fA4-0fA5 )
  1516.                 SHLD sh_dbl ;
  1517.  
  1518. : xAC           ( op1 op2 | 0fAC-0fAD )
  1519.                 SHRD sh_dbl ;
  1520.  
  1521. : IMULaf        ( op1 op2 | 0fAF )
  1522.                 IMUL
  1523.                 .Word/Dword
  1524.                 NEXTB
  1525.                 dup 3 2/S .16REG .,
  1526.                 .MREG drop
  1527.                 2drop ;
  1528.  
  1529. : xA0S          ( op1 op2 -- )
  1530.                 dup $0F ANDD Exec:
  1531.                         xA0   xA1   .na1  xA3
  1532.                         xA4   xA4   .na1  .na1
  1533.                         xA8   xA9   .na1  xAB
  1534.                         xAC   xAC   .na1  IMULaf ;
  1535.  
  1536. \ ===========================================================================
  1537.  
  1538. : Lxs           ( op1 op2 )
  1539.                 2drop
  1540.                 NEXTB
  1541.                 .REG .,
  1542.                 .MREG
  1543.                 drop ;
  1544.  
  1545. : xB2           ( op1 op2 )
  1546.                 LSS Lxs ;
  1547.  
  1548. : xB4           ( op1 op2 )
  1549.                 LFS Lxs ;
  1550.  
  1551. : xB5           ( op1 op2 )
  1552.                 LGS Lxs ;
  1553.  
  1554.  
  1555. : .BSx          1 ANDD Exec: BSF BSR ;
  1556.  
  1557. : BSx           ( op1 op2 -- )
  1558.                 .BSx
  1559.                 drop NEXTB
  1560.                 dup 3 2/S .16REG .,
  1561.                 .MREG
  1562.                 drop ;
  1563.  
  1564. : xB3           ( op1 op2 )
  1565.                 BTR
  1566.                 BTcom ;
  1567.  
  1568. : xBB           ( op1 op2 )
  1569.                 BTC
  1570.                 BTcom ;
  1571.  
  1572.  
  1573. : .BTi          ( ext -- ext )
  1574.                 dup 3 2/S 3 ANDD Exec:
  1575.                         BT  BTS BTR BTC ;
  1576.  
  1577. : BTi           ( op1 op2 | BA )        \ BT with immediate
  1578.                 NEXTB                   \ need 3rd byte
  1579.                 dup $20 ANDD 0= IF      \ oops -- bad code
  1580.                         .NA2 exit
  1581.                 THEN
  1582.                 .BTi                    \ print the opcode
  1583.                 .Word/Dword
  1584.                 .MREG drop
  1585.                 OPS @ CP +!  OPS off
  1586.                 NEXTB .# .h2
  1587.                 2drop ;
  1588.  
  1589.  
  1590. : Mcom                  \ common code for MOVSX, MOVZX
  1591.                 NEXTB
  1592.                 dup 3 2/S .16REG .,
  1593.                 .MREG drop
  1594.                 space .SIZE
  1595.                 drop ;
  1596.  
  1597. : Mzx           ( op1 op2 | 0fB6-0fB7 )
  1598.                 MOVZX Mcom ;
  1599.  
  1600. : Msx           ( op1 op2 | 0fBE-0fBF )
  1601.                 MOVSX Mcom ;
  1602.  
  1603. : xB0S          ( op1 op2 -- )
  1604.                 dup $0F ANDD Exec:
  1605.                         .na1  .na1  xB2   xB3
  1606.                         xB4   xB5   Mzx   Mzx
  1607.                         .na1  .na1  BTi   xBB
  1608.                         BSx   BSx   Msx   Msx  ;
  1609.  
  1610.  
  1611. \ ===========================================================================
  1612.  
  1613. : 0F/80-BF      ( op1 op2 -- )
  1614.                 DUP 4 2/S 3 ANDD Exec:
  1615.                       x80S x90S xA0S xB0S ;
  1616.  
  1617. \ ===========================================================================
  1618. \ ===========================================================================
  1619.  
  1620. : .Prefix       ( -- )
  1621.                 drop
  1622.                 25 col ." <prefix>" ;
  1623.  
  1624. : .INST_1                       \ 1-byte opcodes
  1625.                 6 2/S Exec:
  1626.                         00-3F 40-7F 80-BF C0-FF ;
  1627.  
  1628. : .INST_2                       \ 2-byte opcodes
  1629.                 dup 6 2/S Exec:
  1630.                         0F/00-3F .NA1 0F/80-BF .NA1 ;
  1631.  
  1632. : .INST         ( op )
  1633.                 2 SPACES
  1634.                 NEXTB
  1635.                 255 ANDD
  1636.                 DUP Case
  1637.                         $0F Of
  1638.                                 NEXTB .INST_2
  1639.                             EndOf
  1640.                         $26 Of
  1641.                                 ." ES:" .Prefix
  1642.                             EndOf
  1643.                         $2E Of
  1644.                                 ." CS:" .Prefix
  1645.                             EndOf
  1646.                         $36 Of
  1647.                                 ." SS:" .Prefix
  1648.                             EndOf
  1649.                         $3E Of
  1650.                                 ." DS:" .Prefix
  1651.                             EndOf
  1652.                         $64 Of
  1653.                                 ." FS:" .Prefix
  1654.                             EndOf
  1655.                         $65 Of
  1656.                                 ." GS:" .Prefix
  1657.                             EndOf
  1658.                         $66 Of
  1659.                                 Osize on
  1660.                                 ." Operand_Size"
  1661.                                 .Prefix
  1662.                             EndOf
  1663.                         $67 Of
  1664.                                 Asize on
  1665.                                 ." Address_Size"
  1666.                                 .Prefix
  1667.                             EndOf
  1668.                         $F0 Of
  1669.                                 ." LOCK" .Prefix
  1670.                             EndOf
  1671.                         .INST_1
  1672.                         Osize off
  1673.                         Asize off
  1674.                 EndCase
  1675.                 OPS @ CP +!
  1676.                 OPS OFF
  1677.                 DISP OFF ;
  1678.  
  1679.  
  1680. : INST                                  \ display opcode at ip  advancing as needed
  1681.                 DUMPSEG @ ?CS: = IF     \ Display  CODE <name> if in CS:
  1682.                    CP @ >NAME DUP
  1683.                    [ ' NO-NAME >NAME ]
  1684.                    LITERAL XORR
  1685.                    IF
  1686.                       ID0 @ MS CR ." CODE " DUP .ID| CR
  1687.                    THEN
  1688.                    DROP
  1689.                 THEN
  1690.                 .INST ;
  1691.  
  1692.  
  1693. \ ===========================================================================
  1694. HEADERS         \ ***********************************************************
  1695. \ ===========================================================================
  1696.  
  1697. FORTH DEFINITIONS
  1698.  
  1699. \ Display memory ("dump" format)
  1700.  
  1701. : DM            ( a - a' )
  1702.                 SAVESTATE
  1703.                 Hex
  1704.                 BEGIN   CR DUMPSEG @ (.h4) ." :"
  1705.                         DUP .h4 ." - "
  1706.                         BASE @ 2DUP DUMP|
  1707.                         2 SPACES 2DUP %type +
  1708.                         ?KEYPAUSE
  1709.                 AGAIN   ;
  1710.  
  1711. \ Disassemble instructions .. from address
  1712.  
  1713. : DIS           ( a )
  1714.                 CP !
  1715.                 SAVESTATE
  1716.                 HEX
  1717.                 BEGIN   CP @                            \ save current addr for later
  1718.                         CR INST                         \ process the instruction
  1719.                         37 COL ." \"                    \ space over on output line
  1720.                         DUMPSEG @ .h4 DUP .h4           \ print addr (seg & offset) of instr
  1721.                         CP @ OVER -                     \ using saved value, calc length of the instruction's code
  1722.                         2DUP
  1723.                         SPACE DUMP|                     \ dump in hex
  1724.                         69 COL %type                    \ and printable ascii
  1725.                         ?STACK                          \ make sure stack is OK
  1726.                         ?KEYPAUSE                       \ check for Pause or Stop
  1727.                 AGAIN   ;
  1728.  
  1729. \ Disassemble Interrupt Procedure .. from Int Number
  1730.  
  1731. : IDIS          ( int# )
  1732.                 #INT2@ SWAP DUMPSEG ! DIS ;
  1733.  
  1734. \ ===========================================================================
  1735.  
  1736. : SEEN          ( a )
  1737.                 [ HIDDEN ]
  1738.                 ?CS: DUMPSEG !
  1739.                DUP @REL>ABS DEFINITION-CLASS MAX-CLASSES
  1740.                = IF
  1741.                     DUP DOES? NIP 0= IF
  1742.                        DIS
  1743.                        EXIT
  1744.                     THEN
  1745.                THEN
  1746.                (SEE) ;
  1747.  
  1748. : SEE ( name ) ' SEEN ;
  1749.  
  1750. \ ===========================================================================
  1751. BEHEAD          \ ***********************************************************
  1752.  
  1753. ONLY  FORTH  ALSO  DEFINITIONS
  1754. \ ===========================================================================
  1755.  
  1756. CR .( Dasm386 LOADED )
  1757.