diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj index eb16f7317e..727ab0beba 100644 --- a/BizHawk.Emulation/BizHawk.Emulation.csproj +++ b/BizHawk.Emulation/BizHawk.Emulation.csproj @@ -130,6 +130,7 @@ + diff --git a/BizHawk.Emulation/CPUs/HuC6280/Execute.cs b/BizHawk.Emulation/CPUs/HuC6280/Execute.cs index c2bbf457b3..4c38b0ec30 100644 --- a/BizHawk.Emulation/CPUs/HuC6280/Execute.cs +++ b/BizHawk.Emulation/CPUs/HuC6280/Execute.cs @@ -2307,6 +2307,7 @@ namespace BizHawk.Emulation.CPUs.H6280 } } } + ThinkAction(); } } } diff --git a/BizHawk.Emulation/CPUs/HuC6280/HuC6280.cs b/BizHawk.Emulation/CPUs/HuC6280/HuC6280.cs index c36581232e..ac7a5a3352 100644 --- a/BizHawk.Emulation/CPUs/HuC6280/HuC6280.cs +++ b/BizHawk.Emulation/CPUs/HuC6280/HuC6280.cs @@ -333,6 +333,7 @@ namespace BizHawk.Emulation.CPUs.H6280 public Func ReadMemory21; public Action WriteMemory21; public Action WriteVDC; + public Action ThinkAction = delegate { }; public byte ReadMemory(ushort address) { diff --git a/BizHawk.Emulation/Consoles/PC Engine/PCEngine.cs b/BizHawk.Emulation/Consoles/PC Engine/PCEngine.cs index 5208eafcaf..8430e4abe0 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/PCEngine.cs +++ b/BizHawk.Emulation/Consoles/PC Engine/PCEngine.cs @@ -109,6 +109,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx { Ram = new byte[0x2000]; CDRam = new byte[0x10000]; + ADPCM_RAM = new byte[0x10000]; Cpu.ReadMemory21 = ReadMemoryCD; Cpu.WriteMemory21 = WriteMemoryCD; Cpu.WriteVDC = VDC1.WriteVDC; @@ -117,7 +118,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx SoundMixer = new SoundMixer(PSG, CDAudio); SoundSynchronizer = new MetaspuSoundProvider(ESynchMethod.ESynchMethod_V); soundProvider = SoundSynchronizer; - VDC1.MidScanlineThink = () => SCSI.Think(); + Cpu.ThinkAction = () => { SCSI.Think(); AdpcmThink(); }; } if (rom.Length == 0x60000) diff --git a/BizHawk.Emulation/Consoles/PC Engine/ScsiCDBus.cs b/BizHawk.Emulation/Consoles/PC Engine/ScsiCDBus.cs index ae6359c911..11e99d1e5a 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/ScsiCDBus.cs +++ b/BizHawk.Emulation/Consoles/PC Engine/ScsiCDBus.cs @@ -125,14 +125,16 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx private byte MessageValue; private QuickList CommandBuffer = new QuickList(10); // 10 = biggest command - public QuickQueue DataIn = new QuickQueue(2048); // proper size + public QuickQueue DataIn = new QuickQueue(2048); // one data sector // ******** Data Transfer / READ command support ******** - private long DataReadWaitTimer; - private bool DataReadInProgress; - private bool DataTransferWasDone; - private int CurrentReadingSector; - private int SectorsLeftToRead; + + public long DataReadWaitTimer; + public bool DataReadInProgress; + public bool DataTransferWasDone; + public bool DataTransferInProgress; + public int CurrentReadingSector; + public int SectorsLeftToRead; // ******** Resources ******** @@ -162,7 +164,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx { if (DataIn.Count == 0) { - Console.WriteLine("Sector available to read!!!"); + //Console.WriteLine("Sector available to read!!!"); // read in a sector and shove it in the queue disc.ReadLBA_2048(CurrentReadingSector, DataIn.GetBuffer(), 0); DataIn.SignalBufferFilled(2048); @@ -275,6 +277,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx if (DataTransferWasDone) { Console.WriteLine("DATA TRANSFER FINISHED!"); + DataTransferInProgress = false; DataTransferWasDone = false; DataTransferComplete(true); } @@ -383,6 +386,7 @@ if (CommandBuffer[4] == 0) throw new Exception("requesting 0 sectors read............................."); DataReadInProgress = true; + DataTransferInProgress = true; CurrentReadingSector = sector; SectorsLeftToRead = CommandBuffer[4]; @@ -495,6 +499,7 @@ throw new Exception("requesting 0 sectors read............................."); private void CommandReadSubcodeQ() { + Console.WriteLine("poll subcode"); var sectorEntry = disc.ReadLBA_SectorEntry(pce.CDAudio.CurrentSector); DataIn.Clear(); @@ -506,14 +511,14 @@ throw new Exception("requesting 0 sectors read............................."); case CDAudio.CDAudioMode.Stopped: DataIn.Enqueue(3); break; } - DataIn.Enqueue(sectorEntry.q_status); // unused? - DataIn.Enqueue(sectorEntry.q_tno.BCDValue); // track - DataIn.Enqueue(sectorEntry.q_index.BCDValue); // index - DataIn.Enqueue(sectorEntry.q_min.BCDValue); // M(rel) - DataIn.Enqueue(sectorEntry.q_sec.BCDValue); // S(rel) - DataIn.Enqueue(sectorEntry.q_frame.BCDValue); // F(rel) - DataIn.Enqueue(sectorEntry.q_amin.BCDValue); // M(abs) - DataIn.Enqueue(sectorEntry.q_asec.BCDValue); // S(abs) + DataIn.Enqueue(sectorEntry.q_status); // unused? + DataIn.Enqueue(sectorEntry.q_tno.BCDValue); // track + DataIn.Enqueue(sectorEntry.q_index.BCDValue); // index + DataIn.Enqueue(sectorEntry.q_min.BCDValue); // M(rel) + DataIn.Enqueue(sectorEntry.q_sec.BCDValue); // S(rel) + DataIn.Enqueue(sectorEntry.q_frame.BCDValue); // F(rel) + DataIn.Enqueue(sectorEntry.q_amin.BCDValue); // M(abs) + DataIn.Enqueue(sectorEntry.q_asec.BCDValue); // S(abs) DataIn.Enqueue(sectorEntry.q_aframe.BCDValue); // F(abs) SetPhase(BusPhase.DataIn); } diff --git a/BizHawk.Emulation/Consoles/PC Engine/TurboCD.cs b/BizHawk.Emulation/Consoles/PC Engine/TurboCD.cs index 0b2b5e4449..6cc91fc758 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/TurboCD.cs +++ b/BizHawk.Emulation/Consoles/PC Engine/TurboCD.cs @@ -1,5 +1,12 @@ using System; +// IRQ2 interrupts: +// 0x04 - INTA - ADPCM interrupt +// 0x08 - INTSTOP - Fire when end of CD-Audio playback reached when in STOP MODE 2. +// 0x10 - INTSUB - no idea yet +// 0x20 - INTM - Fires when data transfer is complete +// 0x40 - INTD - Fires when data transfer is ready + namespace BizHawk.Emulation.Consoles.TurboGrafx { public partial class PCEngine @@ -33,7 +40,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx private void WriteCD(int addr, byte value) { - //Log.Note("CD","Write: {0:X4} {1:X2} (PC={2:X4})", addr & 0x1FFF, value, Cpu.PC); + //Log.Error("CD","Write: {0:X4} {1:X2} (PC={2:X4})", addr & 0x1FFF, value, Cpu.PC); switch (addr & 0x1FFF) { case 0x1800: // SCSI Drive Control Line @@ -60,12 +67,12 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx CdIoPorts[2] = value; SCSI.ACK = ((value & 0x80) != 0); - if ((CdIoPorts[2] & 0x04) != 0) Log.Note("CD", "INTAEN enable"); - if ((CdIoPorts[2] & 0x08) != 0) Log.Note("CD", "INTSTOPEN enable"); - if ((CdIoPorts[2] & 0x10) != 0) Log.Note("CD", "INTSUBEN enable"); - if ((CdIoPorts[2] & 0x20) != 0) Log.Note("CD", "INTMEN enable"); - if ((CdIoPorts[2] & 0x40) != 0) Log.Note("CD", "INTDEN enable"); - if ((Cpu.IRQControlByte & 0x01) != 0) Log.Note("CD", "BTW, IRQ2 is not masked"); + if ((CdIoPorts[2] & 0x04) != 0) Log.Error("CD", "INTA enable"); + if ((CdIoPorts[2] & 0x08) != 0) Log.Error("CD", "INTSTOP enable"); + if ((CdIoPorts[2] & 0x10) != 0) Log.Error("CD", "INTSUB enable"); + if ((CdIoPorts[2] & 0x20) != 0) Log.Error("CD", "INTM enable"); + if ((CdIoPorts[2] & 0x40) != 0) Log.Error("CD", "INTD enable"); + if ((Cpu.IRQControlByte & 0x01) != 0) Log.Error("CD", "BTW, IRQ2 is not masked"); SCSI.Think(); RefreshIRQ2(); @@ -95,30 +102,46 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx } break; + case 0x1808: // ADPCM address LSB + adpcm_io_address &= 0xFF00; + adpcm_io_address |= value; + Log.Error("CD", "adpcm address = {0:X4}", adpcm_io_address); + break; + + case 0x1809: // ADPCM address MSB + adpcm_io_address &= 0x00FF; + adpcm_io_address |= (ushort)(value << 8); + Log.Error("CD", "adpcm address = {0:X4}", adpcm_io_address); + break; + + case 0x180A: // ADPCM Memory Read/Write Port + AdpcmDataWrite(value); + break; + case 0x180B: // ADPCM DMA Control CdIoPorts[0x0B] = value; - Console.WriteLine("Write to ADPCM DMA Control [B]"); + Log.Error("CD", "Write to ADPCM DMA Control [B] {0:X2}", value); // TODO... there is DMA to be done break; case 0x180D: // ADPCM Address Control + AdpcmControlWrite(value); 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]"); + Log.Error("CD", "Write to ADPCM Address Control [E] {0:X2}", value); break; case 0x180F: // Audio Fade Timer CdIoPorts[0x0F] = value; - Console.WriteLine("Write to CD Audio fade timer [F]"); + Log.Error("CD", "Write to CD Audio fade timer [F] {0:X2}", value); // TODO: hook this up to audio system. and to your mother break; default: - Console.WriteLine("unknown write to {0:X4}:{1:X2}",addr, value); + Log.Error("CD", "unknown write to {0:X4}:{1:X2} pc={2:X4}", addr, value, Cpu.PC); break; } } @@ -136,30 +159,28 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx if (SCSI.MSG) returnValue |= 0x20; if (SCSI.REQ) returnValue |= 0x40; if (SCSI.BSY) returnValue |= 0x80; - //Log.Note("CD", "Read: 1800 {0:X2} (PC={1:X4})", returnValue, Cpu.PC); + //Log.Error("CD", "Read: 1800 {0:X2} (PC={1:X4})", returnValue, Cpu.PC); return returnValue; case 0x1801: // Read data bus - //Log.Note("CD", "Read: 1801 {0:X2} (PC={1:X4})", SCSI.DataBits, Cpu.PC); + //Log.Error("CD", "Read: 1801 {0:X2} (PC={1:X4})", SCSI.DataBits, Cpu.PC); return SCSI.DataBits; case 0x1802: // ADPCM / CD Control - //Log.Note("CD", "Read: 1802 {0:X2} (PC={1:X4})", CdIoPorts[2], Cpu.PC); + //Log.Error("CD", "Read: 1802 {0:X2} (PC={1:X4})", CdIoPorts[2], Cpu.PC); return CdIoPorts[2]; case 0x1803: // BRAM Lock if (BramEnabled) - { - Log.Note("CD", "Read: 1803 {0:X2} (PC={1:X4})", CdIoPorts[3], Cpu.PC); BramLocked = true; - } + Log.Error("CD", "Read: 1803 {0:X2} (PC={1:X4})", CdIoPorts[3], Cpu.PC); returnValue = CdIoPorts[3]; CdIoPorts[3] ^= 2; return returnValue; case 0x1804: // CD Reset - //Log.Note("CD", "Read: 1804 {0:X2} (PC={1:X4})", CdIoPorts[4], Cpu.PC); + //Log.Error("CD", "Read: 1804 {0:X2} (PC={1:X4})", CdIoPorts[4], Cpu.PC); return CdIoPorts[4]; case 0x1805: // CD audio data Low @@ -176,19 +197,45 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx sample = CDAudio.VolumeRight; return (byte) (sample >> 8); - case 0x1808: // "auto handshake data input" - byte ret = SCSI.DataBits; - //Console.WriteLine("read 1808 {0:X2} remain: {1}", ret, SCSI.DataIn.Count); + case 0x1808: // Auto Handshake Data Input + returnValue = SCSI.DataBits; if (SCSI.REQ && SCSI.IO && !SCSI.CD) { SCSI.ACK = false; SCSI.REQ = false; SCSI.Think(); } - return ret; + return returnValue; + + case 0x180A: // ADPCM Memory Read/Write Port + //Log.Error("CD", "Read ADPCM Data Transfer Control"); + return CdIoPorts[0x0B]; + + case 0x180B: // ADPCM Data Transfer Control + //Log.Error("CD", "Read ADPCM Data Transfer Control"); + return CdIoPorts[0x0B]; + + case 0x180C: // ADPCM Status + returnValue = 0; + if (AdpcmIsPlaying) + returnValue |= 0x08; + else + returnValue |= 0x01; + if (AdpcmBusyWriting) + returnValue |= 0x04; + if (AdpcmBusyReading) + returnValue |= 0x80; + + //Log.Error("CD", "Read ADPCM Status {0:X2}", returnValue); + + return returnValue; + + case 0x180D: // ADPCM Play Control + //Log.Error("CD", "Read ADPCM Play Control"); + return CdIoPorts[0x0D]; case 0x180F: // Audio Fade Timer - Log.Note("CD", "Read: 180F {0:X2} (PC={1:X4})", CdIoPorts[0xF], Cpu.PC); + Log.Error("CD", "Read: 180F {0:X2} (PC={1:X4})", CdIoPorts[0xF], Cpu.PC); return CdIoPorts[0x0F]; // These are some retarded version check @@ -200,7 +247,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx case 0x18C7: return 0x03; default: - Log.Note("CD", "unknown read to {0:X4}", addr); + Log.Error("CD", "unknown read to {0:X4}", addr); return 0xFF; } } diff --git a/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs b/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs index 80e2e959da..cc6bf7d1e9 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs +++ b/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs @@ -86,10 +86,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx if ((StatusByte & (StatusVerticalBlanking | StatusVramSatDmaComplete)) != 0) cpu.IRQ1Assert = true; - cpu.Execute(50); - MidScanlineThink(); - - cpu.Execute(455 - HBlankCycles - 52); + cpu.Execute(455 - HBlankCycles - 2); if (InActiveDisplay == false && DmaRequested) RunDmaForScanline(); diff --git a/BizHawk.Emulation/Consoles/PC Engine/VDC.cs b/BizHawk.Emulation/Consoles/PC Engine/VDC.cs index abdfa96117..ea396cbeb3 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/VDC.cs +++ b/BizHawk.Emulation/Consoles/PC Engine/VDC.cs @@ -87,7 +87,6 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx private HuC6280 cpu; private VCE vce; - public Action MidScanlineThink = () => { }; public int MultiResHack = 0; diff --git a/CpuCoreGenerator/HuC6280/CoreGenerator.cs b/CpuCoreGenerator/HuC6280/CoreGenerator.cs index 93a99cd581..0f2edbc0ed 100644 --- a/CpuCoreGenerator/HuC6280/CoreGenerator.cs +++ b/CpuCoreGenerator/HuC6280/CoreGenerator.cs @@ -530,6 +530,7 @@ namespace HuC6280 w.WriteLine(" }"); w.WriteLine(" }"); w.WriteLine(" }"); + w.WriteLine(" ThinkAction();"); w.WriteLine(" }"); w.WriteLine(" }"); w.WriteLine(" }");