Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1088 alone 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"
10
#include "sndrender/sndcounter.h"
11
#include "sound.h"
12
 
13
//=============================================================================
14
namespace z80fast
15
{
16
#include "z80_main.h"
17
}
18
//=============================================================================
19
int fmsoundon0 = 4;     //Alone Coder
20
int tfmstatuson0 = 2;   //Alone Coder
21
char pressedit = 0;     //Alone Coder
22
//=============================================================================
23
void __fastcall wmdbg( u32 addr, u8 val);
24
u8 __fastcall rmdbg( u32 addr);
25
u8 *__fastcall MemDbg( u32 addr);
26
void __cdecl BankNames( int i, char *Name);
27
//=============================================================================
28
namespace z80dbg
29
{
30
    void Z80FAST step();
31
    __int64 __cdecl delta();
32
    void __cdecl SetLastT();
33
}
34
//=============================================================================
35
#pragma pack(8)
36
 
37
void out( unsigned port, unsigned char val);
38
unsigned char in( unsigned port);
39
 
40
//=============================================================================
41
Z80INLINE unsigned char m1_cycle( Z80 *cpu)
42
{
43
//  cpu->r_low++; cpu->t += 4;          //0.39.0
44
//  return cpu->MemIf->xm(cpu->pc++);
45
 
46
    unsigned char temp_op_code;         //NEDOREPO
47
    cpu->r_low++;
48
    cpu->t += 4;
49
    temp_op_code = cpu->MemIf->xm( cpu->pc++);
50
    //-------------------------------------------------------------------------
51
    if ((conf.mem_model == MM_ATM3) && (comp.pBE) && cpu->nmi_in_progress)
52
    {
53
        if (comp.pBE == 1)
54
        {
55
            if (trdos_in_nmi)
56
            {
57
                comp.flags |= CF_SETDOSROM | CF_TRDOS;
58
            }
59
            cpu->nmi_in_progress = false;
60
            set_banks();
61
        }
62
        comp.pBE--;
63
    }
64
    //-------------------------------------------------------------------------
65
    return temp_op_code;                //NEDOREPO
66
}
67
//=============================================================================
68
/*
69
unsigned char TMainZ80::rm(unsigned addr)
70
{
71
    return z80fast::rm(addr);
72
}
73
unsigned char TMainZ80::dbgrm(unsigned addr)
74
{
75
    return ::rmdbg(addr);
76
}
77
void TMainZ80::wm(unsigned addr, unsigned char val)
78
{
79
    z80fast::wm(addr, val);
80
}
81
void TMainZ80::dbgwm(unsigned addr, unsigned char val)
82
{
83
    ::wmdbg(addr, val);
84
}
85
*/
86
//=============================================================================
87
u8 *TMainZ80::DirectMem(unsigned addr) const
88
{
89
    return am_r(addr);
90
}
91
//=============================================================================
92
unsigned char TMainZ80::m1_cycle()
93
{
94
    return ::m1_cycle(this);
95
}
96
//=============================================================================
97
unsigned char TMainZ80::in(unsigned port)
98
{
99
    return ::in(port);
100
}
101
//=============================================================================
102
void TMainZ80::out(unsigned port, unsigned char val)
103
{
104
    ::out(port, val);
105
}
106
//=============================================================================
107
u8 TMainZ80::IntVec()
108
{
109
    return (comp.flags & CF_Z80FBUS)  ? u8(rdtsc() & 0xFF) :
110
                                        0xFF;
111
}
112
//=============================================================================
113
void TMainZ80::CheckNextFrame()
114
{
115
    if (t >= conf.frame)
116
    {
117
        comp.t_states += conf.frame;
118
        t -= conf.frame;
119
        eipos -= conf.frame;
120
        comp.frame_counter++;
121
        int_pend = true;
122
    }
123
}
124
//=============================================================================
125
void TMainZ80::retn()
126
{
127
//  nmi_in_progress = false;    //����������� � NEDOREPO
128
//  set_banks();                //���� � 0.39.0
129
}
130
//=============================================================================
131
static const TMemIf FastMemIf =
132
{
133
    Xm,
134
    Rm,
135
    Wm
136
};
137
//=============================================================================
138
static const TMemIf DbgMemIf =
139
{
140
    DbgXm,
141
    DbgRm,
142
    DbgWm
143
};
144
//=============================================================================
145
 
146
TMainZ80 cpu(   0,
147
                BankNames,
148
                z80dbg::step,
149
                z80dbg::delta,
150
                z80dbg::SetLastT,
151
                  membits,
152
                  io_bits,              // [NS]
153
                  bp_disable_bits,      // [NS]
154
                &FastMemIf,
155
                &DbgMemIf
156
        );
157
 
158
//=============================================================================
159
 
160
 
161
//=============================================================================
162
#ifdef MOD_GSZ80
163
    //-------------------------------------------------------------------------
164
    namespace z80gs
165
    {
166
        //---------------------------------------------------------------------
167
        u8 __fastcall dbgrm(u32 addr);
168
        void __fastcall dbgwm(u32 addr, u8 val);
169
        u8 *__fastcall MemDbg(u32 addr);
170
        void __cdecl BankNames(int i, char *Name);
171
        void Z80FAST step();
172
        __int64 __cdecl delta();
173
        void __cdecl SetLastT();
174
        //---------------------------------------------------------------------
175
          u8 membits[ 0x10000];
176
          u8 io_bits[ 0x10000];         // [NS]
177
          u8 bp_disable_bits[ 0x10000]; // [NS]
178
 
179
        SNDRENDER sound;
180
        //---------------------------------------------------------------------
181
        static const TMemIf FastMemIf =
182
        {
183
            z80gs::Xm,
184
            z80gs::Rm,
185
            z80gs::Wm
186
        };
187
        //---------------------------------------------------------------------
188
        static const TMemIf DbgMemIf =
189
        {
190
            z80gs::DbgXm,
191
            z80gs::DbgRm,
192
            z80gs::DbgWm
193
        };
194
        //---------------------------------------------------------------------
195
    } //namespace z80gs
