1+ struct FamilyBasicKeyboard : InputDevice {
2+ FamilyBasicKeyboard ();
3+
4+ auto loadSetting (Markup::Node *node) -> void;
5+ auto saveSetting (Markup::Node *node) -> void;
6+
7+ InputDigital f1, f2, f3, f4, f5, f6, f7, f8 ;
8+ InputDigital num1, num2, num3, num4, num5, num6, num7, num8, num9, num0, minus, power, yen, stop;
9+ InputDigital esc, q, w, e, r, t, y, u, i, o, p, at, lbrace, enter;
10+ InputDigital control, a, s, d, f, g, h, j, k, l, semicolon, colon, rbrace, kana;
11+ InputDigital lshift, z, x, c, v, b, n, m, comma, period, slash, underscore, rshift;
12+ InputDigital graph, spacebar;
13+ InputDigital home, insert, backspace;
14+ InputDigital up, down, left, right;
15+ };
16+
17+ FamilyBasicKeyboard::FamilyBasicKeyboard () : InputDevice(" Family BASIC Keyboard" ) {
18+ InputDevice::digital (" F1" , f1);
19+ InputDevice::digital (" F2" , f2);
20+ InputDevice::digital (" F3" , f3);
21+ InputDevice::digital (" F4" , f4);
22+ InputDevice::digital (" F5" , f5);
23+ InputDevice::digital (" F6" , f6);
24+ InputDevice::digital (" F7" , f7);
25+ InputDevice::digital (" F8" , f8 );
26+
27+ InputDevice::digital (" Num1" , num1);
28+ InputDevice::digital (" Num2" , num2);
29+ InputDevice::digital (" Num3" , num3);
30+ InputDevice::digital (" Num4" , num4);
31+ InputDevice::digital (" Num5" , num5);
32+ InputDevice::digital (" Num6" , num6);
33+ InputDevice::digital (" Num7" , num7);
34+ InputDevice::digital (" Num8" , num8);
35+ InputDevice::digital (" Num9" , num9);
36+ InputDevice::digital (" Num0" , num0);
37+ InputDevice::digital (" Minus" , minus);
38+ InputDevice::digital (" Power" , power);
39+ InputDevice::digital (" Yen" , yen);
40+ InputDevice::digital (" Stop" , stop);
41+
42+ InputDevice::digital (" Escape" , esc);
43+ InputDevice::digital (" Q" , q);
44+ InputDevice::digital (" W" , w);
45+ InputDevice::digital (" E" , e);
46+ InputDevice::digital (" R" , r);
47+ InputDevice::digital (" T" , t);
48+ InputDevice::digital (" Y" , y);
49+ InputDevice::digital (" U" , u);
50+ InputDevice::digital (" I" , i);
51+ InputDevice::digital (" O" , o);
52+ InputDevice::digital (" P" , p);
53+ InputDevice::digital (" At" , at);
54+ InputDevice::digital (" Left Brace" , lbrace);
55+ InputDevice::digital (" Return" , enter);
56+
57+ InputDevice::digital (" Control" , control);
58+ InputDevice::digital (" A" , a);
59+ InputDevice::digital (" S" , s);
60+ InputDevice::digital (" D" , d);
61+ InputDevice::digital (" F" , f);
62+ InputDevice::digital (" G" , g);
63+ InputDevice::digital (" H" , h);
64+ InputDevice::digital (" J" , j);
65+ InputDevice::digital (" K" , k);
66+ InputDevice::digital (" L" , l);
67+ InputDevice::digital (" Semicolon" , semicolon);
68+ InputDevice::digital (" Colon" , colon);
69+ InputDevice::digital (" Right Brace" , rbrace);
70+ InputDevice::digital (" Kana" , kana);
71+
72+ InputDevice::digital (" Left Shift" , lshift);
73+ InputDevice::digital (" Z" , z);
74+ InputDevice::digital (" X" , x);
75+ InputDevice::digital (" C" , c);
76+ InputDevice::digital (" V" , v);
77+ InputDevice::digital (" B" , b);
78+ InputDevice::digital (" N" , n);
79+ InputDevice::digital (" M" , m);
80+ InputDevice::digital (" Comma" , comma);
81+ InputDevice::digital (" Period" , period);
82+ InputDevice::digital (" Slash" , slash);
83+ InputDevice::digital (" Underscore" , underscore);
84+ InputDevice::digital (" Right Shift" , rshift);
85+
86+ InputDevice::digital (" Graph" , graph);
87+ InputDevice::digital (" Spacebar" , spacebar);
88+
89+ InputDevice::digital (" Home" , home);
90+ InputDevice::digital (" Insert" , insert);
91+ InputDevice::digital (" Backspace" , backspace);
92+
93+ InputDevice::digital (" Up" , up);
94+ InputDevice::digital (" Down" , down);
95+ InputDevice::digital (" Left" , left);
96+ InputDevice::digital (" Right" , right);
97+ }
98+
99+ auto FamilyBasicKeyboard::loadSetting (Markup::Node *node) -> void {
100+ for (auto & input : inputs) {
101+ string node_name = string{" Famicom/" , name, " /" , input.name }.replace (" " , " ." );
102+ if (auto subnode = (*node)[node_name]) {
103+ string value = subnode.string ();
104+ for (u32 binding : range (BindingLimit)) {
105+ input.mapping ->assignments [binding] = value.split (" ;" )(binding);
106+ }
107+ }
108+ }
109+ }
110+
111+ auto FamilyBasicKeyboard::saveSetting (Markup::Node *node) -> void {
112+ for (auto & input : inputs) {
113+ string node_name = string{" Famicom/" , name, " /" , input.name }.replace (" " , " ." );
114+ string value;
115+ for (auto & assignment : input.mapping ->assignments ) {
116+ value.append (assignment, " ;" );
117+ }
118+ value.trimRight (" ;" , 1L );
119+
120+ (*node)(node_name).setValue (value);
121+ }
122+ }
123+
1124struct Famicom : Emulator {
2125 Famicom ();
3126 auto load () -> LoadResult override ;
4127 auto save () -> bool override ;
5128 auto pak (ares::Node::Object) -> shared_pointer<vfs::directory> override ;
129+
6130 auto loadTape (ares::Node::Object node, string location) -> bool override ;
7131 auto unloadTape (ares::Node::Object node) -> void override ;
8132
133+ auto loadSetting (Markup::Node *node) -> void override ;
134+ auto saveSetting (Markup::Node *node) -> void override ;
135+ auto bindInput () -> void override ;
136+
137+ FamilyBasicKeyboard familyBasicKeyboard;
9138 shared_pointer<mia::Pak> familyBasicDataRecorder{};
10139};
11140
@@ -39,88 +168,7 @@ Famicom::Famicom() {
39168
40169 {
41170 InputPort port{" Expansion Port" };
42- { InputDevice device{" Family BASIC Keyboard" };
43- device.digital (" F1" , virtualPorts[2 ].keyboard .f1 );
44- device.digital (" F2" , virtualPorts[2 ].keyboard .f2 );
45- device.digital (" F3" , virtualPorts[2 ].keyboard .f3 );
46- device.digital (" F4" , virtualPorts[2 ].keyboard .f4 );
47- device.digital (" F5" , virtualPorts[2 ].keyboard .f5 );
48- device.digital (" F6" , virtualPorts[2 ].keyboard .f6 );
49- device.digital (" F7" , virtualPorts[2 ].keyboard .f7 );
50- device.digital (" F8" , virtualPorts[2 ].keyboard .f8 );
51-
52- device.digital (" 1" , virtualPorts[2 ].keyboard .num1 );
53- device.digital (" 2" , virtualPorts[2 ].keyboard .num2 );
54- device.digital (" 3" , virtualPorts[2 ].keyboard .num3 );
55- device.digital (" 4" , virtualPorts[2 ].keyboard .num4 );
56- device.digital (" 5" , virtualPorts[2 ].keyboard .num5 );
57- device.digital (" 6" , virtualPorts[2 ].keyboard .num6 );
58- device.digital (" 7" , virtualPorts[2 ].keyboard .num7 );
59- device.digital (" 8" , virtualPorts[2 ].keyboard .num8 );
60- device.digital (" 9" , virtualPorts[2 ].keyboard .num9 );
61- device.digital (" 0" , virtualPorts[2 ].keyboard .num0 );
62- device.digital (" Minus" , virtualPorts[2 ].keyboard .dash );
63- device.digital (" ^" , virtualPorts[2 ].keyboard .tilde );
64- device.digital (" Yen" , virtualPorts[2 ].keyboard .equals );
65- device.digital (" Stop" , virtualPorts[2 ].keyboard .backspace );
66-
67- device.digital (" Escape" , virtualPorts[2 ].keyboard .esc );
68- device.digital (" Q" , virtualPorts[2 ].keyboard .q );
69- device.digital (" W" , virtualPorts[2 ].keyboard .w );
70- device.digital (" E" , virtualPorts[2 ].keyboard .e );
71- device.digital (" R" , virtualPorts[2 ].keyboard .r );
72- device.digital (" T" , virtualPorts[2 ].keyboard .t );
73- device.digital (" Y" , virtualPorts[2 ].keyboard .y );
74- device.digital (" U" , virtualPorts[2 ].keyboard .u );
75- device.digital (" I" , virtualPorts[2 ].keyboard .i );
76- device.digital (" O" , virtualPorts[2 ].keyboard .o );
77- device.digital (" P" , virtualPorts[2 ].keyboard .p );
78- device.digital (" @" , virtualPorts[2 ].keyboard .lbracket );
79- device.digital (" Return" , virtualPorts[2 ].keyboard .return_ );
80-
81- device.digital (" Control" , virtualPorts[2 ].keyboard .lctrl );
82- device.digital (" A" , virtualPorts[2 ].keyboard .a );
83- device.digital (" S" , virtualPorts[2 ].keyboard .s );
84- device.digital (" D" , virtualPorts[2 ].keyboard .d );
85- device.digital (" F" , virtualPorts[2 ].keyboard .f );
86- device.digital (" G" , virtualPorts[2 ].keyboard .g );
87- device.digital (" H" , virtualPorts[2 ].keyboard .h );
88- device.digital (" J" , virtualPorts[2 ].keyboard .j );
89- device.digital (" K" , virtualPorts[2 ].keyboard .k );
90- device.digital (" L" , virtualPorts[2 ].keyboard .l );
91- device.digital (" ;" , virtualPorts[2 ].keyboard .semicolon );
92- device.digital (" :" , virtualPorts[2 ].keyboard .apostrophe );
93- device.digital (" ]" , virtualPorts[2 ].keyboard .rbracket );
94- device.digital (" Kana" , virtualPorts[2 ].keyboard .rctrl );
95-
96- device.digital (" Left Shift" , virtualPorts[2 ].keyboard .lshift );
97- device.digital (" Z" , virtualPorts[2 ].keyboard .z );
98- device.digital (" X" , virtualPorts[2 ].keyboard .x );
99- device.digital (" C" , virtualPorts[2 ].keyboard .c );
100- device.digital (" V" , virtualPorts[2 ].keyboard .v );
101- device.digital (" B" , virtualPorts[2 ].keyboard .b );
102- device.digital (" N" , virtualPorts[2 ].keyboard .n );
103- device.digital (" M" , virtualPorts[2 ].keyboard .m );
104- device.digital (" ," , virtualPorts[2 ].keyboard .comma );
105- device.digital (" ." , virtualPorts[2 ].keyboard .period );
106- device.digital (" /" , virtualPorts[2 ].keyboard .slash );
107- device.digital (" _" , virtualPorts[2 ].keyboard .ralt );
108- device.digital (" Right Shift" , virtualPorts[2 ].keyboard .rshift );
109-
110- device.digital (" Graph" , virtualPorts[2 ].keyboard .lalt );
111- device.digital (" Spacebar" , virtualPorts[2 ].keyboard .spacebar );
112-
113- device.digital (" Home" , virtualPorts[2 ].keyboard .home );
114- device.digital (" Insert" , virtualPorts[2 ].keyboard .insert );
115- device.digital (" Delete" , virtualPorts[2 ].keyboard .delete_ );
116-
117- device.digital (" Up" , virtualPorts[2 ].keyboard .up );
118- device.digital (" Down" , virtualPorts[2 ].keyboard .down );
119- device.digital (" Left" , virtualPorts[2 ].keyboard .left );
120- device.digital (" Right" , virtualPorts[2 ].keyboard .right );
121-
122- port.append (device); }
123-
171+ port.append (familyBasicKeyboard);
124172 ports.append (port);
125173 }
126174}
@@ -218,4 +266,18 @@ auto Famicom::unloadTape(ares::Node::Object node) -> void {
218266 familyBasicDataRecorder->save (familyBasicDataRecorder->location );
219267 familyBasicDataRecorder.reset ();
220268 }
269+ }
270+
271+ auto Famicom::loadSetting (Markup::Node *node) -> void {
272+ familyBasicKeyboard.loadSetting (node);
273+ }
274+
275+ auto Famicom::saveSetting (Markup::Node *node) -> void {
276+ familyBasicKeyboard.saveSetting (node);
277+ }
278+
279+ auto Famicom::bindInput () -> void {
280+ for (auto & input : familyBasicKeyboard.inputs ) {
281+ input.mapping ->bind ();
282+ }
221283}
0 commit comments