Mercurial > repos > blastem
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 { |