Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4867 | leency | 1 | ( Из SMAL32 |
2 | Модифицированно Максимовым М.О. |
||
3 | email:mak@rtc.ru |
||
4 | http://forth.spb.su:8888 |
||
5 | т д {812}705-92-03 |
||
6 | т р {812}552-47-64 |
||
7 | ) |
||
8 | REQUIRE [IF] ~MAK\CompIF.f |
||
9 | REQUIRE PLACE ~MAK\PLACE.f |
||
10 | REQUIRE CASE lib\ext\case.f |
||
11 | |||
12 | VOCABULARY S_ASSEM |
||
13 | C" HIDDEN" FIND NIP 0= |
||
14 | [IF] VOCABULARY HIDDEN |
||
15 | [THEN] |
||
16 | |||
17 | ALSO HIDDEN DEFINITIONS |
||
18 | |||
19 | C" FLOAD" FIND NIP |
||
20 | [IF] FLOAD asmbase.f |
||
21 | [ELSE] REQUIRE S= ~mak\asm\asmbase.f |
||
22 | [THEN] |
||
23 | : 1Op1 ( name ( byte --> ) |
||
24 | ( --> ) |
||
25 | CREATE C, DOES> C@ C, |
||
26 | ; |
||
27 | |||
28 | 4 VALUE *DefDatasz |
||
29 | \ 4 VALUE *DefDatasz |
||
30 | |||
31 | : 1Op1W ( name ( byte --> ) |
||
32 | ( --> ) |
||
33 | CREATE C, DOES> C@ C, *DefDatasz 4 = IF 0x66 C, THEN |
||
34 | ; |
||
35 | |||
36 | : 1Op1D ( name ( byte --> ) |
||
37 | ( --> ) |
||
38 | CREATE C, DOES> C@ C, *DefDatasz 2 = IF 0x66 C, THEN |
||
39 | ; |
||
40 | |||
41 | : 1Op2 ( name ( word --> ) |
||
42 | ( --> ) |
||
43 | CREATE W, DOES> W@ W, |
||
44 | ; |
||
45 | : REF-ERROR IF 87 THROW THEN ; |
||
46 | : #OPER-ERROR SWAP IF H. 94 THROW THEN DROP ; |
||
47 | |||
48 | 0x2E 1Op1 CS: |
||
49 | 0x3E 1Op1 DS: |
||
50 | 0x26 1Op1 ES: |
||
51 | 0x64 1Op1 FS: |
||
52 | 0x65 1Op1 GS: |
||
53 | 0x36 1Op1 SS: |
||
54 | : IFIND ( c-addr --> xt -1 | c-addr 0 ) |
||
55 | DUP COUNT CONTEXT @ SEARCH-WORDLIST |
||
56 | IF NIP -1 |
||
57 | ELSE 0 |
||
58 | THEN ; |
||
59 | |||
60 | |||
61 | |||
62 | |||
63 | |||
64 | |||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | |||
71 | |||
72 | |||
73 | |||
74 | |||
75 | |||
76 | |||
77 | |||
78 | CREATE *OffName 256 ALLOT |
||
79 | CREATE *ImmName 256 ALLOT |
||
80 | CREATE *GenName 256 ALLOT |
||
81 | |||
82 | : (OthSz) ( n1 --> n2 ) 6 XOR ; |
||
83 | |||
84 | : *OpSize>DEF *OpSize 4 = IF *DefDatasz TO *OpSize THEN ; |
||
85 | |||
86 | : (Seg) ( --> ) |
||
87 | *SegReg CASE |
||
88 | |||
89 | 1 OF CS: ENDOF |
||
90 | 2 OF SS: ENDOF |
||
91 | 3 OF DS: ENDOF |
||
92 | 4 OF FS: ENDOF |
||
93 | 5 OF GS: ENDOF |
||
94 | ENDCASE |
||
95 | ; |
||
96 | |||
97 | : CompileCommand ( --> ) |
||
98 | *OpcSize IF |
||
99 | *AdSize *DefDatasz (OthSz) = IF 0x67 C, THEN |
||
100 | *OpSize *DefDatasz (OthSz) = IF 0x66 C, THEN |
||
101 | *SegReg 0< IFNOT (Seg) THEN |
||
102 | *OpCode HERE ! *OpcSize ALLOT |
||
103 | *Mod 0< IFNOT *Mod 3 AND 0x40 * *Reg 7 AND 8 * *R/M 7 AND OR OR C, THEN |
||
104 | *Scale 0< *Mod 0< OR IFNOT |
||
105 | *Scale 3 AND 0x40 * *Index 7 AND 8 * *Base 7 AND OR OR C, |
||
106 | THEN |
||
107 | *OfRel IF |
||
108 | *OfSize *DefDatasz <> IF 0x54 THROW THEN |
||
109 | *OffName C@ IFNOT 1 *OffName 1+ C! THEN |
||
110 | *OffName 1+ C@ IF *OffName HERE 2 AddStrObject |
||
111 | ELSE |
||
112 | *OffName C@ 1- *OffName 1+ C! |
||
113 | *OffName 1+ HERE 5 AddStrObject |
||
114 | THEN |
||
115 | THEN |
||
116 | *Offset HERE ! *OfSize ALLOT |
||
117 | *OpRel IF |
||
118 | *ImSize *DefDatasz <> IF 0x55 THROW THEN |
||
119 | *ImmName C@ IFNOT 1 *ImmName 1+ C! THEN |
||
120 | *ImmName 1+ C@ IF *ImmName HERE 2 AddStrObject |
||
121 | ELSE |
||
122 | *ImmName C@ 1- *ImmName 1+ C! |
||
123 | *ImmName 1+ HERE 5 AddStrObject |
||
124 | THEN |
||
125 | THEN |
||
126 | *Imm HERE ! *ImSize ALLOT |
||
127 | THEN |
||
128 | ; |
||
129 | : InitCommand ( --> ) |
||
130 | |||
131 | |||
132 | -1 TO *Scale -1 TO *Base -1 TO *Index *OffName 0! *ImmName 0! *GenName 0! |
||
133 | ; |
||
134 | |||
135 | : GetOp ( --> c-addr|char|n type ) |
||
136 | (GetOp) CASE |
||
137 | 1 OF |
||
138 | 1+ C@ DUP [CHAR] ; = IF SOURCE >IN ! 2DROP NullString 0 ELSE 1 THEN |
||
139 | ENDOF |
||
140 | 2 OF |
||
141 | BASE @ >R |
||
142 | DUP C@ OVER + C@ CASE |
||
143 | [CHAR] H OF 16 BASE ! DUP 1-! ENDOF |
||
144 | [CHAR] B OF 2 BASE ! DUP 1-! ENDOF |
||
145 | [CHAR] O OF 8 BASE ! DUP 1-! ENDOF |
||
146 | [CHAR] D OF 10 BASE ! DUP 1-! ENDOF |
||
147 | ENDCASE |
||
148 | VAL 0= IF 0x61 THROW THEN DROP R> BASE ! 2 |
||
149 | ENDOF |
||
150 | 4 OF COUNT ConvertString OVER 1- C! 1- 4 ENDOF |
||
151 | 5 OF COUNT ConvertString OVER 1- C! 1- 5 ENDOF |
||
152 | \ HEX |
||
153 | DUP |
||
154 | \ [ HERE DROP ] |
||
155 | ENDCASE |
||
156 | ; |
||
157 | |||
158 | : SCopy ( c-addr1 c-addr2 --> ) |
||
159 | OVER C@ 1+ CMOVE |
||
160 | ; |
||
161 | |||
162 | : ?Reg8 ( --> n true | false ) |
||
163 | IN>R GetOp 3 = IF |
||
164 | C" AL" S= 0 ?S= |
||
165 | C" CL" S= 1 ?S= |
||
166 | C" DL" S= 2 ?S= |
||
167 | C" BL" S= 3 ?S= |
||
168 | C" AH" S= 4 ?S= |
||
169 | C" CH" S= 5 ?S= |
||
170 | C" DH" S= 6 ?S= |
||
171 | C" BH" S= 7 ?S= |
||
172 | THEN |
||
173 | DROP FALSE R>IN |
||
174 | ; |
||
175 | : ?Reg16 ( --> n true | FALSE ) |
||
176 | IN>R GetOp 3 = IF |
||
177 | C" AX" S= 0 ?S= |
||
178 | C" CX" S= 1 ?S= |
||
179 | C" DX" S= 2 ?S= |
||
180 | C" BX" S= 3 ?S= |
||
181 | C" SP" S= 4 ?S= |
||
182 | C" BP" S= 5 ?S= |
||
183 | C" SI" S= 6 ?S= |
||
184 | C" DI" S= 7 ?S= |
||
185 | THEN |
||
186 | DROP FALSE R>IN |
||
187 | ; |
||
188 | : ?Reg32 ( --> n true | FALSE ) |
||
189 | IN>R GetOp 3 = IF |
||
190 | C" EAX" S= 0 ?S= |
||
191 | C" ECX" S= 1 ?S= |
||
192 | C" EDX" S= 2 ?S= |
||
193 | C" EBX" S= 3 ?S= |
||
194 | C" ESP" S= 4 ?S= |
||
195 | C" EBP" S= 5 ?S= |
||
196 | C" ESI" S= 6 ?S= |
||
197 | C" EDI" S= 7 ?S= |
||
198 | THEN |
||
199 | DROP FALSE R>IN |
||
200 | ; |
||
201 | : ?SegReg ( --> n true | FALSE ) |
||
202 | IN>R GetOp 3 = IF |
||
203 | C" ES" S= 0 ?S= |
||
204 | C" CS" S= 1 ?S= |
||
205 | C" SS" S= 2 ?S= |
||
206 | C" DS" S= 3 ?S= |
||
207 | C" FS" S= 4 ?S= |
||
208 | C" GS" S= 5 ?S= |
||
209 | THEN |
||
210 | DROP FALSE R>IN |
||
211 | ; |
||
212 | : SEG ( --> ) |
||
213 | ?SegReg 0= IF 104 THROW THEN (Seg) |
||
214 | ; |
||
215 | : (?Ptr_) ( --> n true | FALSE ) |
||
216 | IN>R GetOp 3 = IF |
||
217 | C" DWORD" S= 4 ?S= |
||
218 | C" BYTE" S= 1 ?S= |
||
219 | C" WORD" S= 2 ?S= |
||
220 | THEN |
||
221 | DROP FALSE R>IN |
||
222 | ; |
||
223 | |||
224 | ' (?Ptr_) ->VECT (?Ptr) |
||
225 | : ?Ptr ( --> flag ) |
||
226 | (?Ptr) IF |
||
227 | *OpSize IF *OpSize <> IF 0x50 THROW THEN ELSE TO *OpSize THEN |
||
228 | IN>R GetOp 3 = IF |
||
229 | C" PTR" S= IF RDROP TRUE EXIT ELSE DROP THEN |
||
230 | ELSE DROP THEN |
||
231 | R>IN TRUE |
||
232 | ELSE FALSE THEN |
||
233 | ; |
||
234 | : ?FWord ( ? --> ? ) |
||
235 | IN>R GetOp 3 = IF |
||
236 | C" FWORD" S= IF |
||
237 | RDROP IN>R GetOp 3 = IF |
||
238 | C" PTR" S= IF RDROP ELSE R>IN DROP THEN |
||
239 | ELSE R>IN DROP THEN TRUE EXIT |
||
240 | ELSE DROP FALSE THEN |
||
241 | ELSE DROP FALSE THEN R>IN |
||
242 | ; |
||
243 | : ?Reg ( --> flag ) |
||
244 | ?Reg32 IF |
||
245 | *OpSize 1 2 BETWEEN IF 0x50 THROW THEN 4 TO *OpSize TO *Reg TRUE |
||
246 | ELSE |
||
247 | ?Reg8 IF |
||
248 | *OpSize 2 4 BETWEEN IF 0x50 THROW THEN 1 TO *OpSize TO *Reg TRUE |
||
249 | ELSE |
||
250 | ?Reg16 IF |
||
251 | *OpSize 4 = *OpSize 1 = OR IF 0x50 THROW THEN 2 TO *OpSize TO *Reg TRUE |
||
252 | ELSE FALSE THEN |
||
253 | THEN |
||
254 | THEN |
||
255 | ; |
||
256 | : Comma ( --> ) |
||
257 | GetOp 1 = IF [CHAR] , = ?EXIT THEN 0x51 THROW |
||
258 | ; |
||
259 | : ?Colon ( --> flag ) |
||
260 | IN>R GetOp 1 = IF [CHAR] : = ELSE DROP FALSE THEN |
||
261 | DUP IF RDROP ELSE R>IN THEN |
||
262 | ; |
||
263 | : ?Bracket[ ( --> flag ) |
||
264 | IN>R GetOp 1 = IF [CHAR] [ = IF RDROP TRUE EXIT THEN |
||
265 | ELSE DROP THEN R>IN FALSE |
||
266 | ; |
||
267 | : (?Label) ( --> addr|0 TRUE | FALSE ) |
||
268 | IN>R GetOp DUP 3 = IF |
||
269 | DROP DUP 1 FindStrObject IF RDROP NIP TRUE |
||
270 | ELSE |
||
271 | RDROP \ DUP FIND IF |
||
272 | \ SWAP >R DUP >Name Off_Attr + @ 0x1000000 AND IF \ IF PUBLIC |
||
273 | \ RDROP EXECUTE TRUE |
||
274 | \ ELSE |
||
275 | \ *GenName C@ REF-ERROR R> *GenName SCopy DROP 0 TRUE |
||
276 | \ THEN |
||
277 | \ ELSE |
||
278 | ( DROP ) *GenName C@ REF-ERROR *GenName SCopy 0 TRUE |
||
279 | \ THEN |
||
280 | THEN |
||
281 | ELSE |
||
282 | DUP 1 = IF |
||
283 | DROP [CHAR] $ = IF RDROP HERE TRUE |
||
284 | ELSE R>IN FALSE THEN |
||
285 | ELSE |
||
286 | 4 = IF |
||
287 | *GenName C@ REF-ERROR |
||
288 | *GenName 1+ SCopy *GenName 1+ C@ 1+ *GenName W! RDROP 0 TRUE |
||
289 | ELSE DROP R>IN FALSE THEN |
||
290 | THEN |
||
291 | THEN |
||
292 | ; |
||
293 | : 'XFA ( --> cfa ) |
||
294 | GetOp 3 5 BETWEEN IF |
||
295 | CONTEXT @ >R PREVIOUS FIND ALSO R> CONTEXT ! |
||
296 | 0= IF 0x64 THROW THEN |
||
297 | ELSE 0x63 THROW THEN |
||
298 | ; |
||
299 | : ?Label ( --> addr|0 TRUE | FALSE ) |
||
300 | IN>R GetOp |
||
301 | \ DUP 1 = |
||
302 | \ IF DROP [CHAR] { = |
||
303 | \ IF RDROP [CHAR] } PARSE EVALUATE TRUE |
||
304 | \ ELSE R>IN FALSE |
||
305 | \ THEN EXIT |
||
306 | \ ELSE |
||
307 | 3 = IF |
||
308 | C" OFFSET" S= IF RDROP (?Label) 0= IF 0x5D THROW THEN TRUE EXIT |
||
309 | THEN |
||
310 | C" CFA" S= IF RDROP 'XFA TRUE EXIT THEN |
||
311 | C" PFA" S= IF RDROP 'XFA >BODY TRUE EXIT THEN |
||
312 | C" NFA" S= IF RDROP 'XFA >NAME TRUE EXIT THEN |
||
313 | THEN |
||
314 | \ THEN |
||
315 | DROP R>IN (?Label) |
||
316 | ; |
||
317 | |||
318 | : ?Number ( --> n TRUE | FALSE ) |
||
319 | IN>R GetOp CASE |
||
320 | 2 OF TRUE RDROP ENDOF |
||
321 | 1 OF DUP |
||
322 | [CHAR] { = IF DROP [CHAR] } PARSE EVALUATE TRUE RDROP ELSE |
||
323 | [CHAR] - = IF GetOp 2 = IF NEGATE TRUE RDROP |
||
324 | ELSE DROP FALSE R>IN THEN ELSE |
||
325 | FALSE R>IN THEN THEN |
||
326 | ENDOF |
||
327 | 5 OF DUP C@ IF 1+ C@ ELSE DROP 0 THEN TRUE RDROP ENDOF |
||
328 | 3 OF 7 FindStrObject IF RDROP TRUE ELSE FALSE R>IN THEN ENDOF |
||
329 | 2DROP FALSE DUP R>IN |
||
330 | ENDCASE |
||
331 | ; |
||
332 | VARIABLE *Sign |
||
333 | : Imm ( --> ) |
||
334 | *Sign 0! 0 TO *Imm 0 TO *OpRel *GenName 0! |
||
335 | BEGIN |
||
336 | ?Number IF |
||
337 | \ *Sign @ IF -To *Imm ELSE +To *Imm THEN |
||
338 | *Sign @ IF NEGATE THEN *Imm + TO *Imm |
||
339 | ELSE |
||
340 | ?Label IF |
||
341 | *GenName C@ IF |
||
342 | *ImmName C@ REF-ERROR *GenName *ImmName SCopy |
||
343 | *Sign @ REF-ERROR *GenName 0! |
||
344 | THEN |
||
345 | \ *Sign @ IF 1-To *OpRel -To *Imm ELSE 1+To *OpRel +To *Imm THEN |
||
346 | *Sign @ IF *OpRel 1- TO *OpRel NEGATE |
||
347 | ELSE *OpRel 1+ TO *OpRel |
||
348 | THEN *Imm + TO *Imm |
||
349 | ELSE |
||
350 | GetOp IF 0x59 ELSE 0x66 THEN THROW |
||
351 | THEN |
||
352 | THEN |
||
353 | *OpRel 0 1 BETWEEN 0= REF-ERROR |
||
354 | *OpRel IF |
||
355 | *OpSize 1 = |
||
356 | *OpSize *DefDatasz (OthSz) = OR IF 0x50 THROW THEN |
||
357 | *DefDatasz TO *OpSize |
||
358 | THEN |
||
359 | GetOp DUP 1 > REF-ERROR |
||
360 | IF |
||
361 | CASE |
||
362 | [CHAR] + OF *Sign 0! FALSE ENDOF |
||
363 | [CHAR] - OF *Sign ON FALSE ENDOF |
||
364 | [CHAR] , OF TRUE >IN 1-! ENDOF |
||
365 | 0x59 THROW |
||
366 | ENDCASE |
||
367 | ELSE DROP TRUE THEN |
||
368 | UNTIL |
||
369 | *OpRel IF *DefDatasz TO *ImSize EXIT THEN |
||
370 | *OpSize CASE |
||
371 | 1 OF *Imm -256 AND IF 0x5A THROW THEN 1 TO *ImSize ENDOF |
||
372 | 2 OF |
||
373 | \ *Imm -65536 AND IF 0x5A THROW THEN |
||
374 | *Imm -128 AND DUP 0= SWAP -128 = OR IF 1 ELSE 2 THEN TO *ImSize |
||
375 | ENDOF |
||
376 | 4 OF |
||
377 | *Imm -128 AND DUP 0= SWAP -128 = OR IF 1 ELSE 4 THEN TO *ImSize |
||
378 | ENDOF |
||
379 | DROP *Imm -32768 AND DUP 0= SWAP -32768 = OR |
||
380 | IF 0x5C THROW THEN |
||
381 | *DefDatasz TO *OpSize *DefDatasz TO *ImSize |
||
382 | DUP |
||
383 | ENDCASE |
||
384 | ; |
||
385 | : Mult ( n1 --> n2 ) |
||
386 | CASE |
||
387 | 1 OF 0 ENDOF |
||
388 | 2 OF 1 ENDOF |
||
389 | 4 OF 2 ENDOF |
||
390 | 8 OF 3 ENDOF |
||
391 | TRUE IF 0x58 THROW THEN |
||
392 | ENDCASE |
||
393 | ; |
||
394 | |||
395 | |||
396 | : ?MemReg ( --> flag ) |
||
397 | *Reg ?Reg IF |
||
398 | *Reg TO *R/M TO *Reg 3 TO *Mod |
||
399 | ELSE |
||
400 | DROP ?Ptr *Sign ! *SegReg TO *OldReg IN>R |
||
401 | ?SegReg IF |
||
402 | TO *SegReg |
||
403 | ?Colon IFNOT |
||
404 | *Sign @ IF 82 THROW THEN *OldReg TO *SegReg R>IN FALSE EXIT |
||
405 | THEN |
||
406 | *Sign ON |
||
407 | THEN |
||
408 | RDROP ?Bracket[ DUP *Sign @ OR *Sign ! |
||
409 | *Sign @ IFNOT DROP FALSE EXIT THEN |
||
410 | 0= IF 0x56 THROW THEN *Sign 0! 0 TO *Offset |
||
411 | BEGIN |
||
412 | ?Reg32 IF |
||
413 | *Sign @ REF-ERROR |
||
414 | *AdSize 2 = IF 0x50 THROW THEN 4 TO *AdSize IN>R |
||
415 | GetOp 1 = SWAP [CHAR] * = AND IF |
||
416 | *Index 0< 0= REF-ERROR |
||
417 | GetOp 2 <> REF-ERROR |
||
418 | Mult TO *Scale TO *Index RDROP |
||
419 | *Index 4 = REF-ERROR |
||
420 | ELSE |
||
421 | R>IN *Base 0< IFNOT |
||
422 | *Index 0< 0= REF-ERROR |
||
423 | |||
424 | *Index 4 = REF-ERROR |
||
425 | THEN TO *Base |
||
426 | THEN |
||
427 | ELSE |
||
428 | ?Reg16 IF |
||
429 | *Sign @ REF-ERROR |
||
430 | *AdSize 4 = IF 0x50 THROW THEN |
||
431 | 2 TO *AdSize |
||
432 | CASE |
||
433 | 3 OF *Base 0< 0= REF-ERROR 3 TO *Base ENDOF |
||
434 | 5 OF *Base 0< 0= REF-ERROR 5 TO *Base ENDOF |
||
435 | 6 OF *Index 0< 0= REF-ERROR 6 TO *Index ENDOF |
||
436 | 7 OF *Index 0< 0= REF-ERROR 7 TO *Index ENDOF |
||
437 | TRUE REF-ERROR |
||
438 | ENDCASE |
||
439 | ELSE |
||
440 | ?Number IF |
||
441 | *AdSize IFNOT *DefDatasz TO *AdSize THEN |
||
442 | *Sign @ IF NEGATE *Offset + TO *Offset |
||
443 | ELSE |
||
444 | IN>R GetOp 1 = SWAP [CHAR] * = AND IF |
||
445 | *Index 0< 0= REF-ERROR |
||
446 | ?Reg32 0= REF-ERROR |
||
447 | TO *Index Mult TO *Scale RDROP |
||
448 | *Index 4 = REF-ERROR |
||
449 | ELSE R>IN *Offset + TO *Offset THEN |
||
450 | THEN |
||
451 | ELSE |
||
452 | ?Label IF |
||
453 | *AdSize 2 = IF 0x50 THROW THEN |
||
454 | *DefDatasz TO *AdSize |
||
455 | *GenName C@ IF |
||
456 | *OffName C@ REF-ERROR |
||
457 | *GenName *OffName SCopy |
||
458 | DUP HERE <> IF *Sign @ REF-ERROR THEN *GenName 0! |
||
459 | THEN |
||
460 | *Sign @ IF *OfRel 1- TO *OfRel NEGATE |
||
461 | ELSE *OfRel 1+ TO *OfRel THEN *Offset + TO *Offset |
||
462 | ELSE 89 THROW THEN |
||
463 | THEN |
||
464 | THEN |
||
465 | THEN |
||
466 | *OfRel 0 1 BETWEEN 0= REF-ERROR |
||
467 | GetOp 1 <> REF-ERROR |
||
468 | CASE |
||
469 | [CHAR] + OF *Sign 0! FALSE ENDOF |
||
470 | [CHAR] - OF *Sign ON FALSE ENDOF |
||
471 | [CHAR] ] OF TRUE ENDOF |
||
472 | 89 THROW |
||
473 | ENDCASE |
||
474 | UNTIL |
||
475 | THEN |
||
476 | *OfSize IFNOT |
||
477 | *Offset IF |
||
478 | *Offset 127 > *Offset -128 < OR IF |
||
479 | *DefDatasz TO *OfSize |
||
480 | *AdSize 2 = IF |
||
481 | *Offset 32767 > *Offset -32768 < OR |
||
482 | IF 91 THROW |
||
483 | ELSE 2 TO *OfSize |
||
484 | THEN |
||
485 | THEN |
||
486 | ELSE 1 TO *OfSize THEN |
||
487 | THEN |
||
488 | THEN |
||
489 | *OfRel IF *DefDatasz TO *OfSize THEN |
||
490 | *AdSize *DefDatasz = IF |
||
491 | *Base 0< IF |
||
492 | |||
493 | *Index 0< IF 5 TO *R/M ELSE 4 TO *R/M 5 TO *Base THEN |
||
494 | *DefDatasz TO *OfSize |
||
495 | ELSE |
||
496 | *OfSize 4 = IF 2 ELSE *OfSize THEN TO *Mod |
||
497 | *Base 5 = *Mod 0= AND IF 0 TO *Offset 1 TO *Mod 1 TO *OfSize THEN |
||
498 | *Index 0< IF |
||
499 | *Base 4 = IF 0 TO *Scale 4 TO *Index 4 TO *R/M THEN |
||
500 | *Base TO *R/M |
||
501 | ELSE 4 TO *R/M THEN |
||
502 | THEN |
||
503 | ELSE |
||
504 | *AdSize 2 = IF |
||
505 | *OfSize TO *Mod |
||
506 | *Base 6 = *Index 0< *OfSize 0= AND AND IF |
||
507 | 1 TO *Mod 0 TO *Offset 1 TO *OfSize |
||
508 | THEN |
||
509 | *Base CASE |
||
510 | 3 OF |
||
511 | *Index CASE |
||
512 | 6 OF 0 ENDOF |
||
513 | 7 OF 1 ENDOF |
||
514 | DROP 7 DUP |
||
515 | ENDCASE |
||
516 | ENDOF |
||
517 | 5 OF |
||
518 | *Index CASE |
||
519 | 6 OF 2 ENDOF |
||
520 | 7 OF 3 ENDOF |
||
521 | DROP 6 DUP |
||
522 | ENDCASE |
||
523 | ENDOF |
||
524 | *Index CASE |
||
525 | 6 OF 4 ENDOF |
||
526 | 7 OF 5 ENDOF |
||
527 | DROP 0 TO *Mod 2 TO *OfSize 6 DUP |
||
528 | ENDCASE |
||
529 | ENDCASE |
||
530 | TO *R/M |
||
531 | THEN |
||
532 | THEN TRUE |
||
533 | ; |
||
534 | ALSO S_ASSEM DEFINITIONS PREVIOUS |
||
535 | |||
536 | : FCALL ( --> ) |
||
537 | 0xE8 C, \ машинная команда CALL |
||
538 | ' HERE CELL+ - , ; |
||
539 | |||
540 | : FOR |
||
541 | CONTEXT @ >R PREVIOUS |
||
542 | INTERPRET |
||
543 | ALSO R> CONTEXT ! ; |
||
544 | |||
545 | : EQU ( --> ) |
||
546 | LSP @ C@ 1 = |
||
547 | LSP @ 3 + @ |
||
548 | HERE \ *DefDatasz 2 = IF 0xFFFF AND THEN |
||
549 | = AND IF |
||
550 | InitCommand *DefDatasz TO *OpSize |
||
551 | Imm *Imm LSP @ 3 + ! |
||
552 | *OpRel IFNOT 7 LSP @ C! THEN |
||
553 | ELSE 93 THROW THEN |
||
554 | ; |
||
555 | |||
556 | : DD ( --> ) |
||
557 | BEGIN |
||
558 | InitCommand 4 TO *OpSize |
||
559 | Imm 4 TO *ImSize |
||
560 | *OpRel IF *DefDatasz 4 <> REF-ERROR |
||
561 | *ImSize 4 <> IF 85 THROW THEN |
||
562 | *ImmName C@ IFNOT 1 *ImmName 1+ C! THEN |
||
563 | *ImmName 1+ C@ IF *ImmName HERE 2 AddStrObject |
||
564 | ELSE |
||
565 | *ImmName C@ 1- *ImmName 1+ C! |
||
566 | *ImmName 1+ HERE 5 AddStrObject |
||
567 | THEN |
||
568 | THEN |
||
569 | *Imm , |
||
570 | IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE |
||
571 | ELSE R>IN TRUE THEN |
||
572 | UNTIL |
||
573 | ; |
||
574 | |||
575 | : DW ( --> ) |
||
576 | BEGIN |
||
577 | InitCommand 4 TO *OpSize |
||
578 | Imm *OpRel REF-ERROR |
||
579 | 2 TO *OpSize 2 TO *ImSize |
||
580 | \ *Imm -65536 AND DUP 0= SWAP -65536 = OR 0= IF 0x5A THROW THEN |
||
581 | *Imm W, |
||
582 | IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE |
||
583 | ELSE R>IN TRUE THEN |
||
584 | UNTIL |
||
585 | ; |
||
586 | |||
587 | : DS ( --> ) |
||
588 | InitCommand 4 TO *OpSize |
||
589 | Imm 4 TO *ImSize |
||
590 | *OpRel IF 101 THROW THEN |
||
591 | HERE *Imm DUP ALLOT ERASE |
||
592 | ; |
||
593 | : DB ( --> ) |
||
594 | BEGIN |
||
595 | InitCommand |
||
596 | IN>R GetOp 1 INVERT AND 4 = IF |
||
597 | RDROP COUNT ?DUP IF HERE SWAP DUP ALLOT CMOVE ELSE DROP THEN |
||
598 | ELSE |
||
599 | DROP R>IN 4 TO *OpSize |
||
600 | Imm *OpRel REF-ERROR |
||
601 | 1 TO *OpSize |
||
602 | *Imm -128 AND DUP 0= SWAP -128 = OR *Imm 256 U< OR 0= |
||
603 | IF 0x5A THROW THEN |
||
604 | *Imm C, |
||
605 | THEN |
||
606 | IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE |
||
607 | ELSE R>IN TRUE THEN |
||
608 | UNTIL |
||
609 | ; |
||
610 | HIDDEN DEFINITIONS |
||
611 | |||
612 | |||
613 | : DEF+! ( N ADDR -- ) |
||
614 | *DefDatasz 4 = IF +! ELSE DUP>R @ + R> W! THEN ; |
||
615 | |||
616 | : DEF! ( N ADDR -- ) |
||
617 | *DefDatasz 4 = IF ! ELSE W! THEN ; |
||
618 | |||
619 | : ENDCODE ( 0x5030F8 --> ) |
||
620 | TRUE TO ?ENDCODE |
||
621 | PREVIOUS 0x5030F8 ?PAIRS LSP @ >R |
||
622 | BEGIN |
||
623 | R@ C@ WHILE |
||
624 | R@ C@ 5 = IF |
||
625 | NullString R@ 3 + @ 2 AddStrObject |
||
626 | R@ 7 + 9 FindStrObject IF |
||
627 | R@ 3 + @ DEF+! 10 R@ C! |
||
628 | ELSE |
||
629 | HERE R@ 3 + @ DEF+! HERE R@ 3 + ! |
||
630 | R@ 8 + HERE R@ 7 + C@ DUP ALLOT CMOVE 9 R@ C! |
||
631 | THEN |
||
632 | THEN |
||
633 | R@ 1+ W@ R> + >R |
||
634 | REPEAT |
||
635 | RDROP LSP @ >R |
||
636 | BEGIN |
||
637 | R@ C@ WHILE |
||
638 | R@ C@ 8 = IF |
||
639 | NullString R@ 3 + @ 2 AddStrObject |
||
640 | NullString HERE 2 AddStrObject |
||
641 | HERE R@ 3 + @ DEF! R@ 7 + @ , |
||
642 | THEN |
||
643 | R@ 1+ W@ R> + >R |
||
644 | REPEAT |
||
645 | RDROP LSP @ >R |
||
646 | BEGIN |
||
647 | R@ C@ WHILE |
||
648 | R@ C@ 2 = IF |
||
649 | R@ 7 + C@ IF |
||
650 | R@ 7 + 1 FindStrObject IF |
||
651 | R@ 3 + @ DEF+! 0 R@ 7 + C! |
||
652 | ELSE |
||
653 | \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x53 Error |
||
654 | ." ASM: Label not found:" R@ 7 + COUNT TYPE ERR_ |
||
655 | THEN |
||
656 | THEN |
||
657 | \ R@ 3 + @ LAST @ Name> - RMark |
||
658 | ELSE |
||
659 | R@ C@ 4 = IF |
||
660 | R@ 7 + 1 FindStrObject IF |
||
661 | R@ 3 + @ - 1- DUP -128 AND DUP 0= SWAP -128 = OR IF |
||
662 | R@ 3 + @ C! |
||
663 | ELSE 96 THROW THEN |
||
664 | ELSE |
||
665 | \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x53 Error |
||
666 | ." ASM: Label not found:" R@ 7 + COUNT TYPE ERR_ |
||
667 | THEN |
||
668 | ELSE |
||
669 | R@ C@ 3 = IF |
||
670 | R@ 7 + 1 FindStrObject IF |
||
671 | R@ 3 + @ - *DefDatasz - R@ 3 + @ DEF! |
||
672 | ELSE |
||
673 | \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x53 Error |
||
674 | ." ASM: Label not found:" R@ 7 + COUNT TYPE ERR_ |
||
675 | THEN |
||
676 | THEN |
||
677 | THEN |
||
678 | THEN |
||
679 | R@ 1+ W@ R> + >R |
||
680 | REPEAT |
||
681 | RDROP ( Save-Input) LSP @ >R |
||
682 | BEGIN |
||
683 | R@ C@ WHILE |
||
684 | R@ C@ 6 = IF |
||
685 | R@ 7 + 1 FindStrObject IF |
||
686 | \ R@ 7 + COUNT SetStream VALUE 5 RMark Public |
||
687 | ELSE |
||
688 | R@ 7 + 7 FindStrObject IF |
||
689 | \ R@ 7 + COUNT SetStream VALUE Public |
||
690 | ELSE |
||
691 | \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x62 Error |
||
692 | ." ASM: Unresolved PUBLIC reference: R@ 7 + COUNT TYPE ERR_ |
||
693 | THEN |
||
694 | THEN |
||
695 | THEN |
||
696 | R@ 1+ W@ R> + >R |
||
697 | REPEAT |
||
698 | RDROP ( Restore-Input DROP ) |
||
699 | ; |
||
700 | |||
701 | : STARTCODE ( -- ) |
||
702 | ALSO S_ASSEM FALSE TO ?ENDCODE |
||
703 | LSP @ >R 0x5030F8 0 >L |
||
704 | BEGIN |
||
705 | BEGIN |
||
706 | GetOp DUP WHILE |
||
707 | DUP 3 = IF |
||
708 | DROP IFIND IF |
||
709 | EXECUTE |
||
710 | ?ENDCODE IF |
||
711 | R> LSP ! EXIT |
||
712 | THEN |
||
713 | ELSE |
||
714 | *GenName SCopy GetOp 1 = SWAP [CHAR] : = AND IF |
||
715 | *GenName 1 FindStrObject IF |
||
716 | \ *GenName >ASCIIZ 0x21 - ErrNo ! 0x5F Error |
||
717 | ." ASM: Label already defined:" R@ 7 + COUNT TYPE ERR_ |
||
718 | ELSE *GenName HERE \ *DefDatasz 2 = IF 0xFFFF AND THEN |
||
719 | 1 AddStrObject THEN |
||
720 | ELSE -321 THROW THEN |
||
721 | THEN |
||
722 | ELSE |
||
723 | 1 = IF |
||
724 | [CHAR] [ = IF |
||
725 | [CHAR] ] WORD COUNT EVALUATE |
||
726 | ELSE -321 THROW THEN |
||
727 | ELSE -321 THROW THEN |
||
728 | THEN |
||
729 | REPEAT |
||
730 | 2DROP REFILL 0= ABORT" endcode not found" |
||
731 | AGAIN |
||
732 | ; |
||
733 | |||
734 | : PUBLIC ( --> ) |
||
735 | BEGIN |
||
736 | GetOp 3 = IF 0 6 AddStrObject ELSE 0x5D THROW THEN |
||
737 | IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE |
||
738 | ELSE R>IN TRUE THEN |
||
739 | UNTIL |
||
740 | ; |
||
741 | : 2Op ( name ( c1opc c1reg ... c9opc c9reg --> ) |
||
742 | ( --> ) |
||
743 | \ One-byte opcodes only, but with possible "reg" modIFier |
||
744 | CREATE 9 0 DO SWAP C, C, LOOP |
||
745 | DOES> |
||
746 | TO *OpArray InitCommand 1 TO *OpcSize |
||
747 | ?Reg IF |
||
748 | Comma ?MemReg IF |
||
749 | *OpSize CASE |
||
750 | 1 OF *OpArray 2+ ENDOF |
||
751 | 2 OF *OpArray ENDOF |
||
752 | 4 OF *OpArray ENDOF |
||
753 | 0x5C THROW |
||
754 | ENDCASE |
||
755 | ELSE |
||
756 | 3 TO *Mod *Reg TO *R/M |
||
757 | Imm *OpSize |
||
758 | CASE |
||
759 | 1 OF |
||
760 | *OpArray |
||
761 | *Reg IF 12 ELSE -1 TO *Mod -1 TO *Scale 0 TO *OfSize 16 THEN + |
||
762 | DUP 1+ C@ TO *Reg |
||
763 | ENDOF |
||
764 | 2 OF |
||
765 | *OpArray |
||
766 | *Reg IF *ImSize 1 = IF 8 ELSE 10 THEN |
||
767 | ELSE -1 TO *Mod -1 TO *Scale 0 TO *OfSize *OpSize TO *ImSize 14 THEN + |
||
768 | DUP 1+ C@ TO *Reg |
||
769 | ENDOF |
||
770 | |||
771 | 4 OF |
||
772 | *OpArray |
||
773 | *Reg *ImSize 1 = OR IF *ImSize 1 = IF 8 ELSE 10 THEN |
||
774 | ELSE -1 TO *Mod -1 TO *Scale 0 TO *OfSize *OpSize TO *ImSize 14 THEN + |
||
775 | DUP 1+ C@ TO *Reg |
||
776 | ENDOF |
||
777 | 0x5C THROW |
||
778 | ENDCASE |
||
779 | THEN |
||
780 | ELSE |
||
781 | ?MemReg 0= IF 94 THROW THEN |
||
782 | Comma ?Reg IF |
||
783 | *OpSize CASE |
||
784 | 1 OF *OpArray 6 + ENDOF |
||
785 | 2 OF *OpArray CELL+ ENDOF |
||
786 | 4 OF *OpArray CELL+ ENDOF |
||
787 | 0x5C THROW |
||
788 | ENDCASE |
||
789 | ELSE |
||
790 | Imm *OpSize CASE |
||
791 | 1 OF *OpArray 12 + DUP 1+ C@ TO *Reg ENDOF |
||
792 | 2 OF |
||
793 | *OpArray *ImSize 1 = IF 8 ELSE 10 THEN + DUP 1+ C@ TO *Reg |
||
794 | ENDOF |
||
795 | 4 OF |
||
796 | *OpArray *ImSize 1 = IF 8 ELSE 10 THEN + DUP 1+ C@ TO *Reg |
||
797 | ENDOF |
||
798 | 0x5C THROW |
||
799 | ENDCASE |
||
800 | THEN |
||
801 | THEN |
||
802 | C@ DUP TO *OpCode 0xF7 = IF *OpSize TO *ImSize THEN |
||
803 | CompileCommand |
||
804 | ; |
||
805 | : PUSH ( --> ) |
||
806 | InitCommand |
||
807 | ?MemReg IF |
||
808 | 1 TO *OpcSize |
||
809 | *OpSize 2 < IF 0x50 THROW THEN |
||
810 | *Mod 3 = IF -1 TO *Mod *R/M 0x50 + TO *OpCode |
||
811 | ELSE 0xFF TO *OpCode 6 TO *Reg THEN |
||
812 | ELSE |
||
813 | ?SegReg IF |
||
814 | CASE |
||
815 | |||
816 | 1 OF 1 0x0E ENDOF |
||
817 | 2 OF 1 0x16 ENDOF |
||
818 | 3 OF 1 0x1E ENDOF |
||
819 | 4 OF 2 0xA00F ENDOF |
||
820 | 5 OF 2 0xA80F ENDOF |
||
821 | DUP |
||
822 | ENDCASE |
||
823 | TO *OpCode TO *OpcSize |
||
824 | ELSE |
||
825 | *DefDatasz TO *OpSize Imm 1 TO *OpcSize |
||
826 | *ImSize 4 = *Imm -32768 AND DUP 0= SWAP -32768 = OR AND *OpRel 0= AND |
||
827 | IF 2 TO *ImSize THEN |
||
828 | *ImSize TO *OpSize |
||
829 | *ImSize 1 = IF 0x6A ELSE 0x68 THEN TO *OpCode |
||
830 | THEN |
||
831 | THEN |
||
832 | CompileCommand |
||
833 | ; |
||
834 | |||
835 | : POP ( --> ) |
||
836 | InitCommand |
||
837 | ?MemReg IF |
||
838 | 1 TO *OpcSize |
||
839 | *OpSize 2 < IF 0x50 THROW THEN |
||
840 | *Mod 3 = IF -1 TO *Mod *R/M 0x58 + TO *OpCode |
||
841 | ELSE 0x8F TO *OpCode 0 TO *Reg THEN |
||
842 | ELSE |
||
843 | ?SegReg IF |
||
844 | CASE |
||
845 | |||
846 | 1 OF TRUE 1 #OPER-ERROR ENDOF |
||
847 | 2 OF 1 0x17 ENDOF |
||
848 | 3 OF 1 0x1F ENDOF |
||
849 | 4 OF 2 0xA10F ENDOF |
||
850 | 5 OF 2 0xA90F ENDOF |
||
851 | DUP |
||
852 | ENDCASE |
||
853 | TO *OpCode TO *OpcSize |
||
854 | ELSE 92 THROW THEN |
||
855 | THEN |
||
856 | CompileCommand |
||
857 | ; |
||
858 | |||
859 | : IncDec ( name ( byte_opc b_reg word_opc w_reg reg_baseopc dummy --> ) |
||
860 | ( --> ) |
||
861 | \ One-byte opcodes only, but with possible "reg" modIFier |
||
862 | CREATE 3 0 DO SWAP C, C, LOOP |
||
863 | DOES> |
||
864 | TO *OpArray InitCommand |
||
865 | ?MemReg IF |
||
866 | *OpSize 0= IF 92 THROW THEN |
||
867 | 1 TO *OpcSize |
||
868 | *Mod 3 = *OpSize 1 > AND IF -1 TO *Mod *OpArray C@ *R/M + |
||
869 | ELSE *OpSize 1 = IF 4 ELSE 2 THEN *OpArray + DUP 1+ C@ TO *Reg C@ THEN |
||
870 | TO *OpCode |
||
871 | ELSE TRUE 2 #OPER-ERROR THEN |
||
872 | CompileCommand |
||
873 | ; |
||
874 | : NegNot ( name ( byte_opc b_reg word_opc w_reg --> ) |
||
875 | ( --> ) |
||
876 | \ One-byte opcodes only, but with possible "reg" modIFier |
||
877 | CREATE 2 0 DO SWAP C, C, LOOP |
||
878 | DOES> |
||
879 | TO *OpArray InitCommand |
||
880 | ?MemReg IF |
||
881 | *OpSize 0= IF 92 THROW THEN |
||
882 | 1 TO *OpcSize |
||
883 | *OpArray *OpSize 1 = IF 2 + THEN DUP 1+ C@ TO *Reg C@ TO *OpCode |
||
884 | ELSE TRUE 3 #OPER-ERROR THEN |
||
885 | CompileCommand |
||
886 | ; |
||
887 | : MOV ( --> ) |
||
888 | InitCommand 1 TO *OpcSize |
||
889 | ?MemReg IF |
||
890 | Comma *Mod 3 = IF |
||
891 | *R/M TO *Reg -1 TO *Mod |
||
892 | ?MemReg IF |
||
893 | *Reg 0= *Mod 0= *R/M 5 = AND AND IF |
||
894 | -1 TO *Mod *OpSize 1 = IF 0xA0 ELSE 0xA1 THEN |
||
895 | ELSE |
||
896 | *OpSize 1 = IF 0x8A ELSE 0x8B THEN |
||
897 | THEN |
||
898 | ELSE |
||
899 | ?SegReg IF |
||
900 | *OpSize 2 < IF 0x50 THROW THEN |
||
901 | *Reg TO *R/M 3 TO *Mod TO *Reg 0x8C |
||
902 | ELSE |
||
903 | Imm *OpSize TO *ImSize |
||
904 | *Reg *OpSize 1 = IF 0xB0 ELSE 0xB8 THEN + |
||
905 | THEN |
||
906 | THEN |
||
907 | ELSE |
||
908 | ?Reg IF |
||
909 | *Reg 0= *Mod 0= *R/M 5 = AND AND IF |
||
910 | -1 TO *Mod *OpSize 1 = IF 0xA2 ELSE 0xA3 THEN |
||
911 | ELSE |
||
912 | *OpSize 1 = IF 0x88 ELSE 0x89 THEN |
||
913 | THEN |
||
914 | ELSE |
||
915 | Imm *OpSize TO *ImSize 0 TO *Reg |
||
916 | *OpSize 1 = IF 0xC6 ELSE 0xC7 THEN |
||
917 | THEN |
||
918 | THEN |
||
919 | ELSE |
||
920 | ?SegReg IF |
||
921 | Comma TO *Reg |
||
922 | ?MemReg IF *DefDatasz TO *OpSize 0x8E ELSE TRUE 4 #OPER-ERROR THEN |
||
923 | ELSE TRUE 5 #OPER-ERROR THEN |
||
924 | THEN |
||
925 | TO *OpCode CompileCommand |
||
926 | ; |
||
927 | : INT ( --> ) |
||
928 | InitCommand 1 TO *OpSize |
||
929 | Imm *Imm 3 = IF 0xCC C, ELSE 0xCD C, *Imm C, THEN |
||
930 | ; |
||
931 | : OUT ( --> ) |
||
932 | InitCommand |
||
933 | ?Reg IF |
||
934 | *Reg 2 = *OpSize 2 = AND IF |
||
935 | Comma InitCommand |
||
936 | ?Reg IF |
||
937 | *Reg IF TRUE 6 #OPER-ERROR THEN |
||
938 | *OpSize CASE |
||
939 | 1 OF 0xEE C, ENDOF |
||
940 | 2 OF 0xEF66 W, ENDOF |
||
941 | 4 OF 0xEF C, ENDOF |
||
942 | DUP |
||
943 | ENDCASE |
||
944 | ELSE TRUE 7 #OPER-ERROR THEN |
||
945 | ELSE TRUE 8 #OPER-ERROR THEN |
||
946 | ELSE |
||
947 | 1 TO *OpSize Imm Comma *Imm >R InitCommand |
||
948 | ?Reg IF |
||
949 | *Reg IF TRUE 9 #OPER-ERROR THEN |
||
950 | *OpSize CASE |
||
951 | 1 OF 0xE6 C, ENDOF |
||
952 | 2 OF 0xE766 W, ENDOF |
||
953 | 4 OF 0xE7 C, ENDOF |
||
954 | DUP |
||
955 | ENDCASE |
||
956 | ELSE TRUE 10 #OPER-ERROR THEN |
||
957 | R> C, |
||
958 | THEN |
||
959 | ; |
||
960 | : IN ( --> ) |
||
961 | InitCommand |
||
962 | ?Reg IF *Reg 11 #OPER-ERROR ELSE TRUE 12 #OPER-ERROR THEN |
||
963 | Comma *OpSize >R InitCommand |
||
964 | ?Reg IF |
||
965 | *Reg 2 = *OpSize 2 = AND 0= 13 #OPER-ERROR |
||
966 | R> CASE |
||
967 | 1 OF 0xEC C, ENDOF |
||
968 | 2 OF 0xED66 W, ENDOF |
||
969 | 4 OF 0xED C, ENDOF |
||
970 | DUP |
||
971 | ENDCASE |
||
972 | ELSE |
||
973 | 1 TO *OpSize Imm |
||
974 | R> CASE |
||
975 | 1 OF 0xE4 C, ENDOF |
||
976 | 2 OF 0xE566 W, ENDOF |
||
977 | 4 OF 0xE5 C, ENDOF |
||
978 | DUP |
||
979 | ENDCASE |
||
980 | *Imm C, |
||
981 | THEN |
||
982 | ; |
||
983 | : LxS ( name ( opcode opcsize --> ) |
||
984 | ( --> ) |
||
985 | CREATE C, W, |
||
986 | DOES> |
||
987 | InitCommand |
||
988 | DUP C@ TO *OpcSize 1+ W@ TO *OpCode |
||
989 | ?Reg IF |
||
990 | *OpSize TO *OpArray |
||
991 | Comma *OpSize 2 < IF 0x50 THROW THEN |
||
992 | *OpSize 2 = *OpCode 0x8D = OR IF \ Opcode 8D belongs TO LEA |
||
993 | *OpCode 0x8D = IF 0 ELSE 4 THEN TO *OpSize |
||
994 | ?MemReg IF |
||
995 | *Mod 3 = 14 #OPER-ERROR |
||
996 | *OpCode 0x8D = IF *OpArray ELSE 2 THEN TO *OpSize |
||
997 | ELSE TRUE 15 #OPER-ERROR THEN |
||
998 | ELSE |
||
999 | ?Ptr IF 0x50 THROW THEN |
||
1000 | ?FWord DROP *DefDatasz TO *OpSize |
||
1001 | ?MemReg IF *Mod 3 = 16 #OPER-ERROR |
||
1002 | ELSE TRUE 17 #OPER-ERROR THEN |
||
1003 | THEN |
||
1004 | ELSE TRUE 18 #OPER-ERROR THEN |
||
1005 | CompileCommand |
||
1006 | ; |
||
1007 | : JShort ( --> ) |
||
1008 | *OpArray C@ 0= 19 #OPER-ERROR |
||
1009 | *DefDatasz TO *OpSize |
||
1010 | Imm *ImmName C@ IF |
||
1011 | *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT |
||
1012 | *ImmName HERE 4 AddStrObject |
||
1013 | |||
1014 | ELSE |
||
1015 | *Imm HERE 2+ - -128 AND DUP 0= SWAP -128 = OR IF |
||
1016 | *Imm HERE 2+ - *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT C, |
||
1017 | ELSE 96 THROW THEN |
||
1018 | THEN |
||
1019 | ; |
||
1020 | : Jxx ( name ( indir_opcsize i_opc i_reg near_sze n_opc short_sz s_opc --> ) |
||
1021 | ( --> ) |
||
1022 | CREATE SWAP C, W, SWAP C, W, ROT C, SWAP W, C, |
||
1023 | DOES> |
||
1024 | TO *OpArray |
||
1025 | InitCommand |
||
1026 | IN>R GetOp 3 = IF C" SHORT" S= IF RDROP JShort EXIT THEN THEN DROP R>IN |
||
1027 | |||
1028 | ?MemReg IF |
||
1029 | *OpArray 6 + C@ ?DUP IF TO *OpcSize ELSE 20 #OPER-ERROR THEN |
||
1030 | *OpArray 7 + W@ TO *OpCode *OpArray 9 + C@ TO *Reg |
||
1031 | CompileCommand EXIT |
||
1032 | THEN |
||
1033 | *DefDatasz TO *OpSize |
||
1034 | Imm *OpSize>DEF *OpArray C@ *OpArray 3 + C@ OR 0= 21 #OPER-ERROR |
||
1035 | *ImmName C@ IF |
||
1036 | *OpArray 3 + C@ IF |
||
1037 | *OpArray CELL+ W@ HERE ! *OpArray 3 + C@ ALLOT |
||
1038 | *ImmName HERE 3 AddStrObject 0 *DefDatasz 4 = IF , ELSE W, THEN |
||
1039 | ELSE |
||
1040 | *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT |
||
1041 | *ImmName HERE 4 AddStrObject 0 C, |
||
1042 | THEN |
||
1043 | ELSE |
||
1044 | \ *Imm 0x100 KernelSize + LAST @ Name> BETWEEN IF |
||
1045 | \ 0 TO *OpRel *OffName 0! *ImmName 0! 0 TO *ImSize 0 TO *Offset 4 TO *OfSize |
||
1046 | \ 4 TO *AdSize -1 TO *Base -1 TO *Index -1 TO *Scale 5 TO *R/M 0 TO *Mod |
||
1047 | \ *OpArray 6 + C@ ?DUP 0= ABORT" ASM: External address reference not allowed" |
||
1048 | \ TO *OpcSize |
||
1049 | \ *OpArray 7 + W@ TO *OpCode *OpArray 9 + C@ TO *Reg |
||
1050 | \ *Imm HERE *OpcSize + 1+ 8 AddNumObject |
||
1051 | \ CompileCommand EXIT |
||
1052 | \ THEN |
||
1053 | *OpArray C@ *Imm HERE 2+ - -128 AND DUP 0= SWAP -128 = OR AND IF |
||
1054 | *Imm HERE 1+ *OpArray C@ + - *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT C, |
||
1055 | ELSE |
||
1056 | *OpArray 3 + C@ IF |
||
1057 | *Imm HERE *DefDatasz 4 = IF CELL+ THEN *OpArray 3 + C@ + - |
||
1058 | *OpArray CELL+ W@ HERE ! *OpArray 3 + C@ ALLOT |
||
1059 | *DefDatasz 4 = IF , ELSE W, THEN |
||
1060 | ELSE 96 THROW THEN |
||
1061 | THEN |
||
1062 | THEN |
||
1063 | ; |
||
1064 | : ShIFt ( name ( reg --> ) |
||
1065 | ( --> ) |
||
1066 | \ Hardcoded opcodes - "reg" modIFiers only |
||
1067 | CREATE C, |
||
1068 | DOES> |
||
1069 | InitCommand |
||
1070 | C@ TO *Reg |
||
1071 | ?MemReg IF |
||
1072 | Comma ?Reg8 IF |
||
1073 | 1 <> 22 #OPER-ERROR |
||
1074 | *OpSize 1 = IF 0xD2 ELSE 0xD3 THEN |
||
1075 | ELSE |
||
1076 | Imm *Imm 0xFF U> IF 90 THROW THEN |
||
1077 | *Imm 1 = IF |
||
1078 | *OpSize 1 = IF 0xD0 ELSE 0xD1 THEN 0 TO *ImSize |
||
1079 | ELSE |
||
1080 | *OpSize 1 = IF 0xC0 ELSE 0xC1 THEN 1 TO *ImSize |
||
1081 | THEN |
||
1082 | THEN |
||
1083 | ELSE TRUE 23 #OPER-ERROR THEN |
||
1084 | TO *OpCode 1 TO *OpcSize |
||
1085 | CompileCommand |
||
1086 | ; |
||
1087 | : XCHG ( --> ) |
||
1088 | InitCommand |
||
1089 | ?MemReg IF |
||
1090 | Comma *Mod 3 = IF |
||
1091 | -1 TO *Mod *R/M TO *Reg |
||
1092 | ?MemReg IF |
||
1093 | *Mod 3 = *R/M 0= *Reg 0= OR AND *OpSize 1 > AND IF |
||
1094 | *OpSize 2 = IF 0x66 C, THEN |
||
1095 | 0x90 *Reg + *R/M + C, EXIT |
||
1096 | THEN |
||
1097 | ELSE TRUE 24 #OPER-ERROR THEN |
||
1098 | ELSE |
||
1099 | ?Reg 0= 25 #OPER-ERROR |
||
1100 | THEN |
||
1101 | ELSE 25 #OPER-ERROR THEN |
||
1102 | *OpSize 1 = IF 0x86 ELSE 0x87 THEN TO *OpCode 1 TO *OpcSize |
||
1103 | CompileCommand |
||
1104 | ; |
||
1105 | : IMUL ( --> ) |
||
1106 | InitCommand |
||
1107 | ?MemReg IF |
||
1108 | IN>R GetOp 1 = SWAP [CHAR] , = AND IF |
||
1109 | RDROP *Mod 3 <> 26 #OPER-ERROR |
||
1110 | *OpSize 1 > 0= 27 #OPER-ERROR |
||
1111 | *R/M TO *Reg -1 TO *Mod |
||
1112 | ?MemReg IF |
||
1113 | IN>R GetOp 1 = SWAP [CHAR] , = AND IF |
||
1114 | RDROP Imm 1 TO *OpcSize |
||
1115 | *ImSize 1 = IF 0x6B ELSE 0x69 THEN TO *OpCode |
||
1116 | ELSE |
||
1117 | R>IN 0xAF0F TO *OpCode 2 TO *OpcSize |
||
1118 | THEN |
||
1119 | ELSE |
||
1120 | Imm 3 TO *Mod *Reg TO *R/M 1 TO *OpcSize |
||
1121 | *ImSize 1 = IF 0x6B ELSE 0x69 THEN TO *OpCode |
||
1122 | THEN |
||
1123 | ELSE |
||
1124 | R>IN *OpSize 1 = IF 0xF6 ELSE 0xF7 THEN TO *OpCode 1 TO *OpcSize 5 TO *Reg |
||
1125 | THEN |
||
1126 | ELSE TRUE 28 #OPER-ERROR THEN |
||
1127 | CompileCommand |
||
1128 | ; |
||
1129 | : MOVxx ( name ( opc1 opc2 --> ) |
||
1130 | ( --> ) |
||
1131 | \ Two-byte opcodes only |
||
1132 | CREATE W, W, |
||
1133 | DOES> |
||
1134 | InitCommand |
||
1135 | TO *OpArray 2 TO *OpcSize |
||
1136 | ?Reg IF |
||
1137 | *OpSize >R 0 TO *OpSize |
||
1138 | Comma ?MemReg IF |
||
1139 | *OpSize 4 = IF 0x50 THROW THEN |
||
1140 | *OpSize 2 = R> TO *OpSize IF |
||
1141 | *OpSize 4 <> IF 0x50 THROW THEN |
||
1142 | *OpArray W@ TO *OpCode |
||
1143 | ELSE *OpArray 2+ W@ TO *OpCode THEN |
||
1144 | ELSE TRUE 29 #OPER-ERROR THEN |
||
1145 | ELSE TRUE 29 #OPER-ERROR THEN |
||
1146 | CompileCommand |
||
1147 | ; |
||
1148 | : Bit ( name ( c1opc c1reg c2opc c2reg --> ) |
||
1149 | ( --> ) |
||
1150 | \ Two-byte opcodes only, with possible "reg" modIFier |
||
1151 | CREATE SWAP W, C, SWAP W, C, |
||
1152 | DOES> |
||
1153 | InitCommand |
||
1154 | TO *OpArray 2 TO *OpcSize |
||
1155 | ?MemReg IF |
||
1156 | *OpSize 2 < 30 #OPER-ERROR |
||
1157 | Comma ?Reg IF *OpArray 3 + |
||
1158 | ELSE |
||
1159 | Imm *Imm 0xFF > IF 90 THROW THEN |
||
1160 | 1 TO *ImSize *OpArray 2+ C@ TO *Reg *OpArray |
||
1161 | THEN |
||
1162 | W@ TO *OpCode |
||
1163 | ELSE TRUE 31 #OPER-ERROR THEN |
||
1164 | CompileCommand |
||
1165 | ; |
||
1166 | : SETxx ( name ( opc --> ) |
||
1167 | ( --> ) |
||
1168 | \ Two-byte opcodes only |
||
1169 | CREATE W, |
||
1170 | DOES> |
||
1171 | InitCommand |
||
1172 | W@ TO *OpCode 2 TO *OpcSize |
||
1173 | ?MemReg IF |
||
1174 | *OpSize 1 <> 33 #OPER-ERROR |
||
1175 | |||
1176 | ELSE TRUE 34 #OPER-ERROR THEN |
||
1177 | CompileCommand |
||
1178 | ; |
||
1179 | : SHxD ( name ( opc1 opc2 --> ) |
||
1180 | ( --> ) |
||
1181 | \ Two-byte opcodes only |
||
1182 | CREATE W, W, |
||
1183 | DOES> |
||
1184 | InitCommand |
||
1185 | TO *OpArray 2 TO *OpcSize |
||
1186 | ?MemReg IF |
||
1187 | *OpSize 2 < 0= 35 #OPER-ERROR |
||
1188 | Comma ?Reg IF |
||
1189 | Comma ?Reg8 IF 1 <> 36 #OPER-ERROR *OpArray |
||
1190 | ELSE Imm *Imm 0xFF > IF 90 THROW THEN *OpArray 2+ THEN |
||
1191 | ELSE TRUE 37 #OPER-ERROR THEN |
||
1192 | ELSE TRUE 38 #OPER-ERROR THEN |
||
1193 | W@ TO *OpCode |
||
1194 | CompileCommand |
||
1195 | ; |
||
1196 | : BSx ( name ( WORD --> ) |
||
1197 | ( --> ) |
||
1198 | CREATE W, |
||
1199 | DOES> |
||
1200 | InitCommand W@ TO *OpCode 2 TO *OpcSize |
||
1201 | ?Reg IF |
||
1202 | *OpSize 2 < 39 #OPER-ERROR |
||
1203 | Comma ?MemReg 0= TRUE 40 #OPER-ERROR |
||
1204 | ELSE TRUE 41 #OPER-ERROR THEN |
||
1205 | CompileCommand |
||
1206 | ; |
||
1207 | : Rxx ( name ( opc --> ) |
||
1208 | ( --> ) |
||
1209 | CREATE C, DOES> C@ C, 1 C, 0xC3 C, |
||
1210 | ; |
||
1211 | : ALIGN ( --> ) |
||
1212 | InitCommand *DefDatasz TO *OpSize Imm 4 TO *ImSize |
||
1213 | *OpRel IF 101 THROW THEN |
||
1214 | BEGIN |
||
1215 | HERE *Imm MOD WHILE |
||
1216 | |||
1217 | REPEAT |
||
1218 | ; |
||
1219 | |||
1220 | : I' BL WORD IFIND 0= IF -321 THROW THEN ( -? ) ; |
||
1221 | |||
1222 | ALSO S_ASSEM DEFINITIONS |
||
1223 | |||
1224 | S" ~mak\asm\ASM_SIF.F" INCLUDED |
||
1225 | |||
1226 | 0xC9 1Op1 LEAVE |
||
1227 | 0xCC 1Op1 INT3 |
||
1228 | 0xCE 1Op1 INTO |
||
1229 | 0x37 1Op1 AAA |
||
1230 | 0x3F 1Op1 AAS |
||
1231 | 0x99 1Op1D CDQ |
||
1232 | 0x98 1Op1D CWDE |
||
1233 | 0xF8 1Op1 CLC |
||
1234 | 0xFC 1Op1 CLD |
||
1235 | 0xFA 1Op1 CLI |
||
1236 | 0xF5 1Op1 CMC |
||
1237 | 0xA6 1Op1 CMPSB |
||
1238 | 0xA7 1Op1D CMPSD |
||
1239 | 0x27 1Op1 DAA |
||
1240 | 0x2F 1Op1 DAS |
||
1241 | 0xF4 1Op1 HLT |
||
1242 | 0x6C 1Op1 INSB |
||
1243 | 0x6D 1Op1D INSD |
||
1244 | 0xCF 1Op1D IRETD |
||
1245 | 0x9F 1Op1 LAHF |
||
1246 | 0xAC 1Op1 LODSB |
||
1247 | 0xAD 1Op1D LODSD |
||
1248 | 0xA4 1Op1 MOVSB |
||
1249 | 0xA5 1Op1D MOVSD |
||
1250 | 0x90 1Op1 NOP |
||
1251 | 0x6E 1Op1 OUTSB |
||
1252 | 0x6F 1Op1D OUTSD |
||
1253 | 0x61 1Op1D POPAD |
||
1254 | 0x60 1Op1D PUSHAD |
||
1255 | 0x9D 1Op1D POPFD |
||
1256 | 0x9C 1Op1D PUSHFD |
||
1257 | 0xC3 1Op1 RET |
||
1258 | 0xCB 1Op1 RETF |
||
1259 | 0x9E 1Op1 SAHF |
||
1260 | 0xAE 1Op1 SCASB |
||
1261 | 0xAF 1Op1D SCASD |
||
1262 | 0xF9 1Op1 STC |
||
1263 | 0xFD 1Op1 STD |
||
1264 | 0xFB 1Op1 STI |
||
1265 | 0xAA 1Op1 STOSB |
||
1266 | 0xAB 1Op1D STOSD |
||
1267 | 0x9B 1Op1 WAIT |
||
1268 | 0xD7 1Op1 XLAT |
||
1269 | 0xD7 1Op1 XLATB |
||
1270 | 0xF0 1Op1 LOCK |
||
1271 | 0xF3 1Op1 REP |
||
1272 | 0xF3 1Op1 REPE |
||
1273 | 0xF3 1Op1 REPZ |
||
1274 | 0xF2 1Op1 REPNE |
||
1275 | 0xF2 1Op1 REPNZ |
||
1276 | 0x0AD5 1Op2 AAD |
||
1277 | 0x0AD4 1Op2 AAM |
||
1278 | 0x310F 1Op2 RDTSC |
||
1279 | 0x98 1Op1W CBW |
||
1280 | 0x99 1Op1W CWD |
||
1281 | 0xA7 1Op1W CMPSW |
||
1282 | 0x6D 1Op1W INSW |
||
1283 | 0xCF 1Op1W IRET |
||
1284 | 0xAD 1Op1W LODSW |
||
1285 | 0xA5 1Op1W MOVSW |
||
1286 | 0x6F 1Op1W OUTSW |
||
1287 | 0x61 1Op1W POPA |
||
1288 | 0x60 1Op1W PUSHA |
||
1289 | 0x9D 1Op1W POPF |
||
1290 | 0x9C 1Op1W PUSHF |
||
1291 | 0xAF 1Op1W SCASW |
||
1292 | 0xAB 1Op1W STOSW |
||
1293 | 0x14 0 0x15 0 0x80 2 0x81 2 0x83 2 0x10 0 0x11 0 0x12 0 0x13 0 2Op ADC |
||
1294 | 0x04 0 0x05 0 0x80 0 0x81 0 0x83 0 0x00 0 0x01 0 0x02 0 0x03 0 2Op ADD |
||
1295 | 0x24 0 0x25 0 0x80 4 0x81 4 0x83 4 0x20 0 0x21 0 0x22 0 0x23 0 2Op AND |
||
1296 | 0x3C 0 0x3D 0 0x80 7 0x81 7 0x83 7 0x38 0 0x39 0 0x3A 0 0x3B 0 2Op CMP |
||
1297 | 0x1C 0 0x1D 0 0x80 3 0x81 3 0x83 3 0x18 0 0x19 0 0x1A 0 0x1B 0 2Op SBB |
||
1298 | 0x2C 0 0x2D 0 0x80 5 0x81 5 0x83 5 0x28 0 0x29 0 0x2A 0 0x2B 0 2Op SUB |
||
1299 | 0x34 0 0x35 0 0x80 6 0x81 6 0x83 6 0x30 0 0x31 0 0x32 0 0x33 0 2Op XOR |
||
1300 | 0x0C 0 0x0D 0 0x80 1 0x81 1 0x83 1 0x08 0 0x09 0 0x0A 0 0x0B 0 2Op OR |
||
1301 | 0xA8 0 0xA9 0 0xF6 0 0xF7 0 0xF7 0 0x84 0 0x85 0 0x84 0 0x85 0 2Op TEST |
||
1302 | 0xFE 0 0xFF 0 0x40 0 IncDec INC |
||
1303 | 0xFE 1 0xFF 1 0x48 0 IncDec DEC |
||
1304 | 0xF6 3 0xF7 3 NegNot NEG |
||
1305 | 0xF6 2 0xF7 2 NegNot NOT |
||
1306 | 0xF6 4 0xF7 4 NegNot MUL |
||
1307 | 0xF6 6 0xF7 6 NegNot DIV |
||
1308 | 0xF6 7 0xF7 7 NegNot IDIV |
||
1309 | 0x8D 1 LxS LEA |
||
1310 | 0xC5 1 LxS LDS |
||
1311 | 0xC4 1 LxS LES |
||
1312 | 0xB20F 2 LxS LSS |
||
1313 | 0xB40F 2 LxS LFS |
||
1314 | 0xB50F 2 LxS LGS |
||
1315 | 1 0xFF 4 1 0xE9 1 0xEB Jxx JMP |
||
1316 | 1 0xFF 2 1 0xE8 0 0 Jxx CALL |
||
1317 | |||
1318 | |||
1319 | |||
1320 | |||
1321 | |||
1322 | |||
1323 | |||
1324 | |||
1325 | |||
1326 | |||
1327 | |||
1328 | |||
1329 | |||
1330 | |||
1331 | |||
1332 | |||
1333 | |||
1334 | |||
1335 | |||
1336 | |||
1337 | |||
1338 | : JE JZ ; |
||
1339 | : JB JC ; |
||
1340 | : JNAE JC ; |
||
1341 | : JAE JNC ; |
||
1342 | : JNB JNC ; |
||
1343 | : JNE JNZ ; |
||
1344 | : JBE JNA ; |
||
1345 | : JNBE JA ; |
||
1346 | : JP JPE ; |
||
1347 | : JNP JPO ; |
||
1348 | : JNGE JL ; |
||
1349 | : JNL JGE ; |
||
1350 | : JNG JLE ; |
||
1351 | : JNLE JG ; |
||
1352 | : LOOPE LOOPZ ; |
||
1353 | : LOOPNE LOOPNZ ; |
||
1354 | 0x02 ShIFt RCL |
||
1355 | 0x03 ShIFt RCR |
||
1356 | 0x00 ShIFt ROL |
||
1357 | 0x01 ShIFt ROR |
||
1358 | 0x04 ShIFt SAL |
||
1359 | 0x07 ShIFt SAR |
||
1360 | 0x04 ShIFt SHL |
||
1361 | 0x05 ShIFt SHR |
||
1362 | 0xBE0F 0xBF0F MOVxx MOVSX |
||
1363 | 0xB60F 0xB70F MOVxx MOVZX |
||
1364 | |||
1365 | |||
1366 | |||
1367 | |||
1368 | 0x970F SETxx SETA |
||
1369 | 0x930F SETxx SETAE |
||
1370 | 0x920F SETxx SETC |
||
1371 | 0x960F SETxx SETNA |
||
1372 | 0x940F SETxx SETZ |
||
1373 | 0x9F0F SETxx SETG |
||
1374 | 0x9D0F SETxx SETGE |
||
1375 | 0x9C0F SETxx SETL |
||
1376 | 0x9E0F SETxx SETLE |
||
1377 | 0x950F SETxx SETNZ |
||
1378 | 0x900F SETxx SETO |
||
1379 | 0x910F SETxx SETNO |
||
1380 | 0x980F SETxx SETS |
||
1381 | 0x990F SETxx SETNS |
||
1382 | 0x9A0F SETxx SETP |
||
1383 | 0x9B0F SETxx SETNP |
||
1384 | : SETNBE SETA ; |
||
1385 | : SETNB SETAE ; |
||
1386 | : SETNC SETAE ; |
||
1387 | : SETB SETC ; |
||
1388 | : SETNAE SETC ; |
||
1389 | : SETBE SETNA ; |
||
1390 | : SETE SETZ ; |
||
1391 | : SETNLE SETG ; |
||
1392 | : SETNL SETGE ; |
||
1393 | : SETNGE SETL ; |
||
1394 | : SETNG SETLE ; |
||
1395 | : SETNE SETNZ ; |
||
1396 | : SETPE SETP ; |
||
1397 | : SETPO SETNP ; |
||
1398 | 0xA40F 0xA50F SHxD SHLD |
||
1399 | 0xAC0F 0xAD0F SHxD SHRD |
||
1400 | 0xBC0F BSx BSF |
||
1401 | 0xBD0F BSx BSR |
||
1402 | 0x73 Rxx RC |
||
1403 | 0x72 Rxx RNC |
||
1404 | 0x75 Rxx RZ |
||
1405 | 0x74 Rxx RNZ |
||
1406 | 0x76 Rxx RA |
||
1407 | 0x77 Rxx RNA |
||
1408 | 0x7A Rxx RPO |
||
1409 | 0x7B Rxx RPE |
||
1410 | 0x71 Rxx RO |
||
1411 | 0x70 Rxx RNO |
||
1412 | 0x7E Rxx RG |
||
1413 | 0x7F Rxx RNG |
||
1414 | 0x7D Rxx RL |
||
1415 | 0x7C Rxx RNL |
||
1416 | : RE RZ ; |
||
1417 | : RB RC ; |
||
1418 | : RNAE RC ; |
||
1419 | : RAE RNC ; |
||
1420 | : RNB RNC ; |
||
1421 | : RNE RNZ ; |
||
1422 | : RBE RNA ; |
||
1423 | : RNBE RA ; |
||
1424 | : RP RPE ; |
||
1425 | : RNP RPO ; |
||
1426 | : RNGE RL ; |
||
1427 | : RGE RNL ; |
||
1428 | : RLE RNG ; |
||
1429 | : RNLE RG ; |
||
1430 | |||
1431 | PREVIOUS |
||
1432 | |||
1433 | ALSO FORTH DEFINITIONS |
||
1434 | |||
1435 | : Code ( -- ) |
||
1436 | HEADER STARTCODE ; |
||
1437 | |||
1438 | : STARTCODE STARTCODE ; |
||
1439 | |||
1440 | : USE16 ( --> ) |
||
1441 | 2 TO *DefDatasz |
||
1442 | ; |
||
1443 | : USE32 ( --> ) |
||
1444 | 4 TO *DefDatasz |
||
1445 | ; |
||
1446 | |||
1447 | S_ASSEM DEFINITIONS |
||
1448 | |||
1449 | : MOVSD 0xA5 C, *DefDatasz 2 = IF 0x66 C, THEN ; |
||
1450 | : MOVSW 0xA5 C, *DefDatasz 4 = IF 0x66 C, THEN ; |
||
1451 | |||
1452 | : SEG SEG ; |
||
1453 | : PUBLIC PUBLIC ; |
||
1454 | : ENDCODE ENDCODE ; |
||
1455 | : PUSH PUSH ; |
||
1456 | : POP POP ; |
||
1457 | : MOV MOV ; |
||
1458 | : INT INT ; |
||
1459 | : OUT OUT ; |
||
1460 | : IN IN ; |
||
1461 | : XCHG XCHG ; |
||
1462 | : IMUL IMUL ; |
||
1463 | : ALIGN ALIGN ; |
||
1464 | |||
1465 | PREVIOUS |
||
1466 | PREVIOUS DEFINITIONS |
||
1467 | |||
1468 | \EOF |
||
1469 | USE16 |
||
1470 | Code ZZ |
||
1471 | mov bp, msg |
||
1472 | msg: ; EQU 4444H |
||
1473 | RET |
||
1474 | ENDCODE |
||
1475 | \EOF |
||
1476 | |||
1477 | C" DBG" FIND NIP |
||
1478 | [IF] |
||
1479 | |||
1480 | ALSO S_ASSEM |
||
1481 | mov Ebp, msg |
||
1482 | |||
1483 | USE16 |
||
1484 | DBG mov bp, msg |
||
1485 | [THEN] |
||
1486 | \S |
||
1487 | |||
1488 | Code ZZ |
||
1489 | ADD EBX, {KEY} |
||
1490 | ADD EBX, 44H |
||
1491 | ADD EBX, 4444444H |
||
1492 | WWW: MOV EAX, WWW+4 |
||
1493 | MOV EAX, [EBP+EDX*4] |
||
1494 | FOR 0x44444 , |
||
1495 | JMP SHORT SS1 |
||
1496 | SS1: JMP SS2 |
||
1497 | SS2: |
||
1498 | EndCode |
||
1499 | |||
1500 | ' ZZ 20 DUMP |
||
1501 | \ 4B22AE 09C0 OR EAX , EAX |
||
1502 | \ http://win32asm.chat.ru/>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |