diff --git a/src/Cartridge.cpp b/src/Cartridge.cpp index 7fbb087..54e62d6 100644 --- a/src/Cartridge.cpp +++ b/src/Cartridge.cpp @@ -35,6 +35,7 @@ Cartridge::Cartridge() m_szFileName[0] = 0; m_iROMBankCount = 0; m_bPAL = false; + m_bSRAM = false; m_iCRC = 0; } @@ -59,6 +60,7 @@ void Cartridge::Reset() m_szFileName[0] = 0; m_iROMBankCount = 0; m_bPAL = false; + m_bSRAM = false; m_iCRC = 0; } @@ -72,6 +74,11 @@ bool Cartridge::IsPAL() const return m_bPAL; } +bool Cartridge::HasSRAM() const +{ + return m_bSRAM; +} + bool Cartridge::IsValidROM() const { return m_bValidROM; @@ -306,6 +313,7 @@ bool Cartridge::LoadFromBuffer(const u8* buffer, int size) bool Cartridge::GatherMetadata(u32 crc) { m_bPAL = false; + m_bSRAM = false; Log("ROM Size: %d KB", m_iROMSize / 1024); @@ -372,6 +380,12 @@ void Cartridge::GetInfoFromDB(u32 crc) found = true; Log("ROM found in database: %s. CRC: %X", kGameDatabase[i].title, crc); + + if (kGameDatabase[i].mode & GC_GameDBMode_SRAM) + { + Log("Cartridge with SRAM"); + m_bSRAM = true; + } } else i++; diff --git a/src/Cartridge.h b/src/Cartridge.h index 99f07ee..b2caa5d 100644 --- a/src/Cartridge.h +++ b/src/Cartridge.h @@ -52,6 +52,7 @@ class Cartridge void Reset(); u32 GetCRC() const; bool IsPAL() const; + bool HasSRAM() const; bool IsValidROM() const; bool IsReady() const; CartridgeTypes GetType() const; @@ -80,6 +81,7 @@ class Cartridge int m_iROMBankCount; bool m_bPAL; u32 m_iCRC; + bool m_bSRAM; }; #endif /* CARTRIDGE_H */ diff --git a/src/Memory_inline.h b/src/Memory_inline.h index 9d8813b..94499f4 100644 --- a/src/Memory_inline.h +++ b/src/Memory_inline.h @@ -92,11 +92,23 @@ inline void Memory::Write(u16 address, u8 value) case 0x8000: case 0xA000: case 0xC000: - case 0xE000: { Log("--> ** Attempting to write on ROM: %X %X", address, value); break; } + case 0xE000: + { + if (m_pCartridge->HasSRAM() && (address >= 0xE000) && (address < 0xE800)) + { + u8* pRom = m_pCartridge->GetROM(); + pRom[(address + 0x800) & 0x7FFF] = value; + } + else + { + Log("--> ** Attempting to write on ROM: %X %X", address, value); + } + break; + } } } diff --git a/src/game_db.h b/src/game_db.h index 1747f4f..797145d 100644 --- a/src/game_db.h +++ b/src/game_db.h @@ -20,17 +20,24 @@ #ifndef GAME_DB_H #define GAME_DB_H +enum GC_GameDBMode +{ + GC_GameDBMode_None = 0, + GC_GameDBMode_SRAM = 1, +}; + struct GC_GameDBEntry { - u32 crc; - const char* title; + u32 crc; + const char* title; + GC_GameDBMode mode; }; const GC_GameDBEntry kGameDatabase[] = { - {0xFFFFFFFF, "xxx"}, - - {0, 0} + {0xFEE15196, "Lord of the Dungeon", GC_GameDBMode_SRAM}, + {0x1053F610, "Lord of the Dungeon", GC_GameDBMode_SRAM}, + {0, 0, GC_GameDBMode_None} }; const uint32_t kCRC32_tab[] =