2 NEC PC-6001 Emulator 'yaPC-6001'
3 NEC PC-6001mkII Emulator 'yaPC-6201'
4 NEC PC-6001mkIISR Emulator 'yaPC-6401'
5 NEC PC-6601 Emulator 'yaPC-6601'
6 NEC PC-6601SR Emulator 'yaPC-6801'
18 #define STICK0_SPACE 0x80
19 #define STICK0_LEFT 0x20
20 #define STICK0_RIGHT 0x10
21 #define STICK0_DOWN 0x08
22 #define STICK0_UP 0x04
23 #define STICK0_STOP 0x02
24 #define STICK0_SHIFT 0x01
26 #define INTADDR_KEY1 0x02
27 #define INTADDR_TIMER 0x06
28 #define INTADDR_CMTREAD 0x08
29 #define INTADDR_CMTSTOP 0x0E
30 #define INTADDR_CMTERR 0x12
31 #define INTADDR_KEY2 0x14
32 #define INTADDR_STRIG 0x16
33 #define INTADDR_TVR 0x18 // TV RESERVE-DATA Read Interrupt
34 #define INTADDR_DATE 0x1A // DATE-DATA Read Interrupt
37 #define CAS_SAVEBYTE 1
39 #define CAS_LOADBYTE 3
41 #define EVENT_CASSETTE 0
44 /* normal (small alphabet) */
45 uint8_t Keys1[256][2] =
50 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
52 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
55 /* SHIFT CTRL ALT PAUSE CAPS KANA */
56 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
58 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
61 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
62 {0,0x20},{0,0xfe},{0,0xfe},{0,0xfe},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
63 /* DOWN PRN SCR INSERT DELETE HELP */
64 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
68 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
70 {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
74 {0,0x00},{0,0x61},{0,0x62},{0,0x63},{0,0x64},{0,0x65},{0,0x66},{0,0x67},
76 {0,0x68},{0,0x69},{0,0x6a},{0,0x6b},{0,0x6c},{0,0x6d},{0,0x6e},{0,0x6f},
80 {0,0x70},{0,0x71},{0,0x72},{0,0x73},{0,0x74},{0,0x75},{0,0x76},{0,0x77},
82 {0,0x78},{0,0x79},{0,0x7a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
86 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
88 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
91 /* F1 F2 F3 F4 F5 F6 F7 F8 */
92 {1,0xf0},{1,0xf1},{1,0xf2},{1,0xf3},{1,0xf4},{1,0x00},{0,0x00},{1,0xfd},
93 /* F9 F10 F11 F12 F13 F14 F15 F16 */
94 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
97 /* F17 F18 F19 F20 F21 F22 F23 F24 */
98 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
99 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
103 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
104 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
108 {0,0x00},{0,0x00},{0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
110 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
114 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
115 /* :* ;+ ,< - .> /? */
116 {0,0x00},{0,0x00},{0,0x3A},{0,0x3b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
120 {0,0x40},{1,0x00},{1,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x00},{0,0x00},
121 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
124 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
126 {0,0x00},{0,0x00},{0,0x00},{0,0x5b},{0,0x5c},{0,0x5d},{0,0x5e},{0,0x00},
130 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
131 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
133 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xba},{0,0xbb},
134 {0,0xbc},{0,0xbd},{0,0xbe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
137 /* normal (small alphabet) + shift */
138 uint8_t Keys2[256][2] =
141 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
143 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
146 /* SHIFT CTRL ALT PAUSE CAPS KANA */
147 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
149 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
152 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
153 {0,0x20},{1,0xfc},{1,0xfc},{0,0xfc},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
154 /* DOWN PRN SCR INSERT DELETE HELP */
155 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
158 /* 0 1 2 3 4 5 6 7 */
159 {0,0x00},{0,0x21},{0,0x22},{0,0x23},{0,0x24},{0,0x25},{0,0x26},{0,0x27},
161 {0,0x28},{0,0x29},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
165 {0,0x40},{0,0x41},{0,0x42},{0,0x43},{0,0x44},{0,0x45},{0,0x46},{0,0x47},
166 /* H I J K L M N O */
167 {0,0x48},{0,0x49},{0,0x4a},{0,0x4b},{0,0x4c},{0,0x4d},{0,0x4e},{0,0x4f},
170 /* P Q R S T U V W */
171 {0,0x50},{0,0x51},{0,0x52},{0,0x53},{0,0x54},{0,0x55},{0,0x56},{0,0x57},
173 {0,0x58},{0,0x59},{0,0x5a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
176 /* 0 1 2 3 4 5 6 7 */
177 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
179 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
182 /* F1 F2 F3 F4 F5 F6 F7 F8 */
183 {1,0xf5},{1,0xf6},{1,0xf7},{1,0xf8},{1,0xf9},{1,0x00},{0,0x00},{1,0xfd},
184 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
187 /* F17 F18 F19 F20 F21 F22 F23 F24 */
188 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
189 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
193 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
194 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
198 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
199 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
202 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
203 /* :* ;+ ,< - .> /? */
204 {0,0x38},{0,0x39},{0,0x2A},{0,0x2b},{0,0x3c},{0,0x3d},{0,0x3e},{0,0x3f},
207 {0,0x00},{1,0x00},{1,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x00},{0,0x00},
208 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
211 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
213 {0,0x00},{0,0x00},{0,0x00},{0,0x7B},{0,0x7C},{0,0x7D},{0,0x00},{0,0x00},
217 {0,0x00},{0,0x00},{0,0x5f},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
218 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
220 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xba},{0,0xbb},
221 {0,0xbc},{0,0xbd},{0,0xbe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
225 uint8_t Keys3[256][2] =
228 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
230 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
233 /* SHIFT CTRL ALT PAUSE CAPS KANA */
234 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
236 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
239 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
240 {0,0x20},{0,0xfe},{0,0xfe},{0,0x00},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
241 /* DOWN PRN SCR INSERT DELETE HELP */
242 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0xe8},{0,0x12},{0,0x08},{0,0xf2},
245 /* 0 1 2 3 4 5 6 7 */
246 {0,0xfc},{0,0xe7},{0,0xec},{0,0x91},{0,0x93},{0,0x94},{0,0x95},{0,0xf4},
248 {0,0xf5},{0,0xf6},{0,0x99},{0,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
252 {0,0x00},{0,0xe1},{0,0x9a},{0,0x9f},{0,0x9c},{0,0x92},{0,0xea},{0,0x97},
253 /* H I J K L M N O */
254 {0,0x98},{0,0xe6},{0,0xef},{0,0xe9},{0,0xf8},{0,0xf3},{0,0xf0},{0,0xf7},
257 /* P Q R S T U V W */
258 {0,0x9e},{0,0xe0},{0,0x9d},{0,0xe4},{0,0x96},{0,0xe5},{0,0xeb},{0,0xe3},
260 {0,0x9b},{0,0xfd},{0,0xe2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
263 /* 0 1 2 3 4 5 6 7 */
264 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
266 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
269 /* F1 F2 F3 F4 F5 F6 F7 F8 */
270 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
271 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
274 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
275 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
280 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
281 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
285 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
286 {0,0x00},{0,0x00},{0,0x99},{0,0xfa},{0,0xe8},{0,0xee},{0,0xf9},{0,0xf2},
289 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
290 /* :* ;+ ,< - .> /? */
291 {0,0x38},{0,0x39},{0,0x99},{0,0xfa},{0,0xe8},{0,0xee},{0,0xf9},{0,0xf2},
294 {0,0xde},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
295 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
298 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
300 {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xf1},{0,0xed},{0,0x00},
303 /* _ scroll? caps? */
304 {0,0x00},{0,0x00},{0,0xfb},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
305 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
307 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
308 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
311 /* hiragana + shift */
312 uint8_t Keys4[256][2] =
315 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
317 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
320 /* SHIFT CTRL ALT PAUSE CAPS KANA */
321 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
323 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
326 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
327 {0,0x20},{1,0xfc},{1,0xfc},{0,0x00},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
328 /* DOWN PRN SCR INSERT DELETE HELP */
329 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa1},{0,0xa5},
332 /* 0 1 2 3 4 5 6 7 */
333 {0,0x86},{0,0x00},{0,0x00},{0,0x87},{0,0x89},{0,0x8a},{0,0x8b},{0,0x8c},
335 {0,0x8d},{0,0x8e},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
339 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x88},{0,0x00},{0,0x00},
340 /* H I J K L M N O */
341 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
344 /* P Q R S T U V W */
345 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
347 {0,0x00},{0,0x00},{0,0x8f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
350 /* 0 1 2 3 4 5 6 7 */
351 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
353 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
356 /* F1 F2 F3 F4 F5 F6 F7 F8 */
357 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
358 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
361 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
362 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
366 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
367 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
370 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
371 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
374 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
375 /* :* ;+ ,< - .> /? */
376 {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0xa4},{0,0x00},{0,0xa1},{0,0x00},
379 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
380 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
382 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
384 {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
387 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
388 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
390 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
391 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
395 uint8_t Keys5[256][2] =
398 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
399 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
402 /* SHIFT CTRL ALT PAUSE CAPS KANA */
403 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
405 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
408 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
409 {0,0x20},{0,0xfe},{0,0xfe},{0,0x00},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
410 /* DOWN PRN SCR INSERT DELETE HELP */
411 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
414 /* 0 1 2 3 4 5 6 7 */
415 {0,0xdc},{0,0xc7},{0,0xcc},{0,0xb1},{0,0xb3},{0,0xb4},{0,0xb5},{0,0xd4},
417 {0,0xd5},{0,0xd6},{0,0xb9},{0,0xda},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
421 {0,0x00},{0,0xc1},{0,0xba},{0,0xbf},{0,0xbc},{0,0xb2},{0,0xca},{0,0xb7},
422 /* H I J K L M N O */
423 {0,0xb8},{0,0xc6},{0,0xcf},{0,0xc9},{0,0xd8},{0,0xd3},{0,0xd0},{0,0xd7},
426 /* P Q R S T U V W */
427 {0,0xbe},{0,0xc0},{0,0xbd},{0,0xc4},{0,0xb6},{0,0xc5},{0,0xcb},{0,0xc3},
429 {0,0xbb},{0,0xdd},{0,0xc2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
432 /* 0 1 2 3 4 5 6 7 */
433 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
435 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
438 /* F1 F2 F3 F4 F5 F6 F7 F8 */
439 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
440 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
443 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
444 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
448 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
449 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
452 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
453 {0,0x00},{0,0x00},{0,0xb9},{0,0xda},{0,0xc8},{0,0xce},{0,0xd9},{0,0xd2},
456 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
457 /* :* ;+ ,< - .> /? */
458 {0,0x38},{0,0x39},{0,0xb9},{0,0xda},{0,0xc8},{0,0xce},{0,0xd9},{0,0xd2},
461 {0,0xde},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
462 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
465 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
467 {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xd1},{0,0xcd},{0,0x00},
471 {0,0x00},{0,0x00},{0,0xdb},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
472 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
474 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
475 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
478 /* katakana + shift */
479 uint8_t Keys6[256][2] =
482 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
483 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
485 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
486 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
488 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
489 {0,0x20},{1,0xfc},{1,0xfc},{0,0x00},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
490 /* DOWN PRN SCR INSERT DELETE HELP */
491 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa1},{0,0xa5},
494 /* 0 1 2 3 4 5 6 7 */
495 {0,0xa6},{0,0x00},{0,0x00},{0,0xa7},{0,0xa9},{0,0xaa},{0,0xab},{0,0xac},
497 {0,0xad},{0,0xae},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
501 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa8},{0,0x00},{0,0x00},
502 /* H I J K L M N O */
503 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
506 /* P Q R S T U V W */
507 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
509 {0,0x00},{0,0x00},{0,0xaf},{0,0xa2},{0,0xb0},{0,0xa3},{0,0x00},{0,0x00},
512 /* 0 1 2 3 4 5 6 7 */
513 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
515 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
518 /* F1 F2 F3 F4 F5 F6 F7 F8 */
519 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
520 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
523 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
524 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
527 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
528 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
531 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
532 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
535 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
536 /* :* ;+ ,< - .> /? */
537 {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0xa4},{0,0x00},{0,0xa1},{1,0x00},
540 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
541 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
544 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
546 {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
550 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
551 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
554 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
555 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
559 uint8_t Keys7[256][2] =
562 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
563 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
566 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
567 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
570 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
571 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x1f},{1,0x17},{1,0x1d},{1,0x80},
574 {1,0x0f},{1,0x07},{1,0x01},{1,0x02},{1,0x03},{1,0x04},{1,0x05},{1,0x06},
575 {1,0x0d},{1,0x0e},{1,0x81},{1,0x82},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
579 {1,0x83},{0,0x00},{1,0x1b},{1,0x1a},{1,0x14},{1,0x18},{1,0x15},{1,0x13},
580 /* H I J K L M N O */
581 {1,0x0a},{1,0x16},{0,0x00},{0,0x00},{1,0x1e},{1,0x0b},{0,0x00},{0,0x00},
584 {1,0x10},{0,0x00},{1,0x12},{1,0x0c},{1,0x19},{0,0x00},{1,0x11},{0,0x00},
585 {1,0x1c},{1,0x08},{0,0x00},{1,0x84},{1,0x09},{1,0x85},{0,0x00},{0,0x00},
588 {0,0x00},{0,0x00},{1,0x1b},{1,0x1a},{1,0x14},{1,0x18},{1,0x15},{1,0x13},
589 {1,0x0a},{1,0x16},{0,0x00},{0,0x00},{1,0x1e},{1,0x0b},{0,0x00},{0,0x00},
592 /* F1 F2 F3 F4 F5 F6 F7 F8 */
593 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
594 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
597 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
598 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
602 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
603 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
606 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
607 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{1,0x17},{0,0x2e},{0,0x2f},
610 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
611 /* :* ;+ ,< - .> /? */
612 {0,0x38},{0,0x39},{0,0x81},{0,0x82},{1,0x1f},{1,0x17},{1,0x1d},{0,0x80},
615 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
616 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{1,0x17},{0,0x00},{0,0x00},
619 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
621 {0,0x00},{0,0x00},{0,0x00},{0,0x84},{1,0x09},{0,0x85},{0,0x00},{0,0x00},
625 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
626 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
629 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
630 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
633 void PSUB::update_keyboard()
635 for (int code=0; code < 256; code++) {
636 if (key_stat[code] & 0x80) {
637 if (code == VK_LSHIFT || code == VK_LCONTROL || code == VK_LMENU ||
638 code == VK_RSHIFT || code == VK_RCONTROL || code == VK_RMENU) continue;
639 if (code == VK_SHIFT || code == VK_CONTROL) continue;
641 if (code == 0x75) {kanaMode = -1 * (kanaMode-1);continue;} // VK_F6
642 if (code == 0x76) {katakana = -1 * (katakana-1);continue;} // VK_F7
643 if (code == 0x77) {kbFlagGraph = -1 * (kbFlagGraph-1);continue;} // VK_F8
649 } else if (kanaMode) {
651 if (stick0 & STICK0_SHIFT) Keys = Keys6[code];
652 else Keys = Keys5[code];
653 } else if (stick0 & STICK0_SHIFT) {
658 } else if (stick0 & STICK0_SHIFT) {
664 /* control key + alphabet key */
665 if ((kbFlagCtrl == 1) && (code >= 0x41) && (code <= 0x5a)) ascii = code - 0x41 + 1;
667 if (!kanaMode && (ascii>0xef && ascii<0xfa)) kbFlagFunc=1;
668 d_pio->write_signal(SIG_I8255_PORT_A, ascii, 0xff);
673 bool PSUB::play_tape(const _TCHAR* file_path)
677 if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
678 int data, remain = sizeof(CasData);
680 if(check_file_extension(file_path, _T(".p6t"))) {
681 // get info block offset
682 fio->Fseek(-4, FILEIO_SEEK_END);
683 int length = fio->FgetInt32();
685 fio->Fseek(length, FILEIO_SEEK_SET);
686 char id_p = fio->Fgetc();
687 char id_6 = fio->Fgetc();
688 uint8_t ver = fio->FgetUint8();
689 if(id_p == 'P' && id_6 == '6' && ver == 2) {
690 uint8_t blocks = fio->FgetUint8();
695 uint16_t cmd = fio->FgetUint16();
696 fio->Fseek(cmd, FILEIO_SEEK_CUR);
697 uint16_t exp = fio->FgetUint16();
698 fio->Fseek(exp, FILEIO_SEEK_CUR);
699 // check 1st data block
700 char id_t = fio->Fgetc();
701 char id_i = fio->Fgetc();
702 if(id_t == 'T' && id_i == 'I') {
704 fio->Fseek(16, FILEIO_SEEK_CUR);
705 FileBaud = (int)fio->FgetUint16();
708 remain = min(length, (int)sizeof(CasData));
711 fio->Fseek(0, FILEIO_SEEK_SET);
713 while((data = fio->Fgetc()) != EOF && remain > 0) {
714 CasData[CasLength++] = data;
719 if(CasMode == CAS_LOADING /*&& CasBaud == FileBaud*/) {
720 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
728 bool PSUB::rec_tape(const _TCHAR* file_path)
732 if(fio->Fopen(file_path, FILEIO_READ_WRITE_NEW_BINARY)) {
733 my_tcscpy_s(rec_file_path, _MAX_PATH, file_path);
736 is_wav = check_file_extension(file_path, _T(".wav"));
737 is_p6t = check_file_extension(file_path, _T(".p6t"));
742 static const uint8_t pulse_1200hz[40] = {
743 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
744 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
745 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
746 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
749 static const uint8_t pulse_2400hz[20] = {
750 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
751 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
754 static const uint8_t pulse_2400hz_x2[40] = {
755 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
756 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
757 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
758 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
761 void PSUB::close_tape()
763 if(fio->IsOpened()) {
766 wav_header_t wav_header;
767 wav_chunk_t wav_chunk;
768 int sample_rate = (CasBaud == 600) ? 24000 : 48000;
770 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
771 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
773 for(int i = 0; i < 9600; i++) {
774 fio->Fwrite((void *)pulse_2400hz, sizeof(pulse_2400hz), 1);
776 for(int i = 0; i < 16; i++) {
777 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
778 for(int j = 0; j < 8; j++) {
779 if(CasData[i] & (1 << j)) {
780 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
782 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
785 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
786 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
787 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
789 // for(int i = 0; i < 1280; i++) {
790 for(int i = 0; i < 2400; i++) {
791 fio->Fwrite((void *)pulse_2400hz, sizeof(pulse_2400hz), 1);
793 for(int i = 16; i < CasIndex; i++) {
794 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
795 for(int j = 0; j < 8; j++) {
796 if(CasData[i] & (1 << j)) {
797 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
799 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
802 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
803 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
804 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
807 for(int i = 0; i < 16; i++) {
808 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
809 for(int j = 0; j < 8; j++) {
810 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
812 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
813 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
814 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
817 uint32_t length = fio->Ftell();
819 pair_t __riff_chunk_size;
820 pair_t __fmt_chunk_size;
821 pair_t __wav_chunk_size;
824 pair_t __sample_rate;
825 pair16_t __block_size;
826 pair16_t __sample_bits;
828 __riff_chunk_size.d = length - 8;
829 __fmt_chunk_size.d = 16;
832 __sample_rate.d = sample_rate;
836 memcpy(wav_header.riff_chunk.id, "RIFF", 4);
837 wav_header.riff_chunk.size = __riff_chunk_size.get_4bytes_le_to();
839 memcpy(wav_header.wave, "WAVE", 4);
840 memcpy(wav_header.fmt_chunk.id, "fmt ", 4);
841 wav_header.fmt_chunk.size = __riff_chunk_size.get_4bytes_le_to();
842 wav_header.format_id = __fmt_id.get_2bytes_le_to();
843 wav_header.channels = __channels.get_2byte_le_to();
844 wav_header.sample_rate = __sample_rate.get_4bytes_le_to();
845 wav_header.data_speed = __sample_rate.get_4bytes_le_to();
846 wav_header.block_size = __block_size.get_2bytes_le_to();
847 wav_header.sample_bits = __sample_bits_get_2bytes_le_to();
849 memcpy(wav_chunk.id, "data", 4);
850 __wav_chunk_size.d = length - sizeof(wav_header) - sizeof(wav_chunk);
851 wav_chunk.size = __wav_chunk_size.get_4bytes_le_to();
853 fio->Fseek(0, FILEIO_SEEK_SET);
854 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
855 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
857 if(set_wav_header(&wav_header, &wav_chunk, 1, sample_rate, 8, length)) {
858 fio->Fseek(0, FILEIO_SEEK_SET);
859 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
860 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
864 fio->Fwrite(CasData, CasIndex, 1);
879 for(int i = 0; i < 6; i++) {
880 fio->FputUint8(CasData[10 + i]);
882 for(int i = 6; i < 16; i++) {
885 fio->FputUint16(CasBaud);
886 fio->FputUint16(3000);
887 fio->FputUint16(4000);
894 for(int i = 0; i < 16; i++) {
897 fio->FputUint16(CasBaud);
899 fio->FputUint16(1000);
901 fio->FputUint32(CasIndex - 16);
903 fio->FputUint32(CasIndex);
912 void PSUB::initialize()
917 // key_stat = emu->get_key_buffer();
918 memset(key_stat, 0, sizeof(key_stat));
926 // register event to update the key status
927 register_frame_event(this);
943 CasBaud=FileBaud=1200;
944 memset(CasData, 0, 0x10000);
952 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
957 void PSUB::event_frame()
959 if (key_stat[VK_CONTROL] & 0x80) kbFlagCtrl=1;
962 if (key_stat[VK_SPACE]) stick0 |= STICK0_SPACE;
963 if (key_stat[VK_LEFT]) stick0 |= STICK0_LEFT;
964 if (key_stat[VK_RIGHT]) stick0 |= STICK0_RIGHT;
965 if (key_stat[VK_DOWN]) stick0 |= STICK0_DOWN;
966 if (key_stat[VK_UP]) stick0 |= STICK0_UP;
967 if (key_stat[VK_F9]) stick0 |= STICK0_STOP;
968 if (key_stat[VK_SHIFT]) stick0 |= STICK0_SHIFT;
970 if (p6key) d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
972 if(CasSkipFlag != 0) {
973 request_skip_frames();
978 void PSUB::event_callback(int event_id, int err)
980 if(event_id == EVENT_CASSETTE) {
981 if(CasMode == CAS_LOADING) {
982 if(play && CasIndex < CasLength) {
984 CasRecv = CasData[CasIndex++];
985 if(CasIndex < CasLength) {
987 register_event(this, EVENT_CASSETTE, 1000000.0, false, NULL);
989 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
991 emu->out_message(_T("CMT: Play (%d %%)"), 100 * CasIndex / CasLength);
993 emu->out_message(_T("CMT: Stop (End-of-Tape)"));
995 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
998 } else if(event_id == EVENT_STRIG) {
1001 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
1005 uint32_t PSUB::get_intr_ack()
1007 if (CasMode != CAS_NONE && p6key == 0xFA && kbFlagGraph) {
1008 return(INTADDR_CMTSTOP); /* Press STOP while CMT Load or Save */
1009 } else if (StrigIntFlag) { /* if command 6 */
1011 return(INTADDR_STRIG);
1012 } else if (p6key) { /* if any key pressed */
1014 if (kbFlagGraph || kbFlagFunc) {
1016 return(INTADDR_KEY2); /* special key (graphic key, etc.) */
1018 return(INTADDR_KEY1); /* normal key */
1020 } else if (CasIntFlag) {
1022 return(INTADDR_CMTREAD);
1024 return(INTADDR_TIMER);
1027 void PSUB::write_io8(uint32_t addr, uint32_t data)
1029 uint16_t port=(addr & 0x00ff);
1031 if (CasMode == CAS_SAVEBYTE) { /* CMT SAVE */
1032 if (CasIndex<0x10000) {
1033 CasData[CasIndex++]=data;
1038 else if(data==0x06) {
1039 if(StrigEventID != -1) {
1040 cancel_event(this, StrigEventID);
1043 // register_event(this, EVENT_STRIG, 3000, false, &StrigEventID); // 3msec
1044 register_event(this, EVENT_STRIG, 100, false, &StrigEventID); // 0.1nsec
1046 else if (data==0x3e || data==0x3d) { //
\82P
\81|
\82P
\81j0x3E
\8eó
\90M(1200baud
\81j
\81@
\82Ü
\82½
\82Í
\81@0x3D
\8eó
\90M(600baud
\81j
1048 CasBaud=(data==0x3e)?1200:600;
1050 else if (data==0x39) { ///
1053 else if (data==0x38) { /* CMT SAVE DATA */
1054 CasMode=CAS_SAVEBYTE;
1056 else if (data==0x1e || data==0x1d) { //
\82P
\81|
\82P
\81j0x1E
\8eó
\90M(1200baud
\81j
\81@
\82Ü
\82½
\82Í
\81@0x1D
\8eó
\90M(600baud
\81j
1058 CasBaud=(data==0x1e)?1200:600;
1060 else if (data==0x1a && CasMode!=CAS_NONE) { /* CMT LOAD STOP */
1063 /* CMT LOAD OPEN(0x1E,0x19(1200baud)/0x1D,0x19(600baud)) */
1064 else if (data==0x19) {
1065 if(play /*&& CasBaud == FileBaud*/) {
1066 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
1069 CasMode=CAS_LOADING;
1072 d_pio->write_io8(addr, data);
1075 uint32_t PSUB::read_io8(uint32_t addr)
1077 uint16_t port=(addr & 0x00ff);
1080 if (CasMode == CAS_LOADING) {
1084 } else if (StrigIntFlag==-1) {
1088 Value = (d_pio->read_io8(addr));
1094 void PSUB::key_down(int code)
1096 key_stat[code] = 0x80;
1099 void PSUB::key_up(int code)
1101 key_stat[code] = 0x00;
1104 #define STATE_VERSION 1
1106 bool PSUB::process_state(FILEIO* state_fio, bool loading)
1108 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
1111 if(!state_fio->StateCheckInt32(this_device_id)) {
1118 state_fio->StateBool(play);
1119 state_fio->StateBool(rec);
1120 state_fio->StateBool(is_wav);
1121 state_fio->StateBool(is_p6t);
1122 state_fio->StateBuffer(rec_file_path, sizeof(rec_file_path), 1);
1124 int length_tmp = state_fio->FgetInt32_LE();
1126 fio->Fopen(rec_file_path, FILEIO_READ_WRITE_NEW_BINARY);
1127 while(length_tmp != 0) {
1128 uint8_t buffer_tmp[1024];
1129 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
1130 state_fio->Fread(buffer_tmp, length_rw, 1);
1131 if(fio->IsOpened()) {
1132 fio->Fwrite(buffer_tmp, length_rw, 1);
1134 length_tmp -= length_rw;
1138 if(rec && fio->IsOpened()) {
1139 int length_tmp = (int)fio->Ftell();
1140 fio->Fseek(0, FILEIO_SEEK_SET);
1141 state_fio->FputInt32_LE(length_tmp);
1142 while(length_tmp != 0) {
1143 uint8_t buffer_tmp[1024];
1144 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
1145 fio->Fread(buffer_tmp, length_rw, 1);
1146 state_fio->Fwrite(buffer_tmp, length_rw, 1);
1147 length_tmp -= length_rw;
1150 state_fio->FputInt32_LE(0);
1153 state_fio->StateInt32(CasIntFlag);
1154 state_fio->StateInt32(CasIndex);
1155 state_fio->StateInt32(CasRecv);
1156 state_fio->StateInt32(CasMode);
1157 state_fio->StateInt32(CasBaud);
1158 state_fio->StateInt32(FileBaud);
1159 state_fio->StateBuffer(CasData, sizeof(CasData), 1);
1160 state_fio->StateInt32(CasLength);
1161 state_fio->StateInt32(CasSkipFlag);
1162 state_fio->StateInt32(kbFlagFunc);
1163 state_fio->StateInt32(kbFlagGraph);
1164 state_fio->StateInt32(kbFlagCtrl);
1165 state_fio->StateInt32(kanaMode);
1166 state_fio->StateInt32(katakana);
1167 state_fio->StateInt32(p6key);
1168 state_fio->StateInt32(stick0);
1169 state_fio->StateInt32(StrigIntFlag);
1170 state_fio->StateInt32(StrigEventID);