Naomi: Decrypt M4 roms header to get game id. Refactoring and clean up

This commit is contained in:
Flyinghead 2018-11-06 14:30:34 +01:00
parent 22558d190a
commit eff998dc53
4 changed files with 41 additions and 28 deletions

View File

@ -272,3 +272,18 @@ M4Cartridge::~M4Cartridge()
if (m_key_data != NULL) if (m_key_data != NULL)
free(m_key_data); 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;
}

View File

@ -38,6 +38,7 @@ public:
virtual void* GetDmaPtr(u32 &size) override; virtual void* GetDmaPtr(u32 &size) override;
virtual void AdvancePtr(u32 size) override; virtual void AdvancePtr(u32 size) override;
virtual std::string GetGameId() override;
void SetM4Id(u16 m4id) { this->m4id = m4id; } void SetM4Id(u16 m4id) { this->m4id = m4id; }
void SetKeyData(u8 *key_data) void SetKeyData(u8 *key_data)

View File

@ -11,8 +11,6 @@
#include "m4cartridge.h" #include "m4cartridge.h"
Cartridge *CurrentCartridge; Cartridge *CurrentCartridge;
u8* RomPtr;
u32 RomSize;
#if HOST_OS == OS_WINDOWS #if HOST_OS == OS_WINDOWS
typedef HANDLE fd_t; typedef HANDLE fd_t;
@ -30,7 +28,6 @@ u32 RomSize;
fd_t* RomCacheMap; fd_t* RomCacheMap;
u32 RomCacheMapCount; u32 RomCacheMapCount;
char SelectedFile[512];
char naomi_game_id[33]; char naomi_game_id[33];
extern s8 joyx[4],joyy[4]; 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); verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
size_t read = zip_fread(file, buf, bios->blobs[romid].length); 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; u16 *from = (u16 *)buf;
for (int i = bios->blobs[romid].length / 2; --i >= 0; to++) for (int i = bios->blobs[romid].length / 2; --i >= 0; to++)
*to++ = *from++; *to++ = *from++;
@ -318,11 +315,6 @@ static bool naomi_cart_LoadZip(char *filename)
die("Unsupported cartridge type\n"); die("Unsupported cartridge type\n");
break; break;
} }
// RomSize = game->size;
// RomPtr = (u8 *)malloc(RomSize);
// memset(RomPtr, 0xFF, RomSize);
// cartridge_type = game->cart_type;
// cartridge_key = game->key;
int romid = 0; int romid = 0;
while (game->blobs[romid].filename != NULL) while (game->blobs[romid].filename != NULL)
@ -388,14 +380,8 @@ static bool naomi_cart_LoadZip(char *filename)
} }
zip_close(zip_archive); zip_close(zip_archive);
{ strcpy(naomi_game_id, CurrentCartridge->GetGameId().c_str());
u32 len = sizeof(naomi_game_id) - 1; printf("NAOMI GAME ID [%s]\n", naomi_game_id);
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);
}
return true; return true;
@ -440,6 +426,9 @@ bool naomi_cart_LoadRom(char* file)
if (pdot != NULL && (!strcmp(pdot, ".zip") || !strcmp(pdot, ".ZIP"))) if (pdot != NULL && (!strcmp(pdot, ".zip") || !strcmp(pdot, ".ZIP")))
return naomi_cart_LoadZip(file); return naomi_cart_LoadZip(file);
u8* RomPtr;
u32 RomSize;
if (pdot != NULL && (!strcmp(pdot, ".lst") || !strcmp(pdot, ".LST"))) if (pdot != NULL && (!strcmp(pdot, ".lst") || !strcmp(pdot, ".LST")))
{ {
// LST file // 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]); printf("-Mapping ROM FAILED: %s @ %08x size %x\n", files[i].c_str(), fstart[i], fsize[i]);
return false; 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"); printf("\nMapped ROM Successfully !\n\n");
CurrentCartridge = new DecryptedCartridge(RomPtr, RomSize); CurrentCartridge = new DecryptedCartridge(RomPtr, RomSize);
strcpy(naomi_game_id, CurrentCartridge->GetGameId().c_str());
printf("NAOMI GAME ID [%s]\n", naomi_game_id);
return true; return true;
} }
bool naomi_cart_SelectFile(void* handle) bool naomi_cart_SelectFile(void* handle)
{ {
char SelectedFile[512];
cfgLoadStr("config", "image", SelectedFile, "null"); cfgLoadStr("config", "image", SelectedFile, "null");
#if HOST_OS == OS_WINDOWS #if HOST_OS == OS_WINDOWS
@ -739,6 +721,19 @@ void* Cartridge::GetPtr(u32 offset, u32& size)
return &RomPtr[offset]; 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) void* NaomiCartridge::GetDmaPtr(u32& size)
{ {

View File

@ -1,6 +1,7 @@
#ifndef NAOMI_CART_H #ifndef NAOMI_CART_H
#define NAOMI_CART_H #define NAOMI_CART_H
#include <string>
#include "types.h" #include "types.h"
class Cartridge class Cartridge
@ -17,6 +18,7 @@ public:
virtual void* GetPtr(u32 offset, u32& size); virtual void* GetPtr(u32 offset, u32& size);
virtual void* GetDmaPtr(u32 &size) = 0; virtual void* GetDmaPtr(u32 &size) = 0;
virtual void AdvancePtr(u32 size) = 0; virtual void AdvancePtr(u32 size) = 0;
virtual std::string GetGameId();
protected: protected:
u8* RomPtr; u8* RomPtr;