From 1d03bc560a0ebcccc0116b4a97bf9c4465cd6066 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 26 Jul 2021 18:59:11 -0400 Subject: [PATCH] Stores the colour palette, uses entry 0 as my new always output. --- Machines/Amiga/Chipset.cpp | 17 +++++++++++------ Machines/Amiga/Chipset.hpp | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Machines/Amiga/Chipset.cpp b/Machines/Amiga/Chipset.cpp index 77288b441..6d28a8bcd 100644 --- a/Machines/Amiga/Chipset.cpp +++ b/Machines/Amiga/Chipset.cpp @@ -108,7 +108,7 @@ Chipset::Changes Chipset::run_for(HalfCycles length) { uint16_t *const pixels = reinterpret_cast(crt_.begin_data(2)); if(pixels) { - *pixels = 0xffff; + *pixels = palette_[0]; } crt_.output_data((final_x - start_x) * 4, 1); } @@ -162,7 +162,7 @@ void Chipset::update_interrupts() { void Chipset::perform(const CPU::MC68000::Microcycle &cycle) { using Microcycle = CPU::MC68000::Microcycle; -#define RW(address) (address & 0xffe) | ((cycle.operation & Microcycle::Read) << 12) +#define RW(address) address | ((cycle.operation & Microcycle::Read) << 12) #define Read(address) address | (Microcycle::Read << 12) #define Write(address) address @@ -175,7 +175,8 @@ void Chipset::perform(const CPU::MC68000::Microcycle &cycle) { } \ } - switch(RW(*cycle.address)) { + const uint32_t register_address = *cycle.address & 0xffe; + switch(RW(register_address)) { default: LOG("Unimplemented chipset " << (cycle.operation & Microcycle::Read ? "read" : "write") << " " << PADHEX(6) << *cycle.address); assert(false); @@ -410,9 +411,13 @@ void Chipset::perform(const CPU::MC68000::Microcycle &cycle) { case Write(0x1a0): case Write(0x1a2): case Write(0x1a4): case Write(0x1a6): case Write(0x1a8): case Write(0x1aa): case Write(0x1ac): case Write(0x1ae): case Write(0x1b0): case Write(0x1b2): case Write(0x1b4): case Write(0x1b6): - case Write(0x1b8): case Write(0x1ba): case Write(0x1bc): case Write(0x1be): - LOG("TODO: colour palette; " << PADHEX(4) << cycle.value16() << " to " << *cycle.address); - break; + case Write(0x1b8): case Write(0x1ba): case Write(0x1bc): case Write(0x1be): { + LOG("Colour palette; " << PADHEX(4) << cycle.value16() << " to " << *cycle.address); + + uint8_t *const entry = reinterpret_cast(&palette_[(register_address - 0x180) >> 1]); + entry[0] = cycle.value8_high(); + entry[1] = cycle.value8_low(); + } break; } #undef ApplySetClear diff --git a/Machines/Amiga/Chipset.hpp b/Machines/Amiga/Chipset.hpp index b765db876..7b5c19d8e 100644 --- a/Machines/Amiga/Chipset.hpp +++ b/Machines/Amiga/Chipset.hpp @@ -92,6 +92,7 @@ class Chipset { // MARK: - Pixel output. Outputs::CRT::CRT crt_; + uint16_t palette_[32]{}; }; }