diff options
-rw-r--r-- | stage3/font.c | 33 | ||||
-rw-r--r-- | stage3/font.h | 5 | ||||
-rw-r--r-- | stage3/halt.c | 2 | ||||
-rw-r--r-- | stage3/letters.c | 443 | ||||
-rw-r--r-- | stage3/letters.h | 17 | ||||
-rw-r--r-- | stage3/letters_legacy.asm | 81 | ||||
-rw-r--r-- | stage3/main.c | 13 |
7 files changed, 406 insertions, 188 deletions
diff --git a/stage3/font.c b/stage3/font.c index c9ef520..5933c14 100644 --- a/stage3/font.c +++ b/stage3/font.c @@ -1,28 +1,28 @@ #include "font.h" +#include "letters.h" #include "gfx.h" -#define FONT_SIZE 3 +#define FONT_SIZE 2 -static const u16 outer_width = (CHAR_WIDTH + 2) * FONT_SIZE; -static const u16 outer_height = (CHAR_HEIGHT + 2) * FONT_SIZE; +static const u16 outer_width = (LETTER_WIDTH + 2) * FONT_SIZE; +static const u16 outer_height = (LETTER_HEIGHT + 2) * FONT_SIZE; -extern u8 letters['z' - 'a' + 1][CHAR_HEIGHT * CHAR_WIDTH]; +static u16 cursor_x = 0; +static u16 cursor_y = 0; -static u16 line_count = 0; - -static void print_chr(u16 at_x, u16 at_y, char c) +static void print_chr(u16 at_x, u16 at_y, u8 c) { u16 base_x = at_x * outer_width; u16 base_y = at_y * outer_height; - gfx_set_area(base_x, base_y, outer_width, outer_height, 0xFF000000); + //gfx_set_area(base_x, base_y, outer_width, outer_height, 0xFF000000); - if (c > 'z' || c < 'a') + if (c > 127) return; - for (u16 x = 0; x < CHAR_WIDTH; x++) - for (u16 y = 0; y < CHAR_HEIGHT; y++) { - if (!letters[c - 'a'][y * CHAR_WIDTH + x]) + for (u16 x = 0; x < LETTER_WIDTH; x++) + for (u16 y = 0; y < LETTER_HEIGHT; y++) { + if (!letters[c].data[y * LETTER_WIDTH + x]) continue; gfx_set_area( @@ -32,11 +32,12 @@ static void print_chr(u16 at_x, u16 at_y, char c) } } -void print(char *line) +void println(char *line) { - for (u16 x = 0; *line != '\0'; ++x, ++line) - print_chr(x, line_count, *line); + for (; *line != '\0'; ++cursor_x, ++line) + print_chr(cursor_x, cursor_y, *line); - line_count++; + cursor_y++; + cursor_x = 0; } diff --git a/stage3/font.h b/stage3/font.h index fe525ac..fd2f2c0 100644 --- a/stage3/font.h +++ b/stage3/font.h @@ -1,9 +1,6 @@ #ifndef _FONT_H_ #define _FONT_H_ -#define CHAR_WIDTH 3 -#define CHAR_HEIGHT 5 - -void print(char *line); +void println(char *line); #endif diff --git a/stage3/halt.c b/stage3/halt.c index 39bc3c9..d4d0f64 100644 --- a/stage3/halt.c +++ b/stage3/halt.c @@ -9,6 +9,6 @@ void halt() void panic(char *msg) { - print(msg); + println(msg); halt(); } diff --git a/stage3/letters.c b/stage3/letters.c index 11f1d46..ccec644 100644 --- a/stage3/letters.c +++ b/stage3/letters.c @@ -1,213 +1,490 @@ -#include "font.h" -#include "def.h" +#include "letters.h" -u8 letters['z' - 'a' + 1][CHAR_HEIGHT * CHAR_WIDTH] = { - // a - { +Letter letters[128]; + +void letters_init() +{ + letters[' '] = (Letter) {{ + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 + }}; + letters['!'] = (Letter) {{ + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 0, 0, + 0, 1, 0 + }}; + letters['\"'] = (Letter) {{ + 1, 0, 1, + 1, 0, 1, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 + }}; + letters['#'] = (Letter) {{ + 1, 0, 1, + 1, 1, 1, + 1, 0, 1, + 1, 1, 1, + 1, 0, 1 + }}; + letters['$'] = (Letter) {{ + 0, 1, 0, + 1, 1, 1, + 0, 1, 0, + 1, 1, 1, + 0, 1, 0 + }}; + letters['%'] = (Letter) {{ + 1, 0, 1, + 0, 0, 1, + 0, 1, 0, + 1, 0, 0, + 1, 0, 1 + }}; + letters['&'] = (Letter) {{ + 1, 1, 0, + 1, 0, 0, + 1, 1, 1, + 1, 0, 1, + 1, 1, 1 + }}; + letters['\''] = (Letter) {{ + 0, 1, 0, + 0, 1, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 + }}; + letters['('] = (Letter) {{ + 0, 1, 0, + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, + 0, 1, 0 + }}; + letters[')'] = (Letter) {{ + 0, 1, 0, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + 0, 1, 0 + }}; + letters['*'] = (Letter) {{ + 1, 0, 1, + 0, 1, 0, + 1, 0, 1, + 0, 0, 0, + 0, 0, 0 + }}; + letters['+'] = (Letter) {{ + 0, 0, 0, + 0, 1, 0, + 1, 1, 1, + 0, 1, 0, + 0, 0, 0 + }}; + letters[','] = (Letter) {{ + 0, 0, 0, + 0, 0, 0, + 0, 1, 0, + 0, 1, 0, + 1, 0, 0 + }}; + letters['-'] = (Letter) {{ + 0, 0, 0, + 0, 0, 0, + 1, 1, 1, + 0, 0, 0, + 0, 0, 0 + }}; + letters['.'] = (Letter) {{ + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 1, 0 + }}; + letters['/'] = (Letter) {{ + 0, 0, 1, + 0, 0, 1, + 0, 1, 0, + 1, 0, 0, + 1, 0, 0 + }}; + letters['0'] = (Letter) {{ + 0, 1, 0, + 1, 0, 1, + 1, 0, 1, + 1, 0, 1, + 0, 1, 0 + }}; + letters['1'] = (Letter) {{ + 0, 0, 1, + 0, 1, 1, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1 + }}; + letters['2'] = (Letter) {{ + 1, 1, 1, + 1, 0, 1, + 0, 1, 0, + 1, 0, 0, + 1, 1, 1 + }}; + letters['3'] = (Letter) {{ + 1, 1, 1, + 0, 0, 1, + 0, 1, 1, + 0, 0, 1, + 1, 1, 1 + }}; + letters['4'] = (Letter) {{ + 1, 0, 1, + 1, 0, 1, + 1, 1, 1, + 0, 0, 1, + 0, 0, 1 + }}; + letters['5'] = (Letter) {{ + 1, 1, 1, + 1, 0, 0, + 1, 1, 1, + 0, 0, 1, + 1, 1, 0 + }}; + letters['6'] = (Letter) {{ + 1, 1, 1, + 1, 0, 0, + 1, 1, 1, + 1, 0, 1, + 1, 1, 1 + }}; + letters['7'] = (Letter) {{ + 1, 1, 1, + 0, 0, 1, + 0, 1, 0, + 1, 0, 0, + 1, 0, 0 + }}; + letters['8'] = (Letter) {{ + 1, 1, 1, + 1, 0, 1, + 1, 1, 1, + 1, 0, 1, + 1, 1, 1 + }}; + letters['9'] = (Letter) {{ + 1, 1, 1, + 1, 0, 1, + 1, 1, 1, + 0, 0, 1, + 1, 1, 1 + }}; + letters[':'] = (Letter) {{ + 0, 0, 0, + 0, 1, 0, + 0, 0, 0, + 0, 1, 0, + 0, 0, 0 + }}; + letters[';'] = (Letter) {{ + 0, 1, 0, + 0, 0, 0, + 0, 1, 0, + 0, 1, 0, + 1, 0, 0 + }}; + letters['<'] = (Letter) {{ + 0, 0, 0, + 0, 1, 0, + 1, 0, 0, + 0, 1, 0, + 0, 0, 0 + }}; + letters['='] = (Letter) {{ + 0, 0, 0, + 1, 1, 1, + 0, 0, 0, + 1, 1, 1, + 0, 0, 0 + }}; + letters['>'] = (Letter) {{ + 0, 0, 0, + 0, 1, 0, + 0, 0, 1, + 0, 1, 0, + 0, 0, 0 + }}; + letters['?'] = (Letter) {{ + 1, 1, 1, + 0, 0, 1, + 0, 1, 0, + 0, 0, 0, + 0, 1, 0 + }}; + letters['@'] = (Letter) {{ + 0, 0, 1, + 1, 1, 1, + 1, 0, 1, + 1, 1, 1, + 1, 1, 1 + }}; + letters['['] = (Letter) {{ + 1, 1, 0, + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, + 1, 1, 0 + }}; + letters[']'] = (Letter) {{ + 0, 1, 1, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + 0, 1, 1 + }}; + letters['\\'] = (Letter) {{ + 1, 0, 0, + 1, 0, 0, + 0, 1, 0, + 0, 0, 1, + 0, 0, 1 + }}; + letters['^'] = (Letter) {{ + 0, 1, 0, + 1, 0, 1, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 + }}; + letters['_'] = (Letter) {{ + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 1, 1, 1 + }}; + letters['`'] = (Letter) {{ + 0, 1, 0, + 0, 0, 1, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 + }}; + letters['~'] = (Letter) {{ + 0, 0, 0, + 0, 0, 1, + 1, 1, 1, + 1, 0, 0, + 0, 0, 0 + }}; + letters['{'] = (Letter) {{ + 0, 1, 1, + 0, 1, 0, + 1, 1, 0, + 0, 1, 0, + 0, 1, 1 + }}; + letters['}'] = (Letter) {{ + 1, 1, 0, + 0, 1, 0, + 0, 1, 1, + 0, 1, 0, + 1, 1, 0 + }}; + letters['|'] = (Letter) {{ + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 1, 0 + }}; + letters['A'] = letters['a'] = (Letter) {{ 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1 - }, - // b - { + }}; + letters['B'] = letters['b'] = (Letter) {{ 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 - }, - // c - { + }}; + letters['C'] = letters['c'] = (Letter) {{ 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1 - }, - // d - { + }}; + letters['D'] = letters['d'] = (Letter) {{ 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0 - }, - // e - { + }}; + letters['E'] = letters['e'] = (Letter) {{ 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1 - }, - // f - { + }}; + letters['F'] = letters['f'] = (Letter) {{ 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0 - }, - // g - { + }}; + letters['G'] = letters['g'] = (Letter) {{ 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1 - }, - // h - { + }}; + letters['H'] = letters['h'] = (Letter) {{ 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1 - }, - // i - { - 0, 1, 0, + }}; + letters['I'] = letters['i'] = (Letter) {{ 0, 1, 0, + 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0 - }, - // j - { + }}; + letters['J'] = letters['j'] = (Letter) {{ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1 - }, - // k - { + }}; + letters['K'] = letters['k'] = (Letter) {{ 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, - }, - // l - { + }}; + letters['L'] = letters['l'] = (Letter) {{ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1 - }, - // m - { + }}; + letters['M'] = letters['m'] = (Letter) {{ 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 - }, - // n - { + }}; + letters['N'] = letters['n'] = (Letter) {{ 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1 - }, - // o - { + }}; + letters['O'] = letters['o'] = (Letter) {{ 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 - }, - // p - { + }}; + letters['P'] = letters['p'] = (Letter) {{ 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0 - }, - // q - { + }}; + letters['Q'] = letters['q'] = (Letter) {{ 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1 - }, - // r - { + }}; + letters['R'] = letters['r'] = (Letter) {{ 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1 - }, - // s - { + }}; + letters['S'] = letters['s'] = (Letter) {{ 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1 - }, - // t - { + }}; + letters['T'] = letters['t'] = (Letter) {{ 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0 - }, - // u - { + }}; + letters['U'] = letters['u'] = (Letter) {{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 - }, - // v - { + }}; + letters['V'] = letters['v'] = (Letter) {{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0 - }, - // w - { + }}; + letters['W'] = letters['w'] = (Letter) {{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 - }, - // x - { + }}; + letters['X'] = letters['x'] = (Letter) {{ 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1 - }, - // y - { + }}; + letters['Y'] = letters['y'] = (Letter) {{ 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0 - }, - // z - { + }}; + letters['Z'] = letters['z'] = (Letter) {{ 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1 - } -}; + }}; +} diff --git a/stage3/letters.h b/stage3/letters.h new file mode 100644 index 0000000..a62d1cb --- /dev/null +++ b/stage3/letters.h @@ -0,0 +1,17 @@ +#ifndef _LETTERS_H_ +#define _LETTERS_H_ + +#include "def.h" + +#define LETTER_WIDTH 3 +#define LETTER_HEIGHT 5 + +typedef struct __attribute__((packed)) { + u8 data[LETTER_HEIGHT * LETTER_WIDTH]; +} Letter; + +extern Letter letters[]; + +void letters_init(); + +#endif diff --git a/stage3/letters_legacy.asm b/stage3/letters_legacy.asm deleted file mode 100644 index 50f04ec..0000000 --- a/stage3/letters_legacy.asm +++ /dev/null @@ -1,81 +0,0 @@ -global letters - -%define GFXINFO 0x1000-10 -%define PITCH GFXINFO+0 -%define WIDTH GFXINFO+2 -%define HEIGHT GFXINFO+4 -%define FRAMEBUFFER GFXINFO+6 - -section .text - -; str in rdi -legacy_debug: - mov r9, [line] - - mov rax, rcx - mov rbx, 15 - xor rdx, rdx - mul rbx - - cmp rax, [HEIGHT] - jmp .char - - xor rax, rax - xor r9, r9 - -.char: - xor rax, rax - - mov al, [rdi] - cmp al, 0 - je .return - - cmp al, ' ' - je .space - - cmp al, 'a' - jb .invalid - - cmp al, 'z' - ja .invalid - - sub al, 'a' - mov bl, 15 - mul bl - - add rax, letters - mov r8, rax - - jmp .render - -.space: - mov r8, letters.space - -.render: - -.target: - xor rdx, rdx - mul [PITCH] - - xor rbx, rbx - mov ebx, [FRAMEBUFFER] - add rax, rbx - - inc rdi - jmp debug - -.return: - ret - -.invalid: - mov rdi, .invalid_msg - call debug - jmp $ - -.invalid_msg: "invalid character in message", 0 - -section .data - -line: dq 0 - -letters: diff --git a/stage3/main.c b/stage3/main.c index ab0b3a5..3a96992 100644 --- a/stage3/main.c +++ b/stage3/main.c @@ -1,15 +1,17 @@ -#include "paging.h" #include "def.h" +#include "paging.h" #include "gfx.h" #include "halt.h" #include "heap.h" #include "font.h" +#include "letters.h" void clear_screen(); // framebuffer.asm void kmain() { clear_screen(); + letters_init(); heap_init(); #define MMAP for (MemRegion *mreg = (void *) 0x500; mreg->start != nil; mreg++) @@ -24,9 +26,14 @@ void kmain() MMAP heap_add_region(mreg); - gfx_set_area(0, 0, gfx_info->width, gfx_info->height, 0xFF87CEEB); + gfx_set_area(0, 0, gfx_info->width, gfx_info->height, 0xFF000000); + + char str[128]; + str[127] = '\0'; + for (u8 i = 1; i < 128; i++) + str[i-1] = i; - print("abcdefghijklmnopqrstuvwxyz"); + println(str); halt(); } |