text: struct Cartridge : Thread, IO {
    auto pathID() const -> uint { return information.pathID; }
  
    static auto Enter() -> void;
    auto main() -> void;
    auto step(uint clocks) -> void;
    auto power() -> void;
  
    auto load() -> bool;
    auto save() -> void;
    auto unload() -> void;
  
    //memory.cpp
    auto romRead(uint20 addr) -> uint8;
    auto romWrite(uint20 addr, uint8 data) -> void;
  
    auto ramRead(uint20 addr) -> uint8;
    auto ramWrite(uint20 addr, uint8 data) -> void;
  
    //rtc.cpp
    auto rtcLoad() -> void;
    auto rtcSave() -> void;
    auto rtcTickSecond() -> void;
    auto rtcCheckAlarm() -> void;
    auto rtcStatus() -> uint8;
    auto rtcCommand(uint8 data) -> void;
    auto rtcRead() -> uint8;
    auto rtcWrite(uint8 data) -> void;
  
    //io.cpp
    auto portRead(uint16 addr) -> uint8 override;
    auto portWrite(uint16 addr, uint8 data) -> void override;
  
    //serialization.cpp
    auto serialize(serializer&) -> void;
  
    struct Information {
      uint pathID = 0;
      string sha256;
      string manifest;
      string title;
      boolean orientation;  //0 = horizontal; 1 = vertical
    } information;
  
    struct Registers {
      //$00c0  BANK_ROM2
      uint8 romBank2;
  
      //$00c1  BANK_SRAM
      uint8 sramBank;
  
      //$00c2  BANK_ROM0
      uint8 romBank0;
  
      //$00c3  BANK_ROM1
      uint8 romBank1;
  
      //$00cc  GPO_EN
      uint8 gpoEnable;
  
      //$00cd  GPO_DATA
      uint8 gpoData;
    } r;
  
    struct Memory {
      uint8* data = nullptr;
      uint size = 0;
      uint mask = 0;
      string name;
    };
  
    struct RTC : Memory {
      uint8 command;
      uint4 index;
  
      uint8 alarm;
      uint8 alarmHour;
      uint8 alarmMinute;
  
      auto year()    -> uint8& { return data[0]; }
      auto month()   -> uint8& { return data[1]; }
      auto day()     -> uint8& { return data[2]; }
      auto weekday() -> uint8& { return data[3]; }
      auto hour()    -> uint8& { return data[4]; }
      auto minute()  -> uint8& { return data[5]; }
      auto second()  -> uint8& { return data[6]; }
    };
  
    Memory rom;
    Memory ram;
    EEPROM eeprom;
    RTC rtc;
  };
  
  extern Cartridge cartridge;
  