diff options
author | Samuel Johnson <[email protected]> | 2025-07-01 10:33:05 -0400 |
---|---|---|
committer | Samuel Johnson <[email protected]> | 2025-07-01 10:33:05 -0400 |
commit | 571a656a6bd9b4b9d5c595c578d15ba79bb19ef7 (patch) | |
tree | 46f75b47f4edab4281de14ffa1c4a91a5a84f8f1 /kernel/amd64/io/com1.cxx | |
parent | 12fd3a91f138bf90520134682e38bf3b0341e660 (diff) |
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]); + } + } +} |