ZealOS/docs/Kernel/SerialDev/Message.CC.html
TomAwezome 1b75d91002 Fix Mount AHCI Port selection.
Add arg to SATARep to specify drive types to show.
Add checks in AHCIPortInit to verify port signatures, add helper method to get signatures from port.
2021-08-02 16:40:05 -04:00

330 lines
35 KiB
HTML
Executable file

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=US-ASCII">
<meta name="generator" content="ZealOS V0.13">
<style type="text/css">
body {background-color:#fef1f0;}
.cF0{color:#000000;background-color:#fef1f0;}
.cF1{color:#0148a4;background-color:#fef1f0;}
.cF2{color:#3b7901;background-color:#fef1f0;}
.cF3{color:#057c7e;background-color:#fef1f0;}
.cF4{color:#bb2020;background-color:#fef1f0;}
.cF5{color:#9e42ae;background-color:#fef1f0;}
.cF6{color:#b57901;background-color:#fef1f0;}
.cF7{color:#b2b6af;background-color:#fef1f0;}
.cF8{color:#555753;background-color:#fef1f0;}
.cF9{color:#678fbb;background-color:#fef1f0;}
.cFA{color:#82bc49;background-color:#fef1f0;}
.cFB{color:#0097a2;background-color:#fef1f0;}
.cFC{color:#e26a6a;background-color:#fef1f0;}
.cFD{color:#c671bc;background-color:#fef1f0;}
.cFE{color:#c7ab00;background-color:#fef1f0;}
.cFF{color:#fef1f0;background-color:#fef1f0;}
</style>
</head>
<body>
<pre style="font-family:monospace;font-size:12pt">
<a name="l1"></a><span class=cF1>U0</span><span class=cF0> </span><span class=cF5>InputFilterTask</span><span class=cF0>()
<a name="l2"></a>{
<a name="l3"></a> </span><span class=cF9>CJob</span><span class=cF0> *tmpc, *tmpc1;
<a name="l4"></a> </span><span class=cF1>Bool</span><span class=cF0> old_filter;
<a name="l5"></a> </span><span class=cF9>I64</span><span class=cF0> old_flags = </span><span class=cF5>RFlagsGet</span><span class=cF0>;
<a name="l6"></a>
<a name="l7"></a> </span><span class=cF5>Fs</span><span class=cF0>-&gt;win_inhibit = </span><span class=cF3>WIG_USER_TASK_DEFAULT</span><span class=cF0>;
<a name="l8"></a> </span><span class=cF5>LBts</span><span class=cF0>(&amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;task_flags, </span><span class=cF3>TASKf_INPUT_FILTER_TASK</span><span class=cF0>);
<a name="l9"></a> old_filter = </span><span class=cF5>LBts</span><span class=cF0>(&amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;last_input_filter_task-&gt;task_flags, </span><span class=cF3>TASKf_FILTER_INPUT</span><span class=cF0>);
<a name="l10"></a> </span><span class=cF5>LBEqual</span><span class=cF0>(&amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;task_flags, </span><span class=cF3>TASKf_FILTER_INPUT</span><span class=cF0>, old_filter);
<a name="l11"></a> </span><span class=cF1>while</span><span class=cF0> (</span><span class=cF3>TRUE</span><span class=cF0>)
<a name="l12"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l13"></a> </span><span class=cF1>CLI</span><span class=cF0>
<a name="l14"></a> </span><span class=cF5>JobsHandler</span><span class=cF0>(old_flags);
<a name="l15"></a> tmpc1 = &amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;server_ctrl.next_waiting;
<a name="l16"></a> tmpc = tmpc1-&gt;next;
<a name="l17"></a> </span><span class=cF1>if</span><span class=cF0> (tmpc == tmpc1)
<a name="l18"></a> </span><span class=cF1>break</span><span class=cF0>;
<a name="l19"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l20"></a> {
<a name="l21"></a> </span><span class=cF1>if</span><span class=cF0> (tmpc-&gt;job_code == </span><span class=cF3>JOBT_TEXT_INPUT</span><span class=cF0>)
<a name="l22"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l23"></a> </span><span class=cF5>QueueRemove</span><span class=cF0>(tmpc);
<a name="l24"></a> </span><span class=cF5>RFlagsSet</span><span class=cF0>(old_flags);
<a name="l25"></a> </span><span class=cF1>try</span><span class=cF0>
<a name="l26"></a> </span><span class=cF5>ExePrint</span><span class=cF0>(</span><span class=cF6>&quot;%s&quot;</span><span class=cF0>, tmpc-&gt;aux_str);
<a name="l27"></a> </span><span class=cF1>catch</span><span class=cF0>
<a name="l28"></a> </span><span class=cF5>Fs</span><span class=cF0>-&gt;catch_except = </span><span class=cF3>TRUE</span><span class=cF0>;
<a name="l29"></a> </span><span class=cF5>JobDel</span><span class=cF0>(tmpc);
<a name="l30"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l31"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l32"></a> </span><span class=cF1>break</span><span class=cF0>;
<a name="l33"></a> }
<a name="l34"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l35"></a> </span><span class=cF5>Fs</span><span class=cF0>-&gt;next_input_filter_task-&gt;last_input_filter_task = </span><span class=cF5>Fs</span><span class=cF0>-&gt;last_input_filter_task;
<a name="l36"></a> </span><span class=cF5>Fs</span><span class=cF0>-&gt;last_input_filter_task-&gt;next_input_filter_task = </span><span class=cF5>Fs</span><span class=cF0>-&gt;next_input_filter_task;
<a name="l37"></a> </span><span class=cF1>if</span><span class=cF0> (!old_filter)
<a name="l38"></a> </span><span class=cF5>LBtr</span><span class=cF0>(&amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;last_input_filter_task-&gt;task_flags, </span><span class=cF3>TASKf_FILTER_INPUT</span><span class=cF0>);
<a name="l39"></a> </span><span class=cF5>RFlagsSet</span><span class=cF0>(old_flags);
<a name="l40"></a>}
<a name="l41"></a>
<a name="l42"></a></span><span class=cF9>I64</span><span class=cF0> </span><span class=cF5>MessageScan</span><span class=cF0>(</span><span class=cF9>I64</span><span class=cF0> *_arg1=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF9>I64</span><span class=cF0> *_arg2=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF9>I64</span><span class=cF0> mask=~</span><span class=cFE>1</span><span class=cF0>, </span><span class=cF9>CTask</span><span class=cF0> *task=</span><span class=cF3>NULL</span><span class=cF0>)
<a name="l43"></a>{</span><span class=cF2>/*Check for a message of type specified by a one in the mask.</span><span class=cF0>
<a name="l44"></a></span><span class=cF2>Throw-out messages not in mask.</span><span class=cF0>
<a name="l45"></a></span><span class=cF2>If no message fit mask, return NULL immediately.</span><span class=cF0>
<a name="l46"></a></span><span class=cF2>Remove desired message, return </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l3886"><span class=cF4>message_code</span></a><span class=cF2>.</span><span class=cF0>
<a name="l47"></a></span><span class=cF2>Note: This delivers messages from parent down to pop-up.</span><span class=cF0>
<a name="l48"></a></span><span class=cF2>*/</span><span class=cF0>
<a name="l49"></a> </span><span class=cF9>I64</span><span class=cF0> res, old_flags;
<a name="l50"></a> </span><span class=cF9>CJob</span><span class=cF0> *tmpc, *tmpc1;
<a name="l51"></a>
<a name="l52"></a> </span><span class=cF1>if</span><span class=cF0> (!task)
<a name="l53"></a> task = </span><span class=cF5>Fs</span><span class=cF0>;
<a name="l54"></a> old_flags = </span><span class=cF5>RFlagsGet</span><span class=cF0>;
<a name="l55"></a> tmpc1 =&amp;task-&gt;server_ctrl.next_waiting;
<a name="l56"></a> </span><span class=cF1>while</span><span class=cF0> (</span><span class=cF3>TRUE</span><span class=cF0>)
<a name="l57"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l58"></a> </span><span class=cF1>CLI</span><span class=cF0>
<a name="l59"></a> </span><span class=cF1>if</span><span class=cF0> (task == </span><span class=cF5>Fs</span><span class=cF0>)
<a name="l60"></a> </span><span class=cF5>JobsHandler</span><span class=cF0>(old_flags);
<a name="l61"></a> tmpc = tmpc1-&gt;next;
<a name="l62"></a> </span><span class=cF1>if</span><span class=cF0> (tmpc == tmpc1)
<a name="l63"></a> </span><span class=cF1>break</span><span class=cF0>;
<a name="l64"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l65"></a> {
<a name="l66"></a> </span><span class=cF1>if</span><span class=cF0> (tmpc-&gt;job_code == </span><span class=cF3>JOBT_MESSAGE</span><span class=cF0>)
<a name="l67"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l68"></a> </span><span class=cF5>QueueRemove</span><span class=cF0>(tmpc);
<a name="l69"></a> </span><span class=cF5>RFlagsSet</span><span class=cF0>(old_flags);
<a name="l70"></a> res = tmpc-&gt;message_code;
<a name="l71"></a> </span><span class=cF1>if</span><span class=cF0> (_arg1)
<a name="l72"></a> *_arg1 = tmpc-&gt;aux1;
<a name="l73"></a> </span><span class=cF1>if</span><span class=cF0> (_arg2)
<a name="l74"></a> *_arg2 = tmpc-&gt;aux2;
<a name="l75"></a> </span><span class=cF5>JobDel</span><span class=cF0>(tmpc);
<a name="l76"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF7>(</span><span class=cF0>res != </span><span class=cF3>MESSAGE_KEY_DOWN</span><span class=cF0> || !(tmpc-&gt;aux2 &amp; </span><span class=cF3>SCF_KEY_DESC</span><span class=cF0>) || !</span><span class=cF5>Bt</span><span class=cF0>(&amp;task-&gt;win_inhibit, </span><span class=cF3>WIf_SELF_KEY_DESC</span><span class=cF0>)</span><span class=cF7>)</span><span class=cF0> &amp;&amp;
<a name="l77"></a> </span><span class=cF5>Bt</span><span class=cF7>(</span><span class=cF0>&amp;mask, res</span><span class=cF7>)</span><span class=cF0>)
<a name="l78"></a> </span><span class=cF1>goto</span><span class=cF0> sm_done;
<a name="l79"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l80"></a> }
<a name="l81"></a> </span><span class=cF5>RFlagsSet</span><span class=cF0>(old_flags);
<a name="l82"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l83"></a> res = </span><span class=cF3>MESSAGE_NULL</span><span class=cF0>;
<a name="l84"></a> </span><span class=cF1>if</span><span class=cF0> (_arg1)
<a name="l85"></a> *_arg1 = </span><span class=cFE>0</span><span class=cF0>;
<a name="l86"></a> </span><span class=cF1>if</span><span class=cF0> (_arg2)
<a name="l87"></a> *_arg2 = </span><span class=cFE>0</span><span class=cF0>;
<a name="l88"></a> </span><span class=cF1>if</span><span class=cF0> (task-&gt;parent_task &amp;&amp; task-&gt;parent_task-&gt;popup_task == task)
<a name="l89"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l90"></a> </span><span class=cF5>RFlagsSet</span><span class=cF0>(old_flags);
<a name="l91"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF5>MessageScan</span><span class=cF0>(_arg1, _arg2, mask, task-&gt;parent_task);
<a name="l92"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l93"></a>sm_done:
<a name="l94"></a> </span><span class=cF5>RFlagsSet</span><span class=cF0>(old_flags);
<a name="l95"></a>
<a name="l96"></a> </span><span class=cF1>return</span><span class=cF0> res;
<a name="l97"></a>}
<a name="l98"></a>
<a name="l99"></a></span><span class=cF9>I64</span><span class=cF0> </span><span class=cF5>FlushMessages</span><span class=cF0>(</span><span class=cF9>CTask</span><span class=cF0> *task=</span><span class=cF3>NULL</span><span class=cF0>)
<a name="l100"></a>{</span><span class=cF2>//Throw away all messages. Return count.</span><span class=cF0>
<a name="l101"></a> </span><span class=cF9>I64</span><span class=cF0> res = </span><span class=cFE>0</span><span class=cF0>, arg1, arg2;
<a name="l102"></a>
<a name="l103"></a> </span><span class=cF1>while</span><span class=cF0> (</span><span class=cF5>MessageScan</span><span class=cF7>(</span><span class=cF0>&amp;arg1, &amp;arg2, ~</span><span class=cFE>1</span><span class=cF0>, task</span><span class=cF7>)</span><span class=cF0>)
<a name="l104"></a> res++;
<a name="l105"></a>
<a name="l106"></a> </span><span class=cF1>return</span><span class=cF0> res;
<a name="l107"></a>}
<a name="l108"></a>
<a name="l109"></a></span><span class=cF9>I64</span><span class=cF0> </span><span class=cF5>MessageGet</span><span class=cF0>(</span><span class=cF9>I64</span><span class=cF0> *_arg1=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF9>I64</span><span class=cF0> *_arg2=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF9>I64</span><span class=cF0> mask=~</span><span class=cFE>1</span><span class=cF0>, </span><span class=cF9>CTask</span><span class=cF0> *task=</span><span class=cF3>NULL</span><span class=cF0>)
<a name="l110"></a>{</span><span class=cF2>//Wait for a message of type specified by a one in the mask.</span><span class=cF0>
<a name="l111"></a></span><span class=cF2>//Throw-out all messages not in mask.</span><span class=cF0>
<a name="l112"></a> </span><span class=cF2>//Returns </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l3886"><span class=cF4>message_code</span></a><span class=cF2>. See </span><a href="https://zeal-operating-system.github.io/ZealOS/Demo/MessageLoop.CC.html#l1"><span class=cF4>::/Demo/MessageLoop.CC</span></a><span class=cF2>.</span><span class=cF0>
<a name="l113"></a> </span><span class=cF9>I64</span><span class=cF0> res;
<a name="l114"></a>
<a name="l115"></a> </span><span class=cF1>if</span><span class=cF0> (!task)
<a name="l116"></a> task = </span><span class=cF5>Fs</span><span class=cF0>;
<a name="l117"></a> </span><span class=cF5>LBtr</span><span class=cF0>(&amp;task-&gt;task_flags, </span><span class=cF3>TASKf_IDLE</span><span class=cF0>);
<a name="l118"></a> </span><span class=cF1>while</span><span class=cF0> (!</span><span class=cF7>(</span><span class=cF0>res = </span><span class=cF5>MessageScan</span><span class=cF0>(_arg1, _arg2, mask, task)</span><span class=cF7>)</span><span class=cF0>)
<a name="l119"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l120"></a> </span><span class=cF5>LBts</span><span class=cF0>(&amp;task-&gt;task_flags, </span><span class=cF3>TASKf_IDLE</span><span class=cF0>);
<a name="l121"></a> </span><span class=cF5>Yield</span><span class=cF0>;
<a name="l122"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l123"></a> </span><span class=cF5>LBtr</span><span class=cF0>(&amp;task-&gt;task_flags, </span><span class=cF3>TASKf_IDLE</span><span class=cF0>);
<a name="l124"></a>
<a name="l125"></a> </span><span class=cF1>return</span><span class=cF0> res;
<a name="l126"></a>}
<a name="l127"></a>
<a name="l128"></a></span><span class=cF9>I64</span><span class=cF0> </span><span class=cF5>CharScan</span><span class=cF0>()
<a name="l129"></a>{</span><span class=cF2>//Checks for </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l3887"><span class=cF4>MESSAGE_KEY_DOWN</span></a><span class=cF2> and returns 0 immediately if no key.</span><span class=cF0>
<a name="l130"></a></span><span class=cF2>//Waits for </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l3888"><span class=cF4>MESSAGE_KEY_UP</span></a><span class=cF2> of non-zero </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4136"><span class=cF4>ASCII</span></a><span class=cF2> key and returns </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4136"><span class=cF4>ASCII</span></a><span class=cF2> if key.</span><span class=cF0>
<a name="l131"></a> </span><span class=cF2>//</span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/SerialDev/Message.CC.html#l42"><span class=cF4>MessageScan</span></a><span class=cF2>() throws away other message types.</span><span class=cF0>
<a name="l132"></a> </span><span class=cF9>I64</span><span class=cF0> arg1a, arg2a, arg1b, arg2b;
<a name="l133"></a>
<a name="l134"></a> </span><span class=cF1>if</span><span class=cF0> (!</span><span class=cF5>MessageScan</span><span class=cF7>(</span><span class=cF0>&amp;arg1a, &amp;arg2a, </span><span class=cFE>1</span><span class=cF0> &lt;&lt; </span><span class=cF3>MESSAGE_KEY_DOWN</span><span class=cF7>)</span><span class=cF0> || !arg1a)
<a name="l135"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cFE>0</span><span class=cF0>;
<a name="l136"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l137"></a> </span><span class=cF1>do</span><span class=cF0> </span><span class=cF5>MessageGet</span><span class=cF0>(&amp;arg1b, &amp;arg2b, </span><span class=cFE>1</span><span class=cF0> &lt;&lt; </span><span class=cF3>MESSAGE_KEY_UP</span><span class=cF0>);
<a name="l138"></a> </span><span class=cF1>while</span><span class=cF0> (!arg1b); </span><span class=cF2>//Be careful of </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4210"><span class=cF4>SC_SHIFT</span></a><span class=cF2> and </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4211"><span class=cF4>SC_CTRL</span></a><span class=cF2>, etc.</span><span class=cF0>
<a name="l139"></a>
<a name="l140"></a> </span><span class=cF1>return</span><span class=cF0> arg1a;
<a name="l141"></a>}
<a name="l142"></a>
<a name="l143"></a></span><span class=cF1>Bool</span><span class=cF0> </span><span class=cF5>KeyScan</span><span class=cF0>(</span><span class=cF9>I64</span><span class=cF0> *_ch=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF9>I64</span><span class=cF0> *_scan_code=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF1>Bool</span><span class=cF0> echo=</span><span class=cF3>FALSE</span><span class=cF0>)
<a name="l144"></a>{</span><span class=cF2>//Checks for </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l3887"><span class=cF4>MESSAGE_KEY_DOWN</span></a><span class=cF2> and returns FALSE immediately if no key.</span><span class=cF0>
<a name="l145"></a></span><span class=cF2>//Sets </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4136"><span class=cF4>ASCII</span></a><span class=cF2> and </span><a href="https://zeal-operating-system.github.io/ZealOS/Doc/CharOverview.DD.html#l1"><span class=cF4>scan_code</span></a><span class=cF2>.</span><span class=cF0>
<a name="l146"></a> </span><span class=cF2>//Removes key message and returns TRUE.</span><span class=cF0>
<a name="l147"></a> </span><span class=cF2>//</span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/SerialDev/Message.CC.html#l42"><span class=cF4>MessageScan</span></a><span class=cF2>() throws away other message types.</span><span class=cF0>
<a name="l148"></a> </span><span class=cF9>I64</span><span class=cF0> ch = </span><span class=cFE>0</span><span class=cF0>, sc = </span><span class=cFE>0</span><span class=cF0>;
<a name="l149"></a>
<a name="l150"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>MessageScan</span><span class=cF7>(</span><span class=cF0>&amp;ch, &amp;sc, </span><span class=cFE>1</span><span class=cF0> &lt;&lt; </span><span class=cF3>MESSAGE_KEY_DOWN</span><span class=cF7>)</span><span class=cF0>)
<a name="l151"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l152"></a> </span><span class=cF1>if</span><span class=cF0> (_ch)
<a name="l153"></a> *_ch = ch;
<a name="l154"></a> </span><span class=cF1>if</span><span class=cF0> (_scan_code)
<a name="l155"></a> *_scan_code = sc;
<a name="l156"></a> </span><span class=cF1>if</span><span class=cF0> (echo)
<a name="l157"></a> </span><span class=cF5>PutKey</span><span class=cF0>(ch, sc);
<a name="l158"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>TRUE</span><span class=cF0>;
<a name="l159"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l160"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l161"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l162"></a> </span><span class=cF1>if</span><span class=cF0> (_ch)
<a name="l163"></a> *_ch = </span><span class=cFE>0</span><span class=cF0>;
<a name="l164"></a> </span><span class=cF1>if</span><span class=cF0> (_scan_code)
<a name="l165"></a> *_scan_code = </span><span class=cFE>0</span><span class=cF0>;
<a name="l166"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>FALSE</span><span class=cF0>;
<a name="l167"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l168"></a>}
<a name="l169"></a>
<a name="l170"></a></span><span class=cF9>I64</span><span class=cF0> </span><span class=cF5>KeyGet</span><span class=cF0>(</span><span class=cF9>I64</span><span class=cF0> *_scan_code=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF1>Bool</span><span class=cF0> echo=</span><span class=cF3>FALSE</span><span class=cF0>, </span><span class=cF1>Bool</span><span class=cF0> raw_cursor=</span><span class=cF3>FALSE</span><span class=cF0>)
<a name="l171"></a>{</span><span class=cF2>//Waits for </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l3887"><span class=cF4>MESSAGE_KEY_DOWN</span></a><span class=cF2> message and returns </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4136"><span class=cF4>ASCII</span></a><span class=cF2>.</span><span class=cF0>
<a name="l172"></a></span><span class=cF2>//Sets </span><a href="https://zeal-operating-system.github.io/ZealOS/Doc/CharOverview.DD.html#l1"><span class=cF4>scan_code</span></a><span class=cF2>.</span><span class=cF0>
<a name="l173"></a> </span><span class=cF2>//</span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/SerialDev/Message.CC.html#l143"><span class=cF4>KeyScan</span></a><span class=cF2>() throws away other message types.</span><span class=cF0>
<a name="l174"></a> </span><span class=cF9>I64</span><span class=cF0> ch, sc;
<a name="l175"></a> </span><span class=cF1>Bool</span><span class=cF0> cursor_on = </span><span class=cF3>FALSE</span><span class=cF0>;
<a name="l176"></a>
<a name="l177"></a> </span><span class=cF1>while</span><span class=cF0> (!</span><span class=cF5>KeyScan</span><span class=cF7>(</span><span class=cF0>&amp;ch, &amp;sc, </span><span class=cF3>FALSE</span><span class=cF7>)</span><span class=cF0>)
<a name="l178"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l179"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>IsRaw</span><span class=cF0> &amp;&amp; raw_cursor)
<a name="l180"></a> {
<a name="l181"></a> </span><span class=cF1>if</span><span class=cF0> (!cursor_on &amp;&amp; </span><span class=cF5>ToI64</span><span class=cF7>(</span><span class=cF5>TSCGet</span><span class=cF0> * </span><span class=cFE>5</span><span class=cF0> / </span><span class=cFB>counts</span><span class=cF0>.time_stamp_freq</span><span class=cF7>)</span><span class=cF0> &amp; </span><span class=cFE>1</span><span class=cF0>)
<a name="l182"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l183"></a> </span><span class=cF6>'.'</span><span class=cF0>;
<a name="l184"></a> cursor_on = </span><span class=cF3>TRUE</span><span class=cF0>;
<a name="l185"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l186"></a> </span><span class=cF1>else</span><span class=cF0> </span><span class=cF1>if</span><span class=cF0> (cursor_on &amp;&amp; !</span><span class=cF7>(</span><span class=cF5>ToI64</span><span class=cF0>(</span><span class=cF5>TSCGet</span><span class=cF0> * </span><span class=cFE>5</span><span class=cF0> / </span><span class=cFB>counts</span><span class=cF0>.time_stamp_freq) &amp; </span><span class=cFE>1</span><span class=cF7>)</span><span class=cF0>)
<a name="l187"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l188"></a> </span><span class=cF6>''</span><span class=cF0> </span><span class=cF3>CH_BACKSPACE</span><span class=cF0>;
<a name="l189"></a> cursor_on = </span><span class=cF3>FALSE</span><span class=cF0>;
<a name="l190"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l191"></a> }
<a name="l192"></a> </span><span class=cF5>LBts</span><span class=cF0>(&amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;task_flags, </span><span class=cF3>TASKf_IDLE</span><span class=cF0>);
<a name="l193"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>IsDebugMode</span><span class=cF0>)
<a name="l194"></a> {
<a name="l195"></a></span><span class=cF2>//We don't want interrupt-driven keyboard when in debugger</span><span class=cF0>
<a name="l196"></a> </span><span class=cF2>//because that could have side-effects or crash, so we poll</span><span class=cF0>
<a name="l197"></a> </span><span class=cF2>//keyboard when in debugger with interrupts off.</span><span class=cF0>
<a name="l198"></a> </span><span class=cF1>PUSHFD</span><span class=cF0>
<a name="l199"></a> </span><span class=cF1>CLI</span><span class=cF0>
<a name="l200"></a> </span><span class=cF5>KbdMouseHandler</span><span class=cF0>(</span><span class=cF3>TRUE</span><span class=cF0>, </span><span class=cF3>FALSE</span><span class=cF0>);
<a name="l201"></a> </span><span class=cF5>KbdMessagesQueue</span><span class=cF0>;
<a name="l202"></a> </span><span class=cF1>POPFD</span><span class=cF0>
<a name="l203"></a> }
<a name="l204"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l205"></a> {
<a name="l206"></a> </span><span class=cF5>LBts</span><span class=cF0>(&amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;task_flags, </span><span class=cF3>TASKf_AWAITING_MESSAGE</span><span class=cF0>);
<a name="l207"></a> </span><span class=cF5>Yield</span><span class=cF0>;
<a name="l208"></a> }
<a name="l209"></a> </span><span class=cF5>LBtr</span><span class=cF0>(&amp;</span><span class=cF5>Fs</span><span class=cF0>-&gt;task_flags, </span><span class=cF3>TASKf_IDLE</span><span class=cF0>);
<a name="l210"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l211"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>IsRaw</span><span class=cF0> &amp;&amp; raw_cursor &amp;&amp; cursor_on)
<a name="l212"></a> </span><span class=cF6>''</span><span class=cF0> </span><span class=cF3>CH_BACKSPACE</span><span class=cF0>;
<a name="l213"></a> </span><span class=cF1>if</span><span class=cF0> (echo)
<a name="l214"></a> </span><span class=cF5>PutKey</span><span class=cF0>(ch, sc);
<a name="l215"></a> </span><span class=cF1>if</span><span class=cF0> (_scan_code)
<a name="l216"></a> *_scan_code = sc;
<a name="l217"></a> </span><span class=cF1>return</span><span class=cF0> ch;
<a name="l218"></a>}
<a name="l219"></a>
<a name="l220"></a></span><span class=cF9>I64</span><span class=cF0> </span><span class=cF5>CharGet</span><span class=cF0>(</span><span class=cF9>I64</span><span class=cF0> *_scan_code=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF1>Bool</span><span class=cF0> echo=</span><span class=cF3>TRUE</span><span class=cF0>, </span><span class=cF1>Bool</span><span class=cF0> raw_cursor=</span><span class=cF3>FALSE</span><span class=cF0>)
<a name="l221"></a>{</span><span class=cF2>//Waits for non-zero </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4136"><span class=cF4>ASCII</span></a><span class=cF2> key.</span><span class=cF0>
<a name="l222"></a></span><span class=cF2>//Sets </span><a href="https://zeal-operating-system.github.io/ZealOS/Doc/CharOverview.DD.html#l1"><span class=cF4>scan_code</span></a><span class=cF2>.</span><span class=cF0>
<a name="l223"></a> </span><span class=cF9>I64</span><span class=cF0> ch1;
<a name="l224"></a>
<a name="l225"></a> </span><span class=cF1>do</span><span class=cF0> ch1 = </span><span class=cF5>KeyGet</span><span class=cF0>(_scan_code, </span><span class=cF3>FALSE</span><span class=cF0>, raw_cursor);
<a name="l226"></a> </span><span class=cF1>while</span><span class=cF0> (!ch1);
<a name="l227"></a> </span><span class=cF1>if</span><span class=cF0> (echo)
<a name="l228"></a> </span><span class=cF6>&quot;$PT$%c$FG$&quot;</span><span class=cF0>, ch1;
<a name="l229"></a>
<a name="l230"></a> </span><span class=cF1>return</span><span class=cF0> ch1;
<a name="l231"></a>}
<a name="l232"></a>
<a name="l233"></a></span><span class=cF1>U8</span><span class=cF0> *</span><span class=cF5>StrGet</span><span class=cF0>(</span><span class=cF1>U8</span><span class=cF0> *message=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF1>U8</span><span class=cF0> *</span><span class=cF1>default</span><span class=cF0>=</span><span class=cF3>NULL</span><span class=cF0>, </span><span class=cF9>I64</span><span class=cF0> flags=</span><span class=cF3>NONE</span><span class=cF0>)
<a name="l234"></a>{</span><span class=cF2>//Returns a </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/Memory/MAllocFree.CC.html#l391"><span class=cF4>MAlloc</span></a><span class=cF2>()ed prompted string. See </span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l4371"><span class=cF4>Flags</span></a><span class=cF2>.</span><span class=cF0>
<a name="l235"></a> </span><span class=cF1>U8</span><span class=cF0> *st;
<a name="l236"></a>
<a name="l237"></a> </span><span class=cF1>if</span><span class=cF0> (message)
<a name="l238"></a> </span><span class=cF6>&quot;&quot;</span><span class=cF0> message, </span><span class=cF1>default</span><span class=cF0>;
<a name="l239"></a> st = (*</span><span class=cFB>fp_getstr2</span><span class=cF0>)(flags);
<a name="l240"></a> </span><span class=cF1>if</span><span class=cF0> (!*st)
<a name="l241"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l242"></a> </span><span class=cF5>Free</span><span class=cF0>(st);
<a name="l243"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF1>default</span><span class=cF0>)
<a name="l244"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF5>StrNew</span><span class=cF0>(</span><span class=cF1>default</span><span class=cF0>);
<a name="l245"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l246"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF5>StrNew</span><span class=cF0>(</span><span class=cF6>&quot;&quot;</span><span class=cF0>);
<a name="l247"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l248"></a> </span><span class=cF1>return</span><span class=cF0> st;
<a name="l249"></a>}
<a name="l250"></a>
<a name="l251"></a></span><span class=cF9>I64</span><span class=cF0> </span><span class=cF5>StrNGet</span><span class=cF0>(</span><span class=cF1>U8</span><span class=cF0> *buf, </span><span class=cF9>I64</span><span class=cF0> size, </span><span class=cF1>Bool</span><span class=cF0> allow_ext=</span><span class=cF3>TRUE</span><span class=cF0>)
<a name="l252"></a>{</span><span class=cF2>//Prompt into fixed length string. Size must include terminator.</span><span class=cF0>
<a name="l253"></a> </span><span class=cF1>U8</span><span class=cF0> *st;
<a name="l254"></a> </span><span class=cF9>I64</span><span class=cF0> ch, i = </span><span class=cFE>0</span><span class=cF0>;
<a name="l255"></a>
<a name="l256"></a> </span><span class=cF1>if</span><span class=cF0> (!size || !buf)
<a name="l257"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cFE>0</span><span class=cF0>;
<a name="l258"></a> </span><span class=cF1>if</span><span class=cF0> (allow_ext)
<a name="l259"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l260"></a> st = </span><span class=cF5>StrGet</span><span class=cF0>;
<a name="l261"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>StrLen</span><span class=cF7>(</span><span class=cF0>st</span><span class=cF7>)</span><span class=cF0> &gt; size - </span><span class=cFE>1</span><span class=cF0>)
<a name="l262"></a> {
<a name="l263"></a> </span><span class=cF5>MemCopy</span><span class=cF0>(buf, st, size - </span><span class=cFE>1</span><span class=cF0>);
<a name="l264"></a> buf[size - </span><span class=cFE>1</span><span class=cF0>] = </span><span class=cFE>0</span><span class=cF0>;
<a name="l265"></a> }
<a name="l266"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l267"></a> </span><span class=cF5>StrCopy</span><span class=cF0>(buf, st);
<a name="l268"></a> i = </span><span class=cF5>StrLen</span><span class=cF0>(buf);
<a name="l269"></a> </span><span class=cF5>Free</span><span class=cF0>(st);
<a name="l270"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l271"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l272"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l273"></a> </span><span class=cF1>while</span><span class=cF0> (</span><span class=cF3>TRUE</span><span class=cF0>)
<a name="l274"></a> {
<a name="l275"></a> ch = </span><span class=cF5>CharGet</span><span class=cF0>(, </span><span class=cF3>FALSE</span><span class=cF0>, </span><span class=cF5>IsDebugMode</span><span class=cF0>);
<a name="l276"></a> </span><span class=cF1>if</span><span class=cF0> (ch == </span><span class=cF6>'\n'</span><span class=cF0>)
<a name="l277"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l278"></a> </span><span class=cF6>''</span><span class=cF0> ch;
<a name="l279"></a> </span><span class=cF1>break</span><span class=cF0>;
<a name="l280"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l281"></a> </span><span class=cF1>else</span><span class=cF0> </span><span class=cF1>if</span><span class=cF0> (ch == </span><span class=cF3>CH_BACKSPACE</span><span class=cF0>)
<a name="l282"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l283"></a> </span><span class=cF1>if</span><span class=cF0> (i &gt; </span><span class=cFE>0</span><span class=cF0>)
<a name="l284"></a> {
<a name="l285"></a> i--;
<a name="l286"></a> </span><span class=cF6>''</span><span class=cF0> ch;
<a name="l287"></a> }
<a name="l288"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l289"></a> </span><span class=cF1>else</span><span class=cF0>
<a name="l290"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l291"></a> </span><span class=cF1>if</span><span class=cF0> (i &lt; size - </span><span class=cFE>1</span><span class=cF0>)
<a name="l292"></a> {
<a name="l293"></a> buf[i++] = ch;
<a name="l294"></a> </span><span class=cF6>''</span><span class=cF0> ch;
<a name="l295"></a> }
<a name="l296"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l297"></a> }
<a name="l298"></a> buf[i] = </span><span class=cFE>0</span><span class=cF0>;
<a name="l299"></a> </span><span class=cF7>}</span><span class=cF0>
<a name="l300"></a> </span><span class=cF1>return</span><span class=cF0> i;
<a name="l301"></a>}
</span></pre></body>
</html>