Subversion Repositories pentevo

Rev

Go to most recent revision | 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(PGM_U8_P 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(PGM_U8_P *mlmsg)
  60. {
  61.  scr_print_msg((PGM_U8_P)pgm_read_word(mlmsg+lang));
  62. }
  63.  
  64. //-----------------------------------------------------------------------------
  65.  
  66. void scr_print_msg_n(PGM_U8_P 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(PGM_VOID_P ptr)
  162. {
  163.  const WIND_DESC *desc;
  164.  desc=(const WIND_DESC *)ptr;
  165.  
  166.  u8 x, y, width, height, wind_attr, wind_flag;
  167.  x        =pgm_read_byte(&desc->x);
  168.  y        =pgm_read_byte(&desc->y);
  169.  width    =pgm_read_byte(&desc->width)-2;
  170.  height   =pgm_read_byte(&desc->height)-2;
  171.  wind_attr=pgm_read_byte(&desc->attr);
  172.  wind_flag=pgm_read_byte(&desc->flag);
  173.  
  174.  scr_set_cursor(x,y);
  175.  scr_set_attr(wind_attr);
  176.  scr_putchar(0xda);                            // '┌'
  177.  scr_fill_char(0xc4,width);                    // '─'
  178.  scr_putchar(0xbf);                            // '┐'
  179.  u8 i;
  180.  for (i=0;i<height;i++)
  181.  {
  182.   scr_set_cursor(x,y+i+1);
  183.   scr_set_attr(wind_attr);
  184.   scr_putchar(0xb3);                           // '│'
  185.   scr_fill_char(0x20,width);                   // '─'
  186.   scr_putchar(0xb3);                           // '│'
  187.   if (wind_flag&0x01)
  188.    scr_fill_attr(WIN_SHADOW_ATTR,1);
  189.  }
  190.  scr_set_cursor(x,y+height+1);
  191.  scr_set_attr(wind_attr);
  192.  scr_putchar(0xc0);                            // '└'
  193.  scr_fill_char(0xc4,width);                    // '─'
  194.  scr_putchar(0xd9);                            // '┘'
  195.  if (wind_flag&0x01)
  196.  {
  197.   scr_fill_attr(WIN_SHADOW_ATTR,1);
  198.   scr_set_cursor(x+1,y+height+2);
  199.   scr_fill_attr(WIN_SHADOW_ATTR,width+2);
  200.   scr_set_attr(wind_attr);
  201.  }
  202. }
  203.  
  204. //-----------------------------------------------------------------------------
  205.  
  206. const WIND_DESC wind_menu_help PROGMEM = { 3,13,37,9,0xcf,0x01 };
  207.  
  208. void menu_help(void)
  209. {
  210.  scr_fade();
  211.  scr_window(&wind_menu_help);
  212.  scr_print_mlmsg(mlmsg_menu_help);
  213.  waitkey();
  214. }
  215.  
  216. //-----------------------------------------------------------------------------
  217.  
  218. const WIND_DESC wind_menu_swlng PROGMEM = { 13,11,27,3,0x9f,0x01 };
  219.  
  220. void menu_swlng(void)
  221. {
  222.  u8 go2;
  223.  do
  224.  {
  225.   lang++;
  226.   if (lang>=TOTAL_LANG) lang=0;
  227.   save_lang();
  228.   scr_fade();
  229.   scr_window(&wind_menu_swlng);
  230.   scr_set_attr(0x9e);
  231.   scr_print_mlmsg(mlmsg_menu_swlng);
  232.   u16 to;
  233.   set_timeout_ms(&to,2000);
  234.   go2=GO_READKEY;
  235.   do
  236.   {
  237.    u16 key;
  238.    if (inkey(&key))
  239.    {
  240.     if (!((u8)key&(1<<PS2K_BIT_EXTKEY)))
  241.     {
  242.      if ((u8)(key>>8)==KEY_CAPSLOCK)  go2=GO_REPEAT;
  243.      if ((u8)(key>>8)==KEY_ESC)  go2=GO_EXIT;
  244.     }
  245.    }
  246.    else
  247.    {
  248.     if (check_timeout_ms(&to))  go2=GO_EXIT;
  249.    }
  250.   }while (go2==GO_READKEY);
  251.  
  252.  }while (go2!=GO_EXIT);
  253. }
  254.  
  255. //-----------------------------------------------------------------------------
  256.  
  257. #define menu_draw_cursor(x,y,attr,width)\
  258. {                                       \
  259.   scr_set_cursor(x,y);                  \
  260.   scr_fill_attr(attr,width);            \
  261. }
  262.  
  263. //-----------------------------------------------------------------------------
  264.  
  265. void scr_menu(PGM_VOID_P ptr)
  266. {
  267.  const MENU_DESC *desc;
  268.  desc=(const MENU_DESC *)ptr;
  269.  
  270.  u8 menu_select, go2;
  271.  menu_select=0;
  272.  do
  273.  {
  274.   u8 x, y, width, items;
  275.   typedef void (*BKHNDL)(u8);
  276.   void (*BkHndl)(u8);
  277.   PGM_U8_P strptr;
  278.   u16 to, BkTO, key;
  279.  
  280.   scr_backgnd();
  281.   x      =pgm_read_byte(&desc->x);
  282.   y      =pgm_read_byte(&desc->y);
  283.   width  =pgm_read_byte(&desc->width);
  284.   items  =pgm_read_byte(&desc->items);
  285.   BkHndl =(BKHNDL)pgm_read_word(&desc->bkgnd_task);
  286.   BkTO   =pgm_read_word(&desc->bgtask_period);
  287.   strptr=(PGM_U8_P)( pgm_read_word(&desc->strings) + (u16)(lang*items*width) );
  288.   scr_set_cursor(x,y);
  289.   scr_set_attr(WIN_ATTR);
  290.   scr_putchar(0xda);                            // '┌'
  291.   scr_fill_char(0xc4,width+2);                  // '─'
  292.   scr_putchar(0xbf);                            // '┐'
  293.   u8 i;
  294.   for (i=0;i<items;i++)
  295.   {
  296.    scr_set_cursor(x,y+i+1);
  297.    scr_set_attr(WIN_ATTR);
  298.    scr_putchar(0xb3);                           // '│'
  299.    scr_putchar(0x20);                           // ' '
  300.    scr_print_msg_n(strptr,width);
  301.    strptr+=width;
  302.    scr_putchar(0x20);                           // ' '
  303.    scr_putchar(0xb3);                           // '│'
  304.    scr_fill_attr(WIN_SHADOW_ATTR,1);
  305.   }
  306.   scr_set_cursor(x,y+items+1);
  307.   scr_set_attr(WIN_ATTR);
  308.   scr_putchar(0xc0);                            // '└'
  309.   scr_fill_char(0xc4,width+2);                  // '─'
  310.   scr_putchar(0xd9);                            // '┘'
  311.   scr_fill_attr(WIN_SHADOW_ATTR,1);
  312.  
  313.   scr_set_cursor(x+1,y+items+2);
  314.   scr_fill_attr(WIN_SHADOW_ATTR,width+4);
  315.  
  316.   if (BkHndl) { BkHndl(0); set_timeout_ms(&to,BkTO); }
  317.  
  318.   menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
  319.   go2=GO_READKEY;
  320.  
  321.   do
  322.   {
  323.    if (inkey(&key))
  324.    {
  325.     switch ((u8)(key>>8))
  326.     {
  327.      case KEY_ENTER:
  328.        scr_fade();
  329.        {
  330.         const prog_uint16_t *ptr;
  331.         ptr=(const prog_uint16_t *)pgm_read_word(&desc->handlers);
  332.         typedef void (*ITEMHNDL)(void);
  333.         void (*ItemHndl)(void);
  334.         ItemHndl=(ITEMHNDL)pgm_read_word(&ptr[menu_select]);
  335.         if (ItemHndl) ItemHndl();
  336.        }
  337.        go2=GO_REDRAW;
  338.        break;
  339.      case KEY_UP:
  340.        if (menu_select)
  341.        {
  342.         menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
  343.         menu_select--;
  344.         menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
  345.        }
  346.        break;
  347.      case KEY_DOWN:
  348.        if (menu_select<(items-1))
  349.        {
  350.         menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
  351.         menu_select++;
  352.         menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
  353.        }
  354.        break;
  355.      case KEY_PAGEUP:
  356.      case KEY_HOME:
  357.        menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
  358.        menu_select=0;
  359.        menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
  360.        break;
  361.      case KEY_PAGEDOWN:
  362.      case KEY_END:
  363.        menu_draw_cursor(x+1,y+1+menu_select,WIN_ATTR,width+2);
  364.        menu_select=items-1;
  365.        menu_draw_cursor(x+1,y+1+menu_select,CURSOR_ATTR,width+2);
  366.        break;
  367.      case KEY_ESC:
  368.        go2=GO_EXIT;
  369.        break;
  370.      case KEY_CAPSLOCK:
  371.        menu_swlng();
  372.        go2=GO_REDRAW;
  373.        break;
  374.      case KEY_SCROLLLOCK:
  375.        toggle_vga();
  376.        ps2k_setsysled();
  377.        break;
  378.      case KEY_F1:
  379.        menu_help();
  380.        go2=GO_REDRAW;
  381.     }
  382.    }
  383.    else
  384.    {
  385.     if ( (BkHndl) && (check_timeout_ms(&to)) )
  386.     {
  387.      BkHndl(1);
  388.      set_timeout_ms(&to,BkTO);
  389.     }
  390.    }
  391.   }while (go2==GO_READKEY);
  392.  
  393.  }while (go2==GO_REDRAW);
  394.  
  395. }
  396.  
  397. //-----------------------------------------------------------------------------
  398.