X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ships%2FAlu2.ship;h=622be27c8691b32b186220bf466357d707e8d1c0;hb=d971e2733b9bea4fa05eb23f571f9d8cc64d4d30;hp=ea5ffcb72636f751772889cead82d895c61942b2;hpb=e08c2568f78893d1930618034e7e85b3f5d261c6;p=fleet.git diff --git a/ships/Alu2.ship b/ships/Alu2.ship index ea5ffcb..622be27 100644 --- a/ships/Alu2.ship +++ b/ships/Alu2.ship @@ -10,10 +10,8 @@ data out: out == Constants ======================================================== ADD: add the two arguments; treat link as carry SUB: subtract the two arguments; treat link as carry -REM: MAX: MIN: -SORT: output min(in1,in2) followed by max(in1,in2) (FIXME: redundant?) == TeX ============================================================== This ship is a two-input arithmetic unit. It features several @@ -24,29 +22,40 @@ FIXME: implement all the link bit stuff Use carry-in bit to create a selector? Perhaps a waste of an ALU. -Carry-save / carry completion stuff. - Flags: zero, negative, overflow, ? +\begin{verbatim} move elsewhere: //MUL: //DIV: //MOD: +\end{verbatim} == Fleeterpreter ==================================================== +public long resolveLiteral(String literal) { + if (literal.equals("ADD")) return 0; + if (literal.equals("SUB")) return 1; + if (literal.equals("MAX")) return 2; + if (literal.equals("MIN")) return 3; + return super.resolveLiteral(literal); +} public void service() { if (box_in1.dataReadyForShip() && box_in2.dataReadyForShip() && box_inOp.dataReadyForShip() && - box_out.readyForItemFromShip()) { - int a = box_in1.removeDataForShip(); - int b = box_in2.removeDataForShip(); - int op = box_inOp.removeDataForShip(); - switch(op) { + box_out.readyForDataFromShip()) { + long a = box_in1.removeDataForShip(); + long b = box_in2.removeDataForShip(); + long op = box_inOp.removeDataForShip(); + switch((int)op) { case 0: box_out.addDataFromShip(a+b); // ADD break; case 1: box_out.addDataFromShip(a-b); // SUB break; + case 2: box_out.addDataFromShip(Math.max(a,b)); // MAX + break; + case 3: box_out.addDataFromShip(Math.min(a,b)); // MIN + break; default: box_out.addDataFromShip(0); break; } @@ -79,6 +88,8 @@ public void service() { case (reg_op) 0: out_d = reg_a + reg_b; 1: out_d = reg_a - reg_b; + 2: out_d = reg_a > reg_b ? reg_a : reg_b; + 3: out_d = reg_a > reg_b ? reg_b : reg_a; default: out_d = 0; endcase `onwrite(out_r, out_a)