Subversion Repositories pentevo

Rev

Rev 217 | Rev 292 | 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.  
  29. /** ZX keyboard data. */
  30. #define SPI_KBD_DAT   0x10
  31. /** ZX keyboard stop bit. */
  32. #define SPI_KBD_STB   0x11
  33.  
  34. /** ZX mouse X coordinate register. */
  35. #define SPI_MOUSE_X   0x20
  36. /** ZX mouse Y coordinate register. */
  37. #define SPI_MOUSE_Y   0x21
  38. /** ZX mouse Y coordinate register. */
  39. #define SPI_MOUSE_BTN 0x22
  40.  
  41. /** Kempston joystick register. */
  42. #define SPI_KEMPSTON_JOYSTICK 0x23
  43.  
  44. /** ZX reset register. */
  45. #define SPI_RST_REG   0x30
  46.  
  47. /** ZX configuration register. */
  48. #define SPI_CONFIG_REG   0x50
  49. /** ZX NMI bit flag of configuration register. */
  50. #define SPI_CONFIG_NMI_FLAG 0x02
  51. /** ZX $FE.D6 (tape in) bit flag of configuration register. */
  52. #define SPI_TAPE_FLAG 0x04
  53.  
  54. /** ZX Gluk address register. */
  55. #define SPI_GLUK_ADDR 0x41
  56. /** ZX all data for wait registers. */
  57. #define SPI_WAIT_DATA 0x40
  58.  
  59.  
  60. /** Send/recv data for spi registers. */
  61. UBYTE zx_spi_send(UBYTE addr, UBYTE data, UBYTE mask);
  62.  
  63.  
  64. /** Pause between (CS|SS) and not(CS|SS). */
  65. #define SHIFT_PAUSE 8
  66. /** Pause between (CS|SS) and not(CS|SS) counter. */
  67. extern volatile UBYTE shift_pause;
  68.  
  69. // real keys bitmap. send order: LSbit first, from [4] to [0]
  70. // [5]..[9] - received data
  71. // [10] - end scan flag
  72. extern UBYTE zx_realkbd[11];
  73.  
  74. /*struct zx {
  75.         UBYTE counters[40];
  76.         UBYTE map[5]; // send order: LSbit first, from [4] to [0]
  77.         UBYTE reset_type;
  78. };*/
  79.  
  80. /** PS/2 keyboard CTRL key status. */
  81. #define KB_CTRL_MASK   0x01
  82. /** PS/2 keyboard ALT key status. */
  83. #define KB_ALT_MASK    0x02
  84. /** PS/2 keyboard LEFT SHIFT key status. */
  85. #define KB_LSHIFT_MASK 0x04
  86. /** PS/2 keyboard RIGHT SHIFT key status. */
  87. #define KB_RSHIFT_MASK 0x08
  88. /** PS/2 keyboard F12 key status. */
  89. #define KB_F12_MASK    0x10
  90. /** PS/2 keyboard CTRL,ALT,DEL mapped status (set = mapped all keys). */
  91. #define KB_CTRL_ALT_DEL_MAPPED_MASK 0x80
  92. /** PS/2 keyboard control keys status (for additional functons). */
  93. extern volatile UBYTE kb_status;
  94.  
  95.  
  96. #define ZX_TASK_INIT 0
  97. #define ZX_TASK_WORK 1
  98.  
  99. /**
  100.  * Interchange via SPI.
  101.  * @param operation [in] - operation type.
  102.  */
  103. void zx_task(UBYTE operation);
  104.  
  105. void zx_init(void);
  106.  
  107. void to_zx(UBYTE scancode, UBYTE was_E0, UBYTE was_release);
  108.  
  109. void update_keys(UBYTE zxcode, UBYTE was_release);
  110.  
  111. /** Clear zx keyboard buffers. */
  112. void zx_clr_kb(void);
  113.  
  114.  
  115. void  zx_fifo_put(UBYTE input);
  116. UBYTE zx_fifo_isfull(void);
  117. UBYTE zx_fifo_isempty(void);
  118. UBYTE zx_fifo_get(void);
  119. UBYTE zx_fifo_copy(void);
  120.  
  121. /**
  122.  * ZX mouse button register.
  123.  * Bits description:
  124.  * 7..4 - wheel code (if present) or 1111 if wheel not present;
  125.  * 3    - always 1;
  126.  * 2    - middle button (0, if pressed);
  127.  * 1    - right button (0, if pressed);
  128.  * 0    - left button (0, if pressed).
  129.  */
  130. extern volatile UBYTE zx_mouse_button;
  131.  
  132. /** ZX mouse X coordinate register. */
  133. extern volatile UBYTE zx_mouse_x;
  134.  
  135. /** ZX mouse Y coordinate register. */
  136. extern volatile UBYTE zx_mouse_y;
  137.  
  138. /**
  139.  * Reset ZX mouse registers to default value.
  140.  * @param enable [in] - 0: values like no mouse connected, other: values like mouse connected
  141.  */
  142. void zx_mouse_reset(UBYTE enable);
  143.  
  144. /** Send values of ZX mouse registers to fpga. */
  145. void zx_mouse_task(void);
  146.  
  147.  
  148. /** Gluk clock port. */
  149. #define ZXW_GLUK_CLOCK 0x01
  150.  
  151. /**
  152.  * Work with WAIT ports.
  153.  * @param status [in] - bit 7 - CPU is 0 -write, 1-read wait port
  154.  *                              bits 6..0 is index of port
  155.  */
  156. void zx_wait_task(UBYTE status);
  157.  
  158. /** Switch vga mode on ZX */
  159. void zx_vga_switcher(void);
  160.  
  161. /**
  162.  * Set configuration register on zx.
  163.  * @param flags [in] - bit 0: not used (depend from MODE_VGA on modes_register)
  164.  *                             bit 1: NMI
  165.  */
  166. void zx_set_config(UBYTE flags);
  167.  
  168. #endif
  169.  
  170.