auto Cartridge::serialize(serializer& s) -> void {
  mrom.serialize(s);
  if(has.sram) sram.serialize(s);
  if(has.eeprom) eeprom.serialize(s);
  if(has.flash) flash.serialize(s);
}

auto Cartridge::MROM::serialize(serializer& s) -> void {
  s.integer(size);
  s.integer(mask);
}

auto Cartridge::SRAM::serialize(serializer& s) -> void {
  s.array(data, size);
  s.integer(size);
  s.integer(mask);
}

auto Cartridge::EEPROM::serialize(serializer& s) -> void {
  s.array(data, size);
  s.integer(size);
  s.integer(mask);
  s.integer(test);
  s.integer(bits);
  s.integer((uint&)mode);
  s.integer(offset);
  s.integer(address);
  s.integer(addressbits);
}

auto Cartridge::FLASH::serialize(serializer& s) -> void {
  s.array(data, size);
  s.integer(size);
  s.integer(id);
  s.integer(unlockhi);
  s.integer(unlocklo);
  s.integer(idmode);
  s.integer(erasemode);
  s.integer(bankselect);
  s.integer(writeselect);
  s.integer(bank);
}