196
    //-------------------------------------------------------------------------
197
    u8 TGsZ80::IntVec()
198
    {
199
        return 0xFF;
200
    }
201
    //-------------------------------------------------------------------------
202
    void TGsZ80::CheckNextFrame()
203
    {
204
        if (t >= z80gs::GSCPUINT)
205
        {
206
            t -= z80gs::GSCPUINT;
207
            eipos -= z80gs::GSCPUINT;
208
            z80gs::gs_t_states += z80gs::GSCPUINT;
209
            int_pend = true;
210
        }
211
    }
212
    //-------------------------------------------------------------------------
213
    TGsZ80 gscpu(      
214
        1,
215
        z80gs::BankNames,
216
        z80gs::step,
217
        z80gs::delta,
218
        z80gs::SetLastT,
219
          z80gs::membits,              
220
          z80gs::io_bits,               // [NS]
221
          z80gs::bp_disable_bits,       // [NS]
222
        &z80gs::FastMemIf,
223
        &z80gs::DbgMemIf
224
    );
225
    //-------------------------------------------------------------------------
226
#endif
227
//=============================================================================
228
 
229
 
230
//=============================================================================
231
TCpuMgr CpuMgr;
232
//=============================================================================
233
void TCpuMgr::SwitchCpu()
234
{
235
    CurrentCpu++;
236
    CurrentCpu %= Count;
237
}
238
//=============================================================================
239
Z80 *TCpuMgr::Cpus[] =
240
{
241
//-----------------------------------------------------------------------------
242
    &cpu,
243
//-----------------------------------------------------------------------------
244
#ifdef MOD_GSZ80
245
    &gscpu
246
#endif
247
//-----------------------------------------------------------------------------
248
};
249
//=============================================================================
250
 
251
const unsigned TCpuMgr::Count = _countof( Cpus);
252
TZ80State TCpuMgr::PrevCpus[ TCpuMgr::Count];
253
unsigned TCpuMgr::CurrentCpu = 0;
254
 
255
//=============================================================================
256
#ifdef MOD_GSBASS
257
    GSHLE gs;
258
#endif
259
//=============================================================================
260
unsigned char dbgbreak = 0;
261
//=============================================================================
262
CONFIG conf;
263
COMPUTER comp;
264
TEMP temp;
265
ATA_PORT hdd;   // not in `comp' - not cleared in reset()
266
K_INPUT input;
267
ISA_MODEM modem;
268
//=============================================================================
269
SNDRENDER sound;
270
SNDCHIP ay[ 2];
271
SNDCOUNTER sndcounter;
272
//=============================================================================
273
 
274
unsigned char *base_sos_rom;
275
unsigned char *base_dos_rom;
276
unsigned char *base_128_rom;
277
unsigned char *base_sys_rom;
278
 
279
//=============================================================================
280
#ifdef CACHE_ALIGNED
281
    ATTR_ALIGN( 4096)
282
    unsigned char memory[ PAGE * MAX_PAGES];
283
#else // __declspec(align) not available, force QWORD align with old method
284
    __int64 memory__[PAGE * MAX_PAGES / sizeof( __int64)];
285
    unsigned char * const memory = (unsigned char*) memory__;
286
#endif
287
//=============================================================================
288
#ifdef MOD_VID_VD
289
    CACHE_ALIGNED unsigned char vdmem[4][0x2000];
290
#endif
291
//=============================================================================
292
unsigned char membits[ 0x10000];                // ��� ������ � ������ �����
293
//      MEMBITS_R = 0x01
294
//      MEMBITS_W = 0x02
295
//      MEMBITS_X = 0x04
296
//      MEMBITS_BPR = 0x10
297
//      MEMBITS_BPW = 0x20
298
//      MEMBITS_BPX = 0x40
299
//              2 FREE
300
//
301
// �� ��������� ������ membits-�� ��������� ������������� � ����� ������ ��������� �������
302
// �� ��� ������������ ����������� ��� ������
303
unsigned char io_bits[ 0x10000];                // ��� IO [NS]
304
//      IO_BITS_IN
305
//      IO_BITS_OUT
306
//      IO_BITS_BP_IN
307
//      IO_BITS_BP_OUT
308
//              4 FREE
309
 
310
unsigned char bp_disable_bits[ 0x10000];        // ��� ���������� ������ [NS]
311
//      BP_DISABLE_BPR
312
//      BP_DISABLE_BPW
313
//      BP_DISABLE_BPX
314
//
315
//      BP_DISABLE_BP_IN
316
//      BP_DISABLE_BP_OUT
317
//              3 FREE
318
 
319
unsigned char *bankr[ 4];
320
unsigned char *bankw[ 4];
321
unsigned char cmos[ 0x100];
322
unsigned char nvram[ 0x800];
323
//=============================================================================
324
unsigned sndplaybuf[ PLAYBUFSIZE];
325
unsigned spbsize;
326
//=============================================================================
327
FILE *savesnd;
328
unsigned char savesndtype;      // 0-none,
329
                                // 1-wave,
330
                                // 2-vtx
