From 4ea5c7147e300f94156d4137cc65adff5323ff78 Mon Sep 17 00:00:00 2001 From: hkz Date: Tue, 22 Jul 2025 14:59:09 +0200 Subject: [PATCH] Add code to use the charset in ROM --- graphics/extracted_charset.png | Bin 0 -> 1389 bytes graphics/moves.aseprite | Bin 0 -> 553 bytes graphics/scores.aseprite | Bin 0 -> 551 bytes src/charset.h | 23 +++++++++++++++++++++++ src/game_graphics.c | 15 +++++++++++++++ src/game_graphics.h | 1 + src/main.c | 16 ++++++++++++---- src/utility.c | 8 ++++++++ src/utility.h | 1 + 9 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 graphics/extracted_charset.png create mode 100644 graphics/moves.aseprite create mode 100644 graphics/scores.aseprite create mode 100644 src/charset.h diff --git a/graphics/extracted_charset.png b/graphics/extracted_charset.png new file mode 100644 index 0000000000000000000000000000000000000000..4e726b76a2d27359aac870d5aee8f7217a4c7895 GIT binary patch literal 1389 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 Gx@!Pa$f0lm literal 0 HcmV?d00001 diff --git a/src/charset.h b/src/charset.h new file mode 100644 index 0000000..c2a8746 --- /dev/null +++ b/src/charset.h @@ -0,0 +1,23 @@ +#ifndef _CHARSET_HEADER_ +#define _CHARSET_HEADER_ + +#include + +// @ A B C D E F G H I +// J K L M N O P Q R S +// T U V W X Y Z [ \ ] +// ^ _ ! " # $ % & ' ( +// ) * + , - . / 0 1 2 +// 3 4 5 6 7 8 9 : ; < +// = > ? +// Then graphic characters follow + +#define ALPHA_OFFSET 8 +#define SYMBOL_OFFSET (28 * 8) +#define NUM_OFFSET (48 * 8) + +#define CHAR_HEIGHT 8 + +const uint8_t* const CHARSET = (uint8_t*)0xF200; + +#endif /* _CHARSET_HEADER_ */ diff --git a/src/game_graphics.c b/src/game_graphics.c index 9e3b832..2e74056 100644 --- a/src/game_graphics.c +++ b/src/game_graphics.c @@ -8,6 +8,7 @@ #include "line_data.h" #include "game_logic.h" #include "tiles.h" +#include "charset.h" #include "monitor_subroutines.h" #define SCREEN_WIDTH_B 40 @@ -61,6 +62,20 @@ void ddraw_single_tile(uint8_t offset) { } } +void draw_number(uint16_t n, uint8_t len, uint8_t x, uint8_t y) { + uint8_t buf[len]; + + // Decode the number into the buffer + num_to_decbuf(n, len, buf); + + for(uint8_t row = 0; row < CHAR_HEIGHT; row++) { + uint16_t offset = line_offset_map[y + row]; + for(uint8_t col = 0; col < len; col++) { + back_buf[(offset + (len - 1) - col) + x] = CHARSET[NUM_OFFSET + (buf[col] * CHAR_HEIGHT) + row]; + } + } +} + void draw_tiles(void) { uint8_t* grid = get_front_grid(); diff --git a/src/game_graphics.h b/src/game_graphics.h index 99d2dd5..495f2f6 100644 --- a/src/game_graphics.h +++ b/src/game_graphics.h @@ -15,6 +15,7 @@ void ddraw_field_borders_on_buffer(uint8_t brd); void draw_game_background(void); +void draw_number(uint16_t n, uint8_t len, uint8_t x, uint8_t y); void draw_tiles(void); void ddraw_single_tile(uint8_t offset); diff --git a/src/main.c b/src/main.c index 031617e..8c98e7b 100644 --- a/src/main.c +++ b/src/main.c @@ -26,6 +26,10 @@ void init(void) { memset((void*)DISPLAY_PAGE_2, 0, DISPLAY_PAGE_SIZE); } +#define MOVES_TEXT_X 28 +#define MOVES_TEXT_Y 14 +#define MOVES_TEXT_WIDTH 4 + __task int main(void) { uint16_t moves_count = 0; @@ -37,6 +41,7 @@ __task int main(void) { reset_game(); draw_game_background(); + draw_number(moves_count, MOVES_TEXT_WIDTH, MOVES_TEXT_X, MOVES_TEXT_Y); draw_tiles(); while(1) { // Game loop @@ -45,22 +50,22 @@ __task int main(void) { switch(read_kb()) { case K_UP: BELL1(); - ddraw_field_borders_on_buffer(0x1F); + ddraw_field_borders_on_buffer(0x0E); state = step_game(UP); break; case K_DOWN: BELL1(); - ddraw_field_borders_on_buffer(0x2F); + ddraw_field_borders_on_buffer(0x0D); state = step_game(DOWN); break; case K_LEFT: BELL1(); - ddraw_field_borders_on_buffer(0x4F); + ddraw_field_borders_on_buffer(0x0B); state = step_game(LEFT); break; case K_RIGHT: BELL1(); - ddraw_field_borders_on_buffer(0x8F); + ddraw_field_borders_on_buffer(0x07); state = step_game(RIGHT); break; default: @@ -73,6 +78,9 @@ __task int main(void) { // If we have won, break out of this loop if(state.done) break; + // Draw the number of moves + draw_number(moves_count, MOVES_TEXT_WIDTH, MOVES_TEXT_X, MOVES_TEXT_Y); + // Draw the moved tiles draw_tiles(); diff --git a/src/utility.c b/src/utility.c index 3f1afee..57e49c2 100644 --- a/src/utility.c +++ b/src/utility.c @@ -4,6 +4,14 @@ #include "monitor_subroutines.h" #include "line_data.h" +void num_to_decbuf(uint16_t n, uint8_t len, uint8_t *buf) { + + for(uint8_t idx = 0; idx < len; idx++) { + buf[idx] = n % 10; + n /= 10; + } +} + // https://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-way-to-reverse-the-order-of-bits-in-a-byte uint8_t bit_reverse(uint8_t b) { b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; diff --git a/src/utility.h b/src/utility.h index 74d2d77..09b55dc 100644 --- a/src/utility.h +++ b/src/utility.h @@ -18,6 +18,7 @@ #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) +void num_to_decbuf(uint16_t n, uint8_t len, uint8_t *buf); uint8_t bit_reverse(uint8_t b); uint8_t bit_count(uint8_t b); uint16_t lfsr_update(void);