OSDN Git Service

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