summaryrefslogtreecommitdiff
path: root/kernel/rs.s
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/rs.s')
-rw-r--r--kernel/rs.s34
1 files changed, 32 insertions, 2 deletions
diff --git a/kernel/rs.s b/kernel/rs.s
index 9f3d4a6..69d31ae 100644
--- a/kernel/rs.s
+++ b/kernel/rs.s
@@ -1,7 +1,20 @@
global rs_isr
-extern rs_handler
+extern rsint_rx
+extern rsint_tx
extern rsputs
+%define RSBASE 0x3F8
+
+%define RSDATA RSBASE
+%define RSINTEN (RSBASE + 1)
+%define RSFIFOC (RSBASE + 2)
+%define RSINTID (RSBASE + 2)
+%define RSLINEC (RSBASE + 3)
+%define RSMODEMC (RSBASE + 4)
+%define RSLINES (RSBASE + 5)
+%define RSMODEMS (RSBASE + 6)
+%define RSSCRATCH (RSBASE + 7)
+
rs_isr:
pusha
mov ax, ds
@@ -12,7 +25,24 @@ rs_isr:
mov fs, ax
mov gs, ax
- call rs_handler
+ mov dx, RSINTID
+ in al, dx
+ test al, 1
+ jnz .skip
+ and al, 0x0E
+ cmp al, 0x04
+ je .rx
+ cmp al, 0x0C
+ je .rx
+ cmp al, 0x02
+ je .tx
+ jmp .skip
+.tx:
+ call rsint_tx
+ jmp .skip
+.rx:
+ call rsint_rx
+.skip:
mov al, 0x20
out 0x20, al