45 lines
1.8 KiB
Python
45 lines
1.8 KiB
Python
import unittest
|
|
|
|
from h8536.lcd_driver import analyze_lcd_driver, lcd_comment_for_instruction
|
|
from h8536.model import Instruction
|
|
|
|
|
|
class LcdDriverTest(unittest.TestCase):
|
|
def test_detects_e_clock_lcd_accesses_and_busy_poll_loop(self):
|
|
instructions = {
|
|
0x3F4A: Instruction(
|
|
0x3F4A,
|
|
b"\x15\xF2\x00\x00\x80",
|
|
"MOVFPE.B",
|
|
"@H'F200, R0",
|
|
references=[0xF200],
|
|
),
|
|
0x3F4F: Instruction(0x3F4F, b"\xA0\xF7", "BTST.B", "#7, R0"),
|
|
0x3F51: Instruction(0x3F51, b"\x26\xF7", "BNE", "loc_3F4A", kind="branch", targets=[0x3F4A]),
|
|
0x3F53: Instruction(0x3F53, b"\x15\xF2\x00\x00\x94", "MOVTPE.B", "R4, @H'F200", references=[0xF200]),
|
|
0x3F58: Instruction(0x3F58, b"\x15\xF2\x01\x00\x94", "MOVTPE.B", "R4, @H'F201", references=[0xF201]),
|
|
0x3F5D: Instruction(0x3F5D, b"\x19", "RTS", kind="return", fallthrough=False),
|
|
}
|
|
|
|
analysis = analyze_lcd_driver(instructions)
|
|
|
|
self.assertEqual(len(analysis["accesses"]), 3)
|
|
self.assertEqual(analysis["polling_loops"][0]["read_address"], 0x3F4A)
|
|
self.assertEqual(analysis["routines"][0]["role_hint"], "lcd_wait_and_transfer")
|
|
self.assertIn("LCD busy-flag poll", lcd_comment_for_instruction(analysis, 0x3F51))
|
|
self.assertIn("LCD data write", lcd_comment_for_instruction(analysis, 0x3F58))
|
|
|
|
def test_regex_fallback_detects_operands_without_references(self):
|
|
instructions = {
|
|
0x0100: Instruction(0x0100, b"", "MOVTPE.B", "R1, @H'F201"),
|
|
}
|
|
|
|
analysis = analyze_lcd_driver(instructions)
|
|
|
|
self.assertEqual(analysis["accesses"][0]["lcd_address"], 0xF201)
|
|
self.assertEqual(analysis["accesses"][0]["role"], "lcd_data_write")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|