Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4867 leency 1
\ HSSSS H.
2
 
3
[IFNDEF] BREAK
4
  : BREAK POSTPONE EXIT POSTPONE THEN ; IMMEDIATE
5
[THEN]
6
 
7
C" VECT-CODE" FIND NIP 0=
8
[IF]	' _VECT-CODE VALUE	VECT-CODE
9
[ELSE]	' _VECT-CODE	TO	VECT-CODE
10
[THEN]
11
C" USER-CODE" FIND NIP 0=
12
[IF]	' _USER-CODE VALUE	USER-CODE
13
[ELSE]	' _USER-CODE	TO	USER-CODE
14
[THEN]
15
C" USER-VALUE-CODE" FIND NIP 0=
16
[IF]	' _USER-VALUE-CODE VALUE	USER-VALUE-CODE
17
[ELSE]	' _USER-VALUE-CODE	TO	USER-VALUE-CODE
18
[THEN]
19
 
20
\ ' _CONSTANT-CODE	TO CONSTANT-CODE
21
\ ' _CREATE-CODE		TO CREATE-CODE
22
\ ' _CLITERAL-CODE	TO CLITERAL-CODE
23
\ ' _SLITERAL-CODE	TO SLITERAL-CODE
24
 
25
BASE @ HEX
26
 
27
: DUP5B?0      ( C -- C FLAG )
28
  DUP   0C7 AND   5 =    \  ADD|OR|ADC|SBB|AND|SUB|XOR|CMP  EAX, # X
29
  OVER  0FC AND 0B8 = OR \  MOV EAX|EBX|ECX|EDX, # X
30
;
31
 
32
: DUP5B?1      ( C -- C FLAG )
33
  DUP  0FD AND 0A1 =   \  MOV EAX, X  | X , EAX
34
;
35
 
36
: DUP6B?0      ( W -- W FLAG )
37
  DUP  C3FF AND C081 = \ ADD|OR|ADC|SBB|AND|SUB|XOR|CMP  EAX, # X
38
  OVER   0C7 = OR \ MOV [EAX], # X
39
\  OVER  878B = OR \ MOV EAX, X [EDI]
40
\  OVER  878D = OR \ LEA EAX, X [EDI]
41
\  OVER  873B = OR \ CMP EAX, X [EDI]
42
;
43
 
44
: DUP6B?1      ( W -- W FLAG )
45
  DUP  00501 =    \ ADD  X , EAX
46
  OVER  053B = OR \ CMP  EAX,  X
47
 
48
\ X00X.X101 1000.10X1
49
  OVER  67FD AND 0589 = OR  \ MOV X {[EBP]}, E(ACDB)X | E(ACDB)X , X {[EBP]}
50
  OVER  0589 = OR \ MOV X , EAX
51
  OVER  058D = OR \ MOV EAX,  X
52
  OVER  1D8D = OR \ MOV EBX,  X
53
  OVER  808B = OR \ MOV EAX, X [EAX]
54
  OVER  05FF = OR \ INC X
55
\  OVER  FCFF AND C0C7 = OR \ MOV EAX|EBX|ECX|EDX, # X
56
;
57
 
58
: UV> ' >BODY @ TlsIndex@ + POSTPONE LITERAL ; IMMEDIATE
59
 
60
\ : GGGX H. ." -0x" TlsIndex@ H. ." -0x" RESERVE  H. ;
61
 
62
: .EDI   ( ADDR n -- ADDR1 )
63
  ." [
64
   DROP 2+ DUP @
65
 
66
\ ." XX" DUP H.
67
 TlsIndex@ +
68
   CASE
69
R0       OF ." T_R0" ENDOF
70
S0       OF ." T_S0" ENDOF
71
WARNING  OF ." T_WARNING" ENDOF
72
STATE    OF ." T_STATE" ENDOF
73
BLK      OF ." T_BLK" ENDOF
74
CURFILE  OF ." T_CURFILE" ENDOF
75
HANDLER  OF ." T_HANDLER" ENDOF
76
HLD      OF ." T_HLD" ENDOF
77
BASE     OF ." T_BASE" ENDOF
78
PAD      OF ." T_PAD" ENDOF
79
ER-A     OF ." T_ERminusA" ENDOF
80
ER-U     OF ." T_ERminusU" ENDOF
81
DOES>A   OF ." T_DOESgreatA" ENDOF
82
#TIB     OF ." T_nTIB" ENDOF
83
>IN      OF ." T_greatIN" ENDOF
84
UV> TIB  OF ." T_TIB" ENDOF
85
ATIB     OF ." T_ATIB" ENDOF
86
UV> SOURCE-ID OF ." T_SOURCEminusID" ENDOF
87
CURSTR   OF ." T_CURSTR" ENDOF
88
\ WBW-NFA OF ." T_WBWminusNFA" ENDOF
89
\ WBW-OFFS OF ." T_WBWminusOFFS" ENDOF
90
CURRENT  OF ." T_CURRENT" ENDOF
91
S-O    OF ." T_SminusO" ENDOF
92
UV> CONTEXT  OF ." T_CONTEXT" ENDOF
93
>OUT OF ." T_greatOUT" ENDOF
94
W-CNT  OF ." T_WminusCNT" ENDOF
95
 
96
\ NNN OF ." T_NNN" ENDOF
97
 TlsIndex@ - RESERVE  - DUP 0< IF CR ." (%edi) RESERVE " ABORT THEN
98
     ." reserve+0x"
99
 H. ." +edi]" CELL+  EXIT
100
    ENDCASE  ." -main_task+edi]" CELL+
101
;
102
 
103
\  RESERVE  -  DUP 0< IF CR  ." (%edi) RESERVE "
104
\  TlsIndex@ H. RESERVE  H.  TlsIndex@ - H. H. ABORT THEN
105
 
106
\     ." reserve+0x" GGGX ." +edi]" CELL+  EXIT
107
\     ." reserve+0x" TlsIndex@ - H. RESERVE  H. ." +edi]" CELL+  EXIT
108
\    ENDCASE  ." -main_task+edi]" CELL+ ;
109
 
