Subversion Repositories pentevo

Rev

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

  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.  
  28. void scr_print_msg(const u8 *msg)
  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.  
  59. void scr_print_mlmsg(const u8 * const *mlmsg)
  60. {
  61.  scr_print_msg((const u8 *)pgm_read_word(mlmsg+lang));
  62. }
  63.  
  64. //-----------------------------------------------------------------------------
  65.  
  66. void scr_print_msg_n(const u8 *msg, u8 size)
  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.  
  161. void scr_window(const P_WIND_DESC pwindesc)
  162. {
  163.  u8 x, y, width, height, wind_attr, wind_flag;
  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);
  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 };
  204. #define p_wind_menu_help ((const P_WIND_DESC)&wind_menu_help)
  205.  
  206. void menu_help(void)
  207. {
  208.  scr_fade();
  209.  scr_window(p_wind_menu_help);
  210.  scr_print_mlmsg(mlmsg_menu_help);
  211.  waitkey();
  212. }
  213.  
  214. //-----------------------------------------------------------------------------
  215.  
  216. const WIND_DESC wind_swlng PROGMEM = { 13,11,27,3,0x9f,0x01 };
  217. #define p_wind_swlng ((const P_WIND_DESC)&wind_swlng)
  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();
  228.   scr_window(p_wind_swlng);
  229.   scr_set_attr(0x9e);
  230.   scr_print_mlmsg(mlmsg_swlng);
  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.  
  264. void scr_menu(const P_MENU_DESC pmenudesc)
  265. {
  266.  u8 menu_select=0, go2;
  267.  do
  268.  {
  269.   u8 x, y, width, items;
  270.   PBKHNDL pBkHndl;
  271.   const u8 * strptr;
  272.   u16 to, BkTO, key;
  273.  
  274.   scr_backgnd();
  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) );
  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.  
  310.   if (pBkHndl) { pBkHndl(0); set_timeout_ms(&to,BkTO); }
  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.        {
  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();
  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.    {
  376.     if ( (pBkHndl) && (check_timeout_ms(&to)) )
  377.     {
  378.      pBkHndl(1);
  379.      set_timeout_ms(&to,BkTO);
  380.     }
  381.    }
  382.   }while (go2==GO_READKEY);
  383.  
  384.  }while (go2==GO_REDRAW);
  385.  
  386. }
  387.  
  388. //-----------------------------------------------------------------------------
  389.