diff --git a/sw/script/o65dump.py b/sw/script/o65dump.py index 1bcc554..68cc956 100755 --- a/sw/script/o65dump.py +++ b/sw/script/o65dump.py @@ -42,34 +42,8 @@ class O65(): self.undef_ref_cnt = _file.read(2) - offset = _file.read(1) - while offset != b'\x00': - offset_val = 0 - while offset == b'\xff': - offset = _file.read(1) - offset_val += int.from_bytes(offset) - 1 - offset_val += int.from_bytes(offset) - typebyte = int.from_bytes(_file.read(1)) - lobyte = None - if typebyte & 0x40: - lobyte = int.from_bytes(_file.read(1)) - self.text_reloc.append((offset_val, typebyte, lobyte)) - offset = _file.read(1) - - - offset = _file.read(1) - while offset != b'\x00': - offset_val = 0 - while offset == b'\xff': - offset = _file.read(1) - offset_val += int.from_bytes(offset) - 1 - offset_val += int.from_bytes(offset) - typebyte = int.from_bytes(_file.read(1)) - lobyte = None - if typebyte & 0x40: - lobyte = int.from_bytes(_file.read(1)) - self.data_reloc.append((offset_val, typebyte, lobyte)) - offset = _file.read(1) + self.text_reloc = self._parse_reloc(_file) + self.data_reloc = self._parse_reloc(_file) export_count = int.from_bytes(_file.read(2), byteorder="little") for _ in range(export_count): @@ -85,6 +59,23 @@ class O65(): value = int.from_bytes(_file.read(2), byteorder="little") self.exports.append((name.decode(), segment, value)) + def _parse_reloc(self, fd: io.BufferedReader) -> list[(int, int, int)]: + reloc: list[(int, int, int)] = [] + offset = fd.read(1) + while offset != b'\x00': + offset_val = 0 + while offset == b'\xff': + offset = fd.read(1) + offset_val += int.from_bytes(offset) - 1 + offset_val += int.from_bytes(offset) + typebyte = int.from_bytes(fd.read(1)) + lobyte = None + if typebyte & 0x40: + lobyte = int.from_bytes(fd.read(1)) + reloc.append((offset_val, typebyte, lobyte)) + offset = fd.read(1) + return reloc + def main() -> None: if len(sys.argv) < 2: