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