From 3c90218c3d71d5d071572be68e96c7cbbfaef482 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 31 Jul 2017 19:15:43 -0400 Subject: [PATCH] With a very basic stab at something a bit like the memory map (sans paging), execution begins. --- Machines/AmstradCPC/AmstradCPC.cpp | 40 ++++++++++++++++++++++++++++++ Machines/AmstradCPC/AmstradCPC.hpp | 3 +++ 2 files changed, 43 insertions(+) diff --git a/Machines/AmstradCPC/AmstradCPC.cpp b/Machines/AmstradCPC/AmstradCPC.cpp index 35fdd52a7..bd3635564 100644 --- a/Machines/AmstradCPC/AmstradCPC.cpp +++ b/Machines/AmstradCPC/AmstradCPC.cpp @@ -20,6 +20,40 @@ HalfCycles Machine::perform_machine_cycle(const CPU::Z80::PartialMachineCycle &c clock_offset_ = (clock_offset_ + cycle.length) & HalfCycles(7); set_wait_line(clock_offset_ >= HalfCycles(2)); + // Stop now if no action is strictly required. + if(!cycle.is_terminal()) return HalfCycles(0); + + uint16_t address = cycle.address ? *cycle.address : 0x0000; + switch(cycle.operation) { + case CPU::Z80::PartialMachineCycle::ReadOpcode: + case CPU::Z80::PartialMachineCycle::Read: + switch(address >> 14) { + case 0: *cycle.value = os_[address & 16383]; break; + case 1: case 2: + *cycle.value = ram_[address]; + break; + case 3: *cycle.value = basic_[address & 16383]; break; + } + break; + + case CPU::Z80::PartialMachineCycle::Write: + ram_[address] = *cycle.value; + break; + + case CPU::Z80::PartialMachineCycle::Output: + printf("Output %02x -> %04x?\n", *cycle.value, address); + break; + case CPU::Z80::PartialMachineCycle::Input: + printf("Input %04x?\n", address); + break; + + case CPU::Z80::PartialMachineCycle::Interrupt: + *cycle.value = 0xff; + break; + + default: break; + } + return HalfCycles(0); } @@ -27,6 +61,12 @@ void Machine::flush() { } void Machine::set_rom(ROMType type, std::vector data) { + // Keep only the two ROMs that are currently of interest. + switch(type) { + case ROMType::OS464: os_ = data; break; + case ROMType::BASIC464: basic_ = data; break; + default: break; + } } void Machine::setup_output(float aspect_ratio) { diff --git a/Machines/AmstradCPC/AmstradCPC.hpp b/Machines/AmstradCPC/AmstradCPC.hpp index 239892d75..292ddd434 100644 --- a/Machines/AmstradCPC/AmstradCPC.hpp +++ b/Machines/AmstradCPC/AmstradCPC.hpp @@ -48,6 +48,9 @@ class Machine: private: std::shared_ptr crt_; HalfCycles clock_offset_; + + uint8_t ram_[65536]; + std::vector os_, basic_; }; }