SMS overscan display

Conflicts:
	BizHawk.Client.EmuHawk/MainForm.Designer.cs
This commit is contained in:
Ben Eirich 2016-06-26 23:41:44 -04:00 committed by feos
parent 94383ab143
commit 7f23cd80f1
6 changed files with 471 additions and 374 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1625,6 +1625,7 @@ namespace BizHawk.Client.EmuHawk
SMSOverclockMenuItem.Checked = ss.AllowOverlock;
SMSForceStereoMenuItem.Checked = s.ForceStereoSeparation;
SMSSpriteLimitMenuItem.Checked = s.SpriteLimit;
SMSDisplayOverscanMenuItem.Checked = s.DisplayOverscan;
SMSFix3DGameDisplayToolStripMenuItem.Checked = s.Fix3D;
ShowClippedRegionsMenuItem.Checked = s.ShowClippedRegions;
HighlightActiveDisplayRegionMenuItem.Checked = s.HighlightActiveDisplayRegion;
@ -1632,6 +1633,7 @@ namespace BizHawk.Client.EmuHawk
SMSEnableFMChipMenuItem.Visible =
SMSFix3DGameDisplayToolStripMenuItem.Visible =
SMSenableBIOSToolStripMenuItem.Visible =
SMSDisplayOverscanMenuItem.Visible =
Global.Game.System == "SMS";
SMSOverclockMenuItem.Visible =
@ -1727,6 +1729,13 @@ namespace BizHawk.Client.EmuHawk
PutCoreSettings(s);
}
private void SMSDisplayOverscanMenuItem_Click(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
s.DisplayOverscan ^= true;
PutCoreSettings(s);
}
private void SMSFix3DDisplayMenuItem_Click(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
@ -2743,7 +2752,7 @@ namespace BizHawk.Client.EmuHawk
private void FormDragDrop_internal(object sender, DragEventArgs e)
{
_FormDragDrop_internal(sender, e);
_FormDragDrop_internal(sender, e);
/*
var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
var isLua = false;

View File

@ -37,6 +37,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
public bool ForceStereoSeparation = false;
public bool SpriteLimit = false;
public bool Fix3D = true;
public bool DisplayOverscan = false;
// GG settings
public bool ShowClippedRegions = false;

View File

@ -191,6 +191,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
var serviceProvider = ServiceProvider as BasicServiceProvider;
serviceProvider.Register<ITraceable>(Tracer);
serviceProvider.Register<IDisassemblable>(new Disassembler());
Vdp.ProcessOverscan();
}
private ITraceable Tracer { get; set; }

View File

@ -271,6 +271,66 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
FrameBuffer[ofs++] = Palette[BackdropColor];
}
internal int OverscanFrameWidth, OverscanFrameHeight;
int overscanTop;
int overscanBottom;
int overscanLeft;
int overscanRight;
internal void ProcessOverscan()
{
if (Sms.Settings.DisplayOverscan == false)
return;
if (OverscanFrameBuffer == null)
{
if (Sms.Region == Common.DisplayType.NTSC)
{
overscanLeft = 13;
overscanRight = 15;
overscanTop = 27;
overscanBottom = 24;
}
else // PAL
{
overscanLeft = 13;
overscanRight = 15;
overscanTop = 48;
overscanBottom = 48;
}
OverscanFrameWidth = overscanLeft + 256 + overscanRight;
OverscanFrameHeight = overscanTop + 192 + overscanBottom;
OverscanFrameBuffer = new int[OverscanFrameHeight * OverscanFrameWidth];
}
// Top overscan
for (int y=0; y<overscanTop; y++)
for (int x = 0; x < OverscanFrameWidth; x++)
OverscanFrameBuffer[(y * OverscanFrameWidth) + x] = BackgroundColor;
// Bottom overscan
for (int y = overscanTop + 192; y < OverscanFrameHeight; y++)
for (int x = 0; x < OverscanFrameWidth; x++)
OverscanFrameBuffer[(y * OverscanFrameWidth) + x] = BackgroundColor;
// Left overscan
for (int y = overscanTop; y < overscanTop + 192; y++)
for (int x = 0; x < overscanLeft; x++)
OverscanFrameBuffer[(y * OverscanFrameWidth) + x] = BackgroundColor;
// Right overscan
for (int y = overscanTop; y < overscanTop + 192; y++)
for (int x = overscanLeft + 256; x < OverscanFrameWidth; x++)
OverscanFrameBuffer[(y * OverscanFrameWidth) + x] = BackgroundColor;
// Active display area
for (int y = 0; y < 192; y++)
for (int x = 0; x < 256; x++)
OverscanFrameBuffer[((y + overscanTop) * OverscanFrameWidth) + overscanLeft + x] = FrameBuffer[y * 256 + x];
}
// Handles GG clipping or highlighting
internal void ProcessGGScreen()
{

View File

@ -49,6 +49,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
public int ScanLine;
public int[] FrameBuffer = new int[256 * 192];
public int[] GameGearFrameBuffer = new int[160 * 144];
public int[] OverscanFrameBuffer = null;
public bool Mode1Bit { get { return (Registers[1] & 16) > 0; } }
public bool Mode2Bit { get { return (Registers[0] & 2) > 0; } }
@ -369,7 +370,10 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
Cpu.ExecuteCycles(IPeriod);
if (ScanLine == scanlinesPerFrame - 1)
{
ProcessGGScreen();
ProcessOverscan();
}
}
}
@ -429,6 +433,12 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
public int[] GetVideoBuffer()
{
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
{
if (OverscanFrameBuffer == null)
ProcessOverscan();
return OverscanFrameBuffer;
}
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
return FrameBuffer;
return GameGearFrameBuffer;
@ -438,6 +448,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
{
get
{
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
return OverscanFrameWidth;
if (mode == MasterSystem.VdpMode.SMS)
return 293;
else if (Sms.Settings.ShowClippedRegions)
@ -451,6 +463,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
{
get
{
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
return OverscanFrameWidth;
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
return 256;
return 160; // GameGear
@ -461,6 +475,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
{
get
{
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
return OverscanFrameHeight;
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
return FrameHeight;
return 144; // GameGear