110
: H.-H  ." 0" BASE @ HEX SWAP U>D (D.) TYPE BASE ! ." H" ;
111
 
112
: 1_GD_STEP ( ADDR n -- ADDR1 )
113
   CR ."  DB "  0xFF AND  H.-H 1+ ;
114
 
115
: 2_GD_STEP ( ADDR -- ADDR1 )
116
  1_GD_STEP ." ,"  DUP C@ H.-H 1+ ;
117
 
118
: 3_GD_STEP ( ADDR -- ADDR1 )
119
  2_GD_STEP ." ,"  DUP C@ H.-H 1+ ;
120
 
121
: 4_GD_STEP ( ADDR -- ADDR1 )
122
  3_GD_STEP ." ,"  DUP C@ H.-H 1+ ;
123
 
124
[IFNDEF] OCTAL : OCTAL 8 BASE ! ;
125
[THEN]
126
 
127
: \ooo.        ( n1 -- )
128
	BASE @ >R  DECIMAL
129
 
130
	R> BASE ! ;
131
 
132
: ATYPE ( arrd len -- )
133
  DUP 0= IF 2DROP BREAK
134
  [CHAR] ' EMIT
135
 
136
     LOOP DROP
137
  [CHAR] ' EMIT
138
 ;
139
 
140
0x5F535953 CONSTANT 'SYS_'
141
 
142
: GTYPE
143
   OVER @  'SYS_' = IF 4 - SWAP 4 + SWAP TYPE BREAK
144
  ." cfa_"
145
	2DUP S" CONTEXT"	COMPARE 0= IF 2DROP ." _CONTEXT"	BREAK
146
	2DUP S" WORD"	COMPARE 0= IF 2DROP ." _WORD"	BREAK
147
	2DUP S" LEAVE"	COMPARE 0= IF 2DROP ." _LEAVE"	BREAK
148
	2DUP S" REPEAT"	COMPARE 0= IF 2DROP ." _REPEAT"	BREAK
149
	2DUP S" exit"	COMPARE 0= IF 2DROP ." _exit"	BREAK
150
	2DUP S" CHAR"	COMPARE 0= IF 2DROP ." _CHAR"	BREAK
151
	2DUP S" IF"	COMPARE 0= IF 2DROP ." _IF"	BREAK
152
	2DUP S" ELSE"	COMPARE 0= IF 2DROP ." _ELSE"	BREAK
153
	2DUP S" WHILE"	COMPARE 0= IF 2DROP ." _WHILE"	BREAK
154
	2DUP S" RESIZE"	COMPARE 0= IF 2DROP ." _RESIZE"	BREAK
155
	2DUP S" free"	COMPARE 0= IF 2DROP ." _free"	BREAK
156
	2DUP S" write"	COMPARE 0= IF 2DROP ." _write"	BREAK
157
	2DUP S" KEY_EVENT"	COMPARE 0= IF 2DROP ." _KEY_EVENT"	BREAK
158
	2DUP S" PAGE"	COMPARE 0= IF 2DROP ." _PAGE"	BREAK
159
	2DUP S" PAGE_EXECUTE_READWRITE"	COMPARE 0= IF 2DROP ." _PAGE_EXECUTE_READWRITE"	BREAK
160
	2DUP S" MEM_COMMIT"	COMPARE 0= IF 2DROP ." _MEM_COMMIT"	BREAK
161
	2DUP S" MEM_RESERVE"	COMPARE 0= IF 2DROP ." _MEM_RESERVE"	BREAK
162
	2DUP S" INVALID_HANDLE_VALUE"	COMPARE 0= IF 2DROP ." _INVALID_HANDLE_VALUE"	BREAK
163
	2DUP S" FILE_ATTRIBUTE_ARCHIVE"	COMPARE 0= IF 2DROP ." _FILE_ATTRIBUTE_ARCHIVE"	BREAK
164
	2DUP S" CREATE_ALWAYS"	COMPARE 0= IF 2DROP ." _CREATE_ALWAYS"	BREAK
165
	2DUP S" OPEN_EXISTING"	COMPARE 0= IF 2DROP ." _OPEN_EXISTING"	BREAK
166
	2DUP S" FILE_BEGIN"	COMPARE 0= IF 2DROP ." _FILE_BEGIN"	BREAK
167
	2DUP S" FILE_CURRENT"	COMPARE 0= IF 2DROP ." _FILE_CURRENT"	BREAK
168
	2DUP S" EXTERN"	COMPARE 0= IF 2DROP ." _EXTERN"	BREAK
169
	2DUP S" EXPORT"	COMPARE 0= IF 2DROP ." _EXPORT"	BREAK
170
	2DUP S" BREAK"	COMPARE 0= IF 2DROP ." _BREAK"	BREAK
171
	2DUP S" ERR"	COMPARE 0= IF 2DROP ." _ERR"	BREAK
172
 
173
 
174
      CASE
175
      [CHAR] @ OF ." _ld" ENDOF
176
      [CHAR] ! OF ." save" ENDOF
177
      [CHAR] = OF ." _equ" ENDOF
178
      [CHAR] < OF ." less" ENDOF
179
      [CHAR] > OF ." great" ENDOF
180
      [CHAR] + OF ." plus" ENDOF
181
      [CHAR] - OF ." minus" ENDOF
182
      [CHAR] * OF ." _mul" ENDOF
183
      [CHAR] / OF ." _div" ENDOF
184
      [CHAR] . OF ." dot" ENDOF
185
      [CHAR] : OF ." dcoma" ENDOF
186
      [CHAR] ; OF ." _end" ENDOF
187
      [CHAR] ? OF ." que" ENDOF
188
      [CHAR] ( OF ." _c" ENDOF
189
      [CHAR] ) OF ." cend" ENDOF
190
      [CHAR] [ OF ." _x" ENDOF
191
      [CHAR] ] OF ." _y" ENDOF
192
      [CHAR] { OF ." lsk" ENDOF
193
      [CHAR] } OF ." rsk" ENDOF
194
      [CHAR] , OF ." com" ENDOF
195
      [CHAR] ' OF ." tic" ENDOF
196
      [CHAR] ~ OF ." til" ENDOF
