"""Tests for reconstruct.py — the VT1200 EPROM de-interleaver. The firmware's addresses are now known (see MEMORY_MAP.md): the ROM is top-aligned at physical byte 0x07E40000 and the EPROM *bank* order is the reverse of part-number order. `reconstruct(..., linear=True)` must therefore emit an image where file offset == physical byte - 0x07E40000. """ import os import struct import unittest import reconstruct ROM_SIZE = 0x1C0000 ROM_BASE = 0x07E40000 RESET_VECTOR = 0x3F200040 # bit address the reset entry holds POST_BYTES = bytes.fromhex("6003500540070056") # In part-number order bank0 (210/211) is first, so its reset vector -- the last # entry of the vector page -- lands at file offset 0x3FFFC. RESET_VECTOR_OFFSET_PART_ORDER = 0x3FFFC def _load(dirname, linear): return reconstruct.reconstruct(dirname, linear=linear)[1] class LinearImageTest(unittest.TestCase): """linear=True yields an image whose offsets are CPU-address ordered.""" def test_size(self): self.assertEqual(len(_load("v2.1", linear=True)), ROM_SIZE) def test_reset_vector_is_at_top_of_rom(self): img = _load("v2.1", linear=True) self.assertEqual(struct.unpack_from("> 3 == 0x07E40008 == ROM_BASE + 8 img = _load("v2.1", linear=True) self.assertEqual(img[8:8 + len(POST_BYTES)], POST_BYTES) def test_vector_page_is_at_top(self): linear = _load("v2.1", linear=True) part = _load("v2.1", linear=False) self.assertEqual(linear[-0x80:], part[0x3FF80:0x40000]) def test_known_string_pointer_resolves(self): # Stored pointer 0x3F816ED8 >> 3 == ROM_BASE + 0xC2DDB img = _load("v2.1", linear=True) self.assertEqual(img[0xC2DDB:0xC2DDB + 15], b"Messages re-xmt") class PartOrderImageTest(unittest.TestCase): """linear=False preserves the legacy part-number-ordered layout.""" def test_reset_vector_location(self): img = _load("v2.1", linear=False) self.assertEqual( struct.unpack_from("