Subversion Repositories pentevo

Rev

Rev 292 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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