1
0
Files
h8-536-decoder/tests/test_cycles_manual_examples.py
2026-05-25 13:54:34 +10:00

49 lines
1.9 KiB
Python

import unittest
from h8536.cycles import estimate_cycles
from h8536.decoder import H8536Decoder
from h8536.rom import Rom
def decode_at(data: list[int], address: int = 0):
return H8536Decoder(Rom(bytes(data), base=address)).decode(address)
class ManualCycleExamplesTest(unittest.TestCase):
def test_add_word_register_indirect_matches_manual_even_and_odd_examples(self):
even = decode_at([0xD8, 0x21], 0x0100)
odd = decode_at([0xD8, 0x21], 0x0101)
self.assertEqual(even.text, "ADD:G.W @R0, R1")
self.assertEqual(estimate_cycles(even, "min")["cycles"], 6)
self.assertEqual(estimate_cycles(even, "min")["base_cycles"], 5)
self.assertEqual(estimate_cycles(even, "min")["alignment_adjustment"], 1)
self.assertEqual(odd.text, "ADD:G.W @R0, R1")
self.assertEqual(estimate_cycles(odd, "min")["cycles"], 5)
self.assertEqual(estimate_cycles(odd, "min")["base_cycles"], 5)
def test_jsr_register_indirect_matches_manual_stack_adjusted_example(self):
even = decode_at([0x11, 0xD8], 0xFC00)
odd = decode_at([0x11, 0xD8], 0xFC01)
self.assertEqual(even.text, "JSR @R0")
self.assertEqual(estimate_cycles(even, "min")["cycles"], 13)
self.assertEqual(estimate_cycles(even, "min")["base_cycles"], 9)
self.assertEqual(estimate_cycles(even, "min")["stack_adjustment"], 4)
self.assertEqual(odd.text, "JSR @R0")
self.assertEqual(estimate_cycles(odd, "min")["cycles"], 14)
self.assertEqual(estimate_cycles(odd, "min")["alignment_adjustment"], 1)
def test_conditional_branch_keeps_taken_and_not_taken_counts(self):
instruction = decode_at([0x26, 0x02], 0x0000)
cycles = estimate_cycles(instruction, "min")
self.assertEqual(cycles["not_taken"], 3)
self.assertEqual(cycles["taken"], 7)
if __name__ == "__main__":
unittest.main()