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