From eff998dc53b090b6381ea87231b5f4951c03bc0f Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 6 Nov 2018 14:30:34 +0100 Subject: [PATCH] Naomi: Decrypt M4 roms header to get game id. Refactoring and clean up --- core/hw/naomi/m4cartridge.cpp | 15 +++++++++++ core/hw/naomi/m4cartridge.h | 1 + core/hw/naomi/naomi_cart.cpp | 51 ++++++++++++++++------------------- core/hw/naomi/naomi_cart.h | 2 ++ 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/core/hw/naomi/m4cartridge.cpp b/core/hw/naomi/m4cartridge.cpp index 87e97e8cc..ceee06a1d 100644 --- a/core/hw/naomi/m4cartridge.cpp +++ b/core/hw/naomi/m4cartridge.cpp @@ -272,3 +272,18 @@ M4Cartridge::~M4Cartridge() if (m_key_data != NULL) free(m_key_data); } + +std::string M4Cartridge::GetGameId() +{ + if (RomSize < 0x30 + 0x20) + return "(ROM too small)"; + + rom_cur_address = 0; + enc_reset(); + enc_fill(); + + std::string game_id((char *)(buffer + 0x30), 0x20); + while (!game_id.empty() && game_id.back() == ' ') + game_id.pop_back(); + return game_id; +} diff --git a/core/hw/naomi/m4cartridge.h b/core/hw/naomi/m4cartridge.h index 825b40f9c..5505c406f 100644 --- a/core/hw/naomi/m4cartridge.h +++ b/core/hw/naomi/m4cartridge.h @@ -38,6 +38,7 @@ public: virtual void* GetDmaPtr(u32 &size) override; virtual void AdvancePtr(u32 size) override; + virtual std::string GetGameId() override; void SetM4Id(u16 m4id) { this->m4id = m4id; } void SetKeyData(u8 *key_data) diff --git a/core/hw/naomi/naomi_cart.cpp b/core/hw/naomi/naomi_cart.cpp index ca45f3f24..fb121a53c 100644 --- a/core/hw/naomi/naomi_cart.cpp +++ b/core/hw/naomi/naomi_cart.cpp @@ -11,8 +11,6 @@ #include "m4cartridge.h" Cartridge *CurrentCartridge; -u8* RomPtr; -u32 RomSize; #if HOST_OS == OS_WINDOWS typedef HANDLE fd_t; @@ -30,7 +28,6 @@ u32 RomSize; fd_t* RomCacheMap; u32 RomCacheMapCount; -char SelectedFile[512]; char naomi_game_id[33]; extern s8 joyx[4],joyy[4]; @@ -232,7 +229,7 @@ static bool naomi_LoadBios(const char *filename) } verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE); size_t read = zip_fread(file, buf, bios->blobs[romid].length); - u16 *to = (u16 *)(RomPtr + bios->blobs[romid].offset); + u16 *to = (u16 *)(sys_rom.data + bios->blobs[romid].offset); u16 *from = (u16 *)buf; for (int i = bios->blobs[romid].length / 2; --i >= 0; to++) *to++ = *from++; @@ -318,11 +315,6 @@ static bool naomi_cart_LoadZip(char *filename) die("Unsupported cartridge type\n"); break; } -// RomSize = game->size; -// RomPtr = (u8 *)malloc(RomSize); -// memset(RomPtr, 0xFF, RomSize); -// cartridge_type = game->cart_type; -// cartridge_key = game->key; int romid = 0; while (game->blobs[romid].filename != NULL) @@ -388,14 +380,8 @@ static bool naomi_cart_LoadZip(char *filename) } zip_close(zip_archive); - { - u32 len = sizeof(naomi_game_id) - 1; - u8 *game_id = (u8 *)CurrentCartridge->GetPtr(0x30, len); - memcpy(naomi_game_id, game_id, sizeof(naomi_game_id) - 1); - naomi_game_id[sizeof(naomi_game_id) - 1] = '\0'; - for (char *p = naomi_game_id + sizeof(naomi_game_id) - 2; *p == ' ' && p >= naomi_game_id; *p-- = '\0'); - printf("NAOMI GAME ID [%s]\n", naomi_game_id); - } + strcpy(naomi_game_id, CurrentCartridge->GetGameId().c_str()); + printf("NAOMI GAME ID [%s]\n", naomi_game_id); return true; @@ -440,6 +426,9 @@ bool naomi_cart_LoadRom(char* file) if (pdot != NULL && (!strcmp(pdot, ".zip") || !strcmp(pdot, ".ZIP"))) return naomi_cart_LoadZip(file); + u8* RomPtr; + u32 RomSize; + if (pdot != NULL && (!strcmp(pdot, ".lst") || !strcmp(pdot, ".LST"))) { // LST file @@ -639,17 +628,6 @@ bool naomi_cart_LoadRom(char* file) printf("-Mapping ROM FAILED: %s @ %08x size %x\n", files[i].c_str(), fstart[i], fsize[i]); return false; } - if (fstart[i] == 0 && fsize[i] >= 0x50) - { - memcpy(naomi_game_id, RomDest + 0x30, sizeof(naomi_game_id) - 1); - naomi_game_id[sizeof(naomi_game_id) - 1] = '\0'; - if (!strcmp("AWNAOMI ", naomi_game_id) && fsize[i] >= 0xFF50) - { - memcpy(naomi_game_id, RomDest + 0xFF30, sizeof(naomi_game_id) - 1); - } - for (char *p = naomi_game_id + sizeof(naomi_game_id) - 2; *p == ' ' && p >= naomi_game_id; *p-- = '\0'); - printf("NAOMI GAME ID [%s]\n", naomi_game_id); - } } } @@ -657,12 +635,16 @@ bool naomi_cart_LoadRom(char* file) printf("\nMapped ROM Successfully !\n\n"); CurrentCartridge = new DecryptedCartridge(RomPtr, RomSize); + strcpy(naomi_game_id, CurrentCartridge->GetGameId().c_str()); + printf("NAOMI GAME ID [%s]\n", naomi_game_id); return true; } bool naomi_cart_SelectFile(void* handle) { + char SelectedFile[512]; + cfgLoadStr("config", "image", SelectedFile, "null"); #if HOST_OS == OS_WINDOWS @@ -739,6 +721,19 @@ void* Cartridge::GetPtr(u32 offset, u32& size) return &RomPtr[offset]; } +std::string Cartridge::GetGameId() { + if (RomSize < 0x30 + 0x20) + return "(ROM too small)"; + + std::string game_id((char *)RomPtr + 0x30, 0x20); + if (game_id == "AWNAOMI " && RomSize >= 0xFF50) + { + game_id = std::string((char *)RomPtr + 0xFF30, 0x20); + } + while (!game_id.empty() && game_id.back() == ' ') + game_id.pop_back(); + return game_id; +} void* NaomiCartridge::GetDmaPtr(u32& size) { diff --git a/core/hw/naomi/naomi_cart.h b/core/hw/naomi/naomi_cart.h index d8991960f..180cd0d70 100644 --- a/core/hw/naomi/naomi_cart.h +++ b/core/hw/naomi/naomi_cart.h @@ -1,6 +1,7 @@ #ifndef NAOMI_CART_H #define NAOMI_CART_H +#include #include "types.h" class Cartridge @@ -17,6 +18,7 @@ public: virtual void* GetPtr(u32 offset, u32& size); virtual void* GetDmaPtr(u32 &size) = 0; virtual void AdvancePtr(u32 size) = 0; + virtual std::string GetGameId(); protected: u8* RomPtr;