\ HSSSS H.

[IFNDEF] BREAK
  : BREAK POSTPONE EXIT POSTPONE THEN ; IMMEDIATE
[THEN]

C" VECT-CODE" FIND NIP 0=
[IF]	' _VECT-CODE VALUE	VECT-CODE
[ELSE]	' _VECT-CODE	TO	VECT-CODE
[THEN]
C" USER-CODE" FIND NIP 0=
[IF]	' _USER-CODE VALUE	USER-CODE
[ELSE]	' _USER-CODE	TO	USER-CODE
[THEN]
C" USER-VALUE-CODE" FIND NIP 0=
[IF]	' _USER-VALUE-CODE VALUE	USER-VALUE-CODE
[ELSE]	' _USER-VALUE-CODE	TO	USER-VALUE-CODE
[THEN]

\ ' _CONSTANT-CODE	TO CONSTANT-CODE
\ ' _CREATE-CODE		TO CREATE-CODE
\ ' _CLITERAL-CODE	TO CLITERAL-CODE
\ ' _SLITERAL-CODE	TO SLITERAL-CODE

BASE @ HEX

: DUP5B?0      ( C -- C FLAG )
  DUP   0C7 AND   5 =    \  ADD|OR|ADC|SBB|AND|SUB|XOR|CMP  EAX, # X
  OVER  0FC AND 0B8 = OR \  MOV EAX|EBX|ECX|EDX, # X
;

: DUP5B?1      ( C -- C FLAG )
  DUP  0FD AND 0A1 =   \  MOV EAX, X  | X , EAX
;

: DUP6B?0      ( W -- W FLAG )
  DUP  C3FF AND C081 = \ ADD|OR|ADC|SBB|AND|SUB|XOR|CMP  EAX, # X
  OVER   0C7 = OR \ MOV [EAX], # X
\  OVER  878B = OR \ MOV EAX, X [EDI]
\  OVER  878D = OR \ LEA EAX, X [EDI]
\  OVER  873B = OR \ CMP EAX, X [EDI]
;

: DUP6B?1      ( W -- W FLAG )
  DUP  00501 =    \ ADD  X , EAX
  OVER  053B = OR \ CMP  EAX,  X

\ X00X.X101 1000.10X1
  OVER  67FD AND 0589 = OR  \ MOV X {[EBP]}, E(ACDB)X | E(ACDB)X , X {[EBP]}
  OVER  0589 = OR \ MOV X , EAX
  OVER  058D = OR \ MOV EAX,  X
  OVER  1D8D = OR \ MOV EBX,  X
  OVER  808B = OR \ MOV EAX, X [EAX]
  OVER  05FF = OR \ INC X
\  OVER  FCFF AND C0C7 = OR \ MOV EAX|EBX|ECX|EDX, # X
;

: UV> ' >BODY @ TlsIndex@ + POSTPONE LITERAL ; IMMEDIATE

\ : GGGX H. ." -0x" TlsIndex@ H. ." -0x" RESERVE  H. ;

: .EDI   ( ADDR n -- ADDR1 )
  ." [
   DROP 2+ DUP @

\ ." XX" DUP H.
 TlsIndex@ +
   CASE
R0       OF ." T_R0" ENDOF
S0       OF ." T_S0" ENDOF
WARNING  OF ." T_WARNING" ENDOF	
STATE    OF ." T_STATE" ENDOF
BLK      OF ." T_BLK" ENDOF
CURFILE  OF ." T_CURFILE" ENDOF
HANDLER  OF ." T_HANDLER" ENDOF
HLD      OF ." T_HLD" ENDOF
BASE     OF ." T_BASE" ENDOF
PAD      OF ." T_PAD" ENDOF		
ER-A     OF ." T_ERminusA" ENDOF	
ER-U     OF ." T_ERminusU" ENDOF	
DOES>A   OF ." T_DOESgreatA" ENDOF
#TIB     OF ." T_nTIB" ENDOF		
>IN      OF ." T_greatIN" ENDOF
UV> TIB  OF ." T_TIB" ENDOF		
ATIB     OF ." T_ATIB" ENDOF
UV> SOURCE-ID OF ." T_SOURCEminusID" ENDOF
CURSTR   OF ." T_CURSTR" ENDOF	
\ WBW-NFA OF ." T_WBWminusNFA" ENDOF
\ WBW-OFFS OF ." T_WBWminusOFFS" ENDOF	
CURRENT  OF ." T_CURRENT" ENDOF
S-O    OF ." T_SminusO" ENDOF	
UV> CONTEXT  OF ." T_CONTEXT" ENDOF
>OUT OF ." T_greatOUT" ENDOF	
W-CNT  OF ." T_WminusCNT" ENDOF	

\ NNN OF ." T_NNN" ENDOF		
 TlsIndex@ - RESERVE  - DUP 0< IF CR ." (%edi) RESERVE " ABORT THEN
     ." reserve+0x"
 H. ." +edi]" CELL+  EXIT
    ENDCASE  ." -main_task+edi]" CELL+
;

\  RESERVE  -  DUP 0< IF CR  ." (%edi) RESERVE "
\  TlsIndex@ H. RESERVE  H.  TlsIndex@ - H. H. ABORT THEN

\     ." reserve+0x" GGGX ." +edi]" CELL+  EXIT
\     ." reserve+0x" TlsIndex@ - H. RESERVE  H. ." +edi]" CELL+  EXIT
\    ENDCASE  ." -main_task+edi]" CELL+ ;

: H.-H  ." 0" BASE @ HEX SWAP U>D (D.) TYPE BASE ! ." H" ;

: 1_GD_STEP ( ADDR n -- ADDR1 )
   CR ."  DB "  0xFF AND  H.-H 1+ ;

