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 | //----------------------------------------------------------------------------- |