2 * Common Source code Project -> VM -> FM-7/77AV -> Keyboard
3 * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
6 * Feb 12, 2015 : Initial
9 #include "../../fifo.h"
10 #include "../device.h"
11 #include "fm7_keyboard.h"
13 #include "keyboard_tables.h"
19 // 0xd400(SUB) or 0xfd00(MAIN)
20 uint8 KEYBOARD::get_keycode_high(void)
23 if((keycode_7 & 0x0100) != 0) data = 0x80;
24 //this->write_signals(&int_line, 0x00000000);
28 // 0xd401(SUB) or 0xfd01(MAIN)
29 uint8 KEYBOARD::get_keycode_low(void)
31 uint8 data = keycode_7 & 0xff;
32 this->write_signals(&int_line, 0x00000000);
37 void KEYBOARD::turn_on_ins_led(void)
39 this->write_signals(&ins_led, 0xff);
43 void KEYBOARD::turn_off_ins_led(void)
45 this->write_signals(&ins_led, 0x00);
49 uint16 KEYBOARD::vk2scancode(uint32 vk)
54 if(vk_matrix_106[i] == vk) return i;
56 } while(vk_matrix_106[i] != 0xffff);
60 bool KEYBOARD::isModifier(uint16 sc)
62 if(((sc >= 0x52) && (sc <= 0x56)) || // CTRL LSHIFT RSHIFT CAPS GRPH
63 (sc == 0x5a) || (sc == 0x5c)) { // KANA BREAK
69 void KEYBOARD::set_modifiers(uint16 sc, bool flag)
71 if(sc == 0x52) { // CTRL
73 } else if(sc == 0x53) { // LSHIFT
74 lshift_pressed = flag;
80 } else if(sc == 0x54) { // RSHIFT
81 rshift_pressed = flag;
87 } else if(sc == 0x56) { // GRPH
89 } else if(sc == 0x55) { // CAPS
97 if(keymode == KEYMODE_STANDARD) this->write_signals(&caps_led, caps_pressed ? 0xff : 0x00);
99 } else if(sc == 0x5a) { // KANA
103 kana_pressed = false;
107 if(keymode == KEYMODE_STANDARD) this->write_signals(&kana_led, kana_pressed ? 0xff : 0x00);
109 } else if(sc == 0x5c) { // Break
110 break_pressed = flag;
114 uint16 KEYBOARD::scan2fmkeycode(uint16 sc)
116 const struct key_tbl_t *keyptr = NULL;
121 if((sc == 0) || (sc >= 0x67)) return 0xffff;
122 // Set repeat flag(s)
123 if(shift_pressed && ctrl_pressed) {
137 if(keymode == KEYMODE_STANDARD) {
138 bool dmy = isModifier(sc);
141 keyptr = ctrl_shift_key;
145 } else if(graph_pressed) {
147 keyptr = graph_shift_key;
151 } else if(kana_pressed) {
153 keyptr = kana_shift_key;
160 keyptr = standard_shift_key;
162 keyptr = standard_key;
166 #if defined(_FM77AV_VARIANTS)
167 else if(shift_pressed) {
168 // DO super-impose mode:
170 // F8 : IMPOSE (High brightness)
171 // F9 : IMPOSE (Low brightness)
174 if(keymode == KEYMODE_SCAN) {
175 bool dmy = isModifier(sc);
178 } else if(keymode == KEYMODE_16BETA) { // Will Implement
179 bool dmy = isModifier(sc);
182 keyptr = ctrl_shift_key_16beta;
184 keyptr = ctrl_key_16beta;
186 } else if(graph_pressed) {
188 keyptr = graph_shift_key_16beta;
190 keyptr = graph_key_16beta;
192 } else if(kana_pressed) {
194 keyptr = kana_shift_key_16beta;
196 keyptr = kana_key_16beta;
201 keyptr = standard_shift_key_16beta;
203 keyptr = standard_key_16beta;
207 #endif //_FM77AV_VARIANTS
210 if (keyptr == NULL) return 0xffff;
212 if(keyptr[i].phy == sc) {
213 retval = keyptr[i].code;
217 } while(keyptr[i].phy != 0xffff);
220 if((retval >= 'A') && (retval <= 'Z')) {
224 } else if((retval >= 'a') && (retval <= 'z')) {
233 void KEYBOARD::key_up(uint32 vk)
235 uint16 bak_scancode = vk2scancode(vk);
236 bool stat_break = break_pressed;
238 if(scancode == 0) return;
239 if((event_keyrepeat >= 0) && (bak_scancode != 0x5c)) { // Not Break
240 cancel_event(this, event_keyrepeat);
241 event_keyrepeat = -1;
243 if(this->isModifier(scancode)) {
244 set_modifiers(bak_scancode, false);
245 if(break_pressed != stat_break) { // Break key UP.
246 this->write_signals(&break_line, 0x00);
249 if(key_pressed_flag[bak_scancode] == false) return;
250 key_pressed_flag[bak_scancode] = false;
251 if(keymode == KEYMODE_SCAN) { // Notify even key-up, when using SCAN mode.
253 keycode_7 = (bak_scancode & 0x7f)| 0x80;
254 this->write_signals(&int_line, 0xffffffff);
259 void KEYBOARD::key_down(uint32 vk)
261 if(older_vk == vk) return;
264 scancode = vk2scancode(vk);
268 void KEYBOARD::key_down_main(void)
270 double usec = (double)repeat_time_long * 1000.0;
272 bool stat_break = break_pressed;
274 if(scancode == 0) return;
275 if(this->isModifier(scancode)) { // modifiers
276 set_modifiers(scancode, true);
277 if(break_pressed != stat_break) { // Break key Down.
278 this->write_signals(&break_line, 0xff);
280 //printf("DOWN SCAN=%04x break=%d\n", scancode, break_pressed);
282 code_7 = scan2fmkeycode(scancode);
283 if(keymode == KEYMODE_SCAN) {
284 code_7 = scancode & 0x7f;
286 //if(key_pressed_flag[scancode] != false) return;
289 if(code_7 != 0) this->write_signals(&int_line, 0xffffffff);
292 // If repeat && !(PF) && !(BREAK)
293 if((scancode < 0x5c) && (code_7 != 0xffff)) {
294 if(event_keyrepeat >= 0) cancel_event(this, event_keyrepeat);
295 event_keyrepeat = -1;
296 if(repeat_mode) register_event(this,
297 ID_KEYBOARD_AUTOREPEAT_FIRST + scancode,
298 usec, false, &event_keyrepeat);
300 key_pressed_flag[scancode] = true;
304 #if defined(_FM77AV_VARIANTS)
305 void KEYBOARD::adjust_rtc(void)
307 p_emu->get_host_time(&cur_time);
308 rtc_yy = cur_time.year % 100;
309 rtc_mm = cur_time.month;
310 rtc_dd = cur_time.day;
312 rtc_dayofweek = cur_time.day_of_week;
314 rtc_ispm = (cur_time.hour >= 12) ? true : false;
315 rtc_hour = cur_time.hour % 12;
318 rtc_hour = cur_time.hour;
320 rtc_minute = cur_time.minute;
321 rtc_sec = cur_time.second;
322 if(event_key_rtc >= 0) {
323 cancel_event(this, event_key_rtc);
325 register_event(this, ID_KEYBOARD_RTC_COUNTUP, 1000.0 * 1000.0, true, &event_key_rtc);
329 void KEYBOARD::do_repeatkey(uint16 sc)
332 if((sc == 0) || (sc >= 0x67)) return; // scancode overrun.
334 if(event_keyrepeat >= 0) {
335 cancel_event(this, event_keyrepeat);
336 event_keyrepeat = -1;
340 key_pressed_flag[sc] = true;
341 code_7 = scan2fmkeycode(sc);
342 if(keymode == KEYMODE_SCAN) {
347 this->write_signals(&int_line, 0xffffffff);
351 void KEYBOARD::event_callback(int event_id, int err)
353 #if defined(_FM77AV_VARIANTS)
354 if(event_id == ID_KEYBOARD_RXRDY_OK) {
356 write_signals(&rxrdy, 0xff);
357 } else if(event_id == ID_KEYBOARD_RXRDY_BUSY) {
358 rxrdy_status = false;
359 write_signals(&rxrdy, 0x00);
360 } else if(event_id == ID_KEYBOARD_ACK) {
361 key_ack_status = true;
362 write_signals(&key_ack, 0xff);
363 } else if(event_id == ID_KEYBOARD_RTC_COUNTUP) {
367 if((event_id >= ID_KEYBOARD_AUTOREPEAT_FIRST) && (event_id <= (ID_KEYBOARD_AUTOREPEAT_FIRST + 0x1ff))) {
368 uint32 sc = event_id - ID_KEYBOARD_AUTOREPEAT_FIRST;
369 double usec = (double)repeat_time_short * 1000.0;
371 if((sc >= 0x67) || (sc == 0)) return;
372 do_repeatkey((uint16)sc);
374 ID_KEYBOARD_AUTOREPEAT + sc,
375 usec, true, &event_keyrepeat);
377 } else if((event_id >= ID_KEYBOARD_AUTOREPEAT) && (event_id <= (ID_KEYBOARD_AUTOREPEAT + 0x1ff))){
378 uint32 sc = event_id - ID_KEYBOARD_AUTOREPEAT;
379 do_repeatkey((uint16)sc);
384 void KEYBOARD::reset_unchange_mode(void)
387 repeat_time_short = 70; // mS
388 repeat_time_long = 700; // mS
393 lshift_pressed = false;
394 rshift_pressed = false;
395 ctrl_pressed = false;
396 graph_pressed = false;
397 // ins_pressed = false;
399 #if defined(_FM77AV_VARIANTS)
402 if(event_key_rtc >= 0) {
403 cancel_event(this, event_key_rtc);
405 register_event(this,ID_KEYBOARD_RTC_COUNTUP, 1000.0 * 1000.0, true, &event_key_rtc);
408 if(event_keyrepeat >= 0) cancel_event(this,event_keyrepeat);
409 event_keyrepeat = -1;
410 for(i = 0; i < 0x70; i++) key_pressed_flag[i] = false;
413 this->write_signals(&break_line, 0x00);
414 #if defined(_FM77AV_VARIANTS)
415 rxrdy_status = false;
416 key_ack_status = true;
417 this->write_signals(&rxrdy, 0x00);
418 this->write_signals(&key_ack, 0xff);
420 this->write_signals(&kana_led, 0x00);
421 this->write_signals(&caps_led, 0x00);
422 this->write_signals(&ins_led, 0x00);
426 void KEYBOARD::reset(void)
428 keymode = KEYMODE_STANDARD;
431 reset_unchange_mode();
432 #if defined(_FM77AV_VARIANTS)
438 #if defined(_FM77AV_VARIANTS)
440 uint8 KEYBOARD::read_data_reg(void)
442 if(!data_fifo->empty()) {
443 datareg = data_fifo->read() & 0xff;
445 if(!data_fifo->empty()) {
447 write_signals(&rxrdy, 0xff);
449 rxrdy_status = false;
450 write_signals(&rxrdy, 0x00);
456 uint8 KEYBOARD::read_stat_reg(void)
462 if(!key_ack_status) {
465 // Digityze : bit0 = '0' when waiting,
469 void KEYBOARD::set_mode(void)
471 int count = cmd_fifo->count();
474 if(count < 2) return;
475 cmd = cmd_fifo->read();
476 mode = cmd_fifo->read();
477 if(mode <= KEYMODE_SCAN) {
479 reset_unchange_mode();
482 data_fifo->clear(); // right?
483 rxrdy_status = false;
484 write_signals(&rxrdy, 0x00);
487 void KEYBOARD::get_mode(void)
491 cmd = cmd_fifo->read();
492 if(data_fifo->full()) {
493 dummy = data_fifo->read();
495 data_fifo->write(keymode);
497 write_signals(&rxrdy, 0xff);
500 void KEYBOARD::set_leds(void)
502 int count = cmd_fifo->count();
505 if(count < 2) return;
506 cmd = cmd_fifo->read();
507 ledvar = cmd_fifo->read();
509 if((ledvar & 0x02) != 0) {
511 kana_pressed = ((ledvar & 0x01) == 0);
512 write_signals(&kana_led, kana_pressed);
515 caps_pressed = ((ledvar & 0x01) == 0);
516 write_signals(&caps_led, caps_pressed);
520 data_fifo->clear(); // right?
521 rxrdy_status = false;
522 write_signals(&rxrdy, 0x00);
525 void KEYBOARD::get_leds(void)
529 ledvar |= caps_pressed ? 0x01 : 0x00;
530 ledvar |= kana_pressed ? 0x02 : 0x00;
531 data_fifo->write(ledvar);
534 write_signals(&rxrdy, 0xff);
537 void KEYBOARD::set_repeat_type(void)
542 cmd = cmd_fifo->read();
543 if(!cmd_fifo->empty()) {
544 modeval = cmd_fifo->read();
545 if((modeval < 2) && (modeval >= 0)) {
546 repeat_mode = (modeval == 0);
555 rxrdy_status = false;
556 write_signals(&rxrdy, 0x00);
559 void KEYBOARD::set_repeat_time(void)
564 cmd = cmd_fifo->read();
565 if(cmd_fifo->empty()) goto _end;
566 time_high = cmd_fifo->read();
567 if(cmd_fifo->empty()) goto _end;
568 time_low = cmd_fifo->read();
569 // if(cmd_fifo->empty()) goto _end;
571 if((time_high == 0) || (time_low == 0)) {
572 repeat_time_long = 700;
573 repeat_time_short = 70;
575 repeat_time_long = time_high * 10;
576 repeat_time_short = time_low * 10;
580 rxrdy_status = false;
581 write_signals(&rxrdy, 0x00);
584 void KEYBOARD::set_rtc(void)
589 if(cmd_fifo->count() < 9) return;
590 cmd = cmd_fifo->read();
591 localcmd = cmd_fifo->read();
593 tmp = cmd_fifo->read();
594 rtc_yy = ((tmp >> 4) * 10) | (tmp & 0x0f);
596 tmp = cmd_fifo->read();
597 rtc_mm = ((tmp >> 4) * 10) | (tmp & 0x0f);
599 tmp = cmd_fifo->read();
600 rtc_dd = (((tmp & 0x30) >> 4) * 10) | (tmp & 0x0f);
602 tmp = cmd_fifo->read();
603 rtc_count24h = ((tmp & 0x08) != 0);
605 rtc_ispm = ((tmp & 0x04) != 0);
607 rtc_dayofweek = (tmp >> 4) % 0x07;
608 rtc_hour = ((tmp & 0x03) * 10);
610 tmp = cmd_fifo->read();
611 rtc_hour = rtc_hour | (tmp >> 4);
613 rtc_ispm = (rtc_hour >= 12);
615 rtc_minute = (tmp & 0x0f) * 10;
617 tmp = cmd_fifo->read();
618 rtc_minute = rtc_minute | (tmp >> 4);
619 rtc_sec = (tmp & 0x0f) * 10;
621 tmp = cmd_fifo->read();
622 rtc_sec = rtc_sec | (tmp >> 4);
626 if(event_key_rtc >= 0) {
627 cancel_event(this, event_key_rtc);
629 register_event(this, ID_KEYBOARD_RTC_COUNTUP, 1000.0 * 1000.0, true, &event_key_rtc);
630 rxrdy_status = false;
631 write_signals(&rxrdy, 0x00);
634 void KEYBOARD::get_rtc(void)
639 tmp = ((rtc_yy / 10) << 4) | (rtc_yy % 10);
640 data_fifo->write(tmp);
642 tmp = ((rtc_mm / 10) << 4) | (rtc_mm % 10);
643 data_fifo->write(tmp);
645 tmp = ((rtc_dd / 10) << 4) | (rtc_dd % 10);
646 tmp = tmp | (0 << 6); // leap
647 data_fifo->write(tmp);
649 tmp = rtc_dayofweek << 4;
650 tmp = tmp | (rtc_hour / 10);
658 data_fifo->write(tmp);
660 tmp = (rtc_hour % 10) << 4;
661 tmp = tmp | (rtc_minute / 10);
662 data_fifo->write(tmp);
664 tmp = (rtc_minute % 10) << 4;
665 tmp = tmp | (rtc_sec / 10);
666 data_fifo->write(tmp);
668 tmp = (rtc_sec % 10) << 4;
669 data_fifo->write(tmp);
673 write_signals(&rxrdy, 0xff);
676 const int rtc_month_days[12] = {
677 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
680 void KEYBOARD::rtc_count(void)
687 if(rtc_minute >= 60) {
691 rtc_ispm = (rtc_hour >= 12);
692 if(rtc_hour < 24) return;
695 if(rtc_hour < 12) return;
697 if(rtc_hour < 12) return;
707 if(rtc_dayofweek >= 7) rtc_dayofweek = 0;
708 if(rtc_dd > rtc_month_days[rtc_mm]){
709 if((rtc_mm ==1) && (rtc_dd == 29)) {
710 if((rtc_yy % 4) == 0) return;
717 if(rtc_yy >= 100) rtc_yy = 0;
723 #endif // FM77AV_VARIANTS
725 uint32 KEYBOARD::read_signal(int id)
727 if(id == SIG_FM7KEY_BREAK_KEY) {
728 return break_pressed ? 0xfffffff : 0x00000000;
734 void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
736 if(id == SIG_FM7KEY_SET_INSLED) {
737 write_signals(&ins_led, data & mask);
739 #if defined(_FM77AV_VARIANTS)
740 else if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
742 * I refered XM7's sourcecode : VM/keyboard.c act of key-encoder.
743 * Thanks to Ryu.Takegami and PI.
746 if(!key_ack_status) return; // If (not(ACK)) noop.
748 if(cmd_fifo->full()) {
751 if(cmd_fifo->empty()) {
752 cmd_phase = data & 0xff;
755 cmd_fifo->write(data & 0xff);
756 count = cmd_fifo->count();
758 rxrdy_status = false;
759 key_ack_status = false;
760 write_signals(&key_ack, 0x00);
761 write_signals(&rxrdy, 0x00);
767 if(keymode == KEYMODE_SCAN) key_down_main();
777 case 2: // Set LED Phase
780 if(keymode == KEYMODE_SCAN) key_down_main();
785 case 3: // Get LED Phase
804 case 0x80: // Communicate to/from RTC.
809 if((data & 0xff) == 0) { // Get
813 } else if((data & 0xff) == 1) { // Set
828 case 0x81: // Digitize.
830 do_digitize(); // WILL Implement?
837 set_screen_mode(); // WILL Implement?
843 get_screen_mode(); // WILL Implement?
849 set_brightness(); // WILL Implement?
859 register_event(this, ID_KEYBOARD_ACK, 5, false, NULL); // Delay 5us until ACK is up.
860 } else if(id == SIG_FM7KEY_RXRDY) {
861 rxrdy_status = ((data & mask) != 0);
862 //write_signals(&rxrdy, (rxrdy_status) ? 0xffffffff : 0x00000000);
863 } else if(id == SIG_FM7KEY_ACK) {
864 key_ack_status = ((data & mask) != 0);
865 //write_signals(&key_ack, (key_ack_status) ? 0xffffffff : 0x00000000);
871 uint32 KEYBOARD::read_data8(uint32 addr)
873 uint32 retval = 0xff;
876 retval = get_keycode_high();
879 retval = get_keycode_low();
881 #if defined(_FM77AV_VARIANTS)
883 retval = read_data_reg();
886 retval = read_stat_reg();
895 void KEYBOARD::write_data8(uint32 addr, uint32 data)
898 #if defined(_FM77AV_VARIANTS)
900 this->write_signal(SIG_FM7KEY_PUSH_TO_ENCODER, data, 0x000000ff);
906 KEYBOARD::KEYBOARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_emu)
914 ctrl_pressed = false;
915 lshift_pressed = false;
916 rshift_pressed = false;
917 shift_pressed = false;
918 graph_pressed = false;
919 caps_pressed = false;
920 kana_pressed = false;
921 break_pressed = false;
922 event_keyrepeat = -1;
924 for(i = 0; i < 0x70; i++) {
925 key_pressed_flag[i] = false;
928 keymode = KEYMODE_STANDARD;
929 #if defined(_FM77AV_VARIANTS)
930 cmd_fifo = new FIFO(16);
931 data_fifo = new FIFO(16);
933 key_ack_status = false;
934 init_output_signals(&rxrdy);
935 init_output_signals(&key_ack);
937 rtc_count24h = false;
941 rtc_set_flag = false;
951 init_output_signals(&break_line);
952 init_output_signals(&int_line);
954 init_output_signals(&kana_led);
955 init_output_signals(&caps_led);
956 init_output_signals(&ins_led);
959 void KEYBOARD::release(void)
961 #if defined(_FM77AV_VARIANTS)
963 data_fifo->release();
969 KEYBOARD::~KEYBOARD()
973 #define STATE_VERSION 1
974 void KEYBOARD::save_state(FILEIO *state_fio)
978 state_fio->FputUint32_BE(STATE_VERSION);
979 state_fio->FputInt32_BE(this_device_id);
984 state_fio->FputUint32_BE(keycode_7);
985 state_fio->FputInt32_BE(keymode);
987 state_fio->FputBool(ctrl_pressed);
988 state_fio->FputBool(lshift_pressed);
989 state_fio->FputBool(rshift_pressed);
990 state_fio->FputBool(shift_pressed);
991 state_fio->FputBool(graph_pressed);
992 state_fio->FputBool(caps_pressed);
993 state_fio->FputBool(kana_pressed);
994 state_fio->FputBool(break_pressed);
996 state_fio->FputInt32_BE(event_keyrepeat);
997 for(id = 0; id < 0x70; id++) state_fio->FputBool(key_pressed_flag[id]);
999 state_fio->FputUint32(scancode);
1000 state_fio->FputUint8(datareg);
1001 state_fio->FputUint32(older_vk);
1003 state_fio->FputBool(repeat_mode);
1004 state_fio->FputInt32_BE(repeat_time_short);
1005 state_fio->FputInt32_BE(repeat_time_long);
1007 #if defined(_FM77AV_VARIANTS)
1008 state_fio->FputInt32_BE(event_key_rtc);
1010 state_fio->FputUint8(rtc_yy);
1011 state_fio->FputUint8(rtc_mm);
1012 state_fio->FputUint8(rtc_dd);
1013 state_fio->FputUint8(rtc_dayofweek);
1014 state_fio->FputUint8(rtc_hour);
1015 state_fio->FputUint8(rtc_minute);
1016 state_fio->FputUint8(rtc_sec);
1018 state_fio->FputBool(rtc_count24h);
1019 state_fio->FputBool(rtc_ispm);
1021 state_fio->FputBool(rtc_set);
1022 state_fio->FputBool(rtc_set_flag);
1023 state_fio->FputBool(rxrdy_status);
1024 state_fio->FputBool(key_ack_status);
1025 state_fio->FputInt32_BE(cmd_phase);
1027 cmd_fifo->save_state((void *)state_fio);
1028 data_fifo->save_state((void *)state_fio);
1029 cur_time.save_state((void *)state_fio);
1034 bool KEYBOARD::load_state(FILEIO *state_fio)
1041 version = state_fio->FgetUint32_BE();
1042 if(this_device_id != state_fio->FgetInt32_BE()) return false;
1046 keycode_7 = state_fio->FgetUint32_BE();
1047 keymode = state_fio->FgetInt32_BE();
1049 ctrl_pressed = state_fio->FgetBool();
1050 lshift_pressed = state_fio->FgetBool();
1051 rshift_pressed = state_fio->FgetBool();
1052 shift_pressed = state_fio->FgetBool();
1053 graph_pressed = state_fio->FgetBool();
1054 caps_pressed = state_fio->FgetBool();
1055 kana_pressed = state_fio->FgetBool();
1056 break_pressed = state_fio->FgetBool();
1058 event_keyrepeat = state_fio->FgetInt32_BE();
1059 for(id = 0; id < 0x70; id++) key_pressed_flag[id] = state_fio->FgetBool();
1061 scancode = state_fio->FgetUint32();
1062 datareg = state_fio->FgetUint8();
1063 older_vk = state_fio->FgetUint32();
1065 repeat_mode = state_fio->FgetBool();
1066 repeat_time_short = state_fio->FgetInt32_BE();
1067 repeat_time_long = state_fio->FgetInt32_BE();
1069 #if defined(_FM77AV_VARIANTS)
1070 event_key_rtc = state_fio->FgetInt32_BE();
1071 rtc_yy = state_fio->FgetUint8();
1072 rtc_mm = state_fio->FgetUint8();
1073 rtc_dd = state_fio->FgetUint8();
1074 rtc_dayofweek = state_fio->FgetUint8();
1075 rtc_hour = state_fio->FgetUint8();
1076 rtc_minute = state_fio->FgetUint8();
1077 rtc_sec = state_fio->FgetUint8();
1079 rtc_count24h = state_fio->FgetBool();
1080 rtc_ispm = state_fio->FgetBool();
1082 rtc_set = state_fio->FgetBool();
1083 rtc_set_flag = state_fio->FgetBool();
1084 rxrdy_status = state_fio->FgetBool();
1085 key_ack_status = state_fio->FgetBool();
1086 cmd_phase = state_fio->FgetInt32_BE();
1088 cmd_fifo->load_state((void *)state_fio);
1089 data_fifo->load_state((void *)state_fio);
1090 cur_time.load_state((void *)state_fio);
1092 if(version == 1) return true;