1
0

Emualtor RX side

This commit is contained in:
Aiden
2026-05-25 21:25:10 +10:00
parent 752148c585
commit e141f3b30d
9 changed files with 597 additions and 2 deletions

View File

@@ -7,11 +7,16 @@ from h8536.emulator import (
IPRE,
ON_CHIP_RAM_START,
REGISTER_FIELD_START,
SCI1_RDR,
SCI1_SCR,
SCI1_SSR,
SCI1_TDR,
SCI_SCR_RE,
SCI_SCR_RIE,
SCI_SCR_TE,
SCI_SSR_RDRF,
SCI_SSR_TDRE,
VECTOR_SCI1_RXI,
H8536Emulator,
MemoryMap,
SCI1,
@@ -106,6 +111,18 @@ class EmulatorHarnessTest(unittest.TestCase):
self.assertEqual(emulator.cpu.regs[1], 0x1234)
self.assertEqual(emulator.cpu.regs[7], 0xFE80)
def test_jmp_register_uses_register_target(self):
rom = rom_with_reset(size=0x1020)
rom[0x1000:0x1003] = b"\x59\x10\x10" # MOV:I.W #H'1010, R1
rom[0x1003:0x1005] = b"\x11\xD1" # JMP @R1
rom[0x1010:0x1013] = b"\x58\x12\x34" # MOV:I.W #H'1234, R0
emulator = H8536Emulator(bytes(rom))
emulator.run(max_steps=3)
self.assertEqual(emulator.cpu.regs[0], 0x1234)
self.assertEqual(emulator.cpu.pc, 0x1013)
def test_sci1_txi_interrupt_can_emit_through_tdr(self):
rom = rom_with_reset(size=0x1040)
rom[0x0084:0x0086] = (0x1010).to_bytes(2, "big")
@@ -123,6 +140,28 @@ class EmulatorHarnessTest(unittest.TestCase):
self.assertEqual(bytes(emulator.sci1.tx_bytes), b"\x42")
self.assertFalse(report.heartbeat_seen)
def test_sci1_rxi_interrupt_consumes_injected_rdr_byte(self):
rom = rom_with_reset(size=0x1040)
rom[VECTOR_SCI1_RXI : VECTOR_SCI1_RXI + 2] = (0x1010).to_bytes(2, "big")
rom[0x1000:0x1003] = b"\x5F\xFE\x80" # MOV:I.W #H'FE80, R7
rom[0x1003:0x1008] = bytes([0x15, (IPRE >> 8) & 0xFF, IPRE & 0xFF, 0x06, 0x70])
rom[0x1008:0x100D] = bytes(
[0x15, (SCI1_SCR >> 8) & 0xFF, SCI1_SCR & 0xFF, 0x06, SCI_SCR_RIE | SCI_SCR_RE],
)
rom[0x100D] = 0x00
rom[0x1010:0x1014] = bytes([0x15, (SCI1_SSR >> 8) & 0xFF, SCI1_SSR & 0xFF, 0xD6])
rom[0x1014:0x1018] = bytes([0x15, (SCI1_RDR >> 8) & 0xFF, SCI1_RDR & 0xFF, 0x80])
rom[0x1018:0x101C] = bytes([0x15, (ON_CHIP_RAM_START >> 8) & 0xFF, ON_CHIP_RAM_START & 0xFF, 0x90])
rom[0x101C] = 0x0A
emulator = H8536Emulator(bytes(rom))
emulator.run(max_steps=3)
emulator.inject_sci1_rx_byte(0xA5)
emulator.run(max_steps=5)
self.assertEqual(emulator.memory.read8(ON_CHIP_RAM_START), 0xA5)
self.assertFalse(emulator.sci1.read(SCI1_SSR) & SCI_SSR_RDRF)
def test_interval_interrupt_vector_can_fire(self):
rom = rom_with_reset(size=0x1040)
rom[0x0042:0x0044] = (0x1020).to_bytes(2, "big")

View File

@@ -0,0 +1,27 @@
import argparse
import unittest
from h8536.emulator.rx_probe import frame_checksum, frame_checksum_ok, parse_frame
class EmulatorRxProbeTest(unittest.TestCase):
def test_parse_frame_accepts_five_bytes_and_appends_checksum(self):
frame = parse_frame("04 00 00 40 00")
self.assertEqual(frame, bytes.fromhex("04000040001E"))
self.assertTrue(frame_checksum_ok(frame))
def test_parse_frame_accepts_compact_checked_frame(self):
frame = parse_frame("0780684030C5")
self.assertEqual(frame, bytes.fromhex("0780684030C5"))
self.assertEqual(frame_checksum(frame), 0xC5)
self.assertTrue(frame_checksum_ok(frame))
def test_parse_frame_rejects_wrong_length(self):
with self.assertRaises(argparse.ArgumentTypeError):
parse_frame("04 00 00 40")
if __name__ == "__main__":
unittest.main()