From bb63a8f2226669939c23a7cedf7a3ef60f89d6de Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 22 Apr 2021 11:16:43 +0200 Subject: Test loading packed 1bpp sprites to VRAM --- src/main.c | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/src/main.c b/src/main.c index 563340e..54a153b 100644 --- a/src/main.c +++ b/src/main.c @@ -444,6 +444,20 @@ copy_font_to_tile_memory(Tile *tile) { } } + +u32 +unpack_1bb(u8 hex) { + const u32 conversion_u32[16] = { + 0x00000000, 0x00000001, 0x00000010, 0x00000011, + 0x00000100, 0x00000101, 0x00000110, 0x00000111, + 0x00001000, 0x00001001, 0x00001010, 0x00001011, + 0x00001100, 0x00001101, 0x00001110, 0x00001111, + }; + u8 low = hex & 0xF; + u8 high = (hex >> 4) & 0xF; + return (conversion_u32[high] << 16) | conversion_u32[low]; +} + typedef struct Sprite { // A unique sprite identifier. size_t id; @@ -488,6 +502,27 @@ load_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) { return sprite_counter++; } +size_t +load_packed_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) { + size_t counter = 0; + for (size_t i = 0; i < 8 * n_tiles * n_frames / 4; ++i) { + u32 hex = sprite_data[i]; + sprite_memory[counter++] = unpack_1bb((hex >> 24) & 0xFF); + sprite_memory[counter++] = unpack_1bb((hex >> 16) & 0xFF); + sprite_memory[counter++] = unpack_1bb((hex >> 8) & 0xFF); + sprite_memory[counter++] = unpack_1bb((hex) & 0xFF); + } + sprite_memory += 8 * n_tiles * n_frames; + Sprite sprite = { + .id = sprite_counter, + .n_tiles = n_tiles, + .tile_start = sprite_tile_counter, + }; + sprite_tile_counter += n_tiles * n_frames; + sprites[sprite_counter] = sprite; + return sprite_counter++; +} + int main(void) { // Configure the display in mode 0 to show OBJs, where tile memory is // sequential. @@ -512,7 +547,7 @@ int main(void) { int buttons_x = SCREEN_WIDTH / 2; int buttons_y = SCREEN_HEIGHT / 2; ButtonSprite btn_b = { - .id = load_sprite_data(&gba_btn_b_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_b_data, 16, 7), .x = buttons_x + 32, .y = buttons_y + 32, .frame = 0, @@ -523,7 +558,7 @@ int main(void) { OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start; ButtonSprite btn_a = { - .id = load_sprite_data(&gba_btn_a_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_a_data, 16, 7), .x = buttons_x + 32 + 20, .y = buttons_y + 32 - 16, .frame = 0, @@ -534,7 +569,7 @@ int main(void) { OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start; ButtonSprite btn_down = { - .id = load_sprite_data(&gba_btn_down_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_down_data, 16, 7), .x = buttons_x - 64 - 16, .y = buttons_y + 32, .frame = 0, @@ -545,7 +580,7 @@ int main(void) { OBJ_ATTR_2(btn_down.id) = sprites[btn_down.id].tile_start; ButtonSprite btn_up = { - .id = load_sprite_data(&gba_btn_up_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_up_data, 16, 7), .x = buttons_x - 64 - 16, .y = buttons_y + 32 - 18, .frame = 0, @@ -556,7 +591,7 @@ int main(void) { OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start; ButtonSprite btn_left = { - .id = load_sprite_data(&gba_btn_left_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_left_data, 16, 7), .x = buttons_x - 64 - 16 - 12, .y = buttons_y + 32 - 10, .frame = 0, @@ -567,7 +602,7 @@ int main(void) { OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start; ButtonSprite btn_right = { - .id = load_sprite_data(&gba_btn_right_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_right_data, 16, 7), .x = buttons_x - 64 - 16 + 11, .y = buttons_y + 32 - 10, .frame = 0, @@ -578,7 +613,7 @@ int main(void) { OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start; ButtonSprite btn_l = { - .id = load_sprite_data(&gba_btn_l_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_l_data, 16, 7), .x = buttons_x - 64 - 28, .y = buttons_y - 32 - 20, .frame = 0, @@ -589,7 +624,7 @@ int main(void) { OBJ_ATTR_2(btn_l.id) = sprites[btn_l.id].tile_start; ButtonSprite btn_r = { - .id = load_sprite_data(&gba_btn_r_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_r_data, 16, 7), .x = buttons_x + 32 + 20, .y = buttons_y - 32 - 20, .frame = 0, @@ -599,8 +634,6 @@ int main(void) { OBJ_ATTR_1(btn_r.id) = btn_r.x | (1 << 0xF); OBJ_ATTR_2(btn_r.id) = sprites[btn_r.id].tile_start; - // draw_logo(); - int frame_counter = 0; while(true) { wait_vsync(); -- cgit v1.2.1