MB/6522: better reset support - only ACR,IFR,IER affected

This commit is contained in:
tomcw 2021-02-13 16:56:29 +00:00
parent 84a705d20d
commit 4e88163430
5 changed files with 23 additions and 16 deletions

View File

@ -701,7 +701,6 @@ void CpuIrqAssert(eIRQSRC Device)
void CpuIrqDeassert(eIRQSRC Device)
{
_ASSERT(g_bCritSectionValid);
if (g_bCritSectionValid) EnterCriticalSection(&g_CriticalSection);
g_bmIRQ &= ~(1<<Device);
if (g_bCritSectionValid) LeaveCriticalSection(&g_CriticalSection);

View File

@ -272,11 +272,20 @@ static void StopTimer2(SY6522_AY8910* pMB)
//-----------------------------------------------------------------------------
static void ResetSY6522(SY6522_AY8910* pMB)
static void SY6522_Write(BYTE nDevice, BYTE nReg, BYTE nValue);
static void ResetSY6522(SY6522_AY8910* pMB, const bool powerCycle)
{
memset(&pMB->sy6522,0,sizeof(SY6522));
pMB->sy6522.TIMER1_LATCH.w = 0xffff; // Some random value (but pick $ffff so it's deterministic)
// . NB. if it's too small (< ~$0007) then MB detection routines will fail!
if (powerCycle)
{
memset(&pMB->sy6522,0,sizeof(SY6522));
pMB->sy6522.TIMER1_LATCH.w = 0xffff; // Some random value (but pick $ffff so it's deterministic)
// . NB. if it's too small (< ~$0007) then MB detection routines will fail!
}
SY6522_Write(pMB->nAY8910Number, 0x0b, 0x00); // ACR = 0x00: T1 one-shot mode
SY6522_Write(pMB->nAY8910Number, 0x0d, 0x7f); // IFR = 0x7F: de-assert any IRQs
SY6522_Write(pMB->nAY8910Number, 0x0e, 0x7f); // IFE = 0x7F: disable all IRQs
StopTimer1(pMB);
StopTimer2(pMB);
@ -556,7 +565,6 @@ static void UpdateIFR(SY6522_AY8910* pMB, BYTE clr_ifr, BYTE set_ifr=0)
{
// Need critical section to avoid data-race: main thread & SSI263Thread can both access IFR
// . NB. Loading a save-state just directly writes into 6522.IFR (which is fine)
_ASSERT(g_bCritSectionValid);
if (g_bCritSectionValid) EnterCriticalSection(&g_CriticalSection);
{
pMB->sy6522.IFR &= ~clr_ifr;
@ -1726,7 +1734,7 @@ void MB_Initialize()
g_bMBAvailable = MB_DSInit();
LogFileOutput("MB_Initialize: MB_DSInit(), g_bMBAvailable=%d\n", g_bMBAvailable);
MB_Reset();
MB_Reset(true);
LogFileOutput("MB_Initialize: MB_Reset()\n");
}
@ -1745,7 +1753,7 @@ static void MB_SetSoundcardType(SS_CARDTYPE NewSoundcardType);
// . and voice will be demuted when dialog is closed
void MB_InitializeForLoadingSnapshot() // GH#609
{
MB_Reset();
MB_Reset(true);
InitSoundcardType();
if (g_bDisableDirectSound || g_bDisableDirectSoundMockingboard)
@ -1823,14 +1831,14 @@ static void ResetState()
// g_bPhasorEnable = false;
}
void MB_Reset() // CTRL+RESET or power-cycle
void MB_Reset(const bool powerCycle) // CTRL+RESET or power-cycle
{
if(!g_bDSAvailable)
if (!g_bDSAvailable)
return;
for(int i=0; i<NUM_AY8910; i++)
for (int i=0; i<NUM_AY8910; i++)
{
ResetSY6522(&g_MB[i]);
ResetSY6522(&g_MB[i], powerCycle);
AY8910_reset(i);
}

View File

@ -5,7 +5,7 @@
void MB_Initialize();
void MB_Reinitialize();
void MB_Destroy();
void MB_Reset();
void MB_Reset(const bool powerCycle);
void MB_InitializeForLoadingSnapshot(void);
void MB_InitializeIO(LPBYTE pCxRomPeripheral, UINT uSlot4, UINT uSlot5);
void MB_Mute();

View File

@ -538,7 +538,7 @@ void ResetMachineState()
GetCardMgr().GetSSC()->CommReset();
PrintReset();
JoyReset();
MB_Reset();
MB_Reset(true);
SpkrReset();
if (GetCardMgr().IsMouseCardInstalled())
GetCardMgr().GetMouseCard()->Reset();
@ -583,7 +583,7 @@ void CtrlReset()
KeybReset();
if (GetCardMgr().IsSSCInstalled())
GetCardMgr().GetSSC()->CommReset();
MB_Reset();
MB_Reset(false);
if (GetCardMgr().IsMouseCardInstalled())
GetCardMgr().GetMouseCard()->Reset(); // Deassert any pending IRQs - GH#514
#ifdef USE_SPEECH_API

View File

@ -647,7 +647,7 @@ int APIENTRY WinMain(HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
g_bRestartFullScreen = false;
}
MB_Reset();
MB_Reset(true);
LogFileOutput("Main: MB_Reset()\n");
if (g_bRestart)