From 4528b2347ac72ffdabdbe4d9e7bf7789c81e664f Mon Sep 17 00:00:00 2001 From: Aleksa Vučković Date: Tue, 12 Oct 2021 21:53:40 +0200 Subject: Adding tty --- src/boot.s | 5 ++- src/kernel.c | 128 +++------------------------------------------------------ src/keyboard.c | 78 +++++++++++++++++++++++++++++++++++ src/keyboard.h | 4 +- src/string.c | 34 +++++++++++++++ src/tty.c | 32 +++++++++++++++ src/vga.c | 93 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 248 insertions(+), 126 deletions(-) create mode 100644 src/keyboard.c create mode 100644 src/string.c create mode 100644 src/tty.c create mode 100644 src/vga.c (limited to 'src') diff --git a/src/boot.s b/src/boot.s index b88e8f7..6fe5ab8 100644 --- a/src/boot.s +++ b/src/boot.s @@ -64,8 +64,9 @@ stack_top: .type _start, @function _start: call init_gdt_table - ljmp $CODE_SEGMENT, $next - next: + ljmp $CODE_SEGMENT, $code + +code: movw $DATA_SEGMENT, %ax movw %ax, %ds movw %ax, %es diff --git a/src/kernel.c b/src/kernel.c index 0882580..0ad3b66 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1,129 +1,13 @@ -#include -#include -#include -#include"vga.h" - -static const size_t VGA_WIDTH = 80; -static const size_t VGA_HEIGHT = 25; - -#define PIC1_COMMAND_PORT 0x20 -#define PIC1_DATA_PORT 0x21 -#define PIC2_COMMAND_PORT 0xA0 -#define PIC2_DATA_PORT 0xA1 -// IO Ports for Keyboard -#define KEYBOARD_DATA_PORT 0x60 -#define KEYBOARD_STATUS_PORT 0x64 - -extern char ioport_in(uint8_t port); -extern void ioport_out(uint8_t port, char data); - -static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) -{ - return fg | bg << 4; -} - -static inline uint16_t vga_entry(unsigned char uc, uint8_t color) -{ - return (uint16_t) uc | (uint16_t) color << 8; -} - -size_t terminal_row; -size_t terminal_column; -uint8_t terminal_color; -uint16_t* terminal_buffer; - -void terminal_initialize(void) -{ - terminal_row=0; - terminal_column=0; - terminal_color=vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); - terminal_buffer=(uint16_t*) 0xB8000; - for(size_t y=0;y= 128) return; - - if(keycode==14) - { - if(terminal_column) terminal_column--; - terminal_putchar(keyboard[keycode]); - terminal_column--; - return; - } - - terminal_putchar(keyboard[keycode]); - - } -} -void print_message() -{ - for(size_t i=0;i<50;i++) - { - for(size_t j=0;j +#include +#include +#include"keyboard.h" + +#define BUFFER_SIZE 200 +char buffer[BUFFER_SIZE]; +size_t buffer_index=0; + +#define PIC1_COMMAND_PORT 0x20 +#define PIC1_DATA_PORT 0x21 +#define PIC2_COMMAND_PORT 0xA0 +#define PIC2_DATA_PORT 0xA1 +// IO Ports for Keyboard +#define KEYBOARD_DATA_PORT 0x60 +#define KEYBOARD_STATUS_PORT 0x64 + +extern char ioport_in(uint8_t port); +extern void ioport_out(uint8_t port, char data); + +void previous_field(); +void terminal_putchar(char c); +void tty(char *buffer); +void prompt(); + +void init_keyboard() +{ + // 0xFD = 1111 1101 in binary. enables only IRQ1 + // Why IRQ1? Remember, IRQ0 exists, it's 0-based + ioport_out(PIC1_DATA_PORT, 0xFD); +} + +void backspace() +{ + if(buffer_index<=0) return; + + previous_field(); + terminal_putchar(' '); + previous_field(); + buffer[--buffer_index]='\0'; + return; +} + +void enter() +{ + terminal_putchar('\n'); + if(buffer_index>0) + { + tty(buffer); + for(int i=0;i= 128) return; + + if(keycode==14) backspace(); + else if(keycode==28) enter(); + else + { + buffer[buffer_index++]=keyboard[keycode]; + terminal_putchar(keyboard[keycode]); + } + + } +} diff --git a/src/keyboard.h b/src/keyboard.h index 53846e6..5de7e10 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -6,11 +6,11 @@ unsigned char keyboard[128] = { // -------- 10 to 19 -------- '9','0','-','=', ' ', // Backspace - ' ', // Tab + ' ', // Tab 'q','w','e','r', // -------- 20 to 29 -------- 't','y','u','i','o','p','[',']', - '\n', // Enter + ' ', // Enter ' ', // left Ctrl // -------- 30 to 39 -------- 'a','s','d','f','g','h','j','k','l',';', diff --git a/src/string.c b/src/string.c new file mode 100644 index 0000000..4683470 --- /dev/null +++ b/src/string.c @@ -0,0 +1,34 @@ +#include +#include +#include + +bool stringcmp(char *str1,char *str2) +{ + size_t i; + for(i=0;str1[i]||str2[i];i++) if(str1[i]!=str2[i]) return 0; + if(str1[i]==str2[i]) return 1; + return 0; +} + +size_t pieces(char pieces[15][15],char *buffer) +{ + for(size_t x=0;x<15;x++) for(size_t y=0;y<15;y++) pieces[x][y]='\0'; + + size_t i=0,j=0,r=0; + while(buffer[i]==' '&&buffer[i]!='\0') i++; + for(;buffer[i]!='\0';i++) + { + if(buffer[i]==' ') + { + while(buffer[i]==' '&&buffer[i]!='\0') i++; + j=0; + r++; + i--; + } + else + { + pieces[r][j++]=buffer[i]; + } + } + return r+1; +} diff --git a/src/tty.c b/src/tty.c new file mode 100644 index 0000000..c3fe295 --- /dev/null +++ b/src/tty.c @@ -0,0 +1,32 @@ +#include +#include +#include +bool stringcmp(char *str1,char *str2); +size_t pieces(char pieces[][15],char *buffer); +void clear(); +void terminal_writestring(const char* data); +void terminal_putchar(char c); + +void echo(size_t numberof,char parts[][15]) +{ + for(size_t i=1;i +#include +#include +#include"vga.h" +static const size_t VGA_WIDTH = 80; +static const size_t VGA_HEIGHT = 25; + +extern char ioport_in(uint8_t port); +extern void ioport_out(uint8_t port, char data); + +bool stringcmp(char *str1,char *str2); + +static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) +{ + return fg | bg << 4; +} + +static inline uint16_t vga_entry(unsigned char uc, uint8_t color) +{ + return (uint16_t) uc | (uint16_t) color << 8; +} + +size_t terminal_row; +size_t terminal_column; +uint8_t terminal_color; +uint16_t* terminal_buffer; + +void terminal_initialize() +{ + terminal_row=0; + terminal_column=0; + terminal_color=vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); + terminal_buffer=(uint16_t*) 0xB8000; + for(size_t y=0;y "); +} + +void clear() +{ + for(size_t i=0;i