mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-11-14 21:37:42 -07:00
213 lines
4.8 KiB
C++
213 lines
4.8 KiB
C++
/*
|
|
Copyright 2016-2022 melonDS team
|
|
|
|
This file is part of melonDS.
|
|
|
|
melonDS is free software: you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation, either version 3 of the License, or (at your option)
|
|
any later version.
|
|
|
|
melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with melonDS. If not, see http://www.gnu.org/licenses/.
|
|
*/
|
|
|
|
#ifndef GBACART_H
|
|
#define GBACART_H
|
|
|
|
#include "types.h"
|
|
#include "Savestate.h"
|
|
|
|
namespace GBACart
|
|
{
|
|
|
|
// CartCommon -- base code shared by all cart types
|
|
class CartCommon
|
|
{
|
|
public:
|
|
CartCommon();
|
|
virtual ~CartCommon();
|
|
|
|
virtual u32 Type() { return 0x001; }
|
|
virtual u32 Checksum() { return 0; }
|
|
|
|
virtual void Reset();
|
|
|
|
virtual void DoSavestate(Savestate* file);
|
|
|
|
virtual void SetupSave(u32 type);
|
|
virtual void LoadSave(const u8* savedata, u32 savelen);
|
|
|
|
virtual int SetInput(int num, bool pressed);
|
|
|
|
virtual u16 ROMRead(u32 addr);
|
|
virtual void ROMWrite(u32 addr, u16 val);
|
|
|
|
virtual u8 SRAMRead(u32 addr);
|
|
virtual void SRAMWrite(u32 addr, u8 val);
|
|
};
|
|
|
|
// CartGame -- regular retail game cart (ROM, SRAM)
|
|
class CartGame : public CartCommon
|
|
{
|
|
public:
|
|
CartGame(u8* rom, u32 len);
|
|
virtual ~CartGame() override;
|
|
|
|
virtual u32 Type() override { return 0x101; }
|
|
virtual u32 Checksum() override;
|
|
|
|
virtual void Reset() override;
|
|
|
|
virtual void DoSavestate(Savestate* file) override;
|
|
|
|
virtual void SetupSave(u32 type) override;
|
|
virtual void LoadSave(const u8* savedata, u32 savelen) override;
|
|
|
|
virtual u16 ROMRead(u32 addr) override;
|
|
virtual void ROMWrite(u32 addr, u16 val) override;
|
|
|
|
virtual u8 SRAMRead(u32 addr) override;
|
|
virtual void SRAMWrite(u32 addr, u8 val) override;
|
|
|
|
protected:
|
|
virtual void ProcessGPIO();
|
|
|
|
u8 SRAMRead_EEPROM(u32 addr);
|
|
void SRAMWrite_EEPROM(u32 addr, u8 val);
|
|
u8 SRAMRead_FLASH(u32 addr);
|
|
void SRAMWrite_FLASH(u32 addr, u8 val);
|
|
u8 SRAMRead_SRAM(u32 addr);
|
|
void SRAMWrite_SRAM(u32 addr, u8 val);
|
|
|
|
u8* ROM;
|
|
u32 ROMLength;
|
|
|
|
struct
|
|
{
|
|
u16 data;
|
|
u16 direction;
|
|
u16 control;
|
|
|
|
} GPIO;
|
|
|
|
enum SaveType
|
|
{
|
|
S_NULL,
|
|
S_EEPROM4K,
|
|
S_EEPROM64K,
|
|
S_SRAM256K,
|
|
S_FLASH512K,
|
|
S_FLASH1M
|
|
};
|
|
|
|
// from DeSmuME
|
|
struct
|
|
{
|
|
u8 state;
|
|
u8 cmd;
|
|
u8 device;
|
|
u8 manufacturer;
|
|
u8 bank;
|
|
|
|
} SRAMFlashState;
|
|
|
|
u8* SRAM;
|
|
u32 SRAMLength;
|
|
SaveType SRAMType;
|
|
};
|
|
|
|
// CartGameSolarSensor -- Boktai game cart
|
|
class CartGameSolarSensor : public CartGame
|
|
{
|
|
public:
|
|
CartGameSolarSensor(u8* rom, u32 len);
|
|
virtual ~CartGameSolarSensor() override;
|
|
|
|
virtual u32 Type() override { return 0x102; }
|
|
|
|
virtual void Reset() override;
|
|
|
|
virtual void DoSavestate(Savestate* file) override;
|
|
|
|
virtual int SetInput(int num, bool pressed) override;
|
|
|
|
private:
|
|
virtual void ProcessGPIO() override;
|
|
|
|
static const int kLuxLevels[11];
|
|
|
|
bool LightEdge;
|
|
u8 LightCounter;
|
|
u8 LightSample;
|
|
u8 LightLevel;
|
|
};
|
|
|
|
// CartRAMExpansion -- RAM expansion cart (DS browser, ...)
|
|
class CartRAMExpansion : public CartCommon
|
|
{
|
|
public:
|
|
CartRAMExpansion();
|
|
~CartRAMExpansion() override;
|
|
|
|
virtual u32 Type() override { return 0x201; }
|
|
|
|
void Reset() override;
|
|
|
|
void DoSavestate(Savestate* file) override;
|
|
|
|
u16 ROMRead(u32 addr) override;
|
|
void ROMWrite(u32 addr, u16 val) override;
|
|
|
|
private:
|
|
u8 RAM[0x800000];
|
|
u16 RAMEnable;
|
|
};
|
|
|
|
// possible inputs for GBA carts that might accept user input
|
|
enum
|
|
{
|
|
Input_SolarSensorDown = 0,
|
|
Input_SolarSensorUp,
|
|
};
|
|
|
|
extern bool CartInserted;
|
|
extern u8* CartROM;
|
|
extern u32 CartROMSize;
|
|
|
|
bool Init();
|
|
void DeInit();
|
|
void Reset();
|
|
|
|
void DoSavestate(Savestate* file);
|
|
|
|
bool LoadROM(const u8* romdata, u32 romlen);
|
|
void LoadSave(const u8* savedata, u32 savelen);
|
|
|
|
void LoadAddon(int type);
|
|
|
|
void EjectCart();
|
|
|
|
//bool LoadROM(const char* path, const char* sram);
|
|
//bool LoadROM(const u8* romdata, u32 filelength, const char *sram);
|
|
//void RelocateSave(const char* path, bool write);
|
|
|
|
// TODO: make more flexible, support nonbinary inputs
|
|
int SetInput(int num, bool pressed);
|
|
|
|
void SetOpenBusDecay(u16 val);
|
|
|
|
u16 ROMRead(u32 addr);
|
|
void ROMWrite(u32 addr, u16 val);
|
|
|
|
u8 SRAMRead(u32 addr);
|
|
void SRAMWrite(u32 addr, u8 val);
|
|
|
|
}
|
|
|
|
#endif // GBACART_H
|