: 2_GD_STEP ( ADDR -- ADDR1 )
  1_GD_STEP ." ,"  DUP C@ H.-H 1+ ;

: 3_GD_STEP ( ADDR -- ADDR1 )
  2_GD_STEP ." ,"  DUP C@ H.-H 1+ ;

: 4_GD_STEP ( ADDR -- ADDR1 )
  3_GD_STEP ." ,"  DUP C@ H.-H 1+ ;

[IFNDEF] OCTAL : OCTAL 8 BASE ! ;
[THEN]

: \ooo.        ( n1 -- )
	BASE @ >R  DECIMAL
	0 (D.) TYPE	
	R> BASE ! ;

: ATYPE ( arrd len -- )
  DUP 0= IF 2DROP BREAK
  [CHAR] ' EMIT
  0 ?DO COUNT DUP [CHAR] ' = IF ." '" THEN EMIT
     LOOP DROP
  [CHAR] ' EMIT
 ;

0x5F535953 CONSTANT 'SYS_'

: GTYPE
   OVER @  'SYS_' = IF 4 - SWAP 4 + SWAP TYPE BREAK
  ." cfa_"
	2DUP S" CONTEXT"	COMPARE 0= IF 2DROP ." _CONTEXT"	BREAK
	2DUP S" WORD"	COMPARE 0= IF 2DROP ." _WORD"	BREAK
	2DUP S" LEAVE"	COMPARE 0= IF 2DROP ." _LEAVE"	BREAK
	2DUP S" REPEAT"	COMPARE 0= IF 2DROP ." _REPEAT"	BREAK
	2DUP S" exit"	COMPARE 0= IF 2DROP ." _exit"	BREAK
	2DUP S" CHAR"	COMPARE 0= IF 2DROP ." _CHAR"	BREAK
	2DUP S" IF"	COMPARE 0= IF 2DROP ." _IF"	BREAK
	2DUP S" ELSE"	COMPARE 0= IF 2DROP ." _ELSE"	BREAK
	2DUP S" WHILE"	COMPARE 0= IF 2DROP ." _WHILE"	BREAK
	2DUP S" RESIZE"	COMPARE 0= IF 2DROP ." _RESIZE"	BREAK
	2DUP S" free"	COMPARE 0= IF 2DROP ." _free"	BREAK
	2DUP S" write"	COMPARE 0= IF 2DROP ." _write"	BREAK
	2DUP S" KEY_EVENT"	COMPARE 0= IF 2DROP ." _KEY_EVENT"	BREAK
	2DUP S" PAGE"	COMPARE 0= IF 2DROP ." _PAGE"	BREAK
	2DUP S" PAGE_EXECUTE_READWRITE"	COMPARE 0= IF 2DROP ." _PAGE_EXECUTE_READWRITE"	BREAK
	2DUP S" MEM_COMMIT"	COMPARE 0= IF 2DROP ." _MEM_COMMIT"	BREAK
	2DUP S" MEM_RESERVE"	COMPARE 0= IF 2DROP ." _MEM_RESERVE"	BREAK
	2DUP S" INVALID_HANDLE_VALUE"	COMPARE 0= IF 2DROP ." _INVALID_HANDLE_VALUE"	BREAK
	2DUP S" FILE_ATTRIBUTE_ARCHIVE"	COMPARE 0= IF 2DROP ." _FILE_ATTRIBUTE_ARCHIVE"	BREAK
	2DUP S" CREATE_ALWAYS"	COMPARE 0= IF 2DROP ." _CREATE_ALWAYS"	BREAK
	2DUP S" OPEN_EXISTING"	COMPARE 0= IF 2DROP ." _OPEN_EXISTING"	BREAK
	2DUP S" FILE_BEGIN"	COMPARE 0= IF 2DROP ." _FILE_BEGIN"	BREAK
	2DUP S" FILE_CURRENT"	COMPARE 0= IF 2DROP ." _FILE_CURRENT"	BREAK
	2DUP S" EXTERN"	COMPARE 0= IF 2DROP ." _EXTERN"	BREAK
	2DUP S" EXPORT"	COMPARE 0= IF 2DROP ." _EXPORT"	BREAK
	2DUP S" BREAK"	COMPARE 0= IF 2DROP ." _BREAK"	BREAK
	2DUP S" ERR"	COMPARE 0= IF 2DROP ." _ERR"	BREAK

  0 DO  COUNT
      CASE
      [CHAR] @ OF ." _ld" ENDOF
      [CHAR] ! OF ." save" ENDOF
      [CHAR] = OF ." _equ" ENDOF
      [CHAR] < OF ." less" ENDOF
      [CHAR] > OF ." great" ENDOF
      [CHAR] + OF ." plus" ENDOF
      [CHAR] - OF ." minus" ENDOF
      [CHAR] * OF ." _mul" ENDOF
      [CHAR] / OF ." _div" ENDOF
      [CHAR] . OF ." dot" ENDOF
      [CHAR] : OF ." dcoma" ENDOF
      [CHAR] ; OF ." _end" ENDOF
      [CHAR] ? OF ." que" ENDOF
      [CHAR] ( OF ." _c" ENDOF
      [CHAR] ) OF ." cend" ENDOF
      [CHAR] [ OF ." _x" ENDOF
      [CHAR] ] OF ." _y" ENDOF
      [CHAR] { OF ." lsk" ENDOF
      [CHAR] } OF ." rsk" ENDOF
      [CHAR] , OF ." com" ENDOF
      [CHAR] ' OF ." tic" ENDOF
      [CHAR] ~ OF ." til" ENDOF
      [CHAR] ^ OF ." pic" ENDOF
      [CHAR] " OF ." dtic" ENDOF
      [CHAR] | OF ." l" ENDOF
      [CHAR] # OF ." n" ENDOF
      [CHAR] $ OF ." dol" ENDOF
      [CHAR] \ OF ." sl" ENDOF
      [CHAR] & OF ." and_" ENDOF
	I IF EMIT ENDOF
      [CHAR] 0 OF ." _0" ENDOF
      [CHAR] 1 OF ." _1" ENDOF
      [CHAR] 2 OF ." _2" ENDOF
      [CHAR] 3 OF ." _3" ENDOF
      [CHAR] 4 OF ." _4" ENDOF
      [CHAR] 5 OF ." _5" ENDOF
      [CHAR] 6 OF ." _6" ENDOF
      [CHAR] 7 OF ." _7" ENDOF
      [CHAR] 8 OF ." _8" ENDOF
      [CHAR] 9 OF ." _9" ENDOF 
               EMIT
    0 ENDCASE
     LOOP DROP ;

