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'
17 #include "../../fileio.h"
19 #define STICK0_SPACE 0x80
20 #define STICK0_LEFT 0x20
21 #define STICK0_RIGHT 0x10
22 #define STICK0_DOWN 0x08
23 #define STICK0_UP 0x04
24 #define STICK0_STOP 0x02
25 #define STICK0_SHIFT 0x01
27 #define INTADDR_KEY1 0x02
28 #define INTADDR_TIMER 0x06
29 #define INTADDR_CMTREAD 0x08
30 #define INTADDR_CMTSTOP 0x0E
31 #define INTADDR_CMTERR 0x12
32 #define INTADDR_KEY2 0x14
33 #define INTADDR_STRIG 0x16
34 #define INTADDR_TVR 0x18 // TV RESERVE-DATA Read Interrupt
35 #define INTADDR_DATE 0x1A // DATE-DATA Read Interrupt
38 #define CAS_SAVEBYTE 1
40 #define CAS_LOADBYTE 3
42 #define EVENT_CASSETTE 0
45 /* normal (small alphabet) */
51 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
53 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
56 /* SHIFT CTRL ALT PAUSE CAPS KANA */
57 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
59 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
62 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
63 {0,0x20},{0,0xfe},{0,0xfe},{0,0xfe},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
64 /* DOWN PRN SCR INSERT DELETE HELP */
65 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
69 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
71 {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
75 {0,0x00},{0,0x61},{0,0x62},{0,0x63},{0,0x64},{0,0x65},{0,0x66},{0,0x67},
77 {0,0x68},{0,0x69},{0,0x6a},{0,0x6b},{0,0x6c},{0,0x6d},{0,0x6e},{0,0x6f},
81 {0,0x70},{0,0x71},{0,0x72},{0,0x73},{0,0x74},{0,0x75},{0,0x76},{0,0x77},
83 {0,0x78},{0,0x79},{0,0x7a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
87 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
89 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
92 /* F1 F2 F3 F4 F5 F6 F7 F8 */
93 {1,0xf0},{1,0xf1},{1,0xf2},{1,0xf3},{1,0xf4},{1,0x00},{0,0x00},{1,0xfd},
94 /* F9 F10 F11 F12 F13 F14 F15 F16 */
95 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
98 /* F17 F18 F19 F20 F21 F22 F23 F24 */
99 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
100 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
104 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
105 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
109 {0,0x00},{0,0x00},{0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
111 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
115 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
116 /* :* ;+ ,< - .> /? */
117 {0,0x00},{0,0x00},{0,0x3A},{0,0x3b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
121 {0,0x40},{1,0x00},{1,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x00},{0,0x00},
122 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
125 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
127 {0,0x00},{0,0x00},{0,0x00},{0,0x5b},{0,0x5c},{0,0x5d},{0,0x5e},{0,0x00},
131 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
132 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
134 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xba},{0,0xbb},
135 {0,0xbc},{0,0xbd},{0,0xbe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
138 /* normal (small alphabet) + shift */
142 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
144 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
147 /* SHIFT CTRL ALT PAUSE CAPS KANA */
148 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
150 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
153 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
154 {0,0x20},{1,0xfc},{1,0xfc},{0,0xfc},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
155 /* DOWN PRN SCR INSERT DELETE HELP */
156 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
159 /* 0 1 2 3 4 5 6 7 */
160 {0,0x00},{0,0x21},{0,0x22},{0,0x23},{0,0x24},{0,0x25},{0,0x26},{0,0x27},
162 {0,0x28},{0,0x29},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
166 {0,0x40},{0,0x41},{0,0x42},{0,0x43},{0,0x44},{0,0x45},{0,0x46},{0,0x47},
167 /* H I J K L M N O */
168 {0,0x48},{0,0x49},{0,0x4a},{0,0x4b},{0,0x4c},{0,0x4d},{0,0x4e},{0,0x4f},
171 /* P Q R S T U V W */
172 {0,0x50},{0,0x51},{0,0x52},{0,0x53},{0,0x54},{0,0x55},{0,0x56},{0,0x57},
174 {0,0x58},{0,0x59},{0,0x5a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
177 /* 0 1 2 3 4 5 6 7 */
178 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
180 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
183 /* F1 F2 F3 F4 F5 F6 F7 F8 */
184 {1,0xf5},{1,0xf6},{1,0xf7},{1,0xf8},{1,0xf9},{1,0x00},{0,0x00},{1,0xfd},
185 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
188 /* F17 F18 F19 F20 F21 F22 F23 F24 */
189 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
190 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
194 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
195 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
199 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
200 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
203 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
204 /* :* ;+ ,< - .> /? */
205 {0,0x38},{0,0x39},{0,0x2A},{0,0x2b},{0,0x3c},{0,0x3d},{0,0x3e},{0,0x3f},
208 {0,0x00},{1,0x00},{1,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x00},{0,0x00},
209 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
212 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
214 {0,0x00},{0,0x00},{0,0x00},{0,0x7B},{0,0x7C},{0,0x7D},{0,0x00},{0,0x00},
218 {0,0x00},{0,0x00},{0,0x5f},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
219 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
221 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xba},{0,0xbb},
222 {0,0xbc},{0,0xbd},{0,0xbe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
229 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
231 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
234 /* SHIFT CTRL ALT PAUSE CAPS KANA */
235 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
237 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
240 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
241 {0,0x20},{0,0xfe},{0,0xfe},{0,0x00},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
242 /* DOWN PRN SCR INSERT DELETE HELP */
243 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0xe8},{0,0x12},{0,0x08},{0,0xf2},
246 /* 0 1 2 3 4 5 6 7 */
247 {0,0xfc},{0,0xe7},{0,0xec},{0,0x91},{0,0x93},{0,0x94},{0,0x95},{0,0xf4},
249 {0,0xf5},{0,0xf6},{0,0x99},{0,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
253 {0,0x00},{0,0xe1},{0,0x9a},{0,0x9f},{0,0x9c},{0,0x92},{0,0xea},{0,0x97},
254 /* H I J K L M N O */
255 {0,0x98},{0,0xe6},{0,0xef},{0,0xe9},{0,0xf8},{0,0xf3},{0,0xf0},{0,0xf7},
258 /* P Q R S T U V W */
259 {0,0x9e},{0,0xe0},{0,0x9d},{0,0xe4},{0,0x96},{0,0xe5},{0,0xeb},{0,0xe3},
261 {0,0x9b},{0,0xfd},{0,0xe2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
264 /* 0 1 2 3 4 5 6 7 */
265 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
267 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
270 /* F1 F2 F3 F4 F5 F6 F7 F8 */
271 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
272 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
275 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
276 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
281 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
282 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
286 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
287 {0,0x00},{0,0x00},{0,0x99},{0,0xfa},{0,0xe8},{0,0xee},{0,0xf9},{0,0xf2},
290 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
291 /* :* ;+ ,< - .> /? */
292 {0,0x38},{0,0x39},{0,0x99},{0,0xfa},{0,0xe8},{0,0xee},{0,0xf9},{0,0xf2},
295 {0,0xde},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
296 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
299 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
301 {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xf1},{0,0xed},{0,0x00},
304 /* _ scroll? caps? */
305 {0,0x00},{0,0x00},{0,0xfb},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
306 {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,0x00},
309 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
312 /* hiragana + shift */
316 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
318 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
321 /* SHIFT CTRL ALT PAUSE CAPS KANA */
322 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
324 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
327 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
328 {0,0x20},{1,0xfc},{1,0xfc},{0,0x00},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
329 /* DOWN PRN SCR INSERT DELETE HELP */
330 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa1},{0,0xa5},
333 /* 0 1 2 3 4 5 6 7 */
334 {0,0x86},{0,0x00},{0,0x00},{0,0x87},{0,0x89},{0,0x8a},{0,0x8b},{0,0x8c},
336 {0,0x8d},{0,0x8e},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
340 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x88},{0,0x00},{0,0x00},
341 /* H I J K L M N O */
342 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
345 /* P Q R S T U V W */
346 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
348 {0,0x00},{0,0x00},{0,0x8f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
351 /* 0 1 2 3 4 5 6 7 */
352 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
354 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
357 /* F1 F2 F3 F4 F5 F6 F7 F8 */
358 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
359 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
362 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
363 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
367 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
368 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
371 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
372 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
375 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
376 /* :* ;+ ,< - .> /? */
377 {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0xa4},{0,0x00},{0,0xa1},{0,0x00},
380 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
381 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
383 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
385 {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
388 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
389 {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,0x00},
392 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
399 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
400 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
403 /* SHIFT CTRL ALT PAUSE CAPS KANA */
404 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
406 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
409 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
410 {0,0x20},{0,0xfe},{0,0xfe},{0,0x00},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
411 /* DOWN PRN SCR INSERT DELETE HELP */
412 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
415 /* 0 1 2 3 4 5 6 7 */
416 {0,0xdc},{0,0xc7},{0,0xcc},{0,0xb1},{0,0xb3},{0,0xb4},{0,0xb5},{0,0xd4},
418 {0,0xd5},{0,0xd6},{0,0xb9},{0,0xda},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
422 {0,0x00},{0,0xc1},{0,0xba},{0,0xbf},{0,0xbc},{0,0xb2},{0,0xca},{0,0xb7},
423 /* H I J K L M N O */
424 {0,0xb8},{0,0xc6},{0,0xcf},{0,0xc9},{0,0xd8},{0,0xd3},{0,0xd0},{0,0xd7},
427 /* P Q R S T U V W */
428 {0,0xbe},{0,0xc0},{0,0xbd},{0,0xc4},{0,0xb6},{0,0xc5},{0,0xcb},{0,0xc3},
430 {0,0xbb},{0,0xdd},{0,0xc2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
433 /* 0 1 2 3 4 5 6 7 */
434 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
436 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
439 /* F1 F2 F3 F4 F5 F6 F7 F8 */
440 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
441 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
444 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
445 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
449 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
450 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
453 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
454 {0,0x00},{0,0x00},{0,0xb9},{0,0xda},{0,0xc8},{0,0xce},{0,0xd9},{0,0xd2},
457 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
458 /* :* ;+ ,< - .> /? */
459 {0,0x38},{0,0x39},{0,0xb9},{0,0xda},{0,0xc8},{0,0xce},{0,0xd9},{0,0xd2},
462 {0,0xde},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
463 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
466 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
468 {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xd1},{0,0xcd},{0,0x00},
472 {0,0x00},{0,0x00},{0,0xdb},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
473 {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,0x00},
476 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
479 /* katakana + shift */
483 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
484 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
486 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
487 {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
489 /* SPC PAGE UP PAGE DOWN END HOME LEFT UP RIGHT */
490 {0,0x20},{1,0xfc},{1,0xfc},{0,0x00},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
491 /* DOWN PRN SCR INSERT DELETE HELP */
492 {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa1},{0,0xa5},
495 /* 0 1 2 3 4 5 6 7 */
496 {0,0xa6},{0,0x00},{0,0x00},{0,0xa7},{0,0xa9},{0,0xaa},{0,0xab},{0,0xac},
498 {0,0xad},{0,0xae},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
502 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa8},{0,0x00},{0,0x00},
503 /* H I J K L M N O */
504 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
507 /* P Q R S T U V W */
508 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
510 {0,0x00},{0,0x00},{0,0xaf},{0,0xa2},{0,0xb0},{0,0xa3},{0,0x00},{0,0x00},
513 /* 0 1 2 3 4 5 6 7 */
514 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
516 {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
519 /* F1 F2 F3 F4 F5 F6 F7 F8 */
520 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
521 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
524 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
525 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
528 {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
529 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
532 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
533 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
536 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
537 /* :* ;+ ,< - .> /? */
538 {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0xa4},{0,0x00},{0,0xa1},{1,0x00},
541 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
542 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
545 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
547 {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
551 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
552 {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,0x00},
556 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
563 {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
564 {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
567 {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
568 {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},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
572 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x1f},{1,0x17},{1,0x1d},{1,0x80},
575 {1,0x0f},{1,0x07},{1,0x01},{1,0x02},{1,0x03},{1,0x04},{1,0x05},{1,0x06},
576 {1,0x0d},{1,0x0e},{1,0x81},{1,0x82},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
580 {1,0x83},{0,0x00},{1,0x1b},{1,0x1a},{1,0x14},{1,0x18},{1,0x15},{1,0x13},
581 /* H I J K L M N O */
582 {1,0x0a},{1,0x16},{0,0x00},{0,0x00},{1,0x1e},{1,0x0b},{0,0x00},{0,0x00},
585 {1,0x10},{0,0x00},{1,0x12},{1,0x0c},{1,0x19},{0,0x00},{1,0x11},{0,0x00},
586 {1,0x1c},{1,0x08},{0,0x00},{1,0x84},{1,0x09},{1,0x85},{0,0x00},{0,0x00},
589 {0,0x00},{0,0x00},{1,0x1b},{1,0x1a},{1,0x14},{1,0x18},{1,0x15},{1,0x13},
590 {1,0x0a},{1,0x16},{0,0x00},{0,0x00},{1,0x1e},{1,0x0b},{0,0x00},{0,0x00},
593 /* F1 F2 F3 F4 F5 F6 F7 F8 */
594 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
595 {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
598 {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
599 {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
603 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
604 {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
607 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
608 {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{1,0x17},{0,0x2e},{0,0x2f},
611 {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
612 /* :* ;+ ,< - .> /? */
613 {0,0x38},{0,0x39},{0,0x81},{0,0x82},{1,0x1f},{1,0x17},{1,0x1d},{0,0x80},
616 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
617 {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{1,0x17},{0,0x00},{0,0x00},
620 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
622 {0,0x00},{0,0x00},{0,0x00},{0,0x84},{1,0x09},{0,0x85},{0,0x00},{0,0x00},
626 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
627 {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,0x00},
631 {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
634 void PSUB::update_keyboard()
636 for (int code=0; code < 256; code++) {
637 if (key_stat[code] & 0x80) {
638 if (code == VK_SHIFT || code == VK_CONTROL) continue;
640 if (code == 0x75) {kanaMode = -1 * (kanaMode-1);continue;} // VK_F6
641 if (code == 0x76) {katakana = -1 * (katakana-1);continue;} // VK_F7
642 if (code == 0x77) {kbFlagGraph = -1 * (kbFlagGraph-1);continue;} // VK_F8
648 } else if (kanaMode) {
650 if (stick0 & STICK0_SHIFT) Keys = Keys6[code];
651 else Keys = Keys5[code];
652 } else if (stick0 & STICK0_SHIFT) {
657 } else if (stick0 & STICK0_SHIFT) {
663 /* control key + alphabet key */
664 if ((kbFlagCtrl == 1) && (code >= 0x41) && (code <= 0x5a)) ascii = code - 0x41 + 1;
666 if (!kanaMode && (ascii>0xef && ascii<0xfa)) kbFlagFunc=1;
667 d_pio->write_signal(SIG_I8255_PORT_A, ascii, 0xff);
672 bool PSUB::play_tape(_TCHAR* file_path)
676 if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
677 int data, remain = sizeof(CasData);
679 if(check_file_extension(file_path, _T(".p6t"))) {
680 // get info block offset
681 fio->Fseek(-4, FILEIO_SEEK_END);
682 int length = fio->FgetInt32();
684 fio->Fseek(length, FILEIO_SEEK_SET);
685 char id_p = fio->Fgetc();
686 char id_6 = fio->Fgetc();
687 uint8 ver = fio->FgetUint8();
688 if(id_p == 'P' && id_6 == '6' && ver == 2) {
689 uint8 blocks = fio->FgetUint8();
694 uint16 cmd = fio->FgetUint16();
695 fio->Fseek(cmd, FILEIO_SEEK_CUR);
696 uint16 exp = fio->FgetUint16();
697 fio->Fseek(exp, FILEIO_SEEK_CUR);
698 // check 1st data block
699 char id_t = fio->Fgetc();
700 char id_i = fio->Fgetc();
701 if(id_t == 'T' && id_i == 'I') {
703 fio->Fseek(16, FILEIO_SEEK_CUR);
704 FileBaud = (int)fio->FgetUint16();
707 remain = min(length, sizeof(CasData));
710 fio->Fseek(0, FILEIO_SEEK_SET);
712 while((data = fio->Fgetc()) != EOF && remain > 0) {
713 CasData[CasLength++] = data;
718 if(CasMode == CAS_LOADING /*&& CasBaud == FileBaud*/) {
719 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
727 bool PSUB::rec_tape(_TCHAR* file_path)
731 if(fio->Fopen(file_path, FILEIO_READ_WRITE_NEW_BINARY)) {
732 _tcscpy_s(rec_file_path, _MAX_PATH, file_path);
735 is_wav = check_file_extension(file_path, _T(".wav"));
736 is_p6t = check_file_extension(file_path, _T(".p6t"));
750 wav_chunk_t riff_chunk;
752 wav_chunk_t fmt_chunk;
762 static const uint8 pulse_1200hz[40] = {
763 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
764 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
765 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
766 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
769 static const uint8 pulse_2400hz[20] = {
770 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
771 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
774 static const uint8 pulse_2400hz_x2[40] = {
775 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
776 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
777 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
778 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
781 void PSUB::close_tape()
783 if(fio->IsOpened()) {
786 wav_header_t wav_header;
787 wav_chunk_t wav_chunk;
788 int sample_rate = (CasBaud == 600) ? 24000 : 48000;
790 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
791 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
793 for(int i = 0; i < 9600; i++) {
794 fio->Fwrite((void *)pulse_2400hz, sizeof(pulse_2400hz), 1);
796 for(int i = 0; i < 16; i++) {
797 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
798 for(int j = 0; j < 8; j++) {
799 if(CasData[i] & (1 << j)) {
800 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
802 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
805 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
806 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
807 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
809 // for(int i = 0; i < 1280; i++) {
810 for(int i = 0; i < 2400; i++) {
811 fio->Fwrite((void *)pulse_2400hz, sizeof(pulse_2400hz), 1);
813 for(int i = 16; i < CasIndex; i++) {
814 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
815 for(int j = 0; j < 8; j++) {
816 if(CasData[i] & (1 << j)) {
817 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
819 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
822 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
823 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
824 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
827 for(int i = 0; i < 16; i++) {
828 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
829 for(int j = 0; j < 8; j++) {
830 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
832 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
833 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
834 fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
837 uint32 length = fio->Ftell();
839 memcpy(wav_header.riff_chunk.id, "RIFF", 4);
840 wav_header.riff_chunk.size = length - 8;
841 memcpy(wav_header.wave, "WAVE", 4);
842 memcpy(wav_header.fmt_chunk.id, "fmt ", 4);
843 wav_header.fmt_chunk.size = 16;
844 wav_header.format_id = 1;
845 wav_header.channels = 1;
846 wav_header.sample_rate = sample_rate;
847 wav_header.data_speed = sample_rate;
848 wav_header.block_size = 1;
849 wav_header.sample_bits = 8;
851 memcpy(wav_chunk.id, "data", 4);
852 wav_chunk.size = length - sizeof(wav_header) - sizeof(wav_chunk);
854 fio->Fseek(0, FILEIO_SEEK_SET);
855 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
856 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
858 fio->Fwrite(CasData, CasIndex, 1);
873 for(int i = 0; i < 6; i++) {
874 fio->FputUint8(CasData[10 + i]);
876 for(int i = 6; i < 16; i++) {
879 fio->FputUint16(CasBaud);
880 fio->FputUint16(3000);
881 fio->FputUint16(4000);
888 for(int i = 0; i < 16; i++) {
891 fio->FputUint16(CasBaud);
893 fio->FputUint16(1000);
895 fio->FputUint32(CasIndex - 16);
897 fio->FputUint32(CasIndex);
906 void PSUB::initialize()
911 key_stat = emu->key_buffer();
918 // register event to update the key status
919 register_frame_event(this);
935 CasBaud=FileBaud=1200;
936 memset(CasData, 0, 0x10000);
944 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
949 void PSUB::event_frame()
951 if (key_stat[VK_CONTROL] & 0x80) kbFlagCtrl=1;
954 if (key_stat[VK_SPACE]) stick0 |= STICK0_SPACE;
955 if (key_stat[VK_LEFT]) stick0 |= STICK0_LEFT;
956 if (key_stat[VK_RIGHT]) stick0 |= STICK0_RIGHT;
957 if (key_stat[VK_DOWN]) stick0 |= STICK0_DOWN;
958 if (key_stat[VK_UP]) stick0 |= STICK0_UP;
959 if (key_stat[VK_F9]) stick0 |= STICK0_STOP;
960 if (key_stat[VK_SHIFT]) stick0 |= STICK0_SHIFT;
962 if (p6key) d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
964 if(CasSkipFlag != 0) {
965 request_skip_frames();
970 void PSUB::event_callback(int event_id, int err)
972 if(event_id == EVENT_CASSETTE) {
973 if(CasMode == CAS_LOADING) {
974 if(play && CasIndex < CasLength) {
976 CasRecv = CasData[CasIndex++];
977 if(CasIndex < CasLength) {
979 register_event(this, EVENT_CASSETTE, 1000000.0, false, NULL);
981 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
983 emu->out_message(_T("CMT: Play (%d %%)"), 100 * CasIndex / CasLength);
985 emu->out_message(_T("CMT: Stop (End-of-Tape)"));
987 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
990 } else if(event_id == EVENT_STRIG) {
993 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
997 uint32 PSUB::intr_ack()
999 if (CasMode != CAS_NONE && p6key == 0xFA && kbFlagGraph) {
1000 return(INTADDR_CMTSTOP); /* Press STOP while CMT Load or Save */
1001 } else if (StrigIntFlag) { /* if command 6 */
1003 return(INTADDR_STRIG);
1004 } else if (p6key) { /* if any key pressed */
1006 if (kbFlagGraph || kbFlagFunc) {
1008 return(INTADDR_KEY2); /* special key (graphic key, etc.) */
1010 return(INTADDR_KEY1); /* normal key */
1012 } else if (CasIntFlag) {
1014 return(INTADDR_CMTREAD);
1016 return(INTADDR_TIMER);
1019 void PSUB::write_io8(uint32 addr, uint32 data)
1021 uint16 port=(addr & 0x00ff);
1023 if (CasMode == CAS_SAVEBYTE) { /* CMT SAVE */
1024 if (CasIndex<0x10000) {
1025 CasData[CasIndex++]=data;
1030 else if(data==0x06) {
1031 if(StrigEventID != -1) {
1032 cancel_event(this, StrigEventID);
1035 // register_event(this, EVENT_STRIG, 3000, false, &StrigEventID); // 3msec
1036 register_event(this, EVENT_STRIG, 100, false, &StrigEventID); // 0.1nsec
1038 else if (data==0x3e || data==0x3d) { //
\82P
\81|
\82P
\81j0x3E
\8eó
\90M(1200baud
\81j
\81@
\82Ü
\82½
\82Í
\81@0x3D
\8eó
\90M(600baud
\81j
1040 CasBaud=(data==0x3e)?1200:600;
1042 else if (data==0x39) { ///
1045 else if (data==0x38) { /* CMT SAVE DATA */
1046 CasMode=CAS_SAVEBYTE;
1048 else if (data==0x1e || data==0x1d) { //
\82P
\81|
\82P
\81j0x1E
\8eó
\90M(1200baud
\81j
\81@
\82Ü
\82½
\82Í
\81@0x1D
\8eó
\90M(600baud
\81j
1050 CasBaud=(data==0x1e)?1200:600;
1052 else if (data==0x1a && CasMode!=CAS_NONE) { /* CMT LOAD STOP */
1055 /* CMT LOAD OPEN(0x1E,0x19(1200baud)/0x1D,0x19(600baud)) */
1056 else if (data==0x19) {
1057 if(play /*&& CasBaud == FileBaud*/) {
1058 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
1061 CasMode=CAS_LOADING;
1064 d_pio->write_io8(addr, data);
1067 uint32 PSUB::read_io8(uint32 addr)
1069 uint16 port=(addr & 0x00ff);
1072 if (CasMode == CAS_LOADING) {
1076 } else if (StrigIntFlag==-1) {
1080 Value = (d_pio->read_io8(addr));
1086 #define STATE_VERSION 1
1088 void PSUB::save_state(FILEIO* state_fio)
1090 state_fio->FputUint32(STATE_VERSION);
1091 state_fio->FputInt32(this_device_id);
1093 state_fio->FputBool(play);
1094 state_fio->FputBool(rec);
1095 state_fio->FputBool(is_wav);
1096 state_fio->FputBool(is_p6t);
1097 state_fio->Fwrite(rec_file_path, sizeof(rec_file_path), 1);
1098 if(rec && fio->IsOpened()) {
1099 int length_tmp = (int)fio->Ftell();
1100 fio->Fseek(0, FILEIO_SEEK_SET);
1101 state_fio->FputInt32(length_tmp);
1102 while(length_tmp != 0) {
1103 uint8 buffer_tmp[1024];
1104 int length_rw = min(length_tmp, sizeof(buffer_tmp));
1105 fio->Fread(buffer_tmp, length_rw, 1);
1106 state_fio->Fwrite(buffer_tmp, length_rw, 1);
1107 length_tmp -= length_rw;
1110 state_fio->FputInt32(0);
1112 state_fio->FputInt32(CasIntFlag);
1113 state_fio->FputInt32(CasIndex);
1114 state_fio->FputInt32(CasRecv);
1115 state_fio->FputInt32(CasMode);
1116 state_fio->FputInt32(CasBaud);
1117 state_fio->FputInt32(FileBaud);
1118 state_fio->Fwrite(CasData, sizeof(CasData), 1);
1119 state_fio->FputInt32(CasLength);
1120 state_fio->FputInt32(CasSkipFlag);
1121 state_fio->FputInt32(kbFlagFunc);
1122 state_fio->FputInt32(kbFlagGraph);
1123 state_fio->FputInt32(kbFlagCtrl);
1124 state_fio->FputInt32(kanaMode);
1125 state_fio->FputInt32(katakana);
1126 state_fio->FputInt32(p6key);
1127 state_fio->FputInt32(stick0);
1128 state_fio->FputInt32(StrigIntFlag);
1129 state_fio->FputInt32(StrigEventID);
1132 bool PSUB::load_state(FILEIO* state_fio)
1136 if(state_fio->FgetUint32() != STATE_VERSION) {
1139 if(state_fio->FgetInt32() != this_device_id) {
1142 play = state_fio->FgetBool();
1143 rec = state_fio->FgetBool();
1144 is_wav = state_fio->FgetBool();
1145 is_p6t = state_fio->FgetBool();
1146 state_fio->Fread(rec_file_path, sizeof(rec_file_path), 1);
1147 int length_tmp = state_fio->FgetInt32();
1149 fio->Fopen(rec_file_path, FILEIO_READ_WRITE_NEW_BINARY);
1150 while(length_tmp != 0) {
1151 uint8 buffer_tmp[1024];
1152 int length_rw = min(length_tmp, sizeof(buffer_tmp));
1153 state_fio->Fread(buffer_tmp, length_rw, 1);
1154 if(fio->IsOpened()) {
1155 fio->Fwrite(buffer_tmp, length_rw, 1);
1157 length_tmp -= length_rw;
1160 CasIntFlag = state_fio->FgetInt32();
1161 CasIndex = state_fio->FgetInt32();
1162 CasRecv = state_fio->FgetInt32();
1163 CasMode = state_fio->FgetInt32();
1164 CasBaud = state_fio->FgetInt32();
1165 FileBaud = state_fio->FgetInt32();
1166 state_fio->Fread(CasData, sizeof(CasData), 1);
1167 CasLength = state_fio->FgetInt32();
1168 CasSkipFlag = state_fio->FgetInt32();
1169 kbFlagFunc = state_fio->FgetInt32();
1170 kbFlagGraph = state_fio->FgetInt32();
1171 kbFlagCtrl = state_fio->FgetInt32();
1172 kanaMode = state_fio->FgetInt32();
1173 katakana = state_fio->FgetInt32();
1174 p6key = state_fio->FgetInt32();
1175 stick0 = state_fio->FgetInt32();
1176 StrigIntFlag = state_fio->FgetInt32();
1177 StrigEventID = state_fio->FgetInt32();