summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stage3/font.c33
-rw-r--r--stage3/font.h5
-rw-r--r--stage3/halt.c2
-rw-r--r--stage3/letters.c443
-rw-r--r--stage3/letters.h17
-rw-r--r--stage3/letters_legacy.asm81
-rw-r--r--stage3/main.c13
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();
}