From a5098a60ec950e1379859959b3931525eef1a211 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 25 Apr 2021 13:18:26 -0400 Subject: [PATCH] Attempts to get in-SNA software to start. --- Machines/Sinclair/ZXSpectrum/State.hpp | 2 ++ Machines/Sinclair/ZXSpectrum/ZXSpectrum.cpp | 1 + Storage/State/SNA.cpp | 12 +++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Machines/Sinclair/ZXSpectrum/State.hpp b/Machines/Sinclair/ZXSpectrum/State.hpp index dc6a9bff2..60b6db78f 100644 --- a/Machines/Sinclair/ZXSpectrum/State.hpp +++ b/Machines/Sinclair/ZXSpectrum/State.hpp @@ -18,10 +18,12 @@ namespace ZXSpectrum { struct State: public Reflection::StructImpl { CPU::Z80::State z80; + std::vector ram; State() { if(needs_declare()) { DeclareField(z80); + DeclareField(ram); } } }; diff --git a/Machines/Sinclair/ZXSpectrum/ZXSpectrum.cpp b/Machines/Sinclair/ZXSpectrum/ZXSpectrum.cpp index 23996270e..469e74fd8 100644 --- a/Machines/Sinclair/ZXSpectrum/ZXSpectrum.cpp +++ b/Machines/Sinclair/ZXSpectrum/ZXSpectrum.cpp @@ -127,6 +127,7 @@ template class ConcreteMachine: if(target.state) { const auto state = static_cast(target.state.get()); state->z80.apply(z80_); + memcpy(ram_.data(), state->ram.data(), std::min(ram_.size(), state->ram.size())); LOG("TODO: apply rest of state"); } diff --git a/Storage/State/SNA.cpp b/Storage/State/SNA.cpp index dc2ad8e2b..0f5c6a978 100644 --- a/Storage/State/SNA.cpp +++ b/Storage/State/SNA.cpp @@ -63,9 +63,19 @@ std::unique_ptr SNA::load(const std::string &file_name state->z80.registers.stack_pointer = file.get16le(); state->z80.registers.interrupt_mode = file.get8(); - // TODO: border colour, RAM contents, then pop the program counter. // 1A border colour + const uint8_t border_colour = file.get8(); + (void)border_colour; // TODO. + // 1B– 48kb RAM contents + state->ram = file.read(48*1024); + + // Establish program counter. + state->z80.registers.program_counter = state->ram[state->z80.registers.stack_pointer]; + state->ram[state->z80.registers.stack_pointer] = 0; + state->z80.registers.program_counter |= state->ram[state->z80.registers.stack_pointer+1] << 8; + state->ram[state->z80.registers.stack_pointer+1] = 0; + state->z80.registers.stack_pointer += 2; return result; }