GBA: Get GB Player working with savestates

This commit is contained in:
Jeffrey Pfau 2015-07-13 21:19:01 -07:00
parent 43d9c8b754
commit 5ed05dc66f
3 changed files with 26 additions and 21 deletions

View File

@ -27,7 +27,6 @@ static void _rumbleReadPins(struct GBACartridgeHardware* hw);
static void _lightReadPins(struct GBACartridgeHardware* hw);
static uint16_t _gbpRead(struct GBAKeyCallback*);
static bool _gbpSioLoad(struct GBASIODriver* driver);
static uint16_t _gbpSioWriteRegister(struct GBASIODriver* driver, uint32_t address, uint16_t value);
static int32_t _gbpSioProcessEvents(struct GBASIODriver* driver, int32_t cycles);
@ -52,7 +51,6 @@ void GBAHardwareClear(struct GBACartridgeHardware* hw) {
hw->direction = GPIO_WRITE_ONLY;
hw->pinState = 0;
hw->direction = 0;
hw->gbpRunning = false;
}
void GBAHardwareGPIOWrite(struct GBACartridgeHardware* hw, uint32_t address, uint16_t value) {
@ -501,7 +499,7 @@ bool GBAHardwarePlayerCheckScreen(const struct GBAVideo* video) {
}
void GBAHardwarePlayerUpdate(struct GBA* gba) {
if (gba->memory.hw.gbpRunning) {
if (gba->memory.hw.devices & HW_GB_PLAYER) {
if (GBAHardwarePlayerCheckScreen(&gba->video)) {
++gba->memory.hw.gbpInputsPosted;
gba->memory.hw.gbpInputsPosted %= 3;
@ -517,17 +515,18 @@ void GBAHardwarePlayerUpdate(struct GBA* gba) {
return;
}
if (GBAHardwarePlayerCheckScreen(&gba->video)) {
gba->memory.hw.gbpRunning = true;
gba->memory.hw.devices |= HW_GB_PLAYER;
gba->memory.hw.gbpCallback.d.readKeys = _gbpRead;
gba->memory.hw.gbpCallback.p = &gba->memory.hw;
gba->memory.hw.gbpDriver.d.init = 0;
gba->memory.hw.gbpDriver.d.deinit = 0;
gba->memory.hw.gbpDriver.d.load = _gbpSioLoad;
gba->memory.hw.gbpDriver.d.load = 0;
gba->memory.hw.gbpDriver.d.unload = 0;
gba->memory.hw.gbpDriver.d.writeRegister = _gbpSioWriteRegister;
gba->memory.hw.gbpDriver.d.processEvents = _gbpSioProcessEvents;
gba->memory.hw.gbpDriver.p = &gba->memory.hw;
gba->memory.hw.gbpInputsPosted = 0;
gba->memory.hw.gbpNextEvent = INT_MAX;
gba->keyCallback = &gba->memory.hw.gbpCallback.d;
GBASIOSetDriver(&gba->sio, &gba->memory.hw.gbpDriver.d, SIO_NORMAL_32);
}
@ -541,13 +540,6 @@ uint16_t _gbpRead(struct GBAKeyCallback* callback) {
return 0x3FF;
}
bool _gbpSioLoad(struct GBASIODriver* driver) {
struct GBAGBPSIODriver* gbp = (struct GBAGBPSIODriver*) driver;
gbp->p->gbpTxPosition = 0;
gbp->p->gbpNextEvent = INT_MAX;
return true;
}
uint16_t _gbpSioWriteRegister(struct GBASIODriver* driver, uint32_t address, uint16_t value) {
struct GBAGBPSIODriver* gbp = (struct GBAGBPSIODriver*) driver;
if (address == REG_SIOCNT) {
@ -608,6 +600,9 @@ void GBAHardwareSerialize(const struct GBACartridgeHardware* hw, struct GBASeria
state->hw.lightCounter = hw->lightCounter;
state->hw.lightSample = hw->lightSample;
state->hw.lightEdge = hw->lightEdge;
state->hw.gbpInputsPosted = hw->gbpInputsPosted;
state->hw.gbpTxPosition = hw->gbpTxPosition;
state->hw.gbpNextEvent = hw->gbpNextEvent;
}
void GBAHardwareDeserialize(struct GBACartridgeHardware* hw, const struct GBASerializedState* state) {
@ -623,4 +618,7 @@ void GBAHardwareDeserialize(struct GBACartridgeHardware* hw, const struct GBASer
hw->lightCounter = state->hw.lightCounter;
hw->lightSample = state->hw.lightSample;
hw->lightEdge = state->hw.lightEdge;
hw->gbpInputsPosted = state->hw.gbpInputsPosted;
hw->gbpTxPosition = state->hw.gbpTxPosition;
hw->gbpNextEvent = state->hw.gbpNextEvent;
}

View File

@ -33,7 +33,8 @@ enum GBAHardwareDevice {
HW_RUMBLE = 2,
HW_LIGHT_SENSOR = 4,
HW_GYRO = 8,
HW_TILT = 16
HW_TILT = 16,
HW_GB_PLAYER = 32
};
enum GPIORegister {
@ -116,12 +117,11 @@ struct GBACartridgeHardware {
uint16_t tiltY;
int tiltState;
bool gbpRunning;
int gbpInputsPosted;
unsigned gbpInputsPosted;
int gbpTxPosition;
int32_t gbpNextEvent;
struct GBAGBPKeyCallback gbpCallback;
struct GBAGBPSIODriver gbpDriver;
int32_t gbpNextEvent;
};
void GBAHardwareInit(struct GBACartridgeHardware* gpio, uint16_t* gpioBase);

View File

@ -136,7 +136,8 @@ extern const uint32_t GBA_SAVESTATE_MAGIC;
* | bit 2: Has light sensor value
* | bit 3: Has gyroscope value
* | bit 4: Has tilt values
* | bits 5 - 7: Reserved
* | bit 5: Has Game Boy Player attached
* | bits 6 - 7: Reserved
* | 0x002B8 - 0x002B9: Gyroscope sample
* | 0x002BA - 0x002BB: Tilt x sample
* | 0x002BC - 0x002BD: Tilt y sample
@ -149,8 +150,11 @@ extern const uint32_t GBA_SAVESTATE_MAGIC;
* | 0x002C0 - 0x002C0: Light sample
* | 0x002C1 - 0x002C3: Flags
* | bits 0 - 1: Tilt state machine
* | bits 2 - 31: Reserved
* 0x002C4 - 0x002DF: Reserved (leave zero)
* | bits 2 - 3: GB Player inputs posted
* | bits 4 - 8: GB Player transmit position
* | bits 9 - 23: Reserved
* 0x002C4 - 0x002C7: Game Boy Player next event
* 0x002C8 - 0x002DF: Reserved (leave zero)
* 0x002E0 - 0x002EF: Savedata state
* | 0x002E0 - 0x002E0: Savedata type
* | 0x002E1 - 0x002E1: Savedata command (see savedata.h)
@ -282,10 +286,13 @@ struct GBASerializedState {
unsigned lightCounter : 12;
unsigned lightSample : 8;
unsigned tiltState : 2;
unsigned : 22;
unsigned gbpInputsPosted : 2;
unsigned gbpTxPosition : 5;
unsigned : 15;
uint32_t gbpNextEvent : 32;
} hw;
uint32_t reservedHardware[7];
uint32_t reservedHardware[6];
struct {
unsigned type : 8;