@@ -8,6 +8,7 @@ |
| 8 |
unit Z80CPU; |
8 |
unit Z80CPU; |
| 9 |
|
9 |
|
| 10 |
{$MODE Delphi} |
10 |
{$MODE Delphi} |
|
|
11 |
{$ASMMODE Intel} |
| 11 |
|
12 |
|
| 12 |
interface |
13 |
interface |
| 13 |
|
14 |
|
@@ -22,6 +23,7 @@ uses vars, machine; |
| 22 |
var |
23 |
var |
| 23 |
b: Pair; |
24 |
b: Pair; |
| 24 |
cycle: byte; |
25 |
cycle: byte; |
|
|
26 |
b1: byte; |
| 25 |
w1, w2: word; |
27 |
w1, w2: word; |
| 26 |
|
28 |
|
| 27 |
function NOP: byte; |
29 |
function NOP: byte; |
@@ -31,7 +33,7 @@ end; |
| 31 |
|
33 |
|
| 32 |
function LD_BC_WORD: byte; |
34 |
function LD_BC_WORD: byte; |
| 33 |
begin |
35 |
begin |
| 34 |
asm |
36 |
{asm |
| 35 |
PUSH dword ptr pc.w |
37 |
PUSH dword ptr pc.w |
| 36 |
CALL speekb |
38 |
CALL speekb |
| 37 |
LEA ESP,[ESP+4] |
39 |
LEA ESP,[ESP+4] |
@@ -42,19 +44,28 @@ begin |
| 42 |
LEA ESP,[ESP+4] |
44 |
LEA ESP,[ESP+4] |
| 43 |
MOV bc.h,AL |
45 |
MOV bc.h,AL |
| 44 |
INC word ptr pc.w |
46 |
INC word ptr pc.w |
| 45 |
end; |
47 |
end;} |
|
|
48 |
|
|
|
49 |
bc.l := speekb(pc.w); |
|
|
50 |
Inc(pc.w); |
|
|
51 |
bc.h := speekb(pc.w); |
|
|
52 |
Inc(pc.w); |
|
|
53 |
|
| 46 |
Result := 12; |
54 |
Result := 12; |
| 47 |
end; |
55 |
end; |
| 48 |
|
56 |
|
| 49 |
function LD_xBC_A: byte; |
57 |
function LD_xBC_A: byte; |
| 50 |
begin |
58 |
begin |
| 51 |
asm |
59 |
{asm |
| 52 |
MOV AX,bc.w |
60 |
MOV AX,bc.w |
| 53 |
PUSH dword ptr af.h |
61 |
PUSH dword ptr af.h |
| 54 |
PUSH EAX |
62 |
PUSH EAX |
| 55 |
CALL SpokeB |
63 |
CALL SpokeB |
| 56 |
LEA ESP,[ESP+8] |
64 |
LEA ESP,[ESP+8] |
| 57 |
end; |
65 |
end;} |
|
|
66 |
|
|
|
67 |
spokeb(bc.w, af.h); |
|
|
68 |
|
| 58 |
Result := 8; |
69 |
Result := 8; |
| 59 |
end; |
70 |
end; |
| 60 |
|
71 |
|
@@ -63,6 +74,7 @@ begin |
| 63 |
asm |
74 |
asm |
| 64 |
INC bc.w |
75 |
INC bc.w |
| 65 |
end; |
76 |
end; |
|
|
77 |
|
| 66 |
Result := 8; |
78 |
Result := 8; |
| 67 |
end; |
79 |
end; |
| 68 |
|
80 |
|
@@ -96,13 +108,17 @@ end; |
| 96 |
|
108 |
|
| 97 |
function LD_B_BYTE: byte; |
109 |
function LD_B_BYTE: byte; |
| 98 |
begin |
110 |
begin |
| 99 |
asm |
111 |
{asm |
| 100 |
PUSH dword ptr pc.w |
112 |
PUSH dword ptr pc.w |
| 101 |
CALL speekb |
113 |
CALL speekb |
| 102 |
LEA ESP,[ESP+4] |
114 |
LEA ESP,[ESP+4] |
| 103 |
MOV bc.h,AL |
115 |
MOV bc.h,AL |
| 104 |
INC word ptr pc.w |
116 |
INC word ptr pc.w |
| 105 |
end; |
117 |
end;} |
|
|
118 |
|
|
|
119 |
bc.h := speekb(pc.w); |
|
|
120 |
Inc(pc.w); |
|
|
121 |
|
| 106 |
Result := 8; |
122 |
Result := 8; |
| 107 |
end; |
123 |
end; |
| 108 |
|
124 |
|
@@ -121,7 +137,7 @@ end; |
| 121 |
|
137 |
|
| 122 |
function EX_AF_AF: byte; |
138 |
function EX_AF_AF: byte; |
| 123 |
begin |
139 |
begin |
| 124 |
asm |
140 |
{asm |
| 125 |
PUSH dword ptr pc.w |
141 |
PUSH dword ptr pc.w |
| 126 |
CALL speekb |
142 |
CALL speekb |
| 127 |
LEA ESP,[ESP+4] |
143 |
LEA ESP,[ESP+4] |
@@ -152,7 +168,7 @@ begin |
| 152 |
PUSH EAX |
168 |
PUSH EAX |
| 153 |
CALL SpokeB |
169 |
CALL SpokeB |
| 154 |
LEA ESP,[ESP+8] |
170 |
LEA ESP,[ESP+8] |
| 155 |
end; |
171 |
end;} |
| 156 |
Result := 20; |
172 |
Result := 20; |
| 157 |
end; |
173 |
end; |
| 158 |
|
174 |
|
@@ -184,13 +200,16 @@ end; |
| 184 |
|
200 |
|
| 185 |
function LD_A_xBC: byte; |
201 |
function LD_A_xBC: byte; |
| 186 |
begin |
202 |
begin |
| 187 |
asm |
203 |
{asm |
| 188 |
MOV AX,bc.w |
204 |
MOV AX,bc.w |
| 189 |
PUSH EAX |
205 |
PUSH EAX |
| 190 |
CALL speekb |
206 |
CALL speekb |
| 191 |
LEA ESP,[ESP+4] |
207 |
LEA ESP,[ESP+4] |
| 192 |
MOV af.h,AL |
208 |
MOV af.h,AL |
| 193 |
end; |
209 |
end;} |
|
|
210 |
|
|
|
211 |
af.h := speekb(bc.w); |
|
|
212 |
|
| 194 |
Result := 8; |
213 |
Result := 8; |
| 195 |
end; |
214 |
end; |
| 196 |
|
215 |
|
@@ -232,13 +251,17 @@ end; |
| 232 |
|
251 |
|
| 233 |
function LD_C_BYTE: byte; |
252 |
function LD_C_BYTE: byte; |
| 234 |
begin |
253 |
begin |
| 235 |
asm |
254 |
{asm |
| 236 |
PUSH dword ptr pc.w |
255 |
PUSH dword ptr pc.w |
| 237 |
CALL speekb |
256 |
CALL speekb |
| 238 |
LEA ESP,[ESP+4] |
257 |
LEA ESP,[ESP+4] |
| 239 |
MOV bc.l,AL |
258 |
MOV bc.l,AL |
| 240 |
INC word ptr pc.w |
259 |
INC word ptr pc.w |
| 241 |
end; |
260 |
end;} |
|
|
261 |
|
|
|
262 |
bc.l := speekb(pc.w); |
|
|
263 |
Inc(pc.w); |
|
|
264 |
|
| 242 |
Result := 8; |
265 |
Result := 8; |
| 243 |
end; |
266 |
end; |
| 244 |
|
267 |
|
@@ -264,7 +287,7 @@ end; |
| 264 |
|
287 |
|
| 265 |
function LD_DE_WORD: byte; |
288 |
function LD_DE_WORD: byte; |
| 266 |
begin |
289 |
begin |
| 267 |
asm |
290 |
{asm |
| 268 |
PUSH dword ptr pc.w |
291 |
PUSH dword ptr pc.w |
| 269 |
CALL speekb |
292 |
CALL speekb |
| 270 |
LEA ESP,[ESP+4] |
293 |
LEA ESP,[ESP+4] |
@@ -276,19 +299,27 @@ begin |
| 276 |
LEA ESP,[ESP+4] |
299 |
LEA ESP,[ESP+4] |
| 277 |
MOV de.h,AL |
300 |
MOV de.h,AL |
| 278 |
INC word ptr pc.w |
301 |
INC word ptr pc.w |
| 279 |
end; |
302 |
end;} |
|
|
303 |
|
|
|
304 |
de.l := speekb(pc.w); |
|
|
305 |
Inc(pc.w); |
|
|
306 |
de.h := speekb(pc.w); |
|
|
307 |
Inc(pc.w); |
|
|
308 |
|
| 280 |
Result := 12; |
309 |
Result := 12; |
| 281 |
end; |
310 |
end; |
| 282 |
|
311 |
|
| 283 |
function LD_xDE_A: byte; |
312 |
function LD_xDE_A: byte; |
| 284 |
begin |
313 |
begin |
| 285 |
asm |
314 |
{asm |
| 286 |
MOV AX,de.w |
315 |
MOV AX,de.w |
| 287 |
PUSH dword ptr af.h |
316 |
PUSH dword ptr af.h |
| 288 |
PUSH EAX |
317 |
PUSH EAX |
| 289 |
CALL SpokeB |
318 |
CALL SpokeB |
| 290 |
LEA ESP,[ESP+8] |
319 |
LEA ESP,[ESP+8] |
| 291 |
end; |
320 |
end;} |
|
|
321 |
|
|
|
322 |
spokeb(de.w, af.h); |
| 292 |
|
323 |
|
| 293 |
Result := 8; |
324 |
Result := 8; |
| 294 |
end; |
325 |
end; |
@@ -330,13 +361,16 @@ end; |
| 330 |
|
361 |
|
| 331 |
function LD_D_BYTE: byte; |
362 |
function LD_D_BYTE: byte; |
| 332 |
begin |
363 |
begin |
| 333 |
asm |
364 |
{asm |
| 334 |
PUSH dword ptr pc.w |
365 |
PUSH dword ptr pc.w |
| 335 |
CALL speekb |
366 |
CALL speekb |
| 336 |
LEA ESP,[ESP+4] |
367 |
LEA ESP,[ESP+4] |
| 337 |
MOV de.h,AL |
368 |
MOV de.h,AL |
| 338 |
INC word ptr pc.w |
369 |
INC word ptr pc.w |
| 339 |
end; |
370 |
end;} |
|
|
371 |
|
|
|
372 |
de.h := speekb(pc.w); |
|
|
373 |
Inc(pc.w); |
| 340 |
|
374 |
|
| 341 |
Result := 8; |
375 |
Result := 8; |
| 342 |
end; |
376 |
end; |
@@ -358,7 +392,7 @@ end; |
| 358 |
|
392 |
|
| 359 |
function JR: byte; |
393 |
function JR: byte; |
| 360 |
begin |
394 |
begin |
| 361 |
asm |
395 |
{asm |
| 362 |
XOR EAX,EAX |
396 |
XOR EAX,EAX |
| 363 |
MOV AX,pc.w |
397 |
MOV AX,pc.w |
| 364 |
PUSH EAX |
398 |
PUSH EAX |
@@ -367,7 +401,9 @@ begin |
| 367 |
INC word ptr pc.w |
401 |
INC word ptr pc.w |
| 368 |
CBW |
402 |
CBW |
| 369 |
ADD pc.w,AX |
403 |
ADD pc.w,AX |
| 370 |
end; |
404 |
end;} |
|
|
405 |
|
|
|
406 |
Inc(pc.w, speekb(pc.w)+1); |
| 371 |
|
407 |
|
| 372 |
Result := 8; |
408 |
Result := 8; |
| 373 |
end; |
409 |
end; |
@@ -400,13 +436,15 @@ end; |
| 400 |
|
436 |
|
| 401 |
function LD_A_xDE: byte; |
437 |
function LD_A_xDE: byte; |
| 402 |
begin |
438 |
begin |
| 403 |
asm |
439 |
{asm |
| 404 |
MOV AX,de.w |
440 |
MOV AX,de.w |
| 405 |
PUSH EAX |
441 |
PUSH EAX |
| 406 |
CALL speekb |
442 |
CALL speekb |
| 407 |
LEA ESP,[ESP+4] |
443 |
LEA ESP,[ESP+4] |
| 408 |
MOV af.h,AL |
444 |
MOV af.h,AL |
| 409 |
end; |
445 |
end;} |
|
|
446 |
|
|
|
447 |
af.h := speekb(de.w); |
| 410 |
|
448 |
|
| 411 |
Result := 8; |
449 |
Result := 8; |
| 412 |
end; |
450 |
end; |
@@ -449,13 +487,16 @@ end; |
| 449 |
|
487 |
|
| 450 |
function LD_E_BYTE: byte; |
488 |
function LD_E_BYTE: byte; |
| 451 |
begin |
489 |
begin |
| 452 |
asm |
490 |
{asm |
| 453 |
PUSH dword ptr pc.w |
491 |
PUSH dword ptr pc.w |
| 454 |
CALL speekb |
492 |
CALL speekb |
| 455 |
LEA ESP,[ESP+4] |
493 |
LEA ESP,[ESP+4] |
| 456 |
MOV de.l,AL |
494 |
MOV de.l,AL |
| 457 |
INC word ptr pc.w |
495 |
INC word ptr pc.w |
| 458 |
end; |
496 |
end;} |
|
|
497 |
|
|
|
498 |
de.l := speekb(pc.w); |
|
|
499 |
Inc(pc.w); |
| 459 |
|
500 |
|
| 460 |
Result := 8; |
501 |
Result := 8; |
| 461 |
end; |
502 |
end; |
@@ -475,11 +516,15 @@ end; |
| 475 |
|
516 |
|
| 476 |
function JR_NZ: byte; |
517 |
function JR_NZ: byte; |
| 477 |
begin |
518 |
begin |
|
|
519 |
b1 := speekb(pc.w); |
|
|
520 |
Inc(pc.w); |
| 478 |
asm |
521 |
asm |
| 479 |
PUSH dword ptr pc.w |
522 |
//PUSH dword ptr pc.w |
| 480 |
CALL speekb |
523 |
//CALL speekb |
| 481 |
LEA ESP,[ESP+4] |
524 |
//LEA ESP,[ESP+4] |
| 482 |
INC word ptr pc.w |
525 |
//INC word ptr pc.w |
|
|
526 |
MOV AH, 0 |
|
|
527 |
MOV AL, b1 |
| 483 |
TEST af.l,64 |
528 |
TEST af.l,64 |
| 484 |
MOV cycle,8 |
529 |
MOV cycle,8 |
| 485 |
JNZ @ende |
530 |
JNZ @ende |
@@ -493,7 +538,7 @@ end; |
| 493 |
|
538 |
|
| 494 |
function LD_HL_WORD: byte; |
539 |
function LD_HL_WORD: byte; |
| 495 |
begin |
540 |
begin |
| 496 |
asm |
541 |
{asm |
| 497 |
PUSH dword ptr pc.w |
542 |
PUSH dword ptr pc.w |
| 498 |
CALL speekb |
543 |
CALL speekb |
| 499 |
LEA ESP,[ESP+4] |
544 |
LEA ESP,[ESP+4] |
@@ -504,13 +549,19 @@ begin |
| 504 |
LEA ESP,[ESP+4] |
549 |
LEA ESP,[ESP+4] |
| 505 |
MOV hl.h,AL |
550 |
MOV hl.h,AL |
| 506 |
INC word ptr pc.w |
551 |
INC word ptr pc.w |
| 507 |
end; |
552 |
end;} |
|
|
553 |
|
|
|
554 |
hl.l := speekb(pc.w); |
|
|
555 |
Inc(pc.w); |
|
|
556 |
hl.h := speekb(pc.w); |
|
|
557 |
Inc(pc.w); |
|
|
558 |
|
| 508 |
Result := 12; |
559 |
Result := 12; |
| 509 |
end; |
560 |
end; |
| 510 |
|
561 |
|
| 511 |
function LD_xWORD_HL: byte; |
562 |
function LD_xWORD_HL: byte; |
| 512 |
begin |
563 |
begin |
| 513 |
asm |
564 |
{asm |
| 514 |
MOV AX,hl.w |
565 |
MOV AX,hl.w |
| 515 |
PUSH EAX |
566 |
PUSH EAX |
| 516 |
PUSH dword ptr af.h |
567 |
PUSH dword ptr af.h |
@@ -520,7 +571,11 @@ begin |
| 520 |
POP EAX |
571 |
POP EAX |
| 521 |
INC EAX |
572 |
INC EAX |
| 522 |
MOV hl.w,AX |
573 |
MOV hl.w,AX |
| 523 |
end; |
574 |
end;} |
|
|
575 |
|
|
|
576 |
spokeb(hl.w, af.h); |
|
|
577 |
Inc(hl.w); |
|
|
578 |
|
| 524 |
Result := 8; |
579 |
Result := 8; |
| 525 |
end; |
580 |
end; |
| 526 |
|
581 |
|
@@ -561,13 +616,16 @@ end; |
| 561 |
|
616 |
|
| 562 |
function LD_H_BYTE: byte; |
617 |
function LD_H_BYTE: byte; |
| 563 |
begin |
618 |
begin |
| 564 |
asm |
619 |
{asm |
| 565 |
PUSH dword ptr pc.w |
620 |
PUSH dword ptr pc.w |
| 566 |
CALL speekb |
621 |
CALL speekb |
| 567 |
LEA ESP,[ESP+4] |
622 |
LEA ESP,[ESP+4] |
| 568 |
MOV hl.h,AL |
623 |
MOV hl.h,AL |
| 569 |
INC word ptr pc.w |
624 |
INC word ptr pc.w |
| 570 |
end; |
625 |
end;} |
|
|
626 |
|
|
|
627 |
hl.h := speekb(pc.w); |
|
|
628 |
Inc(pc.w); |
| 571 |
|
629 |
|
| 572 |
Result := 8; |
630 |
Result := 8; |
| 573 |
end; |
631 |
end; |
@@ -581,11 +639,11 @@ begin |
| 581 |
SAHF |
639 |
SAHF |
| 582 |
MOV AL,af.h |
640 |
MOV AL,af.h |
| 583 |
JP @dec_adjust |
641 |
JP @dec_adjust |
| 584 |
DAA |
642 |
//DAA |
| 585 |
JMP @ddld |
643 |
JMP @ddld |
| 586 |
|
644 |
|
| 587 |
@dec_adjust: |
645 |
@dec_adjust: |
| 588 |
DAS |
646 |
//DAS |
| 589 |
|
647 |
|
| 590 |
@ddld: |
648 |
@ddld: |
| 591 |
MOV af.h,AL |
649 |
MOV af.h,AL |
@@ -601,11 +659,15 @@ end; |
| 601 |
function JR_Z: byte; |
659 |
function JR_Z: byte; |
| 602 |
|
660 |
|
| 603 |
begin |
661 |
begin |
|
|
662 |
b1 := speekb(pc.w); |
|
|
663 |
Inc(pc.w); |
| 604 |
asm |
664 |
asm |
| 605 |
PUSH dword ptr pc.w |
665 |
//PUSH dword ptr pc.w |
| 606 |
CALL speekb |
666 |
//CALL speekb |
| 607 |
LEA ESP,[ESP+4] |
667 |
//LEA ESP,[ESP+4] |
| 608 |
INC word ptr pc.w |
668 |
//INC word ptr pc.w |
|
|
669 |
MOV AH, 0 |
|
|
670 |
MOV AL, b1 |
| 609 |
TEST af.l,64 |
671 |
TEST af.l,64 |
| 610 |
MOV cycle,8 |
672 |
MOV cycle,8 |
| 611 |
JZ @ende |
673 |
JZ @ende |
@@ -643,8 +705,7 @@ end; |
| 643 |
|
705 |
|
| 644 |
function LD_HL_xWORD: byte; |
706 |
function LD_HL_xWORD: byte; |
| 645 |
begin |
707 |
begin |
| 646 |
|
708 |
{asm |
| 647 |
asm |
|
|
| 648 |
MOV AX,hl.w |
709 |
MOV AX,hl.w |
| 649 |
PUSH EAX |
710 |
PUSH EAX |
| 650 |
PUSH EAX |
711 |
PUSH EAX |
@@ -654,7 +715,10 @@ begin |
| 654 |
POP EAX |
715 |
POP EAX |
| 655 |
INC AX |
716 |
INC AX |
| 656 |
MOV hl.w,AX |
717 |
MOV hl.w,AX |
| 657 |
end; |
718 |
end;} |
|
|
719 |
|
|
|
720 |
af.h := speekb(hl.w); |
|
|
721 |
Inc(hl.w); |
| 658 |
|
722 |
|
| 659 |
Result := 8; |
723 |
Result := 8; |
| 660 |
end; |
724 |
end; |
@@ -697,13 +761,16 @@ end; |
| 697 |
|
761 |
|
| 698 |
function LD_L_BYTE: byte; |
762 |
function LD_L_BYTE: byte; |
| 699 |
begin |
763 |
begin |
| 700 |
asm |
764 |
{asm |
| 701 |
PUSH dword ptr pc.w |
765 |
PUSH dword ptr pc.w |
| 702 |
CALL speekb |
766 |
CALL speekb |
| 703 |
LEA ESP,[ESP+4] |
767 |
LEA ESP,[ESP+4] |
| 704 |
INC word ptr pc.w |
768 |
INC word ptr pc.w |
| 705 |
MOV hl.l,AL |
769 |
MOV hl.l,AL |
| 706 |
end; |
770 |
end;} |
|
|
771 |
|
|
|
772 |
Inc(pc.w); |
|
|
773 |
hl.l := speekb(pc.w); |
| 707 |
|
774 |
|
| 708 |
Result := 8; |
775 |
Result := 8; |
| 709 |
end; |
776 |
end; |
@@ -712,9 +779,7 @@ function CPL: byte; |
| 712 |
begin |
779 |
begin |
| 713 |
asm |
780 |
asm |
| 714 |
XOR af.h,255 |
781 |
XOR af.h,255 |
| 715 |
|
|
|
| 716 |
OR af.l,$14 |
782 |
OR af.l,$14 |
| 717 |
|
|
|
| 718 |
end; |
783 |
end; |
| 719 |
|
784 |
|
| 720 |
Result := 4; |
785 |
Result := 4; |
@@ -723,11 +788,15 @@ end; |
| 723 |
function JR_NC: byte; |
788 |
function JR_NC: byte; |
| 724 |
|
789 |
|
| 725 |
begin |
790 |
begin |
|
|
791 |
b1 := speekb(pc.w); |
|
|
792 |
Inc(pc.w); |
| 726 |
asm |
793 |
asm |
| 727 |
PUSH dword ptr pc.w |
794 |
//PUSH dword ptr pc.w |
| 728 |
CALL speekb |
795 |
//CALL speekb |
| 729 |
LEA ESP,[ESP+4] |
796 |
//LEA ESP,[ESP+4] |
| 730 |
INC word ptr pc.w |
797 |
//INC word ptr pc.w |
|
|
798 |
MOV AH, 0 |
|
|
799 |
MOV AL, b1 |
| 731 |
TEST af.l,1 |
800 |
TEST af.l,1 |
| 732 |
MOV cycle,8 |
801 |
MOV cycle,8 |
| 733 |
JNZ @ende |
802 |
JNZ @ende |
@@ -742,7 +811,7 @@ end; |
| 742 |
|
811 |
|
| 743 |
function LD_SP_WORD: byte; |
812 |
function LD_SP_WORD: byte; |
| 744 |
begin |
813 |
begin |
| 745 |
asm |
814 |
{asm |
| 746 |
PUSH dword ptr pc.w |
815 |
PUSH dword ptr pc.w |
| 747 |
CALL speekb |
816 |
CALL speekb |
| 748 |
LEA ESP,[ESP+4] |
817 |
LEA ESP,[ESP+4] |
@@ -757,14 +826,17 @@ begin |
| 757 |
MOV AL,BL |
826 |
MOV AL,BL |
| 758 |
|
827 |
|
| 759 |
MOV sp_.w,AX |
828 |
MOV sp_.w,AX |
| 760 |
end; |
829 |
end;} |
| 761 |
//sp_.w:=wordpeek(pc.w);inc(pc.w,2); |
830 |
|
|
|
831 |
sp_.w := wordpeek(pc.w); |
|
|
832 |
inc(pc.w,2); |
|
|
833 |
|
| 762 |
Result := 12; |
834 |
Result := 12; |
| 763 |
end; |
835 |
end; |
| 764 |
|
836 |
|
| 765 |
function LD_xWORD_A: byte; |
837 |
function LD_xWORD_A: byte; |
| 766 |
begin |
838 |
begin |
| 767 |
asm |
839 |
{asm |
| 768 |
MOV AX,hl.w |
840 |
MOV AX,hl.w |
| 769 |
PUSH EAX |
841 |
PUSH EAX |
| 770 |
PUSH dword ptr af.h |
842 |
PUSH dword ptr af.h |
@@ -774,10 +846,10 @@ begin |
| 774 |
POP EAX |
846 |
POP EAX |
| 775 |
DEC AX |
847 |
DEC AX |
| 776 |
MOV hl.w,AX |
848 |
MOV hl.w,AX |
| 777 |
end; |
849 |
end;} |
| 778 |
|
|
|
| 779 |
|
|
|
| 780 |
|
850 |
|
|
|
851 |
spokeb(hl.w, af.h); |
|
|
852 |
Dec(hl.w); |
| 781 |
|
853 |
|
| 782 |
Result := 8; |
854 |
Result := 8; |
| 783 |
end; |
855 |
end; |
@@ -793,54 +865,64 @@ end; |
| 793 |
|
865 |
|
| 794 |
function INC_xHL: byte; |
866 |
function INC_xHL: byte; |
| 795 |
begin |
867 |
begin |
|
|
868 |
w1 := speekb(hl.w); |
| 796 |
asm |
869 |
asm |
| 797 |
MOV AX,hl.w |
870 |
MOV AX,hl.w |
| 798 |
PUSH EAX |
871 |
PUSH RAX |
| 799 |
PUSH EAX |
872 |
// PUSH EAX |
| 800 |
CALL speekb |
873 |
// CALL speekb |
| 801 |
LEA ESP,[ESP+4] |
874 |
// LEA ESP,[ESP+4] |
|
|
875 |
MOV AX, w1 |
| 802 |
INC AL |
876 |
INC AL |
| 803 |
LAHF |
877 |
LAHF |
| 804 |
AND AH,$51 |
878 |
AND AH,$51 |
| 805 |
AND af.l,1 |
879 |
AND af.l,1 |
| 806 |
OR af.l,AH |
880 |
OR af.l,AH |
| 807 |
POP EBX |
881 |
POP RBX |
| 808 |
PUSH EAX |
882 |
//PUSH EAX |
| 809 |
PUSH EBX |
883 |
//PUSH EBX |
| 810 |
CALL SpokeB |
884 |
//CALL SpokeB |
| 811 |
LEA ESP,[ESP+8] |
885 |
//LEA ESP,[ESP+8] |
|
|
886 |
MOV w1, BX |
|
|
887 |
MOV w2, AX |
| 812 |
end; |
888 |
end; |
| 813 |
|
889 |
spokeb(w1, w2); |
| 814 |
|
890 |
|
| 815 |
Result := 12; |
891 |
Result := 12; |
| 816 |
end; |
892 |
end; |
| 817 |
|
893 |
|
| 818 |
function DEC_xHL: byte; |
894 |
function DEC_xHL: byte; |
| 819 |
begin |
895 |
begin |
|
|
896 |
w1 := speekb(hl.w); |
| 820 |
asm |
897 |
asm |
| 821 |
MOV AX,hl.w |
898 |
MOV AX,hl.w |
| 822 |
PUSH EAX |
899 |
PUSH RAX |
| 823 |
PUSH EAX |
900 |
//PUSH EAX |
| 824 |
CALL speekb |
901 |
//CALL speekb |
| 825 |
LEA ESP,[ESP+4] |
902 |
//LEA ESP,[ESP+4] |
|
|
903 |
MOV AX, w1 |
| 826 |
DEC AL |
904 |
DEC AL |
| 827 |
LAHF |
905 |
LAHF |
| 828 |
AND af.l,1 |
906 |
AND af.l,1 |
| 829 |
AND AH,$55 |
907 |
AND AH,$55 |
| 830 |
OR EAX,$400 |
908 |
OR EAX,$400 |
| 831 |
OR af.l,AH |
909 |
OR af.l,AH |
| 832 |
POP EBX |
910 |
POP RBX |
| 833 |
PUSH EAX |
911 |
//PUSH EAX |
| 834 |
PUSH EBX |
912 |
//PUSH EBX |
| 835 |
CALL SpokeB |
913 |
//CALL SpokeB |
| 836 |
LEA ESP,[ESP+8] |
914 |
//LEA ESP,[ESP+8] |
|
|
915 |
MOV w1, BX |
|
|
916 |
MOV w2, AX |
| 837 |
end; |
917 |
end; |
|
|
918 |
spokeb(w1, w2); |
|
|
919 |
|
| 838 |
Result := 12; |
920 |
Result := 12; |
| 839 |
end; |
921 |
end; |
| 840 |
|
922 |
|
| 841 |
function LD_xHL_BYTE: byte; |
923 |
function LD_xHL_BYTE: byte; |
| 842 |
begin |
924 |
begin |
| 843 |
asm |
925 |
{asm |
| 844 |
PUSH dword ptr pc.w |
926 |
PUSH dword ptr pc.w |
| 845 |
CALL speekb |
927 |
CALL speekb |
| 846 |
LEA ESP,[ESP+4] |
928 |
LEA ESP,[ESP+4] |
@@ -850,8 +932,11 @@ begin |
| 850 |
PUSH EAX |
932 |
PUSH EAX |
| 851 |
CALL SpokeB |
933 |
CALL SpokeB |
| 852 |
LEA ESP,[ESP+8] |
934 |
LEA ESP,[ESP+8] |
| 853 |
end; |
935 |
end;} |
| 854 |
|
936 |
|
|
|
937 |
w1 := speekb(pc.w); |
|
|
938 |
Inc(pc.w); |
|
|
939 |
spokeb(hl.w, w1); |
| 855 |
|
940 |
|
| 856 |
Result := 12; |
941 |
Result := 12; |
| 857 |
end; |
942 |
end; |
@@ -869,10 +954,12 @@ end; |
| 869 |
function JR_C: byte; |
954 |
function JR_C: byte; |
| 870 |
|
955 |
|
| 871 |
begin |
956 |
begin |
|
|
957 |
w1 := speekb(pc.w); |
| 872 |
asm |
958 |
asm |
| 873 |
PUSH dword ptr pc.w |
959 |
//PUSH dword ptr pc.w |
| 874 |
CALL speekb |
960 |
//CALL speekb |
| 875 |
LEA ESP,[ESP+4] |
961 |
//LEA ESP,[ESP+4] |
|
|
962 |
MOV EAX, w1 |
| 876 |
INC word ptr pc.w |
963 |
INC word ptr pc.w |
| 877 |
TEST af.l,1 |
964 |
TEST af.l,1 |
| 878 |
MOV cycle,8 |
965 |
MOV cycle,8 |
@@ -913,8 +1000,7 @@ end; |
| 913 |
|
1000 |
|
| 914 |
function LD_A_xWORD: byte; |
1001 |
function LD_A_xWORD: byte; |
| 915 |
begin |
1002 |
begin |
| 916 |
|
1003 |
{asm |
| 917 |
asm |
|
|
| 918 |
MOV AX,hl.w |
1004 |
MOV AX,hl.w |
| 919 |
PUSH EAX |
1005 |
PUSH EAX |
| 920 |
PUSH EAX |
1006 |
PUSH EAX |
@@ -924,7 +1010,10 @@ begin |
| 924 |
POP EAX |
1010 |
POP EAX |
| 925 |
DEC AX |
1011 |
DEC AX |
| 926 |
MOV hl.w,AX |
1012 |
MOV hl.w,AX |
| 927 |
end; |
1013 |
end;} |
|
|
1014 |
|
|
|
1015 |
af.h := speekb(hl.w); |
|
|
1016 |
Dec(hl.w); |
| 928 |
|
1017 |
|
| 929 |
Result := 8; |
1018 |
Result := 8; |
| 930 |
end; |
1019 |
end; |
@@ -966,13 +1055,16 @@ end; |
| 966 |
|
1055 |
|
| 967 |
function LD_A_BYTE: byte; |
1056 |
function LD_A_BYTE: byte; |
| 968 |
begin |
1057 |
begin |
| 969 |
asm |
1058 |
{asm |
| 970 |
PUSH dword ptr pc.w |
1059 |
PUSH dword ptr pc.w |
| 971 |
CALL speekb |
1060 |
CALL speekb |
| 972 |
LEA ESP,[ESP+4] |
1061 |
LEA ESP,[ESP+4] |
| 973 |
MOV af.h,AL |
1062 |
MOV af.h,AL |
| 974 |
INC word ptr pc.w |
1063 |
INC word ptr pc.w |
| 975 |
end; |
1064 |
end;} |
|
|
1065 |
|
|
|
1066 |
af.h := speekb(pc.w); |
|
|
1067 |
Inc(pc.w); |
| 976 |
|
1068 |
|
| 977 |
Result := 8; |
1069 |
Result := 8; |
| 978 |
end; |
1070 |
end; |
@@ -1028,14 +1120,15 @@ end; |
| 1028 |
|
1120 |
|
| 1029 |
function LD_B_xHL: byte; |
1121 |
function LD_B_xHL: byte; |
| 1030 |
begin |
1122 |
begin |
| 1031 |
asm |
1123 |
{asm |
| 1032 |
MOV AX,hl.w |
1124 |
MOV AX,hl.w |
| 1033 |
PUSH EAX |
1125 |
PUSH EAX |
| 1034 |
CALL speekb |
1126 |
CALL speekb |
| 1035 |
LEA ESP,[ESP+4] |
1127 |
LEA ESP,[ESP+4] |
| 1036 |
MOV bc.h,AL |
1128 |
MOV bc.h,AL |
| 1037 |
end; |
1129 |
end;} |
| 1038 |
|
1130 |
|
|
|
1131 |
bc.h := speekb(hl.w); |
| 1039 |
|
1132 |
|
| 1040 |
Result := 8; |
1133 |
Result := 8; |
| 1041 |
end; |
1134 |
end; |
@@ -1083,13 +1176,15 @@ end; |
| 1083 |
|
1176 |
|
| 1084 |
function LD_C_xHL: byte; |
1177 |
function LD_C_xHL: byte; |
| 1085 |
begin |
1178 |
begin |
| 1086 |
asm |
1179 |
{asm |
| 1087 |
MOV AX,hl.w |
1180 |
MOV AX,hl.w |
| 1088 |
PUSH EAX |
1181 |
PUSH EAX |
| 1089 |
CALL speekb |
1182 |
CALL speekb |
| 1090 |
LEA ESP,[ESP+4] |
1183 |
LEA ESP,[ESP+4] |
| 1091 |
MOV bc.l,AL |
1184 |
MOV bc.l,AL |
| 1092 |
end; |
1185 |
end;} |
|
|
1186 |
|
|
|
1187 |
bc.l := speekb(hl.w); |
| 1093 |
|
1188 |
|
| 1094 |
Result := 8; |
1189 |
Result := 8; |
| 1095 |
end; |
1190 |
end; |
@@ -1138,13 +1233,15 @@ end; |
| 1138 |
|
1233 |
|
| 1139 |
function LD_D_xHL: byte; |
1234 |
function LD_D_xHL: byte; |
| 1140 |
begin |
1235 |
begin |
| 1141 |
asm |
1236 |
{asm |
| 1142 |
MOV AX,hl.w |
1237 |
MOV AX,hl.w |
| 1143 |
PUSH EAX |
1238 |
PUSH EAX |
| 1144 |
CALL speekb |
1239 |
CALL speekb |
| 1145 |
LEA ESP,[ESP+4] |
1240 |
LEA ESP,[ESP+4] |
| 1146 |
MOV de.h,AL |
1241 |
MOV de.h,AL |
| 1147 |
end; |
1242 |
end;} |
|
|
1243 |
|
|
|
1244 |
de.h := speekb(hl.w); |
| 1148 |
|
1245 |
|
| 1149 |
Result := 8; |
1246 |
Result := 8; |
| 1150 |
end; |
1247 |
end; |
@@ -1192,14 +1289,16 @@ end; |
| 1192 |
|
1289 |
|
| 1193 |
function LD_E_xHL: byte; |
1290 |
function LD_E_xHL: byte; |
| 1194 |
begin |
1291 |
begin |
| 1195 |
asm |
1292 |
{asm |
| 1196 |
MOV AX,hl.w |
1293 |
MOV AX,hl.w |
| 1197 |
PUSH EAX |
1294 |
PUSH EAX |
| 1198 |
CALL speekb |
1295 |
CALL speekb |
| 1199 |
LEA ESP,[ESP+4] |
1296 |
LEA ESP,[ESP+4] |
| 1200 |
MOV de.l,AL |
1297 |
MOV de.l,AL |
| 1201 |
end; |
1298 |
end;} |
| 1202 |
; |
1299 |
|
|
|
1300 |
de.l := speekb(hl.w); |
|
|
1301 |
|
| 1203 |
Result := 8; |
1302 |
Result := 8; |
| 1204 |
end; |
1303 |
end; |
| 1205 |
|
1304 |
|
@@ -1246,13 +1345,15 @@ end; |
| 1246 |
|
1345 |
|
| 1247 |
function LD_H_xHL: byte; |
1346 |
function LD_H_xHL: byte; |
| 1248 |
begin |
1347 |
begin |
| 1249 |
asm |
1348 |
{asm |
| 1250 |
MOV AX,hl.w |
1349 |
MOV AX,hl.w |
| 1251 |
PUSH EAX |
1350 |
PUSH EAX |
| 1252 |
CALL speekb |
1351 |
CALL speekb |
| 1253 |
LEA ESP,[ESP+4] |
1352 |
LEA ESP,[ESP+4] |
| 1254 |
MOV hl.h,AL |
1353 |
MOV hl.h,AL |
| 1255 |
end; |
1354 |
end;} |
|
|
1355 |
|
|
|
1356 |
hl.h := speekb(hl.w); |
| 1256 |
|
1357 |
|
| 1257 |
Result := 8; |
1358 |
Result := 8; |
| 1258 |
end; |
1359 |
end; |
@@ -1300,13 +1401,15 @@ end; |
| 1300 |
|
1401 |
|
| 1301 |
function LD_L_xHL: byte; |
1402 |
function LD_L_xHL: byte; |
| 1302 |
begin |
1403 |
begin |
| 1303 |
asm |
1404 |
{asm |
| 1304 |
MOV AX,hl.w |
1405 |
MOV AX,hl.w |
| 1305 |
PUSH EAX |
1406 |
PUSH EAX |
| 1306 |
CALL speekb |
1407 |
CALL speekb |
| 1307 |
LEA ESP,[ESP+4] |
1408 |
LEA ESP,[ESP+4] |
| 1308 |
MOV hl.l,AL |
1409 |
MOV hl.l,AL |
| 1309 |
end; |
1410 |
end;} |
|
|
1411 |
|
|
|
1412 |
hl.l := speekb(hl.w); |
| 1310 |
|
1413 |
|
| 1311 |
Result := 8; |
1414 |
Result := 8; |
| 1312 |
end; |
1415 |
end; |
@@ -1319,78 +1422,90 @@ end; |
| 1319 |
|
1422 |
|
| 1320 |
function LD_xHL_B: byte; |
1423 |
function LD_xHL_B: byte; |
| 1321 |
begin |
1424 |
begin |
| 1322 |
asm |
1425 |
{asm |
| 1323 |
MOV AX,hl.w |
1426 |
MOV AX,hl.w |
| 1324 |
PUSH dword ptr bc.h |
1427 |
PUSH dword ptr bc.h |
| 1325 |
PUSH EAX |
1428 |
PUSH EAX |
| 1326 |
CALL SpokeB |
1429 |
CALL SpokeB |
| 1327 |
LEA ESP,[ESP+8] |
1430 |
LEA ESP,[ESP+8] |
| 1328 |
end; |
1431 |
end;} |
|
|
1432 |
|
|
|
1433 |
spokeb(hl.w, bc.h); |
| 1329 |
|
1434 |
|
| 1330 |
Result := 8; |
1435 |
Result := 8; |
| 1331 |
end; |
1436 |
end; |
| 1332 |
|
1437 |
|
| 1333 |
function LD_xHL_C: byte; |
1438 |
function LD_xHL_C: byte; |
| 1334 |
begin |
1439 |
begin |
| 1335 |
asm |
1440 |
{asm |
| 1336 |
MOV AX,hl.w |
1441 |
MOV AX,hl.w |
| 1337 |
PUSH dword ptr bc.l |
1442 |
PUSH dword ptr bc.l |
| 1338 |
PUSH EAX |
1443 |
PUSH EAX |
| 1339 |
CALL SpokeB |
1444 |
CALL SpokeB |
| 1340 |
LEA ESP,[ESP+8] |
1445 |
LEA ESP,[ESP+8] |
| 1341 |
end; |
1446 |
end;} |
|
|
1447 |
|
|
|
1448 |
spokeb(hl.w, bc.l); |
| 1342 |
|
1449 |
|
| 1343 |
Result := 8; |
1450 |
Result := 8; |
| 1344 |
end; |
1451 |
end; |
| 1345 |
|
1452 |
|
| 1346 |
function LD_xHL_D: byte; |
1453 |
function LD_xHL_D: byte; |
| 1347 |
begin |
1454 |
begin |
| 1348 |
asm |
1455 |
{asm |
| 1349 |
MOV AX,hl.w |
1456 |
MOV AX,hl.w |
| 1350 |
PUSH dword ptr de.h |
1457 |
PUSH dword ptr de.h |
| 1351 |
PUSH EAX |
1458 |
PUSH EAX |
| 1352 |
CALL SpokeB |
1459 |
CALL SpokeB |
| 1353 |
LEA ESP,[ESP+8] |
1460 |
LEA ESP,[ESP+8] |
| 1354 |
end; |
1461 |
end;} |
|
|
1462 |
|
|
|
1463 |
spokeb(hl.w, de.h); |
| 1355 |
|
1464 |
|
| 1356 |
Result := 8; |
1465 |
Result := 8; |
| 1357 |
end; |
1466 |
end; |
| 1358 |
|
1467 |
|
| 1359 |
function LD_xHL_E: byte; |
1468 |
function LD_xHL_E: byte; |
| 1360 |
begin |
1469 |
begin |
| 1361 |
asm |
1470 |
{asm |
| 1362 |
MOV AX,hl.w |
1471 |
MOV AX,hl.w |
| 1363 |
PUSH dword ptr de.l |
1472 |
PUSH dword ptr de.l |
| 1364 |
PUSH EAX |
1473 |
PUSH EAX |
| 1365 |
CALL SpokeB |
1474 |
CALL SpokeB |
| 1366 |
LEA ESP,[ESP+8] |
1475 |
LEA ESP,[ESP+8] |
| 1367 |
end; |
1476 |
end;} |
|
|
1477 |
|
|
|
1478 |
spokeb(hl.w, de.l); |
| 1368 |
|
1479 |
|
| 1369 |
Result := 8; |
1480 |
Result := 8; |
| 1370 |
end; |
1481 |
end; |
| 1371 |
|
1482 |
|
| 1372 |
function LD_xHL_H: byte; |
1483 |
function LD_xHL_H: byte; |
| 1373 |
begin |
1484 |
begin |
| 1374 |
asm |
1485 |
{asm |
| 1375 |
MOV AX,hl.w |
1486 |
MOV AX,hl.w |
| 1376 |
PUSH dword ptr hl.h |
1487 |
PUSH dword ptr hl.h |
| 1377 |
PUSH EAX |
1488 |
PUSH EAX |
| 1378 |
CALL SpokeB |
1489 |
CALL SpokeB |
| 1379 |
LEA ESP,[ESP+8] |
1490 |
LEA ESP,[ESP+8] |
| 1380 |
end; |
1491 |
end;} |
|
|
1492 |
|
|
|
1493 |
spokeb(hl.w, hl.h); |
| 1381 |
|
1494 |
|
| 1382 |
Result := 8; |
1495 |
Result := 8; |
| 1383 |
end; |
1496 |
end; |
| 1384 |
|
1497 |
|
| 1385 |
function LD_xHL_L: byte; |
1498 |
function LD_xHL_L: byte; |
| 1386 |
begin |
1499 |
begin |
| 1387 |
asm |
1500 |
{asm |
| 1388 |
MOV AX,hl.w |
1501 |
MOV AX,hl.w |
| 1389 |
PUSH dword ptr hl.l |
1502 |
PUSH dword ptr hl.l |
| 1390 |
PUSH EAX |
1503 |
PUSH EAX |
| 1391 |
CALL SpokeB |
1504 |
CALL SpokeB |
| 1392 |
LEA ESP,[ESP+8] |
1505 |
LEA ESP,[ESP+8] |
| 1393 |
end; |
1506 |
end;} |
|
|
1507 |
|
|
|
1508 |
spokeb(hl.w, hl.l); |
| 1394 |
|
1509 |
|
| 1395 |
Result := 8; |
1510 |
Result := 8; |
| 1396 |
end; |
1511 |
end; |
@@ -1406,13 +1521,15 @@ end; |
| 1406 |
|
1521 |
|
| 1407 |
function LD_xHL_A: byte; |
1522 |
function LD_xHL_A: byte; |
| 1408 |
begin |
1523 |
begin |
| 1409 |
asm |
1524 |
{asm |
| 1410 |
MOV AX,hl.w |
1525 |
MOV AX,hl.w |
| 1411 |
PUSH dword ptr af.h |
1526 |
PUSH dword ptr af.h |
| 1412 |
PUSH EAX |
1527 |
PUSH EAX |
| 1413 |
CALL SpokeB |
1528 |
CALL SpokeB |
| 1414 |
LEA ESP,[ESP+8] |
1529 |
LEA ESP,[ESP+8] |
| 1415 |
end; |
1530 |
end;} |
|
|
1531 |
|
|
|
1532 |
spokeb(hl.w, af.h); |
| 1416 |
|
1533 |
|
| 1417 |
Result := 8; |
1534 |
Result := 8; |
| 1418 |
end; |
1535 |
end; |
@@ -1455,13 +1572,15 @@ end; |
| 1455 |
|
1572 |
|
| 1456 |
function LD_A_xHL: byte; |
1573 |
function LD_A_xHL: byte; |
| 1457 |
begin |
1574 |
begin |
| 1458 |
asm |
1575 |
{asm |
| 1459 |
MOV AX,hl.w |
1576 |
MOV AX,hl.w |
| 1460 |
PUSH EAX |
1577 |
PUSH EAX |
| 1461 |
CALL speekb |
1578 |
CALL speekb |
| 1462 |
LEA ESP,[ESP+4] |
1579 |
LEA ESP,[ESP+4] |
| 1463 |
MOV af.h,AL |
1580 |
MOV af.h,AL |
| 1464 |
end; |
1581 |
end;} |
|
|
1582 |
|
|
|
1583 |
af.h := speekb(hl.w); |
| 1465 |
|
1584 |
|
| 1466 |
Result := 8; |
1585 |
Result := 8; |
| 1467 |
end; |
1586 |
end; |
@@ -1554,12 +1673,13 @@ end; |
| 1554 |
|
1673 |
|
| 1555 |
function ADD_xHL: byte; |
1674 |
function ADD_xHL: byte; |
| 1556 |
begin |
1675 |
begin |
| 1557 |
|
1676 |
w1 := speekb(hl.w); |
| 1558 |
asm |
1677 |
asm |
| 1559 |
MOV AX,hl.w |
1678 |
//MOV AX,hl.w |
| 1560 |
PUSH EAX |
1679 |
//PUSH EAX |
| 1561 |
CALL speekb |
1680 |
//CALL speekb |
| 1562 |
LEA ESP,[ESP+4] |
1681 |
//LEA ESP,[ESP+4] |
|
|
1682 |
MOV AX, w1 |
| 1563 |
|
1683 |
|
| 1564 |
ADD af.h,AL |
1684 |
ADD af.h,AL |
| 1565 |
LAHF |
1685 |
LAHF |
@@ -1567,6 +1687,7 @@ begin |
| 1567 |
MOV af.l,AH |
1687 |
MOV af.l,AH |
| 1568 |
|
1688 |
|
| 1569 |
end; |
1689 |
end; |
|
|
1690 |
|
| 1570 |
Result := 8; |
1691 |
Result := 8; |
| 1571 |
end; |
1692 |
end; |
| 1572 |
|
1693 |
|
@@ -1681,12 +1802,13 @@ end; |
| 1681 |
|
1802 |
|
| 1682 |
function ADC_xHL: byte; |
1803 |
function ADC_xHL: byte; |
| 1683 |
begin |
1804 |
begin |
| 1684 |
|
1805 |
w1 := speekb(hl.w); |
| 1685 |
asm |
1806 |
asm |
| 1686 |
MOV AX,hl.w |
1807 |
//MOV AX,hl.w |
| 1687 |
PUSH EAX |
1808 |
//PUSH EAX |
| 1688 |
CALL speekb |
1809 |
//CALL speekb |
| 1689 |
LEA ESP,[ESP+4] |
1810 |
//LEA ESP,[ESP+4] |
|
|
1811 |
MOV AX, w1 |
| 1690 |
MOV AH,af.l |
1812 |
MOV AH,af.l |
| 1691 |
AND AH,1 |
1813 |
AND AH,1 |
| 1692 |
SAHF |
1814 |
SAHF |
@@ -1803,12 +1925,13 @@ end; |
| 1803 |
|
1925 |
|
| 1804 |
function SUB_xHL: byte; |
1926 |
function SUB_xHL: byte; |
| 1805 |
begin |
1927 |
begin |
| 1806 |
|
1928 |
w1 := speekb(hl.w); |
| 1807 |
asm |
1929 |
asm |
| 1808 |
MOV AX,hl.w |
1930 |
//MOV AX,hl.w |
| 1809 |
PUSH EAX |
1931 |
//PUSH EAX |
| 1810 |
CALL speekb |
1932 |
//CALL speekb |
| 1811 |
LEA ESP,[ESP+4] |
1933 |
//LEA ESP,[ESP+4] |
|
|
1934 |
MOV AX, w1 |
| 1812 |
|
1935 |
|
| 1813 |
SUB af.h,AL |
1936 |
SUB af.h,AL |
| 1814 |
LAHF |
1937 |
LAHF |
@@ -1933,12 +2056,14 @@ end; |
| 1933 |
|
2056 |
|
| 1934 |
function SBC_xHL: byte; |
2057 |
function SBC_xHL: byte; |
| 1935 |
begin |
2058 |
begin |
| 1936 |
|
2059 |
w1 := speekb(hl.w); |
| 1937 |
asm |
2060 |
asm |
| 1938 |
MOV AX,hl.w |
2061 |
//MOV AX,hl.w |
| 1939 |
PUSH EAX |
2062 |
//PUSH EAX |
| 1940 |
CALL speekb |
2063 |
//CALL speekb |
| 1941 |
LEA ESP,[ESP+4] |
2064 |
//LEA ESP,[ESP+4] |
|
|
2065 |
MOV AX, w1 |
|
|
2066 |
|
| 1942 |
MOV AH,af.l |
2067 |
MOV AH,af.l |
| 1943 |
SAHF |
2068 |
SAHF |
| 1944 |
|
2069 |
|
@@ -2047,12 +2172,13 @@ end; |
| 2047 |
|
2172 |
|
| 2048 |
function AND_xHL: byte; |
2173 |
function AND_xHL: byte; |
| 2049 |
begin |
2174 |
begin |
| 2050 |
|
2175 |
w1 := speekb(hl.w); |
| 2051 |
asm |
2176 |
asm |
| 2052 |
MOV AX,hl.w |
2177 |
//MOV AX,hl.w |
| 2053 |
PUSH EAX |
2178 |
//PUSH EAX |
| 2054 |
CALL speekb |
2179 |
//CALL speekb |
| 2055 |
LEA ESP,[ESP+4] |
2180 |
//LEA ESP,[ESP+4] |
|
|
2181 |
MOV AX, w1 |
| 2056 |
|
2182 |
|
| 2057 |
AND af.h,AL |
2183 |
AND af.h,AL |
| 2058 |
LAHF |
2184 |
LAHF |
@@ -2150,12 +2276,13 @@ end; |
| 2150 |
|
2276 |
|
| 2151 |
function XOR_xHL: byte; |
2277 |
function XOR_xHL: byte; |
| 2152 |
begin |
2278 |
begin |
| 2153 |
|
2279 |
w1 := speekb(hl.w); |
| 2154 |
asm |
2280 |
asm |
| 2155 |
MOV AX,hl.w |
2281 |
//MOV AX,hl.w |
| 2156 |
PUSH EAX |
2282 |
//PUSH EAX |
| 2157 |
CALL speekb |
2283 |
//CALL speekb |
| 2158 |
LEA ESP,[ESP+4] |
2284 |
//LEA ESP,[ESP+4] |
|
|
2285 |
MOV AX, w1 |
| 2159 |
|
2286 |
|
| 2160 |
XOR af.h,AL |
2287 |
XOR af.h,AL |
| 2161 |
LAHF |
2288 |
LAHF |
@@ -2250,12 +2377,14 @@ end; |
| 2250 |
|
2377 |
|
| 2251 |
function OR_xHL: byte; |
2378 |
function OR_xHL: byte; |
| 2252 |
begin |
2379 |
begin |
|
|
2380 |
w1 := speekb(hl.w); |
| 2253 |
|
2381 |
|
| 2254 |
asm |
2382 |
asm |
| 2255 |
MOV AX,hl.w |
2383 |
//MOV AX,hl.w |
| 2256 |
PUSH EAX |
2384 |
//PUSH EAX |
| 2257 |
CALL speekb |
2385 |
//CALL speekb |
| 2258 |
LEA ESP,[ESP+4] |
2386 |
//LEA ESP,[ESP+4] |
|
|
2387 |
MOV AX, w1 |
| 2259 |
|
2388 |
|
| 2260 |
|
2389 |
|
| 2261 |
OR af.h,AL |
2390 |
OR af.h,AL |
@@ -2357,12 +2486,13 @@ end; |
| 2357 |
|
2486 |
|
| 2358 |
function CP_xHL: byte; |
2487 |
function CP_xHL: byte; |
| 2359 |
begin |
2488 |
begin |
| 2360 |
|
2489 |
w1 := speekb(hl.w); |
| 2361 |
asm |
2490 |
asm |
| 2362 |
MOV AX,hl.w |
2491 |
//MOV AX,hl.w |
| 2363 |
PUSH EAX |
2492 |
//PUSH EAX |
| 2364 |
CALL speekb |
2493 |
//CALL speekb |
| 2365 |
LEA ESP,[ESP+4] |
2494 |
//LEA ESP,[ESP+4] |
|
|
2495 |
MOV AX, w1 |
| 2366 |
|
2496 |
|
| 2367 |
|
2497 |
|
| 2368 |
CMP af.h,AL |
2498 |
CMP af.h,AL |
@@ -2389,6 +2519,8 @@ end; |
| 2389 |
function RET_NZ: byte; |
2519 |
function RET_NZ: byte; |
| 2390 |
|
2520 |
|
| 2391 |
begin |
2521 |
begin |
|
|
2522 |
//w1 := speekb(sp_.w); |
|
|
2523 |
// TODO |
| 2392 |
asm |
2524 |
asm |
| 2393 |
TEST af.l,64 |
2525 |
TEST af.l,64 |
| 2394 |
MOV cycle,8 |
2526 |
MOV cycle,8 |
@@ -2396,6 +2528,7 @@ begin |
| 2396 |
PUSH dword ptr sp_.w |
2528 |
PUSH dword ptr sp_.w |
| 2397 |
CALL speekb |
2529 |
CALL speekb |
| 2398 |
LEA ESP,[ESP+4] |
2530 |
LEA ESP,[ESP+4] |
|
|
2531 |
MOV AX, w1 |
| 2399 |
INC word ptr sp_.w |
2532 |
INC word ptr sp_.w |
| 2400 |
PUSH EAX |
2533 |
PUSH EAX |
| 2401 |
PUSH dword ptr sp_.w |
2534 |
PUSH dword ptr sp_.w |
@@ -2480,11 +2613,13 @@ end; |
| 2480 |
|
2613 |
|
| 2481 |
function ADD_BYTE: byte; |
2614 |
function ADD_BYTE: byte; |
| 2482 |
begin |
2615 |
begin |
|
|
2616 |
w1 := speekb(pc.w); |
| 2483 |
|
2617 |
|
| 2484 |
asm |
2618 |
asm |
| 2485 |
PUSH dword ptr pc.w |
2619 |
//PUSH dword ptr pc.w |
| 2486 |
CALL speekb |
2620 |
//CALL speekb |
| 2487 |
LEA ESP,[ESP+4] |
2621 |
//LEA ESP,[ESP+4] |
|
|
2622 |
MOV AX, w1 |
| 2488 |
INC word ptr pc.w |
2623 |
INC word ptr pc.w |
| 2489 |
MOV AH,af.l |
2624 |
MOV AH,af.l |
| 2490 |
SAHF |
2625 |
SAHF |
@@ -2587,11 +2722,13 @@ end; |
| 2587 |
|
2722 |
|
| 2588 |
function ADC_BYTE: byte; |
2723 |
function ADC_BYTE: byte; |
| 2589 |
begin |
2724 |
begin |
| 2590 |
|
2725 |
w1 := speekb(pc.w); |
| 2591 |
asm |
2726 |
asm |
| 2592 |
PUSH dword ptr pc.w |
2727 |
//PUSH dword ptr pc.w |
| 2593 |
CALL speekb |
2728 |
//CALL speekb |
| 2594 |
LEA ESP,[ESP+4] |
2729 |
//LEA ESP,[ESP+4] |
|
|
2730 |
MOV AX, w1 |
|
|
2731 |
|
| 2595 |
INC word ptr pc.w |
2732 |
INC word ptr pc.w |
| 2596 |
MOV AH,af.l |
2733 |
MOV AH,af.l |
| 2597 |
SAHF |
2734 |
SAHF |
@@ -2788,10 +2925,13 @@ end; |
| 2788 |
|
2925 |
|
| 2789 |
function SBC_BYTE: byte; |
2926 |
function SBC_BYTE: byte; |
| 2790 |
begin |
2927 |
begin |
|
|
2928 |
w1 := speekb(pc.w); |
| 2791 |
asm |
2929 |
asm |
| 2792 |
PUSH dword ptr pc.w |
2930 |
//PUSH dword ptr pc.w |
| 2793 |
CALL speekb |
2931 |
//CALL speekb |
| 2794 |
LEA ESP,[ESP+4] |
2932 |
//LEA ESP,[ESP+4] |
|
|
2933 |
MOV AX, w1 |
|
|
2934 |
|
| 2795 |
INC word ptr pc.w |
2935 |
INC word ptr pc.w |
| 2796 |
MOV AH,af.l |
2936 |
MOV AH,af.l |
| 2797 |
SAHF |
2937 |
SAHF |
@@ -2814,20 +2954,26 @@ end; |
| 2814 |
|
2954 |
|
| 2815 |
function RET_PO: byte; |
2955 |
function RET_PO: byte; |
| 2816 |
begin |
2956 |
begin |
|
|
2957 |
w1 := speekb(pc.w); |
| 2817 |
asm |
2958 |
asm |
| 2818 |
PUSH dword ptr pc.w |
2959 |
//PUSH dword ptr pc.w |
| 2819 |
CALL speekb |
2960 |
//CALL speekb |
| 2820 |
LEA ESP,[ESP+4] |
2961 |
//LEA ESP,[ESP+4] |
|
|
2962 |
MOV AX, w1 |
|
|
2963 |
|
| 2821 |
INC word ptr pc.w |
2964 |
INC word ptr pc.w |
| 2822 |
MOV AH,$ff |
2965 |
MOV AH,$ff |
| 2823 |
|
2966 |
|
| 2824 |
|
2967 |
|
| 2825 |
push dword ptr af.h |
2968 |
//push dword ptr af.h |
| 2826 |
PUSH EAX |
2969 |
//PUSH EAX |
| 2827 |
CALL SpokeB |
2970 |
//CALL SpokeB |
| 2828 |
LEA ESP,[ESP+8] |
2971 |
//LEA ESP,[ESP+8] |
|
|
2972 |
MOV w1, EAX |
| 2829 |
end; |
2973 |
end; |
| 2830 |
|
2974 |
|
|
|
2975 |
spokeb(w1, af.h); |
|
|
2976 |
|
| 2831 |
Result := 12; |
2977 |
Result := 12; |
| 2832 |
end; |
2978 |
end; |
| 2833 |
|
2979 |
|
@@ -2842,7 +2988,7 @@ end; |
| 2842 |
|
2988 |
|
| 2843 |
function JP_PO: byte; |
2989 |
function JP_PO: byte; |
| 2844 |
begin |
2990 |
begin |
| 2845 |
asm |
2991 |
{asm |
| 2846 |
MOV AL,bc.l |
2992 |
MOV AL,bc.l |
| 2847 |
MOV AH,$ff |
2993 |
MOV AH,$ff |
| 2848 |
|
2994 |
|
@@ -2851,7 +2997,9 @@ begin |
| 2851 |
PUSH EAX |
2997 |
PUSH EAX |
| 2852 |
CALL SpokeB |
2998 |
CALL SpokeB |
| 2853 |
LEA ESP,[ESP+8] |
2999 |
LEA ESP,[ESP+8] |
| 2854 |
end; |
3000 |
end;} |
|
|
3001 |
|
|
|
3002 |
spokeb(bc.l, af.h); |
| 2855 |
|
3003 |
|
| 2856 |
Result := 8; |
3004 |
Result := 8; |
| 2857 |
end; |
3005 |
end; |
@@ -2926,6 +3074,8 @@ end; |
| 2926 |
|
3074 |
|
| 2927 |
function JP_PE: byte; |
3075 |
function JP_PE: byte; |
| 2928 |
begin |
3076 |
begin |
|
|
3077 |
// TODO |
|
|
3078 |
|
| 2929 |
asm |
3079 |
asm |
| 2930 |
PUSH dword ptr pc.w |
3080 |
PUSH dword ptr pc.w |
| 2931 |
CALL speekb |
3081 |
CALL speekb |
@@ -2980,11 +3130,13 @@ end; |
| 2980 |
|
3130 |
|
| 2981 |
function XOR_BYTE: byte; |
3131 |
function XOR_BYTE: byte; |
| 2982 |
begin |
3132 |
begin |
| 2983 |
|
3133 |
w1 := speekb(pc.w); |
| 2984 |
asm |
3134 |
asm |
| 2985 |
PUSH dword ptr pc.w |
3135 |
//PUSH dword ptr pc.w |
| 2986 |
CALL speekb |
3136 |
//CALL speekb |
| 2987 |
LEA ESP,[ESP+4] |
3137 |
//LEA ESP,[ESP+4] |
|
|
3138 |
MOV AX, w1 |
|
|
3139 |
|
| 2988 |
INC word ptr pc.w |
3140 |
INC word ptr pc.w |
| 2989 |
|
3141 |
|
| 2990 |
XOR af.h,AL |
3142 |
XOR af.h,AL |
@@ -3005,14 +3157,19 @@ end; |
| 3005 |
|
3157 |
|
| 3006 |
function RET_P: byte; |
3158 |
function RET_P: byte; |
| 3007 |
begin |
3159 |
begin |
|
|
3160 |
// TODO |
|
|
3161 |
w1 := speekb(pc.w); |
| 3008 |
asm |
3162 |
asm |
| 3009 |
PUSH dword ptr pc.w |
3163 |
//PUSH dword ptr pc.w |
| 3010 |
CALL speekb |
3164 |
//CALL speekb |
| 3011 |
LEA ESP,[ESP+4] |
3165 |
//LEA ESP,[ESP+4] |
|
|
3166 |
MOV AX, w1 |
|
|
3167 |
|
| 3012 |
INC word ptr pc.w |
3168 |
INC word ptr pc.w |
| 3013 |
XOR AH,AH |
3169 |
XOR AH,AH |
| 3014 |
MOV BX,$ff00 |
3170 |
MOV BX,$ff00 |
| 3015 |
ADD AX,BX |
3171 |
ADD AX,BX |
|
|
3172 |
// ? |
| 3016 |
PUSH EAX |
3173 |
PUSH EAX |
| 3017 |
CALL speekb |
3174 |
CALL speekb |
| 3018 |
LEA ESP,[ESP+4] |
3175 |
LEA ESP,[ESP+4] |
@@ -3044,6 +3201,7 @@ end; |
| 3044 |
|
3201 |
|
| 3045 |
function JP_P: byte; |
3202 |
function JP_P: byte; |
| 3046 |
begin |
3203 |
begin |
|
|
3204 |
// TODO |
| 3047 |
asm |
3205 |
asm |
| 3048 |
MOV AL,bc.l |
3206 |
MOV AL,bc.l |
| 3049 |
XOR AH,AH |
3207 |
XOR AH,AH |
@@ -3114,11 +3272,13 @@ end; |
| 3114 |
|
3272 |
|
| 3115 |
function RET_M: byte; |
3273 |
function RET_M: byte; |
| 3116 |
begin |
3274 |
begin |
| 3117 |
|
3275 |
w1 := speekb(pc.w); |
| 3118 |
asm |
3276 |
asm |
| 3119 |
PUSH dword ptr pc.w |
3277 |
//PUSH dword ptr pc.w |
| 3120 |
CALL speekb |
3278 |
//CALL speekb |
| 3121 |
LEA ESP,[ESP+4] |
3279 |
//LEA ESP,[ESP+4] |
|
|
3280 |
MOV AX, w1 |
|
|
3281 |
|
| 3122 |
INC word ptr pc.w |
3282 |
INC word ptr pc.w |
| 3123 |
|
3283 |
|
| 3124 |
|
3284 |
|
@@ -3147,6 +3307,8 @@ end; |
| 3147 |
|
3307 |
|
| 3148 |
function JP_M: byte; |
3308 |
function JP_M: byte; |
| 3149 |
begin |
3309 |
begin |
|
|
3310 |
// TODO |
|
|
3311 |
|
| 3150 |
asm |
3312 |
asm |
| 3151 |
PUSH dword ptr pc.w |
3313 |
PUSH dword ptr pc.w |
| 3152 |
CALL speekb |
3314 |
CALL speekb |
@@ -3185,17 +3347,19 @@ end; |
| 3185 |
|
3347 |
|
| 3186 |
function PFX_FD: byte; |
3348 |
function PFX_FD: byte; |
| 3187 |
begin |
3349 |
begin |
| 3188 |
// Writeln('[DEBUG] 0xFD Called, A = ', af.h); |
|
|
| 3189 |
if Assigned(@FDCallback) then FDCallback; |
3350 |
if Assigned(@FDCallback) then FDCallback; |
| 3190 |
Result := 0; |
3351 |
Result := 0; |
| 3191 |
end; |
3352 |
end; |
| 3192 |
|
3353 |
|
| 3193 |
function CP_BYTE: byte; |
3354 |
function CP_BYTE: byte; |
| 3194 |
begin |
3355 |
begin |
|
|
3356 |
w1 := speekb(pc.w); |
| 3195 |
asm |
3357 |
asm |
| 3196 |
PUSH dword ptr pc.w |
3358 |
//PUSH dword ptr pc.w |
| 3197 |
CALL speekb |
3359 |
//CALL speekb |
| 3198 |
LEA ESP,[ESP+4] |
3360 |
//LEA ESP,[ESP+4] |
|
|
3361 |
MOV AX, w1 |
|
|
3362 |
|
| 3199 |
INC word ptr pc.w |
3363 |
INC word ptr pc.w |
| 3200 |
CMP af.h,AL |
3364 |
CMP af.h,AL |
| 3201 |
LAHF |
3365 |
LAHF |
@@ -5690,7 +5854,7 @@ end; |
| 5690 |
|
5854 |
|
| 5691 |
function SET3_xHL: byte; |
5855 |
function SET3_xHL: byte; |
| 5692 |
begin |
5856 |
begin |
| 5693 |
|
5857 |
// TODO |
| 5694 |
asm |
5858 |
asm |
| 5695 |
MOV AX,hl.w |
5859 |
MOV AX,hl.w |
| 5696 |
PUSH EAX |
5860 |
PUSH EAX |
@@ -5909,6 +6073,7 @@ end; |
| 5909 |
|
6073 |
|
| 5910 |
function SET7_xHL: byte; |
6074 |
function SET7_xHL: byte; |
| 5911 |
begin |
6075 |
begin |
|
|
6076 |
// TODO |
| 5912 |
asm |
6077 |
asm |
| 5913 |
MOV AX,hl.w |
6078 |
MOV AX,hl.w |
| 5914 |
PUSH EAX |
6079 |
PUSH EAX |