197
      [CHAR] ^ OF ." pic" ENDOF
198
      [CHAR] " OF ." dtic" ENDOF
199
      [CHAR] | OF ." l" ENDOF
200
      [CHAR] # OF ." n" ENDOF
201
      [CHAR] $ OF ." dol" ENDOF
202
      [CHAR] \ OF ." sl" ENDOF
203
      [CHAR] & OF ." and_" ENDOF
204
	I IF EMIT ENDOF
205
      [CHAR] 0 OF ." _0" ENDOF
206
      [CHAR] 1 OF ." _1" ENDOF
207
      [CHAR] 2 OF ." _2" ENDOF
208
      [CHAR] 3 OF ." _3" ENDOF
209
      [CHAR] 4 OF ." _4" ENDOF
210
      [CHAR] 5 OF ." _5" ENDOF
211
      [CHAR] 6 OF ." _6" ENDOF
212
      [CHAR] 7 OF ." _7" ENDOF
213
      [CHAR] 8 OF ." _8" ENDOF
214
      [CHAR] 9 OF ." _9" ENDOF
215
               EMIT
216
 
217
     LOOP DROP ;
218
 
219
 
220
 
221
: GN.  ( ADDR -- )
222
  DUP 0x80 + 0xFFFFFF00 AND 0=  \  ABS  0x7F <
223
  IF H.-H EXIT THEN
224
  DUP HERE U<
225
  IF   DUP         WordByAddr
226
        OVER >R GTYPE ." +"
227
        R> 1- NAME> - DUP TO #GN H.-H
228
  ELSE NEGATE DUP  WordByAddr
229
        >R >R
230
        R@ 1- NAME> - DUP TO #GN H.-H
231
        ." -" R> R>  GTYPE
232
  THEN
233
 ;
234
 
235
: .INT ( ADDR -- ADDR1 )
236
 CR   DUP HSSSS @ +
237
 @ OVER @ \ ." I=" 2DUP H. H. CR
238
 =
239
 IF   ."  DD " DUP @ H.-H
240
 ELSE ."  DD "   DUP @ GN.
241
 THEN  CELL+ ;
242
 
243
: .ADR ( ADDR -- ADDR1 )
244
   CR ."  DD "   DUP @ GN. CELL+ ;
245
 
246
: .ADR68 ( ADDR -- ADDR1 )
247
   CR ."  DD 68 "   DUP @ DUP H. GN. CELL+ ;
248
 
249
: 5_GD_STEP0 ( ADDR -- ADDR1 )
250
  1_GD_STEP .INT ;
251
 
252
: 5_GD_STEP1 ( ADDR -- ADDR1 )
253
  1_GD_STEP .ADR ;
254
 
255
: 6_GD_STEP0 ( ADDR -- ADDR1 )
256
  2_GD_STEP  .INT ;
257
 
258
: 6_GD_STEP1 ( ADDR -- ADDR1 )
259
  2_GD_STEP .ADR ;
260
 
261
: 7_GD_STEP  ( ADDR -- ADDR1 )
262
  3_GD_STEP  .ADR ;
263
 
264
: 1A_GD_STEP ( ADDR c -- ADDR1 )
265
   DROP   1+ DUP REL@ CELL+ GN. CELL+  ;
266
 
267
: 2A_GD_STEP ( ADDR W -- ADDR1 )
268
   CR ."  DW "
269
     H.-H   2+ DUP REL@ CELL+
270
   CR ."  DD "  GN. ." -$-4" CELL+  ;
271
C" C>S" FIND NIP 0=
272
[IF] : C>S ( c -- n )  0xFF AND [ 0x7F INVERT ] LITERAL XOR 0x80 + ;
273
[THEN]
274
 
275
: J_GD_STEP_
276
  0x70 - 3 *
277
  C" jo jnojb jaeje jnejbeja js jnsjp jnpjl jgejlejg " 1+ +
278
   CR 3    TYPE ."  " 1+  DUP C@ C>S OVER + 1+ GN. 1+
279
 ; \ short
280
 
281
: J_GD_STEP
282
  DUP >R
283
  0x70 - 3 *
284
  C" jo jnojb jaeje jnejbeja js jnsjp jnpjl jgejlejg " 1+ +
285
   CR ." ;" 3   TYPE ."  " 1+  DUP C@ C>S OVER + 1+ GN. 1+
286
   2- R>
287
   #GN IF 2_GD_STEP EXIT THEN
288
   J_GD_STEP_
289
 ; \ short
290
 
291
: GD-STEP  (  CFA  -- CFA+N )
292
\  DUP 9 EMIT H.
293
  DUP   C@      \  CFA  N'
294
  DUP   0C3 = IF  1_GD_STEP  EXIT THEN  \ RET
295
  DUP   066 = IF  1_GD_STEP  EXIT THEN  \ D16:
296
  DUP   064 = IF  1_GD_STEP  EXIT THEN  \ FS:
297
  DUP   068 = IF  1_GD_STEP .INT  EXIT THEN  \ push X
298
\ LOOPNZ X LOOPZ X LOOP X JECXZ X IN AL, 0 IN EAX, 0 OUT 0 , AL OUT 0 , EAX
299
\ 1110.0XXX
300
  DUP 0F8 AND 0E0 = IF 2_GD_STEP EXIT THEN
301
\ 010X.XXXX
302
  DUP 0E0 AND 040 = IF 1_GD_STEP EXIT THEN  \ INC|DEC|PUSH|POP  E_X
303
\ 0111.0XXX
304
  DUP 0F0 AND 070 = IF J_GD_STEP EXIT THEN  \ JO   short
305
  DUP         0EB = IF 2_GD_STEP EXIT THEN  \ JMP
306
  DUP   090 = IF  1_GD_STEP  EXIT THEN  \  !!!!!
307
  DUP   099 = IF  1_GD_STEP  EXIT THEN  \  CDQ
308
  DUP   0A4 = IF  1_GD_STEP  EXIT THEN  \
309
  DUP   0A5 = IF  1_GD_STEP  EXIT THEN  \
310
  DUP   0A6 = IF  1_GD_STEP  EXIT THEN  \
