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. #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.  
  36. //-----------------------------------------------------------------------------
  37.  
  38. void zxkbd4(u8 data, u8 len)
  39. {
  40.  u8 attr;
  41.  if (data)
  42.  {
  43.   if (data==0x03)
  44.    attr=0xae;
  45.   else
  46.    attr=0xd1;
  47.  }
  48.  else
  49.   attr=0xdf;
  50.  scr_fill_attr(attr,len);
  51. }
  52.  
  53. //-----------------------------------------------------------------------------
  54.  
  55. void zxkbd3(u8 data)
  56. {
  57.  u8 attr;
  58.  if (data)
  59.  {
  60.   if (data==0x03)
  61.    attr=0xae;
  62.   else
  63.    attr=0xd1;
  64.  }
  65.  else
  66.   attr=0xdf;
  67.  scr_fill_attr(attr,1);
  68.  scr_fill_attr(0xdf,1);
  69. }
  70.  
  71. //-----------------------------------------------------------------------------
  72.  
  73. u8 * zxkbd2(u8 *ptr, u8 data, u8 count)
  74. {
  75.  do
  76.  {
  77.   if (data&0x01)
  78.    *ptr&=0x02;
  79.   else
  80.    *ptr=0x03;
  81.   ptr++;
  82.   data>>=1;
  83.  }while (--count);
  84.  return ptr;
  85. }
  86.  
  87. //-----------------------------------------------------------------------------
  88.  
  89. u8 * zxkbd1(u8 *ptr)
  90. {
  91.  _delay_loop_1(255);
  92.  return zxkbd2(ptr, PINA, 8);
  93. }
  94.  
  95. //-----------------------------------------------------------------------------
  96.  
  97. void Test_ZXKeyb(void)
  98. {
  99.  scr_window(&wind_t_zxkbd_1);
  100.  scr_window(&wind_t_zxkbd_2);
  101.  scr_window(&wind_t_zxkbd_3);
  102.  scr_window(&wind_t_zxkbd_4);
  103.  scr_window(&wind_t_zxkbd_5);
  104.  scr_print_mlmsg(mlmsg_tzxk1);
  105.  scr_print_msg(msg_tzxk2);
  106.  
  107.  u8 i, *ptr;
  108.  ptr=megabuffer;
  109.  for (i=48;i;i--) *ptr++=0;
  110.  DDRA=0;
  111.  PORTA=0xff;
  112.  DDRC=0;
  113.  PORTC=0;
  114.  
  115.  do
  116.  {
  117.   ptr=megabuffer;
  118.   DDRC|=(1<<PC0);
  119.   ptr=zxkbd1(ptr);
  120.   DDRC&=~(1<<PC0);
  121.   DDRC|=(1<<PC1);
  122.   ptr=zxkbd1(ptr);
  123.   DDRC&=~(1<<PC1);
  124.   DDRC|=(1<<PC2);
  125.   ptr=zxkbd1(ptr);
  126.   DDRC&=~(1<<PC2);
  127.   DDRC|=(1<<PC3);
  128.   ptr=zxkbd1(ptr);
  129.   DDRC&=~(1<<PC3);
  130.   DDRC|=(1<<PC4);
  131.   ptr=zxkbd1(ptr);
  132.   DDRC&=~(1<<PC4);
  133.   ptr=zxkbd2(ptr, PING, 5);
  134.   ptr=zxkbd2(ptr, (PINC>>6), 2);
  135.  
  136.   ptr=megabuffer;
  137.   scr_set_cursor(11,9);
  138.   zxkbd3(ptr[3]);
  139.   zxkbd3(ptr[11]);
  140.   zxkbd3(ptr[19]);
  141.   zxkbd3(ptr[27]);
  142.   zxkbd3(ptr[35]);
  143.   zxkbd3(ptr[36]);
  144.   zxkbd3(ptr[28]);
  145.   zxkbd3(ptr[20]);
  146.   zxkbd3(ptr[12]);
  147.   zxkbd3(ptr[4]);
  148.  
  149.   scr_set_cursor(11,10);
  150.   zxkbd3(ptr[2]);
  151.   zxkbd3(ptr[10]);
  152.   zxkbd3(ptr[18]);
  153.   zxkbd3(ptr[26]);
  154.   zxkbd3(ptr[34]);
  155.   zxkbd3(ptr[37]);
  156.   zxkbd3(ptr[29]);
  157.   zxkbd3(ptr[21]);
  158.   zxkbd3(ptr[13]);
  159.   zxkbd3(ptr[5]);
  160.  
  161.   scr_set_cursor(11,11);
  162.   zxkbd3(ptr[1]);
  163.   zxkbd3(ptr[9]);
  164.   zxkbd3(ptr[17]);
  165.   zxkbd3(ptr[25]);
  166.   zxkbd3(ptr[33]);
  167.   zxkbd3(ptr[38]);
  168.   zxkbd3(ptr[30]);
  169.   zxkbd3(ptr[22]);
  170.   zxkbd3(ptr[14]);
  171.   zxkbd3(ptr[6]);
  172.  
  173.   scr_set_cursor(11,12);
  174.   zxkbd3(ptr[0]);
  175.   zxkbd3(ptr[8]);
  176.   zxkbd3(ptr[16]);
  177.   zxkbd3(ptr[24]);
  178.   zxkbd3(ptr[32]);
  179.   zxkbd3(ptr[39]);
  180.   zxkbd3(ptr[31]);
  181.   zxkbd3(ptr[23]);
  182.   zxkbd3(ptr[15]);
  183.   zxkbd3(ptr[7]);
  184.  
  185.   scr_set_cursor(38,10);
  186.   zxkbd3(ptr[43]);
  187.   scr_set_cursor(36,11);
  188.   zxkbd3(ptr[41]);
  189.   zxkbd3(ptr[44]);
  190.   zxkbd3(ptr[40]);
  191.   scr_set_cursor(38,12);
  192.   zxkbd3(ptr[42]);
  193.  
  194.   scr_set_cursor(14,15);
  195.   zxkbd4(ptr[46],9);
  196.  
  197.   scr_set_cursor(30,15);
  198.   zxkbd4(ptr[45],8);
  199.  
  200.   i=1;
  201.   u16 key;
  202.   if (inkey(&key))
  203.    if ((u8)(key>>8)==KEY_ESC) i=0;
  204.  }while (i);
  205.  
  206.  DDRC=0;
  207.  PORTC=0;
  208. }
  209.  
  210. //-----------------------------------------------------------------------------
  211.