0 VALUE #GN

: GN.  ( ADDR -- )
  DUP 0x80 + 0xFFFFFF00 AND 0=  \  ABS  0x7F <
  IF H.-H EXIT THEN
  DUP HERE U<
  IF   DUP         WordByAddr
        OVER >R GTYPE ." +"
        R> 1- NAME> - DUP TO #GN H.-H
  ELSE NEGATE DUP  WordByAddr
        >R >R
        R@ 1- NAME> - DUP TO #GN H.-H
        ." -" R> R>  GTYPE
  THEN 
 ;

: .INT ( ADDR -- ADDR1 )
 CR   DUP HSSSS @ +
 @ OVER @ \ ." I=" 2DUP H. H. CR
 =
 IF   ."  DD " DUP @ H.-H
 ELSE ."  DD "   DUP @ GN.
 THEN  CELL+ ;

: .ADR ( ADDR -- ADDR1 )
   CR ."  DD "   DUP @ GN. CELL+ ;

: .ADR68 ( ADDR -- ADDR1 )
   CR ."  DD 68 "   DUP @ DUP H. GN. CELL+ ;

: 5_GD_STEP0 ( ADDR -- ADDR1 )
  1_GD_STEP .INT ;

: 5_GD_STEP1 ( ADDR -- ADDR1 )
  1_GD_STEP .ADR ;

: 6_GD_STEP0 ( ADDR -- ADDR1 )
  2_GD_STEP  .INT ;

: 6_GD_STEP1 ( ADDR -- ADDR1 )
  2_GD_STEP .ADR ;

: 7_GD_STEP  ( ADDR -- ADDR1 )
  3_GD_STEP  .ADR ;

: 1A_GD_STEP ( ADDR c -- ADDR1 )
   DROP   1+ DUP REL@ CELL+ GN. CELL+  ;

: 2A_GD_STEP ( ADDR W -- ADDR1 )
   CR ."  DW "
     H.-H   2+ DUP REL@ CELL+
   CR ."  DD "  GN. ." -$-4" CELL+  ;
C" C>S" FIND NIP 0=
[IF] : C>S ( c -- n )  0xFF AND [ 0x7F INVERT ] LITERAL XOR 0x80 + ;
[THEN]

: J_GD_STEP_
  0x70 - 3 *
  C" jo jnojb jaeje jnejbeja js jnsjp jnpjl jgejlejg " 1+ +
   CR 3    TYPE ."  " 1+  DUP C@ C>S OVER + 1+ GN. 1+
 ; \ short 

: J_GD_STEP
  DUP >R
  0x70 - 3 *
  C" jo jnojb jaeje jnejbeja js jnsjp jnpjl jgejlejg " 1+ +
   CR ." ;" 3   TYPE ."  " 1+  DUP C@ C>S OVER + 1+ GN. 1+
   2- R> 
   #GN IF 2_GD_STEP EXIT THEN
   J_GD_STEP_
 ; \ short 

: GD-STEP  (  CFA  -- CFA+N )
\  DUP 9 EMIT H.
  DUP   C@      \  CFA  N'
  DUP   0C3 = IF  1_GD_STEP  EXIT THEN  \ RET
  DUP   066 = IF  1_GD_STEP  EXIT THEN  \ D16:
  DUP   064 = IF  1_GD_STEP  EXIT THEN  \ FS:
  DUP   068 = IF  1_GD_STEP .INT  EXIT THEN  \ push X
\ LOOPNZ X LOOPZ X LOOP X JECXZ X IN AL, 0 IN EAX, 0 OUT 0 , AL OUT 0 , EAX
\ 1110.0XXX
  DUP 0F8 AND 0E0 = IF 2_GD_STEP EXIT THEN
\ 010X.XXXX
  DUP 0E0 AND 040 = IF 1_GD_STEP EXIT THEN  \ INC|DEC|PUSH|POP  E_X
\ 0111.0XXX
  DUP 0F0 AND 070 = IF J_GD_STEP EXIT THEN  \ JO   short
  DUP         0EB = IF 2_GD_STEP EXIT THEN  \ JMP
  DUP   090 = IF  1_GD_STEP  EXIT THEN  \  !!!!!
  DUP   099 = IF  1_GD_STEP  EXIT THEN  \  CDQ
  DUP   0A4 = IF  1_GD_STEP  EXIT THEN  \
  DUP   0A5 = IF  1_GD_STEP  EXIT THEN  \
  DUP   0A6 = IF  1_GD_STEP  EXIT THEN  \
  DUP   0AA = IF  1_GD_STEP  EXIT THEN  \
  DUP   0AB = IF  1_GD_STEP  EXIT THEN  \
  DUP   0AC = IF  1_GD_STEP  EXIT THEN  \
  DUP   0AE = IF  1_GD_STEP  EXIT THEN  \
  DUP   024 = IF  2_GD_STEP  EXIT THEN  \ AND  AL , # 1
  DUP   02C = IF  2_GD_STEP  EXIT THEN  \ SUB  AL , # 1
  DUP   03C = IF  2_GD_STEP  EXIT THEN  \ CMP  AL , # 1
  DUP   0CD = IF  2_GD_STEP  EXIT THEN  \ INT	X
  DUP   0B0 = IF  2_GD_STEP  EXIT THEN  \
  DUP   0F2 = IF  1_GD_STEP  EXIT THEN  \
  DUP   0F3 = IF  2_GD_STEP  EXIT THEN  \ REPZ CMPSB
  DUP   0FC = IF  1_GD_STEP  EXIT THEN  \ CLD
  DUP   0FD = IF  1_GD_STEP  EXIT THEN  \ STD
  DUP   09C = IF  1_GD_STEP  EXIT THEN  \ PUSHFD
  DUP   09D = IF  1_GD_STEP  EXIT THEN  \ POPFD
  DUP5B?0     IF  5_GD_STEP0 EXIT THEN
  DUP5B?1     IF  5_GD_STEP1 EXIT THEN

   DUP   0E9 = IF CR ."  DB 0E9H"
                  CR ."  DD " 1A_GD_STEP ." -$-4" EXIT THEN  \  JMP
   DUP   0E8 = IF CR ."  call " 1A_GD_STEP
                 DUP CELL- REL@ CELL+ 
                 DUP USER-VALUE-CODE =
                 OVER      USER-CODE = OR
                 IF CR ."  DD reserve+"
                    DROP DUP @ RESERVE -  H.-H CELL+
                       EXIT
                 THEN          

                     CONSTANT-CODE =
                 IF   .INT EXIT
                 THEN          

                 DUP CELL- REL@ CELL+ 
                 CREATE-CODE  = 
                 IF   .INT 2DUP U>
                   IF   DUP C@ 1_GD_STEP
                        BEGIN  2DUP U>
                        WHILE  DUP 7 AND
			IF ." ,"
			ELSE CR ."  DB "
			THEN DUP C@ H.-H 1+				
                        REPEAT
                   THEN  EXIT
                 THEN          

                 DUP CELL- REL@ CELL+ 
                 DUP  CLITERAL-CODE =
                 OVER ALITERAL-CODE = OR
                 SWAP SLITERAL-CODE = OR
                 IF  CR ."  DB " DUP COUNT DUP>R DUP H.-H
                     CR ."  DB " ATYPE ." ,0"
                     R> + 2+ EXIT
                 THEN          
                 DUP CELL- REL@ CELL+ 
                 VECT-CODE  =
                 IF   .ADR  EXIT
                 THEN

            EXIT THEN  \  CALL
\ 1110.11XX
  DUP FC AND EC = IF 1_GD_STEP EXIT THEN  \ IN|OUT  EAX AL, DX | DX, EAX EL

  DROP
  DUP W@ \ CR ." G=" DUP H.
  DUP3B?[EBP]   IF  3_GD_STEP   EXIT THEN
  DUP3B?        IF  3_GD_STEP   EXIT THEN
  DUP2B?        IF  2_GD_STEP   EXIT THEN
  DUP 0DB0A =   IF  2_GD_STEP   EXIT THEN  \ OR  BL, BL
  DUP 0C90A =   IF  2_GD_STEP   EXIT THEN  \ OR  CL, CL
  DUP 0038B =   IF  2_GD_STEP   EXIT THEN  \ MOV  EAX, [EBX]
  DUP 0EC87 =   IF  2_GD_STEP   EXIT THEN  \
  DUP 0188A =   IF  2_GD_STEP   EXIT THEN  \ MOV BL, [EAX]
  DUP 07D8B =   IF  3_GD_STEP   EXIT THEN  \ MOV EDI, X [EBP]
  DUP 0C58B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,  EBP
  DUP 0E08B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,  EBP
  DUP 0E88B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,  EBP
  DUP 0458F =   IF  3_GD_STEP   EXIT THEN  \ POP  X [EBP]
  DUP 075FF =   IF  3_GD_STEP   EXIT THEN  \ PUSH X [EBP]
  DUP 0C009 =   IF  2_GD_STEP   EXIT THEN  \ OR   EAX, EAX
  DUP 0E3FF =   IF  2_GD_STEP   EXIT THEN  \ JMP  EBX
\  DUP 0D2FF =   IF  2_GD_STEP   EXIT THEN  \ JMP  EDX
  DUP 0E2FF =   IF  2_GD_STEP   EXIT THEN  \ JMP  EDX
  DUP 0D0FF =   IF  2_GD_STEP   EXIT THEN
  DUP 0D2FF =   IF  2_GD_STEP   EXIT THEN  \ CALL EDX
  DUP 023FF =   IF  2_GD_STEP   EXIT THEN  \ JMP [EBX]
  DUP 0F903 =   IF  2_GD_STEP   EXIT THEN  \ ADD EDI, ECX
  DUP 0F103 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESI, ECX
  DUP 0F003 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESI, EAX
  DUP 0D703 =   IF  2_GD_STEP   EXIT THEN  \ ADD EDX, EDI
  DUP 0C703 =   IF  2_GD_STEP   EXIT THEN  \ ADD EAX, EDI
  DUP 0DF03 =   IF  2_GD_STEP   EXIT THEN  \ ADD EBX, EDI
  DUP 0E103 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESP, ECX
  DUP 0E303 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESP, EBX
  DUP 0E803 =   IF  2_GD_STEP   EXIT THEN  \ ADD  EBP, EAX
  DUP 0EB03 =   IF  2_GD_STEP   EXIT THEN
  DUP 0F803 =   IF  2_GD_STEP   EXIT THEN  \ ADD EDI, EAX
  DUP 0E903 =   IF  2_GD_STEP   EXIT THEN  \ ADD EBP, ECX
  DUP  0523 =   IF  2_GD_STEP .INT  EXIT THEN  \ AND EAX , 55C18F
  DUP  052B =   IF  2_GD_STEP .INT  EXIT THEN  \ SUB EAX , 55C18F
  DUP 0C72B =   IF  2_GD_STEP   EXIT THEN  \ SUB EAX, EDI
  DUP 0CD2B =   IF  2_GD_STEP   EXIT THEN  \ SUB ECX, EBP
  DUP 0CF2B =   IF  2_GD_STEP   EXIT THEN  \ SUB ECX, EDI
  DUP 0D72B =   IF  2_GD_STEP   EXIT THEN  \ SUB EDX, EDI
  DUP 0F22B =   IF  2_GD_STEP   EXIT THEN  \ SUB ESI, EDX
  DUP 0DE2B =   IF  2_GD_STEP   EXIT THEN  \ SUB  EBX, ESI
  DUP 0E32B =   IF  2_GD_STEP   EXIT THEN  \ SUB  ESP, EBX
  DUP 0E82B =   IF  2_GD_STEP   EXIT THEN  \ SUB  EBP, EAX
  DUP 0FF33 =   IF  2_GD_STEP   EXIT THEN  \ xor EDI, EDI
  DUP 0D233 =   IF  2_GD_STEP   EXIT THEN  \ xor EDX, EDX
  DUP 0F33B =   IF  2_GD_STEP   EXIT THEN  \ CMP ESI, EBX
  DUP 0C13A =   IF  2_GD_STEP   EXIT THEN  \ CMP  AL,  CL
  DUP 0C23A =   IF  2_GD_STEP   EXIT THEN  \ CMP  AL,  DL
  DUP 0D83A =   IF  2_GD_STEP   EXIT THEN  \ CMP  BL,  AL

  DUP 0EB80 =   IF  3_GD_STEP   EXIT THEN  \ SUB  BL, # X
  DUP 0FB80 =   IF  3_GD_STEP   EXIT THEN  \ CMP  BL, # X
  DUP 0C0C6 =   IF  3_GD_STEP   EXIT THEN  \ MOV AL, # 0
  DUP 00081 =   IF  2_GD_STEP .INT  EXIT THEN  \ ADD [EAX] , # 800 
  DUP  0581 =	IF  2_GD_STEP .ADR .INT  EXIT THEN  \ ADD X , # Y
  DUP 0E181 =   IF  2_GD_STEP .INT  EXIT THEN  \ AND ECX, # FF
  DUP 0E281 =   IF  2_GD_STEP .INT  EXIT THEN  \ AND EDX, # FF
  DUP 0F981 =   IF  2_GD_STEP .INT  EXIT THEN  \ CMP ECX, # 1 
  DUP 04583 =   IF  4_GD_STEP   EXIT THEN  \ ADD     F8 [EBP] , # 2 
  DUP 0EB83 =   IF  3_GD_STEP   EXIT THEN  \ SUB EBX, # X
  DUP 0FB83 =   IF  3_GD_STEP   EXIT THEN  \ CMP EBX, # X
  DUP 0EE83 =   IF  3_GD_STEP   EXIT THEN  \ SUB ESI, # X
  DUP 0E183 =   IF  3_GD_STEP   EXIT THEN  \ AND ECX, # 3
  DUP 0E383 =   IF  3_GD_STEP   EXIT THEN  \ AND EBX, # 3
  DUP 0EC83 =   IF  3_GD_STEP   EXIT THEN
  DUP 0F9C1 =   IF  3_GD_STEP   EXIT THEN  \ SAR ECX, # 2
  DUP 01889 =   IF  2_GD_STEP   EXIT THEN  \ MOV   [EAX], EBX
  DUP 04889 =   IF  3_GD_STEP   EXIT THEN  \ MOV X [EAX], ECX
  DUP 04289 =   IF  3_GD_STEP   EXIT THEN  \ MOV 4 [EDX], EAX
  DUP 04B89 =   IF  3_GD_STEP   EXIT THEN  \ MOV 2 [EBX], ECX
  DUP 0468A =   IF  3_GD_STEP   EXIT THEN  \ MOV  AL, X [ESI]
  DUP 0088A =   IF  2_GD_STEP   EXIT THEN  \ MOV  CL, [EAX]
  DUP 0068B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,   [ESI]
  DUP 01B8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EBX,   [EBX]
  DUP  DF8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EBX, EDI
  DUP  EC8B =   IF  2_GD_STEP   EXIT THEN
  DUP 05089 =   IF  3_GD_STEP   EXIT THEN  \ MOV X [EAX] , EDX 
  DUP 0368B =   IF  2_GD_STEP   EXIT THEN  \ MOV ESI,   [ESI]
  DUP 0758B =   IF  3_GD_STEP   EXIT THEN  \ MOV ESI, X [EBP]
  DUP 0408B =   IF  3_GD_STEP   EXIT THEN  \ MOV EAX, X [EAX]
  DUP 0498B =   IF  3_GD_STEP   EXIT THEN  \ MOV ECX, FC [ECX] 
  DUP 04B8B =   IF  3_GD_STEP   EXIT THEN  \ MOV  ECX, 12 [EBX]
  DUP 0E58B =   IF  2_GD_STEP   EXIT THEN
  DUP 06D8D =   IF  3_GD_STEP   EXIT THEN  \ LEA  EBP, OFF-EBP [EBP]
  DUP 0C583 =   IF  3_GD_STEP   EXIT THEN  \ ADD  EBP, # OFF-EBP
  DUP 0ED83 =   IF  3_GD_STEP   EXIT THEN  \ SUB  EBP, # X
  DUP 0C483 =   IF  3_GD_STEP   EXIT THEN  \ ADD  ESP, # X
  DUP 0FA83 =   IF  3_GD_STEP   EXIT THEN  \ CMP EDX, # 3
  DUP 07D83 =   IF  4_GD_STEP   EXIT THEN  \ CMP X [EBP] , # Y
  DUP 07D89 =   IF  3_GD_STEP   EXIT THEN  \ MOV  X [EBP], EDI
  DUP 0CC8B =   IF  2_GD_STEP   EXIT THEN
  DUP 0F58B =   IF  2_GD_STEP   EXIT THEN
  DUP 0FC8B =   IF  2_GD_STEP   EXIT THEN

  DUP 0F0FF AND
      0800F =   IF  2A_GD_STEP  EXIT THEN  \ JNO  X
  DUP 075F7 =   IF  3_GD_STEP   EXIT THEN  \  DIV DWORD [EBP]
  DUP 0D9F7 =   IF  2_GD_STEP   EXIT THEN  \ NEG  ECX
  DUP 0DBF7 =   IF  2_GD_STEP   EXIT THEN  \ NEG  EBX
  DUP 0E3F7 =   IF  2_GD_STEP   EXIT THEN  \  MUL EBX 
  DUP 0EBF7 =   IF  2_GD_STEP   EXIT THEN  \ IMUL EBX
  DUP 0FBF7 =   IF  2_GD_STEP   EXIT THEN  \ IDIV EBX
  DUP 0F3F7 =   IF  2_GD_STEP   EXIT THEN  \  DIV EBX
  DUP 0F60B =   IF  2_GD_STEP   EXIT THEN  \ OR   ESI, ESI
  DUP 0CE8B =   IF  2_GD_STEP   EXIT THEN  \ MOV  ECX, ESI
  DUP 0C48B =   IF  2_GD_STEP   EXIT THEN  \ MOV  EAX, ESP
  DUP 0F18B =   IF  2_GD_STEP   EXIT THEN  \ MOV  ESI, ECX
  DUP 0F08B =   IF  2_GD_STEP   EXIT THEN  \ MOV  ESI, EAX
  DUP 0D58B =   IF  2_GD_STEP   EXIT THEN  \ MOV EDX, EBP
  DUP 0D78B =   IF  2_GD_STEP   EXIT THEN  \ MOV EDX, EDI
  DUP 0DD8B =   IF  2_GD_STEP   EXIT THEN  \ MOV  EBX, EBP
  DUP 0FA8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EDI, EDX
  DUP 01A8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EBX, [EDX]
  DUP 0028B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX, [EDX]
  DUP 0078B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX, [EDI]
  DUP  088B =   IF  2_GD_STEP   EXIT THEN  \ MOV ECX, [EAX] 
  DUP  098B =   IF  2_GD_STEP   EXIT THEN  \ MOV ECX, [ECX] 
  DUP  0A8B =   IF  2_GD_STEP   EXIT THEN  \ MOV ECX, [EDX] 
  DUP  00C6 =   IF  3_GD_STEP   EXIT THEN  \ MOV [EAX] , # x
  DUP 0688D =   IF  3_GD_STEP   EXIT THEN  \ LEA EBP,  4 [EAX]
  DUP 0428D =   IF  3_GD_STEP   EXIT THEN  \ LEA EAX , FE [EDX] 
  DUP 0498D =   IF  3_GD_STEP   EXIT THEN  \ LEA ECX, -1 [ECX]
  DUP 0488D =   IF  3_GD_STEP   EXIT THEN  \ LEA ECX , FC [EAX] 

  DUP 07F8D =   IF  3_GD_STEP   EXIT THEN  \ LEA EDI, -1 [EDI]
  DUP 0528D =   IF  3_GD_STEP   EXIT THEN  \ LEA EDX, -4 [EDX]
