]> Shamusworld >> Repos - virtualjaguar/blob - src/joystick.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / joystick.cpp
1 #ifndef __PORT__\r
2 #include "include/stdafx.h"\r
3 #include <mmsystem.h>\r
4 #endif\r
5 #include <time.h>\r
6 #include <SDL.h>\r
7 #include "SDLptc.h"\r
8 #include "jaguar.h"\r
9 \r
10 void main_screen_switch(void);\r
11 \r
12 \r
13 #define BUTTON_U                0\r
14 #define BUTTON_D                1\r
15 #define BUTTON_L                2\r
16 #define BUTTON_R                3\r
17 #define BUTTON_1                4\r
18 #define BUTTON_4                5\r
19 #define BUTTON_7                6\r
20 #define BUTTON_s                7\r
21 #define BUTTON_0                8\r
22 #define BUTTON_8                9\r
23 #define BUTTON_5                10\r
24 #define BUTTON_2                11\r
25 #define BUTTON_d                12\r
26 #define BUTTON_9                13\r
27 #define BUTTON_6                14\r
28 #define BUTTON_3                15\r
29 \r
30 \r
31 #define BUTTON_A                16\r
32 #define BUTTON_B                17\r
33 #define BUTTON_C                18\r
34 #define BUTTON_OPTION   19\r
35 #define BUTTON_PAUSE    20\r
36 \r
37 static uint8 joystick_ram[4];\r
38 static uint8 joypad_0_buttons[21];\r
39 static uint8 joypad_1_buttons[21];\r
40 extern uint8 finished;\r
41 extern int start_logging;\r
42 \r
43 //////////////////////////////////////////////////////////////////////////////\r
44 //\r
45 //////////////////////////////////////////////////////////////////////////////\r
46 //\r
47 //\r
48 //\r
49 //////////////////////////////////////////////////////////////////////////////\r
50 void joystick_init(void)\r
51 {\r
52         joystick_reset();\r
53 }\r
54 //////////////////////////////////////////////////////////////////////////////\r
55 //\r
56 //////////////////////////////////////////////////////////////////////////////\r
57 //\r
58 //\r
59 //\r
60 //////////////////////////////////////////////////////////////////////////////\r
61 void joystick_exec(void)\r
62 {\r
63 \r
64         uint8    *keystate = SDL_GetKeyState(NULL);\r
65         Sint16    x = 0, y = 0;\r
66         extern   Console console;\r
67         \r
68         memset(joypad_0_buttons,0,21);\r
69         memset(joypad_1_buttons,0,21);\r
70 \r
71         if ((keystate[SDLK_LALT])&(keystate[SDLK_RETURN]))      main_screen_switch();\r
72 \r
73         /* Added/Changed by SDLEMU (http://sdlemu.ngemu.com) */\r
74 \r
75         if (keystate[SDLK_UP])          joypad_0_buttons[BUTTON_U]=0x01;\r
76         if (keystate[SDLK_DOWN])        joypad_0_buttons[BUTTON_D]=0x01;\r
77         if (keystate[SDLK_LEFT])        joypad_0_buttons[BUTTON_L]=0x01;\r
78         if (keystate[SDLK_RIGHT])       joypad_0_buttons[BUTTON_R]=0x01;\r
79         if (keystate[SDLK_z])           joypad_0_buttons[BUTTON_A]=0x01;\r
80         if (keystate[SDLK_x])           joypad_0_buttons[BUTTON_B]=0x01;\r
81         if (keystate[SDLK_c])           joypad_0_buttons[BUTTON_C]=0x01;\r
82         if (keystate[SDLK_TAB])         joypad_0_buttons[BUTTON_OPTION]=0x01;\r
83         if (keystate[SDLK_RETURN])      joypad_0_buttons[BUTTON_PAUSE]=0x01;\r
84         if (keystate[SDLK_q])           start_logging=1;\r
85         if (keystate[SDLK_w])           gpu_reset_stats();\r
86 //f (keystate[SDLK_u])          jaguar_long_write(0xf1c384,jaguar_long_read(0xf1c384)+1);\r
87         if (keystate[SDLK_d])\r
88         {\r
89                 dump();\r
90         }\r
91 \r
92         if (keystate[SDLK_KP0])         joypad_0_buttons[BUTTON_0]=0x01;\r
93         if (keystate[SDLK_KP1])         joypad_0_buttons[BUTTON_1]=0x01;\r
94         if (keystate[SDLK_KP2])         joypad_0_buttons[BUTTON_2]=0x01;\r
95         if (keystate[SDLK_KP3])         joypad_0_buttons[BUTTON_3]=0x01;\r
96         if (keystate[SDLK_KP4])         joypad_0_buttons[BUTTON_4]=0x01;\r
97         if (keystate[SDLK_KP5])         joypad_0_buttons[BUTTON_5]=0x01;\r
98         if (keystate[SDLK_KP6])         joypad_0_buttons[BUTTON_6]=0x01;\r
99         if (keystate[SDLK_KP7])         joypad_0_buttons[BUTTON_7]=0x01;\r
100         if (keystate[SDLK_KP8])         joypad_0_buttons[BUTTON_8]=0x01;\r
101         if (keystate[SDLK_KP9])         joypad_0_buttons[BUTTON_9]=0x01;\r
102         \r
103     if (keystate[SDLK_ESCAPE])  finished=1;\r
104     \r
105     /* Added/Changed by SDLEMU (http://sdlemu.ngemu.com */\r
106     /* Joystick support                                 */\r
107     \r
108     if ( console.JoyEnabled() == 1 ) {\r
109     \r
110         x = SDL_JoystickGetAxis(console.joystick, 0);\r
111         y = SDL_JoystickGetAxis(console.joystick, 1);\r
112         \r
113         if ( x > 16384  ) joypad_0_buttons[BUTTON_R]=0x01;\r
114         if ( x < -16384 ) joypad_0_buttons[BUTTON_L]=0x01;\r
115         if ( y > 16384  ) joypad_0_buttons[BUTTON_D]=0x01;\r
116         if ( y < -16384 ) joypad_0_buttons[BUTTON_U]=0x01;\r
117         \r
118         if (SDL_JoystickGetButton(console.joystick, 0) == SDL_PRESSED) joypad_0_buttons[BUTTON_A]=0x01;\r
119         if (SDL_JoystickGetButton(console.joystick, 1) == SDL_PRESSED) joypad_0_buttons[BUTTON_B]=0x01;\r
120         if (SDL_JoystickGetButton(console.joystick, 2) == SDL_PRESSED) joypad_0_buttons[BUTTON_C]=0x01;\r
121 \r
122         }\r
123         \r
124         /* ADDED by SDLEMU (http://sdlemu.ngemu.com */\r
125         /* Needed to make sure that the events queue is empty */\r
126     SDL_PumpEvents();            \r
127 \r
128 }\r
129 //////////////////////////////////////////////////////////////////////////////\r
130 //\r
131 //////////////////////////////////////////////////////////////////////////////\r
132 //\r
133 //\r
134 //\r
135 //////////////////////////////////////////////////////////////////////////////\r
136 void joystick_reset(void)\r
137 {\r
138         memset(joystick_ram,0x00,4);\r
139         memset(joypad_0_buttons,0,21);\r
140         memset(joypad_1_buttons,0,21);\r
141 }\r
142 //////////////////////////////////////////////////////////////////////////////\r
143 //\r
144 //////////////////////////////////////////////////////////////////////////////\r
145 //\r
146 //\r
147 //\r
148 //////////////////////////////////////////////////////////////////////////////\r
149 void joystick_done(void)\r
150 {\r
151 }\r
152 //////////////////////////////////////////////////////////////////////////////\r
153 //\r
154 //////////////////////////////////////////////////////////////////////////////\r
155 //\r
156 //\r
157 //\r
158 //////////////////////////////////////////////////////////////////////////////\r
159 void joystick_byte_write(uint32 offset, uint8 data)\r
160 {\r
161         joystick_ram[offset&0x03]=data;\r
162 }\r
163 //////////////////////////////////////////////////////////////////////////////\r
164 //\r
165 //////////////////////////////////////////////////////////////////////////////\r
166 //\r
167 //\r
168 //\r
169 //////////////////////////////////////////////////////////////////////////////\r
170 void joystick_word_write(uint32 offset, uint16 data)\r
171 {\r
172         offset&=0x03;\r
173         joystick_ram[offset+0]=(data>>8)&0xff;\r
174         joystick_ram[offset+1]=data&0xff;\r
175 }\r
176 //////////////////////////////////////////////////////////////////////////////\r
177 //\r
178 //////////////////////////////////////////////////////////////////////////////\r
179 //\r
180 //\r
181 //\r
182 //////////////////////////////////////////////////////////////////////////////\r
183 uint8 joystick_byte_read(uint32 offset)\r
184 {\r
185         offset&=0x03;\r
186 \r
187         if (offset==0)\r
188         {\r
189                 uint8 data=0x00;\r
190                 int pad0Index=joystick_ram[1]&0x0f;\r
191                 int pad1Index=(joystick_ram[1]>>4)&0x0f;\r
192                 \r
193                 if (!(pad0Index&0x01)) \r
194                         pad0Index=0;\r
195                 else\r
196                 if (!(pad0Index&0x02)) \r
197                         pad0Index=1;\r
198                 else\r
199                 if (!(pad0Index&0x04)) \r
200                         pad0Index=2;\r
201                 else\r
202                         pad0Index=3;\r
203                 \r
204                 if (!(pad1Index&0x01)) \r
205                         pad1Index=0;\r
206                 else\r
207                 if (!(pad1Index&0x02)) \r
208                         pad1Index=1;\r
209                 else\r
210                 if (!(pad1Index&0x04)) \r
211                         pad1Index=2;\r
212                 else\r
213                         pad1Index=3;\r
214 \r
215                 if (joypad_0_buttons[(pad0Index<<2)+0]) data|=0x01;\r
216                 if (joypad_0_buttons[(pad0Index<<2)+1]) data|=0x02;\r
217                 if (joypad_0_buttons[(pad0Index<<2)+2]) data|=0x04;\r
218                 if (joypad_0_buttons[(pad0Index<<2)+3]) data|=0x08;\r
219                 if (joypad_1_buttons[(pad1Index<<2)+0]) data|=0x10;\r
220                 if (joypad_1_buttons[(pad1Index<<2)+1]) data|=0x20;\r
221                 if (joypad_1_buttons[(pad1Index<<2)+2]) data|=0x40;\r
222                 if (joypad_1_buttons[(pad1Index<<2)+3]) data|=0x80;\r
223                 return(~data);\r
224         }\r
225         else\r
226         if (offset==3)\r
227         {\r
228                 uint8 data=((1<<5)|(1<<4)|0x0f) ;\r
229                 int pad0Index=joystick_ram[1]&0x0f;\r
230                 int pad1Index=(joystick_ram[1]>>4)&0x0f;\r
231                 \r
232                 if (!(pad0Index&0x01)) \r
233                 {\r
234                         if (joypad_0_buttons[BUTTON_PAUSE]) data^=0x01;\r
235                         if (joypad_0_buttons[BUTTON_A]) data^=0x02;\r
236                 }\r
237                 else\r
238                 if (!(pad0Index&0x02)) \r
239                 {\r
240                         if (joypad_0_buttons[BUTTON_B])          data^=0x02;\r
241                 }\r
242                 else\r
243                 if (!(pad0Index&0x04)) \r
244                 {\r
245                         if (joypad_0_buttons[BUTTON_C]) data^=0x02;\r
246                 }\r
247                 else\r
248                 {\r
249                         if (joypad_0_buttons[BUTTON_OPTION]) data^=0x02;\r
250                 }               \r
251                 return(data);\r
252         }\r
253         return(joystick_ram[offset]);\r
254 }\r
255 //////////////////////////////////////////////////////////////////////////////\r
256 //\r
257 //////////////////////////////////////////////////////////////////////////////\r
258 //\r
259 //\r
260 //\r
261 //////////////////////////////////////////////////////////////////////////////\r
262 uint16 joystick_word_read(uint32 offset)\r
263 {\r
264         uint16 data=joystick_byte_read((offset+0)&0x03);\r
265         data<<=8;\r
266         data|=joystick_byte_read((offset+1)&0x03);\r
267         return(data);\r
268 }\r