def overrideitem(self, rom_bank, address, value): if 0x0000 <= address < 0x4000: logger.debug( "Performing overwrite on address: %s:%s. New value: %s Old value: %s" % (hex(rom_bank), hex(address), hex(value), self.rombanks[rom_bank][address]) ) self.rombanks[rom_bank][address] = value else: logger.error("Invalid override address: %s" % hex(address))
def load_ram(self, f): if not self.rambank_initialized: logger.warning("Loading RAM is not supported on {}".format(self.carttype)) return for bank in range(self.external_ram_count): for byte in range(8 * 1024): self.rambanks[bank][byte] = f.read() logger.debug("RAM loaded.")
def save_ram(self, f): if not self.rambank_initialized: logger.warning("Saving RAM is not supported on {}".format(self.carttype)) return for bank in range(self.external_ram_count): for byte in range(8 * 1024): f.write(self.rambanks[bank][byte]) logger.debug("RAM saved.")
def save_state(self, f): logger.debug("Saving state...") f.write(STATE_VERSION) f.write(self.bootrom_enabled) self.cpu.save_state(f) self.lcd.save_state(f) self.window.save_state(f) self.ram.save_state(f) self.cartridge.save_state(f) f.flush() logger.debug("State saved.")
def setitem(self, address, value): if 0x2000 <= address < 0x4000: if value == 0: value = 1 self.rombank_selected = (value & 0b1) logger.debug("Switching bank 0x%0.4x, 0x%0.2x" % (address, value)) elif 0xA000 <= address < 0xC000: if self.rambanks is None: from . import EXTERNAL_RAM_TABLE logger.warning( "Game tries to set value 0x%0.2x at RAM address 0x%0.4x, but " "RAM banks are not initialized. Initializing %d RAM banks as " "precaution" % (value, address, EXTERNAL_RAM_TABLE[0x02])) self.init_rambanks(EXTERNAL_RAM_TABLE[0x02]) self.rambanks[self.rambank_selected][address - 0xA000] = value else: logger.warning("Unexpected write to 0x%0.4x, value: 0x%0.2x" % (address, value))
def load_state(self, f): logger.debug("Loading state...") state_version = f.read() if state_version >= 2: logger.debug(f"State version: {state_version}") # From version 2 and above, this is the version number self.bootrom_enabled = f.read() else: logger.debug(f"State version: 0-1") # HACK: The byte wasn't a state version, but the bootrom flag self.bootrom_enabled = state_version self.cpu.load_state(f, state_version) self.lcd.load_state(f, state_version) if state_version >= 2: self.window.load_state(f, state_version) self.ram.load_state(f, state_version) self.cartridge.load_state(f, state_version) f.flush() logger.debug("State loaded.") self.window.clearcache = True self.window.update_cache(self.lcd)