\  DUP 01C8D =   IF  3_GD_STEP   EXIT THEN  \ LEA  EBX,  [EDX] [EAX]
  DUP 0038F =   IF  2_GD_STEP   EXIT THEN  \ POP  [EBX]
  DUP 05DD1 =   IF  3_GD_STEP   EXIT THEN  \ RCR [EBP], # 1
  DUP 0D0D1 =   IF  2_GD_STEP   EXIT THEN  \ RCL EAX, # 1
  DUP 065D1 =   IF  3_GD_STEP   EXIT THEN  \ SHL [EBP], # 1
  DUP 0C0C1 =   IF  3_GD_STEP   EXIT THEN  \ ROL [EBP], # 1
  DUP  45FF =   IF  3_GD_STEP   EXIT THEN  \ INC     0 [EBP]
  DUP 0310F =   IF  2_GD_STEP   EXIT THEN  \ RDTSC
  DUP  873B =   IF CR ."  cmp " ." eax," .EDI  EXIT THEN  \ CMP EAX, X [EDI]
  DUP  878B =   IF CR ."  mov " ." eax," .EDI  EXIT THEN  \ MOV EAX, X [EDI]
  DUP  8F8B =   IF CR ."  mov " ." ecx," .EDI  EXIT THEN  \ MOV ECX, X [EDI]
  DUP  878D =   IF CR ."  lea " ." eax," .EDI  EXIT THEN  \ LEA EAX, X [EDI]
  DUP  87FF =   IF CR ."  inc DWORD" .EDI           EXIT THEN  \ INC   19F9 [EDI] 
  DUP  8788 =   IF CR ."  mov al,"  .EDI      EXIT THEN  \ MOV     19F9 [EDI] , AL 
  DUP  8789 =   IF CR ."  mov " .EDI ." ,eax"     EXIT THEN  \ MOV X [EDI], EAX
  DUP  8703 =   IF CR ."  add eax," .EDI      EXIT THEN  \ ADD EAX , X [EDI]
  DUP  8733 =   IF CR ."  xor eax," .EDI      EXIT THEN  \ XOR EAX , X [EDI]
  DUP  87C7 =   IF CR ."  mov " DROP DUP 6 + @
                             H. ." ,"  DUP @ .EDI 6 + EXIT THEN  \ MOV X [EDI], # Y
  DUP  45C7 =   IF 3_GD_STEP .INT    EXIT THEN  \ MOV X [EBP], # X 
  DUP  3D83 =   IF 2_GD_STEP .ADR DUP C@ 1_GD_STEP EXIT THEN  \ MOV X [EBP], # X 
  DUP  0533 =   IF 2_GD_STEP .ADR EXIT THEN  \ XOR X [EBP], X 
  DUP  0503 =   IF 2_GD_STEP .ADR EXIT THEN  \ ADD    EAX , X
  DUP  1501 =   IF 2_GD_STEP .ADR EXIT THEN  \ ADD    X , EDX  
  DUP  050B =   IF 2_GD_STEP .ADR EXIT THEN  \ OR     EAX , X
  DUP  0D3B =   IF 2_GD_STEP .ADR EXIT THEN  \ CMP    ECX , x
  DUP  2DF7 =   IF 2_GD_STEP .ADR EXIT THEN  \ IMUL   x
  DUP  808D =   IF 2_GD_STEP .INT EXIT THEN  \ LEA  EAX , 8700 [EAX]
  DUP  9A8D =   IF 2_GD_STEP .INT EXIT THEN  \ LEA  EBX , 55C298 [EDX] 
  DUP  01C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV [ECX] , # 424648D 
  DUP 0C0C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV EAX, # X
  DUP 0C1C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV ECX, # X
  DUP 0C069 =   IF 2_GD_STEP .INT EXIT THEN  \ IMUL    EAX , EAX , # 4 
  DUP 0C3C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV EBX, # X
  DUP  05C7 =   IF 2_GD_STEP .ADR .INT  EXIT THEN  \ MOV     5746E5  ( OPT?+5  ) , # FFFFFFFF 
  DUP6B?0       IF  6_GD_STEP0  EXIT THEN  \ MOV  EAX, # X
  DUP6B?1       IF  6_GD_STEP1  EXIT THEN
  DUP 00583 =   IF  6_GD_STEP1 
         DUP C@     1_GD_STEP   EXIT THEN
  DROP
  DUP @ FFFFFF AND
  DUP 021C8D = IF 3_GD_STEP	EXIT THEN
  DUP 240401 = IF 3_GD_STEP	EXIT THEN \ ADD [ESP] , EAX
  DUP C09D0F = IF 3_GD_STEP	EXIT THEN \ SETGE  AL
  DUP C09E0F = IF 3_GD_STEP	EXIT THEN \ SETLE  AL
  DUP 8D1C8D = IF 7_GD_STEP	EXIT THEN \ LEA  EBX, [ECX*4]
