UNPKG

mz700-js

Version:
544 lines (535 loc) 25.1 kB
describe("REGISTER", ()=>{ const UnitTest = require("./lib/UnitTest"); const Z80_Register = require('../Z80/register'); var tests = [ function () { var reg = new Z80_Register(); UnitTest.report("initial value of B", reg.getB() == 0); UnitTest.report("initial value of C", reg.getC() == 0); UnitTest.report("initial value of D", reg.getD() == 0); UnitTest.report("initial value of E", reg.getE() == 0); UnitTest.report("initial value of H", reg.getH() == 0); UnitTest.report("initial value of L", reg.getL() == 0); UnitTest.report("initial value of A", reg.getA() == 0); UnitTest.report("initial value of F", reg.getF() == 0); UnitTest.report("initial value of PC", reg.PC == 0); UnitTest.report("initial value of SP", reg.SP == 0); UnitTest.report("initial value of IX", reg.IX == 0); UnitTest.report("initial value of IY", reg.IY == 0); UnitTest.report("initial value of R", reg.R == 0); UnitTest.report("initial value of I", reg.I == 0); }, function () { var reg = new Z80_Register(); var i = 0; reg.setB(0x55 + i++); reg.setC(0x55 + i++); reg.setD(0x55 + i++); reg.setE(0x55 + i++); reg.setH(0x55 + i++); reg.setL(0x55 + i++); reg.setA(0x55 + i++); reg.setF(0x55 + i++); reg.PC = 0x55 + i++; reg.SP = 0x55 + i++; reg.IX = 0x55 + i++; reg.IY = 0x55 + i++; reg.R = 0x55 + i++; reg.I = 0x55 + i++; var reg2 = new Z80_Register(); reg2.setFrom(reg); i = 0; UnitTest.report("set value of B", reg2.getB() == 0x55 + i++); UnitTest.report("set value of C", reg2.getC() == 0x55 + i++); UnitTest.report("set value of D", reg2.getD() == 0x55 + i++); UnitTest.report("set value of E", reg2.getE() == 0x55 + i++); UnitTest.report("set value of H", reg2.getH() == 0x55 + i++); UnitTest.report("set value of L", reg2.getL() == 0x55 + i++); UnitTest.report("set value of A", reg2.getA() == 0x55 + i++); UnitTest.report("set value of F", reg2.getF() == 0x55 + i++); UnitTest.report("set value of PC", reg2.PC == 0x55 + i++); UnitTest.report("set value of SP", reg2.SP == 0x55 + i++); UnitTest.report("set value of IX", reg2.IX == 0x55 + i++); UnitTest.report("set value of IY", reg2.IY == 0x55 + i++); UnitTest.report("set value of R", reg2.R == 0x55 + i++); UnitTest.report("set value of I", reg2.I == 0x55 + i++); }, function () { var reg = new Z80_Register(); var i = 0; reg.setB(0x55 + i++); reg.setC(0x55 + i++); reg.setD(0x55 + i++); reg.setE(0x55 + i++); reg.setH(0x55 + i++); reg.setL(0x55 + i++); reg.setA(0x55 + i++); reg.setF(0x55 + i++); reg.PC = 0x55 + i++; reg.SP = 0x55 + i++; reg.IX = 0x55 + i++; reg.IY = 0x55 + i++; reg.R = 0x55 + i++; reg.I = 0x55 + i++; reg.clear(); UnitTest.report("cleared value of B", reg.getB() == 0); UnitTest.report("cleared value of C", reg.getC() == 0); UnitTest.report("cleared value of D", reg.getD() == 0); UnitTest.report("cleared value of E", reg.getE() == 0); UnitTest.report("cleared value of H", reg.getH() == 0); UnitTest.report("cleared value of L", reg.getL() == 0); UnitTest.report("cleared value of A", reg.getA() == 0); UnitTest.report("cleared value of F", reg.getF() == 0); UnitTest.report("cleared value of PC", reg.PC == 0); UnitTest.report("cleared value of SP", reg.SP == 0); UnitTest.report("cleared value of IX", reg.IX == 0); UnitTest.report("cleared value of IY", reg.IY == 0); UnitTest.report("cleared value of R", reg.R == 0); UnitTest.report("cleared value of I", reg.I == 0); }, function() { var reg = new Z80_Register(); reg.clear(); reg.setA( 0 ); reg.NEG(); UnitTest.report("NEG 0 A", reg.getA() == 0x00); UnitTest.report("NEG 0 flagZ", reg.flagZ() == true); UnitTest.report("NEG 0 flagS", reg.flagS() == false); UnitTest.report("NEG 0 flagC", reg.flagC() == false); reg.setA( 1 ); reg.NEG(); UnitTest.report("NEG 1 A", reg.getA() == 0xff); UnitTest.report("NEG 1 flagZ", reg.flagZ() == false); UnitTest.report("NEG 1 flagS", reg.flagS() == true); UnitTest.report("NEG 1 flagC", reg.flagC() == true); reg.setA( 0xff ); reg.NEG(); UnitTest.report("NEG 0xff A", reg.getA() == 0x01); UnitTest.report("NEG 0xff flagZ", reg.flagZ() == false); UnitTest.report("NEG 0xff flagS", reg.flagS() == false); UnitTest.report("NEG 0xff flagC", reg.flagC() == true); }, function() { var reg = new Z80_Register(); reg.clear(); reg.setA( 0 ); reg.addAcc(0); UnitTest.report("addAcc 0+0 A", reg.getA() == 0x00); UnitTest.report("addAcc 0+0 flagZ", reg.flagZ() == true); UnitTest.report("addAcc 0+0 flagS", reg.flagS() == false); UnitTest.report("addAcc 0+0 flagC", reg.flagC() == false); reg.setA( 0 ); reg.addAcc(1); UnitTest.report("addAcc 0+1 A", reg.getA() == 0x01); UnitTest.report("addAcc 0+1 flagZ", reg.flagZ() == false); UnitTest.report("addAcc 0+1 flagS", reg.flagS() == false); UnitTest.report("addAcc 0+1 flagC", reg.flagC() == false); reg.setA( 126 ); reg.addAcc(1); UnitTest.report("addAcc 126+1 A", reg.getA() == 127); UnitTest.report("addAcc 0+1 flagZ", reg.flagZ() == false); UnitTest.report("addAcc 0+1 flagS", reg.flagS() == false); UnitTest.report("addAcc 0+1 flagC", reg.flagC() == false); reg.setA( 126 ); reg.addAcc(2); UnitTest.report("addAcc 126+2 A", reg.getA() == 128); UnitTest.report("addAcc 126+2 flagZ", reg.flagZ() == false); UnitTest.report("addAcc 126+2 flagS", reg.flagS() == true); UnitTest.report("addAcc 126+2 flagC", reg.flagC() == false); reg.setA( 126 ); reg.addAcc(130); UnitTest.report("addAcc 126+130 A", reg.getA() == 0); UnitTest.report("addAcc 126+130 flagZ", reg.flagZ() == true); UnitTest.report("addAcc 126+130 flagS", reg.flagS() == false); UnitTest.report("addAcc 126+130 flagC", reg.flagC() == true); reg.setA( 126 ); reg.addAcc(131); UnitTest.report("addAcc 126+131 A", reg.getA() == 1); UnitTest.report("addAcc 126+131 flagZ", reg.flagZ() == false); UnitTest.report("addAcc 126+131 flagS", reg.flagS() == false); UnitTest.report("addAcc 126+131 flagC", reg.flagC() == true); }, function() { var reg = new Z80_Register(); reg.setA( 0x40 ); reg.RLCA(); UnitTest.report("RLCA A == 0x80", reg.getA() == 0x80); UnitTest.report("RLCA Cy == false", reg.flagC() == false); reg.RLCA(); UnitTest.report("RLCA A == 0x01", reg.getA() == 0x01); UnitTest.report("RLCA Cy == true", reg.flagC() == true); }, function() { var reg = new Z80_Register(); reg.setA( 0x40 ); reg.clearFlagC(); reg.RRCA(); UnitTest.report("(1)RRCA A == 0x20", reg.getA() == 0x20); UnitTest.report("(2)RRCA Cy == false", reg.flagC() == false); reg.setA( 0x20 ); reg.setFlagC(); reg.RRCA(); UnitTest.report("(3)RRCA A == 0x10", reg.getA() == 0x10); UnitTest.report("(4)RRCA Cy == false", reg.flagC() == false); reg.setA( 0x01 ); reg.setFlagC(); reg.RRCA(); UnitTest.report("(5)RRCA A == 0x80", reg.getA() == 0x80); UnitTest.report("(6)RRCA Z == false", reg.flagZ() == false); UnitTest.report("(7)RRCA Cy == true", reg.flagC() == true); }, function() { var reg = new Z80_Register(); reg.clearFlagC(); var r = reg.RRC(0x40); UnitTest.report("(1)RRC r == 0x80", r == 0x20); UnitTest.report("(2)RRC Cy == false", reg.flagC() == false); reg.setFlagC(); r = reg.RRC(0x20); UnitTest.report("(3)RRC r == 0x10", r == 0x10); UnitTest.report("(4)RRC Cy == false", reg.flagC() == false); reg.setFlagC(); r = reg.RRC(0x01); UnitTest.report("(5)RRC r == 0x80", r == 0x80); UnitTest.report("(6)RRC Z == false", reg.flagZ() == false); UnitTest.report("(7)RRC Cy == true", reg.flagC() == true); }, function() { var reg = new Z80_Register(); reg.setA( 0x40 ); reg.clearFlagC(); reg.RRA(); UnitTest.report("(1)RRA A == 0x20", reg.getA() == 0x20); UnitTest.report("(2)RRA Cy == false", reg.flagC() == false); reg.setA( 0x20 ); reg.setFlagC(); reg.RRA(); UnitTest.report("(3)RRA A == 0x90", reg.getA() == 0x90); UnitTest.report("(4)RRA Cy == false", reg.flagC() == false); reg.setA( 0x21 ); reg.setFlagC(); reg.RRA(); UnitTest.report("(5)RRA A == 0x90", reg.getA() == 0x90); UnitTest.report("(6)RRA Cy == true", reg.flagC() == true); reg.setA( 0x01 ); reg.clearFlagC(); reg.setFlagZ(); reg.RRA(); UnitTest.report("(7)RRA A == 0x00", reg.getA() == 0x00); UnitTest.report("(8)RRA Z == true", reg.flagZ() == true); UnitTest.report("(9)RRA Cy == true", reg.flagC() == true); reg.setA( 0x01 ); reg.setFlagC(); reg.clearFlagZ(); reg.RRA(); UnitTest.report("(10)RRA A == 0x80", reg.getA() == 0x80); UnitTest.report("(11)RRA Z == false", reg.flagZ() == false); UnitTest.report("(12)RRA Cy == true", reg.flagC() == true); }, function() { var reg = new Z80_Register(); reg.clearFlagC(); var r = reg.RR(0x40); UnitTest.report("(1)RR r == 0x80", r == 0x20); UnitTest.report("(2)RR Cy == false", reg.flagC() == false); UnitTest.report("(3)RR S == false", reg.flagS() == false); reg.setFlagC(); r = reg.RR(0x20); UnitTest.report("(4)RR r == 0x90", r == 0x90); UnitTest.report("(5)RR Cy == false", reg.flagC() == false); reg.setFlagC(); r = reg.RR(0x21); UnitTest.report("(6)RR r == 0x90", r == 0x90); UnitTest.report("(7)RR Cy == true", reg.flagC() == true); UnitTest.report("(8)RR S == true", reg.flagS() == true); reg.setFlagC(); r = reg.RR(0x01); UnitTest.report("(9)RR r == 0x80", r == 0x80); UnitTest.report("(10)RR Z == false", reg.flagZ() == false); UnitTest.report("(11)RR Cy == true", reg.flagC() == true); UnitTest.report("(12)RR S == true", reg.flagS() == true); }, /**************************************************************** function() { var reg = new Z80_Register(); reg.updateFlagP(0x00); UnitTest.report("even bits P/V == 1 (1)", reg.flagP() == 1); reg.updateFlagP(0x50); UnitTest.report("even bits P/V == 1 (2)", reg.flagP() == 1); reg.updateFlagP(0xa0); UnitTest.report("even bits P/V == 1 (3)", reg.flagP() == 1); reg.updateFlagP(0x05); UnitTest.report("even bits P/V == 1 (4)", reg.flagP() == 1); reg.updateFlagP(0x0a); UnitTest.report("even bits P/V == 1 (5)", reg.flagP() == 1); reg.updateFlagP(0xff); UnitTest.report("even bits P/V == 1 (6)", reg.flagP() == 1); reg.updateFlagP(0x01); UnitTest.report("even bits P/V == 0 (7)", reg.flagP() == 0); reg.updateFlagP(0x51); UnitTest.report("even bits P/V == 1 (8)", reg.flagP() == 0); reg.updateFlagP(0xa1); UnitTest.report("even bits P/V == 1 (9)", reg.flagP() == 0); reg.updateFlagP(0x15); UnitTest.report("even bits P/V == 1 (10)", reg.flagP() == 0); reg.updateFlagP(0x1a); UnitTest.report("even bits P/V == 1 (11)", reg.flagP() == 0); reg.updateFlagP(0xef); UnitTest.report("even bits P/V == 1 (12)", reg.flagP() == 0); }, ******************************************************************/ function() { var reg = new Z80_Register(); reg.setA( 0x40 ); reg.clearFlagS(); reg.clearFlagC(); reg.clearFlagZ(); reg.clearFlagP(); var r = reg.RLC(0x40); UnitTest.report("(1)RLC r == 0x80", r == 0x80); UnitTest.report("(2)RLC S == true", reg.flagS() == true); UnitTest.report("(3)RLC Z == false", reg.flagZ() == false); UnitTest.report("(4)RLC Cy == false", reg.flagZ() == false); UnitTest.report("(5)RLC P/V == false", reg.flagP() == false); reg.clearFlagS(); reg.clearFlagC(); reg.clearFlagZ(); reg.clearFlagP(); r = reg.RLC(r); UnitTest.report("(6)RLC r == 0x01", r == 0x01); UnitTest.report("(7)RLC S == false", reg.flagS() == false); UnitTest.report("(8)RLC Z == false", reg.flagZ() == false); UnitTest.report("(9)RLC Cy == true", reg.flagC() == true); UnitTest.report("(10)RLC P/V == false", reg.flagP() == false); reg.clearFlagS(); reg.clearFlagC(); reg.clearFlagZ(); reg.clearFlagP(); r = reg.RLC(0); UnitTest.report("(11)RLC r == 0x00", r == 0x00); UnitTest.report("(12)RLC S == false", reg.flagS() == false); UnitTest.report("(13)RLC Z == true", reg.flagZ() == true); UnitTest.report("(14)RLC Cy == false", reg.flagC() == false); UnitTest.report("(15)RLC P/V == false", reg.flagP() == true); }, function() { var reg = new Z80_Register(); reg.setA( 0x40 ); reg.clearFlagC(); var r = reg.RL(0x40); UnitTest.report("(1)RL r == 0x80", r == 0x80); UnitTest.report("(2)RL S == true", reg.flagS() == true); UnitTest.report("(3)RL Z == false", reg.flagZ() == false); UnitTest.report("(4)RL Cy == false", reg.flagZ() == false); UnitTest.report("(5)RL P/V == false", reg.flagP() == false); reg.clearFlagC(); r = reg.RL(r); UnitTest.report("(6)RL r == 0x00", r == 0x00); UnitTest.report("(7)RL S == false", reg.flagS() == false); UnitTest.report("(8)RL Z == true", reg.flagZ() == true); UnitTest.report("(9)RL Cy == true", reg.flagC() == true); UnitTest.report("(10)RL P/V == true", reg.flagP() == true); reg.setFlagC(); r = reg.RL(0); UnitTest.report("(11)RL r == 0x01", r == 0x01); UnitTest.report("(12)RL S == false", reg.flagS() == false); UnitTest.report("(13)RL Z == false", reg.flagZ() == false); UnitTest.report("(14)RL Cy == false", reg.flagC() == false); UnitTest.report("(15)RL P/V == false", reg.flagP() == false); } ]; UnitTest.test({ name: "Z80_Register", test: function() { for(var i = 0; i < tests.length; i++) { tests[i](); } } }); const chai = require("chai"); const assert = chai.assert; describe("Z80_Register", function() { describe("8 bit register", function() { var reg8 = "ABCDEFHL".split(''); var reg = new Z80_Register(); reg8.forEach(function(r) { describe(r, function() { it("should be 1 by setting 1", function() { reg["set" + r](1); assert.equal(1, reg["get" + r]()); }); it("should be 255 by setting 255", function() { reg["set" + r](255); assert.equal(255, reg["get" + r]()); }); it("should be 0 by setting 0", function() { reg["set" + r](0); assert.equal(0, reg["get" + r]()); }); it("should be 255 by setting -1", function() { reg["set" + r](-1); assert.equal(255, reg["get" + r]()); }); it("should be 0 by setting 256", function() { reg["set" + r](256); assert.equal(0, reg["get" + r]()); }); }); describe("increment " + r, function() { it("should set 1 when it was 0", function() { reg["set" + r](0); reg.increment(r); assert.equal(1, reg["get" + r]()); }); it("should plus 128 value when it was 127", function() { reg["set" + r](127); reg.increment(r); assert.equal(128, reg["get" + r]()); }); it("should plus 0 value when it was 255", function() { reg["set" + r](255); reg.increment(r); assert.equal(0, reg["get" + r]()); }); }); describe("decrement " + r, function() { it("should set 0 when it was 1", function() { reg["set" + r](1); reg.decrement(r); assert.equal(0, reg["get" + r]()); }); it("should plus 128 value when it was 127", function() { reg["set" + r](128); reg.decrement(r); assert.equal(127, reg["get" + r]()); }); it("should plus 0 value when it was 255", function() { reg["set" + r](0); reg.decrement(r); assert.equal(255, reg["get" + r]()); }); }); }); reg8.forEach(function(current) { describe(current + " register", function() { describe("should not be affected", function() { reg8.forEach(function(other) { if(other !== current) { it("by " + other + " register", function() { reg["set" + current](123); reg["set" + other](246); assert.equal(123, reg["get" + current]()); }); } }); }); }); }); }); describe("flags", function() { var reg = new Z80_Register(); var flags = "SZHPNC".split(''); flags.forEach(function(current) { describe(current + " flag", function() { it("should be set", function() { reg["setFlag" + current](); assert.equal(true, reg["flag" + current]()); }); it("should be cleared", function() { reg["clearFlag" + current](); assert.equal(false, reg["flag" + current]()); }); }); }); flags.forEach(function(current) { describe(current + " flag", function() { describe("should not be cleared", function() { flags.forEach(function(other) { if(other !== current) { it("by " + other + " flag", function() { reg["setFlag" + current](); reg["clearFlag" + other](); assert.equal(true, reg["flag" + current]()); }); } }); }); describe("should not be set", function() { flags.forEach(function(other) { if(other !== current) { it("by " + other + " flag", function() { reg["clearFlag" + current](); reg["setFlag" + other](); assert.equal(false, reg["flag" + current]()); }); } }); }); }); }); describe("pair register", function() { var reg = new Z80_Register(); ["BC","DE","HL","AF"].forEach(function(rr) { describe(rr, function() { it("should be 1 by setting 1", function() { reg["set" + rr](1); assert.equal(1, reg["get" + rr]()); }); it("should be 65535 by setting 65535", function() { reg["set" + rr](65535); assert.equal(65535, reg["get" + rr]()); }); it("should be 0 by setting 0", function() { reg["set" + rr](0); assert.equal(0, reg["get" + rr]()); }); it("should be 255 by setting -1", function() { reg["set" + rr](-1); assert.equal(65535, reg["get" + rr]()); }); it("should be 0 by setting 65536", function() { reg["set" + rr](65536); assert.equal(0, reg["get" + rr]()); }); var rh = rr.split('')[0]; var rl = rr.split('')[1]; it("should be integrated by " + rh + " and " + rl, function() { reg["set" + rh](0x12); reg["set" + rl](0x34); assert.equal(0x1234, reg["get" + rr]()); }); it("should be duplicated to " + rh + " and " + rl, function() { reg["set" + rr](0x1234); assert.equal(0x12, reg["get" + rh]()); assert.equal(0x34, reg["get" + rl]()); }); }); }); }); }); describe("cloneRaw", function() { it("should be cloned", function() { var reg = new Z80_Register(); reg.setA(1); reg.setB(2); reg.setC(3); reg.setD(4); reg.setE(5); reg.setF(6); reg.setH(7); reg.setL(8); reg.PC = 9; reg.SP = 10; reg.IX = 11; reg.IY = 12; reg.R = 13; reg.I = 14; assert.deepEqual(reg.cloneRaw(), { A:1,B:2,C:3,D:4,E:5,F:6,H:7,L:8, PC:9,SP:10,IX:11,IY:12,R:13,I:14, }); }); }); }); });