OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc6001 / psub.cpp
1 /*
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'
7
8         Author : tanam
9         Date   : 2013.07.15-
10
11         [ pseudo sub cpu ]
12 */
13
14 #include "psub.h"
15 #include "timer.h"
16 #include "../i8255.h"
17
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
25
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
35
36 #define CAS_NONE                                0
37 #define CAS_SAVEBYTE                    1
38 #define CAS_LOADING                             2
39 #define CAS_LOADBYTE                    3
40
41 #define EVENT_CASSETTE  0
42 #define EVENT_STRIG     1
43
44 namespace PC6001 {
45
46 /* normal (small alphabet) */
47 uint8_t Keys1[256][2] =
48 {
49 /* 0       1         2        3        4        5        6        7 */
50 /* 00 */
51   /* */
52   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
53   /* BS      TAB                                ENTER                  */
54   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
55
56 /* 10 */
57   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
58   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
59   /*                           ESC                                     */
60   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
61
62 /* 20 */
63   /* SPC    PAGE UP PAGE DOWN    END    HOME      LEFT    UP      RIGHT */
64   {0,0x20},{0,0xfe},{0,0xfe},{0,0xfe},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
65   /* DOWN                              PRN SCR   INSERT   DELETE  HELP  */
66   {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
67
68 /* 30 */
69   /* 0        1         2        3        4       5          6       7  */
70   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
71   /* 8        9                                                         */
72   {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
73
74 /* 40 */
75   /*          A         B        C        D       E         F       G   */
76   {0,0x00},{0,0x61},{0,0x62},{0,0x63},{0,0x64},{0,0x65},{0,0x66},{0,0x67},
77   /*   H      I         J        K        L       M         N       O   */
78   {0,0x68},{0,0x69},{0,0x6a},{0,0x6b},{0,0x6c},{0,0x6d},{0,0x6e},{0,0x6f},
79
80 /* 50 */
81   /*  P       Q         R        S        T       U         V       W   */
82   {0,0x70},{0,0x71},{0,0x72},{0,0x73},{0,0x74},{0,0x75},{0,0x76},{0,0x77},
83   /*  X       Y         Z        */
84   {0,0x78},{0,0x79},{0,0x7a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
85
86 /* 60   10key*/
87   /*  0       1         2        3        4       5         6       7   */
88   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
89   /*  8       9         *        +                -         .       /   */
90   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
91
92 /* 70 */
93   /* F1       F2       F3        F4      F5       F6       F7       F8  */
94   {1,0xf0},{1,0xf1},{1,0xf2},{1,0xf3},{1,0xf4},{1,0x00},{0,0x00},{1,0xfd},
95   /* F9       F10      F11       F12     F13      F14      F15      F16 */
96   {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
97
98 /* 80 */
99   /* F17      F18      F19       F20     F21      F22      F23      F24 */
100   {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
101   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
102
103 /* 90 */
104   /* NUM     SCROLL                                                     */
105   {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
106   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
107
108 /* A0 */
109   /*                       SCROLL LOCK                                  */
110   {0,0x00},{0,0x00},{0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
111   /*                    *       +        ,         -        .        /  */
112   {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
113
114 /* B0 */
115   /*                                                                    */
116   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
117   /*                    :*       ;+       ,<       -        .>      /?  */
118   {0,0x00},{0,0x00},{0,0x3A},{0,0x3b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
119
120 /* C0 */
121   /*  @                                                                 */
122   {0,0x40},{1,0x00},{1,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x00},{0,0x00},
123   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
124
125 /* D0 */
126   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
127   /*                            [{        \|        ]}      ^           */
128   {0,0x00},{0,0x00},{0,0x00},{0,0x5b},{0,0x5c},{0,0x5d},{0,0x5e},{0,0x00},
129
130 /* E0 */
131   /*                     _                                              */
132   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
133   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
134 /* F0 */
135   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xba},{0,0xbb},
136   {0,0xbc},{0,0xbd},{0,0xbe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
137 };
138
139 /* normal (small alphabet) + shift */
140 uint8_t Keys2[256][2] =
141 {
142 /* 00 */
143   {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
144   /* BS      TAB                                ENTER                  */
145   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
146
147 /* 10 */
148   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
149   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
150   /*                           ESC                                     */
151   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
152
153 /* 20 */
154   /* SPC    PAGE UP PAGE DOWN    END    HOME      LEFT    UP      RIGHT */
155   {0,0x20},{1,0xfc},{1,0xfc},{0,0xfc},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
156   /* DOWN                              PRN SCR   INSERT   DELETE  HELP  */
157   {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
158
159 /* 30 */
160   /* 0        1         2        3        4       5          6       7  */
161   {0,0x00},{0,0x21},{0,0x22},{0,0x23},{0,0x24},{0,0x25},{0,0x26},{0,0x27},
162   /* 8        9                                                         */
163   {0,0x28},{0,0x29},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
164
165 /* 40 */
166   /*          A         B        C        D       E         F       G   */
167   {0,0x40},{0,0x41},{0,0x42},{0,0x43},{0,0x44},{0,0x45},{0,0x46},{0,0x47},
168   /*   H      I         J        K        L       M         N       O   */
169   {0,0x48},{0,0x49},{0,0x4a},{0,0x4b},{0,0x4c},{0,0x4d},{0,0x4e},{0,0x4f},
170
171 /* 50 */
172   /*  P       Q         R        S        T       U         V       W   */
173   {0,0x50},{0,0x51},{0,0x52},{0,0x53},{0,0x54},{0,0x55},{0,0x56},{0,0x57},
174   /*  X       Y         Z        */
175   {0,0x58},{0,0x59},{0,0x5a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
176
177 /* 60  10 key */
178   /*  0       1         2        3        4       5         6       7   */
179   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
180   /*  8       9         *        +                -         .       /   */
181   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
182
183 /* 70 */
184   /* F1       F2       F3        F4      F5       F6       F7       F8  */
185   {1,0xf5},{1,0xf6},{1,0xf7},{1,0xf8},{1,0xf9},{1,0x00},{0,0x00},{1,0xfd},
186   {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
187
188 /* 80 */
189   /* F17      F18      F19       F20     F21      F22      F23      F24 */
190   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
191   {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
192
193 /* 90 */
194   /* NUM     SCROLL                                                     */
195   {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
196   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
197
198 /* A0 */
199   /*                       SCROLL LOCK                                  */
200   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
201   {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
202
203 /* B0 */
204   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
205   /*                    :*       ;+       ,<       -        .>      /?  */
206   {0,0x38},{0,0x39},{0,0x2A},{0,0x2b},{0,0x3c},{0,0x3d},{0,0x3e},{0,0x3f},
207
208 /* C0 */
209   {0,0x00},{1,0x00},{1,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x00},{0,0x00},
210   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
211
212 /* D0 */
213   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
214   /*                            [{        \|        ]}      ^           */
215   {0,0x00},{0,0x00},{0,0x00},{0,0x7B},{0,0x7C},{0,0x7D},{0,0x00},{0,0x00},
216
217 /* E0 */
218   /*                     _                                              */
219   {0,0x00},{0,0x00},{0,0x5f},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
220   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
221 /* F0 */
222   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xba},{0,0xbb},
223   {0,0xbc},{0,0xbd},{0,0xbe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
224 };
225
226 /* hiragana */
227 uint8_t Keys3[256][2] =
228 {
229 /* 00 */
230   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
231   /* BS      TAB                                ENTER                  */
232   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
233
234 /* 10 */
235   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
236   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
237   /*                           ESC                                     */
238   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
239
240 /* 20 */
241   /* SPC    PAGE UP PAGE DOWN    END    HOME      LEFT    UP      RIGHT */
242   {0,0x20},{0,0xfe},{0,0xfe},{0,0x00},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
243   /* DOWN                              PRN SCR   INSERT   DELETE  HELP  */
244   {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0xe8},{0,0x12},{0,0x08},{0,0xf2},
245
246 /* 30 */
247   /* 0        1         2        3        4       5          6       7  */
248   {0,0xfc},{0,0xe7},{0,0xec},{0,0x91},{0,0x93},{0,0x94},{0,0x95},{0,0xf4},
249   /* 8        9                                                         */
250   {0,0xf5},{0,0xf6},{0,0x99},{0,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
251
252 /* 40 */
253   /*          A         B        C        D       E         F       G   */
254   {0,0x00},{0,0xe1},{0,0x9a},{0,0x9f},{0,0x9c},{0,0x92},{0,0xea},{0,0x97},
255   /*   H      I         J        K        L       M         N       O   */
256   {0,0x98},{0,0xe6},{0,0xef},{0,0xe9},{0,0xf8},{0,0xf3},{0,0xf0},{0,0xf7},
257
258 /* 50 */
259   /*  P       Q         R        S        T       U         V       W   */
260   {0,0x9e},{0,0xe0},{0,0x9d},{0,0xe4},{0,0x96},{0,0xe5},{0,0xeb},{0,0xe3},
261   /*  X       Y         Z        */
262   {0,0x9b},{0,0xfd},{0,0xe2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
263
264 /* 60  10 key */
265   /*  0       1         2        3        4       5         6       7   */
266   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
267   /*  8       9         *        +                -         .       /   */
268   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
269
270 /* 70 */
271   /* F1       F2       F3        F4      F5       F6       F7       F8  */
272   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
273   {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
274
275 /* 80 */
276   {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
277   {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
278
279
280 /* 90 */
281   /* NUM     SCROLL                                                     */
282   {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
283   {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
284
285 /* A0 */
286   /*                       SCROLL LOCK                                  */
287   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
288   {0,0x00},{0,0x00},{0,0x99},{0,0xfa},{0,0xe8},{0,0xee},{0,0xf9},{0,0xf2},
289
290 /* B0 */
291   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
292   /*                    :*       ;+       ,<       -        .>      /?  */
293   {0,0x38},{0,0x39},{0,0x99},{0,0xfa},{0,0xe8},{0,0xee},{0,0xf9},{0,0xf2},
294
295 /* C0 */
296   {0,0xde},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
297   {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
298
299 /* D0 */
300   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
301   /*                            [{        \|        ]}      ^           */
302   {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xf1},{0,0xed},{0,0x00},
303
304 /* E0 */
305   /*                    _              scroll?    caps? */
306   {0,0x00},{0,0x00},{0,0xfb},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
307   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
308 /* F0 */
309   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
310   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
311 };
312
313 /* hiragana + shift */
314 uint8_t Keys4[256][2] =
315 {
316 /* 00 */
317   {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
318   /* BS      TAB                                ENTER                  */
319   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
320
321 /* 10 */
322   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
323   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
324   /*                           ESC                                     */
325   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
326
327 /* 20 */
328   /* SPC    PAGE UP PAGE DOWN    END    HOME      LEFT    UP      RIGHT */
329   {0,0x20},{1,0xfc},{1,0xfc},{0,0x00},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
330   /* DOWN                              PRN SCR   INSERT   DELETE  HELP  */
331   {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa1},{0,0xa5},
332
333 /* 30 */
334   /* 0        1         2        3        4       5          6       7  */
335   {0,0x86},{0,0x00},{0,0x00},{0,0x87},{0,0x89},{0,0x8a},{0,0x8b},{0,0x8c},
336   /* 8        9                                                         */
337   {0,0x8d},{0,0x8e},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
338
339 /* 40 */
340   /*          A         B        C        D       E         F       G   */
341   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x88},{0,0x00},{0,0x00},
342   /*   H      I         J        K        L       M         N       O   */
343   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
344
345 /* 50 */
346   /*  P       Q         R        S        T       U         V       W   */
347   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
348   /*  X       Y         Z        */
349   {0,0x00},{0,0x00},{0,0x8f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
350
351 /* 60  10 key*/
352   /*  0       1         2        3        4       5         6       7   */
353   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
354   /*  8       9         *        +                -         .       /   */
355   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
356
357 /* 70 */
358   /* F1       F2       F3        F4      F5       F6       F7       F8  */
359   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
360   {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
361
362 /* 80 */
363   {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
364   {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
365
366 /* 90 */
367   /* NUM     SCROLL                                                     */
368   {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
369   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
370
371 /* A0 */
372   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
373   {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
374
375 /* B0 */
376   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
377   /*                    :*       ;+       ,<       -        .>      /?  */
378   {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0xa4},{0,0x00},{0,0xa1},{0,0x00},
379
380 /* C0 */
381   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
382   {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
383 /* D0 */
384   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
385   /*                            [{        \|        ]}      ^           */
386   {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
387 /* E0 */
388   /*                     _                                              */
389   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
390   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
391 /* F0 */
392   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
393   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
394 };
395
396 /* katakana */
397 uint8_t Keys5[256][2] =
398 {
399 /* 00 */
400   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
401   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
402
403 /* 10 */
404   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
405   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
406   /*                           ESC                                     */
407   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
408
409 /* 20 */
410   /* SPC    PAGE UP PAGE DOWN    END    HOME      LEFT    UP      RIGHT */
411   {0,0x20},{0,0xfe},{0,0xfe},{0,0x00},{0,0x0c},{0,0x1d},{0,0x1e},{0,0x1c},
412   /* DOWN                              PRN SCR   INSERT   DELETE  HELP  */
413   {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x12},{0,0x08},{0,0x00},
414
415 /* 30 */
416   /* 0        1         2        3        4       5          6       7  */
417   {0,0xdc},{0,0xc7},{0,0xcc},{0,0xb1},{0,0xb3},{0,0xb4},{0,0xb5},{0,0xd4},
418   /* 8        9                                                         */
419   {0,0xd5},{0,0xd6},{0,0xb9},{0,0xda},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
420
421 /* 40 */
422   /*          A         B        C        D       E         F       G   */
423   {0,0x00},{0,0xc1},{0,0xba},{0,0xbf},{0,0xbc},{0,0xb2},{0,0xca},{0,0xb7},
424   /*   H      I         J        K        L       M         N       O   */
425   {0,0xb8},{0,0xc6},{0,0xcf},{0,0xc9},{0,0xd8},{0,0xd3},{0,0xd0},{0,0xd7},
426
427 /* 50 */
428   /*  P       Q         R        S        T       U         V       W   */
429   {0,0xbe},{0,0xc0},{0,0xbd},{0,0xc4},{0,0xb6},{0,0xc5},{0,0xcb},{0,0xc3},
430   /*  X       Y         Z        */
431   {0,0xbb},{0,0xdd},{0,0xc2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
432
433 /* 60  10 key*/
434   /*  0       1         2        3        4       5         6       7   */
435   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
436   /*  8       9         *        +                -         .       /   */
437   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
438
439 /* 70 */
440   /* F1       F2       F3        F4      F5       F6       F7       F8  */
441   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
442   {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
443
444 /* 80 */
445   {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
446   {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
447
448 /* 90 */
449   /* NUM     SCROLL                                                     */
450   {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
451   {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
452
453 /* A0 */
454   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
455   {0,0x00},{0,0x00},{0,0xb9},{0,0xda},{0,0xc8},{0,0xce},{0,0xd9},{0,0xd2},
456
457 /* B0 */
458   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
459   /*                    :*       ;+       ,<       -        .>      /?  */
460   {0,0x38},{0,0x39},{0,0xb9},{0,0xda},{0,0xc8},{0,0xce},{0,0xd9},{0,0xd2},
461
462 /* C0 */
463   {0,0xde},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
464   {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
465
466 /* D0 */
467   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
468   /*                            [{        \|        ]}      ^           */
469   {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xd1},{0,0xcd},{0,0x00},
470
471 /* E0 */
472   /*                     _                                              */
473   {0,0x00},{0,0x00},{0,0xdb},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
474   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
475 /* F0 */
476   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
477   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
478 };
479
480 /* katakana + shift */
481 uint8_t Keys6[256][2] =
482 {
483 /* 00 */
484   {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
485   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
486 /* 10 */
487   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
488   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
489 /* 20 */
490   /* SPC    PAGE UP PAGE DOWN    END    HOME      LEFT    UP      RIGHT */
491   {0,0x20},{1,0xfc},{1,0xfc},{0,0x00},{0,0x0b},{0,0x1d},{0,0x1e},{0,0x1c},
492   /* DOWN                              PRN SCR   INSERT   DELETE  HELP  */
493   {0,0x1f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa1},{0,0xa5},
494
495 /* 30 */
496   /* 0        1         2        3        4       5          6       7  */
497   {0,0xa6},{0,0x00},{0,0x00},{0,0xa7},{0,0xa9},{0,0xaa},{0,0xab},{0,0xac},
498   /* 8        9                                                         */
499   {0,0xad},{0,0xae},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
500
501 /* 40 */
502   /*          A         B        C        D       E         F       G   */
503   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0xa8},{0,0x00},{0,0x00},
504   /*   H      I         J        K        L       M         N       O   */
505   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
506
507 /* 50 */
508   /*  P       Q         R        S        T       U         V       W   */
509   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
510   /*  X       Y         Z        */
511   {0,0x00},{0,0x00},{0,0xaf},{0,0xa2},{0,0xb0},{0,0xa3},{0,0x00},{0,0x00},
512
513 /* 60 */
514   /*  0       1         2        3        4       5         6       7   */
515   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
516   /*  8       9         *        +                -         .       /   */
517   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
518
519 /* 70 */
520   /* F1       F2       F3        F4      F5       F6       F7       F8  */
521   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
522   {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
523
524 /* 80 */
525   {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
526   {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
527
528 /* 90 */
529   {0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
530   {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
531
532 /* A0 */
533   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
534   {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
535
536 /* B0 */
537   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
538   /*                    :*       ;+       ,<       -        .>      /?  */
539   {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0xa4},{0,0x00},{0,0xa1},{1,0x00},
540
541 /* C0 */
542   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfd},{0,0x00},
543   {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
544
545 /* D0 */
546   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
547   /*                            [{        \|        ]}      ^           */
548   {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
549
550 /* E0 */
551   /*                     _                                              */
552   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
553   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
554
555 /* F0 */
556   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
557   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
558 };
559
560 /* with graph key */
561 uint8_t Keys7[256][2] =
562 {
563 /* 00 */
564   {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
565   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
566
567 /* 10 */
568   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
569   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
570
571 /* 20 */
572   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
573   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0x1f},{1,0x17},{1,0x1d},{1,0x80},
574
575 /* 30 */
576   {1,0x0f},{1,0x07},{1,0x01},{1,0x02},{1,0x03},{1,0x04},{1,0x05},{1,0x06},
577   {1,0x0d},{1,0x0e},{1,0x81},{1,0x82},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
578
579 /* 40 */
580   /*          A         B        C        D       E         F       G   */
581   {1,0x83},{0,0x00},{1,0x1b},{1,0x1a},{1,0x14},{1,0x18},{1,0x15},{1,0x13},
582   /*   H      I         J        K        L       M         N       O   */
583   {1,0x0a},{1,0x16},{0,0x00},{0,0x00},{1,0x1e},{1,0x0b},{0,0x00},{0,0x00},
584
585 /* 50 */
586   {1,0x10},{0,0x00},{1,0x12},{1,0x0c},{1,0x19},{0,0x00},{1,0x11},{0,0x00},
587   {1,0x1c},{1,0x08},{0,0x00},{1,0x84},{1,0x09},{1,0x85},{0,0x00},{0,0x00},
588
589 /* 60 */
590   {0,0x00},{0,0x00},{1,0x1b},{1,0x1a},{1,0x14},{1,0x18},{1,0x15},{1,0x13},
591   {1,0x0a},{1,0x16},{0,0x00},{0,0x00},{1,0x1e},{1,0x0b},{0,0x00},{0,0x00},
592
593 /* 70 */
594   /* F1       F2       F3        F4      F5       F6       F7       F8  */
595   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
596   {0,0x03},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
597
598 /* 80 */
599   {0,0x20},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
600   {0,0x00},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
601
602 /* 90 */
603   /* NUM     SCROLL                                                     */
604   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x37},{0,0x34},{0,0x38},
605   {0,0x36},{0,0x32},{0,0x39},{0,0x33},{0,0x31},{0,0x35},{0,0x30},{0,0x2e},
606
607 /* A0 */
608   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
609   {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{1,0x17},{0,0x2e},{0,0x2f},
610
611 /* B0 */
612   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
613   /*                    :*       ;+       ,<       -        .>      /?  */
614   {0,0x38},{0,0x39},{0,0x81},{0,0x82},{1,0x1f},{1,0x17},{1,0x1d},{0,0x80},
615
616 /* C0 */
617   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
618   {0,0x00},{0,0x00},{0,0x12},{0,0x00},{0,0x00},{1,0x17},{0,0x00},{0,0x00},
619
620 /* D0 */
621   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
622   /*                            [{        \|        ]}      ^           */
623   {0,0x00},{0,0x00},{0,0x00},{0,0x84},{1,0x09},{0,0x85},{0,0x00},{0,0x00},
624
625 /* E0 */
626   /*                     _                                              */
627   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{1,0xfe},{1,0xfb},{0,0x00},{0,0x00},
628   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
629
630 /* F0 */
631   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
632   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x7f},
633 };
634
635 void PSUB::update_keyboard()
636 {
637         for (int code=0; code < 256; code++) {
638                 if (key_stat[code] & 0x80) {
639                         if (code == VK_LSHIFT || code == VK_LCONTROL || code == VK_LMENU ||
640                             code == VK_RSHIFT || code == VK_RCONTROL || code == VK_RMENU) continue;
641                         if (code == VK_SHIFT || code == VK_CONTROL) continue;
642                         key_stat[code]=0;
643                         if (code == 0x75) {kanaMode = -1 * (kanaMode-1);continue;} // VK_F6
644                         if (code == 0x76) {katakana = -1 * (katakana-1);continue;} // VK_F7
645                         if (code == 0x77) {kbFlagGraph = -1 * (kbFlagGraph-1);continue;} // VK_F8
646                         p6key=code;
647                         uint8_t *Keys;
648                         uint8_t ascii=0;
649                         if (kbFlagGraph) {
650                                 Keys = Keys7[code];
651                         } else if (kanaMode) {
652                                 if (katakana) {
653                                         if (stick0 & STICK0_SHIFT) Keys = Keys6[code];
654                                         else Keys = Keys5[code];
655                                 } else if (stick0 & STICK0_SHIFT) { 
656                                         Keys = Keys4[code];
657                                 } else {
658                                         Keys = Keys3[code];
659                                 }
660                         } else if (stick0 & STICK0_SHIFT) { 
661                                 Keys = Keys2[code];
662                         } else { 
663                                 Keys = Keys1[code];
664                         }
665                         ascii = Keys[1];
666                         /* control key + alphabet key */
667                         if ((kbFlagCtrl == 1) && (code >= 0x41) && (code <= 0x5a)) ascii = code - 0x41 + 1;
668                         /* function key */
669                         if (!kanaMode && (ascii>0xef && ascii<0xfa)) kbFlagFunc=1;
670                         d_pio->write_signal(SIG_I8255_PORT_A, ascii, 0xff);
671                 }
672         }
673 }
674
675 bool PSUB::play_tape(const _TCHAR* file_path)
676 {
677         close_tape();
678         
679         if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
680                 int data, remain = sizeof(CasData);
681                 FileBaud = 1200;
682                 if(check_file_extension(file_path, _T(".p6t"))) {
683                         // get info block offset
684                         fio->Fseek(-4, FILEIO_SEEK_END);
685                         int length = fio->FgetInt32();
686                         // check info block
687                         fio->Fseek(length, FILEIO_SEEK_SET);
688                         char id_p = fio->Fgetc();
689                         char id_6 = fio->Fgetc();
690                         uint8_t ver = fio->FgetUint8();
691                         if(id_p == 'P' && id_6 == '6' && ver == 2) {
692                                 uint8_t blocks = fio->FgetUint8();
693                                 if(blocks >= 1) {
694                                         fio->FgetUint8();
695                                         fio->FgetUint8();
696                                         fio->FgetUint8();
697                                         uint16_t cmd = fio->FgetUint16();
698                                         fio->Fseek(cmd, FILEIO_SEEK_CUR);
699                                         uint16_t exp = fio->FgetUint16();
700                                         fio->Fseek(exp, FILEIO_SEEK_CUR);
701                                         // check 1st data block
702                                         char id_t = fio->Fgetc();
703                                         char id_i = fio->Fgetc();
704                                         if(id_t == 'T' && id_i == 'I') {
705                                                 fio->FgetUint8();
706                                                 fio->Fseek(16, FILEIO_SEEK_CUR);
707                                                 FileBaud = (int)fio->FgetUint16();
708                                         }
709                                 }
710                                 remain = min(length, (int)sizeof(CasData));
711                         }
712                 }
713                 fio->Fseek(0, FILEIO_SEEK_SET);
714                 CasLength = 0;
715                 while((data = fio->Fgetc()) != EOF && remain > 0) {
716                         CasData[CasLength++] = data;
717                         remain--;
718                 }
719                 fio->Fclose();
720                 
721                 if(CasMode == CAS_LOADING /*&& CasBaud == FileBaud*/) {
722                         register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
723                 }
724                 CasIndex=0;
725                 play = true;
726         }
727         return play;
728 }
729
730 bool PSUB::rec_tape(const _TCHAR* file_path)
731 {
732         close_tape();
733         
734         if(fio->Fopen(file_path, FILEIO_READ_WRITE_NEW_BINARY)) {
735                 my_tcscpy_s(rec_file_path, _MAX_PATH, file_path);
736                 CasIndex=0;
737                 rec = true;
738                 is_wav = check_file_extension(file_path, _T(".wav"));
739                 is_p6t = check_file_extension(file_path, _T(".p6t"));
740         }
741         return rec;
742 }
743
744 static const uint8_t pulse_1200hz[40] = {
745         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
746         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
747         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
748         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
749 };
750
751 static const uint8_t pulse_2400hz[20] = {
752         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
753         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
754 };
755
756 static const uint8_t pulse_2400hz_x2[40] = {
757         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
758         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
759         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
760         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
761 };
762
763 void PSUB::close_tape()
764 {
765         if(fio->IsOpened()) {
766                 if(rec) {
767                         if(is_wav) {
768                                 wav_header_t wav_header;
769                                 wav_chunk_t wav_chunk;
770                                 int sample_rate = (CasBaud == 600) ? 24000 : 48000;
771                                 
772                                 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
773                                 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
774                                 
775                                 for(int i = 0; i < 9600; i++) {
776                                         fio->Fwrite((void *)pulse_2400hz, sizeof(pulse_2400hz), 1);
777                                 }
778                                 for(int i = 0; i < 16; i++) {
779                                         fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
780                                         for(int j = 0; j < 8; j++) {
781                                                 if(CasData[i] & (1 << j)) {
782                                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
783                                                 } else {
784                                                         fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
785                                                 }
786                                         }
787                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
788                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
789                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
790                                 }
791         //                      for(int i = 0; i < 1280; i++) {
792                                 for(int i = 0; i < 2400; i++) {
793                                         fio->Fwrite((void *)pulse_2400hz, sizeof(pulse_2400hz), 1);
794                                 }
795                                 for(int i = 16; i < CasIndex; i++) {
796                                         fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
797                                         for(int j = 0; j < 8; j++) {
798                                                 if(CasData[i] & (1 << j)) {
799                                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
800                                                 } else {
801                                                         fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
802                                                 }
803                                         }
804                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 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                                 }
808 #if 1
809                                 for(int i = 0; i < 16; i++) {
810                                         fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
811                                         for(int j = 0; j < 8; j++) {
812                                                 fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
813                                         }
814                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
815                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
816                                         fio->Fwrite((void *)pulse_2400hz_x2, sizeof(pulse_2400hz_x2), 1);
817                                 }
818 #endif
819                                 uint32_t length = fio->Ftell();
820 #if 0                           
821                                 pair_t __riff_chunk_size;
822                                 pair_t __fmt_chunk_size;
823                                 pair_t __wav_chunk_size;
824                                 pair16_t __fmt_id;
825                                 pair16_t __channels;
826                                 pair_t __sample_rate;
827                                 pair16_t __block_size;
828                                 pair16_t __sample_bits;
829
830                                 __riff_chunk_size.d = length - 8;
831                                 __fmt_chunk_size.d = 16;
832                                 __fmt_id.w = 1;
833                                 __channels.w = 1;
834                                 __sample_rate.d = sample_rate;
835                                 __block_size.w = 1;
836                                 __sample_bits.w = 8;
837         
838                                 memcpy(wav_header.riff_chunk.id, "RIFF", 4);
839                                 wav_header.riff_chunk.size = __riff_chunk_size.get_4bytes_le_to();
840         
841                                 memcpy(wav_header.wave, "WAVE", 4);
842                                 memcpy(wav_header.fmt_chunk.id, "fmt ", 4);
843                                 wav_header.fmt_chunk.size = __riff_chunk_size.get_4bytes_le_to();
844                                 wav_header.format_id = __fmt_id.get_2bytes_le_to();
845                                 wav_header.channels = __channels.get_2byte_le_to();
846                                 wav_header.sample_rate = __sample_rate.get_4bytes_le_to();
847                                 wav_header.data_speed =  __sample_rate.get_4bytes_le_to();
848                                 wav_header.block_size = __block_size.get_2bytes_le_to();
849                                 wav_header.sample_bits = __sample_bits_get_2bytes_le_to();
850         
851                                 memcpy(wav_chunk.id, "data", 4);
852                                 __wav_chunk_size.d = length - sizeof(wav_header) - sizeof(wav_chunk);
853                                 wav_chunk.size = __wav_chunk_size.get_4bytes_le_to();
854         
855                                 fio->Fseek(0, FILEIO_SEEK_SET);
856                                 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
857                                 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
858 #else
859                                 if(set_wav_header(&wav_header, &wav_chunk, 1, sample_rate, 8, length)) {
860                                         fio->Fseek(0, FILEIO_SEEK_SET);
861                                         fio->Fwrite(&wav_header, sizeof(wav_header), 1);
862                                         fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
863                                 }
864 #endif
865                         } else {
866                                 fio->Fwrite(CasData, CasIndex, 1);
867                                 if(is_p6t) {
868                                         fio->Fputc('P');
869                                         fio->Fputc('6');
870                                         fio->FputUint8(2);
871                                         fio->FputUint8(2);
872                                         fio->FputUint8(0);
873                                         fio->FputUint8(0);
874                                         fio->FputUint8(0);
875                                         fio->FputUint16(0);
876                                         fio->FputUint16(0);
877                                         
878                                         fio->Fputc('T');
879                                         fio->Fputc('I');
880                                         fio->FputUint8(0);
881                                         for(int i = 0; i < 6; i++) {
882                                                 fio->FputUint8(CasData[10 + i]);
883                                         }
884                                         for(int i = 6; i < 16; i++) {
885                                                 fio->FputUint8(0);
886                                         }
887                                         fio->FputUint16(CasBaud);
888                                         fio->FputUint16(3000);
889                                         fio->FputUint16(4000);
890                                         fio->FputUint32(0);
891                                         fio->FputUint32(16);
892                                         
893                                         fio->Fputc('T');
894                                         fio->Fputc('I');
895                                         fio->FputUint8(0);
896                                         for(int i = 0; i < 16; i++) {
897                                                 fio->FputUint8(0);
898                                         }
899                                         fio->FputUint16(CasBaud);
900                                         fio->FputUint16(0);
901                                         fio->FputUint16(1000);
902                                         fio->FputUint32(16);
903                                         fio->FputUint32(CasIndex - 16);
904                                         
905                                         fio->FputUint32(CasIndex);
906                                 }
907                         }
908                 }
909                 fio->Fclose();
910         }
911         play = rec = false;
912 }
913
914 void PSUB::initialize()
915 {
916         fio = new FILEIO();
917         play = rec = false;
918         
919 //      key_stat = emu->get_key_buffer();
920         memset(key_stat, 0, sizeof(key_stat));
921         
922         kbFlagCtrl=0;
923         kbFlagGraph=0;
924         kbFlagFunc=0;
925         kanaMode=0;
926         katakana=0;
927         
928         // register event to update the key status
929         register_frame_event(this);
930 }
931
932 void PSUB::release()
933 {
934         close_tape();
935         delete fio;
936 }
937
938 void PSUB::reset()
939 {
940         close_tape();
941         CasIntFlag=0;
942         CasIndex=0;
943         CasRecv=0xff;
944         CasMode=CAS_NONE;
945         CasBaud=FileBaud=1200;
946         memset(CasData, 0, 0x10000);
947         CasLength=0;
948         CasSkipFlag=0;
949         
950         p6key=0;
951         stick0=0;
952         StrigIntFlag=0;
953         StrigEventID=-1;
954 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
955 //      DateIntFlag=0;
956 #endif
957 }
958
959 void PSUB::event_frame()
960 {
961         if (key_stat[VK_CONTROL] & 0x80) kbFlagCtrl=1;
962         else kbFlagCtrl=0;
963         stick0 = 0;
964         if (key_stat[VK_SPACE]) stick0 |= STICK0_SPACE;
965         if (key_stat[VK_LEFT]) stick0 |= STICK0_LEFT;
966         if (key_stat[VK_RIGHT]) stick0 |= STICK0_RIGHT;
967         if (key_stat[VK_DOWN]) stick0 |= STICK0_DOWN;
968         if (key_stat[VK_UP]) stick0 |= STICK0_UP;
969         if (key_stat[VK_F9]) stick0 |= STICK0_STOP;
970         if (key_stat[VK_SHIFT]) stick0 |= STICK0_SHIFT;
971         update_keyboard();
972         if (p6key) d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
973         
974         if(CasSkipFlag != 0) {
975                 request_skip_frames();
976                 CasSkipFlag = 0;
977         }
978 }
979
980 void PSUB::event_callback(int event_id, int err)
981 {
982         if(event_id == EVENT_CASSETTE) {
983                 if(CasMode == CAS_LOADING) {
984                         if(play && CasIndex < CasLength) {
985                                 CasIntFlag = 1;
986                                 CasRecv = CasData[CasIndex++];
987                                 if(CasIndex < CasLength) {
988                                         if(CasIndex == 16) {
989                                                 register_event(this, EVENT_CASSETTE, 1000000.0, false, NULL);
990                                         } else {
991                                                 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
992                                         }
993                                         emu->out_message(_T("CMT: Play (%d %%)"), 100 * CasIndex / CasLength);
994                                 } else {
995                                         emu->out_message(_T("CMT: Stop (End-of-Tape)"));
996                                 }
997                                 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
998                         }
999                 }
1000         } else if(event_id == EVENT_STRIG) {
1001                 StrigIntFlag = 1;
1002                 StrigEventID = -1;
1003                 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
1004         }
1005 }
1006
1007 uint32_t PSUB::get_intr_ack()
1008 {
1009         if (CasMode != CAS_NONE && p6key == 0xFA && kbFlagGraph) {
1010                 return(INTADDR_CMTSTOP); /* Press STOP while CMT Load or Save */
1011         } else if (StrigIntFlag) { /* if command 6 */
1012                 StrigIntFlag=-1;
1013                 return(INTADDR_STRIG);
1014         } else if (p6key) { /* if any key pressed */
1015                 p6key = 0;
1016                 if (kbFlagGraph || kbFlagFunc) {
1017                         kbFlagFunc=0;
1018                         return(INTADDR_KEY2); /* special key (graphic key, etc.) */
1019                 } else {
1020                         return(INTADDR_KEY1); /* normal key */
1021                 }
1022         } else if (CasIntFlag) {
1023                 CasIntFlag = 0;
1024                 return(INTADDR_CMTREAD);
1025         }
1026         return(INTADDR_TIMER);
1027 }
1028
1029 void PSUB::write_io8(uint32_t addr, uint32_t data)
1030 {
1031         uint16_t port=(addr & 0x00ff);
1032         if (port == 0x90) {
1033                 if (CasMode == CAS_SAVEBYTE) {  /* CMT SAVE */
1034                         if (CasIndex<0x10000) {
1035                                 CasData[CasIndex++]=data;
1036                                 CasSkipFlag=1;
1037                         }
1038                         CasMode=CAS_NONE;
1039                 }
1040                 else if(data==0x06) {
1041                         if(StrigEventID != -1) {
1042                                 cancel_event(this, StrigEventID);
1043                                 StrigEventID = -1;
1044                         }
1045 //                      register_event(this, EVENT_STRIG, 3000, false, &StrigEventID); // 3msec
1046                         register_event(this, EVENT_STRIG, 100, false, &StrigEventID); // 0.1nsec
1047                 }
1048                 else if (data==0x3e || data==0x3d) { // \82P\81|\82P\81j0x3E \8eó\90M(1200baud\81j\81@\82Ü\82½\82Í\81@0x3D \8eó\90M(600baud\81j
1049                         CasMode=CAS_NONE;
1050                         CasBaud=(data==0x3e)?1200:600;
1051                 }
1052                 else if (data==0x39) { ///
1053                         CasMode=CAS_NONE;
1054                 }
1055                 else if (data==0x38) { /* CMT SAVE DATA */
1056                         CasMode=CAS_SAVEBYTE;
1057                 }
1058                 else if (data==0x1e || data==0x1d) { // \82P\81|\82P\81j0x1E \8eó\90M(1200baud\81j\81@\82Ü\82½\82Í\81@0x1D \8eó\90M(600baud\81j
1059                         CasMode=CAS_NONE;
1060                         CasBaud=(data==0x1e)?1200:600;
1061                 }
1062                 else if (data==0x1a && CasMode!=CAS_NONE) { /* CMT LOAD STOP */
1063                         CasMode=CAS_NONE;
1064                 }
1065                 /* CMT LOAD OPEN(0x1E,0x19(1200baud)/0x1D,0x19(600baud)) */
1066                 else if (data==0x19) {
1067                         if(play /*&& CasBaud == FileBaud*/) {
1068                                 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
1069                         }
1070                         CasRecv=0xff;
1071                         CasMode=CAS_LOADING;
1072                 }
1073         }
1074         d_pio->write_io8(addr, data);
1075 }
1076
1077 uint32_t PSUB::read_io8(uint32_t addr)
1078 {
1079         uint16_t port=(addr & 0x00ff);
1080         uint8_t Value=0xff;
1081         if (port == 0x90) {
1082                 if (CasMode == CAS_LOADING) {
1083                         Value=CasRecv;
1084                         CasRecv=0xff;
1085                         CasSkipFlag=1;
1086                 } else if (StrigIntFlag==-1) {
1087                         Value=stick0;
1088                         StrigIntFlag=0;
1089                 } else {
1090                         Value = (d_pio->read_io8(addr));
1091                 }
1092         }
1093         return Value;
1094 }
1095
1096 void PSUB::key_down(int code)
1097 {
1098         key_stat[code] = 0x80;
1099 }
1100
1101 void PSUB::key_up(int code)
1102 {
1103         key_stat[code] = 0x00;
1104 }
1105
1106 #define STATE_VERSION   1
1107
1108 bool PSUB::process_state(FILEIO* state_fio, bool loading)
1109 {
1110         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
1111                 return false;
1112         }
1113         if(!state_fio->StateCheckInt32(this_device_id)) {
1114                 return false;
1115         }
1116         // pre process
1117         if(loading) {
1118                 close_tape();
1119         }
1120         state_fio->StateBool(play);
1121         state_fio->StateBool(rec);
1122         state_fio->StateBool(is_wav);
1123         state_fio->StateBool(is_p6t);
1124         state_fio->StateBuffer(rec_file_path, sizeof(rec_file_path), 1);
1125         if(loading) {
1126                 int length_tmp = state_fio->FgetInt32_LE();
1127                 if(rec) {
1128                         fio->Fopen(rec_file_path, FILEIO_READ_WRITE_NEW_BINARY);
1129                         while(length_tmp != 0) {
1130                                 uint8_t buffer_tmp[1024];
1131                                 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
1132                                 state_fio->Fread(buffer_tmp, length_rw, 1);
1133                                 if(fio->IsOpened()) {
1134                                         fio->Fwrite(buffer_tmp, length_rw, 1);
1135                                 }
1136                                 length_tmp -= length_rw;
1137                         }
1138                 }
1139         } else {
1140                 if(rec && fio->IsOpened()) {
1141                         int length_tmp = (int)fio->Ftell();
1142                         fio->Fseek(0, FILEIO_SEEK_SET);
1143                         state_fio->FputInt32_LE(length_tmp);
1144                         while(length_tmp != 0) {
1145                                 uint8_t buffer_tmp[1024];
1146                                 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
1147                                 fio->Fread(buffer_tmp, length_rw, 1);
1148                                 state_fio->Fwrite(buffer_tmp, length_rw, 1);
1149                                 length_tmp -= length_rw;
1150                         }
1151                 } else {
1152                         state_fio->FputInt32_LE(0);
1153                 }
1154         }
1155         state_fio->StateInt32(CasIntFlag);
1156         state_fio->StateInt32(CasIndex);
1157         state_fio->StateInt32(CasRecv);
1158         state_fio->StateInt32(CasMode);
1159         state_fio->StateInt32(CasBaud);
1160         state_fio->StateInt32(FileBaud);
1161         state_fio->StateBuffer(CasData, sizeof(CasData), 1);
1162         state_fio->StateInt32(CasLength);
1163         state_fio->StateInt32(CasSkipFlag);
1164         state_fio->StateInt32(kbFlagFunc);
1165         state_fio->StateInt32(kbFlagGraph);
1166         state_fio->StateInt32(kbFlagCtrl);
1167         state_fio->StateInt32(kanaMode);
1168         state_fio->StateInt32(katakana);
1169         state_fio->StateInt32(p6key);
1170         state_fio->StateInt32(stick0);
1171         state_fio->StateInt32(StrigIntFlag);
1172         state_fio->StateInt32(StrigEventID);
1173         return true;
1174 }
1175
1176 }