text: #include "chip/chip.hpp"
  #include "board/board.hpp"
  
  struct Cartridge : Thread {
    inline auto rate() const -> uint { return Region::PAL() ? 16 : 12; }
  
    //cartridge.cpp
    static auto Enter() -> void;
    auto main() -> void;
  
    auto pathID() const -> uint { return information.pathID; }
    auto region() const -> string { return information.region; }
    auto hash() const -> string { return information.sha256; }
    auto manifest() const -> string { return information.manifest; }
    auto title() const -> string { return information.title; }
  
    auto load() -> bool;
    auto save() -> void;
    auto unload() -> void;
  
    auto power() -> void;
  
    //serialization.cpp
    auto serialize(serializer&) -> void;
  
    struct Information {
      uint pathID = 0;
      string region;
      string sha256;
      string manifest;
      string title;
    } information;
  
  //privileged:
    Board* board = nullptr;
  
    auto readPRG(uint addr) -> uint8;
    auto writePRG(uint addr, uint8 data) -> void;
  
    auto readCHR(uint addr) -> uint8;
    auto writeCHR(uint addr, uint8 data) -> void;
  
    //scanline() is for debugging purposes only:
    //boards must detect scanline edges on their own
    auto scanline(uint y) -> void;
  };
  
  extern Cartridge cartridge;
  