Mockingboard: support AY-3-8913 read

This commit is contained in:
tomcw
2021-01-17 19:51:25 +00:00
parent daa0675694
commit 5d46298dcc
3 changed files with 49 additions and 0 deletions

View File

@@ -709,6 +709,47 @@ void CAY8910::sound_ay_overlay( void )
} }
} }
BYTE CAY8910::sound_ay_read( int reg )
{
reg &= 15;
BYTE val = 0;
bool got = false;
if (ay_change_count)
{
for (int i=ay_change_count-1; i>=0; i--)
{
if (ay_change[i].reg == reg)
{
val = ay_change[i].val; // return the most recently written reg's value
got = true;
}
}
}
if (!got)
val = sound_ay_registers[reg];
switch (reg & 15)
{
case 1:
case 3:
case 5:
case 13:
val &= 15;
break;
case 6:
case 8:
case 9:
case 10:
val &= 31;
break;
}
return val;
}
// AppleWin:TC Holding down ScrollLock will result in lots of AY changes /ay_change_count/ // AppleWin:TC Holding down ScrollLock will result in lots of AY changes /ay_change_count/
// - since sound_ay_overlay() is called to consume them. // - since sound_ay_overlay() is called to consume them.
@@ -1145,6 +1186,10 @@ bool CAY8910::LoadSnapshot(YamlLoadHelper& yamlLoadHelper, const std::string& su
static CAY8910 g_AY8910[MAX_8910]; static CAY8910 g_AY8910[MAX_8910];
static unsigned __int64 g_uLastCumulativeCycles = 0; static unsigned __int64 g_uLastCumulativeCycles = 0;
BYTE AYReadReg(int chip, int r)
{
return g_AY8910[chip].sound_ay_read(r);
}
void _AYWriteReg(int chip, int r, int v) void _AYWriteReg(int chip, int r, int v)
{ {

View File

@@ -2,6 +2,8 @@
#define MAX_8910 4 #define MAX_8910 4
BYTE AYReadReg(int chip, int r); // TC
//------------------------------------- //-------------------------------------
// MAME interface // MAME interface
@@ -40,6 +42,7 @@ public:
void sound_ay_init( void ); void sound_ay_init( void );
void sound_init( const char *device ); void sound_init( const char *device );
BYTE sound_ay_read( int reg ); // TC
void sound_ay_write( int reg, int val, libspectrum_dword now ); void sound_ay_write( int reg, int val, libspectrum_dword now );
void sound_ay_reset( void ); void sound_ay_reset( void );
void sound_frame( void ); void sound_frame( void );

View File

@@ -321,6 +321,7 @@ static void AY8910_Write(BYTE nDevice, BYTE /*nReg*/, BYTE nValue, BYTE nAYDevic
break; break;
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)
pMB->sy6522.ORA = AYReadReg(nDevice+2*nAYDevice, pMB->nAYCurrentRegister) & (pMB->sy6522.DDRA ^ 0xff);
break; break;
case AY_WRITE: // 6: WRITE TO PSG case AY_WRITE: // 6: WRITE TO PSG