Subversion Repositories pentevo

Rev

Rev 601 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
601 ddp 1
#include "_global.h"
2
#include "_screen.h"
3
#include "_ps2k.h"
4
 
5
#define WIN_ATTR 0x9f
6
#define CURSOR_ATTR 0xf0
7
#define WIN_SHADOW_ATTR 0x01
8
 
9
//-----------------------------------------------------------------------------
10
// ⠭ ⥪饣 ਡ
11
void scr_set_attr(u8 attr)
12
{
13
 fpga_reg(SCR_ATTR,attr);
14
}
15
 
16
//-----------------------------------------------------------------------------
17
// ⠭ 樨   ࠭ (x - 0..52; y - 0..24)
18
void scr_set_cursor(u8 x, u8 y)
19
{
20
 u16 addr;
21
 addr=y*53+x-1;
22
 fpga_reg(SCR_LOADDR,addr&0xff);
23
 fpga_reg(SCR_HIADDR,(addr>>8)&0x07);
24
}
25
 
26
//-----------------------------------------------------------------------------
27
 
624 ddp 28
void scr_print_msg(const u8 *msg)
601 ddp 29
{
30
 SetSPICS();
31
 fpga_sel_reg(SCR_CHAR);
32
 u8 ch;
33
 do
34
 {
35
  ch=pgm_read_byte(msg); msg++;
36
  if (ch==0x15)
37
  {
38
   u8 attr;
39
   attr=pgm_read_byte(msg); msg++;
40
   scr_set_attr(attr);
41
   SetSPICS();
42
   fpga_sel_reg(SCR_CHAR);
43
  }
44
  else if (ch==0x16)
45
  {
46
   u8 x, y;
47
   x=pgm_read_byte(msg); msg++;
48
   y=pgm_read_byte(msg); msg++;
49
   scr_set_cursor(x,y);
50
   SetSPICS();
51
   fpga_sel_reg(SCR_CHAR);
52
  }
53
  else if (ch) fpga_same_reg(ch);
54
 }while (ch);
55
}
56
 
57
//-----------------------------------------------------------------------------
58
 
624 ddp 59
void scr_print_mlmsg(const u8 * const *mlmsg)
601 ddp 60
{
624 ddp 61
 scr_print_msg((const u8 *)pgm_read_word(mlmsg+lang));
601 ddp 62
}
63
 
64
//-----------------------------------------------------------------------------
65
 
624 ddp 66
void scr_print_msg_n(const u8 *msg, u8 size)
601 ddp 67
{
68
 SetSPICS();
69
 fpga_sel_reg(SCR_CHAR);
70
 u8 ch;
71
 do
72
 {
73
  ch=pgm_read_byte(msg); msg++;
74
  fpga_same_reg(ch);
75
 }while (--size);
76
}
77
 
78
//-----------------------------------------------------------------------------
79
 
80
void scr_print_rammsg_n(u8 *msg, u8 size)
81
{
82
 SetSPICS();
83
 fpga_sel_reg(SCR_CHAR);
84
 do
85
 {
86
  fpga_same_reg(*msg++);
87
 }while (--size);
88
}
89
 
90
//-----------------------------------------------------------------------------
91
 
92
void scr_putchar(u8 ch)
93
{
94
 fpga_reg(SCR_CHAR,ch);
95
}
96
 
97
//-----------------------------------------------------------------------------
98
 
99
void scr_fill_char(u8 ch, u16 count)
100
{
101
 fpga_reg(SCR_CHAR,ch);
102
 while (--count)
103
 {
104
  ClrSPICS();
105
  SetSPICS();
106
 }
107
}
108
 
109
//-----------------------------------------------------------------------------
110
 
111
void scr_fill_char_attr(u8 ch, u8 attr, u16 count)
112
{
113
 fpga_reg(SCR_ATTR,attr);
114
 fpga_reg(SCR_CHAR,ch);
115
 while (--count)
116
 {
117
  ClrSPICS();
118
  SetSPICS();
119
 }
120
}
121
 
122
//-----------------------------------------------------------------------------
123
 
124
void scr_fill_attr(u8 attr, u16 count)
125
{
126
 fpga_reg(SCR_FILL,attr);
127
 while (--count)
128
 {
129
  ClrSPICS();
130
  SetSPICS();
131
 }
132
}
133
 
134
//-----------------------------------------------------------------------------
135
 
136
void scr_backgnd(void)
137
{
138
 scr_set_cursor(0,0);
139
 scr_fill_char_attr(0x20,0xf0,53);              // ' '
140
 scr_fill_char_attr(0xb0,0x77,53*23);           // ''
141
 scr_fill_char_attr(0x20,0xf0,53);              // ' '
142
 flags1&=~(ENABLE_DIRECTUART|ENABLE_UART);
143
 flags1|=ENABLE_SCR;
144
 scr_set_cursor(0,0);
145
 scr_print_msg(msg_title1);
146
 print_short_vers();
147
 scr_set_cursor(15,24);
148
 scr_print_msg(msg_title2);
149
}
150
 
