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                                   1
  5. //┌─────────────────────────────────────────────┐
  6. //│                                             │
  7. //│ e   1 2 3 4 5 6 7 8 9 0 1 2  p s p  . . .   │07
  8. //│                                             │
  9. //│ ` 1 2 3 4 5 6 7 8 9 0 - = <  i h u  n / * - │
  10. //│ t Q W E R T Y U I O P [ ] \  d e d  7 8 9   │
  11. //│ c A S D F G H J K L ; '   e         4 5 6 + │
  12. //│ s Z X C V B N M , . /     s        1 2 3   │
  13. //│ c w a       s       a w m c  <  >  0   . e │
  14. //│                                             │
  15. //│─────────────────────────────────────────────│
  16. //│ Raw data:                                   │16
  17. //│  00 00 00 00 00 00 00 00 00 00 00 00 00 00  │17
  18. //│                                             │
  19. //│ Трёхкратное нажатие <ESC> - выход из теста  │19
  20. //└─────────────────────────────────────────────┘
  21. //
  22. //-----------------------------------------------------------------------------
  23.  
  24. const WIND_DESC wind_t_ps2k PROGMEM = { 3,5,47,16,0xdf,0x01 };
  25. #define p_wind_t_ps2k ((const P_WIND_DESC)&wind_t_ps2k)
  26.  
  27. const u8 tpsk_tab[] PROGMEM = {
  28.  0        , 0        ,    // 0x00
  29.  (11<<3)|0, 0        ,    // 0x01
  30.  0        , 0        ,    // 0x02
  31.  ( 7<<3)|0, 0        ,    // 0x03
  32.  ( 5<<3)|0, 0        ,    // 0x04
  33.  ( 3<<3)|0, 0        ,    // 0x05
  34.  ( 4<<3)|0, 0        ,    // 0x06
  35.  (14<<3)|0, 0        ,    // 0x07
  36.  0        , 0        ,    // 0x08
  37.  (12<<3)|0, 0        ,    // 0x09
  38.  (10<<3)|0, 0        ,    // 0x0a
  39.  ( 8<<3)|0, 0        ,    // 0x0b
  40.  ( 6<<3)|0, 0        ,    // 0x0c
  41.  ( 1<<3)|2, 0        ,    // 0x0d
  42.  ( 1<<3)|1, 0        ,    // 0x0e
  43.  0        , 0        ,    // 0x0f
  44.  0        , 0        ,    // 0x10
  45.  ( 3<<3)|5, (11<<3)|5,    // 0x11
  46.  ( 1<<3)|4, 0        ,    // 0x12
  47.  0        , 0        ,    // 0x13
  48.  ( 1<<3)|5, (14<<3)|5,    // 0x14
  49.  ( 2<<3)|2, 0        ,    // 0x15
  50.  ( 2<<3)|1, 0        ,    // 0x16
  51.  0        , 0        ,    // 0x17
  52.  0        , 0        ,    // 0x18
  53.  0        , 0        ,    // 0x19
  54.  ( 2<<3)|4, 0        ,    // 0x1a
  55.  ( 3<<3)|3, 0        ,    // 0x1b
  56.  ( 2<<3)|3, 0        ,    // 0x1c
  57.  ( 3<<3)|2, 0        ,    // 0x1d
  58.  ( 3<<3)|1, 0        ,    // 0x1e
  59.  0        , ( 2<<3)|5,    // 0x1f
  60.  0        , 0        ,    // 0x20
  61.  ( 4<<3)|4, 0        ,    // 0x21
  62.  ( 3<<3)|4, 0        ,    // 0x22
  63.  ( 4<<3)|3, 0        ,    // 0x23
  64.  ( 4<<3)|2, 0        ,    // 0x24
  65.  ( 5<<3)|1, 0        ,    // 0x25
  66.  ( 4<<3)|1, 0        ,    // 0x26
  67.  0        , (12<<3)|5,    // 0x27
  68.  0        , 0        ,    // 0x28
  69.  ( 7<<3)|5, 0        ,    // 0x29
  70.  ( 5<<3)|4, 0        ,    // 0x2a
  71.  ( 5<<3)|3, 0        ,    // 0x2b
  72.  ( 6<<3)|2, 0        ,    // 0x2c
  73.  ( 5<<3)|2, 0        ,    // 0x2d
  74.  ( 6<<3)|1, 0        ,    // 0x2e
  75.  0        , (13<<3)|5,    // 0x2f
  76.  0        , 0        ,    // 0x30
  77.  ( 7<<3)|4, 0        ,    // 0x31
  78.  ( 6<<3)|4, 0        ,    // 0x32
  79.  ( 7<<3)|3, 0        ,    // 0x33
  80.  ( 6<<3)|3, 0        ,    // 0x34
  81.  ( 7<<3)|2, 0        ,    // 0x35
  82.  ( 7<<3)|1, 0        ,    // 0x36
  83.  0        , 0        ,    // 0x37
  84.  0        , 0        ,    // 0x38
  85.  0        , 0        ,    // 0x39
  86.  ( 8<<3)|4, 0        ,    // 0x3a
  87.  ( 8<<3)|3, 0        ,    // 0x3b
  88.  ( 8<<3)|2, 0        ,    // 0x3c
  89.  ( 8<<3)|1, 0        ,    // 0x3d
  90.  ( 9<<3)|1, 0        ,    // 0x3e
  91.  0        , 0        ,    // 0x3f
  92.  0        , 0        ,    // 0x40
  93.  ( 9<<3)|4, 0        ,    // 0x41
  94.  ( 9<<3)|3, 0        ,    // 0x42
  95.  ( 9<<3)|2, 0        ,    // 0x43
  96.  (10<<3)|2, 0        ,    // 0x44
  97.  (11<<3)|1, 0        ,    // 0x45
  98.  (10<<3)|1, 0        ,    // 0x46
  99.  0        , 0        ,    // 0x47
  100.  0        , 0        ,    // 0x48
  101.  (10<<3)|4, 0        ,    // 0x49
  102.  (11<<3)|4, (19<<3)|1,    // 0x4a
  103.  (10<<3)|3, 0        ,    // 0x4b
  104.  (11<<3)|3, 0        ,    // 0x4c
  105.  (11<<3)|2, 0        ,    // 0x4d
  106.  (12<<3)|1, 0        ,    // 0x4e
  107.  0        , 0        ,    // 0x4f
  108.  0        , 0        ,    // 0x50
  109.  0        , 0        ,    // 0x51
  110.  (12<<3)|3, 0        ,    // 0x52
  111.  0        , 0        ,    // 0x53
  112.  (12<<3)|2, 0        ,    // 0x54
  113.  (13<<3)|1, 0        ,    // 0x55
  114.  0        , 0        ,    // 0x56
  115.  0        , 0        ,    // 0x57
  116.  ( 1<<3)|3, 0        ,    // 0x58
  117.  (14<<3)|4, 0        ,    // 0x59
  118.  (14<<3)|3, (21<<3)|5,    // 0x5a
  119.  (13<<3)|2, 0        ,    // 0x5b
  120.  0        , 0        ,    // 0x5c
  121.  (14<<3)|2, 0        ,    // 0x5d
  122.  0        , 0        ,    // 0x5e
  123.  0        , 0        ,    // 0x5f
  124.  0        , 0        ,    // 0x60
  125.  0        , 0        ,    // 0x61
  126.  0        , 0        ,    // 0x62
  127.  0        , 0        ,    // 0x63
  128.  0        , 0        ,    // 0x64
  129.  0        , 0        ,    // 0x65
  130.  (14<<3)|1, 0        ,    // 0x66
  131.  0        , 0        ,    // 0x67
  132.  0        , 0        ,    // 0x68
  133.  (18<<3)|4, (16<<3)|2,    // 0x69
  134.  0        , 0        ,    // 0x6a
  135.  (18<<3)|3, (15<<3)|5,    // 0x6b
  136.  (18<<3)|2, (16<<3)|1,    // 0x6c
  137.  0        , 0        ,    // 0x6d
  138.  0        , 0        ,    // 0x6e
  139.  0        , 0        ,    // 0x6f
  140.  (18<<3)|5, (15<<3)|1,    // 0x70
  141.  (20<<3)|5, (15<<3)|2,    // 0x71
  142.  (19<<3)|4, (16<<3)|5,    // 0x72
  143.  (19<<3)|3, 0        ,    // 0x73
  144.  (20<<3)|3, (17<<3)|5,    // 0x74
  145.  (19<<3)|2, (16<<3)|4,    // 0x75
  146.  ( 1<<3)|0, 0        ,    // 0x76
  147.  (18<<3)|1, 0        ,    // 0x77
  148.  (13<<3)|0, 0        ,    // 0x78
  149.  (21<<3)|3, 0        ,    // 0x79
  150.  (20<<3)|4, (17<<3)|2,    // 0x7a
  151.  (21<<3)|1, 0        ,    // 0x7b
  152.  (20<<3)|1, (15<<3)|0,    // 0x7c
  153.  (20<<3)|2, (17<<3)|1,    // 0x7d
  154.  (16<<3)|0, (17<<3)|0,    // 0x7e
  155.  0        , 0        };   // 0x7f
  156.  
  157. //-----------------------------------------------------------------------------
  158.  
  159. u8 tps2k_dump(u8 ptr, u8 data)
  160. {
  161.  ps2k_raw_ready=0;
  162.  megabuffer[ptr]=data;
  163.  ptr=(ptr+1)&0x0f;
  164.  flags1&=0b11111100;
  165.  scr_set_cursor(5,17);
  166.  u8 p, cnt;
  167.  p=(ptr+1)&0x0f;
  168.  cnt=14;
  169.  do
  170.  {
  171.   p=(p+1)&0x0f;
  172.   u8 code, attr;
  173.   code=megabuffer[p];
  174.   if ( (code==0xe0) || (code==0xe1) )
  175.    attr=0x0e;
  176.   else if (code==0xf0)
  177.    attr=0x0d;
  178.   else if (code==0xed)
  179.    attr=0x0b;
  180.   else if (code>=0x85)
  181.    attr=0x0a;
  182.   else
  183.    attr=0x0f;
  184.   scr_set_attr(attr);
  185.   scr_putchar(0x20);
  186.  
  187.   if (--cnt)
  188.    print_hexbyte(code);
  189.   else
  190.   {
  191.    flags1|=0b00000010;
  192.    print_hexbyte(code);
  193.    put_char(0x20);
  194.   }
  195.  }while (cnt);
  196.  return ptr;
  197. }
  198.  
  199. //-----------------------------------------------------------------------------
  200.  
  201. void Test_PS2Keyb(void)
  202. {
  203.  scr_window(p_wind_t_ps2k);
  204.  scr_print_mlmsg(mlmsg_tps2k0);
  205.  scr_print_msg(msg_tps2k1);
  206.  scr_fill_char(0xc4,45);                        // '─'
  207.  u8 ptr;
  208.  for (ptr=0;ptr<16;ptr++) megabuffer[ptr]=0;
  209.  ps2k_raw_ready=0;
  210.  u8 leds, esccnt, go2;
  211.  leds=0x80;
  212.  ptr=0;
  213.  esccnt=0;
  214.  
  215.  do
  216.  {
  217.   go2=GO_REPEAT;
  218.  
  219.   if (ps2k_raw_ready) ptr=tps2k_dump(ptr,ps2k_raw_code);
  220.  
  221.   if (leds&0x80)
  222.   {
  223.    leds&=0x07;
  224.    ptr=tps2k_dump(ptr,0xed);
  225.    if (ps2k_send_byte(0xed))
  226.    {
  227.     u8 answ;
  228.     if (ps2k_receive_byte(&answ))
  229.     {
  230.      ptr=tps2k_dump(ptr,answ);
  231.      if (answ==0xfa)
  232.      {
  233.       ptr=tps2k_dump(ptr,leds);
  234.       if (ps2k_send_byte(leds))
  235.       {
  236.        if (ps2k_receive_byte(&answ))
  237.        {
  238.         ptr=tps2k_dump(ptr,answ);
  239.         if (answ==0xfa)
  240.         {
  241.          scr_set_cursor(41,7);
  242.          u8 attr;
  243.          if (leds&0x02) attr=0xdc; else attr=0xd0;
  244.          scr_fill_attr(attr,2);
  245.          if (leds&0x04) attr=0xdc; else attr=0xd0;
  246.          scr_fill_attr(attr,2);
  247.          if (leds&0x01) attr=0xdc; else attr=0xd0;
  248.          scr_fill_attr(attr,2);
  249.         }
  250.        }
  251.       }
  252.      }
  253.     }
  254.    }
  255.   }
  256.  
  257.   u16 kcf;
  258.   kcf=ps2k_key_flags_and_code;
  259.   u8 keycode, keyflags;
  260.   keycode=(u8)(kcf>>8);
  261.   keyflags=(u8)kcf;
  262.  
  263.   if (keyflags&(1<<PS2K_BIT_READY))
  264.   {
  265.    *(u8*)&ps2k_key_flags_and_code=0;
  266.    if (keyflags&(1<<PS2K_BIT_RELEASE))
  267.    {
  268.     if (keyflags&(1<<PS2K_BIT_EXTKEY))
  269.      esccnt=0;
  270.     else
  271.     {
  272.      if (keycode!=KEY_ESC)
  273.       esccnt=0;
  274.      else
  275.      {
  276.       if (++esccnt>2) go2=GO_EXIT;
  277.      }
  278.     }
  279.    }
  280.  
  281.    if (go2==GO_REPEAT)
  282.    {
  283.     if (!(keyflags & ((1<<PS2K_BIT_EXTKEY)|(1<<PS2K_BIT_RELEASE)) ) )
  284.     {
  285.      if (keycode==KEY_SCROLLLOCK) leds=(leds^0x01)|0x80;
  286.      if (keycode==KEY_NUMLOCK)    leds=(leds^0x02)|0x80;
  287.      if (keycode==KEY_CAPSLOCK)   leds=(leds^0x04)|0x80;
  288.     }
  289.  
  290.     u8 temp;
  291.     if ( (keyflags & (1<<PS2K_BIT_RELEASE)) && (keycode==0x83) )
  292.      temp=(9<<3)|0;                             // F7
  293.     else if (keycode==0x84)
  294.      temp=(15<<3)|0;                            // SysReg
  295.     else if (keycode>=0x80)
  296.      temp=0;
  297.     else
  298.     {
  299.      keycode<<=1;
  300.      if (keyflags & (1<<PS2K_BIT_EXTKEY) )  keycode++;
  301.      temp=pgm_read_byte(tpsk_tab+keycode);
  302.     }
  303.  
  304.     if (temp)
  305.     {
  306.      u8 x,y;
  307.      y=temp&0x07;
  308.      if (y) y++;
  309.      x=(temp>>2)&0x3e;
  310.      if (x>=36) x++;
  311.      if (x>=30) x++;
  312.      scr_set_cursor(x+3,y+7);
  313.      u8 attr;
  314.      if (keyflags & (1<<PS2K_BIT_RELEASE) ) attr=0xd1; else attr=0xae;
  315.      scr_fill_attr(attr,1);
  316.     }
  317.    }
  318.   }
  319.  
  320.  }while (go2!=GO_EXIT);
  321.  ps2k_setsysled();
  322. }
  323.  
  324. //-----------------------------------------------------------------------------
  325.