Subversion Repositories pentevo

Rev

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