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 "dbgpaint.h"
7
#include "dx.h"
8
#include "draw.h"
9
#include "dxrframe.h"
10
#include "font16.h"
11
#include "util.h"
12
 
13
#include "debug_tools.h"                // [NS]
14
 
15
 
16
 
17
//=============================================================================
18
 
19
// 640x480      80x30
20
// 768x586      96x36,625
21
 
22
//unsigned char gdi_dbg_buf[ 2 * 1048576]; //2MB
23
 
24
const int c8 = 8;                                                               // [NS]
25
const int c16 = 16;
26
 
27
//#define SB80  84      // в dbgpaint.h
28
//#define SB30  30
29
 
30
const int s80 = 80;//84;//80;
31
const int s30 = 30;//32;//30;
32
 
33
 
34
const int s192 = 192;
35
const int s640 = 640;//672;//640;
36
const int s480 = 480;//512;//480;
37
 
38
//unsigned char txtscr[ 80 * 30 * 2];
39
unsigned char txtscr[ SB80 * SB30 * 2]; // не принимает переменные
40
 
41
//=============================================================================
42
 
43
 
44
 
45
//=============================================================================
46
static struct
47
{
48
    unsigned char x;
49
    unsigned char y;
50
    unsigned char dx;
51
    unsigned char dy;
52
    unsigned char c;
53
} frames[ 20];
54
 
55
//=============================================================================
56
 
57
 
58
unsigned nfr;
59
 
60
 
61
 
62
 
63
 
64
//=============================================================================
65
void debugflip()
66
{
67
 
68
// printf("debugflip()\n");
69
// printf("temp.scx %d\n",temp.scx);
70
 
71
    //-------------------------------------------------------------------------
72
    // обновление debug tools-ов при активном дебагере
73
    for (int cnt = 0;    cnt < DEBUG_TOOLS_MAX_COUNT;    cnt++)
74
    {
75
        //---------------------------------------------------------------------
76
        // обновляем только открытые окна
77
        if (debug_tool_exist[ cnt])
78
        {
79
            InvalidateRect( debug_tool_hwnd[ cnt], NULL, FALSE); // не стирать фон
80
            UpdateWindow(   debug_tool_hwnd[ cnt]);              // [NS] test
81
        }
82
        //---------------------------------------------------------------------
83
    }
84
    //-------------------------------------------------------------------------
85
 
86
 
87
 
88
    /*
89
    if (!active)                        // [NS] неясно зачем пропускать отрисовку когдаа она нада?
90
    {                                   // может пушо этим занималсо WM_PAINT из dx.cpp
91
        printf("debugflip() skip\n");   // который обычно отрисовывал всяйик шлак
92
        return;                         // заскриншоченный 5 минут нназад
93
    }
94
    */
95
 
96
    setpal( 0);
97
 
98
//  unsigned char * const bptr = gdibuf;
99
    unsigned char * const bptr = gdi_dbg_buf;   // рисуем в свой отдельный буфер [NS]
100
 
101
 
102
 
103
 
104
 
105
 
106
 
107
    //-------------------------------------------------------------------------
108
    // отрисовка маленького превиева
109
    //          должна быть ИМЕННО ТУТ!!!
110
    //          пушо превиев может перекрыватсо всплывающими "окнами"
111
    //-------------------------------------------------------------------------
112
    if (show_scrshot)
113
    {
114
        //---------------------------------------------------------------------
115
        // для raypainted
116
        memcpy( save_buf,
117
                rbuf,
118
                rb2_offs
119
                );             
120
        //---------------------------------------------------------------------
121
        switch (show_scrshot)
122
        {
123
            case 1:     paint_scr( 0);  break;                  // [NS]
124
            case 2:     paint_scr( 1);  break;
125
            case 3:     paint_scr( 2);  break;
126
        }
127
        //---------------------------------------------------------------------
128
        unsigned char *dst = bptr + (wat_y * c16 * s640) + (wat_x * c8);
129
 
130
//      unsigned char *src = rbuf + (temp.scx / 4) * (temp.b_top +  (192 / 2) - (wat_sz *  16 / 2));
131
        unsigned char *src = rbuf + (temp.scx / 4) * (temp.b_top + (s192 / 2) - (wat_sz * c16 / 2));
132
 
133
        src += (temp.scx /  8) - (37 / 2 * 2);
134
//      src += (temp.scx / c8) - (37 / 2 * 2);
135
 
136
//      unsigned char *ray_pos = raypointer();  // [NS}
137
 
138
        // перекидывание zx экрана в экран дебагера
139
        //---------------------------------------------------------------------
140
        for (unsigned y = 0;    y < wat_sz * 16;    y++)        // wat_sz = 13 (Y размер знакомест в дебагере)
141
        {
142
            //-----------------------------------------------------------------
143
            // 1 байт на пиксель !!!!
144
            for (unsigned x = 0;    x < 37;    x++)             //37 знакомест
145
            {
146
                // НО все равно просто так не вырватсо из мерзского hardware multicolor-а [NS]
147
                //-------------------------------------------------------------
148
                // отрисованные пиксели
149
                //if (reinterpret_cast<int>(src+(2*x)) < reinterpret_cast<int>(ray_pos))
150
                //{
151
                //левые 4 пикселя
152
                *(unsigned*) (dst + x * 8 + 0) = t.sctab8[ 0][( src[ x * 2] >>  4) + src[ 2 * x + 1] * 16];    
153
                //правые 4 пикселя
154
                *(unsigned*) (dst + x * 8 + 4) = t.sctab8[ 0][( src[ x * 2] & 0xF) + src[ 2 * x + 1] * 16];
155
                //}
156
                //-------------------------------------------------------------
157
                // пиксели с предыдущего кадра
158
                //else
159
                //{
160
                ////левые 4 пикселя
161
                //*(unsigned*)(dst + x * 8 + 0) = (t.sctab8[0][(src[x * 2] >>  4) + src[2 * x + 1] * 16]);      
162
                ////правые 4 пикселя
163
                //*(unsigned*)(dst + x * 8 + 4) = (t.sctab8[0][(src[x * 2] & 0xF) + src[2 * x + 1] * 16]);
164
                //}
165
            } // x
166
            //-----------------------------------------------------------------
167
            src += temp.scx / 4;
168
            //dst += 640;
169
            dst += s640;
170
        } // y
171
        //---------------------------------------------------------------------
172
        // для raypainted
173
        memcpy( rbuf,
174
                save_buf,
175
                rb2_offs);
176
        //---------------------------------------------------------------------
177
    }
178
    //-------------------------------------------------------------------------
179
 
180
 
181
 
182
 
183
 
184
 
185
 
186
 
187
 
188
 
189
 
190
 
191
    //-------------------------------------------------------------------------
192
    // print text mode
193
    //-------------------------------------------------------------------------
194
    int x;
195
    int y;
196
    unsigned char *tptr = txtscr;
197
    //-------------------------------------------------------------------------
198
//  for (y = 0;    y < (16 * 30 * 640);    y += (16 * 640))
199
    for (y = 0;    y < (c16 * s30 * s640);    y += (c16 * s640))
200
    {
201
        //---------------------------------------------------------------------
202
        // for (x = 0;    x < 80;    x++, tptr++)
203
        for (x = 0;    x < s80;    x++, tptr++)
204
        {
205
            unsigned ch = *tptr;
206
            //unsigned at = tptr[ 80 * 30];
207
            unsigned at = tptr[ s80 * s30];
208
            //-----------------------------------------------------------------
209
            //transparent color - НЕНУЖЕН
210
            if (at == 0xFF)
211
                continue;
212
            //-----------------------------------------------------------------
213
            //const unsigned char *fnt = &font16[ ch * 16];
214
            const unsigned char *fnt = &font16[ ch * c16];
215
            at <<= 4;
216
            //-----------------------------------------------------------------
217
            //for (int yy = 0;    yy < 16;    yy++, fnt++)
218
            for (int yy = 0;    yy < c16;    yy++, fnt++)
219
            {
220
            //  unsigned sctab8[2][16*0x100];  //4 bits data+pc-attribute -> 4 palette pixels
221
 
222
                //правые 4 пикселя
223
                //*(unsigned*) (bptr + y + (640 * yy) + (x * 8) + 0) = t.sctab8[ 0][( *fnt >>  4) + at];
224
                *(unsigned*) (bptr + y + (s640 * yy) + (x * 8) + 0) = t.sctab8[ 0][( *fnt >>  4) + at];
225
 
226
                //левые 4 пикселя
227
                //*(unsigned*) (bptr + y + (640 * yy) + (x * 8) + 4) = t.sctab8[ 0][( *fnt & 0xF) + at];
228
                *(unsigned*) (bptr + y + (s640 * yy) + (x * 8) + 4) = t.sctab8[ 0][( *fnt & 0xF) + at];
229
            }
230
            //-----------------------------------------------------------------
231
        }
232
        //---------------------------------------------------------------------
233
    }
234
    //-------------------------------------------------------------------------
235
 
236
 
237
 
238
 
239
 
240
 
241
    //-------------------------------------------------------------------------
242
    // отрисовка "рамочек" из буфера
243
    // но РАМОЧКИ НЕНУЖНЫ
244
    /*
245
    for (unsigned i = 0;    i < nfr;    i++)
246
    {
247
        //unsigned char a1 = (frames[i].c | 0x08) * 0x11;
248
        unsigned char a1 = (frames[ i].c & 0x0F) | ((frames[ i].c & 0x0F) << 4);        //attr 256c ?
249
        //---------------------------------------------------------------------
250
        //y = frames[i].y * 16 - 1;
251
        y = frames[i].y * c16 - 1;
252
        //---------------------------------------------------------------------
253
        for (x = 8 * frames[ i].x - 1;    x < (frames[ i].x + frames[ i].dx) * 8;    x++)
254
        {
255
            // bptr[ y * 640 + x] = a1;
256
            bptr[ y * s640 + x] = a1;
257
        }
258
        //---------------------------------------------------------------------
259
        //y = (frames[ i].y + frames[ i].dy) * 16;
260
        y = (frames[ i].y + frames[ i].dy) * c16;
261
        //---------------------------------------------------------------------
262
        for (x = 8 * frames[ i].x - 1;    x < (frames[ i].x + frames[ i].dx) * 8;    x++)
263
        {
264
            // bptr[ y * 640 + x] = a1;
265
            bptr[ y * s640 + x] = a1;
266
        }
267
        //---------------------------------------------------------------------
268
        x = frames[i].x * 8 - 1;
269
        //---------------------------------------------------------------------
270
        for (y = 16 * frames[ i].y;    y < (frames[ i].y + frames[ i].dy) * 16;    y++)
271
        {
272
            // bptr[ y * 640 + x] = a1;
273
            bptr[ y * s640 + x] = a1;
274
        }
275
        //---------------------------------------------------------------------
276
        x = (frames[ i].x + frames[ i].dx) * 8;
277
        //---------------------------------------------------------------------
278
        for (y = 16 * frames[ i].y;    y < (frames[ i].y + frames[ i].dy) * 16;    y++)
279
        {
280
            //bptr[ y * 640 + x] = a1;
281
            bptr[ y * s640 + x] = a1;
282
        }
283
        //---------------------------------------------------------------------
284
    }
285
    */
286
    //-------------------------------------------------------------------------
287
 
288
//      //---------------------------------------------------------------------
289
//      //tzt
290
//      for (unsigned y = 0;    y < 50;    y++)         // wat_sz = 13 (Y размер знакомест в дебагере)
291
//      {
292
//              *(bptr + y + (y*s640)) = 0xFF;
293
//      }
294
//      //---------------------------------------------------------------------
295
 
296
 
297
 
298
 
299
 
300
 
301
 
302
 
303
 
304
 
305
 
306
 
307
 
308
 
309
 
310
 
311
 
312
 
313
 
314
 
315
 
316
 
317
 
318
//  gdibmp.header.bmiHeader.biBitCount = 8;
319
    gdi_dbg_bmp.header.bmiHeader.biBitCount = 8;
320
 
321
    //может нужно перенести выше до отррисовки?
322
    //-------------------------------------------------------------------------
323
    if (needclr)
324
        gdi_frame();
325
    //-------------------------------------------------------------------------
326
 
327
/*
328
   SetDIBitsToDevice(   temp.gdidc,             //ORIG
329
                        int(temp.gx),
330
                        int(temp.gy),
331
                        640,
332
                        480,
333
 
334
                        0,
335
                        0,
336
                        0,
337
                        480,
338
                        bptr,
339
                        &gdibmp.header,
340
                        DIB_RGB_COLORS
341
                     );
342
*/
343
                //написано без доки !!!
344
                //нужно уточнение всех параметров
345
 
346
              //для дебагера отдельный
347
 
348
    gdi_dbg_bmp.header.bmiHeader.biSize = sizeof( BITMAPINFOHEADER);
349
    gdi_dbg_bmp.header.bmiHeader.biPlanes = 1;
350
    gdi_dbg_bmp.header.bmiHeader.biBitCount = 8;
351
 
352
    gdi_dbg_bmp.header.bmiHeader.biWidth = LONG( s640);         // [NS]
353
    gdi_dbg_bmp.header.bmiHeader.biHeight = -LONG( s480);
354
    gdi_dbg_bmp.header.bmiHeader.biBitCount = WORD( temp.obpp);
355
 
356
 
357
//      bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
358
//      bmi.bmiHeader.biPlanes = 1;
359
//      bmi.bmiHeader.biBitCount = 32;
360
//      bmi.bmiHeader.biCompression = BI_RGB;
361
//      bmi.bmiHeader.biWidth = 320;
362
//      bmi.bmiHeader.biHeight = 160;
363
 
364
 
365
 
366
// printf("temp.gx %d temp.gy %d\n",temp.gx,temp.gy);
367
 
368
    RECT current_mainwnd_size;
369
    GetClientRect( wnd, &current_mainwnd_size);
370
    int new_wnd_size_x = current_mainwnd_size.right - current_mainwnd_size.left;
371
    int new_wnd_size_y = current_mainwnd_size.bottom - current_mainwnd_size.top;
372
 
373
//  сделать на upscale COLORONCOLOR или HALFTONE
374
//  для downscale по выбору HALFTONE COLORONCOLOR WHITEONBLACK
375
 
376
  //SetStretchBltMode(temp.gdidc, BLACKONWHITE);        //так ниче не видно (и по дефолту)
377
  //SetStretchBltMode(temp.gdidc, WHITEONBLACK);        //так жирный белый шрифт
378
    SetStretchBltMode( temp.gdidc, COLORONCOLOR);       //так биения и наверно бысстрей всего
379
  //SetStretchBltMode(temp.gdidc, HALFTONE);            //так размывает но нагрузка на проц
380
  //SetStretchBltMode(temp.gdidc, 5);           //WHITEONBLACK
381
  //SetStretchBltMode(temp.gdidc, 0);           //WHITEONBLACK
382
 
383
 
384
 
385
    StretchDIBits(      temp.gdidc,                             //NS
386
                        0,      //int(temp.gx), //= 0   //куда вмещать
387
                        0,      //int(temp.gy), //= 0?
388
                        new_wnd_size_x, //temp.ox,//320,//640,
389
                        new_wnd_size_y, //temp.oy,//240,//480,
390
 
391
                        0,      //какую часть кидить
392
                        0,
393
                        s640,   //640,
394
                        s480,   //480,
395
                        bptr,
396
                        &gdi_dbg_bmp.header,//&gdibmp.header,
397
                        DIB_RGB_COLORS,
398
                        SRCCOPY
399
                );
400
 
401
//  gdibmp.header.bmiHeader.biBitCount = u16(temp.obpp);
402
    gdi_dbg_bmp.header.bmiHeader.biBitCount = u16( temp.obpp);  // [NS]
403
}
404
//=============================================================================
405
 
406
 
407
//=============================================================================
408
void frame( unsigned x, unsigned y, unsigned dx, unsigned dy, unsigned char attr)
409
{
410
// DEPRECATED
411
    /*
412
    frames[ nfr].x =  u8( x);
413
    frames[ nfr].y =  u8( y);
414
    frames[ nfr].dx = u8( dx);
415
    frames[ nfr].dy = u8( dy);
416
    frames[ nfr].c = attr;
417
    nfr++;
418
    */
419
}
420
//=============================================================================
421
 
422
 
423
//=============================================================================
424
// Отрисовка строки с указанием атрибута
425
void tprint( unsigned x, unsigned y, const char *str, unsigned char attr)
426
{
427
    for (unsigned ptr = y * s80 + x;    *str;    str++, ptr++)
428
    {
429
        txtscr[ ptr] = u8( *str);
430
        txtscr[ ptr + s80 * s30] = attr;        //запись атрибута вместо
431
    }
432
}
433
//=============================================================================
434
 
435
 
436
//=============================================================================
437
// Отрисовка строки с указанием атрибута только ink-а (но можно влиять на paper !)
438
void tprint_fg( unsigned x, unsigned y, const char *str, unsigned char attr)
439
{
440
    for (unsigned ptr = y * s80 + x;    *str;    str++, ptr++)
441
    {
442
        txtscr[ ptr] = u8( *str);
443
        txtscr[ ptr + s80 * s30] = (txtscr[ ptr + s80 * s30] & 0xF0) + attr;
444
    }
445
}
446
//=============================================================================
447
 
448
 
449
// Новые цвета для дебагера [NS]
450
 
451
#define DBG_ATTR_BCKGRND                0x00    //0     0
452
#define DBG_ATTR_BCKGRND_ACTIVE         0x10    //blue
453
 
454
#define DBG_ATTR_WINDOW_FRAME           0x02    //
455
 
456
#define DBG_ATTR_INPUT_HIGHLIGHT        0xC0    //br+GREEN      0
457
#define DBG_ATTR_INPUT_CURSOR           0xE0    //br+YELLOW     9
458
 
459
#define DBG_ATTR_WINDOW_TITLE           0xF0//0x1F      //blue  br+WHITE
460
 
461
#define DBG_ATTR_WINDOW_BACK_COLOR      0x70//0x70//white       0
462
#define DBG_ATTR_WINDOW_TEXT            0x70
463
#define DBG_ATTR_WINDOW_TEXT_GRAY       0x7A            //почемуто юзаеттссо как error
464
#define DBG_ATTR_WINDOW_TEXT_ERROR      0x72            //white red
465
#define DBG_ATTR_WINDOW_TEXT_CURSOR     0xE0            //white red
466
 
467
 
468
 
469
//=============================================================================
470
// рисовалка текстовых окошек
471
void filledframe( unsigned x, unsigned y, unsigned dx, unsigned dy, unsigned char color)
472
{
473
    //-------------------------------------------------------------------------
474
    for (unsigned yy = y;    yy < (y + dy);    yy++)
475
    {
476
        for (unsigned xx = x;    xx < (x + dx);    xx++)
477
        {
478
            txtscr[ yy * s80 + xx] = ' ';
479
            txtscr[ yy * s80 + xx + s30 * s80] = color;
480
        }
481
    }
482
    //-------------------------------------------------------------------------
483
    nfr = 0; // delete other frames while dialog
484
    frame(      x,
485
                y,
486
                dx,
487
                dy,
488
                DBG_ATTR_WINDOW_FRAME   //FFRAME_FRAME
489
          );
490
}
491
//=============================================================================
492
 
493
 
494
//=============================================================================
495
void fillattr( unsigned x, unsigned y, unsigned dx, unsigned char color)
496
{
497
    for (unsigned xx = x;    xx < (x + dx);    xx++)
498
    {
499
        txtscr[ y * s80 + xx + s30 * s80] = color;
500
    }
501
}
502
//=============================================================================
503
 
504
 
505
 
506
//=============================================================================
507
 
508
char str[ 0x80];
509
 
510
//=============================================================================
511
unsigned inputhex( unsigned x, unsigned y, unsigned sz, bool hex, bool insert_mode)
512
{
513
// ВНЕЗАПНО ИСПОЛЬЗУЕТСО И ДЛЯ ТЕКСТА
514
 
515
//  insert_mode = TRUE; (by default) [NS]       для совместимости со старым вызовом без указания insert_mode
516
//                                              режим ввода заменой под курсором
517
    unsigned cr = 0;
518
    mousepos = 0;
519
 
520
    //-------------------------------------------------------------------------
521
    for (    ;    ;    )
522
    {
523
//      str[sz] = 0;
524
        str[ sz + 5] = 0;
525
 
526
        size_t i;
527
        //---------------------------------------------------------------------
528
        for (i = strlen( str);    i < sz;    i++)
529
        {
530
            //printf("*\n");
531
            str[ i] = ' ';
532
        }
533
        //---------------------------------------------------------------------
534
        for (i = 0;    i < sz;    i++)  //sz - количество символов для ввода
535
        {
536
            unsigned vl = (unsigned char) str[ i];
537
            tprint(     unsigned( x + i),
538
                        unsigned( y),
539
                        (char*) &vl,
540
                        (i == cr)   ?   DBG_ATTR_INPUT_CURSOR :         //W_INPUTCUR :
541
                                        DBG_ATTR_INPUT_HIGHLIGHT        //W_INPUTBG
542
                   );
543
        }
544
        //---------------------------------------------------------------------
545
        debugflip();
546
        //---------------------------------------------------------------------
547
        unsigned key;
548
        //---------------------------------------------------------------------
549
        // Ожидание нажатия клавиши infinity loop
550
        for (    ;    ;  Sleep( 20)  )
551
        {
552
            key = process_msgs();
553
            needclr = 0;  
554
            //-----------------------------------------------------------------
555
            //debugflip();      //зачем то без остановки перрерисовка
556
                                //wmpaint каким то хреном работает ии так
557
            //-----------------------------------------------------------------
558
            // выход из редактирования по клику в другое место
559
            if (mousepos)       //заменить на более осмысленное !!!!!
560
            {
561
                return 0;
562
            }
563
            //-----------------------------------------------------------------
564
            // выходи из цикла по нажатию клавиши
565
            if (key)
566
            {
567
                break;
568
            }
569
            //-----------------------------------------------------------------
570
        }
571
 
572
        debugflip();
573
        //---------------------------------------------------------------------
574
        switch (key)
575
        {
576
            //=================================================================
577
            case VK_ESCAPE:
578
                return 0;
579
            //=================================================================
580
            case VK_RETURN:
581
                //-------------------------------------------------------------
582
                for (char *ptr = str + sz - 1;    *ptr == ' ' && ptr >= str;    *ptr-- = 0);
583
                //-------------------------------------------------------------
584
                return 1;
585
            //=================================================================
586
            case VK_LEFT:
587
                //-------------------------------------------------------------
588
                if (cr)
589
                    cr--;
590
                //-------------------------------------------------------------
591
                continue;
592
            //=================================================================
593
            case VK_BACK:
594
                //-------------------------------------------------------------
595
                if (cr)
596
                {
597
                    //---------------------------------------------------------
598
                    for (i = cr;    i < sz;    i++)
599
                        str[ i - 1] = str[ i];
600
                    //---------------------------------------------------------
601
                    str[ sz - 1] = ' ';
602
                    --cr;
603
                }
604
                //-------------------------------------------------------------
605
                continue;
606
            //=================================================================
607
            case VK_RIGHT:
608
                //-------------------------------------------------------------
609
                if (cr != sz-1)
610
                    cr++;
611
                //-------------------------------------------------------------
612
                continue;
613
            //=================================================================
614
            case VK_HOME:
615
                cr = 0;
616
                continue;
617
            //=================================================================
618
            case VK_END:
619
                //-------------------------------------------------------------
620
                for (cr = sz - 1;    cr && (str[ cr] == ' ') && (str[ cr - 1] == ' ');    cr--);
621
                //-------------------------------------------------------------
622
                continue;       //?????????
623
            //=================================================================
624
            case VK_DELETE:
625
                //-------------------------------------------------------------
626
                for (i = cr;    i < sz - 1;    i++)
627
                    str[ i] = str[ i + 1];
628
                //-------------------------------------------------------------
629
                str[ sz - 1] = ' ';
630
                continue;
631
            //=================================================================
632
            case VK_INSERT:
633
                //-------------------------------------------------------------
634
                for (i = sz - 1;    i > cr;    i--)
635
                    str[ i] = str[ i - 1];
636
                //-------------------------------------------------------------
637
                str[ cr] = ' ';
638
                continue;
639
            //=================================================================
640
            case VK_UP:         // выход из редактирования
641
                //printf("VK_UP\n");
642
                PostThreadMessage( GetCurrentThreadId(), WM_KEYDOWN, VK_UP, 1);
643
                //PostThreadMessage(GetCurrentThreadId(), WM_KEYUP, input.lastkey, 1);
644
                return 0;       // тут еще надо шагание в эту же сторону
645
                break;          // но как его сделать?
646
            //=================================================================
647
            case VK_DOWN:       // так не работает вверх
648
                //printf("VK_DOWN\n");
649
                PostThreadMessage( GetCurrentThreadId(), WM_KEYDOWN, VK_DOWN, 1);
650
                return 0;
651
                break;
652
            //=================================================================
653
        }
654
        //---------------------------------------------------------------------
655
        u8 Kbd[ 256];
656
        GetKeyboardState( Kbd);
657
 
658
        unsigned short k = 0;
659
        //---------------------------------------------------------------------
660
        if ( ToAscii( key, 0, Kbd, &k, 0) == 1 )
661
        {
662
            char m;
663
            //-----------------------------------------------------------------
664
            if ( CharToOemBuff( (char *) &k, &m, 1) )
665
            {
666
                //-------------------------------------------------------------
667
                // нормальнный людской ввод
668
                if (!insert_mode)                       // [NS]
669
                {
670
                    for (i = sz - 1;    i > cr;    i--)
671
                        str[ i] = str[ i - 1];
672
                }
673
                //-------------------------------------------------------------
674
                int u = toupper(m);
675
                //-------------------------------------------------------------
676
                if (!hex || (((u >= '0') && (u <= '9')) || ((u >= 'A') && (u <= 'F'))))
677
                {
678
                    str[ cr++] = char( hex  ?  u :
679
                                               m );
680
                }
681
                //-------------------------------------------------------------
682
            }
683
            //-----------------------------------------------------------------
684
        }
685
        //---------------------------------------------------------------------
686
        if (cr == sz)   //тут надо выход вообще
687
        {
688
            cr--;
689
                //return 1;     //так выход
690
                //              //НО так начинаютсо дополнительные прроблемы
691
                //              //особенно когда введенное невалидно
692
                //              // и тогда курсор перескакиивает в начало и...
693
        }
694
        //---------------------------------------------------------------------
695
    } //for (;;)
696
    //-------------------------------------------------------------------------
697
}
698
//=============================================================================
699
 
