Mercurial > repos > blastem
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); +} +