diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e43b0f988953ae3a84b00331d0ccf5f7d51cb3cf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000000000000000000000000000000000000..b63e0a4936f58ae0734881d66b7501a4baf234de --- /dev/null +++ b/src/utils.c @@ -0,0 +1,121 @@ +#include "ioport.h" +#include "gdt.h" + +#include "utils.h" + +/* print a char on the screen */ +int cursor_x = 0; /* here is the cursor position on X [0..79] */ +int cursor_y = 0; /* here is the cursor position on Y [0..24] */ + +void assert0(char b, const char *filename, const char *fct_name, const int line) +{ + if (!b) + { + puts("Assertion error in "); + puts(filename); + puts(" in "); + puts(fct_name); + puts(" at 0x"); + puthex(line); + puts("\n"); + } +} + +void irq_disable() +{ + __asm volatile("cli"); +} + +void irq_enable() +{ + __asm volatile("sti"); + _outb(0xA0, 0x20); + _outb(0x20, 0x20); +} + +/* base address for the video output assume to be set as character oriented by the multiboot */ +unsigned char *video_memory = (unsigned char *)0xB8000; + +/* clear screen */ +void clear_screen() +{ + int i; + for (i = 0; i < 80 * 25; i++) + { /* for each one of the 80 char by 25 lines */ + video_memory[i * 2 + 1] = 0x0F; /* color is set to black background and white char */ + video_memory[i * 2] = (unsigned char)' '; /* character shown is the space char */ + } +} + +/* print a string on the screen */ +void puts(const char *aString) +{ + const char *current_char = aString; + while (*current_char != 0) + { + putc(*current_char++); + } +} + +/* print an number in hexa */ +char *hex_digit = "0123456789ABCDEF"; +void puthex(int aNumber) +{ + int i; + int started = 0; + for (i = 28; i >= 0; i -= 4) + { + int k = (aNumber >> i) & 0xF; + if (k != 0 || started) + { + putc(hex_digit[k]); + started = 1; + } + } +} + +void setCursor() +{ + int cursor_offset = cursor_x + cursor_y * 80; + _outb(0x3d4, 14); + _outb(0x3d5, ((cursor_offset >> 8) & 0xFF)); + _outb(0x3d4, 15); + _outb(0x3d5, (cursor_offset & 0xFF)); +} + +void putc(char c) +{ + if (cursor_x > 79) + { + cursor_x = 0; + cursor_y++; + } + if (cursor_y > 24) + { + cursor_y = 0; + clear_screen(); + } + switch (c) + { /* deal with a special char */ + case '\r': + cursor_x = 0; + break; /* carriage return */ + case '\n': + cursor_x = 0; + cursor_y++; + break; /* new ligne */ + case 0x8: + if (cursor_x > 0) + cursor_x--; + break; /* backspace */ + case 0x9: + cursor_x = (cursor_x + 8) & ~7; + break; /* tabulation */ + /* or print a simple character */ + default: + video_memory[(cursor_x + 80 * cursor_y) * 2] = c; + cursor_x++; + break; + } + setCursor(); +} \ No newline at end of file