diff vdp.c @ 56:a28b1dfe1af2

Fix CRAM and possibly VSRAM writes
author Mike Pavone <pavone@retrodev.com>
date Tue, 18 Dec 2012 19:51:33 -0800
parents 3b79cbcf6846
children a6a19c45d358
line wrap: on
line diff
--- a/vdp.c	Tue Dec 18 19:51:17 2012 -0800
+++ b/vdp.c	Tue Dec 18 19:51:33 2012 -0800
@@ -203,12 +203,12 @@
 			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 @@
 	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);
+}
+