331
unsigned char *vtxbuf;
332
unsigned vtxbufsize;
333
unsigned vtxbuffilled;
334
//=============================================================================
335
unsigned char trdos_load;       // for leds
336
unsigned char trdos_save;
337
unsigned char trdos_format;
338
unsigned char trdos_seek;
339
//=============================================================================
340
unsigned char needclr;                  // clear screenbuffer before rendering (��� ��������)
341
//=============================================================================
342
HWND wnd;
343
HINSTANCE hIn;
344
//=============================================================================
345
char droppedFile[ 512];
346
//=============================================================================
347
const TMemModel mem_model[ N_MM_MODELS] =
348
{
349
    { "PENTAGON",               "PENTAGON",     MM_PENTAGON,    128,    RAM_128 | RAM_256 | RAM_512 | RAM_1024 },
350
    { "ZS SCORPION",            "SCORPION",     MM_SCORP,       256,    RAM_256 | RAM_1024 },
351
    { "ZS SCORPION + PROF ROM", "PROFSCORP",    MM_PROFSCORP,   256,    RAM_256 | RAM_1024 },
352
    { "PROFI",                  "PROFI",        MM_PROFI,       1024,   RAM_1024 },
353
    { "ATM-TURBO v4.50",        "ATM450",       MM_ATM450,      512,    RAM_512 | RAM_1024 },
354
    { "ATM-TURBO 2+ v7.10",     "ATM710",       MM_ATM710,      1024,   RAM_128 | RAM_256 | RAM_512 | RAM_1024 },
355
//  { "ATM-TURBO 3",            "ATM3",         MM_ATM3,        4096,   RAM_4096 },
356
//  { "ZX-EVO",                 "ATM3",         MM_ATM3,        4096,   RAM_4096 },     // NEDOREPO
357
//  { "PENTEVO",                "PENTEVO",      MM_ATM3,        4096,   RAM_4096 },     // [NS]
358
//  { "ZX-Evolution",           "ZX_EVO",       MM_ATM3,        4096,   RAM_4096 },     // [NS] r0111
359
    { "ZX-EVO",                 "ZX_EVO",       MM_ATM3,        4096,   RAM_4096 },     // [NS] r0111
360
    { "Nemo's KAY",             "KAY",          MM_KAY,         256,    RAM_256 | RAM_1024 },
361
//  { "KAY",                    "KAY",          MM_KAY,         256,    RAM_256 | RAM_1024 },
362
//  { "ZX-Spectrum +3",         "PLUS3",        MM_PLUS3,       128,    RAM_128 },
363
    { "ZX-SPECTRUM +3",         "PLUS3",        MM_PLUS3,       128,    RAM_128 },
364
    { "QUORUM",                 "QUORUM",       MM_QUORUM,      1024,   RAM_128 | RAM_1024 },
365
};
366
//=============================================================================
367
unsigned char kbdpc[ VK_MAX];                   // add cells for mouse & joystick
368
unsigned char kbdpc_prev[ VK_MAX]; // static    // thims zxevo_ps/2 NEDOREPO
369
unsigned char kbdpcEX[ 6];                      // Dexus
370
keyports inports[ VK_MAX];
371
//=============================================================================
372
char statusline[ 128];
373
unsigned statcnt;
374
//=============================================================================
375
char arcbuffer[ 0x2000];        // extensions and command lines for archivers
376
char skiparc[ 0x400];           // ignore this files in archive
377
//=============================================================================
378
unsigned char exitflag = 0;     // avoid call exit() twice
379
//=============================================================================
380
// beta128 vars
381
unsigned trd_toload = 0;        // drive to load
382
unsigned DefaultDrive = -1U;    // �������� �� ��������� � ������� �������� ������ ������ ��� ������
383
 
