diff --git a/kernel/include/portio.h b/kernel/include/portio.h new file mode 100755 index 0000000..fbf4484 --- /dev/null +++ b/kernel/include/portio.h @@ -0,0 +1,37 @@ + +#ifndef PORTIO_H +#define PORTIO_H + +#include "hos_types.h" + +#define outportb(port, val) \ + __asm__ __volatile__ ("outb %%al, %%dx" : : "a" (val), "d" (port)); + +#define outportw(port, val) \ + __asm__ __volatile__ ("outw %%ax, %%dx" : : "a" (val), "d" (port)); + +#define outportd(port, val) \ + __asm__ __volatile__ ("outl %%eax, %%dx" : : "a" (val), "d" (port)); + +#define inportb(port) \ + ({ \ + u8_t val; \ + __asm__ __volatile__ ("inb %%dx, %%al" : "=a" (val) : "d" (port)); \ + val; \ + }); + +#define inportw(port) \ + ({ \ + u16_t val; \ + __asm__ __volatile__ ("inw %%dx, %%al" : "=a" (val) : "d" (port)); \ + val; \ + }); + +#define inportd(port) \ + ({ \ + u32_t val; \ + __asm__ __volatile__ ("inl %%dx, %%al" : "=a" (val) : "d" (port)); \ + val; \ + }); + +#endif diff --git a/kernel/lang/kio.cc b/kernel/lang/kio.cc index cd989c8..6b6ea4a 100644 --- a/kernel/lang/kio.cc +++ b/kernel/lang/kio.cc @@ -3,6 +3,7 @@ #include "hos_defines.h" #include "kio.h" #include "string.h" +#include "portio.h" #include #include /* va_*() */ @@ -17,12 +18,22 @@ static void fmt_o2a(char * buf, unsigned int val); static int cursor_x, cursor_y; +static void writeCursorPosition(int x, int y) +{ + u16_t pos = 80 * y + x; + outportb(0x3D4, 0x0E); + outportb(0x3D5, pos >> 8); + outportb(0x3D4, 0x0F); + outportb(0x3D5, pos); +} + extern "C" { void kio_bootstrap() { cursor_x = 0; cursor_y = 9; + writeCursorPosition(cursor_x, cursor_y); } void kprintf(const char * fmt, ...) @@ -129,7 +140,9 @@ void kputc(char c) (u8_t *) (CONSOLE_MEMORY + 80 * 2), 2 * 80 * 24); memsetw((u16_t *) (CONSOLE_MEMORY + 2 * 80 * 24), 0x0720, 80); + cursor_y = 24; } + writeCursorPosition(cursor_x, cursor_y); } void kputs(const char * s)