311
  DUP   0AA = IF  1_GD_STEP  EXIT THEN  \
312
  DUP   0AB = IF  1_GD_STEP  EXIT THEN  \
313
  DUP   0AC = IF  1_GD_STEP  EXIT THEN  \
314
  DUP   0AE = IF  1_GD_STEP  EXIT THEN  \
315
  DUP   024 = IF  2_GD_STEP  EXIT THEN  \ AND  AL , # 1
316
  DUP   02C = IF  2_GD_STEP  EXIT THEN  \ SUB  AL , # 1
317
  DUP   03C = IF  2_GD_STEP  EXIT THEN  \ CMP  AL , # 1
318
  DUP   0CD = IF  2_GD_STEP  EXIT THEN  \ INT	X
319
  DUP   0B0 = IF  2_GD_STEP  EXIT THEN  \
320
  DUP   0F2 = IF  1_GD_STEP  EXIT THEN  \
321
  DUP   0F3 = IF  2_GD_STEP  EXIT THEN  \ REPZ CMPSB
322
  DUP   0FC = IF  1_GD_STEP  EXIT THEN  \ CLD
323
  DUP   0FD = IF  1_GD_STEP  EXIT THEN  \ STD
324
  DUP   09C = IF  1_GD_STEP  EXIT THEN  \ PUSHFD
325
  DUP   09D = IF  1_GD_STEP  EXIT THEN  \ POPFD
326
  DUP5B?0     IF  5_GD_STEP0 EXIT THEN
327
  DUP5B?1     IF  5_GD_STEP1 EXIT THEN
328
 
329
   DUP   0E9 = IF CR ."  DB 0E9H"
330
                  CR ."  DD " 1A_GD_STEP ." -$-4" EXIT THEN  \  JMP
331
   DUP   0E8 = IF CR ."  call " 1A_GD_STEP
332
                 DUP CELL- REL@ CELL+
333
                 DUP USER-VALUE-CODE =
334
                 OVER      USER-CODE = OR
335
                 IF CR ."  DD reserve+"
336
                    DROP DUP @ RESERVE -  H.-H CELL+
337
                       EXIT
338
                 THEN
339
 
340
                     CONSTANT-CODE =
341
                 IF   .INT EXIT
342
                 THEN
343
 
344
                 DUP CELL- REL@ CELL+
345
                 CREATE-CODE  =
346
                 IF   .INT 2DUP U>
347
                   IF   DUP C@ 1_GD_STEP
348
                        BEGIN  2DUP U>
349
                        WHILE  DUP 7 AND
350
			IF ." ,"
351
			ELSE CR ."  DB "
352
			THEN DUP C@ H.-H 1+
353
                        REPEAT
354
                   THEN  EXIT
355
                 THEN
356
 
357
                 DUP CELL- REL@ CELL+
358
                 DUP  CLITERAL-CODE =
359
                 OVER ALITERAL-CODE = OR
360
                 SWAP SLITERAL-CODE = OR
361
                 IF  CR ."  DB " DUP COUNT DUP>R DUP H.-H
362
                     CR ."  DB " ATYPE ." ,0"
363
                     R> + 2+ EXIT
364
                 THEN
365
                 DUP CELL- REL@ CELL+
366
                 VECT-CODE  =
367
                 IF   .ADR  EXIT
368
                 THEN
369
 
370
            EXIT THEN  \  CALL
371
\ 1110.11XX
372
  DUP FC AND EC = IF 1_GD_STEP EXIT THEN  \ IN|OUT  EAX AL, DX | DX, EAX EL
373
 
374
  DROP
375
  DUP W@ \ CR ." G=" DUP H.
376
  DUP3B?[EBP]   IF  3_GD_STEP   EXIT THEN
377
  DUP3B?        IF  3_GD_STEP   EXIT THEN
378
  DUP2B?        IF  2_GD_STEP   EXIT THEN
379
  DUP 0DB0A =   IF  2_GD_STEP   EXIT THEN  \ OR  BL, BL
380
  DUP 0C90A =   IF  2_GD_STEP   EXIT THEN  \ OR  CL, CL
381
  DUP 0038B =   IF  2_GD_STEP   EXIT THEN  \ MOV  EAX, [EBX]
382
  DUP 0EC87 =   IF  2_GD_STEP   EXIT THEN  \
383
  DUP 0188A =   IF  2_GD_STEP   EXIT THEN  \ MOV BL, [EAX]
384
  DUP 07D8B =   IF  3_GD_STEP   EXIT THEN  \ MOV EDI, X [EBP]
385
  DUP 0C58B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,  EBP
386
  DUP 0E08B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,  EBP
387
  DUP 0E88B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,  EBP
388
  DUP 0458F =   IF  3_GD_STEP   EXIT THEN  \ POP  X [EBP]
389
  DUP 075FF =   IF  3_GD_STEP   EXIT THEN  \ PUSH X [EBP]
390
  DUP 0C009 =   IF  2_GD_STEP   EXIT THEN  \ OR   EAX, EAX
391
  DUP 0E3FF =   IF  2_GD_STEP   EXIT THEN  \ JMP  EBX
392
\  DUP 0D2FF =   IF  2_GD_STEP   EXIT THEN  \ JMP  EDX
393
  DUP 0E2FF =   IF  2_GD_STEP   EXIT THEN  \ JMP  EDX
394
  DUP 0D0FF =   IF  2_GD_STEP   EXIT THEN
395
  DUP 0D2FF =   IF  2_GD_STEP   EXIT THEN  \ CALL EDX
396
  DUP 023FF =   IF  2_GD_STEP   EXIT THEN  \ JMP [EBX]
397
  DUP 0F903 =   IF  2_GD_STEP   EXIT THEN  \ ADD EDI, ECX
398
  DUP 0F103 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESI, ECX
399
  DUP 0F003 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESI, EAX
400
  DUP 0D703 =   IF  2_GD_STEP   EXIT THEN  \ ADD EDX, EDI
401
  DUP 0C703 =   IF  2_GD_STEP   EXIT THEN  \ ADD EAX, EDI
