366
368
static store_func_ptr_t store_zero_tab[16] = {
367
store_zero_0, store_zero_1, store_zero_2, store_zero_3,
368
store_zero_4, store_zero_5, store_zero_6, store_zero_7,
369
store_zero_8, store_zero_9, store_zero_A, store_zero_B,
370
store_zero_C, store_zero_D, store_zero_E, store_zero_F
369
store_zero_0, store_zero_1, store_zero_2, store_zero_3,
370
store_zero_4, store_zero_5, store_zero_6, store_zero_7,
371
store_zero_8, store_zero_9, store_zero_A, store_zero_B,
372
store_zero_C, store_zero_D, store_zero_E, store_zero_F
373
375
static store_func_ptr_t store_ram_tab[16] = {
374
store_ram_0, store_ram_1, store_ram_2, store_ram_3,
375
store_ram_4, store_ram_5, store_ram_6, store_ram_7,
376
store_ram_8, store_ram_9, store_ram_A, store_ram_B,
377
store_ram_C, store_ram_D, store_ram_E, store_ram_F
376
store_ram_0, store_ram_1, store_ram_2, store_ram_3,
377
store_ram_4, store_ram_5, store_ram_6, store_ram_7,
378
store_ram_8, store_ram_9, store_ram_A, store_ram_B,
379
store_ram_C, store_ram_D, store_ram_E, store_ram_F
380
382
static read_func_ptr_t read_ram_tab[16] = {
381
read_ram_0, read_ram_1, read_ram_2, read_ram_3,
382
read_ram_4, read_ram_5, read_ram_6, read_ram_7,
383
read_ram_8, read_ram_9, read_ram_A, read_ram_B,
384
read_ram_C, read_ram_D, read_ram_E, read_ram_F
383
read_ram_0, read_ram_1, read_ram_2, read_ram_3,
384
read_ram_4, read_ram_5, read_ram_6, read_ram_7,
385
read_ram_8, read_ram_9, read_ram_A, read_ram_B,
386
read_ram_C, read_ram_D, read_ram_E, read_ram_F
387
389
static read_func_ptr_t read_zero_tab[16] = {
388
read_zero_0, read_zero_1, read_zero_2, read_zero_3,
389
read_zero_4, read_zero_5, read_zero_6, read_zero_7,
390
read_zero_8, read_zero_9, read_zero_A, read_zero_B,
391
read_zero_C, read_zero_D, read_zero_E, read_zero_F
390
read_zero_0, read_zero_1, read_zero_2, read_zero_3,
391
read_zero_4, read_zero_5, read_zero_6, read_zero_7,
392
read_zero_8, read_zero_9, read_zero_A, read_zero_B,
393
read_zero_C, read_zero_D, read_zero_E, read_zero_F
395
397
void store_zeroX(WORD addr, BYTE value)
398
400
cbm2mem_set_bank_exec(value);
401
cbm2mem_set_bank_ind(value);
401
} else if (addr == 1) {
402
cbm2mem_set_bank_ind(value);
404
406
BYTE rom_read(WORD addr)
473
489
void store_io(WORD addr, BYTE value)
475
491
switch (addr & 0xf800) {
477
rom_store(addr, value); /* video RAM mapped here... */
478
if (addr >= 0xd400) {
479
colorram_store(addr, value);
483
switch(addr & 0xff00) {
485
vicii_store(addr, value);
488
return; /* disk units */
490
sid_store((WORD)(addr & 0xff), value);
493
return; /* coprocessor */
495
cia1_store((WORD)(addr & 0x0f), value);
498
acia1_store((WORD)(addr & 0x03), value);
501
tpi1_store((WORD)(addr & 0x07), value);
504
tpi2_store((WORD)(addr & 0x07), value);
493
rom_store(addr, value); /* video RAM mapped here... */
494
if (addr >= 0xd400) {
495
colorram_store(addr, value);
499
switch (addr & 0xff00) {
501
vicii_store(addr, value);
504
return; /* disk units */
506
sid_store((WORD)(addr & 0xff), value);
509
return; /* coprocessor */
511
cia1_store((WORD)(addr & 0x0f), value);
514
acia1_store((WORD)(addr & 0x03), value);
517
tpi1_store((WORD)(addr & 0x07), value);
520
tpi2_store((WORD)(addr & 0x07), value);
510
526
BYTE read_io(WORD addr)
512
528
switch (addr & 0xf800) {
514
return rom_read(addr);
516
switch (addr & 0xff00) {
518
return vicii_read(addr);
520
return read_unused(addr);
522
return sid_read(addr);
524
return read_unused(addr);
526
return cia1_read((WORD)(addr & 0x0f));
528
return acia1_read((WORD)(addr & 0x03));
530
/* FIXME: VIC-II irq? */
531
/* if ((machine_class == VICE_MACHINE_CBM5x0) && ((addr & 7) == 2)) {
532
return tpi1_read(addr&7)|1; } */
533
return tpi1_read((WORD)(addr & 0x07));
535
return tpi2_read((WORD)(addr & 0x07));
530
return rom_read(addr);
532
switch (addr & 0xff00) {
534
return vicii_read(addr);
536
return read_unused(addr);
538
return sid_read(addr);
540
return read_unused(addr);
542
return cia1_read((WORD)(addr & 0x0f));
544
return acia1_read((WORD)(addr & 0x03));
546
/* FIXME: VIC-II irq? */
547
/* if ((machine_class == VICE_MACHINE_CBM5x0) && ((addr & 7) == 2)) {
548
return tpi1_read(addr&7)|1; } */
549
return tpi1_read((WORD)(addr & 0x07));
551
return tpi2_read((WORD)(addr & 0x07));
538
554
return read_unused(addr);
650
for (j = 255; j >= 0; j--) {
651
_mem_read_tab[i][j] = read_ram_tab[i];
652
_mem_write_tab[i][j] = store_ram_tab[i];
653
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
655
_mem_write_tab[i][0] = store_zero_tab[i];
656
_mem_read_tab[i][0] = read_zero_tab[i];
659
for (j = 255; j >= 0; j--) {
660
_mem_read_tab[i][j] = read_ram_tab[i];
661
_mem_write_tab[i][j] = store_ram_tab[i];
662
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
664
_mem_write_tab[i][0] = store_zero_tab[i];
665
_mem_read_tab[i][0] = read_zero_tab[i];
668
if (ramsize >= 128) {
669
for (j = 255; j >= 0; j--) {
670
_mem_read_tab[i][j] = read_ram_tab[i];
671
_mem_write_tab[i][j] = store_ram_tab[i];
672
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
674
_mem_write_tab[i][0] = store_zero_tab[i];
675
_mem_read_tab[i][0] = read_zero_tab[i];
680
if (ramsize >= 256) {
681
for (j = 255; j >= 0; j--) {
682
_mem_read_tab[i][j] = read_ram_tab[i];
683
_mem_write_tab[i][j] = store_ram_tab[i];
684
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
686
_mem_write_tab[i][0] = store_zero_tab[i];
687
_mem_read_tab[i][0] = read_zero_tab[i];
693
if (ramsize >= 512) {
694
for (j = 255; j >= 0; j--) {
695
_mem_read_tab[i][j] = read_ram_tab[i];
696
_mem_write_tab[i][j] = store_ram_tab[i];
697
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
699
_mem_write_tab[i][0] = store_zero_tab[i];
700
_mem_read_tab[i][0] = read_zero_tab[i];
710
if (ramsize >= 1024) {
711
for (j = 255; j >= 0; j--) {
712
_mem_read_tab[i][j] = read_ram_tab[i];
713
_mem_write_tab[i][j] = store_ram_tab[i];
714
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
716
_mem_write_tab[i][0] = store_zero_tab[i];
717
_mem_read_tab[i][0] = read_zero_tab[i];
720
/* fallback for ramsize < some_value */
721
for (j = 255; j >= 0; j--) {
722
_mem_read_tab[i][j] = read_unused;
723
_mem_write_tab[i][j] = store_dummy;
724
_mem_read_base_tab[i][j] = NULL;
726
_mem_write_tab[i][0] = store_zeroX;
729
for (j = 0; j < 0x08; j++) {
730
_mem_read_tab[i][j] = read_ram_F;
731
_mem_write_tab[i][j] = store_ram_F;
732
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
734
for (; j < 0xc0; j++) { /* 0800-BFFF */
735
_mem_read_tab[i][j] = rom_read;
736
_mem_write_tab[i][j] = store_dummy;
737
_mem_read_base_tab[i][j] = mem_rom + (j << 8);
739
for (; j < 0xd0; j++) { /* C000-CFFF */
740
_mem_read_tab[i][j] = read_chargen;
741
_mem_write_tab[i][j] = store_dummy;
742
_mem_read_base_tab[i][j] = mem_chargen_rom + ((j << 8) & 0x0f);
744
for (; j < 0xe0; j++) { /* D000-DFFF */
745
_mem_read_tab[i][j] = read_io;
746
_mem_write_tab[i][j] = store_io;
747
_mem_read_base_tab[i][j] = NULL;
749
for (; j < 0x100; j++) {
750
_mem_read_tab[i][j] = rom_read;
751
_mem_write_tab[i][j] = store_dummy;
752
_mem_read_base_tab[i][j] = mem_rom + (j << 8);
756
for (j = 0x08; j < 0x10; j++) {
757
_mem_read_tab[i][j] = read_ram_F;
758
_mem_write_tab[i][j] = store_ram_F;
759
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
763
for (j=0x10;j<0x20;j++) {
764
_mem_read_tab[i][j] = read_ram_F;
765
_mem_write_tab[i][j] = store_ram_F;
766
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
770
for (j = 0x20; j < 0x40; j++) {
771
_mem_read_tab[i][j] = read_ram_F;
772
_mem_write_tab[i][j] = store_ram_F;
773
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
777
for (j = 0x40; j < 0x60; j++) {
778
_mem_read_tab[i][j] = read_ram_F;
779
_mem_write_tab[i][j] = store_ram_F;
780
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
784
for (j = 0x60; j < 0x80; j++) {
785
_mem_read_tab[i][j] = read_ram_F;
786
_mem_write_tab[i][j] = store_ram_F;
787
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
791
for (j = 0xc0; j < 0xd0; j++) {
792
_mem_read_tab[i][j] = read_ram_F;
793
_mem_write_tab[i][j] = store_ram_F;
794
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
798
_mem_write_tab[i][0] = store_zero_F;
799
_mem_read_tab[i][0] = read_zero_F;
800
_mem_read_base_tab[i][0] = mem_ram + 0xf0000;
670
for (j = 255; j >= 0; j--) {
671
_mem_read_tab[i][j] = read_ram_tab[i];
672
_mem_write_tab[i][j] = store_ram_tab[i];
673
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
675
_mem_write_tab[i][0] = store_zero_tab[i];
676
_mem_read_tab[i][0] = read_zero_tab[i];
679
for (j = 255; j >= 0; j--) {
680
_mem_read_tab[i][j] = read_ram_tab[i];
681
_mem_write_tab[i][j] = store_ram_tab[i];
682
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
684
_mem_write_tab[i][0] = store_zero_tab[i];
685
_mem_read_tab[i][0] = read_zero_tab[i];
688
if (ramsize >= 128) {
689
for (j = 255; j >= 0; j--) {
690
_mem_read_tab[i][j] = read_ram_tab[i];
691
_mem_write_tab[i][j] = store_ram_tab[i];
692
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
694
_mem_write_tab[i][0] = store_zero_tab[i];
695
_mem_read_tab[i][0] = read_zero_tab[i];
700
if (ramsize >= 256) {
701
for (j = 255; j >= 0; j--) {
702
_mem_read_tab[i][j] = read_ram_tab[i];
703
_mem_write_tab[i][j] = store_ram_tab[i];
704
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
706
_mem_write_tab[i][0] = store_zero_tab[i];
707
_mem_read_tab[i][0] = read_zero_tab[i];
713
if (ramsize >= 512) {
714
for (j = 255; j >= 0; j--) {
715
_mem_read_tab[i][j] = read_ram_tab[i];
716
_mem_write_tab[i][j] = store_ram_tab[i];
717
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
719
_mem_write_tab[i][0] = store_zero_tab[i];
720
_mem_read_tab[i][0] = read_zero_tab[i];
730
if (ramsize >= 1024) {
731
for (j = 255; j >= 0; j--) {
732
_mem_read_tab[i][j] = read_ram_tab[i];
733
_mem_write_tab[i][j] = store_ram_tab[i];
734
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
736
_mem_write_tab[i][0] = store_zero_tab[i];
737
_mem_read_tab[i][0] = read_zero_tab[i];
740
/* fallback for ramsize < some_value */
741
for (j = 255; j >= 0; j--) {
742
_mem_read_tab[i][j] = read_unused;
743
_mem_write_tab[i][j] = store_dummy;
744
_mem_read_base_tab[i][j] = NULL;
746
_mem_write_tab[i][0] = store_zeroX;
749
for (j = 0; j < 0x08; j++) {
750
_mem_read_tab[i][j] = read_ram_F;
751
_mem_write_tab[i][j] = store_ram_F;
752
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
754
for (; j < 0xc0; j++) { /* 0800-BFFF */
755
_mem_read_tab[i][j] = rom_read;
756
_mem_write_tab[i][j] = store_dummy;
757
_mem_read_base_tab[i][j] = mem_rom + (j << 8);
759
for (; j < 0xd0; j++) { /* C000-CFFF */
760
_mem_read_tab[i][j] = read_chargen;
761
_mem_write_tab[i][j] = store_dummy;
762
_mem_read_base_tab[i][j] = mem_chargen_rom + ((j << 8) & 0x0f);
764
for (; j < 0xe0; j++) { /* D000-DFFF */
765
_mem_read_tab[i][j] = read_io;
766
_mem_write_tab[i][j] = store_io;
767
_mem_read_base_tab[i][j] = NULL;
769
for (; j < 0x100; j++) {
770
_mem_read_tab[i][j] = rom_read;
771
_mem_write_tab[i][j] = store_dummy;
772
_mem_read_base_tab[i][j] = mem_rom + (j << 8);
776
for (j = 0x08; j < 0x10; j++) {
777
_mem_read_tab[i][j] = read_ram_F;
778
_mem_write_tab[i][j] = store_ram_F;
779
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
783
for (j = 0x10; j < 0x20; j++) {
784
_mem_read_tab[i][j] = read_ram_F;
785
_mem_write_tab[i][j] = store_ram_F;
786
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
790
for (j = 0x20; j < 0x40; j++) {
791
_mem_read_tab[i][j] = read_ram_F;
792
_mem_write_tab[i][j] = store_ram_F;
793
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
797
for (j = 0x40; j < 0x60; j++) {
798
_mem_read_tab[i][j] = read_ram_F;
799
_mem_write_tab[i][j] = store_ram_F;
800
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
804
for (j = 0x60; j < 0x80; j++) {
805
_mem_read_tab[i][j] = read_ram_F;
806
_mem_write_tab[i][j] = store_ram_F;
807
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
811
for (j = 0xc0; j < 0xd0; j++) {
812
_mem_read_tab[i][j] = read_ram_F;
813
_mem_write_tab[i][j] = store_ram_F;
814
_mem_read_base_tab[i][j] = mem_ram + (i << 16) + (j << 8);
818
_mem_write_tab[i][0] = store_zero_F;
819
_mem_read_tab[i][0] = read_zero_F;
820
_mem_read_base_tab[i][0] = mem_ram + 0xf0000;
803
823
_mem_read_tab[i][0x100] = _mem_read_tab[i][0];
804
824
_mem_write_tab[i][0x100] = _mem_write_tab[i][0];
805
825
_mem_read_base_tab[i][0x100] = _mem_read_base_tab[i][0];
808
void mem_mmu_translate(unsigned int addr, BYTE **base, int *start, int *limit) {
828
void mem_mmu_translate(unsigned int addr, BYTE **base, int *start, int *limit)
809
830
BYTE *p = _mem_read_base_tab_ptr[addr >> 8];
811
832
*base = (p == NULL) ? NULL : (p - (addr & 0xff00));