151
//-----------------------------------------------------------------------------
152
 
153
void scr_fade(void)
154
{
155
 scr_set_cursor(0,1);
156
 scr_fill_attr(0x77,53*23);
157
}
158
 
159
//-----------------------------------------------------------------------------
160
 
624 ddp 161
void scr_window(const P_WIND_DESC pwindesc)
601 ddp 162
{
163
 u8 x, y, width, height, wind_attr, wind_flag;
624 ddp 164
 x        =pgm_read_byte(&pwindesc->x);
165
 y        =pgm_read_byte(&pwindesc->y);
166
 width    =pgm_read_byte(&pwindesc->width)-2;
167
 height   =pgm_read_byte(&pwindesc->height)-2;
168
 wind_attr=pgm_read_byte(&pwindesc->attr);
169
 wind_flag=pgm_read_byte(&pwindesc->flag);
601 ddp 170
 
171
 scr_set_cursor(x,y);
172
 scr_set_attr(wind_attr);
173
 scr_putchar(0xda);                            // ''
174
 scr_fill_char(0xc4,width);                    // ''
175
 scr_putchar(0xbf);                            // ''
176
 u8 i;
177
 for (i=0;i<height;i++)
178
 {
179
  scr_set_cursor(x,y+i+1);
180
  scr_set_attr(wind_attr);
181
  scr_putchar(0xb3);                           // ''
182
  scr_fill_char(0x20,width);                   // ''
183
  scr_putchar(0xb3);                           // ''
184
  if (wind_flag&0x01)
185
   scr_fill_attr(WIN_SHADOW_ATTR,1);
186
 }
187
 scr_set_cursor(x,y+height+1);
188
 scr_set_attr(wind_attr);
189
 scr_putchar(0xc0);                            // ''
190
 scr_fill_char(0xc4,width);                    // ''
191
 scr_putchar(0xd9);                            // ''
192
 if (wind_flag&0x01)
193
 {
194
  scr_fill_attr(WIN_SHADOW_ATTR,1);
195
  scr_set_cursor(x+1,y+height+2);
196
  scr_fill_attr(WIN_SHADOW_ATTR,width+2);
197
  scr_set_attr(wind_attr);
198
 }
199
}
200
 
201
//-----------------------------------------------------------------------------
202
 
203
const WIND_DESC wind_menu_help PROGMEM = { 3,13,37,9,0xcf,0x01 };
624 ddp 204
#define p_wind_menu_help ((const P_WIND_DESC)&wind_menu_help)
601 ddp 205
 
206
void menu_help(void)
207
{
208
 scr_fade();
624 ddp 209
 scr_window(p_wind_menu_help);
601 ddp 210
 scr_print_mlmsg(mlmsg_menu_help);
211
 waitkey();
212
}
213
 
214
//-----------------------------------------------------------------------------
215
 
624 ddp 216
const WIND_DESC wind_swlng PROGMEM = { 13,11,27,3,0x9f,0x01 };
217
#define p_wind_swlng ((const P_WIND_DESC)&wind_swlng)
601 ddp 218
 
219
void menu_swlng(void)
220
{
221
 u8 go2;
222
 do
223
 {
224
  lang++;
225
  if (lang>=TOTAL_LANG) lang=0;
226
  save_lang();
227
  scr_fade();
624 ddp 228
  scr_window(p_wind_swlng);
601 ddp 229
  scr_set_attr(0x9e);
624 ddp 230
  scr_print_mlmsg(mlmsg_swlng);
601 ddp 231
  u16 to;
232
  set_timeout_ms(&to,2000);
233
  go2=GO_READKEY;
234
  do
235
  {
236
   u16 key;
237
   if (inkey(&key))
238
   {
239
    if (!((u8)key&(1<<PS2K_BIT_EXTKEY)))
240
    {
241
     if ((u8)(key>>8)==KEY_CAPSLOCK)  go2=GO_REPEAT;
242
     if ((u8)(key>>8)==KEY_ESC)  go2=GO_EXIT;
243
    }
244
   }
245
   else
246
   {
247
    if (check_timeout_ms(&to))  go2=GO_EXIT;
248
   }
249
  }while (go2==GO_READKEY);
250
 
251
 }while (go2!=GO_EXIT);
252
}
253
 
254
//-----------------------------------------------------------------------------
255
 
256
#define menu_draw_cursor(x,y,attr,width)\
257
{                                       \
258
  scr_set_cursor(x,y);                  \
259
  scr_fill_attr(attr,width);            \
260
}
261
 
