From 303d276ac743cd274adca13d4cd77a6bc7332800 Mon Sep 17 00:00:00 2001 From: beirich Date: Sun, 27 Feb 2011 08:06:21 +0000 Subject: [PATCH] [PCE] DMA handling improvements. Fixes sprite flicker issues on some games (ex: Dragon Curse), and several games that didn't boot or froze (ex: Magical Chase) --- BizHawk.Emulation/Consoles/PC Engine/Compat.txt | 16 +++++++++------- .../Consoles/PC Engine/VDC.Render.cs | 15 +++++++++++++-- BizHawk.Emulation/Consoles/PC Engine/VDC.cs | 17 +++++++++++++++-- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/BizHawk.Emulation/Consoles/PC Engine/Compat.txt b/BizHawk.Emulation/Consoles/PC Engine/Compat.txt index 2d21557d51..6f6ff1906f 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/Compat.txt +++ b/BizHawk.Emulation/Consoles/PC Engine/Compat.txt @@ -16,7 +16,6 @@ Chouzetsu Rinjin - Doesnt boot Cyber Dodge - Minor gfx issues Davis Cup Tennis - uh lets just say it doesnt work in creative ways Dead Moon - Minor gfx issues -Dragon Curse - Terribly annoying sprite flicker - presumably timing related Dragon Egg - Doesn't boot Fighting Run - Corruption issues Final Solider - Graphics corruption issues @@ -25,24 +24,25 @@ Gunboat - Crash / CPU Break (Needs BRAM) Hisou Kihei Serd - Doesn't boot Idol Hanafuda Fan Club - Doesn't boot Impossamole - Gfx issues -Legendary Axe - Doesn't boot -Legendary Axe II - Corruption, freezes in opening sequence +Legendary Axe - Boots with bad gfx corruption - needs a T-flag opcode update +Legendary Axe II - Some gfx issues, but playable now Madoo Granzort - Graphics issues because VPC renderer is not using new frame timing -Magical Chase - Freezes when starting 1st level - waiting for DMA completion IRQ? MML Demo - Echo channels are too loud (equal volume!) Naxat Open - Crashes when you start new game New Adventure Island - Minor gfx issues Night Creatures - Some gfx glitches -Outrun - 'Sea Wind' sample when selecting music is not playing ...... raster issues, now more annoying than before +Outrun - 'Sea Wind' sample when selecting music is not playing, raster issues, music slows when paused Populous - Game freezes on starting new game - *** NEEDS BATTERY SAVERAM *** Power Drift - Timing glitch... starting new game runs slower than it should R-Type - Funky corruption after killing final boss in Stage 8 +Raiden - Sprites and BG get out of sync with current timing Side Arms - Video timing issue - bottom arms display shouldn't be visible Sinistron - Raster effect errors Soldier Blade - Freezes about 5 minutes in. Always in the same spot, fortunately. I have a savestate. Strip Fighter - Minor gfx glitches (status area) +Thunder Blade - After beating the 1st 3d area, game semi-freezes Turrican - Playable, issues with opening sequence -Valkyrie No Densetsu - Freezes in title sequence +Valkyrie No Densetsu - Boots now, but with pretty severe issues Stuff I Fixed That's Not In Other Docs: @@ -55,4 +55,6 @@ Stuff I Fixed That's Not In Other Docs: Cross Wiber, Jackie Chan, Jigoku Meguri, New Adventure Island, World Beach volley - Actually, I'm not at all convinced there's always a 1-instruction delay on the I-flag. But this fixes several games; clearly there are delays in some scenarios. But it's not clear - to me that this delay is ALWAYS present. \ No newline at end of file + to me that this delay is ALWAYS present. ++ Writing to the SATB location register of the VDC requests a VRAM->SAT DMA even if the SAT DMA + bit is disabled in the DCR. \ No newline at end of file diff --git a/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs b/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs index 6eee266278..6113e3cd6f 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs +++ b/BizHawk.Emulation/Consoles/PC Engine/VDC.Render.cs @@ -88,6 +88,9 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx cpu.Execute(455-hblankCycles); + if (InActiveDisplay == false && DmaRequested) + RunDmaForScanline(); + ScanLine++; ActiveLine++; RCRCount++; @@ -107,12 +110,20 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx public void UpdateSpriteAttributeTable() { - if (/*(Registers[DCR] & 0x10) != 0 &&*/ Registers[SATB] <= 0x7F00) + if ((SatDmaRequested || (Registers[DCR] & 0x10) != 0) && Registers[SATB] <= 0x7F00) { + SatDmaRequested = false; for (int i = 0; i < 256; i++) { SpriteAttributeTable[i] = VRAM[Registers[SATB] + i]; } + + if ((Registers[DCR] & 1) > 0) + { + Console.WriteLine("FIRING SATB DMA COMPLETION IRQ"); + StatusByte |= StatusVramSatDmaComplete; + cpu.IRQ1Assert = true; + } } } @@ -158,7 +169,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx } } - private static byte[] heightTable = { 16, 32, 64, 64 }; + private byte[] heightTable = { 16, 32, 64, 64 }; public void RenderSpritesScanline() { diff --git a/BizHawk.Emulation/Consoles/PC Engine/VDC.cs b/BizHawk.Emulation/Consoles/PC Engine/VDC.cs index 99c28c39d1..7b6597b6c6 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/VDC.cs +++ b/BizHawk.Emulation/Consoles/PC Engine/VDC.cs @@ -17,6 +17,8 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx public ushort[] Registers = new ushort[0x20]; public ushort ReadBuffer; public byte StatusByte; + private bool DmaRequested; + private bool SatDmaRequested; public ushort IncrementWidth { @@ -160,7 +162,10 @@ break; Console.WriteLine("VCR / END POSITION: "+(Registers[VCR] & 0xFF)); break; case LENR: // Initiate DMA transfer - InitiateDMA(); + DmaRequested = true; + break; + case SATB: + SatDmaRequested = true; break; } } @@ -192,9 +197,10 @@ break; return 0; } - private void InitiateDMA() + private void RunDmaForScanline() { Console.WriteLine("DOING DMA ********************************************* "); + DmaRequested = false; int advanceSource = (Registers[DCR] & 4) == 0 ? +1 : -1; int advanceDest = (Registers[DCR] & 8) == 0 ? +1 : -1; @@ -206,6 +212,13 @@ break; Registers[DESR] = (ushort)(Registers[DESR] + advanceDest); Registers[SOUR] = (ushort)(Registers[SOUR] + advanceSource); } + + if ((Registers[DCR] & 2) > 0) + { + Console.WriteLine("FIRE VRAM-VRAM DMA COMPLETE IRQ"); + StatusByte |= StatusVramVramDmaComplete; + cpu.IRQ1Assert = true; + } } public void UpdatePatternData(ushort addr)