402
  DUP 0DF03 =   IF  2_GD_STEP   EXIT THEN  \ ADD EBX, EDI
403
  DUP 0E103 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESP, ECX
404
  DUP 0E303 =   IF  2_GD_STEP   EXIT THEN  \ ADD ESP, EBX
405
  DUP 0E803 =   IF  2_GD_STEP   EXIT THEN  \ ADD  EBP, EAX
406
  DUP 0EB03 =   IF  2_GD_STEP   EXIT THEN
407
  DUP 0F803 =   IF  2_GD_STEP   EXIT THEN  \ ADD EDI, EAX
408
  DUP 0E903 =   IF  2_GD_STEP   EXIT THEN  \ ADD EBP, ECX
409
  DUP  0523 =   IF  2_GD_STEP .INT  EXIT THEN  \ AND EAX , 55C18F
410
  DUP  052B =   IF  2_GD_STEP .INT  EXIT THEN  \ SUB EAX , 55C18F
411
  DUP 0C72B =   IF  2_GD_STEP   EXIT THEN  \ SUB EAX, EDI
412
  DUP 0CD2B =   IF  2_GD_STEP   EXIT THEN  \ SUB ECX, EBP
413
  DUP 0CF2B =   IF  2_GD_STEP   EXIT THEN  \ SUB ECX, EDI
414
  DUP 0D72B =   IF  2_GD_STEP   EXIT THEN  \ SUB EDX, EDI
415
  DUP 0F22B =   IF  2_GD_STEP   EXIT THEN  \ SUB ESI, EDX
416
  DUP 0DE2B =   IF  2_GD_STEP   EXIT THEN  \ SUB  EBX, ESI
417
  DUP 0E32B =   IF  2_GD_STEP   EXIT THEN  \ SUB  ESP, EBX
418
  DUP 0E82B =   IF  2_GD_STEP   EXIT THEN  \ SUB  EBP, EAX
419
  DUP 0FF33 =   IF  2_GD_STEP   EXIT THEN  \ xor EDI, EDI
420
  DUP 0D233 =   IF  2_GD_STEP   EXIT THEN  \ xor EDX, EDX
421
  DUP 0F33B =   IF  2_GD_STEP   EXIT THEN  \ CMP ESI, EBX
422
  DUP 0C13A =   IF  2_GD_STEP   EXIT THEN  \ CMP  AL,  CL
423
  DUP 0C23A =   IF  2_GD_STEP   EXIT THEN  \ CMP  AL,  DL
424
  DUP 0D83A =   IF  2_GD_STEP   EXIT THEN  \ CMP  BL,  AL
425
 
426
  DUP 0EB80 =   IF  3_GD_STEP   EXIT THEN  \ SUB  BL, # X
427
  DUP 0FB80 =   IF  3_GD_STEP   EXIT THEN  \ CMP  BL, # X
428
  DUP 0C0C6 =   IF  3_GD_STEP   EXIT THEN  \ MOV AL, # 0
429
  DUP 00081 =   IF  2_GD_STEP .INT  EXIT THEN  \ ADD [EAX] , # 800
430
  DUP  0581 =	IF  2_GD_STEP .ADR .INT  EXIT THEN  \ ADD X , # Y
431
  DUP 0E181 =   IF  2_GD_STEP .INT  EXIT THEN  \ AND ECX, # FF
432
  DUP 0E281 =   IF  2_GD_STEP .INT  EXIT THEN  \ AND EDX, # FF
433
  DUP 0F981 =   IF  2_GD_STEP .INT  EXIT THEN  \ CMP ECX, # 1
434
  DUP 04583 =   IF  4_GD_STEP   EXIT THEN  \ ADD     F8 [EBP] , # 2
435
  DUP 0EB83 =   IF  3_GD_STEP   EXIT THEN  \ SUB EBX, # X
436
  DUP 0FB83 =   IF  3_GD_STEP   EXIT THEN  \ CMP EBX, # X
437
  DUP 0EE83 =   IF  3_GD_STEP   EXIT THEN  \ SUB ESI, # X
438
  DUP 0E183 =   IF  3_GD_STEP   EXIT THEN  \ AND ECX, # 3
439
  DUP 0E383 =   IF  3_GD_STEP   EXIT THEN  \ AND EBX, # 3
440
  DUP 0EC83 =   IF  3_GD_STEP   EXIT THEN
441
  DUP 0F9C1 =   IF  3_GD_STEP   EXIT THEN  \ SAR ECX, # 2
442
  DUP 01889 =   IF  2_GD_STEP   EXIT THEN  \ MOV   [EAX], EBX
443
  DUP 04889 =   IF  3_GD_STEP   EXIT THEN  \ MOV X [EAX], ECX
444
  DUP 04289 =   IF  3_GD_STEP   EXIT THEN  \ MOV 4 [EDX], EAX
445
  DUP 04B89 =   IF  3_GD_STEP   EXIT THEN  \ MOV 2 [EBX], ECX
446
  DUP 0468A =   IF  3_GD_STEP   EXIT THEN  \ MOV  AL, X [ESI]
447
  DUP 0088A =   IF  2_GD_STEP   EXIT THEN  \ MOV  CL, [EAX]
448
  DUP 0068B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX,   [ESI]
449
  DUP 01B8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EBX,   [EBX]
450
  DUP  DF8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EBX, EDI
451
  DUP  EC8B =   IF  2_GD_STEP   EXIT THEN
452
  DUP 05089 =   IF  3_GD_STEP   EXIT THEN  \ MOV X [EAX] , EDX
453
  DUP 0368B =   IF  2_GD_STEP   EXIT THEN  \ MOV ESI,   [ESI]
454
  DUP 0758B =   IF  3_GD_STEP   EXIT THEN  \ MOV ESI, X [EBP]
455
  DUP 0408B =   IF  3_GD_STEP   EXIT THEN  \ MOV EAX, X [EAX]
456
  DUP 0498B =   IF  3_GD_STEP   EXIT THEN  \ MOV ECX, FC [ECX]
457
  DUP 04B8B =   IF  3_GD_STEP   EXIT THEN  \ MOV  ECX, 12 [EBX]
