+ assertEquals("0000", am2901.getDirectly(r), r.name());\r
+ }));\r
+ }\r
+\r
+ @Order(4)\r
+ @Test\r
+ void testADD()\r
+ {\r
+ am2901.setSrc(DA);\r
+ am2901.setFunc(ADD);\r
+ am2901.setDest(NOP);\r
+ am2901.setReg_A(r0.toBitString());\r
+\r
+ assertAll(getAll4BitPairs().map(xy -> () ->\r
+ {\r
+ am2901.setDirectly(r0, to4bitBin(xy.x));\r
+ am2901.setD(to4bitBin(xy.y));\r
+\r
+ am2901.assertFullCycleSuccess();\r
+\r
+ int res32Bit = xy.x + xy.y;\r
+ int res4Bit = res32Bit & 0b1111;\r
+ int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y);\r
+ int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);\r
+\r
+ String desc = xy.x + " + " + xy.y + " = " + res4Bit + ": ";\r
+\r
+ assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");\r
+ assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");\r
+ assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");\r
+ assertEquals(to1bitBin(res32Bit & 0b1_0000), am2901.getCarryOut(), desc + "Cn+4");\r
+ assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");\r
+ }));\r
+ }\r
+\r
+ @Order(4)\r
+ @Test\r
+ void testAND()\r
+ {\r
+ am2901.setSrc(DA);\r
+ am2901.setFunc(AND);\r
+ am2901.setDest(NOP);\r
+ am2901.setReg_A(r0.toBitString());\r
+\r
+ assertAll(getAll4BitPairs().map(xy -> () ->\r
+ {\r
+ am2901.setDirectly(r0, to4bitBin(xy.x));\r
+ am2901.setD(to4bitBin(xy.y));\r
+\r
+ am2901.assertFullCycleSuccess();\r
+\r
+ int res32Bit = xy.x & xy.y;\r
+\r
+ String desc = xy.x + " & " + xy.y + " = " + res32Bit + ": ";\r
+\r
+ assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
+ assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
+ assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
+// assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
+// assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), desc + "OVR"); // TODO\r
+ }));\r
+ }\r
+\r
+ @Order(4)\r
+ @Test\r
+ void testOR()\r
+ {\r
+ am2901.setSrc(DA);\r
+ am2901.setFunc(OR);\r
+ am2901.setDest(NOP);\r
+ am2901.setReg_A(r0.toBitString());\r
+\r
+ assertAll(getAll4BitPairs().map(xy -> () ->\r
+ {\r
+ am2901.setDirectly(r0, to4bitBin(xy.x));\r
+ am2901.setD(to4bitBin(xy.y));\r
+\r
+ am2901.assertFullCycleSuccess();\r
+\r
+ int res32Bit = xy.x | xy.y;\r
+\r
+ String desc = xy.x + " | " + xy.y + " = " + res32Bit + ": ";\r
+\r
+ assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
+ assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
+ assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
+// assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
+// assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO\r
+ }));\r
+ }\r
+\r
+ @Order(4)\r
+ @Test\r
+ void testXOR()\r
+ {\r
+ am2901.setSrc(DA);\r
+ am2901.setFunc(EXOR);\r
+ am2901.setDest(NOP);\r
+ am2901.setReg_A(r0.toBitString());\r
+\r
+ assertAll(getAll4BitPairs().map(xy -> () ->\r
+ {\r
+ am2901.setDirectly(r0, to4bitBin(xy.x));\r
+ am2901.setD(to4bitBin(xy.y));\r
+\r
+ am2901.assertFullCycleSuccess();\r
+\r
+ int res32Bit = xy.x ^ xy.y;\r
+\r
+ String desc = xy.x + " ^ " + xy.y + " = " + res32Bit + ": ";\r
+\r
+ assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
+ assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
+ assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
+// assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
+// assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO\r
+ }));\r
+ }\r
+\r
+ @Order(4)\r
+ @Test\r
+ void testSUB()\r
+ {\r
+ am2901.setSrc(DA);\r
+ am2901.setCarryIn("1");\r
+ am2901.setFunc(SUBR);\r
+ am2901.setDest(NOP);\r
+ am2901.setReg_A(r0.toBitString());\r
+\r
+ assertAll(getAll4BitPairs().map(xy -> () ->\r
+ {\r
+ am2901.setDirectly(r0, to4bitBin(xy.x));\r
+ am2901.setD(to4bitBin(xy.y));\r
+\r
+ am2901.assertFullCycleSuccess();\r
+\r
+ int res32Bit = xy.x - xy.y;\r
+ int res4Bit = res32Bit & 0b1111;\r
+ int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y);\r
+ int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);\r
+\r
+ String desc = xy.x + " - " + xy.y + " = " + res4Bit + ": ";\r
+\r
+ assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");\r
+ assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");\r
+ assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");\r
+ assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), desc + "Cn+4");\r
+ assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");\r
+ }));\r
+ }\r
+\r
+ static Stream<Point> getAll4BitPairs()\r
+ {\r
+ return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y)));\r