Commit 5b6378f

Nick committed on
WIP Porting z80_cpu.pas to 64 bit
commit 5b6378f1dcf6a1f8044bb547809fd5b4418c3b56 parent f2b93f8
2 changed files +355−193
ModifiedCpu/machine.pas +0−3
@@ -69,9 +69,6 @@ const
69 (code: $1801; Name: 'Hudson Soft')); 69 (code: $1801; Name: 'Hudson Soft'));
70 70
71 71
72 {+ Important!! the two memory functions must
73 be declared CDECL!!! +}
74
75 function speekb(address: word): byte; 72 function speekb(address: word): byte;
76 procedure spokeb(address: word; Data: byte); 73 procedure spokeb(address: word; Data: byte);
77 74
ModifiedCpu/z80cpu.pas +355−190
@@ -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