700
 
701
 
702
//=============================================================================
703
int input6dec( unsigned x, unsigned y, unsigned val)    // [NS]
704
{
705
    sprintf(    str,
706
                "%06d",
707
                val
708
            );
709
    //-------------------------------------------------------------------------
710
    if (inputhex( x, y, 6, false ))     // не ясно за 4-й параметр true/false !!!!
711
    {                                   // тк результат тот же
712
        sscanf(     str,
713
                    "%d",
714
                    &val
715
                );
716
        return int( val);
717
    }
718
    //-------------------------------------------------------------------------
719
    return -1;
720
}
721
//=============================================================================
722
int input4( unsigned x, unsigned y, unsigned val)
723
{
724
    sprintf(    str,
725
                "%04X",
726
                val
727
            );
728
    //-------------------------------------------------------------------------
729
    if (inputhex( x, y, 4, true ))
730
    {
731
        sscanf(     str,
732
                    "%x",
733
                    &val
734
                );
735
        return int( val);
736
    }
737
    //-------------------------------------------------------------------------
738
    return -1;
739
}
740
//=============================================================================
741
int input2( unsigned x, unsigned y, unsigned val)
742
{
743
    sprintf(    str,
744
                "%02X",
745
                val
746
            );
747
    //-------------------------------------------------------------------------
748
    if (inputhex( x, y, 2, true ))
749
    {
750
        sscanf(     str,
751
                    "%x",
752
                    &val
753
                );
754
        return int( val);
755
    }
756
    //-------------------------------------------------------------------------
757
    return -1;
758
}
759
//=============================================================================
760
int input1( unsigned x, unsigned y, unsigned val)
761
{
762
    sprintf(    str,
763
                "%01X",
764
                val
765
           );
766
    //-------------------------------------------------------------------------
767
    if (inputhex( x, y, 1, true ))
768
    {
769
        sscanf(     str,
770
                    "%x",
771
                    &val
772
              );
773
        return int( val);
774
    }
775
    //-------------------------------------------------------------------------
776
    return -1;
777
}
778
//=============================================================================
779
 
