libretro: add SIO Control register (GBA)

- emulate SIOCNT reg, which is still needed for some games to trigger IRQ's even in single, non-link mode
- Fixes Digimon Racing (Europe) stuck in intro as reported in libretro docs page https://docs.libretro.com/library/vba_m/#compatibility
- Related PR: f9efb79a7d (diff-385704891f00846c986e9056b5d7c5a5)
This commit is contained in:
retro-wertz 2019-07-23 19:06:28 +08:00
parent f09a9aa99a
commit 53ce6fb054
1 changed files with 23 additions and 1 deletions

View File

@ -90,6 +90,8 @@ bool EmuReseted;
int winGbPrinterEnabled; int winGbPrinterEnabled;
bool gba_joybus_active = false; bool gba_joybus_active = false;
#define UPDATE_REG(address, value) WRITE16LE(((uint16_t*)&ioMem[address]), value)
LinkMode GetLinkMode() LinkMode GetLinkMode()
{ {
return LINK_DISCONNECTED; return LINK_DISCONNECTED;
@ -97,7 +99,10 @@ LinkMode GetLinkMode()
void StartGPLink(uint16_t value) void StartGPLink(uint16_t value)
{ {
WRITE16LE(((uint16_t*)&ioMem[COMM_RCNT]), value); if (!ioMem)
return;
UPDATE_REG(COMM_RCNT, value);
} }
void LinkUpdate(int ticks) void LinkUpdate(int ticks)
@ -106,6 +111,23 @@ void LinkUpdate(int ticks)
void StartLink(uint16_t siocnt) void StartLink(uint16_t siocnt)
{ {
/* log("'s' siocnt = %04x\n", siocnt); */
if (!ioMem)
return;
if(siocnt & 0x80)
{
siocnt &= 0xff7f;
if(siocnt & 1 && (siocnt & 0x4000))
{
UPDATE_REG(COMM_SIOCNT, 0xFF);
IF |= 0x80;
UPDATE_REG(0x202, IF);
siocnt &= 0x7f7f;
}
}
UPDATE_REG(COMM_SIOCNT, siocnt);
} }
void CheckLinkConnection() void CheckLinkConnection()