diff --git a/Core/Video/SmsVdp.cs b/Core/Video/SmsVdp.cs
index a99a348..1b24b58 100644
--- a/Core/Video/SmsVdp.cs
+++ b/Core/Video/SmsVdp.cs
@@ -5,6 +5,7 @@ namespace Core.Video
{
public class SmsVdp
{
+ public bool IsPalRegion { get; set; } = false;
// The VDP's private memory! The CPU cannot touch these arrays directly.
public byte[] VRAM { get; private set; } = new byte[0x4000]; // 16KB Video RAM
public byte[] CRAM { get; private set; } = new byte[0x20]; // 32 Bytes Color Palette
@@ -104,19 +105,17 @@ namespace Core.Video
public byte ReadVCounter()
{
- // NTSC Hardware Quirk: The Master System outputs 262 lines,
- // but an 8-bit register can only hold a maximum value of 255!
- // To prevent a hardware overflow to 0, the silicon jumps backward during VBlank.
-
- if (_currentScanline <= 218) // 0xDA
+ if (IsPalRegion)
{
- return (byte)_currentScanline;
+ // PAL Math: 313 lines. Counts 0 to 242, jumps to 186 (0xBA), counts to 255.
+ if (_currentScanline <= 242) return (byte)_currentScanline;
+ else return (byte)(_currentScanline - 57);
}
else
{
- // At scanline 219, the counter jumps back to 213 (0xD5).
- // It then counts up to exactly 255 (0xFF) at the end of the frame.
- return (byte)(_currentScanline - 6);
+ // NTSC Math: 262 lines. Counts 0 to 218, jumps to 213 (0xD5), counts to 255.
+ if (_currentScanline <= 218) return (byte)_currentScanline;
+ else return (byte)(_currentScanline - 6);
}
}
public byte ReadHCounter()
@@ -174,7 +173,9 @@ namespace Core.Video
// 3. MOVE TO THE NEXT LINE
_currentScanline++;
- if (_currentScanline > 261)
+ int maxLines = IsPalRegion ? 313 : 262;
+
+ if (_currentScanline > maxLines -1)
{
_currentScanline = 0;
}
diff --git a/Desktop/Desktop.csproj b/Desktop/Desktop.csproj
index 827aa73..fe73d87 100644
--- a/Desktop/Desktop.csproj
+++ b/Desktop/Desktop.csproj
@@ -50,9 +50,10 @@
-
+
+
@@ -73,7 +74,8 @@
-
+
+
@@ -88,7 +90,7 @@
-
+
@@ -188,15 +190,14 @@
Never
-
- Never
-
+
Never
Never
+
Never
@@ -257,9 +258,8 @@
Never
-
- Never
-
+
+
Never
@@ -302,9 +302,7 @@
Never
-
- Never
-
+
Never
diff --git a/Desktop/Form1.Designer.cs b/Desktop/Form1.Designer.cs
index 73f1a78..ef827ae 100644
--- a/Desktop/Form1.Designer.cs
+++ b/Desktop/Form1.Designer.cs
@@ -39,10 +39,11 @@
vRAMViewerToolStripMenuItem = new ToolStripMenuItem();
machineToolStripMenuItem = new ToolStripMenuItem();
resetToolStripMenuItem = new ToolStripMenuItem();
- helpToolStripMenuItem = new ToolStripMenuItem();
- aboutToolStripMenuItem = new ToolStripMenuItem();
saveStateToolStripMenuItem = new ToolStripMenuItem();
loadStateToolStripMenuItem = new ToolStripMenuItem();
+ helpToolStripMenuItem = new ToolStripMenuItem();
+ aboutToolStripMenuItem = new ToolStripMenuItem();
+ pALRegionToolStripMenuItem = new ToolStripMenuItem();
menuStrip1.SuspendLayout();
SuspendLayout();
//
@@ -52,7 +53,8 @@
menuStrip1.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem, viewToolStripMenuItem, machineToolStripMenuItem, helpToolStripMenuItem });
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
- menuStrip1.Size = new Size(791, 33);
+ menuStrip1.Padding = new Padding(5, 2, 0, 2);
+ menuStrip1.Size = new Size(633, 28);
menuStrip1.TabIndex = 2;
menuStrip1.Text = "menuStrip1";
//
@@ -60,34 +62,34 @@
//
fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { openToolStripMenuItem, exitToolStripMenuItem });
fileToolStripMenuItem.Name = "fileToolStripMenuItem";
- fileToolStripMenuItem.Size = new Size(54, 29);
+ fileToolStripMenuItem.Size = new Size(46, 24);
fileToolStripMenuItem.Text = "File";
//
// openToolStripMenuItem
//
openToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { includedToolStripMenuItem, selectROMToolStripMenuItem1 });
openToolStripMenuItem.Name = "openToolStripMenuItem";
- openToolStripMenuItem.Size = new Size(158, 34);
+ openToolStripMenuItem.Size = new Size(224, 26);
openToolStripMenuItem.Text = "Open";
//
// includedToolStripMenuItem
//
includedToolStripMenuItem.Name = "includedToolStripMenuItem";
- includedToolStripMenuItem.Size = new Size(218, 34);
+ includedToolStripMenuItem.Size = new Size(178, 26);
includedToolStripMenuItem.Text = "Included";
includedToolStripMenuItem.Click += includedToolStripMenuItem_Click;
//
// selectROMToolStripMenuItem1
//
selectROMToolStripMenuItem1.Name = "selectROMToolStripMenuItem1";
- selectROMToolStripMenuItem1.Size = new Size(218, 34);
+ selectROMToolStripMenuItem1.Size = new Size(178, 26);
selectROMToolStripMenuItem1.Text = "Select ROM...";
selectROMToolStripMenuItem1.Click += selectROMToolStripMenuItem_Click;
//
// exitToolStripMenuItem
//
exitToolStripMenuItem.Name = "exitToolStripMenuItem";
- exitToolStripMenuItem.Size = new Size(158, 34);
+ exitToolStripMenuItem.Size = new Size(224, 26);
exitToolStripMenuItem.Text = "Exit";
exitToolStripMenuItem.Click += exitToolStripMenuItem_Click;
//
@@ -95,72 +97,81 @@
//
viewToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { debuggerToolStripMenuItem, vRAMViewerToolStripMenuItem });
viewToolStripMenuItem.Name = "viewToolStripMenuItem";
- viewToolStripMenuItem.Size = new Size(65, 29);
+ viewToolStripMenuItem.Size = new Size(55, 24);
viewToolStripMenuItem.Text = "View";
//
// debuggerToolStripMenuItem
//
debuggerToolStripMenuItem.Name = "debuggerToolStripMenuItem";
- debuggerToolStripMenuItem.Size = new Size(221, 34);
+ debuggerToolStripMenuItem.Size = new Size(182, 26);
debuggerToolStripMenuItem.Text = "Debugger";
debuggerToolStripMenuItem.Click += debuggerToolStripMenuItem_Click;
//
// vRAMViewerToolStripMenuItem
//
vRAMViewerToolStripMenuItem.Name = "vRAMViewerToolStripMenuItem";
- vRAMViewerToolStripMenuItem.Size = new Size(221, 34);
+ vRAMViewerToolStripMenuItem.Size = new Size(182, 26);
vRAMViewerToolStripMenuItem.Text = "VRAM Viewer";
vRAMViewerToolStripMenuItem.Click += vramViewerToolStripMenuItem_Click;
//
// machineToolStripMenuItem
//
- machineToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { resetToolStripMenuItem, saveStateToolStripMenuItem, loadStateToolStripMenuItem });
+ machineToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { resetToolStripMenuItem, saveStateToolStripMenuItem, loadStateToolStripMenuItem, pALRegionToolStripMenuItem });
machineToolStripMenuItem.Name = "machineToolStripMenuItem";
- machineToolStripMenuItem.Size = new Size(94, 29);
+ machineToolStripMenuItem.Size = new Size(79, 24);
machineToolStripMenuItem.Text = "Machine";
//
// resetToolStripMenuItem
//
resetToolStripMenuItem.Name = "resetToolStripMenuItem";
- resetToolStripMenuItem.Size = new Size(270, 34);
+ resetToolStripMenuItem.Size = new Size(224, 26);
resetToolStripMenuItem.Text = "Reset";
resetToolStripMenuItem.Click += resetToolStripMenuItem_Click;
//
- // helpToolStripMenuItem
- //
- helpToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { aboutToolStripMenuItem });
- helpToolStripMenuItem.Name = "helpToolStripMenuItem";
- helpToolStripMenuItem.Size = new Size(65, 29);
- helpToolStripMenuItem.Text = "Help";
- //
- // aboutToolStripMenuItem
- //
- aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
- aboutToolStripMenuItem.Size = new Size(164, 34);
- aboutToolStripMenuItem.Text = "About";
- //
// saveStateToolStripMenuItem
//
saveStateToolStripMenuItem.Name = "saveStateToolStripMenuItem";
- saveStateToolStripMenuItem.Size = new Size(270, 34);
+ saveStateToolStripMenuItem.Size = new Size(224, 26);
saveStateToolStripMenuItem.Text = "Save State";
saveStateToolStripMenuItem.Click += saveStateToolStripMenuItem_Click;
//
// loadStateToolStripMenuItem
//
loadStateToolStripMenuItem.Name = "loadStateToolStripMenuItem";
- loadStateToolStripMenuItem.Size = new Size(270, 34);
+ loadStateToolStripMenuItem.Size = new Size(224, 26);
loadStateToolStripMenuItem.Text = "Load State";
loadStateToolStripMenuItem.Click += loadStateToolStripMenuItem_Click;
//
+ // helpToolStripMenuItem
+ //
+ helpToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { aboutToolStripMenuItem });
+ helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+ helpToolStripMenuItem.Size = new Size(55, 24);
+ helpToolStripMenuItem.Text = "Help";
+ //
+ // aboutToolStripMenuItem
+ //
+ aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+ aboutToolStripMenuItem.Size = new Size(133, 26);
+ aboutToolStripMenuItem.Text = "About";
+ //
+ // pALRegionToolStripMenuItem
+ //
+ pALRegionToolStripMenuItem.Checked = true;
+ pALRegionToolStripMenuItem.CheckOnClick = true;
+ pALRegionToolStripMenuItem.CheckState = CheckState.Checked;
+ pALRegionToolStripMenuItem.Name = "pALRegionToolStripMenuItem";
+ pALRegionToolStripMenuItem.Size = new Size(224, 26);
+ pALRegionToolStripMenuItem.Text = "PAL Region?";
+ pALRegionToolStripMenuItem.Click += pALRegionToolStripMenuItem_Click;
+ //
// ParsonsForm1
//
- AutoScaleDimensions = new SizeF(10F, 25F);
+ AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
- ClientSize = new Size(791, 622);
+ ClientSize = new Size(633, 498);
Controls.Add(menuStrip1);
MainMenuStrip = menuStrip1;
- Margin = new Padding(4);
Name = "ParsonsForm1";
Text = "Form1";
FormClosing += ParsonsForm1_FormClosing;
@@ -186,5 +197,6 @@
private ToolStripMenuItem vRAMViewerToolStripMenuItem;
private ToolStripMenuItem saveStateToolStripMenuItem;
private ToolStripMenuItem loadStateToolStripMenuItem;
+ private ToolStripMenuItem pALRegionToolStripMenuItem;
}
}
diff --git a/Desktop/Form1.cs b/Desktop/Form1.cs
index 7a2aae1..0e1e00a 100644
--- a/Desktop/Form1.cs
+++ b/Desktop/Form1.cs
@@ -113,7 +113,8 @@ namespace Desktop
IsRunning = true;
TotalFrameCount = 0;
- double TargetFrameTime = 1000.0 / 59.92274;
+ double targetFps = _machine.VideoProcessor.IsPalRegion ? 50.0 : 59.92274;
+ double TargetFrameTime = 1000.0 / targetFps;
_emulatorTask = Task.Run(() =>
{
@@ -330,7 +331,7 @@ namespace Desktop
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
- this.Close();
+ this.Close();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
@@ -410,5 +411,15 @@ namespace Desktop
// 3. Resume
StartEmulator();
}
+
+ private void pALRegionToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (pALRegionToolStripMenuItem.Checked)
+ _machine.VideoProcessor.IsPalRegion = true;
+ else _machine.VideoProcessor.IsPalRegion= false;
+
+ pALRegionToolStripMenuItem.Checked = !pALRegionToolStripMenuItem.Checked;
+
+ }
}
}
diff --git a/Desktop/ROMS/Ghouls 'n Ghosts (UE) [!].sms b/Desktop/ROMS/Ghouls 'n Ghosts (USA).sms
similarity index 99%
rename from Desktop/ROMS/Ghouls 'n Ghosts (UE) [!].sms
rename to Desktop/ROMS/Ghouls 'n Ghosts (USA).sms
index aaaaa06..ab4f3ee 100644
Binary files a/Desktop/ROMS/Ghouls 'n Ghosts (UE) [!].sms and b/Desktop/ROMS/Ghouls 'n Ghosts (USA).sms differ
diff --git a/Desktop/ROMS/Olympic Gold - Barcelona '92 (Europe).sms b/Desktop/ROMS/Olympic Gold - Barcelona '92 (Europe).sms
new file mode 100644
index 0000000..41827e8
Binary files /dev/null and b/Desktop/ROMS/Olympic Gold - Barcelona '92 (Europe).sms differ
diff --git a/Desktop/ROMS/OutRun (UE) [!].sms b/Desktop/ROMS/OutRun (USA).sms
similarity index 99%
rename from Desktop/ROMS/OutRun (UE) [!].sms
rename to Desktop/ROMS/OutRun (USA).sms
index 31c5b0f..c877842 100644
Binary files a/Desktop/ROMS/OutRun (UE) [!].sms and b/Desktop/ROMS/OutRun (USA).sms differ
diff --git a/Desktop/ROMS/Space Harrier (UE) [!].sms b/Desktop/ROMS/Space Harrier (USA).sms
similarity index 90%
rename from Desktop/ROMS/Space Harrier (UE) [!].sms
rename to Desktop/ROMS/Space Harrier (USA).sms
index f57d038..9b99225 100644
Binary files a/Desktop/ROMS/Space Harrier (UE) [!].sms and b/Desktop/ROMS/Space Harrier (USA).sms differ