EMualtor im
This commit is contained in:
116
tests/test_emulator_flags.py
Normal file
116
tests/test_emulator_flags.py
Normal file
@@ -0,0 +1,116 @@
|
||||
import unittest
|
||||
|
||||
from h8536.emulator import H8536Emulator
|
||||
|
||||
|
||||
def rom_with_reset(*, reset: int = 0x1000, size: int = 0x1100) -> bytearray:
|
||||
rom = bytearray([0xFF] * size)
|
||||
rom[0:2] = reset.to_bytes(2, "big")
|
||||
return rom
|
||||
|
||||
|
||||
class EmulatorMovFlagTest(unittest.TestCase):
|
||||
def test_mov_e_byte_zero_sets_z_for_beq_and_preserves_c(self):
|
||||
rom = rom_with_reset()
|
||||
rom[0x1000:0x1002] = b"\x50\x00" # MOV:E.B #H'00, R0
|
||||
rom[0x1002:0x1004] = b"\x27\x02" # BEQ H'1006
|
||||
rom[0x1004:0x1006] = b"\x51\x01" # MOV:E.B #H'01, R1
|
||||
rom[0x1006:0x1008] = b"\x52\x02" # MOV:E.B #H'02, R2
|
||||
|
||||
emulator = H8536Emulator(bytes(rom))
|
||||
emulator.cpu.c = True
|
||||
emulator.cpu.v = True
|
||||
emulator.step()
|
||||
|
||||
self.assertTrue(emulator.cpu.z)
|
||||
self.assertFalse(emulator.cpu.n)
|
||||
self.assertFalse(emulator.cpu.v)
|
||||
self.assertTrue(emulator.cpu.c)
|
||||
|
||||
emulator.run(max_steps=2)
|
||||
|
||||
self.assertEqual(emulator.cpu.regs[1], 0)
|
||||
self.assertEqual(emulator.cpu.regs[2], 2)
|
||||
self.assertEqual(emulator.cpu.pc, 0x1008)
|
||||
|
||||
def test_mov_e_byte_one_clears_z_for_beq_and_preserves_c(self):
|
||||
rom = rom_with_reset()
|
||||
rom[0x1000:0x1002] = b"\x50\x01" # MOV:E.B #H'01, R0
|
||||
rom[0x1002:0x1004] = b"\x27\x02" # BEQ H'1006
|
||||
rom[0x1004:0x1006] = b"\x51\x01" # MOV:E.B #H'01, R1
|
||||
rom[0x1006:0x1008] = b"\x52\x02" # MOV:E.B #H'02, R2
|
||||
|
||||
emulator = H8536Emulator(bytes(rom))
|
||||
emulator.cpu.c = True
|
||||
emulator.cpu.v = True
|
||||
emulator.step()
|
||||
|
||||
self.assertFalse(emulator.cpu.z)
|
||||
self.assertFalse(emulator.cpu.n)
|
||||
self.assertFalse(emulator.cpu.v)
|
||||
self.assertTrue(emulator.cpu.c)
|
||||
|
||||
emulator.run(max_steps=2)
|
||||
|
||||
self.assertEqual(emulator.cpu.regs[1], 1)
|
||||
self.assertEqual(emulator.cpu.regs[2], 0)
|
||||
self.assertEqual(emulator.cpu.pc, 0x1006)
|
||||
|
||||
def test_mov_i_word_immediate_sets_word_flags_and_preserves_c(self):
|
||||
rom = rom_with_reset()
|
||||
rom[0x1000:0x1003] = b"\x58\x80\x00" # MOV:I.W #H'8000, R0
|
||||
rom[0x1003:0x1006] = b"\x59\x00\x00" # MOV:I.W #H'0000, R1
|
||||
|
||||
emulator = H8536Emulator(bytes(rom))
|
||||
emulator.cpu.c = True
|
||||
emulator.cpu.v = True
|
||||
emulator.step()
|
||||
|
||||
self.assertEqual(emulator.cpu.regs[0], 0x8000)
|
||||
self.assertFalse(emulator.cpu.z)
|
||||
self.assertTrue(emulator.cpu.n)
|
||||
self.assertFalse(emulator.cpu.v)
|
||||
self.assertTrue(emulator.cpu.c)
|
||||
|
||||
emulator.step()
|
||||
|
||||
self.assertEqual(emulator.cpu.regs[1], 0)
|
||||
self.assertTrue(emulator.cpu.z)
|
||||
self.assertFalse(emulator.cpu.n)
|
||||
self.assertFalse(emulator.cpu.v)
|
||||
self.assertTrue(emulator.cpu.c)
|
||||
|
||||
def test_mulxu_byte_immediate_writes_word_result_and_clears_carry(self):
|
||||
rom = rom_with_reset()
|
||||
rom[0x1000:0x1002] = b"\x53\x12" # MOV:E.B #H'12, R3
|
||||
rom[0x1002:0x1005] = b"\x04\x10\xAB" # MULXU.B #H'10, R3
|
||||
|
||||
emulator = H8536Emulator(bytes(rom))
|
||||
emulator.cpu.c = True
|
||||
emulator.run(max_steps=2)
|
||||
|
||||
self.assertEqual(emulator.cpu.regs[3], 0x0120)
|
||||
self.assertFalse(emulator.cpu.z)
|
||||
self.assertFalse(emulator.cpu.n)
|
||||
self.assertFalse(emulator.cpu.v)
|
||||
self.assertFalse(emulator.cpu.c)
|
||||
|
||||
def test_not_byte_memory_updates_logic_flags_and_preserves_carry(self):
|
||||
rom = rom_with_reset()
|
||||
rom[0x1000:0x1005] = b"\x15\xF6\x80\x15\x00" # NOT.B @H'F680, then NOP
|
||||
|
||||
emulator = H8536Emulator(bytes(rom))
|
||||
emulator.memory.write8(0xF680, 0xFF)
|
||||
emulator.cpu.c = True
|
||||
emulator.cpu.v = True
|
||||
emulator.step()
|
||||
|
||||
self.assertEqual(emulator.memory.read8(0xF680), 0x00)
|
||||
self.assertTrue(emulator.cpu.z)
|
||||
self.assertFalse(emulator.cpu.n)
|
||||
self.assertFalse(emulator.cpu.v)
|
||||
self.assertTrue(emulator.cpu.c)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user