146 lines
5.3 KiB
C#
146 lines
5.3 KiB
C#
using System;
|
|
|
|
namespace BizHawk.Emulation.Consoles.TurboGrafx
|
|
{
|
|
public partial class PCEngine
|
|
{
|
|
private byte[] CdIoPorts = new byte[16];
|
|
private ScsiCD scsi = new ScsiCD();
|
|
|
|
private void WriteCD(int addr, byte value)
|
|
{
|
|
Console.WriteLine("Write to reg[{0:X4}] {1:X2}", addr&0x1FFF, value);
|
|
switch (addr & 0x1FFF)
|
|
{
|
|
case 0x1800: // SCSI Drive Control Line
|
|
CdIoPorts[0] = value;
|
|
// Console.WriteLine("Write to CDC Status [0] {0:X2}", value);
|
|
|
|
scsi.SEL = true;
|
|
scsi.Think();
|
|
scsi.SEL = false;
|
|
scsi.Think();
|
|
|
|
// this probably does some things
|
|
// possibly clear irq line or trigger or who knows
|
|
break;
|
|
|
|
case 0x1801: // CDC Command
|
|
CdIoPorts[1] = value;
|
|
scsi.DB = value;
|
|
scsi.Think();
|
|
// Console.WriteLine("Write to CDC Command [1] {0:X2}", value);
|
|
break;
|
|
|
|
case 0x1802: // ACK and Interrupt Control
|
|
CdIoPorts[2] = value;
|
|
scsi.ACK = ((value & 0x80) != 0);
|
|
scsi.Think();
|
|
RefreshIRQ2();
|
|
break;
|
|
|
|
case 0x1804: // CD Reset Command
|
|
CdIoPorts[4] = value;
|
|
scsi.RST = ((value & 0x02) != 0);
|
|
scsi.Think();
|
|
if (scsi.RST)
|
|
{
|
|
CdIoPorts[3] &= 0x8F; // Clear interrupt control bits
|
|
RefreshIRQ2();
|
|
}
|
|
break;
|
|
|
|
case 0x1807: // BRAM Unlock
|
|
if (BramEnabled && (value & 0x80) != 0)
|
|
{
|
|
Console.WriteLine("UNLOCK BRAM!");
|
|
BramLocked = false;
|
|
}
|
|
break;
|
|
|
|
case 0x180B: // ADPCM DMA Control
|
|
CdIoPorts[0x0B] = value;
|
|
// Console.WriteLine("Write to ADPCM DMA Control [B]");
|
|
// TODO... there is DMA to be done
|
|
break;
|
|
|
|
case 0x180D: // ADPCM Address Control
|
|
CdIoPorts[0x0D] = value;
|
|
// Console.WriteLine("Write to ADPCM Address Control [D]");
|
|
break;
|
|
|
|
case 0x180E: // ADPCM Playback Rate
|
|
CdIoPorts[0x0E] = value;
|
|
// Console.WriteLine("Write to ADPCM Address Control [E]");
|
|
break;
|
|
|
|
case 0x180F: // Audio Fade Timer
|
|
CdIoPorts[0x0F] = value;
|
|
// Console.WriteLine("Write to CD Audio fade timer [F]");
|
|
// TODO: hook this up to audio system);
|
|
break;
|
|
|
|
default:
|
|
Console.WriteLine("unknown write to {0:X4}:{1:X2}",addr, value);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public byte ReadCD(int addr)
|
|
{
|
|
byte returnValue = 0;
|
|
switch (addr & 0x1FFF)
|
|
{
|
|
case 0x1800: // SCSI Drive Control Line
|
|
scsi.Think();
|
|
if (scsi.IO) returnValue |= 0x08;
|
|
if (scsi.CD) returnValue |= 0x10;
|
|
if (scsi.MSG) returnValue |= 0x20;
|
|
if (scsi.REQ) returnValue |= 0x40;
|
|
if (scsi.BSY) returnValue |= 0x80;
|
|
//if (returnValue != 0) returnValue = 0x40;
|
|
Console.WriteLine("Read SCSI Drive Control Line [0]: {0:X2} btw, pc={1:X4} ", returnValue,this.Cpu.PC);
|
|
return returnValue;
|
|
|
|
case 0x1802: // ADPCM / CD Control
|
|
Console.WriteLine("Read 1802 {0:X2}", CdIoPorts[2]);
|
|
return CdIoPorts[2];
|
|
|
|
case 0x1803: // BRAM Lock
|
|
if (BramEnabled)
|
|
{
|
|
Console.WriteLine("LOCKED BRAM! (read 1803)");
|
|
BramLocked = true;
|
|
}
|
|
return CdIoPorts[3];
|
|
|
|
case 0x1804: // CD Reset
|
|
Console.WriteLine("Read 1804 {0:X2}", CdIoPorts[4]);
|
|
return CdIoPorts[4];
|
|
|
|
case 0x180F: // Audio Fade Timer
|
|
Console.WriteLine("Read 180F {0:X2}", CdIoPorts[0xF]);
|
|
return CdIoPorts[0x0F];
|
|
|
|
// These are some retarded version check
|
|
case 0x18C1: return 0xAA;
|
|
case 0x18C2: return 0x55;
|
|
case 0x18C3: return 0x00;
|
|
case 0x18C5: return 0xAA;
|
|
case 0x18C6: return 0x55;
|
|
case 0x18C7: return 0x03;
|
|
|
|
default:
|
|
Console.WriteLine("unknown read to {0:X4}", addr);
|
|
return 0xFF;
|
|
}
|
|
}
|
|
|
|
private void RefreshIRQ2()
|
|
{
|
|
int mask = CdIoPorts[2] & CdIoPorts[3] & 0x7C;
|
|
Cpu.IRQ2Assert = (mask != 0);
|
|
}
|
|
}
|
|
}
|