summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-04-22 11:16:43 +0200
committerBad Diode <bd@badd10de.dev>2021-04-22 11:16:43 +0200
commitbb63a8f2226669939c23a7cedf7a3ef60f89d6de (patch)
treecee625b9af0d70c0382d7847b57a8a19fe21510f
parent579942ed5500bc9155649201708ffb925139d172 (diff)
downloadgba-experiments-bb63a8f2226669939c23a7cedf7a3ef60f89d6de.tar.gz
gba-experiments-bb63a8f2226669939c23a7cedf7a3ef60f89d6de.zip
Test loading packed 1bpp sprites to VRAM
-rw-r--r--src/main.c53
1 files 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) {
444 } 444 }
445} 445}
446 446
447
448u32
449unpack_1bb(u8 hex) {
450 const u32 conversion_u32[16] = {
451 0x00000000, 0x00000001, 0x00000010, 0x00000011,
452 0x00000100, 0x00000101, 0x00000110, 0x00000111,
453 0x00001000, 0x00001001, 0x00001010, 0x00001011,
454 0x00001100, 0x00001101, 0x00001110, 0x00001111,
455 };
456 u8 low = hex & 0xF;
457 u8 high = (hex >> 4) & 0xF;
458 return (conversion_u32[high] << 16) | conversion_u32[low];
459}
460
447typedef struct Sprite { 461typedef struct Sprite {
448 // A unique sprite identifier. 462 // A unique sprite identifier.
449 size_t id; 463 size_t id;
@@ -488,6 +502,27 @@ load_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) {
488 return sprite_counter++; 502 return sprite_counter++;
489} 503}
490 504
505size_t
506load_packed_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) {
507 size_t counter = 0;
508 for (size_t i = 0; i < 8 * n_tiles * n_frames / 4; ++i) {
509 u32 hex = sprite_data[i];
510 sprite_memory[counter++] = unpack_1bb((hex >> 24) & 0xFF);
511 sprite_memory[counter++] = unpack_1bb((hex >> 16) & 0xFF);
512 sprite_memory[counter++] = unpack_1bb((hex >> 8) & 0xFF);
513 sprite_memory[counter++] = unpack_1bb((hex) & 0xFF);
514 }
515 sprite_memory += 8 * n_tiles * n_frames;
516 Sprite sprite = {
517 .id = sprite_counter,
518 .n_tiles = n_tiles,
519 .tile_start = sprite_tile_counter,
520 };
521 sprite_tile_counter += n_tiles * n_frames;
522 sprites[sprite_counter] = sprite;
523 return sprite_counter++;
524}
525
491int main(void) { 526int main(void) {
492 // Configure the display in mode 0 to show OBJs, where tile memory is 527 // Configure the display in mode 0 to show OBJs, where tile memory is
493 // sequential. 528 // sequential.
@@ -512,7 +547,7 @@ int main(void) {
512 int buttons_x = SCREEN_WIDTH / 2; 547 int buttons_x = SCREEN_WIDTH / 2;
513 int buttons_y = SCREEN_HEIGHT / 2; 548 int buttons_y = SCREEN_HEIGHT / 2;
514 ButtonSprite btn_b = { 549 ButtonSprite btn_b = {
515 .id = load_sprite_data(&gba_btn_b_data, 16, 7), 550 .id = load_packed_sprite_data(&gba_btn_b_data, 16, 7),
516 .x = buttons_x + 32, 551 .x = buttons_x + 32,
517 .y = buttons_y + 32, 552 .y = buttons_y + 32,
518 .frame = 0, 553 .frame = 0,
@@ -523,7 +558,7 @@ int main(void) {
523 OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start; 558 OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start;
524 559
525 ButtonSprite btn_a = { 560 ButtonSprite btn_a = {
526 .id = load_sprite_data(&gba_btn_a_data, 16, 7), 561 .id = load_packed_sprite_data(&gba_btn_a_data, 16, 7),
527 .x = buttons_x + 32 + 20, 562 .x = buttons_x + 32 + 20,
528 .y = buttons_y + 32 - 16, 563 .y = buttons_y + 32 - 16,
529 .frame = 0, 564 .frame = 0,
@@ -534,7 +569,7 @@ int main(void) {
534 OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start; 569 OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start;
535 570
536 ButtonSprite btn_down = { 571 ButtonSprite btn_down = {
537 .id = load_sprite_data(&gba_btn_down_data, 16, 7), 572 .id = load_packed_sprite_data(&gba_btn_down_data, 16, 7),
538 .x = buttons_x - 64 - 16, 573 .x = buttons_x - 64 - 16,
539 .y = buttons_y + 32, 574 .y = buttons_y + 32,
540 .frame = 0, 575 .frame = 0,
@@ -545,7 +580,7 @@ int main(void) {
545 OBJ_ATTR_2(btn_down.id) = sprites[btn_down.id].tile_start; 580 OBJ_ATTR_2(btn_down.id) = sprites[btn_down.id].tile_start;
546 581
547 ButtonSprite btn_up = { 582 ButtonSprite btn_up = {
548 .id = load_sprite_data(&gba_btn_up_data, 16, 7), 583 .id = load_packed_sprite_data(&gba_btn_up_data, 16, 7),
549 .x = buttons_x - 64 - 16, 584 .x = buttons_x - 64 - 16,
550 .y = buttons_y + 32 - 18, 585 .y = buttons_y + 32 - 18,
551 .frame = 0, 586 .frame = 0,
@@ -556,7 +591,7 @@ int main(void) {
556 OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start; 591 OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start;
557 592
558 ButtonSprite btn_left = { 593 ButtonSprite btn_left = {
559 .id = load_sprite_data(&gba_btn_left_data, 16, 7), 594 .id = load_packed_sprite_data(&gba_btn_left_data, 16, 7),
560 .x = buttons_x - 64 - 16 - 12, 595 .x = buttons_x - 64 - 16 - 12,
561 .y = buttons_y + 32 - 10, 596 .y = buttons_y + 32 - 10,
562 .frame = 0, 597 .frame = 0,
@@ -567,7 +602,7 @@ int main(void) {
567 OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start; 602 OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start;
568 603
569 ButtonSprite btn_right = { 604 ButtonSprite btn_right = {
570 .id = load_sprite_data(&gba_btn_right_data, 16, 7), 605 .id = load_packed_sprite_data(&gba_btn_right_data, 16, 7),
571 .x = buttons_x - 64 - 16 + 11, 606 .x = buttons_x - 64 - 16 + 11,
572 .y = buttons_y + 32 - 10, 607 .y = buttons_y + 32 - 10,
573 .frame = 0, 608 .frame = 0,
@@ -578,7 +613,7 @@ int main(void) {
578 OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start; 613 OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start;
579 614
580 ButtonSprite btn_l = { 615 ButtonSprite btn_l = {
581 .id = load_sprite_data(&gba_btn_l_data, 16, 7), 616 .id = load_packed_sprite_data(&gba_btn_l_data, 16, 7),
582 .x = buttons_x - 64 - 28, 617 .x = buttons_x - 64 - 28,
583 .y = buttons_y - 32 - 20, 618 .y = buttons_y - 32 - 20,
584 .frame = 0, 619 .frame = 0,
@@ -589,7 +624,7 @@ int main(void) {
589 OBJ_ATTR_2(btn_l.id) = sprites[btn_l.id].tile_start; 624 OBJ_ATTR_2(btn_l.id) = sprites[btn_l.id].tile_start;
590 625
591 ButtonSprite btn_r = { 626 ButtonSprite btn_r = {
592 .id = load_sprite_data(&gba_btn_r_data, 16, 7), 627 .id = load_packed_sprite_data(&gba_btn_r_data, 16, 7),
593 .x = buttons_x + 32 + 20, 628 .x = buttons_x + 32 + 20,
594 .y = buttons_y - 32 - 20, 629 .y = buttons_y - 32 - 20,
595 .frame = 0, 630 .frame = 0,
@@ -599,8 +634,6 @@ int main(void) {
599 OBJ_ATTR_1(btn_r.id) = btn_r.x | (1 << 0xF); 634 OBJ_ATTR_1(btn_r.id) = btn_r.x | (1 << 0xF);
600 OBJ_ATTR_2(btn_r.id) = sprites[btn_r.id].tile_start; 635 OBJ_ATTR_2(btn_r.id) = sprites[btn_r.id].tile_start;
601 636
602 // draw_logo();
603
604 int frame_counter = 0; 637 int frame_counter = 0;
605 while(true) { 638 while(true) {
606 wait_vsync(); 639 wait_vsync();