458
  DUP 0E58B =   IF  2_GD_STEP   EXIT THEN
459
  DUP 06D8D =   IF  3_GD_STEP   EXIT THEN  \ LEA  EBP, OFF-EBP [EBP]
460
  DUP 0C583 =   IF  3_GD_STEP   EXIT THEN  \ ADD  EBP, # OFF-EBP
461
  DUP 0ED83 =   IF  3_GD_STEP   EXIT THEN  \ SUB  EBP, # X
462
  DUP 0C483 =   IF  3_GD_STEP   EXIT THEN  \ ADD  ESP, # X
463
  DUP 0FA83 =   IF  3_GD_STEP   EXIT THEN  \ CMP EDX, # 3
464
  DUP 07D83 =   IF  4_GD_STEP   EXIT THEN  \ CMP X [EBP] , # Y
465
  DUP 07D89 =   IF  3_GD_STEP   EXIT THEN  \ MOV  X [EBP], EDI
466
  DUP 0CC8B =   IF  2_GD_STEP   EXIT THEN
467
  DUP 0F58B =   IF  2_GD_STEP   EXIT THEN
468
  DUP 0FC8B =   IF  2_GD_STEP   EXIT THEN
469
 
470
  DUP 0F0FF AND
471
      0800F =   IF  2A_GD_STEP  EXIT THEN  \ JNO  X
472
  DUP 075F7 =   IF  3_GD_STEP   EXIT THEN  \  DIV DWORD [EBP]
473
  DUP 0D9F7 =   IF  2_GD_STEP   EXIT THEN  \ NEG  ECX
474
  DUP 0DBF7 =   IF  2_GD_STEP   EXIT THEN  \ NEG  EBX
475
  DUP 0E3F7 =   IF  2_GD_STEP   EXIT THEN  \  MUL EBX
476
  DUP 0EBF7 =   IF  2_GD_STEP   EXIT THEN  \ IMUL EBX
477
  DUP 0FBF7 =   IF  2_GD_STEP   EXIT THEN  \ IDIV EBX
478
  DUP 0F3F7 =   IF  2_GD_STEP   EXIT THEN  \  DIV EBX
479
  DUP 0F60B =   IF  2_GD_STEP   EXIT THEN  \ OR   ESI, ESI
480
  DUP 0CE8B =   IF  2_GD_STEP   EXIT THEN  \ MOV  ECX, ESI
481
  DUP 0C48B =   IF  2_GD_STEP   EXIT THEN  \ MOV  EAX, ESP
482
  DUP 0F18B =   IF  2_GD_STEP   EXIT THEN  \ MOV  ESI, ECX
483
  DUP 0F08B =   IF  2_GD_STEP   EXIT THEN  \ MOV  ESI, EAX
484
  DUP 0D58B =   IF  2_GD_STEP   EXIT THEN  \ MOV EDX, EBP
485
  DUP 0D78B =   IF  2_GD_STEP   EXIT THEN  \ MOV EDX, EDI
486
  DUP 0DD8B =   IF  2_GD_STEP   EXIT THEN  \ MOV  EBX, EBP
487
  DUP 0FA8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EDI, EDX
488
  DUP 01A8B =   IF  2_GD_STEP   EXIT THEN  \ MOV EBX, [EDX]
489
  DUP 0028B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX, [EDX]
490
  DUP 0078B =   IF  2_GD_STEP   EXIT THEN  \ MOV EAX, [EDI]
491
  DUP  088B =   IF  2_GD_STEP   EXIT THEN  \ MOV ECX, [EAX]
492
  DUP  098B =   IF  2_GD_STEP   EXIT THEN  \ MOV ECX, [ECX]
493
  DUP  0A8B =   IF  2_GD_STEP   EXIT THEN  \ MOV ECX, [EDX]
494
  DUP  00C6 =   IF  3_GD_STEP   EXIT THEN  \ MOV [EAX] , # x
495
  DUP 0688D =   IF  3_GD_STEP   EXIT THEN  \ LEA EBP,  4 [EAX]
496
  DUP 0428D =   IF  3_GD_STEP   EXIT THEN  \ LEA EAX , FE [EDX]
497
  DUP 0498D =   IF  3_GD_STEP   EXIT THEN  \ LEA ECX, -1 [ECX]
498
  DUP 0488D =   IF  3_GD_STEP   EXIT THEN  \ LEA ECX , FC [EAX]
499
 
500
  DUP 07F8D =   IF  3_GD_STEP   EXIT THEN  \ LEA EDI, -1 [EDI]
501
  DUP 0528D =   IF  3_GD_STEP   EXIT THEN  \ LEA EDX, -4 [EDX]
502
\  DUP 01C8D =   IF  3_GD_STEP   EXIT THEN  \ LEA  EBX,  [EDX] [EAX]
503
  DUP 0038F =   IF  2_GD_STEP   EXIT THEN  \ POP  [EBX]
504
  DUP 05DD1 =   IF  3_GD_STEP   EXIT THEN  \ RCR [EBP], # 1
505
  DUP 0D0D1 =   IF  2_GD_STEP   EXIT THEN  \ RCL EAX, # 1
506
  DUP 065D1 =   IF  3_GD_STEP   EXIT THEN  \ SHL [EBP], # 1
507
  DUP 0C0C1 =   IF  3_GD_STEP   EXIT THEN  \ ROL [EBP], # 1
508
  DUP  45FF =   IF  3_GD_STEP   EXIT THEN  \ INC     0 [EBP]
509
  DUP 0310F =   IF  2_GD_STEP   EXIT THEN  \ RDTSC
510
  DUP  873B =   IF CR ."  cmp " ." eax," .EDI  EXIT THEN  \ CMP EAX, X [EDI]
511
  DUP  878B =   IF CR ."  mov " ." eax," .EDI  EXIT THEN  \ MOV EAX, X [EDI]
512
  DUP  8F8B =   IF CR ."  mov " ." ecx," .EDI  EXIT THEN  \ MOV ECX, X [EDI]
513
  DUP  878D =   IF CR ."  lea " ." eax," .EDI  EXIT THEN  \ LEA EAX, X [EDI]