262
//-----------------------------------------------------------------------------
263
 
624 ddp 264
void scr_menu(const P_MENU_DESC pmenudesc)
601 ddp 265
{
624 ddp 266
 u8 menu_select=0, go2;
601 ddp 267
 do
268
 {
269
  u8 x, y, width, items;
624 ddp 270
  PBKHNDL pBkHndl;
271
  const u8 * strptr;
601 ddp 272
  u16 to, BkTO, key;
273
 
274
  scr_backgnd();
624 ddp 275
  x      =pgm_read_byte(&pmenudesc->x);
276
  y      =pgm_read_byte(&pmenudesc->y);
277
  width  =pgm_read_byte(&pmenudesc->width);
278
  items  =pgm_read_byte(&pmenudesc->items);
279
  pBkHndl=(PBKHNDL)pgm_read_word(&pmenudesc->bkgnd_task);
280
  BkTO   =pgm_read_word(&pmenudesc->bgtask_period);
281
  strptr=(const u8 *)( pgm_read_word(&pmenudesc->strings) + (u16)(lang*items*width) );
601 ddp 282
  scr_set_cursor(x,y);
283
  scr_set_attr(WIN_ATTR);
284
  scr_putchar(0xda);                            // ''
285
  scr_fill_char(0xc4,width+2);                  // ''
286
  scr_putchar(0xbf);                            // ''
287
  u8 i;
288
  for (i=0;i<items;i++)
289
  {
290
   scr_set_cursor(x,y+i+1);
291
   scr_set_attr(WIN_ATTR);
292
   scr_putchar(0xb3);                           // ''
293
   scr_putchar(0x20);                           // ' '
294
   scr_print_msg_n(strptr,width);
295
   strptr+=width;
296
   scr_putchar(0x20);                           // ' '
297
   scr_putchar(0xb3);                           // ''
298
   scr_fill_attr(WIN_SHADOW_ATTR,1);
299
  }
300
  scr_set_cursor(x,y+items+1);
301
  scr_set_attr(WIN_ATTR);
302
  scr_putchar(0xc0);                            // ''
303
  scr_fill_char(0xc4,width+2);                  // ''
304
  scr_putchar(0xd9);                            // ''
305
  scr_fill_attr(WIN_SHADOW_ATTR,1);
306
 
307
  scr_set_cursor(x+1,y+items+2);
308
  scr_fill_attr(WIN_SHADOW_ATTR,width+4);
309
 
624 ddp 310
  if (pBkHndl) { pBkHndl(0); set_timeout_ms(&to,BkTO); }
601 ddp 311
 
312
  menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
313
  go2=GO_READKEY;
314
 
315
  do
316
  {
317
   if (inkey(&key))
318
   {
319
    switch ((u8)(key>>8))
320
    {
321
     case KEY_ENTER:
322
       scr_fade();
323
       {
624 ddp 324
        const u16 *ptr=(const u16 *)pgm_read_word(&pmenudesc->handlers);
325
        PITEMHNDL pItemHndl=(PITEMHNDL)pgm_read_word(&ptr[menu_select]);
326
        if (pItemHndl) pItemHndl();
601 ddp 327
       }
328
       go2=GO_REDRAW;
329
       break;
330
     case KEY_UP:
331
       if (menu_select)
332
       {
333
        menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
334
        menu_select--;
335
        menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
336
       }
337
       break;
338
     case KEY_DOWN:
339
       if (menu_select<(items-1))
340
       {
341
        menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
342
        menu_select++;
343
        menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
344
       }
345
       break;
346
     case KEY_PAGEUP:
347
     case KEY_HOME:
348
       menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
349
       menu_select=0;
350
       menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
351
       break;
352
     case KEY_PAGEDOWN:
353
     case KEY_END:
354
       menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
355
       menu_select=items-1;
356
       menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
357
       break;
358
     case KEY_ESC:
359
       go2=GO_EXIT;
360
       break;
361
     case KEY_CAPSLOCK:
362
       menu_swlng();
363
       go2=GO_REDRAW;
364
       break;
365
     case KEY_SCROLLLOCK:
366
       toggle_vga();
367
       ps2k_setsysled();
368
       break;
369
     case KEY_F1:
370
       menu_help();
371
       go2=GO_REDRAW;
372
    }
373
   }
374
   else
375
   {
624 ddp 376
    if ( (pBkHndl) && (check_timeout_ms(&to)) )
601 ddp 377
    {
624 ddp 378
     pBkHndl(1);
601 ddp 379
     set_timeout_ms(&to,BkTO);
380
    }
381
   }
382
  }while (go2==GO_READKEY);
383
 
384
 }while (go2==GO_REDRAW);
385
 
386
}
387
 
388
//-----------------------------------------------------------------------------