From 9e8db13edb67d9ad7823ce401e40d157bb44d5ea Mon Sep 17 00:00:00 2001
From: y2-shaffan <yousuf2.shaffan@live.uwe.ac.uk>
Date: Mon, 4 Mar 2024 13:09:15 +0000
Subject: [PATCH] Update file kernel.c

---
 kernel.c | 50 +++++++++++++++++++++++---------------------------
 1 file changed, 23 insertions(+), 27 deletions(-)

diff --git a/kernel.c b/kernel.c
index 1ab188b..b3bca4f 100644
--- a/kernel.c
+++ b/kernel.c
@@ -85,36 +85,32 @@ void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) {
 }
 
 void terminal_putchar(char c) {
-  if (c == '\n') {
-    terminal_column = 0;
-    if (++terminal_row == VGA_HEIGHT) {
-      for (size_t y = 1; y < VGA_HEIGHT; y++) {
-        for (size_t x = 0; x < VGA_WIDTH; x++) {
-          terminal_buffer[(y - 1) * VGA_WIDTH + x] = terminal_buffer[y * VGA_WIDTH + x];
+    if (c == '\n') {
+        terminal_column = 0;
+        if (++terminal_row == VGA_HEIGHT) {
+            terminal_row = 0;
         }
-      }
-      for (size_t x = 0; x < VGA_WIDTH; x++) {
-        terminal_buffer[(VGA_HEIGHT - 1) * VGA_WIDTH + x] = make_vgaentry(' ', terminal_color);
-      }
-      terminal_row = VGA_HEIGHT - 1;
-    }
-  } else {
-    terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
-    if (++terminal_column == VGA_WIDTH) {
-      terminal_column = 0;
-      if (++terminal_row == VGA_HEIGHT) {
-        for (size_t y = 1; y < VGA_HEIGHT; y++) {
-          for (size_t x = 0; x < VGA_WIDTH; x++) {
-            terminal_buffer[(y - 1) * VGA_WIDTH + x] = terminal_buffer[y * VGA_WIDTH + x];
-          }
-        }
-        for (size_t x = 0; x < VGA_WIDTH; x++) {
-          terminal_buffer[(VGA_HEIGHT - 1) * VGA_WIDTH + x] = make_vgaentry(' ', terminal_color);
+    } else if (c == '\r') {
+        terminal_column = 0;
+    } else {
+        terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
+        if (++terminal_column == VGA_WIDTH) {
+            terminal_column = 0;
+            if (++terminal_row == VGA_HEIGHT) {
+                terminal_row = 0;
+                // Scroll the screen up one row
+                for (size_t i = 1; i < VGA_HEIGHT; i++) {
+                    for (size_t j = 0; j < VGA_WIDTH; j++) {
+                        terminal_buffer[(i - 1) * VGA_WIDTH + j] = terminal_buffer[i * VGA_WIDTH + j];
+                    }
+                }
+                // Clear the last row
+                for (size_t x = 0; x < VGA_WIDTH; x++) {
+                    terminal_buffer[(VGA_HEIGHT - 1) * VGA_WIDTH + x] = make_vgaentry(' ', terminal_color);
+                }
+            }
         }
-        terminal_row = VGA_HEIGHT - 1;
-      }
     }
-  }
 }
 
 void terminal_writestring(const char* data) {
-- 
GitLab