[higan] 01/06: New upstream version 106

Tobias Hansen thansen at moszumanska.debian.org
Mon Nov 20 19:47:34 UTC 2017


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository higan.

commit b7058faa44602b6cc35ac48248ab3a50e3e1f4f9
Author: Tobias Hansen <thansen at debian.org>
Date:   Mon Nov 20 19:33:07 2017 +0100

    New upstream version 106
---
 higan/emulator/emulator.hpp                        |   2 +-
 higan/emulator/interface.hpp                       |   4 +-
 higan/fc/apu/apu.cpp                               |   2 +-
 higan/fc/apu/apu.hpp                               |   2 +-
 higan/fc/cpu/cpu.cpp                               |  12 +-
 higan/fc/cpu/cpu.hpp                               |   4 +-
 higan/fc/interface/interface.cpp                   |   7 +-
 higan/fc/interface/interface.hpp                   |   1 +
 higan/fc/ppu/ppu.cpp                               |  12 +-
 higan/fc/ppu/ppu.hpp                               |   2 +-
 higan/fc/system/serialization.cpp                  |   2 +-
 higan/fc/system/system.cpp                         |   8 +-
 higan/fc/system/system.hpp                         |   2 +-
 higan/md/apu/apu.cpp                               |   4 +-
 higan/md/apu/apu.hpp                               |   2 +-
 higan/md/cpu/cpu.cpp                               |   4 +-
 higan/md/cpu/cpu.hpp                               |   2 +-
 higan/md/interface/interface.cpp                   |   7 +-
 higan/md/interface/interface.hpp                   |   1 +
 higan/md/psg/psg.cpp                               |   2 +-
 higan/md/psg/psg.hpp                               |   2 +-
 higan/md/system/serialization.cpp                  |   2 +-
 higan/md/system/system.cpp                         |  12 +-
 higan/md/system/system.hpp                         |   2 +-
 higan/md/vdp/vdp.cpp                               |   8 +-
 higan/md/vdp/vdp.hpp                               |   5 +-
 higan/md/ym2612/ym2612.cpp                         |   2 +-
 higan/md/ym2612/ym2612.hpp                         |   2 +-
 higan/processor/spc700/instruction.cpp             |   2 +-
 higan/sfc/cartridge/load.cpp                       |   6 +-
 higan/sfc/coprocessor/armdsp/armdsp.cpp            |   9 -
 higan/sfc/coprocessor/armdsp/armdsp.hpp            |   3 -
 higan/sfc/coprocessor/epsonrtc/epsonrtc.cpp        |   8 +-
 higan/sfc/coprocessor/epsonrtc/epsonrtc.hpp        |   4 +-
 higan/sfc/coprocessor/event/event.cpp              |   6 -
 higan/sfc/coprocessor/event/event.hpp              |   2 -
 higan/sfc/coprocessor/hitachidsp/hitachidsp.cpp    |   6 -
 higan/sfc/coprocessor/hitachidsp/hitachidsp.hpp    |   2 -
 higan/sfc/coprocessor/icd2/icd2.cpp                |   3 -
 higan/sfc/coprocessor/icd2/icd2.hpp                |   1 -
 higan/sfc/coprocessor/mcc/mcc.cpp                  |   6 -
 higan/sfc/coprocessor/mcc/mcc.hpp                  |   2 -
 higan/sfc/coprocessor/msu1/msu1.cpp                |   6 -
 higan/sfc/coprocessor/msu1/msu1.hpp                |   2 -
 higan/sfc/coprocessor/necdsp/necdsp.cpp            |   9 -
 higan/sfc/coprocessor/necdsp/necdsp.hpp            |   3 -
 higan/sfc/coprocessor/nss/nss.cpp                  |   9 -
 higan/sfc/coprocessor/nss/nss.hpp                  |   3 -
 higan/sfc/coprocessor/obc1/obc1.cpp                |   6 -
 higan/sfc/coprocessor/obc1/obc1.hpp                |   2 -
 higan/sfc/coprocessor/sa1/sa1.cpp                  |   6 -
 higan/sfc/coprocessor/sa1/sa1.hpp                  |   2 -
 higan/sfc/coprocessor/sdd1/sdd1.cpp                |   6 -
 higan/sfc/coprocessor/sdd1/sdd1.hpp                |   2 -
 higan/sfc/coprocessor/sharprtc/sharprtc.cpp        |  10 +-
 higan/sfc/coprocessor/sharprtc/sharprtc.hpp        |   4 +-
 higan/sfc/coprocessor/spc7110/spc7110.cpp          |   6 -
 higan/sfc/coprocessor/spc7110/spc7110.hpp          |   2 -
 higan/sfc/coprocessor/superfx/superfx.cpp          |   6 -
 higan/sfc/coprocessor/superfx/superfx.hpp          |   2 -
 higan/sfc/cpu/cpu.cpp                              |   4 +-
 higan/sfc/cpu/cpu.hpp                              |   2 +-
 higan/sfc/dsp/dsp.cpp                              |   4 +-
 higan/sfc/dsp/dsp.hpp                              |   2 +-
 higan/sfc/interface/interface.cpp                  |   9 +-
 higan/sfc/interface/interface.hpp                  |   1 +
 higan/sfc/ppu/ppu.cpp                              |   4 +-
 higan/sfc/ppu/ppu.hpp                              |   2 +-
 higan/sfc/slot/bsmemory/bsmemory.cpp               |   7 +-
 higan/sfc/slot/bsmemory/bsmemory.hpp               |   1 -
 higan/sfc/slot/sufamiturbo/sufamiturbo.cpp         |   3 -
 higan/sfc/slot/sufamiturbo/sufamiturbo.hpp         |   1 -
 higan/sfc/smp/smp.cpp                              |   2 +-
 higan/sfc/smp/smp.hpp                              |   2 +-
 higan/sfc/system/serialization.cpp                 |   2 +-
 higan/sfc/system/system.cpp                        |  56 +-
 higan/sfc/system/system.hpp                        |   4 +-
 .../target-tomoko/configuration/configuration.cpp  |   3 +
 higan/target-tomoko/input/hotkeys.cpp              |   8 +
 higan/target-tomoko/presentation/presentation.cpp  |   5 +-
 higan/target-tomoko/presentation/presentation.hpp  |   4 +-
 higan/target-tomoko/program/medium.cpp             |   2 +
 higan/target-tomoko/program/program.cpp            |   7 +
 higan/target-tomoko/program/program.hpp            |   3 +
 higan/target-tomoko/program/utility.cpp            |  13 +-
 higan/target-tomoko/settings/advanced.cpp          |   5 +
 higan/target-tomoko/settings/settings.hpp          |   2 +
 higan/target-tomoko/tools/game-notes.cpp           |  22 +
 higan/target-tomoko/tools/tools.cpp                |   1 +
 higan/target-tomoko/tools/tools.hpp                |  10 +
 icarus/Database/Super Famicom.bml                  | 825 ++++++++++++++++++++-
 libco/doc/style.css                                |   4 +
 libco/doc/usage.html                               |  29 +-
 libco/libco.h                                      |   4 +-
 nall/GNUmakefile                                   |   3 +-
 95 files changed, 1002 insertions(+), 317 deletions(-)

