/* Called on every get time. */ static void set_registers() { int is24hour = (nvrram[0xB] & 2) ? 1 : 0; int isbcd = (nvrram[0xB] & 4) ? 0 : 1; uint8_t baknvr[10]; memcpy(baknvr,nvrram,10); if (AMSTRAD) { is24hour = 1; isbcd = 1; } nvrram[0] = final_form(isbcd, second); nvrram[2] = final_form(isbcd, minute); nvrram[4] = is24hour ? final_form(isbcd, hour) : final_form(isbcd, to_12_hour(hour)); nvrram[6] = week_day(); nvrram[7] = final_form(isbcd, day); nvrram[8] = final_form(isbcd, month); nvrram[9] = final_form(isbcd, (year % 100)); if (baknvr[0] != nvrram[0] || baknvr[2] != nvrram[2] || baknvr[4] != nvrram[4] || baknvr[6] != nvrram[6] || baknvr[7] != nvrram[7] || baknvr[8] != nvrram[8] || baknvr[9] != nvrram[9]) nvrram[0xA]|=0x80; }
static void display_layer_update_callback(Layer *me, GContext* context) { time_t now = time(NULL); struct tm *t = localtime(&now); unsigned short hour = t->tm_hour; unsigned short hour_first_digit; unsigned short hour_second_digit; if(!clock_is_24h_style()) { unsigned short period; if(hour < 12) period = 0; // 0 for AM else period = 1; // 1 for PM hour = to_12_hour(hour); hour_first_digit = period; hour_second_digit = hour; } else { hour_first_digit = hour / 10; hour_second_digit = hour % 10; } draw_col( context, hour_first_digit, HOURS_FIRST_DIGIT_MAX_ROWS, HOURS_FIRST_DIGIT_COL ); draw_col(context, hour_second_digit, DEFAULT_MAX_ROWS, HOURS_SECOND_DIGIT_COL ); draw_col(context, t->tm_min / 10, MINUTES_FIRST_DIGIT_MAX_ROWS, MINUTES_FIRST_DIGIT_COL ); draw_col(context, t->tm_min % 10, DEFAULT_MAX_ROWS, MINUTES_SECOND_DIGIT_COL ); }
static void update_reg_0B(int val) { int old_24 = (nvrram[0xB] & 2) ? 1 : 0; int new_24 = (val & 2) ? 1 : 0; int old_bcd = (nvrram[0xB] & 4) ? 0 : 1; int new_bcd = (val & 4) ? 0 : 1; uint8_t baknvr[10]; if (AMSTRAD) return; memcpy(baknvr,nvrram,10); /* First convert to regular form. */ second = original_form(old_bcd, nvrram[0]); minute = original_form(old_bcd, nvrram[2]); hour = old_24 ? original_form(old_bcd, nvrram[4]) : from_12_hour(original_form(old_bcd, nvrram[4])); day = original_form(old_bcd, nvrram[7]); month = original_form(old_bcd, nvrram[8]); year = original_form(old_bcd, nvrram[9]) + 1900; /* Then convert to new form. */ nvrram[0] = final_form(new_bcd, second); nvrram[2] = final_form(new_bcd, minute); nvrram[4] = new_24 ? final_form(new_bcd, hour) : final_form(new_bcd, to_12_hour(hour)); nvrram[6] = week_day(); nvrram[7] = final_form(new_bcd, day); nvrram[8] = final_form(new_bcd, month); nvrram[9] = final_form(new_bcd, (year % 100)); if (baknvr[0] != nvrram[0] || baknvr[2] != nvrram[2] || baknvr[4] != nvrram[4] || baknvr[6] != nvrram[6] || baknvr[7] != nvrram[7] || baknvr[8] != nvrram[8] || baknvr[9] != nvrram[9]) nvrram[0xA]|=0x80; }