リビジョン | 102 (tree) |
---|---|
日時 | 2010-09-29 17:51:41 |
作者 | bird_may_nike |
(メッセージはありません)
@@ -1,480 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include <shlwapi.h> | |
7 | -#include <stdio.h> | |
8 | -#include "WSHard.h" | |
9 | -#include "WS.h" | |
10 | -#include "WSDraw.h" | |
11 | -#include "WSFileio.h" | |
12 | -#include "WSPdata.h" | |
13 | -#include "WSError.h" | |
14 | -#include "WSRender.h" | |
15 | -#include "nec/necintrf.h" | |
16 | - | |
17 | -// ファイル操作は表などとディレクトリセパレータがかぶるのでUNICODEを使います | |
18 | -static wchar_t CurDir[512]; | |
19 | -static wchar_t *SaveDir = L"RAM"; | |
20 | -static wchar_t *StateDir = L"STATE"; | |
21 | -static wchar_t SaveName[512]; // ".sav" | |
22 | -wchar_t StateName[512]; | |
23 | -wchar_t IniPath[512]; | |
24 | - | |
25 | -void WsSetDir(void) | |
26 | -{ | |
27 | - wchar_t *p; | |
28 | - | |
29 | - wcscpy(CurDir, __wargv[0]); | |
30 | - p = wcsrchr(CurDir, L'\\'); | |
31 | - if (p == NULL) | |
32 | - { | |
33 | - return; | |
34 | - } | |
35 | - *(++p) = 0; | |
36 | - wcscpy(IniPath, CurDir); | |
37 | - wcscat(IniPath, L"OswanJ.ini"); | |
38 | -} | |
39 | - | |
40 | -int WsSetPdata(void) | |
41 | -{ | |
42 | - ROMBanks = 1; | |
43 | - RAMBanks = 0; | |
44 | - RAMSize = 0; | |
45 | - CartKind = 0; | |
46 | - SaveName[0] = 0; | |
47 | - if ((ROMMap[0xFF] = (BYTE*)malloc(0x10000)) == NULL) | |
48 | - { | |
49 | - ErrorMsg(ERR_MALLOC); | |
50 | - return -1; | |
51 | - } | |
52 | - memcpy(ROMMap[0xFF] + 0xF080, pdata, size_pdata); | |
53 | - WsReset(); | |
54 | - SetDrawMode(0); | |
55 | - return 0; | |
56 | -} | |
57 | - | |
58 | -int WsCreate(wchar_t *CartName) | |
59 | -{ | |
60 | - int Checksum, i, j; | |
61 | - FILE* fp; | |
62 | - BYTE buf[16]; | |
63 | - wchar_t* p; | |
64 | - | |
65 | - for (i = 0; i < 256; i++) | |
66 | - { | |
67 | - ROMMap[i] = MemDummy; | |
68 | - RAMMap[i] = MemDummy; | |
69 | - } | |
70 | - memset(IRAM, 0, sizeof(IRAM)); | |
71 | - memset(MemDummy, 0xA0, sizeof(MemDummy)); | |
72 | - memset(IO, 0, sizeof(IO)); | |
73 | - if (CartName == NULL) | |
74 | - { | |
75 | - return WsSetPdata(); | |
76 | - } | |
77 | - if ((fp = _wfopen(CartName, L"rb")) == NULL) | |
78 | - { | |
79 | - ErrorMsg(ERR_FOPEN); | |
80 | - return -1; | |
81 | - } | |
82 | - fseek(fp, -10, 2); | |
83 | - if (fread(buf, 1, 10, fp) != 10) | |
84 | - { | |
85 | - ErrorMsg(ERR_FREAD_ROMINFO); | |
86 | - return -1; | |
87 | - } | |
88 | - switch (buf[4]) | |
89 | - { | |
90 | - case 1: | |
91 | - ROMBanks = 4; | |
92 | - break; | |
93 | - case 2: | |
94 | - ROMBanks = 8; | |
95 | - break; | |
96 | - case 3: | |
97 | - ROMBanks = 16; | |
98 | - break; | |
99 | - case 4: | |
100 | - ROMBanks = 32; | |
101 | - break; | |
102 | - case 5: | |
103 | - ROMBanks = 48; | |
104 | - break; | |
105 | - case 6: | |
106 | - ROMBanks = 64; | |
107 | - break; | |
108 | - case 7: | |
109 | - ROMBanks = 96; | |
110 | - break; | |
111 | - case 8: | |
112 | - ROMBanks = 128; | |
113 | - break; | |
114 | - case 9: | |
115 | - ROMBanks = 256; | |
116 | - break; | |
117 | - default: | |
118 | - ROMBanks = 0; | |
119 | - break; | |
120 | - } | |
121 | - if (ROMBanks == 0) | |
122 | - { | |
123 | - ErrorMsg(ERR_ILLEGAL_ROMSIZE); | |
124 | - return -1; | |
125 | - } | |
126 | - switch (buf[5]) | |
127 | - { | |
128 | - case 0x01: | |
129 | - RAMBanks = 1; | |
130 | - RAMSize = 0x2000; | |
131 | - CartKind = 0; | |
132 | - break; | |
133 | - case 0x02: | |
134 | - RAMBanks = 1; | |
135 | - RAMSize = 0x8000; | |
136 | - CartKind = 0; | |
137 | - break; | |
138 | - case 0x03: | |
139 | - RAMBanks = 2; | |
140 | - RAMSize = 0x20000; | |
141 | - CartKind = 0; | |
142 | - break; | |
143 | - case 0x04: | |
144 | - RAMBanks = 4; | |
145 | - RAMSize = 0x40000; | |
146 | - CartKind = 0; | |
147 | - break; | |
148 | - case 0x10: | |
149 | - RAMBanks = 1; | |
150 | - RAMSize = 0x80; | |
151 | - CartKind = CK_EEP; | |
152 | - break; | |
153 | - case 0x20: | |
154 | - RAMBanks = 1; | |
155 | - RAMSize = 0x800; | |
156 | - CartKind = CK_EEP; | |
157 | - break; | |
158 | - case 0x50: | |
159 | - RAMBanks = 1; | |
160 | - RAMSize = 0x400; | |
161 | - CartKind = CK_EEP; | |
162 | - break; | |
163 | - default: | |
164 | - RAMBanks = 0; | |
165 | - RAMSize = 0; | |
166 | - CartKind = 0; | |
167 | - break; | |
168 | - } | |
169 | - WsRomPatch(buf); | |
170 | - Checksum = (int)((buf[9] << 8) + buf[8]); | |
171 | - Checksum += (int)(buf[9] + buf[8]); | |
172 | - for (i = ROMBanks - 1; i >= 0; i--) | |
173 | - { | |
174 | - fseek(fp, (ROMBanks - i) * -0x10000, 2); | |
175 | - if ((ROMMap[0x100 - ROMBanks + i] = (BYTE*)malloc(0x10000)) != NULL) | |
176 | - { | |
177 | - if (fread(ROMMap[0x100 - ROMBanks + i], 1, 0x10000, fp) == 0x10000) | |
178 | - { | |
179 | - for (j = 0; j < 0x10000; j++) | |
180 | - { | |
181 | - Checksum -= ROMMap[0x100 - ROMBanks + i][j]; | |
182 | - } | |
183 | - } | |
184 | - else | |
185 | - { | |
186 | - ErrorMsg(ERR_FREAD_ROM); | |
187 | - break; | |
188 | - } | |
189 | - } | |
190 | - else | |
191 | - { | |
192 | - ErrorMsg(ERR_MALLOC); | |
193 | - break; | |
194 | - } | |
195 | - } | |
196 | - fclose(fp); | |
197 | - if (i >= 0) | |
198 | - { | |
199 | - return -1; | |
200 | - } | |
201 | - if (Checksum & 0xFFFF) | |
202 | - { | |
203 | - //ErrorMsg(ERR_CHECKSUM); | |
204 | - } | |
205 | - if (RAMBanks) | |
206 | - { | |
207 | - for (i = 0; i < RAMBanks; i++) | |
208 | - { | |
209 | - if ((RAMMap[i] = (BYTE*)malloc(0x10000)) != NULL) | |
210 | - { | |
211 | - memset(RAMMap[i], 0x00, 0x10000); | |
212 | - } | |
213 | - else | |
214 | - { | |
215 | - ErrorMsg(ERR_MALLOC); | |
216 | - return -1; | |
217 | - } | |
218 | - } | |
219 | - } | |
220 | - if (RAMSize) | |
221 | - { | |
222 | - wcscpy (SaveName, CurDir); | |
223 | - p = wcsrchr(CartName, L'\\'); | |
224 | - if (p) | |
225 | - { | |
226 | - wcscat(SaveName, SaveDir); | |
227 | - if (PathIsDirectoryW(SaveName) == FALSE) | |
228 | - { | |
229 | - CreateDirectoryW(SaveName, NULL); | |
230 | - } | |
231 | - wcscat(SaveName, p); | |
232 | - p = wcsrchr(SaveName, L'.'); | |
233 | - if (p) | |
234 | - { | |
235 | - *p = 0; | |
236 | - } | |
237 | - wcscat(SaveName, L".sav"); | |
238 | - } | |
239 | - else | |
240 | - { | |
241 | - SaveName[0] = 0; | |
242 | - } | |
243 | - if ((fp = _wfopen(SaveName, L"rb")) != NULL) | |
244 | - { | |
245 | - for (i = 0; i < RAMBanks; i++) | |
246 | - { | |
247 | - if (RAMSize < 0x10000) | |
248 | - { | |
249 | - if (fread(RAMMap[i], 1, RAMSize, fp) != (size_t)RAMSize) | |
250 | - { | |
251 | - ErrorMsg(ERR_FREAD_SAVE); | |
252 | - break; | |
253 | - } | |
254 | - } | |
255 | - else | |
256 | - { | |
257 | - if (fread(RAMMap[i], 1, 0x10000, fp) != 0x10000) | |
258 | - { | |
259 | - ErrorMsg(ERR_FREAD_SAVE); | |
260 | - break; | |
261 | - } | |
262 | - } | |
263 | - } | |
264 | - fclose(fp); | |
265 | - } | |
266 | - } | |
267 | - else | |
268 | - { | |
269 | - SaveName[0] = 0; | |
270 | - } | |
271 | - wcscpy (StateName, CurDir); | |
272 | - p = wcsrchr(CartName, L'\\'); | |
273 | - if (p) | |
274 | - { | |
275 | - wcscat(StateName, StateDir); | |
276 | - if (PathIsDirectoryW(StateName) == FALSE) | |
277 | - { | |
278 | - CreateDirectoryW(StateName, NULL); | |
279 | - } | |
280 | - wcscat(StateName, p); | |
281 | - p = wcsrchr(StateName, L'.'); | |
282 | - if (p) | |
283 | - { | |
284 | - *p = 0; | |
285 | - } | |
286 | - } | |
287 | - WsReset(); | |
288 | - SetDrawMode(buf[6] & 1); // 0:横 1:縦 | |
289 | - return 0; | |
290 | -} | |
291 | - | |
292 | -void WsRelease(void) | |
293 | -{ | |
294 | - FILE* fp; | |
295 | - int i; | |
296 | - | |
297 | - if (SaveName[0] != '\0') | |
298 | - { | |
299 | - if ((fp = _wfopen(SaveName, L"wb"))!= NULL) | |
300 | - { | |
301 | - for (i =0; i < RAMBanks; i++) | |
302 | - { | |
303 | - if (RAMSize<0x10000) | |
304 | - { | |
305 | - if (fwrite(RAMMap[i], 1, RAMSize, fp) != (size_t)RAMSize) | |
306 | - { | |
307 | - break; | |
308 | - } | |
309 | - } | |
310 | - else | |
311 | - { | |
312 | - if (fwrite(RAMMap[i], 1, 0x10000, fp)!=0x10000) | |
313 | - { | |
314 | - break; | |
315 | - } | |
316 | - } | |
317 | - free(RAMMap[i]); | |
318 | - RAMMap[i] = NULL; | |
319 | - } | |
320 | - fclose(fp); | |
321 | - } | |
322 | - SaveName[0] = '\0'; | |
323 | - } | |
324 | - for (i = 0xFF; i >= 0; i--) | |
325 | - { | |
326 | - if (ROMMap[i] == MemDummy) | |
327 | - { | |
328 | - break; | |
329 | - } | |
330 | - free(ROMMap[i]); | |
331 | - ROMMap[i] = MemDummy; | |
332 | - } | |
333 | - StateName[0] = '\0'; | |
334 | -} | |
335 | - | |
336 | -void WsLoadEeprom(void) | |
337 | -{ | |
338 | - FILE* fp; | |
339 | - wchar_t buf[512]; | |
340 | - | |
341 | - wcscpy(buf, CurDir); | |
342 | - wcscat(buf, L"eeprom.dat"); | |
343 | - if ((fp = _wfopen(buf, L"rb")) != NULL) | |
344 | - { | |
345 | - fread(IEep, sizeof(WORD), 64, fp); | |
346 | - fclose(fp); | |
347 | - } | |
348 | - else | |
349 | - { | |
350 | - memset(IEep, 0xFF, 0x60); | |
351 | - memset(IEep + 0x60, 0, 0x20); | |
352 | - } | |
353 | -} | |
354 | - | |
355 | -void WsSaveEeprom(void) | |
356 | -{ | |
357 | - FILE* fp; | |
358 | - wchar_t buf[512]; | |
359 | - | |
360 | - wcscpy(buf, CurDir); | |
361 | - wcscat(buf, L"eeprom.dat"); | |
362 | - if ((fp = _wfopen(buf, L"wb")) != NULL) | |
363 | - { | |
364 | - fwrite(IEep, sizeof(WORD), 64, fp); | |
365 | - fclose(fp); | |
366 | - } | |
367 | -} | |
368 | - | |
369 | -#define MacroLoadNecRegisterFromFile(F,R) \ | |
370 | - fread(&value, sizeof(unsigned int), 1, fp); \ | |
371 | - nec_set_reg(R,value); | |
372 | -void WsLoadState(int num) | |
373 | -{ | |
374 | - FILE* fp; | |
375 | - wchar_t buf[512]; | |
376 | - unsigned int value; | |
377 | - int i; | |
378 | - | |
379 | - wsprintf(buf, L"%s.%03d", StateName, num); | |
380 | - if ((fp = _wfopen(buf, L"rb")) == NULL) | |
381 | - { | |
382 | - return; | |
383 | - } | |
384 | - MacroLoadNecRegisterFromFile(fp,NEC_IP); | |
385 | - MacroLoadNecRegisterFromFile(fp,NEC_AW); | |
386 | - MacroLoadNecRegisterFromFile(fp,NEC_BW); | |
387 | - MacroLoadNecRegisterFromFile(fp,NEC_CW); | |
388 | - MacroLoadNecRegisterFromFile(fp,NEC_DW); | |
389 | - MacroLoadNecRegisterFromFile(fp,NEC_CS); | |
390 | - MacroLoadNecRegisterFromFile(fp,NEC_DS); | |
391 | - MacroLoadNecRegisterFromFile(fp,NEC_ES); | |
392 | - MacroLoadNecRegisterFromFile(fp,NEC_SS); | |
393 | - MacroLoadNecRegisterFromFile(fp,NEC_IX); | |
394 | - MacroLoadNecRegisterFromFile(fp,NEC_IY); | |
395 | - MacroLoadNecRegisterFromFile(fp,NEC_BP); | |
396 | - MacroLoadNecRegisterFromFile(fp,NEC_SP); | |
397 | - MacroLoadNecRegisterFromFile(fp,NEC_FLAGS); | |
398 | - MacroLoadNecRegisterFromFile(fp,NEC_VECTOR); | |
399 | - MacroLoadNecRegisterFromFile(fp,NEC_PENDING); | |
400 | - MacroLoadNecRegisterFromFile(fp,NEC_NMI_STATE); | |
401 | - MacroLoadNecRegisterFromFile(fp,NEC_IRQ_STATE); | |
402 | - fread(IRAM, sizeof(BYTE), 0x10000, fp); | |
403 | - fread(IO, sizeof(BYTE), 0x100, fp); | |
404 | - for (i =0; i < RAMBanks; i++) | |
405 | - { | |
406 | - if (RAMSize < 0x10000) | |
407 | - { | |
408 | - fread(RAMMap[i], 1, RAMSize, fp); | |
409 | - } | |
410 | - else | |
411 | - { | |
412 | - fread(RAMMap[i], 1, 0x10000, fp); | |
413 | - } | |
414 | - } | |
415 | - fread(Palette, sizeof(WORD), 16 * 16, fp); | |
416 | - fclose(fp); | |
417 | - WriteIO(0xC1, IO[0xC1]); | |
418 | - WriteIO(0xC2, IO[0xC2]); | |
419 | - WriteIO(0xC3, IO[0xC3]); | |
420 | - WriteIO(0xC0, IO[0xC0]); | |
421 | - for (i = 0x80; i <= 0x90; i++) | |
422 | - { | |
423 | - WriteIO(i, IO[i]); | |
424 | - } | |
425 | -} | |
426 | - | |
427 | -#define MacroStoreNecRegisterToFile(F,R) \ | |
428 | - value = nec_get_reg(R); \ | |
429 | - fwrite(&value, sizeof(unsigned int), 1, fp); | |
430 | -void WsSaveState(int num) | |
431 | -{ | |
432 | - FILE* fp; | |
433 | - wchar_t buf[512]; | |
434 | - unsigned int value; | |
435 | - int i; | |
436 | - | |
437 | - if (StateName[0] == '\0') | |
438 | - { | |
439 | - return; | |
440 | - } | |
441 | - wsprintf(buf, L"%s.%03d", StateName, num); | |
442 | - if ((fp = _wfopen(buf, L"wb")) == NULL) | |
443 | - { | |
444 | - return; | |
445 | - } | |
446 | - MacroStoreNecRegisterToFile(fp,NEC_IP); | |
447 | - MacroStoreNecRegisterToFile(fp,NEC_AW); | |
448 | - MacroStoreNecRegisterToFile(fp,NEC_BW); | |
449 | - MacroStoreNecRegisterToFile(fp,NEC_CW); | |
450 | - MacroStoreNecRegisterToFile(fp,NEC_DW); | |
451 | - MacroStoreNecRegisterToFile(fp,NEC_CS); | |
452 | - MacroStoreNecRegisterToFile(fp,NEC_DS); | |
453 | - MacroStoreNecRegisterToFile(fp,NEC_ES); | |
454 | - MacroStoreNecRegisterToFile(fp,NEC_SS); | |
455 | - MacroStoreNecRegisterToFile(fp,NEC_IX); | |
456 | - MacroStoreNecRegisterToFile(fp,NEC_IY); | |
457 | - MacroStoreNecRegisterToFile(fp,NEC_BP); | |
458 | - MacroStoreNecRegisterToFile(fp,NEC_SP); | |
459 | - MacroStoreNecRegisterToFile(fp,NEC_FLAGS); | |
460 | - MacroStoreNecRegisterToFile(fp,NEC_VECTOR); | |
461 | - MacroStoreNecRegisterToFile(fp,NEC_PENDING); | |
462 | - MacroStoreNecRegisterToFile(fp,NEC_NMI_STATE); | |
463 | - MacroStoreNecRegisterToFile(fp,NEC_IRQ_STATE); | |
464 | - fwrite(IRAM, sizeof(BYTE), 0x10000, fp); | |
465 | - fwrite(IO, sizeof(BYTE), 0x100, fp); | |
466 | - for (i =0; i < RAMBanks; i++) | |
467 | - { | |
468 | - if (RAMSize < 0x10000) | |
469 | - { | |
470 | - fwrite(RAMMap[i], 1, RAMSize, fp); | |
471 | - } | |
472 | - else | |
473 | - { | |
474 | - fwrite(RAMMap[i], 1, 0x10000, fp); | |
475 | - } | |
476 | - } | |
477 | - fwrite(Palette, sizeof(WORD), 16 * 16, fp); | |
478 | - fclose(fp); | |
479 | -} | |
480 | - |
@@ -1,142 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include <windows.h> | |
7 | -#include <stdio.h> | |
8 | -#include "WSconfig.h" | |
9 | -#include "WSInput.h" | |
10 | -#include "WSFileio.h" | |
11 | - | |
12 | -extern wchar_t* RecentOfn[]; | |
13 | -extern int WsWaveVol; | |
14 | -static LPCWSTR KeyName[] = { | |
15 | - L"B", L"A", L"START", L"OPTION", | |
16 | - L"X4", L"X3", L"X2", L"X1", | |
17 | - L"Y4", L"Y3", L"Y2", L"Y1", | |
18 | - L"NOWAIT" | |
19 | -}; | |
20 | - | |
21 | -void ConfigCreate(void) | |
22 | -{ | |
23 | - int i; | |
24 | - | |
25 | - /* default values */ | |
26 | - WsKeyboardH[0] = DIK_Z; // B | |
27 | - WsKeyboardH[1] = DIK_X; // A | |
28 | - WsKeyboardH[2] = DIK_RETURN; // START | |
29 | - WsKeyboardH[3] = DIK_LCONTROL; // OPTION | |
30 | - WsKeyboardH[4] = DIK_LEFT; // X4 | |
31 | - WsKeyboardH[5] = DIK_DOWN; // X3 | |
32 | - WsKeyboardH[6] = DIK_RIGHT; // X2 | |
33 | - WsKeyboardH[7] = DIK_UP; // X1 | |
34 | - WsKeyboardH[8] = DIK_A; // Y4 | |
35 | - WsKeyboardH[9] = DIK_S; // Y3 | |
36 | - WsKeyboardH[10] = DIK_D; // Y2 | |
37 | - WsKeyboardH[11] = DIK_W; // Y1 | |
38 | - WsKeyboardH[12] = DIK_SPACE; // NO WAIT | |
39 | - | |
40 | - WsKeyboardV[0] = DIK_Z; // B | |
41 | - WsKeyboardV[1] = DIK_X; // A | |
42 | - WsKeyboardV[2] = DIK_RETURN; // START | |
43 | - WsKeyboardV[3] = DIK_LCONTROL; // OPTION | |
44 | - WsKeyboardV[4] = DIK_S; // X4 | |
45 | - WsKeyboardV[5] = DIK_D; // X3 | |
46 | - WsKeyboardV[6] = DIK_W; // X2 | |
47 | - WsKeyboardV[7] = DIK_A; // X1 | |
48 | - WsKeyboardV[8] = DIK_DOWN; // Y4 | |
49 | - WsKeyboardV[9] = DIK_RIGHT; // Y3 | |
50 | - WsKeyboardV[10] = DIK_UP; // Y2 | |
51 | - WsKeyboardV[11] = DIK_LEFT; // Y1 | |
52 | - WsKeyboardV[12] = DIK_SPACE; // NO WAIT | |
53 | - | |
54 | - WsJoypadH[0] = 1; // B | |
55 | - WsJoypadH[1] = 2; // A | |
56 | - WsJoypadH[2] = 8; // START | |
57 | - WsJoypadH[3] = 0; // OPTION | |
58 | - WsJoypadH[4] = WS_JOY_AXIS_X_M; // X4 | |
59 | - WsJoypadH[5] = WS_JOY_AXIS_Y_P; // X3 | |
60 | - WsJoypadH[6] = WS_JOY_AXIS_X_P; // X2 | |
61 | - WsJoypadH[7] = WS_JOY_AXIS_Y_M; // X1 | |
62 | - WsJoypadH[8] = WS_JOY_POV1_LEFT; // Y4 | |
63 | - WsJoypadH[9] = WS_JOY_POV1_DOWN; // Y3 | |
64 | - WsJoypadH[10] = WS_JOY_POV1_RIGHT; // Y2 | |
65 | - WsJoypadH[11] = WS_JOY_POV1_UP; // Y1 | |
66 | - WsJoypadH[12] = 7; // NO WAIT | |
67 | - | |
68 | - WsJoypadV[0] = 5; // B | |
69 | - WsJoypadV[1] = 6; // A | |
70 | - WsJoypadV[2] = 8; // START | |
71 | - WsJoypadV[3] = 0; // OPTION | |
72 | - WsJoypadV[4] = 1; // X4 | |
73 | - WsJoypadV[5] = 2; // X3 | |
74 | - WsJoypadV[6] = 4; // X2 | |
75 | - WsJoypadV[7] = 3; // X1 | |
76 | - WsJoypadV[8] = WS_JOY_AXIS_Y_P; // Y4 | |
77 | - WsJoypadV[9] = WS_JOY_AXIS_X_P; // Y3 | |
78 | - WsJoypadV[10] = WS_JOY_AXIS_Y_M; // Y2 | |
79 | - WsJoypadV[11] = WS_JOY_AXIS_X_M; // Y1 | |
80 | - WsJoypadV[12] = 7; // NO WAIT | |
81 | - | |
82 | - for (i = 12; i >= 0; i--) | |
83 | - { | |
84 | - WsKeyboardH[i] = GetPrivateProfileIntW(L"KEY_H", KeyName[i], WsKeyboardH[i], IniPath); | |
85 | - } | |
86 | - for (i = 12; i >= 0; i--) | |
87 | - { | |
88 | - WsKeyboardV[i] = GetPrivateProfileIntW(L"KEY_V", KeyName[i], WsKeyboardV[i], IniPath); | |
89 | - } | |
90 | - for (i = 12; i >= 0; i--) | |
91 | - { | |
92 | - WsJoypadH[i] = GetPrivateProfileIntW(L"JOY_H", KeyName[i], WsJoypadH[i], IniPath); | |
93 | - } | |
94 | - for (i = 12; i >= 0; i--) | |
95 | - { | |
96 | - WsJoypadV[i] = GetPrivateProfileIntW(L"JOY_V", KeyName[i], WsJoypadV[i], IniPath); | |
97 | - } | |
98 | - GetPrivateProfileStringW(L"RECENT_ROMS", L"0", L"", RecentOfn[0], 512, IniPath); | |
99 | - GetPrivateProfileStringW(L"RECENT_ROMS", L"1", L"", RecentOfn[1], 512, IniPath); | |
100 | - GetPrivateProfileStringW(L"RECENT_ROMS", L"2", L"", RecentOfn[2], 512, IniPath); | |
101 | - GetPrivateProfileStringW(L"RECENT_ROMS", L"3", L"", RecentOfn[3], 512, IniPath); | |
102 | - GetPrivateProfileStringW(L"RECENT_ROMS", L"4", L"", RecentOfn[4], 512, IniPath); | |
103 | - GetPrivateProfileStringW(L"RECENT_ROMS", L"5", L"", RecentOfn[5], 512, IniPath); | |
104 | - WsWaveVol = GetPrivateProfileIntW(L"VOLUME", L"VOL", 4, IniPath); | |
105 | -} | |
106 | - | |
107 | -static void WritePrivateProfileIntW(LPCWSTR lpAppName, LPCWSTR lpKeyName, int nInt, LPCWSTR lpFileName) | |
108 | -{ | |
109 | - wchar_t s[32]; | |
110 | - | |
111 | - swprintf_s(s, 32, L"%d", nInt); | |
112 | - WritePrivateProfileStringW(lpAppName, lpKeyName, s, lpFileName); | |
113 | -} | |
114 | - | |
115 | -void ConfigRelease(void) | |
116 | -{ | |
117 | - int i; | |
118 | - | |
119 | - for (i = 12; i >= 0; i--) | |
120 | - { | |
121 | - WritePrivateProfileIntW(L"KEY_H", KeyName[i], WsKeyboardH[i], IniPath); | |
122 | - } | |
123 | - for (i = 12; i >= 0; i--) | |
124 | - { | |
125 | - WritePrivateProfileIntW(L"KEY_V", KeyName[i], WsKeyboardV[i], IniPath); | |
126 | - } | |
127 | - for (i = 12; i >= 0; i--) | |
128 | - { | |
129 | - WritePrivateProfileIntW(L"JOY_H", KeyName[i], WsJoypadH[i], IniPath); | |
130 | - } | |
131 | - for (i = 12; i >= 0; i--) | |
132 | - { | |
133 | - WritePrivateProfileIntW(L"JOY_V", KeyName[i], WsJoypadV[i], IniPath); | |
134 | - } | |
135 | - WritePrivateProfileStringW(L"RECENT_ROMS", L"0", RecentOfn[0], IniPath); | |
136 | - WritePrivateProfileStringW(L"RECENT_ROMS", L"1", RecentOfn[1], IniPath); | |
137 | - WritePrivateProfileStringW(L"RECENT_ROMS", L"2", RecentOfn[2], IniPath); | |
138 | - WritePrivateProfileStringW(L"RECENT_ROMS", L"3", RecentOfn[3], IniPath); | |
139 | - WritePrivateProfileStringW(L"RECENT_ROMS", L"4", RecentOfn[4], IniPath); | |
140 | - WritePrivateProfileStringW(L"RECENT_ROMS", L"5", RecentOfn[5], IniPath); | |
141 | - WritePrivateProfileIntW(L"VOLUME", L"VOL", WsWaveVol, IniPath); | |
142 | -} |
@@ -1,817 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include <string.h> | |
7 | -#include "WSRender.h" | |
8 | -#include "WS.h" | |
9 | -#include "WSDraw.h" | |
10 | -#include "WSSegment.h" | |
11 | - | |
12 | -#define MAP_TILE 0x01FF | |
13 | -#define MAP_PAL 0x1E00 | |
14 | -#define MAP_BANK 0x2000 | |
15 | -#define MAP_HREV 0x4000 | |
16 | -#define MAP_VREV 0x8000 | |
17 | -BYTE *Scr1TMap; | |
18 | -BYTE *Scr2TMap; | |
19 | - | |
20 | -#define SPR_TILE 0x01FF | |
21 | -#define SPR_PAL 0x0E00 | |
22 | -#define SPR_CLIP 0x1000 | |
23 | -#define SPR_LAYR 0x2000 | |
24 | -#define SPR_HREV 0x4000 | |
25 | -#define SPR_VREV 0x8000 | |
26 | -BYTE *SprTTMap; | |
27 | -BYTE *SprETMap; | |
28 | -BYTE SprTMap[512]; | |
29 | - | |
30 | -WORD Palette[16][16]; | |
31 | -WORD MonoColor[8]; | |
32 | -WORD FrameBuffer[144][LINE_SIZE]; | |
33 | -WORD SegmentBuffer[(144 * 4) * (8 * 4)]; // 8 * 144 の4倍のサイズで描画 | |
34 | -int Layer[3] = {1, 1, 1}; | |
35 | -int Segment[11]; | |
36 | - | |
37 | -void SetPalette(int addr) | |
38 | -{ | |
39 | - WORD color; | |
40 | - | |
41 | - // RGB444 format | |
42 | - color = *(WORD*)(IRAM + (addr & 0xFFFE)); | |
43 | - Palette[(addr & 0x1E0) >> 5][(addr & 0x1E) >> 1] = color | 0xF000; | |
44 | -} | |
45 | - | |
46 | -void RefreshLine(int Line) | |
47 | -{ | |
48 | - WORD *pSBuf; // データ書き込みバッファ | |
49 | - WORD *pSWrBuf; // ↑の書き込み位置用ポインタ | |
50 | - int *pZ; // ↓のインクリメント用ポインタ | |
51 | - int ZBuf[0x100]; // FGレイヤーの非透明部を保存 | |
52 | - int *pW; // ↓のインクリメント用ポインタ | |
53 | - int WBuf[0x100]; // FGレイヤーのウィンドーを保存 | |
54 | - int OffsetX; // | |
55 | - int OffsetY; // | |
56 | - BYTE *pbTMap; // | |
57 | - int TMap; // | |
58 | - int TMapX; // | |
59 | - int TMapXEnd; // | |
60 | - BYTE *pbTData; // | |
61 | - int PalIndex; // | |
62 | - int i, j, k, index[8]; | |
63 | - WORD BaseCol; // | |
64 | - pSBuf = FrameBuffer[Line] + 8; | |
65 | - pSWrBuf = pSBuf; | |
66 | - | |
67 | - if(IO[LCDSLP] & 0x01) | |
68 | - { | |
69 | - if(IO[COLCTL] & 0xE0) | |
70 | - { | |
71 | - BaseCol = Palette[(IO[BORDER] & 0xF0) >> 4][IO[BORDER] & 0x0F]; | |
72 | - } | |
73 | - else | |
74 | - { | |
75 | - BaseCol = MonoColor[IO[BORDER] & 0x07]; | |
76 | - } | |
77 | - } | |
78 | - else | |
79 | - { | |
80 | - BaseCol = 0; | |
81 | - } | |
82 | - for(i = 0; i < 224; i++) | |
83 | - { | |
84 | - { | |
85 | - *pSWrBuf++ = BaseCol; | |
86 | - } | |
87 | - } | |
88 | - if(!(IO[LCDSLP] & 0x01)) return; | |
89 | -/*********************************************************************/ | |
90 | - if((IO[DSPCTL] & 0x01) && Layer[0]) //BG layer | |
91 | - { | |
92 | - OffsetX = IO[SCR1X] & 0x07; | |
93 | - pSWrBuf = pSBuf - OffsetX; | |
94 | - i = Line + IO[SCR1Y]; | |
95 | - OffsetY = (i & 0x07); | |
96 | - | |
97 | - pbTMap = Scr1TMap + ((i & 0xF8) << 3); | |
98 | - TMapX = (IO[SCR1X] & 0xF8) >> 2; | |
99 | - TMapXEnd = ((IO[SCR1X] + 224 + 7) >> 2) & 0xFFE; | |
100 | - | |
101 | - for(; TMapX < TMapXEnd;) | |
102 | - { | |
103 | - TMap = *(pbTMap + (TMapX++ & 0x3F)); | |
104 | - TMap |= *(pbTMap + (TMapX++ & 0x3F)) << 8; | |
105 | - | |
106 | - if(IO[COLCTL] & 0x40) // 16 colors | |
107 | - { | |
108 | - if(TMap & MAP_BANK) | |
109 | - { | |
110 | - pbTData = IRAM + 0x8000; | |
111 | - } | |
112 | - else | |
113 | - { | |
114 | - pbTData = IRAM + 0x4000; | |
115 | - } | |
116 | - pbTData += (TMap & MAP_TILE) << 5; | |
117 | - if(TMap & MAP_VREV) | |
118 | - { | |
119 | - pbTData += (7 - OffsetY) << 2; | |
120 | - } | |
121 | - else | |
122 | - { | |
123 | - pbTData += OffsetY << 2; | |
124 | - } | |
125 | - } | |
126 | - else | |
127 | - { | |
128 | - if((IO[COLCTL] & 0x80) && (TMap & MAP_BANK))// 4 colors and bank 1 | |
129 | - { | |
130 | - pbTData = IRAM + 0x4000; | |
131 | - } | |
132 | - else | |
133 | - { | |
134 | - pbTData = IRAM + 0x2000; | |
135 | - } | |
136 | - pbTData += (TMap & MAP_TILE) << 4; | |
137 | - if(TMap & MAP_VREV) | |
138 | - { | |
139 | - pbTData += (7 - OffsetY) << 1; | |
140 | - } | |
141 | - else | |
142 | - { | |
143 | - pbTData += OffsetY << 1; | |
144 | - } | |
145 | - } | |
146 | - | |
147 | - if(IO[COLCTL] & 0x20) // Packed Mode | |
148 | - { | |
149 | - if(IO[COLCTL] & 0x40) // 16 Color | |
150 | - { | |
151 | - index[0] = (pbTData[0] & 0xF0) >> 4; | |
152 | - index[1] = pbTData[0] & 0x0F; | |
153 | - index[2] = (pbTData[1] & 0xF0) >> 4; | |
154 | - index[3] = pbTData[1] & 0x0F; | |
155 | - index[4] = (pbTData[2] & 0xF0) >> 4; | |
156 | - index[5] = pbTData[2] & 0x0F; | |
157 | - index[6] = (pbTData[3] & 0xF0) >> 4; | |
158 | - index[7] = pbTData[3] & 0x0F; | |
159 | - } | |
160 | - else // 4 Color | |
161 | - { | |
162 | - index[0] = (pbTData[0] & 0xC0) >> 6; | |
163 | - index[1] = (pbTData[0] & 0x30) >> 4; | |
164 | - index[2] = (pbTData[0] & 0x0C) >> 2; | |
165 | - index[3] = pbTData[0] & 0x03; | |
166 | - index[4] = (pbTData[1] & 0xC0) >> 6; | |
167 | - index[5] = (pbTData[1] & 0x30) >> 4; | |
168 | - index[6] = (pbTData[1] & 0x0C) >> 2; | |
169 | - index[7] = pbTData[1] & 0x03; | |
170 | - } | |
171 | - } | |
172 | - else | |
173 | - { | |
174 | - if(IO[COLCTL] & 0x40) // 16 Color | |
175 | - { | |
176 | - index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
177 | - index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
178 | - index[0] |= (pbTData[2] & 0x80) ? 0x4 : 0; | |
179 | - index[0] |= (pbTData[3] & 0x80) ? 0x8 : 0; | |
180 | - index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
181 | - index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
182 | - index[1] |= (pbTData[2] & 0x40) ? 0x4 : 0; | |
183 | - index[1] |= (pbTData[3] & 0x40) ? 0x8 : 0; | |
184 | - index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
185 | - index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
186 | - index[2] |= (pbTData[2] & 0x20) ? 0x4 : 0; | |
187 | - index[2] |= (pbTData[3] & 0x20) ? 0x8 : 0; | |
188 | - index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
189 | - index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
190 | - index[3] |= (pbTData[2] & 0x10) ? 0x4 : 0; | |
191 | - index[3] |= (pbTData[3] & 0x10) ? 0x8 : 0; | |
192 | - index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
193 | - index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
194 | - index[4] |= (pbTData[2] & 0x08) ? 0x4 : 0; | |
195 | - index[4] |= (pbTData[3] & 0x08) ? 0x8 : 0; | |
196 | - index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
197 | - index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
198 | - index[5] |= (pbTData[2] & 0x04) ? 0x4 : 0; | |
199 | - index[5] |= (pbTData[3] & 0x04) ? 0x8 : 0; | |
200 | - index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
201 | - index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
202 | - index[6] |= (pbTData[2] & 0x02) ? 0x4 : 0; | |
203 | - index[6] |= (pbTData[3] & 0x02) ? 0x8 : 0; | |
204 | - index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
205 | - index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
206 | - index[7] |= (pbTData[2] & 0x01) ? 0x4 : 0; | |
207 | - index[7] |= (pbTData[3] & 0x01) ? 0x8 : 0; | |
208 | - } | |
209 | - else // 4 Color | |
210 | - { | |
211 | - index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
212 | - index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
213 | - index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
214 | - index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
215 | - index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
216 | - index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
217 | - index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
218 | - index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
219 | - index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
220 | - index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
221 | - index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
222 | - index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
223 | - index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
224 | - index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
225 | - index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
226 | - index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
227 | - } | |
228 | - } | |
229 | - | |
230 | - if(TMap & MAP_HREV) | |
231 | - { | |
232 | - j = index[0]; | |
233 | - index[0] = index[7]; | |
234 | - index[7] = j; | |
235 | - j = index[1]; | |
236 | - index[1] = index[6]; | |
237 | - index[6] = j; | |
238 | - j = index[2]; | |
239 | - index[2] = index[5]; | |
240 | - index[5] = j; | |
241 | - j = index[3]; | |
242 | - index[3] = index[4]; | |
243 | - index[4] = j; | |
244 | - } | |
245 | - | |
246 | - PalIndex = (TMap & MAP_PAL) >> 9; | |
247 | - if((!index[0]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
248 | - else | |
249 | - { | |
250 | - *pSWrBuf++ = Palette[PalIndex][index[0]]; | |
251 | - } | |
252 | - if((!index[1]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
253 | - else | |
254 | - { | |
255 | - *pSWrBuf++ = Palette[PalIndex][index[1]]; | |
256 | - } | |
257 | - if((!index[2]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
258 | - else | |
259 | - { | |
260 | - *pSWrBuf++ = Palette[PalIndex][index[2]]; | |
261 | - } | |
262 | - if((!index[3]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
263 | - else | |
264 | - { | |
265 | - *pSWrBuf++ = Palette[PalIndex][index[3]]; | |
266 | - } | |
267 | - if((!index[4]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
268 | - else | |
269 | - { | |
270 | - *pSWrBuf++ = Palette[PalIndex][index[4]]; | |
271 | - } | |
272 | - if((!index[5]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
273 | - else | |
274 | - { | |
275 | - *pSWrBuf++ = Palette[PalIndex][index[5]]; | |
276 | - } | |
277 | - if((!index[6]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
278 | - else | |
279 | - { | |
280 | - *pSWrBuf++ = Palette[PalIndex][index[6]]; | |
281 | - } | |
282 | - if((!index[7]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
283 | - else | |
284 | - { | |
285 | - *pSWrBuf++ = Palette[PalIndex][index[7]]; | |
286 | - } | |
287 | - } | |
288 | - } | |
289 | -/*********************************************************************/ | |
290 | - memset(ZBuf, 0, sizeof(ZBuf)); | |
291 | - if((IO[DSPCTL] & 0x02) && Layer[1]) //FG layer表示 | |
292 | - { | |
293 | - if((IO[DSPCTL] & 0x30) == 0x20) // ウィンドウ内部のみに表示 | |
294 | - { | |
295 | - for(i = 0, pW = WBuf + 8; i < 224; i++) | |
296 | - { | |
297 | - *pW++ = 1; | |
298 | - } | |
299 | - if((Line >= IO[SCR2WT]) && (Line <= IO[SCR2WB])) | |
300 | - { | |
301 | - for(i = IO[SCR2WL], pW = WBuf + 8 + i; (i <= IO[SCR2WR]) && (i < 224); i++) | |
302 | - { | |
303 | - *pW++ = 0; | |
304 | - } | |
305 | - } | |
306 | - } | |
307 | - else if((IO[DSPCTL] & 0x30) == 0x30) // ウィンドウ外部のみに表示 | |
308 | - { | |
309 | - for(i = 0, pW = WBuf + 8; i < 224; i++) | |
310 | - { | |
311 | - *pW++ = 0; | |
312 | - } | |
313 | - if((Line >= IO[SCR2WT]) && (Line <= IO[SCR2WB])) | |
314 | - { | |
315 | - for(i = IO[SCR2WL], pW = WBuf + 8 + i; (i <= IO[SCR2WR]) && (i < 224); i++) | |
316 | - { | |
317 | - *pW++ = 1; | |
318 | - } | |
319 | - } | |
320 | - } | |
321 | - else | |
322 | - { | |
323 | - for(i = 0, pW = WBuf + 8; i < 224; i++) | |
324 | - { | |
325 | - *pW++ = 0; | |
326 | - } | |
327 | - } | |
328 | - | |
329 | - OffsetX = IO[SCR2X] & 0x07; | |
330 | - pSWrBuf = pSBuf - OffsetX; | |
331 | - i = Line + IO[SCR2Y]; | |
332 | - OffsetY = (i & 0x07); | |
333 | - | |
334 | - pbTMap = Scr2TMap + ((i & 0xF8) << 3); | |
335 | - TMapX = (IO[SCR2X] & 0xF8) >> 2; | |
336 | - TMapXEnd = ((IO[SCR2X] + 224 + 7) >> 2) & 0xFFE; | |
337 | - | |
338 | - pW = WBuf + 8 - OffsetX; | |
339 | - pZ = ZBuf + 8 - OffsetX; | |
340 | - | |
341 | - for(; TMapX < TMapXEnd;) | |
342 | - { | |
343 | - TMap = *(pbTMap + (TMapX++ & 0x3F)); | |
344 | - TMap |= *(pbTMap + (TMapX++ & 0x3F)) << 8; | |
345 | - | |
346 | - if(IO[COLCTL] & 0x40) | |
347 | - { | |
348 | - if(TMap & MAP_BANK) | |
349 | - { | |
350 | - pbTData = IRAM + 0x8000; | |
351 | - } | |
352 | - else | |
353 | - { | |
354 | - pbTData = IRAM + 0x4000; | |
355 | - } | |
356 | - pbTData += (TMap & MAP_TILE) << 5; | |
357 | - if(TMap & MAP_VREV) | |
358 | - { | |
359 | - pbTData += (7 - OffsetY) << 2; | |
360 | - } | |
361 | - else | |
362 | - { | |
363 | - pbTData += OffsetY << 2; | |
364 | - } | |
365 | - } | |
366 | - else | |
367 | - { | |
368 | - if((IO[COLCTL] & 0x80) && (TMap & MAP_BANK))// 4 colors and bank 1 | |
369 | - { | |
370 | - pbTData = IRAM + 0x4000; | |
371 | - } | |
372 | - else | |
373 | - { | |
374 | - pbTData = IRAM + 0x2000; | |
375 | - } | |
376 | - pbTData += (TMap & MAP_TILE) << 4; | |
377 | - if(TMap & MAP_VREV) | |
378 | - { | |
379 | - pbTData += (7 - OffsetY) << 1; | |
380 | - } | |
381 | - else | |
382 | - { | |
383 | - pbTData += OffsetY << 1; | |
384 | - } | |
385 | - } | |
386 | - | |
387 | - if(IO[COLCTL] & 0x20) // Packed Mode | |
388 | - { | |
389 | - if(IO[COLCTL] & 0x40) // 16 Color | |
390 | - { | |
391 | - index[0] = (pbTData[0] & 0xF0) >> 4; | |
392 | - index[1] = pbTData[0] & 0x0F; | |
393 | - index[2] = (pbTData[1] & 0xF0) >> 4; | |
394 | - index[3] = pbTData[1] & 0x0F; | |
395 | - index[4] = (pbTData[2] & 0xF0) >> 4; | |
396 | - index[5] = pbTData[2] & 0x0F; | |
397 | - index[6] = (pbTData[3] & 0xF0) >> 4; | |
398 | - index[7] = pbTData[3] & 0x0F; | |
399 | - } | |
400 | - else // 4 Color | |
401 | - { | |
402 | - index[0] = (pbTData[0] & 0xC0) >> 6; | |
403 | - index[1] = (pbTData[0] & 0x30) >> 4; | |
404 | - index[2] = (pbTData[0] & 0x0C) >> 2; | |
405 | - index[3] = pbTData[0] & 0x03; | |
406 | - index[4] = (pbTData[1] & 0xC0) >> 6; | |
407 | - index[5] = (pbTData[1] & 0x30) >> 4; | |
408 | - index[6] = (pbTData[1] & 0x0C) >> 2; | |
409 | - index[7] = pbTData[1] & 0x03; | |
410 | - } | |
411 | - } | |
412 | - else | |
413 | - { | |
414 | - if(IO[COLCTL] & 0x40) // 16 Color | |
415 | - { | |
416 | - index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
417 | - index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
418 | - index[0] |= (pbTData[2] & 0x80) ? 0x4 : 0; | |
419 | - index[0] |= (pbTData[3] & 0x80) ? 0x8 : 0; | |
420 | - index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
421 | - index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
422 | - index[1] |= (pbTData[2] & 0x40) ? 0x4 : 0; | |
423 | - index[1] |= (pbTData[3] & 0x40) ? 0x8 : 0; | |
424 | - index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
425 | - index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
426 | - index[2] |= (pbTData[2] & 0x20) ? 0x4 : 0; | |
427 | - index[2] |= (pbTData[3] & 0x20) ? 0x8 : 0; | |
428 | - index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
429 | - index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
430 | - index[3] |= (pbTData[2] & 0x10) ? 0x4 : 0; | |
431 | - index[3] |= (pbTData[3] & 0x10) ? 0x8 : 0; | |
432 | - index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
433 | - index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
434 | - index[4] |= (pbTData[2] & 0x08) ? 0x4 : 0; | |
435 | - index[4] |= (pbTData[3] & 0x08) ? 0x8 : 0; | |
436 | - index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
437 | - index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
438 | - index[5] |= (pbTData[2] & 0x04) ? 0x4 : 0; | |
439 | - index[5] |= (pbTData[3] & 0x04) ? 0x8 : 0; | |
440 | - index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
441 | - index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
442 | - index[6] |= (pbTData[2] & 0x02) ? 0x4 : 0; | |
443 | - index[6] |= (pbTData[3] & 0x02) ? 0x8 : 0; | |
444 | - index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
445 | - index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
446 | - index[7] |= (pbTData[2] & 0x01) ? 0x4 : 0; | |
447 | - index[7] |= (pbTData[3] & 0x01) ? 0x8 : 0; | |
448 | - } | |
449 | - else // 4 Color | |
450 | - { | |
451 | - index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
452 | - index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
453 | - index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
454 | - index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
455 | - index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
456 | - index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
457 | - index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
458 | - index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
459 | - index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
460 | - index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
461 | - index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
462 | - index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
463 | - index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
464 | - index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
465 | - index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
466 | - index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
467 | - } | |
468 | - } | |
469 | - | |
470 | - if(TMap & MAP_HREV) | |
471 | - { | |
472 | - j = index[0]; | |
473 | - index[0] = index[7]; | |
474 | - index[7] = j; | |
475 | - j = index[1]; | |
476 | - index[1] = index[6]; | |
477 | - index[6] = j; | |
478 | - j = index[2]; | |
479 | - index[2] = index[5]; | |
480 | - index[5] = j; | |
481 | - j = index[3]; | |
482 | - index[3] = index[4]; | |
483 | - index[4] = j; | |
484 | - } | |
485 | - | |
486 | - PalIndex = (TMap & MAP_PAL) >> 9; | |
487 | - if(((!index[0]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
488 | - else | |
489 | - { | |
490 | - *pSWrBuf++ = Palette[PalIndex][index[0]]; | |
491 | - *pZ = 1; | |
492 | - } | |
493 | - pW++;pZ++; | |
494 | - if(((!index[1]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
495 | - else | |
496 | - { | |
497 | - *pSWrBuf++ = Palette[PalIndex][index[1]]; | |
498 | - *pZ = 1; | |
499 | - } | |
500 | - pW++;pZ++; | |
501 | - if(((!index[2]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
502 | - else | |
503 | - { | |
504 | - *pSWrBuf++ = Palette[PalIndex][index[2]]; | |
505 | - *pZ = 1; | |
506 | - } | |
507 | - pW++;pZ++; | |
508 | - if(((!index[3]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
509 | - else | |
510 | - { | |
511 | - *pSWrBuf++ = Palette[PalIndex][index[3]]; | |
512 | - *pZ = 1; | |
513 | - } | |
514 | - pW++;pZ++; | |
515 | - if(((!index[4]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
516 | - else | |
517 | - { | |
518 | - *pSWrBuf++ = Palette[PalIndex][index[4]]; | |
519 | - *pZ = 1; | |
520 | - } | |
521 | - pW++;pZ++; | |
522 | - if(((!index[5]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
523 | - else | |
524 | - { | |
525 | - *pSWrBuf++ = Palette[PalIndex][index[5]]; | |
526 | - *pZ = 1; | |
527 | - } | |
528 | - pW++;pZ++; | |
529 | - if(((!index[6]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
530 | - else | |
531 | - { | |
532 | - *pSWrBuf++ = Palette[PalIndex][index[6]]; | |
533 | - *pZ = 1; | |
534 | - } | |
535 | - pW++;pZ++; | |
536 | - if(((!index[7]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
537 | - else | |
538 | - { | |
539 | - *pSWrBuf++ = Palette[PalIndex][index[7]]; | |
540 | - *pZ = 1; | |
541 | - } | |
542 | - pW++;pZ++; | |
543 | - } | |
544 | - } | |
545 | -/*********************************************************************/ | |
546 | - if((IO[DSPCTL] & 0x04) && Layer[2]) //sprite | |
547 | - { | |
548 | - if (IO[DSPCTL] & 0x08) //sprite window | |
549 | - { | |
550 | - for (i = 0, pW = WBuf + 8; i < 224; i++) | |
551 | - { | |
552 | - *pW++ = 1; | |
553 | - } | |
554 | - if ((Line >= IO[SPRWT]) && (Line <= IO[SPRWB])) | |
555 | - { | |
556 | - for (i = IO[SPRWL], pW = WBuf + 8 + i; (i <= IO[SPRWR]) && (i < 224); i++) | |
557 | - { | |
558 | - *pW++ = 0; | |
559 | - } | |
560 | - } | |
561 | - } | |
562 | - | |
563 | - for (pbTMap = SprETMap; pbTMap >= SprTTMap; pbTMap -= 4) // | |
564 | - { | |
565 | - TMap = pbTMap[0]; | |
566 | - TMap |= pbTMap[1] << 8; | |
567 | - | |
568 | - if (pbTMap[2] > 0xF8) | |
569 | - { | |
570 | - j = pbTMap[2] - 0x100; | |
571 | - } | |
572 | - else | |
573 | - { | |
574 | - j = pbTMap[2]; | |
575 | - } | |
576 | - if (pbTMap[3] > 0xF8) | |
577 | - { | |
578 | - k = pbTMap[3] - 0x100; | |
579 | - } | |
580 | - else | |
581 | - { | |
582 | - k = pbTMap[3]; | |
583 | - } | |
584 | - | |
585 | - if (Line < j) | |
586 | - continue; | |
587 | - if (Line >= j + 8) | |
588 | - continue; | |
589 | - if (224 <= k) | |
590 | - continue; | |
591 | - | |
592 | - i = k; | |
593 | - pSWrBuf = pSBuf + i; | |
594 | - | |
595 | - if (IO[COLCTL] & 0x40) | |
596 | - { | |
597 | - pbTData = IRAM + 0x4000; | |
598 | - pbTData += (TMap & SPR_TILE) << 5; | |
599 | - if (TMap & SPR_VREV) | |
600 | - { | |
601 | - pbTData += (7 - Line + j) << 2; | |
602 | - } | |
603 | - else | |
604 | - { | |
605 | - pbTData += (Line - j) << 2; | |
606 | - } | |
607 | - } | |
608 | - else | |
609 | - { | |
610 | - pbTData = IRAM + 0x2000; | |
611 | - pbTData += (TMap & SPR_TILE) << 4; | |
612 | - if (TMap & SPR_VREV) | |
613 | - { | |
614 | - pbTData += (7 - Line + j) << 1; | |
615 | - } | |
616 | - else | |
617 | - { | |
618 | - pbTData += (Line - j) << 1; | |
619 | - } | |
620 | - } | |
621 | - | |
622 | - if(IO[COLCTL] & 0x20) // Packed Mode | |
623 | - { | |
624 | - if(IO[COLCTL] & 0x40) // 16 Color | |
625 | - { | |
626 | - index[0] = (pbTData[0] & 0xF0) >> 4; | |
627 | - index[1] = pbTData[0] & 0x0F; | |
628 | - index[2] = (pbTData[1] & 0xF0) >> 4; | |
629 | - index[3] = pbTData[1] & 0x0F; | |
630 | - index[4] = (pbTData[2] & 0xF0) >> 4; | |
631 | - index[5] = pbTData[2] & 0x0F; | |
632 | - index[6] = (pbTData[3] & 0xF0) >> 4; | |
633 | - index[7] = pbTData[3] & 0x0F; | |
634 | - } | |
635 | - else // 4 Color | |
636 | - { | |
637 | - index[0] = (pbTData[0] & 0xC0) >> 6; | |
638 | - index[1] = (pbTData[0] & 0x30) >> 4; | |
639 | - index[2] = (pbTData[0] & 0x0C) >> 2; | |
640 | - index[3] = pbTData[0] & 0x03; | |
641 | - index[4] = (pbTData[1] & 0xC0) >> 6; | |
642 | - index[5] = (pbTData[1] & 0x30) >> 4; | |
643 | - index[6] = (pbTData[1] & 0x0C) >> 2; | |
644 | - index[7] = pbTData[1] & 0x03; | |
645 | - } | |
646 | - } | |
647 | - else | |
648 | - { | |
649 | - if(IO[COLCTL] & 0x40) // 16 Color | |
650 | - { | |
651 | - index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
652 | - index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
653 | - index[0] |= (pbTData[2] & 0x80) ? 0x4 : 0; | |
654 | - index[0] |= (pbTData[3] & 0x80) ? 0x8 : 0; | |
655 | - index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
656 | - index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
657 | - index[1] |= (pbTData[2] & 0x40) ? 0x4 : 0; | |
658 | - index[1] |= (pbTData[3] & 0x40) ? 0x8 : 0; | |
659 | - index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
660 | - index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
661 | - index[2] |= (pbTData[2] & 0x20) ? 0x4 : 0; | |
662 | - index[2] |= (pbTData[3] & 0x20) ? 0x8 : 0; | |
663 | - index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
664 | - index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
665 | - index[3] |= (pbTData[2] & 0x10) ? 0x4 : 0; | |
666 | - index[3] |= (pbTData[3] & 0x10) ? 0x8 : 0; | |
667 | - index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
668 | - index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
669 | - index[4] |= (pbTData[2] & 0x08) ? 0x4 : 0; | |
670 | - index[4] |= (pbTData[3] & 0x08) ? 0x8 : 0; | |
671 | - index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
672 | - index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
673 | - index[5] |= (pbTData[2] & 0x04) ? 0x4 : 0; | |
674 | - index[5] |= (pbTData[3] & 0x04) ? 0x8 : 0; | |
675 | - index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
676 | - index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
677 | - index[6] |= (pbTData[2] & 0x02) ? 0x4 : 0; | |
678 | - index[6] |= (pbTData[3] & 0x02) ? 0x8 : 0; | |
679 | - index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
680 | - index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
681 | - index[7] |= (pbTData[2] & 0x01) ? 0x4 : 0; | |
682 | - index[7] |= (pbTData[3] & 0x01) ? 0x8 : 0; | |
683 | - } | |
684 | - else // 4 Color | |
685 | - { | |
686 | - index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
687 | - index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
688 | - index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
689 | - index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
690 | - index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
691 | - index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
692 | - index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
693 | - index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
694 | - index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
695 | - index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
696 | - index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
697 | - index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
698 | - index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
699 | - index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
700 | - index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
701 | - index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
702 | - } | |
703 | - } | |
704 | - | |
705 | - if (TMap & SPR_HREV) | |
706 | - { | |
707 | - j = index[0]; | |
708 | - index[0] = index[7]; | |
709 | - index[7] = j; | |
710 | - j = index[1]; | |
711 | - index[1] = index[6]; | |
712 | - index[6] = j; | |
713 | - j = index[2]; | |
714 | - index[2] = index[5]; | |
715 | - index[5] = j; | |
716 | - j = index[3]; | |
717 | - index[3] = index[4]; | |
718 | - index[4] = j; | |
719 | - } | |
720 | - | |
721 | - pW = WBuf + 8 + k; | |
722 | - pZ = ZBuf + k + 8; | |
723 | - PalIndex = ((TMap & SPR_PAL) >> 9) + 8; | |
724 | - for(i = 0; i < 8; i++, pZ++, pW++) | |
725 | - { | |
726 | - if(IO[DSPCTL] & 0x08) | |
727 | - { | |
728 | - if(TMap & SPR_CLIP) | |
729 | - { | |
730 | - if(!*pW) | |
731 | - { | |
732 | - pSWrBuf++; | |
733 | - continue; | |
734 | - } | |
735 | - } | |
736 | - else | |
737 | - { | |
738 | - if(*pW) | |
739 | - { | |
740 | - pSWrBuf++; | |
741 | - continue; | |
742 | - } | |
743 | - } | |
744 | - } | |
745 | - if((!index[i]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) | |
746 | - { | |
747 | - pSWrBuf++; | |
748 | - continue; | |
749 | - } | |
750 | - if((*pZ) && (!(TMap & SPR_LAYR))) | |
751 | - { | |
752 | - pSWrBuf++; | |
753 | - continue; | |
754 | - } | |
755 | - *pSWrBuf++ = Palette[PalIndex][index[i]]; | |
756 | - } | |
757 | - } | |
758 | - } | |
759 | -} | |
760 | - | |
761 | -/* | |
762 | - 8 * 144 のサイズを 32 * 576 で描画 | |
763 | -*/ | |
764 | -void RenderSegment(void) | |
765 | -{ | |
766 | - int bit, x, y, i; | |
767 | - WORD* p = SegmentBuffer; | |
768 | - BYTE lcd[11] = {0x20, 0x10, 0x08, 0x04, 0x02, 0x40, 0, 0, 0x01, 0x80, 0}; // 大、中、小、横、縦、ヘッドホン、音量、電池、スリープ | |
769 | - | |
770 | - for (i = 0; i < 11; i++) | |
771 | - { | |
772 | - for (y = 0; y < segLine[i]; y++) | |
773 | - { | |
774 | - for (x = 0; x < 4; x++) | |
775 | - { | |
776 | - BYTE ch = seg[i][y * 4 + x]; | |
777 | - for (bit = 0; bit < 8; bit++) | |
778 | - { | |
779 | - if (ch & 0x80) | |
780 | - { | |
781 | - if (Segment[i]) | |
782 | - { | |
783 | - *p++ = 0xFCCC; | |
784 | - } | |
785 | - else | |
786 | - { | |
787 | - *p++ = 0xF222; | |
788 | - } | |
789 | - } | |
790 | - else | |
791 | - { | |
792 | - *p++ = 0xF000; | |
793 | - } | |
794 | - ch <<= 1; | |
795 | - } | |
796 | - } | |
797 | - } | |
798 | - } | |
799 | -} | |
800 | - | |
801 | -void RenderSleep(void) | |
802 | -{ | |
803 | - int x, y; | |
804 | - WORD* p; | |
805 | - | |
806 | - // 背景をグレイでクリア | |
807 | - p = FrameBuffer[0] + 8; | |
808 | - for (y = 0; y < 144; y++) | |
809 | - { | |
810 | - for (x = 0; x < 224; x++) | |
811 | - { | |
812 | - *p++ = 0xF444; | |
813 | - } | |
814 | - p += 32; | |
815 | - } | |
816 | - drawDraw(); | |
817 | -} |
@@ -1,17 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include <windows.h> | |
7 | -#include <tchar.h> | |
8 | -#include "WSError.h" | |
9 | - | |
10 | -void ErrorMsg(long err) | |
11 | -{ | |
12 | - TCHAR dst[512]; | |
13 | - | |
14 | - _stprintf_s(dst, 512, TEXT("%lX"), err); | |
15 | - MessageBox(NULL, dst, TEXT("WS エラー"), MB_OK); | |
16 | -} | |
17 | - |
@@ -1,305 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include "WSInput.h" | |
7 | - | |
8 | -int WsKeyboardH[13]; | |
9 | -int WsKeyboardV[13]; | |
10 | -int WsJoypadH[13]; | |
11 | -int WsJoypadV[13]; | |
12 | -LPDIRECTINPUTDEVICE8 lpKeyDevice; | |
13 | -LPDIRECTINPUTDEVICE8 lpJoyDevice; | |
14 | -static int* WsJoypad; | |
15 | -static int* WsKeyboard; | |
16 | -static LPDIRECTINPUT8 lpDInput; | |
17 | -static DIJOYSTATE2 js; | |
18 | - | |
19 | -BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* lpddi, LPVOID lpContext) | |
20 | -{ | |
21 | - HRESULT hRet; | |
22 | - | |
23 | - hRet = lpDInput->CreateDevice(lpddi->guidInstance, &lpJoyDevice, NULL); | |
24 | - if(FAILED(hRet)) return DIENUM_CONTINUE; | |
25 | - | |
26 | - return DIENUM_STOP; | |
27 | -} | |
28 | - | |
29 | -int WsInputJoyInit(HWND hw) | |
30 | -{ | |
31 | - HRESULT hRet; | |
32 | - if (lpJoyDevice != NULL) | |
33 | - return TRUE; | |
34 | - | |
35 | - hRet = lpDInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY); | |
36 | - if (hRet != DI_OK){ | |
37 | - if (lpJoyDevice != NULL) | |
38 | - { | |
39 | - lpJoyDevice->Release(); | |
40 | - lpJoyDevice = NULL; | |
41 | - } | |
42 | - return FALSE; | |
43 | - } | |
44 | - if (lpJoyDevice == NULL) | |
45 | - { | |
46 | - return FALSE; | |
47 | - } | |
48 | - hRet = lpJoyDevice->SetDataFormat(&c_dfDIJoystick2); | |
49 | - if (hRet != DI_OK){ | |
50 | - if (lpJoyDevice != NULL) | |
51 | - { | |
52 | - lpJoyDevice->Release(); | |
53 | - lpJoyDevice = NULL; | |
54 | - } | |
55 | - return FALSE; | |
56 | - } | |
57 | - hRet = lpJoyDevice->SetCooperativeLevel(hw, DISCL_EXCLUSIVE | DISCL_FOREGROUND); | |
58 | - if (hRet != DI_OK){ | |
59 | - if (lpJoyDevice != NULL) | |
60 | - { | |
61 | - lpJoyDevice->Release(); | |
62 | - lpJoyDevice = NULL; | |
63 | - } | |
64 | - return FALSE; | |
65 | - } | |
66 | - lpJoyDevice->Acquire(); | |
67 | - | |
68 | - return TRUE; | |
69 | -} | |
70 | - | |
71 | -int WsInputInit(HWND hw) | |
72 | -{ | |
73 | - DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)&lpDInput, NULL); | |
74 | - lpDInput->CreateDevice(GUID_SysKeyboard, &lpKeyDevice, NULL); | |
75 | - lpKeyDevice->SetDataFormat(&c_dfDIKeyboard); | |
76 | - lpKeyDevice->SetCooperativeLevel(hw, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); | |
77 | - return WsInputJoyInit(hw); | |
78 | -} | |
79 | - | |
80 | -void WsInputJoyRelease(void) | |
81 | -{ | |
82 | - if (lpJoyDevice != NULL) | |
83 | - { | |
84 | - lpJoyDevice->Unacquire(); | |
85 | - lpJoyDevice->Release(); | |
86 | - lpJoyDevice = NULL; | |
87 | - } | |
88 | -} | |
89 | - | |
90 | -void WsInputRelease(void) | |
91 | -{ | |
92 | - if (lpKeyDevice != NULL) | |
93 | - { | |
94 | - lpKeyDevice->Unacquire(); | |
95 | - lpKeyDevice->Release(); | |
96 | - lpKeyDevice = NULL; | |
97 | - } | |
98 | - if (lpDInput != NULL) | |
99 | - { | |
100 | - lpDInput->Release(); | |
101 | - lpDInput = NULL; | |
102 | - } | |
103 | - WsInputJoyRelease(); | |
104 | -} | |
105 | - | |
106 | -#define HALFRECT JOY_POVRIGHT / 2 | |
107 | -int WsInputCheckJoy(int value) | |
108 | -{ | |
109 | - int i; | |
110 | - | |
111 | - if ((value >= 1) && (value <= 128)) | |
112 | - { | |
113 | - return((js.rgbButtons[value - 1] & 0x80) ? 1 : 0); | |
114 | - } | |
115 | - if ((value & 0x1100) == 0x100) | |
116 | - { | |
117 | - i = (value & 0x30) >> 4; | |
118 | - switch (value & 0x0F) | |
119 | - { | |
120 | - case 1: | |
121 | - if (js.rgdwPOV[i] == JOY_POVLEFT + HALFRECT) return 1; | |
122 | - if (js.rgdwPOV[i] == JOY_POVFORWARD) return 1; | |
123 | - if (js.rgdwPOV[i] == JOY_POVFORWARD + HALFRECT) return 1; | |
124 | - break; | |
125 | - case 2: | |
126 | - if (js.rgdwPOV[i] == JOY_POVFORWARD + HALFRECT) return 1; | |
127 | - if (js.rgdwPOV[i] == JOY_POVRIGHT) return 1; | |
128 | - if (js.rgdwPOV[i] == JOY_POVRIGHT + HALFRECT) return 1; | |
129 | - break; | |
130 | - case 4: | |
131 | - if (js.rgdwPOV[i] == JOY_POVRIGHT + HALFRECT) return 1; | |
132 | - if (js.rgdwPOV[i] == JOY_POVBACKWARD) return 1; | |
133 | - if (js.rgdwPOV[i] == JOY_POVBACKWARD + HALFRECT) return 1; | |
134 | - break; | |
135 | - case 8: | |
136 | - if (js.rgdwPOV[i] == JOY_POVBACKWARD + HALFRECT) return 1; | |
137 | - if (js.rgdwPOV[i] == JOY_POVLEFT) return 1; | |
138 | - if (js.rgdwPOV[i] == JOY_POVLEFT + HALFRECT) return 1; | |
139 | - break; | |
140 | - } | |
141 | - return 0; | |
142 | - } | |
143 | - switch (value) | |
144 | - { | |
145 | - case WS_JOY_AXIS_X_P: | |
146 | - if (js.lX > 0xC000) return 1; | |
147 | - break; | |
148 | - case WS_JOY_AXIS_X_M: | |
149 | - if (js.lX < 0x4000) return 1; | |
150 | - break; | |
151 | - case WS_JOY_AXIS_Y_P: | |
152 | - if (js.lY > 0xC000) return 1; | |
153 | - break; | |
154 | - case WS_JOY_AXIS_Y_M: | |
155 | - if (js.lY < 0x4000) return 1; | |
156 | - break; | |
157 | - case WS_JOY_AXIS_Z_P: | |
158 | - if (js.lZ > 0xC000) return 1; | |
159 | - break; | |
160 | - case WS_JOY_AXIS_Z_M: | |
161 | - if (js.lZ < 0x4000) return 1; | |
162 | - break; | |
163 | - case WS_JOY_AXIS_RX_P: | |
164 | - if (js.lRx > 0xC000) return 1; | |
165 | - break; | |
166 | - case WS_JOY_AXIS_RX_M: | |
167 | - if (js.lRx < 0x4000) return 1; | |
168 | - break; | |
169 | - case WS_JOY_AXIS_RY_P: | |
170 | - if (js.lRy > 0xC000) return 1; | |
171 | - break; | |
172 | - case WS_JOY_AXIS_RY_M: | |
173 | - if (js.lRy < 0x4000) return 1; | |
174 | - break; | |
175 | - case WS_JOY_AXIS_RZ_P: | |
176 | - if (js.lRz > 0xC000) return 1; | |
177 | - break; | |
178 | - case WS_JOY_AXIS_RZ_M: | |
179 | - if (js.lRz < 0x4000) return 1; | |
180 | - break; | |
181 | - case WS_JOY_SLIDER1_P: | |
182 | - if (js.rglSlider[0] > 0xC000) return 1; | |
183 | - break; | |
184 | - case WS_JOY_SLIDER1_M: | |
185 | - if (js.rglSlider[0] < 0x4000) return 1; | |
186 | - break; | |
187 | - case WS_JOY_SLIDER2_P: | |
188 | - if (js.rglSlider[1] > 0xC000) return 1; | |
189 | - break; | |
190 | - case WS_JOY_SLIDER2_M: | |
191 | - if (js.rglSlider[1] < 0x4000) return 1; | |
192 | - break; | |
193 | - } | |
194 | - return 0; | |
195 | -} | |
196 | - | |
197 | -WORD WsInputGetState(void) | |
198 | -{ | |
199 | - int i; | |
200 | - HRESULT hRet; | |
201 | - BYTE diKeys[256]; | |
202 | - WORD JoyState = 0; | |
203 | - WORD KeyState = 0; | |
204 | - | |
205 | - ZeroMemory(&js, sizeof(DIJOYSTATE2)); | |
206 | - ZeroMemory(diKeys, 256); | |
207 | - if (lpKeyDevice != NULL) | |
208 | - { | |
209 | - hRet = lpKeyDevice->Acquire(); | |
210 | - if (hRet == DI_OK || hRet == S_FALSE) | |
211 | - { | |
212 | - hRet = lpKeyDevice->GetDeviceState(256, diKeys); | |
213 | - if (hRet == DI_OK) | |
214 | - { | |
215 | - for (i = 0; i < 12; i++) | |
216 | - { | |
217 | - KeyState <<= 1; | |
218 | - if (diKeys[WsKeyboard[i]] & 0x80) | |
219 | - { | |
220 | - KeyState |= 1; | |
221 | - } | |
222 | - } | |
223 | - } | |
224 | - } | |
225 | - } | |
226 | - if (lpJoyDevice != NULL) | |
227 | - { | |
228 | - hRet = lpJoyDevice->Poll(); | |
229 | - if (FAILED(hRet)) | |
230 | - { | |
231 | - hRet = lpJoyDevice->Acquire(); | |
232 | - while (hRet == DIERR_INPUTLOST) | |
233 | - { | |
234 | - hRet = lpJoyDevice->Acquire(); | |
235 | - } | |
236 | - return KeyState; | |
237 | - } | |
238 | - hRet = lpJoyDevice->GetDeviceState(sizeof(DIJOYSTATE2), &js); | |
239 | - if (hRet == DI_OK){ | |
240 | - for (i = 0; i < 12; i++) | |
241 | - { | |
242 | - JoyState <<= 1; | |
243 | - JoyState |= WsInputCheckJoy(WsJoypad[i]); | |
244 | - } | |
245 | - } | |
246 | - } | |
247 | - return JoyState | KeyState; | |
248 | -} | |
249 | - | |
250 | -void WsInputSetKeyMap(int mode) | |
251 | -{ | |
252 | - if (mode & 1) | |
253 | - { | |
254 | - WsJoypad = WsJoypadV; | |
255 | - WsKeyboard = WsKeyboardV; | |
256 | - } | |
257 | - else | |
258 | - { | |
259 | - WsJoypad = WsJoypadH; | |
260 | - WsKeyboard = WsKeyboardH; | |
261 | - } | |
262 | -} | |
263 | - | |
264 | -int WsInputGetNowait(void) | |
265 | -{ | |
266 | - HRESULT hRet; | |
267 | - BYTE diKeys[256]; | |
268 | - int flag = 0; | |
269 | - | |
270 | - ZeroMemory(&js, sizeof(DIJOYSTATE2)); | |
271 | - ZeroMemory(diKeys, 256); | |
272 | - if (lpKeyDevice != NULL) | |
273 | - { | |
274 | - hRet = lpKeyDevice->Acquire(); | |
275 | - if (hRet == DI_OK || hRet == S_FALSE) | |
276 | - { | |
277 | - hRet = lpKeyDevice->GetDeviceState(256, diKeys); | |
278 | - if (hRet == DI_OK) | |
279 | - { | |
280 | - if (diKeys[WsKeyboard[12]] & 0x80) | |
281 | - { | |
282 | - flag = 1; | |
283 | - } | |
284 | - } | |
285 | - } | |
286 | - } | |
287 | - if (lpJoyDevice != NULL) | |
288 | - { | |
289 | - hRet = lpJoyDevice->Poll(); | |
290 | - if (FAILED(hRet)) | |
291 | - { | |
292 | - hRet = lpJoyDevice->Acquire(); | |
293 | - while (hRet == DIERR_INPUTLOST) | |
294 | - { | |
295 | - hRet = lpJoyDevice->Acquire(); | |
296 | - } | |
297 | - return flag; | |
298 | - } | |
299 | - hRet = lpJoyDevice->GetDeviceState(sizeof(DIJOYSTATE2), &js); | |
300 | - if (hRet == DI_OK){ | |
301 | - flag |= WsInputCheckJoy(WsJoypad[12]); | |
302 | - } | |
303 | - } | |
304 | - return flag; | |
305 | -} |
@@ -1,494 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include <windows.h> | |
7 | -#include <mmsystem.h> | |
8 | -#include "../resource.h" | |
9 | -#include "WSHard.h" | |
10 | -#include "WSApu.h" | |
11 | -#include "WSError.h" | |
12 | -#include "WSInput.h" | |
13 | - | |
14 | -#define BUFSIZEN 0x10000 | |
15 | -#define BPSWAV 12000 // WSのHblankが12KHz | |
16 | -#define BUFSIZEW 64 | |
17 | -#define BUFCOUNT 30 | |
18 | - | |
19 | -unsigned long WaveMap; | |
20 | -SOUND Ch[4]; | |
21 | -int VoiceOn; | |
22 | -SWEEP Swp; | |
23 | -NOISE Noise; | |
24 | -int Sound[7] = {1, 1, 1, 1, 1, 1, 1}; | |
25 | -int WsWaveVol = 4; | |
26 | - | |
27 | -static unsigned char PData[4][32]; | |
28 | -static unsigned char PDataN[8][BUFSIZEN]; | |
29 | -static unsigned int RandData[BUFSIZEN]; | |
30 | - | |
31 | -static HWAVEOUT hWaveOut; | |
32 | -static WAVEHDR *whdr[BUFCOUNT]; | |
33 | -static int rBuf, wBuf, wPos; | |
34 | - | |
35 | -extern HWND hWnd; | |
36 | -extern BYTE *Page[16]; | |
37 | -extern BYTE IO[0x100]; | |
38 | - | |
39 | - | |
40 | - | |
41 | -void CALLBACK apuWaveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) | |
42 | -{ | |
43 | - switch (uMsg) | |
44 | - { | |
45 | - case WOM_OPEN: | |
46 | - break; | |
47 | - case WOM_DONE: | |
48 | - rBuf++; | |
49 | - if (rBuf >= BUFCOUNT) | |
50 | - { | |
51 | - rBuf = 0; | |
52 | - } | |
53 | - break; | |
54 | - case WOM_CLOSE: | |
55 | - break; | |
56 | - } | |
57 | -} | |
58 | - | |
59 | -int apuWaveCreate(void) | |
60 | -{ | |
61 | - MMRESULT result; | |
62 | - WAVEFORMATEX wfe; | |
63 | - int i; | |
64 | - TCHAR msg[255]; | |
65 | - | |
66 | - rBuf = 0; | |
67 | - wBuf = 0; | |
68 | - wPos = 0; | |
69 | - ZeroMemory(&wfe, sizeof(wfe)); | |
70 | - wfe.wFormatTag = WAVE_FORMAT_PCM; | |
71 | - wfe.nChannels = 2; | |
72 | - wfe.wBitsPerSample = 16; | |
73 | - wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample / 8; | |
74 | - wfe.nSamplesPerSec = BPSWAV; | |
75 | - wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign; | |
76 | - result = waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfe, (DWORD_PTR)apuWaveOutProc, NULL, CALLBACK_FUNCTION); | |
77 | - if (result != MMSYSERR_NOERROR ) | |
78 | - { | |
79 | - waveOutGetErrorText(result, msg, sizeof(msg)); | |
80 | - ErrorMsg(ERR_WAVEOUT_OPEN); | |
81 | - } | |
82 | - for (i = 0; i < BUFCOUNT; i++) | |
83 | - { | |
84 | - whdr[i] = (WAVEHDR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WAVEHDR)); | |
85 | - whdr[i]->lpData = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BUFSIZEW * 4); | |
86 | - whdr[i]->dwBufferLength = BUFSIZEW * 4; | |
87 | - whdr[i]->dwFlags = 0; | |
88 | - whdr[i]->dwLoops = 0; | |
89 | - result = waveOutPrepareHeader(hWaveOut, whdr[i], sizeof(WAVEHDR)); | |
90 | - if (result != MMSYSERR_NOERROR ) | |
91 | - { | |
92 | - waveOutGetErrorText(result, msg, sizeof(msg)); | |
93 | - ErrorMsg(ERR_WAVEOUT_PREPAREHEADER); | |
94 | - } | |
95 | - } | |
96 | - return 0; | |
97 | -} | |
98 | - | |
99 | -void apuWaveRelease(void) | |
100 | -{ | |
101 | - int i; | |
102 | - | |
103 | - waveOutReset(hWaveOut); | |
104 | - for(i = 0; i < BUFCOUNT; i++) | |
105 | - { | |
106 | - if (whdr[i]) | |
107 | - { | |
108 | - waveOutUnprepareHeader(hWaveOut,whdr[i],sizeof(WAVEHDR)); | |
109 | - HeapFree(GetProcessHeap(),0,whdr[i]->lpData); | |
110 | - HeapFree(GetProcessHeap(),0,whdr[i]); | |
111 | - whdr[i] = NULL; | |
112 | - } | |
113 | - } | |
114 | - waveOutClose(hWaveOut); | |
115 | - return; | |
116 | -} | |
117 | - | |
118 | -void apuWaveClear(void) | |
119 | -{ | |
120 | - int i; | |
121 | - | |
122 | - waveOutReset(hWaveOut); | |
123 | - for (i = 0; i < BUFCOUNT; i++) | |
124 | - { | |
125 | - ZeroMemory(whdr[i]->lpData, BUFSIZEW * 4); | |
126 | - } | |
127 | - rBuf = 0; | |
128 | - wBuf = 0; | |
129 | - wPos = 0; | |
130 | -} | |
131 | - | |
132 | -int apuInit(void) | |
133 | -{ | |
134 | - int i, j; | |
135 | - | |
136 | - for (i = 0; i < 4; i++) | |
137 | - { | |
138 | - for (j = 0; j < 32; j++) | |
139 | - { | |
140 | - PData[i][j] = 8; | |
141 | - } | |
142 | - } | |
143 | - for (i = 0; i < 8; i++) | |
144 | - { | |
145 | - for (j = 0; j < BUFSIZEN; j++) | |
146 | - { | |
147 | - PDataN[i][j] = ((apuMrand(15 - i) & 1) ? 15 : 0); | |
148 | - } | |
149 | - } | |
150 | - | |
151 | - for (i = 0; i < BUFSIZEN; i++) | |
152 | - { | |
153 | - RandData[i] = apuMrand(15); | |
154 | - } | |
155 | - apuWaveCreate(); | |
156 | - return 0; | |
157 | -} | |
158 | - | |
159 | -void apuEnd(void) | |
160 | -{ | |
161 | - apuWaveRelease(); | |
162 | - apuDestroySound(); | |
163 | -} | |
164 | - | |
165 | -unsigned int apuMrand(unsigned int Degree) | |
166 | -{ | |
167 | -#define BIT(n) (1<<n) | |
168 | - typedef struct | |
169 | - { | |
170 | - unsigned int N; | |
171 | - int InputBit; | |
172 | - int Mask; | |
173 | - } POLYNOMIAL; | |
174 | - | |
175 | - static POLYNOMIAL TblMask[]= | |
176 | - { | |
177 | - { 2,BIT(2) ,BIT(0)|BIT(1)}, | |
178 | - { 3,BIT(3) ,BIT(0)|BIT(1)}, | |
179 | - { 4,BIT(4) ,BIT(0)|BIT(1)}, | |
180 | - { 5,BIT(5) ,BIT(0)|BIT(2)}, | |
181 | - { 6,BIT(6) ,BIT(0)|BIT(1)}, | |
182 | - { 7,BIT(7) ,BIT(0)|BIT(1)}, | |
183 | - { 8,BIT(8) ,BIT(0)|BIT(2)|BIT(3)|BIT(4)}, | |
184 | - { 9,BIT(9) ,BIT(0)|BIT(4)}, | |
185 | - {10,BIT(10),BIT(0)|BIT(3)}, | |
186 | - {11,BIT(11),BIT(0)|BIT(2)}, | |
187 | - {12,BIT(12),BIT(0)|BIT(1)|BIT(4)|BIT(6)}, | |
188 | - {13,BIT(13),BIT(0)|BIT(1)|BIT(3)|BIT(4)}, | |
189 | - {14,BIT(14),BIT(0)|BIT(1)|BIT(4)|BIT(5)}, | |
190 | - {15,BIT(15),BIT(0)|BIT(1)}, | |
191 | - { 0, 0, 0}, | |
192 | - }; | |
193 | - static POLYNOMIAL *pTbl = TblMask; | |
194 | - static int ShiftReg = BIT(2)-1; | |
195 | - int XorReg = 0; | |
196 | - int Masked; | |
197 | - | |
198 | - if(pTbl->N != Degree) | |
199 | - { | |
200 | - pTbl = TblMask; | |
201 | - while(pTbl->N) { | |
202 | - if(pTbl->N == Degree) | |
203 | - { | |
204 | - break; | |
205 | - } | |
206 | - pTbl++; | |
207 | - } | |
208 | - if(!pTbl->N) | |
209 | - { | |
210 | - pTbl--; | |
211 | - } | |
212 | - ShiftReg &= pTbl->InputBit-1; | |
213 | - if(!ShiftReg) | |
214 | - { | |
215 | - ShiftReg = pTbl->InputBit-1; | |
216 | - } | |
217 | - } | |
218 | - Masked = ShiftReg & pTbl->Mask; | |
219 | - while(Masked) | |
220 | - { | |
221 | - XorReg ^= Masked & 0x01; | |
222 | - Masked >>= 1; | |
223 | - } | |
224 | - if(XorReg) | |
225 | - { | |
226 | - ShiftReg |= pTbl->InputBit; | |
227 | - } | |
228 | - else | |
229 | - { | |
230 | - ShiftReg &= ~pTbl->InputBit; | |
231 | - } | |
232 | - ShiftReg >>= 1; | |
233 | - return ShiftReg; | |
234 | -} | |
235 | - | |
236 | -void apuSetPData(int addr, unsigned char val) | |
237 | -{ | |
238 | - int i, j; | |
239 | - | |
240 | - i = (addr & 0x30) >> 4; | |
241 | - j = (addr & 0x0F) << 1; | |
242 | - PData[i][j]=(unsigned char)(val & 0x0F); | |
243 | - PData[i][j + 1]=(unsigned char)((val & 0xF0)>>4); | |
244 | -} | |
245 | - | |
246 | -unsigned char apuVoice(void) | |
247 | -{ | |
248 | - static int index = 0, b = 0; | |
249 | - unsigned char v; | |
250 | - | |
251 | - if ((IO[SDMACTL] & 0x98) == 0x98) { // Hyper voice | |
252 | - v = Page[IO[SDMASH] + b][*(WORD*)(IO + SDMASL) + index++]; | |
253 | - if ((*(WORD*)(IO + SDMASL) + index) == 0) | |
254 | - { | |
255 | - b++; | |
256 | - } | |
257 | - if (v < 0x80) | |
258 | - { | |
259 | - v += 0x80; | |
260 | - } | |
261 | - else | |
262 | - { | |
263 | - v -= 0x80; | |
264 | - } | |
265 | - if (*(WORD*)(IO+SDMACNT) <= index) | |
266 | - { | |
267 | - index = 0; | |
268 | - b = 0; | |
269 | - } | |
270 | - return v; | |
271 | - } | |
272 | - else if ((IO[SDMACTL] & 0x88) == 0x80) { // DMA start | |
273 | - IO[SND2VOL] = Page[IO[SDMASH] + b][*(WORD*)(IO + SDMASL) + index++]; | |
274 | - if ((*(WORD*)(IO + SDMASL) + index) == 0) | |
275 | - { | |
276 | - b++; | |
277 | - } | |
278 | - if (*(WORD*)(IO + SDMACNT) <= index) | |
279 | - { | |
280 | - IO[SDMACTL] &= 0x7F; // DMA end | |
281 | - *(WORD*)(IO + SDMACNT) = 0; | |
282 | - index = 0; | |
283 | - b = 0; | |
284 | - } | |
285 | - } | |
286 | - return ((VoiceOn && Sound[4]) ? IO[SND2VOL] : 0x80); | |
287 | -} | |
288 | - | |
289 | -void apuSweep(void) | |
290 | -{ | |
291 | - if ((Swp.step) && Swp.on) // sweep on | |
292 | - { | |
293 | - if (Swp.cnt < 0) | |
294 | - { | |
295 | - Swp.cnt = Swp.time; | |
296 | - Ch[2].freq += Swp.step; | |
297 | - Ch[2].freq &= 0x7ff; | |
298 | - } | |
299 | - Swp.cnt--; | |
300 | - } | |
301 | -} | |
302 | - | |
303 | -WORD apuShiftReg(void) | |
304 | -{ | |
305 | - static int nPos = 0; | |
306 | - // Noise counter | |
307 | - if (++nPos >= BUFSIZEN) | |
308 | - { | |
309 | - nPos = 0; | |
310 | - } | |
311 | - return RandData[nPos]; | |
312 | -} | |
313 | - | |
314 | -void apuWaveSet(void) | |
315 | -{ | |
316 | - static int point[] = {0, 0, 0, 0}; | |
317 | - static int preindex[] = {0, 0, 0, 0}; | |
318 | - int channel, index; | |
319 | - short value, lVol[4], rVol[4]; | |
320 | - short LL, RR, vVol; | |
321 | - static int wait = 0; | |
322 | - short *dataAdr; | |
323 | - | |
324 | - if (WsInputGetNowait()) | |
325 | - { | |
326 | - wait = 1; | |
327 | - } | |
328 | - else if (wait) | |
329 | - { | |
330 | - wait = 0; | |
331 | - apuWaveClear(); | |
332 | - } | |
333 | - apuSweep(); | |
334 | - for (channel = 0; channel < 4; channel++) | |
335 | - { | |
336 | - lVol[channel] = 0; | |
337 | - rVol[channel] = 0; | |
338 | - if (Ch[channel].on) | |
339 | - { | |
340 | - if (channel == 1 && VoiceOn && Sound[4]) | |
341 | - { | |
342 | - continue; | |
343 | - } | |
344 | - else if (channel == 2 && Swp.on && !Sound[5]) | |
345 | - { | |
346 | - continue; | |
347 | - } | |
348 | - else if (channel == 3 && Noise.on && Sound[6]) | |
349 | - { | |
350 | - index = (3072000 / BPSWAV) * point[3] / (2048 - Ch[3].freq); | |
351 | - if ((index %= BUFSIZEN) == 0 && preindex[3]) | |
352 | - { | |
353 | - point[3] = 0; | |
354 | - } | |
355 | - value = (short)PDataN[Noise.pattern][index] - 8; | |
356 | - } | |
357 | - else if (Sound[channel] == 0) | |
358 | - { | |
359 | - continue; | |
360 | - } | |
361 | - else { | |
362 | - index = (3072000 / BPSWAV) * point[channel] / (2048 - Ch[channel].freq); | |
363 | - if ((index %= 32) == 0 && preindex[channel]) | |
364 | - { | |
365 | - point[channel] = 0; | |
366 | - } | |
367 | - value = (short)PData[channel][index] - 8; | |
368 | - } | |
369 | - preindex[channel] = index; | |
370 | - point[channel]++; | |
371 | - lVol[channel] = value * Ch[channel].volL; // -8*15=-120, 7*15=105 | |
372 | - rVol[channel] = value * Ch[channel].volR; | |
373 | - } | |
374 | - } | |
375 | - vVol = ((short)apuVoice() - 0x80); | |
376 | - // mix 16bits wave -32768 ~ +32767 32768/120 = 273 | |
377 | - LL = (lVol[0] + lVol[1] + lVol[2] + lVol[3] + vVol) * WsWaveVol; | |
378 | - RR = (rVol[0] + rVol[1] + rVol[2] + rVol[3] + vVol) * WsWaveVol; | |
379 | - dataAdr = (short*)(whdr[wBuf]->lpData); | |
380 | - dataAdr[wPos * 2] = LL; | |
381 | - dataAdr[wPos * 2 + 1] = RR; | |
382 | - if (++wPos >= BUFSIZEW) | |
383 | - { | |
384 | - waveOutWrite(hWaveOut, whdr[wBuf], sizeof(WAVEHDR)); | |
385 | - wPos = 0; | |
386 | - if (++wBuf >= BUFCOUNT) | |
387 | - { | |
388 | - wBuf = 0; | |
389 | - } | |
390 | - if (wait == 0) | |
391 | - { | |
392 | - while (wBuf == rBuf) // 書き込みが再生に追いついた | |
393 | - { | |
394 | - Sleep(1); // WaveOutのコールバック関数でrBufが更新されるまで待つ | |
395 | - } | |
396 | - } | |
397 | - } | |
398 | -} | |
399 | - | |
400 | -/* | |
401 | -PlaySound()は音量調節が出来ないのでいったんメモリに読み込んで | |
402 | -プレイ時にデータを加工する | |
403 | -*/ | |
404 | -static void* SSMasterBuf; | |
405 | -static void* SSPlayBuf; | |
406 | -static DWORD SSDataLen, SSHeadLen; | |
407 | - | |
408 | -void apuLoadSound(void) | |
409 | -{ | |
410 | - HINSTANCE hInst; | |
411 | - HRSRC hRsrc; | |
412 | - HGLOBAL hG; | |
413 | - BYTE* wave; | |
414 | - BYTE* tmp; | |
415 | - DWORD wfesize; | |
416 | - | |
417 | - hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); | |
418 | - hRsrc = FindResource(hInst, MAKEINTRESOURCE(IDR_WAVE1), TEXT("WAVE")); | |
419 | - hG = LoadResource(hInst, hRsrc); | |
420 | - wave = (BYTE*)LockResource(hG); //RIFFヘッダの確認 | |
421 | - tmp = wave; | |
422 | - if (*(LPDWORD)wave != *(LPDWORD)"RIFF") | |
423 | - { | |
424 | - ErrorMsg(ERR_WAVERESOURCE); | |
425 | - return; | |
426 | - } | |
427 | - wave += 4; //ポインタは次を指しておく | |
428 | - wave += 4; //ポインタは次を指しておく | |
429 | - //WAVEヘッダの確認 | |
430 | - if (*(LPDWORD)wave != *(LPDWORD)"WAVE") | |
431 | - { | |
432 | - ErrorMsg(ERR_WAVERESOURCE); | |
433 | - return; | |
434 | - } | |
435 | - wave += 4; //ポインタは次を指しておく | |
436 | - //fmtチャンクの確認 | |
437 | - if (*(LPDWORD)wave != *(LPDWORD)"fmt ") | |
438 | - { | |
439 | - ErrorMsg(ERR_WAVERESOURCE); | |
440 | - return; | |
441 | - } | |
442 | - wave += 4; //ポインタは次を指しておく | |
443 | - //fmtチャンクサイズの取得 | |
444 | - wfesize = *(DWORD *)wave; | |
445 | - wave += 4; //ポインタは次を指しておく | |
446 | - wave += wfesize; //WAVEFORMATEX構造体分だけポインタを進めておく | |
447 | - //dataチャンクの確認 | |
448 | - if (*(LPDWORD)wave != *(LPDWORD)"data") | |
449 | - { | |
450 | - ErrorMsg(ERR_WAVERESOURCE); | |
451 | - return; | |
452 | - } | |
453 | - wave += 4; //ポインタは次を指しておく | |
454 | - //波形データのバイト数の取得 | |
455 | - SSDataLen = *(DWORD *)wave; | |
456 | - wave += 4; //ポインタは次を指しておく | |
457 | - SSHeadLen = wave - tmp; | |
458 | - SSMasterBuf = malloc(SSDataLen); | |
459 | - SSPlayBuf = malloc(SSHeadLen + SSDataLen); | |
460 | - if (SSMasterBuf != NULL && SSPlayBuf != NULL) | |
461 | - { | |
462 | - memcpy(SSMasterBuf, wave, SSDataLen); | |
463 | - memcpy(SSPlayBuf, tmp, SSHeadLen); | |
464 | - } | |
465 | - FreeResource(hG); | |
466 | -} | |
467 | - | |
468 | -void apuDestroySound(void) | |
469 | -{ | |
470 | - free(SSMasterBuf); | |
471 | - SSMasterBuf = NULL; | |
472 | - free(SSPlayBuf); | |
473 | - SSPlayBuf = NULL; | |
474 | -} | |
475 | - | |
476 | -void apuStartupSound(void) | |
477 | -{ | |
478 | - short *src, *dst; | |
479 | - int i; | |
480 | - int size = SSDataLen / sizeof(short); | |
481 | - | |
482 | - if (SSMasterBuf == NULL || SSPlayBuf == NULL) | |
483 | - { | |
484 | - return; | |
485 | - } | |
486 | - src = (short*)SSMasterBuf; | |
487 | - dst = (short*)((BYTE*)SSPlayBuf + SSHeadLen); | |
488 | - // マスターの音量を変更してプレイバッファーにコピー | |
489 | - for (i = 0; i < size; i++) | |
490 | - { | |
491 | - *dst++ = (*src++) * WsWaveVol / 32; | |
492 | - } | |
493 | - PlaySound((LPCTSTR)SSPlayBuf, NULL, SND_MEMORY | SND_ASYNC); | |
494 | -} |
@@ -1,1119 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include <time.h> | |
7 | -#include "WSRender.h" | |
8 | -#include "WS.h" | |
9 | -#include "WSDraw.h" | |
10 | -#include "WSInput.h" | |
11 | -#include "WSApu.h" | |
12 | -#include "WSFileio.h" | |
13 | -#include "WSPdata.h" | |
14 | -#include "WSBandai.h" | |
15 | -#include "WSError.h" | |
16 | -#include "nec/necintrf.h" | |
17 | - | |
18 | -#define IPeriod 32 // HBlank/8 (256/8) | |
19 | - | |
20 | -int Run; | |
21 | -BYTE *Page[16]; // バンク割り当て | |
22 | -BYTE IRAM[0x10000]; // 内部RAM 64kB = Page[0] | |
23 | -BYTE IO[0x100]; // IO | |
24 | -BYTE MemDummy[0x10000]; // ダミーバンク 64kB | |
25 | -BYTE *ROMMap[0x100]; // C-ROMバンクマップ | |
26 | -int ROMBanks; // C-ROMバンク数 | |
27 | -BYTE *RAMMap[0x100]; // C-RAMバンクマップ | |
28 | -int RAMBanks; // C-RAMバンク数 | |
29 | -int RAMSize; // C-RAM総容量 | |
30 | -WORD IEep[64]; // 内蔵EEPROM | |
31 | -struct EEPROM sIEep; // EEPROM読み書き用構造体(内蔵) | |
32 | -struct EEPROM sCEep; // EEPROM読み書き用構造体(カートリッジ) | |
33 | -int CartKind; // セーブメモリの種類(CK_EEP = EEPROM) | |
34 | - | |
35 | -static int ButtonState = 0x0000; // Button state: B.A.START.OPTION.X4.X3.X2.X1.Y4.Y3.Y2.Y1 | |
36 | -static WORD HTimer; | |
37 | -static WORD VTimer; | |
38 | -static int RtcCount; | |
39 | -static int RAMEnable; | |
40 | -static int FrameSkip = 0; | |
41 | -static int SkipCnt = 0; | |
42 | -static int TblSkip[5][5] = { | |
43 | - {1,1,1,1,1}, | |
44 | - {0,1,1,1,1}, | |
45 | - {0,1,0,1,1}, | |
46 | - {0,0,1,0,1}, | |
47 | - {0,0,0,0,1}, | |
48 | -}; | |
49 | -#define MONO(C) 0xF000 | (C)<<8 | (C)<<4 | (C) | |
50 | -static WORD DefColor[] = { | |
51 | - MONO(0xF), MONO(0xE), MONO(0xD), MONO(0xC), MONO(0xB), MONO(0xA), MONO(0x9), MONO(0x8), | |
52 | - MONO(0x7), MONO(0x6), MONO(0x5), MONO(0x4), MONO(0x3), MONO(0x2), MONO(0x1), MONO(0x0) | |
53 | -}; | |
54 | - | |
55 | -void ComEeprom(struct EEPROM *eeprom, WORD *cmd, WORD *data) | |
56 | -{ | |
57 | - int i, j, op, addr; | |
58 | - const int tblmask[16][5]= | |
59 | - { | |
60 | - {0x0000, 0, 0x0000, 0, 0x0000}, // dummy | |
61 | - {0x0000, 0, 0x0000, 0, 0x0000}, | |
62 | - {0x0000, 0, 0x0000, 0, 0x0000}, | |
63 | - {0x0000, 0, 0x0000, 0, 0x0000}, | |
64 | - {0x000C, 2, 0x0003, 0, 0x0003}, | |
65 | - {0x0018, 3, 0x0006, 1, 0x0007}, | |
66 | - {0x0030, 4, 0x000C, 2, 0x000F}, | |
67 | - {0x0060, 5, 0x0018, 3, 0x001F}, | |
68 | - {0x00C0, 6, 0x0030, 4, 0x003F}, // 1Kbits IEEPROM | |
69 | - {0x0180, 7, 0x0060, 5, 0x007F}, | |
70 | - {0x0300, 8, 0x00C0, 6, 0x00FF}, | |
71 | - {0x0600, 9, 0x0180, 7, 0x01FF}, | |
72 | - {0x0C00, 10, 0x0300, 8, 0x03FF}, // 16Kbits | |
73 | - {0x1800, 11, 0x0600, 9, 0x07FF}, | |
74 | - {0x3000, 12, 0x0C00, 10, 0x0FFF}, | |
75 | - {0x6000, 13, 0x1800, 11, 0x1FFF}, | |
76 | - }; | |
77 | - if(eeprom->data == NULL) | |
78 | - { | |
79 | - return; | |
80 | - } | |
81 | - for(i = 15, j = 0x8000; i >= 0; i--, j >>= 1) | |
82 | - { | |
83 | - if(*cmd & j) | |
84 | - { | |
85 | - break; | |
86 | - } | |
87 | - } | |
88 | - op = (*cmd & tblmask[i][0]) >> tblmask[i][1]; | |
89 | - switch(op) | |
90 | - { | |
91 | - case 0: | |
92 | - addr = (*cmd & tblmask[i][2]) >> tblmask[i][3]; | |
93 | - switch(addr) | |
94 | - { | |
95 | - case 0: // 書込み禁止 | |
96 | - eeprom->we = 0; | |
97 | - break; | |
98 | - case 1: // 全アドレス書き込み | |
99 | - for(j = tblmask[i][4]; j >= 0; j--) | |
100 | - { | |
101 | - eeprom->data[j] = *data; | |
102 | - } | |
103 | - break; | |
104 | - case 2: // チップ消去 | |
105 | - if(eeprom->we) | |
106 | - { | |
107 | - memset(eeprom->data, 0xFF, sizeof(eeprom->data)*2); | |
108 | - } | |
109 | - break; | |
110 | - case 3: // 書き込み可能 | |
111 | - eeprom->we = 1; | |
112 | - break; | |
113 | - } | |
114 | - *data = 0; | |
115 | - break; | |
116 | - case 1: // 書き込み | |
117 | - if(eeprom->we) | |
118 | - { | |
119 | - addr = *cmd & tblmask[i][4]; | |
120 | - eeprom->data[addr] = *data; | |
121 | - if (ROMBanks == 1 && addr == 0x3A) // アナザヘブンも書き込んでた | |
122 | - { | |
123 | - WsSplash(); | |
124 | - Run = 0; // パーソナルデータ最後の書き込みなので終了 | |
125 | - } | |
126 | - } | |
127 | - *data = 0; | |
128 | - break; | |
129 | - case 2: // 読み出し | |
130 | - addr = *cmd & tblmask[i][4]; | |
131 | - *data = eeprom->data[addr]; | |
132 | - break; | |
133 | - case 3: // 消去 | |
134 | - if(eeprom->we) | |
135 | - { | |
136 | - addr = *cmd & tblmask[i][4]; | |
137 | - eeprom->data[addr] = 0xFFFF; | |
138 | - } | |
139 | - *data = 0; | |
140 | - break; | |
141 | - default: break; | |
142 | - } | |
143 | -} | |
144 | - | |
145 | -BYTE ReadMem(DWORD A) | |
146 | -{ | |
147 | - return Page[(A >> 16) & 0xF][A & 0xFFFF]; | |
148 | -} | |
149 | - | |
150 | -void WriteMem(DWORD A, BYTE V) | |
151 | -{ | |
152 | - (*WriteMemFnTable[(A >> 16) & 0x0F])(A, V); | |
153 | -} | |
154 | - | |
155 | -typedef void (*WriteMemFn)(DWORD A, BYTE V); | |
156 | - | |
157 | -static void WriteRom(DWORD A, BYTE V) | |
158 | -{ | |
159 | - //ErrorMsg(ERR_WRITE_ROM); | |
160 | -} | |
161 | - | |
162 | -static void WriteIRam(DWORD A, BYTE V) | |
163 | -{ | |
164 | - IRAM[A & 0xFFFF] = V; | |
165 | - if((A & 0xFE00) == 0xFE00) | |
166 | - { | |
167 | - SetPalette(A); | |
168 | - } | |
169 | - if(!((A - WaveMap) & 0xFFC0)) | |
170 | - { | |
171 | - apuSetPData(A & 0x003F, V); | |
172 | - } | |
173 | -} | |
174 | - | |
175 | -#define FLASH_CMD_ADDR1 0x0AAA | |
176 | -#define FLASH_CMD_ADDR2 0x0555 | |
177 | -#define FLASH_CMD_DATA1 0xAA | |
178 | -#define FLASH_CMD_DATA2 0x55 | |
179 | -#define FLASH_CMD_RESET 0xF0 | |
180 | -#define FLASH_CMD_ERASE 0x80 | |
181 | -#define FLASH_CMD_ERASE_CHIP 0x10 | |
182 | -#define FLASH_CMD_ERASE_SECT 0x30 | |
183 | -#define FLASH_CMD_CONTINUE_SET 0x20 | |
184 | -#define FLASH_CMD_CONTINUE_RES1 0x90 | |
185 | -#define FLASH_CMD_CONTINUE_RES2 0xF0 | |
186 | -#define FLASH_CMD_CONTINUE_RES3 0x00 | |
187 | -#define FLASH_CMD_WRITE 0xA0 | |
188 | -static void WriteCRam(DWORD A, BYTE V) | |
189 | -{ | |
190 | - static int flashCommand1 = 0; | |
191 | - static int flashCommand2 = 0; | |
192 | - static int flashWriteSet = 0; | |
193 | - static int flashWriteOne = 0; | |
194 | - static int flashWriteReset = 0; | |
195 | - static int flashWriteEnable = 0; | |
196 | - int offset = A & 0xFFFF; | |
197 | - | |
198 | - if (offset >= RAMSize) | |
199 | - { | |
200 | - ErrorMsg(ERR_OVER_RAMSIZE); | |
201 | - } | |
202 | - // WonderWitch | |
203 | - // FLASH ROM command sequence | |
204 | - if (flashCommand2) | |
205 | - { | |
206 | - if (offset == FLASH_CMD_ADDR1) | |
207 | - { | |
208 | - switch (V) { | |
209 | - case FLASH_CMD_CONTINUE_SET: | |
210 | - flashWriteSet = 1; | |
211 | - flashWriteReset = 0; | |
212 | - break; | |
213 | - case FLASH_CMD_WRITE: | |
214 | - flashWriteOne = 1; | |
215 | - break; | |
216 | - case FLASH_CMD_RESET: | |
217 | - break; | |
218 | - case FLASH_CMD_ERASE: | |
219 | - break; | |
220 | - case FLASH_CMD_ERASE_CHIP: | |
221 | - break; | |
222 | - case FLASH_CMD_ERASE_SECT: | |
223 | - break; | |
224 | - } | |
225 | - } | |
226 | - flashCommand2 = 0; | |
227 | - } | |
228 | - else if (flashCommand1) | |
229 | - { | |
230 | - if (offset == FLASH_CMD_ADDR2 && V == FLASH_CMD_DATA2) | |
231 | - { | |
232 | - flashCommand2 = 1; | |
233 | - } | |
234 | - flashCommand1 = 0; | |
235 | - } | |
236 | - else if (offset == FLASH_CMD_ADDR1 && V == FLASH_CMD_DATA1) | |
237 | - { | |
238 | - flashCommand1 = 1; | |
239 | - } | |
240 | - if (RAMSize != 0x40000 || IO[BNK1SLCT] < 8) | |
241 | - { | |
242 | - // normal sram | |
243 | - Page[1][offset] = V; | |
244 | - } | |
245 | - else if (IO[BNK1SLCT] >= 8 && IO[BNK1SLCT] < 15) | |
246 | - { | |
247 | - // FLASH ROM use SRAM bank(port 0xC1:8-14)(0xC1:15 0xF0000-0xFFFFF are write protected) | |
248 | - if (flashWriteEnable || flashWriteOne) | |
249 | - { | |
250 | - Page[IO[BNK1SLCT]][offset] = V; | |
251 | - flashWriteEnable = 0; | |
252 | - flashWriteOne = 0; | |
253 | - } | |
254 | - else if (flashWriteSet) | |
255 | - { | |
256 | - switch (V) | |
257 | - { | |
258 | - case FLASH_CMD_WRITE: | |
259 | - flashWriteEnable = 1; | |
260 | - flashWriteReset = 0; | |
261 | - break; | |
262 | - case FLASH_CMD_CONTINUE_RES1: | |
263 | - flashWriteReset = 1; | |
264 | - break; | |
265 | - case FLASH_CMD_CONTINUE_RES2: | |
266 | - case FLASH_CMD_CONTINUE_RES3: | |
267 | - if (flashWriteReset) | |
268 | - { | |
269 | - flashWriteSet = 0; | |
270 | - flashWriteReset = 0; | |
271 | - } | |
272 | - break; | |
273 | - default: | |
274 | - flashWriteReset = 0; | |
275 | - } | |
276 | - } | |
277 | - } | |
278 | -} | |
279 | - | |
280 | -void WriteIO(DWORD A, BYTE V) | |
281 | -{ | |
282 | - int i, j, k; | |
283 | - | |
284 | - if(A >= 0x100) | |
285 | - { | |
286 | - return; | |
287 | - } | |
288 | - switch(A) | |
289 | - { | |
290 | - case 0x07: | |
291 | - Scr1TMap = IRAM + ((V & 0x0F) << 11); | |
292 | - Scr2TMap = IRAM + ((V & 0xF0) << 7); | |
293 | - break; | |
294 | - case 0x15: | |
295 | - if (V & 0x01) | |
296 | - { | |
297 | - Segment[8] = 1; | |
298 | - RenderSleep(); | |
299 | - } | |
300 | - else | |
301 | - { | |
302 | - Segment[8] = 0; | |
303 | - } | |
304 | - if (V & 0x02) | |
305 | - { | |
306 | - SetDrawMode(1); | |
307 | - Segment[4] = 1; | |
308 | - } | |
309 | - else | |
310 | - { | |
311 | - Segment[4] = 0; | |
312 | - } | |
313 | - if (V & 0x04) | |
314 | - { | |
315 | - SetDrawMode(0); | |
316 | - Segment[3] = 1; | |
317 | - } | |
318 | - else | |
319 | - { | |
320 | - Segment[3] = 0; | |
321 | - } | |
322 | - if (V & 0x08) | |
323 | - { | |
324 | - Segment[2] = 1; | |
325 | - } | |
326 | - else | |
327 | - { | |
328 | - Segment[2] = 0; | |
329 | - } | |
330 | - if (V & 0x10) | |
331 | - { | |
332 | - Segment[1] = 1; | |
333 | - } | |
334 | - else | |
335 | - { | |
336 | - Segment[1] = 0; | |
337 | - } | |
338 | - if (V & 0x20) | |
339 | - { | |
340 | - Segment[0] = 1; | |
341 | - } | |
342 | - else | |
343 | - { | |
344 | - Segment[0] = 0; | |
345 | - } | |
346 | - break; | |
347 | - case 0x1C: | |
348 | - case 0x1D: | |
349 | - case 0x1E: | |
350 | - case 0x1F: | |
351 | - if(IO[COLCTL] & 0x80) break; | |
352 | - i = (A - 0x1C) << 1; | |
353 | - MonoColor[i] = DefColor[V & 0x0F]; | |
354 | - MonoColor[i + 1] = DefColor[(V & 0xF0) >> 4]; | |
355 | - for(k = 0x20; k < 0x40; k++) | |
356 | - { | |
357 | - i = (k & 0x1E) >> 1; | |
358 | - j = 0; | |
359 | - if(k & 0x01) j = 2; | |
360 | - Palette[i][j] = MonoColor[IO[k] & 0x07]; | |
361 | - Palette[i][j + 1] = MonoColor[(IO[k] >> 4) & 0x07]; | |
362 | - } | |
363 | - break; | |
364 | - case 0x20: | |
365 | - case 0x21: | |
366 | - case 0x22: | |
367 | - case 0x23: | |
368 | - case 0x24: | |
369 | - case 0x25: | |
370 | - case 0x26: | |
371 | - case 0x27: | |
372 | - case 0x28: | |
373 | - case 0x29: | |
374 | - case 0x2A: | |
375 | - case 0x2B: | |
376 | - case 0x2C: | |
377 | - case 0x2D: | |
378 | - case 0x2E: | |
379 | - case 0x2F: | |
380 | - case 0x30: | |
381 | - case 0x31: | |
382 | - case 0x32: | |
383 | - case 0x33: | |
384 | - case 0x34: | |
385 | - case 0x35: | |
386 | - case 0x36: | |
387 | - case 0x37: | |
388 | - case 0x38: | |
389 | - case 0x39: | |
390 | - case 0x3A: | |
391 | - case 0x3B: | |
392 | - case 0x3C: | |
393 | - case 0x3D: | |
394 | - case 0x3E: | |
395 | - case 0x3F: | |
396 | - if (IO[COLCTL] & 0x80) break; | |
397 | - i = (A & 0x1E) >> 1; | |
398 | - j = 0; | |
399 | - if (A & 0x01) j = 2; | |
400 | - Palette[i][j] = MonoColor[V & 0x07]; | |
401 | - Palette[i][j + 1] = MonoColor[(V >> 4) & 0x07]; | |
402 | - break; | |
403 | - case 0x48: | |
404 | - if(V & 0x80) | |
405 | - { | |
406 | - i = *(DWORD*)(IO + DMASRC); // IO[]が4バイト境界にあることが必要 | |
407 | - j = *(WORD*)(IO + DMADST); | |
408 | - k = *(WORD*)(IO + DMACNT); | |
409 | - while(k--) | |
410 | - { | |
411 | - WriteMem(j++, ReadMem(i++)); | |
412 | - } | |
413 | - *(WORD*)(IO + DMACNT) = 0; | |
414 | - *(DWORD*)(IO + DMASRC) = i; // IO[]が4バイト境界にあることが必要 | |
415 | - *(WORD*)(IO + DMADST) = j; | |
416 | - V &= 0x7F; | |
417 | - } | |
418 | - break; | |
419 | - case 0x80: | |
420 | - case 0x81: | |
421 | - IO[A] = V; | |
422 | - Ch[0].freq = *(WORD*)(IO + SND1FRQ); | |
423 | - return; | |
424 | - case 0x82: | |
425 | - case 0x83: | |
426 | - IO[A] = V; | |
427 | - Ch[1].freq = *(WORD*)(IO + SND2FRQ); | |
428 | - return; | |
429 | - case 0x84: | |
430 | - case 0x85: | |
431 | - IO[A] = V; | |
432 | - Ch[2].freq = *(WORD*)(IO + SND3FRQ); | |
433 | - return; | |
434 | - case 0x86: | |
435 | - case 0x87: | |
436 | - IO[A] = V; | |
437 | - Ch[3].freq = *(WORD*)(IO + SND4FRQ); | |
438 | - return; | |
439 | - case 0x88: | |
440 | - Ch[0].volL = (V >> 4) & 0x0F; | |
441 | - Ch[0].volR = V & 0x0F; | |
442 | - break; | |
443 | - case 0x89: | |
444 | - Ch[1].volL = (V >> 4) & 0x0F; | |
445 | - Ch[1].volR = V & 0x0F; | |
446 | - break; | |
447 | - case 0x8A: | |
448 | - Ch[2].volL = (V >> 4) & 0x0F; | |
449 | - Ch[2].volR = V & 0x0F; | |
450 | - break; | |
451 | - case 0x8B: | |
452 | - Ch[3].volL = (V >> 4) & 0x0F; | |
453 | - Ch[3].volR = V & 0x0F; | |
454 | - break; | |
455 | - case 0x8C: | |
456 | - Swp.step = (signed char)V; | |
457 | - break; | |
458 | - case 0x8D: | |
459 | - Swp.time = (V + 1) << 5; | |
460 | - break; | |
461 | - case 0x8E: | |
462 | - Noise.pattern = V & 0x07; | |
463 | - break; | |
464 | - case 0x8F: | |
465 | - WaveMap = V << 6; | |
466 | - for (i = 0; i < 64; i++) { | |
467 | - apuSetPData(WaveMap + i, IRAM[WaveMap + i]); | |
468 | - } | |
469 | - break; | |
470 | - case 0x90: | |
471 | - Ch[0].on = V & 0x01; | |
472 | - Ch[1].on = V & 0x02; | |
473 | - Ch[2].on = V & 0x04; | |
474 | - Ch[3].on = V & 0x08; | |
475 | - VoiceOn = V & 0x20; | |
476 | - Swp.on = V & 0x40; | |
477 | - Noise.on = V & 0x80; | |
478 | - break; | |
479 | - case 0x91: | |
480 | - V |= 0x80; // ヘッドホンは常にオン | |
481 | - break; | |
482 | - case 0xA0: | |
483 | - V=0x02; | |
484 | - break; | |
485 | - case 0xA2: | |
486 | - if(V & 0x01) | |
487 | - { | |
488 | - HTimer = *(WORD*)(IO + HPRE); | |
489 | - } | |
490 | - else | |
491 | - { | |
492 | - HTimer = 0; | |
493 | - } | |
494 | - if(V & 0x04) | |
495 | - { | |
496 | - VTimer = *(WORD*)(IO + VPRE); | |
497 | - } | |
498 | - else | |
499 | - { | |
500 | - VTimer = 0; | |
501 | - } | |
502 | - break; | |
503 | - case 0xA4: | |
504 | - case 0xA5: | |
505 | - IO[A] = V; | |
506 | - HTimer = *(WORD*)(IO + HPRE); // FF | |
507 | - return; | |
508 | - case 0xA6: | |
509 | - case 0xA7: | |
510 | - IO[A] = V; | |
511 | - IO[A + 4] = V; // Dark eyes | |
512 | - if(IO[TIMCTL] & 0x04) | |
513 | - { | |
514 | - VTimer = *(WORD*)(IO + VPRE); | |
515 | - } | |
516 | - return; | |
517 | - case 0xB3: | |
518 | - if(V & 0x20) | |
519 | - { | |
520 | - V &= 0xDF; | |
521 | - } | |
522 | - V |= 0x04; | |
523 | - break; | |
524 | - case 0xB5: | |
525 | - IO[KEYCTL] = (BYTE)(V & 0xF0); | |
526 | - if(IO[KEYCTL] & 0x40) IO[KEYCTL] |= (BYTE)((ButtonState >> 8) & 0x0F); | |
527 | - if(IO[KEYCTL] & 0x20) IO[KEYCTL] |= (BYTE)((ButtonState >> 4) & 0x0F); | |
528 | - if(IO[KEYCTL] & 0x10) IO[KEYCTL] |= (BYTE)(ButtonState & 0x0F); | |
529 | - return; | |
530 | - case 0xB6: | |
531 | - IO[IRQACK] &= (BYTE)~V; | |
532 | - return; | |
533 | - case 0xBE: | |
534 | - ComEeprom(&sIEep, (WORD*)(IO + EEPCMD), (WORD*)(IO + EEPDATA)); | |
535 | - V >>= 4; | |
536 | - break; | |
537 | - case 0xC0: | |
538 | - if(nec_get_reg(NEC_CS) >= 0x4000) | |
539 | - { | |
540 | - nec_execute(1); | |
541 | - } | |
542 | - j = (V << 4) & 0xF0; | |
543 | - Page[0x4] = ROMMap[0x4 | j]; | |
544 | - Page[0x5] = ROMMap[0x5 | j]; | |
545 | - Page[0x6] = ROMMap[0x6 | j]; | |
546 | - Page[0x7] = ROMMap[0x7 | j]; | |
547 | - Page[0x8] = ROMMap[0x8 | j]; | |
548 | - Page[0x9] = ROMMap[0x9 | j]; | |
549 | - Page[0xA] = ROMMap[0xA | j]; | |
550 | - Page[0xB] = ROMMap[0xB | j]; | |
551 | - Page[0xC] = ROMMap[0xC | j]; | |
552 | - Page[0xD] = ROMMap[0xD | j]; | |
553 | - Page[0xE] = ROMMap[0xE | j]; | |
554 | - Page[0xF] = ROMMap[0xF | j]; | |
555 | - break; | |
556 | - case 0xC1: | |
557 | - if (V >= 8) // WonderWitch | |
558 | - { | |
559 | - Page[1] = MemDummy; | |
560 | - } | |
561 | - else if (V >= RAMBanks) | |
562 | - { | |
563 | - RAMEnable = 0; | |
564 | - } | |
565 | - else | |
566 | - { | |
567 | - Page[1] = RAMMap[V]; | |
568 | - } | |
569 | - break; | |
570 | - case 0xC2: | |
571 | - Page[2] = ROMMap[V]; | |
572 | - break; | |
573 | - case 0xC3: | |
574 | - Page[3] = ROMMap[V]; | |
575 | - break; | |
576 | - case 0xC8: | |
577 | - ComEeprom(&sCEep, (WORD*)(IO + CEEPCMD), (WORD*)(IO + CEEPDATA)); | |
578 | - if(V & 0x10) | |
579 | - { | |
580 | - V >>= 4; | |
581 | - } | |
582 | - if(V & 0x20) | |
583 | - { | |
584 | - V >>= 4; | |
585 | - } | |
586 | - if(V & 0x40) | |
587 | - { | |
588 | - V >>= 5; | |
589 | - } | |
590 | - break; | |
591 | - case 0xCA: // RTC Command | |
592 | - if (V == 0x15) | |
593 | - { | |
594 | - RtcCount = 0; | |
595 | - } | |
596 | - break; | |
597 | - case 0xCB: //RTC DATA | |
598 | - break; | |
599 | - default: | |
600 | - break; | |
601 | - } | |
602 | - IO[A] = V; | |
603 | -} | |
604 | - | |
605 | -#define BCD(value) ((value / 10) << 4) | (value % 10) | |
606 | -BYTE ReadIO(DWORD A) | |
607 | -{ | |
608 | - switch(A) | |
609 | - { | |
610 | - case 0xCA: | |
611 | - return IO[RTCCMD] | 0x80; | |
612 | - case 0xCB: | |
613 | - if (IO[RTCCMD] == 0x15) // get time command | |
614 | - { | |
615 | - BYTE year, mon, mday, wday, hour, min, sec, j; | |
616 | - struct tm *newtime; | |
617 | - time_t long_time; | |
618 | - | |
619 | - time(&long_time); | |
620 | - newtime = localtime(&long_time); | |
621 | - switch(RtcCount) | |
622 | - { | |
623 | - case 0: | |
624 | - RtcCount++; | |
625 | - year = newtime->tm_year; | |
626 | - year %= 100; | |
627 | - return BCD(year); | |
628 | - case 1: | |
629 | - RtcCount++; | |
630 | - mon = newtime->tm_mon; | |
631 | - mon++; | |
632 | - return BCD(mon); | |
633 | - case 2: | |
634 | - RtcCount++; | |
635 | - mday = newtime->tm_mday; | |
636 | - return BCD(mday); | |
637 | - case 3: | |
638 | - RtcCount++; | |
639 | - wday = newtime->tm_wday; | |
640 | - return BCD(wday); | |
641 | - case 4: | |
642 | - RtcCount++; | |
643 | - hour = newtime->tm_hour; | |
644 | - j = BCD(hour); | |
645 | - if (hour > 11) | |
646 | - j |= 0x80; | |
647 | - return j; | |
648 | - case 5: | |
649 | - RtcCount++; | |
650 | - min = newtime->tm_min; | |
651 | - return BCD(min); | |
652 | - case 6: | |
653 | - RtcCount = 0; | |
654 | - sec = newtime->tm_sec; | |
655 | - return BCD(sec); | |
656 | - } | |
657 | - return 0; | |
658 | - } | |
659 | - else { | |
660 | - // set ack | |
661 | - return (IO[RTCDATA] | 0x80); | |
662 | - } | |
663 | - } | |
664 | - return IO[A]; | |
665 | -} | |
666 | - | |
667 | -WriteMemFn WriteMemFnTable[16]= { | |
668 | - WriteIRam, | |
669 | - WriteCRam, | |
670 | - WriteRom, | |
671 | - WriteRom, | |
672 | - WriteRom, | |
673 | - WriteRom, | |
674 | - WriteRom, | |
675 | - WriteRom, | |
676 | - WriteRom, | |
677 | - WriteRom, | |
678 | - WriteRom, | |
679 | - WriteRom, | |
680 | - WriteRom, | |
681 | - WriteRom, | |
682 | - WriteRom, | |
683 | - WriteRom, | |
684 | -}; | |
685 | - | |
686 | -void WsReset (void) | |
687 | -{ | |
688 | - int i, j; | |
689 | - | |
690 | - Page[0x0] = IRAM; | |
691 | - sIEep.data = IEep; | |
692 | - sIEep.we = 0; | |
693 | - if(CartKind & CK_EEP) | |
694 | - { | |
695 | - Page[0x1] = MemDummy; | |
696 | - sCEep.data = (WORD*)(RAMMap[0x00]); | |
697 | - sCEep.we = 0; | |
698 | - } | |
699 | - else | |
700 | - { | |
701 | - Page[0x1] = RAMMap[0x00]; | |
702 | - sCEep.data = NULL; | |
703 | - sCEep.we = 0; | |
704 | - } | |
705 | - Page[0xF] = ROMMap[0xFF]; | |
706 | - i = (IO[SPRTAB] & 0x1F) << 9; | |
707 | - i += IO[SPRBGN] << 2; | |
708 | - j = IO[SPRCNT] << 2; | |
709 | - memcpy(SprTMap, IRAM + i, j); | |
710 | - SprTTMap = SprTMap; | |
711 | - SprETMap = SprTMap + j - 4; | |
712 | - WriteIO(0x07, 0x00); | |
713 | - WriteIO(0x14, 0x01); | |
714 | - WriteIO(0x1C, 0x99); | |
715 | - WriteIO(0x1D, 0xFD); | |
716 | - WriteIO(0x1E, 0xB7); | |
717 | - WriteIO(0x1F, 0xDF); | |
718 | - WriteIO(0x20, 0x30); | |
719 | - WriteIO(0x21, 0x57); | |
720 | - WriteIO(0x22, 0x75); | |
721 | - WriteIO(0x23, 0x76); | |
722 | - WriteIO(0x24, 0x15); | |
723 | - WriteIO(0x25, 0x73); | |
724 | - WriteIO(0x26, 0x77); | |
725 | - WriteIO(0x27, 0x77); | |
726 | - WriteIO(0x28, 0x20); | |
727 | - WriteIO(0x29, 0x75); | |
728 | - WriteIO(0x2A, 0x50); | |
729 | - WriteIO(0x2B, 0x36); | |
730 | - WriteIO(0x2C, 0x70); | |
731 | - WriteIO(0x2D, 0x67); | |
732 | - WriteIO(0x2E, 0x50); | |
733 | - WriteIO(0x2F, 0x77); | |
734 | - WriteIO(0x30, 0x57); | |
735 | - WriteIO(0x31, 0x54); | |
736 | - WriteIO(0x32, 0x75); | |
737 | - WriteIO(0x33, 0x77); | |
738 | - WriteIO(0x34, 0x75); | |
739 | - WriteIO(0x35, 0x17); | |
740 | - WriteIO(0x36, 0x37); | |
741 | - WriteIO(0x37, 0x73); | |
742 | - WriteIO(0x38, 0x50); | |
743 | - WriteIO(0x39, 0x57); | |
744 | - WriteIO(0x3A, 0x60); | |
745 | - WriteIO(0x3B, 0x77); | |
746 | - WriteIO(0x3C, 0x70); | |
747 | - WriteIO(0x3D, 0x77); | |
748 | - WriteIO(0x3E, 0x10); | |
749 | - WriteIO(0x3F, 0x73); | |
750 | - WriteIO(0x01, 0x00); | |
751 | - WriteIO(0x8F, 0x03); | |
752 | - WriteIO(0x91, 0x80); | |
753 | - WriteIO(0xA0, 0x02); | |
754 | - WriteIO(0xB3, 0x04); | |
755 | - WriteIO(0xBA, 0x01); | |
756 | - WriteIO(0xBB, 0x00); | |
757 | - WriteIO(0xBC, 0x30); // 内蔵EEPROM | |
758 | - WriteIO(0xBD, 0x01); // 書き込み可能 | |
759 | - WriteIO(0xBE, 0x83); | |
760 | - IO[BNKSLCT] = 0x0F; | |
761 | - j = 0xF0; | |
762 | - Page[0x4] = ROMMap[0x4 | j]; | |
763 | - Page[0x5] = ROMMap[0x5 | j]; | |
764 | - Page[0x6] = ROMMap[0x6 | j]; | |
765 | - Page[0x7] = ROMMap[0x7 | j]; | |
766 | - Page[0x8] = ROMMap[0x8 | j]; | |
767 | - Page[0x9] = ROMMap[0x9 | j]; | |
768 | - Page[0xA] = ROMMap[0xA | j]; | |
769 | - Page[0xB] = ROMMap[0xB | j]; | |
770 | - Page[0xC] = ROMMap[0xC | j]; | |
771 | - Page[0xD] = ROMMap[0xD | j]; | |
772 | - Page[0xE] = ROMMap[0xE | j]; | |
773 | - Page[0xF] = ROMMap[0xF | j]; | |
774 | - WriteIO(0xC2, 0xFF); | |
775 | - WriteIO(0xC3, 0xFF); | |
776 | - IRAM[0x75AC]=0x41; | |
777 | - IRAM[0x75AD]=0x5F; | |
778 | - IRAM[0x75AE]=0x43; | |
779 | - IRAM[0x75AF]=0x31; | |
780 | - IRAM[0x75B0]=0x6E; | |
781 | - IRAM[0x75B1]=0x5F; | |
782 | - IRAM[0x75B2]=0x63; | |
783 | - IRAM[0x75B3]=0x31; | |
784 | - apuWaveClear(); | |
785 | - ButtonState = 0x0000; | |
786 | - for (i = 0; i < 11; i++) | |
787 | - { | |
788 | - Segment[i] = 0; | |
789 | - } | |
790 | - nec_reset(NULL); | |
791 | - nec_set_reg(NEC_SP, 0x2000); | |
792 | -} | |
793 | - | |
794 | -void WsRomPatch(BYTE *buf) | |
795 | -{ | |
796 | - if((buf[0] == 0x01) && (buf[1] == 0x01) && (buf[2] == 0x16)) // SWJ-BANC16 STAR HEARTS | |
797 | - { | |
798 | - RAMBanks = 1; | |
799 | - RAMSize = 0x8000; | |
800 | - CartKind = 0; | |
801 | - } | |
802 | - if((buf[0] == 0x01) && (buf[1] == 0x00) && (buf[2] == 0x2C || buf[2] == 0x2F)) // SWJ-BAN02C,02F デジタルパートナー | |
803 | - { | |
804 | - RAMBanks = 1; | |
805 | - RAMSize = 0x8000; | |
806 | - CartKind = 0; | |
807 | - } | |
808 | - if((buf[0] == 0x01) && (buf[1] == 0x01) && (buf[2] == 0x38)) // SWJ-BANC38 NARUTO 木ノ葉忍法帖 | |
809 | - { | |
810 | - RAMBanks = 1; | |
811 | - RAMSize = 0x10000; | |
812 | - CartKind = 0; | |
813 | - } | |
814 | -} | |
815 | - | |
816 | -int Interrupt(void) | |
817 | -{ | |
818 | - static int LCount=0, Joyz=0x0000; | |
819 | - int i, j; | |
820 | - | |
821 | - if(++LCount>=8) // 8回で1Hblank期間 | |
822 | - { | |
823 | - LCount=0; | |
824 | - } | |
825 | - switch(LCount) | |
826 | - { | |
827 | - case 0: | |
828 | - if (IO[RSTRL] == 144) | |
829 | - { | |
830 | - DWORD VCounter; | |
831 | - | |
832 | - ButtonState = WsInputGetState(); | |
833 | - if((ButtonState ^ Joyz) & Joyz) | |
834 | - { | |
835 | - if(IO[IRQENA] & KEY_IFLAG) | |
836 | - { | |
837 | - IO[IRQACK] |= KEY_IFLAG; | |
838 | - } | |
839 | - } | |
840 | - Joyz = ButtonState; | |
841 | - // Vblankカウントアップ | |
842 | - VCounter = *(WORD*)(IO + VCNTH) << 16 | *(WORD*)(IO + VCNTL); | |
843 | - VCounter++; | |
844 | - *(WORD*)(IO + VCNTL) = (WORD)VCounter; | |
845 | - *(WORD*)(IO + VCNTH) = (WORD)(VCounter >> 16); | |
846 | - } | |
847 | - break; | |
848 | - case 2: | |
849 | - // Hblank毎に1サンプルセットすることで12KHzのwaveデータが出来る | |
850 | - apuWaveSet(); | |
851 | - *(WORD*)(IO + NCSR) = apuShiftReg(); | |
852 | - break; | |
853 | - case 4: | |
854 | - if(IO[RSTRL] == 140) | |
855 | - { | |
856 | - i = (IO[SPRTAB] & 0x1F) << 9; | |
857 | - i += IO[SPRBGN] << 2; | |
858 | - j = IO[SPRCNT] << 2; | |
859 | - memcpy(SprTMap, IRAM + i, j); | |
860 | - SprTTMap = SprTMap; | |
861 | - SprETMap= SprTMap + j - 4; | |
862 | - } | |
863 | - | |
864 | - if(IO[LCDSLP] & 0x01) | |
865 | - { | |
866 | - if(IO[RSTRL] == 0) | |
867 | - { | |
868 | - SkipCnt--; | |
869 | - if(SkipCnt < 0) | |
870 | - { | |
871 | - SkipCnt = 4; | |
872 | - } | |
873 | - } | |
874 | - if(TblSkip[FrameSkip][SkipCnt]) | |
875 | - { | |
876 | - if(IO[RSTRL] < 144) | |
877 | - { | |
878 | - RefreshLine(IO[RSTRL]); | |
879 | - } | |
880 | - if(IO[RSTRL] == 144) | |
881 | - { | |
882 | - drawDraw(); | |
883 | - } | |
884 | - } | |
885 | - } | |
886 | - break; | |
887 | - case 6: | |
888 | - if((IO[TIMCTL] & 0x01) && HTimer) | |
889 | - { | |
890 | - HTimer--; | |
891 | - if(!HTimer) | |
892 | - { | |
893 | - if(IO[TIMCTL] & 0x02) | |
894 | - { | |
895 | - HTimer = *(WORD*)(IO + HPRE); | |
896 | - } | |
897 | - if(IO[IRQENA] & HTM_IFLAG) | |
898 | - { | |
899 | - IO[IRQACK] |= HTM_IFLAG; | |
900 | - } | |
901 | - } | |
902 | - } | |
903 | - else if(*(WORD*)(IO + HPRE) == 1) | |
904 | - { | |
905 | - if(IO[IRQENA] & HTM_IFLAG) | |
906 | - { | |
907 | - IO[IRQACK] |= HTM_IFLAG; | |
908 | - } | |
909 | - } | |
910 | - if((IO[IRQENA] & VBB_IFLAG) && (IO[RSTRL] == 144)) | |
911 | - { | |
912 | - IO[IRQACK] |= VBB_IFLAG; | |
913 | - } | |
914 | - if((IO[TIMCTL] & 0x04) && (IO[RSTRL] == 144) && VTimer) | |
915 | - { | |
916 | - VTimer--; | |
917 | - if(!VTimer) | |
918 | - { | |
919 | - if(IO[TIMCTL] & 0x08) | |
920 | - { | |
921 | - VTimer = *(WORD*)(IO + VPRE); | |
922 | - } | |
923 | - if(IO[IRQENA] & VTM_IFLAG) | |
924 | - { | |
925 | - IO[IRQACK] |= VTM_IFLAG; | |
926 | - } | |
927 | - } | |
928 | - } | |
929 | - if((IO[IRQENA] & RST_IFLAG) && (IO[RSTRL] == IO[RSTRLC])) | |
930 | - { | |
931 | - IO[IRQACK] |= RST_IFLAG; | |
932 | - } | |
933 | - break; | |
934 | - case 7: | |
935 | - IO[RSTRL]++; | |
936 | - if(IO[RSTRL] >= 159) | |
937 | - { | |
938 | - IO[RSTRL] = 0; | |
939 | - } | |
940 | - // Hblankカウントアップ | |
941 | - (*(WORD*)(IO + HCNT))++; | |
942 | - break; | |
943 | - default: | |
944 | - break; | |
945 | - } | |
946 | - return IO[IRQACK]; | |
947 | -} | |
948 | - | |
949 | -int WsRun(void) | |
950 | -{ | |
951 | - static int period = IPeriod; | |
952 | - int i, cycle, iack, inum; | |
953 | -// for(i = 0; i < 480; i++) //5ms | |
954 | - for(i = 0; i < 159*8; i++) // 1/75s | |
955 | - { | |
956 | - cycle = nec_execute(period); | |
957 | - period += IPeriod - cycle; | |
958 | - if(Interrupt()) | |
959 | - { | |
960 | - iack = IO[IRQACK]; | |
961 | - for(inum = 7; inum >= 0; inum--) | |
962 | - { | |
963 | - if(iack & 0x80) | |
964 | - { | |
965 | - break; | |
966 | - } | |
967 | - iack <<= 1; | |
968 | - } | |
969 | - nec_int((inum + IO[IRQBSE]) << 2); | |
970 | - } | |
971 | - } | |
972 | - return 0; | |
973 | -} | |
974 | - | |
975 | -#define POS_X (88) | |
976 | -#define POS_Y (32) | |
977 | -#define NAME_Y (96) | |
978 | -void WsSplash(void) | |
979 | -{ | |
980 | - int x, y, i, len, pos, n; | |
981 | - WORD* p; | |
982 | - char* name = (char*)(IEep + 0x30); | |
983 | - | |
984 | - // 背景を黒でクリア | |
985 | - p = FrameBuffer[0] + 8; | |
986 | - for (y = 0; y < 144; y++) | |
987 | - { | |
988 | - for (x = 0; x < 224; x++) | |
989 | - { | |
990 | - *p++ = 0xF000; | |
991 | - } | |
992 | - p += 32; | |
993 | - } | |
994 | - drawDraw(); | |
995 | - Sleep(300); | |
996 | - apuStartupSound(); | |
997 | - Sleep(150); | |
998 | - Segment[3] = 1; | |
999 | - Segment[5] = 1; | |
1000 | - Segment[9] = 1; | |
1001 | - Segment[10] = 1; | |
1002 | - for (i = 0; i < 6; i++) | |
1003 | - { | |
1004 | - WORD color[6] = {0xFF00, 0xFF80, 0xFFF0, 0xF0F0, 0xF0FF, 0xF00F}; | |
1005 | - // B,A,N,D,A,I,を1文字表示 | |
1006 | - for (y = bandaiRect[i].top; y <= bandaiRect[i].bottom; y++) | |
1007 | - { | |
1008 | - p = FrameBuffer[POS_Y + y] + 8 + POS_X; | |
1009 | - for (x = bandaiRect[i].left; x <= bandaiRect[i].right; x++) | |
1010 | - { | |
1011 | - if (bandai[y][x] == 0xFFFF) | |
1012 | - { | |
1013 | - p[x] = color[i]; | |
1014 | - } | |
1015 | - } | |
1016 | - } | |
1017 | - drawDraw(); | |
1018 | - Sleep(70); | |
1019 | - // 文字消去 | |
1020 | - p = FrameBuffer[0] + 8; | |
1021 | - for (y = 0; y < 144; y++) | |
1022 | - { | |
1023 | - for (x = 0; x < 224; x++) | |
1024 | - { | |
1025 | - *p++ = 0xF000; | |
1026 | - } | |
1027 | - p += 32; | |
1028 | - } | |
1029 | - } | |
1030 | - drawDraw(); | |
1031 | - Sleep(200); | |
1032 | - // 背景を白でクリア | |
1033 | - p = FrameBuffer[0] + 8; | |
1034 | - for (y = 0; y < 144; y++) | |
1035 | - { | |
1036 | - for (x = 0; x < 224; x++) | |
1037 | - { | |
1038 | - *p++ = 0xFFFF; | |
1039 | - } | |
1040 | - p += 32; | |
1041 | - } | |
1042 | - // BANDAIロゴ表示 | |
1043 | - p = FrameBuffer[POS_Y] + 8 + POS_X; | |
1044 | - for (y = 0; y < BANDAI_Y; y++) | |
1045 | - { | |
1046 | - for (x = 0; x < BANDAI_X; x++) | |
1047 | - { | |
1048 | - *p++ = bandai[y][x]; | |
1049 | - } | |
1050 | - p += (256-BANDAI_X); | |
1051 | - } | |
1052 | - drawDraw(); | |
1053 | - // 所有者の名前表示 | |
1054 | - for (len = 15; name[len] == 0 && len > 0; len--); | |
1055 | - pos = 108 - len * 4; | |
1056 | - for (n = 0; n <= len; n++) | |
1057 | - { | |
1058 | - for (i = 0; i <= len; i++) | |
1059 | - { | |
1060 | - BYTE ar = pdataFontArray[name[i]]; | |
1061 | - BYTE* ch = pdataFont + ar * 8; | |
1062 | - for (y = 0; y < 8; y++) | |
1063 | - { | |
1064 | - BYTE font = *ch++; | |
1065 | - p = FrameBuffer[NAME_Y + y] + 8 + pos + (i * 8); | |
1066 | - for (x = 0; x < 8; x++) | |
1067 | - { | |
1068 | - if (name[i] && (font & 0x80)) // スペースフォントは■になってるのでスキップ | |
1069 | - { | |
1070 | - if (n == i) | |
1071 | - { | |
1072 | - *p = 0xFFFF; | |
1073 | - } | |
1074 | - else | |
1075 | - { | |
1076 | - *p = 0xF000; | |
1077 | - } | |
1078 | - } | |
1079 | - p++; | |
1080 | - font <<= 1; | |
1081 | - } | |
1082 | - } | |
1083 | - } | |
1084 | - drawDraw(); | |
1085 | - Sleep(30); | |
1086 | - } | |
1087 | - for (i = 0; i <= len; i++) | |
1088 | - { | |
1089 | - BYTE ar = pdataFontArray[name[i]]; | |
1090 | - BYTE* ch = pdataFont + ar * 8; | |
1091 | - for (y = 0; y < 8; y++) | |
1092 | - { | |
1093 | - BYTE font = *ch++; | |
1094 | - p = FrameBuffer[NAME_Y + y] + 8 + pos + (i * 8); | |
1095 | - for (x = 0; x < 8; x++) | |
1096 | - { | |
1097 | - if (name[i] && (font & 0x80)) | |
1098 | - { | |
1099 | - if (n == i) | |
1100 | - { | |
1101 | - *p = 0xFFFF; | |
1102 | - } | |
1103 | - else | |
1104 | - { | |
1105 | - *p = 0xF000; | |
1106 | - } | |
1107 | - } | |
1108 | - p++; | |
1109 | - font <<= 1; | |
1110 | - } | |
1111 | - } | |
1112 | - } | |
1113 | - Segment[3] = 0; | |
1114 | - Segment[5] = 0; | |
1115 | - Segment[9] = 0; | |
1116 | - drawDraw(); | |
1117 | -} | |
1118 | - | |
1119 | - |
@@ -1,335 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include "WSDraw.h" | |
7 | -#include "WS.h" | |
8 | -#include "WSInput.h" | |
9 | -#include "WSRender.h" | |
10 | - | |
11 | -extern HWND hWnd; | |
12 | -int Kerorikan = 0; | |
13 | -static enum DRAWSIZE DrawSize = DS_1; // 描画サイズ フルスクリーン、x1 x2 x3 | |
14 | -static int DrawMode = 0; // 縦横フラグ 0:横 | |
15 | -static LPDIRECT3D9 pD3D; // IDirect3D9インターフェイスへのポインタ | |
16 | -static LPDIRECT3DDEVICE9 pD3DDevice; // IDirect3DDevice9インターフェイスへのポインタ | |
17 | -static D3DPRESENT_PARAMETERS D3DPP; // デバイスのプレゼンテーションパラメータ | |
18 | -static LPDIRECT3DVERTEXBUFFER9 pMyVB; // Vertex Buffer | |
19 | -static LPDIRECT3DTEXTURE9 pTexture; // Texture | |
20 | -static LPDIRECT3DSURFACE9 pSurface; // Surface | |
21 | -static LPDIRECT3DTEXTURE9 pSegTexture; | |
22 | -static LPDIRECT3DSURFACE9 pSegSurface; | |
23 | - | |
24 | -// 頂点1つのデータ型 | |
25 | -struct MY_VERTEX{ | |
26 | - D3DXVECTOR3 p; // 位置 | |
27 | - DWORD color; // 色 | |
28 | - D3DXVECTOR2 t; // テクスチャーの画像の位置 | |
29 | -}; | |
30 | -// MY_VERTEXのフォーマット設定 | |
31 | -#define MY_VERTEX_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) | |
32 | -#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } | |
33 | - | |
34 | -//------------------------------------------------------------- | |
35 | -// レンダラーの初期化 | |
36 | -// 引数 | |
37 | -// isFullScreen : フルスクリーンの場合TRUE | |
38 | -// 戻り値 | |
39 | -// 成功したらS_OK | |
40 | -//------------------------------------------------------------- | |
41 | -HRESULT drawInitialize(BOOL isFullScreen) | |
42 | -{ | |
43 | - D3DDISPLAYMODE d3ddm; | |
44 | - | |
45 | - // Direct3D9オブジェクトの作成 | |
46 | - if((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) | |
47 | - { | |
48 | - return E_FAIL; // 取得失敗 | |
49 | - } | |
50 | - // 現在のディスプレイモードを取得 | |
51 | - if(FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) | |
52 | - { | |
53 | - return E_FAIL; | |
54 | - } | |
55 | - // デバイスのプレゼンテーションパラメータを初期化 | |
56 | - ZeroMemory(&D3DPP, sizeof(D3DPRESENT_PARAMETERS)); | |
57 | - if(isFullScreen) { // フルスクリーンの場合 | |
58 | - D3DPP.Windowed = FALSE; // フルスクリーン表示の指定 | |
59 | - D3DPP.BackBufferWidth = 800; // フルスクリーン時の横幅 | |
60 | - D3DPP.BackBufferHeight = 600; // フルスクリーン時の縦幅 | |
61 | - } | |
62 | - else { | |
63 | - D3DPP.Windowed = TRUE; // ウインドウ内表示の指定 | |
64 | - D3DPP.BackBufferWidth = 2016; // 224と144の最小公倍数 | |
65 | - D3DPP.BackBufferHeight = 2016; | |
66 | - } | |
67 | - D3DPP.BackBufferCount = 1; | |
68 | - D3DPP.BackBufferFormat = d3ddm.Format; // カラーモードの指定 | |
69 | - D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; // | |
70 | - D3DPP.EnableAutoDepthStencil = TRUE; // エラー対策 | |
71 | - D3DPP.AutoDepthStencilFormat = D3DFMT_D16; // エラー対策 | |
72 | - D3DPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // 垂直同期しない | |
73 | - // ディスプレイアダプタを表すためのデバイスを作成 | |
74 | - // 描画と頂点処理をハードウェアで行なう | |
75 | - if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &D3DPP, &pD3DDevice))) | |
76 | - { | |
77 | - // 上記の設定が失敗したら | |
78 | - // 描画をハードウェアで行い、頂点処理はCPUで行なう | |
79 | - if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPP, &pD3DDevice))) | |
80 | - { | |
81 | - // 初期化失敗 | |
82 | - MessageBox(hWnd, TEXT(" グラフィックチップが未対応です "), TEXT("Direct3D Error"), MB_OK); | |
83 | - return E_FAIL; | |
84 | - } | |
85 | - } | |
86 | - return S_OK; | |
87 | -} | |
88 | - | |
89 | -//------------------------------------------------------------- | |
90 | -// 終了処理 | |
91 | -//------------------------------------------------------------- | |
92 | -void drawFinalize(void) | |
93 | -{ | |
94 | - // デバイスオブジェクトの解放 | |
95 | - SAFE_RELEASE(pD3DDevice); | |
96 | - // DirectXGraphicsの解放 | |
97 | - SAFE_RELEASE(pD3D); | |
98 | -} | |
99 | - | |
100 | -//------------------------------------------------------------- | |
101 | -// シーンを生成 | |
102 | -// 戻り値 | |
103 | -// 成功したらS_OK | |
104 | -//------------------------------------------------------------- | |
105 | -HRESULT drawCreate(void) | |
106 | -{ | |
107 | - if(pD3DDevice == 0) | |
108 | - { | |
109 | - return E_FAIL; | |
110 | - } | |
111 | - drawDestroy(); | |
112 | - //-------------------------------------- | |
113 | - // オブジェクトの頂点バッファを生成 | |
114 | - //-------------------------------------- | |
115 | - // 8つの頂点からなる頂点バッファを作る(メイン4個 セグメント4個) | |
116 | - if(FAILED( pD3DDevice->CreateVertexBuffer(8 * sizeof(MY_VERTEX), D3DUSAGE_WRITEONLY, MY_VERTEX_FVF, D3DPOOL_MANAGED, &pMyVB, NULL))) | |
117 | - { | |
118 | - return E_FAIL; | |
119 | - } | |
120 | - pD3DDevice->CreateTexture(256, 256, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, &pTexture, NULL); | |
121 | - pTexture->GetSurfaceLevel(0, &pSurface); | |
122 | - pD3DDevice->CreateTexture(32, 1024, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, &pSegTexture, NULL); | |
123 | - pSegTexture->GetSurfaceLevel(0, &pSegSurface); | |
124 | - //-------------------------------------- | |
125 | - // テクスチャステージの設定 | |
126 | - //-------------------------------------- | |
127 | - pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); | |
128 | - pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); | |
129 | - //-------------------------------------- | |
130 | - // レンダリングステートパラメータの設定 | |
131 | - //-------------------------------------- | |
132 | - // 両面描画モードの指定 | |
133 | - pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); | |
134 | - // ディザリングを行なう(高品質描画) | |
135 | - pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); | |
136 | - // ノーライティングモード | |
137 | - pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); | |
138 | - return S_OK; | |
139 | -} | |
140 | - | |
141 | -//------------------------------------------------------------- | |
142 | -// シーンの破棄 | |
143 | -//------------------------------------------------------------- | |
144 | -void drawDestroy(void) | |
145 | -{ | |
146 | - SAFE_RELEASE(pSurface); | |
147 | - SAFE_RELEASE(pTexture); | |
148 | - SAFE_RELEASE(pSegSurface); | |
149 | - SAFE_RELEASE(pSegTexture); | |
150 | - SAFE_RELEASE(pMyVB); | |
151 | -} | |
152 | - | |
153 | -//------------------------------------------------------------- | |
154 | -// 描画処理 | |
155 | -//------------------------------------------------------------- | |
156 | -#define MAIN_X (224.0f/256.0f) | |
157 | -#define MAIN_Y (144.0f/256.0f) | |
158 | -#define MAIN_W (2 * 224.0f/234.0f - 1.0f) | |
159 | -#define SEG_X (4 * 8.0f/32.0f) | |
160 | -#define SEG_Y (4 * 144.0f/1024.0f) | |
161 | -#define SEG_W (1.0f - 2 * 8.0f/234.0f) | |
162 | -#define KERO 0.0075f | |
163 | -void drawDraw() | |
164 | -{ | |
165 | - if(pD3DDevice == 0) | |
166 | - { | |
167 | - return; | |
168 | - } | |
169 | - if(pMyVB == 0) | |
170 | - { | |
171 | - return; | |
172 | - } | |
173 | - // 画像データをテクスチャに転送 | |
174 | - D3DLOCKED_RECT lockRect; | |
175 | - int x, y, pitch; | |
176 | - WORD *p; | |
177 | - pSurface->LockRect(&lockRect, NULL, D3DLOCK_DISCARD); | |
178 | - p = FrameBuffer[0] + 8; | |
179 | - pitch = lockRect.Pitch / 2; | |
180 | - for (y = 0; y < 144; y++) | |
181 | - { | |
182 | - for (x = 0; x < 224; x++) | |
183 | - { | |
184 | - *((WORD*)lockRect.pBits + pitch * y + x) = *p++; | |
185 | - } | |
186 | - p += 32; | |
187 | - } | |
188 | - pSurface->UnlockRect(); | |
189 | - // 液晶セグメントデータをテクスチャに転送 | |
190 | - RenderSegment(); | |
191 | - pSegSurface->LockRect(&lockRect, NULL, D3DLOCK_DISCARD); | |
192 | - p = SegmentBuffer; | |
193 | - pitch = lockRect.Pitch / 2; | |
194 | - for (y = 0; y < 144 * 4; y++) | |
195 | - { | |
196 | - for (x = 0; x < 32; x++) | |
197 | - { | |
198 | - *((WORD*)lockRect.pBits + pitch * y + x) = *p++; | |
199 | - } | |
200 | - } | |
201 | - pSegSurface->UnlockRect(); | |
202 | - //頂点バッファの中身を埋める | |
203 | - MY_VERTEX* v; | |
204 | - pMyVB->Lock( 0, 0, (void**)&v, 0 ); | |
205 | - if (Kerorikan) | |
206 | - { | |
207 | - // 頂点座標の設定 | |
208 | - v[0].p = D3DXVECTOR3(-112*KERO, 72*KERO, 0.0f); | |
209 | - v[1].p = D3DXVECTOR3( 112*KERO, 72*KERO, 0.0f); | |
210 | - v[2].p = D3DXVECTOR3(-112*KERO, -72*KERO, 0.0f); | |
211 | - v[3].p = D3DXVECTOR3( 112*KERO, -72*KERO, 0.0f); | |
212 | - v[4].p = D3DXVECTOR3( 114*KERO, 72*KERO, 0.0f); | |
213 | - v[5].p = D3DXVECTOR3( 122*KERO, 72*KERO, 0.0f); | |
214 | - v[6].p = D3DXVECTOR3( 114*KERO, -72*KERO, 0.0f); | |
215 | - v[7].p = D3DXVECTOR3( 122*KERO, -72*KERO, 0.0f); | |
216 | - } | |
217 | - else | |
218 | - { | |
219 | - // 頂点座標の設定 | |
220 | - v[0].p = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); | |
221 | - v[1].p = D3DXVECTOR3(MAIN_W, 1.0f, 0.0f); | |
222 | - v[2].p = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); | |
223 | - v[3].p = D3DXVECTOR3(MAIN_W,-1.0f, 0.0f); | |
224 | - v[4].p = D3DXVECTOR3(SEG_W, 1.0f, 0.0f); | |
225 | - v[5].p = D3DXVECTOR3( 1.0f, 1.0f, 0.0f); | |
226 | - v[6].p = D3DXVECTOR3(SEG_W, -1.0f, 0.0f); | |
227 | - v[7].p = D3DXVECTOR3( 1.0f, -1.0f, 0.0f); | |
228 | - } | |
229 | - // テクスチャ座標の設定 | |
230 | - v[0].t = D3DXVECTOR2(0.0f, 0.0f); | |
231 | - v[1].t = D3DXVECTOR2(MAIN_X, 0.0f); | |
232 | - v[2].t = D3DXVECTOR2(0.0f, MAIN_Y); | |
233 | - v[3].t = D3DXVECTOR2(MAIN_X, MAIN_Y); | |
234 | - v[4].t = D3DXVECTOR2(0.0f, 0.0f); | |
235 | - v[5].t = D3DXVECTOR2(SEG_X, 0.0f); | |
236 | - v[6].t = D3DXVECTOR2(0.0f, SEG_Y); | |
237 | - v[7].t = D3DXVECTOR2(SEG_X, SEG_Y); | |
238 | - // 頂点カラーの設定 | |
239 | - v[0].color = v[1].color = v[2].color = v[3].color = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f); | |
240 | - v[4].color = v[5].color = v[6].color = v[7].color = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f); | |
241 | - pMyVB->Unlock(); | |
242 | - // 回転処理 | |
243 | - D3DXMATRIX mat; | |
244 | - D3DXMatrixIdentity(&mat); | |
245 | - // 斜め(左atan(0.5)回転) | |
246 | - if (Kerorikan) | |
247 | - { | |
248 | - D3DXMatrixRotationZ(&mat, 0.4636476f); // atanf(0.5f)だと最適化されないかもしれないので | |
249 | - } | |
250 | - // 縦(左90度回転) | |
251 | - else if (DrawMode & 0x01) | |
252 | - { | |
253 | - D3DXMatrixRotationZ(&mat, D3DXToRadian(90)); | |
254 | - } | |
255 | - // 描画開始宣言 | |
256 | - if(SUCCEEDED(pD3DDevice->BeginScene())) | |
257 | - { | |
258 | - pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0xFF666666, 0.0f, 0); | |
259 | - pD3DDevice->SetStreamSource(0, pMyVB, 0, sizeof(MY_VERTEX)); | |
260 | - pD3DDevice->SetFVF(MY_VERTEX_FVF); | |
261 | - pD3DDevice->SetTexture( 0, pTexture); | |
262 | - pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); // 0番の頂点から三角形を2個 | |
263 | - pD3DDevice->SetTexture( 0, pSegTexture); | |
264 | - pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 2); // 4番の頂点から三角形を2個 | |
265 | - pD3DDevice->SetTransform(D3DTS_VIEW, &mat); | |
266 | - // 描画終了宣言 | |
267 | - pD3DDevice->EndScene(); | |
268 | - } | |
269 | - // 描画結果の転送 | |
270 | - if(FAILED(pD3DDevice->Present(NULL, NULL, NULL, NULL))) | |
271 | - { | |
272 | - // デバイス消失から復帰 | |
273 | - pD3DDevice->Reset(&D3DPP); | |
274 | - } | |
275 | -} | |
276 | - | |
277 | -//------------------------------------------------------------- | |
278 | -void WsResize(void) | |
279 | -{ | |
280 | - RECT wind; | |
281 | - RECT wind2; | |
282 | - int lcdHeight = 144; | |
283 | - int lcdWidth = 224 + 10; // +10はセグメント分 | |
284 | - int client_width; | |
285 | - int client_height; | |
286 | - | |
287 | - if (Kerorikan) | |
288 | - { | |
289 | - client_width = 256 * DrawSize; | |
290 | - client_height = 256 * DrawSize; | |
291 | - } | |
292 | - else if (DrawMode & 0x01) | |
293 | - { | |
294 | - client_width = lcdHeight * DrawSize; | |
295 | - client_height = lcdWidth * DrawSize; | |
296 | - } | |
297 | - else | |
298 | - { | |
299 | - client_width = lcdWidth * DrawSize; | |
300 | - client_height = lcdHeight * DrawSize; | |
301 | - } | |
302 | - wind.top = 0; | |
303 | - wind.left = 0; | |
304 | - wind.right = client_width; | |
305 | - wind.bottom = client_height; | |
306 | - AdjustWindowRectEx(&wind, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, | |
307 | - TRUE, WS_EX_APPWINDOW | WS_EX_ACCEPTFILES); | |
308 | - wind2 = wind; | |
309 | - SendMessage(hWnd, WM_NCCALCSIZE, FALSE, (LPARAM) &wind2); | |
310 | - SetWindowPos(hWnd, NULL, 0, 0, | |
311 | - (wind.right - wind.left) + client_width - (wind2.right - wind2.left), | |
312 | - (wind.bottom - wind.top ) + client_height - (wind2.bottom - wind2.top ), | |
313 | - SWP_NOMOVE | SWP_NOZORDER | SWP_SHOWWINDOW); | |
314 | -} | |
315 | - | |
316 | -//------------------------------------------------------------- | |
317 | -int SetDrawMode(int Mode) | |
318 | -{ | |
319 | - if(DrawMode != Mode) | |
320 | - { | |
321 | - DrawMode = Mode; | |
322 | - WsInputSetKeyMap(Mode); | |
323 | - WsResize(); | |
324 | - } | |
325 | - return 0; | |
326 | -} | |
327 | - | |
328 | -//------------------------------------------------------------- | |
329 | -int SetDrawSize(enum DRAWSIZE Size) | |
330 | -{ | |
331 | - DrawSize = Size; | |
332 | - WsResize(); | |
333 | - return 0; | |
334 | -} | |
335 | - |
@@ -1,614 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include "../resource.h" | |
7 | -#include "WSDialog.h" | |
8 | -#include <commctrl.h> | |
9 | -#include <tchar.h> | |
10 | -#include "WSInput.h" | |
11 | -#include "keycode.h" | |
12 | - | |
13 | -static WNDPROC OrgEditProc; | |
14 | -static HWND hTabCtrl, hTab1, hTab2, hTab3, hTab4; | |
15 | -static int TmpKeyboardH[13]; | |
16 | -static int TmpKeyboardV[13]; | |
17 | -static int TmpJoypadH[13]; | |
18 | -static int TmpJoypadV[13]; | |
19 | -static int SelectedTab; | |
20 | - | |
21 | -void WsDlgConfInit(HWND hDlg) | |
22 | -{ | |
23 | - HINSTANCE hInst; | |
24 | - TC_ITEM tc; | |
25 | - RECT rt; | |
26 | - LPPOINT pt = (LPPOINT)&rt; | |
27 | - | |
28 | - memcpy(TmpKeyboardH, WsKeyboardH, sizeof(int) * 13); | |
29 | - memcpy(TmpKeyboardV, WsKeyboardV, sizeof(int) * 13); | |
30 | - memcpy(TmpJoypadH, WsJoypadH, sizeof(int) * 13); | |
31 | - memcpy(TmpJoypadV, WsJoypadV, sizeof(int) * 13); | |
32 | - hInst = (HINSTANCE)GetWindowLong(hDlg, GWLP_HINSTANCE); | |
33 | - hTabCtrl = GetDlgItem(hDlg, IDC_TAB1); | |
34 | - // タブコントロールにタブシートを挿入 | |
35 | - tc.mask = TCIF_TEXT; | |
36 | - tc.pszText = TEXT("キー横"); | |
37 | - TabCtrl_InsertItem(hTabCtrl , 0, &tc); | |
38 | - tc.mask = TCIF_TEXT; | |
39 | - tc.pszText = TEXT("キー縦"); | |
40 | - TabCtrl_InsertItem(hTabCtrl , 1, &tc); | |
41 | - tc.mask = TCIF_TEXT; | |
42 | - tc.pszText = TEXT("コントローラー横"); | |
43 | - TabCtrl_InsertItem(hTabCtrl , 2, &tc); | |
44 | - tc.mask = TCIF_TEXT; | |
45 | - tc.pszText = TEXT("コントローラー縦"); | |
46 | - TabCtrl_InsertItem(hTabCtrl , 3, &tc); | |
47 | - // タブに貼り付けるダイアログを生成 | |
48 | - hTab1 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB1, hDlg, (DLGPROC)TabProc1); | |
49 | - hTab2 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB2, hDlg, (DLGPROC)TabProc2); | |
50 | - hTab3 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB1, hDlg, (DLGPROC)TabProc3); | |
51 | - hTab4 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB2, hDlg, (DLGPROC)TabProc4); | |
52 | - // タブコントロールのクライアント領域の座標を取得 | |
53 | - GetClientRect(hTabCtrl, &rt); | |
54 | - TabCtrl_AdjustRect(hTabCtrl, FALSE, &rt); | |
55 | - // 親ウィンドウがhDlgなのでタブのマップが必要 | |
56 | - MapWindowPoints(hTabCtrl, hDlg, pt, 2); | |
57 | - // タブのウィンドウの位置とサイズを変更する | |
58 | - MoveWindow(hTab1, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
59 | - MoveWindow(hTab2, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
60 | - MoveWindow(hTab3, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
61 | - MoveWindow(hTab4, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
62 | - // デフォルトでタブ1を表示 | |
63 | - ShowWindow(hTab1, SW_SHOW); | |
64 | - SetFocus(GetDlgItem(hTab1, IDC_EDIT_Y1)); | |
65 | - SendMessage(GetDlgItem(hTab1, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
66 | - lpKeyDevice->Acquire(); | |
67 | -} | |
68 | - | |
69 | -LRESULT CALLBACK ConfProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) | |
70 | -{ | |
71 | - NMHDR *nm = (NMHDR *)lParam; | |
72 | - | |
73 | - switch (msg) | |
74 | - { | |
75 | - case WM_INITDIALOG: | |
76 | - WsInputInit(hDlg); | |
77 | - WsDlgConfInit(hDlg); | |
78 | - return TRUE; | |
79 | - case WM_NOTIFY: | |
80 | - // タブコントロールの選択されているタブが変更されたことを通知 | |
81 | - switch (nm->code) | |
82 | - { | |
83 | - case TCN_SELCHANGE: | |
84 | - if (nm->hwndFrom == hTabCtrl) | |
85 | - { | |
86 | - SelectedTab = TabCtrl_GetCurSel(hTabCtrl); | |
87 | - switch (SelectedTab) | |
88 | - { | |
89 | - case 0: | |
90 | - ShowWindow(hTab1, SW_SHOW); | |
91 | - ShowWindow(hTab2, SW_HIDE); | |
92 | - ShowWindow(hTab3, SW_HIDE); | |
93 | - ShowWindow(hTab4, SW_HIDE); | |
94 | - SetFocus(GetDlgItem(hTab1, IDC_EDIT_Y1)); | |
95 | - SendMessage(GetDlgItem(hTab1, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
96 | - lpKeyDevice->Acquire(); | |
97 | - break; | |
98 | - case 1: | |
99 | - ShowWindow(hTab1, SW_HIDE); | |
100 | - ShowWindow(hTab2, SW_SHOW); | |
101 | - ShowWindow(hTab3, SW_HIDE); | |
102 | - ShowWindow(hTab4, SW_HIDE); | |
103 | - SetFocus(GetDlgItem(hTab2, IDC_EDIT_Y1)); | |
104 | - SendMessage(GetDlgItem(hTab2, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
105 | - lpKeyDevice->Acquire(); | |
106 | - break; | |
107 | - case 2: | |
108 | - ShowWindow(hTab1, SW_HIDE); | |
109 | - ShowWindow(hTab2, SW_HIDE); | |
110 | - ShowWindow(hTab3, SW_SHOW); | |
111 | - ShowWindow(hTab4, SW_HIDE); | |
112 | - SetFocus(GetDlgItem(hTab3, IDC_EDIT_Y1)); | |
113 | - SendMessage(GetDlgItem(hTab3, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
114 | - break; | |
115 | - case 3: | |
116 | - ShowWindow(hTab1, SW_HIDE); | |
117 | - ShowWindow(hTab2, SW_HIDE); | |
118 | - ShowWindow(hTab3, SW_HIDE); | |
119 | - ShowWindow(hTab4, SW_SHOW); | |
120 | - SetFocus(GetDlgItem(hTab4, IDC_EDIT_Y1)); | |
121 | - SendMessage(GetDlgItem(hTab4, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
122 | - break; | |
123 | - } | |
124 | - return TRUE; | |
125 | - } | |
126 | - break; | |
127 | - } | |
128 | - break; | |
129 | - case WM_COMMAND: | |
130 | - if(HIWORD(wParam) == BN_CLICKED) | |
131 | - { | |
132 | - switch (LOWORD(wParam)) | |
133 | - { | |
134 | - case IDOK: | |
135 | - memcpy(WsKeyboardH, TmpKeyboardH, sizeof(int) * 13); | |
136 | - memcpy(WsKeyboardV, TmpKeyboardV, sizeof(int) * 13); | |
137 | - memcpy(WsJoypadH, TmpJoypadH, sizeof(int) * 13); | |
138 | - memcpy(WsJoypadV, TmpJoypadV, sizeof(int) * 13); | |
139 | - EndDialog(hDlg, LOWORD(wParam)); | |
140 | - return TRUE; | |
141 | - case IDCANCEL: | |
142 | - EndDialog(hDlg, LOWORD(wParam)); | |
143 | - return TRUE; | |
144 | - } | |
145 | - } | |
146 | - break; | |
147 | - case WM_DESTROY: | |
148 | - WsInputRelease(); | |
149 | - break; | |
150 | - } | |
151 | - return FALSE; | |
152 | -} | |
153 | - | |
154 | -LRESULT CALLBACK EditProcKey(HWND hEditWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
155 | -{ | |
156 | - HRESULT hRet; | |
157 | - BYTE diKeys[256]; | |
158 | - int key, i; | |
159 | - HWND next; | |
160 | - | |
161 | - switch (msg) | |
162 | - { | |
163 | - case WM_GETDLGCODE: | |
164 | - return DLGC_WANTALLKEYS; | |
165 | - case WM_CHAR: | |
166 | - return 0; | |
167 | - case WM_KEYDOWN: | |
168 | - key = GetDlgCtrlID(hEditWnd) - IDC_EDIT_B; | |
169 | - wParam = 0; | |
170 | - hRet = lpKeyDevice->Acquire(); | |
171 | - if (hRet == DI_OK || hRet == S_FALSE) | |
172 | - { | |
173 | - hRet = lpKeyDevice->GetDeviceState(256, diKeys); | |
174 | - if (hRet == DI_OK) | |
175 | - { | |
176 | - for (i = 0; i < 256; i++) | |
177 | - { | |
178 | - if (diKeys[i] & 0x80) | |
179 | - { | |
180 | - SetWindowText(hEditWnd, keyName[i]); | |
181 | - if (SelectedTab == 0) | |
182 | - { | |
183 | - TmpKeyboardH[key] = i; | |
184 | - } | |
185 | - else | |
186 | - { | |
187 | - TmpKeyboardV[key] = i; | |
188 | - } | |
189 | - next = GetNextDlgTabItem(GetParent(hEditWnd), hEditWnd, FALSE); | |
190 | - SetFocus(next); | |
191 | - SendMessage(next, EM_SETSEL, 0, -1); | |
192 | - return 0; | |
193 | - } | |
194 | - } | |
195 | - } | |
196 | - } | |
197 | - break; | |
198 | - } | |
199 | - return CallWindowProc(OrgEditProc, hEditWnd, msg, wParam, lParam); | |
200 | -} | |
201 | - | |
202 | -LRESULT CALLBACK EditProcJoy(HWND hEditWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
203 | -{ | |
204 | - HWND next; | |
205 | - | |
206 | - switch (msg) | |
207 | - { | |
208 | - case WM_GETDLGCODE: | |
209 | - return DLGC_WANTALLKEYS; | |
210 | - case WM_CHAR: | |
211 | - return 0; | |
212 | - case WM_KEYDOWN: | |
213 | - if (wParam == VK_TAB || wParam == VK_RETURN) | |
214 | - { | |
215 | - next = GetNextDlgTabItem(GetParent(hEditWnd), hEditWnd, FALSE); | |
216 | - SetFocus(next); | |
217 | - SendMessage(next, EM_SETSEL, 0, -1); | |
218 | - } | |
219 | - return 0; | |
220 | - } | |
221 | - return CallWindowProc(OrgEditProc, hEditWnd, msg, wParam, lParam); | |
222 | -} | |
223 | - | |
224 | -LRESULT CALLBACK TabProc1(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
225 | -{ | |
226 | - switch (msg) { | |
227 | - case WM_INITDIALOG: | |
228 | - OrgEditProc = (WNDPROC)GetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC); | |
229 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
230 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
231 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
232 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
233 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
234 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
235 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
236 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
237 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
238 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
239 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
240 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
241 | - | |
242 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), keyName[TmpKeyboardH[12]]); | |
243 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), keyName[TmpKeyboardH[11]]); | |
244 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), keyName[TmpKeyboardH[10]]); | |
245 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), keyName[TmpKeyboardH[9]]); | |
246 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), keyName[TmpKeyboardH[8]]); | |
247 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), keyName[TmpKeyboardH[7]]); | |
248 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), keyName[TmpKeyboardH[6]]); | |
249 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), keyName[TmpKeyboardH[5]]); | |
250 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), keyName[TmpKeyboardH[4]]); | |
251 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), keyName[TmpKeyboardH[2]]); | |
252 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), keyName[TmpKeyboardH[1]]); | |
253 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), keyName[TmpKeyboardH[0]]); | |
254 | - return TRUE; | |
255 | - } | |
256 | - return FALSE; | |
257 | -} | |
258 | - | |
259 | -LRESULT CALLBACK TabProc2(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
260 | -{ | |
261 | - switch (msg) { | |
262 | - case WM_INITDIALOG: | |
263 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
264 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
265 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
266 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
267 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
268 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
269 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
270 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
271 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
272 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
273 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
274 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
275 | - | |
276 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), keyName[TmpKeyboardH[12]]); | |
277 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), keyName[TmpKeyboardV[11]]); | |
278 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), keyName[TmpKeyboardV[10]]); | |
279 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), keyName[TmpKeyboardV[9]]); | |
280 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), keyName[TmpKeyboardV[8]]); | |
281 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), keyName[TmpKeyboardV[7]]); | |
282 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), keyName[TmpKeyboardV[6]]); | |
283 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), keyName[TmpKeyboardV[5]]); | |
284 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), keyName[TmpKeyboardV[4]]); | |
285 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), keyName[TmpKeyboardV[2]]); | |
286 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), keyName[TmpKeyboardV[1]]); | |
287 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), keyName[TmpKeyboardV[0]]); | |
288 | - return TRUE; | |
289 | - } | |
290 | - return FALSE; | |
291 | -} | |
292 | - | |
293 | -LRESULT CALLBACK TabProc3(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
294 | -{ | |
295 | - HWND hEditWnd; | |
296 | - int key, joy; | |
297 | - | |
298 | - switch (msg) { | |
299 | - case WM_INITDIALOG: | |
300 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
301 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
302 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
303 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
304 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
305 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
306 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
307 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
308 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
309 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
310 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
311 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
312 | - | |
313 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GetJoyName(TmpJoypadH[12])); | |
314 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), GetJoyName(TmpJoypadH[11])); | |
315 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), GetJoyName(TmpJoypadH[10])); | |
316 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), GetJoyName(TmpJoypadH[9])); | |
317 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), GetJoyName(TmpJoypadH[8])); | |
318 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), GetJoyName(TmpJoypadH[7])); | |
319 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), GetJoyName(TmpJoypadH[6])); | |
320 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), GetJoyName(TmpJoypadH[5])); | |
321 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), GetJoyName(TmpJoypadH[4])); | |
322 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), GetJoyName(TmpJoypadH[2])); | |
323 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), GetJoyName(TmpJoypadH[1])); | |
324 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), GetJoyName(TmpJoypadH[0])); | |
325 | - | |
326 | - SetTimer(hCtrl, 0, 30, NULL); | |
327 | - return TRUE; | |
328 | - case WM_TIMER: | |
329 | - if (SelectedTab != 2 || wParam != 0) | |
330 | - { | |
331 | - break; | |
332 | - } | |
333 | - hEditWnd = GetFocus(); | |
334 | - key = GetDlgCtrlID(hEditWnd) - IDC_EDIT_B; | |
335 | - joy = GetJoyState(); | |
336 | - if (joy < 0) | |
337 | - { | |
338 | - break; | |
339 | - } | |
340 | - SetWindowText(hEditWnd, GetJoyName(joy)); | |
341 | - TmpJoypadH[key] = joy; | |
342 | - return TRUE; | |
343 | - } | |
344 | - return FALSE; | |
345 | -} | |
346 | - | |
347 | -LRESULT CALLBACK TabProc4(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
348 | -{ | |
349 | - HWND hEditWnd; | |
350 | - int key, joy; | |
351 | - | |
352 | - switch (msg) { | |
353 | - case WM_INITDIALOG: | |
354 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
355 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
356 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
357 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
358 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
359 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
360 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
361 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
362 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
363 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
364 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
365 | - SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
366 | - | |
367 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GetJoyName(TmpJoypadH[12])); | |
368 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), GetJoyName(TmpJoypadV[11])); | |
369 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), GetJoyName(TmpJoypadV[10])); | |
370 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), GetJoyName(TmpJoypadV[9])); | |
371 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), GetJoyName(TmpJoypadV[8])); | |
372 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), GetJoyName(TmpJoypadV[7])); | |
373 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), GetJoyName(TmpJoypadV[6])); | |
374 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), GetJoyName(TmpJoypadV[5])); | |
375 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), GetJoyName(TmpJoypadV[4])); | |
376 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), GetJoyName(TmpJoypadV[2])); | |
377 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), GetJoyName(TmpJoypadV[1])); | |
378 | - SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), GetJoyName(TmpJoypadV[0])); | |
379 | - | |
380 | - SetTimer(hCtrl, 1, 30, NULL); | |
381 | - return TRUE; | |
382 | - case WM_TIMER: | |
383 | - if (SelectedTab != 3 || wParam != 1) | |
384 | - { | |
385 | - break; | |
386 | - } | |
387 | - hEditWnd = GetFocus(); | |
388 | - key = GetDlgCtrlID(hEditWnd) - IDC_EDIT_B; | |
389 | - joy = GetJoyState(); | |
390 | - if (joy < 0) | |
391 | - { | |
392 | - break; | |
393 | - } | |
394 | - SetWindowText(hEditWnd, GetJoyName(joy)); | |
395 | - TmpJoypadV[key] = joy; | |
396 | - return TRUE; | |
397 | - } | |
398 | - return FALSE; | |
399 | -} | |
400 | - | |
401 | -LPCTSTR GetJoyName(int joy) | |
402 | -{ | |
403 | - static LPCTSTR JoyStr[] = { | |
404 | - TEXT("POV1 UP"), TEXT("POV1 RIGHT"), TEXT("POV1 DOWN"), TEXT("POV1 LEFT"), | |
405 | - TEXT("POV2 UP"), TEXT("POV2 RIGHT"), TEXT("POV2 DOWN"), TEXT("POV2 LEFT"), | |
406 | - TEXT("POV3 UP"), TEXT("POV3 RIGHT"), TEXT("POV3 DOWN"), TEXT("POV3 LEFT"), | |
407 | - TEXT("POV4 UP"), TEXT("POV4 RIGHT"), TEXT("POV4 DOWN"), TEXT("POV4 LEFT"), | |
408 | - TEXT("Y -"), TEXT("X +"), TEXT("Y +"), TEXT("X -"), TEXT("Z +"), TEXT("Z -"), | |
409 | - TEXT("RY -"), TEXT("RX +"), TEXT("RY +"), TEXT("RX -"), TEXT("RZ +"), TEXT("RZ -"), | |
410 | - TEXT("Slider1 +"), TEXT("Slider1 -"), TEXT("Slider2 +"), TEXT("Slider2 -") | |
411 | - }; | |
412 | - static const int JoyInt[] = { | |
413 | - WS_JOY_POV1_UP, WS_JOY_POV1_RIGHT, WS_JOY_POV1_DOWN, WS_JOY_POV1_LEFT, | |
414 | - WS_JOY_POV2_UP, WS_JOY_POV2_RIGHT, WS_JOY_POV2_DOWN, WS_JOY_POV2_LEFT, | |
415 | - WS_JOY_POV3_UP, WS_JOY_POV3_RIGHT, WS_JOY_POV3_DOWN, WS_JOY_POV3_LEFT, | |
416 | - WS_JOY_POV4_UP, WS_JOY_POV4_RIGHT, WS_JOY_POV4_DOWN, WS_JOY_POV4_LEFT, | |
417 | - WS_JOY_AXIS_Y_M, WS_JOY_AXIS_X_P, WS_JOY_AXIS_Y_P, WS_JOY_AXIS_X_M, WS_JOY_AXIS_Z_P, WS_JOY_AXIS_Z_M, | |
418 | - WS_JOY_AXIS_RY_M, WS_JOY_AXIS_RX_P, WS_JOY_AXIS_RY_P, WS_JOY_AXIS_RX_M, WS_JOY_AXIS_RZ_P, WS_JOY_AXIS_RZ_M, | |
419 | - WS_JOY_SLIDER1_P, WS_JOY_SLIDER1_M, WS_JOY_SLIDER2_P, WS_JOY_SLIDER2_M | |
420 | - }; | |
421 | - static TCHAR buf[8]; | |
422 | - int i; | |
423 | - | |
424 | - if (joy < 0x80) | |
425 | - { | |
426 | - _stprintf_s(buf, 8, TEXT("%d"), joy); | |
427 | - return buf; | |
428 | - } | |
429 | - for (i = 0; i < 32; i++) | |
430 | - { | |
431 | - if (joy == JoyInt[i]) | |
432 | - { | |
433 | - return JoyStr[i]; | |
434 | - } | |
435 | - } | |
436 | - buf[0] = 0; | |
437 | - return buf; | |
438 | -} | |
439 | - | |
440 | -int GetJoyState(void) | |
441 | -{ | |
442 | - const long joyCenter = 0x7fff; | |
443 | - static int xFlag = 0; | |
444 | - static int yFlag = 0; | |
445 | - static int zFlag = 0; | |
446 | - static int rxFlag = 0; | |
447 | - static int ryFlag = 0; | |
448 | - static int rzFlag = 0; | |
449 | - static int s1Flag = 0; | |
450 | - static int s2Flag = 0; | |
451 | - HRESULT hRet; | |
452 | - int joy; | |
453 | - unsigned int i; | |
454 | - DIJOYSTATE2 js; | |
455 | - DIDEVCAPS diDevCaps; | |
456 | - | |
457 | - diDevCaps.dwSize = sizeof(DIDEVCAPS); | |
458 | - if (lpJoyDevice == NULL) | |
459 | - { | |
460 | - return -1; | |
461 | - } | |
462 | - hRet = lpJoyDevice->Poll(); | |
463 | - if (FAILED(hRet)) | |
464 | - { | |
465 | - hRet = lpJoyDevice->Acquire(); | |
466 | - while (hRet == DIERR_INPUTLOST) | |
467 | - { | |
468 | - hRet = lpJoyDevice->Acquire(); | |
469 | - } | |
470 | - return -1; | |
471 | - } | |
472 | - lpJoyDevice->GetDeviceState(sizeof(DIJOYSTATE2), &js); | |
473 | - lpJoyDevice->GetCapabilities(&diDevCaps); | |
474 | - for (i = 0; i < diDevCaps.dwButtons; i++) | |
475 | - { | |
476 | - if (js.rgbButtons[i] & 0x80) | |
477 | - { | |
478 | - return i + 1; | |
479 | - } | |
480 | - } | |
481 | - for (i = 0; i < diDevCaps.dwPOVs; i++) | |
482 | - { | |
483 | - joy = WS_JOY_POV1_UP + (i << 4); | |
484 | - if (js.rgdwPOV[i] == JOY_POVFORWARD) | |
485 | - { | |
486 | - return joy; | |
487 | - } | |
488 | - else if (js.rgdwPOV[i] == JOY_POVRIGHT) | |
489 | - { | |
490 | - return joy + 1; | |
491 | - } | |
492 | - else if (js.rgdwPOV[i] == JOY_POVBACKWARD) | |
493 | - { | |
494 | - return joy + 3; | |
495 | - } | |
496 | - else if (js.rgdwPOV[i] == JOY_POVLEFT) | |
497 | - { | |
498 | - return joy + 7; | |
499 | - } | |
500 | - } | |
501 | - if ((js.lX > joyCenter - 0x1000) && (js.lX < joyCenter + 0x1000)) | |
502 | - { | |
503 | - xFlag = 1; | |
504 | - } | |
505 | - if ((js.lX > (joyCenter + 0x4000)) && xFlag) | |
506 | - { | |
507 | - xFlag = 0; | |
508 | - return WS_JOY_AXIS_X_P; | |
509 | - } | |
510 | - else if ((js.lX < (joyCenter - 0x4000)) && xFlag) | |
511 | - { | |
512 | - xFlag = 0; | |
513 | - return WS_JOY_AXIS_X_M; | |
514 | - } | |
515 | - if ((js.lY > joyCenter - 0x1000) && (js.lY < joyCenter + 0x1000)) | |
516 | - { | |
517 | - yFlag = 1; | |
518 | - } | |
519 | - if ((js.lY > (joyCenter + 0x4000)) && yFlag) | |
520 | - { | |
521 | - yFlag = 0; | |
522 | - return WS_JOY_AXIS_Y_P; | |
523 | - } | |
524 | - else if ((js.lY < (joyCenter - 0x4000)) && yFlag) | |
525 | - { | |
526 | - yFlag = 0; | |
527 | - return WS_JOY_AXIS_Y_M; | |
528 | - } | |
529 | - if ((js.lZ > joyCenter - 0x1000) && (js.lZ < joyCenter + 0x1000)) | |
530 | - { | |
531 | - zFlag = 1; | |
532 | - } | |
533 | - if ((js.lZ > (joyCenter + 0x4000)) && zFlag) | |
534 | - { | |
535 | - zFlag = 0; | |
536 | - return WS_JOY_AXIS_Z_P; | |
537 | - } | |
538 | - else if ((js.lZ < (joyCenter - 0x4000)) && zFlag) | |
539 | - { | |
540 | - zFlag = 0; | |
541 | - return WS_JOY_AXIS_Z_M; | |
542 | - } | |
543 | - if ((js.lRx > joyCenter - 0x1000) && (js.lRx < joyCenter + 0x1000)) | |
544 | - { | |
545 | - rxFlag = 1; | |
546 | - } | |
547 | - if ((js.lRx > (joyCenter + 0x4000)) && rxFlag) | |
548 | - { | |
549 | - rxFlag = 0; | |
550 | - return WS_JOY_AXIS_RX_P; | |
551 | - } | |
552 | - else if ((js.lRx < (joyCenter - 0x4000)) && rxFlag) | |
553 | - { | |
554 | - rxFlag = 0; | |
555 | - return WS_JOY_AXIS_RX_M; | |
556 | - } | |
557 | - if ((js.lRy > joyCenter - 0x1000) && (js.lRy < joyCenter + 0x1000)) | |
558 | - { | |
559 | - ryFlag = 1; | |
560 | - } | |
561 | - if ((js.lRy > (joyCenter + 0x4000)) && ryFlag) | |
562 | - { | |
563 | - ryFlag = 0; | |
564 | - return WS_JOY_AXIS_RY_P; | |
565 | - } | |
566 | - else if ((js.lRy < (joyCenter - 0x4000)) && ryFlag) | |
567 | - { | |
568 | - ryFlag = 0; | |
569 | - return WS_JOY_AXIS_RY_M; | |
570 | - } | |
571 | - if ((js.lRz > joyCenter - 0x1000) && (js.lRz < joyCenter + 0x1000)) | |
572 | - { | |
573 | - rzFlag = 1; | |
574 | - } | |
575 | - if ((js.lRz > (joyCenter + 0x4000)) && rzFlag) | |
576 | - { | |
577 | - rzFlag = 0; | |
578 | - return WS_JOY_AXIS_RZ_P; | |
579 | - } | |
580 | - else if ((js.lRz < (joyCenter - 0x4000)) && rzFlag) | |
581 | - { | |
582 | - rzFlag = 0; | |
583 | - return WS_JOY_AXIS_RZ_M; | |
584 | - } | |
585 | - if ((js.rglSlider[0] > joyCenter - 0x1000) && (js.rglSlider[0] < joyCenter + 0x1000)) | |
586 | - { | |
587 | - s1Flag = 1; | |
588 | - } | |
589 | - if ((js.rglSlider[0] > (joyCenter + 0x4000)) && s1Flag) | |
590 | - { | |
591 | - s1Flag = 0; | |
592 | - return WS_JOY_SLIDER1_P; | |
593 | - } | |
594 | - else if ((js.rglSlider[0] < (joyCenter - 0x4000)) && s1Flag) | |
595 | - { | |
596 | - s1Flag = 0; | |
597 | - return WS_JOY_SLIDER1_M; | |
598 | - } | |
599 | - if ((js.rglSlider[1] > joyCenter - 0x1000) && (js.rglSlider[0] < joyCenter + 0x1000)) | |
600 | - { | |
601 | - s2Flag = 1; | |
602 | - } | |
603 | - if ((js.rglSlider[1] > (joyCenter + 0x4000)) && s2Flag) | |
604 | - { | |
605 | - s2Flag = 0; | |
606 | - return WS_JOY_SLIDER2_P; | |
607 | - } | |
608 | - else if ((js.rglSlider[1] < (joyCenter - 0x4000)) && s2Flag) | |
609 | - { | |
610 | - s2Flag = 0; | |
611 | - return WS_JOY_SLIDER2_M; | |
612 | - } | |
613 | - return -1; | |
614 | -} |
@@ -1,522 +0,0 @@ | ||
1 | -/* | |
2 | -$Date$ | |
3 | -$Rev$ | |
4 | -*/ | |
5 | - | |
6 | -#include "../resource.h" | |
7 | -#include "WS.h" | |
8 | -#include "WSConfig.h" | |
9 | -#include "WSInput.h" | |
10 | -#include "WSDraw.h" | |
11 | -#include "WSRender.h" | |
12 | -#include "WSApu.h" | |
13 | -#include "WSFileio.h" | |
14 | -#include "WSDialog.h" | |
15 | - | |
16 | -BOOL InitApp(HINSTANCE); | |
17 | -BOOL InitInstance(HINSTANCE); | |
18 | -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |
19 | -LRESULT CALLBACK AboutProc(HWND, UINT, WPARAM, LPARAM); | |
20 | -wchar_t* OpenWSFile(wchar_t*, DWORD); | |
21 | -void WsPause(void); | |
22 | -void SetRecentRoms(wchar_t* RomPath); | |
23 | -void SetStateInfo(void); | |
24 | - | |
25 | -HINSTANCE hInst; | |
26 | -HWND hWnd; | |
27 | -static LPCTSTR szClassName = TEXT("OswanJ"); //クラス名 | |
28 | -static wchar_t RecentOfn0[512]; | |
29 | -static wchar_t RecentOfn1[512]; | |
30 | -static wchar_t RecentOfn2[512]; | |
31 | -static wchar_t RecentOfn3[512]; | |
32 | -static wchar_t RecentOfn4[512]; | |
33 | -static wchar_t RecentOfn5[512]; | |
34 | -wchar_t* RecentOfn[] = {RecentOfn0, RecentOfn1, RecentOfn2, RecentOfn3, RecentOfn4, RecentOfn5}; | |
35 | -extern wchar_t StateName[512]; | |
36 | - | |
37 | -int WINAPI wWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPWSTR lpsCmdLine, int nCmdShow) | |
38 | -{ | |
39 | - MSG msg; | |
40 | - HACCEL accel; | |
41 | - | |
42 | - if (!hPrevInst) | |
43 | - { | |
44 | - if (!InitApp(hCurInst)) return FALSE; | |
45 | - } | |
46 | - if (!InitInstance(hCurInst)) | |
47 | - { | |
48 | - return FALSE; | |
49 | - } | |
50 | - hInst = hCurInst; | |
51 | - accel = LoadAccelerators(hCurInst, MAKEINTRESOURCE(IDR_ACCELERATOR1)); | |
52 | - WsSetDir(); | |
53 | - WsLoadEeprom(); | |
54 | - ConfigCreate(); | |
55 | - SetRecentRoms(NULL); | |
56 | - apuInit(); | |
57 | - apuLoadSound(); | |
58 | - drawInitialize(FALSE); | |
59 | - drawCreate(); | |
60 | - SetDrawSize(DS_2); | |
61 | - WsInputInit(hWnd); | |
62 | - WsInputSetKeyMap(0); | |
63 | - WsSplash(); | |
64 | - if (__argc > 1) | |
65 | - { | |
66 | - if (WsCreate(__wargv[1]) != -1) | |
67 | - { | |
68 | - Sleep(500); | |
69 | - Run = 1; | |
70 | - SetRecentRoms(__wargv[1]); | |
71 | - SetStateInfo(); | |
72 | - } | |
73 | - } | |
74 | - while (1) { | |
75 | - if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) | |
76 | - { | |
77 | - if (!GetMessage(&msg, NULL, 0, 0)) | |
78 | - { | |
79 | - break; | |
80 | - } | |
81 | - if (!TranslateAccelerator(hWnd, accel, &msg)) { | |
82 | - TranslateMessage(&msg); | |
83 | - DispatchMessage(&msg); | |
84 | - } | |
85 | - } | |
86 | - if (Run) | |
87 | - { | |
88 | - WsRun(); | |
89 | - } | |
90 | - else | |
91 | - { | |
92 | - Sleep(2); | |
93 | - } | |
94 | - } | |
95 | - WsSaveEeprom(); | |
96 | - WsRelease(); | |
97 | - drawDestroy(); | |
98 | - drawFinalize(); | |
99 | - apuEnd(); | |
100 | - ConfigRelease(); | |
101 | - return 0; | |
102 | -} | |
103 | -//ウィンドウ・クラスの登録 | |
104 | -BOOL InitApp(HINSTANCE hInst) | |
105 | -{ | |
106 | - WNDCLASS wc; | |
107 | - wc.style = CS_HREDRAW | CS_VREDRAW; | |
108 | - wc.lpfnWndProc = WndProc; | |
109 | - wc.cbClsExtra = 0; | |
110 | - wc.cbWndExtra = 0; | |
111 | - wc.hInstance = hInst; | |
112 | - wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)); | |
113 | - wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
114 | - wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); | |
115 | - wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); | |
116 | - wc.lpszClassName = szClassName; | |
117 | - return (RegisterClass(&wc)); | |
118 | -} | |
119 | -//ウィンドウの生成 | |
120 | -BOOL InitInstance(HINSTANCE hInst) | |
121 | -{ | |
122 | - hWnd = CreateWindow(szClassName, TEXT("OswanJ"),//タイトルバーにこの名前が表示されます | |
123 | - WS_OVERLAPPEDWINDOW, //ウィンドウの種類 | |
124 | - CW_USEDEFAULT, //X座標 | |
125 | - CW_USEDEFAULT, //Y座標 | |
126 | - CW_USEDEFAULT, //幅 | |
127 | - CW_USEDEFAULT, //高さ | |
128 | - NULL, //親ウィンドウのハンドル、親を作るときはNULL | |
129 | - NULL, //メニューハンドル、クラスメニューを使うときはNUL | |
130 | - hInst, //インスタンスハンドル | |
131 | - NULL); | |
132 | - if (!hWnd) return FALSE; | |
133 | - return TRUE; | |
134 | -} | |
135 | -//ウィンドウプロシージャ | |
136 | -LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) | |
137 | -{ | |
138 | - wchar_t RomPath[512] = {0}; | |
139 | - HMENU menu; | |
140 | - WORD id; | |
141 | - | |
142 | - switch (msg) | |
143 | - { | |
144 | - case WM_CREATE: | |
145 | - break; | |
146 | - case WM_COMMAND: | |
147 | - switch (LOWORD(wp)) | |
148 | - { | |
149 | - case ID_FILE_OPENROM: | |
150 | - if (OpenWSFile(RomPath, 512)) | |
151 | - { | |
152 | - apuWaveClear(); | |
153 | - WsRelease(); | |
154 | - Run = 1; | |
155 | - WsCreate(RomPath); | |
156 | - SetRecentRoms(RomPath); | |
157 | - SetStateInfo(); | |
158 | - } | |
159 | - return 0L; | |
160 | - case ID_FILE_RECENT_0: | |
161 | - case ID_FILE_RECENT_1: | |
162 | - case ID_FILE_RECENT_2: | |
163 | - case ID_FILE_RECENT_3: | |
164 | - case ID_FILE_RECENT_4: | |
165 | - case ID_FILE_RECENT_5: | |
166 | - id = LOWORD(wp) - ID_FILE_RECENT_0; | |
167 | - if (*RecentOfn[id]) | |
168 | - { | |
169 | - apuWaveClear(); | |
170 | - WsRelease(); | |
171 | - Run = 1; | |
172 | - if (WsCreate(RecentOfn[id]) < 0) | |
173 | - { | |
174 | - wcscpy(RecentOfn[id], L""); | |
175 | - Run = 0; | |
176 | - WsSplash(); | |
177 | - } | |
178 | - SetRecentRoms(RecentOfn[id]); | |
179 | - SetStateInfo(); | |
180 | - } | |
181 | - return 0L; | |
182 | - case ID_PDATA_SET: | |
183 | - apuWaveClear(); | |
184 | - WsRelease(); | |
185 | - Run = 1; | |
186 | - WsCreate(NULL); | |
187 | - return 0L; | |
188 | - case ID_STATE_SAVE_0: | |
189 | - case ID_STATE_SAVE_1: | |
190 | - case ID_STATE_SAVE_2: | |
191 | - case ID_STATE_SAVE_3: | |
192 | - id = LOWORD(wp) - ID_STATE_SAVE_0; | |
193 | - WsSaveState(id); | |
194 | - SetStateInfo(); | |
195 | - return 0L; | |
196 | - case ID_STATE_LOAD_0: | |
197 | - case ID_STATE_LOAD_1: | |
198 | - case ID_STATE_LOAD_2: | |
199 | - case ID_STATE_LOAD_3: | |
200 | - id = LOWORD(wp) - ID_STATE_LOAD_0; | |
201 | - WsLoadState(id); | |
202 | - return 0L; | |
203 | - case ID_PAUSE: | |
204 | - WsPause(); | |
205 | - return 0L; | |
206 | - case ID_RESET: | |
207 | - WsReset(); | |
208 | - return 0L; | |
209 | - case ID_SIZE_1: | |
210 | - menu = GetMenu(hWnd); | |
211 | - CheckMenuItem(menu, ID_SIZE_1, MF_CHECKED); | |
212 | - CheckMenuItem(menu, ID_SIZE_2, MF_UNCHECKED); | |
213 | - CheckMenuItem(menu, ID_SIZE_3, MF_UNCHECKED); | |
214 | - CheckMenuItem(menu, ID_SIZE_4, MF_UNCHECKED); | |
215 | - SetDrawSize(DS_1); | |
216 | - return 0L; | |
217 | - case ID_SIZE_2: | |
218 | - menu = GetMenu(hWnd); | |
219 | - CheckMenuItem(menu, ID_SIZE_1, MF_UNCHECKED); | |
220 | - CheckMenuItem(menu, ID_SIZE_2, MF_CHECKED); | |
221 | - CheckMenuItem(menu, ID_SIZE_3, MF_UNCHECKED); | |
222 | - CheckMenuItem(menu, ID_SIZE_4, MF_UNCHECKED); | |
223 | - SetDrawSize(DS_2); | |
224 | - return 0L; | |
225 | - case ID_SIZE_3: | |
226 | - menu = GetMenu(hWnd); | |
227 | - CheckMenuItem(menu, ID_SIZE_1, MF_UNCHECKED); | |
228 | - CheckMenuItem(menu, ID_SIZE_2, MF_UNCHECKED); | |
229 | - CheckMenuItem(menu, ID_SIZE_3, MF_CHECKED); | |
230 | - CheckMenuItem(menu, ID_SIZE_4, MF_UNCHECKED); | |
231 | - SetDrawSize(DS_3); | |
232 | - return 0L; | |
233 | - case ID_SIZE_4: | |
234 | - menu = GetMenu(hWnd); | |
235 | - CheckMenuItem(menu, ID_SIZE_1, MF_UNCHECKED); | |
236 | - CheckMenuItem(menu, ID_SIZE_2, MF_UNCHECKED); | |
237 | - CheckMenuItem(menu, ID_SIZE_3, MF_UNCHECKED); | |
238 | - CheckMenuItem(menu, ID_SIZE_4, MF_CHECKED); | |
239 | - SetDrawSize(DS_4); | |
240 | - return 0L; | |
241 | - case ID_LAYER_1: | |
242 | - case ID_LAYER_2: | |
243 | - case ID_LAYER_S: | |
244 | - id = LOWORD(wp) - ID_LAYER_1; | |
245 | - menu = GetMenu(hWnd); | |
246 | - if (Layer[id]) | |
247 | - { | |
248 | - Layer[id] = 0; | |
249 | - CheckMenuItem(menu, LOWORD(wp), MF_UNCHECKED); | |
250 | - } | |
251 | - else | |
252 | - { | |
253 | - Layer[id] = 1; | |
254 | - CheckMenuItem(menu, LOWORD(wp), MF_CHECKED); | |
255 | - } | |
256 | - return 0L; | |
257 | - case ID_KERORIKAN: | |
258 | - menu = GetMenu(hWnd); | |
259 | - if (Kerorikan) | |
260 | - { | |
261 | - Kerorikan = 0; | |
262 | - CheckMenuItem(menu, LOWORD(wp), MF_UNCHECKED); | |
263 | - WsResize(); | |
264 | - drawDraw(); | |
265 | - } | |
266 | - else | |
267 | - { | |
268 | - Kerorikan = 1; | |
269 | - CheckMenuItem(menu, LOWORD(wp), MF_CHECKED); | |
270 | - WsResize(); | |
271 | - drawDraw(); | |
272 | - } | |
273 | - return 0L; | |
274 | - case ID_SOUND_1: | |
275 | - case ID_SOUND_2: | |
276 | - case ID_SOUND_3: | |
277 | - case ID_SOUND_4: | |
278 | - case ID_SOUND_5: | |
279 | - case ID_SOUND_6: | |
280 | - case ID_SOUND_7: | |
281 | - id = LOWORD(wp) - ID_SOUND_1; | |
282 | - menu = GetMenu(hWnd); | |
283 | - if (Sound[id]) | |
284 | - { | |
285 | - Sound[id] = 0; | |
286 | - CheckMenuItem(menu, LOWORD(wp), MF_UNCHECKED); | |
287 | - } | |
288 | - else | |
289 | - { | |
290 | - Sound[id] = 1; | |
291 | - CheckMenuItem(menu, LOWORD(wp), MF_CHECKED); | |
292 | - } | |
293 | - return 0L; | |
294 | - case ID_SOUND_UP: | |
295 | - if (WsWaveVol < 100) | |
296 | - { | |
297 | - WsWaveVol++; | |
298 | - } | |
299 | - return 0L; | |
300 | - case ID_SOUND_DOWN: | |
301 | - if (WsWaveVol >= 1) | |
302 | - { | |
303 | - WsWaveVol--; | |
304 | - } | |
305 | - return 0L; | |
306 | - case ID_CONF_INPUT: | |
307 | - WsInputRelease(); | |
308 | - DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_CONFIG), hWnd, (DLGPROC)ConfProc); | |
309 | - WsInputInit(hWnd); | |
310 | - return 0L; | |
311 | - case ID_ABOUT: | |
312 | - DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutProc); | |
313 | - break; | |
314 | - } | |
315 | - break; | |
316 | - case WM_PAINT: | |
317 | - drawDraw(); | |
318 | - break; | |
319 | - case WM_DESTROY: | |
320 | - PostQuitMessage(0); | |
321 | - return 0L; | |
322 | - default: | |
323 | - break; | |
324 | - } | |
325 | - return (DefWindowProc(hWnd, msg, wp, lp)); | |
326 | -} | |
327 | - | |
328 | -//Aboutダイアログプロシージャ | |
329 | -LRESULT CALLBACK AboutProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp) | |
330 | -{ | |
331 | - HDC hDC; | |
332 | - HFONT hFont; | |
333 | - | |
334 | - switch (msg) | |
335 | - { | |
336 | - case WM_INITDIALOG: | |
337 | - SetWindowText(GetDlgItem(hDlgWnd, IDC_TEXT_VERSION), TEXT("バージョン 0.1")); | |
338 | - break; | |
339 | - case WM_CTLCOLORSTATIC: | |
340 | - if((HWND)lp == GetDlgItem(hDlgWnd, IDC_TEXT_VERSION)) | |
341 | - { | |
342 | - hDC = (HDC)wp; | |
343 | - hFont = CreateFont( | |
344 | - 18, /* フォント高さ */ | |
345 | - 0, /* 文字幅 */ | |
346 | - 0, /* テキストの角度 */ | |
347 | - 0, /* ベースラインとx軸との角度 */ | |
348 | - FW_BOLD, /* フォントの重さ(太さ) */ | |
349 | - FALSE, /* イタリック体 */ | |
350 | - FALSE, /* アンダーライン */ | |
351 | - FALSE, /* 打ち消し線 */ | |
352 | - SHIFTJIS_CHARSET, /* 文字セット */ | |
353 | - OUT_DEFAULT_PRECIS, /* 出力精度 */ | |
354 | - CLIP_DEFAULT_PRECIS, /* クリッピング精度 */ | |
355 | - PROOF_QUALITY, /* 出力品質 */ | |
356 | - FIXED_PITCH | FF_MODERN, /* ピッチとファミリー */ | |
357 | - (LPCTSTR)"MS Pゴシック" /* 書体名 */ | |
358 | - ); | |
359 | - SelectObject(hDC, hFont); | |
360 | - SetTextColor(hDC, RGB(0, 0, 255)); | |
361 | - SetBkMode(hDC, TRANSPARENT); | |
362 | - return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH); | |
363 | - } | |
364 | - return DefWindowProc(hDlgWnd, msg, wp, lp); | |
365 | - case WM_COMMAND: | |
366 | - if(HIWORD(wp) == BN_CLICKED) | |
367 | - { | |
368 | - switch (LOWORD(wp)) | |
369 | - { | |
370 | - case IDOK: | |
371 | - case IDCANCEL: | |
372 | - EndDialog(hDlgWnd, LOWORD(wp)); | |
373 | - return 1; | |
374 | - } | |
375 | - } | |
376 | - break; | |
377 | - } | |
378 | - return 0; | |
379 | -} | |
380 | - | |
381 | -wchar_t* OpenWSFile(wchar_t* path, DWORD max) | |
382 | -{ | |
383 | - OPENFILENAMEW ofn; | |
384 | - | |
385 | - ZeroMemory(&ofn, sizeof(OPENFILENAMEW)); | |
386 | - ofn.lStructSize = sizeof(OPENFILENAMEW); | |
387 | - ofn.hwndOwner = hWnd; | |
388 | - ofn.lpstrFile = path; | |
389 | - ofn.nMaxFile = max; | |
390 | - ofn.lpstrFilter = L"Wonderswan(*.ws,*.wsc)\0*.ws;*.wsc\0Wonderswan mono(*.ws)\0*.ws\0Wonderswan color(*.wsc)\0*.wsc\0\0"; | |
391 | - ofn.nFilterIndex = 1; | |
392 | - ofn.lpstrFileTitle = NULL; | |
393 | - ofn.nMaxFileTitle = 0; | |
394 | - ofn.lpstrInitialDir = NULL; | |
395 | - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; | |
396 | - ofn.hInstance = NULL; | |
397 | - if (GetOpenFileNameW(&ofn) == FALSE) | |
398 | - { | |
399 | - return NULL; | |
400 | - } | |
401 | - return path; | |
402 | -} | |
403 | - | |
404 | -void WsPause(void) | |
405 | -{ | |
406 | - static int pause = 0; | |
407 | - HMENU menu = GetMenu(hWnd); | |
408 | - | |
409 | - if (Run) | |
410 | - { | |
411 | - pause = 1; | |
412 | - Run = 0; | |
413 | - CheckMenuItem(menu, ID_PAUSE, MF_CHECKED); | |
414 | - apuWaveClear(); | |
415 | - } | |
416 | - else if (pause) | |
417 | - { | |
418 | - Run = 1; | |
419 | - pause = 0; | |
420 | - CheckMenuItem(menu, ID_PAUSE, MF_UNCHECKED); | |
421 | - } | |
422 | -} | |
423 | - | |
424 | -void SetRecentRoms(wchar_t* RomPath) | |
425 | -{ | |
426 | - int i; | |
427 | - wchar_t* temp; | |
428 | - wchar_t* filename; | |
429 | - wchar_t buf[256]; | |
430 | - MENUITEMINFOW minfo; | |
431 | - HMENU menu = GetMenu(hWnd); | |
432 | - | |
433 | - minfo.cbSize = sizeof(MENUITEMINFOW); | |
434 | - minfo.fMask = MIIM_STATE | MIIM_TYPE; | |
435 | - minfo.fType = MFT_STRING; | |
436 | - minfo.fState = MFS_ENABLED; | |
437 | - minfo.dwTypeData = buf; | |
438 | - if (RomPath && *RomPath) | |
439 | - { | |
440 | - for (i = 0; i < 6; i++) | |
441 | - { | |
442 | - if (wcscmp(RomPath, RecentOfn[i]) == 0) | |
443 | - { | |
444 | - temp = RecentOfn[i]; | |
445 | - while (i) { | |
446 | - RecentOfn[i] = RecentOfn[i - 1]; | |
447 | - i--; | |
448 | - } | |
449 | - RecentOfn[0] = temp; | |
450 | - break; | |
451 | - } | |
452 | - } | |
453 | - if (i) | |
454 | - { | |
455 | - temp = RecentOfn[5]; | |
456 | - RecentOfn[5] = RecentOfn[4]; | |
457 | - RecentOfn[4] = RecentOfn[3]; | |
458 | - RecentOfn[3] = RecentOfn[2]; | |
459 | - RecentOfn[2] = RecentOfn[1]; | |
460 | - RecentOfn[1] = RecentOfn[0]; | |
461 | - RecentOfn[0] = temp; | |
462 | - wcscpy(RecentOfn[0], RomPath); | |
463 | - } | |
464 | - } | |
465 | - for (i = 0; i < 6; i++) | |
466 | - { | |
467 | - if (*RecentOfn[i]) | |
468 | - { | |
469 | - filename = wcsrchr(RecentOfn[i], '\\'); | |
470 | - wsprintf(buf, L"&%d %s", i + 1, ++filename); | |
471 | - } | |
472 | - else | |
473 | - { | |
474 | - wsprintf(buf, L"%d", i + 1); | |
475 | - } | |
476 | - SetMenuItemInfo(menu, ID_FILE_RECENT_0 + i, FALSE, &minfo); | |
477 | - } | |
478 | -} | |
479 | - | |
480 | -void SetStateInfo(void) | |
481 | -{ | |
482 | - int i; | |
483 | - wchar_t buf[512]; | |
484 | - MENUITEMINFOW minfo; | |
485 | - HMENU menu = GetMenu(hWnd); | |
486 | - HANDLE file; | |
487 | - FILETIME ft, lt; | |
488 | - SYSTEMTIME st; | |
489 | - | |
490 | - minfo.cbSize = sizeof(MENUITEMINFOW); | |
491 | - minfo.fMask = MIIM_STATE | MIIM_TYPE; | |
492 | - minfo.fType = MFT_STRING; | |
493 | - minfo.fState = MFS_ENABLED; | |
494 | - minfo.dwTypeData = buf; | |
495 | - if (StateName[0]) | |
496 | - { | |
497 | - for (i = 0; i < 4; i++) | |
498 | - { | |
499 | - wsprintf(buf, L"%s.%03d", StateName, i); | |
500 | - file = CreateFileW(buf, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); | |
501 | - if (file != INVALID_HANDLE_VALUE) | |
502 | - { | |
503 | - GetFileTime(file, NULL, NULL, &ft); | |
504 | - FileTimeToLocalFileTime(&ft, <); | |
505 | - FileTimeToSystemTime(<, &st); | |
506 | - wsprintf(buf, L"&%d %04d/%02d/%02d %02d:%02d:%02d\tShift+F%d", | |
507 | - i + 1, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, i + 1); | |
508 | - SetMenuItemInfo(menu, ID_STATE_SAVE_0 + i, FALSE, &minfo); | |
509 | - wsprintf(buf, L"&%d %04d/%02d/%02d %02d:%02d:%02d\tF%d", | |
510 | - i + 1, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, i + 1); | |
511 | - SetMenuItemInfo(menu, ID_STATE_LOAD_0 + i, FALSE, &minfo); | |
512 | - CloseHandle(file); | |
513 | - } | |
514 | - else | |
515 | - { | |
516 | - wsprintf(buf, L"%d", i + 1); | |
517 | - SetMenuItemInfo(menu, ID_STATE_SAVE_0 + i, FALSE, &minfo); | |
518 | - SetMenuItemInfo(menu, ID_STATE_LOAD_0 + i, FALSE, &minfo); | |
519 | - } | |
520 | - } | |
521 | - } | |
522 | -} |
@@ -0,0 +1,522 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include "../resource.h" | |
7 | +#include "WS.h" | |
8 | +#include "WSConfig.h" | |
9 | +#include "WSInput.h" | |
10 | +#include "WSDraw.h" | |
11 | +#include "WSRender.h" | |
12 | +#include "WSApu.h" | |
13 | +#include "WSFileio.h" | |
14 | +#include "WSDialog.h" | |
15 | + | |
16 | +BOOL InitApp(HINSTANCE); | |
17 | +BOOL InitInstance(HINSTANCE); | |
18 | +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |
19 | +LRESULT CALLBACK AboutProc(HWND, UINT, WPARAM, LPARAM); | |
20 | +wchar_t* OpenWSFile(wchar_t*, DWORD); | |
21 | +void WsPause(void); | |
22 | +void SetRecentRoms(wchar_t* RomPath); | |
23 | +void SetStateInfo(void); | |
24 | + | |
25 | +HINSTANCE hInst; | |
26 | +HWND hWnd; | |
27 | +static LPCTSTR szClassName = TEXT("OswanJ"); //クラス名 | |
28 | +static wchar_t RecentOfn0[512]; | |
29 | +static wchar_t RecentOfn1[512]; | |
30 | +static wchar_t RecentOfn2[512]; | |
31 | +static wchar_t RecentOfn3[512]; | |
32 | +static wchar_t RecentOfn4[512]; | |
33 | +static wchar_t RecentOfn5[512]; | |
34 | +wchar_t* RecentOfn[] = {RecentOfn0, RecentOfn1, RecentOfn2, RecentOfn3, RecentOfn4, RecentOfn5}; | |
35 | +extern wchar_t StateName[512]; | |
36 | + | |
37 | +int WINAPI wWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPWSTR lpsCmdLine, int nCmdShow) | |
38 | +{ | |
39 | + MSG msg; | |
40 | + HACCEL accel; | |
41 | + | |
42 | + if (!hPrevInst) | |
43 | + { | |
44 | + if (!InitApp(hCurInst)) return FALSE; | |
45 | + } | |
46 | + if (!InitInstance(hCurInst)) | |
47 | + { | |
48 | + return FALSE; | |
49 | + } | |
50 | + hInst = hCurInst; | |
51 | + accel = LoadAccelerators(hCurInst, MAKEINTRESOURCE(IDR_ACCELERATOR1)); | |
52 | + WsSetDir(); | |
53 | + WsLoadEeprom(); | |
54 | + ConfigCreate(); | |
55 | + SetRecentRoms(NULL); | |
56 | + apuInit(); | |
57 | + apuLoadSound(); | |
58 | + drawInitialize(FALSE); | |
59 | + drawCreate(); | |
60 | + SetDrawSize(DS_2); | |
61 | + WsInputInit(hWnd); | |
62 | + WsInputSetKeyMap(0); | |
63 | + WsSplash(); | |
64 | + if (__argc > 1) | |
65 | + { | |
66 | + if (WsCreate(__wargv[1]) != -1) | |
67 | + { | |
68 | + Sleep(500); | |
69 | + Run = 1; | |
70 | + SetRecentRoms(__wargv[1]); | |
71 | + SetStateInfo(); | |
72 | + } | |
73 | + } | |
74 | + while (1) { | |
75 | + if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) | |
76 | + { | |
77 | + if (!GetMessage(&msg, NULL, 0, 0)) | |
78 | + { | |
79 | + break; | |
80 | + } | |
81 | + if (!TranslateAccelerator(hWnd, accel, &msg)) { | |
82 | + TranslateMessage(&msg); | |
83 | + DispatchMessage(&msg); | |
84 | + } | |
85 | + } | |
86 | + if (Run) | |
87 | + { | |
88 | + WsRun(); | |
89 | + } | |
90 | + else | |
91 | + { | |
92 | + Sleep(2); | |
93 | + } | |
94 | + } | |
95 | + WsSaveEeprom(); | |
96 | + WsRelease(); | |
97 | + drawDestroy(); | |
98 | + drawFinalize(); | |
99 | + apuEnd(); | |
100 | + ConfigRelease(); | |
101 | + return 0; | |
102 | +} | |
103 | +//ウィンドウ・クラスの登録 | |
104 | +BOOL InitApp(HINSTANCE hInst) | |
105 | +{ | |
106 | + WNDCLASS wc; | |
107 | + wc.style = CS_HREDRAW | CS_VREDRAW; | |
108 | + wc.lpfnWndProc = WndProc; | |
109 | + wc.cbClsExtra = 0; | |
110 | + wc.cbWndExtra = 0; | |
111 | + wc.hInstance = hInst; | |
112 | + wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)); | |
113 | + wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
114 | + wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); | |
115 | + wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); | |
116 | + wc.lpszClassName = szClassName; | |
117 | + return (RegisterClass(&wc)); | |
118 | +} | |
119 | +//ウィンドウの生成 | |
120 | +BOOL InitInstance(HINSTANCE hInst) | |
121 | +{ | |
122 | + hWnd = CreateWindow(szClassName, TEXT("OswanJ"),//タイトルバーにこの名前が表示されます | |
123 | + WS_OVERLAPPEDWINDOW, //ウィンドウの種類 | |
124 | + CW_USEDEFAULT, //X座標 | |
125 | + CW_USEDEFAULT, //Y座標 | |
126 | + CW_USEDEFAULT, //幅 | |
127 | + CW_USEDEFAULT, //高さ | |
128 | + NULL, //親ウィンドウのハンドル、親を作るときはNULL | |
129 | + NULL, //メニューハンドル、クラスメニューを使うときはNUL | |
130 | + hInst, //インスタンスハンドル | |
131 | + NULL); | |
132 | + if (!hWnd) return FALSE; | |
133 | + return TRUE; | |
134 | +} | |
135 | +//ウィンドウプロシージャ | |
136 | +LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) | |
137 | +{ | |
138 | + wchar_t RomPath[512] = {0}; | |
139 | + HMENU menu; | |
140 | + WORD id; | |
141 | + | |
142 | + switch (msg) | |
143 | + { | |
144 | + case WM_CREATE: | |
145 | + break; | |
146 | + case WM_COMMAND: | |
147 | + switch (LOWORD(wp)) | |
148 | + { | |
149 | + case ID_FILE_OPENROM: | |
150 | + if (OpenWSFile(RomPath, 512)) | |
151 | + { | |
152 | + apuWaveClear(); | |
153 | + WsRelease(); | |
154 | + Run = 1; | |
155 | + WsCreate(RomPath); | |
156 | + SetRecentRoms(RomPath); | |
157 | + SetStateInfo(); | |
158 | + } | |
159 | + return 0L; | |
160 | + case ID_FILE_RECENT_0: | |
161 | + case ID_FILE_RECENT_1: | |
162 | + case ID_FILE_RECENT_2: | |
163 | + case ID_FILE_RECENT_3: | |
164 | + case ID_FILE_RECENT_4: | |
165 | + case ID_FILE_RECENT_5: | |
166 | + id = LOWORD(wp) - ID_FILE_RECENT_0; | |
167 | + if (*RecentOfn[id]) | |
168 | + { | |
169 | + apuWaveClear(); | |
170 | + WsRelease(); | |
171 | + Run = 1; | |
172 | + if (WsCreate(RecentOfn[id]) < 0) | |
173 | + { | |
174 | + wcscpy(RecentOfn[id], L""); | |
175 | + Run = 0; | |
176 | + WsSplash(); | |
177 | + } | |
178 | + SetRecentRoms(RecentOfn[id]); | |
179 | + SetStateInfo(); | |
180 | + } | |
181 | + return 0L; | |
182 | + case ID_PDATA_SET: | |
183 | + apuWaveClear(); | |
184 | + WsRelease(); | |
185 | + Run = 1; | |
186 | + WsCreate(NULL); | |
187 | + return 0L; | |
188 | + case ID_STATE_SAVE_0: | |
189 | + case ID_STATE_SAVE_1: | |
190 | + case ID_STATE_SAVE_2: | |
191 | + case ID_STATE_SAVE_3: | |
192 | + id = LOWORD(wp) - ID_STATE_SAVE_0; | |
193 | + WsSaveState(id); | |
194 | + SetStateInfo(); | |
195 | + return 0L; | |
196 | + case ID_STATE_LOAD_0: | |
197 | + case ID_STATE_LOAD_1: | |
198 | + case ID_STATE_LOAD_2: | |
199 | + case ID_STATE_LOAD_3: | |
200 | + id = LOWORD(wp) - ID_STATE_LOAD_0; | |
201 | + WsLoadState(id); | |
202 | + return 0L; | |
203 | + case ID_PAUSE: | |
204 | + WsPause(); | |
205 | + return 0L; | |
206 | + case ID_RESET: | |
207 | + WsReset(); | |
208 | + return 0L; | |
209 | + case ID_SIZE_1: | |
210 | + menu = GetMenu(hWnd); | |
211 | + CheckMenuItem(menu, ID_SIZE_1, MF_CHECKED); | |
212 | + CheckMenuItem(menu, ID_SIZE_2, MF_UNCHECKED); | |
213 | + CheckMenuItem(menu, ID_SIZE_3, MF_UNCHECKED); | |
214 | + CheckMenuItem(menu, ID_SIZE_4, MF_UNCHECKED); | |
215 | + SetDrawSize(DS_1); | |
216 | + return 0L; | |
217 | + case ID_SIZE_2: | |
218 | + menu = GetMenu(hWnd); | |
219 | + CheckMenuItem(menu, ID_SIZE_1, MF_UNCHECKED); | |
220 | + CheckMenuItem(menu, ID_SIZE_2, MF_CHECKED); | |
221 | + CheckMenuItem(menu, ID_SIZE_3, MF_UNCHECKED); | |
222 | + CheckMenuItem(menu, ID_SIZE_4, MF_UNCHECKED); | |
223 | + SetDrawSize(DS_2); | |
224 | + return 0L; | |
225 | + case ID_SIZE_3: | |
226 | + menu = GetMenu(hWnd); | |
227 | + CheckMenuItem(menu, ID_SIZE_1, MF_UNCHECKED); | |
228 | + CheckMenuItem(menu, ID_SIZE_2, MF_UNCHECKED); | |
229 | + CheckMenuItem(menu, ID_SIZE_3, MF_CHECKED); | |
230 | + CheckMenuItem(menu, ID_SIZE_4, MF_UNCHECKED); | |
231 | + SetDrawSize(DS_3); | |
232 | + return 0L; | |
233 | + case ID_SIZE_4: | |
234 | + menu = GetMenu(hWnd); | |
235 | + CheckMenuItem(menu, ID_SIZE_1, MF_UNCHECKED); | |
236 | + CheckMenuItem(menu, ID_SIZE_2, MF_UNCHECKED); | |
237 | + CheckMenuItem(menu, ID_SIZE_3, MF_UNCHECKED); | |
238 | + CheckMenuItem(menu, ID_SIZE_4, MF_CHECKED); | |
239 | + SetDrawSize(DS_4); | |
240 | + return 0L; | |
241 | + case ID_LAYER_1: | |
242 | + case ID_LAYER_2: | |
243 | + case ID_LAYER_S: | |
244 | + id = LOWORD(wp) - ID_LAYER_1; | |
245 | + menu = GetMenu(hWnd); | |
246 | + if (Layer[id]) | |
247 | + { | |
248 | + Layer[id] = 0; | |
249 | + CheckMenuItem(menu, LOWORD(wp), MF_UNCHECKED); | |
250 | + } | |
251 | + else | |
252 | + { | |
253 | + Layer[id] = 1; | |
254 | + CheckMenuItem(menu, LOWORD(wp), MF_CHECKED); | |
255 | + } | |
256 | + return 0L; | |
257 | + case ID_KERORIKAN: | |
258 | + menu = GetMenu(hWnd); | |
259 | + if (Kerorikan) | |
260 | + { | |
261 | + Kerorikan = 0; | |
262 | + CheckMenuItem(menu, LOWORD(wp), MF_UNCHECKED); | |
263 | + WsResize(); | |
264 | + drawDraw(); | |
265 | + } | |
266 | + else | |
267 | + { | |
268 | + Kerorikan = 1; | |
269 | + CheckMenuItem(menu, LOWORD(wp), MF_CHECKED); | |
270 | + WsResize(); | |
271 | + drawDraw(); | |
272 | + } | |
273 | + return 0L; | |
274 | + case ID_SOUND_1: | |
275 | + case ID_SOUND_2: | |
276 | + case ID_SOUND_3: | |
277 | + case ID_SOUND_4: | |
278 | + case ID_SOUND_5: | |
279 | + case ID_SOUND_6: | |
280 | + case ID_SOUND_7: | |
281 | + id = LOWORD(wp) - ID_SOUND_1; | |
282 | + menu = GetMenu(hWnd); | |
283 | + if (Sound[id]) | |
284 | + { | |
285 | + Sound[id] = 0; | |
286 | + CheckMenuItem(menu, LOWORD(wp), MF_UNCHECKED); | |
287 | + } | |
288 | + else | |
289 | + { | |
290 | + Sound[id] = 1; | |
291 | + CheckMenuItem(menu, LOWORD(wp), MF_CHECKED); | |
292 | + } | |
293 | + return 0L; | |
294 | + case ID_SOUND_UP: | |
295 | + if (WsWaveVol < 100) | |
296 | + { | |
297 | + WsWaveVol++; | |
298 | + } | |
299 | + return 0L; | |
300 | + case ID_SOUND_DOWN: | |
301 | + if (WsWaveVol >= 1) | |
302 | + { | |
303 | + WsWaveVol--; | |
304 | + } | |
305 | + return 0L; | |
306 | + case ID_CONF_INPUT: | |
307 | + WsInputRelease(); | |
308 | + DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_CONFIG), hWnd, (DLGPROC)ConfProc); | |
309 | + WsInputInit(hWnd); | |
310 | + return 0L; | |
311 | + case ID_ABOUT: | |
312 | + DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutProc); | |
313 | + break; | |
314 | + } | |
315 | + break; | |
316 | + case WM_PAINT: | |
317 | + drawDraw(); | |
318 | + break; | |
319 | + case WM_DESTROY: | |
320 | + PostQuitMessage(0); | |
321 | + return 0L; | |
322 | + default: | |
323 | + break; | |
324 | + } | |
325 | + return (DefWindowProc(hWnd, msg, wp, lp)); | |
326 | +} | |
327 | + | |
328 | +//Aboutダイアログプロシージャ | |
329 | +LRESULT CALLBACK AboutProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp) | |
330 | +{ | |
331 | + HDC hDC; | |
332 | + HFONT hFont; | |
333 | + | |
334 | + switch (msg) | |
335 | + { | |
336 | + case WM_INITDIALOG: | |
337 | + SetWindowText(GetDlgItem(hDlgWnd, IDC_TEXT_VERSION), TEXT("バージョン 0.1")); | |
338 | + break; | |
339 | + case WM_CTLCOLORSTATIC: | |
340 | + if((HWND)lp == GetDlgItem(hDlgWnd, IDC_TEXT_VERSION)) | |
341 | + { | |
342 | + hDC = (HDC)wp; | |
343 | + hFont = CreateFont( | |
344 | + 18, /* フォント高さ */ | |
345 | + 0, /* 文字幅 */ | |
346 | + 0, /* テキストの角度 */ | |
347 | + 0, /* ベースラインとx軸との角度 */ | |
348 | + FW_BOLD, /* フォントの重さ(太さ) */ | |
349 | + FALSE, /* イタリック体 */ | |
350 | + FALSE, /* アンダーライン */ | |
351 | + FALSE, /* 打ち消し線 */ | |
352 | + SHIFTJIS_CHARSET, /* 文字セット */ | |
353 | + OUT_DEFAULT_PRECIS, /* 出力精度 */ | |
354 | + CLIP_DEFAULT_PRECIS, /* クリッピング精度 */ | |
355 | + PROOF_QUALITY, /* 出力品質 */ | |
356 | + FIXED_PITCH | FF_MODERN, /* ピッチとファミリー */ | |
357 | + (LPCTSTR)"MS Pゴシック" /* 書体名 */ | |
358 | + ); | |
359 | + SelectObject(hDC, hFont); | |
360 | + SetTextColor(hDC, RGB(0, 0, 255)); | |
361 | + SetBkMode(hDC, TRANSPARENT); | |
362 | + return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH); | |
363 | + } | |
364 | + return DefWindowProc(hDlgWnd, msg, wp, lp); | |
365 | + case WM_COMMAND: | |
366 | + if(HIWORD(wp) == BN_CLICKED) | |
367 | + { | |
368 | + switch (LOWORD(wp)) | |
369 | + { | |
370 | + case IDOK: | |
371 | + case IDCANCEL: | |
372 | + EndDialog(hDlgWnd, LOWORD(wp)); | |
373 | + return 1; | |
374 | + } | |
375 | + } | |
376 | + break; | |
377 | + } | |
378 | + return 0; | |
379 | +} | |
380 | + | |
381 | +wchar_t* OpenWSFile(wchar_t* path, DWORD max) | |
382 | +{ | |
383 | + OPENFILENAMEW ofn; | |
384 | + | |
385 | + ZeroMemory(&ofn, sizeof(OPENFILENAMEW)); | |
386 | + ofn.lStructSize = sizeof(OPENFILENAMEW); | |
387 | + ofn.hwndOwner = hWnd; | |
388 | + ofn.lpstrFile = path; | |
389 | + ofn.nMaxFile = max; | |
390 | + ofn.lpstrFilter = L"Wonderswan(*.ws,*.wsc)\0*.ws;*.wsc\0Wonderswan mono(*.ws)\0*.ws\0Wonderswan color(*.wsc)\0*.wsc\0\0"; | |
391 | + ofn.nFilterIndex = 1; | |
392 | + ofn.lpstrFileTitle = NULL; | |
393 | + ofn.nMaxFileTitle = 0; | |
394 | + ofn.lpstrInitialDir = NULL; | |
395 | + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; | |
396 | + ofn.hInstance = NULL; | |
397 | + if (GetOpenFileNameW(&ofn) == FALSE) | |
398 | + { | |
399 | + return NULL; | |
400 | + } | |
401 | + return path; | |
402 | +} | |
403 | + | |
404 | +void WsPause(void) | |
405 | +{ | |
406 | + static int pause = 0; | |
407 | + HMENU menu = GetMenu(hWnd); | |
408 | + | |
409 | + if (Run) | |
410 | + { | |
411 | + pause = 1; | |
412 | + Run = 0; | |
413 | + CheckMenuItem(menu, ID_PAUSE, MF_CHECKED); | |
414 | + apuWaveClear(); | |
415 | + } | |
416 | + else if (pause) | |
417 | + { | |
418 | + Run = 1; | |
419 | + pause = 0; | |
420 | + CheckMenuItem(menu, ID_PAUSE, MF_UNCHECKED); | |
421 | + } | |
422 | +} | |
423 | + | |
424 | +void SetRecentRoms(wchar_t* RomPath) | |
425 | +{ | |
426 | + int i; | |
427 | + wchar_t* temp; | |
428 | + wchar_t* filename; | |
429 | + wchar_t buf[256]; | |
430 | + MENUITEMINFOW minfo; | |
431 | + HMENU menu = GetMenu(hWnd); | |
432 | + | |
433 | + minfo.cbSize = sizeof(MENUITEMINFOW); | |
434 | + minfo.fMask = MIIM_STATE | MIIM_TYPE; | |
435 | + minfo.fType = MFT_STRING; | |
436 | + minfo.fState = MFS_ENABLED; | |
437 | + minfo.dwTypeData = buf; | |
438 | + if (RomPath && *RomPath) | |
439 | + { | |
440 | + for (i = 0; i < 6; i++) | |
441 | + { | |
442 | + if (wcscmp(RomPath, RecentOfn[i]) == 0) | |
443 | + { | |
444 | + temp = RecentOfn[i]; | |
445 | + while (i) { | |
446 | + RecentOfn[i] = RecentOfn[i - 1]; | |
447 | + i--; | |
448 | + } | |
449 | + RecentOfn[0] = temp; | |
450 | + break; | |
451 | + } | |
452 | + } | |
453 | + if (i) | |
454 | + { | |
455 | + temp = RecentOfn[5]; | |
456 | + RecentOfn[5] = RecentOfn[4]; | |
457 | + RecentOfn[4] = RecentOfn[3]; | |
458 | + RecentOfn[3] = RecentOfn[2]; | |
459 | + RecentOfn[2] = RecentOfn[1]; | |
460 | + RecentOfn[1] = RecentOfn[0]; | |
461 | + RecentOfn[0] = temp; | |
462 | + wcscpy(RecentOfn[0], RomPath); | |
463 | + } | |
464 | + } | |
465 | + for (i = 0; i < 6; i++) | |
466 | + { | |
467 | + if (*RecentOfn[i]) | |
468 | + { | |
469 | + filename = wcsrchr(RecentOfn[i], '\\'); | |
470 | + wsprintf(buf, L"&%d %s", i + 1, ++filename); | |
471 | + } | |
472 | + else | |
473 | + { | |
474 | + wsprintf(buf, L"%d", i + 1); | |
475 | + } | |
476 | + SetMenuItemInfo(menu, ID_FILE_RECENT_0 + i, FALSE, &minfo); | |
477 | + } | |
478 | +} | |
479 | + | |
480 | +void SetStateInfo(void) | |
481 | +{ | |
482 | + int i; | |
483 | + wchar_t buf[512]; | |
484 | + MENUITEMINFOW minfo; | |
485 | + HMENU menu = GetMenu(hWnd); | |
486 | + HANDLE file; | |
487 | + FILETIME ft, lt; | |
488 | + SYSTEMTIME st; | |
489 | + | |
490 | + minfo.cbSize = sizeof(MENUITEMINFOW); | |
491 | + minfo.fMask = MIIM_STATE | MIIM_TYPE; | |
492 | + minfo.fType = MFT_STRING; | |
493 | + minfo.fState = MFS_ENABLED; | |
494 | + minfo.dwTypeData = buf; | |
495 | + if (StateName[0]) | |
496 | + { | |
497 | + for (i = 0; i < 4; i++) | |
498 | + { | |
499 | + wsprintf(buf, L"%s.%03d", StateName, i); | |
500 | + file = CreateFileW(buf, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); | |
501 | + if (file != INVALID_HANDLE_VALUE) | |
502 | + { | |
503 | + GetFileTime(file, NULL, NULL, &ft); | |
504 | + FileTimeToLocalFileTime(&ft, <); | |
505 | + FileTimeToSystemTime(<, &st); | |
506 | + wsprintf(buf, L"&%d %04d/%02d/%02d %02d:%02d:%02d\tShift+F%d", | |
507 | + i + 1, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, i + 1); | |
508 | + SetMenuItemInfo(menu, ID_STATE_SAVE_0 + i, FALSE, &minfo); | |
509 | + wsprintf(buf, L"&%d %04d/%02d/%02d %02d:%02d:%02d\tF%d", | |
510 | + i + 1, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, i + 1); | |
511 | + SetMenuItemInfo(menu, ID_STATE_LOAD_0 + i, FALSE, &minfo); | |
512 | + CloseHandle(file); | |
513 | + } | |
514 | + else | |
515 | + { | |
516 | + wsprintf(buf, L"%d", i + 1); | |
517 | + SetMenuItemInfo(menu, ID_STATE_SAVE_0 + i, FALSE, &minfo); | |
518 | + SetMenuItemInfo(menu, ID_STATE_LOAD_0 + i, FALSE, &minfo); | |
519 | + } | |
520 | + } | |
521 | + } | |
522 | +} |
@@ -0,0 +1,494 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include <windows.h> | |
7 | +#include <mmsystem.h> | |
8 | +#include "../resource.h" | |
9 | +#include "WSHard.h" | |
10 | +#include "WSApu.h" | |
11 | +#include "WSError.h" | |
12 | +#include "WSInput.h" | |
13 | + | |
14 | +#define BUFSIZEN 0x10000 | |
15 | +#define BPSWAV 12000 // WSのHblankが12KHz | |
16 | +#define BUFSIZEW 64 | |
17 | +#define BUFCOUNT 30 | |
18 | + | |
19 | +unsigned long WaveMap; | |
20 | +SOUND Ch[4]; | |
21 | +int VoiceOn; | |
22 | +SWEEP Swp; | |
23 | +NOISE Noise; | |
24 | +int Sound[7] = {1, 1, 1, 1, 1, 1, 1}; | |
25 | +int WsWaveVol = 4; | |
26 | + | |
27 | +static unsigned char PData[4][32]; | |
28 | +static unsigned char PDataN[8][BUFSIZEN]; | |
29 | +static unsigned int RandData[BUFSIZEN]; | |
30 | + | |
31 | +static HWAVEOUT hWaveOut; | |
32 | +static WAVEHDR *whdr[BUFCOUNT]; | |
33 | +static int rBuf, wBuf, wPos; | |
34 | + | |
35 | +extern HWND hWnd; | |
36 | +extern BYTE *Page[16]; | |
37 | +extern BYTE IO[0x100]; | |
38 | + | |
39 | + | |
40 | + | |
41 | +void CALLBACK apuWaveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) | |
42 | +{ | |
43 | + switch (uMsg) | |
44 | + { | |
45 | + case WOM_OPEN: | |
46 | + break; | |
47 | + case WOM_DONE: | |
48 | + rBuf++; | |
49 | + if (rBuf >= BUFCOUNT) | |
50 | + { | |
51 | + rBuf = 0; | |
52 | + } | |
53 | + break; | |
54 | + case WOM_CLOSE: | |
55 | + break; | |
56 | + } | |
57 | +} | |
58 | + | |
59 | +int apuWaveCreate(void) | |
60 | +{ | |
61 | + MMRESULT result; | |
62 | + WAVEFORMATEX wfe; | |
63 | + int i; | |
64 | + TCHAR msg[255]; | |
65 | + | |
66 | + rBuf = 0; | |
67 | + wBuf = 0; | |
68 | + wPos = 0; | |
69 | + ZeroMemory(&wfe, sizeof(wfe)); | |
70 | + wfe.wFormatTag = WAVE_FORMAT_PCM; | |
71 | + wfe.nChannels = 2; | |
72 | + wfe.wBitsPerSample = 16; | |
73 | + wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample / 8; | |
74 | + wfe.nSamplesPerSec = BPSWAV; | |
75 | + wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign; | |
76 | + result = waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfe, (DWORD_PTR)apuWaveOutProc, (DWORD_PTR)NULL, CALLBACK_FUNCTION); | |
77 | + if (result != MMSYSERR_NOERROR ) | |
78 | + { | |
79 | + waveOutGetErrorText(result, msg, sizeof(msg)); | |
80 | + ErrorMsg(ERR_WAVEOUT_OPEN); | |
81 | + } | |
82 | + for (i = 0; i < BUFCOUNT; i++) | |
83 | + { | |
84 | + whdr[i] = (WAVEHDR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WAVEHDR)); | |
85 | + whdr[i]->lpData = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BUFSIZEW * 4); | |
86 | + whdr[i]->dwBufferLength = BUFSIZEW * 4; | |
87 | + whdr[i]->dwFlags = 0; | |
88 | + whdr[i]->dwLoops = 0; | |
89 | + result = waveOutPrepareHeader(hWaveOut, whdr[i], sizeof(WAVEHDR)); | |
90 | + if (result != MMSYSERR_NOERROR ) | |
91 | + { | |
92 | + waveOutGetErrorText(result, msg, sizeof(msg)); | |
93 | + ErrorMsg(ERR_WAVEOUT_PREPAREHEADER); | |
94 | + } | |
95 | + } | |
96 | + return 0; | |
97 | +} | |
98 | + | |
99 | +void apuWaveRelease(void) | |
100 | +{ | |
101 | + int i; | |
102 | + | |
103 | + waveOutReset(hWaveOut); | |
104 | + for(i = 0; i < BUFCOUNT; i++) | |
105 | + { | |
106 | + if (whdr[i]) | |
107 | + { | |
108 | + waveOutUnprepareHeader(hWaveOut,whdr[i],sizeof(WAVEHDR)); | |
109 | + HeapFree(GetProcessHeap(),0,whdr[i]->lpData); | |
110 | + HeapFree(GetProcessHeap(),0,whdr[i]); | |
111 | + whdr[i] = NULL; | |
112 | + } | |
113 | + } | |
114 | + waveOutClose(hWaveOut); | |
115 | + return; | |
116 | +} | |
117 | + | |
118 | +void apuWaveClear(void) | |
119 | +{ | |
120 | + int i; | |
121 | + | |
122 | + waveOutReset(hWaveOut); | |
123 | + for (i = 0; i < BUFCOUNT; i++) | |
124 | + { | |
125 | + ZeroMemory(whdr[i]->lpData, BUFSIZEW * 4); | |
126 | + } | |
127 | + rBuf = 0; | |
128 | + wBuf = 0; | |
129 | + wPos = 0; | |
130 | +} | |
131 | + | |
132 | +int apuInit(void) | |
133 | +{ | |
134 | + int i, j; | |
135 | + | |
136 | + for (i = 0; i < 4; i++) | |
137 | + { | |
138 | + for (j = 0; j < 32; j++) | |
139 | + { | |
140 | + PData[i][j] = 8; | |
141 | + } | |
142 | + } | |
143 | + for (i = 0; i < 8; i++) | |
144 | + { | |
145 | + for (j = 0; j < BUFSIZEN; j++) | |
146 | + { | |
147 | + PDataN[i][j] = ((apuMrand(15 - i) & 1) ? 15 : 0); | |
148 | + } | |
149 | + } | |
150 | + | |
151 | + for (i = 0; i < BUFSIZEN; i++) | |
152 | + { | |
153 | + RandData[i] = apuMrand(15); | |
154 | + } | |
155 | + apuWaveCreate(); | |
156 | + return 0; | |
157 | +} | |
158 | + | |
159 | +void apuEnd(void) | |
160 | +{ | |
161 | + apuWaveRelease(); | |
162 | + apuDestroySound(); | |
163 | +} | |
164 | + | |
165 | +unsigned int apuMrand(unsigned int Degree) | |
166 | +{ | |
167 | +#define BIT(n) (1<<n) | |
168 | + typedef struct | |
169 | + { | |
170 | + unsigned int N; | |
171 | + int InputBit; | |
172 | + int Mask; | |
173 | + } POLYNOMIAL; | |
174 | + | |
175 | + static POLYNOMIAL TblMask[]= | |
176 | + { | |
177 | + { 2,BIT(2) ,BIT(0)|BIT(1)}, | |
178 | + { 3,BIT(3) ,BIT(0)|BIT(1)}, | |
179 | + { 4,BIT(4) ,BIT(0)|BIT(1)}, | |
180 | + { 5,BIT(5) ,BIT(0)|BIT(2)}, | |
181 | + { 6,BIT(6) ,BIT(0)|BIT(1)}, | |
182 | + { 7,BIT(7) ,BIT(0)|BIT(1)}, | |
183 | + { 8,BIT(8) ,BIT(0)|BIT(2)|BIT(3)|BIT(4)}, | |
184 | + { 9,BIT(9) ,BIT(0)|BIT(4)}, | |
185 | + {10,BIT(10),BIT(0)|BIT(3)}, | |
186 | + {11,BIT(11),BIT(0)|BIT(2)}, | |
187 | + {12,BIT(12),BIT(0)|BIT(1)|BIT(4)|BIT(6)}, | |
188 | + {13,BIT(13),BIT(0)|BIT(1)|BIT(3)|BIT(4)}, | |
189 | + {14,BIT(14),BIT(0)|BIT(1)|BIT(4)|BIT(5)}, | |
190 | + {15,BIT(15),BIT(0)|BIT(1)}, | |
191 | + { 0, 0, 0}, | |
192 | + }; | |
193 | + static POLYNOMIAL *pTbl = TblMask; | |
194 | + static int ShiftReg = BIT(2)-1; | |
195 | + int XorReg = 0; | |
196 | + int Masked; | |
197 | + | |
198 | + if(pTbl->N != Degree) | |
199 | + { | |
200 | + pTbl = TblMask; | |
201 | + while(pTbl->N) { | |
202 | + if(pTbl->N == Degree) | |
203 | + { | |
204 | + break; | |
205 | + } | |
206 | + pTbl++; | |
207 | + } | |
208 | + if(!pTbl->N) | |
209 | + { | |
210 | + pTbl--; | |
211 | + } | |
212 | + ShiftReg &= pTbl->InputBit-1; | |
213 | + if(!ShiftReg) | |
214 | + { | |
215 | + ShiftReg = pTbl->InputBit-1; | |
216 | + } | |
217 | + } | |
218 | + Masked = ShiftReg & pTbl->Mask; | |
219 | + while(Masked) | |
220 | + { | |
221 | + XorReg ^= Masked & 0x01; | |
222 | + Masked >>= 1; | |
223 | + } | |
224 | + if(XorReg) | |
225 | + { | |
226 | + ShiftReg |= pTbl->InputBit; | |
227 | + } | |
228 | + else | |
229 | + { | |
230 | + ShiftReg &= ~pTbl->InputBit; | |
231 | + } | |
232 | + ShiftReg >>= 1; | |
233 | + return ShiftReg; | |
234 | +} | |
235 | + | |
236 | +void apuSetPData(int addr, unsigned char val) | |
237 | +{ | |
238 | + int i, j; | |
239 | + | |
240 | + i = (addr & 0x30) >> 4; | |
241 | + j = (addr & 0x0F) << 1; | |
242 | + PData[i][j]=(unsigned char)(val & 0x0F); | |
243 | + PData[i][j + 1]=(unsigned char)((val & 0xF0)>>4); | |
244 | +} | |
245 | + | |
246 | +unsigned char apuVoice(void) | |
247 | +{ | |
248 | + static int index = 0, b = 0; | |
249 | + unsigned char v; | |
250 | + | |
251 | + if ((IO[SDMACTL] & 0x98) == 0x98) { // Hyper voice | |
252 | + v = Page[IO[SDMASH] + b][*(WORD*)(IO + SDMASL) + index++]; | |
253 | + if ((*(WORD*)(IO + SDMASL) + index) == 0) | |
254 | + { | |
255 | + b++; | |
256 | + } | |
257 | + if (v < 0x80) | |
258 | + { | |
259 | + v += 0x80; | |
260 | + } | |
261 | + else | |
262 | + { | |
263 | + v -= 0x80; | |
264 | + } | |
265 | + if (*(WORD*)(IO+SDMACNT) <= index) | |
266 | + { | |
267 | + index = 0; | |
268 | + b = 0; | |
269 | + } | |
270 | + return v; | |
271 | + } | |
272 | + else if ((IO[SDMACTL] & 0x88) == 0x80) { // DMA start | |
273 | + IO[SND2VOL] = Page[IO[SDMASH] + b][*(WORD*)(IO + SDMASL) + index++]; | |
274 | + if ((*(WORD*)(IO + SDMASL) + index) == 0) | |
275 | + { | |
276 | + b++; | |
277 | + } | |
278 | + if (*(WORD*)(IO + SDMACNT) <= index) | |
279 | + { | |
280 | + IO[SDMACTL] &= 0x7F; // DMA end | |
281 | + *(WORD*)(IO + SDMACNT) = 0; | |
282 | + index = 0; | |
283 | + b = 0; | |
284 | + } | |
285 | + } | |
286 | + return ((VoiceOn && Sound[4]) ? IO[SND2VOL] : 0x80); | |
287 | +} | |
288 | + | |
289 | +void apuSweep(void) | |
290 | +{ | |
291 | + if ((Swp.step) && Swp.on) // sweep on | |
292 | + { | |
293 | + if (Swp.cnt < 0) | |
294 | + { | |
295 | + Swp.cnt = Swp.time; | |
296 | + Ch[2].freq += Swp.step; | |
297 | + Ch[2].freq &= 0x7ff; | |
298 | + } | |
299 | + Swp.cnt--; | |
300 | + } | |
301 | +} | |
302 | + | |
303 | +WORD apuShiftReg(void) | |
304 | +{ | |
305 | + static int nPos = 0; | |
306 | + // Noise counter | |
307 | + if (++nPos >= BUFSIZEN) | |
308 | + { | |
309 | + nPos = 0; | |
310 | + } | |
311 | + return RandData[nPos]; | |
312 | +} | |
313 | + | |
314 | +void apuWaveSet(void) | |
315 | +{ | |
316 | + static int point[] = {0, 0, 0, 0}; | |
317 | + static int preindex[] = {0, 0, 0, 0}; | |
318 | + int channel, index; | |
319 | + short value, lVol[4], rVol[4]; | |
320 | + short LL, RR, vVol; | |
321 | + static int wait = 0; | |
322 | + short *dataAdr; | |
323 | + | |
324 | + if (WsInputGetNowait()) | |
325 | + { | |
326 | + wait = 1; | |
327 | + } | |
328 | + else if (wait) | |
329 | + { | |
330 | + wait = 0; | |
331 | + apuWaveClear(); | |
332 | + } | |
333 | + apuSweep(); | |
334 | + for (channel = 0; channel < 4; channel++) | |
335 | + { | |
336 | + lVol[channel] = 0; | |
337 | + rVol[channel] = 0; | |
338 | + if (Ch[channel].on) | |
339 | + { | |
340 | + if (channel == 1 && VoiceOn && Sound[4]) | |
341 | + { | |
342 | + continue; | |
343 | + } | |
344 | + else if (channel == 2 && Swp.on && !Sound[5]) | |
345 | + { | |
346 | + continue; | |
347 | + } | |
348 | + else if (channel == 3 && Noise.on && Sound[6]) | |
349 | + { | |
350 | + index = (3072000 / BPSWAV) * point[3] / (2048 - Ch[3].freq); | |
351 | + if ((index %= BUFSIZEN) == 0 && preindex[3]) | |
352 | + { | |
353 | + point[3] = 0; | |
354 | + } | |
355 | + value = (short)PDataN[Noise.pattern][index] - 8; | |
356 | + } | |
357 | + else if (Sound[channel] == 0) | |
358 | + { | |
359 | + continue; | |
360 | + } | |
361 | + else { | |
362 | + index = (3072000 / BPSWAV) * point[channel] / (2048 - Ch[channel].freq); | |
363 | + if ((index %= 32) == 0 && preindex[channel]) | |
364 | + { | |
365 | + point[channel] = 0; | |
366 | + } | |
367 | + value = (short)PData[channel][index] - 8; | |
368 | + } | |
369 | + preindex[channel] = index; | |
370 | + point[channel]++; | |
371 | + lVol[channel] = value * Ch[channel].volL; // -8*15=-120, 7*15=105 | |
372 | + rVol[channel] = value * Ch[channel].volR; | |
373 | + } | |
374 | + } | |
375 | + vVol = ((short)apuVoice() - 0x80); | |
376 | + // mix 16bits wave -32768 ~ +32767 32768/120 = 273 | |
377 | + LL = (lVol[0] + lVol[1] + lVol[2] + lVol[3] + vVol) * WsWaveVol; | |
378 | + RR = (rVol[0] + rVol[1] + rVol[2] + rVol[3] + vVol) * WsWaveVol; | |
379 | + dataAdr = (short*)(whdr[wBuf]->lpData); | |
380 | + dataAdr[wPos * 2] = LL; | |
381 | + dataAdr[wPos * 2 + 1] = RR; | |
382 | + if (++wPos >= BUFSIZEW) | |
383 | + { | |
384 | + waveOutWrite(hWaveOut, whdr[wBuf], sizeof(WAVEHDR)); | |
385 | + wPos = 0; | |
386 | + if (++wBuf >= BUFCOUNT) | |
387 | + { | |
388 | + wBuf = 0; | |
389 | + } | |
390 | + if (wait == 0) | |
391 | + { | |
392 | + while (wBuf == rBuf) // 書き込みが再生に追いついた | |
393 | + { | |
394 | + Sleep(1); // WaveOutのコールバック関数でrBufが更新されるまで待つ | |
395 | + } | |
396 | + } | |
397 | + } | |
398 | +} | |
399 | + | |
400 | +/* | |
401 | +PlaySound()は音量調節が出来ないのでいったんメモリに読み込んで | |
402 | +プレイ時にデータを加工する | |
403 | +*/ | |
404 | +static void* SSMasterBuf; | |
405 | +static void* SSPlayBuf; | |
406 | +static DWORD SSDataLen, SSHeadLen; | |
407 | + | |
408 | +void apuLoadSound(void) | |
409 | +{ | |
410 | + HINSTANCE hInst; | |
411 | + HRSRC hRsrc; | |
412 | + HGLOBAL hG; | |
413 | + BYTE* wave; | |
414 | + BYTE* tmp; | |
415 | + DWORD wfesize; | |
416 | + | |
417 | + hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); | |
418 | + hRsrc = FindResource(hInst, MAKEINTRESOURCE(IDR_WAVE1), TEXT("WAVE")); | |
419 | + hG = LoadResource(hInst, hRsrc); | |
420 | + wave = (BYTE*)LockResource(hG); //RIFFヘッダの確認 | |
421 | + tmp = wave; | |
422 | + if (*(LPDWORD)wave != *(LPDWORD)"RIFF") | |
423 | + { | |
424 | + ErrorMsg(ERR_WAVERESOURCE); | |
425 | + return; | |
426 | + } | |
427 | + wave += 4; //ポインタは次を指しておく | |
428 | + wave += 4; //ポインタは次を指しておく | |
429 | + //WAVEヘッダの確認 | |
430 | + if (*(LPDWORD)wave != *(LPDWORD)"WAVE") | |
431 | + { | |
432 | + ErrorMsg(ERR_WAVERESOURCE); | |
433 | + return; | |
434 | + } | |
435 | + wave += 4; //ポインタは次を指しておく | |
436 | + //fmtチャンクの確認 | |
437 | + if (*(LPDWORD)wave != *(LPDWORD)"fmt ") | |
438 | + { | |
439 | + ErrorMsg(ERR_WAVERESOURCE); | |
440 | + return; | |
441 | + } | |
442 | + wave += 4; //ポインタは次を指しておく | |
443 | + //fmtチャンクサイズの取得 | |
444 | + wfesize = *(DWORD *)wave; | |
445 | + wave += 4; //ポインタは次を指しておく | |
446 | + wave += wfesize; //WAVEFORMATEX構造体分だけポインタを進めておく | |
447 | + //dataチャンクの確認 | |
448 | + if (*(LPDWORD)wave != *(LPDWORD)"data") | |
449 | + { | |
450 | + ErrorMsg(ERR_WAVERESOURCE); | |
451 | + return; | |
452 | + } | |
453 | + wave += 4; //ポインタは次を指しておく | |
454 | + //波形データのバイト数の取得 | |
455 | + SSDataLen = *(DWORD *)wave; | |
456 | + wave += 4; //ポインタは次を指しておく | |
457 | + SSHeadLen = wave - tmp; | |
458 | + SSMasterBuf = malloc(SSDataLen); | |
459 | + SSPlayBuf = malloc(SSHeadLen + SSDataLen); | |
460 | + if (SSMasterBuf != NULL && SSPlayBuf != NULL) | |
461 | + { | |
462 | + memcpy(SSMasterBuf, wave, SSDataLen); | |
463 | + memcpy(SSPlayBuf, tmp, SSHeadLen); | |
464 | + } | |
465 | + FreeResource(hG); | |
466 | +} | |
467 | + | |
468 | +void apuDestroySound(void) | |
469 | +{ | |
470 | + free(SSMasterBuf); | |
471 | + SSMasterBuf = NULL; | |
472 | + free(SSPlayBuf); | |
473 | + SSPlayBuf = NULL; | |
474 | +} | |
475 | + | |
476 | +void apuStartupSound(void) | |
477 | +{ | |
478 | + short *src, *dst; | |
479 | + int i; | |
480 | + int size = SSDataLen / sizeof(short); | |
481 | + | |
482 | + if (SSMasterBuf == NULL || SSPlayBuf == NULL) | |
483 | + { | |
484 | + return; | |
485 | + } | |
486 | + src = (short*)SSMasterBuf; | |
487 | + dst = (short*)((BYTE*)SSPlayBuf + SSHeadLen); | |
488 | + // マスターの音量を変更してプレイバッファーにコピー | |
489 | + for (i = 0; i < size; i++) | |
490 | + { | |
491 | + *dst++ = (*src++) * WsWaveVol / 32; | |
492 | + } | |
493 | + PlaySound((LPCTSTR)SSPlayBuf, NULL, SND_MEMORY | SND_ASYNC); | |
494 | +} |
@@ -0,0 +1,17 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include <windows.h> | |
7 | +#include <tchar.h> | |
8 | +#include "WSError.h" | |
9 | + | |
10 | +void ErrorMsg(long err) | |
11 | +{ | |
12 | + TCHAR dst[512]; | |
13 | + | |
14 | + _stprintf_s(dst, 512, TEXT("%lX"), err); | |
15 | + MessageBox(NULL, dst, TEXT("WS エラー"), MB_OK); | |
16 | +} | |
17 | + |
@@ -0,0 +1,370 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include "WSDraw.h" | |
7 | +#include "WS.h" | |
8 | +#include "WSInput.h" | |
9 | +#include "WSRender.h" | |
10 | + | |
11 | +extern HWND hWnd; | |
12 | +int Kerorikan = 0; | |
13 | +static enum DRAWSIZE DrawSize = DS_1; // 描画サイズ フルスクリーン、x1 x2 x3 | |
14 | +static int DrawMode = 0; // 縦横フラグ 0:横 | |
15 | +static LPDIRECT3D9 pD3D; // IDirect3D9インターフェイスへのポインタ | |
16 | +static LPDIRECT3DDEVICE9 pD3DDevice; // IDirect3DDevice9インターフェイスへのポインタ | |
17 | +static D3DPRESENT_PARAMETERS D3DPP; // デバイスのプレゼンテーションパラメータ | |
18 | +static LPDIRECT3DVERTEXBUFFER9 pMyVB; // Vertex Buffer | |
19 | +static LPDIRECT3DTEXTURE9 pTexture; // Texture | |
20 | +static LPDIRECT3DSURFACE9 pSurface; // Surface | |
21 | +static LPDIRECT3DTEXTURE9 pSegTexture; | |
22 | +static LPDIRECT3DSURFACE9 pSegSurface; | |
23 | + | |
24 | +// 頂点1つのデータ型 | |
25 | +typedef struct { | |
26 | + D3DVECTOR p; // 位置 | |
27 | + DWORD color; // 色 | |
28 | + D3DXVECTOR2 t; // テクスチャーの画像の位置 | |
29 | +} MY_VERTEX; | |
30 | +// MY_VERTEXのフォーマット設定 | |
31 | +#define MY_VERTEX_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) | |
32 | +#define SAFE_RELEASE(p) { if(p) { IDirect3D9_Release(p); (p)=NULL; } } | |
33 | + | |
34 | +//------------------------------------------------------------- | |
35 | +// レンダラーの初期化 | |
36 | +// 引数 | |
37 | +// isFullScreen : フルスクリーンの場合TRUE | |
38 | +// 戻り値 | |
39 | +// 成功したらS_OK | |
40 | +//------------------------------------------------------------- | |
41 | +HRESULT drawInitialize(BOOL isFullScreen) | |
42 | +{ | |
43 | + D3DDISPLAYMODE d3ddm; | |
44 | + | |
45 | + // Direct3D9オブジェクトの作成 | |
46 | + if((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) | |
47 | + { | |
48 | + return E_FAIL; // 取得失敗 | |
49 | + } | |
50 | + // 現在のディスプレイモードを取得 | |
51 | + if(FAILED(IDirect3D9_GetAdapterDisplayMode(pD3D, D3DADAPTER_DEFAULT, &d3ddm))) | |
52 | + { | |
53 | + return E_FAIL; | |
54 | + } | |
55 | + // デバイスのプレゼンテーションパラメータを初期化 | |
56 | + ZeroMemory(&D3DPP, sizeof(D3DPRESENT_PARAMETERS)); | |
57 | + if(isFullScreen) { // フルスクリーンの場合 | |
58 | + D3DPP.Windowed = FALSE; // フルスクリーン表示の指定 | |
59 | + D3DPP.BackBufferWidth = 800; // フルスクリーン時の横幅 | |
60 | + D3DPP.BackBufferHeight = 600; // フルスクリーン時の縦幅 | |
61 | + } | |
62 | + else { | |
63 | + D3DPP.Windowed = TRUE; // ウインドウ内表示の指定 | |
64 | + D3DPP.BackBufferWidth = 2016; // 224と144の最小公倍数 | |
65 | + D3DPP.BackBufferHeight = 2016; | |
66 | + } | |
67 | + D3DPP.BackBufferCount = 1; | |
68 | + D3DPP.BackBufferFormat = d3ddm.Format; // カラーモードの指定 | |
69 | + D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; // | |
70 | + D3DPP.EnableAutoDepthStencil = TRUE; // エラー対策 | |
71 | + D3DPP.AutoDepthStencilFormat = D3DFMT_D16; // エラー対策 | |
72 | + D3DPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // 垂直同期しない | |
73 | + // ディスプレイアダプタを表すためのデバイスを作成 | |
74 | + // 描画と頂点処理をハードウェアで行なう | |
75 | + if(FAILED(IDirect3D9_CreateDevice(pD3D, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &D3DPP, &pD3DDevice))) | |
76 | + { | |
77 | + // 上記の設定が失敗したら | |
78 | + // 描画をハードウェアで行い、頂点処理はCPUで行なう | |
79 | + if(FAILED(IDirect3D9_CreateDevice(pD3D, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPP, &pD3DDevice))) | |
80 | + { | |
81 | + // 初期化失敗 | |
82 | + MessageBox(hWnd, TEXT(" グラフィックチップが未対応です "), TEXT("Direct3D Error"), MB_OK); | |
83 | + return E_FAIL; | |
84 | + } | |
85 | + } | |
86 | + return S_OK; | |
87 | +} | |
88 | + | |
89 | +//------------------------------------------------------------- | |
90 | +// 終了処理 | |
91 | +//------------------------------------------------------------- | |
92 | +void drawFinalize(void) | |
93 | +{ | |
94 | + // デバイスオブジェクトの解放 | |
95 | + SAFE_RELEASE(pD3DDevice); | |
96 | + // DirectXGraphicsの解放 | |
97 | + SAFE_RELEASE(pD3D); | |
98 | +} | |
99 | + | |
100 | +//------------------------------------------------------------- | |
101 | +// シーンを生成 | |
102 | +// 戻り値 | |
103 | +// 成功したらS_OK | |
104 | +//------------------------------------------------------------- | |
105 | +HRESULT drawCreate(void) | |
106 | +{ | |
107 | + if(pD3DDevice == 0) | |
108 | + { | |
109 | + return E_FAIL; | |
110 | + } | |
111 | + drawDestroy(); | |
112 | + //-------------------------------------- | |
113 | + // オブジェクトの頂点バッファを生成 | |
114 | + //-------------------------------------- | |
115 | + // 8つの頂点からなる頂点バッファを作る(メイン4個 セグメント4個) | |
116 | + if(FAILED(IDirect3DDevice9_CreateVertexBuffer(pD3DDevice, 8 * sizeof(MY_VERTEX), D3DUSAGE_WRITEONLY, MY_VERTEX_FVF, D3DPOOL_MANAGED, &pMyVB, NULL))) | |
117 | + { | |
118 | + return E_FAIL; | |
119 | + } | |
120 | + IDirect3DDevice9_CreateTexture(pD3DDevice, 256, 256, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, &pTexture, NULL); | |
121 | + IDirect3DTexture9_GetSurfaceLevel(pTexture, 0, &pSurface); | |
122 | + IDirect3DDevice9_CreateTexture(pD3DDevice, 32, 1024, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, &pSegTexture, NULL); | |
123 | + IDirect3DTexture9_GetSurfaceLevel(pSegTexture, 0, &pSegSurface); | |
124 | + //-------------------------------------- | |
125 | + // テクスチャステージの設定 | |
126 | + //-------------------------------------- | |
127 | + IDirect3DDevice9_SetTextureStageState(pD3DDevice, 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); | |
128 | + IDirect3DDevice9_SetTextureStageState(pD3DDevice, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); | |
129 | + //-------------------------------------- | |
130 | + // レンダリングステートパラメータの設定 | |
131 | + //-------------------------------------- | |
132 | + // 両面描画モードの指定 | |
133 | + IDirect3DDevice9_SetRenderState(pD3DDevice, D3DRS_CULLMODE, D3DCULL_NONE); | |
134 | + // ディザリングを行なう(高品質描画) | |
135 | + IDirect3DDevice9_SetRenderState(pD3DDevice, D3DRS_DITHERENABLE, TRUE); | |
136 | + // ノーライティングモード | |
137 | + IDirect3DDevice9_SetRenderState(pD3DDevice, D3DRS_LIGHTING, FALSE); | |
138 | + return S_OK; | |
139 | +} | |
140 | + | |
141 | +//------------------------------------------------------------- | |
142 | +// シーンの破棄 | |
143 | +//------------------------------------------------------------- | |
144 | +void drawDestroy(void) | |
145 | +{ | |
146 | + SAFE_RELEASE(pSurface); | |
147 | + SAFE_RELEASE(pTexture); | |
148 | + SAFE_RELEASE(pSegSurface); | |
149 | + SAFE_RELEASE(pSegTexture); | |
150 | + SAFE_RELEASE(pMyVB); | |
151 | +} | |
152 | + | |
153 | +//------------------------------------------------------------- | |
154 | +// 描画処理 | |
155 | +//------------------------------------------------------------- | |
156 | +#define MAIN_X (224.0f/256.0f) | |
157 | +#define MAIN_Y (144.0f/256.0f) | |
158 | +#define MAIN_W (2 * 224.0f/234.0f - 1.0f) | |
159 | +#define SEG_X (4 * 8.0f/32.0f) | |
160 | +#define SEG_Y (4 * 144.0f/1024.0f) | |
161 | +#define SEG_W (1.0f - 2 * 8.0f/234.0f) | |
162 | +#define KERO 0.0075f | |
163 | +void drawDraw() | |
164 | +{ | |
165 | + D3DLOCKED_RECT lockRect; | |
166 | + int x, y, pitch; | |
167 | + WORD *p; | |
168 | + MY_VERTEX* v; | |
169 | + D3DXMATRIX mat; | |
170 | + D3DXMatrixIdentity(&mat); | |
171 | + | |
172 | + if(pD3DDevice == 0) | |
173 | + { | |
174 | + return; | |
175 | + } | |
176 | + if(pMyVB == 0) | |
177 | + { | |
178 | + return; | |
179 | + } | |
180 | + // 画像データをテクスチャに転送 | |
181 | + IDirect3DSurface9_LockRect(pSurface, &lockRect, NULL, D3DLOCK_DISCARD); | |
182 | + p = FrameBuffer[0] + 8; | |
183 | + pitch = lockRect.Pitch / 2; | |
184 | + for (y = 0; y < 144; y++) | |
185 | + { | |
186 | + for (x = 0; x < 224; x++) | |
187 | + { | |
188 | + *((WORD*)lockRect.pBits + pitch * y + x) = *p++; | |
189 | + } | |
190 | + p += 32; | |
191 | + } | |
192 | + IDirect3DSurface9_UnlockRect(pSurface); | |
193 | + // 液晶セグメントデータをテクスチャに転送 | |
194 | + RenderSegment(); | |
195 | + IDirect3DSurface9_LockRect(pSegSurface, &lockRect, NULL, D3DLOCK_DISCARD); | |
196 | + p = SegmentBuffer; | |
197 | + pitch = lockRect.Pitch / 2; | |
198 | + for (y = 0; y < 144 * 4; y++) | |
199 | + { | |
200 | + for (x = 0; x < 32; x++) | |
201 | + { | |
202 | + *((WORD*)lockRect.pBits + pitch * y + x) = *p++; | |
203 | + } | |
204 | + } | |
205 | + IDirect3DSurface9_UnlockRect(pSegSurface); | |
206 | + //頂点バッファの中身を埋める | |
207 | + IDirect3DVertexBuffer9_Lock( pMyVB, 0, 0, (void**)&v, 0 ); | |
208 | + if (Kerorikan) | |
209 | + { | |
210 | + // 頂点座標の設定 | |
211 | + D3DVECTOR p[8] = { | |
212 | + -112*KERO, 72*KERO, 0.0f, | |
213 | + 112*KERO, 72*KERO, 0.0f, | |
214 | + -112*KERO, -72*KERO, 0.0f, | |
215 | + 112*KERO, -72*KERO, 0.0f, | |
216 | + 114*KERO, 72*KERO, 0.0f, | |
217 | + 122*KERO, 72*KERO, 0.0f, | |
218 | + 114*KERO, -72*KERO, 0.0f, | |
219 | + 122*KERO, -72*KERO, 0.0f | |
220 | + }; | |
221 | + v[0].p = p[0]; | |
222 | + v[1].p = p[1]; | |
223 | + v[2].p = p[2]; | |
224 | + v[3].p = p[3]; | |
225 | + v[4].p = p[4]; | |
226 | + v[5].p = p[5]; | |
227 | + v[6].p = p[6]; | |
228 | + v[7].p = p[7]; | |
229 | + } | |
230 | + else | |
231 | + { | |
232 | + // 頂点座標の設定 | |
233 | + D3DVECTOR p[8] = { | |
234 | + -1.0f, 1.0f, 0.0f, | |
235 | + MAIN_W, 1.0f, 0.0f, | |
236 | + -1.0f, -1.0f, 0.0f, | |
237 | + MAIN_W,-1.0f, 0.0f, | |
238 | + SEG_W, 1.0f, 0.0f, | |
239 | + 1.0f, 1.0f, 0.0f, | |
240 | + SEG_W, -1.0f, 0.0f, | |
241 | + 1.0f, -1.0f, 0.0f | |
242 | + }; | |
243 | + v[0].p = p[0]; | |
244 | + v[1].p = p[1]; | |
245 | + v[2].p = p[2]; | |
246 | + v[3].p = p[3]; | |
247 | + v[4].p = p[4]; | |
248 | + v[5].p = p[5]; | |
249 | + v[6].p = p[6]; | |
250 | + v[7].p = p[7]; | |
251 | + } | |
252 | + { | |
253 | + // テクスチャ座標の設定 | |
254 | + D3DXVECTOR2 t[8] = { | |
255 | + 0.0f, 0.0f, | |
256 | + MAIN_X, 0.0f, | |
257 | + 0.0f, MAIN_Y, | |
258 | + MAIN_X, MAIN_Y, | |
259 | + 0.0f, 0.0f, | |
260 | + SEG_X, 0.0f, | |
261 | + 0.0f, SEG_Y, | |
262 | + SEG_X, SEG_Y | |
263 | + }; | |
264 | + v[0].t = t[0]; | |
265 | + v[1].t = t[1]; | |
266 | + v[2].t = t[2]; | |
267 | + v[3].t = t[3]; | |
268 | + v[4].t = t[4]; | |
269 | + v[5].t = t[5]; | |
270 | + v[6].t = t[6]; | |
271 | + v[7].t = t[7]; | |
272 | + } | |
273 | + { | |
274 | + // 頂点カラーの設定 | |
275 | + v[0].color = v[1].color = v[2].color = v[3].color = 0xFFFFFFFFU; | |
276 | + v[4].color = v[5].color = v[6].color = v[7].color = 0xFFFFFFFFU; | |
277 | + } | |
278 | + IDirect3DVertexBuffer9_Unlock(pMyVB); | |
279 | + // 回転処理 | |
280 | + // 斜め(左atan(0.5)回転) | |
281 | + if (Kerorikan) | |
282 | + { | |
283 | + D3DXMatrixRotationZ(&mat, 0.4636476f); // atanf(0.5f)だと最適化されないかもしれないので | |
284 | + } | |
285 | + // 縦(左90度回転) | |
286 | + else if (DrawMode & 0x01) | |
287 | + { | |
288 | + D3DXMatrixRotationZ(&mat, D3DXToRadian(90)); | |
289 | + } | |
290 | + // 描画開始宣言 | |
291 | + if(SUCCEEDED(IDirect3DDevice9_BeginScene(pD3DDevice))) | |
292 | + { | |
293 | + IDirect3DDevice9_Clear(pD3DDevice, 0, NULL, D3DCLEAR_TARGET, 0xFF666666, 0.0f, 0); | |
294 | + IDirect3DDevice9_SetStreamSource(pD3DDevice, 0, pMyVB, 0, sizeof(MY_VERTEX)); | |
295 | + IDirect3DDevice9_SetFVF(pD3DDevice, MY_VERTEX_FVF); | |
296 | + IDirect3DDevice9_SetTexture(pD3DDevice, 0, (IDirect3DBaseTexture9 *)pTexture); | |
297 | + IDirect3DDevice9_DrawPrimitive(pD3DDevice, D3DPT_TRIANGLESTRIP, 0, 2); // 0番の頂点から三角形を2個 | |
298 | + IDirect3DDevice9_SetTexture(pD3DDevice, 0, (IDirect3DBaseTexture9 *)pSegTexture); | |
299 | + IDirect3DDevice9_DrawPrimitive(pD3DDevice, D3DPT_TRIANGLESTRIP, 4, 2); // 4番の頂点から三角形を2個 | |
300 | + IDirect3DDevice9_SetTransform(pD3DDevice, D3DTS_VIEW, &mat); | |
301 | + // 描画終了宣言 | |
302 | + IDirect3DDevice9_EndScene(pD3DDevice); | |
303 | + } | |
304 | + // 描画結果の転送 | |
305 | + if(FAILED(IDirect3DDevice9_Present(pD3DDevice, NULL, NULL, NULL, NULL))) | |
306 | + { | |
307 | + // デバイス消失から復帰 | |
308 | + IDirect3DDevice9_Reset(pD3DDevice, &D3DPP); | |
309 | + } | |
310 | +} | |
311 | + | |
312 | +//------------------------------------------------------------- | |
313 | +void WsResize(void) | |
314 | +{ | |
315 | + RECT wind; | |
316 | + RECT wind2; | |
317 | + int lcdHeight = 144; | |
318 | + int lcdWidth = 224 + 10; // +10はセグメント分 | |
319 | + int client_width; | |
320 | + int client_height; | |
321 | + | |
322 | + if (Kerorikan) | |
323 | + { | |
324 | + client_width = 256 * DrawSize; | |
325 | + client_height = 256 * DrawSize; | |
326 | + } | |
327 | + else if (DrawMode & 0x01) | |
328 | + { | |
329 | + client_width = lcdHeight * DrawSize; | |
330 | + client_height = lcdWidth * DrawSize; | |
331 | + } | |
332 | + else | |
333 | + { | |
334 | + client_width = lcdWidth * DrawSize; | |
335 | + client_height = lcdHeight * DrawSize; | |
336 | + } | |
337 | + wind.top = 0; | |
338 | + wind.left = 0; | |
339 | + wind.right = client_width; | |
340 | + wind.bottom = client_height; | |
341 | + AdjustWindowRectEx(&wind, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, | |
342 | + TRUE, WS_EX_APPWINDOW | WS_EX_ACCEPTFILES); | |
343 | + wind2 = wind; | |
344 | + SendMessage(hWnd, WM_NCCALCSIZE, FALSE, (LPARAM) &wind2); | |
345 | + SetWindowPos(hWnd, NULL, 0, 0, | |
346 | + (wind.right - wind.left) + client_width - (wind2.right - wind2.left), | |
347 | + (wind.bottom - wind.top ) + client_height - (wind2.bottom - wind2.top ), | |
348 | + SWP_NOMOVE | SWP_NOZORDER | SWP_SHOWWINDOW); | |
349 | +} | |
350 | + | |
351 | +//------------------------------------------------------------- | |
352 | +int SetDrawMode(int Mode) | |
353 | +{ | |
354 | + if(DrawMode != Mode) | |
355 | + { | |
356 | + DrawMode = Mode; | |
357 | + WsInputSetKeyMap(Mode); | |
358 | + WsResize(); | |
359 | + } | |
360 | + return 0; | |
361 | +} | |
362 | + | |
363 | +//------------------------------------------------------------- | |
364 | +int SetDrawSize(enum DRAWSIZE Size) | |
365 | +{ | |
366 | + DrawSize = Size; | |
367 | + WsResize(); | |
368 | + return 0; | |
369 | +} | |
370 | + |
@@ -0,0 +1,305 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include "WSInput.h" | |
7 | + | |
8 | +int WsKeyboardH[13]; | |
9 | +int WsKeyboardV[13]; | |
10 | +int WsJoypadH[13]; | |
11 | +int WsJoypadV[13]; | |
12 | +LPDIRECTINPUTDEVICE8 lpKeyDevice; | |
13 | +LPDIRECTINPUTDEVICE8 lpJoyDevice; | |
14 | +static int* WsJoypad; | |
15 | +static int* WsKeyboard; | |
16 | +static LPDIRECTINPUT8 lpDInput; | |
17 | +static DIJOYSTATE2 js; | |
18 | + | |
19 | +BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* lpddi, LPVOID lpContext) | |
20 | +{ | |
21 | + HRESULT hRet; | |
22 | + | |
23 | + hRet = IDirectInput8_CreateDevice(lpDInput, &(lpddi->guidInstance), &lpJoyDevice, NULL); | |
24 | + if(FAILED(hRet)) return DIENUM_CONTINUE; | |
25 | + | |
26 | + return DIENUM_STOP; | |
27 | +} | |
28 | + | |
29 | +int WsInputJoyInit(HWND hw) | |
30 | +{ | |
31 | + HRESULT hRet; | |
32 | + if (lpJoyDevice != NULL) | |
33 | + return TRUE; | |
34 | + | |
35 | + hRet = IDirectInput8_EnumDevices(lpDInput, DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY); | |
36 | + if (hRet != DI_OK){ | |
37 | + if (lpJoyDevice != NULL) | |
38 | + { | |
39 | + IDirectInputDevice8_Release(lpJoyDevice); | |
40 | + lpJoyDevice = NULL; | |
41 | + } | |
42 | + return FALSE; | |
43 | + } | |
44 | + if (lpJoyDevice == NULL) | |
45 | + { | |
46 | + return FALSE; | |
47 | + } | |
48 | + hRet = IDirectInputDevice8_SetDataFormat(lpJoyDevice, &c_dfDIJoystick2); | |
49 | + if (hRet != DI_OK){ | |
50 | + if (lpJoyDevice != NULL) | |
51 | + { | |
52 | + IDirectInputDevice8_Release(lpJoyDevice); | |
53 | + lpJoyDevice = NULL; | |
54 | + } | |
55 | + return FALSE; | |
56 | + } | |
57 | + hRet = IDirectInputDevice8_SetCooperativeLevel(lpJoyDevice, hw, DISCL_EXCLUSIVE | DISCL_FOREGROUND); | |
58 | + if (hRet != DI_OK){ | |
59 | + if (lpJoyDevice != NULL) | |
60 | + { | |
61 | + IDirectInputDevice8_Release(lpJoyDevice); | |
62 | + lpJoyDevice = NULL; | |
63 | + } | |
64 | + return FALSE; | |
65 | + } | |
66 | + IDirectInputDevice8_Acquire(lpJoyDevice); | |
67 | + | |
68 | + return TRUE; | |
69 | +} | |
70 | + | |
71 | +int WsInputInit(HWND hw) | |
72 | +{ | |
73 | + DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, &IID_IDirectInput8, (LPVOID*)&lpDInput, NULL); | |
74 | + IDirectInput8_CreateDevice(lpDInput, &GUID_SysKeyboard, &lpKeyDevice, NULL); | |
75 | + IDirectInputDevice8_SetDataFormat(lpKeyDevice, &c_dfDIKeyboard); | |
76 | + IDirectInputDevice8_SetCooperativeLevel(lpKeyDevice, hw, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); | |
77 | + return WsInputJoyInit(hw); | |
78 | +} | |
79 | + | |
80 | +void WsInputJoyRelease(void) | |
81 | +{ | |
82 | + if (lpJoyDevice != NULL) | |
83 | + { | |
84 | + IDirectInputDevice8_Unacquire(lpJoyDevice); | |
85 | + IDirectInputDevice8_Release(lpJoyDevice); | |
86 | + lpJoyDevice = NULL; | |
87 | + } | |
88 | +} | |
89 | + | |
90 | +void WsInputRelease(void) | |
91 | +{ | |
92 | + if (lpKeyDevice != NULL) | |
93 | + { | |
94 | + IDirectInputDevice8_Unacquire(lpKeyDevice); | |
95 | + IDirectInputDevice8_Release(lpKeyDevice); | |
96 | + lpKeyDevice = NULL; | |
97 | + } | |
98 | + if (lpDInput != NULL) | |
99 | + { | |
100 | + IDirectInput8_Release(lpDInput); | |
101 | + lpDInput = NULL; | |
102 | + } | |
103 | + WsInputJoyRelease(); | |
104 | +} | |
105 | + | |
106 | +#define HALFRECT JOY_POVRIGHT / 2 | |
107 | +int WsInputCheckJoy(int value) | |
108 | +{ | |
109 | + int i; | |
110 | + | |
111 | + if ((value >= 1) && (value <= 128)) | |
112 | + { | |
113 | + return((js.rgbButtons[value - 1] & 0x80) ? 1 : 0); | |
114 | + } | |
115 | + if ((value & 0x1100) == 0x100) | |
116 | + { | |
117 | + i = (value & 0x30) >> 4; | |
118 | + switch (value & 0x0F) | |
119 | + { | |
120 | + case 1: | |
121 | + if (js.rgdwPOV[i] == JOY_POVLEFT + HALFRECT) return 1; | |
122 | + if (js.rgdwPOV[i] == JOY_POVFORWARD) return 1; | |
123 | + if (js.rgdwPOV[i] == JOY_POVFORWARD + HALFRECT) return 1; | |
124 | + break; | |
125 | + case 2: | |
126 | + if (js.rgdwPOV[i] == JOY_POVFORWARD + HALFRECT) return 1; | |
127 | + if (js.rgdwPOV[i] == JOY_POVRIGHT) return 1; | |
128 | + if (js.rgdwPOV[i] == JOY_POVRIGHT + HALFRECT) return 1; | |
129 | + break; | |
130 | + case 4: | |
131 | + if (js.rgdwPOV[i] == JOY_POVRIGHT + HALFRECT) return 1; | |
132 | + if (js.rgdwPOV[i] == JOY_POVBACKWARD) return 1; | |
133 | + if (js.rgdwPOV[i] == JOY_POVBACKWARD + HALFRECT) return 1; | |
134 | + break; | |
135 | + case 8: | |
136 | + if (js.rgdwPOV[i] == JOY_POVBACKWARD + HALFRECT) return 1; | |
137 | + if (js.rgdwPOV[i] == JOY_POVLEFT) return 1; | |
138 | + if (js.rgdwPOV[i] == JOY_POVLEFT + HALFRECT) return 1; | |
139 | + break; | |
140 | + } | |
141 | + return 0; | |
142 | + } | |
143 | + switch (value) | |
144 | + { | |
145 | + case WS_JOY_AXIS_X_P: | |
146 | + if (js.lX > 0xC000) return 1; | |
147 | + break; | |
148 | + case WS_JOY_AXIS_X_M: | |
149 | + if (js.lX < 0x4000) return 1; | |
150 | + break; | |
151 | + case WS_JOY_AXIS_Y_P: | |
152 | + if (js.lY > 0xC000) return 1; | |
153 | + break; | |
154 | + case WS_JOY_AXIS_Y_M: | |
155 | + if (js.lY < 0x4000) return 1; | |
156 | + break; | |
157 | + case WS_JOY_AXIS_Z_P: | |
158 | + if (js.lZ > 0xC000) return 1; | |
159 | + break; | |
160 | + case WS_JOY_AXIS_Z_M: | |
161 | + if (js.lZ < 0x4000) return 1; | |
162 | + break; | |
163 | + case WS_JOY_AXIS_RX_P: | |
164 | + if (js.lRx > 0xC000) return 1; | |
165 | + break; | |
166 | + case WS_JOY_AXIS_RX_M: | |
167 | + if (js.lRx < 0x4000) return 1; | |
168 | + break; | |
169 | + case WS_JOY_AXIS_RY_P: | |
170 | + if (js.lRy > 0xC000) return 1; | |
171 | + break; | |
172 | + case WS_JOY_AXIS_RY_M: | |
173 | + if (js.lRy < 0x4000) return 1; | |
174 | + break; | |
175 | + case WS_JOY_AXIS_RZ_P: | |
176 | + if (js.lRz > 0xC000) return 1; | |
177 | + break; | |
178 | + case WS_JOY_AXIS_RZ_M: | |
179 | + if (js.lRz < 0x4000) return 1; | |
180 | + break; | |
181 | + case WS_JOY_SLIDER1_P: | |
182 | + if (js.rglSlider[0] > 0xC000) return 1; | |
183 | + break; | |
184 | + case WS_JOY_SLIDER1_M: | |
185 | + if (js.rglSlider[0] < 0x4000) return 1; | |
186 | + break; | |
187 | + case WS_JOY_SLIDER2_P: | |
188 | + if (js.rglSlider[1] > 0xC000) return 1; | |
189 | + break; | |
190 | + case WS_JOY_SLIDER2_M: | |
191 | + if (js.rglSlider[1] < 0x4000) return 1; | |
192 | + break; | |
193 | + } | |
194 | + return 0; | |
195 | +} | |
196 | + | |
197 | +WORD WsInputGetState(void) | |
198 | +{ | |
199 | + int i; | |
200 | + HRESULT hRet; | |
201 | + BYTE diKeys[256]; | |
202 | + WORD JoyState = 0; | |
203 | + WORD KeyState = 0; | |
204 | + | |
205 | + ZeroMemory(&js, sizeof(DIJOYSTATE2)); | |
206 | + ZeroMemory(diKeys, 256); | |
207 | + if (lpKeyDevice != NULL) | |
208 | + { | |
209 | + hRet = IDirectInputDevice8_Acquire(lpKeyDevice); | |
210 | + if (hRet == DI_OK || hRet == S_FALSE) | |
211 | + { | |
212 | + hRet = IDirectInputDevice8_GetDeviceState(lpKeyDevice, 256, diKeys); | |
213 | + if (hRet == DI_OK) | |
214 | + { | |
215 | + for (i = 0; i < 12; i++) | |
216 | + { | |
217 | + KeyState <<= 1; | |
218 | + if (diKeys[WsKeyboard[i]] & 0x80) | |
219 | + { | |
220 | + KeyState |= 1; | |
221 | + } | |
222 | + } | |
223 | + } | |
224 | + } | |
225 | + } | |
226 | + if (lpJoyDevice != NULL) | |
227 | + { | |
228 | + hRet = IDirectInputDevice8_Poll(lpJoyDevice); | |
229 | + if (FAILED(hRet)) | |
230 | + { | |
231 | + hRet = IDirectInputDevice8_Acquire(lpJoyDevice); | |
232 | + while (hRet == DIERR_INPUTLOST) | |
233 | + { | |
234 | + hRet = IDirectInputDevice8_Acquire(lpJoyDevice); | |
235 | + } | |
236 | + return KeyState; | |
237 | + } | |
238 | + hRet = IDirectInputDevice8_GetDeviceState(lpJoyDevice, sizeof(DIJOYSTATE2), &js); | |
239 | + if (hRet == DI_OK){ | |
240 | + for (i = 0; i < 12; i++) | |
241 | + { | |
242 | + JoyState <<= 1; | |
243 | + JoyState |= WsInputCheckJoy(WsJoypad[i]); | |
244 | + } | |
245 | + } | |
246 | + } | |
247 | + return JoyState | KeyState; | |
248 | +} | |
249 | + | |
250 | +void WsInputSetKeyMap(int mode) | |
251 | +{ | |
252 | + if (mode & 1) | |
253 | + { | |
254 | + WsJoypad = WsJoypadV; | |
255 | + WsKeyboard = WsKeyboardV; | |
256 | + } | |
257 | + else | |
258 | + { | |
259 | + WsJoypad = WsJoypadH; | |
260 | + WsKeyboard = WsKeyboardH; | |
261 | + } | |
262 | +} | |
263 | + | |
264 | +int WsInputGetNowait(void) | |
265 | +{ | |
266 | + HRESULT hRet; | |
267 | + BYTE diKeys[256]; | |
268 | + int flag = 0; | |
269 | + | |
270 | + ZeroMemory(&js, sizeof(DIJOYSTATE2)); | |
271 | + ZeroMemory(diKeys, 256); | |
272 | + if (lpKeyDevice != NULL) | |
273 | + { | |
274 | + hRet = IDirectInputDevice8_Acquire(lpKeyDevice); | |
275 | + if (hRet == DI_OK || hRet == S_FALSE) | |
276 | + { | |
277 | + hRet = IDirectInputDevice8_GetDeviceState(lpKeyDevice, 256, diKeys); | |
278 | + if (hRet == DI_OK) | |
279 | + { | |
280 | + if (diKeys[WsKeyboard[12]] & 0x80) | |
281 | + { | |
282 | + flag = 1; | |
283 | + } | |
284 | + } | |
285 | + } | |
286 | + } | |
287 | + if (lpJoyDevice != NULL) | |
288 | + { | |
289 | + hRet = IDirectInputDevice8_Poll(lpJoyDevice); | |
290 | + if (FAILED(hRet)) | |
291 | + { | |
292 | + hRet = IDirectInputDevice8_Acquire(lpJoyDevice); | |
293 | + while (hRet == DIERR_INPUTLOST) | |
294 | + { | |
295 | + hRet = IDirectInputDevice8_Acquire(lpJoyDevice); | |
296 | + } | |
297 | + return flag; | |
298 | + } | |
299 | + hRet = IDirectInputDevice8_GetDeviceState(lpJoyDevice, sizeof(DIJOYSTATE2), &js); | |
300 | + if (hRet == DI_OK){ | |
301 | + flag |= WsInputCheckJoy(WsJoypad[12]); | |
302 | + } | |
303 | + } | |
304 | + return flag; | |
305 | +} |
@@ -0,0 +1,614 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include "../resource.h" | |
7 | +#include "WSDialog.h" | |
8 | +#include <commctrl.h> | |
9 | +#include <tchar.h> | |
10 | +#include "WSInput.h" | |
11 | +#include "keycode.h" | |
12 | + | |
13 | +static WNDPROC OrgEditProc; | |
14 | +static HWND hTabCtrl, hTab1, hTab2, hTab3, hTab4; | |
15 | +static int TmpKeyboardH[13]; | |
16 | +static int TmpKeyboardV[13]; | |
17 | +static int TmpJoypadH[13]; | |
18 | +static int TmpJoypadV[13]; | |
19 | +static int SelectedTab; | |
20 | + | |
21 | +void WsDlgConfInit(HWND hDlg) | |
22 | +{ | |
23 | + HINSTANCE hInst; | |
24 | + TC_ITEM tc; | |
25 | + RECT rt; | |
26 | + LPPOINT pt = (LPPOINT)&rt; | |
27 | + | |
28 | + memcpy(TmpKeyboardH, WsKeyboardH, sizeof(int) * 13); | |
29 | + memcpy(TmpKeyboardV, WsKeyboardV, sizeof(int) * 13); | |
30 | + memcpy(TmpJoypadH, WsJoypadH, sizeof(int) * 13); | |
31 | + memcpy(TmpJoypadV, WsJoypadV, sizeof(int) * 13); | |
32 | + hInst = (HINSTANCE)GetWindowLong(hDlg, GWLP_HINSTANCE); | |
33 | + hTabCtrl = GetDlgItem(hDlg, IDC_TAB1); | |
34 | + // タブコントロールにタブシートを挿入 | |
35 | + tc.mask = TCIF_TEXT; | |
36 | + tc.pszText = TEXT("キー横"); | |
37 | + TabCtrl_InsertItem(hTabCtrl , 0, &tc); | |
38 | + tc.mask = TCIF_TEXT; | |
39 | + tc.pszText = TEXT("キー縦"); | |
40 | + TabCtrl_InsertItem(hTabCtrl , 1, &tc); | |
41 | + tc.mask = TCIF_TEXT; | |
42 | + tc.pszText = TEXT("コントローラー横"); | |
43 | + TabCtrl_InsertItem(hTabCtrl , 2, &tc); | |
44 | + tc.mask = TCIF_TEXT; | |
45 | + tc.pszText = TEXT("コントローラー縦"); | |
46 | + TabCtrl_InsertItem(hTabCtrl , 3, &tc); | |
47 | + // タブに貼り付けるダイアログを生成 | |
48 | + hTab1 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB1, hDlg, (DLGPROC)TabProc1); | |
49 | + hTab2 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB2, hDlg, (DLGPROC)TabProc2); | |
50 | + hTab3 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB1, hDlg, (DLGPROC)TabProc3); | |
51 | + hTab4 = CreateDialog(hInst, (LPCTSTR)IDD_CONFIG_TAB2, hDlg, (DLGPROC)TabProc4); | |
52 | + // タブコントロールのクライアント領域の座標を取得 | |
53 | + GetClientRect(hTabCtrl, &rt); | |
54 | + TabCtrl_AdjustRect(hTabCtrl, FALSE, &rt); | |
55 | + // 親ウィンドウがhDlgなのでタブのマップが必要 | |
56 | + MapWindowPoints(hTabCtrl, hDlg, pt, 2); | |
57 | + // タブのウィンドウの位置とサイズを変更する | |
58 | + MoveWindow(hTab1, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
59 | + MoveWindow(hTab2, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
60 | + MoveWindow(hTab3, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
61 | + MoveWindow(hTab4, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); | |
62 | + // デフォルトでタブ1を表示 | |
63 | + ShowWindow(hTab1, SW_SHOW); | |
64 | + SetFocus(GetDlgItem(hTab1, IDC_EDIT_Y1)); | |
65 | + SendMessage(GetDlgItem(hTab1, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
66 | + IDirectInputDevice8_Acquire(lpKeyDevice); | |
67 | +} | |
68 | + | |
69 | +LRESULT CALLBACK ConfProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) | |
70 | +{ | |
71 | + NMHDR *nm = (NMHDR *)lParam; | |
72 | + | |
73 | + switch (msg) | |
74 | + { | |
75 | + case WM_INITDIALOG: | |
76 | + WsInputInit(hDlg); | |
77 | + WsDlgConfInit(hDlg); | |
78 | + return TRUE; | |
79 | + case WM_NOTIFY: | |
80 | + // タブコントロールの選択されているタブが変更されたことを通知 | |
81 | + switch (nm->code) | |
82 | + { | |
83 | + case TCN_SELCHANGE: | |
84 | + if (nm->hwndFrom == hTabCtrl) | |
85 | + { | |
86 | + SelectedTab = TabCtrl_GetCurSel(hTabCtrl); | |
87 | + switch (SelectedTab) | |
88 | + { | |
89 | + case 0: | |
90 | + ShowWindow(hTab1, SW_SHOW); | |
91 | + ShowWindow(hTab2, SW_HIDE); | |
92 | + ShowWindow(hTab3, SW_HIDE); | |
93 | + ShowWindow(hTab4, SW_HIDE); | |
94 | + SetFocus(GetDlgItem(hTab1, IDC_EDIT_Y1)); | |
95 | + SendMessage(GetDlgItem(hTab1, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
96 | + IDirectInputDevice8_Acquire(lpKeyDevice); | |
97 | + break; | |
98 | + case 1: | |
99 | + ShowWindow(hTab1, SW_HIDE); | |
100 | + ShowWindow(hTab2, SW_SHOW); | |
101 | + ShowWindow(hTab3, SW_HIDE); | |
102 | + ShowWindow(hTab4, SW_HIDE); | |
103 | + SetFocus(GetDlgItem(hTab2, IDC_EDIT_Y1)); | |
104 | + SendMessage(GetDlgItem(hTab2, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
105 | + IDirectInputDevice8_Acquire(lpKeyDevice); | |
106 | + break; | |
107 | + case 2: | |
108 | + ShowWindow(hTab1, SW_HIDE); | |
109 | + ShowWindow(hTab2, SW_HIDE); | |
110 | + ShowWindow(hTab3, SW_SHOW); | |
111 | + ShowWindow(hTab4, SW_HIDE); | |
112 | + SetFocus(GetDlgItem(hTab3, IDC_EDIT_Y1)); | |
113 | + SendMessage(GetDlgItem(hTab3, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
114 | + break; | |
115 | + case 3: | |
116 | + ShowWindow(hTab1, SW_HIDE); | |
117 | + ShowWindow(hTab2, SW_HIDE); | |
118 | + ShowWindow(hTab3, SW_HIDE); | |
119 | + ShowWindow(hTab4, SW_SHOW); | |
120 | + SetFocus(GetDlgItem(hTab4, IDC_EDIT_Y1)); | |
121 | + SendMessage(GetDlgItem(hTab4, IDC_EDIT_Y1), EM_SETSEL, 0, -1); | |
122 | + break; | |
123 | + } | |
124 | + return TRUE; | |
125 | + } | |
126 | + break; | |
127 | + } | |
128 | + break; | |
129 | + case WM_COMMAND: | |
130 | + if(HIWORD(wParam) == BN_CLICKED) | |
131 | + { | |
132 | + switch (LOWORD(wParam)) | |
133 | + { | |
134 | + case IDOK: | |
135 | + memcpy(WsKeyboardH, TmpKeyboardH, sizeof(int) * 13); | |
136 | + memcpy(WsKeyboardV, TmpKeyboardV, sizeof(int) * 13); | |
137 | + memcpy(WsJoypadH, TmpJoypadH, sizeof(int) * 13); | |
138 | + memcpy(WsJoypadV, TmpJoypadV, sizeof(int) * 13); | |
139 | + EndDialog(hDlg, LOWORD(wParam)); | |
140 | + return TRUE; | |
141 | + case IDCANCEL: | |
142 | + EndDialog(hDlg, LOWORD(wParam)); | |
143 | + return TRUE; | |
144 | + } | |
145 | + } | |
146 | + break; | |
147 | + case WM_DESTROY: | |
148 | + WsInputRelease(); | |
149 | + break; | |
150 | + } | |
151 | + return FALSE; | |
152 | +} | |
153 | + | |
154 | +LRESULT CALLBACK EditProcKey(HWND hEditWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
155 | +{ | |
156 | + HRESULT hRet; | |
157 | + BYTE diKeys[256]; | |
158 | + int key, i; | |
159 | + HWND next; | |
160 | + | |
161 | + switch (msg) | |
162 | + { | |
163 | + case WM_GETDLGCODE: | |
164 | + return DLGC_WANTALLKEYS; | |
165 | + case WM_CHAR: | |
166 | + return 0; | |
167 | + case WM_KEYDOWN: | |
168 | + key = GetDlgCtrlID(hEditWnd) - IDC_EDIT_B; | |
169 | + wParam = 0; | |
170 | + hRet = IDirectInputDevice8_Acquire(lpKeyDevice); | |
171 | + if (hRet == DI_OK || hRet == S_FALSE) | |
172 | + { | |
173 | + hRet = IDirectInputDevice8_GetDeviceState(lpKeyDevice, 256, diKeys); | |
174 | + if (hRet == DI_OK) | |
175 | + { | |
176 | + for (i = 0; i < 256; i++) | |
177 | + { | |
178 | + if (diKeys[i] & 0x80) | |
179 | + { | |
180 | + SetWindowText(hEditWnd, keyName[i]); | |
181 | + if (SelectedTab == 0) | |
182 | + { | |
183 | + TmpKeyboardH[key] = i; | |
184 | + } | |
185 | + else | |
186 | + { | |
187 | + TmpKeyboardV[key] = i; | |
188 | + } | |
189 | + next = GetNextDlgTabItem(GetParent(hEditWnd), hEditWnd, FALSE); | |
190 | + SetFocus(next); | |
191 | + SendMessage(next, EM_SETSEL, 0, -1); | |
192 | + return 0; | |
193 | + } | |
194 | + } | |
195 | + } | |
196 | + } | |
197 | + break; | |
198 | + } | |
199 | + return CallWindowProc(OrgEditProc, hEditWnd, msg, wParam, lParam); | |
200 | +} | |
201 | + | |
202 | +LRESULT CALLBACK EditProcJoy(HWND hEditWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
203 | +{ | |
204 | + HWND next; | |
205 | + | |
206 | + switch (msg) | |
207 | + { | |
208 | + case WM_GETDLGCODE: | |
209 | + return DLGC_WANTALLKEYS; | |
210 | + case WM_CHAR: | |
211 | + return 0; | |
212 | + case WM_KEYDOWN: | |
213 | + if (wParam == VK_TAB || wParam == VK_RETURN) | |
214 | + { | |
215 | + next = GetNextDlgTabItem(GetParent(hEditWnd), hEditWnd, FALSE); | |
216 | + SetFocus(next); | |
217 | + SendMessage(next, EM_SETSEL, 0, -1); | |
218 | + } | |
219 | + return 0; | |
220 | + } | |
221 | + return CallWindowProc(OrgEditProc, hEditWnd, msg, wParam, lParam); | |
222 | +} | |
223 | + | |
224 | +LRESULT CALLBACK TabProc1(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
225 | +{ | |
226 | + switch (msg) { | |
227 | + case WM_INITDIALOG: | |
228 | + OrgEditProc = (WNDPROC)GetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC); | |
229 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
230 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
231 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
232 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
233 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
234 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
235 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
236 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
237 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
238 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
239 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
240 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
241 | + | |
242 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), keyName[TmpKeyboardH[12]]); | |
243 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), keyName[TmpKeyboardH[11]]); | |
244 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), keyName[TmpKeyboardH[10]]); | |
245 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), keyName[TmpKeyboardH[9]]); | |
246 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), keyName[TmpKeyboardH[8]]); | |
247 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), keyName[TmpKeyboardH[7]]); | |
248 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), keyName[TmpKeyboardH[6]]); | |
249 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), keyName[TmpKeyboardH[5]]); | |
250 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), keyName[TmpKeyboardH[4]]); | |
251 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), keyName[TmpKeyboardH[2]]); | |
252 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), keyName[TmpKeyboardH[1]]); | |
253 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), keyName[TmpKeyboardH[0]]); | |
254 | + return TRUE; | |
255 | + } | |
256 | + return FALSE; | |
257 | +} | |
258 | + | |
259 | +LRESULT CALLBACK TabProc2(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
260 | +{ | |
261 | + switch (msg) { | |
262 | + case WM_INITDIALOG: | |
263 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
264 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
265 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
266 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
267 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
268 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
269 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
270 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
271 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
272 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
273 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
274 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcKey); | |
275 | + | |
276 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), keyName[TmpKeyboardH[12]]); | |
277 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), keyName[TmpKeyboardV[11]]); | |
278 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), keyName[TmpKeyboardV[10]]); | |
279 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), keyName[TmpKeyboardV[9]]); | |
280 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), keyName[TmpKeyboardV[8]]); | |
281 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), keyName[TmpKeyboardV[7]]); | |
282 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), keyName[TmpKeyboardV[6]]); | |
283 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), keyName[TmpKeyboardV[5]]); | |
284 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), keyName[TmpKeyboardV[4]]); | |
285 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), keyName[TmpKeyboardV[2]]); | |
286 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), keyName[TmpKeyboardV[1]]); | |
287 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), keyName[TmpKeyboardV[0]]); | |
288 | + return TRUE; | |
289 | + } | |
290 | + return FALSE; | |
291 | +} | |
292 | + | |
293 | +LRESULT CALLBACK TabProc3(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
294 | +{ | |
295 | + HWND hEditWnd; | |
296 | + int key, joy; | |
297 | + | |
298 | + switch (msg) { | |
299 | + case WM_INITDIALOG: | |
300 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
301 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
302 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
303 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
304 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
305 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
306 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
307 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
308 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
309 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
310 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
311 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
312 | + | |
313 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GetJoyName(TmpJoypadH[12])); | |
314 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), GetJoyName(TmpJoypadH[11])); | |
315 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), GetJoyName(TmpJoypadH[10])); | |
316 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), GetJoyName(TmpJoypadH[9])); | |
317 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), GetJoyName(TmpJoypadH[8])); | |
318 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), GetJoyName(TmpJoypadH[7])); | |
319 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), GetJoyName(TmpJoypadH[6])); | |
320 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), GetJoyName(TmpJoypadH[5])); | |
321 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), GetJoyName(TmpJoypadH[4])); | |
322 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), GetJoyName(TmpJoypadH[2])); | |
323 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), GetJoyName(TmpJoypadH[1])); | |
324 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), GetJoyName(TmpJoypadH[0])); | |
325 | + | |
326 | + SetTimer(hCtrl, 0, 30, NULL); | |
327 | + return TRUE; | |
328 | + case WM_TIMER: | |
329 | + if (SelectedTab != 2 || wParam != 0) | |
330 | + { | |
331 | + break; | |
332 | + } | |
333 | + hEditWnd = GetFocus(); | |
334 | + key = GetDlgCtrlID(hEditWnd) - IDC_EDIT_B; | |
335 | + joy = GetJoyState(); | |
336 | + if (joy < 0) | |
337 | + { | |
338 | + break; | |
339 | + } | |
340 | + SetWindowText(hEditWnd, GetJoyName(joy)); | |
341 | + TmpJoypadH[key] = joy; | |
342 | + return TRUE; | |
343 | + } | |
344 | + return FALSE; | |
345 | +} | |
346 | + | |
347 | +LRESULT CALLBACK TabProc4(HWND hCtrl, UINT msg, WPARAM wParam, LPARAM lParam) | |
348 | +{ | |
349 | + HWND hEditWnd; | |
350 | + int key, joy; | |
351 | + | |
352 | + switch (msg) { | |
353 | + case WM_INITDIALOG: | |
354 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
355 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
356 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
357 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
358 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_Y4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
359 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X1), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
360 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X2), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
361 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X3), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
362 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_X4), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
363 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_START), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
364 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_A), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
365 | + SetWindowLongPtr(GetDlgItem(hCtrl, IDC_EDIT_B), GWLP_WNDPROC, (LONG_PTR)EditProcJoy); | |
366 | + | |
367 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_NOWAIT), GetJoyName(TmpJoypadH[12])); | |
368 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y1), GetJoyName(TmpJoypadV[11])); | |
369 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y2), GetJoyName(TmpJoypadV[10])); | |
370 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y3), GetJoyName(TmpJoypadV[9])); | |
371 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_Y4), GetJoyName(TmpJoypadV[8])); | |
372 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X1), GetJoyName(TmpJoypadV[7])); | |
373 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X2), GetJoyName(TmpJoypadV[6])); | |
374 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X3), GetJoyName(TmpJoypadV[5])); | |
375 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_X4), GetJoyName(TmpJoypadV[4])); | |
376 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_START), GetJoyName(TmpJoypadV[2])); | |
377 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_A), GetJoyName(TmpJoypadV[1])); | |
378 | + SetWindowText(GetDlgItem(hCtrl, IDC_EDIT_B), GetJoyName(TmpJoypadV[0])); | |
379 | + | |
380 | + SetTimer(hCtrl, 1, 30, NULL); | |
381 | + return TRUE; | |
382 | + case WM_TIMER: | |
383 | + if (SelectedTab != 3 || wParam != 1) | |
384 | + { | |
385 | + break; | |
386 | + } | |
387 | + hEditWnd = GetFocus(); | |
388 | + key = GetDlgCtrlID(hEditWnd) - IDC_EDIT_B; | |
389 | + joy = GetJoyState(); | |
390 | + if (joy < 0) | |
391 | + { | |
392 | + break; | |
393 | + } | |
394 | + SetWindowText(hEditWnd, GetJoyName(joy)); | |
395 | + TmpJoypadV[key] = joy; | |
396 | + return TRUE; | |
397 | + } | |
398 | + return FALSE; | |
399 | +} | |
400 | + | |
401 | +LPCTSTR GetJoyName(int joy) | |
402 | +{ | |
403 | + static LPCTSTR JoyStr[] = { | |
404 | + TEXT("POV1 UP"), TEXT("POV1 RIGHT"), TEXT("POV1 DOWN"), TEXT("POV1 LEFT"), | |
405 | + TEXT("POV2 UP"), TEXT("POV2 RIGHT"), TEXT("POV2 DOWN"), TEXT("POV2 LEFT"), | |
406 | + TEXT("POV3 UP"), TEXT("POV3 RIGHT"), TEXT("POV3 DOWN"), TEXT("POV3 LEFT"), | |
407 | + TEXT("POV4 UP"), TEXT("POV4 RIGHT"), TEXT("POV4 DOWN"), TEXT("POV4 LEFT"), | |
408 | + TEXT("Y -"), TEXT("X +"), TEXT("Y +"), TEXT("X -"), TEXT("Z +"), TEXT("Z -"), | |
409 | + TEXT("RY -"), TEXT("RX +"), TEXT("RY +"), TEXT("RX -"), TEXT("RZ +"), TEXT("RZ -"), | |
410 | + TEXT("Slider1 +"), TEXT("Slider1 -"), TEXT("Slider2 +"), TEXT("Slider2 -") | |
411 | + }; | |
412 | + static const int JoyInt[] = { | |
413 | + WS_JOY_POV1_UP, WS_JOY_POV1_RIGHT, WS_JOY_POV1_DOWN, WS_JOY_POV1_LEFT, | |
414 | + WS_JOY_POV2_UP, WS_JOY_POV2_RIGHT, WS_JOY_POV2_DOWN, WS_JOY_POV2_LEFT, | |
415 | + WS_JOY_POV3_UP, WS_JOY_POV3_RIGHT, WS_JOY_POV3_DOWN, WS_JOY_POV3_LEFT, | |
416 | + WS_JOY_POV4_UP, WS_JOY_POV4_RIGHT, WS_JOY_POV4_DOWN, WS_JOY_POV4_LEFT, | |
417 | + WS_JOY_AXIS_Y_M, WS_JOY_AXIS_X_P, WS_JOY_AXIS_Y_P, WS_JOY_AXIS_X_M, WS_JOY_AXIS_Z_P, WS_JOY_AXIS_Z_M, | |
418 | + WS_JOY_AXIS_RY_M, WS_JOY_AXIS_RX_P, WS_JOY_AXIS_RY_P, WS_JOY_AXIS_RX_M, WS_JOY_AXIS_RZ_P, WS_JOY_AXIS_RZ_M, | |
419 | + WS_JOY_SLIDER1_P, WS_JOY_SLIDER1_M, WS_JOY_SLIDER2_P, WS_JOY_SLIDER2_M | |
420 | + }; | |
421 | + static TCHAR buf[8]; | |
422 | + int i; | |
423 | + | |
424 | + if (joy < 0x80) | |
425 | + { | |
426 | + _stprintf_s(buf, 8, TEXT("%d"), joy); | |
427 | + return buf; | |
428 | + } | |
429 | + for (i = 0; i < 32; i++) | |
430 | + { | |
431 | + if (joy == JoyInt[i]) | |
432 | + { | |
433 | + return JoyStr[i]; | |
434 | + } | |
435 | + } | |
436 | + buf[0] = 0; | |
437 | + return buf; | |
438 | +} | |
439 | + | |
440 | +int GetJoyState(void) | |
441 | +{ | |
442 | + const long joyCenter = 0x7fff; | |
443 | + static int xFlag = 0; | |
444 | + static int yFlag = 0; | |
445 | + static int zFlag = 0; | |
446 | + static int rxFlag = 0; | |
447 | + static int ryFlag = 0; | |
448 | + static int rzFlag = 0; | |
449 | + static int s1Flag = 0; | |
450 | + static int s2Flag = 0; | |
451 | + HRESULT hRet; | |
452 | + int joy; | |
453 | + unsigned int i; | |
454 | + DIJOYSTATE2 js; | |
455 | + DIDEVCAPS diDevCaps; | |
456 | + | |
457 | + diDevCaps.dwSize = sizeof(DIDEVCAPS); | |
458 | + if (lpJoyDevice == NULL) | |
459 | + { | |
460 | + return -1; | |
461 | + } | |
462 | + hRet = IDirectInputDevice8_Poll(lpJoyDevice); | |
463 | + if (FAILED(hRet)) | |
464 | + { | |
465 | + hRet = IDirectInputDevice8_Acquire(lpJoyDevice); | |
466 | + while (hRet == DIERR_INPUTLOST) | |
467 | + { | |
468 | + hRet = IDirectInputDevice8_Acquire(lpJoyDevice); | |
469 | + } | |
470 | + return -1; | |
471 | + } | |
472 | + IDirectInputDevice8_GetDeviceState(lpJoyDevice, sizeof(DIJOYSTATE2), &js); | |
473 | + IDirectInputDevice8_GetCapabilities(lpJoyDevice, &diDevCaps); | |
474 | + for (i = 0; i < diDevCaps.dwButtons; i++) | |
475 | + { | |
476 | + if (js.rgbButtons[i] & 0x80) | |
477 | + { | |
478 | + return i + 1; | |
479 | + } | |
480 | + } | |
481 | + for (i = 0; i < diDevCaps.dwPOVs; i++) | |
482 | + { | |
483 | + joy = WS_JOY_POV1_UP + (i << 4); | |
484 | + if (js.rgdwPOV[i] == JOY_POVFORWARD) | |
485 | + { | |
486 | + return joy; | |
487 | + } | |
488 | + else if (js.rgdwPOV[i] == JOY_POVRIGHT) | |
489 | + { | |
490 | + return joy + 1; | |
491 | + } | |
492 | + else if (js.rgdwPOV[i] == JOY_POVBACKWARD) | |
493 | + { | |
494 | + return joy + 3; | |
495 | + } | |
496 | + else if (js.rgdwPOV[i] == JOY_POVLEFT) | |
497 | + { | |
498 | + return joy + 7; | |
499 | + } | |
500 | + } | |
501 | + if ((js.lX > joyCenter - 0x1000) && (js.lX < joyCenter + 0x1000)) | |
502 | + { | |
503 | + xFlag = 1; | |
504 | + } | |
505 | + if ((js.lX > (joyCenter + 0x4000)) && xFlag) | |
506 | + { | |
507 | + xFlag = 0; | |
508 | + return WS_JOY_AXIS_X_P; | |
509 | + } | |
510 | + else if ((js.lX < (joyCenter - 0x4000)) && xFlag) | |
511 | + { | |
512 | + xFlag = 0; | |
513 | + return WS_JOY_AXIS_X_M; | |
514 | + } | |
515 | + if ((js.lY > joyCenter - 0x1000) && (js.lY < joyCenter + 0x1000)) | |
516 | + { | |
517 | + yFlag = 1; | |
518 | + } | |
519 | + if ((js.lY > (joyCenter + 0x4000)) && yFlag) | |
520 | + { | |
521 | + yFlag = 0; | |
522 | + return WS_JOY_AXIS_Y_P; | |
523 | + } | |
524 | + else if ((js.lY < (joyCenter - 0x4000)) && yFlag) | |
525 | + { | |
526 | + yFlag = 0; | |
527 | + return WS_JOY_AXIS_Y_M; | |
528 | + } | |
529 | + if ((js.lZ > joyCenter - 0x1000) && (js.lZ < joyCenter + 0x1000)) | |
530 | + { | |
531 | + zFlag = 1; | |
532 | + } | |
533 | + if ((js.lZ > (joyCenter + 0x4000)) && zFlag) | |
534 | + { | |
535 | + zFlag = 0; | |
536 | + return WS_JOY_AXIS_Z_P; | |
537 | + } | |
538 | + else if ((js.lZ < (joyCenter - 0x4000)) && zFlag) | |
539 | + { | |
540 | + zFlag = 0; | |
541 | + return WS_JOY_AXIS_Z_M; | |
542 | + } | |
543 | + if ((js.lRx > joyCenter - 0x1000) && (js.lRx < joyCenter + 0x1000)) | |
544 | + { | |
545 | + rxFlag = 1; | |
546 | + } | |
547 | + if ((js.lRx > (joyCenter + 0x4000)) && rxFlag) | |
548 | + { | |
549 | + rxFlag = 0; | |
550 | + return WS_JOY_AXIS_RX_P; | |
551 | + } | |
552 | + else if ((js.lRx < (joyCenter - 0x4000)) && rxFlag) | |
553 | + { | |
554 | + rxFlag = 0; | |
555 | + return WS_JOY_AXIS_RX_M; | |
556 | + } | |
557 | + if ((js.lRy > joyCenter - 0x1000) && (js.lRy < joyCenter + 0x1000)) | |
558 | + { | |
559 | + ryFlag = 1; | |
560 | + } | |
561 | + if ((js.lRy > (joyCenter + 0x4000)) && ryFlag) | |
562 | + { | |
563 | + ryFlag = 0; | |
564 | + return WS_JOY_AXIS_RY_P; | |
565 | + } | |
566 | + else if ((js.lRy < (joyCenter - 0x4000)) && ryFlag) | |
567 | + { | |
568 | + ryFlag = 0; | |
569 | + return WS_JOY_AXIS_RY_M; | |
570 | + } | |
571 | + if ((js.lRz > joyCenter - 0x1000) && (js.lRz < joyCenter + 0x1000)) | |
572 | + { | |
573 | + rzFlag = 1; | |
574 | + } | |
575 | + if ((js.lRz > (joyCenter + 0x4000)) && rzFlag) | |
576 | + { | |
577 | + rzFlag = 0; | |
578 | + return WS_JOY_AXIS_RZ_P; | |
579 | + } | |
580 | + else if ((js.lRz < (joyCenter - 0x4000)) && rzFlag) | |
581 | + { | |
582 | + rzFlag = 0; | |
583 | + return WS_JOY_AXIS_RZ_M; | |
584 | + } | |
585 | + if ((js.rglSlider[0] > joyCenter - 0x1000) && (js.rglSlider[0] < joyCenter + 0x1000)) | |
586 | + { | |
587 | + s1Flag = 1; | |
588 | + } | |
589 | + if ((js.rglSlider[0] > (joyCenter + 0x4000)) && s1Flag) | |
590 | + { | |
591 | + s1Flag = 0; | |
592 | + return WS_JOY_SLIDER1_P; | |
593 | + } | |
594 | + else if ((js.rglSlider[0] < (joyCenter - 0x4000)) && s1Flag) | |
595 | + { | |
596 | + s1Flag = 0; | |
597 | + return WS_JOY_SLIDER1_M; | |
598 | + } | |
599 | + if ((js.rglSlider[1] > joyCenter - 0x1000) && (js.rglSlider[0] < joyCenter + 0x1000)) | |
600 | + { | |
601 | + s2Flag = 1; | |
602 | + } | |
603 | + if ((js.rglSlider[1] > (joyCenter + 0x4000)) && s2Flag) | |
604 | + { | |
605 | + s2Flag = 0; | |
606 | + return WS_JOY_SLIDER2_P; | |
607 | + } | |
608 | + else if ((js.rglSlider[1] < (joyCenter - 0x4000)) && s2Flag) | |
609 | + { | |
610 | + s2Flag = 0; | |
611 | + return WS_JOY_SLIDER2_M; | |
612 | + } | |
613 | + return -1; | |
614 | +} |
@@ -0,0 +1,142 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include <windows.h> | |
7 | +#include <stdio.h> | |
8 | +#include "WSconfig.h" | |
9 | +#include "WSInput.h" | |
10 | +#include "WSFileio.h" | |
11 | + | |
12 | +extern wchar_t* RecentOfn[]; | |
13 | +extern int WsWaveVol; | |
14 | +static LPCWSTR KeyName[] = { | |
15 | + L"B", L"A", L"START", L"OPTION", | |
16 | + L"X4", L"X3", L"X2", L"X1", | |
17 | + L"Y4", L"Y3", L"Y2", L"Y1", | |
18 | + L"NOWAIT" | |
19 | +}; | |
20 | + | |
21 | +void ConfigCreate(void) | |
22 | +{ | |
23 | + int i; | |
24 | + | |
25 | + /* default values */ | |
26 | + WsKeyboardH[0] = DIK_Z; // B | |
27 | + WsKeyboardH[1] = DIK_X; // A | |
28 | + WsKeyboardH[2] = DIK_RETURN; // START | |
29 | + WsKeyboardH[3] = DIK_LCONTROL; // OPTION | |
30 | + WsKeyboardH[4] = DIK_LEFT; // X4 | |
31 | + WsKeyboardH[5] = DIK_DOWN; // X3 | |
32 | + WsKeyboardH[6] = DIK_RIGHT; // X2 | |
33 | + WsKeyboardH[7] = DIK_UP; // X1 | |
34 | + WsKeyboardH[8] = DIK_A; // Y4 | |
35 | + WsKeyboardH[9] = DIK_S; // Y3 | |
36 | + WsKeyboardH[10] = DIK_D; // Y2 | |
37 | + WsKeyboardH[11] = DIK_W; // Y1 | |
38 | + WsKeyboardH[12] = DIK_SPACE; // NO WAIT | |
39 | + | |
40 | + WsKeyboardV[0] = DIK_Z; // B | |
41 | + WsKeyboardV[1] = DIK_X; // A | |
42 | + WsKeyboardV[2] = DIK_RETURN; // START | |
43 | + WsKeyboardV[3] = DIK_LCONTROL; // OPTION | |
44 | + WsKeyboardV[4] = DIK_S; // X4 | |
45 | + WsKeyboardV[5] = DIK_D; // X3 | |
46 | + WsKeyboardV[6] = DIK_W; // X2 | |
47 | + WsKeyboardV[7] = DIK_A; // X1 | |
48 | + WsKeyboardV[8] = DIK_DOWN; // Y4 | |
49 | + WsKeyboardV[9] = DIK_RIGHT; // Y3 | |
50 | + WsKeyboardV[10] = DIK_UP; // Y2 | |
51 | + WsKeyboardV[11] = DIK_LEFT; // Y1 | |
52 | + WsKeyboardV[12] = DIK_SPACE; // NO WAIT | |
53 | + | |
54 | + WsJoypadH[0] = 1; // B | |
55 | + WsJoypadH[1] = 2; // A | |
56 | + WsJoypadH[2] = 8; // START | |
57 | + WsJoypadH[3] = 0; // OPTION | |
58 | + WsJoypadH[4] = WS_JOY_AXIS_X_M; // X4 | |
59 | + WsJoypadH[5] = WS_JOY_AXIS_Y_P; // X3 | |
60 | + WsJoypadH[6] = WS_JOY_AXIS_X_P; // X2 | |
61 | + WsJoypadH[7] = WS_JOY_AXIS_Y_M; // X1 | |
62 | + WsJoypadH[8] = WS_JOY_POV1_LEFT; // Y4 | |
63 | + WsJoypadH[9] = WS_JOY_POV1_DOWN; // Y3 | |
64 | + WsJoypadH[10] = WS_JOY_POV1_RIGHT; // Y2 | |
65 | + WsJoypadH[11] = WS_JOY_POV1_UP; // Y1 | |
66 | + WsJoypadH[12] = 7; // NO WAIT | |
67 | + | |
68 | + WsJoypadV[0] = 5; // B | |
69 | + WsJoypadV[1] = 6; // A | |
70 | + WsJoypadV[2] = 8; // START | |
71 | + WsJoypadV[3] = 0; // OPTION | |
72 | + WsJoypadV[4] = 1; // X4 | |
73 | + WsJoypadV[5] = 2; // X3 | |
74 | + WsJoypadV[6] = 4; // X2 | |
75 | + WsJoypadV[7] = 3; // X1 | |
76 | + WsJoypadV[8] = WS_JOY_AXIS_Y_P; // Y4 | |
77 | + WsJoypadV[9] = WS_JOY_AXIS_X_P; // Y3 | |
78 | + WsJoypadV[10] = WS_JOY_AXIS_Y_M; // Y2 | |
79 | + WsJoypadV[11] = WS_JOY_AXIS_X_M; // Y1 | |
80 | + WsJoypadV[12] = 7; // NO WAIT | |
81 | + | |
82 | + for (i = 12; i >= 0; i--) | |
83 | + { | |
84 | + WsKeyboardH[i] = GetPrivateProfileIntW(L"KEY_H", KeyName[i], WsKeyboardH[i], IniPath); | |
85 | + } | |
86 | + for (i = 12; i >= 0; i--) | |
87 | + { | |
88 | + WsKeyboardV[i] = GetPrivateProfileIntW(L"KEY_V", KeyName[i], WsKeyboardV[i], IniPath); | |
89 | + } | |
90 | + for (i = 12; i >= 0; i--) | |
91 | + { | |
92 | + WsJoypadH[i] = GetPrivateProfileIntW(L"JOY_H", KeyName[i], WsJoypadH[i], IniPath); | |
93 | + } | |
94 | + for (i = 12; i >= 0; i--) | |
95 | + { | |
96 | + WsJoypadV[i] = GetPrivateProfileIntW(L"JOY_V", KeyName[i], WsJoypadV[i], IniPath); | |
97 | + } | |
98 | + GetPrivateProfileStringW(L"RECENT_ROMS", L"0", L"", RecentOfn[0], 512, IniPath); | |
99 | + GetPrivateProfileStringW(L"RECENT_ROMS", L"1", L"", RecentOfn[1], 512, IniPath); | |
100 | + GetPrivateProfileStringW(L"RECENT_ROMS", L"2", L"", RecentOfn[2], 512, IniPath); | |
101 | + GetPrivateProfileStringW(L"RECENT_ROMS", L"3", L"", RecentOfn[3], 512, IniPath); | |
102 | + GetPrivateProfileStringW(L"RECENT_ROMS", L"4", L"", RecentOfn[4], 512, IniPath); | |
103 | + GetPrivateProfileStringW(L"RECENT_ROMS", L"5", L"", RecentOfn[5], 512, IniPath); | |
104 | + WsWaveVol = GetPrivateProfileIntW(L"VOLUME", L"VOL", 4, IniPath); | |
105 | +} | |
106 | + | |
107 | +static void WritePrivateProfileIntW(LPCWSTR lpAppName, LPCWSTR lpKeyName, int nInt, LPCWSTR lpFileName) | |
108 | +{ | |
109 | + wchar_t s[32]; | |
110 | + | |
111 | + swprintf_s(s, 32, L"%d", nInt); | |
112 | + WritePrivateProfileStringW(lpAppName, lpKeyName, s, lpFileName); | |
113 | +} | |
114 | + | |
115 | +void ConfigRelease(void) | |
116 | +{ | |
117 | + int i; | |
118 | + | |
119 | + for (i = 12; i >= 0; i--) | |
120 | + { | |
121 | + WritePrivateProfileIntW(L"KEY_H", KeyName[i], WsKeyboardH[i], IniPath); | |
122 | + } | |
123 | + for (i = 12; i >= 0; i--) | |
124 | + { | |
125 | + WritePrivateProfileIntW(L"KEY_V", KeyName[i], WsKeyboardV[i], IniPath); | |
126 | + } | |
127 | + for (i = 12; i >= 0; i--) | |
128 | + { | |
129 | + WritePrivateProfileIntW(L"JOY_H", KeyName[i], WsJoypadH[i], IniPath); | |
130 | + } | |
131 | + for (i = 12; i >= 0; i--) | |
132 | + { | |
133 | + WritePrivateProfileIntW(L"JOY_V", KeyName[i], WsJoypadV[i], IniPath); | |
134 | + } | |
135 | + WritePrivateProfileStringW(L"RECENT_ROMS", L"0", RecentOfn[0], IniPath); | |
136 | + WritePrivateProfileStringW(L"RECENT_ROMS", L"1", RecentOfn[1], IniPath); | |
137 | + WritePrivateProfileStringW(L"RECENT_ROMS", L"2", RecentOfn[2], IniPath); | |
138 | + WritePrivateProfileStringW(L"RECENT_ROMS", L"3", RecentOfn[3], IniPath); | |
139 | + WritePrivateProfileStringW(L"RECENT_ROMS", L"4", RecentOfn[4], IniPath); | |
140 | + WritePrivateProfileStringW(L"RECENT_ROMS", L"5", RecentOfn[5], IniPath); | |
141 | + WritePrivateProfileIntW(L"VOLUME", L"VOL", WsWaveVol, IniPath); | |
142 | +} |
@@ -0,0 +1,480 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include <shlwapi.h> | |
7 | +#include <stdio.h> | |
8 | +#include "WSHard.h" | |
9 | +#include "WS.h" | |
10 | +#include "WSDraw.h" | |
11 | +#include "WSFileio.h" | |
12 | +#include "WSPdata.h" | |
13 | +#include "WSError.h" | |
14 | +#include "WSRender.h" | |
15 | +#include "nec/necintrf.h" | |
16 | + | |
17 | +// ファイル操作は表などとディレクトリセパレータがかぶるのでUNICODEを使います | |
18 | +static wchar_t CurDir[512]; | |
19 | +static wchar_t *SaveDir = L"RAM"; | |
20 | +static wchar_t *StateDir = L"STATE"; | |
21 | +static wchar_t SaveName[512]; // ".sav" | |
22 | +wchar_t StateName[512]; | |
23 | +wchar_t IniPath[512]; | |
24 | + | |
25 | +void WsSetDir(void) | |
26 | +{ | |
27 | + wchar_t *p; | |
28 | + | |
29 | + wcscpy(CurDir, __wargv[0]); | |
30 | + p = wcsrchr(CurDir, L'\\'); | |
31 | + if (p == NULL) | |
32 | + { | |
33 | + return; | |
34 | + } | |
35 | + *(++p) = 0; | |
36 | + wcscpy(IniPath, CurDir); | |
37 | + wcscat(IniPath, L"OswanJ.ini"); | |
38 | +} | |
39 | + | |
40 | +int WsSetPdata(void) | |
41 | +{ | |
42 | + ROMBanks = 1; | |
43 | + RAMBanks = 0; | |
44 | + RAMSize = 0; | |
45 | + CartKind = 0; | |
46 | + SaveName[0] = 0; | |
47 | + if ((ROMMap[0xFF] = (BYTE*)malloc(0x10000)) == NULL) | |
48 | + { | |
49 | + ErrorMsg(ERR_MALLOC); | |
50 | + return -1; | |
51 | + } | |
52 | + memcpy(ROMMap[0xFF] + 0xF080, pdata, size_pdata); | |
53 | + WsReset(); | |
54 | + SetDrawMode(0); | |
55 | + return 0; | |
56 | +} | |
57 | + | |
58 | +int WsCreate(wchar_t *CartName) | |
59 | +{ | |
60 | + int Checksum, i, j; | |
61 | + FILE* fp; | |
62 | + BYTE buf[16]; | |
63 | + wchar_t* p; | |
64 | + | |
65 | + for (i = 0; i < 256; i++) | |
66 | + { | |
67 | + ROMMap[i] = MemDummy; | |
68 | + RAMMap[i] = MemDummy; | |
69 | + } | |
70 | + memset(IRAM, 0, sizeof(IRAM)); | |
71 | + memset(MemDummy, 0xA0, sizeof(MemDummy)); | |
72 | + memset(IO, 0, sizeof(IO)); | |
73 | + if (CartName == NULL) | |
74 | + { | |
75 | + return WsSetPdata(); | |
76 | + } | |
77 | + if ((fp = _wfopen(CartName, L"rb")) == NULL) | |
78 | + { | |
79 | + ErrorMsg(ERR_FOPEN); | |
80 | + return -1; | |
81 | + } | |
82 | + fseek(fp, -10, 2); | |
83 | + if (fread(buf, 1, 10, fp) != 10) | |
84 | + { | |
85 | + ErrorMsg(ERR_FREAD_ROMINFO); | |
86 | + return -1; | |
87 | + } | |
88 | + switch (buf[4]) | |
89 | + { | |
90 | + case 1: | |
91 | + ROMBanks = 4; | |
92 | + break; | |
93 | + case 2: | |
94 | + ROMBanks = 8; | |
95 | + break; | |
96 | + case 3: | |
97 | + ROMBanks = 16; | |
98 | + break; | |
99 | + case 4: | |
100 | + ROMBanks = 32; | |
101 | + break; | |
102 | + case 5: | |
103 | + ROMBanks = 48; | |
104 | + break; | |
105 | + case 6: | |
106 | + ROMBanks = 64; | |
107 | + break; | |
108 | + case 7: | |
109 | + ROMBanks = 96; | |
110 | + break; | |
111 | + case 8: | |
112 | + ROMBanks = 128; | |
113 | + break; | |
114 | + case 9: | |
115 | + ROMBanks = 256; | |
116 | + break; | |
117 | + default: | |
118 | + ROMBanks = 0; | |
119 | + break; | |
120 | + } | |
121 | + if (ROMBanks == 0) | |
122 | + { | |
123 | + ErrorMsg(ERR_ILLEGAL_ROMSIZE); | |
124 | + return -1; | |
125 | + } | |
126 | + switch (buf[5]) | |
127 | + { | |
128 | + case 0x01: | |
129 | + RAMBanks = 1; | |
130 | + RAMSize = 0x2000; | |
131 | + CartKind = 0; | |
132 | + break; | |
133 | + case 0x02: | |
134 | + RAMBanks = 1; | |
135 | + RAMSize = 0x8000; | |
136 | + CartKind = 0; | |
137 | + break; | |
138 | + case 0x03: | |
139 | + RAMBanks = 2; | |
140 | + RAMSize = 0x20000; | |
141 | + CartKind = 0; | |
142 | + break; | |
143 | + case 0x04: | |
144 | + RAMBanks = 4; | |
145 | + RAMSize = 0x40000; | |
146 | + CartKind = 0; | |
147 | + break; | |
148 | + case 0x10: | |
149 | + RAMBanks = 1; | |
150 | + RAMSize = 0x80; | |
151 | + CartKind = CK_EEP; | |
152 | + break; | |
153 | + case 0x20: | |
154 | + RAMBanks = 1; | |
155 | + RAMSize = 0x800; | |
156 | + CartKind = CK_EEP; | |
157 | + break; | |
158 | + case 0x50: | |
159 | + RAMBanks = 1; | |
160 | + RAMSize = 0x400; | |
161 | + CartKind = CK_EEP; | |
162 | + break; | |
163 | + default: | |
164 | + RAMBanks = 0; | |
165 | + RAMSize = 0; | |
166 | + CartKind = 0; | |
167 | + break; | |
168 | + } | |
169 | + WsRomPatch(buf); | |
170 | + Checksum = (int)((buf[9] << 8) + buf[8]); | |
171 | + Checksum += (int)(buf[9] + buf[8]); | |
172 | + for (i = ROMBanks - 1; i >= 0; i--) | |
173 | + { | |
174 | + fseek(fp, (ROMBanks - i) * -0x10000, 2); | |
175 | + if ((ROMMap[0x100 - ROMBanks + i] = (BYTE*)malloc(0x10000)) != NULL) | |
176 | + { | |
177 | + if (fread(ROMMap[0x100 - ROMBanks + i], 1, 0x10000, fp) == 0x10000) | |
178 | + { | |
179 | + for (j = 0; j < 0x10000; j++) | |
180 | + { | |
181 | + Checksum -= ROMMap[0x100 - ROMBanks + i][j]; | |
182 | + } | |
183 | + } | |
184 | + else | |
185 | + { | |
186 | + ErrorMsg(ERR_FREAD_ROM); | |
187 | + break; | |
188 | + } | |
189 | + } | |
190 | + else | |
191 | + { | |
192 | + ErrorMsg(ERR_MALLOC); | |
193 | + break; | |
194 | + } | |
195 | + } | |
196 | + fclose(fp); | |
197 | + if (i >= 0) | |
198 | + { | |
199 | + return -1; | |
200 | + } | |
201 | + if (Checksum & 0xFFFF) | |
202 | + { | |
203 | + //ErrorMsg(ERR_CHECKSUM); | |
204 | + } | |
205 | + if (RAMBanks) | |
206 | + { | |
207 | + for (i = 0; i < RAMBanks; i++) | |
208 | + { | |
209 | + if ((RAMMap[i] = (BYTE*)malloc(0x10000)) != NULL) | |
210 | + { | |
211 | + memset(RAMMap[i], 0x00, 0x10000); | |
212 | + } | |
213 | + else | |
214 | + { | |
215 | + ErrorMsg(ERR_MALLOC); | |
216 | + return -1; | |
217 | + } | |
218 | + } | |
219 | + } | |
220 | + if (RAMSize) | |
221 | + { | |
222 | + wcscpy (SaveName, CurDir); | |
223 | + p = wcsrchr(CartName, L'\\'); | |
224 | + if (p) | |
225 | + { | |
226 | + wcscat(SaveName, SaveDir); | |
227 | + if (PathIsDirectoryW(SaveName) == FALSE) | |
228 | + { | |
229 | + CreateDirectoryW(SaveName, NULL); | |
230 | + } | |
231 | + wcscat(SaveName, p); | |
232 | + p = wcsrchr(SaveName, L'.'); | |
233 | + if (p) | |
234 | + { | |
235 | + *p = 0; | |
236 | + } | |
237 | + wcscat(SaveName, L".sav"); | |
238 | + } | |
239 | + else | |
240 | + { | |
241 | + SaveName[0] = 0; | |
242 | + } | |
243 | + if ((fp = _wfopen(SaveName, L"rb")) != NULL) | |
244 | + { | |
245 | + for (i = 0; i < RAMBanks; i++) | |
246 | + { | |
247 | + if (RAMSize < 0x10000) | |
248 | + { | |
249 | + if (fread(RAMMap[i], 1, RAMSize, fp) != (size_t)RAMSize) | |
250 | + { | |
251 | + ErrorMsg(ERR_FREAD_SAVE); | |
252 | + break; | |
253 | + } | |
254 | + } | |
255 | + else | |
256 | + { | |
257 | + if (fread(RAMMap[i], 1, 0x10000, fp) != 0x10000) | |
258 | + { | |
259 | + ErrorMsg(ERR_FREAD_SAVE); | |
260 | + break; | |
261 | + } | |
262 | + } | |
263 | + } | |
264 | + fclose(fp); | |
265 | + } | |
266 | + } | |
267 | + else | |
268 | + { | |
269 | + SaveName[0] = 0; | |
270 | + } | |
271 | + wcscpy (StateName, CurDir); | |
272 | + p = wcsrchr(CartName, L'\\'); | |
273 | + if (p) | |
274 | + { | |
275 | + wcscat(StateName, StateDir); | |
276 | + if (PathIsDirectoryW(StateName) == FALSE) | |
277 | + { | |
278 | + CreateDirectoryW(StateName, NULL); | |
279 | + } | |
280 | + wcscat(StateName, p); | |
281 | + p = wcsrchr(StateName, L'.'); | |
282 | + if (p) | |
283 | + { | |
284 | + *p = 0; | |
285 | + } | |
286 | + } | |
287 | + WsReset(); | |
288 | + SetDrawMode(buf[6] & 1); // 0:横 1:縦 | |
289 | + return 0; | |
290 | +} | |
291 | + | |
292 | +void WsRelease(void) | |
293 | +{ | |
294 | + FILE* fp; | |
295 | + int i; | |
296 | + | |
297 | + if (SaveName[0] != '\0') | |
298 | + { | |
299 | + if ((fp = _wfopen(SaveName, L"wb"))!= NULL) | |
300 | + { | |
301 | + for (i =0; i < RAMBanks; i++) | |
302 | + { | |
303 | + if (RAMSize<0x10000) | |
304 | + { | |
305 | + if (fwrite(RAMMap[i], 1, RAMSize, fp) != (size_t)RAMSize) | |
306 | + { | |
307 | + break; | |
308 | + } | |
309 | + } | |
310 | + else | |
311 | + { | |
312 | + if (fwrite(RAMMap[i], 1, 0x10000, fp)!=0x10000) | |
313 | + { | |
314 | + break; | |
315 | + } | |
316 | + } | |
317 | + free(RAMMap[i]); | |
318 | + RAMMap[i] = NULL; | |
319 | + } | |
320 | + fclose(fp); | |
321 | + } | |
322 | + SaveName[0] = '\0'; | |
323 | + } | |
324 | + for (i = 0xFF; i >= 0; i--) | |
325 | + { | |
326 | + if (ROMMap[i] == MemDummy) | |
327 | + { | |
328 | + break; | |
329 | + } | |
330 | + free(ROMMap[i]); | |
331 | + ROMMap[i] = MemDummy; | |
332 | + } | |
333 | + StateName[0] = '\0'; | |
334 | +} | |
335 | + | |
336 | +void WsLoadEeprom(void) | |
337 | +{ | |
338 | + FILE* fp; | |
339 | + wchar_t buf[512]; | |
340 | + | |
341 | + wcscpy(buf, CurDir); | |
342 | + wcscat(buf, L"eeprom.dat"); | |
343 | + if ((fp = _wfopen(buf, L"rb")) != NULL) | |
344 | + { | |
345 | + fread(IEep, sizeof(WORD), 64, fp); | |
346 | + fclose(fp); | |
347 | + } | |
348 | + else | |
349 | + { | |
350 | + memset(IEep, 0xFF, 0x60); | |
351 | + memset(IEep + 0x60, 0, 0x20); | |
352 | + } | |
353 | +} | |
354 | + | |
355 | +void WsSaveEeprom(void) | |
356 | +{ | |
357 | + FILE* fp; | |
358 | + wchar_t buf[512]; | |
359 | + | |
360 | + wcscpy(buf, CurDir); | |
361 | + wcscat(buf, L"eeprom.dat"); | |
362 | + if ((fp = _wfopen(buf, L"wb")) != NULL) | |
363 | + { | |
364 | + fwrite(IEep, sizeof(WORD), 64, fp); | |
365 | + fclose(fp); | |
366 | + } | |
367 | +} | |
368 | + | |
369 | +#define MacroLoadNecRegisterFromFile(F,R) \ | |
370 | + fread(&value, sizeof(unsigned int), 1, fp); \ | |
371 | + nec_set_reg(R,value); | |
372 | +void WsLoadState(int num) | |
373 | +{ | |
374 | + FILE* fp; | |
375 | + wchar_t buf[512]; | |
376 | + unsigned int value; | |
377 | + int i; | |
378 | + | |
379 | + wsprintf(buf, L"%s.%03d", StateName, num); | |
380 | + if ((fp = _wfopen(buf, L"rb")) == NULL) | |
381 | + { | |
382 | + return; | |
383 | + } | |
384 | + MacroLoadNecRegisterFromFile(fp,NEC_IP); | |
385 | + MacroLoadNecRegisterFromFile(fp,NEC_AW); | |
386 | + MacroLoadNecRegisterFromFile(fp,NEC_BW); | |
387 | + MacroLoadNecRegisterFromFile(fp,NEC_CW); | |
388 | + MacroLoadNecRegisterFromFile(fp,NEC_DW); | |
389 | + MacroLoadNecRegisterFromFile(fp,NEC_CS); | |
390 | + MacroLoadNecRegisterFromFile(fp,NEC_DS); | |
391 | + MacroLoadNecRegisterFromFile(fp,NEC_ES); | |
392 | + MacroLoadNecRegisterFromFile(fp,NEC_SS); | |
393 | + MacroLoadNecRegisterFromFile(fp,NEC_IX); | |
394 | + MacroLoadNecRegisterFromFile(fp,NEC_IY); | |
395 | + MacroLoadNecRegisterFromFile(fp,NEC_BP); | |
396 | + MacroLoadNecRegisterFromFile(fp,NEC_SP); | |
397 | + MacroLoadNecRegisterFromFile(fp,NEC_FLAGS); | |
398 | + MacroLoadNecRegisterFromFile(fp,NEC_VECTOR); | |
399 | + MacroLoadNecRegisterFromFile(fp,NEC_PENDING); | |
400 | + MacroLoadNecRegisterFromFile(fp,NEC_NMI_STATE); | |
401 | + MacroLoadNecRegisterFromFile(fp,NEC_IRQ_STATE); | |
402 | + fread(IRAM, sizeof(BYTE), 0x10000, fp); | |
403 | + fread(IO, sizeof(BYTE), 0x100, fp); | |
404 | + for (i =0; i < RAMBanks; i++) | |
405 | + { | |
406 | + if (RAMSize < 0x10000) | |
407 | + { | |
408 | + fread(RAMMap[i], 1, RAMSize, fp); | |
409 | + } | |
410 | + else | |
411 | + { | |
412 | + fread(RAMMap[i], 1, 0x10000, fp); | |
413 | + } | |
414 | + } | |
415 | + fread(Palette, sizeof(WORD), 16 * 16, fp); | |
416 | + fclose(fp); | |
417 | + WriteIO(0xC1, IO[0xC1]); | |
418 | + WriteIO(0xC2, IO[0xC2]); | |
419 | + WriteIO(0xC3, IO[0xC3]); | |
420 | + WriteIO(0xC0, IO[0xC0]); | |
421 | + for (i = 0x80; i <= 0x90; i++) | |
422 | + { | |
423 | + WriteIO(i, IO[i]); | |
424 | + } | |
425 | +} | |
426 | + | |
427 | +#define MacroStoreNecRegisterToFile(F,R) \ | |
428 | + value = nec_get_reg(R); \ | |
429 | + fwrite(&value, sizeof(unsigned int), 1, fp); | |
430 | +void WsSaveState(int num) | |
431 | +{ | |
432 | + FILE* fp; | |
433 | + wchar_t buf[512]; | |
434 | + unsigned int value; | |
435 | + int i; | |
436 | + | |
437 | + if (StateName[0] == '\0') | |
438 | + { | |
439 | + return; | |
440 | + } | |
441 | + wsprintf(buf, L"%s.%03d", StateName, num); | |
442 | + if ((fp = _wfopen(buf, L"wb")) == NULL) | |
443 | + { | |
444 | + return; | |
445 | + } | |
446 | + MacroStoreNecRegisterToFile(fp,NEC_IP); | |
447 | + MacroStoreNecRegisterToFile(fp,NEC_AW); | |
448 | + MacroStoreNecRegisterToFile(fp,NEC_BW); | |
449 | + MacroStoreNecRegisterToFile(fp,NEC_CW); | |
450 | + MacroStoreNecRegisterToFile(fp,NEC_DW); | |
451 | + MacroStoreNecRegisterToFile(fp,NEC_CS); | |
452 | + MacroStoreNecRegisterToFile(fp,NEC_DS); | |
453 | + MacroStoreNecRegisterToFile(fp,NEC_ES); | |
454 | + MacroStoreNecRegisterToFile(fp,NEC_SS); | |
455 | + MacroStoreNecRegisterToFile(fp,NEC_IX); | |
456 | + MacroStoreNecRegisterToFile(fp,NEC_IY); | |
457 | + MacroStoreNecRegisterToFile(fp,NEC_BP); | |
458 | + MacroStoreNecRegisterToFile(fp,NEC_SP); | |
459 | + MacroStoreNecRegisterToFile(fp,NEC_FLAGS); | |
460 | + MacroStoreNecRegisterToFile(fp,NEC_VECTOR); | |
461 | + MacroStoreNecRegisterToFile(fp,NEC_PENDING); | |
462 | + MacroStoreNecRegisterToFile(fp,NEC_NMI_STATE); | |
463 | + MacroStoreNecRegisterToFile(fp,NEC_IRQ_STATE); | |
464 | + fwrite(IRAM, sizeof(BYTE), 0x10000, fp); | |
465 | + fwrite(IO, sizeof(BYTE), 0x100, fp); | |
466 | + for (i =0; i < RAMBanks; i++) | |
467 | + { | |
468 | + if (RAMSize < 0x10000) | |
469 | + { | |
470 | + fwrite(RAMMap[i], 1, RAMSize, fp); | |
471 | + } | |
472 | + else | |
473 | + { | |
474 | + fwrite(RAMMap[i], 1, 0x10000, fp); | |
475 | + } | |
476 | + } | |
477 | + fwrite(Palette, sizeof(WORD), 16 * 16, fp); | |
478 | + fclose(fp); | |
479 | +} | |
480 | + |
@@ -1,947 +0,0 @@ | ||
1 | -/**************************************************************************** | |
2 | - | |
3 | - NEC V30MZ(V20/V30/V33) emulator | |
4 | - | |
5 | - Small changes made by toshi (Cycle count macros changed , "THROUGH" macro added) | |
6 | - | |
7 | - Small changes made by dox@space.pl (Corrected bug in NEG instruction , different AUX flag handling in some opcodes) | |
8 | - | |
9 | - (Re)Written June-September 2000 by Bryan McPhail (mish@tendril.co.uk) based | |
10 | - on code by Oliver Bergmann (Raul_Bloodworth@hotmail.com) who based code | |
11 | - on the i286 emulator by Fabrice Frances which had initial work based on | |
12 | - David Hedley's pcemu(!). | |
13 | - | |
14 | - This new core features 99% accurate cycle counts for each processor, | |
15 | - there are still some complex situations where cycle counts are wrong, | |
16 | - typically where a few instructions have differing counts for odd/even | |
17 | - source and odd/even destination memory operands. | |
18 | - | |
19 | - Flag settings are also correct for the NEC processors rather than the | |
20 | - I86 versions. | |
21 | - | |
22 | - Nb: This emulation should be faster than previous NEC cores, but | |
23 | - because the old cycle count values were far too high in many cases | |
24 | - the processor has to do more 'work' than before, so the overall effect | |
25 | - may be a slower core. | |
26 | - | |
27 | -****************************************************************************/ | |
28 | - | |
29 | - | |
30 | -#include <stdio.h> | |
31 | -#include <string.h> | |
32 | -#include <windows.h> | |
33 | - | |
34 | -#define UINT8 unsigned char | |
35 | -#define UINT16 unsigned short | |
36 | -#define UINT32 unsigned int | |
37 | -#define INT8 signed char | |
38 | -#define INT16 signed short | |
39 | -#define INT32 signed int | |
40 | - | |
41 | -#include "nec.h" | |
42 | -#include "necintrf.h" | |
43 | - | |
44 | -typedef union | |
45 | -{ /* eight general registers */ | |
46 | - UINT16 w[8]; /* viewed as 16 bits registers */ | |
47 | - UINT8 b[16]; /* or as 8 bit registers */ | |
48 | -} necbasicregs; | |
49 | - | |
50 | -typedef struct | |
51 | -{ | |
52 | - necbasicregs regs; | |
53 | - UINT16 sregs[4]; | |
54 | - | |
55 | - UINT16 ip; | |
56 | - | |
57 | - INT32 SignVal; | |
58 | - UINT32 AuxVal, OverVal, ZeroVal, CarryVal, ParityVal; /* 0 or non-0 valued flags */ | |
59 | - UINT8 TF, IF, DF, MF; /* 0 or 1 valued flags */ /* OB[19.07.99] added Mode Flag V30 */ | |
60 | - UINT32 int_vector; | |
61 | - UINT32 pending_irq; | |
62 | - UINT32 nmi_state; | |
63 | - UINT32 irq_state; | |
64 | - int (*irq_callback)(int irqline); | |
65 | -} nec_Regs; | |
66 | - | |
67 | -/***************************************************************************/ | |
68 | -/* cpu state */ | |
69 | -/***************************************************************************/ | |
70 | - | |
71 | -int nec_ICount; | |
72 | - | |
73 | -static nec_Regs I; | |
74 | - | |
75 | -static UINT32 cpu_type; | |
76 | -static UINT32 prefix_base; /* base address of the latest prefix segment */ | |
77 | -char seg_prefix; /* prefix segment indicator */ | |
78 | - | |
79 | - | |
80 | -/* The interrupt number of a pending external interrupt pending NMI is 2. */ | |
81 | -/* For INTR interrupts, the level is caught on the bus during an INTA cycle */ | |
82 | - | |
83 | - | |
84 | -#include "necinstr.h" | |
85 | -#include "necea.h" | |
86 | -#include "necmodrm.h" | |
87 | - | |
88 | -static int no_interrupt; | |
89 | - | |
90 | -static UINT8 parity_table[256]; | |
91 | - | |
92 | -/***************************************************************************/ | |
93 | - | |
94 | -void nec_reset (void *param) | |
95 | -{ | |
96 | - unsigned int i,j,c; | |
97 | - BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH }; | |
98 | - | |
99 | - | |
100 | - memset( &I, 0, sizeof(I) ); | |
101 | - | |
102 | - no_interrupt=0; | |
103 | - I.sregs[CS] = 0xffff; | |
104 | - | |
105 | - | |
106 | - for (i = 0;i < 256; i++) | |
107 | - { | |
108 | - for (j = i, c = 0; j > 0; j >>= 1) | |
109 | - if (j & 1) c++; | |
110 | - parity_table[i] = !(c & 1); | |
111 | - } | |
112 | - | |
113 | - I.ZeroVal = I.ParityVal = 1; | |
114 | - SetMD(1); /* set the mode-flag = native mode */ | |
115 | - | |
116 | - for (i = 0; i < 256; i++) | |
117 | - { | |
118 | - Mod_RM.reg.b[i] = reg_name[(i & 0x38) >> 3]; | |
119 | - Mod_RM.reg.w[i] = (WREGS) ( (i & 0x38) >> 3) ; | |
120 | - } | |
121 | - | |
122 | - for (i = 0xc0; i < 0x100; i++) | |
123 | - { | |
124 | - Mod_RM.RM.w[i] = (WREGS)( i & 7 ); | |
125 | - Mod_RM.RM.b[i] = (BREGS)reg_name[i & 7]; | |
126 | - } | |
127 | -} | |
128 | - | |
129 | -void nec_exit (void) | |
130 | -{ | |
131 | - | |
132 | -} | |
133 | - | |
134 | - | |
135 | - | |
136 | - | |
137 | -void nec_int(DWORD wektor) | |
138 | -{ | |
139 | - | |
140 | - DWORD dest_seg, dest_off; | |
141 | - | |
142 | - if(I.IF) | |
143 | - { | |
144 | - i_pushf(); | |
145 | - I.TF = I.IF = 0; | |
146 | - dest_off = ReadWord(wektor); | |
147 | - dest_seg = ReadWord(wektor+2); | |
148 | - PUSH(I.sregs[CS]); | |
149 | - PUSH(I.ip); | |
150 | - I.ip = (WORD)dest_off; | |
151 | - I.sregs[CS] = (WORD)dest_seg; | |
152 | - } | |
153 | -} | |
154 | - | |
155 | -static void nec_interrupt(unsigned int_num,BOOLEAN md_flag) | |
156 | -{ | |
157 | - UINT32 dest_seg, dest_off; | |
158 | - | |
159 | - if (int_num == -1) | |
160 | - return; | |
161 | - | |
162 | - i_pushf(); | |
163 | - I.TF = I.IF = 0; | |
164 | - | |
165 | - | |
166 | - dest_off = ReadWord((int_num)*4); | |
167 | - dest_seg = ReadWord((int_num)*4+2); | |
168 | - | |
169 | - PUSH(I.sregs[CS]); | |
170 | - PUSH(I.ip); | |
171 | - I.ip = (WORD)dest_off; | |
172 | - I.sregs[CS] = (WORD)dest_seg; | |
173 | - | |
174 | -} | |
175 | - | |
176 | - | |
177 | -/****************************************************************************/ | |
178 | -/* OPCODES */ | |
179 | -/****************************************************************************/ | |
180 | - | |
181 | -#define OP(num,func_name) static void func_name(void) | |
182 | - | |
183 | - | |
184 | -OP( 0x00, i_add_br8 ) { DEF_br8; ADDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
185 | -OP( 0x01, i_add_wr16 ) { DEF_wr16; ADDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
186 | -OP( 0x02, i_add_r8b ) { DEF_r8b; ADDB; RegByte(ModRM)=dst; CLKM(2,1); } | |
187 | -OP( 0x03, i_add_r16w ) { DEF_r16w; ADDW; RegWord(ModRM)=dst; CLKM(2,1); } | |
188 | -OP( 0x04, i_add_ald8 ) { DEF_ald8; ADDB; I.regs.b[AL]=dst; CLK(1); } | |
189 | -OP( 0x05, i_add_axd16) { DEF_axd16; ADDW; I.regs.w[AW]=dst; CLK(1); } | |
190 | -OP( 0x06, i_push_es ) { PUSH(I.sregs[ES]); CLK(2); } | |
191 | -OP( 0x07, i_pop_es ) { POP(I.sregs[ES]); CLK(3); } | |
192 | - | |
193 | -OP( 0x08, i_or_br8 ) { DEF_br8; ORB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
194 | -OP( 0x09, i_or_wr16 ) { DEF_wr16; ORW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
195 | -OP( 0x0a, i_or_r8b ) { DEF_r8b; ORB; RegByte(ModRM)=dst; CLKM(2,1); } | |
196 | -OP( 0x0b, i_or_r16w ) { DEF_r16w; ORW; RegWord(ModRM)=dst; CLKM(2,1); } | |
197 | -OP( 0x0c, i_or_ald8 ) { DEF_ald8; ORB; I.regs.b[AL]=dst; CLK(1); } | |
198 | -OP( 0x0d, i_or_axd16 ) { DEF_axd16; ORW; I.regs.w[AW]=dst; CLK(1); } | |
199 | -OP( 0x0e, i_push_cs ) { PUSH(I.sregs[CS]); CLK(2); } | |
200 | -OP( 0x0f, i_pre_nec ) { UINT32 ModRM, tmp, tmp2; /* pop cs at V30MZ? */ | |
201 | - switch (FETCH) { | |
202 | - case 0x10 : BITOP_BYTE; CLKS(3,3,4); tmp2 = I.regs.b[CL] & 0x7; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
203 | - case 0x11 : BITOP_WORD; CLKS(3,3,4); tmp2 = I.regs.b[CL] & 0xf; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
204 | - case 0x12 : BITOP_BYTE; CLKS(5,5,4); tmp2 = I.regs.b[CL] & 0x7; tmp &= ~(1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Clr */ | |
205 | - case 0x13 : BITOP_WORD; CLKS(5,5,4); tmp2 = I.regs.b[CL] & 0xf; tmp &= ~(1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Clr */ | |
206 | - case 0x14 : BITOP_BYTE; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0x7; tmp |= (1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Set */ | |
207 | - case 0x15 : BITOP_WORD; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0xf; tmp |= (1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Set */ | |
208 | - case 0x16 : BITOP_BYTE; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0x7; BIT_NOT; PutbackRMByte(ModRM,tmp); break; /* Not */ | |
209 | - case 0x17 : BITOP_WORD; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0xf; BIT_NOT; PutbackRMWord(ModRM,tmp); break; /* Not */ | |
210 | - | |
211 | - case 0x18 : BITOP_BYTE; CLKS(4,4,4); tmp2 = (FETCH) & 0x7; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
212 | - case 0x19 : BITOP_WORD; CLKS(4,4,4); tmp2 = (FETCH) & 0xf; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
213 | - case 0x1a : BITOP_BYTE; CLKS(6,6,4); tmp2 = (FETCH) & 0x7; tmp &= ~(1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Clr */ | |
214 | - case 0x1b : BITOP_WORD; CLKS(6,6,4); tmp2 = (FETCH) & 0xf; tmp &= ~(1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Clr */ | |
215 | - case 0x1c : BITOP_BYTE; CLKS(5,5,4); tmp2 = (FETCH) & 0x7; tmp |= (1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Set */ | |
216 | - case 0x1d : BITOP_WORD; CLKS(5,5,4); tmp2 = (FETCH) & 0xf; tmp |= (1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Set */ | |
217 | - case 0x1e : BITOP_BYTE; CLKS(5,5,4); tmp2 = (FETCH) & 0x7; BIT_NOT; PutbackRMByte(ModRM,tmp); break; /* Not */ | |
218 | - case 0x1f : BITOP_WORD; CLKS(5,5,4); tmp2 = (FETCH) & 0xf; BIT_NOT; PutbackRMWord(ModRM,tmp); break; /* Not */ | |
219 | - | |
220 | - case 0x20 : ADD4S; CLKS(7,7,2); break; | |
221 | - case 0x22 : SUB4S; CLKS(7,7,2); break; | |
222 | - case 0x26 : CMP4S; CLKS(7,7,2); break; | |
223 | - case 0x28 : ModRM = FETCH; tmp = GetRMByte(ModRM); tmp <<= 4; tmp |= I.regs.b[AL] & 0xf; I.regs.b[AL] = (I.regs.b[AL] & 0xf0) | ((tmp>>8)&0xf); tmp &= 0xff; PutbackRMByte(ModRM,tmp); CLKM(9,15); break; | |
224 | - case 0x2a : ModRM = FETCH; tmp = GetRMByte(ModRM); tmp2 = (I.regs.b[AL] & 0xf)<<4; I.regs.b[AL] = (I.regs.b[AL] & 0xf0) | (tmp&0xf); tmp = tmp2 | (tmp>>4); PutbackRMByte(ModRM,tmp); CLKM(13,19); break; | |
225 | - case 0x31 : ModRM = FETCH; ModRM=0; break; | |
226 | - case 0x33 : ModRM = FETCH; ModRM=0; break; | |
227 | - case 0x92 : CLK(2); break; /* V25/35 FINT */ | |
228 | - case 0xe0 : ModRM = FETCH; ModRM=0; break; | |
229 | - case 0xf0 : ModRM = FETCH; ModRM=0; break; | |
230 | - case 0xff : ModRM = FETCH; ModRM=0; break; | |
231 | - default: break; | |
232 | - } | |
233 | -} | |
234 | - | |
235 | -OP( 0x10, i_adc_br8 ) { DEF_br8; src+=CF; ADDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
236 | -OP( 0x11, i_adc_wr16 ) { DEF_wr16; src+=CF; ADDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
237 | -OP( 0x12, i_adc_r8b ) { DEF_r8b; src+=CF; ADDB; RegByte(ModRM)=dst; CLKM(2,1); } | |
238 | -OP( 0x13, i_adc_r16w ) { DEF_r16w; src+=CF; ADDW; RegWord(ModRM)=dst; CLKM(2,1); } | |
239 | -OP( 0x14, i_adc_ald8 ) { DEF_ald8; src+=CF; ADDB; I.regs.b[AL]=dst; CLK(1); } | |
240 | -OP( 0x15, i_adc_axd16) { DEF_axd16; src+=CF; ADDW; I.regs.w[AW]=dst; CLK(1); } | |
241 | -OP( 0x16, i_push_ss ) { PUSH(I.sregs[SS]); CLK(2); } | |
242 | -OP( 0x17, i_pop_ss ) { POP(I.sregs[SS]); CLK(3); no_interrupt=1; } | |
243 | - | |
244 | -OP( 0x18, i_sbb_br8 ) { DEF_br8; src+=CF; SUBB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
245 | -OP( 0x19, i_sbb_wr16 ) { DEF_wr16; src+=CF; SUBW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
246 | -OP( 0x1a, i_sbb_r8b ) { DEF_r8b; src+=CF; SUBB; RegByte(ModRM)=dst; CLKM(2,1); } | |
247 | -OP( 0x1b, i_sbb_r16w ) { DEF_r16w; src+=CF; SUBW; RegWord(ModRM)=dst; CLKM(2,1); } | |
248 | -OP( 0x1c, i_sbb_ald8 ) { DEF_ald8; src+=CF; SUBB; I.regs.b[AL]=dst; CLK(1); } | |
249 | -OP( 0x1d, i_sbb_axd16) { DEF_axd16; src+=CF; SUBW; I.regs.w[AW]=dst; CLK(1); } | |
250 | -OP( 0x1e, i_push_ds ) { PUSH(I.sregs[DS]); CLK(2); } | |
251 | -OP( 0x1f, i_pop_ds ) { POP(I.sregs[DS]); CLK(3); } | |
252 | - | |
253 | -OP( 0x20, i_and_br8 ) { DEF_br8; ANDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
254 | -OP( 0x21, i_and_wr16 ) { DEF_wr16; ANDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
255 | -OP( 0x22, i_and_r8b ) { DEF_r8b; ANDB; RegByte(ModRM)=dst; CLKM(2,1); } | |
256 | -OP( 0x23, i_and_r16w ) { DEF_r16w; ANDW; RegWord(ModRM)=dst; CLKM(2,1); } | |
257 | -OP( 0x24, i_and_ald8 ) { DEF_ald8; ANDB; I.regs.b[AL]=dst; CLK(1); } | |
258 | -OP( 0x25, i_and_axd16) { DEF_axd16; ANDW; I.regs.w[AW]=dst; CLK(1); } | |
259 | -OP( 0x26, i_es ) { seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
260 | -OP( 0x27, i_daa ) { ADJ4(6,0x60); CLK(10); } | |
261 | - | |
262 | -OP( 0x28, i_sub_br8 ) { DEF_br8; SUBB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
263 | -OP( 0x29, i_sub_wr16 ) { DEF_wr16; SUBW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
264 | -OP( 0x2a, i_sub_r8b ) { DEF_r8b; SUBB; RegByte(ModRM)=dst; CLKM(2,1); } | |
265 | -OP( 0x2b, i_sub_r16w ) { DEF_r16w; SUBW; RegWord(ModRM)=dst; CLKM(2,1); } | |
266 | -OP( 0x2c, i_sub_ald8 ) { DEF_ald8; SUBB; I.regs.b[AL]=dst; CLK(1); } | |
267 | -OP( 0x2d, i_sub_axd16) { DEF_axd16; SUBW; I.regs.w[AW]=dst; CLK(1); } | |
268 | -OP( 0x2e, i_cs ) { seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
269 | -OP( 0x2f, i_das ) { ADJ4(-6,-0x60); CLK(10); } | |
270 | - | |
271 | -OP( 0x30, i_xor_br8 ) { DEF_br8; XORB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
272 | -OP( 0x31, i_xor_wr16 ) { DEF_wr16; XORW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
273 | -OP( 0x32, i_xor_r8b ) { DEF_r8b; XORB; RegByte(ModRM)=dst; CLKM(2,1); } | |
274 | -OP( 0x33, i_xor_r16w ) { DEF_r16w; XORW; RegWord(ModRM)=dst; CLKM(2,1); } | |
275 | -OP( 0x34, i_xor_ald8 ) { DEF_ald8; XORB; I.regs.b[AL]=dst; CLK(1); } | |
276 | -OP( 0x35, i_xor_axd16) { DEF_axd16; XORW; I.regs.w[AW]=dst; CLK(1); } | |
277 | -OP( 0x36, i_ss ) { seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
278 | -OP( 0x37, i_aaa ) { ADJB(6,1); CLK(9); } | |
279 | - | |
280 | -OP( 0x38, i_cmp_br8 ) { DEF_br8; SUBB; CLKM(2,1); } | |
281 | -OP( 0x39, i_cmp_wr16 ) { DEF_wr16; SUBW; CLKM(2,1); } | |
282 | -OP( 0x3a, i_cmp_r8b ) { DEF_r8b; SUBB; CLKM(2,1); } | |
283 | -OP( 0x3b, i_cmp_r16w ) { DEF_r16w; SUBW; CLKM(2,1); } | |
284 | -OP( 0x3c, i_cmp_ald8 ) { DEF_ald8; SUBB; CLK(1); } | |
285 | -OP( 0x3d, i_cmp_axd16) { DEF_axd16; SUBW; CLK(1); } | |
286 | -OP( 0x3e, i_ds ) { seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
287 | -OP( 0x3f, i_aas ) { ADJB(-6,-1); CLK(9); } | |
288 | - | |
289 | -OP( 0x40, i_inc_ax ) { IncWordReg(AW); CLK(1); } | |
290 | -OP( 0x41, i_inc_cx ) { IncWordReg(CW); CLK(1); } | |
291 | -OP( 0x42, i_inc_dx ) { IncWordReg(DW); CLK(1); } | |
292 | -OP( 0x43, i_inc_bx ) { IncWordReg(BW); CLK(1); } | |
293 | -OP( 0x44, i_inc_sp ) { IncWordReg(SP); CLK(1); } | |
294 | -OP( 0x45, i_inc_bp ) { IncWordReg(BP); CLK(1); } | |
295 | -OP( 0x46, i_inc_si ) { IncWordReg(IX); CLK(1); } | |
296 | -OP( 0x47, i_inc_di ) { IncWordReg(IY); CLK(1); } | |
297 | - | |
298 | -OP( 0x48, i_dec_ax ) { DecWordReg(AW); CLK(1); } | |
299 | -OP( 0x49, i_dec_cx ) { DecWordReg(CW); CLK(1); } | |
300 | -OP( 0x4a, i_dec_dx ) { DecWordReg(DW); CLK(1); } | |
301 | -OP( 0x4b, i_dec_bx ) { DecWordReg(BW); CLK(1); } | |
302 | -OP( 0x4c, i_dec_sp ) { DecWordReg(SP); CLK(1); } | |
303 | -OP( 0x4d, i_dec_bp ) { DecWordReg(BP); CLK(1); } | |
304 | -OP( 0x4e, i_dec_si ) { DecWordReg(IX); CLK(1); } | |
305 | -OP( 0x4f, i_dec_di ) { DecWordReg(IY); CLK(1); } | |
306 | - | |
307 | -OP( 0x50, i_push_ax ) { PUSH(I.regs.w[AW]); CLK(1); } | |
308 | -OP( 0x51, i_push_cx ) { PUSH(I.regs.w[CW]); CLK(1); } | |
309 | -OP( 0x52, i_push_dx ) { PUSH(I.regs.w[DW]); CLK(1); } | |
310 | -OP( 0x53, i_push_bx ) { PUSH(I.regs.w[BW]); CLK(1); } | |
311 | -OP( 0x54, i_push_sp ) { PUSH(I.regs.w[SP]); CLK(1); } | |
312 | -OP( 0x55, i_push_bp ) { PUSH(I.regs.w[BP]); CLK(1); } | |
313 | -OP( 0x56, i_push_si ) { PUSH(I.regs.w[IX]); CLK(1); } | |
314 | -OP( 0x57, i_push_di ) { PUSH(I.regs.w[IY]); CLK(1); } | |
315 | - | |
316 | -OP( 0x58, i_pop_ax ) { POP(I.regs.w[AW]); CLK(1); } | |
317 | -OP( 0x59, i_pop_cx ) { POP(I.regs.w[CW]); CLK(1); } | |
318 | -OP( 0x5a, i_pop_dx ) { POP(I.regs.w[DW]); CLK(1); } | |
319 | -OP( 0x5b, i_pop_bx ) { POP(I.regs.w[BW]); CLK(1); } | |
320 | -OP( 0x5c, i_pop_sp ) { POP(I.regs.w[SP]); CLK(1); } | |
321 | -OP( 0x5d, i_pop_bp ) { POP(I.regs.w[BP]); CLK(1); } | |
322 | -OP( 0x5e, i_pop_si ) { POP(I.regs.w[IX]); CLK(1); } | |
323 | -OP( 0x5f, i_pop_di ) { POP(I.regs.w[IY]); CLK(1); } | |
324 | - | |
325 | -OP( 0x60, i_pusha ) { | |
326 | - unsigned tmp=I.regs.w[SP]; | |
327 | - PUSH(I.regs.w[AW]); | |
328 | - PUSH(I.regs.w[CW]); | |
329 | - PUSH(I.regs.w[DW]); | |
330 | - PUSH(I.regs.w[BW]); | |
331 | - PUSH(tmp); | |
332 | - PUSH(I.regs.w[BP]); | |
333 | - PUSH(I.regs.w[IX]); | |
334 | - PUSH(I.regs.w[IY]); | |
335 | - CLK(9); | |
336 | -} | |
337 | -OP( 0x61, i_popa ) { | |
338 | - unsigned tmp; | |
339 | - POP(I.regs.w[IY]); | |
340 | - POP(I.regs.w[IX]); | |
341 | - POP(I.regs.w[BP]); | |
342 | - POP(tmp); | |
343 | - POP(I.regs.w[BW]); | |
344 | - POP(I.regs.w[DW]); | |
345 | - POP(I.regs.w[CW]); | |
346 | - POP(I.regs.w[AW]); | |
347 | - CLK(8); | |
348 | -} | |
349 | -OP( 0x62, i_chkind ) { | |
350 | - UINT32 low,high,tmp; | |
351 | - GetModRM; | |
352 | - low = GetRMWord(ModRM); | |
353 | - high= GetnextRMWord; | |
354 | - tmp= RegWord(ModRM); | |
355 | - if (tmp<low || tmp>high) { | |
356 | - nec_interrupt(5,0); | |
357 | - CLK(7); | |
358 | - } | |
359 | - CLK(13); | |
360 | -} | |
361 | - | |
362 | -/* OP 0x64 - 0x67 is nop at V30MZ */ | |
363 | -OP( 0x64, i_repnc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
364 | - switch(next) { /* Segments */ | |
365 | - case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
366 | - case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
367 | - case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
368 | - case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
369 | - } | |
370 | - | |
371 | - switch(next) { | |
372 | - case 0x6c: CLK(2); if (c) do { i_insb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
373 | - case 0x6d: CLK(2); if (c) do { i_insw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
374 | - case 0x6e: CLK(2); if (c) do { i_outsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
375 | - case 0x6f: CLK(2); if (c) do { i_outsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
376 | - case 0xa4: CLK(2); if (c) do { i_movsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
377 | - case 0xa5: CLK(2); if (c) do { i_movsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
378 | - case 0xa6: CLK(2); if (c) do { i_cmpsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
379 | - case 0xa7: CLK(2); if (c) do { i_cmpsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
380 | - case 0xaa: CLK(2); if (c) do { i_stosb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
381 | - case 0xab: CLK(2); if (c) do { i_stosw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
382 | - case 0xac: CLK(2); if (c) do { i_lodsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
383 | - case 0xad: CLK(2); if (c) do { i_lodsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
384 | - case 0xae: CLK(2); if (c) do { i_scasb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
385 | - case 0xaf: CLK(2); if (c) do { i_scasw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
386 | - default: nec_instruction[next](); | |
387 | - } | |
388 | - seg_prefix=FALSE; | |
389 | -} | |
390 | - | |
391 | -OP( 0x65, i_repc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
392 | - switch(next) { /* Segments */ | |
393 | - case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
394 | - case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
395 | - case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
396 | - case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
397 | - } | |
398 | - | |
399 | - switch(next) { | |
400 | - case 0x6c: CLK(2); if (c) do { i_insb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
401 | - case 0x6d: CLK(2); if (c) do { i_insw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
402 | - case 0x6e: CLK(2); if (c) do { i_outsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
403 | - case 0x6f: CLK(2); if (c) do { i_outsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
404 | - case 0xa4: CLK(2); if (c) do { i_movsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
405 | - case 0xa5: CLK(2); if (c) do { i_movsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
406 | - case 0xa6: CLK(2); if (c) do { i_cmpsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
407 | - case 0xa7: CLK(2); if (c) do { i_cmpsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
408 | - case 0xaa: CLK(2); if (c) do { i_stosb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
409 | - case 0xab: CLK(2); if (c) do { i_stosw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
410 | - case 0xac: CLK(2); if (c) do { i_lodsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
411 | - case 0xad: CLK(2); if (c) do { i_lodsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
412 | - case 0xae: CLK(2); if (c) do { i_scasb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
413 | - case 0xaf: CLK(2); if (c) do { i_scasw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
414 | - default: nec_instruction[next](); | |
415 | - } | |
416 | - seg_prefix=FALSE; | |
417 | -} | |
418 | - | |
419 | -OP( 0x68, i_push_d16 ) { UINT32 tmp; FETCHWORD(tmp); PUSH(tmp); CLK(1); } | |
420 | -OP( 0x69, i_imul_d16 ) { UINT32 tmp; DEF_r16w; FETCHWORD(tmp); dst = (INT32)((INT16)src)*(INT32)((INT16)tmp); I.CarryVal = I.OverVal = (((INT32)dst) >> 15 != 0) && (((INT32)dst) >> 15 != -1); RegWord(ModRM)=(WORD)dst; CLKM(4,3);} | |
421 | -OP( 0x6a, i_push_d8 ) { UINT32 tmp = (WORD)((INT16)((INT8)FETCH)); PUSH(tmp); CLK(1); } | |
422 | -OP( 0x6b, i_imul_d8 ) { UINT32 src2; DEF_r16w; src2= (WORD)((INT16)((INT8)FETCH)); dst = (INT32)((INT16)src)*(INT32)((INT16)src2); I.CarryVal = I.OverVal = (((INT32)dst) >> 15 != 0) && (((INT32)dst) >> 15 != -1); RegWord(ModRM)=(WORD)dst; CLKM(4,3); } | |
423 | -OP( 0x6c, i_insb ) { PutMemB(ES,I.regs.w[IY],read_port(I.regs.w[DW])); I.regs.w[IY]+= -2 * I.DF + 1; CLK(6); } | |
424 | -OP( 0x6d, i_insw ) { PutMemB(ES,I.regs.w[IY],read_port(I.regs.w[DW])); PutMemB(ES,(I.regs.w[IY]+1)&0xffff,read_port((I.regs.w[DW]+1)&0xffff)); I.regs.w[IY]+= -4 * I.DF + 2; CLK(6); } | |
425 | -OP( 0x6e, i_outsb ) { write_port(I.regs.w[DW],GetMemB(DS,I.regs.w[IX])); I.regs.w[IX]+= -2 * I.DF + 1; CLK(7); } | |
426 | -OP( 0x6f, i_outsw ) { write_port(I.regs.w[DW],GetMemB(DS,I.regs.w[IX])); write_port((I.regs.w[DW]+1)&0xffff,GetMemB(DS,(I.regs.w[IX]+1)&0xffff)); I.regs.w[IX]+= -4 * I.DF + 2; CLK(7); } | |
427 | - | |
428 | -OP( 0x70, i_jo ) { JMP( OF); CLK(1); } | |
429 | -OP( 0x71, i_jno ) { JMP(!OF); CLK(1); } | |
430 | -OP( 0x72, i_jc ) { JMP( CF); CLK(1); } | |
431 | -OP( 0x73, i_jnc ) { JMP(!CF); CLK(1); } | |
432 | -OP( 0x74, i_jz ) { JMP( ZF); CLK(1); } | |
433 | -OP( 0x75, i_jnz ) { JMP(!ZF); CLK(1); } | |
434 | -OP( 0x76, i_jce ) { JMP(CF || ZF); CLK(1); } | |
435 | -OP( 0x77, i_jnce ) { JMP(!(CF || ZF)); CLK(1); } | |
436 | -OP( 0x78, i_js ) { JMP( SF); CLK(1); } | |
437 | -OP( 0x79, i_jns ) { JMP(!SF); CLK(1); } | |
438 | -OP( 0x7a, i_jp ) { JMP( PF); CLK(1); } | |
439 | -OP( 0x7b, i_jnp ) { JMP(!PF); CLK(1); } | |
440 | -OP( 0x7c, i_jl ) { JMP((SF!=OF)&&(!ZF)); CLK(1); } | |
441 | -OP( 0x7d, i_jnl ) { JMP((ZF)||(SF==OF)); CLK(1); } | |
442 | -OP( 0x7e, i_jle ) { JMP((ZF)||(SF!=OF)); CLK(1); } | |
443 | -OP( 0x7f, i_jnle ) { JMP((SF==OF)&&(!ZF)); CLK(1); } | |
444 | - | |
445 | -OP( 0x80, i_80pre ) { UINT32 dst, src; GetModRM; dst = GetRMByte(ModRM); src = FETCH; | |
446 | - CLKM(3,1) | |
447 | - switch (ModRM & 0x38) { | |
448 | - case 0x00: ADDB; PutbackRMByte(ModRM,dst); break; | |
449 | - case 0x08: ORB; PutbackRMByte(ModRM,dst); break; | |
450 | - case 0x10: src+=CF; ADDB; PutbackRMByte(ModRM,dst); break; | |
451 | - case 0x18: src+=CF; SUBB; PutbackRMByte(ModRM,dst); break; | |
452 | - case 0x20: ANDB; PutbackRMByte(ModRM,dst); break; | |
453 | - case 0x28: SUBB; PutbackRMByte(ModRM,dst); break; | |
454 | - case 0x30: XORB; PutbackRMByte(ModRM,dst); break; | |
455 | - case 0x38: SUBB; break; /* CMP */ | |
456 | - } | |
457 | -} | |
458 | - | |
459 | -OP( 0x81, i_81pre ) { UINT32 dst, src; GetModRM; dst = GetRMWord(ModRM); src = FETCH; src+= (FETCH << 8); | |
460 | - CLKM(3,1) | |
461 | - switch (ModRM & 0x38) { | |
462 | - case 0x00: ADDW; PutbackRMWord(ModRM,dst); break; | |
463 | - case 0x08: ORW; PutbackRMWord(ModRM,dst); break; | |
464 | - case 0x10: src+=CF; ADDW; PutbackRMWord(ModRM,dst); break; | |
465 | - case 0x18: src+=CF; SUBW; PutbackRMWord(ModRM,dst); break; | |
466 | - case 0x20: ANDW; PutbackRMWord(ModRM,dst); break; | |
467 | - case 0x28: SUBW; PutbackRMWord(ModRM,dst); break; | |
468 | - case 0x30: XORW; PutbackRMWord(ModRM,dst); break; | |
469 | - case 0x38: SUBW; break; /* CMP */ | |
470 | - } | |
471 | -} | |
472 | - | |
473 | -OP( 0x82, i_82pre ) { UINT32 dst, src; GetModRM; dst = GetRMByte(ModRM); src = (BYTE)((INT8)FETCH); | |
474 | - CLKM(3,1) | |
475 | - switch (ModRM & 0x38) { | |
476 | - case 0x00: ADDB; PutbackRMByte(ModRM,dst); break; | |
477 | - case 0x08: ORB; PutbackRMByte(ModRM,dst); break; | |
478 | - case 0x10: src+=CF; ADDB; PutbackRMByte(ModRM,dst); break; | |
479 | - case 0x18: src+=CF; SUBB; PutbackRMByte(ModRM,dst); break; | |
480 | - case 0x20: ANDB; PutbackRMByte(ModRM,dst); break; | |
481 | - case 0x28: SUBB; PutbackRMByte(ModRM,dst); break; | |
482 | - case 0x30: XORB; PutbackRMByte(ModRM,dst); break; | |
483 | - case 0x38: SUBB; break; /* CMP */ | |
484 | - } | |
485 | -} | |
486 | - | |
487 | -OP( 0x83, i_83pre ) { UINT32 dst, src; GetModRM; dst = GetRMWord(ModRM); src = (WORD)((INT16)((INT8)FETCH)); | |
488 | - CLKM(3,1) | |
489 | - switch (ModRM & 0x38) { | |
490 | - case 0x00: ADDW; PutbackRMWord(ModRM,dst); break; | |
491 | - case 0x08: ORW; PutbackRMWord(ModRM,dst); break; | |
492 | - case 0x10: src+=CF; ADDW; PutbackRMWord(ModRM,dst); break; | |
493 | - case 0x18: src+=CF; SUBW; PutbackRMWord(ModRM,dst); break; | |
494 | - case 0x20: ANDW; PutbackRMWord(ModRM,dst); break; | |
495 | - case 0x28: SUBW; PutbackRMWord(ModRM,dst); break; | |
496 | - case 0x30: XORW; PutbackRMWord(ModRM,dst); break; | |
497 | - case 0x38: SUBW; break; /* CMP */ | |
498 | - } | |
499 | -} | |
500 | - | |
501 | -OP( 0x84, i_test_br8 ) { DEF_br8; ANDB; CLKM(2,1); } | |
502 | -OP( 0x85, i_test_wr16 ) { DEF_wr16; ANDW; CLKM(2,1); } | |
503 | -OP( 0x86, i_xchg_br8 ) { DEF_br8; RegByte(ModRM)=dst; PutbackRMByte(ModRM,src); CLKM(5,3); } | |
504 | -OP( 0x87, i_xchg_wr16 ) { DEF_wr16; RegWord(ModRM)=dst; PutbackRMWord(ModRM,src); CLKM(5,3); } | |
505 | - | |
506 | -OP( 0x88, i_mov_br8 ) { UINT8 src; GetModRM; src = RegByte(ModRM); PutRMByte(ModRM,src); CLKM(1,1); } | |
507 | -OP( 0x89, i_mov_wr16 ) { UINT16 src; GetModRM; src = RegWord(ModRM); PutRMWord(ModRM,src); CLKM(1,1); } | |
508 | -OP( 0x8a, i_mov_r8b ) { UINT8 src; GetModRM; src = GetRMByte(ModRM); RegByte(ModRM)=src; CLKM(1,1); } | |
509 | -OP( 0x8b, i_mov_r16w ) { UINT16 src; GetModRM; src = GetRMWord(ModRM); RegWord(ModRM)=src; CLKM(1,1); } | |
510 | -OP( 0x8c, i_mov_wsreg ) { GetModRM; PutRMWord(ModRM,I.sregs[(ModRM & 0x38) >> 3]); CLKM(1,1); } | |
511 | -OP( 0x8d, i_lea ) { UINT16 ModRM = FETCH; (void)(*GetEA[ModRM])(); RegWord(ModRM)=EO; CLK(1); } | |
512 | -OP( 0x8e, i_mov_sregw ) { UINT16 src; GetModRM; src = GetRMWord(ModRM); CLKM(3,2); | |
513 | - switch (ModRM & 0x38) { | |
514 | - case 0x00: I.sregs[ES] = src; break; /* mov es,ew */ | |
515 | - case 0x08: I.sregs[CS] = src; break; /* mov cs,ew */ | |
516 | - case 0x10: I.sregs[SS] = src; break; /* mov ss,ew */ | |
517 | - case 0x18: I.sregs[DS] = src; break; /* mov ds,ew */ | |
518 | - default: ; | |
519 | - } | |
520 | - no_interrupt=1; | |
521 | -} | |
522 | -OP( 0x8f, i_popw ) { UINT16 tmp; GetModRM; POP(tmp); PutRMWord(ModRM,tmp); CLKM(3,1); } | |
523 | -OP( 0x90, i_nop ) { CLK(1); | |
524 | - /* Cycle skip for idle loops (0: NOP 1: JMP 0) */ | |
525 | - if (no_interrupt==0 && nec_ICount>0 && (PEEKOP((I.sregs[CS]<<4)+I.ip))==0xeb && (PEEK((I.sregs[CS]<<4)+I.ip+1))==0xfd) | |
526 | - nec_ICount%=15; | |
527 | -} | |
528 | -OP( 0x91, i_xchg_axcx ) { XchgAWReg(CW); CLK(3); } | |
529 | -OP( 0x92, i_xchg_axdx ) { XchgAWReg(DW); CLK(3); } | |
530 | -OP( 0x93, i_xchg_axbx ) { XchgAWReg(BW); CLK(3); } | |
531 | -OP( 0x94, i_xchg_axsp ) { XchgAWReg(SP); CLK(3); } | |
532 | -OP( 0x95, i_xchg_axbp ) { XchgAWReg(BP); CLK(3); } | |
533 | -OP( 0x96, i_xchg_axsi ) { XchgAWReg(IX); CLK(3); } | |
534 | -OP( 0x97, i_xchg_axdi ) { XchgAWReg(IY); CLK(3); } | |
535 | - | |
536 | -OP( 0x98, i_cbw ) { I.regs.b[AH] = (I.regs.b[AL] & 0x80) ? 0xff : 0; CLK(1); } | |
537 | -OP( 0x99, i_cwd ) { I.regs.w[DW] = (I.regs.b[AH] & 0x80) ? 0xffff : 0; CLK(1); } | |
538 | -OP( 0x9a, i_call_far ) { UINT32 tmp, tmp2; FETCHWORD(tmp); FETCHWORD(tmp2); PUSH(I.sregs[CS]); PUSH(I.ip); I.ip = (WORD)tmp; I.sregs[CS] = (WORD)tmp2; CLK(10); } | |
539 | -OP( 0x9b, i_wait ) { ; } | |
540 | -OP( 0x9c, i_pushf ) { PUSH( CompressFlags() ); CLK(2); } | |
541 | -OP( 0x9d, i_popf ) { UINT32 tmp; POP(tmp); ExpandFlags(tmp); CLK(3);} | |
542 | -OP( 0x9e, i_sahf ) { UINT32 tmp = (CompressFlags() & 0xff00) | (I.regs.b[AH] & 0xd5); ExpandFlags(tmp); CLK(4); } | |
543 | -OP( 0x9f, i_lahf ) { I.regs.b[AH] = CompressFlags() & 0xff; CLK(2); } | |
544 | - | |
545 | -OP( 0xa0, i_mov_aldisp ) { UINT32 addr; FETCHWORD(addr); I.regs.b[AL] = GetMemB(DS, addr); CLK(1); } | |
546 | -OP( 0xa1, i_mov_axdisp ) { UINT32 addr; FETCHWORD(addr); I.regs.b[AL] = GetMemB(DS, addr); I.regs.b[AH] = GetMemB(DS, (addr+1)&0xffff); CLK(1); } | |
547 | -OP( 0xa2, i_mov_dispal ) { UINT32 addr; FETCHWORD(addr); PutMemB(DS, addr, I.regs.b[AL]); CLK(1); } | |
548 | -OP( 0xa3, i_mov_dispax ) { UINT32 addr; FETCHWORD(addr); PutMemB(DS, addr, I.regs.b[AL]); PutMemB(DS, (addr+1)&0xffff, I.regs.b[AH]); CLK(1); } | |
549 | -OP( 0xa4, i_movsb ) { UINT32 tmp = GetMemB(DS,I.regs.w[IX]); PutMemB(ES,I.regs.w[IY], tmp); I.regs.w[IY] += -2 * I.DF + 1; I.regs.w[IX] += -2 * I.DF + 1; CLK(5); } | |
550 | -OP( 0xa5, i_movsw ) { UINT32 tmp = GetMemW(DS,I.regs.w[IX]); PutMemW(ES,I.regs.w[IY], tmp); I.regs.w[IY] += -4 * I.DF + 2; I.regs.w[IX] += -4 * I.DF + 2; CLK(5); } | |
551 | -OP( 0xa6, i_cmpsb ) { UINT32 src = GetMemB(ES, I.regs.w[IY]); UINT32 dst = GetMemB(DS, I.regs.w[IX]); SUBB; I.regs.w[IY] += -2 * I.DF + 1; I.regs.w[IX] += -2 * I.DF + 1; CLK(6); } | |
552 | -OP( 0xa7, i_cmpsw ) { UINT32 src = GetMemW(ES, I.regs.w[IY]); UINT32 dst = GetMemW(DS, I.regs.w[IX]); SUBW; I.regs.w[IY] += -4 * I.DF + 2; I.regs.w[IX] += -4 * I.DF + 2; CLK(6); } | |
553 | - | |
554 | -OP( 0xa8, i_test_ald8 ) { DEF_ald8; ANDB; CLK(1); } | |
555 | -OP( 0xa9, i_test_axd16 ) { DEF_axd16; ANDW; CLK(1); } | |
556 | -OP( 0xaa, i_stosb ) { PutMemB(ES,I.regs.w[IY],I.regs.b[AL]); I.regs.w[IY] += -2 * I.DF + 1; CLK(3); } | |
557 | -OP( 0xab, i_stosw ) { PutMemW(ES,I.regs.w[IY],I.regs.w[AW]); I.regs.w[IY] += -4 * I.DF + 2; CLK(3); } | |
558 | -OP( 0xac, i_lodsb ) { I.regs.b[AL] = GetMemB(DS,I.regs.w[IX]); I.regs.w[IX] += -2 * I.DF + 1; CLK(3); } | |
559 | -OP( 0xad, i_lodsw ) { I.regs.w[AW] = GetMemW(DS,I.regs.w[IX]); I.regs.w[IX] += -4 * I.DF + 2; CLK(3); } | |
560 | -OP( 0xae, i_scasb ) { UINT32 src = GetMemB(ES, I.regs.w[IY]); UINT32 dst = I.regs.b[AL]; SUBB; I.regs.w[IY] += -2 * I.DF + 1; CLK(4); } | |
561 | -OP( 0xaf, i_scasw ) { UINT32 src = GetMemW(ES, I.regs.w[IY]); UINT32 dst = I.regs.w[AW]; SUBW; I.regs.w[IY] += -4 * I.DF + 2; CLK(4); } | |
562 | - | |
563 | -OP( 0xb0, i_mov_ald8 ) { I.regs.b[AL] = FETCH; CLK(1); } | |
564 | -OP( 0xb1, i_mov_cld8 ) { I.regs.b[CL] = FETCH; CLK(1); } | |
565 | -OP( 0xb2, i_mov_dld8 ) { I.regs.b[DL] = FETCH; CLK(1); } | |
566 | -OP( 0xb3, i_mov_bld8 ) { I.regs.b[BL] = FETCH; CLK(1); } | |
567 | -OP( 0xb4, i_mov_ahd8 ) { I.regs.b[AH] = FETCH; CLK(1); } | |
568 | -OP( 0xb5, i_mov_chd8 ) { I.regs.b[CH] = FETCH; CLK(1); } | |
569 | -OP( 0xb6, i_mov_dhd8 ) { I.regs.b[DH] = FETCH; CLK(1); } | |
570 | -OP( 0xb7, i_mov_bhd8 ) { I.regs.b[BH] = FETCH; CLK(1); } | |
571 | - | |
572 | -OP( 0xb8, i_mov_axd16 ) { I.regs.b[AL] = FETCH; I.regs.b[AH] = FETCH; CLK(1); } | |
573 | -OP( 0xb9, i_mov_cxd16 ) { I.regs.b[CL] = FETCH; I.regs.b[CH] = FETCH; CLK(1); } | |
574 | -OP( 0xba, i_mov_dxd16 ) { I.regs.b[DL] = FETCH; I.regs.b[DH] = FETCH; CLK(1); } | |
575 | -OP( 0xbb, i_mov_bxd16 ) { I.regs.b[BL] = FETCH; I.regs.b[BH] = FETCH; CLK(1); } | |
576 | -OP( 0xbc, i_mov_spd16 ) { I.regs.b[SPL] = FETCH; I.regs.b[SPH] = FETCH; CLK(1); } | |
577 | -OP( 0xbd, i_mov_bpd16 ) { I.regs.b[BPL] = FETCH; I.regs.b[BPH] = FETCH; CLK(1); } | |
578 | -OP( 0xbe, i_mov_sid16 ) { I.regs.b[IXL] = FETCH; I.regs.b[IXH] = FETCH; CLK(1); } | |
579 | -OP( 0xbf, i_mov_did16 ) { I.regs.b[IYL] = FETCH; I.regs.b[IYH] = FETCH; CLK(1); } | |
580 | - | |
581 | -OP( 0xc0, i_rotshft_bd8 ) { | |
582 | - UINT32 src, dst; UINT8 c; | |
583 | - GetModRM; src = (unsigned)GetRMByte(ModRM); dst=src; | |
584 | - c=FETCH; | |
585 | - c&=0x1f; | |
586 | - CLKM(5,3); | |
587 | - if (c) switch (ModRM & 0x38) { | |
588 | - case 0x00: do { ROL_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
589 | - case 0x08: do { ROR_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
590 | - case 0x10: do { ROLC_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
591 | - case 0x18: do { RORC_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
592 | - case 0x20: SHL_BYTE(c); I.AuxVal = 1; break;// | |
593 | - case 0x28: SHR_BYTE(c); I.AuxVal = 1; break;// | |
594 | - case 0x30: break; | |
595 | - case 0x38: SHRA_BYTE(c); break; | |
596 | - } | |
597 | -} | |
598 | - | |
599 | -OP( 0xc1, i_rotshft_wd8 ) { | |
600 | - UINT32 src, dst; UINT8 c; | |
601 | - GetModRM; src = (unsigned)GetRMWord(ModRM); dst=src; | |
602 | - c=FETCH; | |
603 | - c&=0x1f; | |
604 | - CLKM(5,3); | |
605 | - if (c) switch (ModRM & 0x38) { | |
606 | - case 0x00: do { ROL_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
607 | - case 0x08: do { ROR_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
608 | - case 0x10: do { ROLC_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
609 | - case 0x18: do { RORC_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
610 | - case 0x20: SHL_WORD(c); I.AuxVal = 1; break; | |
611 | - case 0x28: SHR_WORD(c); I.AuxVal = 1; break; | |
612 | - case 0x30: break; | |
613 | - case 0x38: SHRA_WORD(c); break; | |
614 | - } | |
615 | -} | |
616 | - | |
617 | -OP( 0xc2, i_ret_d16 ) { UINT32 count = FETCH; count += FETCH << 8; POP(I.ip); I.regs.w[SP]+=count; CLK(6); } | |
618 | -OP( 0xc3, i_ret ) { POP(I.ip); CLK(6); } | |
619 | -OP( 0xc4, i_les_dw ) { GetModRM; WORD tmp = GetRMWord(ModRM); RegWord(ModRM)=tmp; I.sregs[ES] = GetnextRMWord; CLK(6); } | |
620 | -OP( 0xc5, i_lds_dw ) { GetModRM; WORD tmp = GetRMWord(ModRM); RegWord(ModRM)=tmp; I.sregs[DS] = GetnextRMWord; CLK(6); } | |
621 | -OP( 0xc6, i_mov_bd8 ) { GetModRM; PutImmRMByte(ModRM); CLK(1); } | |
622 | -OP( 0xc7, i_mov_wd16 ) { GetModRM; PutImmRMWord(ModRM); CLK(1); } | |
623 | - | |
624 | -OP( 0xc8, i_enter ) { | |
625 | - UINT32 nb = FETCH; | |
626 | - UINT32 i,level; | |
627 | - | |
628 | - CLK(19); | |
629 | - nb += FETCH << 8; | |
630 | - level = FETCH; | |
631 | - PUSH(I.regs.w[BP]); | |
632 | - I.regs.w[BP]=I.regs.w[SP]; | |
633 | - I.regs.w[SP] -= nb; | |
634 | - for (i=1;i<level;i++) { | |
635 | - PUSH(GetMemW(SS,I.regs.w[BP]-i*2)); | |
636 | - CLK(4); | |
637 | - } | |
638 | - if (level) PUSH(I.regs.w[BP]); | |
639 | -} | |
640 | -OP( 0xc9, i_leave ) { | |
641 | - I.regs.w[SP]=I.regs.w[BP]; | |
642 | - POP(I.regs.w[BP]); | |
643 | - CLK(2); | |
644 | -} | |
645 | -OP( 0xca, i_retf_d16 ) { UINT32 count = FETCH; count += FETCH << 8; POP(I.ip); POP(I.sregs[CS]); I.regs.w[SP]+=count; CLK(9); } | |
646 | -OP( 0xcb, i_retf ) { POP(I.ip); POP(I.sregs[CS]); CLK(8); } | |
647 | -OP( 0xcc, i_int3 ) { nec_interrupt(3,0); CLK(9); } | |
648 | -OP( 0xcd, i_int ) { nec_interrupt(FETCH,0); CLK(10); } | |
649 | -OP( 0xce, i_into ) { if (OF) { nec_interrupt(4,0); CLK(13); } else CLK(6); } | |
650 | -OP( 0xcf, i_iret ) { POP(I.ip); POP(I.sregs[CS]); i_popf(); CLK(10); } | |
651 | - | |
652 | -OP( 0xd0, i_rotshft_b ) { | |
653 | - UINT32 src, dst; GetModRM; src = (UINT32)GetRMByte(ModRM); dst=src; | |
654 | - CLKM(3,1); | |
655 | - switch (ModRM & 0x38) { | |
656 | - case 0x00: ROL_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
657 | - case 0x08: ROR_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
658 | - case 0x10: ROLC_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
659 | - case 0x18: RORC_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
660 | - case 0x20: SHL_BYTE(1); I.OverVal = (src^dst)&0x80;I.AuxVal = 1; break; | |
661 | - case 0x28: SHR_BYTE(1); I.OverVal = (src^dst)&0x80;I.AuxVal = 1; break; | |
662 | - case 0x30: break; | |
663 | - case 0x38: SHRA_BYTE(1); I.OverVal = 0; break; | |
664 | - } | |
665 | -} | |
666 | - | |
667 | -OP( 0xd1, i_rotshft_w ) { | |
668 | - UINT32 src, dst; GetModRM; src = (UINT32)GetRMWord(ModRM); dst=src; | |
669 | - CLKM(3,1); | |
670 | - switch (ModRM & 0x38) { | |
671 | - case 0x00: ROL_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
672 | - case 0x08: ROR_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
673 | - case 0x10: ROLC_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
674 | - case 0x18: RORC_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
675 | - case 0x20: SHL_WORD(1); I.AuxVal = 1;I.OverVal = (src^dst)&0x8000; break; | |
676 | - case 0x28: SHR_WORD(1); I.AuxVal = 1;I.OverVal = (src^dst)&0x8000; break; | |
677 | - case 0x30: break; | |
678 | - case 0x38: SHRA_WORD(1); I.AuxVal = 1;I.OverVal = 0; break; | |
679 | - } | |
680 | -} | |
681 | - | |
682 | -OP( 0xd2, i_rotshft_bcl ) { | |
683 | - UINT32 src, dst; UINT8 c; GetModRM; src = (UINT32)GetRMByte(ModRM); dst=src; | |
684 | - c=I.regs.b[CL]; | |
685 | - CLKM(5,3); | |
686 | - c&=0x1f; | |
687 | - if (c) switch (ModRM & 0x38) { | |
688 | - case 0x00: do { ROL_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
689 | - case 0x08: do { ROR_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
690 | - case 0x10: do { ROLC_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
691 | - case 0x18: do { RORC_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
692 | - case 0x20: SHL_BYTE(c); I.AuxVal = 1; break; | |
693 | - case 0x28: SHR_BYTE(c); I.AuxVal = 1;break; | |
694 | - case 0x30: break; | |
695 | - case 0x38: SHRA_BYTE(c); break; | |
696 | - } | |
697 | -} | |
698 | - | |
699 | -OP( 0xd3, i_rotshft_wcl ) { | |
700 | - UINT32 src, dst; UINT8 c; GetModRM; src = (UINT32)GetRMWord(ModRM); dst=src; | |
701 | - c=I.regs.b[CL]; | |
702 | - c&=0x1f; | |
703 | - CLKM(5,3); | |
704 | - if (c) switch (ModRM & 0x38) { | |
705 | - case 0x00: do { ROL_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
706 | - case 0x08: do { ROR_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
707 | - case 0x10: do { ROLC_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
708 | - case 0x18: do { RORC_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
709 | - case 0x20: SHL_WORD(c); I.AuxVal = 1; break; | |
710 | - case 0x28: SHR_WORD(c); I.AuxVal = 1; break; | |
711 | - case 0x30: break; | |
712 | - case 0x38: SHRA_WORD(c); break; | |
713 | - } | |
714 | -} | |
715 | - | |
716 | -OP( 0xd4, i_aam ) { UINT32 mult=FETCH; mult=0; I.regs.b[AH] = I.regs.b[AL] / 10; I.regs.b[AL] %= 10; SetSZPF_Word(I.regs.w[AW]); CLK(17); } | |
717 | -OP( 0xd5, i_aad ) { UINT32 mult=FETCH; mult=0; I.regs.b[AL] = I.regs.b[AH] * 10 + I.regs.b[AL]; I.regs.b[AH] = 0; SetSZPF_Byte(I.regs.b[AL]); CLK(6); } | |
718 | -OP( 0xd6, i_setalc ) { I.regs.b[AL] = (CF)?0xff:0x00; CLK(3); } /* nop at V30MZ? */ | |
719 | -OP( 0xd7, i_trans ) { UINT32 dest = (I.regs.w[BW]+I.regs.b[AL])&0xffff; I.regs.b[AL] = GetMemB(DS, dest); CLK(5); } | |
720 | -OP( 0xd8, i_fpo ) { GetModRM; CLK(3); } /* nop at V30MZ? */ | |
721 | - | |
722 | -OP( 0xe0, i_loopne ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if (!ZF && I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(6); } else CLK(3); } | |
723 | -OP( 0xe1, i_loope ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if ( ZF && I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(6); } else CLK(3); } | |
724 | -OP( 0xe2, i_loop ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if (I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(5); } else CLK(2); } | |
725 | -OP( 0xe3, i_jcxz ) { INT8 disp = (INT8)FETCH; if (I.regs.w[CW] == 0) { I.ip = (WORD)(I.ip+disp); CLK(4); } else CLK(1); } | |
726 | -OP( 0xe4, i_inal ) { UINT8 port = FETCH; I.regs.b[AL] = read_port(port); CLK(6); } | |
727 | -OP( 0xe5, i_inax ) { UINT8 port = FETCH; I.regs.b[AL] = read_port(port); I.regs.b[AH] = read_port(port+1); CLK(6); } | |
728 | -OP( 0xe6, i_outal ) { UINT8 port = FETCH; write_port(port, I.regs.b[AL]); CLK(6); } | |
729 | -OP( 0xe7, i_outax ) { UINT8 port = FETCH; write_port(port, I.regs.b[AL]); write_port(port+1, I.regs.b[AH]); CLK(6); } | |
730 | - | |
731 | -OP( 0xe8, i_call_d16 ) { UINT32 tmp; FETCHWORD(tmp); PUSH(I.ip); I.ip = (WORD)(I.ip+(INT16)tmp); CLK(5); } | |
732 | -OP( 0xe9, i_jmp_d16 ) { UINT32 tmp; FETCHWORD(tmp); I.ip = (WORD)(I.ip+(INT16)tmp); CLK(4); } | |
733 | -OP( 0xea, i_jmp_far ) { UINT32 tmp,tmp1; FETCHWORD(tmp); FETCHWORD(tmp1); I.sregs[CS] = (WORD)tmp1; I.ip = (WORD)tmp; CLK(7); } | |
734 | -OP( 0xeb, i_jmp_d8 ) { int tmp = (int)((INT8)FETCH); CLK(4); | |
735 | - if (tmp==-2 && no_interrupt==0 && nec_ICount>0) nec_ICount%=12; /* cycle skip */ | |
736 | - I.ip = (WORD)(I.ip+tmp); | |
737 | -} | |
738 | -OP( 0xec, i_inaldx ) { I.regs.b[AL] = read_port(I.regs.w[DW]); CLK(6);} | |
739 | -OP( 0xed, i_inaxdx ) { UINT32 port = I.regs.w[DW]; I.regs.b[AL] = read_port(port); I.regs.b[AH] = read_port(port+1); CLK(6); } | |
740 | -OP( 0xee, i_outdxal ) { write_port(I.regs.w[DW], I.regs.b[AL]); CLK(6); } | |
741 | -OP( 0xef, i_outdxax ) { UINT32 port = I.regs.w[DW]; write_port(port, I.regs.b[AL]); write_port(port+1, I.regs.b[AH]); CLK(6); } | |
742 | - | |
743 | -OP( 0xf0, i_lock ) { no_interrupt=1; CLK(1); } | |
744 | -#define THROUGH \ | |
745 | - if(nec_ICount<0){ \ | |
746 | - if(seg_prefix) \ | |
747 | - I.ip-=(UINT16)3; \ | |
748 | - else \ | |
749 | - I.ip-=(UINT16)2; \ | |
750 | - break;} | |
751 | - | |
752 | -OP( 0xf2, i_repne ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
753 | - switch(next) { /* Segments */ | |
754 | - case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
755 | - case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
756 | - case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
757 | - case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
758 | - } | |
759 | - | |
760 | - switch(next) { | |
761 | - case 0x6c: CLK(2); if (c) do { i_insb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
762 | - case 0x6d: CLK(2); if (c) do { i_insw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
763 | - case 0x6e: CLK(2); if (c) do { i_outsb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
764 | - case 0x6f: CLK(2); if (c) do { i_outsw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
765 | - case 0xa4: CLK(2); if (c) do { i_movsb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
766 | - case 0xa5: CLK(2); if (c) do { i_movsw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
767 | - case 0xa6: CLK(5); if (c) do { THROUGH; i_cmpsb(); c--; CLK(3); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
768 | - case 0xa7: CLK(5); if (c) do { THROUGH; i_cmpsw(); c--; CLK(3); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
769 | - case 0xaa: CLK(2); if (c) do { i_stosb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
770 | - case 0xab: CLK(2); if (c) do { i_stosw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
771 | - case 0xac: CLK(2); if (c) do { i_lodsb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
772 | - case 0xad: CLK(2); if (c) do { i_lodsw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
773 | - case 0xae: CLK(5); if (c) do { THROUGH; i_scasb(); c--; CLK(5); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
774 | - case 0xaf: CLK(5); if (c) do { THROUGH; i_scasw(); c--; CLK(5); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
775 | - default: nec_instruction[next](); | |
776 | - } | |
777 | - seg_prefix=FALSE; | |
778 | -} | |
779 | -OP( 0xf3, i_repe ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
780 | - switch(next) { /* Segments */ | |
781 | - case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
782 | - case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
783 | - case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
784 | - case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
785 | - } | |
786 | - | |
787 | - switch(next) { | |
788 | - case 0x6c: CLK(5); if (c) do { THROUGH; i_insb(); c--; CLK( 0); } while (c>0); I.regs.w[CW]=c; break; | |
789 | - case 0x6d: CLK(5); if (c) do { THROUGH; i_insw(); c--; CLK( 0); } while (c>0); I.regs.w[CW]=c; break; | |
790 | - case 0x6e: CLK(5); if (c) do { THROUGH; i_outsb(); c--; CLK(-1); } while (c>0); I.regs.w[CW]=c; break; | |
791 | - case 0x6f: CLK(5); if (c) do { THROUGH; i_outsw(); c--; CLK(-1); } while (c>0); I.regs.w[CW]=c; break; | |
792 | - case 0xa4: CLK(5); if (c) do { THROUGH; i_movsb(); c--; CLK( 2); } while (c>0); I.regs.w[CW]=c; break; | |
793 | - case 0xa5: CLK(5); if (c) do { THROUGH; i_movsw(); c--; CLK( 2); } while (c>0); I.regs.w[CW]=c; break; | |
794 | - case 0xa6: CLK(5); if (c) do { THROUGH; i_cmpsb(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
795 | - case 0xa7: CLK(5); if (c) do { THROUGH; i_cmpsw(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
796 | - case 0xaa: CLK(5); if (c) do { THROUGH; i_stosb(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
797 | - case 0xab: CLK(5); if (c) do { THROUGH; i_stosw(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
798 | - case 0xac: CLK(5); if (c) do { THROUGH; i_lodsb(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
799 | - case 0xad: CLK(5); if (c) do { THROUGH; i_lodsw(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
800 | - case 0xae: CLK(5); if (c) do { THROUGH; i_scasb(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
801 | - case 0xaf: CLK(5); if (c) do { THROUGH; i_scasw(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
802 | - default: nec_instruction[next](); | |
803 | - } | |
804 | - seg_prefix=FALSE; | |
805 | -} | |
806 | -OP( 0xf4, i_hlt ) { nec_ICount=0; } | |
807 | - | |
808 | - | |
809 | - | |
810 | - | |
811 | - | |
812 | -OP( 0xf5, i_cmc ) { I.CarryVal = !CF; CLK(4); } | |
813 | -OP( 0xf6, i_f6pre ) { UINT32 tmp; UINT32 uresult,uresult2; INT32 result,result2; | |
814 | - GetModRM; tmp = GetRMByte(ModRM); | |
815 | - switch (ModRM & 0x38) { | |
816 | - case 0x00: tmp &= FETCH; I.CarryVal = I.OverVal = I.AuxVal=0; SetSZPF_Byte(tmp); CLKM(2,1); break; /* TEST */ | |
817 | - case 0x08: break; | |
818 | - case 0x10: PutbackRMByte(ModRM,~tmp); CLKM(3,1); break; /* NOT */ | |
819 | - | |
820 | - case 0x18: I.CarryVal=(tmp!=0);tmp=(~tmp)+1; SetSZPF_Byte(tmp); PutbackRMByte(ModRM,tmp&0xff); CLKM(3,1); break; /* NEG */ | |
821 | - case 0x20: uresult = I.regs.b[AL]*tmp; I.regs.w[AW]=(WORD)uresult; I.CarryVal=I.OverVal=(I.regs.b[AH]!=0); CLKM(4,3); break; /* MULU */ | |
822 | - case 0x28: result = (INT16)((INT8)I.regs.b[AL])*(INT16)((INT8)tmp); I.regs.w[AW]=(WORD)result; I.CarryVal=I.OverVal=(I.regs.b[AH]!=0); CLKM(4,3); break; /* MUL */ | |
823 | - case 0x30: if (tmp) { DIVUB; } else nec_interrupt(0,0); CLKM(16,15); break; | |
824 | - case 0x38: if (tmp) { DIVB; } else nec_interrupt(0,0); CLKM(18,17); break; | |
825 | - } | |
826 | -} | |
827 | - | |
828 | -OP( 0xf7, i_f7pre ) { UINT32 tmp,tmp2; UINT32 uresult,uresult2; INT32 result,result2; | |
829 | - GetModRM; tmp = GetRMWord(ModRM); | |
830 | - switch (ModRM & 0x38) { | |
831 | - case 0x00: FETCHWORD(tmp2); tmp &= tmp2; I.CarryVal = I.OverVal = I.AuxVal=0; SetSZPF_Word(tmp); CLKM(2,1); break; /* TEST */ | |
832 | - case 0x08: break; | |
833 | - case 0x10: PutbackRMWord(ModRM,~tmp); CLKM(3,1); break; /* NOT */ | |
834 | - case 0x18: I.CarryVal=(tmp!=0); tmp=(~tmp)+1; SetSZPF_Word(tmp); PutbackRMWord(ModRM,tmp&0xffff); CLKM(3,1); break; /* NEG */ | |
835 | - case 0x20: uresult = I.regs.w[AW]*tmp; I.regs.w[AW]=uresult&0xffff; I.regs.w[DW]=((UINT32)uresult)>>16; I.CarryVal=I.OverVal=(I.regs.w[DW]!=0); CLKM(4,3); break; /* MULU */ | |
836 | - case 0x28: result = (INT32)((INT16)I.regs.w[AW])*(INT32)((INT16)tmp); I.regs.w[AW]=result&0xffff; I.regs.w[DW]=result>>16; I.CarryVal=I.OverVal=(I.regs.w[DW]!=0); CLKM(4,3); break; /* MUL */ | |
837 | - case 0x30: if (tmp) { DIVUW; } else nec_interrupt(0,0); CLKM(24,23); break; | |
838 | - case 0x38: if (tmp) { DIVW; } else nec_interrupt(0,0); CLKM(25,24); break; | |
839 | - } | |
840 | -} | |
841 | - | |
842 | -OP( 0xf8, i_clc ) { I.CarryVal = 0; CLK(4); } | |
843 | -OP( 0xf9, i_stc ) { I.CarryVal = 1; CLK(4); } | |
844 | -OP( 0xfa, i_di ) { SetIF(0); CLK(4); } | |
845 | -OP( 0xfb, i_ei ) { SetIF(1); CLK(4); } | |
846 | -OP( 0xfc, i_cld ) { SetDF(0); CLK(4); } | |
847 | -OP( 0xfd, i_std ) { SetDF(1); CLK(4); } | |
848 | -OP( 0xfe, i_fepre ) { UINT32 tmp, tmp1; GetModRM; tmp=GetRMByte(ModRM); | |
849 | - switch(ModRM & 0x38) { | |
850 | - case 0x00: tmp1 = tmp+1; I.OverVal = (tmp==0x7f); SetAF(tmp1,tmp,1); SetSZPF_Byte(tmp1); PutbackRMByte(ModRM,(BYTE)tmp1); CLKM(3,1); break; /* INC */ | |
851 | - case 0x08: tmp1 = tmp-1; I.OverVal = (tmp==0x80); SetAF(tmp1,tmp,1); SetSZPF_Byte(tmp1); PutbackRMByte(ModRM,(BYTE)tmp1); CLKM(3,1); break; /* DEC */ | |
852 | - } | |
853 | -} | |
854 | -OP( 0xff, i_ffpre ) { UINT32 tmp, tmp1; GetModRM; tmp=GetRMWord(ModRM); | |
855 | - switch(ModRM & 0x38) { | |
856 | - case 0x00: tmp1 = tmp+1; I.OverVal = (tmp==0x7fff); SetAF(tmp1,tmp,1); SetSZPF_Word(tmp1); PutbackRMWord(ModRM,(WORD)tmp1); CLKM(3,1); break; /* INC */ | |
857 | - case 0x08: tmp1 = tmp-1; I.OverVal = (tmp==0x8000); SetAF(tmp1,tmp,1); SetSZPF_Word(tmp1); PutbackRMWord(ModRM,(WORD)tmp1); CLKM(3,1); break; /* DEC */ | |
858 | - case 0x10: PUSH(I.ip); I.ip = (WORD)tmp; CLKM(6,5); break; /* CALL */ | |
859 | - case 0x18: tmp1 = I.sregs[CS]; I.sregs[CS] = GetnextRMWord; PUSH(tmp1); PUSH(I.ip); I.ip = tmp; CLKM(12,1); break; /* CALL FAR */ | |
860 | - case 0x20: I.ip = tmp; CLKM(5,4); break; /* JMP */ | |
861 | - case 0x28: I.ip = tmp; I.sregs[CS] = GetnextRMWord; CLKM(10,1); break; /* JMP FAR */ | |
862 | - case 0x30: PUSH(tmp); CLKM(2,1); break; | |
863 | - default: ; | |
864 | - } | |
865 | -} | |
866 | - | |
867 | -static void i_invalid(void) | |
868 | -{ | |
869 | - CLK(10); | |
870 | -} | |
871 | - | |
872 | -/*****************************************************************************/ | |
873 | - | |
874 | - | |
875 | -unsigned nec_get_reg(int regnum) | |
876 | -{ | |
877 | - switch( regnum ) | |
878 | - { | |
879 | - case NEC_IP: return I.ip; | |
880 | - case NEC_SP: return I.regs.w[SP]; | |
881 | - case NEC_FLAGS: return CompressFlags(); | |
882 | - case NEC_AW: return I.regs.w[AW]; | |
883 | - case NEC_CW: return I.regs.w[CW]; | |
884 | - case NEC_DW: return I.regs.w[DW]; | |
885 | - case NEC_BW: return I.regs.w[BW]; | |
886 | - case NEC_BP: return I.regs.w[BP]; | |
887 | - case NEC_IX: return I.regs.w[IX]; | |
888 | - case NEC_IY: return I.regs.w[IY]; | |
889 | - case NEC_ES: return I.sregs[ES]; | |
890 | - case NEC_CS: return I.sregs[CS]; | |
891 | - case NEC_SS: return I.sregs[SS]; | |
892 | - case NEC_DS: return I.sregs[DS]; | |
893 | - case NEC_VECTOR: return I.int_vector; | |
894 | - case NEC_PENDING: return I.pending_irq; | |
895 | - case NEC_NMI_STATE: return I.nmi_state; | |
896 | - case NEC_IRQ_STATE: return I.irq_state; | |
897 | - } | |
898 | - return 0; | |
899 | -} | |
900 | - | |
901 | -void nec_set_irq_line(int irqline, int state); | |
902 | - | |
903 | -void nec_set_reg(int regnum, unsigned val) | |
904 | -{ | |
905 | - switch( regnum ) | |
906 | - { | |
907 | - case NEC_IP: I.ip = val; break; | |
908 | - case NEC_SP: I.regs.w[SP] = val; break; | |
909 | - case NEC_FLAGS: ExpandFlags(val); break; | |
910 | - case NEC_AW: I.regs.w[AW] = val; break; | |
911 | - case NEC_CW: I.regs.w[CW] = val; break; | |
912 | - case NEC_DW: I.regs.w[DW] = val; break; | |
913 | - case NEC_BW: I.regs.w[BW] = val; break; | |
914 | - case NEC_BP: I.regs.w[BP] = val; break; | |
915 | - case NEC_IX: I.regs.w[IX] = val; break; | |
916 | - case NEC_IY: I.regs.w[IY] = val; break; | |
917 | - case NEC_ES: I.sregs[ES] = val; break; | |
918 | - case NEC_CS: I.sregs[CS] = val; break; | |
919 | - case NEC_SS: I.sregs[SS] = val; break; | |
920 | - case NEC_DS: I.sregs[DS] = val; break; | |
921 | - case NEC_VECTOR: I.int_vector = val; break; | |
922 | - } | |
923 | -} | |
924 | - | |
925 | - | |
926 | -int nec_execute(int cycles) | |
927 | -{ | |
928 | - | |
929 | - | |
930 | - nec_ICount=cycles; | |
931 | -// cpu_type=V30; | |
932 | - | |
933 | - while(nec_ICount>0) { | |
934 | - | |
935 | - nec_instruction[FETCHOP](); | |
936 | - nec_ICount++; | |
937 | - } | |
938 | -/* | |
939 | - while(nec_ICount>=0) { | |
940 | - | |
941 | - nec_instruction[FETCHOP](); | |
942 | -// nec_ICount++; | |
943 | - } | |
944 | -*/ | |
945 | - return cycles - nec_ICount; | |
946 | -} | |
947 | - |
@@ -0,0 +1,947 @@ | ||
1 | +/**************************************************************************** | |
2 | + | |
3 | + NEC V30MZ(V20/V30/V33) emulator | |
4 | + | |
5 | + Small changes made by toshi (Cycle count macros changed , "THROUGH" macro added) | |
6 | + | |
7 | + Small changes made by dox@space.pl (Corrected bug in NEG instruction , different AUX flag handling in some opcodes) | |
8 | + | |
9 | + (Re)Written June-September 2000 by Bryan McPhail (mish@tendril.co.uk) based | |
10 | + on code by Oliver Bergmann (Raul_Bloodworth@hotmail.com) who based code | |
11 | + on the i286 emulator by Fabrice Frances which had initial work based on | |
12 | + David Hedley's pcemu(!). | |
13 | + | |
14 | + This new core features 99% accurate cycle counts for each processor, | |
15 | + there are still some complex situations where cycle counts are wrong, | |
16 | + typically where a few instructions have differing counts for odd/even | |
17 | + source and odd/even destination memory operands. | |
18 | + | |
19 | + Flag settings are also correct for the NEC processors rather than the | |
20 | + I86 versions. | |
21 | + | |
22 | + Nb: This emulation should be faster than previous NEC cores, but | |
23 | + because the old cycle count values were far too high in many cases | |
24 | + the processor has to do more 'work' than before, so the overall effect | |
25 | + may be a slower core. | |
26 | + | |
27 | +****************************************************************************/ | |
28 | + | |
29 | + | |
30 | +#include <stdio.h> | |
31 | +#include <string.h> | |
32 | +#include <windows.h> | |
33 | + | |
34 | +#define UINT8 unsigned char | |
35 | +#define UINT16 unsigned short | |
36 | +#define UINT32 unsigned int | |
37 | +#define INT8 signed char | |
38 | +#define INT16 signed short | |
39 | +#define INT32 signed int | |
40 | + | |
41 | +#include "nec.h" | |
42 | +#include "necintrf.h" | |
43 | + | |
44 | +typedef union | |
45 | +{ /* eight general registers */ | |
46 | + UINT16 w[8]; /* viewed as 16 bits registers */ | |
47 | + UINT8 b[16]; /* or as 8 bit registers */ | |
48 | +} necbasicregs; | |
49 | + | |
50 | +typedef struct | |
51 | +{ | |
52 | + necbasicregs regs; | |
53 | + UINT16 sregs[4]; | |
54 | + | |
55 | + UINT16 ip; | |
56 | + | |
57 | + INT32 SignVal; | |
58 | + UINT32 AuxVal, OverVal, ZeroVal, CarryVal, ParityVal; /* 0 or non-0 valued flags */ | |
59 | + UINT8 TF, IF, DF, MF; /* 0 or 1 valued flags */ /* OB[19.07.99] added Mode Flag V30 */ | |
60 | + UINT32 int_vector; | |
61 | + UINT32 pending_irq; | |
62 | + UINT32 nmi_state; | |
63 | + UINT32 irq_state; | |
64 | + int (*irq_callback)(int irqline); | |
65 | +} nec_Regs; | |
66 | + | |
67 | +/***************************************************************************/ | |
68 | +/* cpu state */ | |
69 | +/***************************************************************************/ | |
70 | + | |
71 | +int nec_ICount; | |
72 | + | |
73 | +static nec_Regs I; | |
74 | + | |
75 | +static UINT32 cpu_type; | |
76 | +static UINT32 prefix_base; /* base address of the latest prefix segment */ | |
77 | +char seg_prefix; /* prefix segment indicator */ | |
78 | + | |
79 | + | |
80 | +/* The interrupt number of a pending external interrupt pending NMI is 2. */ | |
81 | +/* For INTR interrupts, the level is caught on the bus during an INTA cycle */ | |
82 | + | |
83 | + | |
84 | +#include "necinstr.h" | |
85 | +#include "necea.h" | |
86 | +#include "necmodrm.h" | |
87 | + | |
88 | +static int no_interrupt; | |
89 | + | |
90 | +static UINT8 parity_table[256]; | |
91 | + | |
92 | +/***************************************************************************/ | |
93 | + | |
94 | +void nec_reset (void *param) | |
95 | +{ | |
96 | + unsigned int i,j,c; | |
97 | + BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH }; | |
98 | + | |
99 | + | |
100 | + memset( &I, 0, sizeof(I) ); | |
101 | + | |
102 | + no_interrupt=0; | |
103 | + I.sregs[CS] = 0xffff; | |
104 | + | |
105 | + | |
106 | + for (i = 0;i < 256; i++) | |
107 | + { | |
108 | + for (j = i, c = 0; j > 0; j >>= 1) | |
109 | + if (j & 1) c++; | |
110 | + parity_table[i] = !(c & 1); | |
111 | + } | |
112 | + | |
113 | + I.ZeroVal = I.ParityVal = 1; | |
114 | + SetMD(1); /* set the mode-flag = native mode */ | |
115 | + | |
116 | + for (i = 0; i < 256; i++) | |
117 | + { | |
118 | + Mod_RM.reg.b[i] = reg_name[(i & 0x38) >> 3]; | |
119 | + Mod_RM.reg.w[i] = (WREGS) ( (i & 0x38) >> 3) ; | |
120 | + } | |
121 | + | |
122 | + for (i = 0xc0; i < 0x100; i++) | |
123 | + { | |
124 | + Mod_RM.RM.w[i] = (WREGS)( i & 7 ); | |
125 | + Mod_RM.RM.b[i] = (BREGS)reg_name[i & 7]; | |
126 | + } | |
127 | +} | |
128 | + | |
129 | +void nec_exit (void) | |
130 | +{ | |
131 | + | |
132 | +} | |
133 | + | |
134 | + | |
135 | + | |
136 | + | |
137 | +void nec_int(DWORD wektor) | |
138 | +{ | |
139 | + | |
140 | + DWORD dest_seg, dest_off; | |
141 | + | |
142 | + if(I.IF) | |
143 | + { | |
144 | + i_pushf(); | |
145 | + I.TF = I.IF = 0; | |
146 | + dest_off = ReadWord(wektor); | |
147 | + dest_seg = ReadWord(wektor+2); | |
148 | + PUSH(I.sregs[CS]); | |
149 | + PUSH(I.ip); | |
150 | + I.ip = (WORD)dest_off; | |
151 | + I.sregs[CS] = (WORD)dest_seg; | |
152 | + } | |
153 | +} | |
154 | + | |
155 | +static void nec_interrupt(unsigned int_num,BOOLEAN md_flag) | |
156 | +{ | |
157 | + UINT32 dest_seg, dest_off; | |
158 | + | |
159 | + if (int_num == -1) | |
160 | + return; | |
161 | + | |
162 | + i_pushf(); | |
163 | + I.TF = I.IF = 0; | |
164 | + | |
165 | + | |
166 | + dest_off = ReadWord((int_num)*4); | |
167 | + dest_seg = ReadWord((int_num)*4+2); | |
168 | + | |
169 | + PUSH(I.sregs[CS]); | |
170 | + PUSH(I.ip); | |
171 | + I.ip = (WORD)dest_off; | |
172 | + I.sregs[CS] = (WORD)dest_seg; | |
173 | + | |
174 | +} | |
175 | + | |
176 | + | |
177 | +/****************************************************************************/ | |
178 | +/* OPCODES */ | |
179 | +/****************************************************************************/ | |
180 | + | |
181 | +#define OP(num,func_name) static void func_name(void) | |
182 | + | |
183 | + | |
184 | +OP( 0x00, i_add_br8 ) { DEF_br8; ADDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
185 | +OP( 0x01, i_add_wr16 ) { DEF_wr16; ADDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
186 | +OP( 0x02, i_add_r8b ) { DEF_r8b; ADDB; RegByte(ModRM)=dst; CLKM(2,1); } | |
187 | +OP( 0x03, i_add_r16w ) { DEF_r16w; ADDW; RegWord(ModRM)=dst; CLKM(2,1); } | |
188 | +OP( 0x04, i_add_ald8 ) { DEF_ald8; ADDB; I.regs.b[AL]=dst; CLK(1); } | |
189 | +OP( 0x05, i_add_axd16) { DEF_axd16; ADDW; I.regs.w[AW]=dst; CLK(1); } | |
190 | +OP( 0x06, i_push_es ) { PUSH(I.sregs[ES]); CLK(2); } | |
191 | +OP( 0x07, i_pop_es ) { POP(I.sregs[ES]); CLK(3); } | |
192 | + | |
193 | +OP( 0x08, i_or_br8 ) { DEF_br8; ORB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
194 | +OP( 0x09, i_or_wr16 ) { DEF_wr16; ORW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
195 | +OP( 0x0a, i_or_r8b ) { DEF_r8b; ORB; RegByte(ModRM)=dst; CLKM(2,1); } | |
196 | +OP( 0x0b, i_or_r16w ) { DEF_r16w; ORW; RegWord(ModRM)=dst; CLKM(2,1); } | |
197 | +OP( 0x0c, i_or_ald8 ) { DEF_ald8; ORB; I.regs.b[AL]=dst; CLK(1); } | |
198 | +OP( 0x0d, i_or_axd16 ) { DEF_axd16; ORW; I.regs.w[AW]=dst; CLK(1); } | |
199 | +OP( 0x0e, i_push_cs ) { PUSH(I.sregs[CS]); CLK(2); } | |
200 | +OP( 0x0f, i_pre_nec ) { UINT32 ModRM, tmp, tmp2; /* pop cs at V30MZ? */ | |
201 | + switch (FETCH) { | |
202 | + case 0x10 : BITOP_BYTE; CLKS(3,3,4); tmp2 = I.regs.b[CL] & 0x7; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
203 | + case 0x11 : BITOP_WORD; CLKS(3,3,4); tmp2 = I.regs.b[CL] & 0xf; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
204 | + case 0x12 : BITOP_BYTE; CLKS(5,5,4); tmp2 = I.regs.b[CL] & 0x7; tmp &= ~(1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Clr */ | |
205 | + case 0x13 : BITOP_WORD; CLKS(5,5,4); tmp2 = I.regs.b[CL] & 0xf; tmp &= ~(1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Clr */ | |
206 | + case 0x14 : BITOP_BYTE; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0x7; tmp |= (1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Set */ | |
207 | + case 0x15 : BITOP_WORD; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0xf; tmp |= (1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Set */ | |
208 | + case 0x16 : BITOP_BYTE; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0x7; BIT_NOT; PutbackRMByte(ModRM,tmp); break; /* Not */ | |
209 | + case 0x17 : BITOP_WORD; CLKS(4,4,4); tmp2 = I.regs.b[CL] & 0xf; BIT_NOT; PutbackRMWord(ModRM,tmp); break; /* Not */ | |
210 | + | |
211 | + case 0x18 : BITOP_BYTE; CLKS(4,4,4); tmp2 = (FETCH) & 0x7; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
212 | + case 0x19 : BITOP_WORD; CLKS(4,4,4); tmp2 = (FETCH) & 0xf; I.ZeroVal = (tmp & (1<<tmp2)) ? 1 : 0; I.CarryVal=I.OverVal=0; break; /* Test */ | |
213 | + case 0x1a : BITOP_BYTE; CLKS(6,6,4); tmp2 = (FETCH) & 0x7; tmp &= ~(1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Clr */ | |
214 | + case 0x1b : BITOP_WORD; CLKS(6,6,4); tmp2 = (FETCH) & 0xf; tmp &= ~(1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Clr */ | |
215 | + case 0x1c : BITOP_BYTE; CLKS(5,5,4); tmp2 = (FETCH) & 0x7; tmp |= (1<<tmp2); PutbackRMByte(ModRM,tmp); break; /* Set */ | |
216 | + case 0x1d : BITOP_WORD; CLKS(5,5,4); tmp2 = (FETCH) & 0xf; tmp |= (1<<tmp2); PutbackRMWord(ModRM,tmp); break; /* Set */ | |
217 | + case 0x1e : BITOP_BYTE; CLKS(5,5,4); tmp2 = (FETCH) & 0x7; BIT_NOT; PutbackRMByte(ModRM,tmp); break; /* Not */ | |
218 | + case 0x1f : BITOP_WORD; CLKS(5,5,4); tmp2 = (FETCH) & 0xf; BIT_NOT; PutbackRMWord(ModRM,tmp); break; /* Not */ | |
219 | + | |
220 | + case 0x20 : ADD4S; CLKS(7,7,2); break; | |
221 | + case 0x22 : SUB4S; CLKS(7,7,2); break; | |
222 | + case 0x26 : CMP4S; CLKS(7,7,2); break; | |
223 | + case 0x28 : ModRM = FETCH; tmp = GetRMByte(ModRM); tmp <<= 4; tmp |= I.regs.b[AL] & 0xf; I.regs.b[AL] = (I.regs.b[AL] & 0xf0) | ((tmp>>8)&0xf); tmp &= 0xff; PutbackRMByte(ModRM,tmp); CLKM(9,15); break; | |
224 | + case 0x2a : ModRM = FETCH; tmp = GetRMByte(ModRM); tmp2 = (I.regs.b[AL] & 0xf)<<4; I.regs.b[AL] = (I.regs.b[AL] & 0xf0) | (tmp&0xf); tmp = tmp2 | (tmp>>4); PutbackRMByte(ModRM,tmp); CLKM(13,19); break; | |
225 | + case 0x31 : ModRM = FETCH; ModRM=0; break; | |
226 | + case 0x33 : ModRM = FETCH; ModRM=0; break; | |
227 | + case 0x92 : CLK(2); break; /* V25/35 FINT */ | |
228 | + case 0xe0 : ModRM = FETCH; ModRM=0; break; | |
229 | + case 0xf0 : ModRM = FETCH; ModRM=0; break; | |
230 | + case 0xff : ModRM = FETCH; ModRM=0; break; | |
231 | + default: break; | |
232 | + } | |
233 | +} | |
234 | + | |
235 | +OP( 0x10, i_adc_br8 ) { DEF_br8; src+=CF; ADDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
236 | +OP( 0x11, i_adc_wr16 ) { DEF_wr16; src+=CF; ADDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
237 | +OP( 0x12, i_adc_r8b ) { DEF_r8b; src+=CF; ADDB; RegByte(ModRM)=dst; CLKM(2,1); } | |
238 | +OP( 0x13, i_adc_r16w ) { DEF_r16w; src+=CF; ADDW; RegWord(ModRM)=dst; CLKM(2,1); } | |
239 | +OP( 0x14, i_adc_ald8 ) { DEF_ald8; src+=CF; ADDB; I.regs.b[AL]=dst; CLK(1); } | |
240 | +OP( 0x15, i_adc_axd16) { DEF_axd16; src+=CF; ADDW; I.regs.w[AW]=dst; CLK(1); } | |
241 | +OP( 0x16, i_push_ss ) { PUSH(I.sregs[SS]); CLK(2); } | |
242 | +OP( 0x17, i_pop_ss ) { POP(I.sregs[SS]); CLK(3); no_interrupt=1; } | |
243 | + | |
244 | +OP( 0x18, i_sbb_br8 ) { DEF_br8; src+=CF; SUBB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
245 | +OP( 0x19, i_sbb_wr16 ) { DEF_wr16; src+=CF; SUBW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
246 | +OP( 0x1a, i_sbb_r8b ) { DEF_r8b; src+=CF; SUBB; RegByte(ModRM)=dst; CLKM(2,1); } | |
247 | +OP( 0x1b, i_sbb_r16w ) { DEF_r16w; src+=CF; SUBW; RegWord(ModRM)=dst; CLKM(2,1); } | |
248 | +OP( 0x1c, i_sbb_ald8 ) { DEF_ald8; src+=CF; SUBB; I.regs.b[AL]=dst; CLK(1); } | |
249 | +OP( 0x1d, i_sbb_axd16) { DEF_axd16; src+=CF; SUBW; I.regs.w[AW]=dst; CLK(1); } | |
250 | +OP( 0x1e, i_push_ds ) { PUSH(I.sregs[DS]); CLK(2); } | |
251 | +OP( 0x1f, i_pop_ds ) { POP(I.sregs[DS]); CLK(3); } | |
252 | + | |
253 | +OP( 0x20, i_and_br8 ) { DEF_br8; ANDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
254 | +OP( 0x21, i_and_wr16 ) { DEF_wr16; ANDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
255 | +OP( 0x22, i_and_r8b ) { DEF_r8b; ANDB; RegByte(ModRM)=dst; CLKM(2,1); } | |
256 | +OP( 0x23, i_and_r16w ) { DEF_r16w; ANDW; RegWord(ModRM)=dst; CLKM(2,1); } | |
257 | +OP( 0x24, i_and_ald8 ) { DEF_ald8; ANDB; I.regs.b[AL]=dst; CLK(1); } | |
258 | +OP( 0x25, i_and_axd16) { DEF_axd16; ANDW; I.regs.w[AW]=dst; CLK(1); } | |
259 | +OP( 0x26, i_es ) { seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
260 | +OP( 0x27, i_daa ) { ADJ4(6,0x60); CLK(10); } | |
261 | + | |
262 | +OP( 0x28, i_sub_br8 ) { DEF_br8; SUBB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
263 | +OP( 0x29, i_sub_wr16 ) { DEF_wr16; SUBW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
264 | +OP( 0x2a, i_sub_r8b ) { DEF_r8b; SUBB; RegByte(ModRM)=dst; CLKM(2,1); } | |
265 | +OP( 0x2b, i_sub_r16w ) { DEF_r16w; SUBW; RegWord(ModRM)=dst; CLKM(2,1); } | |
266 | +OP( 0x2c, i_sub_ald8 ) { DEF_ald8; SUBB; I.regs.b[AL]=dst; CLK(1); } | |
267 | +OP( 0x2d, i_sub_axd16) { DEF_axd16; SUBW; I.regs.w[AW]=dst; CLK(1); } | |
268 | +OP( 0x2e, i_cs ) { seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
269 | +OP( 0x2f, i_das ) { ADJ4(-6,-0x60); CLK(10); } | |
270 | + | |
271 | +OP( 0x30, i_xor_br8 ) { DEF_br8; XORB; PutbackRMByte(ModRM,dst); CLKM(3,1); } | |
272 | +OP( 0x31, i_xor_wr16 ) { DEF_wr16; XORW; PutbackRMWord(ModRM,dst); CLKM(3,1); } | |
273 | +OP( 0x32, i_xor_r8b ) { DEF_r8b; XORB; RegByte(ModRM)=dst; CLKM(2,1); } | |
274 | +OP( 0x33, i_xor_r16w ) { DEF_r16w; XORW; RegWord(ModRM)=dst; CLKM(2,1); } | |
275 | +OP( 0x34, i_xor_ald8 ) { DEF_ald8; XORB; I.regs.b[AL]=dst; CLK(1); } | |
276 | +OP( 0x35, i_xor_axd16) { DEF_axd16; XORW; I.regs.w[AW]=dst; CLK(1); } | |
277 | +OP( 0x36, i_ss ) { seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
278 | +OP( 0x37, i_aaa ) { ADJB(6,1); CLK(9); } | |
279 | + | |
280 | +OP( 0x38, i_cmp_br8 ) { DEF_br8; SUBB; CLKM(2,1); } | |
281 | +OP( 0x39, i_cmp_wr16 ) { DEF_wr16; SUBW; CLKM(2,1); } | |
282 | +OP( 0x3a, i_cmp_r8b ) { DEF_r8b; SUBB; CLKM(2,1); } | |
283 | +OP( 0x3b, i_cmp_r16w ) { DEF_r16w; SUBW; CLKM(2,1); } | |
284 | +OP( 0x3c, i_cmp_ald8 ) { DEF_ald8; SUBB; CLK(1); } | |
285 | +OP( 0x3d, i_cmp_axd16) { DEF_axd16; SUBW; CLK(1); } | |
286 | +OP( 0x3e, i_ds ) { seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; CLK(1); nec_instruction[FETCHOP](); seg_prefix=FALSE; } | |
287 | +OP( 0x3f, i_aas ) { ADJB(-6,-1); CLK(9); } | |
288 | + | |
289 | +OP( 0x40, i_inc_ax ) { IncWordReg(AW); CLK(1); } | |
290 | +OP( 0x41, i_inc_cx ) { IncWordReg(CW); CLK(1); } | |
291 | +OP( 0x42, i_inc_dx ) { IncWordReg(DW); CLK(1); } | |
292 | +OP( 0x43, i_inc_bx ) { IncWordReg(BW); CLK(1); } | |
293 | +OP( 0x44, i_inc_sp ) { IncWordReg(SP); CLK(1); } | |
294 | +OP( 0x45, i_inc_bp ) { IncWordReg(BP); CLK(1); } | |
295 | +OP( 0x46, i_inc_si ) { IncWordReg(IX); CLK(1); } | |
296 | +OP( 0x47, i_inc_di ) { IncWordReg(IY); CLK(1); } | |
297 | + | |
298 | +OP( 0x48, i_dec_ax ) { DecWordReg(AW); CLK(1); } | |
299 | +OP( 0x49, i_dec_cx ) { DecWordReg(CW); CLK(1); } | |
300 | +OP( 0x4a, i_dec_dx ) { DecWordReg(DW); CLK(1); } | |
301 | +OP( 0x4b, i_dec_bx ) { DecWordReg(BW); CLK(1); } | |
302 | +OP( 0x4c, i_dec_sp ) { DecWordReg(SP); CLK(1); } | |
303 | +OP( 0x4d, i_dec_bp ) { DecWordReg(BP); CLK(1); } | |
304 | +OP( 0x4e, i_dec_si ) { DecWordReg(IX); CLK(1); } | |
305 | +OP( 0x4f, i_dec_di ) { DecWordReg(IY); CLK(1); } | |
306 | + | |
307 | +OP( 0x50, i_push_ax ) { PUSH(I.regs.w[AW]); CLK(1); } | |
308 | +OP( 0x51, i_push_cx ) { PUSH(I.regs.w[CW]); CLK(1); } | |
309 | +OP( 0x52, i_push_dx ) { PUSH(I.regs.w[DW]); CLK(1); } | |
310 | +OP( 0x53, i_push_bx ) { PUSH(I.regs.w[BW]); CLK(1); } | |
311 | +OP( 0x54, i_push_sp ) { PUSH(I.regs.w[SP]); CLK(1); } | |
312 | +OP( 0x55, i_push_bp ) { PUSH(I.regs.w[BP]); CLK(1); } | |
313 | +OP( 0x56, i_push_si ) { PUSH(I.regs.w[IX]); CLK(1); } | |
314 | +OP( 0x57, i_push_di ) { PUSH(I.regs.w[IY]); CLK(1); } | |
315 | + | |
316 | +OP( 0x58, i_pop_ax ) { POP(I.regs.w[AW]); CLK(1); } | |
317 | +OP( 0x59, i_pop_cx ) { POP(I.regs.w[CW]); CLK(1); } | |
318 | +OP( 0x5a, i_pop_dx ) { POP(I.regs.w[DW]); CLK(1); } | |
319 | +OP( 0x5b, i_pop_bx ) { POP(I.regs.w[BW]); CLK(1); } | |
320 | +OP( 0x5c, i_pop_sp ) { POP(I.regs.w[SP]); CLK(1); } | |
321 | +OP( 0x5d, i_pop_bp ) { POP(I.regs.w[BP]); CLK(1); } | |
322 | +OP( 0x5e, i_pop_si ) { POP(I.regs.w[IX]); CLK(1); } | |
323 | +OP( 0x5f, i_pop_di ) { POP(I.regs.w[IY]); CLK(1); } | |
324 | + | |
325 | +OP( 0x60, i_pusha ) { | |
326 | + unsigned tmp=I.regs.w[SP]; | |
327 | + PUSH(I.regs.w[AW]); | |
328 | + PUSH(I.regs.w[CW]); | |
329 | + PUSH(I.regs.w[DW]); | |
330 | + PUSH(I.regs.w[BW]); | |
331 | + PUSH(tmp); | |
332 | + PUSH(I.regs.w[BP]); | |
333 | + PUSH(I.regs.w[IX]); | |
334 | + PUSH(I.regs.w[IY]); | |
335 | + CLK(9); | |
336 | +} | |
337 | +OP( 0x61, i_popa ) { | |
338 | + unsigned tmp; | |
339 | + POP(I.regs.w[IY]); | |
340 | + POP(I.regs.w[IX]); | |
341 | + POP(I.regs.w[BP]); | |
342 | + POP(tmp); | |
343 | + POP(I.regs.w[BW]); | |
344 | + POP(I.regs.w[DW]); | |
345 | + POP(I.regs.w[CW]); | |
346 | + POP(I.regs.w[AW]); | |
347 | + CLK(8); | |
348 | +} | |
349 | +OP( 0x62, i_chkind ) { | |
350 | + UINT32 low,high,tmp; | |
351 | + GetModRM; | |
352 | + low = GetRMWord(ModRM); | |
353 | + high= GetnextRMWord; | |
354 | + tmp= RegWord(ModRM); | |
355 | + if (tmp<low || tmp>high) { | |
356 | + nec_interrupt(5,0); | |
357 | + CLK(7); | |
358 | + } | |
359 | + CLK(13); | |
360 | +} | |
361 | + | |
362 | +/* OP 0x64 - 0x67 is nop at V30MZ */ | |
363 | +OP( 0x64, i_repnc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
364 | + switch(next) { /* Segments */ | |
365 | + case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
366 | + case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
367 | + case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
368 | + case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
369 | + } | |
370 | + | |
371 | + switch(next) { | |
372 | + case 0x6c: CLK(2); if (c) do { i_insb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
373 | + case 0x6d: CLK(2); if (c) do { i_insw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
374 | + case 0x6e: CLK(2); if (c) do { i_outsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
375 | + case 0x6f: CLK(2); if (c) do { i_outsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
376 | + case 0xa4: CLK(2); if (c) do { i_movsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
377 | + case 0xa5: CLK(2); if (c) do { i_movsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
378 | + case 0xa6: CLK(2); if (c) do { i_cmpsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
379 | + case 0xa7: CLK(2); if (c) do { i_cmpsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
380 | + case 0xaa: CLK(2); if (c) do { i_stosb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
381 | + case 0xab: CLK(2); if (c) do { i_stosw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
382 | + case 0xac: CLK(2); if (c) do { i_lodsb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
383 | + case 0xad: CLK(2); if (c) do { i_lodsw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
384 | + case 0xae: CLK(2); if (c) do { i_scasb(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
385 | + case 0xaf: CLK(2); if (c) do { i_scasw(); c--; } while (c>0 && !CF); I.regs.w[CW]=c; break; | |
386 | + default: nec_instruction[next](); | |
387 | + } | |
388 | + seg_prefix=FALSE; | |
389 | +} | |
390 | + | |
391 | +OP( 0x65, i_repc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
392 | + switch(next) { /* Segments */ | |
393 | + case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
394 | + case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
395 | + case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
396 | + case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
397 | + } | |
398 | + | |
399 | + switch(next) { | |
400 | + case 0x6c: CLK(2); if (c) do { i_insb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
401 | + case 0x6d: CLK(2); if (c) do { i_insw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
402 | + case 0x6e: CLK(2); if (c) do { i_outsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
403 | + case 0x6f: CLK(2); if (c) do { i_outsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
404 | + case 0xa4: CLK(2); if (c) do { i_movsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
405 | + case 0xa5: CLK(2); if (c) do { i_movsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
406 | + case 0xa6: CLK(2); if (c) do { i_cmpsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
407 | + case 0xa7: CLK(2); if (c) do { i_cmpsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
408 | + case 0xaa: CLK(2); if (c) do { i_stosb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
409 | + case 0xab: CLK(2); if (c) do { i_stosw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
410 | + case 0xac: CLK(2); if (c) do { i_lodsb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
411 | + case 0xad: CLK(2); if (c) do { i_lodsw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
412 | + case 0xae: CLK(2); if (c) do { i_scasb(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
413 | + case 0xaf: CLK(2); if (c) do { i_scasw(); c--; } while (c>0 && CF); I.regs.w[CW]=c; break; | |
414 | + default: nec_instruction[next](); | |
415 | + } | |
416 | + seg_prefix=FALSE; | |
417 | +} | |
418 | + | |
419 | +OP( 0x68, i_push_d16 ) { UINT32 tmp; FETCHWORD(tmp); PUSH(tmp); CLK(1); } | |
420 | +OP( 0x69, i_imul_d16 ) { UINT32 tmp; DEF_r16w; FETCHWORD(tmp); dst = (INT32)((INT16)src)*(INT32)((INT16)tmp); I.CarryVal = I.OverVal = (((INT32)dst) >> 15 != 0) && (((INT32)dst) >> 15 != -1); RegWord(ModRM)=(WORD)dst; CLKM(4,3);} | |
421 | +OP( 0x6a, i_push_d8 ) { UINT32 tmp = (WORD)((INT16)((INT8)FETCH)); PUSH(tmp); CLK(1); } | |
422 | +OP( 0x6b, i_imul_d8 ) { UINT32 src2; DEF_r16w; src2= (WORD)((INT16)((INT8)FETCH)); dst = (INT32)((INT16)src)*(INT32)((INT16)src2); I.CarryVal = I.OverVal = (((INT32)dst) >> 15 != 0) && (((INT32)dst) >> 15 != -1); RegWord(ModRM)=(WORD)dst; CLKM(4,3); } | |
423 | +OP( 0x6c, i_insb ) { PutMemB(ES,I.regs.w[IY],read_port(I.regs.w[DW])); I.regs.w[IY]+= -2 * I.DF + 1; CLK(6); } | |
424 | +OP( 0x6d, i_insw ) { PutMemB(ES,I.regs.w[IY],read_port(I.regs.w[DW])); PutMemB(ES,(I.regs.w[IY]+1)&0xffff,read_port((I.regs.w[DW]+1)&0xffff)); I.regs.w[IY]+= -4 * I.DF + 2; CLK(6); } | |
425 | +OP( 0x6e, i_outsb ) { write_port(I.regs.w[DW],GetMemB(DS,I.regs.w[IX])); I.regs.w[IX]+= -2 * I.DF + 1; CLK(7); } | |
426 | +OP( 0x6f, i_outsw ) { write_port(I.regs.w[DW],GetMemB(DS,I.regs.w[IX])); write_port((I.regs.w[DW]+1)&0xffff,GetMemB(DS,(I.regs.w[IX]+1)&0xffff)); I.regs.w[IX]+= -4 * I.DF + 2; CLK(7); } | |
427 | + | |
428 | +OP( 0x70, i_jo ) { JMP( OF); CLK(1); } | |
429 | +OP( 0x71, i_jno ) { JMP(!OF); CLK(1); } | |
430 | +OP( 0x72, i_jc ) { JMP( CF); CLK(1); } | |
431 | +OP( 0x73, i_jnc ) { JMP(!CF); CLK(1); } | |
432 | +OP( 0x74, i_jz ) { JMP( ZF); CLK(1); } | |
433 | +OP( 0x75, i_jnz ) { JMP(!ZF); CLK(1); } | |
434 | +OP( 0x76, i_jce ) { JMP(CF || ZF); CLK(1); } | |
435 | +OP( 0x77, i_jnce ) { JMP(!(CF || ZF)); CLK(1); } | |
436 | +OP( 0x78, i_js ) { JMP( SF); CLK(1); } | |
437 | +OP( 0x79, i_jns ) { JMP(!SF); CLK(1); } | |
438 | +OP( 0x7a, i_jp ) { JMP( PF); CLK(1); } | |
439 | +OP( 0x7b, i_jnp ) { JMP(!PF); CLK(1); } | |
440 | +OP( 0x7c, i_jl ) { JMP((SF!=OF)&&(!ZF)); CLK(1); } | |
441 | +OP( 0x7d, i_jnl ) { JMP((ZF)||(SF==OF)); CLK(1); } | |
442 | +OP( 0x7e, i_jle ) { JMP((ZF)||(SF!=OF)); CLK(1); } | |
443 | +OP( 0x7f, i_jnle ) { JMP((SF==OF)&&(!ZF)); CLK(1); } | |
444 | + | |
445 | +OP( 0x80, i_80pre ) { UINT32 dst, src; GetModRM; dst = GetRMByte(ModRM); src = FETCH; | |
446 | + CLKM(3,1) | |
447 | + switch (ModRM & 0x38) { | |
448 | + case 0x00: ADDB; PutbackRMByte(ModRM,dst); break; | |
449 | + case 0x08: ORB; PutbackRMByte(ModRM,dst); break; | |
450 | + case 0x10: src+=CF; ADDB; PutbackRMByte(ModRM,dst); break; | |
451 | + case 0x18: src+=CF; SUBB; PutbackRMByte(ModRM,dst); break; | |
452 | + case 0x20: ANDB; PutbackRMByte(ModRM,dst); break; | |
453 | + case 0x28: SUBB; PutbackRMByte(ModRM,dst); break; | |
454 | + case 0x30: XORB; PutbackRMByte(ModRM,dst); break; | |
455 | + case 0x38: SUBB; break; /* CMP */ | |
456 | + } | |
457 | +} | |
458 | + | |
459 | +OP( 0x81, i_81pre ) { UINT32 dst, src; GetModRM; dst = GetRMWord(ModRM); src = FETCH; src+= (FETCH << 8); | |
460 | + CLKM(3,1) | |
461 | + switch (ModRM & 0x38) { | |
462 | + case 0x00: ADDW; PutbackRMWord(ModRM,dst); break; | |
463 | + case 0x08: ORW; PutbackRMWord(ModRM,dst); break; | |
464 | + case 0x10: src+=CF; ADDW; PutbackRMWord(ModRM,dst); break; | |
465 | + case 0x18: src+=CF; SUBW; PutbackRMWord(ModRM,dst); break; | |
466 | + case 0x20: ANDW; PutbackRMWord(ModRM,dst); break; | |
467 | + case 0x28: SUBW; PutbackRMWord(ModRM,dst); break; | |
468 | + case 0x30: XORW; PutbackRMWord(ModRM,dst); break; | |
469 | + case 0x38: SUBW; break; /* CMP */ | |
470 | + } | |
471 | +} | |
472 | + | |
473 | +OP( 0x82, i_82pre ) { UINT32 dst, src; GetModRM; dst = GetRMByte(ModRM); src = (BYTE)((INT8)FETCH); | |
474 | + CLKM(3,1) | |
475 | + switch (ModRM & 0x38) { | |
476 | + case 0x00: ADDB; PutbackRMByte(ModRM,dst); break; | |
477 | + case 0x08: ORB; PutbackRMByte(ModRM,dst); break; | |
478 | + case 0x10: src+=CF; ADDB; PutbackRMByte(ModRM,dst); break; | |
479 | + case 0x18: src+=CF; SUBB; PutbackRMByte(ModRM,dst); break; | |
480 | + case 0x20: ANDB; PutbackRMByte(ModRM,dst); break; | |
481 | + case 0x28: SUBB; PutbackRMByte(ModRM,dst); break; | |
482 | + case 0x30: XORB; PutbackRMByte(ModRM,dst); break; | |
483 | + case 0x38: SUBB; break; /* CMP */ | |
484 | + } | |
485 | +} | |
486 | + | |
487 | +OP( 0x83, i_83pre ) { UINT32 dst, src; GetModRM; dst = GetRMWord(ModRM); src = (WORD)((INT16)((INT8)FETCH)); | |
488 | + CLKM(3,1) | |
489 | + switch (ModRM & 0x38) { | |
490 | + case 0x00: ADDW; PutbackRMWord(ModRM,dst); break; | |
491 | + case 0x08: ORW; PutbackRMWord(ModRM,dst); break; | |
492 | + case 0x10: src+=CF; ADDW; PutbackRMWord(ModRM,dst); break; | |
493 | + case 0x18: src+=CF; SUBW; PutbackRMWord(ModRM,dst); break; | |
494 | + case 0x20: ANDW; PutbackRMWord(ModRM,dst); break; | |
495 | + case 0x28: SUBW; PutbackRMWord(ModRM,dst); break; | |
496 | + case 0x30: XORW; PutbackRMWord(ModRM,dst); break; | |
497 | + case 0x38: SUBW; break; /* CMP */ | |
498 | + } | |
499 | +} | |
500 | + | |
501 | +OP( 0x84, i_test_br8 ) { DEF_br8; ANDB; CLKM(2,1); } | |
502 | +OP( 0x85, i_test_wr16 ) { DEF_wr16; ANDW; CLKM(2,1); } | |
503 | +OP( 0x86, i_xchg_br8 ) { DEF_br8; RegByte(ModRM)=dst; PutbackRMByte(ModRM,src); CLKM(5,3); } | |
504 | +OP( 0x87, i_xchg_wr16 ) { DEF_wr16; RegWord(ModRM)=dst; PutbackRMWord(ModRM,src); CLKM(5,3); } | |
505 | + | |
506 | +OP( 0x88, i_mov_br8 ) { UINT8 src; GetModRM; src = RegByte(ModRM); PutRMByte(ModRM,src); CLKM(1,1); } | |
507 | +OP( 0x89, i_mov_wr16 ) { UINT16 src; GetModRM; src = RegWord(ModRM); PutRMWord(ModRM,src); CLKM(1,1); } | |
508 | +OP( 0x8a, i_mov_r8b ) { UINT8 src; GetModRM; src = GetRMByte(ModRM); RegByte(ModRM)=src; CLKM(1,1); } | |
509 | +OP( 0x8b, i_mov_r16w ) { UINT16 src; GetModRM; src = GetRMWord(ModRM); RegWord(ModRM)=src; CLKM(1,1); } | |
510 | +OP( 0x8c, i_mov_wsreg ) { GetModRM; PutRMWord(ModRM,I.sregs[(ModRM & 0x38) >> 3]); CLKM(1,1); } | |
511 | +OP( 0x8d, i_lea ) { UINT16 ModRM = FETCH; (void)(*GetEA[ModRM])(); RegWord(ModRM)=EO; CLK(1); } | |
512 | +OP( 0x8e, i_mov_sregw ) { UINT16 src; GetModRM; src = GetRMWord(ModRM); CLKM(3,2); | |
513 | + switch (ModRM & 0x38) { | |
514 | + case 0x00: I.sregs[ES] = src; break; /* mov es,ew */ | |
515 | + case 0x08: I.sregs[CS] = src; break; /* mov cs,ew */ | |
516 | + case 0x10: I.sregs[SS] = src; break; /* mov ss,ew */ | |
517 | + case 0x18: I.sregs[DS] = src; break; /* mov ds,ew */ | |
518 | + default: ; | |
519 | + } | |
520 | + no_interrupt=1; | |
521 | +} | |
522 | +OP( 0x8f, i_popw ) { UINT16 tmp; GetModRM; POP(tmp); PutRMWord(ModRM,tmp); CLKM(3,1); } | |
523 | +OP( 0x90, i_nop ) { CLK(1); | |
524 | + /* Cycle skip for idle loops (0: NOP 1: JMP 0) */ | |
525 | + if (no_interrupt==0 && nec_ICount>0 && (PEEKOP((I.sregs[CS]<<4)+I.ip))==0xeb && (PEEK((I.sregs[CS]<<4)+I.ip+1))==0xfd) | |
526 | + nec_ICount%=15; | |
527 | +} | |
528 | +OP( 0x91, i_xchg_axcx ) { XchgAWReg(CW); CLK(3); } | |
529 | +OP( 0x92, i_xchg_axdx ) { XchgAWReg(DW); CLK(3); } | |
530 | +OP( 0x93, i_xchg_axbx ) { XchgAWReg(BW); CLK(3); } | |
531 | +OP( 0x94, i_xchg_axsp ) { XchgAWReg(SP); CLK(3); } | |
532 | +OP( 0x95, i_xchg_axbp ) { XchgAWReg(BP); CLK(3); } | |
533 | +OP( 0x96, i_xchg_axsi ) { XchgAWReg(IX); CLK(3); } | |
534 | +OP( 0x97, i_xchg_axdi ) { XchgAWReg(IY); CLK(3); } | |
535 | + | |
536 | +OP( 0x98, i_cbw ) { I.regs.b[AH] = (I.regs.b[AL] & 0x80) ? 0xff : 0; CLK(1); } | |
537 | +OP( 0x99, i_cwd ) { I.regs.w[DW] = (I.regs.b[AH] & 0x80) ? 0xffff : 0; CLK(1); } | |
538 | +OP( 0x9a, i_call_far ) { UINT32 tmp, tmp2; FETCHWORD(tmp); FETCHWORD(tmp2); PUSH(I.sregs[CS]); PUSH(I.ip); I.ip = (WORD)tmp; I.sregs[CS] = (WORD)tmp2; CLK(10); } | |
539 | +OP( 0x9b, i_wait ) { ; } | |
540 | +OP( 0x9c, i_pushf ) { PUSH( CompressFlags() ); CLK(2); } | |
541 | +OP( 0x9d, i_popf ) { UINT32 tmp; POP(tmp); ExpandFlags(tmp); CLK(3);} | |
542 | +OP( 0x9e, i_sahf ) { UINT32 tmp = (CompressFlags() & 0xff00) | (I.regs.b[AH] & 0xd5); ExpandFlags(tmp); CLK(4); } | |
543 | +OP( 0x9f, i_lahf ) { I.regs.b[AH] = CompressFlags() & 0xff; CLK(2); } | |
544 | + | |
545 | +OP( 0xa0, i_mov_aldisp ) { UINT32 addr; FETCHWORD(addr); I.regs.b[AL] = GetMemB(DS, addr); CLK(1); } | |
546 | +OP( 0xa1, i_mov_axdisp ) { UINT32 addr; FETCHWORD(addr); I.regs.b[AL] = GetMemB(DS, addr); I.regs.b[AH] = GetMemB(DS, (addr+1)&0xffff); CLK(1); } | |
547 | +OP( 0xa2, i_mov_dispal ) { UINT32 addr; FETCHWORD(addr); PutMemB(DS, addr, I.regs.b[AL]); CLK(1); } | |
548 | +OP( 0xa3, i_mov_dispax ) { UINT32 addr; FETCHWORD(addr); PutMemB(DS, addr, I.regs.b[AL]); PutMemB(DS, (addr+1)&0xffff, I.regs.b[AH]); CLK(1); } | |
549 | +OP( 0xa4, i_movsb ) { UINT32 tmp = GetMemB(DS,I.regs.w[IX]); PutMemB(ES,I.regs.w[IY], tmp); I.regs.w[IY] += -2 * I.DF + 1; I.regs.w[IX] += -2 * I.DF + 1; CLK(5); } | |
550 | +OP( 0xa5, i_movsw ) { UINT32 tmp = GetMemW(DS,I.regs.w[IX]); PutMemW(ES,I.regs.w[IY], tmp); I.regs.w[IY] += -4 * I.DF + 2; I.regs.w[IX] += -4 * I.DF + 2; CLK(5); } | |
551 | +OP( 0xa6, i_cmpsb ) { UINT32 src = GetMemB(ES, I.regs.w[IY]); UINT32 dst = GetMemB(DS, I.regs.w[IX]); SUBB; I.regs.w[IY] += -2 * I.DF + 1; I.regs.w[IX] += -2 * I.DF + 1; CLK(6); } | |
552 | +OP( 0xa7, i_cmpsw ) { UINT32 src = GetMemW(ES, I.regs.w[IY]); UINT32 dst = GetMemW(DS, I.regs.w[IX]); SUBW; I.regs.w[IY] += -4 * I.DF + 2; I.regs.w[IX] += -4 * I.DF + 2; CLK(6); } | |
553 | + | |
554 | +OP( 0xa8, i_test_ald8 ) { DEF_ald8; ANDB; CLK(1); } | |
555 | +OP( 0xa9, i_test_axd16 ) { DEF_axd16; ANDW; CLK(1); } | |
556 | +OP( 0xaa, i_stosb ) { PutMemB(ES,I.regs.w[IY],I.regs.b[AL]); I.regs.w[IY] += -2 * I.DF + 1; CLK(3); } | |
557 | +OP( 0xab, i_stosw ) { PutMemW(ES,I.regs.w[IY],I.regs.w[AW]); I.regs.w[IY] += -4 * I.DF + 2; CLK(3); } | |
558 | +OP( 0xac, i_lodsb ) { I.regs.b[AL] = GetMemB(DS,I.regs.w[IX]); I.regs.w[IX] += -2 * I.DF + 1; CLK(3); } | |
559 | +OP( 0xad, i_lodsw ) { I.regs.w[AW] = GetMemW(DS,I.regs.w[IX]); I.regs.w[IX] += -4 * I.DF + 2; CLK(3); } | |
560 | +OP( 0xae, i_scasb ) { UINT32 src = GetMemB(ES, I.regs.w[IY]); UINT32 dst = I.regs.b[AL]; SUBB; I.regs.w[IY] += -2 * I.DF + 1; CLK(4); } | |
561 | +OP( 0xaf, i_scasw ) { UINT32 src = GetMemW(ES, I.regs.w[IY]); UINT32 dst = I.regs.w[AW]; SUBW; I.regs.w[IY] += -4 * I.DF + 2; CLK(4); } | |
562 | + | |
563 | +OP( 0xb0, i_mov_ald8 ) { I.regs.b[AL] = FETCH; CLK(1); } | |
564 | +OP( 0xb1, i_mov_cld8 ) { I.regs.b[CL] = FETCH; CLK(1); } | |
565 | +OP( 0xb2, i_mov_dld8 ) { I.regs.b[DL] = FETCH; CLK(1); } | |
566 | +OP( 0xb3, i_mov_bld8 ) { I.regs.b[BL] = FETCH; CLK(1); } | |
567 | +OP( 0xb4, i_mov_ahd8 ) { I.regs.b[AH] = FETCH; CLK(1); } | |
568 | +OP( 0xb5, i_mov_chd8 ) { I.regs.b[CH] = FETCH; CLK(1); } | |
569 | +OP( 0xb6, i_mov_dhd8 ) { I.regs.b[DH] = FETCH; CLK(1); } | |
570 | +OP( 0xb7, i_mov_bhd8 ) { I.regs.b[BH] = FETCH; CLK(1); } | |
571 | + | |
572 | +OP( 0xb8, i_mov_axd16 ) { I.regs.b[AL] = FETCH; I.regs.b[AH] = FETCH; CLK(1); } | |
573 | +OP( 0xb9, i_mov_cxd16 ) { I.regs.b[CL] = FETCH; I.regs.b[CH] = FETCH; CLK(1); } | |
574 | +OP( 0xba, i_mov_dxd16 ) { I.regs.b[DL] = FETCH; I.regs.b[DH] = FETCH; CLK(1); } | |
575 | +OP( 0xbb, i_mov_bxd16 ) { I.regs.b[BL] = FETCH; I.regs.b[BH] = FETCH; CLK(1); } | |
576 | +OP( 0xbc, i_mov_spd16 ) { I.regs.b[SPL] = FETCH; I.regs.b[SPH] = FETCH; CLK(1); } | |
577 | +OP( 0xbd, i_mov_bpd16 ) { I.regs.b[BPL] = FETCH; I.regs.b[BPH] = FETCH; CLK(1); } | |
578 | +OP( 0xbe, i_mov_sid16 ) { I.regs.b[IXL] = FETCH; I.regs.b[IXH] = FETCH; CLK(1); } | |
579 | +OP( 0xbf, i_mov_did16 ) { I.regs.b[IYL] = FETCH; I.regs.b[IYH] = FETCH; CLK(1); } | |
580 | + | |
581 | +OP( 0xc0, i_rotshft_bd8 ) { | |
582 | + UINT32 src, dst; UINT8 c; | |
583 | + GetModRM; src = (unsigned)GetRMByte(ModRM); dst=src; | |
584 | + c=FETCH; | |
585 | + c&=0x1f; | |
586 | + CLKM(5,3); | |
587 | + if (c) switch (ModRM & 0x38) { | |
588 | + case 0x00: do { ROL_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
589 | + case 0x08: do { ROR_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
590 | + case 0x10: do { ROLC_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
591 | + case 0x18: do { RORC_BYTE; c--; } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
592 | + case 0x20: SHL_BYTE(c); I.AuxVal = 1; break;// | |
593 | + case 0x28: SHR_BYTE(c); I.AuxVal = 1; break;// | |
594 | + case 0x30: break; | |
595 | + case 0x38: SHRA_BYTE(c); break; | |
596 | + } | |
597 | +} | |
598 | + | |
599 | +OP( 0xc1, i_rotshft_wd8 ) { | |
600 | + UINT32 src, dst; UINT8 c; | |
601 | + GetModRM; src = (unsigned)GetRMWord(ModRM); dst=src; | |
602 | + c=FETCH; | |
603 | + c&=0x1f; | |
604 | + CLKM(5,3); | |
605 | + if (c) switch (ModRM & 0x38) { | |
606 | + case 0x00: do { ROL_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
607 | + case 0x08: do { ROR_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
608 | + case 0x10: do { ROLC_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
609 | + case 0x18: do { RORC_WORD; c--; } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
610 | + case 0x20: SHL_WORD(c); I.AuxVal = 1; break; | |
611 | + case 0x28: SHR_WORD(c); I.AuxVal = 1; break; | |
612 | + case 0x30: break; | |
613 | + case 0x38: SHRA_WORD(c); break; | |
614 | + } | |
615 | +} | |
616 | + | |
617 | +OP( 0xc2, i_ret_d16 ) { UINT32 count = FETCH; count += FETCH << 8; POP(I.ip); I.regs.w[SP]+=count; CLK(6); } | |
618 | +OP( 0xc3, i_ret ) { POP(I.ip); CLK(6); } | |
619 | +OP( 0xc4, i_les_dw ) { GetModRM; WORD tmp = GetRMWord(ModRM); RegWord(ModRM)=tmp; I.sregs[ES] = GetnextRMWord; CLK(6); } | |
620 | +OP( 0xc5, i_lds_dw ) { GetModRM; WORD tmp = GetRMWord(ModRM); RegWord(ModRM)=tmp; I.sregs[DS] = GetnextRMWord; CLK(6); } | |
621 | +OP( 0xc6, i_mov_bd8 ) { GetModRM; PutImmRMByte(ModRM); CLK(1); } | |
622 | +OP( 0xc7, i_mov_wd16 ) { GetModRM; PutImmRMWord(ModRM); CLK(1); } | |
623 | + | |
624 | +OP( 0xc8, i_enter ) { | |
625 | + UINT32 nb = FETCH; | |
626 | + UINT32 i,level; | |
627 | + | |
628 | + CLK(19); | |
629 | + nb += FETCH << 8; | |
630 | + level = FETCH; | |
631 | + PUSH(I.regs.w[BP]); | |
632 | + I.regs.w[BP]=I.regs.w[SP]; | |
633 | + I.regs.w[SP] -= nb; | |
634 | + for (i=1;i<level;i++) { | |
635 | + PUSH(GetMemW(SS,I.regs.w[BP]-i*2)); | |
636 | + CLK(4); | |
637 | + } | |
638 | + if (level) PUSH(I.regs.w[BP]); | |
639 | +} | |
640 | +OP( 0xc9, i_leave ) { | |
641 | + I.regs.w[SP]=I.regs.w[BP]; | |
642 | + POP(I.regs.w[BP]); | |
643 | + CLK(2); | |
644 | +} | |
645 | +OP( 0xca, i_retf_d16 ) { UINT32 count = FETCH; count += FETCH << 8; POP(I.ip); POP(I.sregs[CS]); I.regs.w[SP]+=count; CLK(9); } | |
646 | +OP( 0xcb, i_retf ) { POP(I.ip); POP(I.sregs[CS]); CLK(8); } | |
647 | +OP( 0xcc, i_int3 ) { nec_interrupt(3,0); CLK(9); } | |
648 | +OP( 0xcd, i_int ) { nec_interrupt(FETCH,0); CLK(10); } | |
649 | +OP( 0xce, i_into ) { if (OF) { nec_interrupt(4,0); CLK(13); } else CLK(6); } | |
650 | +OP( 0xcf, i_iret ) { POP(I.ip); POP(I.sregs[CS]); i_popf(); CLK(10); } | |
651 | + | |
652 | +OP( 0xd0, i_rotshft_b ) { | |
653 | + UINT32 src, dst; GetModRM; src = (UINT32)GetRMByte(ModRM); dst=src; | |
654 | + CLKM(3,1); | |
655 | + switch (ModRM & 0x38) { | |
656 | + case 0x00: ROL_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
657 | + case 0x08: ROR_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
658 | + case 0x10: ROLC_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
659 | + case 0x18: RORC_BYTE; PutbackRMByte(ModRM,(BYTE)dst); I.OverVal = (src^dst)&0x80; break; | |
660 | + case 0x20: SHL_BYTE(1); I.OverVal = (src^dst)&0x80;I.AuxVal = 1; break; | |
661 | + case 0x28: SHR_BYTE(1); I.OverVal = (src^dst)&0x80;I.AuxVal = 1; break; | |
662 | + case 0x30: break; | |
663 | + case 0x38: SHRA_BYTE(1); I.OverVal = 0; break; | |
664 | + } | |
665 | +} | |
666 | + | |
667 | +OP( 0xd1, i_rotshft_w ) { | |
668 | + UINT32 src, dst; GetModRM; src = (UINT32)GetRMWord(ModRM); dst=src; | |
669 | + CLKM(3,1); | |
670 | + switch (ModRM & 0x38) { | |
671 | + case 0x00: ROL_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
672 | + case 0x08: ROR_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
673 | + case 0x10: ROLC_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
674 | + case 0x18: RORC_WORD; PutbackRMWord(ModRM,(WORD)dst); I.OverVal = (src^dst)&0x8000; break; | |
675 | + case 0x20: SHL_WORD(1); I.AuxVal = 1;I.OverVal = (src^dst)&0x8000; break; | |
676 | + case 0x28: SHR_WORD(1); I.AuxVal = 1;I.OverVal = (src^dst)&0x8000; break; | |
677 | + case 0x30: break; | |
678 | + case 0x38: SHRA_WORD(1); I.AuxVal = 1;I.OverVal = 0; break; | |
679 | + } | |
680 | +} | |
681 | + | |
682 | +OP( 0xd2, i_rotshft_bcl ) { | |
683 | + UINT32 src, dst; UINT8 c; GetModRM; src = (UINT32)GetRMByte(ModRM); dst=src; | |
684 | + c=I.regs.b[CL]; | |
685 | + CLKM(5,3); | |
686 | + c&=0x1f; | |
687 | + if (c) switch (ModRM & 0x38) { | |
688 | + case 0x00: do { ROL_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
689 | + case 0x08: do { ROR_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
690 | + case 0x10: do { ROLC_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
691 | + case 0x18: do { RORC_BYTE; c--; CLK(1); } while (c>0); PutbackRMByte(ModRM,(BYTE)dst); break; | |
692 | + case 0x20: SHL_BYTE(c); I.AuxVal = 1; break; | |
693 | + case 0x28: SHR_BYTE(c); I.AuxVal = 1;break; | |
694 | + case 0x30: break; | |
695 | + case 0x38: SHRA_BYTE(c); break; | |
696 | + } | |
697 | +} | |
698 | + | |
699 | +OP( 0xd3, i_rotshft_wcl ) { | |
700 | + UINT32 src, dst; UINT8 c; GetModRM; src = (UINT32)GetRMWord(ModRM); dst=src; | |
701 | + c=I.regs.b[CL]; | |
702 | + c&=0x1f; | |
703 | + CLKM(5,3); | |
704 | + if (c) switch (ModRM & 0x38) { | |
705 | + case 0x00: do { ROL_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
706 | + case 0x08: do { ROR_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
707 | + case 0x10: do { ROLC_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
708 | + case 0x18: do { RORC_WORD; c--; CLK(1); } while (c>0); PutbackRMWord(ModRM,(WORD)dst); break; | |
709 | + case 0x20: SHL_WORD(c); I.AuxVal = 1; break; | |
710 | + case 0x28: SHR_WORD(c); I.AuxVal = 1; break; | |
711 | + case 0x30: break; | |
712 | + case 0x38: SHRA_WORD(c); break; | |
713 | + } | |
714 | +} | |
715 | + | |
716 | +OP( 0xd4, i_aam ) { UINT32 mult=FETCH; mult=0; I.regs.b[AH] = I.regs.b[AL] / 10; I.regs.b[AL] %= 10; SetSZPF_Word(I.regs.w[AW]); CLK(17); } | |
717 | +OP( 0xd5, i_aad ) { UINT32 mult=FETCH; mult=0; I.regs.b[AL] = I.regs.b[AH] * 10 + I.regs.b[AL]; I.regs.b[AH] = 0; SetSZPF_Byte(I.regs.b[AL]); CLK(6); } | |
718 | +OP( 0xd6, i_setalc ) { I.regs.b[AL] = (CF)?0xff:0x00; CLK(3); } /* nop at V30MZ? */ | |
719 | +OP( 0xd7, i_trans ) { UINT32 dest = (I.regs.w[BW]+I.regs.b[AL])&0xffff; I.regs.b[AL] = GetMemB(DS, dest); CLK(5); } | |
720 | +OP( 0xd8, i_fpo ) { GetModRM; CLK(3); } /* nop at V30MZ? */ | |
721 | + | |
722 | +OP( 0xe0, i_loopne ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if (!ZF && I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(6); } else CLK(3); } | |
723 | +OP( 0xe1, i_loope ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if ( ZF && I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(6); } else CLK(3); } | |
724 | +OP( 0xe2, i_loop ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if (I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(5); } else CLK(2); } | |
725 | +OP( 0xe3, i_jcxz ) { INT8 disp = (INT8)FETCH; if (I.regs.w[CW] == 0) { I.ip = (WORD)(I.ip+disp); CLK(4); } else CLK(1); } | |
726 | +OP( 0xe4, i_inal ) { UINT8 port = FETCH; I.regs.b[AL] = read_port(port); CLK(6); } | |
727 | +OP( 0xe5, i_inax ) { UINT8 port = FETCH; I.regs.b[AL] = read_port(port); I.regs.b[AH] = read_port(port+1); CLK(6); } | |
728 | +OP( 0xe6, i_outal ) { UINT8 port = FETCH; write_port(port, I.regs.b[AL]); CLK(6); } | |
729 | +OP( 0xe7, i_outax ) { UINT8 port = FETCH; write_port(port, I.regs.b[AL]); write_port(port+1, I.regs.b[AH]); CLK(6); } | |
730 | + | |
731 | +OP( 0xe8, i_call_d16 ) { UINT32 tmp; FETCHWORD(tmp); PUSH(I.ip); I.ip = (WORD)(I.ip+(INT16)tmp); CLK(5); } | |
732 | +OP( 0xe9, i_jmp_d16 ) { UINT32 tmp; FETCHWORD(tmp); I.ip = (WORD)(I.ip+(INT16)tmp); CLK(4); } | |
733 | +OP( 0xea, i_jmp_far ) { UINT32 tmp,tmp1; FETCHWORD(tmp); FETCHWORD(tmp1); I.sregs[CS] = (WORD)tmp1; I.ip = (WORD)tmp; CLK(7); } | |
734 | +OP( 0xeb, i_jmp_d8 ) { int tmp = (int)((INT8)FETCH); CLK(4); | |
735 | + if (tmp==-2 && no_interrupt==0 && nec_ICount>0) nec_ICount%=12; /* cycle skip */ | |
736 | + I.ip = (WORD)(I.ip+tmp); | |
737 | +} | |
738 | +OP( 0xec, i_inaldx ) { I.regs.b[AL] = read_port(I.regs.w[DW]); CLK(6);} | |
739 | +OP( 0xed, i_inaxdx ) { UINT32 port = I.regs.w[DW]; I.regs.b[AL] = read_port(port); I.regs.b[AH] = read_port(port+1); CLK(6); } | |
740 | +OP( 0xee, i_outdxal ) { write_port(I.regs.w[DW], I.regs.b[AL]); CLK(6); } | |
741 | +OP( 0xef, i_outdxax ) { UINT32 port = I.regs.w[DW]; write_port(port, I.regs.b[AL]); write_port(port+1, I.regs.b[AH]); CLK(6); } | |
742 | + | |
743 | +OP( 0xf0, i_lock ) { no_interrupt=1; CLK(1); } | |
744 | +#define THROUGH \ | |
745 | + if(nec_ICount<0){ \ | |
746 | + if(seg_prefix) \ | |
747 | + I.ip-=(UINT16)3; \ | |
748 | + else \ | |
749 | + I.ip-=(UINT16)2; \ | |
750 | + break;} | |
751 | + | |
752 | +OP( 0xf2, i_repne ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
753 | + switch(next) { /* Segments */ | |
754 | + case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
755 | + case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
756 | + case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
757 | + case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
758 | + } | |
759 | + | |
760 | + switch(next) { | |
761 | + case 0x6c: CLK(2); if (c) do { i_insb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
762 | + case 0x6d: CLK(2); if (c) do { i_insw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
763 | + case 0x6e: CLK(2); if (c) do { i_outsb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
764 | + case 0x6f: CLK(2); if (c) do { i_outsw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
765 | + case 0xa4: CLK(2); if (c) do { i_movsb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
766 | + case 0xa5: CLK(2); if (c) do { i_movsw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
767 | + case 0xa6: CLK(5); if (c) do { THROUGH; i_cmpsb(); c--; CLK(3); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
768 | + case 0xa7: CLK(5); if (c) do { THROUGH; i_cmpsw(); c--; CLK(3); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
769 | + case 0xaa: CLK(2); if (c) do { i_stosb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
770 | + case 0xab: CLK(2); if (c) do { i_stosw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
771 | + case 0xac: CLK(2); if (c) do { i_lodsb(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
772 | + case 0xad: CLK(2); if (c) do { i_lodsw(); c--; } while (c>0); I.regs.w[CW]=c; break; | |
773 | + case 0xae: CLK(5); if (c) do { THROUGH; i_scasb(); c--; CLK(5); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
774 | + case 0xaf: CLK(5); if (c) do { THROUGH; i_scasw(); c--; CLK(5); } while (c>0 && ZF==0); I.regs.w[CW]=c; break; | |
775 | + default: nec_instruction[next](); | |
776 | + } | |
777 | + seg_prefix=FALSE; | |
778 | +} | |
779 | +OP( 0xf3, i_repe ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; | |
780 | + switch(next) { /* Segments */ | |
781 | + case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[ES]<<4; next = FETCHOP; CLK(2); break; | |
782 | + case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[CS]<<4; next = FETCHOP; CLK(2); break; | |
783 | + case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; | |
784 | + case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS]<<4; next = FETCHOP; CLK(2); break; | |
785 | + } | |
786 | + | |
787 | + switch(next) { | |
788 | + case 0x6c: CLK(5); if (c) do { THROUGH; i_insb(); c--; CLK( 0); } while (c>0); I.regs.w[CW]=c; break; | |
789 | + case 0x6d: CLK(5); if (c) do { THROUGH; i_insw(); c--; CLK( 0); } while (c>0); I.regs.w[CW]=c; break; | |
790 | + case 0x6e: CLK(5); if (c) do { THROUGH; i_outsb(); c--; CLK(-1); } while (c>0); I.regs.w[CW]=c; break; | |
791 | + case 0x6f: CLK(5); if (c) do { THROUGH; i_outsw(); c--; CLK(-1); } while (c>0); I.regs.w[CW]=c; break; | |
792 | + case 0xa4: CLK(5); if (c) do { THROUGH; i_movsb(); c--; CLK( 2); } while (c>0); I.regs.w[CW]=c; break; | |
793 | + case 0xa5: CLK(5); if (c) do { THROUGH; i_movsw(); c--; CLK( 2); } while (c>0); I.regs.w[CW]=c; break; | |
794 | + case 0xa6: CLK(5); if (c) do { THROUGH; i_cmpsb(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
795 | + case 0xa7: CLK(5); if (c) do { THROUGH; i_cmpsw(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
796 | + case 0xaa: CLK(5); if (c) do { THROUGH; i_stosb(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
797 | + case 0xab: CLK(5); if (c) do { THROUGH; i_stosw(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
798 | + case 0xac: CLK(5); if (c) do { THROUGH; i_lodsb(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
799 | + case 0xad: CLK(5); if (c) do { THROUGH; i_lodsw(); c--; CLK( 3); } while (c>0); I.regs.w[CW]=c; break; | |
800 | + case 0xae: CLK(5); if (c) do { THROUGH; i_scasb(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
801 | + case 0xaf: CLK(5); if (c) do { THROUGH; i_scasw(); c--; CLK( 4); } while (c>0 && ZF==1); I.regs.w[CW]=c; break; | |
802 | + default: nec_instruction[next](); | |
803 | + } | |
804 | + seg_prefix=FALSE; | |
805 | +} | |
806 | +OP( 0xf4, i_hlt ) { nec_ICount=0; } | |
807 | + | |
808 | + | |
809 | + | |
810 | + | |
811 | + | |
812 | +OP( 0xf5, i_cmc ) { I.CarryVal = !CF; CLK(4); } | |
813 | +OP( 0xf6, i_f6pre ) { UINT32 tmp; UINT32 uresult,uresult2; INT32 result,result2; | |
814 | + GetModRM; tmp = GetRMByte(ModRM); | |
815 | + switch (ModRM & 0x38) { | |
816 | + case 0x00: tmp &= FETCH; I.CarryVal = I.OverVal = I.AuxVal=0; SetSZPF_Byte(tmp); CLKM(2,1); break; /* TEST */ | |
817 | + case 0x08: break; | |
818 | + case 0x10: PutbackRMByte(ModRM,~tmp); CLKM(3,1); break; /* NOT */ | |
819 | + | |
820 | + case 0x18: I.CarryVal=(tmp!=0);tmp=(~tmp)+1; SetSZPF_Byte(tmp); PutbackRMByte(ModRM,tmp&0xff); CLKM(3,1); break; /* NEG */ | |
821 | + case 0x20: uresult = I.regs.b[AL]*tmp; I.regs.w[AW]=(WORD)uresult; I.CarryVal=I.OverVal=(I.regs.b[AH]!=0); CLKM(4,3); break; /* MULU */ | |
822 | + case 0x28: result = (INT16)((INT8)I.regs.b[AL])*(INT16)((INT8)tmp); I.regs.w[AW]=(WORD)result; I.CarryVal=I.OverVal=(I.regs.b[AH]!=0); CLKM(4,3); break; /* MUL */ | |
823 | + case 0x30: if (tmp) { DIVUB; } else nec_interrupt(0,0); CLKM(16,15); break; | |
824 | + case 0x38: if (tmp) { DIVB; } else nec_interrupt(0,0); CLKM(18,17); break; | |
825 | + } | |
826 | +} | |
827 | + | |
828 | +OP( 0xf7, i_f7pre ) { UINT32 tmp,tmp2; UINT32 uresult,uresult2; INT32 result,result2; | |
829 | + GetModRM; tmp = GetRMWord(ModRM); | |
830 | + switch (ModRM & 0x38) { | |
831 | + case 0x00: FETCHWORD(tmp2); tmp &= tmp2; I.CarryVal = I.OverVal = I.AuxVal=0; SetSZPF_Word(tmp); CLKM(2,1); break; /* TEST */ | |
832 | + case 0x08: break; | |
833 | + case 0x10: PutbackRMWord(ModRM,~tmp); CLKM(3,1); break; /* NOT */ | |
834 | + case 0x18: I.CarryVal=(tmp!=0); tmp=(~tmp)+1; SetSZPF_Word(tmp); PutbackRMWord(ModRM,tmp&0xffff); CLKM(3,1); break; /* NEG */ | |
835 | + case 0x20: uresult = I.regs.w[AW]*tmp; I.regs.w[AW]=uresult&0xffff; I.regs.w[DW]=((UINT32)uresult)>>16; I.CarryVal=I.OverVal=(I.regs.w[DW]!=0); CLKM(4,3); break; /* MULU */ | |
836 | + case 0x28: result = (INT32)((INT16)I.regs.w[AW])*(INT32)((INT16)tmp); I.regs.w[AW]=result&0xffff; I.regs.w[DW]=result>>16; I.CarryVal=I.OverVal=(I.regs.w[DW]!=0); CLKM(4,3); break; /* MUL */ | |
837 | + case 0x30: if (tmp) { DIVUW; } else nec_interrupt(0,0); CLKM(24,23); break; | |
838 | + case 0x38: if (tmp) { DIVW; } else nec_interrupt(0,0); CLKM(25,24); break; | |
839 | + } | |
840 | +} | |
841 | + | |
842 | +OP( 0xf8, i_clc ) { I.CarryVal = 0; CLK(4); } | |
843 | +OP( 0xf9, i_stc ) { I.CarryVal = 1; CLK(4); } | |
844 | +OP( 0xfa, i_di ) { SetIF(0); CLK(4); } | |
845 | +OP( 0xfb, i_ei ) { SetIF(1); CLK(4); } | |
846 | +OP( 0xfc, i_cld ) { SetDF(0); CLK(4); } | |
847 | +OP( 0xfd, i_std ) { SetDF(1); CLK(4); } | |
848 | +OP( 0xfe, i_fepre ) { UINT32 tmp, tmp1; GetModRM; tmp=GetRMByte(ModRM); | |
849 | + switch(ModRM & 0x38) { | |
850 | + case 0x00: tmp1 = tmp+1; I.OverVal = (tmp==0x7f); SetAF(tmp1,tmp,1); SetSZPF_Byte(tmp1); PutbackRMByte(ModRM,(BYTE)tmp1); CLKM(3,1); break; /* INC */ | |
851 | + case 0x08: tmp1 = tmp-1; I.OverVal = (tmp==0x80); SetAF(tmp1,tmp,1); SetSZPF_Byte(tmp1); PutbackRMByte(ModRM,(BYTE)tmp1); CLKM(3,1); break; /* DEC */ | |
852 | + } | |
853 | +} | |
854 | +OP( 0xff, i_ffpre ) { UINT32 tmp, tmp1; GetModRM; tmp=GetRMWord(ModRM); | |
855 | + switch(ModRM & 0x38) { | |
856 | + case 0x00: tmp1 = tmp+1; I.OverVal = (tmp==0x7fff); SetAF(tmp1,tmp,1); SetSZPF_Word(tmp1); PutbackRMWord(ModRM,(WORD)tmp1); CLKM(3,1); break; /* INC */ | |
857 | + case 0x08: tmp1 = tmp-1; I.OverVal = (tmp==0x8000); SetAF(tmp1,tmp,1); SetSZPF_Word(tmp1); PutbackRMWord(ModRM,(WORD)tmp1); CLKM(3,1); break; /* DEC */ | |
858 | + case 0x10: PUSH(I.ip); I.ip = (WORD)tmp; CLKM(6,5); break; /* CALL */ | |
859 | + case 0x18: tmp1 = I.sregs[CS]; I.sregs[CS] = GetnextRMWord; PUSH(tmp1); PUSH(I.ip); I.ip = tmp; CLKM(12,1); break; /* CALL FAR */ | |
860 | + case 0x20: I.ip = tmp; CLKM(5,4); break; /* JMP */ | |
861 | + case 0x28: I.ip = tmp; I.sregs[CS] = GetnextRMWord; CLKM(10,1); break; /* JMP FAR */ | |
862 | + case 0x30: PUSH(tmp); CLKM(2,1); break; | |
863 | + default: ; | |
864 | + } | |
865 | +} | |
866 | + | |
867 | +static void i_invalid(void) | |
868 | +{ | |
869 | + CLK(10); | |
870 | +} | |
871 | + | |
872 | +/*****************************************************************************/ | |
873 | + | |
874 | + | |
875 | +unsigned nec_get_reg(int regnum) | |
876 | +{ | |
877 | + switch( regnum ) | |
878 | + { | |
879 | + case NEC_IP: return I.ip; | |
880 | + case NEC_SP: return I.regs.w[SP]; | |
881 | + case NEC_FLAGS: return CompressFlags(); | |
882 | + case NEC_AW: return I.regs.w[AW]; | |
883 | + case NEC_CW: return I.regs.w[CW]; | |
884 | + case NEC_DW: return I.regs.w[DW]; | |
885 | + case NEC_BW: return I.regs.w[BW]; | |
886 | + case NEC_BP: return I.regs.w[BP]; | |
887 | + case NEC_IX: return I.regs.w[IX]; | |
888 | + case NEC_IY: return I.regs.w[IY]; | |
889 | + case NEC_ES: return I.sregs[ES]; | |
890 | + case NEC_CS: return I.sregs[CS]; | |
891 | + case NEC_SS: return I.sregs[SS]; | |
892 | + case NEC_DS: return I.sregs[DS]; | |
893 | + case NEC_VECTOR: return I.int_vector; | |
894 | + case NEC_PENDING: return I.pending_irq; | |
895 | + case NEC_NMI_STATE: return I.nmi_state; | |
896 | + case NEC_IRQ_STATE: return I.irq_state; | |
897 | + } | |
898 | + return 0; | |
899 | +} | |
900 | + | |
901 | +void nec_set_irq_line(int irqline, int state); | |
902 | + | |
903 | +void nec_set_reg(int regnum, unsigned val) | |
904 | +{ | |
905 | + switch( regnum ) | |
906 | + { | |
907 | + case NEC_IP: I.ip = val; break; | |
908 | + case NEC_SP: I.regs.w[SP] = val; break; | |
909 | + case NEC_FLAGS: ExpandFlags(val); break; | |
910 | + case NEC_AW: I.regs.w[AW] = val; break; | |
911 | + case NEC_CW: I.regs.w[CW] = val; break; | |
912 | + case NEC_DW: I.regs.w[DW] = val; break; | |
913 | + case NEC_BW: I.regs.w[BW] = val; break; | |
914 | + case NEC_BP: I.regs.w[BP] = val; break; | |
915 | + case NEC_IX: I.regs.w[IX] = val; break; | |
916 | + case NEC_IY: I.regs.w[IY] = val; break; | |
917 | + case NEC_ES: I.sregs[ES] = val; break; | |
918 | + case NEC_CS: I.sregs[CS] = val; break; | |
919 | + case NEC_SS: I.sregs[SS] = val; break; | |
920 | + case NEC_DS: I.sregs[DS] = val; break; | |
921 | + case NEC_VECTOR: I.int_vector = val; break; | |
922 | + } | |
923 | +} | |
924 | + | |
925 | + | |
926 | +int nec_execute(int cycles) | |
927 | +{ | |
928 | + | |
929 | + | |
930 | + nec_ICount=cycles; | |
931 | +// cpu_type=V30; | |
932 | + | |
933 | + while(nec_ICount>0) { | |
934 | + | |
935 | + nec_instruction[FETCHOP](); | |
936 | + nec_ICount++; | |
937 | + } | |
938 | +/* | |
939 | + while(nec_ICount>=0) { | |
940 | + | |
941 | + nec_instruction[FETCHOP](); | |
942 | +// nec_ICount++; | |
943 | + } | |
944 | +*/ | |
945 | + return cycles - nec_ICount; | |
946 | +} | |
947 | + |
@@ -0,0 +1,1119 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include <time.h> | |
7 | +#include "WSRender.h" | |
8 | +#include "WS.h" | |
9 | +#include "WSDraw.h" | |
10 | +#include "WSInput.h" | |
11 | +#include "WSApu.h" | |
12 | +#include "WSFileio.h" | |
13 | +#include "WSPdata.h" | |
14 | +#include "WSBandai.h" | |
15 | +#include "WSError.h" | |
16 | +#include "nec/necintrf.h" | |
17 | + | |
18 | +#define IPeriod 32 // HBlank/8 (256/8) | |
19 | + | |
20 | +int Run; | |
21 | +BYTE *Page[16]; // バンク割り当て | |
22 | +BYTE IRAM[0x10000]; // 内部RAM 64kB = Page[0] | |
23 | +BYTE IO[0x100]; // IO | |
24 | +BYTE MemDummy[0x10000]; // ダミーバンク 64kB | |
25 | +BYTE *ROMMap[0x100]; // C-ROMバンクマップ | |
26 | +int ROMBanks; // C-ROMバンク数 | |
27 | +BYTE *RAMMap[0x100]; // C-RAMバンクマップ | |
28 | +int RAMBanks; // C-RAMバンク数 | |
29 | +int RAMSize; // C-RAM総容量 | |
30 | +WORD IEep[64]; // 内蔵EEPROM | |
31 | +struct EEPROM sIEep; // EEPROM読み書き用構造体(内蔵) | |
32 | +struct EEPROM sCEep; // EEPROM読み書き用構造体(カートリッジ) | |
33 | +int CartKind; // セーブメモリの種類(CK_EEP = EEPROM) | |
34 | + | |
35 | +static int ButtonState = 0x0000; // Button state: B.A.START.OPTION.X4.X3.X2.X1.Y4.Y3.Y2.Y1 | |
36 | +static WORD HTimer; | |
37 | +static WORD VTimer; | |
38 | +static int RtcCount; | |
39 | +static int RAMEnable; | |
40 | +static int FrameSkip = 0; | |
41 | +static int SkipCnt = 0; | |
42 | +static int TblSkip[5][5] = { | |
43 | + {1,1,1,1,1}, | |
44 | + {0,1,1,1,1}, | |
45 | + {0,1,0,1,1}, | |
46 | + {0,0,1,0,1}, | |
47 | + {0,0,0,0,1}, | |
48 | +}; | |
49 | +#define MONO(C) 0xF000 | (C)<<8 | (C)<<4 | (C) | |
50 | +static WORD DefColor[] = { | |
51 | + MONO(0xF), MONO(0xE), MONO(0xD), MONO(0xC), MONO(0xB), MONO(0xA), MONO(0x9), MONO(0x8), | |
52 | + MONO(0x7), MONO(0x6), MONO(0x5), MONO(0x4), MONO(0x3), MONO(0x2), MONO(0x1), MONO(0x0) | |
53 | +}; | |
54 | + | |
55 | +void ComEeprom(struct EEPROM *eeprom, WORD *cmd, WORD *data) | |
56 | +{ | |
57 | + int i, j, op, addr; | |
58 | + const int tblmask[16][5]= | |
59 | + { | |
60 | + {0x0000, 0, 0x0000, 0, 0x0000}, // dummy | |
61 | + {0x0000, 0, 0x0000, 0, 0x0000}, | |
62 | + {0x0000, 0, 0x0000, 0, 0x0000}, | |
63 | + {0x0000, 0, 0x0000, 0, 0x0000}, | |
64 | + {0x000C, 2, 0x0003, 0, 0x0003}, | |
65 | + {0x0018, 3, 0x0006, 1, 0x0007}, | |
66 | + {0x0030, 4, 0x000C, 2, 0x000F}, | |
67 | + {0x0060, 5, 0x0018, 3, 0x001F}, | |
68 | + {0x00C0, 6, 0x0030, 4, 0x003F}, // 1Kbits IEEPROM | |
69 | + {0x0180, 7, 0x0060, 5, 0x007F}, | |
70 | + {0x0300, 8, 0x00C0, 6, 0x00FF}, | |
71 | + {0x0600, 9, 0x0180, 7, 0x01FF}, | |
72 | + {0x0C00, 10, 0x0300, 8, 0x03FF}, // 16Kbits | |
73 | + {0x1800, 11, 0x0600, 9, 0x07FF}, | |
74 | + {0x3000, 12, 0x0C00, 10, 0x0FFF}, | |
75 | + {0x6000, 13, 0x1800, 11, 0x1FFF}, | |
76 | + }; | |
77 | + if(eeprom->data == NULL) | |
78 | + { | |
79 | + return; | |
80 | + } | |
81 | + for(i = 15, j = 0x8000; i >= 0; i--, j >>= 1) | |
82 | + { | |
83 | + if(*cmd & j) | |
84 | + { | |
85 | + break; | |
86 | + } | |
87 | + } | |
88 | + op = (*cmd & tblmask[i][0]) >> tblmask[i][1]; | |
89 | + switch(op) | |
90 | + { | |
91 | + case 0: | |
92 | + addr = (*cmd & tblmask[i][2]) >> tblmask[i][3]; | |
93 | + switch(addr) | |
94 | + { | |
95 | + case 0: // 書込み禁止 | |
96 | + eeprom->we = 0; | |
97 | + break; | |
98 | + case 1: // 全アドレス書き込み | |
99 | + for(j = tblmask[i][4]; j >= 0; j--) | |
100 | + { | |
101 | + eeprom->data[j] = *data; | |
102 | + } | |
103 | + break; | |
104 | + case 2: // チップ消去 | |
105 | + if(eeprom->we) | |
106 | + { | |
107 | + memset(eeprom->data, 0xFF, sizeof(eeprom->data)*2); | |
108 | + } | |
109 | + break; | |
110 | + case 3: // 書き込み可能 | |
111 | + eeprom->we = 1; | |
112 | + break; | |
113 | + } | |
114 | + *data = 0; | |
115 | + break; | |
116 | + case 1: // 書き込み | |
117 | + if(eeprom->we) | |
118 | + { | |
119 | + addr = *cmd & tblmask[i][4]; | |
120 | + eeprom->data[addr] = *data; | |
121 | + if (ROMBanks == 1 && addr == 0x3A) // アナザヘブンも書き込んでた | |
122 | + { | |
123 | + WsSplash(); | |
124 | + Run = 0; // パーソナルデータ最後の書き込みなので終了 | |
125 | + } | |
126 | + } | |
127 | + *data = 0; | |
128 | + break; | |
129 | + case 2: // 読み出し | |
130 | + addr = *cmd & tblmask[i][4]; | |
131 | + *data = eeprom->data[addr]; | |
132 | + break; | |
133 | + case 3: // 消去 | |
134 | + if(eeprom->we) | |
135 | + { | |
136 | + addr = *cmd & tblmask[i][4]; | |
137 | + eeprom->data[addr] = 0xFFFF; | |
138 | + } | |
139 | + *data = 0; | |
140 | + break; | |
141 | + default: break; | |
142 | + } | |
143 | +} | |
144 | + | |
145 | +BYTE ReadMem(DWORD A) | |
146 | +{ | |
147 | + return Page[(A >> 16) & 0xF][A & 0xFFFF]; | |
148 | +} | |
149 | + | |
150 | +void WriteMem(DWORD A, BYTE V) | |
151 | +{ | |
152 | + (*WriteMemFnTable[(A >> 16) & 0x0F])(A, V); | |
153 | +} | |
154 | + | |
155 | +typedef void (*WriteMemFn)(DWORD A, BYTE V); | |
156 | + | |
157 | +static void WriteRom(DWORD A, BYTE V) | |
158 | +{ | |
159 | + //ErrorMsg(ERR_WRITE_ROM); | |
160 | +} | |
161 | + | |
162 | +static void WriteIRam(DWORD A, BYTE V) | |
163 | +{ | |
164 | + IRAM[A & 0xFFFF] = V; | |
165 | + if((A & 0xFE00) == 0xFE00) | |
166 | + { | |
167 | + SetPalette(A); | |
168 | + } | |
169 | + if(!((A - WaveMap) & 0xFFC0)) | |
170 | + { | |
171 | + apuSetPData(A & 0x003F, V); | |
172 | + } | |
173 | +} | |
174 | + | |
175 | +#define FLASH_CMD_ADDR1 0x0AAA | |
176 | +#define FLASH_CMD_ADDR2 0x0555 | |
177 | +#define FLASH_CMD_DATA1 0xAA | |
178 | +#define FLASH_CMD_DATA2 0x55 | |
179 | +#define FLASH_CMD_RESET 0xF0 | |
180 | +#define FLASH_CMD_ERASE 0x80 | |
181 | +#define FLASH_CMD_ERASE_CHIP 0x10 | |
182 | +#define FLASH_CMD_ERASE_SECT 0x30 | |
183 | +#define FLASH_CMD_CONTINUE_SET 0x20 | |
184 | +#define FLASH_CMD_CONTINUE_RES1 0x90 | |
185 | +#define FLASH_CMD_CONTINUE_RES2 0xF0 | |
186 | +#define FLASH_CMD_CONTINUE_RES3 0x00 | |
187 | +#define FLASH_CMD_WRITE 0xA0 | |
188 | +static void WriteCRam(DWORD A, BYTE V) | |
189 | +{ | |
190 | + static int flashCommand1 = 0; | |
191 | + static int flashCommand2 = 0; | |
192 | + static int flashWriteSet = 0; | |
193 | + static int flashWriteOne = 0; | |
194 | + static int flashWriteReset = 0; | |
195 | + static int flashWriteEnable = 0; | |
196 | + int offset = A & 0xFFFF; | |
197 | + | |
198 | + if (offset >= RAMSize) | |
199 | + { | |
200 | + ErrorMsg(ERR_OVER_RAMSIZE); | |
201 | + } | |
202 | + // WonderWitch | |
203 | + // FLASH ROM command sequence | |
204 | + if (flashCommand2) | |
205 | + { | |
206 | + if (offset == FLASH_CMD_ADDR1) | |
207 | + { | |
208 | + switch (V) { | |
209 | + case FLASH_CMD_CONTINUE_SET: | |
210 | + flashWriteSet = 1; | |
211 | + flashWriteReset = 0; | |
212 | + break; | |
213 | + case FLASH_CMD_WRITE: | |
214 | + flashWriteOne = 1; | |
215 | + break; | |
216 | + case FLASH_CMD_RESET: | |
217 | + break; | |
218 | + case FLASH_CMD_ERASE: | |
219 | + break; | |
220 | + case FLASH_CMD_ERASE_CHIP: | |
221 | + break; | |
222 | + case FLASH_CMD_ERASE_SECT: | |
223 | + break; | |
224 | + } | |
225 | + } | |
226 | + flashCommand2 = 0; | |
227 | + } | |
228 | + else if (flashCommand1) | |
229 | + { | |
230 | + if (offset == FLASH_CMD_ADDR2 && V == FLASH_CMD_DATA2) | |
231 | + { | |
232 | + flashCommand2 = 1; | |
233 | + } | |
234 | + flashCommand1 = 0; | |
235 | + } | |
236 | + else if (offset == FLASH_CMD_ADDR1 && V == FLASH_CMD_DATA1) | |
237 | + { | |
238 | + flashCommand1 = 1; | |
239 | + } | |
240 | + if (RAMSize != 0x40000 || IO[BNK1SLCT] < 8) | |
241 | + { | |
242 | + // normal sram | |
243 | + Page[1][offset] = V; | |
244 | + } | |
245 | + else if (IO[BNK1SLCT] >= 8 && IO[BNK1SLCT] < 15) | |
246 | + { | |
247 | + // FLASH ROM use SRAM bank(port 0xC1:8-14)(0xC1:15 0xF0000-0xFFFFF are write protected) | |
248 | + if (flashWriteEnable || flashWriteOne) | |
249 | + { | |
250 | + Page[IO[BNK1SLCT]][offset] = V; | |
251 | + flashWriteEnable = 0; | |
252 | + flashWriteOne = 0; | |
253 | + } | |
254 | + else if (flashWriteSet) | |
255 | + { | |
256 | + switch (V) | |
257 | + { | |
258 | + case FLASH_CMD_WRITE: | |
259 | + flashWriteEnable = 1; | |
260 | + flashWriteReset = 0; | |
261 | + break; | |
262 | + case FLASH_CMD_CONTINUE_RES1: | |
263 | + flashWriteReset = 1; | |
264 | + break; | |
265 | + case FLASH_CMD_CONTINUE_RES2: | |
266 | + case FLASH_CMD_CONTINUE_RES3: | |
267 | + if (flashWriteReset) | |
268 | + { | |
269 | + flashWriteSet = 0; | |
270 | + flashWriteReset = 0; | |
271 | + } | |
272 | + break; | |
273 | + default: | |
274 | + flashWriteReset = 0; | |
275 | + } | |
276 | + } | |
277 | + } | |
278 | +} | |
279 | + | |
280 | +void WriteIO(DWORD A, BYTE V) | |
281 | +{ | |
282 | + int i, j, k; | |
283 | + | |
284 | + if(A >= 0x100) | |
285 | + { | |
286 | + return; | |
287 | + } | |
288 | + switch(A) | |
289 | + { | |
290 | + case 0x07: | |
291 | + Scr1TMap = IRAM + ((V & 0x0F) << 11); | |
292 | + Scr2TMap = IRAM + ((V & 0xF0) << 7); | |
293 | + break; | |
294 | + case 0x15: | |
295 | + if (V & 0x01) | |
296 | + { | |
297 | + Segment[8] = 1; | |
298 | + RenderSleep(); | |
299 | + } | |
300 | + else | |
301 | + { | |
302 | + Segment[8] = 0; | |
303 | + } | |
304 | + if (V & 0x02) | |
305 | + { | |
306 | + SetDrawMode(1); | |
307 | + Segment[4] = 1; | |
308 | + } | |
309 | + else | |
310 | + { | |
311 | + Segment[4] = 0; | |
312 | + } | |
313 | + if (V & 0x04) | |
314 | + { | |
315 | + SetDrawMode(0); | |
316 | + Segment[3] = 1; | |
317 | + } | |
318 | + else | |
319 | + { | |
320 | + Segment[3] = 0; | |
321 | + } | |
322 | + if (V & 0x08) | |
323 | + { | |
324 | + Segment[2] = 1; | |
325 | + } | |
326 | + else | |
327 | + { | |
328 | + Segment[2] = 0; | |
329 | + } | |
330 | + if (V & 0x10) | |
331 | + { | |
332 | + Segment[1] = 1; | |
333 | + } | |
334 | + else | |
335 | + { | |
336 | + Segment[1] = 0; | |
337 | + } | |
338 | + if (V & 0x20) | |
339 | + { | |
340 | + Segment[0] = 1; | |
341 | + } | |
342 | + else | |
343 | + { | |
344 | + Segment[0] = 0; | |
345 | + } | |
346 | + break; | |
347 | + case 0x1C: | |
348 | + case 0x1D: | |
349 | + case 0x1E: | |
350 | + case 0x1F: | |
351 | + if(IO[COLCTL] & 0x80) break; | |
352 | + i = (A - 0x1C) << 1; | |
353 | + MonoColor[i] = DefColor[V & 0x0F]; | |
354 | + MonoColor[i + 1] = DefColor[(V & 0xF0) >> 4]; | |
355 | + for(k = 0x20; k < 0x40; k++) | |
356 | + { | |
357 | + i = (k & 0x1E) >> 1; | |
358 | + j = 0; | |
359 | + if(k & 0x01) j = 2; | |
360 | + Palette[i][j] = MonoColor[IO[k] & 0x07]; | |
361 | + Palette[i][j + 1] = MonoColor[(IO[k] >> 4) & 0x07]; | |
362 | + } | |
363 | + break; | |
364 | + case 0x20: | |
365 | + case 0x21: | |
366 | + case 0x22: | |
367 | + case 0x23: | |
368 | + case 0x24: | |
369 | + case 0x25: | |
370 | + case 0x26: | |
371 | + case 0x27: | |
372 | + case 0x28: | |
373 | + case 0x29: | |
374 | + case 0x2A: | |
375 | + case 0x2B: | |
376 | + case 0x2C: | |
377 | + case 0x2D: | |
378 | + case 0x2E: | |
379 | + case 0x2F: | |
380 | + case 0x30: | |
381 | + case 0x31: | |
382 | + case 0x32: | |
383 | + case 0x33: | |
384 | + case 0x34: | |
385 | + case 0x35: | |
386 | + case 0x36: | |
387 | + case 0x37: | |
388 | + case 0x38: | |
389 | + case 0x39: | |
390 | + case 0x3A: | |
391 | + case 0x3B: | |
392 | + case 0x3C: | |
393 | + case 0x3D: | |
394 | + case 0x3E: | |
395 | + case 0x3F: | |
396 | + if (IO[COLCTL] & 0x80) break; | |
397 | + i = (A & 0x1E) >> 1; | |
398 | + j = 0; | |
399 | + if (A & 0x01) j = 2; | |
400 | + Palette[i][j] = MonoColor[V & 0x07]; | |
401 | + Palette[i][j + 1] = MonoColor[(V >> 4) & 0x07]; | |
402 | + break; | |
403 | + case 0x48: | |
404 | + if(V & 0x80) | |
405 | + { | |
406 | + i = *(DWORD*)(IO + DMASRC); // IO[]が4バイト境界にあることが必要 | |
407 | + j = *(WORD*)(IO + DMADST); | |
408 | + k = *(WORD*)(IO + DMACNT); | |
409 | + while(k--) | |
410 | + { | |
411 | + WriteMem(j++, ReadMem(i++)); | |
412 | + } | |
413 | + *(WORD*)(IO + DMACNT) = 0; | |
414 | + *(DWORD*)(IO + DMASRC) = i; // IO[]が4バイト境界にあることが必要 | |
415 | + *(WORD*)(IO + DMADST) = j; | |
416 | + V &= 0x7F; | |
417 | + } | |
418 | + break; | |
419 | + case 0x80: | |
420 | + case 0x81: | |
421 | + IO[A] = V; | |
422 | + Ch[0].freq = *(WORD*)(IO + SND1FRQ); | |
423 | + return; | |
424 | + case 0x82: | |
425 | + case 0x83: | |
426 | + IO[A] = V; | |
427 | + Ch[1].freq = *(WORD*)(IO + SND2FRQ); | |
428 | + return; | |
429 | + case 0x84: | |
430 | + case 0x85: | |
431 | + IO[A] = V; | |
432 | + Ch[2].freq = *(WORD*)(IO + SND3FRQ); | |
433 | + return; | |
434 | + case 0x86: | |
435 | + case 0x87: | |
436 | + IO[A] = V; | |
437 | + Ch[3].freq = *(WORD*)(IO + SND4FRQ); | |
438 | + return; | |
439 | + case 0x88: | |
440 | + Ch[0].volL = (V >> 4) & 0x0F; | |
441 | + Ch[0].volR = V & 0x0F; | |
442 | + break; | |
443 | + case 0x89: | |
444 | + Ch[1].volL = (V >> 4) & 0x0F; | |
445 | + Ch[1].volR = V & 0x0F; | |
446 | + break; | |
447 | + case 0x8A: | |
448 | + Ch[2].volL = (V >> 4) & 0x0F; | |
449 | + Ch[2].volR = V & 0x0F; | |
450 | + break; | |
451 | + case 0x8B: | |
452 | + Ch[3].volL = (V >> 4) & 0x0F; | |
453 | + Ch[3].volR = V & 0x0F; | |
454 | + break; | |
455 | + case 0x8C: | |
456 | + Swp.step = (signed char)V; | |
457 | + break; | |
458 | + case 0x8D: | |
459 | + Swp.time = (V + 1) << 5; | |
460 | + break; | |
461 | + case 0x8E: | |
462 | + Noise.pattern = V & 0x07; | |
463 | + break; | |
464 | + case 0x8F: | |
465 | + WaveMap = V << 6; | |
466 | + for (i = 0; i < 64; i++) { | |
467 | + apuSetPData(WaveMap + i, IRAM[WaveMap + i]); | |
468 | + } | |
469 | + break; | |
470 | + case 0x90: | |
471 | + Ch[0].on = V & 0x01; | |
472 | + Ch[1].on = V & 0x02; | |
473 | + Ch[2].on = V & 0x04; | |
474 | + Ch[3].on = V & 0x08; | |
475 | + VoiceOn = V & 0x20; | |
476 | + Swp.on = V & 0x40; | |
477 | + Noise.on = V & 0x80; | |
478 | + break; | |
479 | + case 0x91: | |
480 | + V |= 0x80; // ヘッドホンは常にオン | |
481 | + break; | |
482 | + case 0xA0: | |
483 | + V=0x02; | |
484 | + break; | |
485 | + case 0xA2: | |
486 | + if(V & 0x01) | |
487 | + { | |
488 | + HTimer = *(WORD*)(IO + HPRE); | |
489 | + } | |
490 | + else | |
491 | + { | |
492 | + HTimer = 0; | |
493 | + } | |
494 | + if(V & 0x04) | |
495 | + { | |
496 | + VTimer = *(WORD*)(IO + VPRE); | |
497 | + } | |
498 | + else | |
499 | + { | |
500 | + VTimer = 0; | |
501 | + } | |
502 | + break; | |
503 | + case 0xA4: | |
504 | + case 0xA5: | |
505 | + IO[A] = V; | |
506 | + HTimer = *(WORD*)(IO + HPRE); // FF | |
507 | + return; | |
508 | + case 0xA6: | |
509 | + case 0xA7: | |
510 | + IO[A] = V; | |
511 | + IO[A + 4] = V; // Dark eyes | |
512 | + if(IO[TIMCTL] & 0x04) | |
513 | + { | |
514 | + VTimer = *(WORD*)(IO + VPRE); | |
515 | + } | |
516 | + return; | |
517 | + case 0xB3: | |
518 | + if(V & 0x20) | |
519 | + { | |
520 | + V &= 0xDF; | |
521 | + } | |
522 | + V |= 0x04; | |
523 | + break; | |
524 | + case 0xB5: | |
525 | + IO[KEYCTL] = (BYTE)(V & 0xF0); | |
526 | + if(IO[KEYCTL] & 0x40) IO[KEYCTL] |= (BYTE)((ButtonState >> 8) & 0x0F); | |
527 | + if(IO[KEYCTL] & 0x20) IO[KEYCTL] |= (BYTE)((ButtonState >> 4) & 0x0F); | |
528 | + if(IO[KEYCTL] & 0x10) IO[KEYCTL] |= (BYTE)(ButtonState & 0x0F); | |
529 | + return; | |
530 | + case 0xB6: | |
531 | + IO[IRQACK] &= (BYTE)~V; | |
532 | + return; | |
533 | + case 0xBE: | |
534 | + ComEeprom(&sIEep, (WORD*)(IO + EEPCMD), (WORD*)(IO + EEPDATA)); | |
535 | + V >>= 4; | |
536 | + break; | |
537 | + case 0xC0: | |
538 | + if(nec_get_reg(NEC_CS) >= 0x4000) | |
539 | + { | |
540 | + nec_execute(1); | |
541 | + } | |
542 | + j = (V << 4) & 0xF0; | |
543 | + Page[0x4] = ROMMap[0x4 | j]; | |
544 | + Page[0x5] = ROMMap[0x5 | j]; | |
545 | + Page[0x6] = ROMMap[0x6 | j]; | |
546 | + Page[0x7] = ROMMap[0x7 | j]; | |
547 | + Page[0x8] = ROMMap[0x8 | j]; | |
548 | + Page[0x9] = ROMMap[0x9 | j]; | |
549 | + Page[0xA] = ROMMap[0xA | j]; | |
550 | + Page[0xB] = ROMMap[0xB | j]; | |
551 | + Page[0xC] = ROMMap[0xC | j]; | |
552 | + Page[0xD] = ROMMap[0xD | j]; | |
553 | + Page[0xE] = ROMMap[0xE | j]; | |
554 | + Page[0xF] = ROMMap[0xF | j]; | |
555 | + break; | |
556 | + case 0xC1: | |
557 | + if (V >= 8) // WonderWitch | |
558 | + { | |
559 | + Page[1] = MemDummy; | |
560 | + } | |
561 | + else if (V >= RAMBanks) | |
562 | + { | |
563 | + RAMEnable = 0; | |
564 | + } | |
565 | + else | |
566 | + { | |
567 | + Page[1] = RAMMap[V]; | |
568 | + } | |
569 | + break; | |
570 | + case 0xC2: | |
571 | + Page[2] = ROMMap[V]; | |
572 | + break; | |
573 | + case 0xC3: | |
574 | + Page[3] = ROMMap[V]; | |
575 | + break; | |
576 | + case 0xC8: | |
577 | + ComEeprom(&sCEep, (WORD*)(IO + CEEPCMD), (WORD*)(IO + CEEPDATA)); | |
578 | + if(V & 0x10) | |
579 | + { | |
580 | + V >>= 4; | |
581 | + } | |
582 | + if(V & 0x20) | |
583 | + { | |
584 | + V >>= 4; | |
585 | + } | |
586 | + if(V & 0x40) | |
587 | + { | |
588 | + V >>= 5; | |
589 | + } | |
590 | + break; | |
591 | + case 0xCA: // RTC Command | |
592 | + if (V == 0x15) | |
593 | + { | |
594 | + RtcCount = 0; | |
595 | + } | |
596 | + break; | |
597 | + case 0xCB: //RTC DATA | |
598 | + break; | |
599 | + default: | |
600 | + break; | |
601 | + } | |
602 | + IO[A] = V; | |
603 | +} | |
604 | + | |
605 | +#define BCD(value) ((value / 10) << 4) | (value % 10) | |
606 | +BYTE ReadIO(DWORD A) | |
607 | +{ | |
608 | + switch(A) | |
609 | + { | |
610 | + case 0xCA: | |
611 | + return IO[RTCCMD] | 0x80; | |
612 | + case 0xCB: | |
613 | + if (IO[RTCCMD] == 0x15) // get time command | |
614 | + { | |
615 | + BYTE year, mon, mday, wday, hour, min, sec, j; | |
616 | + struct tm *newtime; | |
617 | + time_t long_time; | |
618 | + | |
619 | + time(&long_time); | |
620 | + newtime = localtime(&long_time); | |
621 | + switch(RtcCount) | |
622 | + { | |
623 | + case 0: | |
624 | + RtcCount++; | |
625 | + year = newtime->tm_year; | |
626 | + year %= 100; | |
627 | + return BCD(year); | |
628 | + case 1: | |
629 | + RtcCount++; | |
630 | + mon = newtime->tm_mon; | |
631 | + mon++; | |
632 | + return BCD(mon); | |
633 | + case 2: | |
634 | + RtcCount++; | |
635 | + mday = newtime->tm_mday; | |
636 | + return BCD(mday); | |
637 | + case 3: | |
638 | + RtcCount++; | |
639 | + wday = newtime->tm_wday; | |
640 | + return BCD(wday); | |
641 | + case 4: | |
642 | + RtcCount++; | |
643 | + hour = newtime->tm_hour; | |
644 | + j = BCD(hour); | |
645 | + if (hour > 11) | |
646 | + j |= 0x80; | |
647 | + return j; | |
648 | + case 5: | |
649 | + RtcCount++; | |
650 | + min = newtime->tm_min; | |
651 | + return BCD(min); | |
652 | + case 6: | |
653 | + RtcCount = 0; | |
654 | + sec = newtime->tm_sec; | |
655 | + return BCD(sec); | |
656 | + } | |
657 | + return 0; | |
658 | + } | |
659 | + else { | |
660 | + // set ack | |
661 | + return (IO[RTCDATA] | 0x80); | |
662 | + } | |
663 | + } | |
664 | + return IO[A]; | |
665 | +} | |
666 | + | |
667 | +WriteMemFn WriteMemFnTable[16]= { | |
668 | + WriteIRam, | |
669 | + WriteCRam, | |
670 | + WriteRom, | |
671 | + WriteRom, | |
672 | + WriteRom, | |
673 | + WriteRom, | |
674 | + WriteRom, | |
675 | + WriteRom, | |
676 | + WriteRom, | |
677 | + WriteRom, | |
678 | + WriteRom, | |
679 | + WriteRom, | |
680 | + WriteRom, | |
681 | + WriteRom, | |
682 | + WriteRom, | |
683 | + WriteRom, | |
684 | +}; | |
685 | + | |
686 | +void WsReset (void) | |
687 | +{ | |
688 | + int i, j; | |
689 | + | |
690 | + Page[0x0] = IRAM; | |
691 | + sIEep.data = IEep; | |
692 | + sIEep.we = 0; | |
693 | + if(CartKind & CK_EEP) | |
694 | + { | |
695 | + Page[0x1] = MemDummy; | |
696 | + sCEep.data = (WORD*)(RAMMap[0x00]); | |
697 | + sCEep.we = 0; | |
698 | + } | |
699 | + else | |
700 | + { | |
701 | + Page[0x1] = RAMMap[0x00]; | |
702 | + sCEep.data = NULL; | |
703 | + sCEep.we = 0; | |
704 | + } | |
705 | + Page[0xF] = ROMMap[0xFF]; | |
706 | + i = (IO[SPRTAB] & 0x1F) << 9; | |
707 | + i += IO[SPRBGN] << 2; | |
708 | + j = IO[SPRCNT] << 2; | |
709 | + memcpy(SprTMap, IRAM + i, j); | |
710 | + SprTTMap = SprTMap; | |
711 | + SprETMap = SprTMap + j - 4; | |
712 | + WriteIO(0x07, 0x00); | |
713 | + WriteIO(0x14, 0x01); | |
714 | + WriteIO(0x1C, 0x99); | |
715 | + WriteIO(0x1D, 0xFD); | |
716 | + WriteIO(0x1E, 0xB7); | |
717 | + WriteIO(0x1F, 0xDF); | |
718 | + WriteIO(0x20, 0x30); | |
719 | + WriteIO(0x21, 0x57); | |
720 | + WriteIO(0x22, 0x75); | |
721 | + WriteIO(0x23, 0x76); | |
722 | + WriteIO(0x24, 0x15); | |
723 | + WriteIO(0x25, 0x73); | |
724 | + WriteIO(0x26, 0x77); | |
725 | + WriteIO(0x27, 0x77); | |
726 | + WriteIO(0x28, 0x20); | |
727 | + WriteIO(0x29, 0x75); | |
728 | + WriteIO(0x2A, 0x50); | |
729 | + WriteIO(0x2B, 0x36); | |
730 | + WriteIO(0x2C, 0x70); | |
731 | + WriteIO(0x2D, 0x67); | |
732 | + WriteIO(0x2E, 0x50); | |
733 | + WriteIO(0x2F, 0x77); | |
734 | + WriteIO(0x30, 0x57); | |
735 | + WriteIO(0x31, 0x54); | |
736 | + WriteIO(0x32, 0x75); | |
737 | + WriteIO(0x33, 0x77); | |
738 | + WriteIO(0x34, 0x75); | |
739 | + WriteIO(0x35, 0x17); | |
740 | + WriteIO(0x36, 0x37); | |
741 | + WriteIO(0x37, 0x73); | |
742 | + WriteIO(0x38, 0x50); | |
743 | + WriteIO(0x39, 0x57); | |
744 | + WriteIO(0x3A, 0x60); | |
745 | + WriteIO(0x3B, 0x77); | |
746 | + WriteIO(0x3C, 0x70); | |
747 | + WriteIO(0x3D, 0x77); | |
748 | + WriteIO(0x3E, 0x10); | |
749 | + WriteIO(0x3F, 0x73); | |
750 | + WriteIO(0x01, 0x00); | |
751 | + WriteIO(0x8F, 0x03); | |
752 | + WriteIO(0x91, 0x80); | |
753 | + WriteIO(0xA0, 0x02); | |
754 | + WriteIO(0xB3, 0x04); | |
755 | + WriteIO(0xBA, 0x01); | |
756 | + WriteIO(0xBB, 0x00); | |
757 | + WriteIO(0xBC, 0x30); // 内蔵EEPROM | |
758 | + WriteIO(0xBD, 0x01); // 書き込み可能 | |
759 | + WriteIO(0xBE, 0x83); | |
760 | + IO[BNKSLCT] = 0x0F; | |
761 | + j = 0xF0; | |
762 | + Page[0x4] = ROMMap[0x4 | j]; | |
763 | + Page[0x5] = ROMMap[0x5 | j]; | |
764 | + Page[0x6] = ROMMap[0x6 | j]; | |
765 | + Page[0x7] = ROMMap[0x7 | j]; | |
766 | + Page[0x8] = ROMMap[0x8 | j]; | |
767 | + Page[0x9] = ROMMap[0x9 | j]; | |
768 | + Page[0xA] = ROMMap[0xA | j]; | |
769 | + Page[0xB] = ROMMap[0xB | j]; | |
770 | + Page[0xC] = ROMMap[0xC | j]; | |
771 | + Page[0xD] = ROMMap[0xD | j]; | |
772 | + Page[0xE] = ROMMap[0xE | j]; | |
773 | + Page[0xF] = ROMMap[0xF | j]; | |
774 | + WriteIO(0xC2, 0xFF); | |
775 | + WriteIO(0xC3, 0xFF); | |
776 | + IRAM[0x75AC]=0x41; | |
777 | + IRAM[0x75AD]=0x5F; | |
778 | + IRAM[0x75AE]=0x43; | |
779 | + IRAM[0x75AF]=0x31; | |
780 | + IRAM[0x75B0]=0x6E; | |
781 | + IRAM[0x75B1]=0x5F; | |
782 | + IRAM[0x75B2]=0x63; | |
783 | + IRAM[0x75B3]=0x31; | |
784 | + apuWaveClear(); | |
785 | + ButtonState = 0x0000; | |
786 | + for (i = 0; i < 11; i++) | |
787 | + { | |
788 | + Segment[i] = 0; | |
789 | + } | |
790 | + nec_reset(NULL); | |
791 | + nec_set_reg(NEC_SP, 0x2000); | |
792 | +} | |
793 | + | |
794 | +void WsRomPatch(BYTE *buf) | |
795 | +{ | |
796 | + if((buf[0] == 0x01) && (buf[1] == 0x01) && (buf[2] == 0x16)) // SWJ-BANC16 STAR HEARTS | |
797 | + { | |
798 | + RAMBanks = 1; | |
799 | + RAMSize = 0x8000; | |
800 | + CartKind = 0; | |
801 | + } | |
802 | + if((buf[0] == 0x01) && (buf[1] == 0x00) && (buf[2] == 0x2C || buf[2] == 0x2F)) // SWJ-BAN02C,02F デジタルパートナー | |
803 | + { | |
804 | + RAMBanks = 1; | |
805 | + RAMSize = 0x8000; | |
806 | + CartKind = 0; | |
807 | + } | |
808 | + if((buf[0] == 0x01) && (buf[1] == 0x01) && (buf[2] == 0x38)) // SWJ-BANC38 NARUTO 木ノ葉忍法帖 | |
809 | + { | |
810 | + RAMBanks = 1; | |
811 | + RAMSize = 0x10000; | |
812 | + CartKind = 0; | |
813 | + } | |
814 | +} | |
815 | + | |
816 | +int Interrupt(void) | |
817 | +{ | |
818 | + static int LCount=0, Joyz=0x0000; | |
819 | + int i, j; | |
820 | + | |
821 | + if(++LCount>=8) // 8回で1Hblank期間 | |
822 | + { | |
823 | + LCount=0; | |
824 | + } | |
825 | + switch(LCount) | |
826 | + { | |
827 | + case 0: | |
828 | + if (IO[RSTRL] == 144) | |
829 | + { | |
830 | + DWORD VCounter; | |
831 | + | |
832 | + ButtonState = WsInputGetState(); | |
833 | + if((ButtonState ^ Joyz) & Joyz) | |
834 | + { | |
835 | + if(IO[IRQENA] & KEY_IFLAG) | |
836 | + { | |
837 | + IO[IRQACK] |= KEY_IFLAG; | |
838 | + } | |
839 | + } | |
840 | + Joyz = ButtonState; | |
841 | + // Vblankカウントアップ | |
842 | + VCounter = *(WORD*)(IO + VCNTH) << 16 | *(WORD*)(IO + VCNTL); | |
843 | + VCounter++; | |
844 | + *(WORD*)(IO + VCNTL) = (WORD)VCounter; | |
845 | + *(WORD*)(IO + VCNTH) = (WORD)(VCounter >> 16); | |
846 | + } | |
847 | + break; | |
848 | + case 2: | |
849 | + // Hblank毎に1サンプルセットすることで12KHzのwaveデータが出来る | |
850 | + apuWaveSet(); | |
851 | + *(WORD*)(IO + NCSR) = apuShiftReg(); | |
852 | + break; | |
853 | + case 4: | |
854 | + if(IO[RSTRL] == 140) | |
855 | + { | |
856 | + i = (IO[SPRTAB] & 0x1F) << 9; | |
857 | + i += IO[SPRBGN] << 2; | |
858 | + j = IO[SPRCNT] << 2; | |
859 | + memcpy(SprTMap, IRAM + i, j); | |
860 | + SprTTMap = SprTMap; | |
861 | + SprETMap= SprTMap + j - 4; | |
862 | + } | |
863 | + | |
864 | + if(IO[LCDSLP] & 0x01) | |
865 | + { | |
866 | + if(IO[RSTRL] == 0) | |
867 | + { | |
868 | + SkipCnt--; | |
869 | + if(SkipCnt < 0) | |
870 | + { | |
871 | + SkipCnt = 4; | |
872 | + } | |
873 | + } | |
874 | + if(TblSkip[FrameSkip][SkipCnt]) | |
875 | + { | |
876 | + if(IO[RSTRL] < 144) | |
877 | + { | |
878 | + RefreshLine(IO[RSTRL]); | |
879 | + } | |
880 | + if(IO[RSTRL] == 144) | |
881 | + { | |
882 | + drawDraw(); | |
883 | + } | |
884 | + } | |
885 | + } | |
886 | + break; | |
887 | + case 6: | |
888 | + if((IO[TIMCTL] & 0x01) && HTimer) | |
889 | + { | |
890 | + HTimer--; | |
891 | + if(!HTimer) | |
892 | + { | |
893 | + if(IO[TIMCTL] & 0x02) | |
894 | + { | |
895 | + HTimer = *(WORD*)(IO + HPRE); | |
896 | + } | |
897 | + if(IO[IRQENA] & HTM_IFLAG) | |
898 | + { | |
899 | + IO[IRQACK] |= HTM_IFLAG; | |
900 | + } | |
901 | + } | |
902 | + } | |
903 | + else if(*(WORD*)(IO + HPRE) == 1) | |
904 | + { | |
905 | + if(IO[IRQENA] & HTM_IFLAG) | |
906 | + { | |
907 | + IO[IRQACK] |= HTM_IFLAG; | |
908 | + } | |
909 | + } | |
910 | + if((IO[IRQENA] & VBB_IFLAG) && (IO[RSTRL] == 144)) | |
911 | + { | |
912 | + IO[IRQACK] |= VBB_IFLAG; | |
913 | + } | |
914 | + if((IO[TIMCTL] & 0x04) && (IO[RSTRL] == 144) && VTimer) | |
915 | + { | |
916 | + VTimer--; | |
917 | + if(!VTimer) | |
918 | + { | |
919 | + if(IO[TIMCTL] & 0x08) | |
920 | + { | |
921 | + VTimer = *(WORD*)(IO + VPRE); | |
922 | + } | |
923 | + if(IO[IRQENA] & VTM_IFLAG) | |
924 | + { | |
925 | + IO[IRQACK] |= VTM_IFLAG; | |
926 | + } | |
927 | + } | |
928 | + } | |
929 | + if((IO[IRQENA] & RST_IFLAG) && (IO[RSTRL] == IO[RSTRLC])) | |
930 | + { | |
931 | + IO[IRQACK] |= RST_IFLAG; | |
932 | + } | |
933 | + break; | |
934 | + case 7: | |
935 | + IO[RSTRL]++; | |
936 | + if(IO[RSTRL] >= 159) | |
937 | + { | |
938 | + IO[RSTRL] = 0; | |
939 | + } | |
940 | + // Hblankカウントアップ | |
941 | + (*(WORD*)(IO + HCNT))++; | |
942 | + break; | |
943 | + default: | |
944 | + break; | |
945 | + } | |
946 | + return IO[IRQACK]; | |
947 | +} | |
948 | + | |
949 | +int WsRun(void) | |
950 | +{ | |
951 | + static int period = IPeriod; | |
952 | + int i, cycle, iack, inum; | |
953 | +// for(i = 0; i < 480; i++) //5ms | |
954 | + for(i = 0; i < 159*8; i++) // 1/75s | |
955 | + { | |
956 | + cycle = nec_execute(period); | |
957 | + period += IPeriod - cycle; | |
958 | + if(Interrupt()) | |
959 | + { | |
960 | + iack = IO[IRQACK]; | |
961 | + for(inum = 7; inum >= 0; inum--) | |
962 | + { | |
963 | + if(iack & 0x80) | |
964 | + { | |
965 | + break; | |
966 | + } | |
967 | + iack <<= 1; | |
968 | + } | |
969 | + nec_int((inum + IO[IRQBSE]) << 2); | |
970 | + } | |
971 | + } | |
972 | + return 0; | |
973 | +} | |
974 | + | |
975 | +#define POS_X (88) | |
976 | +#define POS_Y (32) | |
977 | +#define NAME_Y (96) | |
978 | +void WsSplash(void) | |
979 | +{ | |
980 | + int x, y, i, len, pos, n; | |
981 | + WORD* p; | |
982 | + char* name = (char*)(IEep + 0x30); | |
983 | + | |
984 | + // 背景を黒でクリア | |
985 | + p = FrameBuffer[0] + 8; | |
986 | + for (y = 0; y < 144; y++) | |
987 | + { | |
988 | + for (x = 0; x < 224; x++) | |
989 | + { | |
990 | + *p++ = 0xF000; | |
991 | + } | |
992 | + p += 32; | |
993 | + } | |
994 | + drawDraw(); | |
995 | + Sleep(300); | |
996 | + apuStartupSound(); | |
997 | + Sleep(150); | |
998 | + Segment[3] = 1; | |
999 | + Segment[5] = 1; | |
1000 | + Segment[9] = 1; | |
1001 | + Segment[10] = 1; | |
1002 | + for (i = 0; i < 6; i++) | |
1003 | + { | |
1004 | + WORD color[6] = {0xFF00, 0xFF80, 0xFFF0, 0xF0F0, 0xF0FF, 0xF00F}; | |
1005 | + // B,A,N,D,A,I,を1文字表示 | |
1006 | + for (y = bandaiRect[i].top; y <= bandaiRect[i].bottom; y++) | |
1007 | + { | |
1008 | + p = FrameBuffer[POS_Y + y] + 8 + POS_X; | |
1009 | + for (x = bandaiRect[i].left; x <= bandaiRect[i].right; x++) | |
1010 | + { | |
1011 | + if (bandai[y][x] == 0xFFFF) | |
1012 | + { | |
1013 | + p[x] = color[i]; | |
1014 | + } | |
1015 | + } | |
1016 | + } | |
1017 | + drawDraw(); | |
1018 | + Sleep(70); | |
1019 | + // 文字消去 | |
1020 | + p = FrameBuffer[0] + 8; | |
1021 | + for (y = 0; y < 144; y++) | |
1022 | + { | |
1023 | + for (x = 0; x < 224; x++) | |
1024 | + { | |
1025 | + *p++ = 0xF000; | |
1026 | + } | |
1027 | + p += 32; | |
1028 | + } | |
1029 | + } | |
1030 | + drawDraw(); | |
1031 | + Sleep(200); | |
1032 | + // 背景を白でクリア | |
1033 | + p = FrameBuffer[0] + 8; | |
1034 | + for (y = 0; y < 144; y++) | |
1035 | + { | |
1036 | + for (x = 0; x < 224; x++) | |
1037 | + { | |
1038 | + *p++ = 0xFFFF; | |
1039 | + } | |
1040 | + p += 32; | |
1041 | + } | |
1042 | + // BANDAIロゴ表示 | |
1043 | + p = FrameBuffer[POS_Y] + 8 + POS_X; | |
1044 | + for (y = 0; y < BANDAI_Y; y++) | |
1045 | + { | |
1046 | + for (x = 0; x < BANDAI_X; x++) | |
1047 | + { | |
1048 | + *p++ = bandai[y][x]; | |
1049 | + } | |
1050 | + p += (256-BANDAI_X); | |
1051 | + } | |
1052 | + drawDraw(); | |
1053 | + // 所有者の名前表示 | |
1054 | + for (len = 15; name[len] == 0 && len > 0; len--); | |
1055 | + pos = 108 - len * 4; | |
1056 | + for (n = 0; n <= len; n++) | |
1057 | + { | |
1058 | + for (i = 0; i <= len; i++) | |
1059 | + { | |
1060 | + BYTE ar = pdataFontArray[name[i]]; | |
1061 | + BYTE* ch = pdataFont + ar * 8; | |
1062 | + for (y = 0; y < 8; y++) | |
1063 | + { | |
1064 | + BYTE font = *ch++; | |
1065 | + p = FrameBuffer[NAME_Y + y] + 8 + pos + (i * 8); | |
1066 | + for (x = 0; x < 8; x++) | |
1067 | + { | |
1068 | + if (name[i] && (font & 0x80)) // スペースフォントは■になってるのでスキップ | |
1069 | + { | |
1070 | + if (n == i) | |
1071 | + { | |
1072 | + *p = 0xFFFF; | |
1073 | + } | |
1074 | + else | |
1075 | + { | |
1076 | + *p = 0xF000; | |
1077 | + } | |
1078 | + } | |
1079 | + p++; | |
1080 | + font <<= 1; | |
1081 | + } | |
1082 | + } | |
1083 | + } | |
1084 | + drawDraw(); | |
1085 | + Sleep(30); | |
1086 | + } | |
1087 | + for (i = 0; i <= len; i++) | |
1088 | + { | |
1089 | + BYTE ar = pdataFontArray[name[i]]; | |
1090 | + BYTE* ch = pdataFont + ar * 8; | |
1091 | + for (y = 0; y < 8; y++) | |
1092 | + { | |
1093 | + BYTE font = *ch++; | |
1094 | + p = FrameBuffer[NAME_Y + y] + 8 + pos + (i * 8); | |
1095 | + for (x = 0; x < 8; x++) | |
1096 | + { | |
1097 | + if (name[i] && (font & 0x80)) | |
1098 | + { | |
1099 | + if (n == i) | |
1100 | + { | |
1101 | + *p = 0xFFFF; | |
1102 | + } | |
1103 | + else | |
1104 | + { | |
1105 | + *p = 0xF000; | |
1106 | + } | |
1107 | + } | |
1108 | + p++; | |
1109 | + font <<= 1; | |
1110 | + } | |
1111 | + } | |
1112 | + } | |
1113 | + Segment[3] = 0; | |
1114 | + Segment[5] = 0; | |
1115 | + Segment[9] = 0; | |
1116 | + drawDraw(); | |
1117 | +} | |
1118 | + | |
1119 | + |
@@ -0,0 +1,817 @@ | ||
1 | +/* | |
2 | +$Date$ | |
3 | +$Rev$ | |
4 | +*/ | |
5 | + | |
6 | +#include <string.h> | |
7 | +#include "WSRender.h" | |
8 | +#include "WS.h" | |
9 | +#include "WSDraw.h" | |
10 | +#include "WSSegment.h" | |
11 | + | |
12 | +#define MAP_TILE 0x01FF | |
13 | +#define MAP_PAL 0x1E00 | |
14 | +#define MAP_BANK 0x2000 | |
15 | +#define MAP_HREV 0x4000 | |
16 | +#define MAP_VREV 0x8000 | |
17 | +BYTE *Scr1TMap; | |
18 | +BYTE *Scr2TMap; | |
19 | + | |
20 | +#define SPR_TILE 0x01FF | |
21 | +#define SPR_PAL 0x0E00 | |
22 | +#define SPR_CLIP 0x1000 | |
23 | +#define SPR_LAYR 0x2000 | |
24 | +#define SPR_HREV 0x4000 | |
25 | +#define SPR_VREV 0x8000 | |
26 | +BYTE *SprTTMap; | |
27 | +BYTE *SprETMap; | |
28 | +BYTE SprTMap[512]; | |
29 | + | |
30 | +WORD Palette[16][16]; | |
31 | +WORD MonoColor[8]; | |
32 | +WORD FrameBuffer[144][LINE_SIZE]; | |
33 | +WORD SegmentBuffer[(144 * 4) * (8 * 4)]; // 8 * 144 の4倍のサイズで描画 | |
34 | +int Layer[3] = {1, 1, 1}; | |
35 | +int Segment[11]; | |
36 | + | |
37 | +void SetPalette(int addr) | |
38 | +{ | |
39 | + WORD color; | |
40 | + | |
41 | + // RGB444 format | |
42 | + color = *(WORD*)(IRAM + (addr & 0xFFFE)); | |
43 | + Palette[(addr & 0x1E0) >> 5][(addr & 0x1E) >> 1] = color | 0xF000; | |
44 | +} | |
45 | + | |
46 | +void RefreshLine(int Line) | |
47 | +{ | |
48 | + WORD *pSBuf; // データ書き込みバッファ | |
49 | + WORD *pSWrBuf; // ↑の書き込み位置用ポインタ | |
50 | + int *pZ; // ↓のインクリメント用ポインタ | |
51 | + int ZBuf[0x100]; // FGレイヤーの非透明部を保存 | |
52 | + int *pW; // ↓のインクリメント用ポインタ | |
53 | + int WBuf[0x100]; // FGレイヤーのウィンドーを保存 | |
54 | + int OffsetX; // | |
55 | + int OffsetY; // | |
56 | + BYTE *pbTMap; // | |
57 | + int TMap; // | |
58 | + int TMapX; // | |
59 | + int TMapXEnd; // | |
60 | + BYTE *pbTData; // | |
61 | + int PalIndex; // | |
62 | + int i, j, k, index[8]; | |
63 | + WORD BaseCol; // | |
64 | + pSBuf = FrameBuffer[Line] + 8; | |
65 | + pSWrBuf = pSBuf; | |
66 | + | |
67 | + if(IO[LCDSLP] & 0x01) | |
68 | + { | |
69 | + if(IO[COLCTL] & 0xE0) | |
70 | + { | |
71 | + BaseCol = Palette[(IO[BORDER] & 0xF0) >> 4][IO[BORDER] & 0x0F]; | |
72 | + } | |
73 | + else | |
74 | + { | |
75 | + BaseCol = MonoColor[IO[BORDER] & 0x07]; | |
76 | + } | |
77 | + } | |
78 | + else | |
79 | + { | |
80 | + BaseCol = 0; | |
81 | + } | |
82 | + for(i = 0; i < 224; i++) | |
83 | + { | |
84 | + { | |
85 | + *pSWrBuf++ = BaseCol; | |
86 | + } | |
87 | + } | |
88 | + if(!(IO[LCDSLP] & 0x01)) return; | |
89 | +/*********************************************************************/ | |
90 | + if((IO[DSPCTL] & 0x01) && Layer[0]) //BG layer | |
91 | + { | |
92 | + OffsetX = IO[SCR1X] & 0x07; | |
93 | + pSWrBuf = pSBuf - OffsetX; | |
94 | + i = Line + IO[SCR1Y]; | |
95 | + OffsetY = (i & 0x07); | |
96 | + | |
97 | + pbTMap = Scr1TMap + ((i & 0xF8) << 3); | |
98 | + TMapX = (IO[SCR1X] & 0xF8) >> 2; | |
99 | + TMapXEnd = ((IO[SCR1X] + 224 + 7) >> 2) & 0xFFE; | |
100 | + | |
101 | + for(; TMapX < TMapXEnd;) | |
102 | + { | |
103 | + TMap = *(pbTMap + (TMapX++ & 0x3F)); | |
104 | + TMap |= *(pbTMap + (TMapX++ & 0x3F)) << 8; | |
105 | + | |
106 | + if(IO[COLCTL] & 0x40) // 16 colors | |
107 | + { | |
108 | + if(TMap & MAP_BANK) | |
109 | + { | |
110 | + pbTData = IRAM + 0x8000; | |
111 | + } | |
112 | + else | |
113 | + { | |
114 | + pbTData = IRAM + 0x4000; | |
115 | + } | |
116 | + pbTData += (TMap & MAP_TILE) << 5; | |
117 | + if(TMap & MAP_VREV) | |
118 | + { | |
119 | + pbTData += (7 - OffsetY) << 2; | |
120 | + } | |
121 | + else | |
122 | + { | |
123 | + pbTData += OffsetY << 2; | |
124 | + } | |
125 | + } | |
126 | + else | |
127 | + { | |
128 | + if((IO[COLCTL] & 0x80) && (TMap & MAP_BANK))// 4 colors and bank 1 | |
129 | + { | |
130 | + pbTData = IRAM + 0x4000; | |
131 | + } | |
132 | + else | |
133 | + { | |
134 | + pbTData = IRAM + 0x2000; | |
135 | + } | |
136 | + pbTData += (TMap & MAP_TILE) << 4; | |
137 | + if(TMap & MAP_VREV) | |
138 | + { | |
139 | + pbTData += (7 - OffsetY) << 1; | |
140 | + } | |
141 | + else | |
142 | + { | |
143 | + pbTData += OffsetY << 1; | |
144 | + } | |
145 | + } | |
146 | + | |
147 | + if(IO[COLCTL] & 0x20) // Packed Mode | |
148 | + { | |
149 | + if(IO[COLCTL] & 0x40) // 16 Color | |
150 | + { | |
151 | + index[0] = (pbTData[0] & 0xF0) >> 4; | |
152 | + index[1] = pbTData[0] & 0x0F; | |
153 | + index[2] = (pbTData[1] & 0xF0) >> 4; | |
154 | + index[3] = pbTData[1] & 0x0F; | |
155 | + index[4] = (pbTData[2] & 0xF0) >> 4; | |
156 | + index[5] = pbTData[2] & 0x0F; | |
157 | + index[6] = (pbTData[3] & 0xF0) >> 4; | |
158 | + index[7] = pbTData[3] & 0x0F; | |
159 | + } | |
160 | + else // 4 Color | |
161 | + { | |
162 | + index[0] = (pbTData[0] & 0xC0) >> 6; | |
163 | + index[1] = (pbTData[0] & 0x30) >> 4; | |
164 | + index[2] = (pbTData[0] & 0x0C) >> 2; | |
165 | + index[3] = pbTData[0] & 0x03; | |
166 | + index[4] = (pbTData[1] & 0xC0) >> 6; | |
167 | + index[5] = (pbTData[1] & 0x30) >> 4; | |
168 | + index[6] = (pbTData[1] & 0x0C) >> 2; | |
169 | + index[7] = pbTData[1] & 0x03; | |
170 | + } | |
171 | + } | |
172 | + else | |
173 | + { | |
174 | + if(IO[COLCTL] & 0x40) // 16 Color | |
175 | + { | |
176 | + index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
177 | + index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
178 | + index[0] |= (pbTData[2] & 0x80) ? 0x4 : 0; | |
179 | + index[0] |= (pbTData[3] & 0x80) ? 0x8 : 0; | |
180 | + index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
181 | + index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
182 | + index[1] |= (pbTData[2] & 0x40) ? 0x4 : 0; | |
183 | + index[1] |= (pbTData[3] & 0x40) ? 0x8 : 0; | |
184 | + index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
185 | + index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
186 | + index[2] |= (pbTData[2] & 0x20) ? 0x4 : 0; | |
187 | + index[2] |= (pbTData[3] & 0x20) ? 0x8 : 0; | |
188 | + index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
189 | + index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
190 | + index[3] |= (pbTData[2] & 0x10) ? 0x4 : 0; | |
191 | + index[3] |= (pbTData[3] & 0x10) ? 0x8 : 0; | |
192 | + index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
193 | + index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
194 | + index[4] |= (pbTData[2] & 0x08) ? 0x4 : 0; | |
195 | + index[4] |= (pbTData[3] & 0x08) ? 0x8 : 0; | |
196 | + index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
197 | + index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
198 | + index[5] |= (pbTData[2] & 0x04) ? 0x4 : 0; | |
199 | + index[5] |= (pbTData[3] & 0x04) ? 0x8 : 0; | |
200 | + index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
201 | + index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
202 | + index[6] |= (pbTData[2] & 0x02) ? 0x4 : 0; | |
203 | + index[6] |= (pbTData[3] & 0x02) ? 0x8 : 0; | |
204 | + index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
205 | + index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
206 | + index[7] |= (pbTData[2] & 0x01) ? 0x4 : 0; | |
207 | + index[7] |= (pbTData[3] & 0x01) ? 0x8 : 0; | |
208 | + } | |
209 | + else // 4 Color | |
210 | + { | |
211 | + index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
212 | + index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
213 | + index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
214 | + index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
215 | + index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
216 | + index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
217 | + index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
218 | + index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
219 | + index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
220 | + index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
221 | + index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
222 | + index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
223 | + index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
224 | + index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
225 | + index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
226 | + index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
227 | + } | |
228 | + } | |
229 | + | |
230 | + if(TMap & MAP_HREV) | |
231 | + { | |
232 | + j = index[0]; | |
233 | + index[0] = index[7]; | |
234 | + index[7] = j; | |
235 | + j = index[1]; | |
236 | + index[1] = index[6]; | |
237 | + index[6] = j; | |
238 | + j = index[2]; | |
239 | + index[2] = index[5]; | |
240 | + index[5] = j; | |
241 | + j = index[3]; | |
242 | + index[3] = index[4]; | |
243 | + index[4] = j; | |
244 | + } | |
245 | + | |
246 | + PalIndex = (TMap & MAP_PAL) >> 9; | |
247 | + if((!index[0]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
248 | + else | |
249 | + { | |
250 | + *pSWrBuf++ = Palette[PalIndex][index[0]]; | |
251 | + } | |
252 | + if((!index[1]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
253 | + else | |
254 | + { | |
255 | + *pSWrBuf++ = Palette[PalIndex][index[1]]; | |
256 | + } | |
257 | + if((!index[2]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
258 | + else | |
259 | + { | |
260 | + *pSWrBuf++ = Palette[PalIndex][index[2]]; | |
261 | + } | |
262 | + if((!index[3]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
263 | + else | |
264 | + { | |
265 | + *pSWrBuf++ = Palette[PalIndex][index[3]]; | |
266 | + } | |
267 | + if((!index[4]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
268 | + else | |
269 | + { | |
270 | + *pSWrBuf++ = Palette[PalIndex][index[4]]; | |
271 | + } | |
272 | + if((!index[5]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
273 | + else | |
274 | + { | |
275 | + *pSWrBuf++ = Palette[PalIndex][index[5]]; | |
276 | + } | |
277 | + if((!index[6]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
278 | + else | |
279 | + { | |
280 | + *pSWrBuf++ = Palette[PalIndex][index[6]]; | |
281 | + } | |
282 | + if((!index[7]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) pSWrBuf++; | |
283 | + else | |
284 | + { | |
285 | + *pSWrBuf++ = Palette[PalIndex][index[7]]; | |
286 | + } | |
287 | + } | |
288 | + } | |
289 | +/*********************************************************************/ | |
290 | + memset(ZBuf, 0, sizeof(ZBuf)); | |
291 | + if((IO[DSPCTL] & 0x02) && Layer[1]) //FG layer表示 | |
292 | + { | |
293 | + if((IO[DSPCTL] & 0x30) == 0x20) // ウィンドウ内部のみに表示 | |
294 | + { | |
295 | + for(i = 0, pW = WBuf + 8; i < 224; i++) | |
296 | + { | |
297 | + *pW++ = 1; | |
298 | + } | |
299 | + if((Line >= IO[SCR2WT]) && (Line <= IO[SCR2WB])) | |
300 | + { | |
301 | + for(i = IO[SCR2WL], pW = WBuf + 8 + i; (i <= IO[SCR2WR]) && (i < 224); i++) | |
302 | + { | |
303 | + *pW++ = 0; | |
304 | + } | |
305 | + } | |
306 | + } | |
307 | + else if((IO[DSPCTL] & 0x30) == 0x30) // ウィンドウ外部のみに表示 | |
308 | + { | |
309 | + for(i = 0, pW = WBuf + 8; i < 224; i++) | |
310 | + { | |
311 | + *pW++ = 0; | |
312 | + } | |
313 | + if((Line >= IO[SCR2WT]) && (Line <= IO[SCR2WB])) | |
314 | + { | |
315 | + for(i = IO[SCR2WL], pW = WBuf + 8 + i; (i <= IO[SCR2WR]) && (i < 224); i++) | |
316 | + { | |
317 | + *pW++ = 1; | |
318 | + } | |
319 | + } | |
320 | + } | |
321 | + else | |
322 | + { | |
323 | + for(i = 0, pW = WBuf + 8; i < 224; i++) | |
324 | + { | |
325 | + *pW++ = 0; | |
326 | + } | |
327 | + } | |
328 | + | |
329 | + OffsetX = IO[SCR2X] & 0x07; | |
330 | + pSWrBuf = pSBuf - OffsetX; | |
331 | + i = Line + IO[SCR2Y]; | |
332 | + OffsetY = (i & 0x07); | |
333 | + | |
334 | + pbTMap = Scr2TMap + ((i & 0xF8) << 3); | |
335 | + TMapX = (IO[SCR2X] & 0xF8) >> 2; | |
336 | + TMapXEnd = ((IO[SCR2X] + 224 + 7) >> 2) & 0xFFE; | |
337 | + | |
338 | + pW = WBuf + 8 - OffsetX; | |
339 | + pZ = ZBuf + 8 - OffsetX; | |
340 | + | |
341 | + for(; TMapX < TMapXEnd;) | |
342 | + { | |
343 | + TMap = *(pbTMap + (TMapX++ & 0x3F)); | |
344 | + TMap |= *(pbTMap + (TMapX++ & 0x3F)) << 8; | |
345 | + | |
346 | + if(IO[COLCTL] & 0x40) | |
347 | + { | |
348 | + if(TMap & MAP_BANK) | |
349 | + { | |
350 | + pbTData = IRAM + 0x8000; | |
351 | + } | |
352 | + else | |
353 | + { | |
354 | + pbTData = IRAM + 0x4000; | |
355 | + } | |
356 | + pbTData += (TMap & MAP_TILE) << 5; | |
357 | + if(TMap & MAP_VREV) | |
358 | + { | |
359 | + pbTData += (7 - OffsetY) << 2; | |
360 | + } | |
361 | + else | |
362 | + { | |
363 | + pbTData += OffsetY << 2; | |
364 | + } | |
365 | + } | |
366 | + else | |
367 | + { | |
368 | + if((IO[COLCTL] & 0x80) && (TMap & MAP_BANK))// 4 colors and bank 1 | |
369 | + { | |
370 | + pbTData = IRAM + 0x4000; | |
371 | + } | |
372 | + else | |
373 | + { | |
374 | + pbTData = IRAM + 0x2000; | |
375 | + } | |
376 | + pbTData += (TMap & MAP_TILE) << 4; | |
377 | + if(TMap & MAP_VREV) | |
378 | + { | |
379 | + pbTData += (7 - OffsetY) << 1; | |
380 | + } | |
381 | + else | |
382 | + { | |
383 | + pbTData += OffsetY << 1; | |
384 | + } | |
385 | + } | |
386 | + | |
387 | + if(IO[COLCTL] & 0x20) // Packed Mode | |
388 | + { | |
389 | + if(IO[COLCTL] & 0x40) // 16 Color | |
390 | + { | |
391 | + index[0] = (pbTData[0] & 0xF0) >> 4; | |
392 | + index[1] = pbTData[0] & 0x0F; | |
393 | + index[2] = (pbTData[1] & 0xF0) >> 4; | |
394 | + index[3] = pbTData[1] & 0x0F; | |
395 | + index[4] = (pbTData[2] & 0xF0) >> 4; | |
396 | + index[5] = pbTData[2] & 0x0F; | |
397 | + index[6] = (pbTData[3] & 0xF0) >> 4; | |
398 | + index[7] = pbTData[3] & 0x0F; | |
399 | + } | |
400 | + else // 4 Color | |
401 | + { | |
402 | + index[0] = (pbTData[0] & 0xC0) >> 6; | |
403 | + index[1] = (pbTData[0] & 0x30) >> 4; | |
404 | + index[2] = (pbTData[0] & 0x0C) >> 2; | |
405 | + index[3] = pbTData[0] & 0x03; | |
406 | + index[4] = (pbTData[1] & 0xC0) >> 6; | |
407 | + index[5] = (pbTData[1] & 0x30) >> 4; | |
408 | + index[6] = (pbTData[1] & 0x0C) >> 2; | |
409 | + index[7] = pbTData[1] & 0x03; | |
410 | + } | |
411 | + } | |
412 | + else | |
413 | + { | |
414 | + if(IO[COLCTL] & 0x40) // 16 Color | |
415 | + { | |
416 | + index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
417 | + index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
418 | + index[0] |= (pbTData[2] & 0x80) ? 0x4 : 0; | |
419 | + index[0] |= (pbTData[3] & 0x80) ? 0x8 : 0; | |
420 | + index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
421 | + index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
422 | + index[1] |= (pbTData[2] & 0x40) ? 0x4 : 0; | |
423 | + index[1] |= (pbTData[3] & 0x40) ? 0x8 : 0; | |
424 | + index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
425 | + index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
426 | + index[2] |= (pbTData[2] & 0x20) ? 0x4 : 0; | |
427 | + index[2] |= (pbTData[3] & 0x20) ? 0x8 : 0; | |
428 | + index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
429 | + index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
430 | + index[3] |= (pbTData[2] & 0x10) ? 0x4 : 0; | |
431 | + index[3] |= (pbTData[3] & 0x10) ? 0x8 : 0; | |
432 | + index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
433 | + index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
434 | + index[4] |= (pbTData[2] & 0x08) ? 0x4 : 0; | |
435 | + index[4] |= (pbTData[3] & 0x08) ? 0x8 : 0; | |
436 | + index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
437 | + index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
438 | + index[5] |= (pbTData[2] & 0x04) ? 0x4 : 0; | |
439 | + index[5] |= (pbTData[3] & 0x04) ? 0x8 : 0; | |
440 | + index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
441 | + index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
442 | + index[6] |= (pbTData[2] & 0x02) ? 0x4 : 0; | |
443 | + index[6] |= (pbTData[3] & 0x02) ? 0x8 : 0; | |
444 | + index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
445 | + index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
446 | + index[7] |= (pbTData[2] & 0x01) ? 0x4 : 0; | |
447 | + index[7] |= (pbTData[3] & 0x01) ? 0x8 : 0; | |
448 | + } | |
449 | + else // 4 Color | |
450 | + { | |
451 | + index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
452 | + index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
453 | + index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
454 | + index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
455 | + index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
456 | + index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
457 | + index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
458 | + index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
459 | + index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
460 | + index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
461 | + index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
462 | + index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
463 | + index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
464 | + index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
465 | + index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
466 | + index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
467 | + } | |
468 | + } | |
469 | + | |
470 | + if(TMap & MAP_HREV) | |
471 | + { | |
472 | + j = index[0]; | |
473 | + index[0] = index[7]; | |
474 | + index[7] = j; | |
475 | + j = index[1]; | |
476 | + index[1] = index[6]; | |
477 | + index[6] = j; | |
478 | + j = index[2]; | |
479 | + index[2] = index[5]; | |
480 | + index[5] = j; | |
481 | + j = index[3]; | |
482 | + index[3] = index[4]; | |
483 | + index[4] = j; | |
484 | + } | |
485 | + | |
486 | + PalIndex = (TMap & MAP_PAL) >> 9; | |
487 | + if(((!index[0]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
488 | + else | |
489 | + { | |
490 | + *pSWrBuf++ = Palette[PalIndex][index[0]]; | |
491 | + *pZ = 1; | |
492 | + } | |
493 | + pW++;pZ++; | |
494 | + if(((!index[1]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
495 | + else | |
496 | + { | |
497 | + *pSWrBuf++ = Palette[PalIndex][index[1]]; | |
498 | + *pZ = 1; | |
499 | + } | |
500 | + pW++;pZ++; | |
501 | + if(((!index[2]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
502 | + else | |
503 | + { | |
504 | + *pSWrBuf++ = Palette[PalIndex][index[2]]; | |
505 | + *pZ = 1; | |
506 | + } | |
507 | + pW++;pZ++; | |
508 | + if(((!index[3]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
509 | + else | |
510 | + { | |
511 | + *pSWrBuf++ = Palette[PalIndex][index[3]]; | |
512 | + *pZ = 1; | |
513 | + } | |
514 | + pW++;pZ++; | |
515 | + if(((!index[4]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
516 | + else | |
517 | + { | |
518 | + *pSWrBuf++ = Palette[PalIndex][index[4]]; | |
519 | + *pZ = 1; | |
520 | + } | |
521 | + pW++;pZ++; | |
522 | + if(((!index[5]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
523 | + else | |
524 | + { | |
525 | + *pSWrBuf++ = Palette[PalIndex][index[5]]; | |
526 | + *pZ = 1; | |
527 | + } | |
528 | + pW++;pZ++; | |
529 | + if(((!index[6]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
530 | + else | |
531 | + { | |
532 | + *pSWrBuf++ = Palette[PalIndex][index[6]]; | |
533 | + *pZ = 1; | |
534 | + } | |
535 | + pW++;pZ++; | |
536 | + if(((!index[7]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) || (*pW)) pSWrBuf++; | |
537 | + else | |
538 | + { | |
539 | + *pSWrBuf++ = Palette[PalIndex][index[7]]; | |
540 | + *pZ = 1; | |
541 | + } | |
542 | + pW++;pZ++; | |
543 | + } | |
544 | + } | |
545 | +/*********************************************************************/ | |
546 | + if((IO[DSPCTL] & 0x04) && Layer[2]) //sprite | |
547 | + { | |
548 | + if (IO[DSPCTL] & 0x08) //sprite window | |
549 | + { | |
550 | + for (i = 0, pW = WBuf + 8; i < 224; i++) | |
551 | + { | |
552 | + *pW++ = 1; | |
553 | + } | |
554 | + if ((Line >= IO[SPRWT]) && (Line <= IO[SPRWB])) | |
555 | + { | |
556 | + for (i = IO[SPRWL], pW = WBuf + 8 + i; (i <= IO[SPRWR]) && (i < 224); i++) | |
557 | + { | |
558 | + *pW++ = 0; | |
559 | + } | |
560 | + } | |
561 | + } | |
562 | + | |
563 | + for (pbTMap = SprETMap; pbTMap >= SprTTMap; pbTMap -= 4) // | |
564 | + { | |
565 | + TMap = pbTMap[0]; | |
566 | + TMap |= pbTMap[1] << 8; | |
567 | + | |
568 | + if (pbTMap[2] > 0xF8) | |
569 | + { | |
570 | + j = pbTMap[2] - 0x100; | |
571 | + } | |
572 | + else | |
573 | + { | |
574 | + j = pbTMap[2]; | |
575 | + } | |
576 | + if (pbTMap[3] > 0xF8) | |
577 | + { | |
578 | + k = pbTMap[3] - 0x100; | |
579 | + } | |
580 | + else | |
581 | + { | |
582 | + k = pbTMap[3]; | |
583 | + } | |
584 | + | |
585 | + if (Line < j) | |
586 | + continue; | |
587 | + if (Line >= j + 8) | |
588 | + continue; | |
589 | + if (224 <= k) | |
590 | + continue; | |
591 | + | |
592 | + i = k; | |
593 | + pSWrBuf = pSBuf + i; | |
594 | + | |
595 | + if (IO[COLCTL] & 0x40) | |
596 | + { | |
597 | + pbTData = IRAM + 0x4000; | |
598 | + pbTData += (TMap & SPR_TILE) << 5; | |
599 | + if (TMap & SPR_VREV) | |
600 | + { | |
601 | + pbTData += (7 - Line + j) << 2; | |
602 | + } | |
603 | + else | |
604 | + { | |
605 | + pbTData += (Line - j) << 2; | |
606 | + } | |
607 | + } | |
608 | + else | |
609 | + { | |
610 | + pbTData = IRAM + 0x2000; | |
611 | + pbTData += (TMap & SPR_TILE) << 4; | |
612 | + if (TMap & SPR_VREV) | |
613 | + { | |
614 | + pbTData += (7 - Line + j) << 1; | |
615 | + } | |
616 | + else | |
617 | + { | |
618 | + pbTData += (Line - j) << 1; | |
619 | + } | |
620 | + } | |
621 | + | |
622 | + if(IO[COLCTL] & 0x20) // Packed Mode | |
623 | + { | |
624 | + if(IO[COLCTL] & 0x40) // 16 Color | |
625 | + { | |
626 | + index[0] = (pbTData[0] & 0xF0) >> 4; | |
627 | + index[1] = pbTData[0] & 0x0F; | |
628 | + index[2] = (pbTData[1] & 0xF0) >> 4; | |
629 | + index[3] = pbTData[1] & 0x0F; | |
630 | + index[4] = (pbTData[2] & 0xF0) >> 4; | |
631 | + index[5] = pbTData[2] & 0x0F; | |
632 | + index[6] = (pbTData[3] & 0xF0) >> 4; | |
633 | + index[7] = pbTData[3] & 0x0F; | |
634 | + } | |
635 | + else // 4 Color | |
636 | + { | |
637 | + index[0] = (pbTData[0] & 0xC0) >> 6; | |
638 | + index[1] = (pbTData[0] & 0x30) >> 4; | |
639 | + index[2] = (pbTData[0] & 0x0C) >> 2; | |
640 | + index[3] = pbTData[0] & 0x03; | |
641 | + index[4] = (pbTData[1] & 0xC0) >> 6; | |
642 | + index[5] = (pbTData[1] & 0x30) >> 4; | |
643 | + index[6] = (pbTData[1] & 0x0C) >> 2; | |
644 | + index[7] = pbTData[1] & 0x03; | |
645 | + } | |
646 | + } | |
647 | + else | |
648 | + { | |
649 | + if(IO[COLCTL] & 0x40) // 16 Color | |
650 | + { | |
651 | + index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
652 | + index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
653 | + index[0] |= (pbTData[2] & 0x80) ? 0x4 : 0; | |
654 | + index[0] |= (pbTData[3] & 0x80) ? 0x8 : 0; | |
655 | + index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
656 | + index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
657 | + index[1] |= (pbTData[2] & 0x40) ? 0x4 : 0; | |
658 | + index[1] |= (pbTData[3] & 0x40) ? 0x8 : 0; | |
659 | + index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
660 | + index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
661 | + index[2] |= (pbTData[2] & 0x20) ? 0x4 : 0; | |
662 | + index[2] |= (pbTData[3] & 0x20) ? 0x8 : 0; | |
663 | + index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
664 | + index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
665 | + index[3] |= (pbTData[2] & 0x10) ? 0x4 : 0; | |
666 | + index[3] |= (pbTData[3] & 0x10) ? 0x8 : 0; | |
667 | + index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
668 | + index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
669 | + index[4] |= (pbTData[2] & 0x08) ? 0x4 : 0; | |
670 | + index[4] |= (pbTData[3] & 0x08) ? 0x8 : 0; | |
671 | + index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
672 | + index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
673 | + index[5] |= (pbTData[2] & 0x04) ? 0x4 : 0; | |
674 | + index[5] |= (pbTData[3] & 0x04) ? 0x8 : 0; | |
675 | + index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
676 | + index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
677 | + index[6] |= (pbTData[2] & 0x02) ? 0x4 : 0; | |
678 | + index[6] |= (pbTData[3] & 0x02) ? 0x8 : 0; | |
679 | + index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
680 | + index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
681 | + index[7] |= (pbTData[2] & 0x01) ? 0x4 : 0; | |
682 | + index[7] |= (pbTData[3] & 0x01) ? 0x8 : 0; | |
683 | + } | |
684 | + else // 4 Color | |
685 | + { | |
686 | + index[0] = (pbTData[0] & 0x80) ? 0x1 : 0; | |
687 | + index[0] |= (pbTData[1] & 0x80) ? 0x2 : 0; | |
688 | + index[1] = (pbTData[0] & 0x40) ? 0x1 : 0; | |
689 | + index[1] |= (pbTData[1] & 0x40) ? 0x2 : 0; | |
690 | + index[2] = (pbTData[0] & 0x20) ? 0x1 : 0; | |
691 | + index[2] |= (pbTData[1] & 0x20) ? 0x2 : 0; | |
692 | + index[3] = (pbTData[0] & 0x10) ? 0x1 : 0; | |
693 | + index[3] |= (pbTData[1] & 0x10) ? 0x2 : 0; | |
694 | + index[4] = (pbTData[0] & 0x08) ? 0x1 : 0; | |
695 | + index[4] |= (pbTData[1] & 0x08) ? 0x2 : 0; | |
696 | + index[5] = (pbTData[0] & 0x04) ? 0x1 : 0; | |
697 | + index[5] |= (pbTData[1] & 0x04) ? 0x2 : 0; | |
698 | + index[6] = (pbTData[0] & 0x02) ? 0x1 : 0; | |
699 | + index[6] |= (pbTData[1] & 0x02) ? 0x2 : 0; | |
700 | + index[7] = (pbTData[0] & 0x01) ? 0x1 : 0; | |
701 | + index[7] |= (pbTData[1] & 0x01) ? 0x2 : 0; | |
702 | + } | |
703 | + } | |
704 | + | |
705 | + if (TMap & SPR_HREV) | |
706 | + { | |
707 | + j = index[0]; | |
708 | + index[0] = index[7]; | |
709 | + index[7] = j; | |
710 | + j = index[1]; | |
711 | + index[1] = index[6]; | |
712 | + index[6] = j; | |
713 | + j = index[2]; | |
714 | + index[2] = index[5]; | |
715 | + index[5] = j; | |
716 | + j = index[3]; | |
717 | + index[3] = index[4]; | |
718 | + index[4] = j; | |
719 | + } | |
720 | + | |
721 | + pW = WBuf + 8 + k; | |
722 | + pZ = ZBuf + k + 8; | |
723 | + PalIndex = ((TMap & SPR_PAL) >> 9) + 8; | |
724 | + for(i = 0; i < 8; i++, pZ++, pW++) | |
725 | + { | |
726 | + if(IO[DSPCTL] & 0x08) | |
727 | + { | |
728 | + if(TMap & SPR_CLIP) | |
729 | + { | |
730 | + if(!*pW) | |
731 | + { | |
732 | + pSWrBuf++; | |
733 | + continue; | |
734 | + } | |
735 | + } | |
736 | + else | |
737 | + { | |
738 | + if(*pW) | |
739 | + { | |
740 | + pSWrBuf++; | |
741 | + continue; | |
742 | + } | |
743 | + } | |
744 | + } | |
745 | + if((!index[i]) && (!(!(IO[COLCTL] & 0x40) && (!(TMap & 0x0800))))) | |
746 | + { | |
747 | + pSWrBuf++; | |
748 | + continue; | |
749 | + } | |
750 | + if((*pZ) && (!(TMap & SPR_LAYR))) | |
751 | + { | |
752 | + pSWrBuf++; | |
753 | + continue; | |
754 | + } | |
755 | + *pSWrBuf++ = Palette[PalIndex][index[i]]; | |
756 | + } | |
757 | + } | |
758 | + } | |
759 | +} | |
760 | + | |
761 | +/* | |
762 | + 8 * 144 のサイズを 32 * 576 で描画 | |
763 | +*/ | |
764 | +void RenderSegment(void) | |
765 | +{ | |
766 | + int bit, x, y, i; | |
767 | + WORD* p = SegmentBuffer; | |
768 | + BYTE lcd[11] = {0x20, 0x10, 0x08, 0x04, 0x02, 0x40, 0, 0, 0x01, 0x80, 0}; // 大、中、小、横、縦、ヘッドホン、音量、電池、スリープ | |
769 | + | |
770 | + for (i = 0; i < 11; i++) | |
771 | + { | |
772 | + for (y = 0; y < segLine[i]; y++) | |
773 | + { | |
774 | + for (x = 0; x < 4; x++) | |
775 | + { | |
776 | + BYTE ch = seg[i][y * 4 + x]; | |
777 | + for (bit = 0; bit < 8; bit++) | |
778 | + { | |
779 | + if (ch & 0x80) | |
780 | + { | |
781 | + if (Segment[i]) | |
782 | + { | |
783 | + *p++ = 0xFCCC; | |
784 | + } | |
785 | + else | |
786 | + { | |
787 | + *p++ = 0xF222; | |
788 | + } | |
789 | + } | |
790 | + else | |
791 | + { | |
792 | + *p++ = 0xF000; | |
793 | + } | |
794 | + ch <<= 1; | |
795 | + } | |
796 | + } | |
797 | + } | |
798 | + } | |
799 | +} | |
800 | + | |
801 | +void RenderSleep(void) | |
802 | +{ | |
803 | + int x, y; | |
804 | + WORD* p; | |
805 | + | |
806 | + // 背景をグレイでクリア | |
807 | + p = FrameBuffer[0] + 8; | |
808 | + for (y = 0; y < 144; y++) | |
809 | + { | |
810 | + for (x = 0; x < 224; x++) | |
811 | + { | |
812 | + *p++ = 0xF444; | |
813 | + } | |
814 | + p += 32; | |
815 | + } | |
816 | + drawDraw(); | |
817 | +} |