@@ -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