changeset 1083:f6e998227300

Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
author Michael Pavone <pavone@retrodev.com>
date Thu, 06 Oct 2016 09:35:35 -0700
parents 2ec5e6eaf81d
children 193db42e702b
files jaguar.c jaguar.h
diffstat 2 files changed, 53 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/jaguar.c	Thu Oct 06 09:34:31 2016 -0700
+++ b/jaguar.c	Thu Oct 06 09:35:35 2016 -0700
@@ -5,6 +5,7 @@
 #include "m68k_core.h"
 #include "jaguar.h"
 #include "util.h"
+#include "debug.h"
 
 //BIOS Area Memory map
 // 10 00 00 - 10 04 00 : Video mode/ Memory control registers
@@ -36,7 +37,33 @@
 		if (address < 0x101000) {
 			if (address < 0x100400) {
 				//Video mode / Memory control registers
-				fprintf(stderr, "Unhanelde write to video mode/memory control registers - %X:%X", address, value);
+				switch(address & 0x3FE)
+				{
+				case 0:
+					if (((value ^ system->memcon1) & 1) || !system->memcon_written) {
+						uint16_t **mem_pointers = system->m68k->mem_pointers;
+						int rom = value & 1 ? 4 : 1;
+						int ram0 = value & 1 ? 0 : 6;
+						int ram1 = value & 1 ? 2 : 4;
+						mem_pointers[ram0] = mem_pointers[ram0 + 1] = system->dram;
+						//these are probably open bus, but mirror DRAM for now
+						mem_pointers[ram1] = mem_pointers[ram1 + 1] = system->dram;
+						
+						mem_pointers[rom] = system->cart;
+						mem_pointers[rom + 1] = system->cart + ((0x200000 & (system->cart_size-1)) >> 1);
+						mem_pointers[rom + 2] = system->cart + ((0x400000 & (system->cart_size-1)) >> 1);
+						system->memcon_written = 1;
+						//TODO: invalidate code cache
+					}
+					system->memcon1 = value;
+					break;
+				case 2:
+					system->memcon2 = value;
+					break;
+				default:
+					fprintf(stderr, "Unhandled write to video mode/memory control registers - %X:%X\n", address, value);
+					break;
+				}
 			} else if (address < 0x100800) {
 				//CLUT
 				address = address >> 1 & 255;
@@ -78,14 +105,14 @@
 			system->gpu_local[offset] |= value32;
 		} else if (address < 0x114000) {
 			//timer clock registers
-			fprintf(stderr, "Unhanelde write to timer/clock registers - %X:%X", address, value);
+			fprintf(stderr, "Unhandled write to timer/clock registers - %X:%X\n", address, value);
 		} else {
 			//joystick interface
-			fprintf(stderr, "Unhanelde write to joystick interface - %X:%X", address, value);
+			fprintf(stderr, "Unhandled write to joystick interface - %X:%X\n", address, value);
 		}
 	} else if (address < 0x11B000) {
 		//DSP/DAC/I2S Registers
-		fprintf(stderr, "Unhanelde write to DSP/DAC/I2S registers - %X:%X", address, value);
+		fprintf(stderr, "Unhandled write to DSP/DAC/I2S registers - %X:%X\n", address, value);
 	} else if (address < 0x11D000) {
 		//DSP local RAM
 		uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1);
