struct SharpRTC : Coprocessor {
  static void Enter();
  void enter();

  void init();
  void load();
  void unload();
  void power();
  void reset();
  void sync();

  uint8 read(unsigned addr);
  void write(unsigned addr, uint8 data);

  void serialize(serializer&);

  enum class State : unsigned { Ready, Command, Read, Write } rtc_state;
  signed rtc_index;

  unsigned second;
  unsigned minute;
  unsigned hour;
  unsigned day;
  unsigned month;
  unsigned year;
  unsigned weekday;

  //memory.cpp
  uint4 rtc_read(uint4 addr);
  void rtc_write(uint4 addr, uint4 data);

  void load(const uint8 *data);
  void save(uint8 *data);

  //time.cpp
  static const unsigned daysinmonth[12];
  void tick_second();
  void tick_minute();
  void tick_hour();
  void tick_day();
  void tick_month();
  void tick_year();

  unsigned calculate_weekday(unsigned year, unsigned month, unsigned day);
};

extern SharpRTC sharprtc;