780
 
781
 
782
 
783
//=============================================================================
784
static void format_item( char *dst, size_t width, const char *text, MENUITEM::FLAGS flags)
785
{
786
    memset(     dst,
787
                ' ',
788
                width + 2);
789
    dst[ width + 2] = 0;
790
 
791
    size_t sz = strlen( text), left = 0;
792
    //-------------------------------------------------------------------------
793
    if (sz > width)
794
        sz = width;
795
    //-------------------------------------------------------------------------
796
    if (flags & MENUITEM::RIGHT)
797
        left = width - sz;
798
    //-------------------------------------------------------------------------
799
    else if (flags & MENUITEM::CENTER)
800
        left = (width - sz) / 2;
801
    //------------------------------------------------------------------------- 
802
    memcpy(     dst + left + 1,
803
                text,
804
                sz
805
           );
806
}
807
//=============================================================================
808
 
809
 
810
//=============================================================================
811
// рисование некоторых менюшек
812
static void paint_items( MENUDEF *menu)
813
{
814
 
815
    char ln[ 80];
816
    unsigned item;
817
 
818
    size_t maxlen = strlen( menu->title);
819
    //-------------------------------------------------------------------------
820
    for (item = 0;    item < menu->n_items;    item++)
821
    {
822
        size_t sz = strlen( menu->items[ item].text);
823
        maxlen = max( maxlen, sz);
824
    }
825
    //-------------------------------------------------------------------------
826
    unsigned menu_dx = unsigned( maxlen + 2), menu_dy = menu->n_items + 3;
827
    //unsigned menu_x = (80 - menu_dx) / 2, menu_y = (30 - menu_dy) / 2;
828
    unsigned menu_x = (s80 - menu_dx) / 2, menu_y = (s30 - menu_dy) / 2;
829
    filledframe(        menu_x,
830
                        menu_y,
831
                        menu_dx,
832
                        menu_dy,
833
                        DBG_ATTR_WINDOW_TEXT    //MENU_INSIDE
834
                );
835
    format_item(        ln,
836
                        maxlen,
837
                        menu->title,
838
                        MENUITEM::CENTER
839
                );
840
    tprint(     menu_x,
841
                menu_y,
842
                ln,
843
                DBG_ATTR_WINDOW_TITLE           //MENU_HEADER
844
           );
845
    //-------------------------------------------------------------------------
846
    for (/*unsigned*/ item = 0;    item < menu->n_items;    item++)
847
    {
848
        unsigned char color = DBG_ATTR_WINDOW_TEXT;     //MENU_ITEM;
849
        //---------------------------------------------------------------------
850
        if (menu->items[ item].flags & MENUITEM::DISABLED)
851
            color = DBG_ATTR_WINDOW_TEXT_GRAY;          //MENU_ITEM_DIS;        //ERROR?
852
        //---------------------------------------------------------------------
853
        else if (item == menu->pos)
854
            color = DBG_ATTR_WINDOW_TEXT_CURSOR;        //MENU_CURSOR;
855
        //---------------------------------------------------------------------
856
        format_item(    ln,
857
                        maxlen,
858
                        menu->items[ item].text,
859
                        menu->items[ item].flags
860
                    );
861
        tprint(         menu_x,
862
                        menu_y + item + 2,
863
                        ln,
864
                        color
865
                );
866
    }
867
    //-------------------------------------------------------------------------
868
}
869
//=============================================================================
870
 
