forked from ref-xx/basinc
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFastCore.pas
More file actions
16658 lines (15137 loc) · 357 KB
/
FastCore.pas
File metadata and controls
16658 lines (15137 loc) · 357 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// **********************************************
// * *
// * FastCore.pas *
// * *
// * A modified Z80 Core from SPIN. *
// * Very(?) simple emulation, but very fast. *
// * *
// * (C) 2001-2008 By Paul Dunn. *
// * *
// **********************************************
unit FastCore;
interface
Uses Windows, Classes, SysUtils, FastDIB, Math, MMSystem,
ROMUtils, InputUtils, Filing, FastDraw;
Type
TZ80Registers =
Record PC, TotalTS, LastTotalTS, Time: DWord;
IX, IY, SP, SPn,
Word1, Word2, Word3, TargetAddr: Word;
R, I, F, A, C, B, E, D, L, H,
Fn, An, Cn, Bn, En, Dn, Ln, Hn,
ZByte1, ZByte2, ZByte3, RBit7, TempFlags,
FlashState, IntMode, LastFE: Byte;
EmuRunning, HaltEmu, CanInterrupt, IntsEnabled: Boolean;
End;
TEmulationState =
Record Memory: Array[0..65535] of Byte;
Registers: TZ80Registers;
Running: Boolean;
CursorType: AnsiChar;
Editing: Boolean;
ProgState: Byte;
BorderDWord: DWord;
End;
// Emulation setup Procs
Function INITEMulation: Boolean;
Procedure Reset;
Procedure TrashScreenMem;
Procedure BuildTables;
Procedure SetUpScreenLUT;
Function GetScreenAddr(X, Y: DWord): DWord;
Function GetAttrAddr(X, Y: Integer): DWord;
Procedure BuildPalette(Clrs: Array of TFColor);
Procedure PrepareSpecColourTable;
Procedure SetUpGraphics;
Procedure SaveEmulationState(var State: TEmulationState);
Procedure LoadEmulationState(var State: TEmulationState; Notify: Boolean);
Procedure CloseEmulation;
// Minimal Z80 Core Functions
Procedure EmulateRET;
Procedure EmulateCALL(Address: Word);
Procedure EmulatePUSH(Value: Word);
Function EmulatePOP: Word;
Function GetByte(WordPtr: Pointer): Byte;
Function GetWord(WordPtr: Pointer): Word;
Function GetDWord(WordPtr: Pointer): DWord;
Procedure PutByte(WordPtr: Pointer; Value: Byte);
Procedure PutWord(WordPtr: Pointer; Value: Word);
Procedure PutDWord(WordPtr: Pointer; Value: DWord);
Procedure IncWord(WordPtr: Pointer);
Procedure DecWord(WordPtr: Pointer);
Function GetPortByte(Port: Word): Byte;
Procedure SetPortByte(Port: Word; Value: Byte);
// Opcode Procedures
Procedure NULLOP;
Procedure NULLED;
Procedure Op00; Procedure Op01; Procedure Op02; Procedure Op03; Procedure Op04; Procedure Op05;
Procedure Op06; Procedure Op07; Procedure Op08; Procedure Op09; Procedure Op0A; Procedure Op0B;
Procedure Op0C; Procedure Op0D; Procedure Op0E; Procedure Op0F; Procedure Op10; Procedure Op11;
Procedure Op12; Procedure Op13; Procedure Op14; Procedure Op15; Procedure Op16; Procedure Op17;
Procedure Op18; Procedure Op19; Procedure Op1A; Procedure Op1B; Procedure Op1C; Procedure Op1D;
Procedure Op1E; Procedure Op1F; Procedure Op20; Procedure Op21; Procedure Op22; Procedure Op23;
Procedure Op24; Procedure Op25; Procedure Op26; Procedure Op27; Procedure Op28; Procedure Op29;
Procedure Op2A; Procedure Op2B; Procedure Op2C; Procedure Op2D; Procedure Op2E; Procedure Op2F;
Procedure Op30; Procedure Op31; Procedure Op32; Procedure Op33; Procedure Op34; Procedure Op35;
Procedure Op36; Procedure Op37; Procedure Op38; Procedure Op39; Procedure Op3A; Procedure Op3B;
Procedure Op3C; Procedure Op3D; Procedure Op3E; Procedure Op3F; Procedure Op40; Procedure Op41;
Procedure Op42; Procedure Op43; Procedure Op44; Procedure Op45; Procedure Op46; Procedure Op47;
Procedure Op48; Procedure Op49; Procedure Op4A; Procedure Op4B; Procedure Op4C; Procedure Op4D;
Procedure Op4E; Procedure Op4F; Procedure Op50; Procedure Op51; Procedure Op52; Procedure Op53;
Procedure Op54; Procedure Op55; Procedure Op56; Procedure Op57; Procedure Op58; Procedure Op59;
Procedure Op5A; Procedure Op5B; Procedure Op5C; Procedure Op5D; Procedure Op5E; Procedure Op5F;
Procedure Op60; Procedure Op61; Procedure Op62; Procedure Op63; Procedure Op64; Procedure Op65;
Procedure Op66; Procedure Op67; Procedure Op68; Procedure Op69; Procedure Op6A; Procedure Op6B;
Procedure Op6C; Procedure Op6D; Procedure Op6E; Procedure Op6F; Procedure Op70; Procedure Op71;
Procedure Op72; Procedure Op73; Procedure Op74; Procedure Op75; Procedure Op76; Procedure Op77;
Procedure Op78; Procedure Op79; Procedure Op7A; Procedure Op7B; Procedure Op7C; Procedure Op7D;
Procedure Op7E; Procedure Op7F; Procedure Op80; Procedure Op81; Procedure Op82; Procedure Op83;
Procedure Op84; Procedure Op85; Procedure Op86; Procedure Op87; Procedure Op88; Procedure Op89;
Procedure Op8A; Procedure Op8B; Procedure Op8C; Procedure Op8D; Procedure Op8E; Procedure Op8F;
Procedure Op90; Procedure Op91; Procedure Op92; Procedure Op93; Procedure Op94; Procedure Op95;
Procedure Op96; Procedure Op97; Procedure Op98; Procedure Op99; Procedure Op9A; Procedure Op9B;
Procedure Op9C; Procedure Op9D; Procedure Op9E; Procedure Op9F; Procedure OpA0; Procedure OpA1;
Procedure OpA2; Procedure OpA3; Procedure OpA4; Procedure OpA5; Procedure OpA6; Procedure OpA7;
Procedure OpA8; Procedure OpA9; Procedure OpAA; Procedure OpAB; Procedure OpAC; Procedure OpAD;
Procedure OpAE; Procedure OpAF; Procedure OpB0; Procedure OpB1; Procedure OpB2; Procedure OpB3;
Procedure OpB4; Procedure OpB5; Procedure OpB6; Procedure OpB7; Procedure OpB8; Procedure OpB9;
Procedure OpBA; Procedure OpBB; Procedure OpBC; Procedure OpBD; Procedure OpBE; Procedure OpBF;
Procedure OpC0; Procedure OpC1; Procedure OpC2; Procedure OpC3; Procedure OpC4; Procedure OpC5;
Procedure OpC6; Procedure OpC7; Procedure OpC8; Procedure OpC9; Procedure OpCA; Procedure OpCB;
Procedure OpCC; Procedure OpCD; Procedure OpCE; Procedure OpCF; Procedure OpD0; Procedure OpD1;
Procedure OpD2; Procedure OpD3; Procedure OpD4; Procedure OpD5; Procedure OpD6; Procedure OpD7;
Procedure OpD8; Procedure OpD9; Procedure OpDA; Procedure OpDB; Procedure OpDC; Procedure OpDD;
Procedure OpDE; Procedure OpDF; Procedure OpE0; Procedure OpE1; Procedure OpE2; Procedure OpE3;
Procedure OpE4; Procedure OpE5; Procedure OpE6; Procedure OpE7; Procedure OpE8; Procedure OpE9;
Procedure OpEA; Procedure OpEB; Procedure OpEC; Procedure OpED; Procedure OpEE; Procedure OpEF;
Procedure OpF0; Procedure OpF1; Procedure OpF2; Procedure OpF3; Procedure OpF4; Procedure OpF5;
Procedure OpF6; Procedure OpF7; Procedure OpF8; Procedure OpF9; Procedure OpFA; Procedure OpFB;
Procedure OpFC; Procedure OpFD; Procedure OpFE; Procedure OpFF;
Procedure OpCB00; Procedure OpCB01; Procedure OpCB02; Procedure OpCB03; Procedure OpCB04; Procedure OpCB05;
Procedure OpCB06; Procedure OpCB07; Procedure OpCB08; Procedure OpCB09; Procedure OpCB0A; Procedure OpCB0B;
Procedure OpCB0C; Procedure OpCB0D; Procedure OpCB0E; Procedure OpCB0F; Procedure OpCB10; Procedure OpCB11;
Procedure OpCB12; Procedure OpCB13; Procedure OpCB14; Procedure OpCB15; Procedure OpCB16; Procedure OpCB17;
Procedure OpCB18; Procedure OpCB19; Procedure OpCB1A; Procedure OpCB1B; Procedure OpCB1C; Procedure OpCB1D;
Procedure OpCB1E; Procedure OpCB1F; Procedure OpCB20; Procedure OpCB21; Procedure OpCB22; Procedure OpCB23;
Procedure OpCB24; Procedure OpCB25; Procedure OpCB26; Procedure OpCB27; Procedure OpCB28; Procedure OpCB29;
Procedure OpCB2A; Procedure OpCB2B; Procedure OpCB2C; Procedure OpCB2D; Procedure OpCB2E; Procedure OpCB2F;
Procedure OpCB30; Procedure OpCB31; Procedure OpCB32; Procedure OpCB33; Procedure OpCB34; Procedure OpCB35;
Procedure OpCB36; Procedure OpCB37; Procedure OpCB38; Procedure OpCB39; Procedure OpCB3A; Procedure OpCB3B;
Procedure OpCB3C; Procedure OpCB3D; Procedure OpCB3E; Procedure OpCB3F; Procedure OpCB40; Procedure OpCB41;
Procedure OpCB42; Procedure OpCB43; Procedure OpCB44; Procedure OpCB45; Procedure OpCB46; Procedure OpCB47;
Procedure OpCB48; Procedure OpCB49; Procedure OpCB4A; Procedure OpCB4B; Procedure OpCB4C; Procedure OpCB4D;
Procedure OpCB4E; Procedure OpCB4F; Procedure OpCB50; Procedure OpCB51; Procedure OpCB52; Procedure OpCB53;
Procedure OpCB54; Procedure OpCB55; Procedure OpCB56; Procedure OpCB57; Procedure OpCB58; Procedure OpCB59;
Procedure OpCB5A; Procedure OpCB5B; Procedure OpCB5C; Procedure OpCB5D; Procedure OpCB5E; Procedure OpCB5F;
Procedure OpCB60; Procedure OpCB61; Procedure OpCB62; Procedure OpCB63; Procedure OpCB64; Procedure OpCB65;
Procedure OpCB66; Procedure OpCB67; Procedure OpCB68; Procedure OpCB69; Procedure OpCB6A; Procedure OpCB6B;
Procedure OpCB6C; Procedure OpCB6D; Procedure OpCB6E; Procedure OpCB6F; Procedure OpCB70; Procedure OpCB71;
Procedure OpCB72; Procedure OpCB73; Procedure OpCB74; Procedure OpCB75; Procedure OpCB76; Procedure OpCB77;
Procedure OpCB78; Procedure OpCB79; Procedure OpCB7A; Procedure OpCB7B; Procedure OpCB7C; Procedure OpCB7D;
Procedure OpCB7E; Procedure OpCB7F; Procedure OpCB80; Procedure OpCB81; Procedure OpCB82; Procedure OpCB83;
Procedure OpCB84; Procedure OpCB85; Procedure OpCB86; Procedure OpCB87; Procedure OpCB88; Procedure OpCB89;
Procedure OpCB8A; Procedure OpCB8B; Procedure OpCB8C; Procedure OpCB8D; Procedure OpCB8E; Procedure OpCB8F;
Procedure OpCB90; Procedure OpCB91; Procedure OpCB92; Procedure OpCB93; Procedure OpCB94; Procedure OpCB95;
Procedure OpCB96; Procedure OpCB97; Procedure OpCB98; Procedure OpCB99; Procedure OpCB9A; Procedure OpCB9B;
Procedure OpCB9C; Procedure OpCB9D; Procedure OpCB9E; Procedure OpCB9F; Procedure OpCBA0; Procedure OpCBA1;
Procedure OpCBA2; Procedure OpCBA3; Procedure OpCBA4; Procedure OpCBA5; Procedure OpCBA6; Procedure OpCBA7;
Procedure OpCBA8; Procedure OpCBA9; Procedure OpCBAA; Procedure OpCBAB; Procedure OpCBAC; Procedure OpCBAD;
Procedure OpCBAE; Procedure OpCBAF; Procedure OpCBB0; Procedure OpCBB1; Procedure OpCBB2; Procedure OpCBB3;
Procedure OpCBB4; Procedure OpCBB5; Procedure OpCBB6; Procedure OpCBB7; Procedure OpCBB8; Procedure OpCBB9;
Procedure OpCBBA; Procedure OpCBBB; Procedure OpCBBC; Procedure OpCBBD; Procedure OpCBBE; Procedure OpCBBF;
Procedure OpCBC0; Procedure OpCBC1; Procedure OpCBC2; Procedure OpCBC3; Procedure OpCBC4; Procedure OpCBC5;
Procedure OpCBC6; Procedure OpCBC7; Procedure OpCBC8; Procedure OpCBC9; Procedure OpCBCA; Procedure OpCBCB;
Procedure OpCBCC; Procedure OpCBCD; Procedure OpCBCE; Procedure OpCBCF; Procedure OpCBD0; Procedure OpCBD1;
Procedure OpCBD2; Procedure OpCBD3; Procedure OpCBD4; Procedure OpCBD5; Procedure OpCBD6; Procedure OpCBD7;
Procedure OpCBD8; Procedure OpCBD9; Procedure OpCBDA; Procedure OpCBDB; Procedure OpCBDC; Procedure OpCBDD;
Procedure OpCBDE; Procedure OpCBDF; Procedure OpCBE0; Procedure OpCBE1; Procedure OpCBE2; Procedure OpCBE3;
Procedure OpCBE4; Procedure OpCBE5; Procedure OpCBE6; Procedure OpCBE7; Procedure OpCBE8; Procedure OpCBE9;
Procedure OpCBEA; Procedure OpCBEB; Procedure OpCBEC; Procedure OpCBED; Procedure OpCBEE; Procedure OpCBEF;
Procedure OpCBF0; Procedure OpCBF1; Procedure OpCBF2; Procedure OpCBF3; Procedure OpCBF4; Procedure OpCBF5;
Procedure OpCBF6; Procedure OpCBF7; Procedure OpCBF8; Procedure OpCBF9; Procedure OpCBFA; Procedure OpCBFB;
Procedure OpCBFC; Procedure OpCBFD; Procedure OpCBFE; Procedure OpCBFF;
Procedure OpDD09; Procedure OpDD19; Procedure OpDD21; Procedure OpDD22; Procedure OpDD23; Procedure OpDD24;
Procedure OpDD25; Procedure OpDD26; Procedure OpDD29; Procedure OpDD2A; Procedure OpDD2B; Procedure OpDD2C;
Procedure OpDD2D; Procedure OpDD2E; Procedure OpDD34; Procedure OpDD35; Procedure OpDD36; Procedure OpDD39;
Procedure OpDD44; Procedure OpDD45; Procedure OpDD46; Procedure OpDD4C; Procedure OpDD4D; Procedure OpDD4E;
Procedure OpDD54; Procedure OpDD55; Procedure OpDD56; Procedure OpDD5C; Procedure OpDD5D; Procedure OpDD5E;
Procedure OpDD60; Procedure OpDD61; Procedure OpDD62; Procedure OpDD63; Procedure OpDD64; Procedure OpDD65;
Procedure OpDD66; Procedure OpDD67; Procedure OpDD68; Procedure OpDD69; Procedure OpDD6A; Procedure OpDD6B;
Procedure OpDD6C; Procedure OpDD6D; Procedure OpDD6E; Procedure OpDD6F; Procedure OpDD70; Procedure OpDD71;
Procedure OpDD72; Procedure OpDD73; Procedure OpDD74; Procedure OpDD75; Procedure OpDD77; Procedure OpDD7C;
Procedure OpDD7D; Procedure OpDD7E; Procedure OpDD84; Procedure OpDD85; Procedure OpDD86; Procedure OpDD8C;
Procedure OpDD8D; Procedure OpDD8E; Procedure OpDD94; Procedure OpDD95; Procedure OpDD96; Procedure OpDD9C;
Procedure OpDD9D; Procedure OpDD9E; Procedure OpDDA4; Procedure OpDDA5; Procedure OpDDA6; Procedure OpDDAC;
Procedure OpDDAD; Procedure OpDDAE; Procedure OpDDB4; Procedure OpDDB5; Procedure OpDDB6; Procedure OpDDBC;
Procedure OpDDBD; Procedure OpDDBE; Procedure OpDDCB; Procedure OpDDDD; Procedure OpDDE1; Procedure OpDDE3;
Procedure OpDDE5; Procedure OpDDE9; Procedure OpDDF9; Procedure OpDDFD;
Procedure OpDDCB00; Procedure OpDDCB01; Procedure OpDDCB02; Procedure OpDDCB03; Procedure OpDDCB04; Procedure OpDDCB05;
Procedure OpDDCB06; Procedure OpDDCB07; Procedure OpDDCB08; Procedure OpDDCB09; Procedure OpDDCB0A; Procedure OpDDCB0B;
Procedure OpDDCB0C; Procedure OpDDCB0D; Procedure OpDDCB0E; Procedure OpDDCB0F; Procedure OpDDCB10; Procedure OpDDCB11;
Procedure OpDDCB12; Procedure OpDDCB13; Procedure OpDDCB14; Procedure OpDDCB15; Procedure OpDDCB16; Procedure OpDDCB17;
Procedure OpDDCB18; Procedure OpDDCB19; Procedure OpDDCB1A; Procedure OpDDCB1B; Procedure OpDDCB1C; Procedure OpDDCB1D;
Procedure OpDDCB1E; Procedure OpDDCB1F; Procedure OpDDCB20; Procedure OpDDCB21; Procedure OpDDCB22; Procedure OpDDCB23;
Procedure OpDDCB24; Procedure OpDDCB25; Procedure OpDDCB26; Procedure OpDDCB27; Procedure OpDDCB28; Procedure OpDDCB29;
Procedure OpDDCB2A; Procedure OpDDCB2B; Procedure OpDDCB2C; Procedure OpDDCB2D; Procedure OpDDCB2E; Procedure OpDDCB2F;
Procedure OpDDCB30; Procedure OpDDCB31; Procedure OpDDCB32; Procedure OpDDCB33; Procedure OpDDCB34; Procedure OpDDCB35;
Procedure OpDDCB36; Procedure OpDDCB37; Procedure OpDDCB38; Procedure OpDDCB39; Procedure OpDDCB3A; Procedure OpDDCB3B;
Procedure OpDDCB3C; Procedure OpDDCB3D; Procedure OpDDCB3E; Procedure OpDDCB3F; Procedure OpDDCB40; Procedure OpDDCB48;
Procedure OpDDCB50; Procedure OpDDCB58; Procedure OpDDCB60; Procedure OpDDCB68; Procedure OpDDCB70; Procedure OpDDCB78;
Procedure OpDDCB80; Procedure OpDDCB81; Procedure OpDDCB82; Procedure OpDDCB83; Procedure OpDDCB84; Procedure OpDDCB85;
Procedure OpDDCB86; Procedure OpDDCB87; Procedure OpDDCB88; Procedure OpDDCB89; Procedure OpDDCB8A; Procedure OpDDCB8B;
Procedure OpDDCB8C; Procedure OpDDCB8D; Procedure OpDDCB8E; Procedure OpDDCB8F; Procedure OpDDCB90; Procedure OpDDCB91;
Procedure OpDDCB92; Procedure OpDDCB93; Procedure OpDDCB94; Procedure OpDDCB95; Procedure OpDDCB96; Procedure OpDDCB97;
Procedure OpDDCB98; Procedure OpDDCB99; Procedure OpDDCB9A; Procedure OpDDCB9B; Procedure OpDDCB9C; Procedure OpDDCB9D;
Procedure OpDDCB9E; Procedure OpDDCB9F; Procedure OpDDCBA0; Procedure OpDDCBA1; Procedure OpDDCBA2; Procedure OpDDCBA3;
Procedure OpDDCBA4; Procedure OpDDCBA5; Procedure OpDDCBA6; Procedure OpDDCBA7; Procedure OpDDCBA8; Procedure OpDDCBA9;
Procedure OpDDCBAA; Procedure OpDDCBAB; Procedure OpDDCBAC; Procedure OpDDCBAD; Procedure OpDDCBAE; Procedure OpDDCBAF;
Procedure OpDDCBB0; Procedure OpDDCBB1; Procedure OpDDCBB2; Procedure OpDDCBB3; Procedure OpDDCBB4; Procedure OpDDCBB5;
Procedure OpDDCBB6; Procedure OpDDCBB7; Procedure OpDDCBB8; Procedure OpDDCBB9; Procedure OpDDCBBA; Procedure OpDDCBBB;
Procedure OpDDCBBC; Procedure OpDDCBBD; Procedure OpDDCBBE; Procedure OpDDCBBF; Procedure OpDDCBC0; Procedure OpDDCBC1;
Procedure OpDDCBC2; Procedure OpDDCBC3; Procedure OpDDCBC4; Procedure OpDDCBC5; Procedure OpDDCBC6; Procedure OpDDCBC7;
Procedure OpDDCBC8; Procedure OpDDCBC9; Procedure OpDDCBCA; Procedure OpDDCBCB; Procedure OpDDCBCC; Procedure OpDDCBCD;
Procedure OpDDCBCE; Procedure OpDDCBCF; Procedure OpDDCBD0; Procedure OpDDCBD1; Procedure OpDDCBD2; Procedure OpDDCBD3;
Procedure OpDDCBD4; Procedure OpDDCBD5; Procedure OpDDCBD6; Procedure OpDDCBD7; Procedure OpDDCBD8; Procedure OpDDCBD9;
Procedure OpDDCBDA; Procedure OpDDCBDB; Procedure OpDDCBDC; Procedure OpDDCBDD; Procedure OpDDCBDE; Procedure OpDDCBDF;
Procedure OpDDCBE0; Procedure OpDDCBE1; Procedure OpDDCBE2; Procedure OpDDCBE3; Procedure OpDDCBE4; Procedure OpDDCBE5;
Procedure OpDDCBE6; Procedure OpDDCBE7; Procedure OpDDCBE8; Procedure OpDDCBE9; Procedure OpDDCBEA; Procedure OpDDCBEB;
Procedure OpDDCBEC; Procedure OpDDCBED; Procedure OpDDCBEE; Procedure OpDDCBEF; Procedure OpDDCBF0; Procedure OpDDCBF1;
Procedure OpDDCBF2; Procedure OpDDCBF3; Procedure OpDDCBF4; Procedure OpDDCBF5; Procedure OpDDCBF6; Procedure OpDDCBF7;
Procedure OpDDCBF8; Procedure OpDDCBF9; Procedure OpDDCBFA; Procedure OpDDCBFB; Procedure OpDDCBFC; Procedure OpDDCBFD;
Procedure OpDDCBFE; Procedure OpDDCBFF;
Procedure OpED00; // ED00 is a ROM trap, and as such is not part of the core.
Procedure OpED40; Procedure OpED41; Procedure OpED42; Procedure OpED43; Procedure OpED44; Procedure OpED45;
Procedure OpED46; Procedure OpED47; Procedure OpED48; Procedure OpED49; Procedure OpED4A; Procedure OpED4B;
Procedure OpED4C; Procedure OpED4D; Procedure OpED4E; Procedure OpED4F; Procedure OpED50; Procedure OpED51;
Procedure OpED52; Procedure OpED53; Procedure OpED54; Procedure OpED55; Procedure OpED56; Procedure OpED57;
Procedure OpED58; Procedure OpED59; Procedure OpED5A; Procedure OpED5B; Procedure OpED5C; Procedure OpED5D;
Procedure OpED5E; Procedure OpED5F; Procedure OpED60; Procedure OpED61; Procedure OpED62; Procedure OpED63;
Procedure OpED64; Procedure OpED65; Procedure OpED66; Procedure OpED67; Procedure OpED68; Procedure OpED69;
Procedure OpED6A; Procedure OpED6B; Procedure OpED6C; Procedure OpED6D; Procedure OpED6E; Procedure OpED6F;
Procedure OpED70; Procedure OpED71; Procedure OpED72; Procedure OpED73; Procedure OpED74; Procedure OpED75;
Procedure OpED76; Procedure OpED78; Procedure OpED79; Procedure OpED7A; Procedure OpED7B; Procedure OpED7C;
Procedure OpED7D; Procedure OpED7E; Procedure OpEDA0; Procedure OpEDA1; Procedure OpEDA2; Procedure OpEDA3;
Procedure OpEDA8; Procedure OpEDA9; Procedure OpEDAA; Procedure OpEDAB; Procedure OpEDB0; Procedure OpEDB1;
Procedure OpEDB2; Procedure OpEDB3; Procedure OpEDB8; Procedure OpEDB9; Procedure OpEDBA; Procedure OpEDBB;
// Main Emulation loop procs
Procedure ExecuteEmulationLoop_FullSpeed;
Procedure ExecuteEmulationLoop_SpectrumSpeed;
Procedure ExecuteEndOfFrame;
Procedure InvokeInterrupt;
Procedure UpdateDisplay;
Procedure Activate64Colours(Activate: Boolean);
Function Get64ColourByte(Clr: Byte): Byte;
Procedure Update64ColourDIBs;
Procedure SetPalette64Entry(Index: Integer; Value: Byte);
Var
InInterrupt: Boolean;
BreakState,
TempState,
UndoState: TEmulationState;
FullSpeed: Boolean;
BitSetCount: Array[0..255] of DWord;
SetCount: Array[0..255] of Byte;
TwoComp: Array[0..255] of Integer;
Parity: Array[0..255] of Byte;
Ports,
Memory: Array[0..65535] of Byte;
RAMBanks: Array[0..8, 0..16383] of Byte;
AttrAddresses: Array[0..6144] Of DWord;
ScreenAddresses: Array[0..191] of DWord;
ScreenOffsets: Array[0..6143] of DWord;
DrawTSColTable: Array[0..(2*8*8*256*8)] of Byte;
FlashSwapTable: Array[0..127] of Byte;
DisplayPalette: TFColorTable;
DisplayPalette64: TFColorTable;
DisplayHandle: HWnd;
sDc: hDC;
Display: TFastDIB;
ScreenPointer: Pointer;
P1, P2, P3, P4: Pointer;
Registers: TZ80Registers;
PagedBank,
ElapsedFrames,
DisplayByte,
AttrByte: Byte;
DisablePaging,
ShadowScreen,
NeedDisplayUpdate,
BorderUpdate: Boolean;
DisplaybitsPtr: Pointer;
BorderDWord: DWord;
WinWidth,
WinHeight: Integer;
FrameTime,
OldTotalTs,
TempTotalTs: DWord;
OpCode: Byte;
IntTimer: DWord;
InterruptDue: Boolean;
StartLogging: Boolean = False;
DDCBPtr: Pointer;
MemAccess: Array[0..65535] of Byte;
Palette64: Array[0..63] of Byte;
Active64Colours: Boolean;
Last64Port: Byte;
Const
// Memory access flags
MemRead = 1;
MemWrite = 2;
MemReadWrite = 3;
MovePC = 4;
// OpCode Jump Tables
Ops: Array[0..$FF] of TProcedure =
(Op00,Op01,Op02,Op03,Op04,Op05,Op06,Op07,Op08,Op09,Op0A,Op0B,Op0C,Op0D,Op0E,Op0F,
Op10,Op11,Op12,Op13,Op14,Op15,Op16,Op17,Op18,Op19,Op1A,Op1B,Op1C,Op1D,Op1E,Op1F,
Op20,Op21,Op22,Op23,Op24,Op25,Op26,Op27,Op28,Op29,Op2A,Op2B,Op2C,Op2D,Op2E,Op2F,
Op30,Op31,Op32,Op33,Op34,Op35,Op36,Op37,Op38,Op39,Op3A,Op3B,Op3C,Op3D,Op3E,Op3F,
Op40,Op41,Op42,Op43,Op44,Op45,Op46,Op47,Op48,Op49,Op4A,Op4B,Op4C,Op4D,Op4E,Op4F,
Op50,Op51,Op52,Op53,Op54,Op55,Op56,Op57,Op58,Op59,Op5A,Op5B,Op5C,Op5D,Op5E,Op5F,
Op60,Op61,Op62,Op63,Op64,Op65,Op66,Op67,Op68,Op69,Op6A,Op6B,Op6C,Op6D,Op6E,Op6F,
Op70,Op71,Op72,Op73,Op74,Op75,Op76,Op77,Op78,Op79,Op7A,Op7B,Op7C,Op7D,Op7E,Op7F,
Op80,Op81,Op82,Op83,Op84,Op85,Op86,Op87,Op88,Op89,Op8A,Op8B,Op8C,Op8D,Op8E,Op8F,
Op90,Op91,Op92,Op93,Op94,Op95,Op96,Op97,Op98,Op99,Op9A,Op9B,Op9C,Op9D,Op9E,Op9F,
OpA0,OpA1,OpA2,OpA3,OpA4,OpA5,OpA6,OpA7,OpA8,OpA9,OpAA,OpAB,OpAC,OpAD,OpAE,OpAF,
OpB0,OpB1,OpB2,OpB3,OpB4,OpB5,OpB6,OpB7,OpB8,OpB9,OpBA,OpBB,OpBC,OpBD,OpBE,OpBF,
OpC0,OpC1,OpC2,OpC3,OpC4,OpC5,OpC6,OpC7,OpC8,OpC9,OpCA,OpCB,OpCC,OpCD,OpCE,OpCF,
OpD0,OpD1,OpD2,OpD3,OpD4,OpD5,OpD6,OpD7,OpD8,OpD9,OpDA,OpDB,OpDC,OpDD,OpDE,OpDF,
OpE0,OpE1,OpE2,OpE3,OpE4,OpE5,OpE6,OpE7,OpE8,OpE9,OpEA,OpEB,OpEC,OpED,OpEE,OpEF,
OpF0,OpF1,OpF2,OpF3,OpF4,OpF5,OpF6,OpF7,OpF8,OpF9,OpFA,OpFB,OpFC,OpFD,OpFE,OpFF);
CBOps: Array[0..$FF] of TProcedure =
(OpCB00,OpCB01,OpCB02,OpCB03,OpCB04,OpCB05,OpCB06,OpCB07,OpCB08,OpCB09,OpCB0A,OpCB0B,OpCB0C,OpCB0D,OpCB0E,OpCB0F,
OpCB10,OpCB11,OpCB12,OpCB13,OpCB14,OpCB15,OpCB16,OpCB17,OpCB18,OpCB19,OpCB1A,OpCB1B,OpCB1C,OpCB1D,OpCB1E,OpCB1F,
OpCB20,OpCB21,OpCB22,OpCB23,OpCB24,OpCB25,OpCB26,OpCB27,OpCB28,OpCB29,OpCB2A,OpCB2B,OpCB2C,OpCB2D,OpCB2E,OpCB2F,
OpCB30,OpCB31,OpCB32,OpCB33,OpCB34,OpCB35,OpCB36,OpCB37,OpCB38,OpCB39,OpCB3A,OpCB3B,OpCB3C,OpCB3D,OpCB3E,OpCB3F,
OpCB40,OpCB41,OpCB42,OpCB43,OpCB44,OpCB45,OpCB46,OpCB47,OpCB48,OpCB49,OpCB4A,OpCB4B,OpCB4C,OpCB4D,OpCB4E,OpCB4F,
OpCB50,OpCB51,OpCB52,OpCB53,OpCB54,OpCB55,OpCB56,OpCB57,OpCB58,OpCB59,OpCB5A,OpCB5B,OpCB5C,OpCB5D,OpCB5E,OpCB5F,
OpCB60,OpCB61,OpCB62,OpCB63,OpCB64,OpCB65,OpCB66,OpCB67,OpCB68,OpCB69,OpCB6A,OpCB6B,OpCB6C,OpCB6D,OpCB6E,OpCB6F,
OpCB70,OpCB71,OpCB72,OpCB73,OpCB74,OpCB75,OpCB76,OpCB77,OpCB78,OpCB79,OpCB7A,OpCB7B,OpCB7C,OpCB7D,OpCB7E,OpCB7F,
OpCB80,OpCB81,OpCB82,OpCB83,OpCB84,OpCB85,OpCB86,OpCB87,OpCB88,OpCB89,OpCB8A,OpCB8B,OpCB8C,OpCB8D,OpCB8E,OpCB8F,
OpCB90,OpCB91,OpCB92,OpCB93,OpCB94,OpCB95,OpCB96,OpCB97,OpCB98,OpCB99,OpCB9A,OpCB9B,OpCB9C,OpCB9D,OpCB9E,OpCB9F,
OpCBA0,OpCBA1,OpCBA2,OpCBA3,OpCBA4,OpCBA5,OpCBA6,OpCBA7,OpCBA8,OpCBA9,OpCBAA,OpCBAB,OpCBAC,OpCBAD,OpCBAE,OpCBAF,
OpCBB0,OpCBB1,OpCBB2,OpCBB3,OpCBB4,OpCBB5,OpCBB6,OpCBB7,OpCBB8,OpCBB9,OpCBBA,OpCBBB,OpCBBC,OpCBBD,OpCBBE,OpCBBF,
OpCBC0,OpCBC1,OpCBC2,OpCBC3,OpCBC4,OpCBC5,OpCBC6,OpCBC7,OpCBC8,OpCBC9,OpCBCA,OpCBCB,OpCBCC,OpCBCD,OpCBCE,OpCBCF,
OpCBD0,OpCBD1,OpCBD2,OpCBD3,OpCBD4,OpCBD5,OpCBD6,OpCBD7,OpCBD8,OpCBD9,OpCBDA,OpCBDB,OpCBDC,OpCBDD,OpCBDE,OpCBDF,
OpCBE0,OpCBE1,OpCBE2,OpCBE3,OpCBE4,OpCBE5,OpCBE6,OpCBE7,OpCBE8,OpCBE9,OpCBEA,OpCBEB,OpCBEC,OpCBED,OpCBEE,OpCBEF,
OpCBF0,OpCBF1,OpCBF2,OpCBF3,OpCBF4,OpCBF5,OpCBF6,OpCBF7,OpCBF8,OpCBF9,OpCBFA,OpCBFB,OpCBFC,OpCBFD,OpCBFE,OpCBFF);
DDOps: Array[0..$FF] of TProcedure =
(NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDD09,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDD19,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,
NULLOP,OpDD21,OpDD22,OpDD23,OpDD24,OpDD25,OpDD26,NULLOP,NULLOP,OpDD29,OpDD2A,OpDD2B,OpDD2C,OpDD2D,OpDD2E,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,OpDD34,OpDD35,OpDD36,NULLOP,NULLOP,OpDD39,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,OpDD44,OpDD45,OpDD46,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDD4C,OpDD4D,OpDD4E,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,OpDD54,OpDD55,OpDD56,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDD5C,OpDD5D,OpDD5E,NULLOP,
OpDD60,OpDD61,OpDD62,OpDD63,OpDD64,OpDD65,OpDD66,OpDD67,OpDD68,OpDD69,OpDD6A,OpDD6B,OpDD6C,OpDD6D,OpDD6E,OpDD6F,
OpDD70,OpDD71,OpDD72,OpDD73,OpDD74,OpDD75,NULLOP,OpDD77,NULLOP,NULLOP,NULLOP,NULLOP,OpDD7C,OpDD7D,OpDD7E,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,OpDD84,OpDD85,OpDD86,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDD8C,OpDD8D,OpDD8E,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,OpDD94,OpDD95,OpDD96,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDD9C,OpDD9D,OpDD9E,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,OpDDA4,OpDDA5,OpDDA6,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDDAC,OpDDAD,OpDDAE,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,OpDDB4,OpDDB5,OpDDB6,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDDBC,OpDDBD,OpDDBE,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDDCB,NULLOP,NULLOP,NULLOP,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDDDD,NULLOP,NULLOP,
NULLOP,OpDDE1,NULLOP,OpDDE3,NULLOP,OpDDE5,NULLOP,NULLOP,NULLOP,OpDDE9,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,
NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,NULLOP,OpDDF9,NULLOP,NULLOP,NULLOP,OpDDFD,NULLOP,NULLOP);
DDCBOps: Array[0..$FF] of TProcedure =
(OpDDCB00,OpDDCB01,OpDDCB02,OpDDCB03,OpDDCB04,OpDDCB05,OpDDCB06,OpDDCB07,OpDDCB08,OpDDCB09,OpDDCB0A,OpDDCB0B,OpDDCB0C,
OpDDCB0D,OpDDCB0E,OpDDCB0F,OpDDCB10,OpDDCB11,OpDDCB12,OpDDCB13,OpDDCB14,OpDDCB15,OpDDCB16,OpDDCB17,OpDDCB18,OpDDCB19,
OpDDCB1A,OpDDCB1B,OpDDCB1C,OpDDCB1D,OpDDCB1E,OpDDCB1F,OpDDCB20,OpDDCB21,OpDDCB22,OpDDCB23,OpDDCB24,OpDDCB25,OpDDCB26,
OpDDCB27,OpDDCB28,OpDDCB29,OpDDCB2A,OpDDCB2B,OpDDCB2C,OpDDCB2D,OpDDCB2E,OpDDCB2F,OpDDCB30,OpDDCB31,OpDDCB32,OpDDCB33,
OpDDCB34,OpDDCB35,OpDDCB36,OpDDCB37,OpDDCB38,OpDDCB39,OpDDCB3A,OpDDCB3B,OpDDCB3C,OpDDCB3D,OpDDCB3E,OpDDCB3F,OpDDCB40,
OpDDCB40,OpDDCB40,OpDDCB40,OpDDCB40,OpDDCB40,OpDDCB40,OpDDCB40,OpDDCB48,OpDDCB48,OpDDCB48,OpDDCB48,OpDDCB48,OpDDCB48,
OpDDCB48,OpDDCB48,OpDDCB50,OpDDCB50,OpDDCB50,OpDDCB50,OpDDCB50,OpDDCB50,OpDDCB50,OpDDCB50,OpDDCB58,OpDDCB58,OpDDCB58,
OpDDCB58,OpDDCB58,OpDDCB58,OpDDCB58,OpDDCB58,OpDDCB60,OpDDCB60,OpDDCB60,OpDDCB60,OpDDCB60,OpDDCB60,OpDDCB60,OpDDCB60,
OpDDCB68,OpDDCB68,OpDDCB68,OpDDCB68,OpDDCB68,OpDDCB68,OpDDCB68,OpDDCB68,OpDDCB70,OpDDCB70,OpDDCB70,OpDDCB70,OpDDCB70,
OpDDCB70,OpDDCB70,OpDDCB70,OpDDCB78,OpDDCB78,OpDDCB78,OpDDCB78,OpDDCB78,OpDDCB78,OpDDCB78,OpDDCB78,OpDDCB80,OpDDCB81,
OpDDCB82,OpDDCB83,OpDDCB84,OpDDCB85,OpDDCB86,OpDDCB87,OpDDCB88,OpDDCB89,OpDDCB8A,OpDDCB8B,OpDDCB8C,OpDDCB8D,OpDDCB8E,
OpDDCB8F,OpDDCB90,OpDDCB91,OpDDCB92,OpDDCB93,OpDDCB94,OpDDCB95,OpDDCB96,OpDDCB97,OpDDCB98,OpDDCB99,OpDDCB9A,OpDDCB9B,
OpDDCB9C,OpDDCB9D,OpDDCB9E,OpDDCB9F,OpDDCBA0,OpDDCBA1,OpDDCBA2,OpDDCBA3,OpDDCBA4,OpDDCBA5,OpDDCBA6,OpDDCBA7,OpDDCBA8,
OpDDCBA9,OpDDCBAA,OpDDCBAB,OpDDCBAC,OpDDCBAD,OpDDCBAE,OpDDCBAF,OpDDCBB0,OpDDCBB1,OpDDCBB2,OpDDCBB3,OpDDCBB4,OpDDCBB5,
OpDDCBB6,OpDDCBB7,OpDDCBB8,OpDDCBB9,OpDDCBBA,OpDDCBBB,OpDDCBBC,OpDDCBBD,OpDDCBBE,OpDDCBBF,OpDDCBC0,OpDDCBC1,OpDDCBC2,
OpDDCBC3,OpDDCBC4,OpDDCBC5,OpDDCBC6,OpDDCBC7,OpDDCBC8,OpDDCBC9,OpDDCBCA,OpDDCBCB,OpDDCBCC,OpDDCBCD,OpDDCBCE,OpDDCBCF,
OpDDCBD0,OpDDCBD1,OpDDCBD2,OpDDCBD3,OpDDCBD4,OpDDCBD5,OpDDCBD6,OpDDCBD7,OpDDCBD8,OpDDCBD9,OpDDCBDA,OpDDCBDB,OpDDCBDC,
OpDDCBDD,OpDDCBDE,OpDDCBDF,OpDDCBE0,OpDDCBE1,OpDDCBE2,OpDDCBE3,OpDDCBE4,OpDDCBE5,OpDDCBE6,OpDDCBE7,OpDDCBE8,OpDDCBE9,
OpDDCBEA,OpDDCBEB,OpDDCBEC,OpDDCBED,OpDDCBEE,OpDDCBEF,OpDDCBF0,OpDDCBF1,OpDDCBF2,OpDDCBF3,OpDDCBF4,OpDDCBF5,OpDDCBF6,
OpDDCBF7,OpDDCBF8,OpDDCBF9,OpDDCBFA,OpDDCBFB,OpDDCBFC,OpDDCBFD,OpDDCBFE,OpDDCBFF);
EDOps: Array [0..$FF] of TProcedure =
(OpED00,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
OpED40,OpED41,OpED42,OpED43,OpED44,OpED45,OpED46,OpED47,OpED48,OpED49,OpED4A,OpED4B,OpED4C,OpED4D,OpED4E,OpED4F,
OpED50,OpED51,OpED52,OpED53,OpED54,OpED55,OpED56,OpED57,OpED58,OpED59,OpED5A,OpED5B,OpED5C,OpED5D,OpED5E,OpED5F,
OpED60,OpED61,OpED62,OpED63,OpED64,OpED65,OpED66,OpED67,OpED68,OpED69,OpED6A,OpED6B,OpED6C,OpED6D,OpED6E,OpED6F,
OpED70,OpED71,OpED72,OpED73,OpED74,OpED75,OpED76,NULLED,OpED78,OpED79,OpED7A,OpED7B,OpED7C,OpED7D,OpED7E,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
OpEDA0,OpEDA1,OpEDA2,OpEDA3,NULLED,NULLED,NULLED,NULLED,OpEDA8,OpEDA9,OpEDAA,OpEDAB,NULLED,NULLED,NULLED,NULLED,
OpEDB0,OpEDB1,OpEDB2,OpEDB3,NULLED,NULLED,NULLED,NULLED,OpEDB8,OpEDB9,OpEDBA,OpEDBB,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,
NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED,NULLED);
// Spectrum Colour Palette
TFSpecBack: TFColor = (b:$26;g:$26;r:$26);
TFSpecBlack: TFcolor = (b:0;g:0;r:0);
TFSpecBlue: TFColor = (b:202;g:0;r:0);
TFSpecRed: TFColor = (b:0;g:0;r:202);
TFSpecMagenta: TFColor = (b:202;g:0;r:202);
TFSpecGreen: TFColor = (b:0;g:202;r:0);
TFSpecCyan: TFColor = (b:202;g:202;r:0);
TFSpecYellow: TFColor = (b:0;g:202;r:202);
TFSpecWhite: TFColor = (b:197;g:199;r:197);
TFSpecBlueB: TFColor = (b:255;g:0;r:0);
TFSpecRedB: TFColor = (b:0;g:0;r:255);
TFSpecMagentaB: TFColor = (b:255;g:0;r:255);
TFSpecGreenB: TFColor = (b:0;g:255;r:0);
TFSpecCyanB: TFColor = (b:255;g:255;r:0);
TFSpecYellowB: TFColor = (b:0;g:255;r:255);
TFSpecWhiteB: TFColor = (b:255;g:255;r:255);
implementation
Uses ConsoleOutput,BASinMain, Utility, Display, LogWind, Sound, Evaluate, PrinterOutput, Profiling, CPUDisplay, MemMap; //basinmidi
Function INITEmulation: Boolean;
Begin
DebugLog('Init Emulation');
Filename := BASinDir+'\48.Rom';
Result := LoadROM(Memory);
If Result Then Begin
Filename := BASinDir+'\Plus2.Rom';
LoadROM128k(Rom128k);
ModifyROM;
BuildTables;
SetUpGraphics;
Reset;
InInterrupt := False;
ControlEmulation(True);
InsertList := TStringlist.Create;
ClipList := TStringlist.Create;
BASinOutput.Running := False;
SaveEmulationState(UndoState);
InitWorkerThread;
End;
End;
Procedure CloseEmulation;
Begin
DebugLog('Close Emulation');
CloseWorkerThread;
InsertList.Free;
ClipList.Free;
FastCore.Display.Free;
FastCore.Display := Nil;
CloseSound;
End;
Procedure Reset;
Begin
PagedBank := 0;
RAMDiskNeedsInit := True;
PageROM(False);
ScreenPointer := @Memory[16384];
ShadowScreen := False;
DisablePaging := False;
PutWord(@Memory[PROG], 65535);
PutWord(@Memory[VARS], 65535);
With Registers do Begin
PC := 0; F := 0; I := 0; R := 0;
A := 0; B := 0; C := 0; D := 0; H := 0; L := 0;
An := 0; Bn := 0; Cn := 0; Dn := 0; Hn := 0; Ln := 0;
IX := 0; IY := 0; SP := 0; SPn := 0;
IntMode := 0;
IntsEnabled := False;
HaltEMU := False;
FlashState := 0;
End;
ElapsedFrames := 0;
ClearKeys;
ResetCounter := 0;
TrashScreenMem;
BorderDWord := 0;
AYRegisters.R7 := 255;
AYRegisters.RandomSeed1 := 0;
AYRegisters.RandomSeed2 := 1;
End;
Procedure TrashScreenMem;
Var
F: DWord;
Begin
// Produces screen trash - a nice touch on a reset.
For F := 0 To 6911 Do
Memory[F+16384] := Random(256);
End;
Procedure BuildTables;
Var
B: Byte;
F, G, R, SetCounter: Integer;
P: Boolean;
fstream: tfilestream;
Begin
DebugLog('Build Emulation LUTs');
For F := 0 To 255 Do Begin
P := True;
SetCounter := 0;
For G := 0 To 7 do
If (F And (1 Shl G)) <> 0 Then Begin
P := Not P;
Inc(SetCounter);
End;
If P then Parity[F] := 1 Else Parity[F] := 0;
B := F;
If ((B And 128) = 128) Then
R := -(256 - B)
Else
R := B;
TwoComp[F] := R;
SetCount[F] := SetCounter;
BitSetCount[F] := 192 - (SetCounter * 24);
BitSetCount[F] := (BitSetCount[F] Shl 16) + (BitSetCount[F] Shl 8) + BitSetCount[F];
End;
End;
Procedure SetUpGraphics;
Begin
DebugLog('Set up Emulation Graphics');
SetUpScreenLUT;
PrepareSpecColourTable;
NeedDisplayUpdate := True;
FastCore.Display := TFastDIB.Create;
FastCore.Display.SetSize(320, -240, 8);
FastCore.Display.Colors := @DisplayPalette;
FastCore.Display.UpdateColors;
End;
Procedure SetUpScreenLUT;
Var
YPoint, XPoint, row, Address, Block, Offset: DWord;
Begin
DebugLog('Create Screen LUT');
For Address := 0 To 6143 Do Begin
XPoint := Address And 31;
Row := (Address And 224) Div 32;
Offset := (Address And 1792) Div 256;
Block := (Address And 6144) Div 2048;
YPoint := Offset+Row*8+Block*64;
ScreenOffsets[Address] := YPoint;
AttrAddresses[Address] := 6144 + ((((YPoint) Div 8)*32)+XPoint);
If Address Mod 32 = 0 Then ScreenAddresses[YPoint] := Address;
End;
BuildPalette([TFSpecBlack, TFSpecBlue, TFSpecRed, TFSpecMagenta, TFSpecGreen, TFSpecCyan, TFSpecYellow, TFSpecWhite,
TFSpecBlack, TFSpecBlueB, TFSpecRedB, TFSpecMagentaB, TFSpecGreenB, TFSpecCyanB, TFSpecYellowB, TFSpecWhiteB]);
End;
Function GetScreenAddr(X, Y: DWord): DWord;
Begin
Result := ScreenAddresses[Y]+(X Div 8);
End;
Function GetScreenCoord(Address: Word): TPoint;
Begin
Dec(Address, 16384);
Result.X := Address and 31;
Result.Y := ScreenOffsets[Address];
End;
Function GetAttrAddr(X, Y: Integer): DWord;
Begin
Result := X Div 8 + ((Y Div 8) * 32);
End;
Procedure BuildPalette(Clrs: Array of TFColor);
Var
F: Integer;
Begin
For F := 0 To 15 Do begin
DisplayPalette[F].r := Clrs[F].r;
DisplayPalette[F].g := Clrs[F].g;
DisplayPalette[F].b := Clrs[F].b;
_2xSaIColours16[F] := (((Clrs[F].r and 248) Shr 3) shl 10)
+ (((Clrs[F].g and 248) Shr 3) shl 5)
+ (((Clrs[F].b and 248) Shr 3));
_Hq2xColours16[F] := ((Clrs[F].r and 248) Shl 8)
+ ((Clrs[F].g and 252) Shl 3)
+ ((Clrs[F].b and 248) Shr 3);
End;
End;
Procedure PrepareSpecColourTable;
Var
TabPtr: DWord;
Bright, Paper, Ink, N: Byte;
BitMask, BitCount: Byte;
Begin
TabPtr := 0;
For Bright := 0 To 1 Do Begin
For Paper := 0 To 7 Do Begin
For Ink := 0 To 7 Do Begin
For N := 0 To 255 Do Begin
BitMask := 128;
For BitCount := 0 To 7 Do Begin
If N And BitMask > 0 Then
DrawTSColTable[TabPtr] := (8*Bright) + Ink
Else DrawTSColTable[TabPtr] := (8*Bright) + Paper;
Inc(TabPtr);
BitMask := BitMask Shr 1;
End;
End;
End;
End;
End;
For N := 0 To 127 Do Begin
FlashSwapTable[N] := (N And 64) Or ((N And 7) Shl 3) Or ((N And 56) Shr 3);
End;
End;
Procedure EmulateRET;
Begin
Registers.PC := GetWord(@Memory[Registers.SP]);
Inc(Registers.SP, 2);
End;
Procedure EmulateCALL(Address: Word);
Begin
Dec(Registers.SP, 2);
PutWord(@Memory[Registers.SP], Registers.PC+3);
Registers.PC := Address;
End;
Procedure EmulatePUSH(Value: Word);
Begin
Dec(Registers.SP, 2);
PutWord(@Memory[Registers.SP], Value);
End;
Function EmulatePOP: Word;
Begin
Result := GetWord(@Memory[Registers.SP]);
Inc(Registers.SP, 2);
End;
Function GetByte(WordPtr: Pointer): Byte;
asm
mov al, [eax]
End;
Function GetWord(WordPtr: Pointer): Word;
Asm
mov ax, [eax]
End;
Function GetDWord(WordPtr: Pointer): DWord;
Asm
mov eax, [eax]
End;
Procedure PutWord(WordPtr: Pointer; Value: Word);
Asm
mov word [eax], dx
End;
Procedure PutByte(WordPtr: Pointer; Value: Byte);
Asm
mov byte [eax], dl
End;
Procedure PutDWord(WordPtr: Pointer; Value: DWord);
Asm
mov dword [eax], edx
End;
Procedure IncWord(WordPtr: Pointer);
Asm
inc Word [eax]
End;
Procedure DecWord(WordPtr: Pointer);
Asm
dec Word [eax]
End;
// start core procs
Procedure NULLOP;
Begin
asm
mov edx, 8
ret
end;
End;
Procedure NULLED;
Begin
asm
Inc Word [esi+TZ80Registers.PC]
mov edx, 8
end;
End;
Procedure Op00;
Begin // NOP
asm
Inc Word [esi+TZ80Registers.PC]
mov edx, 4
end;
End;
Procedure Op01;
Begin // LD BC,NN
asm
mov Word [esi+TZ80Registers.C], dx // dx = PC+1, PC+2
add Word [esi+TZ80Registers.PC], 3
mov edx,10
end;
End;
Procedure Op02;
Begin // LD (BC),A
asm
mov ax, Word [esi+TZ80Registers.C]
mov dl, [esi+TZ80Registers.A]
Inc Word [esi+TZ80Registers.PC]
cmp eax, $4000
jb @NoWrite
mov Byte [edi+eax], dl
or Byte [MemAccess[0]+eax], MemWrite
@NoWrite:
mov edx,7
end;
End;
Procedure Op03;
Begin // INC BC
asm
inc Word [esi+TZ80Registers.C]
inc Word [esi+TZ80Registers.PC]
mov edx,6
end;
End;
Procedure Op04;
Begin // INC B
asm
lea ecx, [esi+TZ80Registers.B]
mov ah, [esi+TZ80Registers.F]
mov al, [ecx]
sahf
inc al
lahf
mov Byte [ecx],al
seto ch
mov cl,al
shl ch,2
and ah,11010001b
and cl,00101000b
or ah,ch
or ah,cl
mov Byte [esi+TZ80Registers.F], ah
inc Word [esi+TZ80Registers.PC]
mov edx,4
end;
End;
Procedure Op05;
Begin // DEC B
asm
lea ecx, [esi+TZ80Registers.B]
mov ah, [esi+TZ80Registers.F]
mov al, [ecx]
sahf
dec al
lahf
mov Byte [ecx],al
mov cl,al
seto ch
and ah,11010011b
shl ch,2
and cl,00101000b
or ah,ch
or ah,cl
or ah,2
mov Byte [esi+TZ80Registers.F], ah
inc Word [esi+TZ80Registers.PC]
mov edx,4
end;
End;
Procedure Op06;
Begin // LD B,N
asm
add word [esi+TZ80Registers.PC], 2
mov byte [esi+TZ80Registers.B],dl
mov edx,7
end;
End;
Procedure Op07;
Begin // RLCA --503-0C
Asm
mov cl,[esi+TZ80Registers.F]
mov al,[esi+TZ80Registers.A]
and cl,11000100b
rol al,1
adc cl,0
mov Byte [esi+TZ80Registers.A],al
and al,00101000b
or cl,al
mov Byte [esi+TZ80Registers.F],cl
inc Word [esi+TZ80Registers.PC]
mov edx,4
End;
End;
Procedure Op08;
Begin // EX AF,AF'
asm
mov cx, Word [esi+TZ80Registers.F]
mov dx, Word [esi+TZ80Registers.Fn]
mov Word [esi+TZ80Registers.Fn], cx
mov Word [esi+TZ80Registers.F], dx
inc Word [esi+TZ80Registers.PC]
mov edx,4
end;
End;
Procedure Op09;
Begin // ADD HL,BC
asm
mov ax,Word [esi+TZ80Registers.C]
mov cx,Word [esi+TZ80Registers.L]
add cx,ax
lahf
mov Word [esi+TZ80Registers.L],cx
mov cl,[esi+TZ80Registers.F]
and ah,00010001b // H,C affected by addition. N is cleared
and cl,11000100b // S,Z,V are unaffected
and ch,00101000b // 5,3 from H after addition
or ah,cl
or ah,ch
mov Byte [esi+TZ80Registers.F],ah
inc Word [esi+TZ80Registers.PC]
mov edx,11
end;
End;
Procedure Op0A;
Begin // LD A,(BC)
asm
mov ax, Word [esi+TZ80Registers.C]
or Byte [MemAccess[0]+eax], MemRead
mov al, Byte [edi+eax]
mov Byte [esi+TZ80Registers.A], al
inc Word [esi+TZ80Registers.PC]
mov edx,7
end;
End;
Procedure Op0B;
Begin // DEC BC
Asm
dec Word [esi+TZ80Registers.C]
inc Word [esi+TZ80Registers.PC]
mov edx,6
End;
End;
Procedure Op0C;
Begin // INC C
asm
lea ecx, [esi+TZ80Registers.C]
mov ah,[esi+TZ80Registers.F]
mov al,[ecx]
sahf
inc al
lahf
mov [ecx],al
seto ch
mov cl,al
shl ch,2
and ah,11010001b
and cl,00101000b
or ah,ch
or ah,cl
mov Byte [esi+TZ80Registers.F],ah
inc Word [esi+TZ80Registers.PC]
mov edx,4
end;
End;
Procedure Op0D;
Begin // DEC C
asm
lea ecx, [esi+TZ80Registers.C]
mov ah, [esi+TZ80Registers.F]
mov al, [ecx]
sahf
dec al
lahf
mov [ecx],al
mov cl,al
seto ch
and ah,11010011b
shl ch,2
and cl,00101000b
or ah,ch
or ah,cl
or ah,2
mov Byte [esi+TZ80Registers.F],ah
inc Word [esi+TZ80Registers.PC]
mov edx,4
end;
End;
Procedure Op0E;
Begin // LD C,N
asm
add Word [esi+TZ80Registers.PC], 2
mov Byte [esi+TZ80Registers.C],dl
mov edx,7
end;
End;
Procedure Op0F;
Begin // RRCA --503-0C
Asm
mov cl,[esi+TZ80Registers.F]
mov al,[esi+TZ80Registers.A]
and cl,11000100b
ror al,1
adc cl,0
mov Byte [esi+TZ80Registers.A],al
and al,00101000b
or cl,al
mov Byte [esi+TZ80Registers.F],cl
inc Word [esi+TZ80Registers.PC]
mov edx,4
End;
End;
Procedure Op10;
Begin // DJNZ e
asm
Add Word [esi+TZ80Registers.PC], 2
Dec Byte [esi+TZ80Registers.B]
mov al, dl
jz @skip
cbw
add Word [esi+TZ80Registers.PC], ax
mov edx,13
ret
@Skip:
mov edx,8
end;
End;
Procedure Op11;
Begin // LD DE,NN
asm
mov Word [esi+TZ80Registers.E],dx
add Word [esi+TZ80Registers.PC], 3
mov edx,10
end;