\ CMPXCHG [EAX] , AL| EAX
\ LSS     EAX , [EAX]
\ BTR     [EAX] , EAX
\ LFS     EAX , [EAX]
\ LGS     EAX , [EAX]
\ MOVZX   EAX , BYTE|WORD  PTR [EAX]
\ 0000.0000 1011.1XXX 0000.1111
  DUP FFF8FF 
  AND 00B00F = IF 3_GD_STEP      EXIT THEN

  DUP 24442B = IF 4_GD_STEP      EXIT THEN \ SUB  EAX, X [ESP]
  DUP 24648D = IF 4_GD_STEP      EXIT THEN \ LEA  ESP, X [ESP]
\ MOV|LEA  EAX, X [E__] [E__*X]
\ MOV|LEA  X [E__] [E__*X], EAX
\ POP      X [E__] [E__*X]
\ XXXX.X1XX 0100.0100 1000.1XX1
  DUP 04FFF9 
  AND 044489 = IF 4_GD_STEP      EXIT THEN
  DUP 035C8D = IF 4_GD_STEP      EXIT THEN \ MOV   EBX, X  [EBX] [EAX]
  DUP 03448B = IF 4_GD_STEP      EXIT THEN \ MOV   EAX, X  [EBX] [EAX]
  DUP 03B60F = IF 3_GD_STEP      EXIT THEN \ MOVZX EAX, BYTE PTR [EBX]
  DUP 18B60F = IF 3_GD_STEP      EXIT THEN \ MOVZX EBX, BYTE PTR [EAX]
  DUP 31348B = IF 3_GD_STEP      EXIT THEN \ MOV ESI, [ESI+ECX]
  DUP 40B60F = IF 4_GD_STEP      EXIT THEN \ MOVZX   EAX , BYTE PTR x [EAX]
  DUP 345C8B = IF 4_GD_STEP      EXIT THEN \ LEA     EAX , [EAX] [ECX*4] 
  DUP 0E348B = IF 3_GD_STEP      EXIT THEN \ MOV ESI, [ESI] [ECX]
  DUP 03048D = IF 3_GD_STEP      EXIT THEN \ LEA EAX, [EBX] [EAX]
  DUP 355C89 = IF 4_GD_STEP      EXIT THEN \ MOV  EBX, [ESI+ESP-4]
  DUP 30748B = IF 4_GD_STEP      EXIT THEN \ MOV ESI, [1+ESI+EAX]
  DUP 88048D = IF 3_GD_STEP      EXIT THEN \ LEA EAX , [EAX] [ECX*4] 
  DUP 02048D = IF 3_GD_STEP      EXIT THEN \ LEA EAX, [EDX] [EAX] 
  DUP 06748B = IF 4_GD_STEP      EXIT THEN \ MOV ESI, 1 [ESI] [EAX]
  DUP 245C8B = IF 4_GD_STEP      EXIT THEN \ MOV EBX, 8 [ESP]
  DUP 244C8B = IF 4_GD_STEP      EXIT THEN \ MOV ECX, 8 [ESP]
  DUP 2E5C89 = IF 4_GD_STEP      EXIT THEN \ MOV  -4 [ESI] [EBP], EBX
  DUP 045C89 = IF 4_GD_STEP      EXIT THEN \ MOV  4 [ESP] [EAX], EBX
  DUP 2E74FF = IF 4_GD_STEP      EXIT THEN \ PUSH -4 [ESI] [EBP]
  DUP 3574FF = IF 4_GD_STEP      EXIT THEN \ PUSH -4 [EBP] [ESI]
  DUP 240CFF = IF 3_GD_STEP      EXIT THEN \ DEC     [ESP] 
  DUP 09B70F = IF 3_GD_STEP	 EXIT THEN \ MOVZX   ECX , WORD PTR X [ECX] 
  DUP 40B70F = IF 4_GD_STEP	 EXIT THEN \ MOVZX   EAX , WORD PTR X [EAX] 
  DUP 42B60F = IF 4_GD_STEP	 EXIT THEN \ MOVZX   EAX , WORD PTR X [EDX] 
  DUP 24048B = IF 3_GD_STEP      EXIT THEN \ MOV   EAX, 0  [ESP]
  DUP 240C8B = IF 3_GD_STEP      EXIT THEN \ MOV   ECX , [ESP] 
  DUP  1048B = IF 3_GD_STEP      EXIT THEN \ MOV   EAX , [ECX] [EAX] 

  DUP 01048D = IF 3_GD_STEP      EXIT THEN \ LEA   EAX , [ECX] [EAX] 
  DUP C0BE0F = IF 3_GD_STEP      EXIT THEN \ MOV   EAX, AL 
  DUP 0045C7 = IF 3_GD_STEP .INT EXIT THEN \ MOV  0 [EBP], # 0
  DUP 240481 = IF 3_GD_STEP .INT EXIT THEN \ ADD     [ESP] , # 4 

  DUP B5348D = IF 3_GD_STEP .INT EXIT THEN \ LEA  ESI, [ESI*4]
  DUP 8D0C8D = IF 3_GD_STEP .INT EXIT THEN \ LEA  ECX, [ECX*4]
  DUP 84248D = IF 3_GD_STEP      EXIT THEN \ LEA  ESP, [ESP] [EAX*4]


  DUP 244C2B = IF 4_GD_STEP      EXIT THEN \   SUB     ECX , 4 [ESP] 
  DUP 04B60F = IF 4_GD_STEP      EXIT THEN \   MOVZX EAX, BYTE [EDI] [ESI]
  DUP 243C83 = IF 4_GD_STEP      EXIT THEN \   CMP     [ESP] , # 0 
  DUP7B?       IF 7_GD_STEP      EXIT THEN
  DUP 2404FF = IF 3_GD_STEP      EXIT THEN \ INC [ESP]
  DUP 241C8B = IF 3_GD_STEP      EXIT THEN \ MOV  EBX, [ESP]
  DUP 240403 = IF 3_GD_STEP      EXIT THEN \ ADD  EAX , [ESP] 
  DUP 87B60F = IF CR ."  movzx eax,BYTE" DROP 1+ DUP .EDI  EXIT THEN  \ MOVZX   EAX , BYTE PTR 19E3 [EDI] 
  CR H. TRUE ABORT" UNKNOWN CODE"
