import unittest from h8536.emulator import MemoryMap, P9DDR, P9DR from h8536.emulator.peripherals import P9Bus class P9BusTest(unittest.TestCase): def test_bit7_input_uses_queued_then_default_low_response(self): memory = MemoryMap(b"\x00" * 4) memory.write8(P9DDR, 0x13) memory.write8(P9DR, 0x80) memory.p9_bus.queue_input_bits([1]) self.assertEqual(memory.read8(P9DDR), 0x13) self.assertEqual(memory.read8(P9DR) & 0x80, 0x80) self.assertEqual(memory.read8(P9DR) & 0x80, 0x00) self.assertEqual(memory.registers[P9DR - 0xFE80], 0x80) def test_bit7_output_reads_latch(self): memory = MemoryMap(b"\x00" * 4) memory.write8(P9DDR, 0x93) memory.write8(P9DR, 0x80) self.assertEqual(memory.read8(P9DDR), 0x93) self.assertEqual(memory.read8(P9DR) & 0x80, 0x80) self.assertEqual(memory.registers[P9DR - 0xFE80], 0x80) def test_strobe_rising_edges_capture_output_bits_and_byte_candidates(self): bus = P9Bus() bus.write_ddr(0x93) for bit in (1, 0, 1, 0, 0, 1, 0, 1): bus.write_dr(0x80 if bit else 0x00) bus.write_dr((0x80 if bit else 0x00) | 0x02) bus.write_dr(0x80 if bit else 0x00) self.assertEqual(bus.transmitted_bits, [1, 0, 1, 0, 0, 1, 0, 1]) self.assertEqual(bus.byte_candidates, [0xA5]) self.assertEqual([event.edge for event in bus.strobe_edges[:2]], ["rising", "falling"]) self.assertIn("tx_byte ddr=93 dr=82 value=A5", bus.trace_lines()) def test_wrapper_results_are_queued_then_default_timeout(self): bus = P9Bus() bus.queue_wrapper_results([True], source="panel-script") self.assertEqual(bus.consume_wrapper_result(), (True, "panel-script", 0)) self.assertEqual(bus.consume_wrapper_result(), (False, "default_timeout", 0)) self.assertIn("wrapper_result ddr=00 dr=00 value=01 success=1 source=panel-script queued=0", bus.trace_lines()) self.assertIn("wrapper_result ddr=00 dr=00 value=00 success=0 source=default_timeout queued=0", bus.trace_lines()) if __name__ == "__main__": unittest.main()