diff --git a/src/m64py/frontend/romlist.py b/src/m64py/frontend/romlist.py index bbc20f4..036b2c7 100644 --- a/src/m64py/frontend/romlist.py +++ b/src/m64py/frontend/romlist.py @@ -15,17 +15,12 @@ # along with this program. If not, see . import os -import ctypes -import fnmatch -from PyQt5.QtGui import * -from PyQt5.QtWidgets import * -from PyQt5.QtCore import * +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap +from PyQt5.QtWidgets import QMainWindow, QDesktopWidget, QListWidgetItem, QGraphicsPixmapItem -from m64py.utils import sl -from m64py.core.defs import m64p_rom_header -from m64py.frontend.log import log -from m64py.archive import Archive, EXT_FILTER +from m64py.frontend.romreader import ROMReader from m64py.ui.romlist_ui import Ui_ROMList try: @@ -184,115 +179,3 @@ class ROMList(QMainWindow, Ui_ROMList): self.snapshotView.scene().addItem(snapshot_item) self.title_item = title_item self.snapshot_item = snapshot_item - - -class ROMReader(QThread): - """ROM reader thread""" - - def __init__(self, parent): - """Constructor.""" - QThread.__init__(self, parent) - self.parent = parent - self.roms = [] - self.rom_path = None - - def set_path(self, path): - """Sets ROM directory path.""" - self.rom_path = path - - def get_roms(self): - """Returns ROM list.""" - return self.roms - - def get_files(self): - """Returns list of files found in path.""" - files = [] - types = EXT_FILTER.split() - for filename in os.listdir(self.rom_path): - for ext in types: - if fnmatch.fnmatch(filename, ext): - files.append(filename) - return files - - def get_rom_crc(self, archive, fname): - rom_header = m64p_rom_header() - ctypes.memmove( - ctypes.byref(rom_header), - archive.read(fname, ctypes.sizeof(rom_header)), - ctypes.sizeof(rom_header)) - crc1_pre = sl(rom_header.CRC1) - crc2_pre = sl(rom_header.CRC2) - - regs = 0 - regs |= rom_header.init_PI_BSB_DOM1_LAT_REG << 24 - regs |= rom_header.init_PI_BSB_DOM1_PGS_REG << 16 - regs |= rom_header.init_PI_BSB_DOM1_PWD_REG << 8 - regs |= rom_header.init_PI_BSB_DOM1_PGS_REG2 - - if regs == 0x80371240: - # native *.z64 - crc1 = crc1_pre - crc2 = crc2_pre - elif regs == 0x37804012: - # byteswapped [BADC] *.v64 - crc1 = 0 - crc1 |= ((crc1_pre >> 0) & 0xff) << 8 - crc1 |= ((crc1_pre >> 8) & 0xff) << 0 - crc1 |= ((crc1_pre >> 16) & 0xff) << 24 - crc1 |= ((crc1_pre >> 24) & 0xff) << 16 - crc2 = 0 - crc2 |= ((crc2_pre >> 0) & 0xff) << 8 - crc2 |= ((crc2_pre >> 8) & 0xff) << 0 - crc2 |= ((crc2_pre >> 16) & 0xff) << 24 - crc2 |= ((crc2_pre >> 24) & 0xff) << 16 - elif regs == 0x40123780: - # wordswapped [DCBA] *.n64 - crc1 = 0 - crc1 |= ((crc1_pre >> 0) & 0xff) << 24 - crc1 |= ((crc1_pre >> 8) & 0xff) << 16 - crc1 |= ((crc1_pre >> 16) & 0xff) << 8 - crc1 |= ((crc1_pre >> 24) & 0xff) << 0 - crc2 = 0 - crc2 |= ((crc2_pre >> 0) & 0xff) << 24 - crc2 |= ((crc2_pre >> 8) & 0xff) << 16 - crc2 |= ((crc2_pre >> 16) & 0xff) << 8 - crc2 |= ((crc2_pre >> 24) & 0xff) << 0 - else: - return None - return (crc1, crc2) - - def read_files(self): - """Reads files.""" - self.roms = [] - files = self.get_files() - num_files = len(files) - for filenum, filename in enumerate(files): - fullpath = os.path.join(self.rom_path, filename) - try: - archive = Archive(fullpath) - for fname in archive.namelist: - crc_tuple = self.get_rom_crc(archive, fname) - if crc_tuple: - rom_settings = self.parent.core.get_rom_settings( - crc_tuple[0], crc_tuple[1]) - if rom_settings: - crc = "%X%X" % (crc_tuple[0], crc_tuple[1]) - self.roms.append((crc, rom_settings.goodname, fullpath, fname)) - archive.close() - except Exception as err: - log.warn(str(err)) - continue - percent = float(filenum) / float(num_files) * 100 - self.parent.progressBar.valueChanged.emit(percent) - self.exit() - - def stop(self): - """Stops thread.""" - if self.isRunning(): - self.terminate() - self.wait() - - def run(self): - """Starts thread.""" - self.read_files() - self.exec_() diff --git a/src/m64py/frontend/romreader.py b/src/m64py/frontend/romreader.py new file mode 100644 index 0000000..ff861d0 --- /dev/null +++ b/src/m64py/frontend/romreader.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Author: Milan Nikolic +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import ctypes +import fnmatch + +from PyQt5.QtCore import QThread + +from m64py.utils import sl +from m64py.core.defs import m64p_rom_header +from m64py.frontend.log import log +from m64py.archive import Archive, EXT_FILTER + + +class ROMReader(QThread): + """ROM reader thread""" + + def __init__(self, parent): + """Constructor.""" + QThread.__init__(self, parent) + self.parent = parent + self.roms = [] + self.rom_path = None + + def set_path(self, path): + """Sets ROM directory path.""" + self.rom_path = path + + def get_roms(self): + """Returns ROM list.""" + return self.roms + + def get_files(self): + """Returns list of files found in path.""" + files = [] + types = EXT_FILTER.split() + for filename in os.listdir(self.rom_path): + for ext in types: + if fnmatch.fnmatch(filename, ext): + files.append(filename) + return files + + def get_rom_crc(self, archive, fname): + rom_header = m64p_rom_header() + ctypes.memmove( + ctypes.byref(rom_header), + archive.read(fname, ctypes.sizeof(rom_header)), + ctypes.sizeof(rom_header)) + crc1_pre = sl(rom_header.CRC1) + crc2_pre = sl(rom_header.CRC2) + + regs = 0 + regs |= rom_header.init_PI_BSB_DOM1_LAT_REG << 24 + regs |= rom_header.init_PI_BSB_DOM1_PGS_REG << 16 + regs |= rom_header.init_PI_BSB_DOM1_PWD_REG << 8 + regs |= rom_header.init_PI_BSB_DOM1_PGS_REG2 + + if regs == 0x80371240: + # native *.z64 + crc1 = crc1_pre + crc2 = crc2_pre + elif regs == 0x37804012: + # byteswapped [BADC] *.v64 + crc1 = 0 + crc1 |= ((crc1_pre >> 0) & 0xff) << 8 + crc1 |= ((crc1_pre >> 8) & 0xff) << 0 + crc1 |= ((crc1_pre >> 16) & 0xff) << 24 + crc1 |= ((crc1_pre >> 24) & 0xff) << 16 + crc2 = 0 + crc2 |= ((crc2_pre >> 0) & 0xff) << 8 + crc2 |= ((crc2_pre >> 8) & 0xff) << 0 + crc2 |= ((crc2_pre >> 16) & 0xff) << 24 + crc2 |= ((crc2_pre >> 24) & 0xff) << 16 + elif regs == 0x40123780: + # wordswapped [DCBA] *.n64 + crc1 = 0 + crc1 |= ((crc1_pre >> 0) & 0xff) << 24 + crc1 |= ((crc1_pre >> 8) & 0xff) << 16 + crc1 |= ((crc1_pre >> 16) & 0xff) << 8 + crc1 |= ((crc1_pre >> 24) & 0xff) << 0 + crc2 = 0 + crc2 |= ((crc2_pre >> 0) & 0xff) << 24 + crc2 |= ((crc2_pre >> 8) & 0xff) << 16 + crc2 |= ((crc2_pre >> 16) & 0xff) << 8 + crc2 |= ((crc2_pre >> 24) & 0xff) << 0 + else: + return None + return (crc1, crc2) + + def read_files(self): + """Reads files.""" + self.roms = [] + files = self.get_files() + num_files = len(files) + for filenum, filename in enumerate(files): + fullpath = os.path.join(self.rom_path, filename) + try: + archive = Archive(fullpath) + for fname in archive.namelist: + crc_tuple = self.get_rom_crc(archive, fname) + if crc_tuple: + rom_settings = self.parent.core.get_rom_settings( + crc_tuple[0], crc_tuple[1]) + if rom_settings: + crc = "%X%X" % (crc_tuple[0], crc_tuple[1]) + self.roms.append((crc, rom_settings.goodname, fullpath, fname)) + archive.close() + except Exception as err: + log.warn(str(err)) + continue + percent = float(filenum) / float(num_files) * 100 + self.parent.progressBar.valueChanged.emit(percent) + self.exit() + + def stop(self): + """Stops thread.""" + if self.isRunning(): + self.terminate() + self.wait() + + def run(self): + """Starts thread.""" + self.read_files() + self.exec_()