Top secrets sources NedoPC pentevo

Rev

Rev 601 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

#include "_global.h"
#include "_screen.h"
#include "_ps2k.h"

#define WIN_ATTR 0x9f
#define CURSOR_ATTR 0xf0
#define WIN_SHADOW_ATTR 0x01

//-----------------------------------------------------------------------------
// “áâ ­®¢ª  ⥪ã饣®  âਡãâ 
void scr_set_attr(u8 attr)
{
 fpga_reg(SCR_ATTR,attr);
}

//-----------------------------------------------------------------------------
// “áâ ­®¢ª  ¯®§¨æ¨¨ ¯¥ç â¨ ­  íªà ­¥ (x - 0..52; y - 0..24)
void scr_set_cursor(u8 x, u8 y)
{
 u16 addr;
 addr=y*53+x-1;
 fpga_reg(SCR_LOADDR,addr&0xff);
 fpga_reg(SCR_HIADDR,(addr>>8)&0x07);
}

//-----------------------------------------------------------------------------

void scr_print_msg(const u8 *msg)
{
 SetSPICS();
 fpga_sel_reg(SCR_CHAR);
 u8 ch;
 do
 {
  ch=pgm_read_byte(msg); msg++;
  if (ch==0x15)
  {
   u8 attr;
   attr=pgm_read_byte(msg); msg++;
   scr_set_attr(attr);
   SetSPICS();
   fpga_sel_reg(SCR_CHAR);
  }
  else if (ch==0x16)
  {
   u8 x, y;
   x=pgm_read_byte(msg); msg++;
   y=pgm_read_byte(msg); msg++;
   scr_set_cursor(x,y);
   SetSPICS();
   fpga_sel_reg(SCR_CHAR);
  }
  else if (ch) fpga_same_reg(ch);
 }while (ch);
}

//-----------------------------------------------------------------------------

void scr_print_mlmsg(const u8 * const *mlmsg)
{
 scr_print_msg((const u8 *)pgm_read_word(mlmsg+lang));
}

//-----------------------------------------------------------------------------

void scr_print_msg_n(const u8 *msg, u8 size)
{
 SetSPICS();
 fpga_sel_reg(SCR_CHAR);
 u8 ch;
 do
 {
  ch=pgm_read_byte(msg); msg++;
  fpga_same_reg(ch);
 }while (--size);
}

//-----------------------------------------------------------------------------

void scr_print_rammsg_n(u8 *msg, u8 size)
{
 SetSPICS();
 fpga_sel_reg(SCR_CHAR);
 do
 {
  fpga_same_reg(*msg++);
 }while (--size);
}

//-----------------------------------------------------------------------------

void scr_putchar(u8 ch)
{
 fpga_reg(SCR_CHAR,ch);
}

//-----------------------------------------------------------------------------

void scr_fill_char(u8 ch, u16 count)
{
 fpga_reg(SCR_CHAR,ch);
 while (--count)
 {
  ClrSPICS();
  SetSPICS();
 }
}

//-----------------------------------------------------------------------------

void scr_fill_char_attr(u8 ch, u8 attr, u16 count)
{
 fpga_reg(SCR_ATTR,attr);
 fpga_reg(SCR_CHAR,ch);
 while (--count)
 {
  ClrSPICS();
  SetSPICS();
 }
}

//-----------------------------------------------------------------------------

void scr_fill_attr(u8 attr, u16 count)
{
 fpga_reg(SCR_FILL,attr);
 while (--count)
 {
  ClrSPICS();
  SetSPICS();
 }
}

//-----------------------------------------------------------------------------

void scr_backgnd(void)
{
 scr_set_cursor(0,0);
 scr_fill_char_attr(0x20,0xf0,53);              // ' '
 scr_fill_char_attr(0xb0,0x77,53*23);           // '°'
 scr_fill_char_attr(0x20,0xf0,53);              // ' '
 flags1&=~(ENABLE_DIRECTUART|ENABLE_UART);
 flags1|=ENABLE_SCR;
 scr_set_cursor(0,0);
 scr_print_msg(msg_title1);
 print_short_vers();
 scr_set_cursor(15,24);
 scr_print_msg(msg_title2);
}

