diff --git a/Desktop/Desktop.csproj b/Desktop/Desktop.csproj index 0228bb0..08e6b8a 100644 --- a/Desktop/Desktop.csproj +++ b/Desktop/Desktop.csproj @@ -18,6 +18,7 @@ + @@ -54,6 +55,9 @@ Always + + Always + Always diff --git a/Desktop/Form1.Designer.cs b/Desktop/Form1.Designer.cs index 610e1ef..9890ecd 100644 --- a/Desktop/Form1.Designer.cs +++ b/Desktop/Form1.Designer.cs @@ -33,7 +33,7 @@ openToolStripMenuItem = new ToolStripMenuItem(); includedToolStripMenuItem = new ToolStripMenuItem(); tAPToolStripMenuItem1 = new ToolStripMenuItem(); - sNAToolStripMenuItem1 = new ToolStripMenuItem(); + SNAPToolStripMenuItem1 = new ToolStripMenuItem(); tAPToolStripMenuItem = new ToolStripMenuItem(); sNAToolStripMenuItem = new ToolStripMenuItem(); saveSnapshotToolStripMenuItem = new ToolStripMenuItem(); @@ -51,6 +51,7 @@ HighSpeedToolStripMenuItem = new ToolStripMenuItem(); fastLoadToolStripMenuItem = new ToolStripMenuItem(); playTapeToolStripMenuItem = new ToolStripMenuItem(); + TZXToolStripMenuItem1 = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); SuspendLayout(); // @@ -60,7 +61,8 @@ menuStrip1.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem, machineToolStripMenuItem, viewToolStripMenuItem, optionsToolStripMenuItem, playTapeToolStripMenuItem }); menuStrip1.Location = new Point(0, 0); menuStrip1.Name = "menuStrip1"; - menuStrip1.Size = new Size(922, 33); + menuStrip1.Padding = new Padding(5, 2, 0, 2); + menuStrip1.Size = new Size(738, 28); menuStrip1.TabIndex = 1; menuStrip1.Text = "menuStrip1"; // @@ -68,60 +70,60 @@ // fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { openToolStripMenuItem, saveSnapshotToolStripMenuItem, 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, tAPToolStripMenuItem, sNAToolStripMenuItem }); openToolStripMenuItem.Name = "openToolStripMenuItem"; - openToolStripMenuItem.Size = new Size(231, 34); + openToolStripMenuItem.Size = new Size(224, 26); openToolStripMenuItem.Text = "Open"; // // includedToolStripMenuItem // - includedToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { tAPToolStripMenuItem1, sNAToolStripMenuItem1 }); + includedToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { tAPToolStripMenuItem1, SNAPToolStripMenuItem1, TZXToolStripMenuItem1 }); includedToolStripMenuItem.Name = "includedToolStripMenuItem"; - includedToolStripMenuItem.Size = new Size(182, 34); + includedToolStripMenuItem.Size = new Size(224, 26); includedToolStripMenuItem.Text = "Included"; // // tAPToolStripMenuItem1 // tAPToolStripMenuItem1.Name = "tAPToolStripMenuItem1"; - tAPToolStripMenuItem1.Size = new Size(149, 34); + tAPToolStripMenuItem1.Size = new Size(224, 26); tAPToolStripMenuItem1.Text = "TAP"; // - // sNAToolStripMenuItem1 + // SNAPToolStripMenuItem1 // - sNAToolStripMenuItem1.Name = "sNAToolStripMenuItem1"; - sNAToolStripMenuItem1.Size = new Size(149, 34); - sNAToolStripMenuItem1.Text = "SNA"; + SNAPToolStripMenuItem1.Name = "SNAPToolStripMenuItem1"; + SNAPToolStripMenuItem1.Size = new Size(224, 26); + SNAPToolStripMenuItem1.Text = "SNA"; // // tAPToolStripMenuItem // tAPToolStripMenuItem.Name = "tAPToolStripMenuItem"; - tAPToolStripMenuItem.Size = new Size(182, 34); + tAPToolStripMenuItem.Size = new Size(224, 26); tAPToolStripMenuItem.Text = "TAP"; tAPToolStripMenuItem.Click += loadTAPToolStripMenuItem_Click; // // sNAToolStripMenuItem // sNAToolStripMenuItem.Name = "sNAToolStripMenuItem"; - sNAToolStripMenuItem.Size = new Size(182, 34); + sNAToolStripMenuItem.Size = new Size(224, 26); sNAToolStripMenuItem.Text = "SNA"; sNAToolStripMenuItem.Click += openSNAToolStripMenuItem_Click; // // saveSnapshotToolStripMenuItem // saveSnapshotToolStripMenuItem.Name = "saveSnapshotToolStripMenuItem"; - saveSnapshotToolStripMenuItem.Size = new Size(231, 34); + saveSnapshotToolStripMenuItem.Size = new Size(224, 26); saveSnapshotToolStripMenuItem.Text = "Save Snapshot"; saveSnapshotToolStripMenuItem.Click += SaveSNAMenuItem_Click; // // exitToolStripMenuItem // exitToolStripMenuItem.Name = "exitToolStripMenuItem"; - exitToolStripMenuItem.Size = new Size(231, 34); + exitToolStripMenuItem.Size = new Size(224, 26); exitToolStripMenuItem.Text = "Exit"; exitToolStripMenuItem.Click += btnExit_Click; // @@ -129,7 +131,7 @@ // machineToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { spectrum48KToolStripMenuItem, spectrum128KPlus2AToolStripMenuItem, runToolStripMenuItem, resetToolStripMenuItem, stepToolStripMenuItem, resetToolStripMenuItem1 }); machineToolStripMenuItem.Name = "machineToolStripMenuItem"; - machineToolStripMenuItem.Size = new Size(94, 29); + machineToolStripMenuItem.Size = new Size(79, 24); machineToolStripMenuItem.Text = "Machine"; // // spectrum48KToolStripMenuItem @@ -137,42 +139,42 @@ spectrum48KToolStripMenuItem.Checked = true; spectrum48KToolStripMenuItem.CheckState = CheckState.Checked; spectrum48KToolStripMenuItem.Name = "spectrum48KToolStripMenuItem"; - spectrum48KToolStripMenuItem.Size = new Size(270, 34); + spectrum48KToolStripMenuItem.Size = new Size(157, 26); spectrum48KToolStripMenuItem.Text = "48K"; spectrum48KToolStripMenuItem.Click += spectrum48KToolStripMenuItem_Click; // // spectrum128KPlus2AToolStripMenuItem // spectrum128KPlus2AToolStripMenuItem.Name = "spectrum128KPlus2AToolStripMenuItem"; - spectrum128KPlus2AToolStripMenuItem.Size = new Size(270, 34); + spectrum128KPlus2AToolStripMenuItem.Size = new Size(157, 26); spectrum128KPlus2AToolStripMenuItem.Text = "128K +2A"; spectrum128KPlus2AToolStripMenuItem.Click += spectrum128KPlus2AToolStripMenuItem_Click; // // runToolStripMenuItem // runToolStripMenuItem.Name = "runToolStripMenuItem"; - runToolStripMenuItem.Size = new Size(270, 34); + runToolStripMenuItem.Size = new Size(157, 26); runToolStripMenuItem.Text = "Run"; runToolStripMenuItem.Click += btnRun_Click; // // resetToolStripMenuItem // resetToolStripMenuItem.Name = "resetToolStripMenuItem"; - resetToolStripMenuItem.Size = new Size(270, 34); + resetToolStripMenuItem.Size = new Size(157, 26); resetToolStripMenuItem.Text = "Pause"; resetToolStripMenuItem.Click += btnPause_Click; // // stepToolStripMenuItem // stepToolStripMenuItem.Name = "stepToolStripMenuItem"; - stepToolStripMenuItem.Size = new Size(270, 34); + stepToolStripMenuItem.Size = new Size(157, 26); stepToolStripMenuItem.Text = "Step"; stepToolStripMenuItem.Click += btnStep_Click; // // resetToolStripMenuItem1 // resetToolStripMenuItem1.Name = "resetToolStripMenuItem1"; - resetToolStripMenuItem1.Size = new Size(270, 34); + resetToolStripMenuItem1.Size = new Size(157, 26); resetToolStripMenuItem1.Text = "Reset"; resetToolStripMenuItem1.Click += btnReset_Click; // @@ -180,13 +182,13 @@ // viewToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { debuggerToolStripMenuItem }); 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(270, 34); + debuggerToolStripMenuItem.Size = new Size(224, 26); debuggerToolStripMenuItem.Text = "Debugger"; debuggerToolStripMenuItem.Click += openDebuggerToolStripMenuItem_Click; // @@ -194,13 +196,13 @@ // optionsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { HighSpeedToolStripMenuItem, fastLoadToolStripMenuItem }); optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; - optionsToolStripMenuItem.Size = new Size(92, 29); + optionsToolStripMenuItem.Size = new Size(75, 24); optionsToolStripMenuItem.Text = "Options"; // // HighSpeedToolStripMenuItem // HighSpeedToolStripMenuItem.Name = "HighSpeedToolStripMenuItem"; - HighSpeedToolStripMenuItem.Size = new Size(214, 34); + HighSpeedToolStripMenuItem.Size = new Size(175, 26); HighSpeedToolStripMenuItem.Text = "High Speed"; HighSpeedToolStripMenuItem.Click += btnHighSpeedToggle_Click; // @@ -209,26 +211,31 @@ fastLoadToolStripMenuItem.Checked = true; fastLoadToolStripMenuItem.CheckState = CheckState.Checked; fastLoadToolStripMenuItem.Name = "fastLoadToolStripMenuItem"; - fastLoadToolStripMenuItem.Size = new Size(214, 34); + fastLoadToolStripMenuItem.Size = new Size(175, 26); fastLoadToolStripMenuItem.Text = "Fast Loading"; fastLoadToolStripMenuItem.Click += fastLoadToolStripMenuItem_Click; // // playTapeToolStripMenuItem // playTapeToolStripMenuItem.Name = "playTapeToolStripMenuItem"; - playTapeToolStripMenuItem.Size = new Size(101, 29); + playTapeToolStripMenuItem.Size = new Size(85, 24); playTapeToolStripMenuItem.Text = "Play Tape"; playTapeToolStripMenuItem.Click += playTapeToolStripMenuItem_Click; // + // TZXToolStripMenuItem1 + // + TZXToolStripMenuItem1.Name = "TZXToolStripMenuItem1"; + TZXToolStripMenuItem1.Size = new Size(224, 26); + TZXToolStripMenuItem1.Text = "TZX"; + // // Form1 // - AutoScaleDimensions = new SizeF(10F, 25F); + AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(922, 760); + ClientSize = new Size(738, 608); Controls.Add(menuStrip1); KeyPreview = true; MainMenuStrip = menuStrip1; - Margin = new Padding(4); Name = "Form1"; Text = "Parsons Sinclair ZX Spectrum 48K - 2026"; menuStrip1.ResumeLayout(false); @@ -255,11 +262,12 @@ private ToolStripMenuItem HighSpeedToolStripMenuItem; private ToolStripMenuItem includedToolStripMenuItem; private ToolStripMenuItem tAPToolStripMenuItem1; - private ToolStripMenuItem sNAToolStripMenuItem1; + private ToolStripMenuItem SNAPToolStripMenuItem1; private ToolStripMenuItem saveSnapshotToolStripMenuItem; private ToolStripMenuItem playTapeToolStripMenuItem; private ToolStripMenuItem fastLoadToolStripMenuItem; private ToolStripMenuItem spectrum48KToolStripMenuItem; private ToolStripMenuItem spectrum128KPlus2AToolStripMenuItem; + private ToolStripMenuItem TZXToolStripMenuItem1; } } diff --git a/Desktop/Form1.cs b/Desktop/Form1.cs index 88e2b16..c5be012 100644 --- a/Desktop/Form1.cs +++ b/Desktop/Form1.cs @@ -344,6 +344,22 @@ namespace Desktop item.Click += IncludedTapMenuItem_Click; tAPToolStripMenuItem1.DropDownItems.Add(item); } + if (resourceName.Contains("Desktop.ROMS.Snapshot.") && resourceName.EndsWith(".sna", StringComparison.OrdinalIgnoreCase)) + { + string[] parts = resourceName.Split('.'); + string displayName = parts[parts.Length - 2]; + ToolStripMenuItem item = new ToolStripMenuItem(displayName) { Tag = resourceName }; + item.Click += IncludedTapMenuItem_Click; + SNAPToolStripMenuItem1.DropDownItems.Add(item); + } + if (resourceName.Contains("Desktop.ROMS.TZX.") && resourceName.EndsWith(".tzx", StringComparison.OrdinalIgnoreCase)) + { + string[] parts = resourceName.Split('.'); + string displayName = parts[parts.Length - 2]; + ToolStripMenuItem item = new ToolStripMenuItem(displayName) { Tag = resourceName }; + item.Click += IncludedTapMenuItem_Click; + TZXToolStripMenuItem1.DropDownItems.Add(item); + } } } @@ -355,19 +371,33 @@ namespace Desktop try { Assembly assembly = Assembly.GetExecutingAssembly(); + + // Open the embedded resource stream once using (Stream? stream = assembly.GetManifestResourceStream(resourceName)) { - if (stream == null) throw new Exception("Could not find embedded resource."); + if (stream == null) throw new Exception($"Could not find embedded resource: {resourceName}"); + + // Copy the stream into a memory stream to extract the raw byte array using (MemoryStream ms = new MemoryStream()) { stream.CopyTo(ms); - _machine.TapeDeck.LoadTapData(ms.ToArray()); + byte[] fileBytes = ms.ToArray(); + + // Route the byte array to the correct emulator component + if (resourceName.EndsWith(".tap", StringComparison.OrdinalIgnoreCase)) + { + _machine.TapeDeck.LoadTapData(fileBytes); + } + else if (resourceName.EndsWith(".sna", StringComparison.OrdinalIgnoreCase)) + { + _machine.LoadSnapshot(fileBytes); + } } } } catch (Exception ex) { - MessageBox.Show($"Failed to load built-in TAP:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Failed to load built-in resource:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { diff --git a/Desktop/ROMS/Snapshot/tristam.sna b/Desktop/ROMS/Snapshot/tristam.sna new file mode 100644 index 0000000..03e363c Binary files /dev/null and b/Desktop/ROMS/Snapshot/tristam.sna differ diff --git a/Desktop/ROMS/TZX/Split Personalities1.tzx b/Desktop/ROMS/TZX/Split Personalities1.tzx new file mode 100644 index 0000000..89ca452 Binary files /dev/null and b/Desktop/ROMS/TZX/Split Personalities1.tzx differ diff --git a/Desktop/ROMS/TZX/Split Personalities2.tzx b/Desktop/ROMS/TZX/Split Personalities2.tzx new file mode 100644 index 0000000..f4a0286 Binary files /dev/null and b/Desktop/ROMS/TZX/Split Personalities2.tzx differ