changeset 2068:f573f2c31bc9 segacd

Dump PROG RAM to file for debugging
author Michael Pavone <pavone@retrodev.com>
date Sun, 30 Jan 2022 11:58:34 -0800
parents f22e04b69272
children 8e51c0c3f2e3
files segacd.c
diffstat 1 files changed, 31 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/segacd.c	Sun Jan 30 11:58:17 2022 -0800
+++ b/segacd.c	Sun Jan 30 11:58:34 2022 -0800
@@ -417,7 +417,7 @@
 				lc8951_resume_transfer(&cd->cdc, cd->cdc.cycle);
 			}
 			calculate_target_cycle(cd->m68k);
-			
+
 		}
 		return cd->gate_array[reg];
 	}
@@ -688,7 +688,7 @@
 		cd->gate_array[GA_CDC_HOST_DATA] &= 0xFF00;
 		cd->gate_array[GA_CDC_HOST_DATA] |= value;
 	}
-	
+
 	uint32_t dma_addr = cd->gate_array[GA_CDC_DMA_ADDR] << 3;
 	dma_addr |= cd->cdc_dst_low;
 	switch (dest)
@@ -886,6 +886,32 @@
 	return address & 1 ? val : val >> 8;
 }
 
+static void dump_prog_ram(segacd_context *cd)
+{
+	static int dump_count;
+	char fname[256];
+	sprintf(fname, "prog_ram_%d.bin", dump_count++);
+	FILE *f = fopen(fname, "wb");
+	if (f) {
+		uint32_t last = 256*1024-1;
+		for(; last > 0; --last)
+		{
+			if (cd->prog_ram[last]) {
+				break;
+			}
+		}
+		for (uint32_t i = 0; i <= last; i++)
+		{
+			uint8_t pair[2];
+			pair[0] = cd->prog_ram[i] >> 8;
+			pair[1] = cd->prog_ram[i];
+			fwrite(pair, 1, sizeof(pair), f);
+		}
+
+		fclose(f);
+	}
+}
+
 static void *main_gate_write16(uint32_t address, void *vcontext, uint16_t value)
 {
 	m68k_context *m68k = vcontext;
@@ -920,6 +946,9 @@
 			m68k->mem_pointers[cd->memptr_start_index] = NULL;
 			m68k_invalidate_code_range(m68k, cd->base + 0x220000, cd->base + 0x240000);
 			m68k_invalidate_code_range(cd->m68k, bank * 0x20000, (bank + 1) * 0x20000);
+			if (!new_access) {
+				dump_prog_ram(cd);
+			}
 		}
 		break;
 	}