def parse(data): if not _valid_rom_info(data): if len(data) % 16384 != 0: # SMD, omit 512B external header and deinterleave first block data = data[512:] data = _deinterleave_smd(data) else: # MD, deinterleave entire ROM data = _deinterleave_bytes(data) if not _valid_rom_info(data): raise ValueError name = ' '.join(_sub(data, 0x150, 48).split()) version = _sub(data, 0x182, 12).replace(' ', '') rom_start = _unpack(_sub(data, 0x1a0, 4)) rom_end = _unpack(_sub(data, 0x1a4, 4)) ram_start = _unpack(_sub(data, 0x1b4, 4)) ram_end = _unpack(_sub(data, 0x1b8, 4)) country = _sub(data, 0x1f0, 16).strip() return _ROM(name, 'Genesis', rom_size=(rom_end-rom_start+1)/1024, ram_size=(ram_end-ram_start+1)/1024, country=country, version=version)
def parse(data): if not _valid_rom_info(data): if len(data) % 16384 != 0: # SMD, omit 512B external header and deinterleave first block data = data[512:] data = _deinterleave_smd(data) else: # MD, deinterleave entire ROM data = _deinterleave_bytes(data) if not _valid_rom_info(data): raise ValueError name = ' '.join(_sub(data, 0x150, 48).split()) version = _sub(data, 0x182, 12).replace(' ', '') rom_start = _unpack(_sub(data, 0x1a0, 4)) rom_end = _unpack(_sub(data, 0x1a4, 4)) ram_start = _unpack(_sub(data, 0x1b4, 4)) ram_end = _unpack(_sub(data, 0x1b8, 4)) country = _sub(data, 0x1f0, 16).strip() return _ROM(name, 'Genesis', rom_size=(rom_end - rom_start + 1) / 1024, ram_size=(ram_end - ram_start + 1) / 1024, country=country, version=version)
def parse(data): if _sub(data, 0x0, 4) != 'NES\x1a': raise ValueError if len(data) % 8192 != 16: name = _sub(data, len(data) - 128, 128).replace('\x00', '') else: name = None num_rom_banks = _unpack(_sub(data, 0x4, 1)) num_vrom_banks = _unpack(_sub(data, 0x5, 1)) rom_size = 16 * num_rom_banks + 8 * num_vrom_banks num_ram_banks = _unpack(_sub(data, 0x8, 1)) ram_size = 8 * num_ram_banks return _ROM(name, 'NES', rom_size=rom_size, ram_size=ram_size)
def parse(data): if _sub(data, 0x0, 4) != 'NES\x1a': raise ValueError if len(data) % 8192 != 16: name = _sub(data, len(data)-128, 128).replace('\x00', '') else: name = None num_rom_banks = _unpack(_sub(data, 0x4, 1)) num_vrom_banks = _unpack(_sub(data, 0x5, 1)) rom_size = 16*num_rom_banks + 8*num_vrom_banks num_ram_banks = _unpack(_sub(data, 0x8, 1)) ram_size = 8*num_ram_banks return _ROM(name, 'NES', rom_size=rom_size, ram_size=ram_size)
def _has_lorom_makeup(data, hdr): l_nibble = _unpack(_sub(data, hdr + 0x15, 1)) & 0xf return l_nibble % 2 == 0
def _checksum_heuristic(data, hdr): chksum_cpl = _unpack(_sub(data, hdr + 0x1c, 2)) chksum = _unpack(_sub(data, hdr + 0x1e, 2)) return chksum_cpl ^ chksum == 0xffff
def _has_lorom_makeup(data, hdr): l_nibble = _unpack(_sub(data, hdr+0x15, 1)) & 0xf return l_nibble % 2 == 0
def _checksum_heuristic(data, hdr): chksum_cpl = _unpack(_sub(data, hdr+0x1c, 2)) chksum = _unpack(_sub(data, hdr+0x1e, 2)) return chksum_cpl ^ chksum == 0xffff