From 0e02ee829f7f30c60c082e896190f7f78ef14761 Mon Sep 17 00:00:00 2001 From: Godzil Date: Fri, 9 Apr 2021 23:55:58 +0100 Subject: [PATCH] I'm constantly amazed by how poorly coded this emulator was. SRAM and EEPROM were inverted and not all known value was in there. Also fixed the rom metadata header that was missing one byte. --- source/memory.c | 1 - source/rom.c | 62 +++++++++++++++++++++++++++++++------------------ source/rom.h | 23 +++++++++++------- 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/source/memory.c b/source/memory.c index 4404cfe..5708b5f 100644 --- a/source/memory.c +++ b/source/memory.c @@ -436,7 +436,6 @@ void ws_memory_init(uint8_t *rom, uint32_t wsRomSize) sramAddressMask = 0x0; externalEepromAddressMask = 0x0; - if (sramSize > 0) { sramAddressMask = ws_rom_sramSize(ws_rom, romSize) - 1; diff --git a/source/rom.c b/source/rom.c index a040bcc..70daa64 100644 --- a/source/rom.c +++ b/source/rom.c @@ -77,16 +77,19 @@ uint8_t *ws_rom_load(char *path, uint32_t *romSize) const char *eepromSizeName[] = { [WS_EEPROM_SIZE_NONE] = "none", - [WS_EEPROM_SIZE_64k] = "64kb", - [WS_EEPROM_SIZE_256k] = "256kb", + [WS_EEPROM_SIZE_1k] = "1kbits", + [WS_EEPROM_SIZE_16k] = "16kbits", + [WS_EEPROM_SIZE_8k] = "8kbits", }; const char *sramSizeName[] = { [WS_SRAM_SIZE_NONE] = "none", - [WS_SRAM_SIZE_1k] = "1kb", - [WS_SRAM_SIZE_8k] = "8kb", - [WS_SRAM_SIZE_16k] = "16kb", + [WS_SRAM_SIZE_64k] = "64kbit", + [WS_SRAM_SIZE_256k] = "256kbit", + [WS_SRAM_SIZE_1M] = "1Mbits", + [WS_SRAM_SIZE_2M] = "2Mbits", + [WS_SRAM_SIZE_4M] = "4Mbits", }; void ws_rom_dumpInfo(uint8_t *wsrom, uint32_t romSize) @@ -97,8 +100,8 @@ void ws_rom_dumpInfo(uint8_t *wsrom, uint32_t romSize) Log(TLOG_NORMAL, "rom", "cart Id 0x%.2x", romHeader->cartId); Log(TLOG_NORMAL, "rom", "minimum system %s", (romHeader->minimumSupportSystem == 0) ? "Wonderswan mono" : "Wonderswan color"); Log(TLOG_NORMAL, "rom", "size %i Mbits", (romSize >> 20) << 3); - Log(TLOG_NORMAL, "rom", "eeprom %s", eepromSizeName[romHeader->eepromSize & 0xf]); - Log(TLOG_NORMAL, "rom", "sram %s", sramSizeName[romHeader->eepromSize & 0xF0]); + Log(TLOG_NORMAL, "rom", "eeprom %s", eepromSizeName[romHeader->saveSize & 0xf]); + Log(TLOG_NORMAL, "rom", "sram %s", sramSizeName[romHeader->saveSize & 0xF0]); Log(TLOG_NORMAL, "rom", "rtc %s", (romHeader->realtimeClock) ? "Yes" : "None"); Log(TLOG_NORMAL, "rom", "checksum 0x%.4x", romHeader->checksum); } @@ -116,7 +119,7 @@ void ws_rom_dumpInfo(uint8_t *wsrom, uint32_t romSize) //////////////////////////////////////////////////////////////////////////////// ws_romHeaderStruct *ws_rom_getHeader(uint8_t *wsrom, uint32_t wsromSize) { - ws_romHeaderStruct *wsromHeader = (ws_romHeaderStruct *)(wsrom + wsromSize - 10); + ws_romHeaderStruct *wsromHeader = (ws_romHeaderStruct *)(wsrom + wsromSize - sizeof(ws_romHeaderStruct)); return (wsromHeader); } @@ -136,19 +139,28 @@ uint32_t ws_rom_sramSize(uint8_t *wsrom, uint32_t wsromSize) { ws_romHeaderStruct *romHeader = ws_rom_getHeader(wsrom, wsromSize); - switch (romHeader->eepromSize & 0xf0) + switch (romHeader->saveSize & 0x0f) { case WS_SRAM_SIZE_NONE: - return (0); + return 0; - case WS_SRAM_SIZE_1k: - return (0x400); + case WS_SRAM_SIZE_64k: + return 0x2000; - case WS_SRAM_SIZE_16k: - return (0x4000); + case WS_SRAM_SIZE_256k: + return 0x8000; - case WS_SRAM_SIZE_8k: - return (0x2000); + case WS_SRAM_SIZE_1M: + return 0x20000; + + case WS_SRAM_SIZE_2M: + return 0x40000; + + case WS_SRAM_SIZE_4M: + return 0x80000; + + default: + Log(TLOG_PANIC, "ROM", "Invalid SRAM size (%02X)! Please check cart metadata!", romHeader->saveSize); } return (0); @@ -169,16 +181,22 @@ uint32_t ws_rom_eepromSize(uint8_t *wsrom, uint32_t wsromSize) { ws_romHeaderStruct *romHeader = ws_rom_getHeader(wsrom, wsromSize); - switch (romHeader->eepromSize & 0xf) + switch (romHeader->saveSize & 0xf0) { case WS_EEPROM_SIZE_NONE: - return (0); + return 0; - case WS_EEPROM_SIZE_64k: - return (0x10000); + case WS_EEPROM_SIZE_1k: + return 0x80; - case WS_EEPROM_SIZE_256k: - return (0x40000); + case WS_EEPROM_SIZE_16k: + return 0x800; + + case WS_EEPROM_SIZE_8k: + return 0x100; + + default: + Log(TLOG_PANIC, "ROM", "Invalid SRAM size (%02X)! Please check cart metadata!", romHeader->saveSize); } return (0); diff --git a/source/rom.h b/source/rom.h index 0e02b41..cbb180a 100644 --- a/source/rom.h +++ b/source/rom.h @@ -30,24 +30,31 @@ #define WS_ROM_SIZE_128MBIT 9 #define WS_EEPROM_SIZE_NONE 0 -#define WS_SRAM_SIZE_NONE 0 -#define WS_EEPROM_SIZE_64k 1 -#define WS_EEPROM_SIZE_256k 2 -#define WS_SRAM_SIZE_1k 10 -#define WS_SRAM_SIZE_16k 20 -#define WS_SRAM_SIZE_8k 50 +#define WS_EEPROM_SIZE_1k 0x10 +#define WS_EEPROM_SIZE_16k 0x20 +#define WS_EEPROM_SIZE_8k 0x50 +#define WS_SRAM_SIZE_NONE 0 +#define WS_SRAM_SIZE_64k 0x01 +#define WS_SRAM_SIZE_256k 0x02 +#define WS_SRAM_SIZE_1M 0x03 +#define WS_SRAM_SIZE_2M 0x04 +#define WS_SRAM_SIZE_4M 0x05 + +#pragma pack(1) typedef struct ws_romHeaderStruct { uint8_t developperId; uint8_t minimumSupportSystem; uint8_t cartId; + uint8_t gameVertion; uint8_t romSize; - uint8_t eepromSize; - uint8_t additionnalCapabilities; + uint8_t saveSize; + uint8_t cartFlags; uint8_t realtimeClock; uint16_t checksum; } ws_romHeaderStruct; +#pragma pack() uint8_t *ws_rom_load(char *path, uint32_t *romSize); void ws_rom_dumpInfo(uint8_t *wsrom, uint32_t wsromSize);