Naomi: Decrypt M4 roms header to get game id. Refactoring and clean up
This commit is contained in:
parent
22558d190a
commit
eff998dc53
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef NAOMI_CART_H
|
||||
#define NAOMI_CART_H
|
||||
|
||||
#include <string>
|
||||
#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;
|
||||
|
|
Loading…
Reference in New Issue