mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-01-18 06:31:57 +00:00
Phasor: support Echo+ mode (#1183)
This commit is contained in:
parent
fd8ed23b56
commit
bcdaa3e1c1
@ -58,6 +58,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "SSI263.h"
|
#include "SSI263.h"
|
||||||
|
|
||||||
#define DBG_MB_SS_CARD 0 // NB. From UI, select Mockingboard (not Phasor)
|
#define DBG_MB_SS_CARD 0 // NB. From UI, select Mockingboard (not Phasor)
|
||||||
|
#define DBG_SUPPORT_ECHOPLUS 0 // Allow Phasor (in Echo+ mode) to pass the TMS5220 detection used by Echo+ disk
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -197,14 +198,26 @@ void MockingboardCard::WriteToORB(BYTE subunit)
|
|||||||
{
|
{
|
||||||
const int kAY0 = 2; // bit4=0 (active low) selects the 1st AY8913, ie. the only AY8913 in Mockingboard mode (confirmed on real Phasor h/w)
|
const int kAY0 = 2; // bit4=0 (active low) selects the 1st AY8913, ie. the only AY8913 in Mockingboard mode (confirmed on real Phasor h/w)
|
||||||
const int kAY1 = 1; // bit3=0 (active low) selects the 2nd AY8913 attached to this 6522 (unavailable in Mockingboard mode)
|
const int kAY1 = 1; // bit3=0 (active low) selects the 2nd AY8913 attached to this 6522 (unavailable in Mockingboard mode)
|
||||||
int nAY_CS = (m_phasorMode == PH_Phasor) ? (~(value >> 3) & 3) : kAY0;
|
|
||||||
|
|
||||||
|
if (m_phasorMode == PH_EchoPlus)
|
||||||
|
{
|
||||||
|
int nAY_CS = (value >> 3) & 3;
|
||||||
|
if (nAY_CS & kAY0)
|
||||||
|
AY8910_Write(0, AY8913_DEVICE_A, value);
|
||||||
|
|
||||||
|
if (nAY_CS & kAY1)
|
||||||
|
AY8910_Write(1, AY8913_DEVICE_A, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int nAY_CS = (m_phasorMode == PH_Phasor) ? (~(value >> 3) & 3) : kAY0;
|
||||||
if (nAY_CS & kAY0)
|
if (nAY_CS & kAY0)
|
||||||
AY8910_Write(subunit, AY8913_DEVICE_A, value);
|
AY8910_Write(subunit, AY8913_DEVICE_A, value);
|
||||||
|
|
||||||
if (nAY_CS & kAY1)
|
if (nAY_CS & kAY1)
|
||||||
AY8910_Write(subunit, AY8913_DEVICE_B, value);
|
AY8910_Write(subunit, AY8913_DEVICE_B, value);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AY8910_Write(subunit, AY8913_DEVICE_A, value);
|
AY8910_Write(subunit, AY8913_DEVICE_A, value);
|
||||||
@ -218,6 +231,7 @@ void MockingboardCard::AY8910_Write(BYTE subunit, BYTE ay, BYTE value)
|
|||||||
{
|
{
|
||||||
m_regAccessedFlag = true;
|
m_regAccessedFlag = true;
|
||||||
MB_SUBUNIT* pMB = &m_MBSubUnit[subunit];
|
MB_SUBUNIT* pMB = &m_MBSubUnit[subunit];
|
||||||
|
SY6522& r6522 = (m_phasorEnable && m_phasorMode == PH_EchoPlus) ? m_MBSubUnit[SY6522_DEVICE_B].sy6522 : pMB->sy6522;
|
||||||
|
|
||||||
if ((value & 4) == 0)
|
if ((value & 4) == 0)
|
||||||
{
|
{
|
||||||
@ -235,9 +249,9 @@ void MockingboardCard::AY8910_Write(BYTE subunit, BYTE ay, BYTE value)
|
|||||||
MockingboardUnitState_e& state = (ay == AY8913_DEVICE_A) ? pMB->state : pMB->stateB; // GH#659
|
MockingboardUnitState_e& state = (ay == AY8913_DEVICE_A) ? pMB->state : pMB->stateB; // GH#659
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
if (!m_phasorEnable)
|
if (!m_phasorEnable || m_phasorMode != PH_Phasor)
|
||||||
_ASSERT(ay == AY8913_DEVICE_A);
|
_ASSERT(ay == AY8913_DEVICE_A);
|
||||||
if (nAYFunc == AY_WRITE || nAYFunc == AY_LATCH)
|
if (nAYFunc == AY_READ || nAYFunc == AY_WRITE || nAYFunc == AY_LATCH)
|
||||||
_ASSERT(state == AY_INACTIVE);
|
_ASSERT(state == AY_INACTIVE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -250,13 +264,13 @@ void MockingboardCard::AY8910_Write(BYTE subunit, BYTE ay, BYTE value)
|
|||||||
|
|
||||||
case AY_READ: // 5: READ FROM PSG (need to set DDRA to input)
|
case AY_READ: // 5: READ FROM PSG (need to set DDRA to input)
|
||||||
if (m_phasorEnable && m_phasorMode == PH_EchoPlus)
|
if (m_phasorEnable && m_phasorMode == PH_EchoPlus)
|
||||||
pMB->sy6522.SetRegORA( 0xff & (pMB->sy6522.GetReg(SY6522::rDDRA) ^ 0xff) ); // Phasor (Echo+ mode) doesn't support reading AY8913s - it just reads 1's for the input bits
|
r6522.SetRegORA( 0xff & (r6522.GetReg(SY6522::rDDRA) ^ 0xff) ); // Phasor (Echo+ mode) doesn't support reading AY8913s - it just reads 1's for the input bits
|
||||||
else
|
else
|
||||||
pMB->sy6522.SetRegORA( AYReadReg(subunit, ay, pMB->nAYCurrentRegister) & (pMB->sy6522.GetReg(SY6522::rDDRA) ^ 0xff) );
|
r6522.SetRegORA( AYReadReg(subunit, ay, pMB->nAYCurrentRegister) & (r6522.GetReg(SY6522::rDDRA) ^ 0xff) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AY_WRITE: // 6: WRITE TO PSG
|
case AY_WRITE: // 6: WRITE TO PSG
|
||||||
_AYWriteReg(subunit, ay, pMB->nAYCurrentRegister, pMB->sy6522.GetReg(SY6522::rORA));
|
_AYWriteReg(subunit, ay, pMB->nAYCurrentRegister, r6522.GetReg(SY6522::rORA));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AY_LATCH: // 7: LATCH ADDRESS
|
case AY_LATCH: // 7: LATCH ADDRESS
|
||||||
@ -264,8 +278,8 @@ void MockingboardCard::AY8910_Write(BYTE subunit, BYTE ay, BYTE value)
|
|||||||
// Selecting an unused register number above 0x0f puts the AY into a state where
|
// Selecting an unused register number above 0x0f puts the AY into a state where
|
||||||
// any values written to the data/address bus are ignored, but can be read back
|
// any values written to the data/address bus are ignored, but can be read back
|
||||||
// within a few tens of thousands of cycles before they decay to zero.
|
// within a few tens of thousands of cycles before they decay to zero.
|
||||||
if (pMB->sy6522.GetReg(SY6522::rORA) <= 0x0F)
|
if (r6522.GetReg(SY6522::rORA) <= 0x0F)
|
||||||
pMB->nAYCurrentRegister = pMB->sy6522.GetReg(SY6522::rORA) & 0x0F;
|
pMB->nAYCurrentRegister = r6522.GetReg(SY6522::rORA) & 0x0F;
|
||||||
// else Pro-Mockingboard (clone from HK)
|
// else Pro-Mockingboard (clone from HK)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -715,6 +729,11 @@ BYTE MockingboardCard::PhasorIOInternal(WORD PC, WORD nAddr, BYTE bWrite, BYTE n
|
|||||||
for (UINT i = 0; i < NUM_SSI263; i++)
|
for (UINT i = 0; i < NUM_SSI263; i++)
|
||||||
m_MBSubUnit[i].ssi263.SetCardMode(m_phasorMode);
|
m_MBSubUnit[i].ssi263.SetCardMode(m_phasorMode);
|
||||||
|
|
||||||
|
#if DBG_SUPPORT_ECHOPLUS
|
||||||
|
if (m_phasorMode == PH_EchoPlus && (nAddr & 0xf) == 0)
|
||||||
|
return 0x1f; // for TMS5220 detection
|
||||||
|
#endif
|
||||||
|
|
||||||
return MemReadFloatingBus(nExecutedCycles);
|
return MemReadFloatingBus(nExecutedCycles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user