BizHawk/BizHawk.Emulation/Consoles/Nintendo/NES/PPU.cs

115 lines
2.5 KiB
C#
Raw Normal View History

//http://nesdev.parodius.com/bbs/viewtopic.php?p=4571&sid=db4c7e35316cc5d734606dd02f11dccb
using System;
using System.Globalization;
using System.IO;
using System.Collections.Generic;
using BizHawk.Emulation.CPUs.M6502;
namespace BizHawk.Emulation.Consoles.Nintendo
{
partial class NES
{
public partial class PPU
{
//when the ppu issues a write it goes through here and into the game board
void ppubus_write(int addr, byte value)
{
nes.board.WritePPU(addr, value);
}
//when the ppu issues a read it goes through here and into the game board
byte ppubus_read(int addr)
{
return nes.board.ReadPPU(addr);
}
enum PPUPHASE {
VBL, BG, OBJ
};
PPUPHASE ppuphase;
NES nes;
public PPU(NES nes)
{
this.nes = nes;
Reset();
}
2011-03-01 09:32:12 +00:00
//state
int ppudead; //measured in frames
bool idleSynch;
2011-03-01 09:32:12 +00:00
public void SaveStateBinary(BinaryWriter bw)
{
bw.Write(ppudead);
bw.Write(idleSynch);
bw.Write((bool)Reg2002_objoverflow);
bw.Write((bool)Reg2002_objhit);
bw.Write((bool)Reg2002_vblank_active);
bw.Write(PPUGenLatch);
bw.Write(reg_2000.Value);
bw.Write(reg_2001.Value);
bw.Write(reg_2003);
Util.WriteByteBuffer(bw, OAM);
Util.WriteByteBuffer(bw, PALRAM);
bw.Write(vtoggle);
bw.Write(VRAMBuffer);
ppur.SaveStateBinary(bw);
bw.Write(xbuf);
}
public void LoadStateBinary(BinaryReader br)
{
ppudead = br.ReadInt32();
idleSynch = br.ReadBoolean();
Reg2002_objoverflow = br.ReadBit();
Reg2002_objhit = br.ReadBit();
Reg2002_vblank_active = br.ReadBit();
PPUGenLatch = br.ReadByte();
reg_2000.Value = br.ReadByte();
reg_2001.Value = br.ReadByte();
reg_2003 = br.ReadByte();
OAM = Util.ReadByteBuffer(br,false);
PALRAM = Util.ReadByteBuffer(br, false);
vtoggle = br.ReadBoolean();
VRAMBuffer = br.ReadByte();
ppur.LoadStateBinary(br);
xbuf = br.ReadShorts(xbuf.Length);
}
public void Reset()
{
regs_reset();
ppudead = 2;
idleSynch = true;
}
void TriggerNMI()
{
nes.cpu.NMI = true;
}
void runppu(int x)
{
//pputime+=x;
//if(cputodo<200) return;
//DON'T LIKE THIS....
ppur.status.cycle = (ppur.status.cycle + x) %
ppur.status.end_cycle;
nes.RunCpu(x);
//pputime -= cputodo<<2;
}
//hack
public bool PAL = false;
bool SPRITELIMIT = true;
const int MAXSPRITES = 8;
}
}
}