From 3abcfd37625eefb764d11c9f43121d6385f25837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Gimenez?= Date: Thu, 15 Feb 2024 22:50:45 +0100 Subject: [PATCH] Changed RAM disk loading routine --- HeadlessEmulator/HeadlessEmulator.csproj | 39 ++++ HeadlessEmulator/MainResources.Designer.cs | 113 +++++++++++ HeadlessEmulator/MainResources.resx | 136 +++++++++++++ HeadlessEmulator/Program.cs | 187 ++++++++++++++++++ .../Properties/launchSettings.json | 8 + HeadlessEmulator/Resources/128k_0_rom.bin | Bin 0 -> 16384 bytes HeadlessEmulator/Resources/128k_1_rom.bin | Bin 0 -> 16384 bytes HeadlessEmulator/Resources/48k_rom.bin | Bin 0 -> 16384 bytes HeadlessEmulator/Resources/Plus2_0_rom.bin | Bin 0 -> 16384 bytes HeadlessEmulator/Resources/Plus2_1_rom.bin | Bin 0 -> 16384 bytes HeadlessEmulator/overflow_i8_add.bin | Bin 0 -> 1180 bytes .../Resources/ZXRamDisk/ZXRamDiskBuilder.cs | 35 +--- .../ZXTapeBuilder/ZXTapeBuilderBuilder.cs | 35 ++++ ZXBasicStudio.sln | 10 + 14 files changed, 530 insertions(+), 33 deletions(-) create mode 100644 HeadlessEmulator/HeadlessEmulator.csproj create mode 100644 HeadlessEmulator/MainResources.Designer.cs create mode 100644 HeadlessEmulator/MainResources.resx create mode 100644 HeadlessEmulator/Program.cs create mode 100644 HeadlessEmulator/Properties/launchSettings.json create mode 100644 HeadlessEmulator/Resources/128k_0_rom.bin create mode 100644 HeadlessEmulator/Resources/128k_1_rom.bin create mode 100644 HeadlessEmulator/Resources/48k_rom.bin create mode 100644 HeadlessEmulator/Resources/Plus2_0_rom.bin create mode 100644 HeadlessEmulator/Resources/Plus2_1_rom.bin create mode 100644 HeadlessEmulator/overflow_i8_add.bin diff --git a/HeadlessEmulator/HeadlessEmulator.csproj b/HeadlessEmulator/HeadlessEmulator.csproj new file mode 100644 index 0000000..7018ce3 --- /dev/null +++ b/HeadlessEmulator/HeadlessEmulator.csproj @@ -0,0 +1,39 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + + + + + + + True + True + MainResources.resx + + + + + + ResXFileCodeGenerator + MainResources.Designer.cs + + + + + + PreserveNewest + + + + diff --git a/HeadlessEmulator/MainResources.Designer.cs b/HeadlessEmulator/MainResources.Designer.cs new file mode 100644 index 0000000..0cd7d53 --- /dev/null +++ b/HeadlessEmulator/MainResources.Designer.cs @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +// +// Este código fue generado por una herramienta. +// Versión de runtime:4.0.30319.42000 +// +// Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +// se vuelve a generar el código. +// +//------------------------------------------------------------------------------ + +namespace HeadlessEmulator { + using System; + + + /// + /// Clase de recurso fuertemente tipado, para buscar cadenas traducidas, etc. + /// + // StronglyTypedResourceBuilder generó automáticamente esta clase + // a través de una herramienta como ResGen o Visual Studio. + // Para agregar o quitar un miembro, edite el archivo .ResX y, a continuación, vuelva a ejecutar ResGen + // con la opción /str o recompile su proyecto de VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class MainResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal MainResources() { + } + + /// + /// Devuelve la instancia de ResourceManager almacenada en caché utilizada por esta clase. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeadlessEmulator.MainResources", typeof(MainResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Reemplaza la propiedad CurrentUICulture del subproceso actual para todas las + /// búsquedas de recursos mediante esta clase de recurso fuertemente tipado. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Busca un recurso adaptado de tipo System.Byte[]. + /// + internal static byte[] _128k_0_rom { + get { + object obj = ResourceManager.GetObject("_128k_0_rom", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Busca un recurso adaptado de tipo System.Byte[]. + /// + internal static byte[] _128k_1_rom { + get { + object obj = ResourceManager.GetObject("_128k_1_rom", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Busca un recurso adaptado de tipo System.Byte[]. + /// + internal static byte[] _48k_rom { + get { + object obj = ResourceManager.GetObject("_48k_rom", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Busca un recurso adaptado de tipo System.Byte[]. + /// + internal static byte[] Plus2_0_rom { + get { + object obj = ResourceManager.GetObject("Plus2_0_rom", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Busca un recurso adaptado de tipo System.Byte[]. + /// + internal static byte[] Plus2_1_rom { + get { + object obj = ResourceManager.GetObject("Plus2_1_rom", resourceCulture); + return ((byte[])(obj)); + } + } + } +} diff --git a/HeadlessEmulator/MainResources.resx b/HeadlessEmulator/MainResources.resx new file mode 100644 index 0000000..c78e3ac --- /dev/null +++ b/HeadlessEmulator/MainResources.resx @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Resources\Plus2_0_rom.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Resources\Plus2_1_rom.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Resources\128k_0_rom.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Resources\128k_1_rom.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Resources\48k_rom.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/HeadlessEmulator/Program.cs b/HeadlessEmulator/Program.cs new file mode 100644 index 0000000..38c73ed --- /dev/null +++ b/HeadlessEmulator/Program.cs @@ -0,0 +1,187 @@ +using CommandLine; +using CoreSpectrum.Hardware; +using CoreSpectrum.SupportClasses; +using HeadlessEmulator; +using System.Text; + +const ushort reset128k = 0x2656; +const ushort resetPlus2 = 0x2675; + +int bpCounter = 0; + +Options? mainOptions = null; + +CommandLine.Parser.Default.ParseArguments(args) + .WithParsed(RunOptions); + +if (mainOptions == null) + return; + +SpectrumBase emulator; + +switch (mainOptions.Model) +{ + case SpectrumModel.M128k: + Load128k(); + break; + case SpectrumModel.MPlus2: + LoadPlus2(); + break; + default: + Load48k(); + break; +} + +emulator.BreakpointHit += Emulator_BreakpointHit; +emulator.ProgramReady += Emulator_ProgramReady; + +emulator.Start(true); +emulator.Pause(); +emulator.Turbo(true, false); + +ushort org = mainOptions.Org == null ? mainOptions.Address : mainOptions.Org.Value; + +Console.WriteLine($"Injecting binary image {mainOptions.Binary} at address {mainOptions.Address} org {org}"); + +byte[] image = File.ReadAllBytes(mainOptions.Binary); + +ProgramImage program = new ProgramImage { InitialBank = 0, Chunks = new ImageChunk[] { new ImageChunk { Address = mainOptions.Address, Bank = 0, Data = image } }, Org = org }; + +emulator.InjectProgram(program); +emulator.Start(); + +Console.WriteLine("Running emulator, press a key to abort..."); +Console.ReadKey(); + +Console.WriteLine("Terminating..."); + +emulator.Stop(); +emulator.Dispose(); +return; + +void Emulator_ProgramReady(object? sender, EventArgs e) +{ + emulator.Pause(); + + Console.WriteLine("Program ready, creating breakpoints..."); + /* + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST00h", Address = 0x00, Temporary = false }); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST08h", Address = 0x08, Temporary = false }); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST10h", Address = 0x10, Temporary = false }); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST18h", Address = 0x18, Temporary = false }); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST20h", Address = 0x20, Temporary = false }); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST28h", Address = 0x28, Temporary = false }); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST30h", Address = 0x30, Temporary = false }); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = "RST38h", Address = 0x38, Temporary = false });*/ + + foreach (var addr in mainOptions.Breakpoints) + { + Console.WriteLine($"Creating breakpoint at 0x{addr.ToString("X4")}..."); + emulator.AddBreakpoint(new CoreSpectrum.Debug.Breakpoint { Id = $"0x{addr.ToString("X4")}", Address = addr, Temporary = false }); + } + + Console.WriteLine("Running program..."); + emulator.Resume(); +} + +void Emulator_BreakpointHit(object? sender, BreakPointEventArgs e) +{ + Console.WriteLine($"Breakpoint hit: {e.Breakpoint.Id}."); + + Console.WriteLine("Dumping memory and registers..."); + + byte[] mem = emulator.Memory.GetContents(0, 65536); + File.WriteAllBytes($"{e.Breakpoint.Id}_{bpCounter++}.mem", mem); + + StringBuilder sb = new StringBuilder(); + + sb.AppendLine($"PC: 0x{((ushort)emulator.Z80.Registers.PC).ToString("X4")}"); + sb.AppendLine($"SP: 0x{((ushort)emulator.Z80.Registers.SP).ToString("X4")}"); + sb.AppendLine($"IX: 0x{((ushort)emulator.Z80.Registers.IX).ToString("X4")}"); + sb.AppendLine($"IY: 0x{((ushort)emulator.Z80.Registers.IY).ToString("X4")}"); + + sb.AppendLine($"AF: 0x{((ushort)emulator.Z80.Registers.AF).ToString("X4")}"); + sb.AppendLine($"BC: 0x{((ushort)emulator.Z80.Registers.BC).ToString("X4")}"); + sb.AppendLine($"DE: 0x{((ushort)emulator.Z80.Registers.DE).ToString("X4")}"); + sb.AppendLine($"HL: 0x{((ushort)emulator.Z80.Registers.HL).ToString("X4")}"); + + sb.AppendLine($"AF': 0x{((ushort)emulator.Z80.Registers.Alternate.AF).ToString("X4")}"); + sb.AppendLine($"BC': 0x{((ushort)emulator.Z80.Registers.Alternate.BC).ToString("X4")}"); + sb.AppendLine($"DE': 0x{((ushort)emulator.Z80.Registers.Alternate.DE).ToString("X4")}"); + sb.AppendLine($"HL': 0x{((ushort)emulator.Z80.Registers.Alternate.HL).ToString("X4")}"); + + File.WriteAllText($"{e.Breakpoint.Id}_{bpCounter++}.reg", sb.ToString()); + + Console.WriteLine("Resuming emulation..."); + + emulator.Resume(); +} + +void ProcessRST08() +{ + ushort value = emulator.Memory.GetUshort(0x5C5D); + Console.WriteLine($"CH_ADD: {value}"); + + ushort stack = (ushort)emulator.Z80.Registers.SP; + value = emulator.Memory.GetUshort(stack); + + byte errCode = emulator.Memory.GetByte(value); + Console.WriteLine($"ERR_NR: {errCode}"); + + value = emulator.Memory.GetUshort(0x5C3C); + Console.WriteLine($"ERR_SP: {value}"); +} + +void Load48k() +{ + Console.WriteLine("Creating 48k emulator..."); + byte[] rom0 = MainResources._48k_rom; + + var emu = new Spectrum48k(new[] { rom0 }); + emulator = emu; +} + +void LoadPlus2() +{ + Console.WriteLine("Creating +2 emulator..."); + byte[] rom0 = MainResources.Plus2_0_rom; + byte[] rom1 = MainResources.Plus2_1_rom; + + var emu = new Spectrum128k(new[] { rom0, rom1 }, resetPlus2); + emulator = emu; +} + +void Load128k() +{ + Console.WriteLine("Creating 128k emulator..."); + byte[] rom0 = MainResources._128k_0_rom; + byte[] rom1 = MainResources._128k_1_rom; + + var emu = new Spectrum128k(new[] { rom0, rom1 }, reset128k); + emulator = emu; +} + +void RunOptions(Options opts) +{ + mainOptions = opts; +} +public class Options +{ + [Option('b', "binary", Required = true, HelpText = "Binary file to load")] + public string Binary { get; set; } + [Option('a', "address", Required = true, HelpText = "Address of the binary")] + public ushort Address { get; set; } + [Option('o', "org", Required = false, Default = null, HelpText = "Startup address, if omited the binary address will be used")] + public ushort? Org { get; set; } + [Option('m', "model", Required = false, Default = SpectrumModel.M48k, HelpText = "Spectrum model. Possible options: M48k, M128k and MPlus2")] + public SpectrumModel Model { get; set; } + [Option('p', "breakpoints", Required = true, HelpText = "List of breakpoint addresses")] + public IEnumerable Breakpoints { get; set; } +} + +public enum SpectrumModel +{ + M48k, + M128k, + MPlus2 +} \ No newline at end of file diff --git a/HeadlessEmulator/Properties/launchSettings.json b/HeadlessEmulator/Properties/launchSettings.json new file mode 100644 index 0000000..f1cf089 --- /dev/null +++ b/HeadlessEmulator/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "HeadlessEmulator": { + "commandName": "Project", + "commandLineArgs": "-b overflow_i8_add.bin -a 32768 -m M128k -p 8 10" + } + } +} \ No newline at end of file diff --git a/HeadlessEmulator/Resources/128k_0_rom.bin b/HeadlessEmulator/Resources/128k_0_rom.bin new file mode 100644 index 0000000000000000000000000000000000000000..c4a04e86ac94d8eb3fa760e7241a77ef58a422e7 GIT binary patch literal 16384 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
ipD&GM&n~T#SW1#>(92sPt_@C${X0r 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 literal 0 HcmV?d00001 diff --git a/HeadlessEmulator/Resources/128k_1_rom.bin b/HeadlessEmulator/Resources/128k_1_rom.bin new file mode 100644 index 0000000000000000000000000000000000000000..64c3e73769cb459680f335a2db0abc557c243d8b GIT binary patch literal 16384 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 Qs19QP8;1_PQIz+80l1Bavj6}9 literal 0 HcmV?d00001 diff --git a/HeadlessEmulator/Resources/48k_rom.bin b/HeadlessEmulator/Resources/48k_rom.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d6895e0bbf3fa543f192a66a297192b3c969ac9 GIT binary patch literal 16384 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

