CeDOS - Commit 872bee56

Added cursor, added backspace
Celina Sophie Kalus
Sun, 24 Dec 2017 15:11:13 +0100
5 files changed, 70 insertions(+), 7 deletions(-)
A include/assembly.h

@@ -0,0 +1,16 @@

+#ifndef ASSEMBLY_H +#define ASSEMBLY_H + +#include <stdint.h> + +__attribute((always_inline)) inline void outb(uint8_t msg, uint16_t port) { + __asm__ volatile ("outb %0, %1" : "=a" (msg), "=Nd" (port)); +} + +__attribute((always_inline)) inline uint8_t inb(uint16_t port) { + uint8_t msg; + __asm__ volatile ("inb %1, %0" : "=a" (msg) : "Nd" (port)); + return msg; +} + +#endif
M kernel/main.ckernel/main.c

@@ -3,6 +3,7 @@

int main(void) { clear(); write("Welcome!"); + backspace(); return 0; }
M kernel/text.ckernel/text.c

@@ -1,4 +1,5 @@

#include "linker.h" +#include "assembly.h" #define VGA_TEXTMODE_COLUMNS 80 #define VGA_TEXTMODE_LINES 25

@@ -7,17 +8,25 @@ #define VGA_TEXTMODE_BPC 2

#define VGA_MEM_POS(line, column) ((line) * VGA_TEXTMODE_COLUMNS * VGA_TEXTMODE_BPC + (column) * VGA_TEXTMODE_BPC) #define VGA_TEXTMODE_MEM ((uint8_t*)0xB8000) + +#define VGA_INDEX_REG ((uint16_t)0x3D4) +#define VGA_DATA_REG ((uint16_t)0x3D5) uint32_t line = 0; uint32_t column = 0; uint8_t color = 0x0F; -void lfcr() { +__attribute((always_inline)) inline void set_char(char value) { + VGA_TEXTMODE_MEM[VGA_MEM_POS(line, column)] = value; + VGA_TEXTMODE_MEM[VGA_MEM_POS(line, column) + 1] = color; +} + +__attribute((always_inline)) inline void lfcr() { line++; column = 0; } -void write_char(char value) { +__attribute((always_inline)) inline void write_char(char value) { switch (value) { case '\n': lfcr();

@@ -25,8 +34,7 @@ break;

case '\0': break; default: - VGA_TEXTMODE_MEM[VGA_MEM_POS(line, column)] = value; - VGA_TEXTMODE_MEM[VGA_MEM_POS(line, column) + 1] = color; + set_char(value); column++; break; }

@@ -36,19 +44,53 @@ lfcr();

} } +__attribute((always_inline)) inline void set_cursor(uint16_t line, uint16_t column) { + uint16_t pos = line * VGA_TEXTMODE_COLUMNS + column; + outb(0x0F, VGA_INDEX_REG); + outb((uint8_t)(pos & 0xFF), VGA_DATA_REG); + outb(0x0E, VGA_INDEX_REG); + outb((uint8_t)(pos >> 8), VGA_DATA_REG); +} + +void backspace(void) { + if (column == 0 && line > 0) { + line--; + column = VGA_TEXTMODE_COLUMNS - 1; + } else if (column > 0) { + column--; + } + + set_char(0); + set_cursor(line, column); +} + void write_n(const char *string, uint32_t num) { for (uint32_t i = 0; i < num; i++) { write_char(string[0]); } + set_cursor(line, column); } void write(const char *string) { while (*string) { write_char(*(string++)); } + set_cursor(line, column); } -void clear() { +void write_c(const char c) { + write_char(c); + set_cursor(line, column); +} + +void enable_cursor(void) { + outb(0x0A, VGA_INDEX_REG); + outb((inb(VGA_DATA_REG) & 0x0C) | 0x00, VGA_DATA_REG); + outb(0x0B, VGA_INDEX_REG); + outb((inb(VGA_DATA_REG) & 0xE0) | 0x0F, VGA_DATA_REG); +} + +void clear(void) { for (int i = 0; i < VGA_TEXTMODE_CELLS; i++) { VGA_TEXTMODE_MEM[2 * i] = 0; VGA_TEXTMODE_MEM[2 * i + 1] = 0;

@@ -56,4 +98,6 @@ }

line = 0; column = 0; -}+ enable_cursor(); + set_cursor(line, column); +}
M kernel/text.hkernel/text.h

@@ -7,5 +7,6 @@ void write_n(const char *string, uint32_t num);

void write(const char *string); void clear(); +void backspace(void); #endif
M makefilemakefile

@@ -6,7 +6,8 @@ export INCLUDE_DIR = $(CURRENT_DIR)/include

export DEBUG_DIR = $(CURRENT_DIR)/debug export GCC_PREFIX = $(HOME)/opt/cross/i686-elf-/bin/i686-elf- -export GCC_OPTIONS = -O0 -Wno-write-strings -Qn -Wall -Wextra -fno-exceptions -nostdlib -nostartfiles -ffreestanding +export GCC_OPTIONS = -O1 -Wno-write-strings -Qn -Wall -Wextra -fno-exceptions -nostdlib -nostartfiles -ffreestanding + # OBJ_FILES = $(wildcard obj/asm/*.o) $(wildcard obj/cpp/*.o)