changeset 2234:b6fdedd3b070

Fix SRAM endianness for word-wide SRAM combined with Sega mapper
author Michael Pavone <pavone@retrodev.com>
date Sun, 11 Sep 2022 15:04:42 -0700
parents 54cd40fc0da5
children 93918a6a8ab7
files sega_mapper.c
diffstat 1 files changed, 6 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/sega_mapper.c	Thu Sep 08 21:18:30 2022 -0700
+++ b/sega_mapper.c	Sun Sep 11 15:04:42 2022 -0700
@@ -5,10 +5,11 @@
 {
 	genesis_context * gen = context->system;
 	address &= gen->save_ram_mask;
+	uint16_t *word_storage = (uint16_t *)gen->save_storage;
 	switch(gen->save_type)
 	{
 	case RAM_FLAG_BOTH:
-		return gen->save_storage[address] << 8 | gen->save_storage[address+1];
+		return word_storage[address >> 1];
 	case RAM_FLAG_EVEN:
 		return gen->save_storage[address >> 1] << 8 | 0xFF;
 	case RAM_FLAG_ODD:
@@ -24,7 +25,7 @@
 	switch(gen->save_type)
 	{
 	case RAM_FLAG_BOTH:
-		return gen->save_storage[address];
+		return gen->save_storage[address ^ 1];
 	case RAM_FLAG_EVEN:
 		if (address & 1) {
 			return 0xFF;
@@ -53,12 +54,12 @@
 		return context;
 	}
 	if ((gen->bank_regs[0] & 0x3) == 1) {
+		uint16_t *word_storage = (uint16_t *)gen->save_storage;
 		address &= gen->save_ram_mask;
 		switch(gen->save_type)
 		{
 		case RAM_FLAG_BOTH:
-			gen->save_storage[address] = value >> 8;
-			gen->save_storage[address+1] = value;
+			word_storage[address >> 1] = value;
 			break;
 		case RAM_FLAG_EVEN:
 			gen->save_storage[address >> 1] = value >> 8;
@@ -79,7 +80,7 @@
 		switch(gen->save_type)
 		{
 		case RAM_FLAG_BOTH:
-			gen->save_storage[address] = value;
+			gen->save_storage[address ^ 1] = value;
 			break;
 		case RAM_FLAG_EVEN:
 			if (!(address & 1)) {