//-----------------------------------------------------------------------------

void scr_fade(void)
{
 scr_set_cursor(0,1);
 scr_fill_attr(0x77,53*23);
}

//-----------------------------------------------------------------------------

void scr_window(const P_WIND_DESC pwindesc)
{
 u8 x, y, width, height, wind_attr, wind_flag;
 x        =pgm_read_byte(&pwindesc->x);
 y        =pgm_read_byte(&pwindesc->y);
 width    =pgm_read_byte(&pwindesc->width)-2;
 height   =pgm_read_byte(&pwindesc->height)-2;
 wind_attr=pgm_read_byte(&pwindesc->attr);
 wind_flag=pgm_read_byte(&pwindesc->flag);

 scr_set_cursor(x,y);
 scr_set_attr(wind_attr);
 scr_putchar(0xda);                            // 'Ú'
 scr_fill_char(0xc4,width);                    // 'Ä'
 scr_putchar(0xbf);                            // '¿'
 u8 i;
 for (i=0;i<height;i++)
 {
  scr_set_cursor(x,y+i+1);
  scr_set_attr(wind_attr);
  scr_putchar(0xb3);                           // '³'
  scr_fill_char(0x20,width);                   // 'Ä'
  scr_putchar(0xb3);                           // '³'
  if (wind_flag&0x01)
   scr_fill_attr(WIN_SHADOW_ATTR,1);
 }
 scr_set_cursor(x,y+height+1);
 scr_set_attr(wind_attr);
 scr_putchar(0xc0);                            // 'À'
 scr_fill_char(0xc4,width);                    // 'Ä'
 scr_putchar(0xd9);                            // 'Ù'
 if (wind_flag&0x01)
 {
  scr_fill_attr(WIN_SHADOW_ATTR,1);
  scr_set_cursor(x+1,y+height+2);
  scr_fill_attr(WIN_SHADOW_ATTR,width+2);
  scr_set_attr(wind_attr);
 }
}

//-----------------------------------------------------------------------------

const WIND_DESC wind_menu_help PROGMEM = { 3,13,37,9,0xcf,0x01 };
#define p_wind_menu_help ((const P_WIND_DESC)&wind_menu_help)

void menu_help(void)
{
 scr_fade();
 scr_window(p_wind_menu_help);
 scr_print_mlmsg(mlmsg_menu_help);
 waitkey();
}

//-----------------------------------------------------------------------------

const WIND_DESC wind_swlng PROGMEM = { 13,11,27,3,0x9f,0x01 };
#define p_wind_swlng ((const P_WIND_DESC)&wind_swlng)

void menu_swlng(void)
{
 u8 go2;
 do
 {
  lang++;
  if (lang>=TOTAL_LANG) lang=0;
  save_lang();
  scr_fade();
  scr_window(p_wind_swlng);
  scr_set_attr(0x9e);
  scr_print_mlmsg(mlmsg_swlng);
  u16 to;
  set_timeout_ms(&to,2000);
  go2=GO_READKEY;
  do
  {
   u16 key;
   if (inkey(&key))
   {
    if (!((u8)key&(1<<PS2K_BIT_EXTKEY)))
    {
     if ((u8)(key>>8)==KEY_CAPSLOCK)  go2=GO_REPEAT;
     if ((u8)(key>>8)==KEY_ESC)  go2=GO_EXIT;
    }
   }
   else
   {
    if (check_timeout_ms(&to))  go2=GO_EXIT;
   }
  }while (go2==GO_READKEY);

 }while (go2!=GO_EXIT);
}

//-----------------------------------------------------------------------------

#define menu_draw_cursor(x,y,attr,width)\
{                                       \
  scr_set_cursor(x,y);                  \
  scr_fill_attr(attr,width);            \
}


