Rev 883 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
716 | lvd | 1 | #include "std.h" |
2 | |||
3 | #include "emul.h" |
||
4 | #include "vars.h" |
||
5 | #include "debug.h" |
||
6 | #include "memory.h" |
||
7 | #include "gsz80.h" |
||
8 | #include "z80.h" |
||
9 | #include "util.h" |
||
784 | DimkaM | 10 | #include "sndrender/sndcounter.h" |
11 | #include "sound.h" |
||
716 | lvd | 12 | |
13 | namespace z80fast |
||
14 | { |
||
15 | #include "z80_main.h" |
||
16 | } |
||
17 | |||
784 | DimkaM | 18 | int fmsoundon0=4; //Alone Coder |
19 | int tfmstatuson0=2; //Alone Coder |
||
716 | lvd | 20 | char pressedit = 0; //Alone Coder |
21 | |||
22 | void __fastcall wmdbg(u32 addr, u8 val); |
||
23 | u8 __fastcall rmdbg(u32 addr); |
||
24 | u8 *__fastcall MemDbg(u32 addr); |
||
25 | void __cdecl BankNames(int i, char *Name); |
||
26 | namespace z80dbg |
||
27 | { |
||
28 | void Z80FAST step(); |
||
29 | __int64 __cdecl delta(); |
||
30 | void __cdecl SetLastT(); |
||
31 | } |
||
32 | |||
33 | #pragma pack(8) |
||
34 | |||
35 | void out(unsigned port, unsigned char val); |
||
36 | unsigned char in(unsigned port); |
||
37 | |||
38 | Z80INLINE unsigned char m1_cycle(Z80 *cpu) |
||
39 | { |
||
759 | dimkam | 40 | unsigned char temp_op_code; |
716 | lvd | 41 | cpu->r_low++; cpu->t += 4; |
759 | dimkam | 42 | temp_op_code = cpu->MemIf->xm(cpu->pc++); |
43 | if((conf.mem_model==MM_ATM3)&&(comp.pBE)&&cpu->nmi_in_progress) |
||
44 | { |
||
45 | if(comp.pBE == 1) |
||
46 | { |
||
47 | if(trdos_in_nmi) |
||
48 | comp.flags |= CF_SETDOSROM|CF_TRDOS; |
||
49 | cpu->nmi_in_progress = false; |
||
50 | set_banks(); |
||
51 | } |
||
52 | comp.pBE--; |
||
53 | } |
||
54 | return temp_op_code; |
||
716 | lvd | 55 | } |
56 | |||
57 | /* |
||
58 | unsigned char TMainZ80::rm(unsigned addr) { return z80fast::rm(addr); } |
||
59 | |||
60 | unsigned char TMainZ80::dbgrm(unsigned addr) { return ::rmdbg(addr); } |
||
61 | |||
62 | void TMainZ80::wm(unsigned addr, unsigned char val) { z80fast::wm(addr, val); } |
||
63 | |||
64 | void TMainZ80::dbgwm(unsigned addr, unsigned char val) { ::wmdbg(addr, val); } |
||
65 | */ |
||
66 | u8 *TMainZ80::DirectMem(unsigned addr) const |
||
67 | { |
||
68 | return am_r(addr); |
||
69 | } |
||
70 | |||
71 | unsigned char TMainZ80::m1_cycle() { return ::m1_cycle(this); } |
||
72 | |||
73 | unsigned char TMainZ80::in(unsigned port) { return ::in(port); } |
||
74 | |||
75 | void TMainZ80::out(unsigned port, unsigned char val) { ::out(port, val); } |
||
76 | |||
77 | u8 TMainZ80::IntVec() |
||
78 | { |
||
79 | return (comp.flags & CF_Z80FBUS)? u8(rdtsc() & 0xFF) : 0xFF; |
||
80 | } |
||
81 | |||
82 | void TMainZ80::CheckNextFrame() |
||
83 | { |
||
84 | if(t >= conf.frame) |
||
85 | { |
||
86 | comp.t_states += conf.frame; |
||
87 | t -= conf.frame; |
||
88 | eipos -= conf.frame; |
||
89 | comp.frame_counter++; |
||
90 | int_pend = true; |
||
91 | } |
||
92 | } |
||
93 | |||
94 | void TMainZ80::retn() |
||
95 | { |
||
759 | dimkam | 96 | //nmi_in_progress = false; |
97 | //set_banks(); |
||
716 | lvd | 98 | } |
99 | |||
100 | static const TMemIf FastMemIf = { Xm, Rm, Wm }; |
||
101 | static const TMemIf DbgMemIf = { DbgXm, DbgRm, DbgWm }; |
||
102 | |||
103 | |||
104 | TMainZ80 cpu(0, BankNames, z80dbg::step, z80dbg::delta, z80dbg::SetLastT, membits, &FastMemIf, &DbgMemIf); |
||
105 | |||
106 | |||
107 | #ifdef MOD_GSZ80 |
||
108 | namespace z80gs |
||
109 | { |
||
110 | u8 __fastcall dbgrm(u32 addr); |
||
111 | void __fastcall dbgwm(u32 addr, u8 val); |
||
112 | u8 *__fastcall MemDbg(u32 addr); |
||
113 | void __cdecl BankNames(int i, char *Name); |
||
114 | void Z80FAST step(); |
||
115 | __int64 __cdecl delta(); |
||
116 | void __cdecl SetLastT(); |
||
117 | u8 membits[0x10000]; |
||
118 | |||
119 | SNDRENDER sound; |
||
120 | static const TMemIf FastMemIf = { z80gs::Xm, z80gs::Rm, z80gs::Wm }; |
||
121 | static const TMemIf DbgMemIf = { z80gs::DbgXm, z80gs::DbgRm, z80gs::DbgWm }; |
||
122 | |||
123 | } |
||
124 | |||
125 | u8 TGsZ80::IntVec() |
||
126 | { |
||
127 | return 0xFF; |
||
128 | } |
||
129 | |||
130 | void TGsZ80::CheckNextFrame() |
||
131 | { |
||
132 | if(t >= z80gs::GSCPUINT) |
||
133 | { |
||
134 | t -= z80gs::GSCPUINT; |
||
135 | eipos -= z80gs::GSCPUINT; |
||
136 | z80gs::gs_t_states += z80gs::GSCPUINT; |
||
137 | int_pend = true; |
||
138 | } |
||
139 | } |
||
140 | |||
141 | TGsZ80 gscpu(1, z80gs::BankNames, z80gs::step, z80gs::delta, |
||
142 | z80gs::SetLastT, z80gs::membits, &z80gs::FastMemIf, &z80gs::DbgMemIf); |
||
143 | #endif |
||
144 | |||
145 | TCpuMgr CpuMgr; |
||
146 | |||
147 | void TCpuMgr::SwitchCpu() |
||
148 | { |
||
149 | CurrentCpu++; |
||
150 | CurrentCpu %= Count; |
||
151 | } |
||
152 | |||
153 | Z80 *TCpuMgr::Cpus[] = |
||
154 | { |
||
155 | &cpu, |
||
156 | #ifdef MOD_GSZ80 |
||
157 | &gscpu |
||
158 | #endif |
||
159 | }; |
||
160 | |||
161 | |||
162 | const unsigned TCpuMgr::Count = _countof(Cpus); |
||
163 | TZ80State TCpuMgr::PrevCpus[TCpuMgr::Count]; |
||
164 | unsigned TCpuMgr::CurrentCpu = 0; |
||
165 | |||
166 | #ifdef MOD_GSBASS |
||
167 | GSHLE gs; |
||
168 | #endif |
||
169 | |||
170 | unsigned char dbgbreak = 0; |
||
171 | |||
172 | |||
173 | CONFIG conf; |
||
174 | COMPUTER comp; |
||
175 | TEMP temp; |
||
176 | ATA_PORT hdd; // not in `comp' - not cleared in reset() |
||
177 | K_INPUT input; |
||
178 | ISA_MODEM modem; |
||
179 | |||
180 | SNDRENDER sound; |
||
181 | SNDCHIP ay[2]; |
||
182 | SNDCOUNTER sndcounter; |
||
183 | |||
184 | |||
185 | unsigned char *base_sos_rom, *base_dos_rom, *base_128_rom, *base_sys_rom; |
||
186 | |||
187 | #ifdef CACHE_ALIGNED |
||
188 | ATTR_ALIGN(4096) |
||
189 | unsigned char memory[PAGE*MAX_PAGES]; |
||
190 | #else // __declspec(align) not available, force QWORD align with old method |
||
191 | __int64 memory__[PAGE*MAX_PAGES/sizeof(__int64)]; |
||
192 | unsigned char * const memory = (unsigned char*)memory__; |
||
193 | #endif |
||
194 | |||
195 | #ifdef MOD_VID_VD |
||
196 | CACHE_ALIGNED unsigned char vdmem[4][0x2000]; |
||
197 | #endif |
||
198 | |||
199 | unsigned char membits[0x10000]; |
||
200 | unsigned char *bankr[4]; |
||
201 | unsigned char *bankw[4]; |
||
202 | unsigned char cmos[0x100]; |
||
203 | unsigned char nvram[0x800]; |
||
204 | |||
205 | unsigned sndplaybuf[PLAYBUFSIZE]; |
||
206 | unsigned spbsize; |
||
207 | |||
208 | FILE *savesnd; |
||
209 | unsigned char savesndtype; // 0-none,1-wave,2-vtx |
||
210 | unsigned char *vtxbuf; unsigned vtxbufsize, vtxbuffilled; |
||
211 | |||
212 | unsigned char trdos_load, trdos_save, trdos_format, trdos_seek; // for leds |
||
213 | unsigned char needclr; // clear screenbuffer before rendering |
||
214 | |||
215 | HWND wnd; HINSTANCE hIn; |
||
216 | |||
217 | char droppedFile[512]; |
||
218 | |||
219 | const TMemModel mem_model[N_MM_MODELS] = |
||
220 | { |
||
221 | { "PENTAGON", "PENTAGON", MM_PENTAGON, 128, RAM_128 | RAM_256 | RAM_512 | RAM_1024 }, |
||
222 | { "ZS SCORPION", "SCORPION", MM_SCORP, 256, RAM_256 | RAM_1024 }, |
||
223 | { "ZS SCORPION + PROF ROM", "PROFSCORP", MM_PROFSCORP, 256, RAM_256 | RAM_1024 }, |
||
224 | { "PROFI", "PROFI", MM_PROFI, 1024, RAM_1024 }, |
||
225 | { "ATM-TURBO v4.50", "ATM450", MM_ATM450, 512, RAM_512 | RAM_1024 }, |
||
226 | { "ATM-TURBO 2+ v7.10", "ATM710", MM_ATM710, 1024, RAM_128 | RAM_256 | RAM_512 | RAM_1024 }, |
||
730 | lvd | 227 | { "ZX-EVO", "ATM3", MM_ATM3, 4096, RAM_4096 }, |
716 | lvd | 228 | { "Nemo's KAY", "KAY", MM_KAY, 256, RAM_256 | RAM_1024 }, |
229 | { "ZX-Spectrum +3", "PLUS3", MM_PLUS3, 128, RAM_128 }, |
||
230 | { "QUORUM", "QUORUM", MM_QUORUM, 1024, RAM_128 | RAM_1024 }, |
||
231 | }; |
||
232 | |||
233 | unsigned char kbdpc[VK_MAX]; // add cells for mouse & joystick |
||
234 | unsigned char kbdpcEX[6]; //Dexus |
||
235 | keyports inports[VK_MAX]; |
||
236 | |||
237 | char statusline[128]; |
||
238 | unsigned statcnt; |
||
239 | |||
240 | char arcbuffer[0x2000]; // extensions and command lines for archivers |
||
241 | char skiparc[0x400]; // ignore this files in archive |
||
242 | |||
243 | unsigned char exitflag = 0; // avoid call exit() twice |
||
244 | |||
245 | // beta128 vars |
||
246 | unsigned trd_toload = 0; // drive to load |
||
784 | DimkaM | 247 | unsigned DefaultDrive = -1U; // �������� �� ��������� � ������� �������� ������ ������ ��� ������ |
716 | lvd | 248 | |
249 | char trd_loaded[4]; // used to get first free drive with no account of autoloaded images |
||
250 | char ininame[0x200]; |
||
251 | char helpname[0x200]; |
||
252 | unsigned snapsize; |
||
253 | |||
254 | // conditional breakpoints support |
||
255 | unsigned brk_port_in, brk_port_out; |
||
256 | unsigned char brk_port_val; |
||
257 | |||
258 | virtkeyt pckeys[] = |
||
259 | { |
||
260 | { "ESC", DIK_ESCAPE }, |
||
261 | { "F1", DIK_F1 }, { "F2", DIK_F2 }, { "F3", DIK_F3 }, |
||
262 | { "F4", DIK_F4 }, { "F5", DIK_F5 }, { "F6", DIK_F6 }, |
||
263 | { "F7", DIK_F7 }, { "F8", DIK_F8 }, { "F9", DIK_F9 }, |
||
264 | { "F10", DIK_F10 }, { "F11", DIK_F11 }, { "F12", DIK_F12 }, |
||
265 | { "PRSCR", DIK_SYSRQ }, { "SCLOCK", DIK_SCROLL }, { "PAUSE", DIK_PAUSE }, |
||
266 | |||
267 | { "1", DIK_1 }, { "2", DIK_2 }, { "3", DIK_3 }, { "4", DIK_4 }, { "5", DIK_5 }, |
||
268 | { "6", DIK_6 }, { "7", DIK_7 }, { "8", DIK_8 }, { "9", DIK_9 }, { "0", DIK_0 }, |
||
269 | |||
270 | { "Q", DIK_Q }, { "W", DIK_W }, { "E", DIK_E }, { "R", DIK_R }, { "T", DIK_T }, |
||
271 | { "Y", DIK_Y }, { "U", DIK_U }, { "I", DIK_I }, { "O", DIK_O }, { "P", DIK_P }, |
||
272 | { "A", DIK_A }, { "S", DIK_S }, { "D", DIK_D }, { "F", DIK_F }, { "G", DIK_G }, |
||
273 | { "H", DIK_H }, { "J", DIK_J }, { "K", DIK_K }, { "L", DIK_L }, |
||
274 | { "Z", DIK_Z }, { "X", DIK_X }, { "C", DIK_C }, { "V", DIK_V }, { "B", DIK_B }, |
||
275 | { "N", DIK_N }, { "M", DIK_M }, |
||
276 | |||
277 | { "MINUS", DIK_MINUS }, { "PLUS", DIK_EQUALS }, { "BACK", DIK_BACK }, |
||
278 | { "TAB", DIK_TAB }, { "LB", DIK_LBRACKET }, { "RB", DIK_RBRACKET }, |
||
279 | { "CAPS", DIK_CAPITAL }, { "TIL", DIK_GRAVE }, { "SPACE", DIK_SPACE }, |
||
280 | { "COL", DIK_SEMICOLON }, { "QUOTE", DIK_APOSTROPHE }, { "ENTER", DIK_RETURN }, |
||
281 | { "COMMA", DIK_COMMA }, { "POINT", DIK_PERIOD }, { "SLASH", DIK_SLASH }, { "BACKSL", DIK_BACKSLASH }, |
||
282 | { "SHIFT", DIK_SHIFT }, { "ALT", DIK_MENU }, { "CONTROL", DIK_CONTROL }, |
||
283 | { "LSHIFT", DIK_LSHIFT }, { "LALT", DIK_LMENU }, { "LCONTROL", DIK_LCONTROL }, |
||
284 | { "RSHIFT", DIK_RSHIFT }, { "RALT", DIK_RMENU }, { "RCONTROL", DIK_RCONTROL }, |
||
285 | |||
286 | { "INS", DIK_INSERT }, { "HOME", DIK_HOME }, { "PGUP", DIK_PRIOR }, |
||
287 | { "DEL", DIK_DELETE }, { "END", DIK_END }, { "PGDN", DIK_NEXT }, |
||
288 | |||
289 | { "UP", DIK_UP }, { "DOWN", DIK_DOWN }, { "LEFT", DIK_LEFT }, { "RIGHT", DIK_RIGHT }, |
||
290 | |||
291 | { "NUMLOCK", DIK_NUMLOCK }, { "GRDIV", DIK_DIVIDE }, |
||
292 | { "GRMUL", DIK_MULTIPLY }, { "GRSUB", DIK_SUBTRACT }, { "GRADD", DIK_ADD }, |
||
293 | { "GRENTER", DIK_NUMPADENTER }, |
||
294 | |||
295 | { "N0", DIK_NUMPAD0 }, { "N1", DIK_NUMPAD1 }, { "N2", DIK_NUMPAD2 }, |
||
296 | { "N3", DIK_NUMPAD3 }, { "N4", DIK_NUMPAD4 }, { "N5", DIK_NUMPAD5 }, |
||
297 | { "N6", DIK_NUMPAD6 }, { "N7", DIK_NUMPAD7 }, { "N8", DIK_NUMPAD8 }, |
||
298 | { "N9", DIK_NUMPAD9 }, { "NP", DIK_DECIMAL }, |
||
299 | |||
300 | { "LMB", VK_LMB }, { "RMB", VK_RMB }, { "MMB", VK_MMB }, |
||
301 | { "MWU", VK_MWU }, { "MWD", VK_MWD }, |
||
302 | |||
303 | { "JLEFT", VK_JLEFT }, { "JRIGHT", VK_JRIGHT }, |
||
304 | { "JUP", VK_JUP }, { "JDOWN", VK_JDOWN }, { "JFIRE", VK_JFIRE }, |
||
305 | { "JB0", VK_JB0 }, |
||
306 | { "JB1", VK_JB1 }, |
||
307 | { "JB2", VK_JB2 }, |
||
308 | { "JB3", VK_JB3 }, |
||
309 | { "JB4", VK_JB4 }, |
||
310 | { "JB5", VK_JB5 }, |
||
311 | { "JB6", VK_JB6 }, |
||
312 | { "JB7", VK_JB7 }, |
||
313 | { "JB8", VK_JB8 }, |
||
314 | { "JB9", VK_JB9 }, |
||
315 | { "JB10", VK_JB10 }, |
||
316 | { "JB11", VK_JB11 }, |
||
317 | { "JB12", VK_JB12 }, |
||
318 | { "JB13", VK_JB13 }, |
||
319 | { "JB14", VK_JB14 }, |
||
320 | { "JB15", VK_JB15 }, |
||
321 | { "JB16", VK_JB16 }, |
||
322 | { "JB17", VK_JB17 }, |
||
323 | { "JB18", VK_JB18 }, |
||
324 | { "JB19", VK_JB19 }, |
||
325 | { "JB20", VK_JB20 }, |
||
326 | { "JB21", VK_JB21 }, |
||
327 | { "JB22", VK_JB22 }, |
||
328 | { "JB23", VK_JB23 }, |
||
329 | { "JB24", VK_JB24 }, |
||
330 | { "JB25", VK_JB25 }, |
||
331 | { "JB26", VK_JB26 }, |
||
332 | { "JB27", VK_JB27 }, |
||
333 | { "JB28", VK_JB28 }, |
||
334 | { "JB29", VK_JB29 }, |
||
335 | { "JB30", VK_JB30 }, |
||
336 | { "JB31", VK_JB31 }, |
||
337 | }; |
||
338 | const size_t pckeys_count = _countof(pckeys); |
||
339 | |||
340 | static zxkey zxk_default[] = |
||
341 | { |
||
342 | { "KRIGHT", &input.kjoy, u8(~1U) }, |
||
343 | { "KLEFT", &input.kjoy, u8(~2U) }, |
||
344 | { "KDOWN", &input.kjoy, u8(~4U) }, |
||
345 | { "KUP", &input.kjoy, u8(~8U) }, |
||
346 | { "KFIRE", &input.kjoy, u8(~16U)}, |
||
784 | DimkaM | 347 | { "KFIRE1", &input.kjoy, u8(~16U) }, |
348 | { "KFIRE2", &input.kjoy, u8(~32U) }, |
||
349 | { "KFIRE3", &input.kjoy, u8(~64U) }, |
||
716 | lvd | 350 | |
784 | DimkaM | 351 | // fuller joystick |
352 | { "FRIGHT", &input.fjoy, u8(~8U) }, |
||
353 | { "FLEFT", &input.fjoy, u8(~4U) }, |
||
354 | { "FDOWN", &input.fjoy, u8(~2U) }, |
||
355 | { "FUP", &input.fjoy, u8(~1U) }, |
||
356 | { "FFIRE", &input.fjoy, u8(~128U)}, |
||
357 | { "FFIRE1", &input.fjoy, u8(~128U) }, |
||
358 | { "FFIRE2", &input.fjoy, u8(~64U) }, |
||
359 | { "FFIRE3", &input.fjoy, u8(~32U) }, |
||
360 | |||
716 | lvd | 361 | { "ENT", input.kbd+6, u8(~0x01U) }, |
362 | { "SPC", input.kbd+7, u8(~0x01U) }, |
||
363 | { "SYM", input.kbd+7, u8(~0x02U) }, |
||
364 | |||
365 | { "CAP", input.kbd+0, u8(~0x01U) }, |
||
366 | { "Z", input.kbd+0, u8(~0x02U) }, |
||
367 | { "X", input.kbd+0, u8(~0x04U) }, |
||
368 | { "C", input.kbd+0, u8(~0x08U) }, |
||
369 | { "V", input.kbd+0, u8(~0x10U) }, |
||
370 | |||
371 | { "A", input.kbd+1, u8(~0x01U) }, |
||
372 | { "S", input.kbd+1, u8(~0x02U) }, |
||
373 | { "D", input.kbd+1, u8(~0x04U) }, |
||
374 | { "F", input.kbd+1, u8(~0x08U) }, |
||
375 | { "G", input.kbd+1, u8(~0x10U) }, |
||
376 | |||
377 | { "Q", input.kbd+2, u8(~0x01U) }, |
||
378 | { "W", input.kbd+2, u8(~0x02U) }, |
||
379 | { "E", input.kbd+2, u8(~0x04U) }, |
||
380 | { "R", input.kbd+2, u8(~0x08U) }, |
||
381 | { "T", input.kbd+2, u8(~0x10U) }, |
||
382 | |||
383 | { "1", input.kbd+3, u8(~0x01U) }, |
||
384 | { "2", input.kbd+3, u8(~0x02U) }, |
||
385 | { "3", input.kbd+3, u8(~0x04U) }, |
||
386 | { "4", input.kbd+3, u8(~0x08U) }, |
||
387 | { "5", input.kbd+3, u8(~0x10U) }, |
||
388 | |||
389 | { "0", input.kbd+4, u8(~0x01U) }, |
||
390 | { "9", input.kbd+4, u8(~0x02U) }, |
||
391 | { "8", input.kbd+4, u8(~0x04U) }, |
||
392 | { "7", input.kbd+4, u8(~0x08U) }, |
||
393 | { "6", input.kbd+4, u8(~0x10U) }, |
||
394 | |||
395 | { "P", input.kbd+5, u8(~0x01U) }, |
||
396 | { "O", input.kbd+5, u8(~0x02U) }, |
||
397 | { "I", input.kbd+5, u8(~0x04U) }, |
||
398 | { "U", input.kbd+5, u8(~0x08U) }, |
||
399 | { "Y", input.kbd+5, u8(~0x10U) }, |
||
400 | |||
401 | { "L", input.kbd+6, u8(~0x02U) }, |
||
402 | { "K", input.kbd+6, u8(~0x04U) }, |
||
403 | { "J", input.kbd+6, u8(~0x08U) }, |
||
404 | { "H", input.kbd+6, u8(~0x10U) }, |
||
405 | |||
406 | { "M", input.kbd+7, u8(~0x04U) }, |
||
407 | { "N", input.kbd+7, u8(~0x08U) }, |
||
408 | { "B", input.kbd+7, u8(~0x10U) }, |
||
409 | }; |
||
410 | |||
411 | static zxkey zxk_bk08[] = |
||
412 | { |
||
413 | { "KRIGHT", &input.kjoy, u8(~1U) }, |
||
414 | { "KLEFT", &input.kjoy, u8(~2U) }, |
||
415 | { "KDOWN", &input.kjoy, u8(~4U) }, |
||
416 | { "KUP", &input.kjoy, u8(~8U) }, |
||
417 | { "KFIRE", &input.kjoy, u8(~16U)}, |
||
784 | DimkaM | 418 | { "KFIRE1", &input.kjoy, u8(~16U) }, |
419 | { "KFIRE2", &input.kjoy, u8(~32U) }, |
||
420 | { "KFIRE3", &input.kjoy, u8(~64U) }, |
||
716 | lvd | 421 | |
784 | DimkaM | 422 | // fuller joystick |
423 | { "FRIGHT", &input.fjoy, u8(~8U) }, |
||
424 | { "FLEFT", &input.fjoy, u8(~4U) }, |
||
425 | { "FDOWN", &input.fjoy, u8(~2U) }, |
||
426 | { "FUP", &input.fjoy, u8(~1U) }, |
||
427 | { "FFIRE", &input.fjoy, u8(~128U)}, |
||
428 | { "FFIRE1", &input.fjoy, u8(~128U) }, |
||
429 | { "FFIRE2", &input.fjoy, u8(~64U) }, |
||
430 | { "FFIRE3", &input.fjoy, u8(~32U) }, |
||
431 | |||
716 | lvd | 432 | { "ALT", input.kbd+0, u8(~0x01U) }, |
433 | { "Z", input.kbd+0, u8(~0x02U) }, |
||
434 | { "X", input.kbd+0, u8(~0x04U) }, |
||
435 | { "C", input.kbd+0, u8(~0x08U) }, |
||
436 | { "V", input.kbd+0, u8(~0x10U) }, |
||
437 | { "RUS", input.kbd+0, u8(~0x20U) }, |
||
438 | { "SHF", input.kbd+0, u8( 0x7FU) }, |
||
439 | |||
440 | { "A", input.kbd+1, u8(~0x01U) }, |
||
441 | { "S", input.kbd+1, u8(~0x02U) }, |
||
442 | { "D", input.kbd+1, u8(~0x04U) }, |
||
443 | { "F", input.kbd+1, u8(~0x08U) }, |
||
444 | { "G", input.kbd+1, u8(~0x10U) }, |
||
445 | { "BSL", input.kbd+1, u8(~0x20U) }, |
||
446 | { "SL", input.kbd+1, u8( 0x7FU) }, |
||
447 | |||
448 | { "Q", input.kbd+2, u8(~0x01U) }, |
||
449 | { "W", input.kbd+2, u8(~0x02U) }, |
||
450 | { "E", input.kbd+2, u8(~0x04U) }, |
||
451 | { "R", input.kbd+2, u8(~0x08U) }, |
||
452 | { "T", input.kbd+2, u8(~0x10U) }, |
||
453 | { "CMA", input.kbd+2, u8(~0x20U) }, |
||
454 | { "PNT", input.kbd+2, u8( 0x7FU) }, |
||
455 | |||
456 | { "1", input.kbd+3, u8(~0x01U) }, |
||
457 | { "2", input.kbd+3, u8(~0x02U) }, |
||
458 | { "3", input.kbd+3, u8(~0x04U) }, |
||
459 | { "4", input.kbd+3, u8(~0x08U) }, |
||
460 | { "5", input.kbd+3, u8(~0x10U) }, |
||
461 | { "TIL", input.kbd+3, u8(~0x20U) }, |
||
462 | { "TAB", input.kbd+3, u8( 0x7FU) }, |
||
463 | |||
464 | { "0", input.kbd+4, u8(~0x01U) }, |
||
465 | { "9", input.kbd+4, u8(~0x02U) }, |
||
466 | { "8", input.kbd+4, u8(~0x04U) }, |
||
467 | { "7", input.kbd+4, u8(~0x08U) }, |
||
468 | { "6", input.kbd+4, u8(~0x10U) }, |
||
469 | { "MNS", input.kbd+4, u8(~0x20U) }, |
||
470 | { "PLS", input.kbd+4, u8( 0x7FU) }, |
||
471 | |||
472 | { "P", input.kbd+5, u8(~0x01U) }, |
||
473 | { "O", input.kbd+5, u8(~0x02U) }, |
||
474 | { "I", input.kbd+5, u8(~0x04U) }, |
||
475 | { "U", input.kbd+5, u8(~0x08U) }, |
||
476 | { "Y", input.kbd+5, u8(~0x10U) }, |
||
477 | { "LB", input.kbd+5, u8(~0x20U) }, |
||
478 | { "RB", input.kbd+5, u8( 0x7FU) }, |
||
479 | |||
480 | { "ENT", input.kbd+6, u8(~0x01U) }, |
||
481 | { "L", input.kbd+6, u8(~0x02U) }, |
||
482 | { "K", input.kbd+6, u8(~0x04U) }, |
||
483 | { "J", input.kbd+6, u8(~0x08U) }, |
||
484 | { "H", input.kbd+6, u8(~0x10U) }, |
||
485 | { "COL", input.kbd+6, u8(~0x20U) }, |
||
486 | { "QUO", input.kbd+6, u8( 0x7FU) }, |
||
487 | |||
488 | { "SPC", input.kbd+7, u8(~0x01U) }, |
||
489 | { "CTL", input.kbd+7, u8(~0x02U) }, |
||
490 | { "M", input.kbd+7, u8(~0x04U) }, |
||
491 | { "N", input.kbd+7, u8(~0x08U) }, |
||
492 | { "B", input.kbd+7, u8(~0x10U) }, |
||
493 | { "R/A", input.kbd+7, u8(~0x20U) }, |
||
494 | { "CPS", input.kbd+7, u8( 0x7FU) } |
||
495 | }; |
||
496 | |||
497 | static zxkey zxk_quorum[] = |
||
498 | { |
||
499 | { "KRIGHT", &input.kjoy, u8(~1U) }, |
||
500 | { "KLEFT", &input.kjoy, u8(~2U) }, |
||
501 | { "KDOWN", &input.kjoy, u8(~4U) }, |
||
502 | { "KUP", &input.kjoy, u8(~8U) }, |
||
503 | { "KFIRE", &input.kjoy, u8(~16U)}, |
||
784 | DimkaM | 504 | { "KFIRE1", &input.kjoy, u8(~16U) }, |
505 | { "KFIRE2", &input.kjoy, u8(~32U) }, |
||
506 | { "KFIRE3", &input.kjoy, u8(~64U) }, |
||
716 | lvd | 507 | |
784 | DimkaM | 508 | // fuller joystick |
509 | { "FRIGHT", &input.fjoy, u8(~8U) }, |
||
510 | { "FLEFT", &input.fjoy, u8(~4U) }, |
||
511 | { "FDOWN", &input.fjoy, u8(~2U) }, |
||
512 | { "FUP", &input.fjoy, u8(~1U) }, |
||
513 | { "FFIRE", &input.fjoy, u8(~128U)}, |
||
514 | { "FFIRE1", &input.fjoy, u8(~128U) }, |
||
515 | { "FFIRE2", &input.fjoy, u8(~64U) }, |
||
516 | { "FFIRE3", &input.fjoy, u8(~32U) }, |
||
517 | |||
518 | |||
716 | lvd | 519 | { "ENT", input.kbd+6, u8(~0x01U) }, |
520 | { "SPC", input.kbd+7, u8(~0x01U) }, |
||
521 | { "SYM", input.kbd+7, u8(~0x02U) }, |
||
522 | |||
523 | { "CAP", input.kbd+0, u8(~0x01U) }, |
||
524 | { "Z", input.kbd+0, u8(~0x02U) }, |
||
525 | { "X", input.kbd+0, u8(~0x04U) }, |
||
526 | { "C", input.kbd+0, u8(~0x08U) }, |
||
527 | { "V", input.kbd+0, u8(~0x10U) }, |
||
528 | |||
529 | { "A", input.kbd+1, u8(~0x01U) }, |
||
530 | { "S", input.kbd+1, u8(~0x02U) }, |
||
531 | { "D", input.kbd+1, u8(~0x04U) }, |
||
532 | { "F", input.kbd+1, u8(~0x08U) }, |
||
533 | { "G", input.kbd+1, u8(~0x10U) }, |
||
534 | |||
535 | { "Q", input.kbd+2, u8(~0x01U) }, |
||
536 | { "W", input.kbd+2, u8(~0x02U) }, |
||
537 | { "E", input.kbd+2, u8(~0x04U) }, |
||
538 | { "R", input.kbd+2, u8(~0x08U) }, |
||
539 | { "T", input.kbd+2, u8(~0x10U) }, |
||
540 | |||
541 | { "1", input.kbd+3, u8(~0x01U) }, |
||
542 | { "2", input.kbd+3, u8(~0x02U) }, |
||
543 | { "3", input.kbd+3, u8(~0x04U) }, |
||
544 | { "4", input.kbd+3, u8(~0x08U) }, |
||
545 | { "5", input.kbd+3, u8(~0x10U) }, |
||
546 | |||
547 | { "0", input.kbd+4, u8(~0x01U) }, |
||
548 | { "9", input.kbd+4, u8(~0x02U) }, |
||
549 | { "8", input.kbd+4, u8(~0x04U) }, |
||
550 | { "7", input.kbd+4, u8(~0x08U) }, |
||
551 | { "6", input.kbd+4, u8(~0x10U) }, |
||
552 | |||
553 | { "P", input.kbd+5, u8(~0x01U) }, |
||
554 | { "O", input.kbd+5, u8(~0x02U) }, |
||
555 | { "I", input.kbd+5, u8(~0x04U) }, |
||
556 | { "U", input.kbd+5, u8(~0x08U) }, |
||
557 | { "Y", input.kbd+5, u8(~0x10U) }, |
||
558 | |||
559 | { "L", input.kbd+6, u8(~0x02U) }, |
||
560 | { "K", input.kbd+6, u8(~0x04U) }, |
||
561 | { "J", input.kbd+6, u8(~0x08U) }, |
||
562 | { "H", input.kbd+6, u8(~0x10U) }, |
||
563 | |||
564 | { "M", input.kbd+7, u8(~0x04U) }, |
||
565 | { "N", input.kbd+7, u8(~0x08U) }, |
||
566 | { "B", input.kbd+7, u8(~0x10U) }, |
||
567 | |||
568 | // quorum additional keys |
||
569 | { "RUS", input.kbd+8, u8(~0x01U) }, |
||
570 | { "LAT", input.kbd+8, u8(~0x02U) }, |
||
571 | { "N1", input.kbd+8, u8(~0x08U) }, |
||
572 | { "N2", input.kbd+8, u8(~0x10U) }, |
||
573 | { ".", input.kbd+8, u8(~0x20U) }, |
||
574 | |||
575 | { "CAPS", input.kbd+9, u8(~0x01U) }, |
||
576 | { "F2", input.kbd+9, u8(~0x02U) }, |
||
577 | { "TILDA", input.kbd+9, u8(~0x04U) }, |
||
578 | { "N4", input.kbd+9, u8(~0x08U) }, |
||
579 | { "QUOTE", input.kbd+9, u8(~0x10U) }, |
||
580 | { "N6", input.kbd+9, u8(~0x20U) }, |
||
581 | |||
582 | { "TAB", input.kbd+10, u8(~0x01U) }, |
||
583 | { "F4", input.kbd+10, u8(~0x02U) }, |
||
584 | { "N7", input.kbd+10, u8(~0x08U) }, |
||
585 | { "N5", input.kbd+10, u8(~0x10U) }, |
||
586 | { "N9", input.kbd+10, u8(~0x20U) }, |
||
587 | |||
588 | { "EBOX", input.kbd+11, u8(~0x01U) }, |
||
589 | { "F5", input.kbd+11, u8(~0x02U) }, |
||
590 | { "BS", input.kbd+11, u8(~0x04U) }, |
||
591 | { "NSLASH", input.kbd+11, u8(~0x08U) }, |
||
592 | { "N8", input.kbd+11, u8(~0x10U) }, |
||
593 | { "NMINUS", input.kbd+11, u8(~0x20U) }, |
||
594 | |||
595 | { "-", input.kbd+12, u8(~0x01U) }, |
||
596 | { "+", input.kbd+12, u8(~0x04U) }, |
||
597 | { "DEL", input.kbd+12, u8(~0x08U) }, |
||
598 | { "NSTAR", input.kbd+12, u8(~0x10U) }, |
||
599 | { "GBOX", input.kbd+12, u8(~0x20U) }, |
||
600 | |||
601 | { "COLON", input.kbd+13, u8(~0x01U) }, |
||
602 | { "F3", input.kbd+13, u8(~0x02U) }, |
||
603 | { "\\", input.kbd+13, u8(~0x04U) }, |
||
604 | { "]", input.kbd+13, u8(~0x10U) }, |
||
605 | { "[", input.kbd+13, u8(~0x20U) }, |
||
606 | |||
607 | { ",", input.kbd+14, u8(~0x01U) }, |
||
608 | { "/", input.kbd+14, u8(~0x10U) }, |
||
609 | { "N3", input.kbd+14, u8(~0x20U) }, |
||
610 | |||
611 | { "F1", input.kbd+15, u8(~0x02U) }, |
||
612 | { "N0", input.kbd+15, u8(~0x08U) }, |
||
613 | { "NPOINT", input.kbd+15, u8(~0x10U) }, |
||
614 | { "NPLUS", input.kbd+15, u8(~0x20U) }, |
||
615 | }; |
||
616 | |||
617 | zxkeymap zxk_maps[] = |
||
618 | { |
||
619 | { "default", zxk_default, _countof(zxk_default) }, |
||
620 | { "BK08", zxk_bk08, _countof(zxk_bk08) }, |
||
621 | { "quorum", zxk_quorum, _countof(zxk_quorum) }, |
||
622 | }; |
||
623 | |||
624 | const size_t zxk_maps_count = _countof(zxk_maps); |
||
625 | |||
626 | PALETTEENTRY syspalette[0x100]; |
||
627 | |||
628 | GDIBMP gdibmp = { { { sizeof(BITMAPINFOHEADER), 320, -240, 1, 8, BI_RGB, 0 } } }; |
||
629 | |||
630 | PALETTE_OPTIONS pals[32] = {{"default",0x00,0x80,0xC0,0xE0,0xFF,0xC8,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF}}; |
||
631 | |||
632 | #pragma pack() |
||
633 | |||
634 | unsigned char snbuf[4*1048576]; // large temporary buffer (for reading snapshots) |
||
635 | unsigned char gdibuf[2*1048576]; |
||
636 | |||
637 | // on-screen watches block |
||
638 | uintptr_t watch_script[4][64]; |
||
639 | unsigned char watch_enabled[4]; |
||
640 | unsigned char used_banks[MAX_PAGES]; |
||
641 | unsigned char trace_rom=1, trace_ram=1; |
||
642 | |||
643 | DWORD WinVerMajor; |
||
644 | DWORD WinVerMinor; |
||
645 | HWND dlg; // used in setcheck/getcheck: gui settings, monitor dialogs |
||
646 | |||
647 | HBITMAP hbm; // bitmap for repaint background |
||
648 | DWORD bm_dx, bm_dy; |
||
649 | DWORD mousepos; // left-clicked point in monitor |
||
650 | unsigned nowait; // don't close console window after error if started from GUI |
||
651 | bool normal_exit = false; // true on correct exit, false on failure exit |
||
652 | |||
653 | char *ayvols[64]; unsigned num_ayvols; |
||
654 | char *aystereo[64]; unsigned num_aystereo; |
||
655 | char *ulapreset[64]; unsigned num_ula; |
||
784 | DimkaM | 656 | static char presetbuf[0x4000]; |
657 | char *setptr = presetbuf; |
||
716 | lvd | 658 | |
659 | /* |
||
660 | #include "fontdata.cpp" |
||
661 | #include "font8.cpp" |
||
662 | #include "font14.cpp" |
||
663 | #include "font16.cpp" |
||
664 | #include "fontatm2.cpp" |
||
665 | */ |
||
666 | |||
800 | DimkaM | 667 | // ������� ����� � ���� ������� ������ ��������������� enum AY_SCHEME |
668 | const char * const ay_schemes[] = |
||
669 | { |
||
670 | "no soundchip", |
||
671 | "fuller box", |
||
672 | "single chip", |
||
673 | "pseudo-turbo", |
||
674 | "quadro-AY", |
||
675 | "turbo-AY // POS", |
||
676 | "turbo-sound // NedoPC" |
||
677 | }; |
||
730 | lvd | 678 | |
679 | int trdos_in_nmi = 0; |