From 4d5d5041dff44a90a39a9f4f151708ee0606eebf Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 1 Aug 2017 22:18:42 -0400 Subject: [PATCH] Attempted to ensure a clean startup. --- Machines/AmstradCPC/AmstradCPC.cpp | 69 ++++++++++++++++-------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/Machines/AmstradCPC/AmstradCPC.cpp b/Machines/AmstradCPC/AmstradCPC.cpp index cc58ead3c..3ec61b7f1 100644 --- a/Machines/AmstradCPC/AmstradCPC.cpp +++ b/Machines/AmstradCPC/AmstradCPC.cpp @@ -73,7 +73,11 @@ class CRTCBusHandler { was_hsync_(false), ram_(ram), interrupt_timer_(interrupt_timer), - pixel_divider_(1) {} + pixel_divider_(1), + mode_(2), + next_mode_(2) { + build_mode_tables(); + } inline void perform_bus_cycle(const Motorola::CRTC::BusState &state) { bool is_sync = state.hsync || state.vsync; @@ -214,41 +218,44 @@ class CRTCBusHandler { // TODO: should flush any border currently in progress } else { palette_[pen_] = mapped_palette_value(colour); - // TODO: no need for a full regeneration, of every mode, every time - for(int c = 0; c < 256; c++) { - // prepare mode 0 - uint8_t *mode0_pixels = (uint8_t *)&mode0_output_[c]; - mode0_pixels[0] = palette_[((c & 0x80) >> 7) | ((c & 0x20) >> 3) | ((c & 0x08) >> 2) | ((c & 0x02) << 2)]; - mode0_pixels[1] = palette_[((c & 0x40) >> 6) | ((c & 0x10) >> 2) | ((c & 0x04) >> 1) | ((c & 0x01) << 3)]; - - // prepare mode 1 - uint8_t *mode1_pixels = (uint8_t *)&mode1_output_[c]; - mode1_pixels[0] = palette_[((c & 0x80) >> 7) | ((c & 0x08) >> 2)]; - mode1_pixels[1] = palette_[((c & 0x40) >> 6) | ((c & 0x04) >> 1)]; - mode1_pixels[2] = palette_[((c & 0x20) >> 5) | ((c & 0x02) >> 0)]; - mode1_pixels[3] = palette_[((c & 0x10) >> 4) | ((c & 0x01) << 1)]; - - // prepare mode 2 - uint8_t *mode2_pixels = (uint8_t *)&mode2_output_[c]; - mode2_pixels[0] = palette_[((c & 0x80) >> 7)]; - mode2_pixels[1] = palette_[((c & 0x40) >> 6)]; - mode2_pixels[2] = palette_[((c & 0x20) >> 5)]; - mode2_pixels[3] = palette_[((c & 0x10) >> 4)]; - mode2_pixels[4] = palette_[((c & 0x08) >> 3)]; - mode2_pixels[5] = palette_[((c & 0x04) >> 2)]; - mode2_pixels[6] = palette_[((c & 0x03) >> 1)]; - mode2_pixels[7] = palette_[((c & 0x01) >> 0)]; - - // prepare mode 3 - uint8_t *mode3_pixels = (uint8_t *)&mode3_output_[c]; - mode3_pixels[0] = palette_[((c & 0x80) >> 7) | ((c & 0x08) >> 2)]; - mode3_pixels[1] = palette_[((c & 0x40) >> 6) | ((c & 0x04) >> 1)]; - } + build_mode_tables(); } } private: + void build_mode_tables() { + for(int c = 0; c < 256; c++) { + // prepare mode 0 + uint8_t *mode0_pixels = (uint8_t *)&mode0_output_[c]; + mode0_pixels[0] = palette_[((c & 0x80) >> 7) | ((c & 0x20) >> 3) | ((c & 0x08) >> 2) | ((c & 0x02) << 2)]; + mode0_pixels[1] = palette_[((c & 0x40) >> 6) | ((c & 0x10) >> 2) | ((c & 0x04) >> 1) | ((c & 0x01) << 3)]; + + // prepare mode 1 + uint8_t *mode1_pixels = (uint8_t *)&mode1_output_[c]; + mode1_pixels[0] = palette_[((c & 0x80) >> 7) | ((c & 0x08) >> 2)]; + mode1_pixels[1] = palette_[((c & 0x40) >> 6) | ((c & 0x04) >> 1)]; + mode1_pixels[2] = palette_[((c & 0x20) >> 5) | ((c & 0x02) >> 0)]; + mode1_pixels[3] = palette_[((c & 0x10) >> 4) | ((c & 0x01) << 1)]; + + // prepare mode 2 + uint8_t *mode2_pixels = (uint8_t *)&mode2_output_[c]; + mode2_pixels[0] = palette_[((c & 0x80) >> 7)]; + mode2_pixels[1] = palette_[((c & 0x40) >> 6)]; + mode2_pixels[2] = palette_[((c & 0x20) >> 5)]; + mode2_pixels[3] = palette_[((c & 0x10) >> 4)]; + mode2_pixels[4] = palette_[((c & 0x08) >> 3)]; + mode2_pixels[5] = palette_[((c & 0x04) >> 2)]; + mode2_pixels[6] = palette_[((c & 0x03) >> 1)]; + mode2_pixels[7] = palette_[((c & 0x01) >> 0)]; + + // prepare mode 3 + uint8_t *mode3_pixels = (uint8_t *)&mode3_output_[c]; + mode3_pixels[0] = palette_[((c & 0x80) >> 7) | ((c & 0x08) >> 2)]; + mode3_pixels[1] = palette_[((c & 0x40) >> 6) | ((c & 0x04) >> 1)]; + } + } + uint8_t mapped_palette_value(uint8_t colour) { #define COL(r, g, b) (r << 4) | (g << 2) | b static const uint8_t mapping[32] = {