diff --git a/Desktop/Desktop.csproj b/Desktop/Desktop.csproj
index 878ff67..8cd674b 100644
--- a/Desktop/Desktop.csproj
+++ b/Desktop/Desktop.csproj
@@ -10,12 +10,24 @@
+
+
+
Always
+
+ Always
+
+
+ Always
+
+
+ Always
+
diff --git a/Desktop/Form1.Designer.cs b/Desktop/Form1.Designer.cs
index d87508f..ddd0633 100644
--- a/Desktop/Form1.Designer.cs
+++ b/Desktop/Form1.Designer.cs
@@ -28,49 +28,149 @@
///
private void InitializeComponent()
{
- button1 = new Button();
pbScreen = new PictureBox();
+ menuStrip1 = new MenuStrip();
+ fileToolStripMenuItem = new ToolStripMenuItem();
+ openToolStripMenuItem = new ToolStripMenuItem();
+ includedToolStripMenuItem = new ToolStripMenuItem();
+ selectROMToolStripMenuItem1 = new ToolStripMenuItem();
+ exitToolStripMenuItem = new ToolStripMenuItem();
+ viewToolStripMenuItem = new ToolStripMenuItem();
+ debuggerToolStripMenuItem = new ToolStripMenuItem();
+ machineToolStripMenuItem = new ToolStripMenuItem();
+ resetToolStripMenuItem = new ToolStripMenuItem();
+ helpToolStripMenuItem = new ToolStripMenuItem();
+ aboutToolStripMenuItem = new ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)pbScreen).BeginInit();
+ menuStrip1.SuspendLayout();
SuspendLayout();
//
- // button1
- //
- button1.Location = new Point(1294, 13);
- button1.Margin = new Padding(4, 4, 4, 4);
- button1.Name = "button1";
- button1.Size = new Size(118, 36);
- button1.TabIndex = 0;
- button1.Text = "button1";
- button1.UseVisualStyleBackColor = true;
- button1.Click += button1_Click;
- //
// pbScreen
//
- pbScreen.Location = new Point(23, 59);
+ pbScreen.Location = new Point(12, 36);
pbScreen.Name = "pbScreen";
- pbScreen.Size = new Size(1390, 760);
+ pbScreen.Size = new Size(762, 672);
pbScreen.SizeMode = PictureBoxSizeMode.Zoom;
pbScreen.TabIndex = 1;
pbScreen.TabStop = false;
//
+ // menuStrip1
+ //
+ menuStrip1.ImageScalingSize = new Size(24, 24);
+ menuStrip1.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem, viewToolStripMenuItem, machineToolStripMenuItem, helpToolStripMenuItem });
+ menuStrip1.Location = new Point(0, 0);
+ menuStrip1.Name = "menuStrip1";
+ menuStrip1.Size = new Size(785, 33);
+ menuStrip1.TabIndex = 2;
+ menuStrip1.Text = "menuStrip1";
+ //
+ // fileToolStripMenuItem
+ //
+ fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { openToolStripMenuItem, exitToolStripMenuItem });
+ fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ fileToolStripMenuItem.Size = new Size(54, 29);
+ fileToolStripMenuItem.Text = "File";
+ //
+ // openToolStripMenuItem
+ //
+ openToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { includedToolStripMenuItem, selectROMToolStripMenuItem1 });
+ openToolStripMenuItem.Name = "openToolStripMenuItem";
+ openToolStripMenuItem.Size = new Size(270, 34);
+ openToolStripMenuItem.Text = "Open";
+ //
+ // includedToolStripMenuItem
+ //
+ includedToolStripMenuItem.Name = "includedToolStripMenuItem";
+ includedToolStripMenuItem.Size = new Size(270, 34);
+ includedToolStripMenuItem.Text = "Included";
+ includedToolStripMenuItem.Click += includedToolStripMenuItem_Click;
+ //
+ // selectROMToolStripMenuItem1
+ //
+ selectROMToolStripMenuItem1.Name = "selectROMToolStripMenuItem1";
+ selectROMToolStripMenuItem1.Size = new Size(270, 34);
+ selectROMToolStripMenuItem1.Text = "Select ROM...";
+ selectROMToolStripMenuItem1.Click += selectROMToolStripMenuItem_Click;
+ //
+ // exitToolStripMenuItem
+ //
+ exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+ exitToolStripMenuItem.Size = new Size(270, 34);
+ exitToolStripMenuItem.Text = "Exit";
+ exitToolStripMenuItem.Click += exitToolStripMenuItem_Click;
+ //
+ // viewToolStripMenuItem
+ //
+ viewToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { debuggerToolStripMenuItem });
+ viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+ viewToolStripMenuItem.Size = new Size(65, 29);
+ viewToolStripMenuItem.Text = "View";
+ //
+ // debuggerToolStripMenuItem
+ //
+ debuggerToolStripMenuItem.Name = "debuggerToolStripMenuItem";
+ debuggerToolStripMenuItem.Size = new Size(194, 34);
+ debuggerToolStripMenuItem.Text = "Debugger";
+ debuggerToolStripMenuItem.Click += debuggerToolStripMenuItem_Click;
+ //
+ // machineToolStripMenuItem
+ //
+ machineToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { resetToolStripMenuItem });
+ machineToolStripMenuItem.Name = "machineToolStripMenuItem";
+ machineToolStripMenuItem.Size = new Size(94, 29);
+ machineToolStripMenuItem.Text = "Machine";
+ //
+ // resetToolStripMenuItem
+ //
+ resetToolStripMenuItem.Name = "resetToolStripMenuItem";
+ resetToolStripMenuItem.Size = new Size(156, 34);
+ 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";
+ //
// Form1
//
AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font;
- ClientSize = new Size(1425, 842);
+ ClientSize = new Size(785, 719);
Controls.Add(pbScreen);
- Controls.Add(button1);
- Margin = new Padding(4, 4, 4, 4);
+ Controls.Add(menuStrip1);
+ MainMenuStrip = menuStrip1;
+ Margin = new Padding(4);
Name = "Form1";
Text = "Form1";
- Click += button1_Click;
((System.ComponentModel.ISupportInitialize)pbScreen).EndInit();
+ menuStrip1.ResumeLayout(false);
+ menuStrip1.PerformLayout();
ResumeLayout(false);
+ PerformLayout();
}
#endregion
-
- private Button button1;
private PictureBox pbScreen;
+ private MenuStrip menuStrip1;
+ private ToolStripMenuItem fileToolStripMenuItem;
+ private ToolStripMenuItem openToolStripMenuItem;
+ private ToolStripMenuItem exitToolStripMenuItem;
+ private ToolStripMenuItem viewToolStripMenuItem;
+ private ToolStripMenuItem debuggerToolStripMenuItem;
+ private ToolStripMenuItem machineToolStripMenuItem;
+ private ToolStripMenuItem resetToolStripMenuItem;
+ private ToolStripMenuItem helpToolStripMenuItem;
+ private ToolStripMenuItem aboutToolStripMenuItem;
+ private ToolStripMenuItem includedToolStripMenuItem;
+ private ToolStripMenuItem selectROMToolStripMenuItem1;
}
}
diff --git a/Desktop/Form1.cs b/Desktop/Form1.cs
index ac8718e..007f140 100644
--- a/Desktop/Form1.cs
+++ b/Desktop/Form1.cs
@@ -14,6 +14,8 @@ namespace Desktop
private DebuggerForm _debugger;
private Bitmap _screenBitmap = new Bitmap(256, 192, PixelFormat.Format32bppArgb);
+ private Task _emulatorTask;
+
public bool IsRunning { get; private set; } = false;
@@ -27,6 +29,8 @@ namespace Desktop
{
InitializeComponent();
_machine = new SmsMachine();
+
+ PopulateIncludedRomsMenu();
}
private void DrawScreen()
@@ -44,9 +48,7 @@ namespace Desktop
{
if (IsRunning) return;
IsRunning = true;
-
- // Fire off a background task so we don't freeze the Windows UI!
- Task.Run(() =>
+ _emulatorTask = Task.Run(() =>
{
while (IsRunning)
{
@@ -65,7 +67,7 @@ namespace Desktop
else
{
// Only throttle the speed if we are actively running
- Thread.Sleep(16);
+ Thread.Sleep(8);
}
}
});
@@ -82,22 +84,89 @@ namespace Desktop
_machine.StepMachine();
}
- private void button1_Click(object sender, EventArgs e)
+ private async void LoadRomAndStart(string filePath)
{
- // 1. Load a commercial Master System ROM!
-
- byte[] rom = File.ReadAllBytes(@"C:\Parsons\Local Code Projects\ParsonsMasterSystem2026\Desktop\ROMS\Golden Axe Warrior.sms");
+ StopEmulator();
+ if (_emulatorTask != null)
+ {
+ await _emulatorTask;
+ }
- // 2. Jam it into the Sega Mapper
- _machine.LoadCartridge(rom);
+ // 2. Load the file
+ byte[] rom = File.ReadAllBytes(filePath);
- // 3. Open the Debugger to look around
- if (_debugger == null || _debugger.IsDisposed)
+ // 3. Jam it into the Sega Mapper
+ _machine.LoadCartridge(rom);
+
+ // 4. Update the Window title so it looks professional
+ this.Text = $"Parsons Master System 2026 - {Path.GetFileNameWithoutExtension(filePath)}";
+
+ // 5. Turn the power on!
+
+ StartEmulator();
+ }
+
+ private void PopulateIncludedRomsMenu()
+ {
+ // The folder you used for Golden Axe Warrior
+ string romsDirectory = @"C:\Parsons\Local Code Projects\ParsonsMasterSystem2026\Desktop\ROMS\";
+
+ if (Directory.Exists(romsDirectory))
+ {
+ string[] romFiles = Directory.GetFiles(romsDirectory, "*.sms");
+
+ foreach (string file in romFiles)
{
- _debugger = new DebuggerForm(_machine.Cpu, _machine.MemoryBus, this);
- _debugger.Show();
+ // Create a new dropdown item for each .sms file it finds
+ string romName = Path.GetFileNameWithoutExtension(file);
+ ToolStripMenuItem romMenuItem = new ToolStripMenuItem(romName);
+
+ // When clicked, pass the file path to our helper method
+ romMenuItem.Click += (sender, e) => LoadRomAndStart(file);
+
+ // Add it to the "Included" submenu (make sure the name matches your designer element!)
+ includedToolStripMenuItem.DropDownItems.Add(romMenuItem);
}
-
+ }
+ }
+
+ private void selectROMToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ using (OpenFileDialog ofd = new OpenFileDialog())
+ {
+ ofd.Title = "Select Master System ROM";
+ ofd.Filter = "SMS ROMs (*.sms)|*.sms|All Files (*.*)|*.*";
+
+ if (ofd.ShowDialog() == DialogResult.OK)
+ {
+ LoadRomAndStart(ofd.FileName);
+ _machine.Reset();
+ }
+ }
+ }
+
+ private void resetToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ _machine.Reset();
+ }
+
+ private void debuggerToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (_debugger == null || _debugger.IsDisposed)
+ {
+ _debugger = new DebuggerForm(_machine.Cpu, _machine.MemoryBus, this);
+ }
+ _debugger.Show();
+ }
+
+ private void includedToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ private void exitToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Environment.Exit(0);
}
}
}
diff --git a/Desktop/Form1.resx b/Desktop/Form1.resx
index 8b2ff64..b48baf1 100644
--- a/Desktop/Form1.resx
+++ b/Desktop/Form1.resx
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file
diff --git a/Desktop/ROMS/R-Type.sms b/Desktop/ROMS/R-Type.sms
new file mode 100644
index 0000000..a3dca4f
Binary files /dev/null and b/Desktop/ROMS/R-Type.sms differ
diff --git a/Desktop/ROMS/Sonic 2.sms b/Desktop/ROMS/Sonic 2.sms
new file mode 100644
index 0000000..be84f50
Binary files /dev/null and b/Desktop/ROMS/Sonic 2.sms differ
diff --git a/Desktop/ROMS/Sonic.sms b/Desktop/ROMS/Sonic.sms
new file mode 100644
index 0000000..db328b5
Binary files /dev/null and b/Desktop/ROMS/Sonic.sms differ