SMS overscan display
Conflicts: BizHawk.Client.EmuHawk/MainForm.Designer.cs
This commit is contained in:
parent
94383ab143
commit
7f23cd80f1
File diff suppressed because it is too large
Load Diff
|
@ -1625,6 +1625,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
SMSOverclockMenuItem.Checked = ss.AllowOverlock;
|
SMSOverclockMenuItem.Checked = ss.AllowOverlock;
|
||||||
SMSForceStereoMenuItem.Checked = s.ForceStereoSeparation;
|
SMSForceStereoMenuItem.Checked = s.ForceStereoSeparation;
|
||||||
SMSSpriteLimitMenuItem.Checked = s.SpriteLimit;
|
SMSSpriteLimitMenuItem.Checked = s.SpriteLimit;
|
||||||
|
SMSDisplayOverscanMenuItem.Checked = s.DisplayOverscan;
|
||||||
SMSFix3DGameDisplayToolStripMenuItem.Checked = s.Fix3D;
|
SMSFix3DGameDisplayToolStripMenuItem.Checked = s.Fix3D;
|
||||||
ShowClippedRegionsMenuItem.Checked = s.ShowClippedRegions;
|
ShowClippedRegionsMenuItem.Checked = s.ShowClippedRegions;
|
||||||
HighlightActiveDisplayRegionMenuItem.Checked = s.HighlightActiveDisplayRegion;
|
HighlightActiveDisplayRegionMenuItem.Checked = s.HighlightActiveDisplayRegion;
|
||||||
|
@ -1632,6 +1633,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
SMSEnableFMChipMenuItem.Visible =
|
SMSEnableFMChipMenuItem.Visible =
|
||||||
SMSFix3DGameDisplayToolStripMenuItem.Visible =
|
SMSFix3DGameDisplayToolStripMenuItem.Visible =
|
||||||
SMSenableBIOSToolStripMenuItem.Visible =
|
SMSenableBIOSToolStripMenuItem.Visible =
|
||||||
|
SMSDisplayOverscanMenuItem.Visible =
|
||||||
Global.Game.System == "SMS";
|
Global.Game.System == "SMS";
|
||||||
|
|
||||||
SMSOverclockMenuItem.Visible =
|
SMSOverclockMenuItem.Visible =
|
||||||
|
@ -1727,6 +1729,13 @@ namespace BizHawk.Client.EmuHawk
|
||||||
PutCoreSettings(s);
|
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)
|
private void SMSFix3DDisplayMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var s = ((SMS)Global.Emulator).GetSettings();
|
var s = ((SMS)Global.Emulator).GetSettings();
|
||||||
|
@ -2743,7 +2752,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
|
|
||||||
private void FormDragDrop_internal(object sender, DragEventArgs e)
|
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 filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||||||
var isLua = false;
|
var isLua = false;
|
||||||
|
|
|
@ -37,6 +37,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
public bool ForceStereoSeparation = false;
|
public bool ForceStereoSeparation = false;
|
||||||
public bool SpriteLimit = false;
|
public bool SpriteLimit = false;
|
||||||
public bool Fix3D = true;
|
public bool Fix3D = true;
|
||||||
|
public bool DisplayOverscan = false;
|
||||||
|
|
||||||
// GG settings
|
// GG settings
|
||||||
public bool ShowClippedRegions = false;
|
public bool ShowClippedRegions = false;
|
||||||
|
|
|
@ -191,6 +191,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
var serviceProvider = ServiceProvider as BasicServiceProvider;
|
var serviceProvider = ServiceProvider as BasicServiceProvider;
|
||||||
serviceProvider.Register<ITraceable>(Tracer);
|
serviceProvider.Register<ITraceable>(Tracer);
|
||||||
serviceProvider.Register<IDisassemblable>(new Disassembler());
|
serviceProvider.Register<IDisassemblable>(new Disassembler());
|
||||||
|
Vdp.ProcessOverscan();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ITraceable Tracer { get; set; }
|
private ITraceable Tracer { get; set; }
|
||||||
|
|
|
@ -271,6 +271,66 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
FrameBuffer[ofs++] = Palette[BackdropColor];
|
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
|
// Handles GG clipping or highlighting
|
||||||
internal void ProcessGGScreen()
|
internal void ProcessGGScreen()
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,6 +49,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
public int ScanLine;
|
public int ScanLine;
|
||||||
public int[] FrameBuffer = new int[256 * 192];
|
public int[] FrameBuffer = new int[256 * 192];
|
||||||
public int[] GameGearFrameBuffer = new int[160 * 144];
|
public int[] GameGearFrameBuffer = new int[160 * 144];
|
||||||
|
public int[] OverscanFrameBuffer = null;
|
||||||
|
|
||||||
public bool Mode1Bit { get { return (Registers[1] & 16) > 0; } }
|
public bool Mode1Bit { get { return (Registers[1] & 16) > 0; } }
|
||||||
public bool Mode2Bit { get { return (Registers[0] & 2) > 0; } }
|
public bool Mode2Bit { get { return (Registers[0] & 2) > 0; } }
|
||||||
|
@ -369,7 +370,10 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
Cpu.ExecuteCycles(IPeriod);
|
Cpu.ExecuteCycles(IPeriod);
|
||||||
|
|
||||||
if (ScanLine == scanlinesPerFrame - 1)
|
if (ScanLine == scanlinesPerFrame - 1)
|
||||||
|
{
|
||||||
ProcessGGScreen();
|
ProcessGGScreen();
|
||||||
|
ProcessOverscan();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,6 +433,12 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
|
|
||||||
public int[] GetVideoBuffer()
|
public int[] GetVideoBuffer()
|
||||||
{
|
{
|
||||||
|
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
|
||||||
|
{
|
||||||
|
if (OverscanFrameBuffer == null)
|
||||||
|
ProcessOverscan();
|
||||||
|
return OverscanFrameBuffer;
|
||||||
|
}
|
||||||
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
|
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
|
||||||
return FrameBuffer;
|
return FrameBuffer;
|
||||||
return GameGearFrameBuffer;
|
return GameGearFrameBuffer;
|
||||||
|
@ -438,6 +448,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
|
||||||
|
return OverscanFrameWidth;
|
||||||
if (mode == MasterSystem.VdpMode.SMS)
|
if (mode == MasterSystem.VdpMode.SMS)
|
||||||
return 293;
|
return 293;
|
||||||
else if (Sms.Settings.ShowClippedRegions)
|
else if (Sms.Settings.ShowClippedRegions)
|
||||||
|
@ -451,6 +463,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
|
||||||
|
return OverscanFrameWidth;
|
||||||
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
|
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
|
||||||
return 256;
|
return 256;
|
||||||
return 160; // GameGear
|
return 160; // GameGear
|
||||||
|
@ -461,6 +475,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
if (mode == VdpMode.SMS && Sms.Settings.DisplayOverscan)
|
||||||
|
return OverscanFrameHeight;
|
||||||
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
|
if (mode == VdpMode.SMS || Sms.Settings.ShowClippedRegions)
|
||||||
return FrameHeight;
|
return FrameHeight;
|
||||||
return 144; // GameGear
|
return 144; // GameGear
|
||||||
|
|
Loading…
Reference in New Issue