@@ -114,7 +141,7 @@
 		if (address < 0x101000) {
 			if (address < 0x100400) {
 				//Video mode / Memory control registers
-				fprintf(stderr, "Unhandled read from video mode/memory control registers - %X", address);
+				fprintf(stderr, "Unhandled read from video mode/memory control registers - %X\n", address);
 			} else if (address < 0x100800) {
 				//CLUT
 				address = address >> 1 & 255;
@@ -153,14 +180,14 @@
 			}
 		} else if (address < 0x114000) {
 			//timer clock registers
-			fprintf(stderr, "Unhandled read from timer/clock registers - %X", address);
+			fprintf(stderr, "Unhandled read from timer/clock registers - %X\n", address);
 		} else {
 			//joystick interface
-			fprintf(stderr, "Unhandled read from joystick interface - %X", address);
+			fprintf(stderr, "Unhandled read from joystick interface - %X\n", address);
 		}
 	} else if (address < 0x11B000) {
 		//DSP/DAC/I2S Registers
-		fprintf(stderr, "Unhandled read from DSP/DAC/I2S registers - %X", address);
+		fprintf(stderr, "Unhandled read from DSP/DAC/I2S registers - %X\n", address);
 	} else if (address < 0x11D000) {
 		//DSP local RAM
 		uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1);
@@ -214,6 +241,12 @@
 	return context;
 }
 
+m68k_context *handle_m68k_reset(m68k_context *context)
+{
+	puts("M68K executed RESET");
+	return context;
+}
+
 jaguar_context *init_jaguar(uint16_t *bios, uint32_t bios_size, uint16_t *cart, uint32_t cart_size)
 {
 	jaguar_context *system = calloc(1, sizeof(jaguar_context));
@@ -222,7 +255,7 @@
 	system->cart = cart;
 	system->cart_size = cart_size;
 
-	memmap_chunk jag_m68k_map[8];
+	memmap_chunk *jag_m68k_map = calloc(8, sizeof(memmap_chunk));
 	for (uint32_t start = 0, index=0; index < 8; index++, start += 0x200000)
 	{
 		jag_m68k_map[index].start = start;
@@ -230,7 +263,7 @@
 		jag_m68k_map[index].mask = index ? 0x1FFFFF : 0xFFFFFF;
 		jag_m68k_map[index].aux_mask = bios_size - 1;
 		jag_m68k_map[index].ptr_index = index;
-		jag_m68k_map[index].flags = MMAP_READ | MMAP_WRITE | MMAP_PTR_IDX | MMAP_FUNC_NULL | MMAP_AUX_BUFF;
+		jag_m68k_map[index].flags = MMAP_READ | MMAP_WRITE | MMAP_PTR_IDX | MMAP_FUNC_NULL | MMAP_AUX_BUFF | MMAP_CODE;
 		jag_m68k_map[index].buffer = bios;
 		jag_m68k_map[index].read_16 = rom0_read_m68k;
 		jag_m68k_map[index].read_8 = rom0_read_m68k_b;
@@ -239,7 +272,7 @@
 	}
 	m68k_options *opts = malloc(sizeof(m68k_options));
 	init_m68k_opts(opts, jag_m68k_map, 8, 2);
-	system->m68k = init_68k_context(opts);
+	system->m68k = init_68k_context(opts, handle_m68k_reset);
 	system->m68k->system = system;
 	return system;
 }
@@ -260,6 +293,12 @@
 	if (filesize != fread(cart, 1, filesize, f)) {
 		fatal_error("Error reading from %s\n", filename);
 	}
+	filesize = (filesize + 1) & ~1L;
+	for (long i = 0; i < filesize; i+=2)
+	{
+		long index = i >> 1;
+		cart[index] = cart[index] >> 8 | cart[index] << 8;
+	}
 	while (filesize < *size)
 	{
 		cart[filesize / 2] = 0xFFFF;
--- a/jaguar.h	Thu Oct 06 09:34:31 2016 -0700
+++ b/jaguar.h	Thu Oct 06 09:35:35 2016 -0700
@@ -12,7 +12,8 @@
 	uint16_t     *cart;
 	uint32_t     bios_size;
 	uint32_t     cart_size;
-	uint32_t     memcon;
+	uint32_t     memcon1;
+	uint32_t     memcon2;
 	uint16_t     write_latch;
 	uint8_t      write_pending;
 	
@@ -25,6 +26,7 @@
 	uint16_t     *write_line_buffer;
 	uint16_t     *read_line_buffer;
 	
+	uint8_t      memcon_written;
 } jaguar_context;