514
  DUP  87FF =   IF CR ."  inc DWORD" .EDI           EXIT THEN  \ INC   19F9 [EDI]
515
  DUP  8788 =   IF CR ."  mov al,"  .EDI      EXIT THEN  \ MOV     19F9 [EDI] , AL
516
  DUP  8789 =   IF CR ."  mov " .EDI ." ,eax"     EXIT THEN  \ MOV X [EDI], EAX
517
  DUP  8703 =   IF CR ."  add eax," .EDI      EXIT THEN  \ ADD EAX , X [EDI]
518
  DUP  8733 =   IF CR ."  xor eax," .EDI      EXIT THEN  \ XOR EAX , X [EDI]
519
  DUP  87C7 =   IF CR ."  mov " DROP DUP 6 + @
520
                             H. ." ,"  DUP @ .EDI 6 + EXIT THEN  \ MOV X [EDI], # Y
521
  DUP  45C7 =   IF 3_GD_STEP .INT    EXIT THEN  \ MOV X [EBP], # X
522
  DUP  3D83 =   IF 2_GD_STEP .ADR DUP C@ 1_GD_STEP EXIT THEN  \ MOV X [EBP], # X
523
  DUP  0533 =   IF 2_GD_STEP .ADR EXIT THEN  \ XOR X [EBP], X
524
  DUP  0503 =   IF 2_GD_STEP .ADR EXIT THEN  \ ADD    EAX , X
525
  DUP  1501 =   IF 2_GD_STEP .ADR EXIT THEN  \ ADD    X , EDX
526
  DUP  050B =   IF 2_GD_STEP .ADR EXIT THEN  \ OR     EAX , X
527
  DUP  0D3B =   IF 2_GD_STEP .ADR EXIT THEN  \ CMP    ECX , x
528
  DUP  2DF7 =   IF 2_GD_STEP .ADR EXIT THEN  \ IMUL   x
529
  DUP  808D =   IF 2_GD_STEP .INT EXIT THEN  \ LEA  EAX , 8700 [EAX]
530
  DUP  9A8D =   IF 2_GD_STEP .INT EXIT THEN  \ LEA  EBX , 55C298 [EDX]
531
  DUP  01C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV [ECX] , # 424648D
532
  DUP 0C0C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV EAX, # X
533
  DUP 0C1C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV ECX, # X
534
  DUP 0C069 =   IF 2_GD_STEP .INT EXIT THEN  \ IMUL    EAX , EAX , # 4
535
  DUP 0C3C7 =   IF 2_GD_STEP .INT EXIT THEN  \ MOV EBX, # X
536
  DUP  05C7 =   IF 2_GD_STEP .ADR .INT  EXIT THEN  \ MOV     5746E5  ( OPT?+5  ) , # FFFFFFFF
537
  DUP6B?0       IF  6_GD_STEP0  EXIT THEN  \ MOV  EAX, # X
538
  DUP6B?1       IF  6_GD_STEP1  EXIT THEN
539
  DUP 00583 =   IF  6_GD_STEP1
540
         DUP C@     1_GD_STEP   EXIT THEN
541
  DROP
542
  DUP @ FFFFFF AND
543
  DUP 021C8D = IF 3_GD_STEP	EXIT THEN
544
  DUP 240401 = IF 3_GD_STEP	EXIT THEN \ ADD [ESP] , EAX
545
  DUP C09D0F = IF 3_GD_STEP	EXIT THEN \ SETGE  AL
546
  DUP C09E0F = IF 3_GD_STEP	EXIT THEN \ SETLE  AL
547
  DUP 8D1C8D = IF 7_GD_STEP	EXIT THEN \ LEA  EBX, [ECX*4]
548
\ CMPXCHG [EAX] , AL| EAX
549
\ LSS     EAX , [EAX]
550
\ BTR     [EAX] , EAX
551
\ LFS     EAX , [EAX]
552
\ LGS     EAX , [EAX]
553
\ MOVZX   EAX , BYTE|WORD  PTR [EAX]
554
\ 0000.0000 1011.1XXX 0000.1111
555
  DUP FFF8FF
556
  AND 00B00F = IF 3_GD_STEP      EXIT THEN
557
 
558
  DUP 24442B = IF 4_GD_STEP      EXIT THEN \ SUB  EAX, X [ESP]
559
  DUP 24648D = IF 4_GD_STEP      EXIT THEN \ LEA  ESP, X [ESP]
560
\ MOV|LEA  EAX, X [E__] [E__*X]
561
\ MOV|LEA  X [E__] [E__*X], EAX
562
\ POP      X [E__] [E__*X]
563
\ XXXX.X1XX 0100.0100 1000.1XX1
564
  DUP 04FFF9
565
  AND 044489 = IF 4_GD_STEP      EXIT THEN
566
  DUP 035C8D = IF 4_GD_STEP      EXIT THEN \ MOV   EBX, X  [EBX] [EAX]
567
  DUP 03448B = IF 4_GD_STEP      EXIT THEN \ MOV   EAX, X  [EBX] [EAX]
568
  DUP 03B60F = IF 3_GD_STEP      EXIT THEN \ MOVZX EAX, BYTE PTR [EBX]
569
  DUP 18B60F = IF 3_GD_STEP      EXIT THEN \ MOVZX EBX, BYTE PTR [EAX]
570
  DUP 31348B = IF 3_GD_STEP      EXIT THEN \ MOV ESI, [ESI+ECX]
571
  DUP 40B60F = IF 4_GD_STEP      EXIT THEN \ MOVZX   EAX , BYTE PTR x [EAX]
572
  DUP 345C8B = IF 4_GD_STEP      EXIT THEN \ LEA     EAX , [EAX] [ECX*4]
573
  DUP 0E348B = IF 3_GD_STEP      EXIT THEN \ MOV ESI, [ESI] [ECX]
574
  DUP 03048D = IF 3_GD_STEP      EXIT THEN \ LEA EAX, [EBX] [EAX]
575
  DUP 355C89 = IF 4_GD_STEP      EXIT THEN \ MOV  EBX, [ESI+ESP-4]
