comparison blastem.c @ 604:39d7d463ed5b

Get Z80 banked access sort of working again
author Michael Pavone <pavone@retrodev.com>
date Fri, 26 Dec 2014 19:37:59 -0800
parents 452ad0b42afa
children cf73b72c6d1e
comparison
equal deleted inserted replaced
603:8c7b63f9fab8 604:39d7d463ed5b
729 } 729 }
730 730
731 uint8_t z80_read_bank(uint32_t location, void * vcontext) 731 uint8_t z80_read_bank(uint32_t location, void * vcontext)
732 { 732 {
733 z80_context * context = vcontext; 733 z80_context * context = vcontext;
734 //TODO: Implement me 734 uint32_t address = context->bank_reg << 15 | location;
735 fprintf(stderr, "Unhandled read by Z80 from address %X through banked memory area\n", address);
735 return 0; 736 return 0;
736 } 737 }
737 738
738 void *z80_write_bank(uint32_t location, void * vcontext, uint8_t value) 739 void *z80_write_bank(uint32_t location, void * vcontext, uint8_t value)
739 { 740 {
740 z80_context * context = vcontext; 741 z80_context * context = vcontext;
741 //TODO: Implement me 742 uint32_t address = context->bank_reg << 15 | location;
743 if (address >= 0xE00000) {
744 address &= 0xFFFF;
745 ((uint8_t *)ram)[address ^ 1] = value;
746 } else {
747 fprintf(stderr, "Unhandled write by Z80 to address %X through banked memory area\n", address);
748 }
749 return context;
750 }
751
752 void *z80_write_bank_reg(uint32_t location, void * vcontext, uint8_t value)
753 {
754 z80_context * context = vcontext;
755
756 context->bank_reg = (context->bank_reg >> 1 | value << 8) & 0x1FF;
757 if (context->bank_reg < 0x80) {
758 context->mem_pointers[1] = context->mem_pointers[2] + (context->bank_reg << 15);
759 } else {
760 context->mem_pointers[1] = NULL;
761 }
762
742 return context; 763 return context;
743 } 764 }
744 765
745 uint16_t read_sram_w(uint32_t address, m68k_context * context) 766 uint16_t read_sram_w(uint32_t address, m68k_context * context)
746 { 767 {
1119 } 1140 }
1120 } 1141 }
1121 } 1142 }
1122 #ifndef NO_Z80 1143 #ifndef NO_Z80
1123 const memmap_chunk z80_map[] = { 1144 const memmap_chunk z80_map[] = {
1124 { 0x0000, 0x4000, 0x1FFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, z80_ram, NULL, NULL, NULL, NULL }, 1145 { 0x0000, 0x4000, 0x1FFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, z80_ram, NULL, NULL, NULL, NULL },
1125 { 0x8000, 0x10000, 0xFFFF, 1, MMAP_READ | MMAP_WRITE | MMAP_PTR_IDX | MMAP_FUNC_NULL, NULL, NULL, NULL, z80_read_bank, z80_write_bank}, 1146 { 0x8000, 0x10000, 0xFFFF, 1, MMAP_READ | MMAP_PTR_IDX | MMAP_FUNC_NULL | MMAP_BYTESWAP, NULL, NULL, NULL, z80_read_bank, z80_write_bank},
1126 { 0x4000, 0x6000, 0x0003, 0, MMAP_READ | MMAP_WRITE, NULL, NULL, NULL, z80_read_ym, z80_write_ym}, 1147 { 0x4000, 0x6000, 0x0003, 0, 0, NULL, NULL, NULL, z80_read_ym, z80_write_ym},
1127 { 0x6000, 0x6100, 0xFFFF, 0, MMAP_WRITE | MMAP_CUSTOM, NULL, NULL, NULL, NULL, (write_8_fun)z80_gen_bank_write}, 1148 { 0x6000, 0x6100, 0xFFFF, 0, 0, NULL, NULL, NULL, NULL, z80_write_bank_reg},
1128 { 0x7F00, 0x8000, 0x00FF, 0, MMAP_READ | MMAP_WRITE, NULL, NULL, NULL, z80_vdp_port_read, z80_vdp_port_write} 1149 { 0x7F00, 0x8000, 0x00FF, 0, 0, NULL, NULL, NULL, z80_vdp_port_read, z80_vdp_port_write}
1129 }; 1150 };
1130 #endif 1151 #endif
1131 1152
1132 int main(int argc, char ** argv) 1153 int main(int argc, char ** argv)
1133 { 1154 {