Mercurial > repos > blastem
comparison genesis.c @ 1445:349d50930c03
Save and restore Z80 bank register in native save states
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 28 Aug 2017 22:40:33 -0700 |
parents | 14a2834d010c |
children | f82decf0537d |
comparison
equal
deleted
inserted
replaced
1444:14a2834d010c | 1445:349d50930c03 |
---|---|
55 end_section(buf); | 55 end_section(buf); |
56 | 56 |
57 start_section(buf, SECTION_GEN_BUS_ARBITER); | 57 start_section(buf, SECTION_GEN_BUS_ARBITER); |
58 save_int8(buf, gen->z80->reset); | 58 save_int8(buf, gen->z80->reset); |
59 save_int8(buf, gen->z80->busreq); | 59 save_int8(buf, gen->z80->busreq); |
60 save_int16(buf, gen->z80->bank_reg); | |
60 end_section(buf); | 61 end_section(buf); |
61 | 62 |
62 start_section(buf, SECTION_SEGA_IO_1); | 63 start_section(buf, SECTION_SEGA_IO_1); |
63 io_serialize(gen->io.ports, buf); | 64 io_serialize(gen->io.ports, buf); |
64 end_section(buf); | 65 end_section(buf); |
102 fatal_error("State has a Z80 RAM size of %d bytes", ram_size); | 103 fatal_error("State has a Z80 RAM size of %d bytes", ram_size); |
103 } | 104 } |
104 load_buffer8(buf, gen->zram, ram_size); | 105 load_buffer8(buf, gen->zram, ram_size); |
105 } | 106 } |
106 | 107 |
108 static void update_z80_bank_pointer(genesis_context *gen) | |
109 { | |
110 if (gen->z80->bank_reg < 0x100) { | |
111 gen->z80->mem_pointers[1] = get_native_pointer(gen->z80->bank_reg << 15, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen); | |
112 } else { | |
113 gen->z80->mem_pointers[1] = NULL; | |
114 } | |
115 } | |
116 | |
107 static void bus_arbiter_deserialize(deserialize_buffer *buf, void *vgen) | 117 static void bus_arbiter_deserialize(deserialize_buffer *buf, void *vgen) |
108 { | 118 { |
109 genesis_context *gen = vgen; | 119 genesis_context *gen = vgen; |
110 gen->z80->reset = load_int8(buf); | 120 gen->z80->reset = load_int8(buf); |
111 gen->z80->busreq = load_int8(buf); | 121 gen->z80->busreq = load_int8(buf); |
122 gen->z80->bank_reg = load_int16(buf) & 0x1FF; | |
112 } | 123 } |
113 | 124 |
114 void genesis_deserialize(deserialize_buffer *buf, genesis_context *gen) | 125 void genesis_deserialize(deserialize_buffer *buf, genesis_context *gen) |
115 { | 126 { |
116 register_section_handler(buf, (section_handler){.fun = m68k_deserialize, .data = gen->m68k}, SECTION_68000); | 127 register_section_handler(buf, (section_handler){.fun = m68k_deserialize, .data = gen->m68k}, SECTION_68000); |
123 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 1}, SECTION_SEGA_IO_2); | 134 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 1}, SECTION_SEGA_IO_2); |
124 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 2}, SECTION_SEGA_IO_EXT); | 135 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 2}, SECTION_SEGA_IO_EXT); |
125 register_section_handler(buf, (section_handler){.fun = ram_deserialize, .data = gen}, SECTION_MAIN_RAM); | 136 register_section_handler(buf, (section_handler){.fun = ram_deserialize, .data = gen}, SECTION_MAIN_RAM); |
126 register_section_handler(buf, (section_handler){.fun = zram_deserialize, .data = gen}, SECTION_SOUND_RAM); | 137 register_section_handler(buf, (section_handler){.fun = zram_deserialize, .data = gen}, SECTION_SOUND_RAM); |
127 register_section_handler(buf, (section_handler){.fun = cart_deserialize, .data = gen}, SECTION_MAPPER); | 138 register_section_handler(buf, (section_handler){.fun = cart_deserialize, .data = gen}, SECTION_MAPPER); |
128 //TODO: mapper state | |
129 while (buf->cur_pos < buf->size) | 139 while (buf->cur_pos < buf->size) |
130 { | 140 { |
131 load_section(buf); | 141 load_section(buf); |
132 } | 142 } |
143 update_z80_bank_pointer(gen); | |
133 } | 144 } |
134 | 145 |
135 uint16_t read_dma_value(uint32_t address) | 146 uint16_t read_dma_value(uint32_t address) |
136 { | 147 { |
137 genesis_context *genesis = (genesis_context *)current_system; | 148 genesis_context *genesis = (genesis_context *)current_system; |
949 static void *z80_write_bank_reg(uint32_t location, void * vcontext, uint8_t value) | 960 static void *z80_write_bank_reg(uint32_t location, void * vcontext, uint8_t value) |
950 { | 961 { |
951 z80_context * context = vcontext; | 962 z80_context * context = vcontext; |
952 | 963 |
953 context->bank_reg = (context->bank_reg >> 1 | value << 8) & 0x1FF; | 964 context->bank_reg = (context->bank_reg >> 1 | value << 8) & 0x1FF; |
954 if (context->bank_reg < 0x100) { | 965 update_z80_bank_pointer(context->system); |
955 genesis_context *gen = context->system; | |
956 context->mem_pointers[1] = get_native_pointer(context->bank_reg << 15, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen); | |
957 } else { | |
958 context->mem_pointers[1] = NULL; | |
959 } | |
960 | 966 |
961 return context; | 967 return context; |
962 } | 968 } |
963 | 969 |
964 static void set_speed_percent(system_header * system, uint32_t percent) | 970 static void set_speed_percent(system_header * system, uint32_t percent) |