diff --git a/higan/emulator/emulator.hpp b/higan/emulator/emulator.hpp
index 4ff509f..cd5038b 100644
--- a/higan/emulator/emulator.hpp
+++ b/higan/emulator/emulator.hpp
@@ -12,7 +12,7 @@ using namespace nall;
 
 namespace Emulator {
   static const string Name    = "higan";
-  static const string Version = "105";
+  static const string Version = "106";
   static const string Author  = "byuu";
   static const string License = "GPLv3";
   static const string Website = "https://byuu.org/";
diff --git a/higan/emulator/interface.hpp b/higan/emulator/interface.hpp
index 8d28406..c5ef807 100644
--- a/higan/emulator/interface.hpp
+++ b/higan/emulator/interface.hpp
@@ -6,7 +6,8 @@ struct Interface {
   struct Information {
     string manufacturer;
     string name;
-    bool overscan;
+    bool overscan = false;
+    bool resettable = false;
   } information;
 
   struct Medium {
@@ -59,6 +60,7 @@ struct Interface {
   //system interface
   virtual auto connect(uint port, uint device) -> void {}
   virtual auto power() -> void {}
+  virtual auto reset() -> void {}
   virtual auto run() -> void {}
 
   //time functions
diff --git a/higan/fc/apu/apu.cpp b/higan/fc/apu/apu.cpp
index c249ecc..c35d6ad 100644
--- a/higan/fc/apu/apu.cpp
+++ b/higan/fc/apu/apu.cpp
@@ -71,7 +71,7 @@ auto APU::setSample(int16 sample) -> void {
   cartridgeSample = sample;
 }
 
-auto APU::power() -> void {
+auto APU::power(bool reset) -> void {
   create(APU::Enter, system.frequency());
   stream = Emulator::audio.createStream(1, frequency() / rate());
   stream->addFilter(Emulator::Filter::Order::First, Emulator::Filter::Type::HighPass, 90.0);
diff --git a/higan/fc/apu/apu.hpp b/higan/fc/apu/apu.hpp
index 420dc0e..c55d976 100644
--- a/higan/fc/apu/apu.hpp
+++ b/higan/fc/apu/apu.hpp
@@ -12,7 +12,7 @@ struct APU : Thread {
   auto setIRQ() -> void;
   auto setSample(int16 sample) -> void;
 
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   auto readIO(uint16 addr) -> uint8;
   auto writeIO(uint16 addr, uint8 data) -> void;
diff --git a/higan/fc/cpu/cpu.cpp b/higan/fc/cpu/cpu.cpp
index d1652fa..e8a7298 100644
--- a/higan/fc/cpu/cpu.cpp
+++ b/higan/fc/cpu/cpu.cpp
@@ -24,16 +24,16 @@ auto CPU::step(uint clocks) -> void {
   for(auto peripheral : peripherals) synchronize(*peripheral);
 }
 
-auto CPU::power() -> void {
+auto CPU::power(bool reset) -> void {
   MOS6502::BCD = 0;
   MOS6502::power();
   create(CPU::Enter, system.frequency());
 
-  for(auto addr : range(0x0800)) ram[addr] = 0xff;
-  ram[0x0008] = 0xf7;
-  ram[0x0009] = 0xef;
-  ram[0x000a] = 0xdf;
-  ram[0x000f] = 0xbf;
+  if(!reset) for(auto& data : ram) data = 0xff;
+  ram[0x008] = 0xf7;  //todo: what is this about?
+  ram[0x009] = 0xef;
+  ram[0x00a] = 0xdf;
+  ram[0x00f] = 0xbf;
 
   r.pc.byte(0) = bus.read(0xfffc);
   r.pc.byte(1) = bus.read(0xfffd);
diff --git a/higan/fc/cpu/cpu.hpp b/higan/fc/cpu/cpu.hpp
index 978e537..b803627 100644
--- a/higan/fc/cpu/cpu.hpp
+++ b/higan/fc/cpu/cpu.hpp
@@ -6,7 +6,7 @@ struct CPU : Processor::MOS6502, Thread {
   auto main() -> void;
   auto step(uint clocks) -> void;
 
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //memory.cpp
   auto readRAM(uint11 addr) -> uint8;
@@ -37,7 +37,7 @@ struct CPU : Processor::MOS6502, Thread {
 //protected:
   vector<Thread*> peripherals;
 
-  uint8 ram[0x0800];
+  uint8 ram[0x800];
 
   struct IO {
     bool interruptPending;
diff --git a/higan/fc/interface/interface.cpp b/higan/fc/interface/interface.cpp
index 7943236..7fc12e0 100644
--- a/higan/fc/interface/interface.cpp
+++ b/higan/fc/interface/interface.cpp
@@ -8,6 +8,7 @@ Interface::Interface() {
   information.manufacturer = "Nintendo";
   information.name         = "Famicom";
   information.overscan     = true;
+  information.resettable   = true;
 
   media.append({ID::Famicom, "Famicom", "fc"});
 
@@ -137,7 +138,11 @@ auto Interface::connect(uint port, uint device) -> void {
 }
 
 auto Interface::power() -> void {
-  system.power();
+  system.power(/* reset = */ false);
+}
+
+auto Interface::reset() -> void {
+  system.power(/* reset = */ true);
 }
 
 auto Interface::run() -> void {
diff --git a/higan/fc/interface/interface.hpp b/higan/fc/interface/interface.hpp
index 6fb05d8..9478783 100644
--- a/higan/fc/interface/interface.hpp
+++ b/higan/fc/interface/interface.hpp
@@ -38,6 +38,7 @@ struct Interface : Emulator::Interface {
 
   auto connect(uint port, uint device) -> void override;
   auto power() -> void override;
+  auto reset() -> void override;
   auto run() -> void override;
 
   auto serialize() -> serializer override;
diff --git a/higan/fc/ppu/ppu.cpp b/higan/fc/ppu/ppu.cpp
index 46b6a07..09aae30 100644
--- a/higan/fc/ppu/ppu.cpp
+++ b/higan/fc/ppu/ppu.cpp
@@ -54,18 +54,20 @@ auto PPU::refresh() -> void {
   Emulator::video.refresh(buffer, 256 * sizeof(uint32), 256, 240);
 }
 
-auto PPU::power() -> void {
+auto PPU::power(bool reset) -> void {
   create(PPU::Enter, system.frequency());
 
   memory::fill(&io, sizeof(IO));
   memory::fill(&latch, sizeof(Latches));
   io.vramIncrement = 1;
 
-  for(auto& n : ciram ) n = 0;
-  for(auto& n : cgram ) n = 0;
-  for(auto& n : oam   ) n = 0;
+  if(!reset) {
+    for(auto& data : ciram ) data = 0;
+    for(auto& data : cgram ) data = 0;
+    for(auto& data : oam   ) data = 0;
+  }
 
-  for(auto& n : buffer) n = 0;
+  for(auto& data : buffer) data = 0;
 }
 
 }
diff --git a/higan/fc/ppu/ppu.hpp b/higan/fc/ppu/ppu.hpp
index 52efb8f..4850b1f 100644
--- a/higan/fc/ppu/ppu.hpp
+++ b/higan/fc/ppu/ppu.hpp
@@ -11,7 +11,7 @@ struct PPU : Thread {
   auto frame() -> void;
   auto refresh() -> void;
 
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //memory.cpp
   auto readCIRAM(uint11 addr) -> uint8;
diff --git a/higan/fc/system/serialization.cpp b/higan/fc/system/serialization.cpp
index 0c11bc0..d653465 100644
--- a/higan/fc/system/serialization.cpp
+++ b/higan/fc/system/serialization.cpp
@@ -31,7 +31,7 @@ auto System::unserialize(serializer& s) -> bool {
   if(signature != 0x31545342) return false;
   if(string{version} != Emulator::SerializerVersion) return false;
 
-  power();
+  power(/* reset = */ false);
   serializeAll(s);
   return true;
 }
diff --git a/higan/fc/system/system.cpp b/higan/fc/system/system.cpp
index 84332a6..4f297d5 100644
--- a/higan/fc/system/system.cpp
+++ b/higan/fc/system/system.cpp
@@ -62,7 +62,7 @@ auto System::unload() -> void {
   information.loaded = false;
 }
 
-auto System::power() -> void {
+auto System::power(bool reset) -> void {
   Emulator::video.reset();
   Emulator::video.setInterface(interface);
   configureVideoPalette();
@@ -73,9 +73,9 @@ auto System::power() -> void {
 
   scheduler.reset();
   cartridge.power();
-  cpu.power();
-  apu.power();
-  ppu.power();
+  cpu.power(reset);
+  apu.power(reset);
+  ppu.power(reset);
   scheduler.primary(cpu);
 
   controllerPort1.power(ID::Port::Controller1);
diff --git a/higan/fc/system/system.hpp b/higan/fc/system/system.hpp
index abebe2d..9d666b3 100644
--- a/higan/fc/system/system.hpp
+++ b/higan/fc/system/system.hpp
@@ -11,7 +11,7 @@ struct System {
   auto load(Emulator::Interface*) -> bool;
   auto save() -> void;
   auto unload() -> void;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   auto init() -> void;
   auto term() -> void;
diff --git a/higan/md/apu/apu.cpp b/higan/md/apu/apu.cpp
index 55c9991..c180e79 100644
--- a/higan/md/apu/apu.cpp
+++ b/higan/md/apu/apu.cpp
@@ -52,11 +52,13 @@ auto APU::enable(bool value) -> void {
   state.enabled = value;
 }
 
-auto APU::power() -> void {
+auto APU::power(bool reset) -> void {
   Z80::bus = this;
   Z80::power();
   bus->grant(false);
   create(APU::Enter, system.frequency() / 15.0);
+
+  if(!reset) memory::fill(ram, sizeof ram);
   state = {};
 }
 
diff --git a/higan/md/apu/apu.hpp b/higan/md/apu/apu.hpp
index fcc65b8..d8f5a7a 100644
--- a/higan/md/apu/apu.hpp
+++ b/higan/md/apu/apu.hpp
@@ -8,7 +8,7 @@ struct APU : Processor::Z80, Processor::Z80::Bus, Thread {
   auto synchronizing() const -> bool override;
 
   auto enable(bool) -> void;
-  auto power() -> void;
+  auto power(bool reset) -> void;
   auto reset() -> void;
 
   auto setNMI(bool value) -> void;
diff --git a/higan/md/cpu/cpu.cpp b/higan/md/cpu/cpu.cpp
index 4b8499c..47e59de 100644
--- a/higan/md/cpu/cpu.cpp
+++ b/higan/md/cpu/cpu.cpp
@@ -80,11 +80,13 @@ auto CPU::load(Markup::Node node) -> bool {
   return true;
 }
 
-auto CPU::power() -> void {
+auto CPU::power(bool reset) -> void {
   M68K::bus = this;
   M68K::power();
   create(CPU::Enter, system.frequency() / 7.0);
 
+  if(!reset) memory::fill(ram, sizeof ram);
+
   io = {};
   io.version = tmssEnable;
   io.romEnable = !tmssEnable;
diff --git a/higan/md/cpu/cpu.hpp b/higan/md/cpu/cpu.hpp
index fb97ee2..0811ea1 100644
--- a/higan/md/cpu/cpu.hpp
+++ b/higan/md/cpu/cpu.hpp
@@ -19,7 +19,7 @@ struct CPU : Processor::M68K, Processor::M68K::Bus, Thread {
   auto lower(Interrupt) -> void;
 
   auto load(Markup::Node) -> bool;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //bus.cpp
   auto readByte(uint24 address) -> uint16 override;
diff --git a/higan/md/interface/interface.cpp b/higan/md/interface/interface.cpp
index 3beff4a..7e7f74d 100644
--- a/higan/md/interface/interface.cpp
+++ b/higan/md/interface/interface.cpp
@@ -8,6 +8,7 @@ Interface::Interface() {
   information.manufacturer = "Sega";
   information.name         = "Mega Drive";
   information.overscan     = true;
+  information.resettable   = true;
 
   media.append({ID::MegaDrive, "Mega Drive", "md"});
 
@@ -122,7 +123,11 @@ auto Interface::connect(uint port, uint device) -> void {
 }
 
 auto Interface::power() -> void {
-  system.power();
+  system.power(/* reset = */ false);
+}
+
+auto Interface::reset() -> void {
+  system.power(/* reset = */ true);
 }
 
 auto Interface::run() -> void {
diff --git a/higan/md/interface/interface.hpp b/higan/md/interface/interface.hpp
index 6d555f3..75547e1 100644
--- a/higan/md/interface/interface.hpp
+++ b/higan/md/interface/interface.hpp
@@ -38,6 +38,7 @@ struct Interface : Emulator::Interface {
 
   auto connect(uint port, uint device) -> void override;
   auto power() -> void override;
+  auto reset() -> void override;
   auto run() -> void override;
 
   auto serialize() -> serializer override;
diff --git a/higan/md/psg/psg.cpp b/higan/md/psg/psg.cpp
index 9fd6872..752e14a 100644
--- a/higan/md/psg/psg.cpp
+++ b/higan/md/psg/psg.cpp
@@ -34,7 +34,7 @@ auto PSG::step(uint clocks) -> void {
   synchronize(apu);
 }
 
-auto PSG::power() -> void {
+auto PSG::power(bool reset) -> void {
   create(PSG::Enter, system.frequency() / 15.0);
   stream = Emulator::audio.createStream(1, frequency() / 16.0);
   stream->addFilter(Emulator::Filter::Order::First, Emulator::Filter::Type::HighPass, 20.0);
diff --git a/higan/md/psg/psg.hpp b/higan/md/psg/psg.hpp
index cd1e6ea..6d7f60c 100644
--- a/higan/md/psg/psg.hpp
+++ b/higan/md/psg/psg.hpp
@@ -7,7 +7,7 @@ struct PSG : Thread {
   auto main() -> void;
   auto step(uint clocks) -> void;
 
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //io.cpp
   auto write(uint8 data) -> void;
diff --git a/higan/md/system/serialization.cpp b/higan/md/system/serialization.cpp
index 9ea9755..ccad3cc 100644
--- a/higan/md/system/serialization.cpp
+++ b/higan/md/system/serialization.cpp
@@ -48,7 +48,7 @@ auto System::unserialize(serializer& s) -> bool {
   if(signature != 0x31545342) return false;
   if(string{version} != Emulator::SerializerVersion) return false;
 
-  power();
+  power(/* reset = */ false);
   serializeAll(s);
   return true;
 }
diff --git a/higan/md/system/system.cpp b/higan/md/system/system.cpp
index 2bc8da2..7dd250e 100644
--- a/higan/md/system/system.cpp
+++ b/higan/md/system/system.cpp
@@ -61,7 +61,7 @@ auto System::unload() -> void {
   cartridge.unload();
 }
 
-auto System::power() -> void {
+auto System::power(bool reset) -> void {
   Emulator::video.reset();
   Emulator::video.setInterface(interface);
   Emulator::video.setPalette();
@@ -71,11 +71,11 @@ auto System::power() -> void {
 
   scheduler.reset();
   cartridge.power();
-  cpu.power();
-  apu.power();
-  vdp.power();
-  psg.power();
-  ym2612.power();
+  cpu.power(reset);
+  apu.power(reset);
+  vdp.power(reset);
+  psg.power(reset);
+  ym2612.power(reset);
   scheduler.primary(cpu);
 
   controllerPort1.power(ID::Port::Controller1);
diff --git a/higan/md/system/system.hpp b/higan/md/system/system.hpp
index b98a991..99994b9 100644
--- a/higan/md/system/system.hpp
+++ b/higan/md/system/system.hpp
@@ -15,7 +15,7 @@ struct System {
   auto load(Emulator::Interface*, maybe<Region> = nothing) -> bool;
   auto save() -> void;
   auto unload() -> void;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //serialization.cpp
   auto serializeInit() -> void;
diff --git a/higan/md/vdp/vdp.cpp b/higan/md/vdp/vdp.cpp
index 300cadb..9e79d71 100644
--- a/higan/md/vdp/vdp.cpp
+++ b/higan/md/vdp/vdp.cpp
@@ -81,11 +81,17 @@ auto VDP::refresh() -> void {
   Emulator::video.refresh(data, 1280 * sizeof(uint32), 1280, 480);
 }
 
-auto VDP::power() -> void {
+auto VDP::power(bool reset) -> void {
   create(VDP::Enter, system.frequency() / 2.0);
 
   output = buffer + 16 * 1280;  //overscan offset
 
+  if(!reset) {
+    for(auto& data : vram.memory) data = 0;
+    for(auto& data : vsram.memory) data = 0;
+    for(auto& data : cram.memory) data = 0;
+  }
+
   io = {};
   latch = {};
   state = {};
diff --git a/higan/md/vdp/vdp.hpp b/higan/md/vdp/vdp.hpp
index 8bafbf6..923de5b 100644
--- a/higan/md/vdp/vdp.hpp
+++ b/higan/md/vdp/vdp.hpp
@@ -6,7 +6,7 @@ struct VDP : Thread {
   auto step(uint clocks) -> void;
   auto refresh() -> void;
 
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //io.cpp
   auto read(uint24 addr) -> uint16;
@@ -166,7 +166,6 @@ private:
     //serialization.cpp
     auto serialize(serializer&) -> void;
 
-  private:
     uint16 memory[32768];
   } vram;
 
@@ -179,7 +178,6 @@ private:
     //serialization.cpp
     auto serialize(serializer&) -> void;
 
-  private:
     uint10 memory[40];
   } vsram;
 
@@ -192,7 +190,6 @@ private:
     //serialization.cpp
     auto serialize(serializer&) -> void;
 
-  private:
     uint9 memory[64];
   } cram;
 
diff --git a/higan/md/ym2612/ym2612.cpp b/higan/md/ym2612/ym2612.cpp
index 38f97d3..efd6fc8 100644
--- a/higan/md/ym2612/ym2612.cpp
+++ b/higan/md/ym2612/ym2612.cpp
@@ -154,7 +154,7 @@ auto YM2612::step(uint clocks) -> void {
   synchronize(apu);
 }
 
-auto YM2612::power() -> void {
+auto YM2612::power(bool reset) -> void {
   create(YM2612::Enter, system.frequency() / 7.0);
   stream = Emulator::audio.createStream(2, frequency() / 144.0);
   stream->addFilter(Emulator::Filter::Order::First, Emulator::Filter::Type::HighPass, 20.0);
diff --git a/higan/md/ym2612/ym2612.hpp b/higan/md/ym2612/ym2612.hpp
index dc0695d..4ab7a17 100644
--- a/higan/md/ym2612/ym2612.hpp
+++ b/higan/md/ym2612/ym2612.hpp
@@ -8,7 +8,7 @@ struct YM2612 : Thread {
   auto sample() -> void;
   auto step(uint clocks) -> void;
 
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //io.cpp
   auto readStatus() -> uint8;
diff --git a/higan/processor/spc700/instruction.cpp b/higan/processor/spc700/instruction.cpp
index b4291e4..4d04d88 100644
--- a/higan/processor/spc700/instruction.cpp
+++ b/higan/processor/spc700/instruction.cpp
@@ -62,7 +62,7 @@ auto SPC700::instruction() -> void {
   op(0x38, DirectImmediateModify, fp(AND))
   op(0x39, IndirectXWriteIndirectY, fp(AND))
   op(0x3a, DirectModifyWord, +1)
-  op(0x3b, DirectIndexedModify, fp(ROL), A)
+  op(0x3b, DirectIndexedModify, fp(ROL), X)
   op(0x3c, ImpliedModify, fp(ROL), A)
   op(0x3d, ImpliedModify, fp(INC), X)
   op(0x3e, DirectRead, fp(CMP), X)
diff --git a/higan/sfc/cartridge/load.cpp b/higan/sfc/cartridge/load.cpp
index a66ff00..5073ef2 100644
--- a/higan/sfc/cartridge/load.cpp
+++ b/higan/sfc/cartridge/load.cpp
@@ -259,9 +259,10 @@ auto Cartridge::loadNECDSP(Markup::Node node) -> void {
 auto Cartridge::loadEpsonRTC(Markup::Node node) -> void {
   has.EpsonRTC = true;
 
+  epsonrtc.initialize();
   if(auto fp = platform->open(ID::SuperFamicom, node["ram"]["name"].text(), File::Read)) {
     uint8 data[16] = {0};
-    for(auto& byte : data) fp->read();
+    for(auto& byte : data) byte = fp->read();
     epsonrtc.load(data);
   }
 
@@ -271,9 +272,10 @@ auto Cartridge::loadEpsonRTC(Markup::Node node) -> void {
 auto Cartridge::loadSharpRTC(Markup::Node node) -> void {
   has.SharpRTC = true;
 
+  sharprtc.initialize();
   if(auto fp = platform->open(ID::SuperFamicom, node["ram"]["name"].text(), File::Read)) {
     uint8 data[16] = {0};
-    for(auto& byte : data) fp->read();
+    for(auto& byte : data) byte = fp->read();
     sharprtc.load(data);
   }
 
diff --git a/higan/sfc/coprocessor/armdsp/armdsp.cpp b/higan/sfc/coprocessor/armdsp/armdsp.cpp
index e9dabfc..a9ecec7 100644
--- a/higan/sfc/coprocessor/armdsp/armdsp.cpp
+++ b/higan/sfc/coprocessor/armdsp/armdsp.cpp
@@ -81,15 +81,6 @@ auto ArmDSP::write(uint24 addr, uint8 data) -> void {
   }
 }
 
-auto ArmDSP::init() -> void {
-}
-
-auto ArmDSP::load() -> void {
-}
-
-auto ArmDSP::unload() -> void {
-}
-
 auto ArmDSP::power() -> void {
   random.array((uint8*)programRAM, sizeof(programRAM));
   bridge.reset = false;
diff --git a/higan/sfc/coprocessor/armdsp/armdsp.hpp b/higan/sfc/coprocessor/armdsp/armdsp.hpp
index 428ca2a..7f9b270 100644
--- a/higan/sfc/coprocessor/armdsp/armdsp.hpp
+++ b/higan/sfc/coprocessor/armdsp/armdsp.hpp
@@ -19,9 +19,6 @@ struct ArmDSP : Processor::ARM7TDMI, Thread {
   auto read(uint24 addr, uint8 data) -> uint8;
   auto write(uint24 addr, uint8 data) -> void;
 
-  auto init() -> void;
-  auto load() -> void;
-  auto unload() -> void;
   auto power() -> void;
   auto reset() -> void;  //soft reset
 
diff --git a/higan/sfc/coprocessor/epsonrtc/epsonrtc.cpp b/higan/sfc/coprocessor/epsonrtc/epsonrtc.cpp
index c11b8d8..d4002ba 100644
--- a/higan/sfc/coprocessor/epsonrtc/epsonrtc.cpp
+++ b/higan/sfc/coprocessor/epsonrtc/epsonrtc.cpp
@@ -30,10 +30,7 @@ auto EpsonRTC::main() -> void {
   synchronize(cpu);
 }
 
-auto EpsonRTC::init() -> void {
-}
-
-auto EpsonRTC::load() -> void {
+auto EpsonRTC::initialize() -> void {
   secondlo = 0;
   secondhi = 0;
   batteryfailure = 1;
@@ -74,9 +71,6 @@ auto EpsonRTC::load() -> void {
   test = 0;
 }
 
-auto EpsonRTC::unload() -> void {
-}
-
 auto EpsonRTC::power() -> void {
   create(EpsonRTC::Enter, 32'768 * 64);
 
diff --git a/higan/sfc/coprocessor/epsonrtc/epsonrtc.hpp b/higan/sfc/coprocessor/epsonrtc/epsonrtc.hpp
index 66e0dd0..581c792 100644
--- a/higan/sfc/coprocessor/epsonrtc/epsonrtc.hpp
+++ b/higan/sfc/coprocessor/epsonrtc/epsonrtc.hpp
@@ -4,9 +4,7 @@ struct EpsonRTC : Thread {
   static auto Enter() -> void;
   auto main() -> void;
 
-  auto init() -> void;
-  auto load() -> void;
-  auto unload() -> void;
+  auto initialize() -> void;
   auto power() -> void;
   auto sync() -> void;
 
diff --git a/higan/sfc/coprocessor/event/event.cpp b/higan/sfc/coprocessor/event/event.cpp
index 15cd3a7..5cef991 100644
--- a/higan/sfc/coprocessor/event/event.cpp
+++ b/higan/sfc/coprocessor/event/event.cpp
@@ -28,12 +28,6 @@ auto Event::main() -> void {
   synchronize(cpu);
 }
 
-auto Event::init() -> void {
-}
-
-auto Event::load() -> void {
-}
-
 auto Event::unload() -> void {
   rom[0].reset();
   rom[1].reset();
diff --git a/higan/sfc/coprocessor/event/event.hpp b/higan/sfc/coprocessor/event/event.hpp
index 90301a6..01a6157 100644
--- a/higan/sfc/coprocessor/event/event.hpp
+++ b/higan/sfc/coprocessor/event/event.hpp
@@ -5,8 +5,6 @@
 struct Event : Thread {
   static auto Enter() -> void;
   auto main() -> void;
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/hitachidsp/hitachidsp.cpp b/higan/sfc/coprocessor/hitachidsp/hitachidsp.cpp
index 96fd6c7..9a5e35d 100644
--- a/higan/sfc/coprocessor/hitachidsp/hitachidsp.cpp
+++ b/higan/sfc/coprocessor/hitachidsp/hitachidsp.cpp
@@ -25,12 +25,6 @@ auto HitachiDSP::main() -> void {
   synchronize(cpu);
 }
 
-auto HitachiDSP::init() -> void {
-}
-
-auto HitachiDSP::load() -> void {
-}
-
 auto HitachiDSP::unload() -> void {
   rom.reset();
   ram.reset();
diff --git a/higan/sfc/coprocessor/hitachidsp/hitachidsp.hpp b/higan/sfc/coprocessor/hitachidsp/hitachidsp.hpp
index cee30bb..9e23d85 100644
--- a/higan/sfc/coprocessor/hitachidsp/hitachidsp.hpp
+++ b/higan/sfc/coprocessor/hitachidsp/hitachidsp.hpp
@@ -5,8 +5,6 @@ struct HitachiDSP : Processor::HG51B, Thread {
   static auto Enter() -> void;
   auto main() -> void;
 
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/icd2/icd2.cpp b/higan/sfc/coprocessor/icd2/icd2.cpp
index 43bd0f4..dfa0b2a 100644
--- a/higan/sfc/coprocessor/icd2/icd2.cpp
+++ b/higan/sfc/coprocessor/icd2/icd2.cpp
@@ -31,9 +31,6 @@ auto ICD2::main() -> void {
   synchronize(cpu);
 }
 
-auto ICD2::init() -> void {
-}
-
 auto ICD2::load() -> bool {
   GameBoy::superGameBoy = this;
   GameBoy::system.load(&gameBoyInterface, GameBoy::System::Model::SuperGameBoy, cartridge.pathID());
diff --git a/higan/sfc/coprocessor/icd2/icd2.hpp b/higan/sfc/coprocessor/icd2/icd2.hpp
index faad0c3..fea9661 100644
--- a/higan/sfc/coprocessor/icd2/icd2.hpp
+++ b/higan/sfc/coprocessor/icd2/icd2.hpp
@@ -6,7 +6,6 @@ struct ICD2 : Emulator::Platform, GameBoy::SuperGameBoyInterface, Thread {
   static auto Enter() -> void;
   auto main() -> void;
 
-  auto init() -> void;
   auto load() -> bool;
   auto unload() -> void;
   auto power() -> void;
diff --git a/higan/sfc/coprocessor/mcc/mcc.cpp b/higan/sfc/coprocessor/mcc/mcc.cpp
index 13a2fa1..6d2f144 100644
--- a/higan/sfc/coprocessor/mcc/mcc.cpp
+++ b/higan/sfc/coprocessor/mcc/mcc.cpp
@@ -5,12 +5,6 @@ namespace SuperFamicom {
 #include "serialization.cpp"
 MCC mcc;
 
-auto MCC::init() -> void {
-}
-
-auto MCC::load() -> void {
-}
-
 auto MCC::unload() -> void {
   rom.reset();
   ram.reset();
diff --git a/higan/sfc/coprocessor/mcc/mcc.hpp b/higan/sfc/coprocessor/mcc/mcc.hpp
index d372cf6..2f9a4ca 100644
--- a/higan/sfc/coprocessor/mcc/mcc.hpp
+++ b/higan/sfc/coprocessor/mcc/mcc.hpp
@@ -4,8 +4,6 @@ struct MCC {
   MappedRAM rom;
   MappedRAM ram;
 
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/msu1/msu1.cpp b/higan/sfc/coprocessor/msu1/msu1.cpp
index 8c6c09c..88ca56a 100644
--- a/higan/sfc/coprocessor/msu1/msu1.cpp
+++ b/higan/sfc/coprocessor/msu1/msu1.cpp
@@ -39,12 +39,6 @@ auto MSU1::main() -> void {
   synchronize(cpu);
 }
 
-auto MSU1::init() -> void {
-}
-
-auto MSU1::load() -> void {
-}
-
 auto MSU1::unload() -> void {
   dataFile.reset();
   audioFile.reset();
diff --git a/higan/sfc/coprocessor/msu1/msu1.hpp b/higan/sfc/coprocessor/msu1/msu1.hpp
index 5e9edd5..a4fa6bb 100644
--- a/higan/sfc/coprocessor/msu1/msu1.hpp
+++ b/higan/sfc/coprocessor/msu1/msu1.hpp
@@ -3,8 +3,6 @@ struct MSU1 : Thread {
 
   static auto Enter() -> void;
   auto main() -> void;
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/necdsp/necdsp.cpp b/higan/sfc/coprocessor/necdsp/necdsp.cpp
index 32857ad..78aa354 100644
--- a/higan/sfc/coprocessor/necdsp/necdsp.cpp
+++ b/higan/sfc/coprocessor/necdsp/necdsp.cpp
@@ -43,15 +43,6 @@ auto NECDSP::writeRAM(uint24 addr, uint8 data) -> void {
   return uPD96050::writeDP(addr, data);
 }
 
-auto NECDSP::init() -> void {
-}
-
-auto NECDSP::load() -> void {
-}
-
-auto NECDSP::unload() -> void {
-}
-
 auto NECDSP::power() -> void {
   uPD96050::power();
   create(NECDSP::Enter, Frequency);
diff --git a/higan/sfc/coprocessor/necdsp/necdsp.hpp b/higan/sfc/coprocessor/necdsp/necdsp.hpp
index 47010ee..f9c994d 100644
--- a/higan/sfc/coprocessor/necdsp/necdsp.hpp
+++ b/higan/sfc/coprocessor/necdsp/necdsp.hpp
@@ -8,9 +8,6 @@ struct NECDSP : Processor::uPD96050, Thread {
   auto readRAM(uint24 addr, uint8 data) -> uint8;
   auto writeRAM(uint24 addr, uint8 data) -> void;
 
-  auto init() -> void;
-  auto load() -> void;
-  auto unload() -> void;
   auto power() -> void;
 
   auto firmware() const -> vector<uint8>;
diff --git a/higan/sfc/coprocessor/nss/nss.cpp b/higan/sfc/coprocessor/nss/nss.cpp
index 5938631..3802dfe 100644
--- a/higan/sfc/coprocessor/nss/nss.cpp
+++ b/higan/sfc/coprocessor/nss/nss.cpp
@@ -4,15 +4,6 @@ namespace SuperFamicom {
 
 NSS nss;
 
-auto NSS::init() -> void {
-}
-
-auto NSS::load() -> void {
-}
-
-auto NSS::unload() -> void {
-}
-
 auto NSS::power() -> void {
 }
 
diff --git a/higan/sfc/coprocessor/nss/nss.hpp b/higan/sfc/coprocessor/nss/nss.hpp
index bf4ab69..524de31 100644
--- a/higan/sfc/coprocessor/nss/nss.hpp
+++ b/higan/sfc/coprocessor/nss/nss.hpp
@@ -1,7 +1,4 @@
 struct NSS {
-  auto init() -> void;
-  auto load() -> void;
-  auto unload() -> void;
   auto power() -> void;
 
   auto setDip(uint16 dip) -> void;
diff --git a/higan/sfc/coprocessor/obc1/obc1.cpp b/higan/sfc/coprocessor/obc1/obc1.cpp
index c6a33b8..691822e 100644
--- a/higan/sfc/coprocessor/obc1/obc1.cpp
+++ b/higan/sfc/coprocessor/obc1/obc1.cpp
@@ -5,12 +5,6 @@ namespace SuperFamicom {
 #include "serialization.cpp"
 OBC1 obc1;
 
-auto OBC1::init() -> void {
-}
-
-auto OBC1::load() -> void {
-}
-
 auto OBC1::unload() -> void {
   ram.reset();
 }
diff --git a/higan/sfc/coprocessor/obc1/obc1.hpp b/higan/sfc/coprocessor/obc1/obc1.hpp
index 0ca67a1..527666d 100644
--- a/higan/sfc/coprocessor/obc1/obc1.hpp
+++ b/higan/sfc/coprocessor/obc1/obc1.hpp
@@ -1,6 +1,4 @@
 struct OBC1 {
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/sa1/sa1.cpp b/higan/sfc/coprocessor/sa1/sa1.cpp
index cc67ebd..2b305ff 100644
--- a/higan/sfc/coprocessor/sa1/sa1.cpp
+++ b/higan/sfc/coprocessor/sa1/sa1.cpp
@@ -117,12 +117,6 @@ auto SA1::triggerIRQ() -> void {
   if(mmio.timer_irqen) mmio.timer_irqcl = 0;
 }
 
-auto SA1::init() -> void {
-}
-
-auto SA1::load() -> void {
-}
-
 auto SA1::unload() -> void {
   rom.reset();
   iram.reset();
diff --git a/higan/sfc/coprocessor/sa1/sa1.hpp b/higan/sfc/coprocessor/sa1/sa1.hpp
index 3e9c3a4..c39303e 100644
--- a/higan/sfc/coprocessor/sa1/sa1.hpp
+++ b/higan/sfc/coprocessor/sa1/sa1.hpp
@@ -10,8 +10,6 @@ struct SA1 : Processor::WDC65816, Thread {
   alwaysinline auto interruptPending() const -> bool override;
   auto synchronizing() const -> bool override;
 
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/sdd1/sdd1.cpp b/higan/sfc/coprocessor/sdd1/sdd1.cpp
index 9681352..69f8676 100644
--- a/higan/sfc/coprocessor/sdd1/sdd1.cpp
+++ b/higan/sfc/coprocessor/sdd1/sdd1.cpp
@@ -7,12 +7,6 @@ SDD1 sdd1;
 #include "decompressor.cpp"
 #include "serialization.cpp"
 
-auto SDD1::init() -> void {
-}
-
-void SDD1::load() {
-}
-
 auto SDD1::unload() -> void {
   rom.reset();
   ram.reset();
diff --git a/higan/sfc/coprocessor/sdd1/sdd1.hpp b/higan/sfc/coprocessor/sdd1/sdd1.hpp
index b5d9285..45ffb40 100644
--- a/higan/sfc/coprocessor/sdd1/sdd1.hpp
+++ b/higan/sfc/coprocessor/sdd1/sdd1.hpp
@@ -1,6 +1,4 @@
 struct SDD1 {
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/sharprtc/sharprtc.cpp b/higan/sfc/coprocessor/sharprtc/sharprtc.cpp
index 46b7bd4..162725c 100644
--- a/higan/sfc/coprocessor/sharprtc/sharprtc.cpp
+++ b/higan/sfc/coprocessor/sharprtc/sharprtc.cpp
@@ -18,12 +18,7 @@ auto SharpRTC::main() -> void {
   synchronize(cpu);
 }
 
-auto SharpRTC::init() -> void {
-}
-
-auto SharpRTC::load() -> void {
-  return;
-
+auto SharpRTC::initialize() -> void {
   second = 0;
   minute = 0;
   hour = 0;
@@ -33,9 +28,6 @@ auto SharpRTC::load() -> void {
   weekday = 0;
 }
 
-auto SharpRTC::unload() -> void {
-}
-
 auto SharpRTC::power() -> void {
   create(SharpRTC::Enter, 1);
 
diff --git a/higan/sfc/coprocessor/sharprtc/sharprtc.hpp b/higan/sfc/coprocessor/sharprtc/sharprtc.hpp
index 850e379..f0f5a84 100644
--- a/higan/sfc/coprocessor/sharprtc/sharprtc.hpp
+++ b/higan/sfc/coprocessor/sharprtc/sharprtc.hpp
@@ -2,9 +2,7 @@ struct SharpRTC : Thread {
   static auto Enter() -> void;
   auto main() -> void;
 
-  auto init() -> void;
-  auto load() -> void;
-  auto unload() -> void;
+  auto initialize() -> void;
   auto power() -> void;
   auto sync() -> void;
 
diff --git a/higan/sfc/coprocessor/spc7110/spc7110.cpp b/higan/sfc/coprocessor/spc7110/spc7110.cpp
index afb3477..14425d8 100644
--- a/higan/sfc/coprocessor/spc7110/spc7110.cpp
+++ b/higan/sfc/coprocessor/spc7110/spc7110.cpp
@@ -32,12 +32,6 @@ auto SPC7110::addClocks(uint clocks) -> void {
   synchronize(cpu);
 }
 
-auto SPC7110::init() -> void {
-}
-
-auto SPC7110::load() -> void {
-}
-
 auto SPC7110::unload() -> void {
   prom.reset();
   drom.reset();
diff --git a/higan/sfc/coprocessor/spc7110/spc7110.hpp b/higan/sfc/coprocessor/spc7110/spc7110.hpp
index ea8bc71..9f2d1d1 100644
--- a/higan/sfc/coprocessor/spc7110/spc7110.hpp
+++ b/higan/sfc/coprocessor/spc7110/spc7110.hpp
@@ -6,8 +6,6 @@ struct SPC7110 : Thread {
 
   static auto Enter() -> void;
   auto main() -> void;
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/coprocessor/superfx/superfx.cpp b/higan/sfc/coprocessor/superfx/superfx.cpp
index 5419fb6..8f13218 100644
--- a/higan/sfc/coprocessor/superfx/superfx.cpp
+++ b/higan/sfc/coprocessor/superfx/superfx.cpp
@@ -31,12 +31,6 @@ auto SuperFX::main() -> void {
   }
 }
 
-auto SuperFX::init() -> void {
-}
-
-auto SuperFX::load() -> void {
-}
-
 auto SuperFX::unload() -> void {
   rom.reset();
   ram.reset();
diff --git a/higan/sfc/coprocessor/superfx/superfx.hpp b/higan/sfc/coprocessor/superfx/superfx.hpp
index 95a5766..ec191ac 100644
--- a/higan/sfc/coprocessor/superfx/superfx.hpp
+++ b/higan/sfc/coprocessor/superfx/superfx.hpp
@@ -5,8 +5,6 @@ struct SuperFX : Processor::GSU, Thread {
   //superfx.cpp
   static auto Enter() -> void;
   auto main() -> void;
-  auto init() -> void;
-  auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
 
diff --git a/higan/sfc/cpu/cpu.cpp b/higan/sfc/cpu/cpu.cpp
index f599938..2f3ab10 100644
--- a/higan/sfc/cpu/cpu.cpp
+++ b/higan/sfc/cpu/cpu.cpp
@@ -60,7 +60,7 @@ auto CPU::load(Markup::Node node) -> bool {
   return true;
 }
 
-auto CPU::power() -> void {
+auto CPU::power(bool reset) -> void {
   WDC65816::power();
   create(Enter, system.cpuFrequency());
   coprocessors.reset();
@@ -86,7 +86,7 @@ auto CPU::power() -> void {
   bus.map(reader, writer, "00-3f,80-bf:0000-1fff", 0x2000);
   bus.map(reader, writer, "7e-7f:0000-ffff", 0x20000);
 
-  random.array(wram, sizeof(wram));
+  if(!reset) random.array(wram, sizeof(wram));
 
   //DMA
   for(auto& channel : this->channel) {
diff --git a/higan/sfc/cpu/cpu.hpp b/higan/sfc/cpu/cpu.hpp
index 34db5ff..277d32a 100644
--- a/higan/sfc/cpu/cpu.hpp
+++ b/higan/sfc/cpu/cpu.hpp
@@ -10,7 +10,7 @@ struct CPU : Processor::WDC65816, Thread, PPUcounter {
   static auto Enter() -> void;
   auto main() -> void;
   auto load(Markup::Node) -> bool;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //dma.cpp
   auto dmaStep(uint clocks) -> void;
diff --git a/higan/sfc/dsp/dsp.cpp b/higan/sfc/dsp/dsp.cpp
index 8f73857..55d988e 100644
--- a/higan/sfc/dsp/dsp.cpp
+++ b/higan/sfc/dsp/dsp.cpp
@@ -228,11 +228,11 @@ auto DSP::load(Markup::Node node) -> bool {
   return true;
 }
 
-auto DSP::power() -> void {
+auto DSP::power(bool reset) -> void {
   create(Enter, system.apuFrequency());
   stream = Emulator::audio.createStream(2, frequency() / 768.0);
 
-  random.array(apuram, sizeof(apuram));
+  if(!reset) random.array(apuram, sizeof(apuram));
 
   memory::fill(&state, sizeof(State));
   state.noise = 0x4000;
diff --git a/higan/sfc/dsp/dsp.hpp b/higan/sfc/dsp/dsp.hpp
index 68695be..d723010 100644
--- a/higan/sfc/dsp/dsp.hpp
+++ b/higan/sfc/dsp/dsp.hpp
@@ -14,7 +14,7 @@ struct DSP : Thread {
 
   auto main() -> void;
   auto load(Markup::Node) -> bool;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //serialization.cpp
   auto serialize(serializer&) -> void;
diff --git a/higan/sfc/interface/interface.cpp b/higan/sfc/interface/interface.cpp
index 11cd7cb..0f7d3fd 100644
--- a/higan/sfc/interface/interface.cpp
+++ b/higan/sfc/interface/interface.cpp
@@ -5,11 +5,10 @@ namespace SuperFamicom {
 Settings settings;
 
 Interface::Interface() {
-  system.init();
-
   information.manufacturer = "Nintendo";
   information.name         = "Super Famicom";
   information.overscan     = true;
+  information.resettable   = true;
 
   media.append({ID::SuperFamicom, "Super Famicom", "sfc"});
 
@@ -194,7 +193,11 @@ auto Interface::connect(uint port, uint device) -> void {
 }
 
 auto Interface::power() -> void {
-  system.power();
+  system.power(/* reset = */ false);
+}
+
+auto Interface::reset() -> void {
+  system.power(/* reset = */ true);
 }
 
 auto Interface::run() -> void {
diff --git a/higan/sfc/interface/interface.hpp b/higan/sfc/interface/interface.hpp
index 8fa6bed..51c4f7b 100644
--- a/higan/sfc/interface/interface.hpp
+++ b/higan/sfc/interface/interface.hpp
@@ -50,6 +50,7 @@ struct Interface : Emulator::Interface {
 
   auto connect(uint port, uint device) -> void override;
   auto power() -> void override;
+  auto reset() -> void override;
   auto run() -> void override;
 
   auto rtc() -> bool override;
diff --git a/higan/sfc/ppu/ppu.cpp b/higan/sfc/ppu/ppu.cpp
index d98b771..9cc8748 100644
--- a/higan/sfc/ppu/ppu.cpp
+++ b/higan/sfc/ppu/ppu.cpp
@@ -86,7 +86,7 @@ auto PPU::load(Markup::Node node) -> bool {
   return true;
 }
 
-auto PPU::power() -> void {
+auto PPU::power(bool reset) -> void {
   create(Enter, system.cpuFrequency());
   PPUcounter::reset();
   memory::fill(output, 512 * 480 * sizeof(uint32));
@@ -95,7 +95,7 @@ auto PPU::power() -> void {
   function<auto (uint24, uint8) -> void> writer{&PPU::writeIO, this};
   bus.map(reader, writer, "00-3f,80-bf:2100-213f");
 
-  random.array((uint8*)vram.data, sizeof(vram.data));
+  if(!reset) random.array((uint8*)vram.data, sizeof(vram.data));
 
   ppu1.mdr = random.bias(0xff);
   ppu2.mdr = random.bias(0xff);
diff --git a/higan/sfc/ppu/ppu.hpp b/higan/sfc/ppu/ppu.hpp
index 1b50335..e972991 100644
--- a/higan/sfc/ppu/ppu.hpp
+++ b/higan/sfc/ppu/ppu.hpp
@@ -11,7 +11,7 @@ struct PPU : Thread, PPUcounter {
   static auto Enter() -> void;
   auto main() -> void;
   auto load(Markup::Node) -> bool;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   auto serialize(serializer&) -> void;
 
diff --git a/higan/sfc/slot/bsmemory/bsmemory.cpp b/higan/sfc/slot/bsmemory/bsmemory.cpp
index 3906e44..cd28d70 100644
--- a/higan/sfc/slot/bsmemory/bsmemory.cpp
+++ b/higan/sfc/slot/bsmemory/bsmemory.cpp
@@ -4,13 +4,8 @@ namespace SuperFamicom {
 
 BSMemory bsmemory;
 
-auto BSMemory::init() -> void {
-}
-
 auto BSMemory::load() -> void {
-  if(memory.size() == 0) {
-    memory.allocate(1024 * 1024);
-  }
+  if(!memory.size()) memory.allocate(1024 * 1024);
 }
 
 auto BSMemory::unload() -> void {
diff --git a/higan/sfc/slot/bsmemory/bsmemory.hpp b/higan/sfc/slot/bsmemory/bsmemory.hpp
index 0be530c..dbe4c58 100644
--- a/higan/sfc/slot/bsmemory/bsmemory.hpp
+++ b/higan/sfc/slot/bsmemory/bsmemory.hpp
@@ -1,5 +1,4 @@
 struct BSMemory : Memory {
-  auto init() -> void;
   auto load() -> void;
   auto unload() -> void;
   auto power() -> void;
diff --git a/higan/sfc/slot/sufamiturbo/sufamiturbo.cpp b/higan/sfc/slot/sufamiturbo/sufamiturbo.cpp
index 983fbe0..15c1131 100644
--- a/higan/sfc/slot/sufamiturbo/sufamiturbo.cpp
+++ b/higan/sfc/slot/sufamiturbo/sufamiturbo.cpp
@@ -6,9 +6,6 @@ namespace SuperFamicom {
 SufamiTurboCartridge sufamiturboA;
 SufamiTurboCartridge sufamiturboB;
 
-auto SufamiTurboCartridge::load() -> void {
-}
-
 auto SufamiTurboCartridge::unload() -> void {
   rom.reset();
   ram.reset();
diff --git a/higan/sfc/slot/sufamiturbo/sufamiturbo.hpp b/higan/sfc/slot/sufamiturbo/sufamiturbo.hpp
index 11fbfc2..75ad878 100644
--- a/higan/sfc/slot/sufamiturbo/sufamiturbo.hpp
+++ b/higan/sfc/slot/sufamiturbo/sufamiturbo.hpp
@@ -1,5 +1,4 @@
 struct SufamiTurboCartridge {
-  auto load() -> void;
   auto unload() -> void;
   auto serialize(serializer&) -> void;
 
diff --git a/higan/sfc/smp/smp.cpp b/higan/sfc/smp/smp.cpp
index ac32fb1..51cd864 100644
--- a/higan/sfc/smp/smp.cpp
+++ b/higan/sfc/smp/smp.cpp
@@ -32,7 +32,7 @@ auto SMP::load(Markup::Node node) -> bool {
   return false;
 }
 
-auto SMP::power() -> void {
+auto SMP::power(bool reset) -> void {
   SPC700::power();
   create(Enter, system.apuFrequency() / 12.0);
 
diff --git a/higan/sfc/smp/smp.hpp b/higan/sfc/smp/smp.hpp
index 2eab3f6..1987b75 100644
--- a/higan/sfc/smp/smp.hpp
+++ b/higan/sfc/smp/smp.hpp
@@ -11,7 +11,7 @@ struct SMP : Processor::SPC700, Thread {
 
   auto main() -> void;
   auto load(Markup::Node) -> bool;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //serialization.cpp
   auto serialize(serializer&) -> void;
diff --git a/higan/sfc/system/serialization.cpp b/higan/sfc/system/serialization.cpp
index b3e6cf3..5b94abc 100644
--- a/higan/sfc/system/serialization.cpp
+++ b/higan/sfc/system/serialization.cpp
@@ -31,7 +31,7 @@ auto System::unserialize(serializer& s) -> bool {
   if(signature != 0x31545342) return false;
   if(string{version} != Emulator::SerializerVersion) return false;
 
-  power();
+  power(/* reset = */ false);
   serializeAll(s);
   return true;
 }
diff --git a/higan/sfc/system/system.cpp b/higan/sfc/system/system.cpp
index c965d88..58ce46f 100644
--- a/higan/sfc/system/system.cpp
+++ b/higan/sfc/system/system.cpp
@@ -22,29 +22,6 @@ auto System::runToSave() -> void {
   for(auto peripheral : cpu.peripherals) scheduler.synchronize(*peripheral);
 }
 
-auto System::init() -> void {
-  icd2.init();
-  mcc.init();
-  nss.init();
-  event.init();
-  sa1.init();
-  superfx.init();
-  armdsp.init();
-  hitachidsp.init();
-  necdsp.init();
-  epsonrtc.init();
-  sharprtc.init();
-  spc7110.init();
-  sdd1.init();
-  obc1.init();
-  msu1.init();
-
-  bsmemory.init();
-}
-
-auto System::term() -> void {
-}
-
 auto System::load(Emulator::Interface* interface) -> bool {
   information = {};
 
@@ -72,23 +49,7 @@ auto System::load(Emulator::Interface* interface) -> bool {
   }
 
   if(cartridge.has.ICD2) icd2.load();
-  if(cartridge.has.MCC) mcc.load();
-  if(cartridge.has.NSSDIP) nss.load();
-  if(cartridge.has.Event) event.load();
-  if(cartridge.has.SA1) sa1.load();
-  if(cartridge.has.SuperFX) superfx.load();
-  if(cartridge.has.ARMDSP) armdsp.load();
-  if(cartridge.has.HitachiDSP) hitachidsp.load();
-  if(cartridge.has.NECDSP) necdsp.load();
-  if(cartridge.has.EpsonRTC) epsonrtc.load();
-  if(cartridge.has.SharpRTC) sharprtc.load();
-  if(cartridge.has.SPC7110) spc7110.load();
-  if(cartridge.has.SDD1) sdd1.load();
-  if(cartridge.has.OBC1) obc1.load();
-  if(cartridge.has.MSU1) msu1.load();
-
   if(cartridge.has.BSMemorySlot) bsmemory.load();
-  if(cartridge.has.SufamiTurboSlots) sufamiturboA.load(), sufamiturboB.load();
 
   serializeInit();
   this->interface = interface;
@@ -111,20 +72,14 @@ auto System::unload() -> void {
 
   if(cartridge.has.ICD2) icd2.unload();
   if(cartridge.has.MCC) mcc.unload();
-  if(cartridge.has.NSSDIP) nss.unload();
   if(cartridge.has.Event) event.unload();
   if(cartridge.has.SA1) sa1.unload();
   if(cartridge.has.SuperFX) superfx.unload();
-  if(cartridge.has.ARMDSP) armdsp.unload();
   if(cartridge.has.HitachiDSP) hitachidsp.unload();
-  if(cartridge.has.NECDSP) necdsp.unload();
-  if(cartridge.has.EpsonRTC) epsonrtc.unload();
-  if(cartridge.has.SharpRTC) sharprtc.unload();
   if(cartridge.has.SPC7110) spc7110.unload();
   if(cartridge.has.SDD1) sdd1.unload();
   if(cartridge.has.OBC1) obc1.unload();
   if(cartridge.has.MSU1) msu1.unload();
-
   if(cartridge.has.BSMemorySlot) bsmemory.unload();
   if(cartridge.has.SufamiTurboSlots) sufamiturboA.unload(), sufamiturboB.unload();
 
@@ -132,7 +87,7 @@ auto System::unload() -> void {
   information.loaded = false;
 }
 
-auto System::power() -> void {
+auto System::power(bool reset) -> void {
   Emulator::video.reset();
   Emulator::video.setInterface(interface);
   configureVideoPalette();
@@ -144,10 +99,10 @@ auto System::power() -> void {
   random.entropy(Random::Entropy::Low);
 
   scheduler.reset();
-  cpu.power();
-  smp.power();
-  dsp.power();
-  ppu.power();
+  cpu.power(reset);
+  smp.power(reset);
+  dsp.power(reset);
+  ppu.power(reset);
 
   if(cartridge.has.ICD2) icd2.power();
   if(cartridge.has.MCC) mcc.power();
@@ -164,7 +119,6 @@ auto System::power() -> void {
   if(cartridge.has.SDD1) sdd1.power();
   if(cartridge.has.OBC1) obc1.power();
   if(cartridge.has.MSU1) msu1.power();
-
   if(cartridge.has.BSMemorySlot) bsmemory.power();
 
   if(cartridge.has.ICD2) cpu.coprocessors.append(&icd2);
diff --git a/higan/sfc/system/system.hpp b/higan/sfc/system/system.hpp
index e54d592..15acbf6 100644
--- a/higan/sfc/system/system.hpp
+++ b/higan/sfc/system/system.hpp
@@ -9,12 +9,10 @@ struct System {
   auto run() -> void;
   auto runToSave() -> void;
 
-  auto init() -> void;
-  auto term() -> void;
   auto load(Emulator::Interface*) -> bool;
   auto save() -> void;
   auto unload() -> void;
-  auto power() -> void;
+  auto power(bool reset) -> void;
 
   //video.cpp
   auto configureVideoPalette() -> void;
diff --git a/higan/target-tomoko/configuration/configuration.cpp b/higan/target-tomoko/configuration/configuration.cpp
index b5f58fb..a722003 100644
--- a/higan/target-tomoko/configuration/configuration.cpp
+++ b/higan/target-tomoko/configuration/configuration.cpp
@@ -56,6 +56,9 @@ Settings::Settings() {
   set("Input/FocusLoss/Pause", false);
   set("Input/FocusLoss/AllowInput", false);
 
+  set("Emulation/AutoSaveMemory/Enable", true);
+  set("Emulation/AutoSaveMemory/Interval", 30);
+
   set("Crashed", false);
 }
 
diff --git a/higan/target-tomoko/input/hotkeys.cpp b/higan/target-tomoko/input/hotkeys.cpp
index 76304fc..86e4625 100644
--- a/higan/target-tomoko/input/hotkeys.cpp
+++ b/higan/target-tomoko/input/hotkeys.cpp
@@ -73,6 +73,14 @@ auto InputManager::appendHotkeys() -> void {
   }
 
   { auto hotkey = new InputHotkey;
+    hotkey->name = "Soft Reset";
+    hotkey->press = [] {
+      program->softReset();
+    };
+    hotkeys.append(hotkey);
+  }
+
+  { auto hotkey = new InputHotkey;
     hotkey->name = "Power Cycle";
     hotkey->press = [] {
       program->powerCycle();
diff --git a/higan/target-tomoko/presentation/presentation.cpp b/higan/target-tomoko/presentation/presentation.cpp
index 5849b39..619bf16 100644
--- a/higan/target-tomoko/presentation/presentation.cpp
+++ b/higan/target-tomoko/presentation/presentation.cpp
@@ -42,7 +42,8 @@ Presentation::Presentation() {
   }
 
   systemMenu.setText("System").setVisible(false);
-  reloadSystem.setText("Power Cycle").onActivate([&] { program->powerCycle(); });
+  resetSystem.setText("Soft Reset").onActivate([&] { program->softReset(); });
+  powerSystem.setText("Power Cycle").onActivate([&] { program->powerCycle(); });
   unloadSystem.setText("Unload").onActivate([&] { program->unloadMedium(); });
 
   settingsMenu.setText("Settings");
@@ -133,6 +134,7 @@ Presentation::Presentation() {
   cheatEditor.setText("Cheat Editor ...").onActivate([&] { toolsManager->show(0); });
   stateManager.setText("State Manager ...").onActivate([&] { toolsManager->show(1); });
   manifestViewer.setText("Manifest Viewer ...").onActivate([&] { toolsManager->show(2); });
+  gameNotes.setText("Game Notes ...").onActivate([&] { toolsManager->show(3); });
 
   helpMenu.setText("Help");
   documentation.setText("Documentation ...").onActivate([&] {
@@ -213,6 +215,7 @@ auto Presentation::updateEmulator() -> void {
   }
 
   systemMenuSeparatorPorts.setVisible(inputPort1.visible() || inputPort2.visible() || inputPort3.visible());
+  resetSystem.setVisible(emulator->information.resettable);
 
   emulator->set("Blur Emulation", blurEmulation.checked());
   emulator->set("Color Emulation", colorEmulation.checked());
diff --git a/higan/target-tomoko/presentation/presentation.hpp b/higan/target-tomoko/presentation/presentation.hpp
index 943a2bb..195d899 100644
--- a/higan/target-tomoko/presentation/presentation.hpp
+++ b/higan/target-tomoko/presentation/presentation.hpp
@@ -23,7 +23,8 @@ struct Presentation : Window {
       Menu inputPort2{&systemMenu};
       Menu inputPort3{&systemMenu};
       MenuSeparator systemMenuSeparatorPorts{&systemMenu};
-      MenuItem reloadSystem{&systemMenu};
+      MenuItem resetSystem{&systemMenu};
+      MenuItem powerSystem{&systemMenu};
       MenuItem unloadSystem{&systemMenu};
     Menu settingsMenu{&menuBar};
       Menu videoScaleMenu{&settingsMenu};
@@ -66,6 +67,7 @@ struct Presentation : Window {
       MenuItem cheatEditor{&toolsMenu};
       MenuItem stateManager{&toolsMenu};
       MenuItem manifestViewer{&toolsMenu};
+      MenuItem gameNotes{&toolsMenu};
     Menu helpMenu{&menuBar};
       MenuItem documentation{&helpMenu};
       MenuItem credits{&helpMenu};
diff --git a/higan/target-tomoko/program/medium.cpp b/higan/target-tomoko/program/medium.cpp
index 799b76e..41b1d15 100644
--- a/higan/target-tomoko/program/medium.cpp
+++ b/higan/target-tomoko/program/medium.cpp
@@ -39,6 +39,7 @@ auto Program::loadMedium(Emulator::Interface& interface, const Emulator::Interfa
   toolsManager->cheatEditor.loadCheats();
   toolsManager->stateManager.doRefresh();
   toolsManager->manifestViewer.doRefresh();
+  toolsManager->gameNotes.loadNotes();
 }
 
 auto Program::unloadMedium() -> void {
@@ -46,6 +47,7 @@ auto Program::unloadMedium() -> void {
 
   presentation->clearViewport();
   toolsManager->cheatEditor.saveCheats();
+  toolsManager->gameNotes.saveNotes();
   emulator->unload();
   emulator = nullptr;
   mediumPaths.reset();
diff --git a/higan/target-tomoko/program/program.cpp b/higan/target-tomoko/program/program.cpp
index 0c2c7f7..7655414 100644
--- a/higan/target-tomoko/program/program.cpp
+++ b/higan/target-tomoko/program/program.cpp
@@ -90,6 +90,13 @@ auto Program::main() -> void {
   }
 
   emulator->run();
+  if(settings["Emulation/AutoSaveMemory/Enable"].boolean()) {
+    time_t currentTime = time(nullptr);
+    if(currentTime - autoSaveTime >= settings["Emulation/AutoSaveMemory/Interval"].natural()) {
+      autoSaveTime = currentTime;
+      emulator->save();
+    }
+  }
 }
 
 auto Program::quit() -> void {
diff --git a/higan/target-tomoko/program/program.hpp b/higan/target-tomoko/program/program.hpp
index 4ca39ad..3cf2c5f 100644
--- a/higan/target-tomoko/program/program.hpp
+++ b/higan/target-tomoko/program/program.hpp
@@ -30,6 +30,7 @@ struct Program : Emulator::Platform {
   auto initializeAudioDriver() -> void;
   auto initializeInputDriver() -> void;
 
+  auto softReset() -> void;
   auto powerCycle() -> void;
   auto rotateDisplay() -> void;
   auto connectDevices() -> void;
@@ -49,6 +50,8 @@ struct Program : Emulator::Platform {
   vector<string> mediumQueue;  //for command-line and drag-and-drop loading
   vector<string> mediumPaths;  //for keeping track of loaded folder locations
 
+  time_t autoSaveTime = 0;  //for automatically saving RAM periodically
+
   string statusText;
   string statusMessage;
   time_t statusTime = 0;
diff --git a/higan/target-tomoko/program/utility.cpp b/higan/target-tomoko/program/utility.cpp
index 6d13b8a..8348dc4 100644
--- a/higan/target-tomoko/program/utility.cpp
+++ b/higan/target-tomoko/program/utility.cpp
@@ -64,10 +64,17 @@ auto Program::initializeInputDriver() -> void {
   }
 }
 
+auto Program::softReset() -> void {
+  if(!emulator) return;
+  if(!emulator->information.resettable) return;
+  emulator->reset();
+  showMessage("System has been soft reset");
+}
+
 auto Program::powerCycle() -> void {
   if(!emulator) return;
   emulator->power();
-  showMessage("Power cycled");
+  showMessage("System has been power cycled");
 }
 
 auto Program::rotateDisplay() -> void {
@@ -94,12 +101,12 @@ auto Program::connectDevices() -> void {
 }
 
 auto Program::showMessage(const string& text) -> void {
-  statusTime = time(0);
+  statusTime = time(nullptr);
   statusMessage = text;
 }
 
 auto Program::updateStatusText() -> void {
-  time_t currentTime = time(0);
+  time_t currentTime = time(nullptr);
 
   string text;
   if((currentTime - statusTime) <= 2) {
diff --git a/higan/target-tomoko/settings/advanced.cpp b/higan/target-tomoko/settings/advanced.cpp
index 56ff124..9bd5824 100644
--- a/higan/target-tomoko/settings/advanced.cpp
+++ b/higan/target-tomoko/settings/advanced.cpp
@@ -43,4 +43,9 @@ AdvancedSettings::AdvancedSettings(TabFrame* parent) : TabFrameItem(parent) {
   ignoreManifests.setText("Ignore Manifests").setChecked(settings["Library/IgnoreManifests"].boolean()).onToggle([&] {
     settings["Library/IgnoreManifests"].setValue(ignoreManifests.checked());
   });
+
+  otherLabel.setText("Other").setFont(Font().setBold());
+  autoSaveMemory.setText("Auto-Save Memory Periodically").setChecked(settings["Emulation/AutoSaveMemory/Enable"].boolean()).onToggle([&] {
+    settings["Emulation/AutoSaveMemory/Enable"].setValue(autoSaveMemory.checked());
+  });
 }
diff --git a/higan/target-tomoko/settings/settings.hpp b/higan/target-tomoko/settings/settings.hpp
index 61e742d..19c6113 100644
--- a/higan/target-tomoko/settings/settings.hpp
+++ b/higan/target-tomoko/settings/settings.hpp
@@ -141,6 +141,8 @@ struct AdvancedSettings : TabFrameItem {
       LineEdit libraryLocation{&libraryLayout, Size{~0, 0}};
       Button libraryChange{&libraryLayout, Size{0, 0}};
     CheckLabel ignoreManifests{&layout, Size{~0, 0}};
+    Label otherLabel{&layout, Size{~0, 0}, 2};
+    CheckLabel autoSaveMemory{&layout, Size{~0, 0}};
 };
 
 struct SettingsManager : Window {
diff --git a/higan/target-tomoko/tools/game-notes.cpp b/higan/target-tomoko/tools/game-notes.cpp
new file mode 100644
index 0000000..64a3550
--- /dev/null
+++ b/higan/target-tomoko/tools/game-notes.cpp
@@ -0,0 +1,22 @@
+GameNotes::GameNotes(TabFrame* parent) : TabFrameItem(parent) {
+  setIcon(Icon::Emblem::Text);
+  setText("Game Notes");
+
+  layout.setMargin(5);
+  notes.setWordWrap(false).setFont(Font().setFamily(Font::Mono));
+}
+
+auto GameNotes::loadNotes() -> void {
+  auto contents = string::read({program->mediumPaths(1), "higan/notes.txt"});
+  notes.setText(contents);
+}
+
+auto GameNotes::saveNotes() -> void {
+  auto contents = notes.text();
+  if(contents) {
+    directory::create({program->mediumPaths(1), "higan/"});
+    file::write({program->mediumPaths(1), "higan/notes.txt"}, contents);
+  } else {
+    file::remove({program->mediumPaths(1), "higan/notes.txt"});
+  }
+}
diff --git a/higan/target-tomoko/tools/tools.cpp b/higan/target-tomoko/tools/tools.cpp
index cb07cf4..62b73af 100644
--- a/higan/target-tomoko/tools/tools.cpp
+++ b/higan/target-tomoko/tools/tools.cpp
@@ -3,6 +3,7 @@
 #include "cheat-editor.cpp"
 #include "state-manager.cpp"
 #include "manifest-viewer.cpp"
+#include "game-notes.cpp"
 unique_pointer<CheatDatabase> cheatDatabase;
 unique_pointer<ToolsManager> toolsManager;
 
diff --git a/higan/target-tomoko/tools/tools.hpp b/higan/target-tomoko/tools/tools.hpp
index a00158e..383f74c 100644
--- a/higan/target-tomoko/tools/tools.hpp
+++ b/higan/target-tomoko/tools/tools.hpp
@@ -84,6 +84,15 @@ struct ManifestViewer : TabFrameItem {
     TextEdit manifestView{&layout, Size{~0, ~0}};
 };
 
+struct GameNotes : TabFrameItem {
+  GameNotes(TabFrame*);
+  auto loadNotes() -> void;
+  auto saveNotes() -> void;
+
+  VerticalLayout layout{this};
+    TextEdit notes{&layout, Size{~0, ~0}};
+};
+
 struct ToolsManager : Window {
   ToolsManager();
   auto show(uint tool) -> void;
@@ -93,6 +102,7 @@ struct ToolsManager : Window {
       CheatEditor cheatEditor{&panel};
       StateManager stateManager{&panel};
       ManifestViewer manifestViewer{&panel};
+      GameNotes gameNotes{&panel};
 };
 
 extern unique_pointer<CheatDatabase> cheatDatabase;
diff --git a/icarus/Database/Super Famicom.bml b/icarus/Database/Super Famicom.bml
index f43e65f..8cd6c1b 100644
--- a/icarus/Database/Super Famicom.bml	
+++ b/icarus/Database/Super Famicom.bml	
@@ -43,6 +43,20 @@ cartridge sha256:1bb9ba72dfec638ed4cc7c721e31fde2f3e08d160b266a62b6e3997f711cf7c
   :  name:     Taekwondo
   :  title:    태권도
 
+cartridge sha256:7dbaebb1007984610623cb0b571f0e7167d73d89274598bfffc845cfb2de4aac
+  :board region=pal
+  :  rom name=program.rom size=0x280000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :  ram name=save.ram size=0x2000
+  :    map address=70-7d,f0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-ANIP-AUS
+  :  board:    SHVC-1A3M-30
+  :  revision: SPAL-ANIP-0
+  :  name:     Lufia
+  :  title:    Lufia
+
 cartridge sha256:dd499445275fca6692c0487a8bd70a23f6c8e78e766df0e3c58fbbe53f8adb06
   :board region=ntsc
   :  rom name=program.rom size=0x100000
@@ -57,6 +71,32 @@ cartridge sha256:dd499445275fca6692c0487a8bd70a23f6c8e78e766df0e3c58fbbe53f8adb0
   :  name:     Legende de Zelda - La Triforce des Dieux, La
   :  title:    La Légende de Zelda: La Triforce des Dieux
 
+cartridge sha256:bd5e7a6bc08f64d39c54204b82c6c156f144c03e13c890128588c5faa560659c
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AH-ESP
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-AH-0
+  :  name:     Addams Family - Pugsley's Scavenger Hunt, The
+  :  title:    The Addams Family: Pugsley's Scavenger Hunt
+
+cartridge sha256:9eaf1c46d8a068c910d66f582e23b1155882ddfa4b9fd0813819fc5c008167e2
+  :board region=pal
+  :  rom name=program.rom size=0x80000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-J5-ESP
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-J5-0
+  :  name:     Super James Pond
+  :  title:    Super James Pond
+
 cartridge sha256:ffcdce24171d9dc225a8a8b52e7d24a7832873f85135767359952537a8b9f8f1
   :board region=pal
   :  rom name=program.rom size=0x180000
@@ -72,6 +112,58 @@ cartridge sha256:ffcdce24171d9dc225a8a8b52e7d24a7832873f85135767359952537a8b9f8f
   :  name:     World Cup USA '94
   :  title:    World Cup USA '94
 
+cartridge sha256:d897f80465d02a92f17e1eecb727b99211ec2fb9c58cbabfa76b35c554096ea6
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-Y6-ESP
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-Y6-0
+  :  name:     Young Merlin
+  :  title:    Young Merlin
+
+cartridge sha256:ec3e81d628a293514e303b44e3b1ac03461ddd1da32764b10b7fab1e507602df
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-ANNP-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-ANNP-0
+  :  name:     Aaahh!! Real Monsters
+  :  title:    Aaahh!! Real Monsters
+
+cartridge sha256:a0baba78c9cad02957b80ed74fc8d09fac3c77e131e47333ef42ba471dc61228
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-ABTP-EUR
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-ABTP-0
+  :  name:     Adventures of Batman & Robin, The
+  :  title:    The Adventures of Batman & Robin
+
+cartridge sha256:e0c065aecfb6167cdb6dee8368b5f36d52fe55131ed4f6adbb3b2c62a39aafca
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AMOP-EUR
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-AMOP-0
+  :  name:     Adventures of Mighty Max, The
+  :  title:    The Adventures of Mighty Max
+
 cartridge sha256:ffd634dbfa9ad88a81cfc59adcc889c15e03730536c171d358bf58b37c6bca6a
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -85,6 +177,32 @@ cartridge sha256:ffd634dbfa9ad88a81cfc59adcc889c15e03730536c171d358bf58b37c6bca6
   :  name:     Air Cavalry
   :  title:    Air Cavalry
 
+cartridge sha256:65feac0ff8bf834bdb3f1eade09102496e1bd021a261ca05fc3a75983c357c84
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-A3-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-A3-0
+  :  name:     Alien 3
+  :  title:    Alien 3
+
+cartridge sha256:79ff74b758bb5df40d9fb6f830e9370de799c7a1423c482b2cc74eee78c55127
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-ANCP-EUR
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-ANCP-0
+  :  name:     Animaniacs
+  :  title:    Animaniacs
+
 cartridge sha256:41084f83e269d46b9d589f11c802a15e84fede57d604c7986053f2858f757adc
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -98,6 +216,19 @@ cartridge sha256:41084f83e269d46b9d589f11c802a15e84fede57d604c7986053f2858f757ad
   :  name:     Archer Maclean's Super Dropzone
   :  title:    Archer Maclean's Super Dropzone
 
+cartridge sha256:ea4240989114fd2c6dbbf2bfcafb2047ab482ebc4aa276f30f3dc7b551197808
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-A9-EUR
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-A9-0
+  :  name:     Ardy Lightfoot
+  :  title:    Ardy Lightfoot
+
 cartridge sha256:f0cfaab9a4be5b2bac0cb3dafea14cea4cf8d7cbfa562323ab3026466985c9e1
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -111,6 +242,19 @@ cartridge sha256:f0cfaab9a4be5b2bac0cb3dafea14cea4cf8d7cbfa562323ab3026466985c9e
   :  name:     Bass Masters Classic - Pro Edition
   :  title:    Bass Masters Classic: Pro Edition
 
+cartridge sha256:a73c8864743dd64a61d756ebe001a1244d6ae387621a46f9da4421d061c6b7ac
+  :board region=pal
+  :  rom name=program.rom size=0x300000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-AB4P-EUR
+  :  board:    SHVC-1J0N-20
+  :  revision: SPAL-AB4P-0
+  :  name:     Boogerman - A Pick and Flick Adventure
+  :  title:    Boogerman: A Pick and Flick Adventure
+
 cartridge sha256:a057383e41bd5735b1c554c555b89fe0ff9b7eb7e9f9d46dbefbdd749c8d2181
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -124,6 +268,19 @@ cartridge sha256:a057383e41bd5735b1c554c555b89fe0ff9b7eb7e9f9d46dbefbdd749c8d218
   :  name:     Brutal - Paws of Fury
   :  title:    Brutal: Paws of Fury
 
+cartridge sha256:be86b8b9c390f1a85384117ce19170567e1234ddb08b538e1361af2feee63869
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-ABBP-EUR
+  :  board:    SHVC-1J0N-20
+  :  revision: SPAL-ABBP-0
+  :  name:     Bubsy II
+  :  title:    Bubsy II
+
 cartridge sha256:3545306505c463c627bc4ced91ff4413481c945a658860ddc1f6e8e7b4cc6144
   :board region=pal
   :  rom name=program.rom size=0x180000
@@ -150,6 +307,19 @@ cartridge sha256:0f37da5beb0beb5e8f8c34443bf0734575649f8222074e3394926c3b697589c
   :  name:     Carrier Aces
   :  title:    Carrier Aces
 
+cartridge sha256:ca99787148aac7053ae9d1a1b06c8a5f42f2bfdd70c2942282a9dd0c1c0fda4f
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-ADZP-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-ADZP-0
+  :  name:     Castlevania - Vampire's Kiss
+  :  title:    Castlevania: Vampire's Kiss
+
 cartridge sha256:e1e2cc6b7ef58b512bb8aa6848dd67fce9e5d092ea67e6b4f31f156b060cc2b1
   :board region=pal
   :  rom name=program.rom size=0x300000
@@ -163,6 +333,19 @@ cartridge sha256:e1e2cc6b7ef58b512bb8aa6848dd67fce9e5d092ea67e6b4f31f156b060cc2b
   :  name:     Clay Fighter 2 - Judgment Clay
   :  title:    Clay Fighter 2: Judgment Clay
 
+cartridge sha256:b9d6cf21e7a280b83fadcf513029158be6f4dcdc51f73b699b7c215a5150be42
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AC8P-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AC8P-0
+  :  name:     CutThroat Island
+  :  title:    CutThroat Island
+
 cartridge sha256:a2dc5ffc82e8d055d030c3f021d8df3ae8b08571c8301cdd1d7652248d6f9b55
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -192,6 +375,45 @@ cartridge sha256:574c61ab1a670a79b8dc69445b8f55aa5b4caa95ed0e1504fae8a1e3d336e7f
   :  name:     Donkey Kong Country 3 - Dixie Kong's Double Trouble
   :  title:    Donkey Kong Country 3: Dixie Kong's Double Trouble
 
+cartridge sha256:753467f4e343a563a1e4f5da43b731968a47cf3fc035f98575134e680a596f27
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-4N-EUR
+  :  board:    SHVC-1J0N-10
+  :  revision: SPAL-4N-0
+  :  name:     Dragon - The Bruce Lee Story
+  :  title:    Dragon: The Bruce Lee Story
+
+cartridge sha256:4a96f3c0a7694a1d8235e2bf03b583ed2e99488d1dc0e26691db003fd23191f7
+  :board region=pal
+  :  rom name=program.rom size=0x300000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-AEJP-EUR
+  :  board:    SHVC-BJ0N-01
+  :  revision: SPAL-AEJP-0
+  :  name:     Earthworm Jim
+  :  title:    Earthworm Jim
+
+cartridge sha256:df2b34467581f8ffdad24f59119d54a03875f355d33ab552459b60f8f0de3e78
+  :board region=pal
+  :  rom name=program.rom size=0x300000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-A2EP-EUR
+  :  board:    SHVC-1J0N-20
+  :  revision: SPAL-A2EP-0
+  :  name:     Earthworm Jim 2
+  :  title:    Earthworm Jim 2
+
 cartridge sha256:f4cabd80dd20b076ff90bf1f394b5dff5800900fa1fe178a42b6af967fd80c25
   :board region=pal
   :  rom name=program.rom size=0x280000
@@ -271,6 +493,45 @@ cartridge sha256:0d7a1649915d45b4c6e0752ea06ad353c2b1a590370912c18deeb4298682162
   :  name:     Ghoul Patrol
   :  title:    Ghoul Patrol
 
+cartridge sha256:ee4ab0df49db4024b5da62d04c18c8c866830b54d286dec69440af7285ec2854
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-AHGP-EUR
+  :  board:    SHVC-1J0N-20
+  :  revision: SPAL-AHGP-0
+  :  name:     Hagane
+  :  title:    Hagane
+
+cartridge sha256:21e8632a6da085cae5d4bcf7334c63fbda0028c2a37c0b0c3041ab59f307ebd3
+  :board region=pal
+  :  rom name=program.rom size=0x80000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AIYP-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AIYP-0
+  :  name:     Incantation
+  :  title:    Incantation
+
+cartridge sha256:09d937a73595df67c473f1a4beba2f302570c1434d8093051d027ec1e440b984
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AIJP-EUR
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-AIJP-0
+  :  name:     Indiana Jones' Greatest Adventures
+  :  title:    Indiana Jones' Greatest Adventures
+
 cartridge sha256:6fe482f91a59a71992e14014a0a4e23fb866cf4e870c10d57c81b0c20ae6688e
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -284,6 +545,19 @@ cartridge sha256:6fe482f91a59a71992e14014a0a4e23fb866cf4e870c10d57c81b0c20ae6688
   :  name:     International Superstar Soccer
   :  title:    International Superstar Soccer
 
+cartridge sha256:686f2507e9969fd7617fc544c139e124668294d102e79a0eb34478c8deb75271
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AIZP-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AIZP-0
+  :  name:     Izzy's Quest for the Olympic Rings
+  :  title:    Izzy's Quest for the Olympic Rings
+
 cartridge sha256:2516843fa405ab1aa1f242b57f19977519aefb68599474d2c7065aaef88ecb88
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -310,6 +584,19 @@ cartridge sha256:07386ef7dfcc70a67beb01fa7e2300249914b2ce0b010a74cbfbf0714c32fcf
   :  name:     Justice League Task Force
   :  title:    Justice League Task Force
 
+cartridge sha256:bf0d2739c2bd1aeba9cc979928e0702341cb290023dbc39bd25f18c1412fe674
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AMRP-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AMRP-0
+  :  name:     Marko's Magic Football
+  :  title:    Marko's Magic Football
+
 cartridge sha256:4f83fc7c1fa4fae99568ae8e049a45e6e65176761fe3ac74315bee8eff846fd4
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -336,6 +623,32 @@ cartridge sha256:9da7274457995b39ae7b00387c1eaab92f1fdb0beac55372726c3a3af1cb8f7
   :  name:     MechWarrior 3050
   :  title:    MechWarrior 3050
 
+cartridge sha256:81f90a36c07221546c441d67689d951864f071f3218aa96994c0c54e93998a67
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-A7RP-EUR
+  :  board:    SHVC-1J0N-20
+  :  revision: SPAL-A7RP-0
+  :  name:     Mega Man 7
+  :  title:    Mega Man 7
+
+cartridge sha256:02a85c9e783add4e3d44f8f4718c014743f252585fedd9ae5583458237122b35
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AJYP-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AJYP-0
+  :  name:     Mohawk & Headphone Jack
+  :  title:    Mohawk & Headphone Jack
+
 cartridge sha256:964f8391806bc8d674f24aa2f201b20982d2f2f3e3efb2f730c4a34a289c3007
   :board region=pal
   :  rom name=program.rom size=0x300000
@@ -362,6 +675,19 @@ cartridge sha256:b7fa4b79590ecdef2d0303b5cbccf1e1a3af31fca289652acbdb3d5381137f2
   :  name:     Mortal Kombat 3
   :  title:    Mortal Kombat 3
 
+cartridge sha256:bfec7d5afdf0d41cfce7f4e73dc20d91981db0edc2a0f41c5737d861efd4ab2a
+  :board region=pal
+  :  rom name=program.rom size=0x40000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AUNP-EUR
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AUNP-0
+  :  name:     Mr. Do!
+  :  title:    Mr. Do!
+
 cartridge sha256:aa3f0608fa8723a21a4a5121f04098c53a76b5188f4dc30fcc26db9232c734d8
   :board region=pal
   :  rom name=program.rom size=0x180000
@@ -377,6 +703,19 @@ cartridge sha256:aa3f0608fa8723a21a4a5121f04098c53a76b5188f4dc30fcc26db9232c734d
   :  name:     NHL '96
   :  title:    NHL '96
 
+cartridge sha256:25d04bba3f3b12c63ae7ee4450e1d924df7aff077515d634721e22e6420c09b9
+  :board region=pal
+  :  rom name=program.rom size=0x180000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-NI-EUR
+  :  board:    SHVC-2A0N-20
+  :  revision: SPAL-NI-0
+  :  name:     Ninja Warriors - The New Generation
+  :  title:    Ninja Warriors: The New Generation
+
 cartridge sha256:d9860f4f9b5e71290c5419b88c49b545f947a35cfe0549c2f32e54f05bc55815
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -390,6 +729,19 @@ cartridge sha256:d9860f4f9b5e71290c5419b88c49b545f947a35cfe0549c2f32e54f05bc5581
   :  name:     Olympic Summer Games
   :  title:    Olympic Summer Games
 
+cartridge sha256:2ec71aca4efc3791b6b3e65956df3eafd2a46e223d5ea71aead07d30ca48b6c9
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-AOSP-EUR
+  :  board:    SHVC-1J0N-20
+  :  revision: SPAL-AOSP-0
+  :  name:     Operation Starfi5h
+  :  title:    Operation Starfi5h
+
 cartridge sha256:908b1b18403a1330e1af5844f8c9d11a66279ff107cf14b56e6be849fbd4a7f9
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -509,6 +861,19 @@ cartridge sha256:4001418ceb26f38efbea10b7bcc8233adc7bfcaa7e11dfb401d820f3254f06e
   :  name:     Street Fighter Alpha 2
   :  title:    Street Fighter Alpha 2
 
+cartridge sha256:4ef0053b294be64353df47e4f7d079cb97044e18263b55d46b6e4f9adda55766
+  :board region=pal
+  :  rom name=program.rom size=0x180000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-ZH-EUR
+  :  board:    SHVC-2J0N-20
+  :  revision: SPAL-ZH-0
+  :  name:     Super BC Kid
+  :  title:    Super B.C. Kid
+
 cartridge sha256:640acb63dae038ad6f0ae65e103416f5a1f84d4a37ddaeeab5046122def774d5
   :board region=pal
   :  rom name=program.rom size=0x300000
@@ -575,6 +940,21 @@ cartridge sha256:299984b4148ee4503d67cba8469c5023f7ecb204949bc70c3271cc56b117bb8
   :  name:     Super Tennis
   :  title:    Super Tennis
 
+cartridge sha256:93ba50d853e98e1ca227a2ca72389c0e3ac18d6b50c946b3f618c16c2d3edd38
+  :board region=pal
+  :  rom name=program.rom size=0x400000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :  ram name=save.ram size=0x2000
+  :    map address=20-3f,a0-bf:6000-7fff mask=0xe000
+  :
+  :information
+  :  serial:   SNSP-AQTP-EUR
+  :  board:    SHVC-1J3M-20
+  :  revision: SPAL-AQTP-0
+  :  name:     Terranigma
+  :  title:    Terranigma
+
 cartridge sha256:41648e6d73bd1b998f5c0737a4e61cd603e574ce4a3439e579d2b74b14390159
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -715,6 +1095,19 @@ cartridge sha256:a4b1e125b421c5a58e2fd73edc4d58b31d7a596c07dee263c565f00ee712223
   :  name:     Alfred Chicken
   :  title:    Alfred Chicken
 
+cartridge sha256:d9127808fb02c47dd74fd22f39582c69f19936a794a8efc153cc0e51a0d4d782
+  :board region=pal
+  :  rom name=program.rom size=0x180000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AXOP-FAH
+  :  board:    SHVC-2A0N-20
+  :  revision: SPAL-AXOP-0
+  :  name:     Asterix & Obelix
+  :  title:    Asterix & Obelix
+
 cartridge sha256:dde314fea056445685b97f9c8b554d2be81ea1fe6ace935934592464908d05fb
   :board region=pal
   :  rom name=program.rom size=0x400000
@@ -1110,6 +1503,19 @@ cartridge sha256:f415cafaaac4d5fe062b61be35e64ee6b5e8b925f12b9c82777b4566d31de8f
   :  name:     Choplifter III
   :  title:    Choplifter III
 
+cartridge sha256:5e1cce5ccedb20eff9d188eca445e54bd413db63570fd281f76b3ab56abffd82
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-Y5-FRG
+  :  board:    SHVC-1J0N-10
+  :  revision: SPAL-Y5-0
+  :  name:     Claymates
+  :  title:    Claymates
+
 cartridge sha256:ddad4a3708b8cf760e520b784f42d7085154b0699f3824b8d722512ccab687cb
   :board region=pal
   :  rom name=program.rom size=0x400000
@@ -1162,31 +1568,109 @@ cartridge sha256:b2df16101a2daa0f718853be92e3cf5d88f8e8843d04962e4b403d13769c111
   :  name:     Alien vs Predator
   :  title:    Alien vs Predator
 
-cartridge sha256:bb81d1730222c518084d06c5ce456ee860d5ccb6a410f14a73e68971305bdd12
+cartridge sha256:85b88af9b1f2071804e27c3ff9d42da6b26417c26b6f8a9e878733b8c35724ab
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-TW-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-TW-0
+  :  name:     Another World
+  :  title:    Another World
+
+cartridge sha256:bb81d1730222c518084d06c5ce456ee860d5ccb6a410f14a73e68971305bdd12
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AX-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-AX-0
+  :  name:     Axelay
+  :  title:    Axelay
+
+cartridge sha256:716214f0b17233021f8ee07500530947655c4c871cd041290adb204523984821
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-NX-NOE
+  :  board:    SHVC-YA0N-01
+  :  revision: SPAL-NX-0
+  :  name:     Battletoads in Battlemaniacs
+  :  title:    Battletoads in Battlemaniacs
+
+cartridge sha256:08e02381cf59bdb3ad4d561587c8ccd001c722c7731705a9d84b39cb0337ca53
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-6Z-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-6Z-0
+  :  name:     Blackhawk
+  :  title:    Blackhawk
+
+cartridge sha256:5a054466ffe0694599498b9d94427b25d4f4d55ab4fc1542335f69025e817a3f
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-B4-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-B4-0
+  :  name:     BOB
+  :  title:    B.O.B.
+
+cartridge sha256:6df9b702c65183ef13dd2a66d1bc95e7ec1452e088e9c19a0e3beb9ef952e939
+  :board region=pal
+  :  rom name=program.rom size=0x180000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-RE-NOE
+  :  board:    SHVC-2A0N-11
+  :  revision: SPAL-RE-0
+  :  name:     Brawl Brothers - Rival Turf! 2
+  :  title:    Brawl Brothers: Rival Turf! 2
+
+cartridge sha256:0a49023824d812c64cd262db6e85ce9900c88af7ac6dab3e47078ab0dd1e546c
   :board region=pal
-  :  rom name=program.rom size=0x100000
+  :  rom name=program.rom size=0x200000
   :    map address=00-7d,80-ff:8000-ffff mask=0x8000
   :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
   :
   :information
-  :  serial:   SNSP-AX-NOE
+  :  serial:   SNSP-YN-NOE
   :  board:    SHVC-1A0N-20
-  :  revision: SPAL-AX-0
-  :  name:     Axelay
-  :  title:    Axelay
+  :  revision: SPAL-YN-0
+  :  name:     Bubsy in Claws Encounters of the Furred Kind
+  :  title:    Bubsy in Claws Encounters of the Furred Kind
 
-cartridge sha256:5a054466ffe0694599498b9d94427b25d4f4d55ab4fc1542335f69025e817a3f
+cartridge sha256:6795e22c6ddcbfa48de1e5b1b22ad72890214533a12e59763cb4b8d5b2535aef
   :board region=pal
-  :  rom name=program.rom size=0x100000
+  :  rom name=program.rom size=0x180000
   :    map address=00-7d,80-ff:8000-ffff mask=0x8000
   :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
   :
   :information
-  :  serial:   SNSP-B4-NOE
-  :  board:    SHVC-1A0N-20
-  :  revision: SPAL-B4-0
-  :  name:     BOB
-  :  title:    B.O.B.
+  :  serial:   SNSP-R7-NOE
+  :  board:    SHVC-2A0N-11
+  :  revision: SPAL-R7-0
+  :  name:     Bugs Bunny - Rabbit Rampage
+  :  title:    Bugs Bunny: Rabbit Rampage
 
 cartridge sha256:a20bdbdafccee20bf17eae28fdb0b79fced5b53f90a1cad259461a37903f9ad1
   :board region=pal
@@ -1253,6 +1737,32 @@ cartridge sha256:f000606a504c7a51617c0e32865924a68bf899170aea2647cf403fede8491c0
   :  name:     Clay Fighter
   :  title:    Clay Fighter
 
+cartridge sha256:1ee967210f980b76b6c810a8b130049405183d20e4c308b17c7ef982912fc628
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-6C-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-6C-0
+  :  name:     Cliffhanger
+  :  title:    Cliffhanger
+
+cartridge sha256:e0c51ca00f22716531cb9138cfe8d5af4680cde1c95bfbfcd52c35f246763e65
+  :board region=pal
+  :  rom name=program.rom size=0x80000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-J2-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-J2-0
+  :  name:     Congo's Caper
+  :  title:    Congo's Caper
+
 cartridge sha256:5d42cef66c529939b6038f4ecaf1aeb06acda2dabbf7bcf4e7203f3cb6b43f7a
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -1266,6 +1776,32 @@ cartridge sha256:5d42cef66c529939b6038f4ecaf1aeb06acda2dabbf7bcf4e7203f3cb6b43f7
   :  name:     Cybernator
   :  title:    Cybernator
 
+cartridge sha256:a7612dbb5fd122090d4fcbffec81d295c0911ff5c83fa865c441c7b3996fcc92
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-DW-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-DW-0
+  :  name:     DinoCity
+  :  title:    DinoCity
+
+cartridge sha256:984107f2dbccbcaec1f7e74b62af82785918438144221bd0228fa36419a11ed8
+  :board region=pal
+  :  rom name=program.rom size=0x80000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-DI-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-DI-0
+  :  name:     Dragon's Lair
+  :  title:    Dragon's Lair
+
 cartridge sha256:dddacae010766c1201f50810fcf15dff7c0f6d41ac1a1004c8eea4873a71db12
   :board region=pal
   :  rom name=program.rom size=0x80000
@@ -1306,6 +1842,19 @@ cartridge sha256:c7abc997e0f685a726dacd82e2734f557028490c1c9b8e575bc6cbc18de243a
   :  name:     Final Fight 2
   :  title:    Final Fight 2
 
+cartridge sha256:6cce3d0c8b2eec350475e3c274d7ad80c9a208ba101d9cf9ac637c5d09760ab7
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-5F-NOE
+  :  board:    SHVC-2J0N-01
+  :  revision: SPAL-5F-0
+  :  name:     Flashback
+  :  title:    Flashback
+
 cartridge sha256:6d0095422fe380202e62ed5b34f038681f777dcd9a943cf3534645068e118fb2
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -1319,6 +1868,32 @@ cartridge sha256:6d0095422fe380202e62ed5b34f038681f777dcd9a943cf3534645068e118fb
   :  name:     George Foreman's KO Boxing
   :  title:    George Foreman's KO Boxing
 
+cartridge sha256:ddda02bc9fff44c702ce6b2d043c8c2dc520c568a1df221de0bde24e16e1618d
+  :board region=pal
+  :  rom name=program.rom size=0x80000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-HV-NOE
+  :  board:    SHVC-1A0N-10
+  :  revision: SPAL-HV-0
+  :  name:     Harley's Humongous Adventure
+  :  title:    Harley's Humongous Adventure
+
+cartridge sha256:ca2d67f208e3dc7aaeea88b60d7008b6e00b525bf935c259b642ad5cad783bb1
+  :board region=pal
+  :  rom name=program.rom size=0x80000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-HN-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-HN-0
+  :  name:     Home Alone 2 - Lost in New York
+  :  title:    Home Alone 2: Lost in New York
+
 cartridge sha256:a9dffa5d97855733f14b1b888bc478e8e0630107812b7b3df729c499e0e0734f
   :board region=pal
   :  rom name=program.rom size=0x80000
@@ -1347,6 +1922,32 @@ cartridge sha256:039beb46f81ad9e0844ecec420cc78bfdbf2b1ae940adb4fdf08dbf1b55ac7e
   :  name:     Illusion of Time
   :  title:    Illusion of Time
 
+cartridge sha256:42bc8987dda4f8e4a1d135f3327ef89fb51b9bea97a79dba0060f6fdf9f4c0ba
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-C7-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-C7-0
+  :  name:     Incredible Crash Dummies, The
+  :  title:    The Incredible Crash Dummies
+
+cartridge sha256:74c55ea3c9733bf263628a260df7492fc840d7de1c3fceebb7bcf6d99a8c81d6
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-JT-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-JT-0
+  :  name:     Joe & Mac - Caveman Ninja
+  :  title:    Joe & Mac: Caveman Ninja
+
 cartridge sha256:3fa82117fe88b0b5398995b68624f3027184259456123f2a61d55f668326c769
   :board region=pal
   :  rom name=program.rom size=0x80000
@@ -1374,6 +1975,19 @@ cartridge sha256:11a6c5de89b25836c8b66d3e3077bacdcaf52faab5a0f7fe2bc751aa85a8dd6
   :  name:     King of the Monsters
   :  title:    King of the Monsters
 
+cartridge sha256:9ed408bb30b32c0a86605ea80e2b431563a33d54354a4b68e8b7d4eedde25295
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-L5-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-L5-0
+  :  name:     Last Action Hero
+  :  title:    Last Action Hero
+
 cartridge sha256:5ec66298ddb579b35cc5d3df5bfeeee05bdf71347565c7c5f5f3869bf4f1e469
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -1400,6 +2014,19 @@ cartridge sha256:0ecdd9d6fc78c0bdbc2f684c682ec834cda1148ed2e675cc783a95c601000d3
   :  name:     Lothar Matthaus Super Soccer
   :  title:    Lothar Matthäus Super Soccer
 
+cartridge sha256:8510491f99400115ccf33570269bc4e484fb56370f7ac36f12e73eec19d342da
+  :board region=pal
+  :  rom name=program.rom size=0x180000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-ALYP-NOE
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-ALYP-0
+  :  name:     Lucky Luke
+  :  title:    Lucky Luke
+
 cartridge sha256:8f6920549b28a065a030fbdbe2ea2e9d966d42ab5ac1ef0e9dabc99875a51df2
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -1414,6 +2041,19 @@ cartridge sha256:8f6920549b28a065a030fbdbe2ea2e9d966d42ab5ac1ef0e9dabc99875a51df
   :  name:     MechWarrior
   :  title:    MechWarrior
 
+cartridge sha256:9283ac563e3d8244fb103db13256c669063e67be5eaf6e82b94527f079c9d8a3
+  :board region=pal
+  :  rom name=program.rom size=0x140000
+  :    map address=00-3f,80-bf:8000-ffff
+  :    map address=40-7d,c0-ff:0000-ffff
+  :
+  :information
+  :  serial:   SNSP-AWCP-NOE
+  :  board:    SHVC-2J0N-11
+  :  revision: SPAL-AWCP-0
+  :  name:     Michael Jordan - Chaos in the Windy City
+  :  title:    Michael Jordan: Chaos in the Windy City
+
 cartridge sha256:4703cb071611874b0d9e9555f102278e33dd494202875dc994a232029148bf67
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -1453,6 +2093,19 @@ cartridge sha256:b8fcbad3c712a2ff69a5f9bb9fbe4c4284f91bbe96fe849275a8bcfcb497d20
   :  name:     Phalanx - The Enforce Fighter A-144
   :  title:    Phalanx: The Enforce Fighter A-144
 
+cartridge sha256:ec6f444dcab84d251c12eb4f47aeac23ed997bf0416c5a537bac6bb9d40b725d
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-8P-NOE
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-8P-0
+  :  name:     Pirates of Dark Water, The
+  :  title:    The Pirates of Dark Water
+
 cartridge sha256:9932ed1419bc606ea19337b74a8ef17adaa6b31be5fca8d2b6b266b3f6383e39
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -1595,6 +2248,32 @@ cartridge sha256:4dcf9213cf22c9e28e58b42ca7808224399d89b9b33f1fd592be6866db42755
   :  name:     Super Battleship
   :  title:    Super Battleship
 
+cartridge sha256:3b8e4da1435a548927a120a827eac01fef7d3636f3f763923063e5613adad42f
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AD-NOE
+  :  board:    SHVC-1A0N-02
+  :  revision: SPAL-AD-0
+  :  name:     Super Castlevania IV
+  :  title:    Super Castlevania IV
+
+cartridge sha256:bbedc3b9263993c1294793895b5901973fbb159157db4c6d1b79ee8245007791
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-WD-NOE
+  :  board:    SHVC-1A0N-10
+  :  revision: SPAL-WD-0
+  :  name:     Super Double Dragon
+  :  title:    Super Double Dragon
+
 cartridge sha256:4d7fc331a811b8dc630b469262fd6f45e289243cef83101f32038158967d1b28
   :board region=pal
   :  rom name=program.rom size=0x40000
@@ -1822,6 +2501,46 @@ cartridge sha256:24aad9739f8ffe9319f20d4fa1c4f58108e73843d20d65296926e00ba9c456b
   :  name:     Zombies
   :  title:    Zombies
 
+cartridge sha256:beb379ba48f63561c0f939ecd8f623ec06c1b5e06976eef9887e5c62f3df2766
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-GZ-SCN
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-GZ-0
+  :  name:     Gods
+  :  title:    Gods
+
+cartridge sha256:e15247495311e91db9431d61777a264d4b42def011291d512b273fc8acd1cbfa
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :  ram name=save.ram size=0x2000
+  :    map address=70-7d,f0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-SO-SCN
+  :  board:    SHVC-1A3B-20
+  :  revision: SPAL-SO-0
+  :  name:     Soul Blazer
+  :  title:    Soul Blazer
+
+cartridge sha256:8c5f2f8d45d86b27e48313d136477ba6f30989c93748d800ad6bf82f14ecd4a1
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-UL-UKV
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-UL-0
+  :  name:     Battletoads & Double Dragon
+  :  title:    Battletoads & Double Dragon
+
 cartridge sha256:0a49023824d812c64cd262db6e85ce9900c88af7ac6dab3e47078ab0dd1e546c
   :board region=pal
   :  rom name=program.rom size=0x200000
@@ -1832,7 +2551,7 @@ cartridge sha256:0a49023824d812c64cd262db6e85ce9900c88af7ac6dab3e47078ab0dd1e546
   :  serial:   SNSP-YN-UKV
   :  board:    SHVC-2A0N-10
   :  revision: SPAL-YN-0
-  :  name:     Bubsy I - Claws Encounters of the Furred Kind
+  :  name:     Bubsy in Claws Encounters of the Furred Kind
   :  title:    Bubsy in Claws Encounters of the Furred Kind
 
 cartridge sha256:536f9c2ff7dfdc6e5b51389142151b1c9e9d73f1c2451eafe16d0224d15ad35f
@@ -1881,6 +2600,19 @@ cartridge sha256:dddacae010766c1201f50810fcf15dff7c0f6d41ac1a1004c8eea4873a71db1
   :  name:     F-Zero
   :  title:    F-Zero
 
+cartridge sha256:7d423c7d5ac4fef6ae608ae87e77608294ef7e51a6f0afff1042ed66a1c639fe
+  :board region=pal
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AFNP-UKV
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AFNP-0
+  :  name:     Flintstones, The
+  :  title:    The Flintstones
+
 cartridge sha256:e9e2152411fec3bd10e8cd4587b62717169a25a4cd28f491f8e477b9aae2fcee
   :board region=pal
   :  rom name=program.rom size=0x100000
@@ -1908,6 +2640,32 @@ cartridge sha256:9d936f3b0b5bea0b7c4588e65fa147fff1108d0e630337dd75eb16133a55e31
   :  name:     International Sensible Soccer - World Champions
   :  title:    International Sensible Soccer: World Champions
 
+cartridge sha256:975397a09ec1dfa518f1f0a2029ecb74e5b4c1113bf3376de94711672ff4e054
+  :board region=pal
+  :  rom name=program.rom size=0x80000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-JX-UKV
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-JX-0
+  :  name:     James Pond's Crazy Sports
+  :  title:    James Pond's Crazy Sports
+
+cartridge sha256:f5e74f09c485d58b444ef2b168d041a1d451056b5feb295901974ca73190dbdb
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-AJBP-UKV
+  :  board:    SHVC-1A0N-30
+  :  revision: SPAL-AJBP-0
+  :  name:     Jelly Boy
+  :  title:    Jelly Boy
+
 cartridge sha256:ddad4a3708b8cf760e520b784f42d7085154b0699f3824b8d722512ccab687cb
   :board region=pal
   :  rom name=program.rom size=0x400000
@@ -1948,6 +2706,19 @@ cartridge sha256:0c4038eb0ee37c0faac6a04928b37b5c2f1047ab59c5345da16de48c92db502
   :  name:     Lethal Enforcers
   :  title:    Lethal Enforcers
 
+cartridge sha256:528f9697cdb5b50504aa4f6d6f7882c4997e7141898f9a00a630692b964204eb
+  :board region=pal
+  :  rom name=program.rom size=0x100000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNSP-L3-UKV
+  :  board:    SHVC-1A0N-20
+  :  revision: SPAL-L3-0
+  :  name:     Lethal Weapon
+  :  title:    Lethal Weapon
+
 cartridge sha256:d33f682605b3d6c8a162506ef333a24933ae26a32f10ff8e49fc113bcd189137
   :board region=pal
   :  rom name=program.rom size=0x180000
@@ -3331,19 +4102,6 @@ cartridge sha256:9e3ad5e521e759a2e2260ea8072eb3314b6fcf67a3b7247357a5de9bcb24eea
   :  name:     Brutal - Paws of Fury
   :  title:    Brutal: Paws of Fury
 
-cartridge sha256:811cbc3287c0959e8eb242e817684d36de664ebebc5873a1fa9958693857c438
-  :board region=ntsc
-  :  rom name=program.rom size=0x200000
-  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
-  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
-  :
-  :information
-  :  serial:   SNS-UY-USA
-  :  board:    SHVC-1A0N-20
-  :  revision: SNS-UY-0
-  :  name:     Bubsy I - Claws Encounters of the Furred Kind
-  :  title:    Bubsy in Claws Encounters of the Furred Kind
-
 cartridge sha256:2357d344af77d25dda030520ce203045fd9060f83e3b9609a228dba859d9017b
   :board region=ntsc
   :  rom name=program.rom size=0x200000
@@ -3357,6 +4115,19 @@ cartridge sha256:2357d344af77d25dda030520ce203045fd9060f83e3b9609a228dba859d9017
   :  name:     Bubsy II
   :  title:    Bubsy II
 
+cartridge sha256:811cbc3287c0959e8eb242e817684d36de664ebebc5873a1fa9958693857c438
+  :board region=ntsc
+  :  rom name=program.rom size=0x200000
+  :    map address=00-7d,80-ff:8000-ffff mask=0x8000
+  :    map address=40-7d,c0-ff:0000-7fff mask=0x8000
+  :
+  :information
+  :  serial:   SNS-UY-USA
+  :  board:    SHVC-1A0N-20
+  :  revision: SNS-UY-0
+  :  name:     Bubsy in Claws Encounters of the Furred Kind
+  :  title:    Bubsy in Claws Encounters of the Furred Kind
+
 cartridge sha256:49020695a017acc3dfadea97a60e28609e583571f69c5abeb3c6b1c2db8113fa
   :board region=ntsc
   :  rom name=program.rom size=0x180000
diff --git a/libco/doc/style.css b/libco/doc/style.css
index 5181afd..ab07025 100644
--- a/libco/doc/style.css
+++ b/libco/doc/style.css
@@ -6,3 +6,7 @@ body {
 code {
   background: #444;
 }
+
+a {
+  color: #aaf;
+}
diff --git a/libco/doc/usage.html b/libco/doc/usage.html
index 3f0d81c..38576dc 100644
--- a/libco/doc/usage.html
+++ b/libco/doc/usage.html
@@ -6,26 +6,19 @@
 <body>
 
 <b>License:</b><br/><br/>
-libco is released to the public domain.
-<hr/>
-
-<b>Contact:</b><br/><br/>
-At present, you may contact me at setsunakun0 at hotmail dot com.<br/>
-I am interested in knowing of any projects that make use of this library,
-though this is only a courtesy.
+libco is released under the ISC license.
 <hr/>
 
 <b>Foreword:</b><br/><br/>
-libco is a cross-platform, public domain implementation of
-cooperative-multithreading; a feature that is sorely lacking
-from the ISO C/C++ standard.<br/>
-The library is designed for maximum speed and portability, and
-not for safety or features. If safety or extra functionality is desired,
-a wrapper API can easily be written to encapsulate all library functions.<br/>
-Behavior of executing operations that are listed as not permitted
-below result in undefined behavior. They may work anyway, they
-may cause undesired / unknown behavior, or they may crash the
-program entirely.<br/>
+libco is a cross-platform, permissively licensed implementation of
+cooperative-multithreading; a feature that is sorely lacking from the ISO C/C++
+standard.<br/>
+The library is designed for maximum speed and portability, and not for safety or
+features. If safety or extra functionality is desired, a wrapper API can easily
+be written to encapsulate all library functions.<br/>
+Behavior of executing operations that are listed as not permitted below result
+in undefined behavior. They may work anyway, they may cause undesired / unknown
+behavior, or they may crash the program entirely.<br/>
 The goal of this library was to simplify the base API as much as possible,
 implementing only that which cannot be implemented using pure C. Additional
 functionality after this would only complicate ports of this library to new
@@ -35,7 +28,7 @@ platforms.
 <b>Porting:</b><br/><br/>
 This document is included as a reference for porting libco. Please submit any
 ports you create to me, so that libco can become more useful. Please note that
-since libco is public domain, you must submit your code as a work of the
+since libco is permissively licensed, you must submit your code as a work of the
 public domain in order for it to be included in the official distribution.
 Full credit will be given in the source code of the official release. Please
 do not bother submitting code to me under any other license -- including GPL,
diff --git a/libco/libco.h b/libco/libco.h
index 0ea4778..c845215 100644
--- a/libco/libco.h
+++ b/libco/libco.h
@@ -1,7 +1,7 @@
 /*
-  libco v18.01 (2017-01-22)
+  libco v18.02 (2017-11-06)
   author: byuu
-  license: public domain
+  license: ISC
 */
 
 #ifndef LIBCO_H
diff --git a/nall/GNUmakefile b/nall/GNUmakefile
index 79e73fd..f9865de 100644
--- a/nall/GNUmakefile
+++ b/nall/GNUmakefile
@@ -51,7 +51,7 @@ ifeq ($(compiler),)
   else ifeq ($(platform),macos)
     compiler := clang++
   else ifeq ($(platform),linux)
-    compiler := g++-4.9
+    compiler := g++
   else ifeq ($(platform),bsd)
     compiler := g++49
   else
@@ -89,6 +89,7 @@ endif
 # windows settings
 ifeq ($(platform),windows)
   link += -lws2_32 -lole32
+  link += $(if $(findstring $(console),true),-mconsole,-mwindows)
   windres := windres
 endif
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/higan.git



More information about the Pkg-games-commits mailing list