rtcClockData.data[3] = 0;
rtcClockData.data[3] = toBCD(newtime->tm_wday);
bool rtcWrite(u32 address, u16 value){  if(!rtcEnabled)    return false;    if(address == 0x80000c8) {    rtcClockData.byte2 = (u8)value; // enable ?  } else if(address == 0x80000c6) {    rtcClockData.byte1 = (u8)value; // read/write  } else if(address == 0x80000c4) {    if(rtcClockData.byte2 & 1) {      if(rtcClockData.state == IDLE && rtcClockData.byte0 == 1 && value == 5) {          rtcClockData.state = COMMAND;          rtcClockData.bits = 0;          rtcClockData.command = 0;      } else if(!(rtcClockData.byte0 & 1) && (value & 1)) { // bit transfer        rtcClockData.byte0 = (u8)value;                switch(rtcClockData.state) {        case COMMAND:          rtcClockData.command |= ((value & 2) >> 1) << (7-rtcClockData.bits);          rtcClockData.bits++;          if(rtcClockData.bits == 8) {            rtcClockData.bits = 0;            switch(rtcClockData.command) {            case 0x60:              // not sure what this command does but it doesn't take parameters              // maybe it is a reset or stop              rtcClockData.state = IDLE;              rtcClockData.bits = 0;              break;            case 0x62:              // this sets the control state but not sure what those values are              rtcClockData.state = READDATA;              rtcClockData.dataLen = 1;              break;            case 0x63:              rtcClockData.dataLen = 1;              rtcClockData.data[0] = 0x40;              rtcClockData.state = DATA;              break;            case 0x65:              {                struct tm *newtime;                time_t long_time;                time( &long_time );                /* Get time as long integer. */                newtime = localtime( &long_time ); /* Convert to local time. */                                rtcClockData.dataLen = 7;                rtcClockData.data[0] = toBCD(newtime->tm_year);                rtcClockData.data[1] = toBCD(newtime->tm_mon+1);                rtcClockData.data[2] = toBCD(newtime->tm_mday);                rtcClockData.data[3] = 0;                rtcClockData.data[4] = toBCD(newtime->tm_hour);                rtcClockData.data[5] = toBCD(newtime->tm_min);                rtcClockData.data[6] = toBCD(newtime->tm_sec);                rtcClockData.state = DATA;              }              break;                          case 0x67:              {                struct tm *newtime;                time_t long_time;                time( &long_time );                /* Get time as long integer. */                newtime = localtime( &long_time ); /* Convert to local time. */                                rtcClockData.dataLen = 3;                rtcClockData.data[0] = toBCD(newtime->tm_hour);                rtcClockData.data[1] = toBCD(newtime->tm_min);                rtcClockData.data[2] = toBCD(newtime->tm_sec);                rtcClockData.state = DATA;              }              break;            default:              systemMessage(0, N_("Unknown RTC command %02x"), rtcClockData.command);              rtcClockData.state = IDLE;              break;            }          }          break;        case DATA:          if(rtcClockData.byte1 & 2) {          } else {            rtcClockData.byte0 = (rtcClockData.byte0 & ~2) |              ((rtcClockData.data[rtcClockData.bits >> 3] >>                (rtcClockData.bits & 7)) & 1)*2;            rtcClockData.bits++;            if(rtcClockData.bits == 8*rtcClockData.dataLen) {              rtcClockData.bits = 0;              rtcClockData.state = IDLE;            }          }          break;        case READDATA:          if(!(rtcClockData.byte1 & 2)) {          } else {            rtcClockData.data[rtcClockData.bits >> 3] =              (rtcClockData.data[rtcClockData.bits >> 3] >> 1) |              ((value << 6) & 128);            rtcClockData.bits++;            if(rtcClockData.bits == 8*rtcClockData.dataLen) {              rtcClockData.bits = 0;              rtcClockData.state = IDLE;            }          }          break;		default:          break;        }      } else        rtcClockData.byte0 = (u8)value;    }  }  return true;}