diff options
author | Mike Pavone <pavone@retrodev.com> | 2012-12-18 19:51:33 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2012-12-18 19:51:33 -0800 |
commit | e88632e2aee3bb60d5ddf197d5b0fd1c24a0c059 (patch) | |
tree | a628cd270ae67237ce312312b018c082100bcdde | |
parent | 23f50516176c33b4faedc9486031d32320a46217 (diff) |
Fix CRAM and possibly VSRAM writes
-rw-r--r-- | vdp.c | 25 | ||||
-rw-r--r-- | vdp.h | 3 |
2 files changed, 24 insertions, 4 deletions
@@ -203,12 +203,12 @@ void external_slot(vdp_context * context) break; case CRAM_WRITE: printf("CRAM Write: %X to %X\n", start->value, context->address); - context->cram[context->address & (CRAM_SIZE-1)] = start->value; + context->cram[(context->address/2) & (CRAM_SIZE-1)] = start->value; break; case VSRAM_WRITE: - if ((context->address & 63) < VSRAM_SIZE) { + if (((context->address/2) & 63) < VSRAM_SIZE) { printf("VSRAM Write: %X to %X\n", start->value, context->address); - context->vsram[context->address & 63] = start->value; + context->vsram[(context->address/2) & 63] = start->value; } break; } @@ -994,3 +994,22 @@ void vdp_load_savestate(vdp_context * context, FILE * state_file) fread(context->vdpmem, 1, VRAM_SIZE, state_file); } +void vdp_save_state(vdp_context * context, FILE * outfile) +{ + uint8_t tmp_buf[CRAM_SIZE*2]; + fseek(outfile, GST_VDP_REGS, SEEK_SET); + fwrite(context->regs, 1, VDP_REGS, outfile); + for (int i = 0; i < CRAM_SIZE; i++) { + tmp_buf[i*2] = context->cram[i]; + tmp_buf[i*2+1] = context->cram[i] >> 8; + } + fwrite(tmp_buf, 1, sizeof(tmp_buf), outfile); + for (int i = 0; i < VSRAM_SIZE; i++) { + tmp_buf[i*2] = context->vsram[i]; + tmp_buf[i*2+1] = context->vsram[i] >> 8; + } + fwrite(tmp_buf, 2, VSRAM_SIZE, outfile); + fseek(outfile, GST_VDP_MEM, SEEK_SET); + fwrite(context->vdpmem, 1, VRAM_SIZE, outfile); +} + @@ -70,7 +70,7 @@ typedef struct { fifo_entry *fifo_end; uint16_t address; uint8_t cd; - uint8_t flags; + uint8_t flags; //cycle count in MCLKs uint32_t cycles; uint8_t *vdpmem; @@ -102,6 +102,7 @@ void vdp_run_context(vdp_context * context, uint32_t target_cycles); //runs from current cycle count to VBLANK for the current mode, returns ending cycle count uint32_t vdp_run_to_vblank(vdp_context * context); void vdp_load_savestate(vdp_context * context, FILE * state_file); +void vdp_save_state(vdp_context * context, FILE * outfile); void vdp_control_port_write(vdp_context * context, uint16_t value); void vdp_data_port_write(vdp_context * context, uint16_t value); uint16_t vdp_control_port_read(vdp_context * context); |