def __iter__(self):
        """TBW"""
        self.assert_valid()

        if self.first == self.last:
            raise StopIteration

        with RomImage(self.title) as mem:
            self.mapper = make_mapper(header=get_snes_header(mem))
            addr = self.addr
            mem.seek(self.mapper.from_cpu(addr))
            yield from self._do_iterate(mem, addr)
    def setup(self, mem):
        """Setup this instance.

        Args:
          mem (mmap): The input stream of ROM.
        """

        self.mapper = make_mapper(header=get_snes_header(mem))

        self._setup_huffman_tree(mem)
        self._setup_shiftbit_array(mem)

        self.assert_valid()
Beispiel #3
0
    def test_get_snes_header_for_dq5(self):
        """Test function dqutils.rom_image.get_snes_header."""

        with RomImage('DRAGONQUEST5') as mem:
            header = get_snes_header(mem)

        # [offset]: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
        # ---------------------------------------------------------
        # 00007FC0: 44 52 41 47 4F 4E 51 55 45 53 54 35 20 20 20 20
        # 00007FD0: 20 20 20 20 20 20 02 0B 03 00 B4 00 06 45 F9 BA
        # 00007FE0: 00 00 00 00 7F 8F 80 8F 7F 8F 5D 88 7F 8F 7F 8F
        # 00007FF0: 00 00 00 00 7F 8F 80 8F 7F 8F 5D 88 39 86 7F 8F

        self.assertEqual(len(header), 64)
        self.assertTrue(header.startswith(b'DRAGONQUEST5'))
        self.assertEqual(header[0x15] & 0x01, 0x00) # LoROM
        self.assertEqual(header[0x17], 0x0B) # 1.5M => 2M
Beispiel #4
0
    def test_get_snes_header_for_dq3(self):
        """Test function dqutils.rom_image.get_snes_header."""

        with RomImage('DRAGONQUEST3') as mem:
            header = get_snes_header(mem)

        # [offset]: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
        # ---------------------------------------------------------
        # 0000FFC0: 44 52 41 47 4F 4E 51 55 45 53 54 33 20 20 20 20
        # 0000FFD0: 20 20 20 20 20 31 02 0C 03 00 33 00 8C 8B 73 74
        # 0000FFE0: FF FF FF FF AC FF A8 FF A4 FF A0 FF A4 FF A4 FF
        # 0000FFF0: FF FF FF FF A4 FF A4 FF A4 FF A0 FF 98 FF A4 FF

        self.assertEqual(len(header), 64)
        self.assertTrue(header.startswith(b'DRAGONQUEST3'))
        self.assertEqual(header[0x15] & 0x01, 0x01) # HiROM
        self.assertEqual(header[0x17], 0x0C) # $0c => 4 megabytes
Beispiel #5
0
    def _do_parse(self, input_string, table):
        """Parse an XML object and return a table data.

        Args:
          input_string (string): An XML string.
          table (Table): An empty instance of class `Table`.

        Returns:
          None
        """

        dom = parse_xml(input_string)

        # Handle the <struct> element in the XML tree.
        node = dom.getElementsByTagName('struct')[0]
        cpu_addr, record_size, record_num = XmlParser.get_struct_info(node)
        members = [XmlParser.get_member_info(i)
                   for i in node.getElementsByTagName('member')]

        title = dom.getElementsByTagName('rom')[0].getAttribute('name')

        # Read ROM image and list the records.
        with RomImage(title) as mem:
            mapper = make_mapper(header=get_snes_header(mem))

            # Locate the address of the array on ROM image.
            mem.seek(mapper.from_cpu(cpu_addr))

            # Obtain each byte sequence.
            rows = []
            for _ in range(record_num):
                byte_string = mem.read(record_size)
                rows.append(
                    [i.process(byte_string) for i in members])

        table.cpu_addr = cpu_addr
        table.record_size = record_size
        table.columns = members
        table.rows = rows

        assert len(rows) == record_num