384
char trd_loaded[ 4];            // used to get first free drive with no account of autoloaded images
385
char ininame[ 0x200];
386
char helpname[ 0x200];
387
unsigned snapsize;
388
//=============================================================================
389
// conditional breakpoints support
390
unsigned brk_port_in;
391
unsigned brk_port_out;
392
unsigned char brk_port_val;
393
//=============================================================================
394
virtkeyt pckeys[] =
395
{
396
    { "ESC",    DIK_ESCAPE },
397
    { "F1",     DIK_F1 },
398
    { "F2",     DIK_F2 },
399
    { "F3",     DIK_F3 },
400
    { "F4",     DIK_F4 },
401
    { "F5",     DIK_F5 },
402
    { "F6",     DIK_F6 },
403
    { "F7",     DIK_F7 },
404
    { "F8",     DIK_F8 },
405
    { "F9",     DIK_F9 },
406
    { "F10",    DIK_F10 },
407
    { "F11",    DIK_F11 },
408
    { "F12",    DIK_F12 },
409
    { "PRSCR",  DIK_SYSRQ },
410
    { "SCLOCK", DIK_SCROLL },
411
    { "PAUSE",  DIK_PAUSE },
412
 
413
    { "1",      DIK_1 },
414
    { "2",      DIK_2 },
415
    { "3",      DIK_3 },
416
    { "4",      DIK_4 },
417
    { "5",      DIK_5 },
418
    { "6",      DIK_6 },
419
    { "7",      DIK_7 },
420
    { "8",      DIK_8 },
421
    { "9",      DIK_9 },
422
    { "0",      DIK_0 },
423
 
424
    { "Q",      DIK_Q },
425
    { "W",      DIK_W },
426
    { "E",      DIK_E },
427
    { "R",      DIK_R },
428
    { "T",      DIK_T },
429
    { "Y",      DIK_Y },
430
    { "U",      DIK_U },
431
    { "I",      DIK_I },
432
    { "O",      DIK_O },
433
    { "P",      DIK_P },
434
 
435
    { "A",      DIK_A },
436
    { "S",      DIK_S },
437
    { "D",      DIK_D },
438
    { "F",      DIK_F },
439
    { "G",      DIK_G },
440
    { "H",      DIK_H },
441
    { "J",      DIK_J },
442
    { "K",      DIK_K },
443
    { "L",      DIK_L },
444
 
445
    { "Z",      DIK_Z },
446
    { "X",      DIK_X },
447
    { "C",      DIK_C },
448
    { "V",      DIK_V },
449
    { "B",      DIK_B },
450
    { "N",      DIK_N },
451
    { "M",      DIK_M },
452
 
453
    { "MINUS",  DIK_MINUS },
454
    { "PLUS",   DIK_EQUALS },
455
    { "BACK",   DIK_BACK },
456
    { "TAB",    DIK_TAB },
457
    { "LB",     DIK_LBRACKET },
458
    { "RB",     DIK_RBRACKET },
459
    { "CAPS",   DIK_CAPITAL },
460
    { "TIL",    DIK_GRAVE },
461
    { "SPACE",  DIK_SPACE },
462
    { "COL",    DIK_SEMICOLON },
463
    { "QUOTE",  DIK_APOSTROPHE },
464
    { "ENTER",  DIK_RETURN },
465
    { "COMMA",  DIK_COMMA },
466
    { "POINT",  DIK_PERIOD },
467
    { "SLASH",  DIK_SLASH },
468
    { "BACKSL", DIK_BACKSLASH },
469
 
470
    { "SHIFT",          DIK_SHIFT },
471
    { "ALT",            DIK_MENU },
472
    { "CONTROL",        DIK_CONTROL },
473
    { "LSHIFT",         DIK_LSHIFT },
474
    { "LALT",           DIK_LMENU },
475
    { "LCONTROL",       DIK_LCONTROL },
476
    { "RSHIFT",         DIK_RSHIFT },
477
    { "RALT",           DIK_RMENU },
478
    { "RCONTROL",       DIK_RCONTROL },
479
 
480
    { "INS",    DIK_INSERT },
481
    { "HOME",   DIK_HOME },
482
    { "PGUP",   DIK_PRIOR },
483
    { "DEL",    DIK_DELETE },
484
    { "END",    DIK_END },
485
    { "PGDN",   DIK_NEXT },
486
 
487
    { "UP",     DIK_UP },
488
    { "DOWN",   DIK_DOWN },
489
    { "LEFT",   DIK_LEFT },
490
    { "RIGHT",  DIK_RIGHT },
491
 
492
    { "NUMLOCK",        DIK_NUMLOCK },
493
    { "GRDIV",          DIK_DIVIDE },
494
    { "GRMUL",          DIK_MULTIPLY },
495
    { "GRSUB",          DIK_SUBTRACT },
496
    { "GRADD",          DIK_ADD },
497
    { "GRENTER",        DIK_NUMPADENTER },
498
 
499
    { "N0",     DIK_NUMPAD0 },
500
    { "N1",     DIK_NUMPAD1 },
501
    { "N2",     DIK_NUMPAD2 },
502
    { "N3",     DIK_NUMPAD3 },
503
    { "N4",     DIK_NUMPAD4 },
504
    { "N5",     DIK_NUMPAD5 },
505
    { "N6",     DIK_NUMPAD6 },
506
    { "N7",     DIK_NUMPAD7 },
507
    { "N8",     DIK_NUMPAD8 },
508
    { "N9",     DIK_NUMPAD9 },
509
    { "NP",     DIK_DECIMAL },
510
 
511
    { "LMB",    VK_LMB },
512
    { "RMB",    VK_RMB },
513
    { "MMB",    VK_MMB },
514
    { "MWU",    VK_MWU },
515
    { "MWD",    VK_MWD },
516
 
517
    { "JLEFT",  VK_JLEFT },
518
    { "JRIGHT", VK_JRIGHT },
519
    { "JUP",    VK_JUP },
520
    { "JDOWN",  VK_JDOWN },
521
    { "JFIRE",  VK_JFIRE },
522
    { "JB0",    VK_JB0 },
523
    { "JB1",    VK_JB1 },
524
    { "JB2",    VK_JB2 },
525
    { "JB3",    VK_JB3 },
526
    { "JB4",    VK_JB4 },
527
    { "JB5",    VK_JB5 },
528
    { "JB6",    VK_JB6 },
529
    { "JB7",    VK_JB7 },
530
    { "JB8",    VK_JB8 },
531
    { "JB9",    VK_JB9 },
532
    { "JB10",   VK_JB10 },
533
    { "JB11",   VK_JB11 },
534
    { "JB12",   VK_JB12 },
535
    { "JB13",   VK_JB13 },
536
    { "JB14",   VK_JB14 },
537
    { "JB15",   VK_JB15 },
538
    { "JB16",   VK_JB16 },
539
    { "JB17",   VK_JB17 },
540
    { "JB18",   VK_JB18 },
541
    { "JB19",   VK_JB19 },
542
    { "JB20",   VK_JB20 },
543
    { "JB21",   VK_JB21 },
544
    { "JB22",   VK_JB22 },
545
    { "JB23",   VK_JB23 },
546
    { "JB24",   VK_JB24 },
547
    { "JB25",   VK_JB25 },
548
    { "JB26",   VK_JB26 },
549
    { "JB27",   VK_JB27 },
550
    { "JB28",   VK_JB28 },
551
    { "JB29",   VK_JB29 },
552
    { "JB30",   VK_JB30 },
553
    { "JB31",   VK_JB31 },
554
};
555
const size_t pckeys_count = _countof( pckeys);
556
//=============================================================================
557
 
