megadrive_test2

view src/io.h @ 9:6ecf2f3ff05a

- better pad input handling - switch between 28 and 30 vertical tiles by pressing C
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 24 Jun 2017 00:33:10 +0300
parents 403367d5df5a
children ca7108a82867
line source
1 #ifndef MEGADRIVE_IO_H_
2 #define MEGADRIVE_IO_H_
4 #include <stdint.h>
6 #define IO_REG_VER *((volatile uint8_t*)0xa10001)
7 #define IO_REG_DATA1 *((volatile uint8_t*)0xa10003)
8 #define IO_REG_DATA2 *((volatile uint8_t*)0xa10005)
9 #define IO_REG_DATA3 *((volatile uint8_t*)0xa10007)
10 #define IO_REG_CTRL1 *((volatile uint8_t*)0xa10009)
11 #define IO_REG_CTRL2 *((volatile uint8_t*)0xa1000b)
12 #define IO_REG_CTRL3 *((volatile uint8_t*)0xa1000d)
13 #define IO_REG_TXDATA1 *((volatile uint8_t*)0xa1000f)
14 #define IO_REG_RXDATA1 *((volatile uint8_t*)0xa10011)
15 #define IO_REG_S_CTRL1 *((volatile uint8_t*)0xa10013)
16 #define IO_REG_TXDATA2 *((volatile uint8_t*)0xa10015)
17 #define IO_REG_RXDATA2 *((volatile uint8_t*)0xa10017)
18 #define IO_REG_S_CTRL2 *((volatile uint8_t*)0xa10013)
19 #define IO_REG_TXDATA3 *((volatile uint8_t*)0xa1001b)
20 #define IO_REG_RXDATA3 *((volatile uint8_t*)0xa1001d)
21 #define IO_REG_S_CTRL3 *((volatile uint8_t*)0xa1001f)
22 #define IO_REG_LOCK *((volatile uint8_t*)0xa14000)
23 #define IO_REG_TMSS *((volatile uint8_t*)0xa14101)
25 #define IO_REG_DATA(x) *((volatile uint8_t*)0xa10003 + ((x) << 1))
26 #define IO_REG_CTRL(x) *((volatile uint8_t*)0xa10009 + ((x) << 1))
29 enum {
30 IO_VER_VERSION_MASK = 0x0f,
31 IO_VER_EXP = 0x20,
32 IO_VER_PAL = 0x40,
33 IO_VER_NONJP = 0x80
34 };
36 enum {
37 IO_PAD_UP = 1,
38 IO_PAD_DOWN = 2,
39 IO_PAD_LEFT = 4,
40 IO_PAD_RIGHT = 8,
41 IO_PAD_B = 16,
42 IO_PAD_C = 32,
43 IO_PAD_A = 64,
44 IO_PAD_START = 128
45 };
47 static inline void io_setdir(int port, uint8_t dir)
48 {
49 IO_REG_CTRL(port) = dir;
50 }
52 static inline uint16_t io_readpad(int port)
53 {
54 uint16_t bnstate;
56 io_setdir(port, 0x40); /* pin 6 (multiplexer) output, 0-5 inputs */
57 IO_REG_DATA(port) = 0x40; /* select mode 1 */
58 bnstate = IO_REG_DATA(port);
59 IO_REG_DATA(port) = 0; /* select mode 0 */
60 bnstate |= (IO_REG_DATA(port) << 2) & (IO_PAD_A | IO_PAD_START);
61 return ~bnstate;
62 }
64 #endif /* MEGADRIVE_IO_H_ */