diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 53 |
1 files changed, 43 insertions, 10 deletions
@@ -444,6 +444,20 @@ copy_font_to_tile_memory(Tile *tile) { | |||
444 | } | 444 | } |
445 | } | 445 | } |
446 | 446 | ||
447 | |||
448 | u32 | ||
449 | unpack_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 | |||
447 | typedef struct Sprite { | 461 | typedef 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 | ||
505 | size_t | ||
506 | load_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 | |||
491 | int main(void) { | 526 | int 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(); |