558
//=============================================================================
559
static zxkey zxk_default[] =
560
{
561
    { "KRIGHT", &input.kjoy,    u8( ~1U)        },
562
    { "KLEFT"&input.kjoy,    u8( ~2U)        },
563
    { "KDOWN"&input.kjoy,    u8( ~4U)        },
564
    { "KUP",    &input.kjoy,    u8( ~8U)        },
565
    { "KFIRE"&input.kjoy,    u8( ~16U)       },
566
    { "KFIRE1", &input.kjoy,    u8( ~16U)       },
567
    { "KFIRE2", &input.kjoy,    u8( ~32U)       },
568
    { "KFIRE3", &input.kjoy,    u8( ~64U)       },
569
 
570
    // fuller joystick
571
    { "FRIGHT", &input.fjoy,    u8( ~8U)        },
572
    { "FLEFT"&input.fjoy,    u8( ~4U)        },
573
    { "FDOWN"&input.fjoy,    u8( ~2U)        },
574
    { "FUP",    &input.fjoy,    u8( ~1U)        },
575
    { "FFIRE"&input.fjoy,    u8( ~128U)      },
576
    { "FFIRE1", &input.fjoy,    u8( ~128U)      },
577
    { "FFIRE2", &input.fjoy,    u8( ~64U)       },
578
    { "FFIRE3", &input.fjoy,    u8( ~32U)       },
579
 
580
    { "ENT",    input.kbd + 6,  u8( ~0x01U)     },
581
    { "SPC",    input.kbd + 7,  u8( ~0x01U)     },
582
    { "SYM",    input.kbd + 7,  u8( ~0x02U)     },
583
 
584
    { "CAP",    input.kbd + 0,  u8( ~0x01U)     },
585
    { "Z",      input.kbd + 0,  u8( ~0x02U)     },
586
    { "X",      input.kbd + 0,  u8( ~0x04U)     },
587
    { "C",      input.kbd + 0,  u8( ~0x08U)     },
588
    { "V",      input.kbd + 0,  u8( ~0x10U)     },
589
 
590
    { "A",      input.kbd + 1,  u8( ~0x01U)     },
591
    { "S",      input.kbd + 1,  u8( ~0x02U)     },
592
    { "D",      input.kbd + 1,  u8( ~0x04U)     },
593
    { "F",      input.kbd + 1,  u8( ~0x08U)     },
594
    { "G",      input.kbd + 1,  u8( ~0x10U)     },
595
 
596
    { "Q",      input.kbd + 2,  u8( ~0x01U)     },
597
    { "W",      input.kbd + 2,  u8( ~0x02U)     },
598
    { "E",      input.kbd + 2,  u8( ~0x04U)     },
599
    { "R",      input.kbd + 2,  u8( ~0x08U)     },
600
    { "T",      input.kbd + 2,  u8( ~0x10U)     },
601
 
602
    { "1",      input.kbd + 3,  u8( ~0x01U)     },
603
    { "2",      input.kbd + 3,  u8( ~0x02U)     },
604
    { "3",      input.kbd + 3,  u8( ~0x04U)     },
605
    { "4",      input.kbd + 3,  u8( ~0x08U)     },
606
    { "5",      input.kbd + 3,  u8( ~0x10U)     },
607
 
608
    { "0",      input.kbd + 4,  u8( ~0x01U)     },
609
    { "9",      input.kbd + 4,  u8( ~0x02U)     },
610
    { "8",      input.kbd + 4,  u8( ~0x04U)     },
611
    { "7",      input.kbd + 4,  u8( ~0x08U)     },
612
    { "6",      input.kbd + 4,  u8( ~0x10U)     },
613
 
614
    { "P",      input.kbd + 5,  u8( ~0x01U)     },
615
    { "O",      input.kbd + 5,  u8( ~0x02U)     },
616
    { "I",      input.kbd + 5,  u8( ~0x04U)     },
617
    { "U",      input.kbd + 5,  u8( ~0x08U)     },
618
    { "Y",      input.kbd + 5,  u8( ~0x10U)     },
619
 
620
    { "L",      input.kbd + 6,  u8( ~0x02U)     },
621
    { "K",      input.kbd + 6,  u8( ~0x04U)     },
622
    { "J",      input.kbd + 6,  u8( ~0x08U)     },
623
    { "H",      input.kbd + 6,  u8( ~0x10U)     },
624
 
625
    { "M",      input.kbd + 7,  u8( ~0x04U)     },
626
    { "N",      input.kbd + 7,  u8( ~0x08U)     },
627
    { "B",      input.kbd + 7,  u8( ~0x10U)     },
628
};
629
//=============================================================================
630
 
631
 
