From ed7c89a3f405e203c26555e9749b392bd617e688 Mon Sep 17 00:00:00 2001 From: Kyle Cardoza Date: Fri, 29 Mar 2024 02:04:21 -0400 Subject: [PATCH] Implementation of VERA sprite functions --- src/drivers/vera_sprites.c | 54 ++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/src/drivers/vera_sprites.c b/src/drivers/vera_sprites.c index d6f6b5e..e2a594a 100644 --- a/src/drivers/vera_sprites.c +++ b/src/drivers/vera_sprites.c @@ -12,35 +12,73 @@ #include "drivers/vera.h" #include "drivers/vera_sprites.h" +static inline uint32_t +vera_get_sprite_offset(uint8_t index) +{ + return 0x0001FC00 + (index * 8); +} void vera_sprite_set_bitmap_address(uint8_t index, uint32_t address) { - (void) index; - (void) address; + uint32_t sprite_address = vera_get_sprite_offset(index); + address = address >> 5; + + vera_set_addr0_incr1(sprite_address); + vera_poke_data0((uint8_t)(address & 0x000000FF)); + vera_poke_data0((uint8_t)(address & 0x0000FF00) >> 8); } uint32_t vera_sprite_get_bitmap_address(uint8_t index) { - (void) index; - return 0; + uint32_t sprite_address = vera_get_sprite_offset(index); + vera_set_addr0_incr1(sprite_address); + + uint32_t result = 0; + result = (uint32_t)(vera_peek_data0()); + result |= ((uint32_t)(vera_peek_data0()) << 8); + result |= (((uint32_t)(vera_peek_data0() & 0b00000001) << 16)); + + return result; } void vera_sprite_set_bit_depth(uint8_t index, VeraBitDepth depth) { - (void) index; - (void) depth; + uint32_t sprite_address = vera_get_sprite_offset(index); + vera_set_data0_address(sprite_address + 1); + vera_set_addr0_auto_increment(ADDR_INCREMENT_0); + vera_set_addr0_decrement(false); + uint8_t value = vera_peek_data0(); + switch (depth) { + case VERA_DEPTH_4BPP: + vera_poke_data0(value & 0b01111111); + break; + case VERA_DEPTH_8BPP: + vera_poke_data0(value | 0b10000000); + break; + default: + break; + } } VeraBitDepth vera_sprite_get_bit_depth(uint8_t index) { - (void) index; - return VERA_DEPTH_1BPP; + uint32_t sprite_address = vera_get_sprite_offset(index); + vera_set_data0_address(sprite_address + 1); + vera_set_addr0_auto_increment(ADDR_INCREMENT_0); + vera_set_addr0_decrement(false); + uint8_t value = vera_peek_data0() & 0b10000000; + + if (value == 0) { + return VERA_DEPTH_4BPP; + } else { + return VERA_DEPTH_8BPP; + } } void