Subversion Repositories pentevo

Rev

Rev 119 | Rev 163 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #ifndef ZX_H
  2. #define ZX_H
  3.  
  4. /**
  5.  * @file
  6.  * @brief Interchange with FPGA registers (ZX ports) via SPI.
  7.  * @author http://www.nedopc.com
  8.  *
  9.  * Interchange with ZX ports:
  10.  * - keyboard port (nowait);
  11.  * - mouse port (nowait);
  12.  * - kempstone joystick (nowait);
  13.  * - gluk clock (wait).
  14.  *
  15.  * Configure internal FPGA registers (set modes):
  16.  * - vga/tv mode;
  17.  * - reset CPU.
  18.  */
  19.  
  20. // key code is 7 bits, 8th bit is press/release (1=press,0=release)
  21. //
  22. // ACHTUNG!!!! DO NOT CHANGE THESE DEFINES, OTHERWISE MUCH OF CODE WILL BREAK!!!!
  23. //
  24. #define PRESS_BIT  7
  25. #define PRESS_MASK 128
  26. #define KEY_MASK   127
  27. //
  28. #define KEY_SP  0
  29. #define KEY_EN  1
  30. #define KEY_P   2
  31. #define KEY_0   3
  32. #define KEY_1   4
  33. #define KEY_Q   5
  34. #define KEY_A   6
  35. #define KEY_CS  7
  36. //
  37. #define KEY_SS  8
  38. #define KEY_L   9
  39. #define KEY_O  10
  40. #define KEY_9  11
  41. #define KEY_2  12
  42. #define KEY_W  13
  43. #define KEY_S  14
  44. #define KEY_Z  15
  45. //
  46. #define KEY_M  16
  47. #define KEY_K  17
  48. #define KEY_I  18
  49. #define KEY_8  19
  50. #define KEY_3  20
  51. #define KEY_E  21
  52. #define KEY_D  22
  53. #define KEY_X  23
  54. //
  55. #define KEY_N  24
  56. #define KEY_J  25
  57. #define KEY_U  26
  58. #define KEY_7  27
  59. #define KEY_4  28
  60. #define KEY_R  29
  61. #define KEY_F  30
  62. #define KEY_C  31
  63. //
  64. #define KEY_B  32
  65. #define KEY_H  33
  66. #define KEY_Y  34
  67. #define KEY_6  35
  68. #define KEY_5  36
  69. #define KEY_T  37
  70. #define KEY_G  38
  71. #define KEY_V  39
  72. //
  73. #define NO_KEY 0x7F
  74. #define RST_48 0x7E
  75. #define RST128 0x7D
  76. #define RSTRDS 0x7C
  77. #define RSTSYS 0x7B
  78. #define CLRKYS 0x7A
  79. //
  80.  
  81.  
  82. /** ZX keyboard data. */
  83. #define SPI_KBD_DAT   0x10
  84. /** ZX keyboard stop bit. */
  85. #define SPI_KBD_STB   0x11
  86.  
  87. /** ZX mouse X coordinate register. */
  88. #define SPI_MOUSE_X   0x20
  89. /** ZX mouse Y coordinate register. */
  90. #define SPI_MOUSE_Y   0x21
  91. /** ZX mouse Y coordinate register. */
  92. #define SPI_MOUSE_BTN 0x22
  93.  
  94. /** Kempston joystick register. */
  95. #define SPI_KEMPSTON_JOYSTICK 0x23
  96.  
  97. /** ZX reset register. */
  98. #define SPI_RST_REG   0x30
  99.  
  100. /** ZX VGA MODE register. */
  101. #define SPI_VGA_REG   0x50
  102.  
  103. /** ZX Gluk address register. */
  104. #define SPI_GLUK_ADDR 0x41
  105. /** ZX all data for wait registers. */
  106. #define SPI_WAIT_DATA 0x40
  107.  
  108.  
  109. /** Send/recv data for spi registers. */
  110. UBYTE zx_spi_send(UBYTE addr, UBYTE data, UBYTE mask);
  111.  
  112.  
  113. /** Pause between (CS|SS) and not(CS|SS). */
  114. #define SHIFT_PAUSE 8
  115. /** */
  116. extern volatile UBYTE shift_pause;
  117.  
  118. // real keys bitmap. send order: LSbit first, from [4] to [0]
  119. // [5]..[9] - received data
  120. // [10] - end scan flag
  121. extern UBYTE zx_realkbd[11];
  122.  
  123. /*struct zx {
  124.         UBYTE counters[40];
  125.         UBYTE map[5]; // send order: LSbit first, from [4] to [0]
  126.         UBYTE reset_type;
  127. };*/
  128.  
  129.  
  130.  
  131. #define ZX_TASK_INIT 0
  132. #define ZX_TASK_WORK 1
  133.  
  134. /**
  135.  * Interchange via SPI.
  136.  * @param operation [in] - operation type.
  137.  */
  138. void zx_task(UBYTE operation);
  139.  
  140. void zx_init(void);
  141.  
  142. void to_zx(UBYTE scancode, UBYTE was_E0, UBYTE was_release);
  143.  
  144. void update_keys(UBYTE zxcode, UBYTE was_release);
  145.  
  146. void zx_clr_kb(void);
  147.  
  148.  
  149. void  zx_fifo_put(UBYTE input);
  150. UBYTE zx_fifo_isfull(void);
  151. UBYTE zx_fifo_isempty(void);
  152. UBYTE zx_fifo_get(void);
  153. UBYTE zx_fifo_copy(void);
  154.  
  155. /**
  156.  * ZX mouse button register.
  157.  * Bits description:
  158.  * 7..4 - wheel code (if present) or 1111 if wheel not present;
  159.  * 3    - always 1;
  160.  * 2    - middle button (0, if pressed);
  161.  * 1    - right button (0, if pressed);
  162.  * 0    - left button (0, if pressed).
  163.  */
  164. extern volatile UBYTE zx_mouse_button;
  165.  
  166. /** ZX mouse X coordinate register. */
  167. extern volatile UBYTE zx_mouse_x;
  168.  
  169. /** ZX mouse Y coordinate register. */
  170. extern volatile UBYTE zx_mouse_y;
  171.  
  172. /**
  173.  * Reset ZX mouse registers to default value.
  174.  * @param enable [in] - 0: values like no mouse connected, other: values like mouse connected
  175.  */
  176. void zx_mouse_reset(UBYTE enable);
  177.  
  178. /** Send values of ZX mouse registers to fpga. */
  179. void zx_mouse_task(void);
  180.  
  181.  
  182. /** Gluk clock port. */
  183. #define ZXW_GLUK_CLOCK 0x01
  184.  
  185. /**
  186.  * Work with WAIT ports.
  187.  * @param status [in] - bit 7 - CPU is 0 -write, 1-read wait port
  188.  *                              bits 6..0 is index of port
  189.  */
  190. void zx_wait_task(UBYTE status);
  191.  
  192. /** Switch vga mode on ZX */
  193. void zx_vga_switcher(void);
  194.  
  195. #endif
  196.  
  197.