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);