Skip to content

Commit a29805e

Browse files
committed
Merge pull request #24 from fayvel/non_native_romlist
Add support for non-native rom files in romlist
2 parents 783f5c6 + b678a45 commit a29805e

File tree

1 file changed

+54
-10
lines changed

1 file changed

+54
-10
lines changed

src/m64py/frontend/romlist.py

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,53 @@ def get_files(self):
205205
files.append(filename)
206206
return files
207207

208+
def get_rom_crc(self, archive, fname):
209+
rom_header = m64p_rom_header()
210+
ctypes.memmove(
211+
ctypes.byref(rom_header),
212+
archive.read(fname, ctypes.sizeof(rom_header)),
213+
ctypes.sizeof(rom_header))
214+
crc1_pre = sl(rom_header.CRC1)
215+
crc2_pre = sl(rom_header.CRC2)
216+
217+
regs = 0
218+
regs |= rom_header.init_PI_BSB_DOM1_LAT_REG << 24
219+
regs |= rom_header.init_PI_BSB_DOM1_PGS_REG << 16
220+
regs |= rom_header.init_PI_BSB_DOM1_PWD_REG << 8
221+
regs |= rom_header.init_PI_BSB_DOM1_PGS_REG2
222+
223+
if regs == 0x80371240:
224+
# native *.z64
225+
crc1 = crc1_pre
226+
crc2 = crc2_pre
227+
elif regs == 0x37804012:
228+
# byteswapped [BADC] *.v64
229+
crc1 = 0
230+
crc1 |= ((crc1_pre >> 0) & 0xff) << 8
231+
crc1 |= ((crc1_pre >> 8) & 0xff) << 0
232+
crc1 |= ((crc1_pre >> 16) & 0xff) << 24
233+
crc1 |= ((crc1_pre >> 24) & 0xff) << 16
234+
crc2 = 0
235+
crc2 |= ((crc2_pre >> 0) & 0xff) << 8
236+
crc2 |= ((crc2_pre >> 8) & 0xff) << 0
237+
crc2 |= ((crc2_pre >> 16) & 0xff) << 24
238+
crc2 |= ((crc2_pre >> 24) & 0xff) << 16
239+
elif regs == 0x40123780:
240+
# wordswapped [DCBA] *.n64
241+
crc1 = 0
242+
crc1 |= ((crc1_pre >> 0) & 0xff) << 24
243+
crc1 |= ((crc1_pre >> 8) & 0xff) << 16
244+
crc1 |= ((crc1_pre >> 16) & 0xff) << 8
245+
crc1 |= ((crc1_pre >> 24) & 0xff) << 0
246+
crc2 = 0
247+
crc2 |= ((crc2_pre >> 0) & 0xff) << 24
248+
crc2 |= ((crc2_pre >> 8) & 0xff) << 16
249+
crc2 |= ((crc2_pre >> 16) & 0xff) << 8
250+
crc2 |= ((crc2_pre >> 24) & 0xff) << 0
251+
else:
252+
return None
253+
return (crc1, crc2)
254+
208255
def read_files(self):
209256
"""Reads files."""
210257
self.roms = []
@@ -215,16 +262,13 @@ def read_files(self):
215262
try:
216263
archive = Archive(fullpath)
217264
for fname in archive.namelist:
218-
rom_header = m64p_rom_header()
219-
ctypes.memmove(
220-
ctypes.byref(rom_header),
221-
archive.read(fname, ctypes.sizeof(rom_header)),
222-
ctypes.sizeof(rom_header))
223-
rom_settings = self.parent.core.get_rom_settings(
224-
sl(rom_header.CRC1), sl(rom_header.CRC2))
225-
if rom_settings:
226-
crc = "%X%X" % (sl(rom_header.CRC1), sl(rom_header.CRC2))
227-
self.roms.append((crc, rom_settings.goodname, fullpath, fname))
265+
crc_tuple = self.get_rom_crc(archive, fname)
266+
if crc_tuple:
267+
rom_settings = self.parent.core.get_rom_settings(
268+
crc_tuple[0], crc_tuple[1])
269+
if rom_settings:
270+
crc = "%X%X" % (crc_tuple[0], crc_tuple[1])
271+
self.roms.append((crc, rom_settings.goodname, fullpath, fname))
228272
archive.close()
229273
except Exception as err:
230274
log.warn(str(err))

0 commit comments

Comments
 (0)