Mercurial > repos > blastem
comparison genesis.c @ 2500:d44fe974fb85
Get blastem compiling with new 68K core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 30 Apr 2024 22:32:08 -0700 |
parents | d74d3998482c |
children | 25e40370e0e4 |
comparison
equal
deleted
inserted
replaced
2499:d74d3998482c | 2500:d44fe974fb85 |
---|---|
135 | 135 |
136 static uint8_t *serialize(system_header *sys, size_t *size_out) | 136 static uint8_t *serialize(system_header *sys, size_t *size_out) |
137 { | 137 { |
138 genesis_context *gen = (genesis_context *)sys; | 138 genesis_context *gen = (genesis_context *)sys; |
139 uint32_t address; | 139 uint32_t address; |
140 #ifndef NEW_CORE | |
140 if (gen->m68k->resume_pc) { | 141 if (gen->m68k->resume_pc) { |
141 | 142 |
142 gen->header.save_state = SERIALIZE_SLOT+1; | 143 gen->header.save_state = SERIALIZE_SLOT+1; |
143 while (!gen->serialize_tmp) | 144 while (!gen->serialize_tmp) |
144 { | 145 { |
149 *size_out = gen->serialize_size; | 150 *size_out = gen->serialize_size; |
150 } | 151 } |
151 uint8_t *ret = gen->serialize_tmp; | 152 uint8_t *ret = gen->serialize_tmp; |
152 gen->serialize_tmp = NULL; | 153 gen->serialize_tmp = NULL; |
153 return ret; | 154 return ret; |
154 } else { | 155 } else |
156 #endif | |
157 { | |
155 serialize_buffer state; | 158 serialize_buffer state; |
156 init_serialize(&state); | 159 init_serialize(&state); |
157 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen, gen->m68k) << 16; | 160 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen, gen->m68k) << 16; |
158 address |= read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen, gen->m68k); | 161 address |= read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen, gen->m68k); |
159 genesis_serialize(gen, &state, address, 1); | 162 genesis_serialize(gen, &state, address, 1); |
221 } | 224 } |
222 | 225 |
223 static void adjust_int_cycle(m68k_context * context, vdp_context * v_context); | 226 static void adjust_int_cycle(m68k_context * context, vdp_context * v_context); |
224 static void check_tmss_lock(genesis_context *gen); | 227 static void check_tmss_lock(genesis_context *gen); |
225 static void toggle_tmss_rom(genesis_context *gen); | 228 static void toggle_tmss_rom(genesis_context *gen); |
229 #ifndef NEW_CORE | |
226 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up | 230 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up |
231 #endif | |
227 void genesis_deserialize(deserialize_buffer *buf, genesis_context *gen) | 232 void genesis_deserialize(deserialize_buffer *buf, genesis_context *gen) |
228 { | 233 { |
229 register_section_handler(buf, (section_handler){.fun = m68k_deserialize, .data = gen->m68k}, SECTION_68000); | 234 register_section_handler(buf, (section_handler){.fun = m68k_deserialize, .data = gen->m68k}, SECTION_68000); |
230 register_section_handler(buf, (section_handler){.fun = vdp_deserialize, .data = gen->vdp}, SECTION_VDP); | 235 register_section_handler(buf, (section_handler){.fun = vdp_deserialize, .data = gen->vdp}, SECTION_VDP); |
231 register_section_handler(buf, (section_handler){.fun = psg_deserialize, .data = gen->psg}, SECTION_PSG); | 236 register_section_handler(buf, (section_handler){.fun = psg_deserialize, .data = gen->psg}, SECTION_PSG); |
266 } | 271 } |
267 check_tmss_lock(gen); | 272 check_tmss_lock(gen); |
268 } | 273 } |
269 update_z80_bank_pointer(gen); | 274 update_z80_bank_pointer(gen); |
270 adjust_int_cycle(gen->m68k, gen->vdp); | 275 adjust_int_cycle(gen->m68k, gen->vdp); |
276 #ifndef NEW_CORE | |
271 //HACK: Fix this once PC/IR is represented in a better way in 68K core | 277 //HACK: Fix this once PC/IR is represented in a better way in 68K core |
272 //Would be better for this hack to live in side the 68K core itself, but it's better to do it | 278 //Would be better for this hack to live in side the 68K core itself, but it's better to do it |
273 //after RAM has been loaded to avoid any unnecessary retranslation | 279 //after RAM has been loaded to avoid any unnecessary retranslation |
274 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, gen->m68k->last_prefetch_address); | 280 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, gen->m68k->last_prefetch_address); |
275 if (gen->expansion) { | 281 if (gen->expansion) { |
276 segacd_context *cd = gen->expansion; | 282 segacd_context *cd = gen->expansion; |
277 cd->m68k->resume_pc = get_native_address_trans(cd->m68k, cd->m68k->last_prefetch_address); | 283 cd->m68k->resume_pc = get_native_address_trans(cd->m68k, cd->m68k->last_prefetch_address); |
278 } | 284 } |
285 #endif | |
279 free(buf->handlers); | 286 free(buf->handlers); |
280 buf->handlers = NULL; | 287 buf->handlers = NULL; |
281 } | 288 } |
282 | 289 |
283 static void deserialize(system_header *sys, uint8_t *data, size_t size) | 290 static void deserialize(system_header *sys, uint8_t *data, size_t size) |
299 if (genesis->expansion) { | 306 if (genesis->expansion) { |
300 segacd_context *cd = genesis->expansion; | 307 segacd_context *cd = genesis->expansion; |
301 uint32_t word_ram = cd->base + 0x200000; | 308 uint32_t word_ram = cd->base + 0x200000; |
302 uint32_t word_ram_end = cd->base + 0x240000; | 309 uint32_t word_ram_end = cd->base + 0x240000; |
303 if (address >= word_ram && address < word_ram_end) { | 310 if (address >= word_ram && address < word_ram_end) { |
304 //FIXME: first word should just be garbage | |
305 if (!cd->has_vdp_dma_value) { | 311 if (!cd->has_vdp_dma_value) { |
312 #ifdef NEW_CORE | |
313 cd->vdp_dma_value = genesis->m68k->prefetch; | |
314 #else | |
306 cd->vdp_dma_value = read_word(genesis->m68k->last_prefetch_address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->opts->gen, genesis->m68k); | 315 cd->vdp_dma_value = read_word(genesis->m68k->last_prefetch_address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->opts->gen, genesis->m68k); |
316 #endif | |
307 cd->has_vdp_dma_value = 1; | 317 cd->has_vdp_dma_value = 1; |
308 } | 318 } |
309 uint16_t ret = cd->vdp_dma_value; | 319 uint16_t ret = cd->vdp_dma_value; |
310 cd->vdp_dma_value = read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->opts->gen, genesis->m68k); | 320 cd->vdp_dma_value = read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->opts->gen, genesis->m68k); |
311 return ret; | 321 return ret; |
326 | 336 |
327 | 337 |
328 static uint16_t get_open_bus_value(system_header *system) | 338 static uint16_t get_open_bus_value(system_header *system) |
329 { | 339 { |
330 genesis_context *genesis = (genesis_context *)system; | 340 genesis_context *genesis = (genesis_context *)system; |
341 #ifdef NEW_CORE | |
342 return genesis->m68k->prefetch; | |
343 #else | |
331 return read_dma_value(genesis->m68k->last_prefetch_address/2); | 344 return read_dma_value(genesis->m68k->last_prefetch_address/2); |
345 #endif | |
332 } | 346 } |
333 | 347 |
334 static void adjust_int_cycle(m68k_context * context, vdp_context * v_context) | 348 static void adjust_int_cycle(m68k_context * context, vdp_context * v_context) |
335 { | 349 { |
336 //static int old_int_cycle = CYCLE_NEVER; | 350 //static int old_int_cycle = CYCLE_NEVER; |
1943 genesis_context *gen = (genesis_context *)system; | 1957 genesis_context *gen = (genesis_context *)system; |
1944 char *statepath = get_slot_name(system, slot, "state"); | 1958 char *statepath = get_slot_name(system, slot, "state"); |
1945 deserialize_buffer state; | 1959 deserialize_buffer state; |
1946 uint32_t pc = 0; | 1960 uint32_t pc = 0; |
1947 uint8_t ret; | 1961 uint8_t ret; |
1962 #ifndef NEW_CORE | |
1948 if (!gen->m68k->resume_pc) { | 1963 if (!gen->m68k->resume_pc) { |
1949 system->delayed_load_slot = slot + 1; | 1964 system->delayed_load_slot = slot + 1; |
1950 gen->m68k->should_return = 1; | 1965 gen->m68k->should_return = 1; |
1951 ret = get_modification_time(statepath) != 0; | 1966 ret = get_modification_time(statepath) != 0; |
1952 if (!ret) { | 1967 if (!ret) { |
1953 strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); | 1968 strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); |
1954 ret = get_modification_time(statepath) != 0; | 1969 ret = get_modification_time(statepath) != 0; |
1955 } | 1970 } |
1956 goto done; | 1971 goto done; |
1957 } | 1972 } |
1973 #endif | |
1958 if (load_from_file(&state, statepath)) { | 1974 if (load_from_file(&state, statepath)) { |
1959 genesis_deserialize(&state, gen); | 1975 genesis_deserialize(&state, gen); |
1960 free(state.data); | 1976 free(state.data); |
1961 ret = 1; | 1977 ret = 1; |
1962 } else { | 1978 } else { |
2013 deserialize_buffer state; | 2029 deserialize_buffer state; |
2014 uint32_t pc; | 2030 uint32_t pc; |
2015 if (load_from_file(&state, statefile)) { | 2031 if (load_from_file(&state, statefile)) { |
2016 genesis_deserialize(&state, gen); | 2032 genesis_deserialize(&state, gen); |
2017 free(state.data); | 2033 free(state.data); |
2034 #ifdef NEW_CORE | |
2035 pc = gen->m68k->pc; | |
2036 #else | |
2018 //HACK | 2037 //HACK |
2019 pc = gen->m68k->last_prefetch_address; | 2038 pc = gen->m68k->last_prefetch_address; |
2039 #endif | |
2020 } else { | 2040 } else { |
2021 pc = load_gst(gen, statefile); | 2041 pc = load_gst(gen, statefile); |
2022 if (!pc) { | 2042 if (!pc) { |
2023 fatal_error("Failed to load save state %s\n", statefile); | 2043 fatal_error("Failed to load save state %s\n", statefile); |
2024 } | 2044 } |
2045 insert_breakpoint(gen->m68k, address, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); | 2065 insert_breakpoint(gen->m68k, address, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); |
2046 #endif | 2066 #endif |
2047 } | 2067 } |
2048 m68k_reset(gen->m68k); | 2068 m68k_reset(gen->m68k); |
2049 } | 2069 } |
2070 #ifdef NEW_CORE | |
2071 while (!gen->m68k->should_return) { | |
2072 sync_components(gen->m68k, 0); | |
2073 m68k_execute(gen->m68k, gen->m68k->target_cycle); | |
2074 } | |
2075 #endif | |
2050 handle_reset_requests(gen); | 2076 handle_reset_requests(gen); |
2051 return; | 2077 return; |
2052 } | 2078 } |
2053 | 2079 |
2054 static void resume_genesis(system_header *system) | 2080 static void resume_genesis(system_header *system) |