871
 
872
//=============================================================================
873
static void menu_move( MENUDEF *menu, int dir)
874
{
875
    unsigned start = menu->pos;
876
    //-------------------------------------------------------------------------
877
    for (    ;    ;    )
878
    {
879
        menu->pos = unsigned( int( menu->pos) + dir);
880
        //---------------------------------------------------------------------
881
        if ((int) menu->pos == -1) menu->pos = menu->n_items-1;
882
        //---------------------------------------------------------------------
883
        if (menu->pos >= menu->n_items) menu->pos = 0;
884
        //---------------------------------------------------------------------
885
        if (!(menu->items[ menu->pos].flags & MENUITEM::DISABLED)) return;
886
        //---------------------------------------------------------------------
887
        if (menu->pos == start) return;
888
        //---------------------------------------------------------------------
889
    }
890
    //-------------------------------------------------------------------------
891
}
892
//=============================================================================
893
 
894
 
895
//=============================================================================
896
char handle_menu( MENUDEF *menu)
897
{
898
    //-------------------------------------------------------------------------
899
    if (menu->items[ menu->pos].flags & MENUITEM::DISABLED)
900
        menu_move( menu, 1 );
901
    //-------------------------------------------------------------------------
902
    for (    ;    ;    )
903
    {
904
        paint_items( menu);
905
        debugflip();
906
 
907
        unsigned key;
908
        //---------------------------------------------------------------------
909
        for (    ;    ;    Sleep( 20))  //20
910
        {
911
            key = process_msgs();
912
            needclr =  0;
913
            debugflip();
914
            //-----------------------------------------------------------------
915
            if (mousepos)
916
                return 0;
917
            //-----------------------------------------------------------------
918
            if (key)
919
                break;
920
            //-----------------------------------------------------------------
921
        }
922
        //---------------------------------------------------------------------
923
        if (key == VK_ESCAPE)
924
            return 0;
925
        //---------------------------------------------------------------------
926
        if (key == VK_RETURN || key == VK_SPACE)
927
            return 1;
928
        //---------------------------------------------------------------------
929
        if (key == VK_UP || key == VK_LEFT)
930
            menu_move( menu, -1);
931
        //---------------------------------------------------------------------
932
        if (key == VK_DOWN || key == VK_RIGHT)
933
            menu_move( menu, 1);
934
        //---------------------------------------------------------------------
935
        if (key == VK_HOME || key == VK_PRIOR)
936
        {
937
            menu->pos = -1U;
938
            menu_move( menu, 1);
939
        }
940
        //---------------------------------------------------------------------
941
        if (key == VK_END || key == VK_NEXT)
942
        {
943
            menu->pos = menu->n_items;
944
            menu_move( menu, -1);
945
        }
946
        //---------------------------------------------------------------------
947
    }
948
}
949
//=============================================================================
950