summaryrefslogtreecommitdiff
path: root/kernel/amd64/io/com1.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/amd64/io/com1.cxx')
-rw-r--r--kernel/amd64/io/com1.cxx44
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]);
+ }
+ }
+}