diff --git a/include/drivers/vera.h b/include/drivers/vera.h index 7d61753..5c0e1d1 100644 --- a/include/drivers/vera.h +++ b/include/drivers/vera.h @@ -29,6 +29,23 @@ typedef enum { ADDR_INCREMENT_640 = 15 } VeraAddressIncrement; +typedef union vera_palette_entry_s { + struct { + uint8_t blue: 4; + uint8_t green: 4; + uint8_t red: 4; + uint8_t padding: 4; + }; + uint8_t byte_value[2]; +} VeraPaletteEntry; + +typedef struct vera_palette_s { + union { + VeraPaletteEntry color[256]; + VeraPaletteEntry colour[256]; + }; +} VeraPalette; + extern void vera_init(void); extern void vera_set_data0_address(uint32_t addr); @@ -66,3 +83,11 @@ void vera_read(void *dest, uint32_t src, size_t length); void vera_write(uint32_t dest, void *src, size_t length); void vera_memset(uint32_t addr, uint8_t value, size_t length); + +VeraPaletteEntry vera_get_palette_entry(uint8_t index); + +void vera_set_palette_entry(uint8_t index, VeraPaletteEntry value); + +void vera_palette_read(VeraPalette *dest); + +void vera_palette_write(VeraPalette *src); diff --git a/src/drivers/vera2.c b/src/drivers/vera2.c index cbdd8bf..99a9fe5 100644 --- a/src/drivers/vera2.c +++ b/src/drivers/vera2.c @@ -77,3 +77,35 @@ vera_memset(uint32_t addr, uint8_t value, size_t length) vera_poke_data0(value); } } + +VeraPaletteEntry +vera_get_palette_entry(uint8_t index) +{ + uint32_t address = 0x0001FA00 + (index * 2); + vera_set_addr0_incr1(address); + VeraPaletteEntry result; + result.byte_value[0] = vera_peek_data0(); + result.byte_value[1] = vera_peek_data0(); + return result; +} + +void +vera_set_palette_entry(uint8_t index, VeraPaletteEntry value) +{ + uint32_t address = 0x0001FA00 + (index * 2); + vera_set_addr0_incr1(address); + vera_poke_data0(value.byte_value[0]); + vera_poke_data0(value.byte_value[1]); +} + +void +vera_palette_read(VeraPalette *dest) +{ + vera_read(dest, 0x0001FA00, sizeof(VeraPalette)); +} + +void +vera_palette_write(VeraPalette *src) +{ + vera_write(0x0001FA00, src, sizeof(VeraPalette)); +}