diff options
Diffstat (limited to 'kernel/amd64/io/com1.cxx')
-rw-r--r-- | kernel/amd64/io/com1.cxx | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/kernel/amd64/io/com1.cxx b/kernel/amd64/io/com1.cxx new file mode 100644 index 0000000..fc67b65 --- /dev/null +++ b/kernel/amd64/io/com1.cxx @@ -0,0 +1,44 @@ +#include <amd64/io/com1.h> +#include <amd64/io/ports.h> +#include <utils.h> + +#define COM1 0x3f8 + +int is_transmit_empty () +{ + return hos::io::inb(COM1 + 5) & 0x20; +} + +namespace hos::io +{ + com_logger::com_logger (enum log_level level) + : logger (level) + { + outb(COM1 + 1, 0x00); + outb(COM1 + 3, 0x80); + outb(COM1 + 0, 0x03); + outb(COM1 + 1, 0x00); + outb(COM1 + 3, 0x03); + outb(COM1 + 2, 0xc7); + outb(COM1 + 4, 0x0b); + outb(COM1 + 4, 0x1e); + outb(COM1 + 0, 0xae); + + if (inb(COM1 + 0) != 0xae) + { + return; + } + + outb(COM1 + 4, 0x0f); + } + + void com_logger::flush () + { + std::size_t len = strlen(this->buffer); + for (std::size_t i = 0; i < len; i++) + { + while (is_transmit_empty() == 0); + outb(COM1 + 0, this->buffer[i]); + } + } +} |