Mercurial > repos > blastem
comparison genesis.c @ 1696:956c1cce05e2 mame_interp
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 24 Jan 2019 19:15:59 -0800 |
parents | b7ecd0d6a77b 319d90025d50 |
children | 95e387e1d63c |
comparison
equal
deleted
inserted
replaced
1648:b7ecd0d6a77b | 1696:956c1cce05e2 |
---|---|
31 | 31 |
32 //TODO: Figure out the exact value for this | 32 //TODO: Figure out the exact value for this |
33 #define LINES_NTSC 262 | 33 #define LINES_NTSC 262 |
34 #define LINES_PAL 313 | 34 #define LINES_PAL 313 |
35 | 35 |
36 #ifdef IS_LIB | |
37 #define MAX_SOUND_CYCLES 1000 | |
38 #else | |
36 #define MAX_SOUND_CYCLES 100000 | 39 #define MAX_SOUND_CYCLES 100000 |
40 #endif | |
37 | 41 |
38 void genesis_serialize(genesis_context *gen, serialize_buffer *buf, uint32_t m68k_pc) | 42 void genesis_serialize(genesis_context *gen, serialize_buffer *buf, uint32_t m68k_pc) |
39 { | 43 { |
40 start_section(buf, SECTION_68000); | 44 start_section(buf, SECTION_68000); |
41 m68k_serialize(gen->m68k, m68k_pc, buf); | 45 m68k_serialize(gen->m68k, m68k_pc, buf); |
84 save_int8(buf, Z80_RAM_BYTES / 1024); | 88 save_int8(buf, Z80_RAM_BYTES / 1024); |
85 save_buffer8(buf, gen->zram, Z80_RAM_BYTES); | 89 save_buffer8(buf, gen->zram, Z80_RAM_BYTES); |
86 end_section(buf); | 90 end_section(buf); |
87 | 91 |
88 cart_serialize(&gen->header, buf); | 92 cart_serialize(&gen->header, buf); |
93 } | |
94 | |
95 static uint8_t *serialize(system_header *sys, size_t *size_out) | |
96 { | |
97 genesis_context *gen = (genesis_context *)sys; | |
98 uint32_t address; | |
99 if (gen->m68k->resume_pc) { | |
100 gen->m68k->target_cycle = gen->m68k->current_cycle; | |
101 gen->header.save_state = SERIALIZE_SLOT+1; | |
102 resume_68k(gen->m68k); | |
103 if (size_out) { | |
104 *size_out = gen->serialize_size; | |
105 } | |
106 return gen->serialize_tmp; | |
107 } else { | |
108 serialize_buffer state; | |
109 init_serialize(&state); | |
110 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k) << 16; | |
111 address |= read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k); | |
112 genesis_serialize(gen, &state, address); | |
113 if (size_out) { | |
114 *size_out = state.size; | |
115 } | |
116 return state.data; | |
117 } | |
89 } | 118 } |
90 | 119 |
91 static void ram_deserialize(deserialize_buffer *buf, void *vgen) | 120 static void ram_deserialize(deserialize_buffer *buf, void *vgen) |
92 { | 121 { |
93 genesis_context *gen = vgen; | 122 genesis_context *gen = vgen; |
146 { | 175 { |
147 load_section(buf); | 176 load_section(buf); |
148 } | 177 } |
149 update_z80_bank_pointer(gen); | 178 update_z80_bank_pointer(gen); |
150 adjust_int_cycle(gen->m68k, gen->vdp); | 179 adjust_int_cycle(gen->m68k, gen->vdp); |
180 free(buf->handlers); | |
181 buf->handlers = NULL; | |
182 } | |
183 | |
184 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up | |
185 static void deserialize(system_header *sys, uint8_t *data, size_t size) | |
186 { | |
187 genesis_context *gen = (genesis_context *)sys; | |
188 deserialize_buffer buffer; | |
189 init_deserialize(&buffer, data, size); | |
190 genesis_deserialize(&buffer, gen); | |
191 //HACK: Fix this once PC/IR is represented in a better way in 68K core | |
192 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, gen->m68k->last_prefetch_address); | |
151 } | 193 } |
152 | 194 |
153 uint16_t read_dma_value(uint32_t address) | 195 uint16_t read_dma_value(uint32_t address) |
154 { | 196 { |
155 genesis_context *genesis = (genesis_context *)current_system; | 197 genesis_context *genesis = (genesis_context *)current_system; |
378 while (!z_context->pc) | 420 while (!z_context->pc) |
379 { | 421 { |
380 sync_z80(z_context, z_context->current_cycle + MCLKS_PER_Z80); | 422 sync_z80(z_context, z_context->current_cycle + MCLKS_PER_Z80); |
381 } | 423 } |
382 } | 424 } |
383 char *save_path = get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); | 425 char *save_path = slot == SERIALIZE_SLOT ? NULL : get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); |
384 if (use_native_states) { | 426 if (use_native_states || slot == SERIALIZE_SLOT) { |
385 serialize_buffer state; | 427 serialize_buffer state; |
386 init_serialize(&state); | 428 init_serialize(&state); |
387 genesis_serialize(gen, &state, address); | 429 genesis_serialize(gen, &state, address); |
388 save_to_file(&state, save_path); | 430 if (slot == SERIALIZE_SLOT) { |
389 free(state.data); | 431 gen->serialize_tmp = state.data; |
432 gen->serialize_size = state.size; | |
433 context->sync_cycle = context->current_cycle; | |
434 context->should_return = 1; | |
435 } else { | |
436 save_to_file(&state, save_path); | |
437 free(state.data); | |
438 } | |
390 } else { | 439 } else { |
391 save_gst(gen, save_path, address); | 440 save_gst(gen, save_path, address); |
392 } | 441 } |
393 printf("Saved state to %s\n", save_path); | 442 printf("Saved state to %s\n", save_path); |
394 free(save_path); | 443 free(save_path); |
1033 gen->normal_clock = MCLKS_NTSC; | 1082 gen->normal_clock = MCLKS_NTSC; |
1034 } | 1083 } |
1035 gen->master_clock = gen->normal_clock; | 1084 gen->master_clock = gen->normal_clock; |
1036 } | 1085 } |
1037 | 1086 |
1038 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up | |
1039 static uint8_t load_state(system_header *system, uint8_t slot) | 1087 static uint8_t load_state(system_header *system, uint8_t slot) |
1040 { | 1088 { |
1041 genesis_context *gen = (genesis_context *)system; | 1089 genesis_context *gen = (genesis_context *)system; |
1042 char *statepath = get_slot_name(system, slot, "state"); | 1090 char *statepath = get_slot_name(system, slot, "state"); |
1043 deserialize_buffer state; | 1091 deserialize_buffer state; |
1093 load_state(&gen->header, gen->header.delayed_load_slot - 1); | 1141 load_state(&gen->header, gen->header.delayed_load_slot - 1); |
1094 gen->header.delayed_load_slot = 0; | 1142 gen->header.delayed_load_slot = 0; |
1095 resume_68k(gen->m68k); | 1143 resume_68k(gen->m68k); |
1096 } | 1144 } |
1097 } | 1145 } |
1146 #ifndef IS_LIB | |
1098 bindings_release_capture(); | 1147 bindings_release_capture(); |
1099 vdp_release_framebuffer(gen->vdp); | 1148 vdp_release_framebuffer(gen->vdp); |
1100 render_pause_source(gen->ym->audio); | 1149 render_pause_source(gen->ym->audio); |
1101 render_pause_source(gen->psg->audio); | 1150 render_pause_source(gen->psg->audio); |
1151 #endif | |
1102 } | 1152 } |
1103 | 1153 |
1104 static void start_genesis(system_header *system, char *statefile) | 1154 static void start_genesis(system_header *system, char *statefile) |
1105 { | 1155 { |
1106 genesis_context *gen = (genesis_context *)system; | 1156 genesis_context *gen = (genesis_context *)system; |
1145 } | 1195 } |
1146 | 1196 |
1147 static void resume_genesis(system_header *system) | 1197 static void resume_genesis(system_header *system) |
1148 { | 1198 { |
1149 genesis_context *gen = (genesis_context *)system; | 1199 genesis_context *gen = (genesis_context *)system; |
1200 #ifndef IS_LIB | |
1150 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); | 1201 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); |
1151 bindings_reacquire_capture(); | 1202 bindings_reacquire_capture(); |
1152 vdp_reacquire_framebuffer(gen->vdp); | 1203 vdp_reacquire_framebuffer(gen->vdp); |
1153 render_resume_source(gen->ym->audio); | 1204 render_resume_source(gen->ym->audio); |
1154 render_resume_source(gen->psg->audio); | 1205 render_resume_source(gen->psg->audio); |
1206 #endif | |
1155 resume_68k(gen->m68k); | 1207 resume_68k(gen->m68k); |
1156 handle_reset_requests(gen); | 1208 handle_reset_requests(gen); |
1157 } | 1209 } |
1158 | 1210 |
1159 static void inc_debug_mode(system_header *system) | 1211 static void inc_debug_mode(system_header *system) |
1163 } | 1215 } |
1164 | 1216 |
1165 static void request_exit(system_header *system) | 1217 static void request_exit(system_header *system) |
1166 { | 1218 { |
1167 genesis_context *gen = (genesis_context *)system; | 1219 genesis_context *gen = (genesis_context *)system; |
1220 gen->m68k->target_cycle = gen->m68k->current_cycle; | |
1168 gen->m68k->should_return = 1; | 1221 gen->m68k->should_return = 1; |
1169 } | 1222 } |
1170 | 1223 |
1171 static void persist_save(system_header *system) | 1224 static void persist_save(system_header *system) |
1172 { | 1225 { |
1317 gen->header.mouse_motion_absolute = mouse_motion_absolute; | 1370 gen->header.mouse_motion_absolute = mouse_motion_absolute; |
1318 gen->header.mouse_motion_relative = mouse_motion_relative; | 1371 gen->header.mouse_motion_relative = mouse_motion_relative; |
1319 gen->header.keyboard_down = keyboard_down; | 1372 gen->header.keyboard_down = keyboard_down; |
1320 gen->header.keyboard_up = keyboard_up; | 1373 gen->header.keyboard_up = keyboard_up; |
1321 gen->header.config_updated = config_updated; | 1374 gen->header.config_updated = config_updated; |
1375 gen->header.serialize = serialize; | |
1376 gen->header.deserialize = deserialize; | |
1322 gen->header.type = SYSTEM_GENESIS; | 1377 gen->header.type = SYSTEM_GENESIS; |
1323 gen->header.info = *rom; | 1378 gen->header.info = *rom; |
1324 set_region(gen, rom, force_region); | 1379 set_region(gen, rom, force_region); |
1325 | 1380 |
1326 gen->vdp = init_vdp_context(gen->version_reg & 0x40); | 1381 gen->vdp = init_vdp_context(gen->version_reg & 0x40); |