5RYmg65FY9s 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 literal 0 HcmV?d00001 diff --git a/HeadlessEmulator/Resources/Plus2_0_rom.bin b/HeadlessEmulator/Resources/Plus2_0_rom.bin new file mode 100644 index 0000000000000000000000000000000000000000..feff23334d6ea7ad861fefa9f4588366711207fb GIT binary patch literal 16384 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 z z2t9q>MAHb{T(mE#90n^BoMw*HbUoc**Osl8KKA`{**T>Q2VJs#PP25F=3r4D&iAWyVH0C+oatrDJZ_ zM+q_WS1WEK>phAxl343V@}*vBwI_jZQo6y*b4sp{(Ho$cM0FN?`3D^eDgDNkRN5!@fz<{rX49oAU{yc8u&+R!QZ=Tlhi`<^lduMKbuA_6_$%37MtQu0nOaSg`Ewm3&_#|AWJ1$a17BKuCcd_n*6vk z*re%sKf=!A^j~&668p$e4zy5FVwQR+mU%`2BMsmpI8ZqHQkGSUsB83>}>&QvhNzA zY&!x;X^rpJu@$5*dDlcje`o+@!M;5p%<$IEzZsn*`xJ9>S;3raO1Ct5^@^F9we==2 zg8gFgIPMAn5xbTSbOhj#Kag@;!VVgW-3yyNvPtKU0yGZPxt-1f4rAwC2(LrNeiwe* ziMaz|N^n{mdS51tL7IUUj5&9<1u(CIHWgO0ncgxHGb`eUb_lZ-`xr>|eLeD=)?)WP@*xN=5mGJlEM6&xaR-fE`>!Ke|9BOWV zU0B>Fy?TB0CTz1*=RrZOVHqvmbG;oFPG^WF`*fHN#4L;-W&IqR5nJr6^5|taRAj^Z z3r);-a44!tD45S0L0Ys&wmm_OOcDZeU zFB|YZ9$eYBtNwAsXkUOYMjLCN2@Ia2e)(E`|WNLQ5Dd_3|+2&}6g~I`=6cr%n`+mNQE6pNg#vnJq zI$rD->%WgWxd9Y@KhKRp6%;*@O(Nh$t&JcToK0GFP~Q--wq-@qVM0Zwn9;Q@dJ71!}&`J73+NenqRdWKN;h8VLeCf z>Q{04U4tqxjksI-l^?a@u6~(jVYweqtBVVHS}W4uasA5Qi<164V3e|5{rN#=B;$Mt zob^!Nd4GP9(tEow0l(D?Vo}FnQ7aTu9?H|-0Kz~6xB^+M%F_gHb(upcC|%>A=$DnT z6*-*YU@vS z=r~MOP{H7^4tkoPN#P)ue$wQHd+{xg_zAgrE?GX8%$Y})Eh39=h9vy|^kM!l9-KiZ literal 0 HcmV?d00001 diff --git a/HeadlessEmulator/Resources/Plus2_1_rom.bin b/HeadlessEmulator/Resources/Plus2_1_rom.bin new file mode 100644 index 0000000000000000000000000000000000000000..2c206476a98704ed3e7892d5c4c13b3dc706a744 GIT binary patch literal 16384 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 CIfC~9 literal 0 HcmV?d00001 diff --git a/HeadlessEmulator/overflow_i8_add.bin b/HeadlessEmulator/overflow_i8_add.bin new file mode 100644 index 0000000000000000000000000000000000000000..211ec4a31577c29d42fda25d29d5e3d62bf1f192 GIT binary patch literal 1180 zcmY*YZ)jUp6n|;EG>y8XttL0sExCEIw2^KlA7%{tm{15fM{w$N^kTse)}bSxBsS@~ z``&#tQP{dw9pZ-}6AByJcBlzhH?6OAdkdFZp=v%93^NZjMr}vCj?(CPN!|3m$34Gu ze!qL~Irq=a<*`^VVp#RY@U*Ex-K^MJUC~g&(i-k>H*e|>&?FhX=7X&>NAv(q=b-A}O`Q=Yi zla`>JLh`wEI^Nyg?Wy!1qaK~7=y&{WTInAn$%$BU??;ysdZj-@U|g(7uS zQ29s6VlrlIyf9=mI~KG`HLG>mv`L9#+Ccwix75}};R7fU#ifVHdcCNg=m%G3%XgigvFC4c8Go;7o z+~a%LXAP8i^}ZtClu;w7ZB-g}RZsWYqda^M9w*u%<%iRi11W- z<)eq^jxaE<%pGGvm6WWu4nat?2b>#45zZtyN<=uXNBDVK(DCO?E7C%3(Uv<)?y6tQOtMN|C$I=Oc~B^onYTFyw{?VkJ}aJZM}FSUN)bEHbWPb zyWcs$f8Oyk%9HFM+rb>n!$j7@9%a{+3rg@L@sAO>75qUJ?hy3eh)mo@W6UaGx7soi zdQ}OYAyfJ1;acwv9aVH;aw0ooT#R|)&AplXrbm@}HM_Dh52?&LH*~27yyA`52d%cL ze87D<-0)t&xgH;eBnO_(tsYS;eYWA;>dRmUZTty!=#$~UDt*8LK5m+4z~oj()iu6P bU8(e0h1_*fo$s^*KYM(=cWt;y%c%bV2UH*@ literal 0 HcmV?d00001 diff --git a/ZXBStudio/IntegratedDocumentTypes/Resources/ZXRamDisk/ZXRamDiskBuilder.cs b/ZXBStudio/IntegratedDocumentTypes/Resources/ZXRamDisk/ZXRamDiskBuilder.cs index 1cf900b..23ecca6 100644 --- a/ZXBStudio/IntegratedDocumentTypes/Resources/ZXRamDisk/ZXRamDiskBuilder.cs +++ b/ZXBStudio/IntegratedDocumentTypes/Resources/ZXRamDisk/ZXRamDiskBuilder.cs @@ -120,39 +120,6 @@ OR C END ASM -'Call this function the first in your program in order to -'load the banks data -SUB LoadRamDisk() - - DIM buc AS UBYTE - - - FOR buc = 0 TO {banks_count} - - rdkTransferBank = banks(buc) - - ASM - LD A, (_rdkTransferBank) - RDK_PROC_PROLOGUE() - CALL RDK_SWITCH_BANK - EI - - END ASM - - LOAD """" CODE $C000 - - ASM - - DI - CALL RDK_SWITCH_BANK - RDK_PROC_EPILOGUE() - - END ASM - - NEXT buc - -END SUB - {basic_functions_template} "; @@ -495,6 +462,7 @@ private bool BuildDiskAndCode(string buildPath, ZXBuildType BuildType, TextWrite StringBuilder sb = new StringBuilder(); + /* sb.Append($"#define Load{diskName}()"); foreach (var bank in diskFile.Banks) @@ -504,6 +472,7 @@ private bool BuildDiskAndCode(string buildPath, ZXBuildType BuildType, TextWrite } sb.Append("\r\n"); + */ List usedBanks = new List(); diff --git a/ZXBStudio/IntegratedDocumentTypes/TapeDocuments/ZXTapeBuilder/ZXTapeBuilderBuilder.cs b/ZXBStudio/IntegratedDocumentTypes/TapeDocuments/ZXTapeBuilder/ZXTapeBuilderBuilder.cs index a419789..76bf1a9 100644 --- a/ZXBStudio/IntegratedDocumentTypes/TapeDocuments/ZXTapeBuilder/ZXTapeBuilderBuilder.cs +++ b/ZXBStudio/IntegratedDocumentTypes/TapeDocuments/ZXTapeBuilder/ZXTapeBuilderBuilder.cs @@ -102,12 +102,47 @@ public bool Build(string BuildPath, ZXBuildStage Stage, ZXBuildType BuildType, Z line.AddTokens(I.LOAD, "\"\"", I.CODE, CompiledProgram.Org); + if (buildFile.IncludeRAMDisk && buildFile.RAMDiskOrder == ZXRAMDiskOrder.Before) + { + foreach (var bank in CompiledProgram.Banks) + { + line.AddTokens(I.POKE, 23388, ",", 16 + (int)bank.Bank); + line.AddTokens(I.OUT, 32765, ",", 16 + (int)bank.Bank); + line.AddTokens(I.LOAD, "\"\"", I.CODE, 0xC000); + } + + line.AddTokens(I.POKE, 23388, ",", 16); + line.AddTokens(I.OUT, 32765, ",", 16); + } + if (buildFile.DataBlocks != null && buildFile.DataBlocks.Length > 0 && buildFile.DataBlocks.Any(b => b.BasicLoad)) { foreach(var block in buildFile.DataBlocks.Where(b => b.BasicLoad)) line.AddTokens(I.LOAD, "\"\"", I.CODE, block.BlockAddress); } + if (buildFile.IncludeRAMDisk && buildFile.RAMDiskOrder == ZXRAMDiskOrder.After) + { + foreach (var bank in CompiledProgram.Banks) + { + line.AddTokens(I.POKE, 23388, ",", 16 + (int)bank.Bank); + line.AddTokens(I.OUT, 32765, ",", 16 + (int)bank.Bank); + line.AddTokens(I.LOAD, "\"\"", I.CODE, 0xC000); + } + + line.AddTokens(I.POKE, 23388, ",", 16); + line.AddTokens(I.OUT, 32765, ",", 16); + } + + + + + + + + + + if (buildFile.HideHeaders) line.AddTokens(I.POKE, 23739, ",", 244); diff --git a/ZXBasicStudio.sln b/ZXBasicStudio.sln index 83bcb0b..4c8ad37 100644 --- a/ZXBasicStudio.sln +++ b/ZXBasicStudio.sln @@ -25,6 +25,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Elementos de la solución", README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeadlessEmulator", "HeadlessEmulator\HeadlessEmulator.csproj", "{D99C36AE-072A-4885-9585-CFD78FC6763E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -97,6 +99,14 @@ Global {2493E207-2E56-48AB-8064-0E7A805F7A62}.Release|Any CPU.Build.0 = Release|Any CPU {2493E207-2E56-48AB-8064-0E7A805F7A62}.Release|x64.ActiveCfg = Release|Any CPU {2493E207-2E56-48AB-8064-0E7A805F7A62}.Release|x64.Build.0 = Release|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Debug|x64.ActiveCfg = Debug|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Debug|x64.Build.0 = Debug|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Release|Any CPU.Build.0 = Release|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Release|x64.ActiveCfg = Release|Any CPU + {D99C36AE-072A-4885-9585-CFD78FC6763E}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE