all repos — mgba @ d10ed92c562aa0c724ade1cfffeb1c49c235b86c

mGBA Game Boy Advance Emulator

DS Slot-1: Detect Flash
Vicki Pfau vi@endrift.com
Thu, 23 Feb 2017 10:50:42 -0800
commit

d10ed92c562aa0c724ade1cfffeb1c49c235b86c

parent

bd80056758a208fcc67cdbdf8af2909f20e376ae

1 files changed, 44 insertions(+), 1 deletions(-)

jump to
M src/ds/slot1.csrc/ds/slot1.c

@@ -147,6 +147,11 @@ dscore->p->memory.slot1.spiAddress <<= 8;

dscore->p->memory.slot1.spiAddress |= datum; dscore->p->memory.slot1.spiAddressingRemaining -= 8; return 0xFF; + } else if (dscore->p->memory.slot1.spiAddress & 1) { + dscore->p->memory.slot1.spiAddress <<= 8; + dscore->p->memory.slot1.spiAddress |= datum; + dscore->p->memory.slot1.savedataType = DS_SAVEDATA_FLASH; + return 0xFF; } else { if (!_slot1GuaranteeSize(&dscore->p->memory.slot1)) { return 0xFF;

@@ -164,6 +169,34 @@ }

return 0xFF; } +static uint8_t _slot1SPIFlash(struct DSCommon* dscore, uint8_t datum) { + DSSlot1AUXSPICNT control = dscore->memory.io[DS_REG_AUXSPICNT >> 1]; + + if (dscore->p->memory.slot1.spiAddressingRemaining) { + dscore->p->memory.slot1.spiAddress <<= 8; + dscore->p->memory.slot1.spiAddress |= datum; + dscore->p->memory.slot1.spiAddressingRemaining -= 8; + return 0xFF; + } else { + if (!_slot1GuaranteeSize(&dscore->p->memory.slot1)) { + return 0xFF; + } + } + + switch (dscore->p->memory.slot1.spiCommand) { + case 0x03: // RD + return dscore->p->memory.slot1.spiData[dscore->p->memory.slot1.spiAddress++]; + case 0x02: // WR + dscore->p->memory.slot1.spiData[dscore->p->memory.slot1.spiAddress] = datum; + ++dscore->p->memory.slot1.spiAddress; + break; + default: + mLOG(DS_SLOT1, STUB, "Unimplemented SPI Flash write: %04X:%02X:%02X", control, dscore->p->memory.slot1.spiCommand, datum); + break; + } + return 0xFF; +} + static void _slot1SPI(struct mTiming* timing, void* context, uint32_t cyclesLate) { UNUSED(timing); UNUSED(cyclesLate);

@@ -179,7 +212,14 @@ if (oldValue == 0x0B && dscore->p->memory.slot1.savedataType == DS_SAVEDATA_AUTODETECT) {

dscore->p->memory.slot1.savedataType = DS_SAVEDATA_EEPROM512; } dscore->p->memory.slot1.spiAddress = 0; - dscore->p->memory.slot1.spiAddressingRemaining = 16; + switch (dscore->p->memory.slot1.savedataType) { + case DS_SAVEDATA_FLASH: + dscore->p->memory.slot1.spiAddressingRemaining = 24; + break; + default: + dscore->p->memory.slot1.spiAddressingRemaining = 16; + break; + } } else { switch (dscore->p->memory.slot1.spiCommand) { case 0x04: // WRDI

@@ -195,6 +235,9 @@ default:

switch (dscore->p->memory.slot1.savedataType) { case DS_SAVEDATA_AUTODETECT: newValue = _slot1SPIAutodetect(dscore, oldValue); + break; + case DS_SAVEDATA_FLASH: + newValue = _slot1SPIFlash(dscore, oldValue); break; default: mLOG(DS_SLOT1, STUB, "Unimplemented SPI write: %04X:%02X", control, oldValue);