632
//=============================================================================
633
static zxkey zxk_bk08[] =
634
{
635
    { "KRIGHT", &input.kjoy,    u8(~1U)         },
636
    { "KLEFT"&input.kjoy,    u8(~2U)         },
637
    { "KDOWN"&input.kjoy,    u8(~4U)         },
638
    { "KUP",    &input.kjoy,    u8(~8U)         },
639
    { "KFIRE"&input.kjoy,    u8(~16U)        },
640
    { "KFIRE1", &input.kjoy,    u8(~16U)        },
641
    { "KFIRE2", &input.kjoy,    u8(~32U)        },
642
    { "KFIRE3", &input.kjoy,    u8(~64U)        },
643
 
644
    // fuller joystick
645
    { "FRIGHT", &input.fjoy,    u8(~8U)         },
646
    { "FLEFT"&input.fjoy,    u8(~4U)         },
647
    { "FDOWN"&input.fjoy,    u8(~2U)         },
648
    { "FUP",    &input.fjoy,    u8(~1U)         },
649
    { "FFIRE"&input.fjoy,    u8(~128U)       },
650
    { "FFIRE1", &input.fjoy,    u8(~128U)       },
651
    { "FFIRE2", &input.fjoy,    u8(~64U)        },
652
    { "FFIRE3", &input.fjoy,    u8(~32U)        },
653
 
654
    { "ALT",    input.kbd + 0,  u8(~0x01U)      },
655
    { "Z",      input.kbd + 0,  u8(~0x02U)      },
656
    { "X",      input.kbd + 0,  u8(~0x04U)      },
657
    { "C",      input.kbd + 0,  u8(~0x08U)      },
658
    { "V",      input.kbd + 0,  u8(~0x10U)      },
659
    { "RUS",    input.kbd + 0,  u8(~0x20U)      },
660
    { "SHF",    input.kbd + 0,  u8( 0x7FU)      },
661
 
662
    { "A",      input.kbd + 1,  u8(~0x01U)      },
663
    { "S",      input.kbd + 1,  u8(~0x02U)      },
664
    { "D",      input.kbd + 1,  u8(~0x04U)      },
665
    { "F",      input.kbd + 1,  u8(~0x08U)      },
666
    { "G",      input.kbd + 1,  u8(~0x10U)      },
667
    { "BSL",    input.kbd + 1,  u8(~0x20U)      },
668
    { "SL",     input.kbd + 1,  u8( 0x7FU)      },
669
 
670
    { "Q",      input.kbd + 2,  u8(~0x01U)      },
671
    { "W",      input.kbd + 2,  u8(~0x02U)      },
672
    { "E",      input.kbd + 2,  u8(~0x04U)      },
673
    { "R",      input.kbd + 2,  u8(~0x08U)      },
674
    { "T",      input.kbd + 2,  u8(~0x10U)      },
675
    { "CMA",    input.kbd + 2,  u8(~0x20U)      },
676
    { "PNT",    input.kbd + 2,  u8( 0x7FU)      },
677
 
678
    { "1",      input.kbd + 3,  u8(~0x01U)      },
679
    { "2",      input.kbd + 3,  u8(~0x02U)      },
680
    { "3",      input.kbd + 3,  u8(~0x04U)      },
681
    { "4",      input.kbd + 3,  u8(~0x08U)      },
682
    { "5",      input.kbd + 3,  u8(~0x10U)      },
683
    { "TIL",    input.kbd + 3,  u8(~0x20U)      },
684
    { "TAB",    input.kbd + 3,  u8( 0x7FU)      },
685
 
686
    { "0",      input.kbd + 4,  u8(~0x01U)      },
687
    { "9",      input.kbd + 4,  u8(~0x02U)      },
688
    { "8",      input.kbd + 4,  u8(~0x04U)      },
689
    { "7",      input.kbd + 4,  u8(~0x08U)      },
690
    { "6",      input.kbd + 4,  u8(~0x10U)      },
691
    { "MNS",    input.kbd + 4,  u8(~0x20U)      },
692
    { "PLS",    input.kbd + 4,  u8( 0x7FU)      },
693
 
694
    { "P",      input.kbd + 5,  u8(~0x01U)      },
695
    { "O",      input.kbd + 5,  u8(~0x02U)      },
696
    { "I",      input.kbd + 5,  u8(~0x04U)      },
697
    { "U",      input.kbd + 5,  u8(~0x08U)      },
698
    { "Y",      input.kbd + 5,  u8(~0x10U)      },
699
    { "LB",     input.kbd + 5,  u8(~0x20U)      },
700
    { "RB",     input.kbd + 5,  u8( 0x7FU)      },
701
 
702
    { "ENT",    input.kbd + 6,  u8(~0x01U)      },
703
    { "L",      input.kbd + 6,  u8(~0x02U)      },
704
    { "K",      input.kbd + 6,  u8(~0x04U)      },
705
    { "J",      input.kbd + 6,  u8(~0x08U)      },
706
    { "H",      input.kbd + 6,  u8(~0x10U)      },
707
    { "COL",    input.kbd + 6,  u8(~0x20U)      },
708
    { "QUO",    input.kbd + 6,  u8( 0x7FU)      },
709
 
710
    { "SPC",    input.kbd + 7,  u8(~0x01U)      },
711
    { "CTL",    input.kbd + 7,  u8(~0x02U)      },
712
    { "M",      input.kbd + 7,  u8(~0x04U)      },
713
    { "N",      input.kbd + 7,  u8(~0x08U)      },
714
    { "B",      input.kbd + 7,  u8(~0x10U)      },
715
    { "R/A",    input.kbd + 7,  u8(~0x20U)      },
716
    { "CPS",    input.kbd + 7,  u8( 0x7FU)      }
717
};
718
//=============================================================================
719
 
720
 
