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. #include <util/delay_basic.h>
  5. //
  6. //    ┌────────────────────────────────────┐
  7. //    │      Клавиатура ZX        Джойстик │
  8. //    │ ┌─────────────────────┐            │
  9. //    │ │ 1 2 3 4 5 6 7 8 9 0 │  ┌───────┐ │
  10. //    │ │ Q W E R T Y U I O P │  │      │ │
  11. //    │ │ A S D F G H J K L e │  │ < F > │ │
  12. //    │ │ c Z X C V B N M s s │  │      │ │
  13. //    │ └─────────────────────┘  └───────┘ │
  14. //    │    ┌───────────┐   ┌──────────┐    │
  15. //    │    │ SoftReset │   │ TurboKey │    │
  16. //    │    └───────────┘   └──────────┘    │
  17. //    └────────────────────────────────────┘
  18. //
  19. //
  20. //
  21. //   03 11 19 27 35 36 28 20 12 04
  22. //   02 10 18 26 34 37 29 21 13 05      43
  23. //   01 09 17 25 33 38 30 22 14 06   41 44 40
  24. //   00 08 16 24 32 39 31 23 15 07      42
  25. //
  26. //              46               45
  27. //
  28. //-----------------------------------------------------------------------------
  29.  
  30. const WIND_DESC wind_t_zxkbd_1 PROGMEM = {  7, 6,38,12,0xdf,0x01 };
  31. const WIND_DESC wind_t_zxkbd_2 PROGMEM = {  9, 8,23, 6,0xdf,0x00 };
  32. const WIND_DESC wind_t_zxkbd_3 PROGMEM = { 34, 9, 9, 5,0xdf,0x00 };
  33. const WIND_DESC wind_t_zxkbd_4 PROGMEM = { 12,14,13, 3,0xdf,0x00 };
  34. const WIND_DESC wind_t_zxkbd_5 PROGMEM = { 28,14,12, 3,0xdf,0x00 };
  35. #define p_wind_t_zxkbd_1 ((const P_WIND_DESC)&wind_t_zxkbd_1)
  36. #define p_wind_t_zxkbd_2 ((const P_WIND_DESC)&wind_t_zxkbd_2)
  37. #define p_wind_t_zxkbd_3 ((const P_WIND_DESC)&wind_t_zxkbd_3)
  38. #define p_wind_t_zxkbd_4 ((const P_WIND_DESC)&wind_t_zxkbd_4)
  39. #define p_wind_t_zxkbd_5 ((const P_WIND_DESC)&wind_t_zxkbd_5)
  40.  
  41. //-----------------------------------------------------------------------------
  42.  
  43. void zxkbd4(u8 data, u8 len)
  44. {
  45.  u8 attr;
  46.  if (data)
  47.  {
  48.   if (data==0x03)
  49.    attr=0xae;
  50.   else
  51.    attr=0xd1;
  52.  }
  53.  else
  54.   attr=0xdf;
  55.  scr_fill_attr(attr,len);
  56. }
  57.  
  58. //-----------------------------------------------------------------------------
  59.  
  60. void zxkbd3(u8 data)
  61. {
  62.  u8 attr;
  63.  if (data)
  64.  {
  65.   if (data==0x03)
  66.    attr=0xae;
  67.   else
  68.    attr=0xd1;
  69.  }
  70.  else
  71.   attr=0xdf;
  72.  scr_fill_attr(attr,1);
  73.  scr_fill_attr(0xdf,1);
  74. }
  75.  
  76. //-----------------------------------------------------------------------------
  77.  
  78. u8 * zxkbd2(u8 *ptr, u8 data, u8 count)
  79. {
  80.  do
  81.  {
  82.   if (data&0x01)
  83.    *ptr&=0x02;
  84.   else
  85.    *ptr=0x03;
  86.   ptr++;
  87.   data>>=1;
  88.  }while (--count);
  89.  return ptr;
  90. }
  91.  
  92. //-----------------------------------------------------------------------------
  93.  
  94. u8 * zxkbd1(u8 *ptr)
  95. {
  96.  _delay_loop_1(255);
  97.  return zxkbd2(ptr, PINA, 8);
  98. }
  99.  
  100. //-----------------------------------------------------------------------------
  101.  
  102. void Test_ZXKeyb(void)
  103. {
  104.  scr_window(p_wind_t_zxkbd_1);
  105.  scr_window(p_wind_t_zxkbd_2);
  106.  scr_window(p_wind_t_zxkbd_3);
  107.  scr_window(p_wind_t_zxkbd_4);
  108.  scr_window(p_wind_t_zxkbd_5);
  109.  scr_print_mlmsg(mlmsg_tzxk1);
  110.  scr_print_msg(msg_tzxk2);
  111.  
  112.  u8 i, *ptr;
  113.  ptr=megabuffer;
  114.  for (i=48;i;i--) *ptr++=0;
  115.  DDRA=0;
  116.  PORTA=0xff;
  117.  DDRC=0;
  118.  PORTC=0;
  119.  
  120.  do
  121.  {
  122.   ptr=megabuffer;
  123.   DDRC|=(1<<PC0);
  124.   ptr=zxkbd1(ptr);
  125.   DDRC&=~(1<<PC0);
  126.   DDRC|=(1<<PC1);
  127.   ptr=zxkbd1(ptr);
  128.   DDRC&=~(1<<PC1);
  129.   DDRC|=(1<<PC2);
  130.   ptr=zxkbd1(ptr);
  131.   DDRC&=~(1<<PC2);
  132.   DDRC|=(1<<PC3);
  133.   ptr=zxkbd1(ptr);
  134.   DDRC&=~(1<<PC3);
  135.   DDRC|=(1<<PC4);
  136.   ptr=zxkbd1(ptr);
  137.   DDRC&=~(1<<PC4);
  138.   ptr=zxkbd2(ptr, PING, 5);
  139.   ptr=zxkbd2(ptr, (PINC>>6), 2);
  140.  
  141.   ptr=megabuffer;
  142.   scr_set_cursor(11,9);
  143.   zxkbd3(ptr[3]);
  144.   zxkbd3(ptr[11]);
  145.   zxkbd3(ptr[19]);
  146.   zxkbd3(ptr[27]);
  147.   zxkbd3(ptr[35]);
  148.   zxkbd3(ptr[36]);
  149.   zxkbd3(ptr[28]);
  150.   zxkbd3(ptr[20]);
  151.   zxkbd3(ptr[12]);
  152.   zxkbd3(ptr[4]);
  153.  
  154.   scr_set_cursor(11,10);
  155.   zxkbd3(ptr[2]);
  156.   zxkbd3(ptr[10]);
  157.   zxkbd3(ptr[18]);
  158.   zxkbd3(ptr[26]);
  159.   zxkbd3(ptr[34]);
  160.   zxkbd3(ptr[37]);
  161.   zxkbd3(ptr[29]);
  162.   zxkbd3(ptr[21]);
  163.   zxkbd3(ptr[13]);
  164.   zxkbd3(ptr[5]);
  165.  
  166.   scr_set_cursor(11,11);
  167.   zxkbd3(ptr[1]);
  168.   zxkbd3(ptr[9]);
  169.   zxkbd3(ptr[17]);
  170.   zxkbd3(ptr[25]);
  171.   zxkbd3(ptr[33]);
  172.   zxkbd3(ptr[38]);
  173.   zxkbd3(ptr[30]);
  174.   zxkbd3(ptr[22]);
  175.   zxkbd3(ptr[14]);
  176.   zxkbd3(ptr[6]);
  177.  
  178.   scr_set_cursor(11,12);
  179.   zxkbd3(ptr[0]);
  180.   zxkbd3(ptr[8]);
  181.   zxkbd3(ptr[16]);
  182.   zxkbd3(ptr[24]);
  183.   zxkbd3(ptr[32]);
  184.   zxkbd3(ptr[39]);
  185.   zxkbd3(ptr[31]);
  186.   zxkbd3(ptr[23]);
  187.   zxkbd3(ptr[15]);
  188.   zxkbd3(ptr[7]);
  189.  
  190.   scr_set_cursor(38,10);
  191.   zxkbd3(ptr[43]);
  192.   scr_set_cursor(36,11);
  193.   zxkbd3(ptr[41]);
  194.   zxkbd3(ptr[44]);
  195.   zxkbd3(ptr[40]);
  196.   scr_set_cursor(38,12);
  197.   zxkbd3(ptr[42]);
  198.  
  199.   scr_set_cursor(14,15);
  200.   zxkbd4(ptr[46],9);
  201.  
  202.   scr_set_cursor(30,15);
  203.   zxkbd4(ptr[45],8);
  204.  
  205.   i=1;
  206.   u16 key;
  207.   if (inkey(&key))
  208.    if ((u8)(key>>8)==KEY_ESC) i=0;
  209.  }while (i);
  210.  
  211.  DDRC=0;
  212.  PORTC=0;
  213. }
  214.  
  215. //-----------------------------------------------------------------------------
  216.