megadrive_test2
changeset 11:302bcd73edc4
added 6button support
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 24 Jun 2017 03:47:37 +0300 |
parents | ca7108a82867 |
children | 54caa2b214ca |
files | src/io.h src/pad.h |
diffstat | 2 files changed, 45 insertions(+), 10 deletions(-) [+] |
line diff
1.1 --- a/src/io.h Sat Jun 24 02:33:52 2017 +0300 1.2 +++ b/src/io.h Sat Jun 24 03:47:37 2017 +0300 1.3 @@ -34,14 +34,18 @@ 1.4 }; 1.5 1.6 enum { 1.7 - IO_PAD_UP = 1, 1.8 - IO_PAD_DOWN = 2, 1.9 - IO_PAD_LEFT = 4, 1.10 - IO_PAD_RIGHT = 8, 1.11 - IO_PAD_B = 16, 1.12 - IO_PAD_C = 32, 1.13 - IO_PAD_A = 64, 1.14 - IO_PAD_START = 128 1.15 + IO_PAD_UP = 0x001, 1.16 + IO_PAD_DOWN = 0x002, 1.17 + IO_PAD_LEFT = 0x004, 1.18 + IO_PAD_RIGHT = 0x008, 1.19 + IO_PAD_B = 0x010, 1.20 + IO_PAD_C = 0x020, 1.21 + IO_PAD_A = 0x040, 1.22 + IO_PAD_START = 0x080, 1.23 + 1.24 + IO_PAD_Z = 0x100, 1.25 + IO_PAD_Y = 0x200, 1.26 + IO_PAD_X = 0x400 1.27 }; 1.28 #define IO_PAD_LOW_MASK 0x3f 1.29 #define IO_PAD_HIGH_MASK (IO_PAD_A | IO_PAD_START) 1.30 @@ -66,6 +70,36 @@ 1.31 return bnstate; 1.32 } 1.33 1.34 +static inline uint16_t io_readpad6(int port) 1.35 +{ 1.36 + uint16_t bnstate; 1.37 + 1.38 + IO_REG_DATA(port) = 0x40; /* start with mode 1 */ 1.39 + asm volatile("nop"); 1.40 + asm volatile("nop"); 1.41 + bnstate = ~IO_REG_DATA(port) & IO_PAD_LOW_MASK; 1.42 + 1.43 + IO_REG_DATA(port) = 0; /* select mode 0 */ 1.44 + asm volatile("nop"); 1.45 + asm volatile("nop"); 1.46 + bnstate |= ~(IO_REG_DATA(port) << 2) & IO_PAD_HIGH_MASK; 1.47 + 1.48 + /* then introduce two more rising edges to trigger extended mode */ 1.49 + IO_REG_DATA(port) = 0x40; 1.50 + asm volatile("nop"); 1.51 + asm volatile("nop"); 1.52 + IO_REG_DATA(port) = 0; 1.53 + asm volatile("nop"); 1.54 + asm volatile("nop"); 1.55 + IO_REG_DATA(port) = 0x40; 1.56 + asm volatile("nop"); 1.57 + asm volatile("nop"); 1.58 + 1.59 + bnstate |= (uint16_t)(~IO_REG_DATA(port) & 0x7) << 8; 1.60 + IO_REG_DATA(port) = 0; /* return mode to 0 */ 1.61 + return bnstate; 1.62 +} 1.63 + 1.64 void io_init(void); 1.65 /*uint16_t io_readpad(int port);*/ 1.66
2.1 --- a/src/pad.h Sat Jun 24 02:33:52 2017 +0300 2.2 +++ b/src/pad.h Sat Jun 24 03:47:37 2017 +0300 2.3 @@ -3,12 +3,13 @@ 2.4 2.5 #include "io.h" 2.6 2.7 -static uint16_t pad_bnstate[2], pad_prev_bnstate[2], pad_bndiff[2]; 2.8 +uint16_t pad_bnstate[2], pad_prev_bnstate[2], pad_bndiff[2]; 2.9 +char pad_6bn; 2.10 2.11 static inline void pad_update(int pad) 2.12 { 2.13 pad_prev_bnstate[pad] = pad_bnstate[pad]; 2.14 - pad_bnstate[pad] = io_readpad(pad); 2.15 + pad_bnstate[pad] = pad_6bn ? io_readpad6(pad) : io_readpad(pad); 2.16 pad_bndiff[pad] = pad_bnstate[pad] ^ pad_prev_bnstate[pad]; 2.17 } 2.18