2 SHARP MZ-5500 Emulator 'EmuZ-5500'
4 Author : Takeda.Toshiya
12 #include "../../fifo.h"
14 #define PHASE_RESET -1
16 #define PHASE_SEND_START_H 1
17 #define PHASE_SEND_START_L 2
18 #define PHASE_SEND_BIT_7_H 3
19 #define PHASE_SEND_BIT_7_L 4
20 #define PHASE_SEND_BIT_6_H 5
21 #define PHASE_SEND_BIT_6_L 6
22 #define PHASE_SEND_BIT_5_H 7
23 #define PHASE_SEND_BIT_5_L 8
24 #define PHASE_SEND_BIT_4_H 9
25 #define PHASE_SEND_BIT_4_L 10
26 #define PHASE_SEND_BIT_3_H 11
27 #define PHASE_SEND_BIT_3_L 12
28 #define PHASE_SEND_BIT_2_H 13
29 #define PHASE_SEND_BIT_2_L 14
30 #define PHASE_SEND_BIT_1_H 15
31 #define PHASE_SEND_BIT_1_L 16
32 #define PHASE_SEND_BIT_0_H 17
33 #define PHASE_SEND_BIT_0_L 18
34 #define PHASE_SEND_COMMAND_H 19
35 #define PHASE_SEND_COMMAND_L 20
36 #define PHASE_SEND_PARITY_H 21
37 #define PHASE_SEND_PARITY_L 22
38 #define PHASE_SEND_FINISH 23
39 #define PHASE_SEND_WAIT_ACK 24
40 #define PHASE_RECV_START 30
41 #define PHASE_RECV_BIT_2 31
42 #define PHASE_RECV_BIT_1 32
43 #define PHASE_RECV_BIT_0 33
44 #define PHASE_RECV_PARITY 34
45 #define PHASE_RECV_ACK_H 35
46 #define PHASE_RECV_ACK_L 36
52 // http://www.8bity.cz/2013/adapter-pro-pripojeni-ps2-klavesnice-k-sharp-mz-3500/
54 // CMD Escape or Kanji
64 static const uint16_t key_table[256] = {
65 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00f, 0x1f4, 0x000, 0x000, 0x000, 0x00d, 0x000, 0x000,
66 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0fe, 0x000, 0x0fe, 0x000, 0x000, 0x000, 0x000,
67 0x020, 0x000, 0x000, 0x1f7, 0x00b, 0x01f, 0x01c, 0x01e, 0x01d, 0x000, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
68 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, 0x039, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
69 0x000, 0x041, 0x042, 0x043, 0x044, 0x045, 0x046, 0x047, 0x048, 0x049, 0x04a, 0x04b, 0x04c, 0x04d, 0x04e, 0x04f,
70 0x050, 0x051, 0x052, 0x053, 0x054, 0x055, 0x056, 0x057, 0x058, 0x059, 0x05a, 0x000, 0x000, 0x000, 0x000, 0x000,
71 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, 0x039, 0x02a, 0x02b, 0x02c, 0x02d, 0x0fd, 0x02f,
72 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, 0x009, 0x00a, 0x1f5, 0x1fb, 0x000, 0x000, 0x000, 0x000,
73 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
74 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
75 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
76 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03a, 0x03b, 0x02c, 0x02d, 0x02e, 0x02f,
77 0x040, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
78 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x05b, 0x05c, 0x05d, 0x05e, 0x000,
79 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
80 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000
83 static const uint16_t key_shift_table[256] = {
84 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00f, 0x1f4, 0x000, 0x000, 0x000, 0x00d, 0x000, 0x000,
85 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0fe, 0x000, 0x0fe, 0x000, 0x000, 0x000, 0x000,
86 0x020, 0x000, 0x000, 0x000, 0x00b, 0x01f, 0x01c, 0x01e, 0x01d, 0x000, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
87 0x000, 0x021, 0x022, 0x1f7, 0x024, 0x025, 0x026, 0x027, 0x028, 0x029, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
88 0x000, 0x061, 0x062, 0x063, 0x064, 0x065, 0x066, 0x067, 0x068, 0x069, 0x06a, 0x06b, 0x06c, 0x06d, 0x06e, 0x06f,
89 0x070, 0x071, 0x072, 0x073, 0x074, 0x075, 0x076, 0x077, 0x078, 0x079, 0x07a, 0x000, 0x000, 0x000, 0x000, 0x000,
90 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, 0x039, 0x02a, 0x02b, 0x02c, 0x02d, 0x0fd, 0x02f,
91 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, 0x009, 0x00a, 0x1f5, 0x1fb, 0x000, 0x000, 0x000, 0x000,
92 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
93 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
94 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
95 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x02a, 0x02b, 0x03c, 0x03d, 0x03e, 0x03f,
96 0x060, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
97 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x07b, 0x07c, 0x07d, 0x07e, 0x000,
98 0x000, 0x000, 0x05f, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
99 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000
102 static const uint16_t key_ctrl_table[256] = {
103 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00f, 0x1f4, 0x000, 0x000, 0x000, 0x00d, 0x000, 0x000,
104 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x1fc, 0x000, 0x1fc, 0x000, 0x000, 0x000, 0x000,
105 0x020, 0x000, 0x000, 0x1f7, 0x01b, 0x01f, 0x01c, 0x01e, 0x01d, 0x000, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
106 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
107 0x000, 0x081, 0x082, 0x083, 0x084, 0x085, 0x086, 0x087, 0x088, 0x089, 0x08a, 0x08b, 0x08c, 0x08d, 0x08e, 0x08f,
108 0x090, 0x091, 0x092, 0x093, 0x094, 0x095, 0x096, 0x097, 0x098, 0x099, 0x09a, 0x000, 0x000, 0x000, 0x000, 0x000,
109 0x190, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196, 0x197, 0x198, 0x199, 0x02a, 0x02b, 0x02c, 0x02d, 0x0fd, 0x02f,
110 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017, 0x018, 0x019, 0x01a, 0x1f6, 0x1f3, 0x000, 0x000, 0x000, 0x000,
111 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
112 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
113 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
114 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
115 0x080, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
116 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x09b, 0x09c, 0x09d, 0x09e, 0x000,
117 0x000, 0x000, 0x09f, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
118 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000
121 static const uint16_t key_ctrl_shift_table[256] = {
122 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00f, 0x1f4, 0x000, 0x000, 0x000, 0x00d, 0x000, 0x000,
123 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x1fc, 0x000, 0x1fc, 0x000, 0x000, 0x000, 0x000,
124 0x020, 0x000, 0x000, 0x1f7, 0x01b, 0x01f, 0x01c, 0x01e, 0x01d, 0x000, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
125 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
126 0x000, 0x0e1, 0x0e2, 0x0e3, 0x0e4, 0x0e5, 0x0e6, 0x0e7, 0x0e8, 0x0e9, 0x0ea, 0x0eb, 0x0ec, 0x0ed, 0x0ee, 0x0ef,
127 0x0f0, 0x0f1, 0x0f2, 0x0f3, 0x0f4, 0x0f5, 0x0f6, 0x0f7, 0x0f8, 0x0f9, 0x0fa, 0x000, 0x000, 0x000, 0x000, 0x000,
128 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x02a, 0x02b, 0x02c, 0x02d, 0x0fd, 0x02f,
129 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017, 0x018, 0x019, 0x01a, 0x1f6, 0x1f3, 0x000, 0x000, 0x000, 0x000,
130 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
131 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
132 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
133 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
134 0x0e0, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
135 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0fb, 0x000, 0x000, 0x000, 0x000,
136 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
137 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000
140 static const uint16_t key_kana_table[256] = {
141 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00f, 0x1f4, 0x000, 0x000, 0x000, 0x00d, 0x000, 0x000,
142 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0fe, 0x000, 0x0fe, 0x000, 0x000, 0x000, 0x000,
143 0x020, 0x000, 0x000, 0x1f7, 0x00b, 0x01f, 0x01c, 0x01e, 0x01d, 0x000, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
144 0x0dc, 0x0c7, 0x0cc, 0x0b1, 0x0b3, 0x0b4, 0x0b5, 0x0d4, 0x0d5, 0x0d6, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
145 0x000, 0x0c1, 0x0ba, 0x0bf, 0x0bc, 0x0b2, 0x0ca, 0x0b7, 0x0b8, 0x0c6, 0x0cf, 0x0c9, 0x0d8, 0x0d3, 0x0d0, 0x0d7,
146 0x0be, 0x0c0, 0x0bd, 0x0c4, 0x0b6, 0x0c5, 0x0cb, 0x0c3, 0x0bb, 0x0dd, 0x0c2, 0x000, 0x000, 0x000, 0x000, 0x000,
147 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, 0x039, 0x02a, 0x02b, 0x02c, 0x02d, 0x0fd, 0x02f,
148 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, 0x009, 0x00a, 0x1f5, 0x1fb, 0x000, 0x000, 0x000, 0x000,
149 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
150 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
151 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
152 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0b9, 0x0da, 0x0c8, 0x0ce, 0x0d9, 0x0d2,
153 0x0de, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
154 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0df, 0x0b0, 0x0d1, 0x0cd, 0x000,
155 0x000, 0x000, 0x0db, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
156 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000
159 static const uint16_t key_kana_shift_table[256] = {
160 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00f, 0x1f4, 0x000, 0x000, 0x000, 0x00d, 0x000, 0x000,
161 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0fe, 0x000, 0x0fe, 0x000, 0x000, 0x000, 0x000,
162 0x020, 0x000, 0x000, 0x1f7, 0x00b, 0x01f, 0x01c, 0x01e, 0x01d, 0x000, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
163 0x0a6, 0x000, 0x000, 0x0a7, 0x0a9, 0x0aa, 0x0ab, 0x0ac, 0x0ad, 0x0ae, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
164 0x000, 0x000, 0x000, 0x000, 0x000, 0x0a8, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x1f9, 0x1f8, 0x000,
165 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0af, 0x000, 0x000, 0x000, 0x000, 0x000,
166 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, 0x039, 0x02a, 0x02b, 0x02c, 0x02d, 0x0fd, 0x02f,
167 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, 0x009, 0x00a, 0x1f5, 0x1fb, 0x000, 0x000, 0x000, 0x000,
168 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
169 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
170 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
171 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0a4, 0x000, 0x0a1, 0x0a5,
172 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
173 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0a2, 0x000, 0x0a3, 0x000, 0x000,
174 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
175 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000
178 void KEYBOARD::initialize()
180 key_stat = emu->get_key_buffer();
181 key_buf = new FIFO(64);
186 register_frame_event(this);
189 void KEYBOARD::release()
195 void KEYBOARD::reset()
198 emu->out_message(pro_mode ? _T("PRO mode") : _T("OP mode"));
199 key_buf->write(pro_mode ? 0x1f2 : 0x1f0);
204 stc_clock = get_current_clock();
208 void KEYBOARD::write_signal(int id, uint32_t data, uint32_t mask)
210 if(id == SIG_KEYBOARD_ACKC) {
212 if(phase == PHASE_SEND_WAIT_ACK) {
216 } else if(id == SIG_KEYBOARD_STC) {
218 stc = ((data & mask) != 0);
220 stc_clock = get_current_clock();
221 } else if(!old && stc) {
228 if(get_passed_usec(stc_clock) < 7.5) {
231 phase = PHASE_RECV_START;
235 case PHASE_RECV_BIT_2:
236 case PHASE_RECV_BIT_1:
237 case PHASE_RECV_BIT_0:
238 case PHASE_RECV_PARITY:
239 if(get_passed_usec(stc_clock) < 17.5) {
246 } else if(id == SIG_KEYBOARD_DC) {
247 dc = ((data & mask) != 0);
251 void KEYBOARD::event_callback(int event_id, int err)
253 if(event_id == EVENT_DRIVE) {
255 } else if(event_id == EVENT_DATA) {
256 set_dk((send_data & 0x200) != 0);
258 } else if(event_id == EVENT_ACK) {
263 void KEYBOARD::event_frame()
265 if(phase == PHASE_IDLE) {
266 if(!key_buf->empty()) {
267 send_data = (uint16_t)key_buf->read_not_remove(0);
268 send_data = ((send_data & 0xff) << 2) | ((send_data & 0x100) >> 7);
270 if(send_data & 0x200) parity++;
271 if(send_data & 0x100) parity++;
272 if(send_data & 0x080) parity++;
273 if(send_data & 0x040) parity++;
274 if(send_data & 0x020) parity++;
275 if(send_data & 0x010) parity++;
276 if(send_data & 0x008) parity++;
277 if(send_data & 0x004) parity++;
278 if(send_data & 0x002) parity++;
279 send_data |= (parity & 1);
280 phase = PHASE_SEND_START_H;
286 void KEYBOARD::drive()
294 case PHASE_SEND_START_H:
298 register_event(this, EVENT_DRIVE, 12.5, false, NULL);
300 case PHASE_SEND_START_L:
303 register_event(this, EVENT_DATA, 32.0, false, NULL);
304 register_event(this, EVENT_DRIVE, 32.5, false, NULL);
306 case PHASE_SEND_BIT_7_H:
307 case PHASE_SEND_BIT_6_H:
308 case PHASE_SEND_BIT_5_H:
309 case PHASE_SEND_BIT_4_H:
310 case PHASE_SEND_BIT_3_H:
311 case PHASE_SEND_BIT_2_H:
312 case PHASE_SEND_BIT_1_H:
313 case PHASE_SEND_BIT_0_H:
314 case PHASE_SEND_COMMAND_H:
315 case PHASE_SEND_PARITY_H:
318 register_event(this, EVENT_DRIVE, 17.5, false, NULL);
320 case PHASE_SEND_BIT_7_L:
321 case PHASE_SEND_BIT_6_L:
322 case PHASE_SEND_BIT_5_L:
323 case PHASE_SEND_BIT_4_L:
324 case PHASE_SEND_BIT_3_L:
325 case PHASE_SEND_BIT_2_L:
326 case PHASE_SEND_BIT_1_L:
327 case PHASE_SEND_BIT_0_L:
328 case PHASE_SEND_COMMAND_L:
331 register_event(this, EVENT_DATA, 49.5, false, NULL);
332 register_event(this, EVENT_DRIVE, 50.0, false, NULL);
334 case PHASE_SEND_PARITY_L:
337 register_event(this, EVENT_DRIVE, 50.0, false, NULL);
339 case PHASE_SEND_FINISH:
342 register_event(this, EVENT_DRIVE, 300.0, false, NULL);
344 case PHASE_SEND_WAIT_ACK:
347 case PHASE_RECV_START:
351 case PHASE_RECV_BIT_2:
352 recv_data |= dc ? 4 : 0;
355 case PHASE_RECV_BIT_1:
356 recv_data |= dc ? 2 : 0;
359 case PHASE_RECV_BIT_0:
360 recv_data |= dc ? 1 : 0;
363 case PHASE_RECV_PARITY:
366 if(recv_data & 4) parity++;
367 if(recv_data & 2) parity++;
368 if(recv_data & 1) parity++;
369 recv_ok = ((parity & 1) == (dc ? 1 : 0));
371 register_event(this, EVENT_ACK, 69.5, false, NULL);
372 register_event(this, EVENT_DRIVE, 70.0, false, NULL);
375 case PHASE_RECV_ACK_H:
378 register_event(this, EVENT_DRIVE, 17.5, false, NULL);
380 case PHASE_RECV_ACK_L:
388 void KEYBOARD::key_down(int code)
390 bool shift = (key_stat[0x10] != 0);
391 bool ctrl = (key_stat[0x11] != 0);
392 bool alt = (key_stat[0x12] != 0);
397 } else if(code == 0x15) {
400 } else if(code == 0x21) {
403 emu->out_message(_T("PRO mode"));
404 key_buf->write(0x1f2);
407 } else if(code == 0x22) {
410 emu->out_message(_T("OP mode"));
411 key_buf->write(0x1f0);
414 } else if(code == 0x70 && alt) {
416 key_buf->write(0x1fa);
418 } else if((code == 0x30 || code == 0x60) && alt) {
420 key_buf->write(0x0fc);
424 code = key_ctrl_shift_table[code];
426 code = key_ctrl_table[code];
427 } else if(kana && shift) {
428 code = key_kana_shift_table[code];
430 code = key_kana_table[code];
432 code = key_shift_table[code];
434 code = key_table[code];
438 if(code >= 'a' && code <= 'z') {
440 } else if(code >= 'A' && code <= 'Z') {
444 key_buf->write(code);
448 void KEYBOARD::key_up(int code)
452 void KEYBOARD::set_stk(bool value)
454 d_ls244->write_signal(SIG_LS244_INPUT, value ? 0xffffffff : 0, 0x40);
455 d_subcpu->write_signal(SIG_CPU_IRQ, value ? 0xffffffff : 0, 1);
458 void KEYBOARD::set_dk(bool value)
460 d_ls244->write_signal(SIG_LS244_INPUT, value ? 0xffffffff : 0, 0x20);
463 #define STATE_VERSION 3
465 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
467 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
470 if(!state_fio->StateCheckInt32(this_device_id)) {
473 if(!key_buf->process_state((void *)state_fio, loading)) {
476 state_fio->StateInt32(phase);
477 state_fio->StateUint16(send_data);
478 state_fio->StateUint32(stc_clock);
479 state_fio->StateUint8(recv_data);
480 state_fio->StateBool(recv_ok);
481 state_fio->StateBool(stc);
482 state_fio->StateBool(dc);
483 state_fio->StateBool(caps);
484 state_fio->StateBool(kana);
485 state_fio->StateBool(pro_mode);