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