Plus 3 mode fully working. Added Plus 3 keyboard
This commit is contained in:
@@ -73,28 +73,40 @@ namespace Core.Io
|
||||
|
||||
// Bit 3 handles the cassette MIC output
|
||||
}
|
||||
|
||||
// 128K Standard Paging Port (0x7FFD)
|
||||
if ((portAddress & 0x8002) == 0)
|
||||
// Mask 0xC002 checks A15=0, A14=1, A1=0 to prevent 0x1FFD from triggering this!
|
||||
if ((portAddress & 0xC002) == 0x4000)
|
||||
{
|
||||
_memory.HandlePaging(0x7FFD, portValue);
|
||||
}
|
||||
|
||||
// +2A/+3 Extended Paging Port (0x1FFD)
|
||||
if ((portAddress & 0xF002) == 0x1000)
|
||||
// Mask 0xF002 checks A15=0, A14=0, A13=0, A12=1, A1=0
|
||||
else if ((portAddress & 0xF002) == 0x1000)
|
||||
{
|
||||
_memory.HandlePaging(0x1FFD, portValue);
|
||||
}
|
||||
// AY-3-8912 Register Select (Port 0xFFFD)
|
||||
if ((portAddress & 0xC002) == 0xC000)
|
||||
{
|
||||
AyChip.SelectRegister(portValue);
|
||||
}
|
||||
// AY-3-8912 Data Write (Port 0xBFFD)
|
||||
else if ((portAddress & 0xC002) == 0x8000)
|
||||
{
|
||||
AyChip.WriteRegister(portValue);
|
||||
}
|
||||
|
||||
//// 128K Standard Paging Port (0x7FFD)
|
||||
//if ((portAddress & 0x8002) == 0)
|
||||
//{
|
||||
// _memory.HandlePaging(0x7FFD, portValue);
|
||||
//}
|
||||
|
||||
//// +2A/+3 Extended Paging Port (0x1FFD)
|
||||
//if ((portAddress & 0xF002) == 0x1000)
|
||||
//{
|
||||
// _memory.HandlePaging(0x1FFD, portValue);
|
||||
//}
|
||||
//// AY-3-8912 Register Select (Port 0xFFFD)
|
||||
//if ((portAddress & 0xC002) == 0xC000)
|
||||
//{
|
||||
// AyChip.SelectRegister(portValue);
|
||||
//}
|
||||
//// AY-3-8912 Data Write (Port 0xBFFD)
|
||||
//else if ((portAddress & 0xC002) == 0x8000)
|
||||
//{
|
||||
// AyChip.WriteRegister(portValue);
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -54,6 +54,7 @@ namespace Core.Io
|
||||
// The perfectly cropped, 320x256 Scanline Renderer
|
||||
public void RenderScanline(int scanline)
|
||||
{
|
||||
byte[] videoRam = _memoryBus.GetVideoRam();
|
||||
// 1. Drop the invisible lines instantly (VBlank/Overscan)
|
||||
if (scanline < 32 || scanline > 287) return;
|
||||
|
||||
@@ -91,11 +92,18 @@ namespace Core.Io
|
||||
// Draw the 32 horizontal character blocks of the visible screen
|
||||
for (int col = 0; col < 32; col++)
|
||||
{
|
||||
ushort pixelAddress = (ushort)(0x4000 | (third << 11) | (pixelRow << 8) | (characterRow << 5) | col);
|
||||
ushort attrAddress = (ushort)(0x5800 + (y / 8) * 32 + col);
|
||||
// Calculate the exact internal array offsets (Base 0, no 0x4000 needed!)
|
||||
int pixelOffset = (third << 11) | (pixelRow << 8) | (characterRow << 5) | col;
|
||||
int attrOffset = 0x1800 + (y / 8) * 32 + col;
|
||||
|
||||
byte pixels = _memoryBus.Read(pixelAddress);
|
||||
byte attr = _memoryBus.Read(attrAddress);
|
||||
// Read directly from the raw array
|
||||
byte pixels = videoRam[pixelOffset];
|
||||
byte attr = videoRam[attrOffset];
|
||||
//ushort pixelAddress = (ushort)(0x4000 | (third << 11) | (pixelRow << 8) | (characterRow << 5) | col);
|
||||
//ushort attrAddress = (ushort)(0x5800 + (y / 8) * 32 + col);
|
||||
|
||||
//byte pixels = _memoryBus.Read(pixelAddress);
|
||||
//byte attr = _memoryBus.Read(attrAddress);
|
||||
|
||||
int ink = attr & 0x07;
|
||||
int paper = (attr >> 3) & 0x07;
|
||||
|
||||
Reference in New Issue
Block a user