From 946959499026a1cb5ce452bb645760ac21318719 Mon Sep 17 00:00:00 2001 From: David Kuder Date: Tue, 2 May 2023 19:28:08 -0400 Subject: [PATCH] Live palette editing --- vga/businterface.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/vga/businterface.c b/vga/businterface.c index 6368e33..e27c6ae 100644 --- a/vga/businterface.c +++ b/vga/businterface.c @@ -4,6 +4,18 @@ #include "common/abus.h" #include "vga/businterface.h" #include "vga/vgabuf.h" +#include "vga/render.h" + +uint8_t lores_to_dhgr[16] = { + 0x0, 0x8, + 0x1, 0x9, + 0x2, 0xA, + 0x3, 0xB, + 0x4, 0xC, + 0x5, 0xD, + 0x6, 0xE, + 0x7, 0xF +}; volatile uint8_t *terminal_page = terminal_memory; @@ -240,6 +252,8 @@ void __time_critical_func(vga_businterface)(uint32_t address, uint32_t value) { // Card Registers if(ACCESS_WRITE) { if(CARD_SELECT && CARD_DEVSEL) { + uint8_t color_index; + cardslot = (address >> 4) & 0x7; switch(address & 0x0F) { case 0x01: @@ -280,6 +294,51 @@ void __time_critical_func(vga_businterface)(uint32_t address, uint32_t value) { romx_changed = 1; } break; + case 0x0C: + apple_memory[address] = value; + break; + case 0x0D: + color_index = (apple_memory[address-1] >> 4) & 0xF; +#ifdef ANALOG_GS + switch(apple_memory[address-1] & 3) { + case 1: + lores_palette[color_index] = + (lores_palette[color_index] & 0x00FF) | + (((uint16_t)(value & 0xF)) << 8); + break; + case 2: + lores_palette[color_index] = + (lores_palette[color_index] & 0x0F0F) | + (((uint16_t)(value & 0xF)) << 4); + break; + case 3: + lores_palette[color_index] = + (lores_palette[color_index] & 0x0FF0) | + (((uint16_t)(value & 0xF)) << 0); + break; + } +#else + switch(apple_memory[address-1] & 3) { + case 1: + lores_palette[color_index] = + (lores_palette[color_index] & 0x003F) | + (((uint16_t)(value & 0x7)) << 6); + break; + case 2: + lores_palette[color_index] = + (lores_palette[color_index] & 0x01C7) | + (((uint16_t)(value & 0x7)) << 3); + break; + case 3: + lores_palette[color_index] = + (lores_palette[color_index] & 0x01F8) | + (((uint16_t)(value & 0x7)) << 0); + break; + } +#endif + dhgr_palette[lores_to_dhgr[color_index]] = lores_palette[color_index]; + apple_memory[address] = value; + break; } } } else if(CARD_SELECT && CARD_DEVSEL) {