BizHawk/BizHawk.Emulation/Computers/Commodore64/C64.MotherboardInterface.cs

335 lines
7.7 KiB
C#

using BizHawk.Emulation.Computers.Commodore64.MOS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64
{
public partial class Motherboard
{
bool CassPort_DeviceReadLevel()
{
return (cpu.PortData & 0x08) != 0;
}
bool CassPort_DeviceReadMotor()
{
return (cpu.PortData & 0x20) != 0;
}
bool Cia0_ReadFlag()
{
return cassPort.DataInput;
}
byte Cia0_ReadPortA()
{
WriteInputPort();
return cia0InputLatchA;
}
byte Cia0_ReadPortB()
{
WriteInputPort();
return cia0InputLatchB;
}
bool Cia1_ReadFlag()
{
return true;
}
byte Cia1_ReadPortA()
{
// the low bits are actually the VIC memory address.
return 0x3F;
}
byte Cia1_ReadPortB()
{
return 0xFF;
}
bool Cpu_ReadCassetteButton()
{
return true;
}
bool Cpu_ReadIRQ()
{
return cia0.IRQ & vic.IRQ & cartPort.IRQ;
}
byte Cpu_ReadPort()
{
byte data = 0x1F;
if (!cassPort.Sense)
data &= 0xEF;
return data;
}
byte Pla_ReadBasicRom(ushort addr)
{
address = addr;
bus = basicRom.Read(addr);
return bus;
}
byte Pla_ReadCartridgeHi(ushort addr)
{
address = addr;
bus = cartPort.ReadHiRom(addr);
return bus;
}
byte Pla_ReadCartridgeLo(ushort addr)
{
address = addr;
bus = cartPort.ReadLoRom(addr);
return bus;
}
bool Pla_ReadCharen()
{
return (cpu.PortData & 0x04) != 0;
}
byte Pla_ReadCharRom(ushort addr)
{
address = addr;
bus = charRom.Read(addr);
return bus;
}
byte Pla_ReadCia0(ushort addr)
{
address = addr;
bus = cia0.Read(addr);
if (!inputRead && (addr == 0xDC00 || addr == 0xDC01))
inputRead = true;
return bus;
}
byte Pla_ReadCia1(ushort addr)
{
address = addr;
bus = cia1.Read(addr);
return bus;
}
byte Pla_ReadColorRam(ushort addr)
{
address = addr;
bus &= 0xF0;
bus |= colorRam.Read(addr);
return bus;
}
byte Pla_ReadExpansionHi(ushort addr)
{
address = addr;
bus = cartPort.ReadHiExp(addr);
return bus;
}
byte Pla_ReadExpansionLo(ushort addr)
{
address = addr;
bus = cartPort.ReadLoExp(addr);
return bus;
}
bool Pla_ReadHiRam()
{
return (cpu.PortData & 0x02) != 0;
}
byte Pla_ReadKernalRom(ushort addr)
{
address = addr;
bus = kernalRom.Read(addr);
return bus;
}
bool Pla_ReadLoRam()
{
return (cpu.PortData & 0x01) != 0;
}
byte Pla_ReadMemory(ushort addr)
{
address = addr;
bus = ram.Read(addr);
return bus;
}
byte Pla_ReadSid(ushort addr)
{
address = addr;
bus = sid.Read(addr);
return bus;
}
byte Pla_ReadVic(ushort addr)
{
address = addr;
bus = vic.Read(addr);
return bus;
}
void Pla_WriteCartridgeHi(ushort addr, byte val)
{
address = addr;
bus = val;
cartPort.WriteHiRom(addr, val);
}
void Pla_WriteCartridgeLo(ushort addr, byte val)
{
address = addr;
bus = val;
cartPort.WriteLoRom(addr, val);
}
void Pla_WriteCia0(ushort addr, byte val)
{
address = addr;
bus = val;
cia0.Write(addr, val);
}
void Pla_WriteCia1(ushort addr, byte val)
{
address = addr;
bus = val;
cia1.Write(addr, val);
}
void Pla_WriteColorRam(ushort addr, byte val)
{
address = addr;
bus = val;
colorRam.Write(addr, val);
}
void Pla_WriteExpansionHi(ushort addr, byte val)
{
address = addr;
bus = val;
cartPort.WriteHiExp(addr, val);
}
void Pla_WriteExpansionLo(ushort addr, byte val)
{
address = addr;
bus = val;
cartPort.WriteLoExp(addr, val);
}
void Pla_WriteMemory(ushort addr, byte val)
{
address = addr;
bus = val;
ram.Write(addr, val);
}
void Pla_WriteSid(ushort addr, byte val)
{
address = addr;
bus = val;
sid.Write(addr, val);
}
void Pla_WriteVic(ushort addr, byte val)
{
address = addr;
bus = val;
vic.Write(addr, val);
}
bool SerPort_DeviceReadAtn()
{
return (cia1.PortBData & 0x08) == 0;
}
bool SerPort_DeviceReadClock()
{
return (cia1.PortAData & 0x10) == 0;
}
bool SerPort_DeviceReadData()
{
return (cia1.PortAData & 0x20) == 0;
}
bool SerPort_DeviceReadReset()
{
// this triggers hard reset on ext device when low
return true;
}
void SerPort_DeviceWriteAtn(bool val)
{
// currently not wired
}
void SerPort_DeviceWriteClock(bool val)
{
//cia1DataA = Port.ExternalWrite(cia1DataA, (byte)((cia1DataA & 0xBF) | (val ? 0x00 : 0x40)), cia1DirA);
}
void SerPort_DeviceWriteData(bool val)
{
//cia1DataA = Port.ExternalWrite(cia1DataA, (byte)((cia1DataA & 0x7F) | (val ? 0x00 : 0x80)), cia1DirA);
}
void SerPort_DeviceWriteSrq(bool val)
{
//cia0FlagSerial = val;
//cia0.FLAG = cia0FlagCassette & cia0FlagSerial;
}
byte Sid_ReadPotX()
{
return 0;
}
byte Sid_ReadPotY()
{
return 0;
}
byte Vic_ReadMemory(ushort addr)
{
switch (cia1.PortAData & 0x3)
{
case 0:
addr |= 0xC000;
break;
case 1:
addr |= 0x8000;
break;
case 2:
addr |= 0x4000;
break;
}
address = addr;
if ((addr & 0x7000) == 0x1000)
bus = charRom.Read(addr);
else
bus = ram.Read(addr);
return bus;
}
byte Vic_ReadColorRam(ushort addr)
{
address = addr;
bus &= 0xF0;
bus |= colorRam.Read(addr);
return bus;
}
}
}