mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-02-27 12:29:37 +00:00
Fix: Floating bus not returned for empty slot $Cnxx addresses (Fix for A2VGA.DSK: Apple][VGA card detection).
This commit is contained in:
parent
ec82e9f9e4
commit
e614289098
@ -19,6 +19,12 @@ Restrictions/bugs:
|
|||||||
- For an original Apple //e, 80-column (PR#3) and INVERSE, it still appears to be mousetext character, but it should be inverted upper-case from $40 to $5F.
|
- For an original Apple //e, 80-column (PR#3) and INVERSE, it still appears to be mousetext character, but it should be inverted upper-case from $40 to $5F.
|
||||||
|
|
||||||
|
|
||||||
|
1.xx.0 - ?? ??? 2012
|
||||||
|
--------------------
|
||||||
|
Fixes:
|
||||||
|
. Floating bus not returned for empty slot $Cnxx addresses (Fix for A2VGA.DSK: Apple][VGA card detection).
|
||||||
|
|
||||||
|
|
||||||
1.20.1 - 17 Jul 2011
|
1.20.1 - 17 Jul 2011
|
||||||
--------------------
|
--------------------
|
||||||
Fixes:
|
Fixes:
|
||||||
|
@ -471,6 +471,8 @@ inline bool IsPotentialNoSlotClockAccess(const WORD address)
|
|||||||
(!SW_SLOTCXROM && (AddrHi == 0xC8)) ); // Internal ROM at [$C100-CFFF] && AddrHi == $C8
|
(!SW_SLOTCXROM && (AddrHi == 0xC8)) ); // Internal ROM at [$C100-CFFF] && AddrHi == $C8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool IsCardInSlot(const UINT uSlot);
|
||||||
|
|
||||||
// Enabling expansion ROM ($C800..$CFFF]:
|
// Enabling expansion ROM ($C800..$CFFF]:
|
||||||
// . Enable if: Enable1 && Enable2
|
// . Enable if: Enable1 && Enable2
|
||||||
// . Enable1 = I/O SELECT' (6502 accesses $Csxx)
|
// . Enable1 = I/O SELECT' (6502 accesses $Csxx)
|
||||||
@ -579,6 +581,14 @@ BYTE __stdcall IORead_Cxxx(WORD programcounter, WORD address, BYTE write, BYTE v
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (address >= APPLE_SLOT_BEGIN && address <= APPLE_SLOT_END)
|
||||||
|
{
|
||||||
|
// NB. Currently Mockingboard/Phasor is never unplugged, just disabled. See MB_Read().
|
||||||
|
const UINT uSlot = (address>>8)&0x7;
|
||||||
|
if (uSlot != 3 && !IsCardInSlot(uSlot))
|
||||||
|
return IO_Null(programcounter, address, write, value, nCyclesLeft);
|
||||||
|
}
|
||||||
|
|
||||||
if ((g_eExpansionRomType == eExpRomNull) && (address >= FIRMWARE_EXPANSION_BEGIN))
|
if ((g_eExpansionRomType == eExpRomNull) && (address >= FIRMWARE_EXPANSION_BEGIN))
|
||||||
return IO_Null(programcounter, address, write, value, nCyclesLeft);
|
return IO_Null(programcounter, address, write, value, nCyclesLeft);
|
||||||
else
|
else
|
||||||
@ -661,6 +671,17 @@ void RegisterIoHandler(UINT uSlot, iofunction IOReadC0, iofunction IOWriteC0, io
|
|||||||
ExpansionRom[uSlot] = pExpansionRom;
|
ExpansionRom[uSlot] = pExpansionRom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool IsCardInSlot(const UINT uSlot)
|
||||||
|
{
|
||||||
|
if (IORead[uSlot+8] == IO_Null &&
|
||||||
|
IOWrite[uSlot+8] == IO_Null &&
|
||||||
|
IORead[uSlot*16] == IORead_Cxxx &&
|
||||||
|
IOWrite[uSlot*16] == IOWrite_Cxxx)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
//// Only called by MemSetFastPaging()
|
//// Only called by MemSetFastPaging()
|
||||||
|
@ -1382,8 +1382,8 @@ static BYTE __stdcall MB_Read(WORD PC, WORD nAddr, BYTE bWrite, BYTE nValue, ULO
|
|||||||
if(!IS_APPLE2 && !MemCheckSLOTCXROM())
|
if(!IS_APPLE2 && !MemCheckSLOTCXROM())
|
||||||
return mem[nAddr];
|
return mem[nAddr];
|
||||||
|
|
||||||
if(g_SoundcardType == SC_NONE)
|
if(g_SoundcardType == SC_NONE) // TODO: Should really unplug the card from the slot and let IORead_Cxxx() return the floating bus
|
||||||
return 0;
|
return MemReadFloatingBus(nCyclesLeft);
|
||||||
|
|
||||||
BYTE nMB = (nAddr>>8)&0xf - SLOT4;
|
BYTE nMB = (nAddr>>8)&0xf - SLOT4;
|
||||||
BYTE nOffset = nAddr&0xff;
|
BYTE nOffset = nAddr&0xff;
|
||||||
@ -1391,26 +1391,31 @@ static BYTE __stdcall MB_Read(WORD PC, WORD nAddr, BYTE bWrite, BYTE nValue, ULO
|
|||||||
if(g_bPhasorEnable)
|
if(g_bPhasorEnable)
|
||||||
{
|
{
|
||||||
if(nMB != 0) // Slot4 only
|
if(nMB != 0) // Slot4 only
|
||||||
return 0;
|
return MemReadFloatingBus(nCyclesLeft);
|
||||||
|
|
||||||
BYTE nRes = 0;
|
|
||||||
int CS;
|
int CS;
|
||||||
|
|
||||||
if(g_nPhasorMode & 1)
|
if(g_nPhasorMode & 1)
|
||||||
CS = ( ( nAddr & 0x80 ) >> 6 ) | ( ( nAddr & 0x10 ) >> 4 ); // 0, 1, 2 or 3
|
CS = ( ( nAddr & 0x80 ) >> 6 ) | ( ( nAddr & 0x10 ) >> 4 ); // 0, 1, 2 or 3
|
||||||
else // Mockingboard Mode
|
else // Mockingboard Mode
|
||||||
CS = ( ( nAddr & 0x80 ) >> 7 ) + 1; // 1 or 2
|
CS = ( ( nAddr & 0x80 ) >> 7 ) + 1; // 1 or 2
|
||||||
|
|
||||||
|
BYTE nRes = 0;
|
||||||
|
|
||||||
if(CS & 1)
|
if(CS & 1)
|
||||||
nRes |= SY6522_Read(nMB*NUM_DEVS_PER_MB + SY6522_DEVICE_A, nAddr&0xf);
|
nRes |= SY6522_Read(nMB*NUM_DEVS_PER_MB + SY6522_DEVICE_A, nAddr&0xf);
|
||||||
|
|
||||||
if(CS & 2)
|
if(CS & 2)
|
||||||
nRes |= SY6522_Read(nMB*NUM_DEVS_PER_MB + SY6522_DEVICE_B, nAddr&0xf);
|
nRes |= SY6522_Read(nMB*NUM_DEVS_PER_MB + SY6522_DEVICE_B, nAddr&0xf);
|
||||||
|
|
||||||
if((nOffset >= SSI263_Offset) && (nOffset <= (SSI263_Offset+0x05)))
|
bool bAccessedDevice = (CS & 3) ? true : false;
|
||||||
nRes |= SSI263_Read(nMB, nAddr&0xf);
|
|
||||||
|
|
||||||
return nRes;
|
if((nOffset >= SSI263_Offset) && (nOffset <= (SSI263_Offset+0x05)))
|
||||||
|
{
|
||||||
|
nRes |= SSI263_Read(nMB, nAddr&0xf);
|
||||||
|
bAccessedDevice = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bAccessedDevice ? nRes : MemReadFloatingBus(nCyclesLeft);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nOffset <= (SY6522A_Offset+0x0F))
|
if(nOffset <= (SY6522A_Offset+0x0F))
|
||||||
@ -1420,7 +1425,7 @@ static BYTE __stdcall MB_Read(WORD PC, WORD nAddr, BYTE bWrite, BYTE nValue, ULO
|
|||||||
else if((nOffset >= SSI263_Offset) && (nOffset <= (SSI263_Offset+0x05)))
|
else if((nOffset >= SSI263_Offset) && (nOffset <= (SSI263_Offset+0x05)))
|
||||||
return SSI263_Read(nMB, nAddr&0xf);
|
return SSI263_Read(nMB, nAddr&0xf);
|
||||||
else
|
else
|
||||||
return 0;
|
return MemReadFloatingBus(nCyclesLeft);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user