Mercurial > repos > blastem
changeset 2336:83f5529086c5
Make bogus word RAM read more appropriately bogus
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 31 Aug 2023 20:28:33 -0700 |
parents | c05b7c5e6f11 |
children | 0e3118325c1c |
files | genesis.c segacd.h vdp.c vdp.h |
diffstat | 4 files changed, 21 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/genesis.c Sat Aug 26 20:32:53 2023 -0700 +++ b/genesis.c Thu Aug 31 20:28:33 2023 -0700 @@ -285,13 +285,29 @@ uint32_t word_ram_end = cd->base + 0x240000; if (address >= word_ram && address < word_ram_end) { //FIXME: first word should just be garbage - address -= 2; + if (!cd->has_vdp_dma_value) { + cd->vdp_dma_value = read_word(genesis->m68k->last_prefetch_address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen, genesis->m68k); + cd->has_vdp_dma_value = 1; + } + uint16_t ret = cd->vdp_dma_value; + cd->vdp_dma_value = read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen, genesis->m68k); + return ret; } } return read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen, genesis->m68k); } +void vdp_dma_started(void) +{ + genesis_context *genesis = (genesis_context *)current_system; + if (genesis->expansion) { + segacd_context *cd = genesis->expansion; + cd->has_vdp_dma_value = 0; + } +} + + static uint16_t get_open_bus_value(system_header *system) { genesis_context *genesis = (genesis_context *)system;
--- a/segacd.h Sat Aug 26 20:32:53 2023 -0700 +++ b/segacd.h Thu Aug 31 20:28:33 2023 -0700 @@ -30,6 +30,7 @@ uint32_t graphics_dx; uint32_t graphics_dy; uint16_t graphics_dst_x; + uint16_t vdp_dma_value; uint8_t graphics_pixels[4]; uint8_t graphics_debug_window; uint8_t timer_pending; @@ -50,6 +51,7 @@ uint8_t sub_paused_wordram; uint8_t bram_cart_write_enabled; uint8_t bram_cart_id; + uint8_t has_vdp_dma_value; rf5c164 pcm; lc8951 cdc; cdd_mcu cdd;
--- a/vdp.c Sat Aug 26 20:32:53 2023 -0700 +++ b/vdp.c Thu Aug 31 20:28:33 2023 -0700 @@ -4635,6 +4635,7 @@ //sticking with 3 slots for now until I can do some more captures vdp_run_context_full(context, context->cycles + 12 * ((context->regs[REG_MODE_2] & BIT_MODE_5) && (context->regs[REG_MODE_4] & BIT_H40) ? 4 : 5)); context->flags |= FLAG_DMA_RUN; + vdp_dma_started(); return 1; } else { context->flags |= FLAG_DMA_RUN;
--- a/vdp.h Sat Aug 26 20:32:53 2023 -0700 +++ b/vdp.h Thu Aug 31 20:28:33 2023 -0700 @@ -304,6 +304,7 @@ void vdp_inc_debug_mode(vdp_context *context); //to be implemented by the host system uint16_t read_dma_value(uint32_t address); +void vdp_dma_started(void); void vdp_replay_event(vdp_context *context, uint8_t event, event_reader *reader); #endif //VDP_H_