From a170d44a34b03a4d0d475c38aac9651fbe666b33 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 6 May 2021 13:40:20 +0200 Subject: Test drawing a wave pattern to the screen --- src/bitmap.h | 80 ++++++++++++++++++++++++++++----------------------------- src/main.c | 2 +- src/sequencer.c | 57 ++++++++++++++++++++++++++++++++++++++-- src/sprites.h | 1 + 4 files changed, 97 insertions(+), 43 deletions(-) diff --git a/src/bitmap.h b/src/bitmap.h index 0befe5d..bae9b40 100644 --- a/src/bitmap.h +++ b/src/bitmap.h @@ -1,29 +1,29 @@ #ifndef GBAEXP_BITMAP_H #define GBAEXP_BITMAP_H -#include "bd-font.c" -#include "common.c" +// #include "bd-font.c" +#include "common.h" // Using bd-font, an 8x8 bitmap font. -static void -put_char(int x, int y, Color clr, u8 chr) { - for (size_t i = 0; i < 8; ++i) { - for (size_t j = 0; j < 8; ++j) { - if ((font[chr][i] >> (7 - j)) & 0x1) { - FRAMEBUFFER[y + i][x + j] = clr; - } - } - } -} - -static void -put_text(int x, int y, Color clr, char *msg) { - int count = 0; - while (*msg) { - put_char(x + count, y, clr, *msg++); - count += 8; - } -} +// static void +// put_char(int x, int y, Color clr, u8 chr) { +// for (size_t i = 0; i < 8; ++i) { +// for (size_t j = 0; j < 8; ++j) { +// if ((font[chr][i] >> (7 - j)) & 0x1) { +// FRAMEBUFFER[y + i][x + j] = clr; +// } +// } +// } +// } + +// static void +// put_text(int x, int y, Color clr, char *msg) { +// int count = 0; +// while (*msg) { +// put_char(x + count, y, clr, *msg++); +// count += 8; +// } +// } // Draws a line with the given color between (x0,y0) and (x1,y1) using the // Bresenham's line drawing algorithm using exclusively integer arithmetic. @@ -205,24 +205,24 @@ draw_logo(void) { draw_line(x + height, y + 1, x + height + line, y + 1, COLOR_WHITE); } -void -copy_font_to_tile_memory(Tile *tile) { - // Hex to bits translation table. - const u32 conversion_u32[16] = { - 0x00000000, 0x00001000, 0x00000100, 0x00001100, - 0x00000010, 0x00001010, 0x00000110, 0x00001110, - 0x00000001, 0x00001001, 0x00000101, 0x00001101, - 0x00000011, 0x00001011, 0x00000111, 0x00001111, - }; - for (size_t i = 0; i < 250; ++i) { - for (size_t j = 0; j < 8; ++j) { - u8 row = font[i][j]; - u32 tile_idx = 0x00000000; - tile_idx = conversion_u32[row & 0xF] << 16; - tile_idx |= conversion_u32[(row >> 4) & 0xF]; - (tile + i)->data[j] = tile_idx; - } - } -} +// void +// copy_font_to_tile_memory(Tile *tile) { +// // Hex to bits translation table. +// const u32 conversion_u32[16] = { +// 0x00000000, 0x00001000, 0x00000100, 0x00001100, +// 0x00000010, 0x00001010, 0x00000110, 0x00001110, +// 0x00000001, 0x00001001, 0x00000101, 0x00001101, +// 0x00000011, 0x00001011, 0x00000111, 0x00001111, +// }; +// for (size_t i = 0; i < 250; ++i) { +// for (size_t j = 0; j < 8; ++j) { +// u8 row = font[i][j]; +// u32 tile_idx = 0x00000000; +// tile_idx = conversion_u32[row & 0xF] << 16; +// tile_idx |= conversion_u32[(row >> 4) & 0xF]; +// (tile + i)->data[j] = tile_idx; +// } +// } +// } #endif // GBAEXP_BITMAP_H diff --git a/src/main.c b/src/main.c index 48538fb..05bfa26 100644 --- a/src/main.c +++ b/src/main.c @@ -18,7 +18,7 @@ int main(void) { // Configure the display in mode 0 to show OBJs, where tile memory is // sequential. - DISP_CTRL = DISP_ENABLE_SPRITES | DISP_MODE_0 | DISP_BG_0; + DISP_CTRL = DISP_ENABLE_SPRITES | DISP_MODE_3 | DISP_BG_2; // Initialize text engine. // txt_init(0, COLOR_RED, 0); diff --git a/src/sequencer.c b/src/sequencer.c index 1447056..fccc42a 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -1,3 +1,5 @@ +#include "bitmap.h" + // Positioning parameters. #define SEQ_TRIG_POS_X 45 #define SEQ_TRIG_POS_Y 50 @@ -493,7 +495,53 @@ init_sequencer_sprites(void) { init_sprite_pal(16, COLOR_CYAN); init_sprite_pal(32, COLOR_RED); init_sprite_pal(48, COLOR_GREY); - init_sprites(0); + init_sprites(512); + + // draw_rect(SEQ_ENV_POS_X-1, + // SEQ_ENV_POS_Y-1, + // SEQ_ENV_POS_X + 62 + 1, + // SEQ_ENV_POS_Y + 16 + 1, + // COLOR_WHITE); + + // Clear wave drawing + draw_fill_rect(SEQ_ENV_POS_X, + SEQ_ENV_POS_Y, + SEQ_ENV_POS_X + 62, + SEQ_ENV_POS_Y + 16, + COLOR_BLACK); + + // DEBUG: Testing line drawing + // draw_line( + // SEQ_ENV_POS_X, + // SEQ_ENV_POS_Y, + // SEQ_ENV_POS_X + 62, + // SEQ_ENV_POS_Y + 16, + // COLOR_RED); + + // NOTE: Trying to draw this pattern. + // 0xEFDEBC89 + // 0x98CBEDFE + // 0x10214376 + // 0x67341201 + u8 sine_wave[] = { + 0x89, 0xBC, 0xDE, 0xEF, + 0xFE, 0xED, 0xCB, 0x98, + 0x76, 0x43, 0x21, 0x10, + 0x01, 0x12, 0x34, 0x67, + }; + // DEBUG: Drawing each byte. + int x = SEQ_ENV_POS_X; + int y = SEQ_ENV_POS_Y + 16; + for (size_t i = 0; i < 16; ++i) { + u8 byte = sine_wave[i]; + u8 first = (byte >> 4) & 0xF; + u8 second = byte & 0xF; + FRAMEBUFFER[y - first][x + i * 4] = COLOR_RED; + FRAMEBUFFER[y - first][x + i * 4 + 1] = COLOR_RED; + FRAMEBUFFER[y - second][x + i * 4 + 2] = COLOR_RED; + FRAMEBUFFER[y - second][x + i * 4 + 3] = COLOR_RED; + } + // Sprite note names. size_t sprite_id = load_packed_sprite_data(&sprite_note_names, 2, 73); @@ -828,7 +876,7 @@ update_sequencer_sprites(void) { // 000-015: Step note names. for (size_t i = 0; i < 16; ++i) { // Each note name is made of 2 8x8 tiles (16x8). - size_t base_tile = sequences[channel_selection_loc][i].note * 2; + size_t base_tile = seq_sprites[i].base_tile + sequences[channel_selection_loc][i].note * 2; // TODO: Show the note name if is within the duration, hide when trigger // is off or duration of previous note was cut short. If not triggered @@ -964,6 +1012,11 @@ update_sequencer_sprites(void) { seq_sprites[56].obj_attr_2 = base_tile | OBJ_PAL_BANK(3); } } + + // DEBUG: Hide all parameter control sprites for now. + for (size_t i = 34; i <= 50; ++i) { + seq_sprites[i].obj_attr_0 = seq_sprites[i].obj_attr_0 | OBJ_HIDDEN; + } } void diff --git a/src/sprites.h b/src/sprites.h index 0b55f0d..a64b784 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -64,6 +64,7 @@ init_sprites(size_t starting_tile) { sprite_counter = 0; // Prepare global sprite_memory address. sprite_memory = &TILE_MEM[4][starting_tile]; + sprite_tile_counter = starting_tile; } void -- cgit v1.2.1