//-----------------------------------------------------------------------------

void scr_menu(const P_MENU_DESC pmenudesc)
{
 u8 menu_select=0, go2;
 do
 {
  u8 x, y, width, items;
  PBKHNDL pBkHndl;
  const u8 * strptr;
  u16 to, BkTO, key;

  scr_backgnd();
  x      =pgm_read_byte(&pmenudesc->x);
  y      =pgm_read_byte(&pmenudesc->y);
  width  =pgm_read_byte(&pmenudesc->width);
  items  =pgm_read_byte(&pmenudesc->items);
  pBkHndl=(PBKHNDL)pgm_read_word(&pmenudesc->bkgnd_task);
  BkTO   =pgm_read_word(&pmenudesc->bgtask_period);
  strptr=(const u8 *)( pgm_read_word(&pmenudesc->strings) + (u16)(lang*items*width) );
  scr_set_cursor(x,y);
  scr_set_attr(WIN_ATTR);
  scr_putchar(0xda);                            // 'Ú'
  scr_fill_char(0xc4,width+2);                  // 'Ä'
  scr_putchar(0xbf);                            // '¿'
  u8 i;
  for (i=0;i<items;i++)
  {
   scr_set_cursor(x,y+i+1);
   scr_set_attr(WIN_ATTR);
   scr_putchar(0xb3);                           // '³'
   scr_putchar(0x20);                           // ' '
   scr_print_msg_n(strptr,width);
   strptr+=width;
   scr_putchar(0x20);                           // ' '
   scr_putchar(0xb3);                           // '³'
   scr_fill_attr(WIN_SHADOW_ATTR,1);
  }
  scr_set_cursor(x,y+items+1);
  scr_set_attr(WIN_ATTR);
  scr_putchar(0xc0);                            // 'À'
  scr_fill_char(0xc4,width+2);                  // 'Ä'
  scr_putchar(0xd9);                            // 'Ù'
  scr_fill_attr(WIN_SHADOW_ATTR,1);

  scr_set_cursor(x+1,y+items+2);
  scr_fill_attr(WIN_SHADOW_ATTR,width+4);

  if (pBkHndl) { pBkHndl(0); set_timeout_ms(&to,BkTO); }

  menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
  go2=GO_READKEY;

  do
  {
   if (inkey(&key))
   {
    switch ((u8)(key>>8))
    {
     case KEY_ENTER:
       scr_fade();
       {
        const u16 *ptr=(const u16 *)pgm_read_word(&pmenudesc->handlers);
        PITEMHNDL pItemHndl=(PITEMHNDL)pgm_read_word(&ptr[menu_select]);
        if (pItemHndl) pItemHndl();
       }
       go2=GO_REDRAW;
       break;
     case KEY_UP:
       if (menu_select)
       {
        menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
        menu_select--;
        menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
       }
       break;
     case KEY_DOWN:
       if (menu_select<(items-1))
       {
        menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
        menu_select++;
        menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
       }
       break;
     case KEY_PAGEUP:
     case KEY_HOME:
       menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
       menu_select=0;
       menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
       break;
     case KEY_PAGEDOWN:
     case KEY_END:
       menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
       menu_select=items-1;
       menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
       break;
     case KEY_ESC:
       go2=GO_EXIT;
       break;
     case KEY_CAPSLOCK:
       menu_swlng();
       go2=GO_REDRAW;
       break;
     case KEY_SCROLLLOCK:
       toggle_vga();
       ps2k_setsysled();
       break;
     case KEY_F1:
       menu_help();
       go2=GO_REDRAW;
    }
   }
   else
   {
    if ( (pBkHndl) && (check_timeout_ms(&to)) )
    {
     pBkHndl(1);
     set_timeout_ms(&to,BkTO);
    }
   }
  }while (go2==GO_READKEY);

 }while (go2==GO_REDRAW);

}

//-----------------------------------------------------------------------------