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)