]> git.dujemihanovic.xyz Git - nameless-os.git/commitdiff
Implement input part of stdio
authorDuje Mihanović <duje.mihanovic@skole.hr>
Tue, 14 Jun 2022 19:06:49 +0000 (21:06 +0200)
committerDuje Mihanović <duje.mihanovic@skole.hr>
Wed, 22 Jun 2022 16:06:17 +0000 (18:06 +0200)
This is not very good and will definitely have to be redone later, but for now
it does the job.

include/arch/x86/input/ps2.h
include/arch/x86/tty.h
kernel/arch/x86/tty/tty.c
kernel/drivers/input/ps2.c
kernel/kernel.c

index 8b90a73e5de11b96a4c000bfad5ca6128665984c..c0c47deb369f9107ab2ddd48923c049b57f7110e 100644 (file)
@@ -82,11 +82,14 @@ static const char scancodes[] = {
        [0x3a] = 'm',
 
        /* special */
-       [0x29] = ' '
+       [0x29] = ' ',
+       [0x5a] = '\n',
+       [0x66] = 0x7f /* backspace */
 };
 
 extern int ps2_initialize();
 extern void ps2_input_wait();
 extern void ps2_output_wait();
+extern char ps2_get_keystroke();
 
 #endif
index 22247379ede32e1615192c1558f5bc05318991b0..83350c833b318fd3b0eb74406616d7b63afb31ec 100644 (file)
 
 extern void screen_clear(void);
 extern void kprint(const char *string, uint8_t color);
+extern void kprintc(const char character, uint8_t color);
 extern void kprintb(const uint8_t byte);
 extern void kprintw(const uint16_t word);
 extern void kprintd(const uint32_t dword);
+
+extern char *kgets(void);
 #endif
index 07d734e54fc00f1919e51e0efe624271158c2e01..ca0c3e7df95466878a7a933fc487c073e126b680 100644 (file)
@@ -1,6 +1,7 @@
 #include <io.h>
 #include <tty.h>
 #include <stdint.h>
+#include <input/ps2.h>
 
 #define VGA_WIDTH 80
 #define VGA_HEIGHT 25
@@ -11,6 +12,7 @@ static int cursor_x = 0; /* keep track of where cursor is */
 static int cursor_y = 0;
 
 char *hex_chars = "0123456789ABCDEF";
+char kgets_buffer[100];
 
 void screen_clear(void)
 {
@@ -74,6 +76,16 @@ void kprintc(const char character, uint8_t color)
        uint16_t crtc_port;
 
        if ( character == '\n') { cursor_x = 0; cursor_y++; }
+       if (character == 0x7f) {
+               cursor_x--;
+               if (cursor_x < 0) {
+                       if (cursor_y > 0) {
+                               cursor_x = VGA_WIDTH - 1;
+                               cursor_y--;
+                       } else cursor_x = 0;
+               }
+               video_memory[(cursor_y * VGA_WIDTH + cursor_x) * 2] = ' ';
+       }
        else { video_memory[(cursor_y * VGA_WIDTH + cursor_x) * 2] = character; video_memory[((cursor_y * VGA_WIDTH + cursor_x++) * 2)+ 1] = color != 0 ? color : VGA_COLOR_LIGHT_GRAY; }
        if ( cursor_x >= VGA_WIDTH ) { cursor_x = 0; cursor_y++; }
        if ( cursor_y >= VGA_HEIGHT ) { scroll_up(); }
@@ -137,3 +149,29 @@ void kprintd(uint32_t dword)
        temp = dword & 0xF;
        kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
 }
+
+char *kgets()
+{
+       for (int i=0; i<100; i++) {
+               kgets_buffer[i] = '\0';
+       }
+
+       int i=0;
+       while (i<100) {
+               char temp = ps2_get_keystroke();
+               if (temp == '\n') break;
+               if (temp == 0x7f) {
+                       if (i>0) {
+                               i-=1;
+                               kgets_buffer[i] = '\0';
+                               kprintc(temp, 0);
+                       }
+                       continue;
+               }
+               kgets_buffer[i] = temp;
+               kprintc(temp, 0);
+               i++;
+       }
+
+       return kgets_buffer;
+}
index ab4be5c5bbcbb9338ed7a545f59dd9517471605f..365c0ceaf9179d2f6bd0bd60acc89e39786ec2da 100644 (file)
@@ -5,6 +5,7 @@
 #include <irq/interrupt.h>
 
 static int was_released = 0, is_caps = 0;
+static char buffer;
 
 int ps2_keyb_handler()
 {
@@ -27,14 +28,21 @@ int ps2_keyb_handler()
                        return 0;
                }
                if (!is_caps) {
-                       kprintc(scancodes[scancode], 0);
+                       buffer = scancodes[scancode];
                } else {
-                       kprintc(scancodes[scancode] - ('a'-'A'), 0);
+                       buffer = scancodes[scancode] - ('a'-'A');
                }
        }
        return 0;
 }
 
+char ps2_get_keystroke()
+{
+       buffer = 0;
+       while (!buffer);
+       return buffer;
+}
+
 int ps2_initialize()
 {
        uint8_t ccb, is_2channel, port_1_test, port_2_test;
index c82bd4d7bc085d4f36ed4dbad94df65dbf304250..0ce9b6df3c492941a5ba0dbe3caa70d26f151755 100644 (file)
@@ -5,6 +5,7 @@
 #include <irq/interrupt.h>
 #include <irq/i8259a.h>
 #include <input/ps2.h>
+#include <stddef.h>
 
 struct idt_descriptor idt[256] __attribute__((aligned(0x10)));
 struct idtr idtr __attribute__((aligned(0x10)));
@@ -82,5 +83,11 @@ void kmain(void)
        }
        asm volatile ("sti");
        kprint("All done\n", 0);
-       while(1);
+
+       while(1) {
+               char *string = NULL;
+               string = kgets();
+               kprint(string, VGA_COLOR_LIME);
+               kprint("\n", 0);
+       }
 }