summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Gayot <duskcoder@gmail.com>2015-10-09 16:01:32 +0200
committerOlivier Gayot <duskcoder@gmail.com>2015-10-10 10:28:17 +0200
commitae5f4001c351b24a7f4e1bee6d995e4cb3cced2f (patch)
treeb50a074cf352a5f106edd50a354d0ce1b2fbace6
kfs: implemented the onscreen printing system
the function is prototyped this way: int printk(const char *string); the code has not been tested yet Signed-off-by: Olivier Gayot <duskcoder@gmail.com>
-rw-r--r--kernel.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/kernel.c b/kernel.c
new file mode 100644
index 0000000..8e59664
--- /dev/null
+++ b/kernel.c
@@ -0,0 +1,43 @@
+#define NB_COLS 80
+#define NB_ROWS 25
+
+/* XXX doest not always handle memory overlaps */
+static void my_memmove(void *dest, const void *src, size_t n)
+{
+ for (size_t i = 0; i < n; ++i) {
+ dest[i] = src[i];
+ }
+}
+
+static void my_memset(void *dest, int c, size_t n)
+{
+ for (size_t i = 0; i < n; ++i) {
+ dest[i] = c;
+ }
+}
+
+int printk(const char *str)
+{
+ static char *offset = (char *) 0xb8000;
+ static char *addr = offset;
+ int count = 0;
+
+ for (int i = 0; str[i]; ++i) {
+ if ((long)addr >= 0xb8000 + NB_COLS * NB_ROWS) {
+ /* shift up */
+ addr -= NB_COLS;
+ my_memmove(offset, offset + NB_COLS, NB_COLS * (NB_ROWS - 1));
+ my_memset(offset + NB_COLS * (NB_ROWS - 1), ' ', NB_ROWS);
+ }
+
+ *addr++ = str[i]
+ ++count;
+
+ }
+
+ return count;
+}
+
+int main(void)
+{
+}