576
  DUP 30748B = IF 4_GD_STEP      EXIT THEN \ MOV ESI, [1+ESI+EAX]
577
  DUP 88048D = IF 3_GD_STEP      EXIT THEN \ LEA EAX , [EAX] [ECX*4]
578
  DUP 02048D = IF 3_GD_STEP      EXIT THEN \ LEA EAX, [EDX] [EAX]
579
  DUP 06748B = IF 4_GD_STEP      EXIT THEN \ MOV ESI, 1 [ESI] [EAX]
580
  DUP 245C8B = IF 4_GD_STEP      EXIT THEN \ MOV EBX, 8 [ESP]
581
  DUP 244C8B = IF 4_GD_STEP      EXIT THEN \ MOV ECX, 8 [ESP]
582
  DUP 2E5C89 = IF 4_GD_STEP      EXIT THEN \ MOV  -4 [ESI] [EBP], EBX
583
  DUP 045C89 = IF 4_GD_STEP      EXIT THEN \ MOV  4 [ESP] [EAX], EBX
584
  DUP 2E74FF = IF 4_GD_STEP      EXIT THEN \ PUSH -4 [ESI] [EBP]
585
  DUP 3574FF = IF 4_GD_STEP      EXIT THEN \ PUSH -4 [EBP] [ESI]
586
  DUP 240CFF = IF 3_GD_STEP      EXIT THEN \ DEC     [ESP]
587
  DUP 09B70F = IF 3_GD_STEP	 EXIT THEN \ MOVZX   ECX , WORD PTR X [ECX]
588
  DUP 40B70F = IF 4_GD_STEP	 EXIT THEN \ MOVZX   EAX , WORD PTR X [EAX]
589
  DUP 42B60F = IF 4_GD_STEP	 EXIT THEN \ MOVZX   EAX , WORD PTR X [EDX]
590
  DUP 24048B = IF 3_GD_STEP      EXIT THEN \ MOV   EAX, 0  [ESP]
591
  DUP 240C8B = IF 3_GD_STEP      EXIT THEN \ MOV   ECX , [ESP]
592
  DUP  1048B = IF 3_GD_STEP      EXIT THEN \ MOV   EAX , [ECX] [EAX]
593
 
594
  DUP 01048D = IF 3_GD_STEP      EXIT THEN \ LEA   EAX , [ECX] [EAX]
595
  DUP C0BE0F = IF 3_GD_STEP      EXIT THEN \ MOV   EAX, AL
596
  DUP 0045C7 = IF 3_GD_STEP .INT EXIT THEN \ MOV  0 [EBP], # 0
597
  DUP 240481 = IF 3_GD_STEP .INT EXIT THEN \ ADD     [ESP] , # 4
598
 
599
  DUP B5348D = IF 3_GD_STEP .INT EXIT THEN \ LEA  ESI, [ESI*4]
600
  DUP 8D0C8D = IF 3_GD_STEP .INT EXIT THEN \ LEA  ECX, [ECX*4]
601
  DUP 84248D = IF 3_GD_STEP      EXIT THEN \ LEA  ESP, [ESP] [EAX*4]
602
 
603
 
604
  DUP 244C2B = IF 4_GD_STEP      EXIT THEN \   SUB     ECX , 4 [ESP]
605
  DUP 04B60F = IF 4_GD_STEP      EXIT THEN \   MOVZX EAX, BYTE [EDI] [ESI]
606
  DUP 243C83 = IF 4_GD_STEP      EXIT THEN \   CMP     [ESP] , # 0
607
  DUP7B?       IF 7_GD_STEP      EXIT THEN
608
  DUP 2404FF = IF 3_GD_STEP      EXIT THEN \ INC [ESP]
609
  DUP 241C8B = IF 3_GD_STEP      EXIT THEN \ MOV  EBX, [ESP]
610
  DUP 240403 = IF 3_GD_STEP      EXIT THEN \ ADD  EAX , [ESP]
611
  DUP 87B60F = IF CR ."  movzx eax,BYTE" DROP 1+ DUP .EDI  EXIT THEN  \ MOVZX   EAX , BYTE PTR 19E3 [EDI]
612
  CR H. TRUE ABORT" UNKNOWN CODE"
613
;
614
 
615
: GDIS ( A-limit A-init -- )
616
\   CR ." VV=" 2DUP H. H. 2DUP - .
617
    BEGIN
618
\	H-STDOUT  1 TO H-STDOUT ." ." TO H-STDOUT
619
	GD-STEP  2DUP U> 0=
620
    UNTIL  2DROP ;
621
 BASE !
622
\EOF
623
	2DUP S" MOD"	COMPARE 0= IF 2DROP ." _MOD"	BREAK
624
	2DUP S" DUP"	COMPARE 0= IF 2DROP ." _DUP"	BREAK
625
	2DUP S" OR"	COMPARE 0= IF 2DROP ." _OR"	BREAK
626
	2DUP S" XOR"	COMPARE 0= IF 2DROP ." _XOR"	BREAK
627
	2DUP S" AND"	COMPARE 0= IF 2DROP ." _AND"	BREAK
628
	2DUP S" CMOVE"	COMPARE 0= IF 2DROP ." _CMOVE"	BREAK
629
	2DUP S" TYPE"	COMPARE 0= IF 2DROP ." _TYPE"	BREAK
630
	2DUP S" ALIGN"	COMPARE 0= IF 2DROP ." _ALIGN"	BREAK
631
	2DUP S" TITLE"	COMPARE 0= IF 2DROP ." _TITLE"	BREAK
632
	2DUP S" LT"	COMPARE 0= IF 2DROP ." _LT"	BREAK
633
	2DUP S" BL"	COMPARE 0= IF 2DROP ." _BL"	BREAK
634
	2DUP S" DP"	COMPARE 0= IF 2DROP ." _DP"	BREAK
635
	2DUP S" TRUE"	COMPARE 0= IF 2DROP ." _TRUE"	BREAK
636
	2DUP S" FALSE"	COMPARE 0= IF 2DROP ." _FALSE"	BREAK
637
	2DUP S" LOOP"	COMPARE 0= IF 2DROP ." _LOOP"	BREAK