public void SBC_B_HandlesPFlag() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x61, // LD A,61H 0x06, 0xB3, // LD B,B3H 0x37, // SCF 0x98 // SBC B }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0xAD); regs.SFlag.ShouldBeTrue(); regs.ZFlag.ShouldBeFalse(); regs.HFlag.ShouldBeTrue(); regs.PFlag.ShouldBeTrue(); regs.CFlag.ShouldBeTrue(); regs.NFlag.ShouldBeTrue(); m.ShouldKeepRegisters(except: "AF, B"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0006); m.Cpu.Tacts.ShouldBe(22L); }
public void ADD_HL_HL_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x21, 0x34, 0x12, // LD HL,1234H 0x29 // ADD HL,HL }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; m.ShouldKeepRegisters(except: "F, HL"); m.ShouldKeepMemory(); m.ShouldKeepSFlag(); m.ShouldKeepZFlag(); m.ShouldKeepPVFlag(); regs.NFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.HL.ShouldBe((ushort)0x2468); regs.PC.ShouldBe((ushort)0x0004); m.Cpu.Tacts.ShouldBe(21L); }
public void DEC_L_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x2E, 0x43, // LD L,43H 0x2D // DEC L }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; m.ShouldKeepRegisters(except: "L, F"); m.ShouldKeepMemory(); m.ShouldKeepCFlag(); regs.NFlag.ShouldBeTrue(); regs.L.ShouldBe((byte)0x42); regs.PC.ShouldBe((ushort)0x0003); m.Cpu.Tacts.ShouldBe(11L); }
public void LD_D_E_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x1E, 0xB9, // LD E,B9H 0x53 // LD D,E }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.D.ShouldBe((byte)0xB9); m.ShouldKeepRegisters(except: "D, E"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0003); m.Cpu.Tacts.ShouldBe(11L); }
public void LD_NNi_HL_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x21, 0x26, 0xA9, // LD HL,A926H 0x22, 0x00, 0x10 // LD (1000H),HL }); // --- Act var lBefore = m.Memory[0x1000]; var hBefore = m.Memory[0x1001]; m.Run(); var lAfter = m.Memory[0x1000]; var hAfter = m.Memory[0x1001]; // --- Assert var regs = m.Cpu.Registers; m.ShouldKeepRegisters(except: "HL"); m.ShouldKeepMemory(except: "1000-1001"); regs.HL.ShouldBe((ushort)0xA926); lBefore.ShouldBe((byte)0x00); hBefore.ShouldBe((byte)0x00); lAfter.ShouldBe((byte)0x26); hAfter.ShouldBe((byte)0xA9); regs.PC.ShouldBe((ushort)0x0006); m.Cpu.Tacts.ShouldBe(26L); }
public void SLL_HLi_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.OneInstruction); m.InitCode(new byte[] { 0xCB, 0x36 // SLL (HL) }); var regs = m.Cpu.Registers; regs.HL = 0x1000; m.Memory[regs.HL] = 0x08; // --- Act m.Run(); // --- Assert m.Memory[regs.HL].ShouldBe((byte)0x11); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.PFlag.ShouldBeTrue(); regs.HFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "F"); m.ShouldKeepMemory(except: "1000"); regs.PC.ShouldBe((ushort)0x0002); m.Cpu.Tacts.ShouldBe(15L); }
public void SLL_B_SetsSign() { // --- Arrange var m = new Z80TestMachine(RunMode.OneInstruction); m.InitCode(new byte[] { 0xCB, 0x30 // SLL B }); var regs = m.Cpu.Registers; regs.B = 0x48; // --- Act m.Run(); // --- Assert regs.B.ShouldBe((byte)0x91); regs.SFlag.ShouldBeTrue(); regs.ZFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "F, B"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0002); m.Cpu.Tacts.ShouldBe(8L); }
public void JP_M_CollectsDebugInfo() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilHalt); m.InitCode(new byte[] { 0x3E, 0xC0, // LD A,C0H 0x87, // ADD A 0xFA, 0x07, 0x00, // JP M,0007H 0x76, // HALT 0x3E, 0xAA, // LD A,AAH 0x76 // HALT }); // --- Act m.Run(); // --- Assert var brLog = m.BranchEvents; brLog.Count.ShouldBe(1); var brManip = brLog[0]; brManip.OperationAddress.ShouldBe((ushort)0x0003); brManip.Operation.ShouldBe("jp m,0007H"); brManip.JumpAddress.ShouldBe((ushort)0x0007); brManip.Tacts.ShouldBe(21); }
public void JP_IYi_CollectsDebugInfo() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0xFD, 0x21, 0x00, 0x10, // LD IY, 1000H 0xFD, 0xE9 // JP (IY) }); // --- Act m.Run(); // --- Assert var brLog = m.BranchEvents; brLog.Count.ShouldBe(1); var brManip = brLog[0]; brManip.OperationAddress.ShouldBe((ushort)0x0004); brManip.Operation.ShouldBe("jp (iy)"); brManip.JumpAddress.ShouldBe((ushort)0x1000); brManip.Tacts.ShouldBe(22); }
public void JP_CollectsDebugInfo() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilHalt); m.InitCode(new byte[] { 0x3E, 0x16, // LD A,16H 0xC3, 0x06, 0x00, // JP 0006H 0x76, // HALT 0x3E, 0xAA, // LD A,AAH 0x76 // HALT }); // --- Act m.Run(); // --- Assert var brLog = m.BranchEvents; brLog.Count.ShouldBe(1); var brManip = brLog[0]; brManip.OperationAddress.ShouldBe((ushort)0x0002); brManip.Operation.ShouldBe("jp 0006H"); brManip.JumpAddress.ShouldBe((ushort)0x0006); brManip.Tacts.ShouldBe(17); }
public void JR_E_CollectsDebugInfo() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x20, // LD A,20H 0x18, 0x20 // JR 20H }); // --- Act m.Run(); // --- Assert var brLog = m.BranchEvents; brLog.Count.ShouldBe(1); var brManip = brLog[0]; brManip.OperationAddress.ShouldBe((ushort)0x0002); brManip.Operation.ShouldBe("jr 0024H"); brManip.JumpAddress.ShouldBe((ushort)0x0024); brManip.Tacts.ShouldBe(19); }
public void JR_C_CollectsDebugInfo() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x37, // SCF 0x38, 0x02 // JR C,02H }); // --- Act m.Run(); // --- Assert var brLog = m.BranchEvents; brLog.Count.ShouldBe(1); var brManip = brLog[0]; brManip.OperationAddress.ShouldBe((ushort)0x0001); brManip.Operation.ShouldBe("jr c,0005H"); brManip.JumpAddress.ShouldBe((ushort)0x0005); brManip.Tacts.ShouldBe(16); }
public void DJNX_CollectsDebugInfo() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x06, 0x02, // LD B,02H 0x10, 0x02 // DJNZ 02H }); // --- Act m.Run(); // --- Assert var brLog = m.BranchEvents; brLog.Count.ShouldBe(1); var brManip = brLog[0]; brManip.OperationAddress.ShouldBe((ushort)0x0002); brManip.Operation.ShouldBe("djnz 0006H"); brManip.JumpAddress.ShouldBe((ushort)0x0006); brManip.Tacts.ShouldBe(20); }
public void SBC_L_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x36, // LD A,36H 0x2E, 0x24, // LD L,24H 0x37, // SCF 0x9D // SBC L }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0x11); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.NFlag.ShouldBeTrue(); m.ShouldKeepRegisters(except: "AF, L"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0006); m.Cpu.Tacts.ShouldBe(22L); }
public void BIT_N_C_WorksWithBitReset() { for (var n = 0; n < 8; n++) { // --- Arrange var m = new Z80TestMachine(RunMode.OneInstruction); var opcn = (byte)(0x41 | (n << 3)); m.InitCode(new byte[] { 0xCB, opcn // BIT N,C }); var regs = m.Cpu.Registers; regs.C = (byte)~(0x01 << n); // --- Act m.Run(); // --- Assert regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeTrue(); regs.CFlag.ShouldBeFalse(); regs.PFlag.ShouldBeTrue(); regs.HFlag.ShouldBeTrue(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "F"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0002); m.Cpu.Tacts.ShouldBe(8L); } }
public void JR_NZ_CollectsDebugInfo() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x02, // LD A,02H 0x3D, // DEC A 0x20, 0x02 // JR NZ,02H }); // --- Act m.Run(); // --- Assert var brLog = m.BranchEvents; brLog.Count.ShouldBe(1); var brManip = brLog[0]; brManip.OperationAddress.ShouldBe((ushort)0x0003); brManip.Operation.ShouldBe("jr nz,0007H"); brManip.JumpAddress.ShouldBe((ushort)0x0007); brManip.Tacts.ShouldBe(23); }
public void SLL_E_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.OneInstruction); m.InitCode(new byte[] { 0xCB, 0x33 // SLL E }); var regs = m.Cpu.Registers; regs.E = 0x08; // --- Act m.Run(); // --- Assert regs.E.ShouldBe((byte)0x11); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.PFlag.ShouldBeTrue(); regs.HFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "F, E"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0002); m.Cpu.Tacts.ShouldBe(8L); }
public void RL_B_UsesCarryFlag() { // --- Arrange var m = new Z80TestMachine(RunMode.OneInstruction); m.InitCode(new byte[] { 0xCB, 0x10 // RL B }); var regs = m.Cpu.Registers; regs.F |= FlagsSetMask.C; regs.B = 0xC0; // --- Act m.Run(); // --- Assert regs.B.ShouldBe((byte)0x81); regs.SFlag.ShouldBeTrue(); regs.ZFlag.ShouldBeFalse(); regs.CFlag.ShouldBeTrue(); regs.PFlag.ShouldBeTrue(); regs.HFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "F, B"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0002); m.Cpu.Tacts.ShouldBe(8L); }
public void SRL_A_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.OneInstruction); m.InitCode(new byte[] { 0xCB, 0x3F // SRL A }); var regs = m.Cpu.Registers; regs.F |= FlagsSetMask.C; regs.A = 0x10; // --- Act m.Run(); // --- Assert regs.A.ShouldBe((byte)0x08); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "F, A"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0002); m.Cpu.Tacts.ShouldBe(8L); }
public void ADC_A_B_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x12, // LD A,12H 0x06, 0x24, // LD B,24H 0x88 // ADC A,B }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0x36); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "AF, B"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0005); m.Cpu.Tacts.ShouldBe(18L); }
public void LD_E_HLi_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x21, 0x00, 0x10, // LD HL,1000H 0x5E // LD E,(HL) }); m.Memory[0x1000] = 0xB9; // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.E.ShouldBe((byte)0xB9); m.ShouldKeepRegisters(except: "E, HL"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0004); m.Cpu.Tacts.ShouldBe(17L); }
public void ADC_A_B_WithCarryHandlesSignFlag() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x44, // LD A,44H 0x06, 0x42, // LD B,42H 0x37, // SCF 0x88 // ADC A,B }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0x87); regs.SFlag.ShouldBeTrue(); regs.ZFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.PFlag.ShouldBeTrue(); regs.CFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "AF, B"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0006); m.Cpu.Tacts.ShouldBe(22L); }
public void XSRA_WorksAsExpected() { // --- Arrange const byte OFFS = 0x32; var m = new Z80TestMachine(RunMode.OneInstruction); m.InitCode(new byte[] { 0XFD, 0xCB, OFFS, 0x2E // SRA (IY+32H) }); var regs = m.Cpu.Registers; regs.IY = 0x1000; regs.F |= FlagsSetMask.C; m.Memory[regs.IY + OFFS] = 0x10; // --- Act m.Run(); // --- Assert m.Memory[regs.IY + OFFS].ShouldBe((byte)0x08); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "F"); m.ShouldKeepMemory(except: "1032"); regs.PC.ShouldBe((ushort)0x0004); m.Cpu.Tacts.ShouldBe(23L); }
public void ADD_A_B_HandlesZeroFlag() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x82, // LD A,82H 0x06, 0x7E, // LD B,7EH 0x80 // ADD A,B }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0x0); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeTrue(); regs.HFlag.ShouldBeTrue(); regs.PFlag.ShouldBeFalse(); regs.CFlag.ShouldBeTrue(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "AF, B"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0005); m.Cpu.Tacts.ShouldBe(18L); }
public void INC_H_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x26, 0x43, // LD H,43H 0x24 // INC H }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; m.ShouldKeepRegisters(except: "H, F"); m.ShouldKeepMemory(); m.ShouldKeepCFlag(); regs.NFlag.ShouldBeFalse(); regs.H.ShouldBe((byte)0x44); regs.PC.ShouldBe((ushort)0x0003); m.Cpu.Tacts.ShouldBe(11L); }
public void ADC_A_HLi_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x12, // LD A,12H 0x21, 0x00, 0x10, // LD HL,1000H 0x37, // SCF 0x8E // ADD A,(HL) }); m.Memory[0x1000] = 0x24; // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0x37); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "AF, HL"); m.ShouldKeepMemory(except: "1000"); regs.PC.ShouldBe((ushort)0x0007); m.Cpu.Tacts.ShouldBe(28L); }
public void LD_HL_NNi_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x2A, 0x00, 0x10 // LD HL,(1000H) }); m.Memory[0x1000] = 0x34; m.Memory[0x1001] = 0x12; // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; m.ShouldKeepRegisters(except: "HL"); m.ShouldKeepMemory(); regs.HL.ShouldBe((ushort)0x1234); regs.PC.ShouldBe((ushort)0x0003); m.Cpu.Tacts.ShouldBe(16L); }
public void ADC_A_A_WithCarryWorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x12, // LD A,12H 0x37, // SCF 0x8F // ADC A,A }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0x25); regs.SFlag.ShouldBeFalse(); regs.ZFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.CFlag.ShouldBeFalse(); regs.NFlag.ShouldBeFalse(); m.ShouldKeepRegisters(except: "AF"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0004); m.Cpu.Tacts.ShouldBe(15L); }
public void CPL_WorksAsExpected() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x81, // LD A,81H 0x2F // CPL }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; m.ShouldKeepRegisters(except: "A, F"); m.ShouldKeepMemory(); m.ShouldKeepSFlag(); m.ShouldKeepZFlag(); m.ShouldKeepPVFlag(); m.ShouldKeepCFlag(); regs.HFlag.ShouldBeTrue(); regs.NFlag.ShouldBeTrue(); regs.A.ShouldBe((byte)0x7E); regs.PC.ShouldBe((ushort)0x0003); m.Cpu.Tacts.ShouldBe(11L); }
public void SUB_B_HandlesCarryFlag() { // --- Arrange var m = new Z80TestMachine(RunMode.UntilEnd); m.InitCode(new byte[] { 0x3E, 0x40, // LD A,40H 0x06, 0x60, // LD B,60H 0x90 // SUB B }); // --- Act m.Run(); // --- Assert var regs = m.Cpu.Registers; regs.A.ShouldBe((byte)0xE0); regs.SFlag.ShouldBeTrue(); regs.ZFlag.ShouldBeFalse(); regs.HFlag.ShouldBeFalse(); regs.PFlag.ShouldBeFalse(); regs.CFlag.ShouldBeTrue(); regs.NFlag.ShouldBeTrue(); m.ShouldKeepRegisters(except: "AF, B"); m.ShouldKeepMemory(); regs.PC.ShouldBe((ushort)0x0005); m.Cpu.Tacts.ShouldBe(18L); }