1
0

EMualtor im

This commit is contained in:
Aiden
2026-05-25 18:43:36 +10:00
parent 81f5d7a150
commit 05e1237acc
18 changed files with 993 additions and 20 deletions

View 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()