summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vdp.c25
-rw-r--r--vdp.h3
2 files changed, 24 insertions, 4 deletions
diff --git a/vdp.c b/vdp.c
index edb3332..daa4f54 100644
--- a/vdp.c
+++ b/vdp.c
@@ -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);
+}
+
diff --git a/vdp.h b/vdp.h
index 3016561..85ba665 100644
--- a/vdp.h
+++ b/vdp.h
@@ -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);