721
//=============================================================================
722
static zxkey zxk_quorum[] =
723
{
724
    { "KRIGHT", &input.kjoy,    u8(~1U)         },
725
    { "KLEFT"&input.kjoy,    u8(~2U)         },
726
    { "KDOWN"&input.kjoy,    u8(~4U)         },
727
    { "KUP",    &input.kjoy,    u8(~8U)         },
728
    { "KFIRE"&input.kjoy,    u8(~16U)        },
729
    { "KFIRE1", &input.kjoy,    u8(~16U)        },
730
    { "KFIRE2", &input.kjoy,    u8(~32U)        },
731
    { "KFIRE3", &input.kjoy,    u8(~64U)        },
732
 
733
    // fuller joystick
734
    { "FRIGHT", &input.fjoy,    u8(~8U)         },
735
    { "FLEFT"&input.fjoy,    u8(~4U)         },
736
    { "FDOWN"&input.fjoy,    u8(~2U)         },
737
    { "FUP",    &input.fjoy,    u8(~1U)         },
738
    { "FFIRE"&input.fjoy,    u8(~128U)       },
739
    { "FFIRE1", &input.fjoy,    u8(~128U)       },
740
    { "FFIRE2", &input.fjoy,    u8(~64U)        },
741
    { "FFIRE3", &input.fjoy,    u8(~32U)        },
742
 
743
 
744
    { "ENT",    input.kbd + 6,  u8(~0x01U)      },
745
    { "SPC",    input.kbd + 7,  u8(~0x01U)      },
746
    { "SYM",    input.kbd + 7,  u8(~0x02U)      },
747
 
748
    { "CAP",    input.kbd + 0,  u8(~0x01U)      },
749
    { "Z",      input.kbd + 0,  u8(~0x02U)      },
750
    { "X",      input.kbd + 0,  u8(~0x04U)      },
751
    { "C",      input.kbd + 0,  u8(~0x08U)      },
752
    { "V",      input.kbd + 0,  u8(~0x10U)      },
753
 
754
    { "A",      input.kbd + 1,  u8(~0x01U)      },
755
    { "S",      input.kbd + 1,  u8(~0x02U)      },
756
    { "D",      input.kbd + 1,  u8(~0x04U)      },
757
    { "F",      input.kbd + 1,  u8(~0x08U)      },
758
    { "G",      input.kbd + 1,  u8(~0x10U)      },
759
 
760
    { "Q",      input.kbd + 2,  u8(~0x01U)      },
761
    { "W",      input.kbd + 2,  u8(~0x02U)      },
762
    { "E",      input.kbd + 2,  u8(~0x04U)      },
763
    { "R",      input.kbd + 2,  u8(~0x08U)      },
764
    { "T",      input.kbd + 2,  u8(~0x10U)      },
765
 
766
    { "1",      input.kbd + 3,  u8(~0x01U)      },
767
    { "2",      input.kbd + 3,  u8(~0x02U)      },
768
    { "3",      input.kbd + 3,  u8(~0x04U)      },
769
    { "4",      input.kbd + 3,  u8(~0x08U)      },
770
    { "5",      input.kbd + 3,  u8(~0x10U)      },
771
 
772
    { "0",      input.kbd + 4,  u8(~0x01U)      },
773
    { "9",      input.kbd + 4,  u8(~0x02U)      },
774
    { "8",      input.kbd + 4,  u8(~0x04U)      },
775
    { "7",      input.kbd + 4,  u8(~0x08U)      },
776
    { "6",      input.kbd + 4,  u8(~0x10U)      },
777
 
778
    { "P",      input.kbd + 5,  u8(~0x01U)      },
779
    { "O",      input.kbd + 5,  u8(~0x02U)      },
780
    { "I",      input.kbd + 5,  u8(~0x04U)      },
781
    { "U",      input.kbd + 5,  u8(~0x08U)      },
782
    { "Y",      input.kbd + 5,  u8(~0x10U)      },
783
 
784
    { "L",      input.kbd + 6,  u8(~0x02U)      },
785
    { "K",      input.kbd + 6,  u8(~0x04U)      },
786
    { "J",      input.kbd + 6,  u8(~0x08U)      },
787
    { "H",      input.kbd + 6,  u8(~0x10U)      },
788
 
789
    { "M",      input.kbd + 7,  u8(~0x04U)      },
790
    { "N",      input.kbd + 7,  u8(~0x08U)      },
791
    { "B",      input.kbd + 7,  u8(~0x10U)      },
792
 
793
    // quorum additional keys
794
    { "RUS",    input.kbd + 8,  u8(~0x01U)      },
795
    { "LAT",    input.kbd + 8,  u8(~0x02U)      },
796
    { "N1",     input.kbd + 8,  u8(~0x08U)      },
797
    { "N2",     input.kbd + 8,  u8(~0x10U)      },
798
    { ".",      input.kbd + 8,  u8(~0x20U)      },
799
 
800
    { "CAPS",   input.kbd + 9,  u8(~0x01U)      },
801
    { "F2",     input.kbd + 9,  u8(~0x02U)      },
802
    { "TILDA",  input.kbd + 9,  u8(~0x04U)      },
803
    { "N4",     input.kbd + 9,  u8(~0x08U)      },
804
    { "QUOTE",  input.kbd + 9,  u8(~0x10U)      },
805
    { "N6",     input.kbd + 9,  u8(~0x20U)      },
806
 
807
    { "TAB",    input.kbd + 10, u8(~0x01U)      },
808
    { "F4",     input.kbd + 10, u8(~0x02U)      },
809
    { "N7",     input.kbd + 10, u8(~0x08U)      },
810
    { "N5",     input.kbd + 10, u8(~0x10U)      },
811
    { "N9",     input.kbd + 10, u8(~0x20U)      },
812
 
813
    { "EBOX",   input.kbd + 11, u8(~0x01U)      },
814
    { "F5",     input.kbd + 11, u8(~0x02U)      },
815
    { "BS",     input.kbd + 11, u8(~0x04U)      },
816
    { "NSLASH", input.kbd + 11, u8(~0x08U)      },
817
    { "N8",     input.kbd + 11, u8(~0x10U)      },
818
    { "NMINUS", input.kbd + 11, u8(~0x20U)      },
819
 
820
    { "-",      input.kbd + 12, u8(~0x01U)      },
821
    { "+",      input.kbd + 12, u8(~0x04U)      },
822
    { "DEL",    input.kbd + 12, u8(~0x08U)      },
823
    { "NSTAR",  input.kbd + 12, u8(~0x10U)      },
824
    { "GBOX",   input.kbd + 12, u8(~0x20U)      },
825
 
826
    { "COLON",  input.kbd + 13, u8(~0x01U)      },
827
    { "F3",     input.kbd + 13, u8(~0x02U)      },
828
    { "\\",     input.kbd + 13, u8(~0x04U)      },
829
    { "]",      input.kbd + 13, u8(~0x10U)      },
830
    { "[",      input.kbd + 13, u8(~0x20U)      },
831
 
832
    { ",",      input.kbd + 14, u8(~0x01U)      },
833
    { "/",      input.kbd + 14, u8(~0x10U)      },
834
    { "N3",     input.kbd + 14, u8(~0x20U)      },
835
 
836
    { "F1",     input.kbd + 15, u8(~0x02U)      },
837
    { "N0",     input.kbd + 15, u8(~0x08U)      },
838
    { "NPOINT", input.kbd + 15, u8(~0x10U)      },
839
    { "NPLUS",  input.kbd + 15, u8(~0x20U)      },
840
};
841
//=============================================================================
842
 