;

: GDIS ( A-limit A-init -- )
\   CR ." VV=" 2DUP H. H. 2DUP - .
    BEGIN 
\	H-STDOUT  1 TO H-STDOUT ." ." TO H-STDOUT
	GD-STEP  2DUP U> 0=
    UNTIL  2DROP ;
 BASE !
\EOF
	2DUP S" MOD"	COMPARE 0= IF 2DROP ." _MOD"	BREAK
	2DUP S" DUP"	COMPARE 0= IF 2DROP ." _DUP"	BREAK
	2DUP S" OR"	COMPARE 0= IF 2DROP ." _OR"	BREAK
	2DUP S" XOR"	COMPARE 0= IF 2DROP ." _XOR"	BREAK
	2DUP S" AND"	COMPARE 0= IF 2DROP ." _AND"	BREAK
	2DUP S" CMOVE"	COMPARE 0= IF 2DROP ." _CMOVE"	BREAK
	2DUP S" TYPE"	COMPARE 0= IF 2DROP ." _TYPE"	BREAK
	2DUP S" ALIGN"	COMPARE 0= IF 2DROP ." _ALIGN"	BREAK
	2DUP S" TITLE"	COMPARE 0= IF 2DROP ." _TITLE"	BREAK
	2DUP S" LT"	COMPARE 0= IF 2DROP ." _LT"	BREAK
	2DUP S" BL"	COMPARE 0= IF 2DROP ." _BL"	BREAK
	2DUP S" DP"	COMPARE 0= IF 2DROP ." _DP"	BREAK
	2DUP S" TRUE"	COMPARE 0= IF 2DROP ." _TRUE"	BREAK
	2DUP S" FALSE"	COMPARE 0= IF 2DROP ." _FALSE"	BREAK
	2DUP S" LOOP"	COMPARE 0= IF 2DROP ." _LOOP"	BREAK