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