From 8a67d98577731a0357700b9bedbec150a61fc2ee Mon Sep 17 00:00:00 2001
From: kieron <kieron@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c>
Date: Sun, 29 Apr 2018 17:35:07 +0000
Subject: [PATCH] git-svn-id: https://spexeah.com:8443/svn/Asuro@595
 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c

---
 lib/serial.ppu                  | Bin 0 -> 3066 bytes
 src/driver/interface/serial.pas |  86 ++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+)
 create mode 100644 lib/serial.ppu
 create mode 100644 src/driver/interface/serial.pas

diff --git a/lib/serial.ppu b/lib/serial.ppu
new file mode 100644
index 0000000000000000000000000000000000000000..15ce36d0ebd9dc56b01975896232cfd22a828366
GIT binary patch
literal 3066
zcmbVOOK)3M5I%G5*iK^dYSNIBhTuACBtxq_il89WG%?g_5*ynsBp@u4Sk#c%sqIE8
zLa+cK#0n&Y#ACs#JAME=R{a6|286O;ksTqXgzr0#YnMjEVx)8K+?ns3J2Q9AcW)+h
zV`lDB@MBQ{^>Zese(6=}Qf+T;>dO7Ts8VVggA&FN3Drxra&arjn;SIuQ}cR^`NB@I
z{)hT){RJ8Wq59o=qqP0i?(l_)vERQVI(Vm1-a7o|;FWXx*MFj+r(CaX7c0egO10*@
zzdrb}(w(CDF%0R7*j=k0ZU<=!MYqat?^tt@QBZ`jDT(O0ThBdu-qbS^f;Y>HoD$5T
z+*&T5T-k>%gQ7%5patLvi0b0AaNjZpoj267%@UxY-R;omG0@;~t9)SCtvE*MVn|BQ
zqG!*6+xCR2<9O2f5Smk?52+e9<$OAWmfvN5Y&nM7a}2m0P!9WS6t%U}?4$mX6Z~U3
zyMUg9dJgG1qUVPyJnVMwc1l~mP<4`{|KWRrHI=_~1HVCCYX>a#Iz0*6+C?{6n7yU@
ztKHSEA02sYS{?@_=X<-1PkM97Y-(Y-kXlXUxs&HV(>pK_*#6X>L;t>c8>%GOsw2*b
z>lpP&Cy_h{;ANua`5qTZ%tn$;E+$hqlkwNm*`@g6LUt*&y09FNUtP;5PYRGnV+zBI
z@puI@>1<v}|B!its2GeCmJoozG_GEZ$1dC`Z<nff8bCkg(9gh5c@|^X96#kXcX1~P
zKIjUDlO-x0WnKYrhiG}(&-}d2JeOQuGHEl}_T1Cy<>bQZN$ImkO!|D&HvNHqm(U6y
z3%QBG^bNERcfrkKqo`zH!a-jr4pPKm?xs@gomQm=o_6RBLLpli6Mm&=5#2d*$QolG
zC1+{191Q{$y@m0xn=B*yo*})4)z-uee(lmL9@lo}+s4oEnzo*#ca+r%E~ZyzlysX_
zqF<gqO7IyJw<Bs+NsmQ+1d|-_p^!-o84Y13YEDV7MSVuc9z%dkV#p|2o~U^xQH%PL
zjy=1Vj(UXWBUrAK(QJJtUQyq|#)B^-{5phdrHxW~w}fsqJtFD{n9Xv2@`CkJWfSkq
zdGEnSktT~ML#Eb&@J6*#uWpsnr|<86x__0er$rvHHsYUjIbap)v?Z93f6$@-jiEfm
zJfOc@ygN=DjWDmHBMBo8&>}V*<xKISq?mZY^m;q~q_#Heu|snmsw9Z-ciTeOpUjR3
za2%^9OjwT);I(x6dgqa_<t4$kh_^*DO}(Q?UIg+b9m%*K$#5GLle#n&oD>rGn8NU4
zJVo}*j}P;OB0@DoKjbp5JoD7OW&^V%*oaHkPy03M9g*0ZK)yw^T=Yq7$|o`XJ+Ulq
z`ON3C&eJ)K?QJ?2&$x76wc)Pg+DgZ8GW&DW`k|^@)H_P&10X*nTIT(994Du8g?x5l
zHMf$=7m_QP{F))?|B=ucJisP2KkgE`Z3BKE*H%J6`qarD<40D`4q$di8cbmrW|FQE
z{(DB__6-<r88zH0>Jw~jsDo@8yj88fhhyoO=W}?+^&Y1%N4Pdqt$~|tUyAwyh;tgj
zF#65EZNX9$Sje`3sILKJE6NCe1P06XLZeo!)VIrxLTP)aan~=esP6%#NRvrPPT%}%
HlB0hB0xT$y

literal 0
HcmV?d00001

diff --git a/src/driver/interface/serial.pas b/src/driver/interface/serial.pas
new file mode 100644
index 00000000..8d0942d1
--- /dev/null
+++ b/src/driver/interface/serial.pas
@@ -0,0 +1,86 @@
+unit serial;
+
+interface
+
+uses
+    util, isrmanager;
+
+const
+    COM1 = $3F8;
+    COM2 = $2F8;
+    COM3 = $3E8;
+    COM4 = $2E8;
+
+procedure init();
+function receive(PORT : uint16; timeout : uint32) : uint8;
+function send(PORT : uint16; data : uint8; timeout : uint32) : boolean;
+
+implementation
+
+uses
+    console;
+
+procedure hook();
+begin
+    console.writestringln('SERIAL ISR FIRED!');   
+end;
+
+procedure initPort(PORT : uint16);
+begin
+    outb(PORT + 1, $00);
+    outb(PORT + 3, $80);
+    outb(PORT + 0, $03);
+    outb(PORT + 1, $00);
+    outb(PORT + 3, $03);
+    outb(PORT + 2, $C7);
+    outb(PORT + 4, $0B);
+end;
+
+procedure init();
+begin
+    initPort(COM1);
+    initPort(COM2);
+    initPort(COM3);
+    initPort(COM4);
+    isrmanager.registerISR(32 + 3, @Hook);
+    isrmanager.registerISR(32 + 4, @Hook);
+end;
+
+function serial_received(PORT : uint16) : uint32;
+begin
+    serial_received:= inb(PORT + 5) AND 1;
+end;
+
+function is_transmit_empty(PORT : uint16) : uint32;
+begin
+    is_transmit_empty:= inb(PORT + 5) AND $20;
+end;
+
+function receive(PORT : uint16; timeout : uint32) : uint8;
+var
+    _timeout : uint32;
+
+begin
+    receive:= 0;
+    _timeout:= timeout;
+    while (serial_received(PORT) = 0) do begin end;
+    if _timeout <> 0 then begin
+        receive:= inb(PORT);
+    end;
+end;
+
+function send(PORT : uint16; data : uint8; timeout : uint32) : boolean;
+var
+    _timeout : uint32;
+
+begin
+    send:= false;
+    _timeout:= timeout;
+    while (is_transmit_empty(PORT) = 0) do begin end;
+    if _timeout <> 0 then begin
+        outb(PORT, data);
+        send:= true;
+    end;
+end;
+
+end.
\ No newline at end of file