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;
|
||||
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue