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