OSDN Git Service

349762c220a6aabe29e0fe329665d2ab63c0c72d
[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 /* normal (small alphabet) */
45 uint8_t Keys1[256][2] =
46 {
47 /* 0       1         2        3        4        5        6        7 */
48 /* 00 */
49   /* */
50   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
51   /* BS      TAB                                ENTER                  */
52   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
53
54 /* 10 */
55   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
56   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
57   /*                           ESC                                     */
58   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
59
60 /* 20 */
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},
65
66 /* 30 */
67   /* 0        1         2        3        4       5          6       7  */
68   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
69   /* 8        9                                                         */
70   {0,0x38},{0,0x39},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
71
72 /* 40 */
73   /*          A         B        C        D       E         F       G   */
74   {0,0x00},{0,0x61},{0,0x62},{0,0x63},{0,0x64},{0,0x65},{0,0x66},{0,0x67},
75   /*   H      I         J        K        L       M         N       O   */
76   {0,0x68},{0,0x69},{0,0x6a},{0,0x6b},{0,0x6c},{0,0x6d},{0,0x6e},{0,0x6f},
77
78 /* 50 */
79   /*  P       Q         R        S        T       U         V       W   */
80   {0,0x70},{0,0x71},{0,0x72},{0,0x73},{0,0x74},{0,0x75},{0,0x76},{0,0x77},
81   /*  X       Y         Z        */
82   {0,0x78},{0,0x79},{0,0x7a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
83
84 /* 60   10key*/
85   /*  0       1         2        3        4       5         6       7   */
86   {0,0x30},{0,0x31},{0,0x32},{0,0x33},{0,0x34},{0,0x35},{0,0x36},{0,0x37},
87   /*  8       9         *        +                -         .       /   */
88   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
89
90 /* 70 */
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},
95
96 /* 80 */
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},
100
101 /* 90 */
102   /* NUM     SCROLL                                                     */
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},
105
106 /* A0 */
107   /*                       SCROLL LOCK                                  */
108   {0,0x00},{0,0x00},{0,0x00},{1,0xfe},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
109   /*                    *       +        ,         -        .        /  */
110   {0,0x00},{0,0x00},{0,0x2a},{0,0x2b},{0,0x2c},{0,0x2d},{0,0x2e},{0,0x2f},
111
112 /* B0 */
113   /*                                                                    */
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},
117
118 /* C0 */
119   /*  @                                                                 */
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},
122
123 /* D0 */
124   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
125   /*                            [{        \|        ]}      ^           */
126   {0,0x00},{0,0x00},{0,0x00},{0,0x5b},{0,0x5c},{0,0x5d},{0,0x5e},{0,0x00},
127
128 /* E0 */
129   /*                     _                                              */
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},
132 /* F0 */
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},
135 };
136
137 /* normal (small alphabet) + shift */
138 uint8_t Keys2[256][2] =
139 {
140 /* 00 */
141   {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
142   /* BS      TAB                                ENTER                  */
143   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
144
145 /* 10 */
146   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
147   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{1,0xfb},{0,0x00},{0,0x00},{0,0x00},
148   /*                           ESC                                     */
149   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
150
151 /* 20 */
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},
156
157 /* 30 */
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},
160   /* 8        9                                                         */
161   {0,0x28},{0,0x29},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
162
163 /* 40 */
164   /*          A         B        C        D       E         F       G   */
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},
168
169 /* 50 */
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},
172   /*  X       Y         Z        */
173   {0,0x58},{0,0x59},{0,0x5a},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
174
175 /* 60  10 key */
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},
178   /*  8       9         *        +                -         .       /   */
179   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
180
181 /* 70 */
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},
185
186 /* 80 */
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},
190
191 /* 90 */
192   /* NUM     SCROLL                                                     */
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},
195
196 /* A0 */
197   /*                       SCROLL LOCK                                  */
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},
200
201 /* B0 */
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},
205
206 /* C0 */
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},
209
210 /* D0 */
211   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
212   /*                            [{        \|        ]}      ^           */
213   {0,0x00},{0,0x00},{0,0x00},{0,0x7B},{0,0x7C},{0,0x7D},{0,0x00},{0,0x00},
214
215 /* E0 */
216   /*                     _                                              */
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},
219 /* F0 */
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},
222 };
223
224 /* hiragana */
225 uint8_t Keys3[256][2] =
226 {
227 /* 00 */
228   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
229   /* BS      TAB                                ENTER                  */
230   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
231
232 /* 10 */
233   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
234   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
235   /*                           ESC                                     */
236   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
237
238 /* 20 */
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},
243
244 /* 30 */
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},
247   /* 8        9                                                         */
248   {0,0xf5},{0,0xf6},{0,0x99},{0,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
249
250 /* 40 */
251   /*          A         B        C        D       E         F       G   */
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},
255
256 /* 50 */
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},
259   /*  X       Y         Z        */
260   {0,0x9b},{0,0xfd},{0,0xe2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
261
262 /* 60  10 key */
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},
265   /*  8       9         *        +                -         .       /   */
266   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
267
268 /* 70 */
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},
272
273 /* 80 */
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},
276
277
278 /* 90 */
279   /* NUM     SCROLL                                                     */
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},
282
283 /* A0 */
284   /*                       SCROLL LOCK                                  */
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},
287
288 /* B0 */
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},
292
293 /* C0 */
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},
296
297 /* D0 */
298   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
299   /*                            [{        \|        ]}      ^           */
300   {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xf1},{0,0xed},{0,0x00},
301
302 /* E0 */
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},
306 /* F0 */
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},
309 };
310
311 /* hiragana + shift */
312 uint8_t Keys4[256][2] =
313 {
314 /* 00 */
315   {0,0x35},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
316   /* BS      TAB                                ENTER                  */
317   {0,0x7f},{0,0x09},{0,0x00},{0,0x00},{0,0x00},{0,0x0d},{0,0x00},{0,0x00},
318
319 /* 10 */
320   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
321   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
322   /*                           ESC                                     */
323   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
324
325 /* 20 */
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},
330
331 /* 30 */
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},
334   /* 8        9                                                         */
335   {0,0x8d},{0,0x8e},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
336
337 /* 40 */
338   /*          A         B        C        D       E         F       G   */
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},
342
343 /* 50 */
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},
346   /*  X       Y         Z        */
347   {0,0x00},{0,0x00},{0,0x8f},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
348
349 /* 60  10 key*/
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},
352   /*  8       9         *        +                -         .       /   */
353   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
354
355 /* 70 */
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},
359
360 /* 80 */
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},
363
364 /* 90 */
365   /* NUM     SCROLL                                                     */
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},
368
369 /* A0 */
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},
372
373 /* B0 */
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},
377
378 /* C0 */
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},
381 /* D0 */
382   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
383   /*                            [{        \|        ]}      ^           */
384   {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
385 /* E0 */
386   /*                     _                                              */
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},
389 /* F0 */
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},
392 };
393
394 /* katakana */
395 uint8_t Keys5[256][2] =
396 {
397 /* 00 */
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},
400
401 /* 10 */
402   /* SHIFT   CTRL      ALT     PAUSE    CAPS     KANA                  */
403   {0,0x00},{0,0x00},{0,0x00},{1,0xfa},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
404   /*                           ESC                                     */
405   {0,0x00},{0,0x00},{0,0x00},{0,0x1b},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
406
407 /* 20 */
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},
412
413 /* 30 */
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},
416   /* 8        9                                                         */
417   {0,0xd5},{0,0xd6},{0,0xb9},{0,0xda},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
418
419 /* 40 */
420   /*          A         B        C        D       E         F       G   */
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},
424
425 /* 50 */
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},
428   /*  X       Y         Z        */
429   {0,0xbb},{0,0xdd},{0,0xc2},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
430
431 /* 60  10 key*/
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},
434   /*  8       9         *        +                -         .       /   */
435   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
436
437 /* 70 */
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},
441
442 /* 80 */
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},
445
446 /* 90 */
447   /* NUM     SCROLL                                                     */
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},
450
451 /* A0 */
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},
454
455 /* B0 */
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},
459
460 /* C0 */
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},
463
464 /* D0 */
465   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
466   /*                            [{        \|        ]}      ^           */
467   {0,0x00},{0,0x00},{0,0x00},{0,0xdf},{0,0xb0},{0,0xd1},{0,0xcd},{0,0x00},
468
469 /* E0 */
470   /*                     _                                              */
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},
473 /* F0 */
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},
476 };
477
478 /* katakana + shift */
479 uint8_t Keys6[256][2] =
480 {
481 /* 00 */
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},
484 /* 10 */
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},
487 /* 20 */
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},
492
493 /* 30 */
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},
496   /* 8        9                                                         */
497   {0,0xad},{0,0xae},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
498
499 /* 40 */
500   /*          A         B        C        D       E         F       G   */
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},
504
505 /* 50 */
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},
508   /*  X       Y         Z        */
509   {0,0x00},{0,0x00},{0,0xaf},{0,0xa2},{0,0xb0},{0,0xa3},{0,0x00},{0,0x00},
510
511 /* 60 */
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},
514   /*  8       9         *        +                -         .       /   */
515   {0,0x38},{0,0x39},{0,0x2a},{0,0x2b},{0,0x00},{0,0x2d},{0,0x2e},{0,0x2f},
516
517 /* 70 */
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},
521
522 /* 80 */
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},
525
526 /* 90 */
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},
529
530 /* A0 */
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},
533
534 /* B0 */
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},
538
539 /* C0 */
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},
542
543 /* D0 */
544   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
545   /*                            [{        \|        ]}      ^           */
546   {0,0x00},{0,0x00},{0,0x00},{0,0xa2},{0,0x00},{0,0xa3},{0,0x00},{0,0x00},
547
548 /* E0 */
549   /*                     _                                              */
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},
552
553 /* F0 */
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},
556 };
557
558 /* with graph key */
559 uint8_t Keys7[256][2] =
560 {
561 /* 00 */
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},
564
565 /* 10 */
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},
568
569 /* 20 */
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},
572
573 /* 30 */
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},
576
577 /* 40 */
578   /*          A         B        C        D       E         F       G   */
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},
582
583 /* 50 */
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},
586
587 /* 60 */
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},
590
591 /* 70 */
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},
595
596 /* 80 */
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},
599
600 /* 90 */
601   /* NUM     SCROLL                                                     */
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},
604
605 /* A0 */
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},
608
609 /* B0 */
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},
613
614 /* C0 */
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},
617
618 /* D0 */
619   {0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},{0,0x00},
620   /*                            [{        \|        ]}      ^           */
621   {0,0x00},{0,0x00},{0,0x00},{0,0x84},{1,0x09},{0,0x85},{0,0x00},{0,0x00},
622
623 /* E0 */
624   /*                     _                                              */
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},
627
628 /* F0 */
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},
631 };
632
633 void PSUB::update_keyboard()
634 {
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;
640                         key_stat[code]=0;
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
644                         p6key=code;
645                         uint8_t *Keys;
646                         uint8_t ascii=0;
647                         if (kbFlagGraph) {
648                                 Keys = Keys7[code];
649                         } else if (kanaMode) {
650                                 if (katakana) {
651                                         if (stick0 & STICK0_SHIFT) Keys = Keys6[code];
652                                         else Keys = Keys5[code];
653                                 } else if (stick0 & STICK0_SHIFT) { 
654                                         Keys = Keys4[code];
655                                 } else {
656                                         Keys = Keys3[code];
657                                 }
658                         } else if (stick0 & STICK0_SHIFT) { 
659                                 Keys = Keys2[code];
660                         } else { 
661                                 Keys = Keys1[code];
662                         }
663                         ascii = Keys[1];
664                         /* control key + alphabet key */
665                         if ((kbFlagCtrl == 1) && (code >= 0x41) && (code <= 0x5a)) ascii = code - 0x41 + 1;
666                         /* function key */
667                         if (!kanaMode && (ascii>0xef && ascii<0xfa)) kbFlagFunc=1;
668                         d_pio->write_signal(SIG_I8255_PORT_A, ascii, 0xff);
669                 }
670         }
671 }
672
673 bool PSUB::play_tape(const _TCHAR* file_path)
674 {
675         close_tape();
676         
677         if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
678                 int data, remain = sizeof(CasData);
679                 FileBaud = 1200;
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();
684                         // check info block
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();
691                                 if(blocks >= 1) {
692                                         fio->FgetUint8();
693                                         fio->FgetUint8();
694                                         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') {
703                                                 fio->FgetUint8();
704                                                 fio->Fseek(16, FILEIO_SEEK_CUR);
705                                                 FileBaud = (int)fio->FgetUint16();
706                                         }
707                                 }
708                                 remain = min(length, (int)sizeof(CasData));
709                         }
710                 }
711                 fio->Fseek(0, FILEIO_SEEK_SET);
712                 CasLength = 0;
713                 while((data = fio->Fgetc()) != EOF && remain > 0) {
714                         CasData[CasLength++] = data;
715                         remain--;
716                 }
717                 fio->Fclose();
718                 
719                 if(CasMode == CAS_LOADING /*&& CasBaud == FileBaud*/) {
720                         register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
721                 }
722                 CasIndex=0;
723                 play = true;
724         }
725         return play;
726 }
727
728 bool PSUB::rec_tape(const _TCHAR* file_path)
729 {
730         close_tape();
731         
732         if(fio->Fopen(file_path, FILEIO_READ_WRITE_NEW_BINARY)) {
733                 my_tcscpy_s(rec_file_path, _MAX_PATH, file_path);
734                 CasIndex=0;
735                 rec = true;
736                 is_wav = check_file_extension(file_path, _T(".wav"));
737                 is_p6t = check_file_extension(file_path, _T(".p6t"));
738         }
739         return rec;
740 }
741
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
747 };
748
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
752 };
753
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
759 };
760
761 void PSUB::close_tape()
762 {
763         if(fio->IsOpened()) {
764                 if(rec) {
765                         if(is_wav) {
766                                 wav_header_t wav_header;
767                                 wav_chunk_t wav_chunk;
768                                 int sample_rate = (CasBaud == 600) ? 24000 : 48000;
769                                 
770                                 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
771                                 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
772                                 
773                                 for(int i = 0; i < 9600; i++) {
774                                         fio->Fwrite((void *)pulse_2400hz, sizeof(pulse_2400hz), 1);
775                                 }
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);
781                                                 } else {
782                                                         fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
783                                                 }
784                                         }
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);
788                                 }
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);
792                                 }
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);
798                                                 } else {
799                                                         fio->Fwrite((void *)pulse_1200hz, sizeof(pulse_1200hz), 1);
800                                                 }
801                                         }
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);
805                                 }
806 #if 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);
811                                         }
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);
815                                 }
816 #endif
817                                 uint32_t length = fio->Ftell();
818 #if 0                           
819                                 pair_t __riff_chunk_size;
820                                 pair_t __fmt_chunk_size;
821                                 pair_t __wav_chunk_size;
822                                 pair16_t __fmt_id;
823                                 pair16_t __channels;
824                                 pair_t __sample_rate;
825                                 pair16_t __block_size;
826                                 pair16_t __sample_bits;
827
828                                 __riff_chunk_size.d = length - 8;
829                                 __fmt_chunk_size.d = 16;
830                                 __fmt_id.w = 1;
831                                 __channels.w = 1;
832                                 __sample_rate.d = sample_rate;
833                                 __block_size.w = 1;
834                                 __sample_bits.w = 8;
835         
836                                 memcpy(wav_header.riff_chunk.id, "RIFF", 4);
837                                 wav_header.riff_chunk.size = __riff_chunk_size.get_4bytes_le_to();
838         
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();
848         
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();
852         
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);
856 #else
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);
861                                 }
862 #endif
863                         } else {
864                                 fio->Fwrite(CasData, CasIndex, 1);
865                                 if(is_p6t) {
866                                         fio->Fputc('P');
867                                         fio->Fputc('6');
868                                         fio->FputUint8(2);
869                                         fio->FputUint8(2);
870                                         fio->FputUint8(0);
871                                         fio->FputUint8(0);
872                                         fio->FputUint8(0);
873                                         fio->FputUint16(0);
874                                         fio->FputUint16(0);
875                                         
876                                         fio->Fputc('T');
877                                         fio->Fputc('I');
878                                         fio->FputUint8(0);
879                                         for(int i = 0; i < 6; i++) {
880                                                 fio->FputUint8(CasData[10 + i]);
881                                         }
882                                         for(int i = 6; i < 16; i++) {
883                                                 fio->FputUint8(0);
884                                         }
885                                         fio->FputUint16(CasBaud);
886                                         fio->FputUint16(3000);
887                                         fio->FputUint16(4000);
888                                         fio->FputUint32(0);
889                                         fio->FputUint32(16);
890                                         
891                                         fio->Fputc('T');
892                                         fio->Fputc('I');
893                                         fio->FputUint8(0);
894                                         for(int i = 0; i < 16; i++) {
895                                                 fio->FputUint8(0);
896                                         }
897                                         fio->FputUint16(CasBaud);
898                                         fio->FputUint16(0);
899                                         fio->FputUint16(1000);
900                                         fio->FputUint32(16);
901                                         fio->FputUint32(CasIndex - 16);
902                                         
903                                         fio->FputUint32(CasIndex);
904                                 }
905                         }
906                 }
907                 fio->Fclose();
908         }
909         play = rec = false;
910 }
911
912 void PSUB::initialize()
913 {
914         fio = new FILEIO();
915         play = rec = false;
916         
917 //      key_stat = emu->get_key_buffer();
918         memset(key_stat, 0, sizeof(key_stat));
919         
920         kbFlagCtrl=0;
921         kbFlagGraph=0;
922         kbFlagFunc=0;
923         kanaMode=0;
924         katakana=0;
925         
926         // register event to update the key status
927         register_frame_event(this);
928 }
929
930 void PSUB::release()
931 {
932         close_tape();
933         delete fio;
934 }
935
936 void PSUB::reset()
937 {
938         close_tape();
939         CasIntFlag=0;
940         CasIndex=0;
941         CasRecv=0xff;
942         CasMode=CAS_NONE;
943         CasBaud=FileBaud=1200;
944         memset(CasData, 0, 0x10000);
945         CasLength=0;
946         CasSkipFlag=0;
947         
948         p6key=0;
949         stick0=0;
950         StrigIntFlag=0;
951         StrigEventID=-1;
952 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
953 //      DateIntFlag=0;
954 #endif
955 }
956
957 void PSUB::event_frame()
958 {
959         if (key_stat[VK_CONTROL] & 0x80) kbFlagCtrl=1;
960         else kbFlagCtrl=0;
961         stick0 = 0;
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;
969         update_keyboard();
970         if (p6key) d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
971         
972         if(CasSkipFlag != 0) {
973                 request_skip_frames();
974                 CasSkipFlag = 0;
975         }
976 }
977
978 void PSUB::event_callback(int event_id, int err)
979 {
980         if(event_id == EVENT_CASSETTE) {
981                 if(CasMode == CAS_LOADING) {
982                         if(play && CasIndex < CasLength) {
983                                 CasIntFlag = 1;
984                                 CasRecv = CasData[CasIndex++];
985                                 if(CasIndex < CasLength) {
986                                         if(CasIndex == 16) {
987                                                 register_event(this, EVENT_CASSETTE, 1000000.0, false, NULL);
988                                         } else {
989                                                 register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
990                                         }
991                                         emu->out_message(_T("CMT: Play (%d %%)"), 100 * CasIndex / CasLength);
992                                 } else {
993                                         emu->out_message(_T("CMT: Stop (End-of-Tape)"));
994                                 }
995                                 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
996                         }
997                 }
998         } else if(event_id == EVENT_STRIG) {
999                 StrigIntFlag = 1;
1000                 StrigEventID = -1;
1001                 d_timer->write_signal(SIG_TIMER_IRQ_SUB_CPU, 1, 1);
1002         }
1003 }
1004
1005 uint32_t PSUB::get_intr_ack()
1006 {
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 */
1010                 StrigIntFlag=-1;
1011                 return(INTADDR_STRIG);
1012         } else if (p6key) { /* if any key pressed */
1013                 p6key = 0;
1014                 if (kbFlagGraph || kbFlagFunc) {
1015                         kbFlagFunc=0;
1016                         return(INTADDR_KEY2); /* special key (graphic key, etc.) */
1017                 } else {
1018                         return(INTADDR_KEY1); /* normal key */
1019                 }
1020         } else if (CasIntFlag) {
1021                 CasIntFlag = 0;
1022                 return(INTADDR_CMTREAD);
1023         }
1024         return(INTADDR_TIMER);
1025 }
1026
1027 void PSUB::write_io8(uint32_t addr, uint32_t data)
1028 {
1029         uint16_t port=(addr & 0x00ff);
1030         if (port == 0x90) {
1031                 if (CasMode == CAS_SAVEBYTE) {  /* CMT SAVE */
1032                         if (CasIndex<0x10000) {
1033                                 CasData[CasIndex++]=data;
1034                                 CasSkipFlag=1;
1035                         }
1036                         CasMode=CAS_NONE;
1037                 }
1038                 else if(data==0x06) {
1039                         if(StrigEventID != -1) {
1040                                 cancel_event(this, StrigEventID);
1041                                 StrigEventID = -1;
1042                         }
1043 //                      register_event(this, EVENT_STRIG, 3000, false, &StrigEventID); // 3msec
1044                         register_event(this, EVENT_STRIG, 100, false, &StrigEventID); // 0.1nsec
1045                 }
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
1047                         CasMode=CAS_NONE;
1048                         CasBaud=(data==0x3e)?1200:600;
1049                 }
1050                 else if (data==0x39) { ///
1051                         CasMode=CAS_NONE;
1052                 }
1053                 else if (data==0x38) { /* CMT SAVE DATA */
1054                         CasMode=CAS_SAVEBYTE;
1055                 }
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
1057                         CasMode=CAS_NONE;
1058                         CasBaud=(data==0x1e)?1200:600;
1059                 }
1060                 else if (data==0x1a && CasMode!=CAS_NONE) { /* CMT LOAD STOP */
1061                         CasMode=CAS_NONE;
1062                 }
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);
1067                         }
1068                         CasRecv=0xff;
1069                         CasMode=CAS_LOADING;
1070                 }
1071         }
1072         d_pio->write_io8(addr, data);
1073 }
1074
1075 uint32_t PSUB::read_io8(uint32_t addr)
1076 {
1077         uint16_t port=(addr & 0x00ff);
1078         uint8_t Value=0xff;
1079         if (port == 0x90) {
1080                 if (CasMode == CAS_LOADING) {
1081                         Value=CasRecv;
1082                         CasRecv=0xff;
1083                         CasSkipFlag=1;
1084                 } else if (StrigIntFlag==-1) {
1085                         Value=stick0;
1086                         StrigIntFlag=0;
1087                 } else {
1088                         Value = (d_pio->read_io8(addr));
1089                 }
1090         }
1091         return Value;
1092 }
1093
1094 void PSUB::key_down(int code)
1095 {
1096         key_stat[code] = 0x80;
1097 }
1098
1099 void PSUB::key_up(int code)
1100 {
1101         key_stat[code] = 0x00;
1102 }
1103
1104 #define STATE_VERSION   1
1105
1106 bool PSUB::process_state(FILEIO* state_fio, bool loading)
1107 {
1108         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
1109                 return false;
1110         }
1111         if(!state_fio->StateCheckInt32(this_device_id)) {
1112                 return false;
1113         }
1114         // pre process
1115         if(loading) {
1116                 close_tape();
1117         }
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);
1123         if(loading) {
1124                 int length_tmp = state_fio->FgetInt32_LE();
1125                 if(rec) {
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);
1133                                 }
1134                                 length_tmp -= length_rw;
1135                         }
1136                 }
1137         } else {
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;
1148                         }
1149                 } else {
1150                         state_fio->FputInt32_LE(0);
1151                 }
1152         }
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);
1171         return true;
1172 }