+void KEYBOARD::set_repeat_type(void)
+{
+ int cmd;
+ int modeval;
+
+ cmd = cmd_fifo->read();
+ if(cmd_fifo->empty()) return;
+ modeval = cmd_fifo->read();
+ if((modeval >= 2) || (modeval < 0)) return;
+ repeat_mode = (modeval == 0);
+ data_fifo->clear();
+ cmd_fifo->clear();
+ rxrdy->write_signal(0x01, 0x00, 0x01);
+}
+
+void KEYBOARD::set_repeat_time(void)
+{
+ int cmd;
+ int time_high;
+ int time_low;
+ cmd = cmd_fifo->read();
+ if(cmd_fifo->empty()) return;
+ time_high = cmd_fifo->read();
+ if(cmd_fifo->empty()) return;
+ time_low = cmd_fifo->read();
+ if(cmd_fifo->empty()) return;
+
+ if((time_high == 0) || (time_low == 0)) {
+ repeat_time_long = 700;
+ repeat_time_short = 70;
+ } else {
+ repeat_time_long = time_high * 10;
+ repeat_time_short = time_low * 10;
+ }
+ data_fifo->clear();
+ cmd_fifo->clear();
+ rxrdy->write_signal(0x01, 0x00, 0x01);
+}
+
+void KEYBOARD::set_rtc(void)
+{
+ int cmd;
+ int tmp;
+ int localcmd;
+ if(cmd_fifo->count() < 9) return;
+ cmd = cmd_fifo->read();
+ localcmd = cmd_fifo->read();
+ // YY
+ tmp = cmd_fifo->read();
+ rtc_yy = ((tmp >> 4) * 10) | (tmp & 0x0f);
+ // MM
+ tmp = cmd_fifo->read();
+ rtc_mm = ((tmp >> 4) * 10) | (tmp & 0x0f);
+ // DD
+ tmp = cmd_fifo->read();
+ rtc_dd = (((tmp & 0x30) >> 4) * 10) | (tmp & 0x0f);
+ // DayOfWeek + Hour
+ tmp = cmd_fifo->read();
+ rtc_count24h = ((tmp & 0x08) != 0);
+ if(!rtc_count24h) {
+ rtc_ispm = ((tmp & 0x04) != 0);
+ }
+ rtc_dayofweek = (tmp >> 4) % 0x07;
+ rtc_hh = ((tmp & 0x03) * 10);
+ // Low
+ tmp = cmd_fifo->read();
+ rtc_hh = rtc_hh | (tmp >> 4);
+ if(rtc_count24h) {
+ rtc_ispm = (rtc_hh >= 12);
+ }
+ rtc_minute = (tmp & 0x0f) * 10;
+
+ tmp = cmd_fifo->read();
+ rtc_minute = rtc_minute | (tmp >> 4);
+ rtc_sec = (tmp & 0x0f) * 10;
+
+ tmp = cmd_fifo->read();
+ rtc_sec = rtc_sec | (tmp >> 4);
+
+ data_fifo->clear();
+ cmd_fifo->clear();
+ rxrdy->write_signal(0x01, 0x00, 0x01);
+}
+
+void KEYBOARD::get_rtc(void)
+{
+ int cmd;
+ int tmp;
+ int localcmd;
+ data_fifo->clear();
+ // YY
+ tmp = ((rtc_yy / 10) << 4) | (rtc_yy % 10);
+ data_fifo->write(tmp);
+ // MM
+ tmp = ((rtc_mm / 10) << 4) | (rtc_mm % 10);
+ data_fifo->write(tmp);
+ // DD
+ tmp = ((rtc_dd / 10) << 4) | (rtc_dd % 10);
+ tmp = tmp | (0 << 6); // leap
+ data_fifo->write(tmp);
+ // DayOfWeek + Hour
+ tmp = rtc_dayofweek << 4;
+ tmp = tmp | (rtc_hh / 10);
+ if(rtc_count24h) {
+ tmp = tmp | 0x08;
+ } else {
+ if(rtc_ispm) {
+ tmp = tmp | 0x04;
+ }
+ }
+ data_fifo->write(tmp);
+ // Low
+ tmp = (rtc_hh % 10) << 4;
+ tmp = tmp | (rtc_mm / 10);
+ data_fifo->write(tmp);
+
+ tmp = (rtc_minute % 10) << 4;
+ tmp = tmp | (rtc_sec / 10);
+ data_fifo->write(tmp);
+
+ tmp = (rtc_sec % 10) << 4;
+ data_fifo->write(tmp);
+
+ cmd_fifo->clear();
+ rxrdy->write_signal(0x01, 0x01, 0x01);
+}
+
+const int rtc_month_days[12] = {
+ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+};
+
+void KEYBOARD::rtc_count(void)
+{
+ // count per 1sec
+ rtc_sec++;
+ if(rtc_sec >= 60) {
+ rtc_sec = 0;
+ rtc_minute++;
+ if(rtc_minute >= 60) {
+ rtc_minute = 0;
+ rtc_hour++;
+ if(rtc_count24h) {
+ rtc_ispm = (rtc_hour >= 12);
+ if(rtc_hour < 24) return;
+ } else {
+ if(rtc_ispm) {
+ if(rtc_hour < 12) return;
+ } else {
+ if(rtc_hour < 12) return;
+ rtc_ispm = true;
+ rtc_hour = 0;
+ return;
+ }
+ }
+ // Day count up
+ rtc_hour = 0;
+ rtc_dd++;
+ rtc_dayofweek++;
+ if(rtc_dayofweek >= 7) rtc_dayofweek = 0;
+ if(rtc_dd > rtc_month_days[rtc_mm]){
+ if((rtc_mm ==1) && (rtc_dd == 29)) {
+ if((rtc_yy % 4) == 0) return;
+ }
+ rtc_dd = 1;
+ rtc_mm++;
+ if(rtc_mm >= 12) {
+ rtc_yy++;
+ rtc_mm = 0;
+ if(rtc_yy >= 100) rtc_yy = 0;
+ }
+ }
+ }
+ }
+}
+void KEYBOARD::rtc_adjust(void)
+{
+}