summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authordzwdz2021-06-24 20:41:07 +0200
committerdzwdz2021-06-24 20:41:07 +0200
commitfde20f86f5be5a39fd3eadf95ba71761d173e0ce (patch)
tree2fc4c65b6b610ee0aa3c82228bcf8255337b0fd6 /kernel
Hello world o/
Diffstat (limited to 'kernel')
-rw-r--r--kernel/main.c7
-rw-r--r--kernel/tty.c32
-rw-r--r--kernel/tty.h6
3 files changed, 45 insertions, 0 deletions
diff --git a/kernel/main.c b/kernel/main.c
new file mode 100644
index 0000000..73c66e2
--- /dev/null
+++ b/kernel/main.c
@@ -0,0 +1,7 @@
+#include <kernel/tty.h>
+
+void kmain()
+{
+ for (int i = 0; i < 400; i++)
+ tty_write("words ", 6);
+}
diff --git a/kernel/tty.c b/kernel/tty.c
new file mode 100644
index 0000000..45de728
--- /dev/null
+++ b/kernel/tty.c
@@ -0,0 +1,32 @@
+/* will be moved to userspace later on */
+
+#include <kernel/tty.h>
+
+struct vga_cell {
+ unsigned char c;
+ unsigned char style;
+} __attribute__((__packed__));
+
+static const size_t vga_len = 80 * 25;
+static struct vga_cell *vga = (void*) 0xB8000;
+static size_t vga_pos = 0;
+
+static void tty_scroll() {
+ for (int i = 0; i < vga_len - 80; i++) {
+ vga[i] = vga[i + 80];
+ }
+ vga_pos -= 80;
+}
+
+void tty_putchar(char c)
+{
+ if (vga_pos >= vga_len - 80) tty_scroll();
+ vga[vga_pos++].c = c;
+}
+
+void tty_write(const char *buf, size_t len)
+{
+ for (size_t i = 0; i < len; i++) {
+ tty_putchar(buf[i]);
+ }
+}
diff --git a/kernel/tty.h b/kernel/tty.h
new file mode 100644
index 0000000..87a4744
--- /dev/null
+++ b/kernel/tty.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include <stddef.h>
+
+void tty_putchar(char c);
+void tty_write(const char *buf, size_t len);