• R/O
  • HTTP
  • SSH
  • HTTPS

common_source_project-fm7: Commit

Common Source Code Project for Qt (a.k.a for FM-7).


Commit MetaInfo

Revision7564470207b80986a38f9c379262d2b0a4b92bde (tree)
Zeit2022-12-12 13:52:25
AutorK.Ohta <whatisthis.sowhat@gmai...>
CommiterK.Ohta

Log Message

[VM][SMC777][OOPs] Merge forgotten codes via SMC777.Truely be upstream 2022-04-09.

Ändern Zusammenfassung

Diff

--- a/source/src/vm/smc777/memory.cpp
+++ b/source/src/vm/smc777/memory.cpp
@@ -40,77 +40,6 @@ namespace SMC777 {
4040 } \
4141 }
4242
43-static const uint8_t keytable_base[68][6] = {
44- {0x70, 0x01, 0x15, 0x1a, 0x01, 0x15}, // F1
45- {0x71, 0x02, 0x18, 0x10, 0x02, 0x18}, // F2
46- {0x72, 0x04, 0x12, 0x13, 0x04, 0x12}, // F3
47- {0x73, 0x06, 0x05, 0x07, 0x06, 0x05}, // F4
48- {0x74, 0x0b, 0x03, 0x0c, 0x0b, 0x03}, // F5
49- {0x23, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e}, // CLR -> END
50- {0x2e, 0x11, 0x11, 0x11, 0x11, 0x11}, // DEL
51- {0x2d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f}, // INS
52- {0x24, 0x14, 0x14, 0x14, 0x14, 0x14}, // HOME
53- {0x25, 0x16, 0x16, 0x16, 0x16, 0x16}, // LEFT
54- {0x26, 0x17, 0x17, 0x17, 0x17, 0x17}, // UP
55- {0x28, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c}, // DOWN
56- {0x27, 0x19, 0x19, 0x19, 0x19, 0x19}, // RIGHT
57- {0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b}, // ESC
58- {0x31, 0x31, 0x21, 0x00, 0xb1, 0xa7}, // '1'
59- {0x32, 0x32, 0x40, 0x00, 0xb2, 0xa8}, // '2'
60- {0x33, 0x33, 0x23, 0x00, 0xb3, 0xa9}, // '3'
61- {0x34, 0x34, 0x24, 0x00, 0xb4, 0xaa}, // '4'
62- {0x35, 0x35, 0x25, 0x00, 0xb5, 0xab}, // '5'
63- {0x36, 0x36, 0x5e, 0x00, 0xc5, 0xc5}, // '6'
64- {0x37, 0x37, 0x26, 0x00, 0xc6, 0xc6}, // '7'
65- {0x38, 0x38, 0x2a, 0x00, 0xc7, 0xc7}, // '8'
66- {0x39, 0x39, 0x28, 0x00, 0xc8, 0xc8}, // '9'
67- {0x30, 0x30, 0x29, 0x00, 0xc9, 0xc9}, // '0'
68- {0xbd, 0x2d, 0x5f, 0x00, 0xd7, 0xd7}, // '-'
69- {0xde, 0x3d, 0x2b, 0x00, 0xd8, 0xd8}, // '='
70- {0xdc, 0x7f, 0x7f, 0x7f, 0xd9, 0xd9}, // RUB OUT -> '\'
71- {0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // BS
72- {0x51, 0x71, 0x51, 0x11, 0xb6, 0xb6}, // 'Q'
73- {0x57, 0x77, 0x57, 0x17, 0xb7, 0xb7}, // 'W'
74- {0x45, 0x65, 0x45, 0x05, 0xb8, 0xb8}, // 'E'
75- {0x52, 0x72, 0x52, 0x12, 0xb9, 0xb9}, // 'R'
76- {0x54, 0x74, 0x54, 0x14, 0xba, 0xba}, // 'T'
77- {0x59, 0x79, 0x59, 0x19, 0xca, 0xca}, // 'Y'
78- {0x55, 0x75, 0x55, 0x15, 0xcb, 0xcb}, // 'U'
79- {0x49, 0x69, 0x49, 0x09, 0xcc, 0xcc}, // 'I'
80- {0x4f, 0x6f, 0x4f, 0x0f, 0xcd, 0xcd}, // 'O'
81- {0x50, 0x70, 0x50, 0x10, 0xce, 0xce}, // 'P'
82- {0xc0, 0x5b, 0x7b, 0x1b, 0xda, 0xda}, // '['
83- {0xdb, 0x5d, 0x7d, 0x1d, 0xdb, 0xb0}, // ']'
84- {0x7b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a}, // LF -> F12
85- {0x41, 0x61, 0x41, 0x01, 0xbb, 0xbb}, // 'A'
86- {0x53, 0x73, 0x53, 0x13, 0xbc, 0xbc}, // 'S'
87- {0x44, 0x64, 0x44, 0x04, 0xbd, 0xbd}, // 'D'
88- {0x46, 0x66, 0x46, 0x06, 0xbe, 0xbe}, // 'F'
89- {0x47, 0x67, 0x47, 0x07, 0xbf, 0xbf}, // 'G'
90- {0x48, 0x68, 0x48, 0x08, 0xcf, 0xcf}, // 'H'
91- {0x4a, 0x6a, 0x4a, 0x0a, 0xd0, 0xd0}, // 'J'
92- {0x4b, 0x6b, 0x4b, 0x0b, 0xd1, 0xd1}, // 'K'
93- {0x4c, 0x6c, 0x4c, 0x0c, 0xd2, 0xd2}, // 'L'
94- {0xbb, 0x3b, 0x3a, 0x00, 0xd3, 0xd3}, // ';'
95- {0xba, 0x27, 0x22, 0x00, 0xde, 0xa2}, // ','
96- {0xdd, 0x60, 0x7e, 0x00, 0xdf, 0xa3}, // '`'
97- {0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d}, // RETURN
98- {0x5a, 0x7a, 0x5a, 0x1a, 0xc0, 0xc0}, // 'Z'
99- {0x58, 0x78, 0x58, 0x18, 0xc1, 0xc1}, // 'X'
100- {0x43, 0x63, 0x43, 0x03, 0xc2, 0xaf}, // 'C'
101- {0x56, 0x76, 0x56, 0x16, 0xc3, 0xc3}, // 'V'
102- {0x42, 0x62, 0x42, 0x02, 0xc4, 0xc4}, // 'B'
103- {0x4e, 0x6e, 0x4e, 0x0e, 0xd4, 0xac}, // 'N'
104- {0x4d, 0x6d, 0x4d, 0x0d, 0xd5, 0xad}, // 'M'
105- {0xbc, 0x2c, 0x3c, 0x00, 0xd6, 0xae}, // ','
106- {0xbe, 0x2e, 0x3e, 0x1e, 0xdc, 0xa4}, // '.'
107- {0xbf, 0x2f, 0x3f, 0x1f, 0xa6, 0xa1}, // '/'
108- {0xe2, 0x5c, 0x7c, 0x1c, 0xdd, 0xa5}, // '\'
109- {0x09, 0x09, 0x09, 0x09, 0x09, 0x09}, // TAB
110- {0x20, 0x20, 0x20, 0x20, 0x20, 0x20}, // SPACE
111- {0x7a, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d} // H -> F11
112-};
113-
11443 void MEMORY::initialize()
11544 {
11645 // initialize memory
@@ -158,7 +87,7 @@ void MEMORY::initialize()
15887 initialize_key();
15988 caps = kana = false;
16089 key_stat = emu->get_key_buffer();
161-// joy_stat = emu->get_joy_buffer();
90+ joy_stat = emu->get_joy_buffer(); // ToDo: Fix to dynamic buffer. 20221212 K.O
16291
16392 // initialize display
16493 static const uint8_t color_table[16][3] = {
@@ -196,6 +125,7 @@ void MEMORY::reset()
196125
197126 key_code = key_status = key_cmd = 0;
198127 key_repeat_event = -1;
128+ funckey_code = funckey_index = -1;
199129
200130 gcw = 0x80;
201131 vsync = disp = blink = false;
@@ -209,20 +139,8 @@ void MEMORY::reset()
209139
210140 void MEMORY::initialize_key()
211141 {
212- memset(keytable, 0, sizeof(keytable));
213- memset(keytable_shift, 0, sizeof(keytable_shift));
214- memset(keytable_ctrl, 0, sizeof(keytable_ctrl));
215- memset(keytable_kana, 0, sizeof(keytable_kana));
216- memset(keytable_kana_shift, 0, sizeof(keytable_kana_shift));
142+ memcpy(key_table, key_table_base, sizeof(key_table));
217143
218- for(int i = 0; i < 68; i++) {
219- uint8_t code = keytable_base[i][0];
220- keytable[code] = keytable_base[i][1];
221- keytable_shift[code] = keytable_base[i][2];
222- keytable_ctrl[code] = keytable_base[i][3];
223- keytable_kana[code] = keytable_base[i][4];
224- keytable_kana_shift[code] = keytable_base[i][5];
225- }
226144 key_repeat_start = 1000;
227145 key_repeat_interval = 100;
228146 }
@@ -292,13 +210,21 @@ void MEMORY::write_io8(uint32_t addr, uint32_t data)
292210 int index = funckey_index++;
293211 if(index == 0) {
294212 // key code
295- keytable[funckey_code] = keytable_kana[funckey_code] = data;
213+ if(funckey_code != -1) {
214+ key_table[funckey_code].code =
215+ key_table[funckey_code].code_kana = data;
216+ }
296217 } else if(index == 1) {
297218 // key code with shift key
298- keytable_shift[funckey_code] = keytable_kana_shift[funckey_code] = data;
219+ if(funckey_code != -1) {
220+ key_table[funckey_code].code_shift =
221+ key_table[funckey_code].code_kana_shift = data;
222+ }
299223 } else if(index == 2) {
300224 // key code with ctrl key
301- keytable_ctrl[funckey_code] = data;
225+ if(funckey_code != -1) {
226+ key_table[funckey_code].code_ctrl = data;
227+ }
302228 } else {
303229 key_cmd = -1;
304230 }
@@ -311,6 +237,7 @@ void MEMORY::write_io8(uint32_t addr, uint32_t data)
311237 // bit0: IEF 1 = enable keyboard irq
312238 if(data & 0x80) {
313239 // clear keyboard irq
240+ key_status &= ~1;
314241 }
315242 if(data & 0x10) {
316243 // go to setting mode
@@ -340,13 +267,13 @@ void MEMORY::write_io8(uint32_t addr, uint32_t data)
340267 // bit5: ~R/W
341268 // bit0-3: key address flag
342269 switch(data & 0x0f) {
343- case 1: funckey_code = 0x70; break; // F1
344- case 2: funckey_code = 0x71; break; // F2
345- case 3: funckey_code = 0x72; break; // F3
346- case 4: funckey_code = 0x73; break; // F4
347- case 5: funckey_code = 0x74; break; // F5
348- case 6: funckey_code = 0x7a; break; // H -> F11
349- default: funckey_code = 0x00; break;
270+ case 1: funckey_code = 0; break; // F1
271+ case 2: funckey_code = 1; break; // F2
272+ case 3: funckey_code = 2; break; // F3
273+ case 4: funckey_code = 3; break; // F4
274+ case 5: funckey_code = 4; break; // F5
275+ case 6: funckey_code = 5; break; // H -> F11
276+ default: funckey_code = -1; break;
350277 }
351278 funckey_index = 0;
352279 break;
@@ -510,16 +437,23 @@ uint32_t MEMORY::read_io8_debug(uint32_t addr)
510437 int index = funckey_index++;
511438 if(index == 0) {
512439 // key code
513- return keytable[funckey_code];
440+ if(funckey_code != -1) {
441+ return key_table[funckey_code].code;
442+ }
514443 } else if(index == 1) {
515444 // key code with shift key
516- return keytable_shift[funckey_code];
445+ if(funckey_code != -1) {
446+ return key_table[funckey_code].code_shift;
447+ }
517448 } else if(index == 2) {
518- // key code with ctrl key
519- return keytable_ctrl[funckey_code];
449+ // key code with ctrl key
450+ if(funckey_code != -1) {
451+ return key_table[funckey_code].code_ctrl;
452+ }
520453 } else {
521454 key_cmd = -1;
522455 }
456+ return 0;
523457 }
524458 break;
525459 case 0x1b: // 8041 key encoder status
@@ -593,24 +527,13 @@ uint32_t MEMORY::read_io8_debug(uint32_t addr)
593527 // addr bit8: 0 = joystick #2, 1 = joystick #1
594528 // bit7: ~BL 0 = h/v blanking, 1 = not blanking
595529 // bit6: ~CS 0 = joystick #2 is enabled
596- // bit4: ~T 0 = joystick trigger on
530+ // bit5: ~USER 0 = joystick trigger2 on (only joystick #2)
531+ // bit4: ~T 0 = joystick trigger1 on
597532 // bit3: ~R 0 = joystick right on
598533 // bit2: ~L 0 = joystick left on
599534 // bit1: ~B 0 = joystick back on
600535 // bit0: ~F 0 = joystick forward on
601- {
602- joy_stat = emu->get_joy_buffer();
603- uint32_t stat = joy_stat[(addr & 0x100) ? 0 : 1];
604- emu->release_joy_buffer(joy_stat);
605- if(addr & 0x100) {
606- if(key_stat[0x26]) stat |= 0x01; // up
607- if(key_stat[0x28]) stat |= 0x02; // down
608- if(key_stat[0x25]) stat |= 0x04; // left
609- if(key_stat[0x27]) stat |= 0x08; // right
610- if(key_stat[0x20]) stat |= 0x10; // space
611- }
612- return (~stat & 0x1f) | (disp ? 0x80 : 0);
613- }
536+ return ((~joy_stat[(addr & 0x100) ? 0 : 1]) & ((addr & 0x100) ? 0x1f : 0x3f)) | (disp ? 0x80 : 0);
614537 #endif
615538 case 0x7e: // KANJI ROM data
616539 // addr bit8-12: l/r and raster
@@ -658,80 +581,69 @@ void MEMORY::write_signal(int id, uint32_t data, uint32_t mask)
658581 }
659582 }
660583
661-void MEMORY::key_down_up(int code, bool down)
584+void MEMORY::key_down(int code)
662585 {
663- if(code == 0x14 && down) {
586+ if(code == 0x14) {
664587 caps = !caps;
665- return;
666- } else if(code == 0x15 && down) {
588+ } else if(code == 0x15) {
667589 kana = !kana;
668- return;
669590 }
591+}
592+
593+void MEMORY::update_key()
594+{
670595 bool shift = (key_stat[0x10] != 0);
671596 bool ctrl = (key_stat[0x11] != 0);
672597 bool kana_tmp = kana;
598+ uint8_t code = 0;
673599
674- if(code >= 0x60 && code <= 0x69) { // numpad 0-9
675- code = code - 0x60 + 0x30;
676- shift = ctrl = kana_tmp = false;
677- } else if(code == 0x6a) { // numpad *
678- code = 0x38;
679- shift = true; ctrl = kana_tmp = false;
680- } else if(code == 0x6b) { // numpad +
681- code = 0xde;
682- shift = true; ctrl = kana_tmp = false;
683- } else if(code == 0x6c) { // numpad ,
684- code = 0xbc;
685- shift = ctrl = kana_tmp = false;
686- } else if(code == 0x6d) { // numpad -
687- code = 0xbd;
688- shift = ctrl = kana_tmp = false;
689- } else if(code == 0x6e) { // numpad .
690- code = 0xbe;
691- shift = ctrl = kana_tmp = false;
692- } else if(code == 0x6f) { // numpad /
693- code = 0xbf;
694- shift = ctrl = kana_tmp = false;
695- } else if(code >= 0x75 && code <= 0x79) { // F6-F10 -> Shift + F1-F5
696- code = code - 0x75 + 0x70;
697- shift = true;
698- }
699- if(ctrl) {
700- code = keytable_ctrl[code];
701- } else if(kana_tmp && shift) {
702- code = keytable_kana_shift[code];
703- } else if(kana_tmp) {
704- code = keytable_kana[code];
705- } else if(shift) {
706- code = keytable_shift[code];
707- } else {
708- code = keytable[code];
600+ for(int i = 0; i < array_length(key_table); i++) {
601+ if(key_stat[key_table[i].vk]) {
602+ if(key_table[i].flag == 0) {
603+ shift = ctrl = kana_tmp = false;
604+ } else if(key_table[i].flag == 1) {
605+ shift = true;
606+ ctrl = kana_tmp = false;
607+ }
608+ if(ctrl) {
609+ code = key_table[i].code_ctrl;
610+ } else if(kana_tmp && shift) {
611+ code = key_table[i].code_kana_shift;
612+ } else if(kana_tmp) {
613+ code = key_table[i].code_kana;
614+ } else if(shift) {
615+ code = key_table[i].code_shift;
616+ } else {
617+ code = key_table[i].code;
618+ }
619+ if(caps && ((code >= 'a' && code <= 'z') || (code >= 'A' && code <= 'Z'))) {
620+ code ^= 0x20;
621+ }
622+ break;
623+ }
709624 }
710625 if(code != 0) {
711- if(caps && ((code >= 'a' && code <= 'z') || (code >= 'A' && code <= 'Z'))) {
712- code ^= 0x20;
713- }
714- if(down && key_code != code) {
626+ if(!(key_status & 4) || key_code != code) {
715627 if(ief_key) {
716628 d_cpu->write_signal(SIG_CPU_IRQ, IRQ_BIT_KEYIN, IRQ_BIT_KEYIN);
717629 }
718630 if(key_repeat_event != -1) {
719631 cancel_event(this, key_repeat_event);
720632 }
721- key_code = code;
722- key_status = ctrl ? 0x85 : shift ? 0x45 : 5;
723633 register_event(this, EVENT_KEY_REPEAT, key_repeat_start * 1000, false, &key_repeat_event);
724- } else if(!down && key_code == code) {
725- if(key_repeat_event != -1) {
726- cancel_event(this, key_repeat_event);
727- key_repeat_event = -1;
728- }
729- key_code = 0;
730- key_status &= ~4;
634+ key_code = code;
635+ key_status = (ctrl ? 0x80 : shift ? 0x40 : 0) | 5;
636+ }
637+ } else {
638+ if(key_repeat_event != -1) {
639+ cancel_event(this, key_repeat_event);
640+ key_repeat_event = -1;
731641 }
732642 }
733643 }
734644
645+
646+
735647 void MEMORY::event_callback(int event_id, int err)
736648 {
737649 if(event_id == EVENT_KEY_REPEAT) {
@@ -748,6 +660,7 @@ void MEMORY::event_callback(int event_id, int err)
748660 void MEMORY::event_frame()
749661 {
750662 cblink = (cblink + 1) & 0x1f;
663+ update_key();
751664 }
752665
753666 void MEMORY::event_vline(int v, int clock)
@@ -1009,13 +922,13 @@ void MEMORY::draw_graph_640x400(int v)
1009922 int y = v / ht;
1010923 int l = v % ht;
1011924
1012- src += 160 * y;
925+ src += 80 * y;
1013926
1014927 // for(int y = 0; y < vt && y < 25; y++) {
1015928 for(int x = 0; x < hz && x < 80; x++) {
1016929 // for(int l = 0; l < ht; l++) {
1017- uint8_t pat0 = gram[(src + 0x1000 * l ) & 0x7fff];
1018- uint8_t pat1 = gram[(src + 0x1000 * l + 1) & 0x7fff];
930+ uint8_t pat0 = gram[((src * 2 + 0) & 0xfff) + 0x1000 * (l & 7)];
931+ uint8_t pat1 = gram[((src * 2 + 1) & 0xfff) + 0x1000 * (l & 7)];
1019932 int yy = y * ht + l;
1020933 if(yy >= 200) {
1021934 break;
@@ -1040,7 +953,7 @@ void MEMORY::draw_graph_640x400(int v)
1040953 d1[6] = (pat1 >> 1) & 1;
1041954 d1[7] = (pat1 ) & 1;
1042955 // }
1043- src += 2;
956+ src++;
1044957 }
1045958 // }
1046959 }
@@ -1058,13 +971,13 @@ void MEMORY::draw_graph_640x200(int v)
1058971 int y = v / ht;
1059972 int l = v % ht;
1060973
1061- src += 160 * y;
974+ src += 80 * y;
1062975
1063976 // for(int y = 0; y < vt && y < 25; y++) {
1064977 for(int x = 0; x < hz && x < 80; x++) {
1065978 // for(int l = 0; l < ht; l++) {
1066- uint8_t pat0 = gram[(src + 0x1000 * l ) & 0x7fff];
1067- uint8_t pat1 = gram[(src + 0x1000 * l + 1) & 0x7fff];
979+ uint8_t pat0 = gram[((src * 2 + 0) & 0xfff) + 0x1000 * (l & 7)];
980+ uint8_t pat1 = gram[((src * 2 + 1) & 0xfff) + 0x1000 * (l & 7)];
1068981 int yy = y * ht + l;
1069982 if(yy >= 200) {
1070983 break;
@@ -1079,7 +992,7 @@ void MEMORY::draw_graph_640x200(int v)
1079992 d[6] = color_ptr[(pat1 >> 2) & 3];
1080993 d[7] = color_ptr[(pat1 ) & 3];
1081994 // }
1082- src += 2;
995+ src++;
1083996 }
1084997 // }
1085998 }
@@ -1094,13 +1007,13 @@ void MEMORY::draw_graph_320x200(int v)
10941007 int y = v / ht;
10951008 int l = v % ht;
10961009
1097- src += 160 * y;
1010+ src += 80 * y;
10981011
10991012 // for(int y = 0; y < vt && y < 25; y++) {
11001013 for(int x = 0; x < hz && x < 80; x++) {
11011014 // for(int l = 0; l < ht; l++) {
1102- uint8_t pat0 = gram[(src + 0x1000 * l ) & 0x7fff];
1103- uint8_t pat1 = gram[(src + 0x1000 * l + 1) & 0x7fff];
1015+ uint8_t pat0 = gram[((src * 2 + 0) & 0xfff) + 0x1000 * (l & 7)];
1016+ uint8_t pat1 = gram[((src * 2 + 1) & 0xfff) + 0x1000 * (l & 7)];
11041017 int yy = y * ht + l;
11051018 if(yy >= 200) {
11061019 break;
@@ -1111,7 +1024,7 @@ void MEMORY::draw_graph_320x200(int v)
11111024 d[4] = d[5] = pat1 >> 4;
11121025 d[6] = d[7] = pat1 & 15;
11131026 // }
1114- src += 2;
1027+ src++;
11151028 }
11161029 // }
11171030 }
@@ -1126,17 +1039,15 @@ void MEMORY::draw_graph_160x100(int v)
11261039 int ht = 8;// (crtc_regs[9] & 0x1f) + 1;
11271040 uint16_t src = (crtc_regs[12] << 8) | crtc_regs[13];
11281041
1129- src += 0x1000 * ((gcw >> 1) & 1) + (gcw & 1);
1130-
11311042 int y = v / ht;
1132- int l = v % ht;
1043+ int l = v % ht + ((gcw >> 1) & 1);
11331044
1134- src += 160 * y;
1045+ src += 80 * y;
11351046
11361047 // for(int y = 0; y < vt && y < 25; y++) {
11371048 for(int x = 0; x < hz && x < 80; x++) {
11381049 // for(int l = 0; l < ht; l += 2) {
1139- uint8_t pat = gram[(src + 0x1000 * l) & 0x7fff];
1050+ uint8_t pat = gram[((src * 2 + (gcw & 1)) & 0xfff) + 0x1000 * (l & 7)];
11401051 int yy = y * ht + l;
11411052 if(yy >= 200) {
11421053 break;
@@ -1148,12 +1059,12 @@ void MEMORY::draw_graph_160x100(int v)
11481059 d0[4] = d0[5] = d0[6] = d0[7] =
11491060 d1[4] = d1[5] = d1[6] = d1[7] = pat & 15;
11501061 // }
1151- src += 2;
1062+ src++;
11521063 }
11531064 // }
11541065 }
11551066
1156-#define STATE_VERSION 4
1067+#define STATE_VERSION 5
11571068
11581069 bool MEMORY::process_state(FILEIO* state_fio, bool loading)
11591070 {
@@ -1171,11 +1082,8 @@ bool MEMORY::process_state(FILEIO* state_fio, bool loading)
11711082 state_fio->StateValue(rom_selected);
11721083 state_fio->StateValue(rom_switch_wait);
11731084 state_fio->StateValue(ram_switch_wait);
1174- state_fio->StateArray(keytable, sizeof(keytable), 1);
1175- state_fio->StateArray(keytable_shift, sizeof(keytable_shift), 1);
1176- state_fio->StateArray(keytable_ctrl, sizeof(keytable_ctrl), 1);
1177- state_fio->StateArray(keytable_kana, sizeof(keytable_kana), 1);
1178- state_fio->StateArray(keytable_kana_shift, sizeof(keytable_kana_shift), 1);
1085+ state_fio->StateBuffer(key_table, sizeof(key_table), 1);
1086+
11791087 state_fio->StateValue(key_code);
11801088 state_fio->StateValue(key_status);
11811089 state_fio->StateValue(key_cmd);
--- a/source/src/vm/smc777/memory.h
+++ b/source/src/vm/smc777/memory.h
@@ -27,6 +27,103 @@
2727
2828 namespace SMC777 {
2929
30+typedef struct key_table_s {
31+ int vk;
32+ uint8_t code;
33+ uint8_t code_shift;
34+ uint8_t code_ctrl;
35+ uint8_t code_kana;
36+ uint8_t code_kana_shift;
37+ int flag;
38+} key_table_t;
39+
40+static const key_table_t key_table_base[] = {
41+ {0x70, 0x01, 0x15, 0x1a, 0x01, 0x15, -1}, // F1
42+ {0x71, 0x02, 0x18, 0x10, 0x02, 0x18, -1}, // F2
43+ {0x72, 0x04, 0x12, 0x13, 0x04, 0x12, -1}, // F3
44+ {0x73, 0x06, 0x05, 0x07, 0x06, 0x05, -1}, // F4
45+ {0x74, 0x0b, 0x03, 0x0c, 0x0b, 0x03, -1}, // F5
46+ {0x7a, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, -1}, // F11 -> H
47+ {0x23, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, -1}, // END -> CLR
48+ {0x2e, 0x11, 0x11, 0x11, 0x11, 0x11, -1}, // DEL
49+ {0x2d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, -1}, // INS
50+ {0x24, 0x14, 0x14, 0x14, 0x14, 0x14, -1}, // HOME
51+ {0x25, 0x16, 0x16, 0x16, 0x16, 0x16, -1}, // LEFT
52+ {0x26, 0x17, 0x17, 0x17, 0x17, 0x17, -1}, // UP
53+ {0x28, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -1}, // DOWN
54+ {0x27, 0x19, 0x19, 0x19, 0x19, 0x19, -1}, // RIGHT
55+ {0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, -1}, // ESC
56+ {0x31, 0x31, 0x21, 0x00, 0xb1, 0xa7, -1}, // '1'
57+ {0x32, 0x32, 0x40, 0x00, 0xb2, 0xa8, -1}, // '2'
58+ {0x33, 0x33, 0x23, 0x00, 0xb3, 0xa9, -1}, // '3'
59+ {0x34, 0x34, 0x24, 0x00, 0xb4, 0xaa, -1}, // '4'
60+ {0x35, 0x35, 0x25, 0x00, 0xb5, 0xab, -1}, // '5'
61+ {0x36, 0x36, 0x5e, 0x00, 0xc5, 0xc5, -1}, // '6'
62+ {0x37, 0x37, 0x26, 0x00, 0xc6, 0xc6, -1}, // '7'
63+ {0x38, 0x38, 0x2a, 0x00, 0xc7, 0xc7, -1}, // '8'
64+ {0x39, 0x39, 0x28, 0x00, 0xc8, 0xc8, -1}, // '9'
65+ {0x30, 0x30, 0x29, 0x00, 0xc9, 0xc9, -1}, // '0'
66+ {0x61, 0x31, 0x21, 0x00, 0xb1, 0xa7, 0}, // NUMPAD '1'
67+ {0x62, 0x32, 0x40, 0x00, 0xb2, 0xa8, 0}, // NUMPAD '2'
68+ {0x63, 0x33, 0x23, 0x00, 0xb3, 0xa9, 0}, // NUMPAD '3'
69+ {0x64, 0x34, 0x24, 0x00, 0xb4, 0xaa, 0}, // NUMPAD '4'
70+ {0x65, 0x35, 0x25, 0x00, 0xb5, 0xab, 0}, // NUMPAD '5'
71+ {0x66, 0x36, 0x5e, 0x00, 0xc5, 0xc5, 0}, // NUMPAD '6'
72+ {0x67, 0x37, 0x26, 0x00, 0xc6, 0xc6, 0}, // NUMPAD '7'
73+ {0x68, 0x38, 0x2a, 0x00, 0xc7, 0xc7, 0}, // NUMPAD '8'
74+ {0x69, 0x39, 0x28, 0x00, 0xc8, 0xc8, 0}, // NUMPAD '9'
75+ {0x60, 0x30, 0x29, 0x00, 0xc9, 0xc9, 0}, // NUMPAD '0'
76+ {0x6a, 0x38, 0x2a, 0x00, 0xc7, 0xc7, 1}, // NUMPAD '*' -> SHIFT + '8'
77+ {0x6b, 0x3d, 0x2b, 0x00, 0xd8, 0xd8, 1}, // NUMPAD '+' -> SHIFT + '^'
78+ {0x6c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, -1}, // NUMPAD ENTER
79+ {0x6d, 0x2d, 0x5f, 0x00, 0xd7, 0xd7, 0}, // NUMPAD '-'
80+ {0x6e, 0x2e, 0x3e, 0x1e, 0xdc, 0xa4, 0}, // NUMPAD '.'
81+ {0x6f, 0x2f, 0x3f, 0x1f, 0xa6, 0xa1, 0}, // NUMPAD '/'
82+ {0xbd, 0x2d, 0x5f, 0x00, 0xd7, 0xd7, -1}, // '-'
83+ {0xde, 0x3d, 0x2b, 0x00, 0xd8, 0xd8, -1}, // '^' -> '='
84+ {0xdc, 0x7f, 0x7f, 0x7f, 0xd9, 0xd9, -1}, // '\' -> RUB OUT
85+ {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -1}, // BS
86+ {0x51, 0x71, 0x51, 0x11, 0xb6, 0xb6, -1}, // 'Q'
87+ {0x57, 0x77, 0x57, 0x17, 0xb7, 0xb7, -1}, // 'W'
88+ {0x45, 0x65, 0x45, 0x05, 0xb8, 0xb8, -1}, // 'E'
89+ {0x52, 0x72, 0x52, 0x12, 0xb9, 0xb9, -1}, // 'R'
90+ {0x54, 0x74, 0x54, 0x14, 0xba, 0xba, -1}, // 'T'
91+ {0x59, 0x79, 0x59, 0x19, 0xca, 0xca, -1}, // 'Y'
92+ {0x55, 0x75, 0x55, 0x15, 0xcb, 0xcb, -1}, // 'U'
93+ {0x49, 0x69, 0x49, 0x09, 0xcc, 0xcc, -1}, // 'I'
94+ {0x4f, 0x6f, 0x4f, 0x0f, 0xcd, 0xcd, -1}, // 'O'
95+ {0x50, 0x70, 0x50, 0x10, 0xce, 0xce, -1}, // 'P'
96+ {0xc0, 0x5b, 0x7b, 0x1b, 0xda, 0xda, -1}, // '['
97+ {0xdb, 0x5d, 0x7d, 0x1d, 0xdb, 0xb0, -1}, // ']'
98+ {0x7b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, -1}, // F12 -> LF
99+ {0x41, 0x61, 0x41, 0x01, 0xbb, 0xbb, -1}, // 'A'
100+ {0x53, 0x73, 0x53, 0x13, 0xbc, 0xbc, -1}, // 'S'
101+ {0x44, 0x64, 0x44, 0x04, 0xbd, 0xbd, -1}, // 'D'
102+ {0x46, 0x66, 0x46, 0x06, 0xbe, 0xbe, -1}, // 'F'
103+ {0x47, 0x67, 0x47, 0x07, 0xbf, 0xbf, -1}, // 'G'
104+ {0x48, 0x68, 0x48, 0x08, 0xcf, 0xcf, -1}, // 'H'
105+ {0x4a, 0x6a, 0x4a, 0x0a, 0xd0, 0xd0, -1}, // 'J'
106+ {0x4b, 0x6b, 0x4b, 0x0b, 0xd1, 0xd1, -1}, // 'K'
107+ {0x4c, 0x6c, 0x4c, 0x0c, 0xd2, 0xd2, -1}, // 'L'
108+ {0xbb, 0x3b, 0x3a, 0x00, 0xd3, 0xd3, -1}, // ';'
109+ {0xba, 0x27, 0x22, 0x00, 0xde, 0xa2, -1}, // ','
110+ {0xdd, 0x60, 0x7e, 0x00, 0xdf, 0xa3, -1}, // '`'
111+ {0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, -1}, // ENTER
112+ {0x5a, 0x7a, 0x5a, 0x1a, 0xc0, 0xc0, -1}, // 'Z'
113+ {0x58, 0x78, 0x58, 0x18, 0xc1, 0xc1, -1}, // 'X'
114+ {0x43, 0x63, 0x43, 0x03, 0xc2, 0xaf, -1}, // 'C'
115+ {0x56, 0x76, 0x56, 0x16, 0xc3, 0xc3, -1}, // 'V'
116+ {0x42, 0x62, 0x42, 0x02, 0xc4, 0xc4, -1}, // 'B'
117+ {0x4e, 0x6e, 0x4e, 0x0e, 0xd4, 0xac, -1}, // 'N'
118+ {0x4d, 0x6d, 0x4d, 0x0d, 0xd5, 0xad, -1}, // 'M'
119+ {0xbc, 0x2c, 0x3c, 0x00, 0xd6, 0xae, -1}, // ','
120+ {0xbe, 0x2e, 0x3e, 0x1e, 0xdc, 0xa4, -1}, // '.'
121+ {0xbf, 0x2f, 0x3f, 0x1f, 0xa6, 0xa1, -1}, // '/'
122+ {0xe2, 0x5c, 0x7c, 0x1c, 0xdd, 0xa5, -1}, // '\'
123+ {0x09, 0x09, 0x09, 0x09, 0x09, 0x09, -1}, // TAB
124+ {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -1}, // SPACE
125+};
126+
30127 class MEMORY : public DEVICE
31128 {
32129 private:
@@ -63,11 +160,7 @@ private:
63160 int ram_switch_wait;
64161
65162 // keyboard
66- uint8_t keytable[256];
67- uint8_t keytable_shift[256];
68- uint8_t keytable_ctrl[256];
69- uint8_t keytable_kana[256];
70- uint8_t keytable_kana_shift[256];
163+ key_table_t key_table[array_length(key_table_base)];
71164
72165 uint8_t key_code;
73166 uint8_t key_status;
@@ -75,10 +168,11 @@ private:
75168 int key_repeat_start;
76169 int key_repeat_interval;
77170 int key_repeat_event;
78- uint8_t funckey_code;
171+ int funckey_code;
79172 int funckey_index;
80173 bool caps, kana;
81174 void initialize_key();
175+ void update_key();
82176
83177 // display
84178 uint8_t gcw;
@@ -134,21 +228,21 @@ public:
134228 ~MEMORY() {}
135229
136230 // common functions
137- void initialize();
138- void reset();
139- void __FASTCALL write_data8(uint32_t addr, uint32_t data);
140- uint32_t __FASTCALL read_data8(uint32_t addr);
141- uint32_t __FASTCALL fetch_op(uint32_t addr, int *wait);
142- void __FASTCALL write_io8(uint32_t addr, uint32_t data);
143- uint32_t __FASTCALL read_io8(uint32_t addr);
231+ void initialize() override;
232+ void reset() override;
233+ void __FASTCALL write_data8(uint32_t addr, uint32_t data) override;
234+ uint32_t __FASTCALL read_data8(uint32_t addr) override;
235+ uint32_t __FASTCALL fetch_op(uint32_t addr, int *wait) override;
236+ void __FASTCALL write_io8(uint32_t addr, uint32_t data) override;
237+ uint32_t __FASTCALL read_io8(uint32_t addr) override;
144238 #ifdef _IO_DEBUG_LOG
145- uint32_t __FASTCALL read_io8_debug(uint32_t addr);
239+ uint32_t __FASTCALL read_io8_debug(uint32_t addr) override;
146240 #endif
147- void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
148- void __FASTCALL event_callback(int event_id, int err);
149- void event_frame();
150- void event_vline(int v, int clock);
151- bool process_state(FILEIO* state_fio, bool loading);
241+ void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask) override;
242+ void __FASTCALL event_callback(int event_id, int err) override;
243+ void event_frame() override;
244+ void event_vline(int v, int clock) override;
245+ bool process_state(FILEIO* state_fio, bool loading) override;
152246
153247 // unique functions
154248 void set_context_cpu(DEVICE* device)
@@ -183,7 +277,7 @@ public:
183277 d_psg = device;
184278 }
185279 #endif
186- void key_down_up(int code, bool down);
280+
187281 bool get_caps_locked()
188282 {
189283 return caps;
@@ -192,6 +286,7 @@ public:
192286 {
193287 return kana;
194288 }
289+ void key_down(int code);
195290 void draw_screen();
196291 bool warm_start;
197292 };
--- a/source/src/vm/smc777/smc777.cpp
+++ b/source/src/vm/smc777/smc777.cpp
@@ -268,13 +268,12 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
268268 void VM::key_down(int code, bool repeat)
269269 {
270270 if(!repeat) {
271- memory->key_down_up(code, true);
271+ memory->key_down(code);
272272 }
273273 }
274274
275275 void VM::key_up(int code)
276276 {
277- memory->key_down_up(code, false);
278277 }
279278
280279 bool VM::get_caps_locked()
Show on old repository browser