From 1475d55da1b88c457061a56abb4d7306bc4de31d Mon Sep 17 00:00:00 2001 From: beirich Date: Sat, 16 Jul 2011 21:09:44 +0000 Subject: [PATCH] blegh --- .../Consoles/PC Engine/Compat.txt | 3 +- .../Consoles/PC Engine/MemoryMap.Populous.cs | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 BizHawk.Emulation/Consoles/PC Engine/MemoryMap.Populous.cs diff --git a/BizHawk.Emulation/Consoles/PC Engine/Compat.txt b/BizHawk.Emulation/Consoles/PC Engine/Compat.txt index 9681043f30..c8c36472a1 100644 --- a/BizHawk.Emulation/Consoles/PC Engine/Compat.txt +++ b/BizHawk.Emulation/Consoles/PC Engine/Compat.txt @@ -23,7 +23,6 @@ Madoo Granzort - Graphics issues because SGX VPC renderer is not using new fr MML Demo - Echo channels are too loud (equal volume!) Outrun - OK currently but timing sensitive game for future testing Paranoia - Game hits BREAK on 3rd level. need to investigate -Populous - Game freezes on starting new game - unclear if related to battery RAM Power Drift - Timing glitch... starting new game runs slower than it should Power Tennis - Elaborate intro screen doesnt display right Raiden - Sprites and BG get out of sync with current timing @@ -52,7 +51,7 @@ Side Arms - Screen is like 4 pixels too tall Stuff I Fixed That's Not In Other Docs: + Street Fighter II special mapper -+ Populous has special BRAM / saveRAM (I have not yet fixed this) ++ Populous has special SaveRAM, 32k starting at page $40. + After Burner - There is a 1-instruction delay on changes to IRQ Control Byte taking effect + There is a one-instruction delay on changes to the I flag taking effect - Affects (Not a complete list): Blodia, Body Conquest 2, Champions Forever Boxing, diff --git a/BizHawk.Emulation/Consoles/PC Engine/MemoryMap.Populous.cs b/BizHawk.Emulation/Consoles/PC Engine/MemoryMap.Populous.cs new file mode 100644 index 0000000000..256b606715 --- /dev/null +++ b/BizHawk.Emulation/Consoles/PC Engine/MemoryMap.Populous.cs @@ -0,0 +1,62 @@ +namespace BizHawk.Emulation.Consoles.TurboGrafx +{ + public partial class PCEngine + { + // The Populous HuCard is the only traditional HuCard to have battery-backed saveRAM + // built into it. There is 32k of save-RAM mapped at pages $40 - $44. + + private byte[] PopulousRAM; + + private byte ReadMemoryPopulous(int addr) + { + if (addr >= 0x80000 && addr < 0x88000) + return PopulousRAM[addr & 0x7FFF]; + + if (addr < 0xFFFFF) // read ROM + return RomData[addr % RomLength]; + + if (addr >= 0x1F0000 && addr < 0x1F8000) // read RAM + return Ram[addr & 0x1FFF]; + + if (addr >= 0x1FE000) // hardware page. + { + if (addr < 0x1FE400) return VDC1.ReadVDC(addr); + if (addr < 0x1FE800) { Cpu.PendingCycles--; return VCE.ReadVCE(addr); } + if (addr < 0x1FEC00) return IOBuffer; + if (addr < 0x1FF000) { IOBuffer = (byte)(Cpu.ReadTimerValue() | (IOBuffer & 0x80)); return IOBuffer; } + if (addr >= 0x1FF000 && + addr < 0x1FF400) { IOBuffer = ReadInput(); return IOBuffer; } + if ((addr & ~1) == 0x1FF400) return IOBuffer; + if (addr == 0x1FF402) { IOBuffer = (byte)(Cpu.IRQControlByte | (IOBuffer & 0xF8)); return IOBuffer; } + if (addr == 0x1FF403) { IOBuffer = (byte)(Cpu.ReadIrqStatus() | (IOBuffer & 0xF8)); return IOBuffer; } + } + + Log.Error("MEM", "UNHANDLED READ: {0:X6}", addr); + return 0xFF; + } + + private void WriteMemoryPopulous(int addr, byte value) + { + if (addr >= 0x1F0000 && addr < 0x1F8000) // write RAM. + Ram[addr & 0x1FFF] = value; + + else if (addr >= 0x1FE000) // hardware page. + { + if (addr < 0x1FE400) VDC1.WriteVDC(addr, value); + else if (addr < 0x1FE800) { Cpu.PendingCycles--; VCE.WriteVCE(addr, value); } + else if (addr < 0x1FEC00) { IOBuffer = value; PSG.WritePSG((byte)addr, value, Cpu.TotalExecutedCycles); } + else if (addr == 0x1FEC00) { IOBuffer = value; Cpu.WriteTimer(value); } + else if (addr == 0x1FEC01) { IOBuffer = value; Cpu.WriteTimerEnable(value); } + else if (addr >= 0x1FF000 && + addr < 0x1FF400) { IOBuffer = value; WriteInput(value); } + else if (addr == 0x1FF402) { IOBuffer = value; Cpu.WriteIrqControl(value); } + else if (addr == 0x1FF403) { IOBuffer = value; Cpu.WriteIrqStatus(); } + else Log.Error("MEM", "unhandled hardware write [{0:X6}] : {1:X2}", addr, value); + } + else if (addr >= 0x80000 && addr < 0x88000) + PopulousRAM[addr & 0x7FFF] = value; + else + Log.Error("MEM","UNHANDLED WRITE: {0:X6}:{1:X2}",addr,value); + } + } +} \ No newline at end of file