class TestSystemFunctionOperations(unittest.TestCase): def setUp(self): self.memory = Memory() self.cpu = CPU(self.memory) def test_BRK(self): self.cpu.program_counter = 0x1000 self.memory.rom.load(0xFFFE, [0x00, 0x20]) status = self.cpu.status_as_byte() self.cpu.BRK() self.assertEqual(self.cpu.program_counter, 0x2000) self.assertEqual(self.cpu.break_flag, 1) self.assertEqual(self.memory.read_byte(self.cpu.STACK_PAGE + self.cpu.stack_pointer + 1), status) self.assertEqual(self.memory.read_byte(self.cpu.STACK_PAGE + self.cpu.stack_pointer + 2), 0x01) self.assertEqual(self.memory.read_byte(self.cpu.STACK_PAGE + self.cpu.stack_pointer + 3), 0x10) def test_RTI(self): self.memory.write_byte(self.cpu.STACK_PAGE + 0xFF, 0x12) self.memory.write_byte(self.cpu.STACK_PAGE + 0xFE, 0x33) self.memory.write_byte(self.cpu.STACK_PAGE + 0xFD, 0x20) self.cpu.stack_pointer = 0xFC self.cpu.RTI() self.assertEqual(self.cpu.program_counter, 0x1233) self.assertEqual(self.cpu.status_as_byte(), 0x20) def test_NOP(self): self.cpu.NOP()
class TestJumpCallOperations(unittest.TestCase): def setUp(self): self.memory = Memory() self.cpu = CPU(self.memory) def test_JMP(self): self.cpu.JMP(0x1000) self.assertEqual(self.cpu.program_counter, 0x1000) def test_JSR(self): self.cpu.program_counter = 0x1000 self.cpu.JSR(0x2000) self.assertEqual(self.cpu.program_counter, 0x2000) self.assertEqual(self.memory.read_byte(self.cpu.STACK_PAGE + self.cpu.stack_pointer + 1), 0xFF) self.assertEqual(self.memory.read_byte(self.cpu.STACK_PAGE + self.cpu.stack_pointer + 2), 0x0F) def test_RTS(self): self.memory.write_byte(self.cpu.STACK_PAGE + 0xFF, 0x12) self.memory.write_byte(self.cpu.STACK_PAGE + 0xFE, 0x33) self.cpu.stack_pointer = 0xFD self.cpu.RTS() self.assertEqual(self.cpu.program_counter, 0x1234) def test_JSR_and_RTS(self): self.cpu.program_counter = 0x1000 self.cpu.JSR(0x2000) self.assertEqual(self.cpu.program_counter, 0x2000) self.cpu.RTS() self.assertEqual(self.cpu.program_counter, 0x1000) # @@@
class TestMemory(unittest.TestCase): def setUp(self): self.memory = Memory() def test_load(self): self.memory.load(0x1000, [0x01, 0x02, 0x03]) self.assertEqual(self.memory.read_byte(0x1000), 0x01) self.assertEqual(self.memory.read_byte(0x1001), 0x02) self.assertEqual(self.memory.read_byte(0x1002), 0x03) def test_write(self): self.memory.write_byte(0x1000, 0x11) self.memory.write_byte(0x1001, 0x12) self.memory.write_byte(0x1002, 0x13) self.assertEqual(self.memory.read_byte(0x1000), 0x11) self.assertEqual(self.memory.read_byte(0x1001), 0x12) self.assertEqual(self.memory.read_byte(0x1002), 0x13)
class TestShiftOperations(unittest.TestCase): def setUp(self): self.memory = Memory() self.cpu = CPU(self.memory) def test_ASL(self): self.cpu.accumulator = 0x01 self.cpu.ASL() self.assertEqual(self.cpu.accumulator, 0x02) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) self.memory.write_byte(0x1000, 0x02) self.cpu.ASL(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x04) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) self.cpu.accumulator = 0x80 self.cpu.ASL() self.assertEqual(self.cpu.accumulator, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.assertEqual(self.cpu.carry_flag, 1) def test_LSR(self): self.cpu.accumulator = 0x01 self.cpu.LSR() self.assertEqual(self.cpu.accumulator, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.assertEqual(self.cpu.carry_flag, 1) self.memory.write_byte(0x1000, 0x01) self.cpu.LSR(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.accumulator = 0x80 self.cpu.LSR() self.assertEqual(self.cpu.accumulator, 0x40) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) def test_ROL(self): self.cpu.carry_flag = 0 self.cpu.accumulator = 0x80 self.cpu.ROL() self.assertEqual(self.cpu.accumulator, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.carry_flag = 1 self.cpu.accumulator = 0x80 self.cpu.ROL() self.assertEqual(self.cpu.accumulator, 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) # @@@ self.assertEqual(self.cpu.carry_flag, 1) self.cpu.carry_flag = 0 self.memory.write_byte(0x1000, 0x80) self.cpu.ROL(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) # @@@ self.assertEqual(self.cpu.carry_flag, 1) self.cpu.carry_flag = 1 self.memory.write_byte(0x1000, 0x80) self.cpu.ROL(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) # @@@ self.assertEqual(self.cpu.carry_flag, 1) def test_ROR(self): self.cpu.carry_flag = 0 self.cpu.accumulator = 0x01 self.cpu.ROR() self.assertEqual(self.cpu.accumulator, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) # @@@ self.assertEqual(self.cpu.carry_flag, 1) self.cpu.carry_flag = 1 self.cpu.accumulator = 0x01 self.cpu.ROR() self.assertEqual(self.cpu.accumulator, 0x80) self.assertEqual(self.cpu.sign_flag, 1) # @@@ self.assertEqual(self.cpu.zero_flag, 0) # @@@ self.assertEqual(self.cpu.carry_flag, 1) self.cpu.carry_flag = 0 self.memory.write_byte(0x1000, 0x01) self.cpu.ROR(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) # @@@ self.assertEqual(self.cpu.carry_flag, 1) self.cpu.carry_flag = 1 self.memory.write_byte(0x1000, 0x01) self.cpu.ROR(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x80) self.assertEqual(self.cpu.sign_flag, 1) # @@@ self.assertEqual(self.cpu.zero_flag, 0) # @@@ self.assertEqual(self.cpu.carry_flag, 1)
class TestIncrementDecrementOperations(unittest.TestCase): def setUp(self): self.memory = Memory() self.cpu = CPU(self.memory) def test_INC(self): self.memory.write_byte(0x1000, 0x00) self.cpu.INC(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.memory.write_byte(0x1000, 0x7F) self.cpu.INC(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x80) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.memory.write_byte(0x1000, 0xFF) self.cpu.INC(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) def test_INX(self): self.cpu.x_index = 0x00 self.cpu.INX() self.assertEqual(self.cpu.x_index, 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.x_index = 0x7F self.cpu.INX() self.assertEqual(self.cpu.x_index, 0x80) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.x_index = 0xFF self.cpu.INX() self.assertEqual(self.cpu.x_index, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) def test_INY(self): self.cpu.y_index = 0x00 self.cpu.INY() self.assertEqual(self.cpu.y_index, 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.y_index = 0x7F self.cpu.INY() self.assertEqual(self.cpu.y_index, 0x80) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.y_index = 0xFF self.cpu.INY() self.assertEqual(self.cpu.y_index, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) def test_DEC(self): self.memory.write_byte(0x1000, 0x01) self.cpu.DEC(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.memory.write_byte(0x1000, 0x80) self.cpu.DEC(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0x7F) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.memory.write_byte(0x1000, 0x00) self.cpu.DEC(0x1000) self.assertEqual(self.memory.read_byte(0x1000), 0xFF) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) def test_DEX(self): self.cpu.x_index = 0x01 self.cpu.DEX() self.assertEqual(self.cpu.x_index, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.cpu.x_index = 0x80 self.cpu.DEX() self.assertEqual(self.cpu.x_index, 0x7F) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.x_index = 0x00 self.cpu.DEX() self.assertEqual(self.cpu.x_index, 0xFF) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) def test_DEY(self): self.cpu.y_index = 0x01 self.cpu.DEY() self.assertEqual(self.cpu.y_index, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.cpu.y_index = 0x80 self.cpu.DEY() self.assertEqual(self.cpu.y_index, 0x7F) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.y_index = 0x00 self.cpu.DEY() self.assertEqual(self.cpu.y_index, 0xFF) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0)
class TestLoadStoreOperations(unittest.TestCase): def setUp(self): self.memory = Memory() self.cpu = CPU(self.memory) self.memory.load(0x1000, [0x00, 0x01, 0x7F, 0x80, 0xFF]) def test_LDA(self): self.cpu.LDA(0x1000) self.assertEqual(self.cpu.accumulator, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.cpu.LDA(0x1001) self.assertEqual(self.cpu.accumulator, 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDA(0x1002) self.assertEqual(self.cpu.accumulator, 0x7F) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDA(0x1003) self.assertEqual(self.cpu.accumulator, 0x80) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDA(0x1004) self.assertEqual(self.cpu.accumulator, 0xFF) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) def test_LDX(self): self.cpu.LDX(0x1000) self.assertEqual(self.cpu.x_index, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.cpu.LDX(0x1001) self.assertEqual(self.cpu.x_index, 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDX(0x1002) self.assertEqual(self.cpu.x_index, 0x7F) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDX(0x1003) self.assertEqual(self.cpu.x_index, 0x80) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDX(0x1004) self.assertEqual(self.cpu.x_index, 0xFF) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) def test_LDY(self): self.cpu.LDY(0x1000) self.assertEqual(self.cpu.y_index, 0x00) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.cpu.LDY(0x1001) self.assertEqual(self.cpu.y_index, 0x01) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDY(0x1002) self.assertEqual(self.cpu.y_index, 0x7F) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDY(0x1003) self.assertEqual(self.cpu.y_index, 0x80) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.cpu.LDY(0x1004) self.assertEqual(self.cpu.y_index, 0xFF) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) def test_STA(self): self.cpu.accumulator = 0x37 self.cpu.STA(0x2000) self.assertEqual(self.memory.read_byte(0x2000), 0x37) def test_STX(self): self.cpu.x_index = 0x38 self.cpu.STX(0x2000) self.assertEqual(self.memory.read_byte(0x2000), 0x38) def test_STY(self): self.cpu.y_index = 0x39 self.cpu.STY(0x2000) self.assertEqual(self.memory.read_byte(0x2000), 0x39)