summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kernel/serial.asm71
-rw-r--r--src/kernel/serial.h3
-rw-r--r--src/kernel/vga.c2
3 files changed, 66 insertions, 10 deletions
diff --git a/src/kernel/serial.asm b/src/kernel/serial.asm
index 9ebf84c..9077d99 100644
--- a/src/kernel/serial.asm
+++ b/src/kernel/serial.asm
@@ -18,12 +18,71 @@
global send_byte
global read_byte
-section .text
-;COM1: COM2: COM3: COM4:
-;0x03f8, 0x02f8, 0x03e8, 0x02e8
-
send_byte:;void send_byte(uint8_t value, uint8_t port)
- ;TODO
+ push ebp
+ mov ebp, esp
+
+ mov cl, byte [ebp + 8] ;value
+ xor edx, edx
+ mov dl, byte [ebp + 12];port
+
+ test dl, 0xfc
+ jnz .leave
+
+ xchg ebx, edx
+ shl bl, 1
+ mov ax, word [ebx + com_ports]
+ mov ebx, edx
+ mov dx, ax
+
+ or dx, 5
+
+.check_ready:
+ in al, dx
+ test al, 0x20
+ jz .check_ready
+
+ and dx, 0xfff8
+
+ mov al, cl
+ out dx, al
+
+.leave:
+ leave
+ ret
read_byte:;uint8_t read_byte(uint8_t port)
- ;TODO \ No newline at end of file
+ push ebp
+ mov ebp, esp
+
+ xor eax, eax
+
+ xor edx, edx
+ mov dl, byte [ebp + 8];port
+
+ test dl, 0xfc
+ jnz .leave
+
+ xchg ebx, edx
+ shl bl, 1
+ mov cx, word [ebx + com_ports]
+ mov ebx, edx
+ mov dx, cx
+
+ or dx, 5
+
+.check_ready:
+ in al, dx
+ test al, 0x01
+ jz .check_ready
+
+ and dx, 0xfff8
+
+ in al, dx
+
+.leave:
+ leave
+ ret
+
+section .rodata
+com_ports dw 0x03f8, 0x02f8, 0x03e8, 0x02e8 \ No newline at end of file
diff --git a/src/kernel/serial.h b/src/kernel/serial.h
index d5e4038..88d3712 100644
--- a/src/kernel/serial.h
+++ b/src/kernel/serial.h
@@ -29,10 +29,7 @@ enum serials {
COM4 = 3
};
-/*
-Commenting out so I don't accidentally call garbage while these are unimplemented.
void send_byte(uint8_t value, uint8_t port);
uint8_t read_byte(uint8_t port);
-*/
#endif \ No newline at end of file
diff --git a/src/kernel/vga.c b/src/kernel/vga.c
index 3d8de43..78da721 100644
--- a/src/kernel/vga.c
+++ b/src/kernel/vga.c
@@ -43,7 +43,7 @@ void scroll(void) {
}
void put_char(uint8_t ch) {
- //send_byte(ch, COM2);
+ send_byte(ch, COM2);
switch (ch) {
case '\b':
if (cursor_pos)