ZealOS/docs/Demo/Asm/MulByHand.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

99 lines
9.6 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=cF2>/*When Terry Davis was a kid with a Commodore 64,</span><span class=cF0>
<a name="l2"></a></span><span class=cF2>the 6502 chip had no multiply instruction</span><span class=cF0>
<a name="l3"></a></span><span class=cF2>and this is how he had to do it, except,</span><span class=cF0>
<a name="l4"></a></span><span class=cF2>he used more regs in this example.</span><span class=cF0>
<a name="l5"></a></span><span class=cF2>*/</span><span class=cF0>
<a name="l6"></a></span><span class=cF1>asm</span><span class=cF0> {
<a name="l7"></a></span><span class=cF2>//Opcodes are slightly different to make writing the x86_64 assembler easier.</span><span class=cF0>
<a name="l8"></a></span><span class=cF2>//See </span><a href="https://zeal-operating-system.github.io/ZealOS/Compiler/OpCodes.DD.html#l1"><span class=cF4>::/Compiler/OpCodes.DD</span></a><span class=cF2>.</span><span class=cF0>
<a name="l9"></a>
<a name="l10"></a></span><span class=cF2>//You can clobber RAX,RBX,RCX,RDX,R8,R9.</span><span class=cF0> </span><span class=cF2>The compiler expects that.</span><span class=cF0>
<a name="l11"></a>
<a name="l12"></a>MUL_BY_HAND_U8_U8_TO_U16: </span><span class=cF2>//This is only for fun.</span><span class=cF0>
<a name="l13"></a></span><span class=cF2>//8bit * 8bit--&gt;16bit</span><span class=cF0>
<a name="l14"></a></span><span class=cF2>//AL*BL--&gt;AX</span><span class=cF0>
<a name="l15"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>CL</span><span class=cF0>, </span><span class=cFE>8</span><span class=cF0>
<a name="l16"></a> </span><span class=cF1>SHL</span><span class=cF0> </span><span class=cFC>AX</span><span class=cF0>, </span><span class=cFE>8</span><span class=cF0>
<a name="l17"></a>@@05: </span><span class=cF1>SHL1</span><span class=cF0> </span><span class=cFC>AX</span><span class=cF0>
<a name="l18"></a> </span><span class=cF1>JNC</span><span class=cF0> @@10
<a name="l19"></a> </span><span class=cF1>ADD</span><span class=cF0> </span><span class=cFC>AL</span><span class=cF0>, </span><span class=cFC>BL</span><span class=cF0>
<a name="l20"></a>@@10: </span><span class=cF1>DEC</span><span class=cF0> </span><span class=cFC>CL</span><span class=cF0>
<a name="l21"></a> </span><span class=cF1>JNZ</span><span class=cF0> @@05
<a name="l22"></a> </span><span class=cF1>RET</span><span class=cF0>
<a name="l23"></a>
<a name="l24"></a>_MUL_BY_HAND_U8_U8_TO_U16:: </span><span class=cF2>//C callable</span><span class=cF0>
<a name="l25"></a> </span><span class=cF1>PUSH</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
<a name="l26"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>, </span><span class=cFC>RSP</span><span class=cF0>
<a name="l27"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>AL</span><span class=cF0>, </span><span class=cF1>U8</span><span class=cF0> </span><span class=cF3>SF_ARG1</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>] </span><span class=cF2>//</span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l715"><span class=cF4>SF_ARG1</span></a><span class=cF0>
<a name="l28"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>BL</span><span class=cF0>, </span><span class=cF1>U8</span><span class=cF0> </span><span class=cF3>SF_ARG2</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>]
<a name="l29"></a> </span><span class=cF1>CALL</span><span class=cF0> MUL_BY_HAND_U8_U8_TO_U16
<a name="l30"></a> </span><span class=cF1>MOVZX</span><span class=cF0> </span><span class=cFC>RAX</span><span class=cF0>, </span><span class=cFC>AX</span><span class=cF0>
<a name="l31"></a> </span><span class=cF1>POP</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
<a name="l32"></a> </span><span class=cF1>RET1</span><span class=cF0> </span><span class=cFE>16</span><span class=cF0>
<a name="l33"></a>
<a name="l34"></a>_MUL_U64_U64_TO_U128::
<a name="l35"></a></span><span class=cF2>//64bit * 64bit--&gt;128bit</span><span class=cF0>
<a name="l36"></a> </span><span class=cF1>PUSH</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
<a name="l37"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>, </span><span class=cFC>RSP</span><span class=cF0>
<a name="l38"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RBX</span><span class=cF0>, </span><span class=cF9>U64</span><span class=cF0> </span><span class=cF3>SF_ARG3</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>]
<a name="l39"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RAX</span><span class=cF0>, </span><span class=cF9>U64</span><span class=cF0> </span><span class=cF3>SF_ARG1</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>] </span><span class=cF2>//</span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l715"><span class=cF4>SF_ARG1</span></a><span class=cF0>
<a name="l40"></a> </span><span class=cF1>MUL</span><span class=cF0> </span><span class=cF9>U64</span><span class=cF0> </span><span class=cF3>SF_ARG2</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>] </span><span class=cF2>//Res RDX:RAX 128bit</span><span class=cF0>
<a name="l41"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cF9>U64</span><span class=cF0> [</span><span class=cFC>RBX</span><span class=cF0>], </span><span class=cFC>RAX</span><span class=cF0>
<a name="l42"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cF9>U64</span><span class=cF0> </span><span class=cFE>8</span><span class=cF0>[</span><span class=cFC>RBX</span><span class=cF0>], </span><span class=cFC>RDX</span><span class=cF0>
<a name="l43"></a> </span><span class=cF1>POP</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
<a name="l44"></a> </span><span class=cF1>RET1</span><span class=cF0> </span><span class=cFE>24</span><span class=cF0>
<a name="l45"></a>};
<a name="l46"></a>
<a name="l47"></a></span><span class=cF2>//The convention is to put an underscore</span><span class=cF0>
<a name="l48"></a></span><span class=cF2>//on C callable asm routines.</span><span class=cF0>
<a name="l49"></a></span><span class=cF1>_extern</span><span class=cF0> _MUL_BY_HAND_U8_U8_TO_U16 </span><span class=cF9>U16</span><span class=cF0> MulU8(</span><span class=cF1>U8</span><span class=cF0> n1, </span><span class=cF1>U8</span><span class=cF0> n2);
<a name="l50"></a>
<a name="l51"></a></span><span class=cF1>class</span><span class=cF0> U128
<a name="l52"></a>{
<a name="l53"></a> </span><span class=cF9>U64</span><span class=cF0> lo, hi;
<a name="l54"></a>};
<a name="l55"></a>
<a name="l56"></a></span><span class=cF1>_extern</span><span class=cF0> _MUL_U64_U64_TO_U128 </span><span class=cF1>U0</span><span class=cF0> MulU64(</span><span class=cF9>I64</span><span class=cF0> n1, </span><span class=cF9>I64</span><span class=cF0> n2, U128 *_prod);
<a name="l57"></a>
<a name="l58"></a></span><span class=cF1>U0</span><span class=cF0> MulByHand()
<a name="l59"></a>{
<a name="l60"></a> U128 p;
<a name="l61"></a>
<a name="l62"></a> </span><span class=cF6>&quot;2*7 =0x%X\n&quot;</span><span class=cF0>, MulU8(</span><span class=cFE>2</span><span class=cF0>, </span><span class=cFE>7</span><span class=cF0>);
<a name="l63"></a> </span><span class=cF6>&quot;100*10=0x%X\n&quot;</span><span class=cF0>, MulU8(</span><span class=cFE>100</span><span class=cF0>, </span><span class=cFE>10</span><span class=cF0>);
<a name="l64"></a>
<a name="l65"></a> MulU64(</span><span class=cFE>0x0123456789ABCDEF</span><span class=cF0>, </span><span class=cFE>0x1000001</span><span class=cF0>, &amp;p);
<a name="l66"></a> </span><span class=cF6>&quot;0x0123466789ABCDEF*0x1000001=0x%016X%016X\n&quot;</span><span class=cF0>, p.hi, p.lo;
<a name="l67"></a>}
<a name="l68"></a>
<a name="l69"></a>MulByHand;
<a name="l70"></a>
</span></pre></body>
</html>