Rev 608 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6 | lvd | 1 | #ifndef ZX_H |
2 | #define ZX_H |
||
3 | |||
129 | chrv | 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 | */ |
||
6 | lvd | 19 | |
20 | // key code is 7 bits, 8th bit is press/release (1=press,0=release) |
||
21 | // |
||
12 | lvd | 22 | // ACHTUNG!!!! DO NOT CHANGE THESE DEFINES, OTHERWISE MUCH OF CODE WILL BREAK!!!! |
23 | // |
||
6 | lvd | 24 | #define PRESS_BIT 7 |
25 | #define PRESS_MASK 128 |
||
8 | lvd | 26 | #define KEY_MASK 127 |
6 | lvd | 27 | |
28 | |||
129 | chrv | 29 | /** ZX keyboard data. */ |
110 | lvd | 30 | #define SPI_KBD_DAT 0x10 |
129 | chrv | 31 | /** ZX keyboard stop bit. */ |
110 | lvd | 32 | #define SPI_KBD_STB 0x11 |
94 | chrv | 33 | |
129 | chrv | 34 | /** ZX mouse X coordinate register. */ |
110 | lvd | 35 | #define SPI_MOUSE_X 0x20 |
129 | chrv | 36 | /** ZX mouse Y coordinate register. */ |
110 | lvd | 37 | #define SPI_MOUSE_Y 0x21 |
129 | chrv | 38 | /** ZX mouse Y coordinate register. */ |
110 | lvd | 39 | #define SPI_MOUSE_BTN 0x22 |
94 | chrv | 40 | |
129 | chrv | 41 | /** Kempston joystick register. */ |
113 | chrv | 42 | #define SPI_KEMPSTON_JOYSTICK 0x23 |
43 | |||
129 | chrv | 44 | /** ZX reset register. */ |
110 | lvd | 45 | #define SPI_RST_REG 0x30 |
67 | lvd | 46 | |
163 | chrv | 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 |
||
217 | lvd | 51 | /** ZX $FE.D6 (tape in) bit flag of configuration register. */ |
52 | #define SPI_TAPE_FLAG 0x04 |
||
292 | chrv | 53 | /** ZX tapeout mode bit flag of configuration register. */ |
54 | #define SPI_TAPEOUT_MODE_FLAG 0x08 |
||
100 | chrv | 55 | |
263 | chrv | 56 | /** ZX all data for wait registers. */ |
57 | #define SPI_WAIT_DATA 0x40 |
||
129 | chrv | 58 | /** ZX Gluk address register. */ |
263 | chrv | 59 | #define SPI_GLUK_ADDR 0x41 |
60 | /** ZX Kondratiev's rs232 address register. */ |
||
61 | #define SPI_RS232_ADDR 0x42 |
||
67 | lvd | 62 | |
94 | chrv | 63 | /** Send/recv data for spi registers. */ |
64 | UBYTE zx_spi_send(UBYTE addr, UBYTE data, UBYTE mask); |
||
67 | lvd | 65 | |
66 | |||
129 | chrv | 67 | /** Pause between (CS|SS) and not(CS|SS). */ |
12 | lvd | 68 | #define SHIFT_PAUSE 8 |
219 | chrv | 69 | /** Pause between (CS|SS) and not(CS|SS) counter. */ |
6 | lvd | 70 | extern volatile UBYTE shift_pause; |
71 | |||
115 | ddp | 72 | // real keys bitmap. send order: LSbit first, from [4] to [0] |
119 | ddp | 73 | // [5]..[9] - received data |
117 | ddp | 74 | // [10] - end scan flag |
75 | extern UBYTE zx_realkbd[11]; |
||
115 | ddp | 76 | |
8 | lvd | 77 | /*struct zx { |
6 | lvd | 78 | UBYTE counters[40]; |
79 | UBYTE map[5]; // send order: LSbit first, from [4] to [0] |
||
80 | UBYTE reset_type; |
||
8 | lvd | 81 | };*/ |
6 | lvd | 82 | |
672 | chrv | 83 | /** PS/2 keyboard LCTRL key status. */ |
84 | #define KB_LCTRL_MASK 0x01 |
||
85 | /** PS/2 keyboard LCTRL key status. */ |
||
86 | #define KB_RCTRL_MASK 0x02 |
||
87 | /** PS/2 keyboard LALT key status. */ |
||
88 | #define KB_LALT_MASK 0x04 |
||
89 | /** PS/2 keyboard LALT key status. */ |
||
90 | #define KB_RALT_MASK 0x08 |
||
219 | chrv | 91 | /** PS/2 keyboard LEFT SHIFT key status. */ |
672 | chrv | 92 | #define KB_LSHIFT_MASK 0x10 |
219 | chrv | 93 | /** PS/2 keyboard RIGHT SHIFT key status. */ |
672 | chrv | 94 | #define KB_RSHIFT_MASK 0x20 |
219 | chrv | 95 | /** PS/2 keyboard F12 key status. */ |
672 | chrv | 96 | #define KB_F12_MASK 0x40 |
219 | chrv | 97 | /** PS/2 keyboard CTRL,ALT,DEL mapped status (set = mapped all keys). */ |
672 | chrv | 98 | //#define KB_CTRL_ALT_DEL_MAPPED_MASK 0x80 |
219 | chrv | 99 | /** PS/2 keyboard control keys status (for additional functons). */ |
672 | chrv | 100 | extern volatile UBYTE kb_ctrl_status; |
101 | /** PS/2 keyboard control keys mapped to zx keyboard (mapped keys not used in additional functions). */ |
||
102 | extern volatile UBYTE kb_ctrl_mapped; |
||
6 | lvd | 103 | |
67 | lvd | 104 | |
8 | lvd | 105 | #define ZX_TASK_INIT 0 |
106 | #define ZX_TASK_WORK 1 |
||
6 | lvd | 107 | |
129 | chrv | 108 | /** |
109 | * Interchange via SPI. |
||
110 | * @param operation [in] - operation type. |
||
111 | */ |
||
8 | lvd | 112 | void zx_task(UBYTE operation); |
6 | lvd | 113 | |
11 | lvd | 114 | void zx_init(void); |
8 | lvd | 115 | |
6 | lvd | 116 | void to_zx(UBYTE scancode, UBYTE was_E0, UBYTE was_release); |
11 | lvd | 117 | |
6 | lvd | 118 | void update_keys(UBYTE zxcode, UBYTE was_release); |
119 | |||
151 | chrv | 120 | /** Clear zx keyboard buffers. */ |
11 | lvd | 121 | void zx_clr_kb(void); |
6 | lvd | 122 | |
11 | lvd | 123 | |
6 | lvd | 124 | void zx_fifo_put(UBYTE input); |
125 | UBYTE zx_fifo_isfull(void); |
||
126 | UBYTE zx_fifo_isempty(void); |
||
127 | UBYTE zx_fifo_get(void); |
||
128 | UBYTE zx_fifo_copy(void); |
||
129 | |||
75 | chrv | 130 | /** |
131 | * ZX mouse button register. |
||
132 | * Bits description: |
||
133 | * 7..4 - wheel code (if present) or 1111 if wheel not present; |
||
115 | ddp | 134 | * 3 - always 1; |
135 | * 2 - middle button (0, if pressed); |
||
136 | * 1 - right button (0, if pressed); |
||
137 | * 0 - left button (0, if pressed). |
||
75 | chrv | 138 | */ |
139 | extern volatile UBYTE zx_mouse_button; |
||
6 | lvd | 140 | |
75 | chrv | 141 | /** ZX mouse X coordinate register. */ |
142 | extern volatile UBYTE zx_mouse_x; |
||
6 | lvd | 143 | |
75 | chrv | 144 | /** ZX mouse Y coordinate register. */ |
145 | extern volatile UBYTE zx_mouse_y; |
||
6 | lvd | 146 | |
75 | chrv | 147 | /** |
148 | * Reset ZX mouse registers to default value. |
||
129 | chrv | 149 | * @param enable [in] - 0: values like no mouse connected, other: values like mouse connected |
75 | chrv | 150 | */ |
151 | void zx_mouse_reset(UBYTE enable); |
||
6 | lvd | 152 | |
75 | chrv | 153 | /** Send values of ZX mouse registers to fpga. */ |
71 | chrv | 154 | void zx_mouse_task(void); |
6 | lvd | 155 | |
71 | chrv | 156 | |
263 | chrv | 157 | /** Gluk clock ZX port out. */ |
158 | #define ZXW_GLUK_CLOCK 0x01 |
||
94 | chrv | 159 | |
263 | chrv | 160 | /** Kondratiev's modem ZX port out. */ |
161 | #define ZXW_KONDR_RS232 0x02 |
||
162 | |||
94 | chrv | 163 | /** |
164 | * Work with WAIT ports. |
||
129 | chrv | 165 | * @param status [in] - bit 7 - CPU is 0 -write, 1-read wait port |
608 | ddp | 166 | * bits 6..0 is index of port |
94 | chrv | 167 | */ |
168 | void zx_wait_task(UBYTE status); |
||
169 | |||
292 | chrv | 170 | /** |
171 | * Switch mode on ZX. |
||
172 | * @param mode - mode flag |
||
173 | */ |
||
174 | void zx_mode_switcher(UBYTE mode); |
||
94 | chrv | 175 | |
163 | chrv | 176 | /** |
177 | * Set configuration register on zx. |
||
608 | ddp | 178 | * @param flags [in] - bit 2: SPI_TAPE_FLAG |
179 | * bit 5: not used |
||
180 | * bit 6: not used |
||
181 | * bit 7: not used |
||
163 | chrv | 182 | */ |
183 | void zx_set_config(UBYTE flags); |
||
184 | |||
6 | lvd | 185 | #endif |
186 |