Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. \ 80386 DISASSEMBLER
  2. \ ANDREW MCKEWAN, APRIL 1994
  3. \ TOM ZIMMER,  05/18/94 PORT TO WIN32F
  4. \ MODIFIED TO WORD IN DECIMAL 08/03/94 10:04 TJZ
  5. \ 06-??-95 SMUB NEXT SEQUENCE DEFINED IN FKERNEL
  6. \ 06-21-95 SMUB REMOVED REDUNDANT COUNT CALLS FROM TXB, LXS.
  7. \ 04-??-97 EXTENDED BY C.L. TO INCLUDE P6 AND MMX INSTRUCTIONS
  8. \
  9. REQUIRE MAXSTRING ~mak\UTILS_.F
  10.  
  11. CR .( LOADING 80486 DISASSEMBLER...)
  12.  
  13. ONLY FORTH ALSO  DEFINITIONS
  14.  
  15. 0 VALUE DEFAULT-16BIT?
  16.  
  17. : DEFAULT-16BIT ( -- )
  18.                 TRUE TO DEFAULT-16BIT? ;
  19.  
  20. : DEFAULT-32BIT ( -- )
  21.                 FALSE TO DEFAULT-16BIT? ;
  22.  
  23.       VECT SHOW-NAME   ( CFA -- )      \ DISPLAY NEAREST SYMBOL
  24.  
  25. 0 VALUE BASE-ADDR
  26.  
  27. VOCABULARY DISASSEMBLER
  28. DISASSEMBLER ALSO DEFINITIONS
  29.  
  30. DECIMAL
  31.  
  32. CREATE S-BUF MAXSTRING ALLOT
  33.  
  34. : >S            ( A1 N1 -- )
  35.                 S-BUF +PLACE ;
  36.  
  37. : 0>S           ( -- )  \ RESET S-BUF
  38.                 S-BUF OFF ;
  39.  
  40. : SSPACES       ( N1 -- )
  41.                 SPCS SWAP S-BUF  +PLACE ;
  42.  
  43. : SSPACE        ( -- )
  44.                 1 SSPACES ;
  45.  
  46. : EMIT>S        ( C1 -- )
  47.                 S-BUF C+PLACE ;
  48.  
  49. : S>            ( -- A1 N1 )
  50.                 S-BUF COUNT ;
  51.  
  52. : (.S")         ( addr len -- )
  53.                 S-BUF +PLACE ;
  54.  
  55. : .S"           ( 'TEXT' -- )
  56.                 [CHAR] " PARSE
  57.                 POSTPONE SLITERAL
  58.                 POSTPONE (.S")  ; IMMEDIATE
  59.  
  60.  
  61. : D.R>S         ( D W -- )
  62.                 >R (D.) R> OVER - SSPACES >S ;
  63.  
  64. : .R>S          ( N W -- )
  65.                 >R  S>D  R>  D.R>S ;
  66.  
  67. : U.R>S         ( U W -- )
  68.                 0 SWAP D.R>S ;
  69.  
  70. : H.>S          ( U -- )
  71.                 BASE @ SWAP  HEX 0 (D.) >S SSPACE   BASE ! ;
  72.  
  73. : H.R>S           ( N1 N2 -- )
  74.                 BASE @ >R HEX >R
  75.                 0 <# #S #> R> OVER - SSPACES >S
  76.                 R> BASE ! ;
  77.  
  78. : ?.NAME>S      ( CFA -- )
  79. \ ELIMINATE " 0X"
  80.                 DUP   1 H.R>S SSPACE
  81.                 DUP WordByAddr
  82.                 >R  TUCK 1- NAME> =
  83.                 IF .S"  ( "  R> >S   .S"  ) "
  84.                 ELSE RDROP DROP
  85.                 THEN
  86.                 ;
  87.  
  88. ' ?.NAME>S TO SHOW-NAME
  89.  
  90. \ 32 CONSTANT COMMENT-COL
  91.  
  92. 0 VALUE SIZE
  93. 0 VALUE 16-BIT-DATA
  94. 0 VALUE 16-BIT-ADDR
  95. 0 VALUE PREFIX-OP
  96. 0 VALUE MMX-REG
  97.  
  98. : @+  ( ADDR -- ADDR N )  DUP CELL+ SWAP @ ;
  99. : W@+ ( ADDR -- ADDR N )  DUP 2 + SWAP W@ ;
  100.  
  101. : SEXT  ( BYTE -- N )  DUP 128 AND IF 0xFFFFFF00 OR THEN ;
  102. : MOD/SIB ( MOD-R-R/M -- R/M R MOD ) \ R INCLUDING GENERAL, SPECIAL, SEGMENT, MMX
  103.           ( MOD-OP-R/M -- R/M OP MOD )
  104.           ( S-I-B -- B I S )
  105.           255 AND 8 /MOD 8 /MOD ;
  106.  
  107. : ???   ( N1 -- )
  108.         .S" ??? " DROP ;
  109.  
  110. : SS. ( N ADR LEN W )  >R DROP  SWAP R@ * +  R> >S SSPACE ;
  111.  
  112. : TTTN ( CODE -- ) 15 AND S" O NOB AEE NEBEA S NSP NPL GELEG " 2 SS. ;
  113.  
  114. : SREG  ( SREG -- )  3 RSHIFT 7 AND S" ESCSSSDSFSGSXXXX" 2 SS. ;
  115. : CREG  ( EEE --  )  3 RSHIFT 7 AND S" CR0???CR2CR3CR4?????????" 3 SS. ;
  116. : DREG  ( EEE --  )  3 RSHIFT 7 AND S" DR0DR1DR2DR3??????DR6DR7" 3 SS. ;
  117. : TREG  ( EEE --  )  3 RSHIFT 7 AND S" ?????????TR3TR4TR5TR6TR7" 3 SS. ; \ OBSOLETE
  118. : MREG  ( N -- )  7 AND S" MM0MM1MM2MM3MM4MM5MM6MM7" 3 SS. ;
  119.  
  120. : REG8  ( N -- )  7 AND S" ALCLDLBLAHCHDHBH" 2 SS. ;
  121. : REG16 ( N -- )  7 AND S" AXCXDXBXSPBPSIDI" 2 SS. ;
  122. : REG32 ( N -- )  7 AND S" EAXECXEDXEBXESPEBPESIEDI" 3 SS. ;
  123. : REG16/32      ( N -- )
  124.                 16-BIT-DATA
  125.                 IF   REG16
  126.                 ELSE REG32
  127.                 THEN  ;
  128. : REG   ( A N -- A )
  129.         MMX-REG
  130.         IF   MREG
  131.         ELSE SIZE
  132.              IF   REG16/32
  133.              ELSE REG8
  134.              THEN
  135.         THEN
  136.  ;
  137.  
  138. : [BASE16] ( R/M -- )   4 - S" [SI][DI][BP][BX]" 4 SS. ;
  139.                         \ R/M = 4 , 5 , 6 , 7
  140. : [IND16]  ( R/M -- )   S" [BX+SI][BX+DI][BP+SI][BP+DI]" 7 SS. ;
  141.                         \ R/M = 0  ,   1  ,   2  ,   3
  142. : [REG16]  ( R/M -- )   DUP 4 <
  143.                         IF    [IND16]
  144.                         ELSE  [BASE16]
  145.                         THEN ;
  146. : [REG32]  ( N -- )     7 AND S" [EAX][ECX][EDX][EBX][ESP][EBP][ESI][EDI]" 5 SS. ;
  147.  
  148. \ : [REG]    ( R/M -- )  16-BIT-ADDR
  149. \                        IF   [REG16]
  150. \                        ELSE [REG32]
  151. \                        THEN SSPACE ;
  152.  
  153. \ : [REG] ( N -- )
  154. \        7 AND
  155. \        16-BIT-ADDR
  156. \        IF      S" [BX+SI] [BX+DI] [BP+SI] [BP+DI] [SI] [DI] [BP] [BX]"
  157. \                ROT 0
  158. \                ?DO     BL SKIP BL SCAN
  159. \                LOOP    BL SKIP 2DUP BL SCAN NIP - >S 2 SSPACES
  160. \        ELSE    S" [EAX][ECX][EDX][EBX][ESP][EBP][ESI][EDI]" 5 SS. SSPACE
  161. \        THEN    ;
  162.  
  163. : [REG*2]  ( I -- )     S" [EAX*2][ECX*2][EDX*2][EBX*2][XXX*2][EBP*2][ESI*2][EDI*2]" 7 SS. ;
  164. : [REG*4]  ( I -- )     S" [EAX*4][ECX*4][EDX*4][EBX*4][XXX*4][EBP*4][ESI*4][EDI*4]" 7 SS. ;
  165. : [REG*8]  ( I -- )     S" [EAX*8][ECX*8][EDX*8][EBX*8][XXX*8][EBP*8][ESI*8][EDI*8]" 7 SS. ;
  166. : [INDEX]  ( SIB -- )   MOD/SIB OVER 4 =
  167.                         IF    2DROP                     \ NO ESP SCALED INDEX
  168.                         ELSE  CASE ( S )
  169.                                 0 OF [REG32] ENDOF
  170.                                 1 OF [REG*2] ENDOF
  171.                                 2 OF [REG*4] ENDOF
  172.                                 3 OF [REG*8] ENDOF
  173.                               ENDCASE
  174.                         THEN DROP ;
  175.  
  176. : DISP8  ( ADR -- ADR' )  COUNT H.>S ;
  177. : DISP16 ( ADR -- ADR' )  W@+ SHOW-NAME ;
  178. : DISP32 ( ADR -- ADR' )   @+  ( BODY> ) SHOW-NAME ;
  179. : DISP16/32 ( ADR -- ADR' )
  180.             16-BIT-ADDR
  181.             IF   DISP16
  182.             ELSE DISP32          
  183.             THEN ;
  184.  
  185. : .,     ( -- )           .S" , " ;
  186.  
  187. : .#  ., .S" # " ;
  188.  
  189. : IMM8   ( ADR -- ADR' )  .# COUNT H.>S ;
  190.  
  191. \ : IMM16  ( ADR -- ADR' )  .# W@+ H.>S ;
  192.  
  193. : IMM16/32  ( ADR -- ADR' )
  194.         .# 16-BIT-DATA
  195.         IF   W@+
  196.         ELSE @+
  197.         THEN H.>S ;
  198.  
  199. : SIB   ( ADR MOD -- ADR )
  200.         >R COUNT TUCK 7 AND 5 = R@ 0= AND
  201.         IF    DISP32 SWAP [INDEX] R> DROP       \ EBP BASE AND MOD = 00
  202.         ELSE  R> CASE ( MOD )
  203.                    1 OF DISP8  ENDOF
  204.                    2 OF DISP32 ENDOF
  205.                  ENDCASE
  206.               SWAP DUP [REG32] [INDEX]
  207.         THEN ;
  208.  
  209. \ : [*]  ( SIB --  )
  210. \       .S" SIB = " H.>S ;
  211.  
  212. \ : SIB ( ADR EXT -- ADR' )
  213. \ ?? WRONG VERSION
  214. \        SWAP COUNT >R SWAP  6 RSHIFT 3 AND
  215. \        ?DUP IF 1 = IF DISP8 ELSE DISP32 THEN THEN
  216. \        R> DUP 7 AND DUP 5 =
  217. \        IF      DROP [*]
  218. \        ELSE    [REG]
  219. \                DUP 0x38 AND 0x20 =
  220. \                IF      DROP
  221. \                ELSE    .S" [" DUP 3 RSHIFT REG32 -1 S-BUF C+!
  222. \                        5 RSHIFT 6 AND
  223. \                        DUP 6 = IF 2 + THEN
  224. \                       ?DUP IF .S" *" 0 .R>S  THEN .S" ] "
  225. \                THEN
  226. \        THEN ;
  227.  
  228.  
  229. : MOD-R/M32     ( ADR R/M MOD -- ADR' )
  230.                 DUP 3 =
  231.                 IF    DROP  REG                         \ MOD = 3, REGISTER CASE
  232.                 ELSE  OVER 4 =
  233.                       IF NIP SIB                        \ R/M = 4, SIB CASE
  234.                       ELSE  2DUP 0= SWAP 5 = AND        \ MOD = 0, R/M = 5,
  235.                             IF 2DROP DISP32             \ DISP32 CASE
  236.                             ELSE ROT SWAP
  237.                                  CASE ( MOD )
  238.                                    1 OF DISP8  ENDOF
  239.                                    2 OF DISP32 ENDOF
  240.                                  ENDCASE
  241.                                  SWAP [REG32]
  242.                             THEN
  243.                       THEN
  244.                 THEN ;
  245.  
  246. : MOD-R/M16     ( ADR R/M MOD -- ADR' )
  247.                 2DUP 0= SWAP 6 = AND
  248.                 IF   2DROP DISP16                       \ DISP16 CASE
  249.                 ELSE CASE ( MOD )
  250.                        0 OF [REG16]                     ENDOF
  251.                        1 OF SWAP DISP8  SWAP [REG16]    ENDOF
  252.                        2 OF SWAP DISP16 SWAP [REG16]    ENDOF
  253.                        3 OF REG                         ENDOF
  254.                      ENDCASE
  255.                 THEN ;
  256.  
  257. : MOD-R/M ( ADR MODR/M -- ADR' )
  258.           MOD/SIB NIP 16-BIT-ADDR
  259.           IF    MOD-R/M16
  260.           ELSE  MOD-R/M32
  261.           THEN ;
  262.  
  263. \ : MOD-R/M  ( ADR EXT -- ADR' )
  264. \        DUP 0xC7 AND 5 =                \ 32BIT DISPLACEMENT
  265. \        16-BIT-ADDR 0= AND              \ AND NOT 16BIT ADDRESSING
  266. \        IF      DROP DISP32 .S" [] "
  267. \                EXIT
  268. \        THEN
  269. \        DUP 0xC0 AND 0xC0 < OVER 7 AND 4 = AND
  270. \        16-BIT-ADDR 0= AND              \ AND NOT 16BIT ADDRESSING
  271. \        IF      SIB
  272. \                EXIT
  273. \        THEN
  274. \        DUP 0xC7 AND 6 =                \ 16BIT DISPLACEMENT
  275. \        16-BIT-ADDR AND                 \ AND 16BIT ADDRESSING
  276. \        IF      DROP DISP32 .S" [] "
  277. \                EXIT
  278. \        THEN
  279. \        DUP 6 RSHIFT
  280. \        CASE
  281. \          0 OF  .S" 0 " [REG]  ENDOF
  282. \          1 OF  SWAP DISP8  SWAP [REG]  ENDOF
  283. \          2 OF  SWAP DISP32 SWAP [REG]  ENDOF
  284. \          3 OF  REG  ENDOF
  285. \        ENDCASE ;
  286.  
  287.  
  288.  
  289.  
  290. : R/M8      0 TO SIZE MOD-R/M ;
  291. : R/M16/32  1 TO SIZE MOD-R/M ;
  292. : R/M16     TRUE TO 16-BIT-DATA R/M16/32 ;
  293.  
  294. : R,R/M  ( ADR -- ADR' )
  295.         COUNT DUP 3 RSHIFT REG .,  MOD-R/M ;
  296.  
  297. : R/M,R  ( ADR -- ADR' )
  298.         COUNT DUP>R MOD-R/M ., R> 3 RSHIFT REG ;
  299.  
  300. : R/M  ( ADR OP -- ADR' )
  301.         2 AND
  302.         IF     R,R/M
  303.         ELSE   R/M,R
  304.         THEN  ;
  305.  
  306. \ -------------------- SIMPLE OPCODES --------------------
  307.  
  308. : INH   ( -<NAME>- )
  309.         CREATE
  310.         BL WORD COUNT HERE PLACE
  311.         HERE C@ 1+ ALLOT
  312.         DOES> COUNT >S SSPACE DROP ;
  313.  
  314. INH CLC  CLC
  315. INH STC  STC
  316. INH CLD  CLD
  317. INH STD  STD
  318. \ INH RPNZ REPNZ
  319. \ INH REPZ REPZ
  320. INH CBW  CBW
  321. INH CDQ  CDQ
  322. INH DAA  DAA
  323. INH DAS  DAS
  324. INH AAA  AAA
  325. INH AAS  AAS
  326. \ INH LOCK LOCK
  327. INH INB  INSB
  328. INH OSB  OUTSB
  329. INH SAH  SAHF
  330. INH LAH  LAHF
  331. \ INH AAM  AAM
  332. \ INH AAD  AAD
  333. INH HLT  HLT
  334. INH CMC  CMC
  335. INH XLT  XLAT
  336. INH CLI  CLI
  337. INH STI  STI
  338.  
  339. INH CLT CLTS
  340. INH INV INVD
  341. INH WIV WBINVD
  342. INH UD2 UD2
  343. INH WMR WRMSR
  344. INH RTC RDTSC
  345. INH RMR RDMSR
  346. INH RPC RDPMC
  347. INH EMS EMMS
  348. INH RSM RSM
  349. INH CPU CPUID
  350. INH UD1 UD1
  351. \ INH LSS LSS
  352. \ INH LFS LFS
  353. \ INH LGS LGS
  354.  
  355. \ INH D16: D16:
  356. \ INH A16: A16:
  357. \ INH ES:  ES:
  358. \ INH CS:  CS:
  359. \ INH DS:  DS:
  360. \ INH FS:  FS:
  361. \ INH GS:  GS:
  362.  
  363. : AAM   ( ADR CODE -- ADR' )
  364.         .S" AAM" DROP COUNT DROP ;
  365.  
  366. : AAD   ( ADR CODE -- ADR' )
  367.         .S" AAD" DROP COUNT DROP ;
  368.  
  369. : D16   ( ADR CODE -- ADR' )
  370.         DROP .S" D16:"
  371.         TRUE TO 16-BIT-DATA
  372.         TRUE TO PREFIX-OP
  373.         ;
  374.  
  375. : A16   ( ADR CODE -- ADR' )
  376.         DROP .S" A16:"
  377.         TRUE TO 16-BIT-ADDR
  378.         TRUE TO PREFIX-OP
  379.         ;
  380.  
  381. : RPZ   ( ADR CODE -- ADR' )
  382.         DROP .S" REPNZ"
  383.         TRUE TO PREFIX-OP
  384.         ;
  385.  
  386. : REP   ( ADR CODE -- ADR' )
  387.         DROP .S" REPZ"
  388.         TRUE TO PREFIX-OP
  389.         ;
  390.  
  391. : LOK   ( ADR CODE -- ADR' )  \ THIS SHOULD HAVE ERROR CHECKING ADDED
  392.         DROP .S" LOCK"
  393.         TRUE TO PREFIX-OP
  394.         ;
  395.  
  396. : CS:   ( ADR CODE -- ADR' )
  397.         DROP .S" CS:"
  398.         TRUE TO PREFIX-OP
  399.         ;
  400.  
  401. : DS:   ( ADR CODE -- ADR' )
  402.         DROP .S" DS:"
  403.         TRUE TO PREFIX-OP
  404.         ;
  405.  
  406. : SS:   ( ADR CODE -- ADR' )
  407.         DROP .S" SS:"
  408.         TRUE TO PREFIX-OP
  409.         ;
  410.  
  411. : ES:   ( ADR CODE -- ADR' )
  412.         DROP .S" ES:"
  413.         TRUE TO PREFIX-OP
  414.         ;
  415.  
  416. : GS:   ( ADR CODE -- ADR' )
  417.         DROP .S" GS:"
  418.         TRUE TO PREFIX-OP
  419.         ;
  420.  
  421. : FS:   ( ADR CODE -- ADR' )
  422.         DROP .S" FS:"
  423.         TRUE TO PREFIX-OP
  424.         ;
  425.  
  426. : ISD   ( ADR CODE -- ADR' )
  427.         DROP 16-BIT-DATA
  428.         IF      .S" INSW    "
  429.         ELSE    .S" INSD    "
  430.         THEN ;
  431.  
  432. : OSD   ( ADR CODE -- ADR' )
  433.         DROP 16-BIT-DATA
  434.         IF      .S" OUTSW    "
  435.         ELSE    .S" OUTSD    "
  436.         THEN ;
  437.  
  438. : INP   ( ADDR CODE -- ADDR' )
  439.         .S" IN      " 1 AND
  440.         IF      16-BIT-DATA
  441.                 IF      .S" AX , "
  442.                 ELSE    .S" EAX , "
  443.                 THEN
  444.         ELSE    .S" AL , "
  445.         THEN
  446.         COUNT H.>S ;
  447.  
  448. : OTP   ( ADDR CODE -- ADDR' )
  449.         .S" OUT     " 1 AND
  450.         IF      COUNT H.>S 16-BIT-DATA
  451.                 IF      .S" , AX"
  452.                 ELSE    .S" , EAX"
  453.                 THEN
  454.         ELSE    COUNT H.>S .S" , AL"
  455.         THEN
  456.         ;
  457.  
  458. : IND   ( ADDR CODE -- ADDR' )
  459.         .S" IN      " 1 AND
  460.         IF      16-BIT-DATA
  461.                 IF      .S" AX , DX"
  462.                 ELSE    .S" EAX , DX"
  463.                 THEN
  464.         ELSE    .S" AL , DX"
  465.         THEN
  466.         ;
  467.  
  468. : OTD   ( ADDR CODE -- ADDR' )
  469.         .S" OUT     " 1 AND
  470.         IF      16-BIT-DATA
  471.                 IF      .S" DX , AX"
  472.                 ELSE    .S" DX , EAX"
  473.                 THEN
  474.         ELSE    .S" DX , AL"
  475.         THEN
  476.         ;
  477.  
  478. \ -------------------- ALU OPCODES --------------------
  479.  
  480. : .ALU  ( N -- )
  481.         7 AND S" ADDOR ADCSBBANDSUBXORCMP"  3 SS. 4 SSPACES
  482.     ;
  483.  
  484. : ALU  ( ADR OP -- ADR' )
  485.         DUP 3 RSHIFT .ALU R/M ;
  486.  
  487. : ALI ( ADR OP -- ADR' )
  488.         >R COUNT
  489.         DUP 3 RSHIFT .ALU
  490.         MOD-R/M
  491.         R> 3 AND ?DUP
  492.         IF      1 =
  493.                 IF      IMM16/32
  494.                 ELSE    .# COUNT SEXT 0 .R>S SSPACE
  495.                 THEN
  496.         ELSE    IMM8
  497.         THEN ;
  498.  
  499. : ALA  ( ADR OP -- ADR' )
  500.         DUP 3 RSHIFT .ALU
  501.         1 AND IF 0 REG IMM16/32 ELSE 0 REG8 IMM8 THEN ;
  502.  
  503.  
  504. \ -------------------- TEST/XCHG --------------------
  505.  
  506. : TXB   ( ADDR OP -- ADDR' )
  507.         DUP 3 AND S" TESTTESTXCHGXCHG" 4 SS. 3 SSPACES
  508.         1 AND
  509.         IF      1 TO SIZE R,R/M     \ SMUB REMOVED COUNT
  510.         ELSE    0 TO SIZE R,R/M     \ SMUB REMOVED COUNT
  511.         THEN
  512.         ;
  513.  
  514. : TST   ( ADDR OP -- ADDR' )
  515.         .S" TEST    " 1 AND
  516.         IF      16-BIT-DATA
  517.                 IF   .S" AX , "
  518.                 ELSE .S" EAX , "
  519.                 THEN
  520.                 IMM16/32
  521.         ELSE    .S" AL , " IMM8
  522.         THEN
  523.         ;
  524.  
  525. \ -------------------- INC/DEC ----------------------
  526.  
  527. : INC  ( ADDR OP -- ADDR' )
  528.         .S" INC     " REG16/32 ;
  529.  
  530. : DEC  ( ADDR OP -- ADDR' )
  531.         .S" DEC     " REG16/32 ;
  532.  
  533.  
  534. \ -------------------- PUSH/POP --------------------
  535.  
  536. : PSH   ( ADDR OP -- ADDR' )
  537.         .S" PUSH    " REG16/32 ;
  538.  
  539. : POP   ( ADDR OP -- ADDR' )
  540.         .S" POP     " REG16/32 ;
  541.  
  542. : PSS   ( ADDR OP -- ADDR' )
  543.         .S" PUSH    " SREG ;
  544.  
  545. : PPS   ( ADDR OP -- ADDR' )
  546.         .S" POP     " SREG ;
  547.  
  548. : PSA   ( ADDR OP -- ADDR' )
  549.         DROP 16-BIT-DATA
  550.         IF      .S" PUSHA   "
  551.         ELSE    .S" PUSHAD  "
  552.         THEN ;
  553.  
  554. : PPA   ( ADDR OP -- ADDR' )
  555.         DROP 16-BIT-DATA
  556.         IF      .S" POPA    "
  557.         ELSE    .S" POPAD   "
  558.         THEN ;
  559.  
  560. : PSI   ( ADDR OP -- ADDR' )
  561.         .S" PUSH    " 2 AND
  562.         IF      IMM8
  563.         ELSE    IMM16/32
  564.         THEN ;
  565.  
  566. : PSF   ( ADDR OP -- ADDR' )
  567.         DROP 16-BIT-DATA
  568.         IF      .S" PUSHF   "
  569.         ELSE    .S" PUSHFD  "
  570.         THEN ;
  571.  
  572. : PPF   ( ADDR OP -- ADDR' )
  573.         DROP 16-BIT-DATA
  574.         IF      .S" POPF    "
  575.         ELSE    .S" POPFD   "
  576.         THEN ;
  577.  
  578. : 8F.   ( ADDR OP -- ADDR' )
  579.         DROP COUNT .S" POP     " R/M16/32 ;
  580.  
  581. \ -------------------- MOVE --------------------
  582.  
  583. : MOV  ( ADDR OP -- ADDR' )
  584.         .S" MOV     " R/M ;
  585.  
  586. : MRI  ( ADDR OP -- ADDR' ) ( MOV REGISTER, IMM )
  587.         .S" MOV     " DUP 8 AND
  588.         IF      REG16/32 IMM16/32
  589.         ELSE    REG8 IMM8
  590.         THEN ;
  591.  
  592. : MVI  ( ADR OP -- ADR' )   ( MOV MEM, IMM )
  593.         .S" MOV     " DROP COUNT MOD-R/M
  594.         SIZE
  595.         IF      IMM16/32
  596.         ELSE    IMM8
  597.         THEN
  598.         ;
  599.  
  600. : MRS   ( ADDR OP -- ADDR' )
  601. \ ? REMOVE REDUNDANT >R , R>
  602.         16-BIT-DATA
  603.         IF      .S" MOV     " DROP
  604.                 1 TO SIZE
  605.                 COUNT DUP MOD-R/M .,
  606.                 SREG
  607.         ELSE    ???
  608.         THEN ;
  609.  
  610. : MSR   ( ADDR OP -- ADDR' )
  611.         16-BIT-DATA
  612.         IF      .S" MOV     " DROP
  613.                 1 TO SIZE
  614.                 COUNT DUP SREG .,
  615.                 MOD-R/M
  616.         ELSE    ???
  617.         THEN ;
  618.  
  619. : MRC   ( ADDR OP -- ADDR' )
  620.         .S" MOV     "
  621.         DROP COUNT DUP REG32 .S" , "
  622.         CREG ;
  623.  
  624. : MCR   ( ADDR OP -- ADDR' )
  625.         .S" MOV     "
  626.         DROP COUNT DUP CREG .S" , "
  627.         REG32 ;
  628.  
  629. : MRD   ( ADDR OP -- ADDR' )
  630.         .S" MOV     "
  631.         DROP COUNT DUP REG32 .S" , "
  632.         DREG ;
  633.  
  634. : MDR   ( ADDR OP -- ADDR' )
  635.         .S" MOV     "
  636.         DROP COUNT DUP DREG .S" , "
  637.         REG32 ;
  638.  
  639. : MRT   ( ADDR OP -- ADDR' )
  640. \ OBSOLETE
  641.         .S" MOV     "
  642.         DROP COUNT DUP REG32 .S" , "
  643.         TREG ;
  644.  
  645. : MTR   ( ADDR OP -- ADDR' )
  646. \ OBSOLETE
  647.         .S" MOV     "
  648.         DROP COUNT DUP TREG .S" , "
  649.         REG32 ;
  650.  
  651. : MV1   ( ADDR OP -- ADDR' )
  652.         .S" MOV     " 1 AND
  653.         IF      16-BIT-DATA
  654.                 IF      .S" AX , "
  655.                 ELSE    .S" EAX , "
  656.                 THEN
  657.         ELSE    .S" AL , "
  658.         THEN
  659.         DISP16/32 ;
  660.  
  661. : MV2   ( ADDR OP -- ADDR' )
  662.         >R   .S" MOV     " DISP16/32 .,
  663.         R> 1 AND
  664.         IF      16-BIT-DATA
  665.                 IF      .S"  AX"
  666.                 ELSE    .S"  EAX"
  667.                 THEN
  668.         ELSE    .S"  AL"
  669.         THEN  
  670.         ;
  671.  
  672. : LEA  ( ADDR OP -- ADDR' )
  673.         .S" LEA     " DROP  1 TO SIZE R,R/M ;
  674.  
  675. : LXS   ( ADDR OP -- ADDR' )
  676.         1 AND
  677.         IF      .S" LDS     "
  678.         ELSE    .S" LES     "
  679.         THEN
  680.         R,R/M   \ SMUB REMOVED COUNT
  681.         ;
  682.  
  683. : BND  ( ADDR OP -- ADDR' )
  684.         .S" BOUND   " DROP  1 TO SIZE R,R/M ;
  685.  
  686. : ARP   ( ADDR OP -- ADDR' )
  687.         .S" ARPL    " DROP
  688.         1 TO SIZE
  689.         TRUE TO 16-BIT-DATA
  690.         R,R/M
  691.         ;
  692.  
  693. : MLI   ( ADDR OP -- ADDR' )
  694.         1 TO SIZE
  695.         .S" IMUL    " 0x69 =
  696.         IF      R,R/M IMM16/32
  697.         ELSE    R,R/M IMM8
  698.         THEN ;
  699.  
  700. \ -------------------- JUMPS AND CALLS --------------------
  701.  
  702. 0 VALUE MAX_REFERENCE
  703.  
  704. : >MAX_R
  705. \  DUP HERE
  706.   DUP MAX_REFERENCE UMAX TO MAX_REFERENCE ;
  707.  
  708. : REL8  ( ADDR OP -- ADDR' )
  709.         COUNT SEXT OVER + >MAX_R H.>S ;
  710.  
  711.  
  712. : REL16/32 ( ADDR OP -- ADDR' )
  713.         16-BIT-ADDR
  714.         IF      W@+
  715.         ELSE    @+
  716.         THEN    OVER + BASE-ADDR - >MAX_R SHOW-NAME ;
  717.  
  718. : JSR  ( ADDR OP -- ADDR' )
  719.          MAX_REFERENCE >R
  720.         .S" CALL    " DROP REL16/32
  721.          R> TO MAX_REFERENCE  ;
  722.  
  723. : JMP  ( ADDR OP -- ADDR' )
  724.         .S" JMP     " 2 AND IF REL8 ELSE REL16/32 THEN ;
  725.  
  726. : .JXX  ( ADDR OP -- ADDR' )
  727.         .S" J" TTTN 4 SSPACES ;
  728.  
  729. : BRA  ( ADDR OP -- ADDR' )
  730.         .JXX REL8 ;
  731.  
  732. : LUP  ( ADDR OP -- ADDR' )
  733.         3 AND S" LOOPNZLOOPZ LOOP  JECXZ " 6 SS. 1 SSPACES REL8 ;
  734.  
  735. : LBR  ( ADDR OP -- ADDR' )
  736.         .JXX REL16/32 ;
  737.  
  738. : RTN  ( ADDR OP -- ADDR' )
  739.         .S" RET     NEAR " 1 AND 0=
  740.         IF      W@+ H.>S
  741.         THEN ;
  742.  
  743. : RTF  ( ADDR OP -- ADDR' )
  744.         .S" RET     FAR " 1 AND 0=
  745.         IF      W@+ H.>S
  746.         THEN ;
  747.  
  748. : ENT  ( ADDR OP -- ADDR' )
  749.         .S" ENTER   " W@+ . ., COUNT H.>S ;
  750.  
  751. : CIS   ( ADDR OP -- ADDR' )
  752.         0x9A =
  753.         IF      .S" CALL    "
  754.         ELSE    .S" JMP     "
  755.         THEN
  756.         16-BIT-DATA
  757.         IF      .S" PTR16:16 "
  758.         ELSE    .S" PTR16:32 "
  759.         THEN
  760.         COUNT MOD-R/M ;
  761.  
  762. : NT3   ( ADDR OP -- ADDR' )
  763.         DROP .S" INT     3 "
  764.         ;
  765.  
  766. : INT   ( ADDR OP -- ADDR' )
  767.         DROP .S" INT     "
  768.         COUNT H.>S ;
  769.  
  770. INH LEV LEAVE
  771. INH IRT  IRET
  772. INH NTO  INTO
  773.  
  774. \ -------------------- STRING OPS --------------------
  775.  
  776. : STR   INH DOES> COUNT >S  1 AND IF .S" D" ELSE .S" B" THEN ;
  777.  
  778. STR MVS MOVS
  779. STR CPS CMPS
  780. STR STS STOS
  781. STR LDS LODS
  782. STR SCS SCAS
  783.  
  784. \ -------------------- EXCHANGE --------------------
  785.  
  786. : XGA  ( ADDR OP -- ADDR' )
  787.         .S" XCHG     EAX, " REG16/32 ;
  788.  
  789. \ : XCH  ( ADDR OP -- ADDR' )
  790. \       .S" XCHG    " DROP R,R/M ;
  791.  
  792.  
  793. \ -------------------- SHIFTS & ROTATES --------------------
  794.  
  795. : .SHIFT ( N -- )
  796.         7 AND S" ROLRORRCLRCRSHLSHRXXXSAR" 3 SS.  4 SSPACES ;
  797.  
  798. : SHF  ( ADDR OP -- ADDR' )
  799.         >R COUNT
  800.         DUP 3 RSHIFT .SHIFT
  801.         MOD-R/M .,
  802.         R> 0xD2 AND
  803.         CASE
  804.            0xC0 OF COUNT H.>S      ENDOF
  805.            0xD0 OF 1 H.>S          ENDOF
  806.            0xD2 OF 1 REG8          ENDOF
  807.         ENDCASE ;
  808.  
  809. \ -------------------- EXTENDED OPCODES --------------------
  810.  
  811. : WF1  ( ADDR -- ADDR' )
  812.         1+ COUNT DUP
  813.         0x0C0 <
  814.         IF      DUP
  815.                 3 RSHIFT 7 AND
  816.                 CASE 6 OF     .S" FSTENV  "      MOD-R/M   ENDOF
  817.                      7 OF     .S" FSTCW   WORD " MOD-R/M   ENDOF
  818.                      2DROP 2 - DUP .S" FWAIT   "
  819.                 ENDCASE
  820.         ELSE    DROP 2 - .S" FWAIT   "
  821.         THEN ;
  822.  
  823. : WF2  ( ADDR -- ADDR' )
  824.         1+ COUNT
  825.         CASE 0xE2 OF   .S" FCLEX   "  ENDOF
  826.              0xE3 OF   .S" FINIT   "  ENDOF
  827.              SWAP 2 - SWAP .S" FWAIT   "
  828.         ENDCASE ;
  829.  
  830. : WF3  ( ADDR -- ADDR' )
  831.         1+ COUNT DUP 3 RSHIFT 7 AND
  832.         CASE 6 OF     .S" FSAVE   "      MOD-R/M   ENDOF
  833.              7 OF     .S" FSTSW   WORD " MOD-R/M   ENDOF
  834.              2DROP 2 - DUP .S" FWAIT   "
  835.         ENDCASE ;
  836.  
  837. : WF4  ( ADDR -- ADDR' )
  838.         1+ COUNT 0xE0 =
  839.         IF      .S" FSTSW   AX "
  840.         ELSE    2 - .S" FWAIT   "
  841.         THEN ;
  842.  
  843. : FWAITOPS   ( ADDR OP -- ADDR' )
  844.         CASE 0xD9 OF    WF1     ENDOF
  845.              0xDB OF    WF2     ENDOF
  846.              0xDD OF    WF3     ENDOF
  847.              0xDF OF    WF4     ENDOF
  848.              .S" FWAIT   "
  849.         ENDCASE ;
  850.  
  851. : W8F   ( ADDR OP -- ADDR' )
  852.         DROP DUP C@ DUP 0xF8 AND 0xD8 =
  853.         IF      FWAITOPS
  854.         ELSE    DROP .S" WAIT    "
  855.         THEN ;
  856.  
  857. : FALU1   ( XOPCODE -- )
  858.         3 RSHIFT 7 AND
  859.         S" FADD FMUL FCOM FCOMPFSUB FSUBRFDIV FDIVR"
  860.         5 SS. 2 SSPACES ;
  861.  
  862. : FALU5   ( XOPCODE -- )
  863.         3 RSHIFT 7 AND
  864.         S" FADD FMUL ???? ???? FSUBRFSUB FDIVRFDIV "
  865.         5 SS. 2 SSPACES ;
  866.  
  867. : STI.   ( OP -- )
  868.         7 AND .S" ST(" 1 .R>S .S" )";
  869.  
  870. \ : STI.ST   ( OP -- )
  871. \        7 AND
  872. \        .S" ST(" 1 .R>S .S" )" .S"  ST " ;
  873.  
  874. : FD8   ( ADDR OPCODE -- ADDR' )
  875.         DROP COUNT DUP FALU1
  876.         DUP 0xC0 <
  877.         IF      .S" FLOAT " MOD-R/M
  878.         ELSE    DUP 0xF0 AND 0xD0 =
  879.                 IF      STI.
  880.                 ELSE    .S" ST , " STI.
  881.                 THEN
  882.         THEN ;
  883.  
  884. : FDC   ( ADDR OPCODE -- ADDR' )
  885.         DROP COUNT
  886.         DUP DUP 0xC0 <
  887.         IF      FALU1 .S" DOUBLE " MOD-R/M
  888.         ELSE    FALU5 STI. .S"  , ST"
  889.         THEN ;
  890.  
  891. : FNULLARY-F   ( OP -- )
  892.         0x0F AND DUP 8 <
  893.         IF
  894.            S" F2XM1  FYL2X  FPTAN  FPATAN FXTRACTFPREM1 FDECSTPFINCSTP"
  895.         ELSE  8 -
  896.            S" FPREM  FYL2XP1FSQRT  FSINCOSFRNDINTFSCALE FSIN   FCOS   "
  897.         THEN
  898.         7 SS. ;
  899.  
  900. : FNULLARY-E   ( OP -- )
  901.         0x0F AND DUP 8 <
  902.         IF
  903.            S" FCHS   FABS   ???    ???    FTST   FXAM   ???    ???    "
  904.         ELSE  8 -
  905.            S" FLD1   FLDL2T FLDL2E FLDPI  FLDLG2 FLDLN2 FLDZ   ???    "
  906.         THEN
  907.         7 SS. ;
  908.  
  909. : FNULLARY   ( OP -- )
  910.         DUP 0xEF >
  911.         IF      FNULLARY-F EXIT
  912.         THEN
  913.         DUP 0xE0 <
  914.         IF      0xD0 =
  915.                 IF      .S" FNOP"
  916.                 ELSE    DUP ???
  917.                 THEN
  918.                 EXIT
  919.         THEN
  920.         FNULLARY-E ;
  921.  
  922.  
  923. \ : FALU2   ( OP -- )
  924. \        3 RSHIFT 7 AND
  925. \        S" FLD    ???    FST    FSTP   FLDENV FLDCW  FNSTENVFNSTCW "
  926. \        7 SS. ;
  927.  
  928. : FD9   ( ADDR OP -- ADDR' )
  929.         DROP COUNT DUP 0xC0 <
  930.         IF      DUP 0x38 AND
  931.                 CASE
  932.                         0x00 OF .S" FLD     FLOAT "  ENDOF
  933.                         0x10 OF .S" FST     FLOAT "  ENDOF
  934.                         0x18 OF .S" FSTP    FLOAT "  ENDOF
  935.                         0x20 OF .S" FLDENV  "        ENDOF
  936.                         0x28 OF .S" FLDCW   WORD "   ENDOF
  937.                         0x30 OF .S" FNSTENV "        ENDOF
  938.                         0x38 OF .S" FNSTCW  WORD "   ENDOF
  939.                             DUP ???
  940.                 ENDCASE
  941.                 MOD-R/M
  942.         ELSE
  943.                 DUP 0xD0 <
  944.                 IF      DUP 0xC8 <
  945.                         IF      .S" FLD     "
  946.                         ELSE    .S" FXCH    "
  947.                         THEN
  948.                         STI.
  949.                 ELSE    FNULLARY
  950.                 THEN
  951.         THEN ;
  952.  
  953. : FALU3   ( OP -- )
  954.         3 RSHIFT 7 AND
  955.         S" FIADD FIMUL FICOM FICOMPFISUB FISUBRFIDIV FIDIVR"
  956.         6 SS. 1 SSPACES ;
  957.  
  958. : FCMOVA  ( OP -- )
  959.         3 RSHIFT 7 AND
  960.         S" FCMOVB FCMOVE FCMOVBEFCMOVU ???    ???    ???    ???    "
  961.         7 SS. ;
  962.  
  963. : FDA   ( ADDR OP -- )
  964.         DROP COUNT DUP 0xC0 <
  965.         IF      DUP FALU3 .S" DWORD " MOD-R/M
  966.         ELSE    0xE9 =
  967.                 IF      .S" FUCOMPP" DROP
  968.                 ELSE    DUP FCMOVA STI.
  969.                 THEN
  970.         THEN ;
  971.  
  972. : FALU7  ( OP -- )
  973.         3 RSHIFT 7 AND
  974.         S" FADDP FMULP ???   ???   FSUBRPFSUBP FDIVRPFDIVP "
  975.         6 SS. SSPACE ;
  976.  
  977. : FDE   ( ADDR OP -- ADDR' )
  978.         DROP COUNT DUP 0xC0 <
  979.         IF      DUP FALU3 .S" WORD " MOD-R/M
  980.         ELSE    DUP 0xD9 =
  981.                 IF    .S" FCOMPP" DROP
  982.                 ELSE  DUP FALU7 STI.
  983.                 THEN
  984.         THEN ;
  985.  
  986.  
  987. : FCMOVB  ( OP -- )
  988.         3 RSHIFT 7 AND
  989.         S" FCMOVNB FCMOVNE FCMOVNBEFCMOVNU ???     FUCOMI  FCOMI   ???     "
  990.         8 SS. ;
  991.  
  992. : FDB   ( ADDR OP -- ADDR' )
  993.         DROP COUNT DUP 0xC0 <
  994.         IF      DUP 0x38 AND
  995.                 CASE    0x00 OF .S" FILD    DWORD "    ENDOF
  996.                         0x10 OF .S" FIST    DWORD "    ENDOF
  997.                         0x18 OF .S" FISTP   DWORD "    ENDOF
  998.                         0x28 OF .S" FLD     EXTENDED " ENDOF
  999.                         0x38 OF .S" FSTP    EXTENDED " ENDOF
  1000.                             DUP ???
  1001.                 ENDCASE
  1002.                 MOD-R/M
  1003.         ELSE
  1004.                 CASE    0xE2 OF .S" FNCLEX" ENDOF
  1005.                         0xE3 OF .S" FNINIT" ENDOF
  1006.                             DUP DUP FCMOVB STI.
  1007.                 ENDCASE
  1008.         THEN ;
  1009.  
  1010. : FALU6  ( OP -- )
  1011.         3 RSHIFT 7 AND
  1012.         S" FFREE ???   FST   FSTP  FUCOM FUCOMP???   ???   "
  1013.         6 SS. SSPACE ;
  1014.  
  1015. : FDD   ( ADDR OP -- ADDR' )
  1016.         DROP COUNT DUP 0xC0 <
  1017.         IF      DUP 0x38 AND
  1018.                 CASE    0x00 OF .S" FLD     DOUBLE "  ENDOF
  1019.                         0x10 OF .S" FST     DOUBLE "  ENDOF
  1020.                         0x18 OF .S" FSTP    DOUBLE "  ENDOF
  1021.                         0x20 OF .S" FRSTOR  "         ENDOF
  1022.                         0x30 OF .S" FNSAVE  "         ENDOF
  1023.                         0x38 OF .S" FNSTSW  WORD   "  ENDOF
  1024.                             DUP ???
  1025.                 ENDCASE
  1026.                 MOD-R/M
  1027.         ELSE    DUP FALU6 STI.
  1028.         THEN ;
  1029.  
  1030. : FDF   ( ADDR OP -- ADDR' )
  1031.         DROP COUNT DUP 0xC0 <
  1032.         IF      DUP 0x38 AND
  1033.                 CASE    0x00 OF .S" FILD    WORD "   ENDOF
  1034.                         0x10 OF .S" FIST    WORD "   ENDOF
  1035.                         0x18 OF .S" FISTP   WORD "   ENDOF
  1036.                         0x20 OF .S" FBLD    TBYTE "  ENDOF
  1037.                         0x28 OF .S" FILD    QWORD "  ENDOF
  1038.                         0x30 OF .S" FBSTP   TBYTE "  ENDOF
  1039.                         0x38 OF .S" FISTP   QWORD "  ENDOF
  1040.                             DUP ???
  1041.                 ENDCASE
  1042.                 MOD-R/M
  1043.         ELSE    DUP 0xE0 =
  1044.                 IF      .S" FNSTSW  AX " DROP
  1045.                 ELSE    DUP 0x38 AND
  1046.                         CASE    0x28 OF .S" FUCOMIP " STI. ENDOF
  1047.                                 0x30 OF .S" FCOMIP  " STI. ENDOF
  1048.                                         ???
  1049.                         ENDCASE
  1050.                 THEN
  1051.         THEN ;
  1052.  
  1053. : GP6 ( ADDR OP -- ADDR' )
  1054.         DROP COUNT DUP 3 RSHIFT
  1055.         7 AND S" SLDTSTR LLDTLTR VERRVERW??? ???" 4 SS. 3 SSPACES
  1056.         R/M16 ;
  1057.  
  1058. : GP7 ( ADDR OP -- ADDR' )
  1059.         DROP COUNT DUP 3 RSHIFT
  1060.         7 AND DUP S" SGDT  SIDT  LGDT  LIDT  SMSW  ???   LMSW  INVLPG" 6 SS. 1 SSPACES
  1061.         4 AND 4 =
  1062.         IF   R/M16
  1063.         ELSE R/M16/32
  1064.         THEN ;
  1065.  
  1066. : BTX.  ( N -- )
  1067.         3 RSHIFT
  1068.         3 AND S" BT BTSBTRBTC" 3 SS. 4 SSPACES ;
  1069.  
  1070. : GP8 ( ADDR OP -- ADDR' )
  1071.         DROP COUNT DUP BTX.
  1072.         R/M16/32 IMM8 ;
  1073.  
  1074. : LAR ( ADDR OP -- ADDR' )
  1075.         .S" LAR     " DROP R,R/M ;
  1076.  
  1077. : LSL ( ADDR OP -- ADDR' )
  1078.         .S" LSL     " DROP R,R/M ;
  1079.  
  1080. : LSS ( ADDR OP -- ADDR' )
  1081.         .S" LSS     " DROP R,R/M ;
  1082.  
  1083. : LFS ( ADDR OP -- ADDR' )
  1084.         .S" LFS     " DROP R,R/M ;
  1085.  
  1086. : LGS ( ADDR OP -- ADDR' )
  1087.         .S" LGS     " DROP R,R/M ;
  1088.  
  1089. : BTX ( ADDR OP -- ADDR' )
  1090.         BTX. R/M,R ;
  1091.  
  1092. : SLI ( ADDR OP -- ADDR' )
  1093.         .S" SHLD    " DROP R/M,R IMM8 ;
  1094.  
  1095. : SRI ( ADDR OP -- ADDR' )
  1096.         .S" SHRD    " DROP R/M,R IMM8 ;
  1097.  
  1098. : SLC ( ADDR OP -- ADDR' )
  1099.         .S" SHLD    " DROP R/M,R .S" , CL" ;
  1100.  
  1101. : SRC ( ADDR OP -- ADDR' )
  1102.         .S" SHRD    " DROP R/M,R .S" , CL" ;
  1103.  
  1104. : IML ( ADDR OP -- ADDR' )
  1105.         .S" IMUL    " DROP R,R/M ;
  1106.  
  1107. : CXC ( ADDR OP -- ADDR' )
  1108.         .S" CMPXCHG " 1 AND TO SIZE R/M,R ;
  1109.  
  1110. : MVX ( ADDR OP -- ADDR' )
  1111.         DUP 8 AND
  1112.         IF      .S" MOVSX   "
  1113.         ELSE    .S" MOVZX   "
  1114.         THEN
  1115.         1 AND >R
  1116.         COUNT MOD/SIB R>                        \ SIZE BIT
  1117.         IF    SWAP REG32 .,                     \ WORD TO DWORD CASE
  1118.               3 =
  1119.               IF   REG16
  1120.               ELSE .S" WORD PTR " MOD-R/M
  1121.               THEN
  1122.         ELSE  SWAP REG16/32 .,                  \ BYTE CASE
  1123.               3 =
  1124.               IF   REG8
  1125.               ELSE .S" BYTE PTR " MOD-R/M
  1126.               THEN
  1127.         THEN ;
  1128.  
  1129. : XAD ( ADDR OP -- ADDR' )
  1130.         .S" XADD    " 1 AND TO SIZE R/M,R ;
  1131.  
  1132. : BSF ( ADDR OP -- ADDR' )
  1133.         .S" BSF     " DROP R,R/M ;
  1134.  
  1135. : BSR ( ADDR OP -- ADDR' )
  1136.         .S" BSR     " DROP R,R/M ;
  1137.  
  1138. : CX8 ( ADDR OP -- ADDR' )
  1139.         .S" CMPXCHG8B " DROP COUNT R/M16/32 ;
  1140.  
  1141. : BSP ( ADDR OP -- ADDR' )
  1142.         .S" BSWAP   " REG32 ;
  1143.  
  1144. \ : 0F.   ( ADDR OP -- ADDR' )
  1145. \        DROP COUNT
  1146. \        CASE
  1147. \                0x00 OF   GP6                             ENDOF
  1148. \                0x01 OF   GP7                             ENDOF
  1149. \                0x02 OF   .S" LAR     " 1 TO SIZE R,R/M   ENDOF
  1150. \                0x03 OF   .S" LSL     " 1 TO SIZE R,R/M   ENDOF
  1151. \                0x06 OF   .S" CLTS    "                   ENDOF
  1152. \                0x08 OF   .S" INVD    "                   ENDOF
  1153. \                0x09 OF   .S" WBINVD  "                   ENDOF
  1154. \                0x20 OF   MRC                             ENDOF
  1155. \                0x21 OF   MRD                             ENDOF
  1156. \                0x22 OF   MCR                             ENDOF
  1157. \                0x23 OF   MDR                             ENDOF
  1158. \                0x24 OF   MRT                             ENDOF \ OBSOLETE
  1159. \                0x26 OF   MTR                             ENDOF \ OBSOLETE
  1160. \                0x30 OF   .S" WRMSR   "                   ENDOF
  1161. \                0x31 OF   .S" RDTSC   "                   ENDOF
  1162. \                0x32 OF   .S" RDMSR   "                   ENDOF
  1163. \                0x80 OF   .S" JO      " REL16/32          ENDOF
  1164. \                0x81 OF   .S" JNO     " REL16/32          ENDOF
  1165. \                0x82 OF   .S" JC      " REL16/32          ENDOF
  1166. \                0x83 OF   .S" JNC     " REL16/32          ENDOF
  1167. \                0x84 OF   .S" JZ      " REL16/32          ENDOF
  1168. \                0x85 OF   .S" JNE     " REL16/32          ENDOF
  1169. \                0x86 OF   .S" JBE     " REL16/32          ENDOF
  1170. \                0x87 OF   .S" JA      " REL16/32          ENDOF
  1171. \                0x88 OF   .S" JS      " REL16/32          ENDOF
  1172. \                0x89 OF   .S" JNS     " REL16/32          ENDOF
  1173. \                0x8A OF   .S" JPE     " REL16/32          ENDOF
  1174. \                0x8B OF   .S" JPO     " REL16/32          ENDOF
  1175. \                0x8C OF   .S" JNGE    " REL16/32          ENDOF
  1176. \                0x8D OF   .S" JGE     " REL16/32          ENDOF
  1177. \                0x8E OF   .S" JNG     " REL16/32          ENDOF
  1178. \                0x8F OF   .S" JG      " REL16/32          ENDOF
  1179. \                0x90 OF   .S" SETO    BYTE " R/M8         ENDOF
  1180. \                0x91 OF   .S" SETNO   BYTE " R/M8         ENDOF
  1181. \                0x92 OF   .S" SETC    BYTE " R/M8         ENDOF
  1182. \                0x93 OF   .S" SETNC   BYTE " R/M8         ENDOF
  1183. \                0x94 OF   .S" SETZ    BYTE " R/M8         ENDOF
  1184. \                0x95 OF   .S" SETNZ   BYTE " R/M8         ENDOF
  1185. \                0x96 OF   .S" SETBE   BYTE " R/M8         ENDOF
  1186. \                0x97 OF   .S" SETA    BYTE " R/M8         ENDOF
  1187. \                0x98 OF   .S" SETS    BYTE " R/M8         ENDOF
  1188. \                0x99 OF   .S" SETNS   BYTE " R/M8         ENDOF
  1189. \                0x9A OF   .S" SETP    BYTE " R/M8         ENDOF
  1190. \                0x9B OF   .S" SETNP   BYTE " R/M8         ENDOF
  1191. \                0x9C OF   .S" SETL    BYTE " R/M8         ENDOF
  1192. \                0x9D OF   .S" SETGE   BYTE " R/M8         ENDOF
  1193. \                0x9E OF   .S" SETLE   BYTE " R/M8         ENDOF
  1194. \                0x9F OF   .S" SETG    BYTE " R/M8         ENDOF
  1195. \                0xA0 OF   .S" PUSH    FS "                ENDOF
  1196. \                0xA1 OF   .S" POP     FS "                ENDOF
  1197. \                0xA2 OF   .S" CPUID      "                ENDOF
  1198. \                0xA3 OF   .S" BT      " 1 TO SIZE R/M,R   ENDOF
  1199. \                0xA4 OF   .S" SHLD    " R/M,R IMM8        ENDOF
  1200. \                0xA5 OF   .S" SHLD    " R/M,R .S" , CL"   ENDOF
  1201. \                0xA8 OF   .S" PUSH    GS "                ENDOF
  1202. \                0xA9 OF   .S" POP     GS "                ENDOF
  1203. \                0xAA OF   .S" RSM     "                   ENDOF
  1204. \                0xAB OF   .S" BTS     " 1 TO SIZE R/M,R   ENDOF
  1205. \                0xAC OF   .S" SHRD    " R/M,R IMM8        ENDOF
  1206. \                0xAD OF   .S" SHRD    " R/M,R .S" , CL"   ENDOF
  1207. \                0xAF OF   .S" IMUL    " R,R/M             ENDOF
  1208. \                 0xB0 OF   .S" CMPXCH  " 0 TO SIZE R/M,R   ENDOF
  1209. \                0xB1 OF   .S" CMPXCH  " 1 TO SIZE R/M,R   ENDOF
  1210. \                0xB2 OF   .S" LSS     " 1 TO SIZE R,R/M   ENDOF
  1211. \                0xB3 OF   .S" BTR     " 1 TO SIZE R/M,R   ENDOF
  1212. \                0xB4 OF   .S" LFS     " 1 TO SIZE R,R/M   ENDOF
  1213. \                0xB5 OF   .S" LGS     " 1 TO SIZE R,R/M   ENDOF
  1214. \                0xB6 OF   .S" MOVZX   " 0 TO SIZE R,R/M   ENDOF
  1215. \                0xB7 OF   .S" MOVZX   " 1 TO SIZE R,R/M   ENDOF
  1216. \                0xBA OF   GP8                             ENDOF
  1217. \                0xBB OF   .S" BTC     " 1 TO SIZE R/M,R   ENDOF
  1218. \                0xBC OF   .S" BSF     " 1 TO SIZE R,R/M   ENDOF
  1219. \                0xBD OF   .S" BSR     " 1 TO SIZE R,R/M   ENDOF
  1220. \                0xBE OF   .S" MOVSX   " 0 TO SIZE R,R/M   ENDOF
  1221. \                0xBF OF   .S" MOVSX   " 1 TO SIZE R,R/M   ENDOF
  1222. \                0xC0 OF   .S" XADD    " 0 TO SIZE R/M,R   ENDOF
  1223. \                0xC1 OF   .S" XADD    " 1 TO SIZE R/M,R   ENDOF
  1224. \                0xC7 OF   .S" CMPXCHG8B " R/M16/32        ENDOF
  1225. \                0xC8 OF   .S" BSWAP   EAX "               ENDOF
  1226. \                0xC9 OF   .S" BSWAP   ECX "               ENDOF
  1227. \                0xCA OF   .S" BSWAP   EDX "               ENDOF
  1228. \                0xCB OF   .S" BSWAP   EBX "               ENDOF
  1229. \                0xCC OF   .S" BSWAP   ESP "               ENDOF
  1230. \                0xCD OF   .S" BSWAP   EBP "               ENDOF
  1231. \                0xCE OF   .S" BSWAP   ESI "               ENDOF
  1232. \                0xCF OF   .S" BSWAP   EDI "               ENDOF
  1233. \                ( ELSE )  DUP ???
  1234. \        ENDCASE
  1235. \        ;
  1236.  
  1237. : F6.  ( ADDR OP -- ADDR' )
  1238. \ ??
  1239.         >R COUNT
  1240.         DUP 3 RSHIFT 7 AND DUP>R S" TESTXXXXNOT NEG MUL IMULDIV IDIV" 4 SS. 3 SSPACES
  1241.         MOD-R/M
  1242.         R> 0= IF
  1243.                 R@ 1 AND IF IMM16/32
  1244.                          ELSE IMM8
  1245.                          THEN
  1246.               THEN
  1247.         R> DROP ;
  1248.  
  1249. : FE.  ( ADDR OP -- ADDR' )
  1250.         DROP COUNT
  1251.         DUP 3 RSHIFT 7 AND
  1252.         CASE
  1253.                 0 OF .S" INC     "  ENDOF
  1254.                 1 OF .S" DEC     "  ENDOF
  1255.                      ???
  1256.         ENDCASE R/M8 ;
  1257.  
  1258. : FF.  ( ADDR OP -- ADDR' )
  1259.         DROP COUNT
  1260.         DUP 3 RSHIFT 7 AND
  1261.         CASE
  1262.                 0 OF .S" INC     "      ENDOF
  1263.                 1 OF .S" DEC     "      ENDOF
  1264.                 2 OF .S" CALL    "      ENDOF
  1265.                 3 OF .S" CALL    FAR "  ENDOF
  1266.                 4 OF .S" JMP     "      ENDOF
  1267.                 5 OF .S" JMP     FAR "  ENDOF
  1268.                 6 OF .S" PUSH    "      ENDOF
  1269.                      ???
  1270.         ENDCASE R/M16/32 ;
  1271.  
  1272.  
  1273. \ --------------------- CONDITIONAL MOVE ---------------
  1274.  
  1275. : SET   ( ADR OP -- )
  1276.         .S" SET"
  1277.         TTTN 2 SSPACES
  1278.         COUNT R/M8 ;
  1279.  
  1280. : CMV   ( ADR OP -- )
  1281.         .S" CMOV"
  1282.         TTTN 1 SSPACES
  1283.         COUNT R,R/M ;
  1284.  
  1285. \ --------------------- MMX OPERATIONS -----------------
  1286.  
  1287. : MMX-SIZE ( OP -- )
  1288.         3 AND S" BWDQ" 1 SS. ;
  1289.  
  1290. : UPL   ( ADR OP -- ADR' )
  1291.         3 AND S" PUNPCKLBWPUNPCKLWDPUNPCKLDQ" 9 SS. R,R/M ;
  1292.  
  1293. : UPH   ( ADR OP -- ADR' )
  1294.         3 AND S" PUNPCKHBWPUNPCKHWDPUNPCKHDQ" 9 SS. R,R/M ;
  1295.  
  1296. : CGT   ( ADR OP -- ADR' )
  1297.         .S" PCMPGT" MMX-SIZE R,R/M ;
  1298.  
  1299. : CEQ   ( ADR OP -- ADR' )
  1300.         .S" PCMPEQ" MMX-SIZE R,R/M ;
  1301.  
  1302. : PSH.  ( OP -- )
  1303.         0x30 AND
  1304.         CASE
  1305.              0x10 OF .S" PSRL" ENDOF
  1306.              0x20 OF .S" PSRA" ENDOF
  1307.              0x30 OF .S" PSLL" ENDOF
  1308.         ENDCASE ;
  1309.  
  1310. : GPA   ( ADR OP -- ADR' )
  1311.         >R COUNT DUP PSH. R> MMX-SIZE 2 SSPACES MREG IMM8 ;
  1312.  
  1313. : PUW   ( ADR OP -- ADR' )
  1314.         .S" PACKUSDW " DROP R,R/M ;
  1315.  
  1316. : PSB   ( ADR OP -- ADR' )
  1317.         .S" PACKSSWB " DROP R,R/M ;
  1318.  
  1319. : PSW   ( ADR OP -- ADR' )
  1320.         .S" PACKSSDW " DROP R,R/M ;
  1321.  
  1322. : MPD   ( ADR OP -- ADR' )
  1323.         .S" MOVD    " DROP COUNT MOD/SIB
  1324.         SWAP MREG ., 3 =
  1325.         IF   REG32
  1326.         ELSE MOD-R/M
  1327.         THEN ;
  1328.  
  1329. : MDP   ( ADR OP -- ADR' )
  1330.         .S" MOVD    " DROP COUNT MOD/SIB
  1331.         3 =
  1332.         IF   SWAP REG32
  1333.         ELSE SWAP MOD-R/M
  1334.         THEN ., MREG ;
  1335.  
  1336. : MPQ   ( ADR OP -- ADR' )
  1337.         .S" MOVQ    " DROP R,R/M ;
  1338.  
  1339. : MQP   ( ADR OP -- ADR' )
  1340.         .S" MOVQ    " DROP R/M,R ;
  1341.  
  1342. : SHX   ( ADR OP -- ADR' )
  1343.         DUP PSH. MMX-SIZE 2 SSPACES R,R/M ;
  1344.  
  1345. : MLL   ( ADR OP -- ADR' )
  1346.         .S" PMULLW  " DROP R,R/M ;
  1347.  
  1348. : MLH   ( ADR OP -- ADR' )
  1349.         .S" PMULHW  " DROP R,R/M ;
  1350.  
  1351. : MAD   ( ADR OP -- ADR' )
  1352.         .S" PMADDWD " DROP R,R/M ;
  1353.  
  1354. : SUS   ( ADR OP -- ADR' )
  1355.         .S" PSUBUS" MMX-SIZE R,R/M ;
  1356.  
  1357. : SBS   ( ADR OP -- ADR' )
  1358.         .S" PSUBS" MMX-SIZE SSPACE R,R/M ;
  1359.  
  1360. : SUB   ( ADR OP -- ADR' )
  1361.         .S" PSUB" MMX-SIZE 2 SSPACES R,R/M ;
  1362.  
  1363. : AUS   ( ADR OP -- ADR' )
  1364.         .S" PADDUS" MMX-SIZE R,R/M ;
  1365.  
  1366. : ADS   ( ADR OP -- ADR' )
  1367.         .S" PADDS" MMX-SIZE SSPACE R,R/M ;
  1368.  
  1369. : ADD   ( ADR OP -- ADR' )
  1370.         .S" PADD" MMX-SIZE 2 SSPACES R,R/M ;
  1371.  
  1372. : PAD   ( ADR OP -- ADR' )
  1373.         .S" PAND    " DROP R,R/M ;
  1374.  
  1375. : POR   ( ADR OP -- ADR' )
  1376.         .S" POR     " DROP R,R/M ;
  1377.  
  1378. : PAN   ( ADR OP -- ADR' )
  1379.         .S" PANDN   " DROP R,R/M ;
  1380.  
  1381. : PXR   ( ADR OP -- ADR' )
  1382.         .S" PXOR    " DROP R,R/M ;
  1383.  
  1384.  
  1385. \ -------------------- OPCODE TABLE --------------------
  1386.  
  1387. : OPS 0x10 0 DO ' , LOOP ;
  1388.  
  1389.  
  1390. CREATE OP-TABLE2
  1391.  
  1392. \     0   1   2   3    4   5   6   7    8   9   A   B    C   D   E   F
  1393.  
  1394. OPS  GP6 GP7 LAR LSL  ??? ??? CLT ???  INV WIV ??? UD2  ??? ??? ??? ???  \ 0
  1395. OPS  ??? ??? ??? ???  ??? ??? ??? ???  ??? ??? ??? ???  ??? ??? ??? ???  \ 1
  1396. OPS  MRC MRD MCR MDR  MRT ??? MTR ???  ??? ??? ??? ???  ??? ??? ??? ???  \ 2
  1397. OPS  WMR RTC RMR RPC  ??? ??? ??? ???  ??? ??? ??? ???  ??? ??? ??? ???  \ 3
  1398.  
  1399. OPS  CMV CMV CMV CMV  CMV CMV CMV CMV  CMV CMV CMV CMV  CMV CMV CMV CMV  \ 4
  1400. OPS  ??? ??? ??? ???  ??? ??? ??? ???  ??? ??? ??? ???  ??? ??? ??? ???  \ 5
  1401. OPS  UPL UPL UPL PUW  CGT CGT CGT PSB  UPH UPH UPH PSW  ??? ??? MPD MPQ  \ 6
  1402. OPS  ??? GPA GPA GPA  CEQ CEQ CEQ EMS  ??? ??? ??? ???  ??? ??? MDP MQP  \ 7
  1403.  
  1404. OPS  LBR LBR LBR LBR  LBR LBR LBR LBR  LBR LBR LBR LBR  LBR LBR LBR LBR  \ 8
  1405. OPS  SET SET SET SET  SET SET SET SET  SET SET SET SET  SET SET SET SET  \ 9
  1406. OPS  PSS PPS CPU BTX  SLI SLC ??? ???  PSS PPS RSM BTX  SRI SRC ??? IML  \ A
  1407. OPS  CXC CXC LSS BTX  LFS LGS MVX MVX  ??? UD1 GP8 BTX  BSF BSR MVX MVX  \ B
  1408.  
  1409. OPS  XAD XAD ??? ???  ??? ??? ??? CX8  BSP BSP BSP BSP  BSP BSP BSP BSP  \ C
  1410. OPS  ??? SHX SHX SHX  ??? MLL ??? ???  SUS SUS ??? PAD  AUS AUS ??? PAN  \ D
  1411. OPS  ??? SHX SHX ???  ??? MLH ??? ???  SBS SBS ??? POR  ADS ADS ??? PXR  \ E
  1412. OPS  ??? ??? SHX SHX  ??? MAD ??? ???  SUB SUB SUB ???  ADD ADD ADD ???  \ F
  1413.  
  1414. \     0   1   2   3    4   5   6   7    8   9   A   B    C   D   E   F
  1415.  
  1416. : 0F.  ( ADR CODE -- )
  1417.         DROP COUNT DUP
  1418.         DUP 0x70 AND 0x50 0x80 WITHIN TO MMX-REG
  1419.         CELLS OP-TABLE2 + @ EXECUTE
  1420.         0 TO MMX-REG ;
  1421.  
  1422.  
  1423. CREATE OP-TABLE
  1424.  
  1425. \     0   1   2   3    4   5   6   7    8   9   A   B    C   D   E   F
  1426.  
  1427. OPS  ALU ALU ALU ALU  ALA ALA PSS PPS  ALU ALU ALU ALU  ALA ALA PSS 0F.  \ 0
  1428. OPS  ALU ALU ALU ALU  ALA ALA PSS PPS  ALU ALU ALU ALU  ALA ALA PSS PPS  \ 1
  1429. OPS  ALU ALU ALU ALU  ALA ALA ES: DAA  ALU ALU ALU ALU  ALA ALA CS: DAS  \ 2
  1430. OPS  ALU ALU ALU ALU  ALA ALA SS: AAA  ALU ALU ALU ALU  ALA ALA DS: AAS  \ 3
  1431.  
  1432. OPS  INC INC INC INC  INC INC INC INC  DEC DEC DEC DEC  DEC DEC DEC DEC  \ 4
  1433. OPS  PSH PSH PSH PSH  PSH PSH PSH PSH  POP POP POP POP  POP POP POP POP  \ 5
  1434. OPS  PSA PPA BND ARP  FS: GS: D16 A16  PSI MLI PSI MLI  INB ISD OSB OSD  \ 6
  1435. OPS  BRA BRA BRA BRA  BRA BRA BRA BRA  BRA BRA BRA BRA  BRA BRA BRA BRA  \ 7
  1436.  
  1437. OPS  ALI ALI ??? ALI  TXB TXB TXB TXB  MOV MOV MOV MOV  MRS LEA MSR 8F.  \ 8
  1438. OPS  XGA XGA XGA XGA  XGA XGA XGA XGA  CBW CDQ CIS W8F  PSF PPF SAH LAH  \ 9
  1439. OPS  MV1 MV1 MV2 MV2  MVS MVS CPS CPS  TST TST STS STS  LDS LDS SCS SCS  \ A
  1440. OPS  MRI MRI MRI MRI  MRI MRI MRI MRI  MRI MRI MRI MRI  MRI MRI MRI MRI  \ B
  1441.  
  1442. OPS  SHF SHF RTN RTN  LXS LXS MVI MVI  ENT LEV RTF RTF  NT3 INT NTO IRT  \ C
  1443. OPS  SHF SHF SHF SHF  AAM AAD ??? XLT  FD8 FD9 FDA FDB  FDC FDD FDE FDF  \ D
  1444. OPS  LUP LUP LUP LUP  INP INP OTP OTP  JSR JMP CIS JMP  IND IND OTD OTD  \ E
  1445. OPS  LOK ??? RPZ REP  HLT CMC F6. F6.  CLC STC CLI STI  CLD STD FE. FF.  \ F
  1446.  
  1447. \     0   1   2   3    4   5   6   7    8   9   A   B    C   D   E   F
  1448.  
  1449. : DIS-OP  ( ADR -- ADR' )
  1450.         0>S
  1451.         FALSE TO PREFIX-OP           \ SMUB
  1452.         COUNT
  1453.         DUP 1 AND TO SIZE
  1454.         DUP CELLS OP-TABLE + @ EXECUTE
  1455.         PREFIX-OP 0=
  1456.         IF DEFAULT-16BIT? 0=
  1457.            IF   FALSE TO 16-BIT-DATA
  1458.                 FALSE TO 16-BIT-ADDR
  1459.            ELSE TRUE  TO 16-BIT-DATA
  1460.                 TRUE  TO 16-BIT-ADDR
  1461.            THEN
  1462.         THEN ;
  1463.  
  1464.  
  1465. 0 VALUE NEXT-INST
  1466.  
  1467. : X".  ( ADDR -- ADDR' )
  1468.        CR DUP  BASE-ADDR - 6 H.R SPACE
  1469.         ."  A; " DUP COUNT DUP . ."  C, " 1+ OVER + SWAP
  1470.        DO I C@ . ."  C, " LOOP
  1471.        COUNT  + 1+ ;
  1472.  
  1473.  
  1474. : INST  ( ADR -- ADR' )
  1475.         DUP TO NEXT-INST
  1476.         COLS 0x29 <
  1477.         IF      DIS-OP
  1478.                 S-BUF COUNT TYPE
  1479.         ELSE    DUP DIS-OP
  1480.                 OVER BASE-ADDR - 6 H.R SPACE
  1481.                 DUP ROT
  1482.                 2DUP - DUP>R 0x10 U> ABORT" DECOMPILER ERROR"
  1483.                 DO I C@ 2 H.N LOOP
  1484.                 R> 5 < IF 9 EMIT THEN
  1485.                 9 EMIT S-BUF COUNT TYPE
  1486.         THEN    NEXT-INST C@ 0xE8 =
  1487.                 IF  NEXT-INST 1+ @+ SWAP +
  1488.                     CASE
  1489.                    CLITERAL-CODE OF  X".  ENDOF
  1490.                    SLITERAL-CODE OF  X".  ENDOF
  1491.                     ENDCASE
  1492.                 THEN   ;
  1493.  
  1494.  
  1495. : DIS-DB   CR .S" DB " COUNT H.>S ;
  1496. : DIS-DW   CR .S" DW " W@+ H.>S ;
  1497. : DIS-DD   CR .S" DD " @+ H.>S ;
  1498. : DIS-DS   CR .S" STRING " 0x22 EMIT>S COUNT 2DUP >S + 0x22 EMIT>S ;
  1499.  
  1500.  
  1501. : DIS  ( ADR -- )
  1502.         BEGIN
  1503.                 DUP
  1504.                 CR INST
  1505.                 KEY UPC DUP 0x1B = OVER [CHAR] Q = OR INVERT
  1506.         WHILE
  1507.                 CASE
  1508.                   [CHAR] B OF DROP DIS-DB ENDOF
  1509.                   [CHAR] W OF DROP DIS-DW ENDOF
  1510.                   [CHAR] D OF DROP DIS-DD ENDOF
  1511.                   [CHAR] S OF DROP DIS-DS ENDOF
  1512.                          ROT DROP
  1513.                 ENDCASE
  1514.  
  1515.         REPEAT 2DROP DROP ;
  1516.  
  1517. \ CREATE STOPCODE 8 C,                           \ COUNT OF LENGTH
  1518. \                 0xAD C, 0x8B C, 0x0C C, 0x38 C,
  1519. \                 0x03 C, 0xCF C, 0xFF C, 0xE1 C,
  1520.  
  1521.  
  1522. 0 VALUE SHOW-NEXT?      \ DEFAULT TO NOT SHOWING NEXT INSTRUCTIONS
  1523.  
  1524.  
  1525. DECIMAL
  1526.  
  1527.  
  1528. FORTH DEFINITIONS
  1529.  
  1530. TRUE VALUE SEE-KET-FL
  1531.  
  1532. VARIABLE  COUNT-LINE
  1533. : REST          ( ADR -- )
  1534.                 20    COUNT-LINE !
  1535.                 0 TO MAX_REFERENCE
  1536.                 DUP TO NEXT-INST
  1537.                 BEGIN
  1538.                         CR
  1539.                         NEXT-INST C@
  1540.                         DUP  0xC3 <>
  1541.                         SWAP 0xE9 <> AND  \ NEXT, BEHIND US?
  1542.                         NEXT-INST  MAX_REFERENCE U< OR
  1543.                         OVER HERE U< AND
  1544.                 WHILE   INST
  1545.                         COUNT-LINE @ 1- DUP 0=  SEE-KET-FL AND
  1546.                            IF 9 EMIT ." \ PRESS ENTER | Q | ANY"  KEY
  1547.                             DUP   0xD = IF 2DROP 1  ELSE
  1548.                               [CHAR] Q = IF  ABORT   THEN
  1549.                                 DROP 20    THEN
  1550.                            THEN
  1551.                         COUNT-LINE !
  1552.                 REPEAT  DROP ." END-CODE  "
  1553.                 ;
  1554.  
  1555. : SEE       ( -- )
  1556.             ' REST ;
  1557.  
  1558. ONLY FORTH ALSO DEFINITIONS
  1559.  
  1560.