843
 
844
//=============================================================================
845
zxkeymap zxk_maps[] =
846
{
847
    { "default",        zxk_default,    _countof(zxk_default)   },
848
    { "BK08",           zxk_bk08,       _countof(zxk_bk08)      },
849
    { "quorum",         zxk_quorum,     _countof(zxk_quorum)    },
850
};
851
//=============================================================================
852
 
853
//=============================================================================
854
const size_t zxk_maps_count = _countof(zxk_maps);
855
//=============================================================================
856
 
857
PALETTEENTRY syspalette[0x100];
858
 
859
//=============================================================================
860
GDIBMP gdibmp =
861
{ { {  
862
        sizeof(BITMAPINFOHEADER),
863
        320,
864
        -240,
865
        1,
866
        8,
867
        BI_RGB,
868
 
869
} } };
870
//-----------------------------------------------------------------------------
871
// ��������� ��� ��������                                               // [NS]
872
GDIBMP gdi_dbg_bmp =
873
{ { {
874
        sizeof(BITMAPINFOHEADER),
875
        320,
876
        -240,
877
        1,
878
        8,
879
        BI_RGB,
880
 
881
} } };
882
//=============================================================================
883
PALETTE_OPTIONS pals[32] =
884
{{
885
        "default",
886
        0x00,
887
        0x80,
888
        0xC0,
889
        0xE0,
890
        0xFF,
891
        0xC8,
892
        0xFF,
893
        0x00,
894
        0x00,
895
        0x00,
896
        0xFF,
897
        0x00,
898
        0x00,
899
        0x00,
900
        0xFF
901
}};
902
//=============================================================================
903
#pragma pack()
904
 
905
unsigned char snbuf[ 4 * 1048576];      //4MB   // large temporary buffer (for reading snapshots)
906
//-----------------------------------------------------------------------------
907
unsigned char gdibuf[ 2 * 1048576];     //2MB
908
//���� ����� ��� ��������
909
unsigned char gdi_dbg_buf[ 2 * 1048576]; //2MB  // [NS]
910
//-----------------------------------------------------------------------------
911
// on-screen watches block
912
uintptr_t watch_script[4][64];
913
unsigned char watch_enabled[4];
914
unsigned char used_banks[ MAX_PAGES];
915
unsigned char trace_rom=1, trace_ram=1;
916
//-----------------------------------------------------------------------------
917
DWORD WinVerMajor;
918
DWORD WinVerMinor;
919
HWND dlg;               // used in setcheck/getcheck: gui settings, monitor dialogs
920
//-----------------------------------------------------------------------------
921
HBITMAP hbm;            // bitmap for repaint background
922
DWORD bm_dx;
923
DWORD bm_dy;
924
//-----------------------------------------------------------------------------
925
DWORD mousepos;         // left-clicked point in monitor
926
                        // 0x80000000 ������������ ������ �� ���������
927
                        // ��� right click ����
928
                        // ����� �������� �� debug_mouse_keys �����
929
                        // ��� �� 32� �������� ����� ��
930
 
931
DWORD debug_mouse_keys;
932
 
933
//#define DEBUG_MOUSE_LEFT_RES  0xFFFFFFF0      //      
934
//#define DEBUG_MOUSE_LEFT_ON   0x00000001      // left on              [NS]
935
//#define DEBUG_MOUSE_LEFT_DBL  0x00000002      // left double
936
//#define DEBUG_MOUSE_LEFT_OFF  0x00000004      // left off
937
//                              0x00000008      //      
938
//#define DEBUG_MOUSE_RIGHT_RES 0xFFFFFF0F      //      
939
//#define DEBUG_MOUSE_RIGHT_ON  0x00000010      // right on
940
//#define DEBUG_MOUSE_RIGHT_DBL 0x00000020      // right double
941
//#define DEBUG_MOUSE_RIGHT_OFF 0x00000040      // right off
942
//                              0x00000080      // 
943
//#define DEBUG_MOUSE_MIDDLE_RES 0xFFFFF0FF     //      
944
//#define DEBUG_MOUSE_MIDDLE_ON  0x00000100     // middle on
945
//#define DEBUG_MOUSE_MIDDLE_DBL 0x00000200     // middle double
946
//#define DEBUG_MOUSE_MIDDLE_OFF 0x00000400     // middle off
947
//                               0x00000800
948
 
949
//-----------------------------------------------------------------------------
950
unsigned nowait;        // don't close console window after error if started from GUI
951
bool normal_exit = false; // true on correct exit, false on failure exit
952
//-----------------------------------------------------------------------------
953
char *ayvols[64];
954
unsigned num_ayvols;
955
//-----------------------------------------------------------------------------
956
char *aystereo[64];
957
unsigned num_aystereo;
958
//-----------------------------------------------------------------------------
959
char *ulapreset[64];
960
unsigned num_ula;
961
//-----------------------------------------------------------------------------
962
static char presetbuf[0x4000];
963
char *setptr = presetbuf;
964
//-----------------------------------------------------------------------------
965
/*
966
#include "fontdata.cpp"
967
#include "font8.cpp"
968
#include "font14.cpp"
969
#include "font16.cpp"
970
#include "fontatm2.cpp"
971
*/
972
//=============================================================================
973
// ������� ����� � ���� ������� ������ ��������������� enum AY_SCHEME
974
const char * const ay_schemes[] =
975
{
976
    "no soundchip",
977
    "fuller box",
978
    "single chip",
979
    "pseudo-turbo",
980
    "quadro-AY",
981
    "turbo-AY // POS",
982
    "turbo-sound // NedoPC"
983
};
984
//=============================================================================
985
 
986
int trdos_in_nmi = 0;           //NEDOREPO
987
 
988
//=============================================================================
989