summaryrefslogtreecommitdiff
path: root/kernel/hal/io.c
diff options
context:
space:
mode:
authorScott Gasch <[email protected]>2016-06-01 19:37:09 -0700
committerScott Gasch <[email protected]>2016-06-01 19:37:09 -0700
commit0a41dae5f406d498b5c9ab1542cb5660e0d982f6 (patch)
tree67ade9fe31cfd0458cc485e95550f7aaf14abdd1 /kernel/hal/io.c
Initial checkin of toy OS project.HEADmaster
Diffstat (limited to 'kernel/hal/io.c')
-rw-r--r--kernel/hal/io.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/kernel/hal/io.c b/kernel/hal/io.c
new file mode 100644
index 0000000..d97a211
--- /dev/null
+++ b/kernel/hal/io.c
@@ -0,0 +1,40 @@
+#include "kernel.h"
+
+// Write a byte to an I/O port.
+void
+out(WORD port, BYTE value )
+{
+ __asm__ __volatile__ (
+ "outb %b0, %w1"
+ :
+ : "a" (value), "Nd" (port)
+ );
+}
+
+// Read a byte from an I/O port.
+BYTE
+in(WORD port)
+{
+ BYTE value;
+
+ __asm__ __volatile__ (
+ "inb %w1, %b0"
+ : "=a" (value)
+ : "Nd" (port)
+ );
+
+ return value;
+}
+
+// Short delay. May be needed when talking to some
+// (slow) I/O devices.
+void
+iodelay(void)
+{
+ BYTE value = 0;
+ __asm__ __volatile__ (
+ "outb %0, $0x80"
+ :
+ : "a" (value)
+ );
+}