]> 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 "include/SDLptc.h"\r
8 #include "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 \r
88         if (keystate[SDLK_KP0])         joypad_0_buttons[BUTTON_0]=0x01;\r
89         if (keystate[SDLK_KP1])         joypad_0_buttons[BUTTON_1]=0x01;\r
90         if (keystate[SDLK_KP2])         joypad_0_buttons[BUTTON_2]=0x01;\r
91         if (keystate[SDLK_KP3])         joypad_0_buttons[BUTTON_3]=0x01;\r
92         if (keystate[SDLK_KP4])         joypad_0_buttons[BUTTON_4]=0x01;\r
93         if (keystate[SDLK_KP5])         joypad_0_buttons[BUTTON_5]=0x01;\r
94         if (keystate[SDLK_KP6])         joypad_0_buttons[BUTTON_6]=0x01;\r
95         if (keystate[SDLK_KP7])         joypad_0_buttons[BUTTON_7]=0x01;\r
96         if (keystate[SDLK_KP8])         joypad_0_buttons[BUTTON_8]=0x01;\r
97         if (keystate[SDLK_KP9])         joypad_0_buttons[BUTTON_9]=0x01;\r
98         \r
99     if (keystate[SDLK_ESCAPE])  finished=1;\r
100     \r
101     /* Added/Changed by SDLEMU (http://sdlemu.ngemu.com */\r
102     /* Joystick support                                 */\r
103     \r
104     if ( console.JoyEnabled() == 1 ) {\r
105     \r
106         x = SDL_JoystickGetAxis(console.joystick, 0);\r
107         y = SDL_JoystickGetAxis(console.joystick, 1);\r
108         \r
109         if ( x > 16384  ) joypad_0_buttons[BUTTON_R]=0x01;\r
110         if ( x < -16384 ) joypad_0_buttons[BUTTON_L]=0x01;\r
111         if ( y > 16384  ) joypad_0_buttons[BUTTON_D]=0x01;\r
112         if ( y < -16384 ) joypad_0_buttons[BUTTON_U]=0x01;\r
113         \r
114         if (SDL_JoystickGetButton(console.joystick, 0) == SDL_PRESSED) joypad_0_buttons[BUTTON_A]=0x01;\r
115         if (SDL_JoystickGetButton(console.joystick, 1) == SDL_PRESSED) joypad_0_buttons[BUTTON_B]=0x01;\r
116         if (SDL_JoystickGetButton(console.joystick, 2) == SDL_PRESSED) joypad_0_buttons[BUTTON_C]=0x01;\r
117 \r
118         }\r
119         \r
120         /* ADDED by SDLEMU (http://sdlemu.ngemu.com */\r
121         /* Needed to make sure that the events queue is empty */\r
122     SDL_PumpEvents();            \r
123 \r
124 }\r
125 //////////////////////////////////////////////////////////////////////////////\r
126 //\r
127 //////////////////////////////////////////////////////////////////////////////\r
128 //\r
129 //\r
130 //\r
131 //////////////////////////////////////////////////////////////////////////////\r
132 void joystick_reset(void)\r
133 {\r
134         memset(joystick_ram,0x00,4);\r
135         memset(joypad_0_buttons,0,21);\r
136         memset(joypad_1_buttons,0,21);\r
137 }\r
138 //////////////////////////////////////////////////////////////////////////////\r
139 //\r
140 //////////////////////////////////////////////////////////////////////////////\r
141 //\r
142 //\r
143 //\r
144 //////////////////////////////////////////////////////////////////////////////\r
145 void joystick_done(void)\r
146 {\r
147 }\r
148 //////////////////////////////////////////////////////////////////////////////\r
149 //\r
150 //////////////////////////////////////////////////////////////////////////////\r
151 //\r
152 //\r
153 //\r
154 //////////////////////////////////////////////////////////////////////////////\r
155 void joystick_byte_write(uint32 offset, uint8 data)\r
156 {\r
157         joystick_ram[offset&0x03]=data;\r
158 }\r
159 //////////////////////////////////////////////////////////////////////////////\r
160 //\r
161 //////////////////////////////////////////////////////////////////////////////\r
162 //\r
163 //\r
164 //\r
165 //////////////////////////////////////////////////////////////////////////////\r
166 void joystick_word_write(uint32 offset, uint16 data)\r
167 {\r
168         offset&=0x03;\r
169         joystick_ram[offset+0]=(data>>8)&0xff;\r
170         joystick_ram[offset+1]=data&0xff;\r
171 }\r
172 //////////////////////////////////////////////////////////////////////////////\r
173 //\r
174 //////////////////////////////////////////////////////////////////////////////\r
175 //\r
176 //\r
177 //\r
178 //////////////////////////////////////////////////////////////////////////////\r
179 uint8 joystick_byte_read(uint32 offset)\r
180 {\r
181         offset&=0x03;\r
182 \r
183         if (offset==0)\r
184         {\r
185                 uint8 data=0x00;\r
186                 int pad0Index=joystick_ram[1]&0x0f;\r
187                 int pad1Index=(joystick_ram[1]>>4)&0x0f;\r
188                 \r
189                 if (!(pad0Index&0x01)) \r
190                         pad0Index=0;\r
191                 else\r
192                 if (!(pad0Index&0x02)) \r
193                         pad0Index=1;\r
194                 else\r
195                 if (!(pad0Index&0x04)) \r
196                         pad0Index=2;\r
197                 else\r
198                         pad0Index=3;\r
199                 \r
200                 if (!(pad1Index&0x01)) \r
201                         pad1Index=0;\r
202                 else\r
203                 if (!(pad1Index&0x02)) \r
204                         pad1Index=1;\r
205                 else\r
206                 if (!(pad1Index&0x04)) \r
207                         pad1Index=2;\r
208                 else\r
209                         pad1Index=3;\r
210 \r
211                 if (joypad_0_buttons[(pad0Index<<2)+0]) data|=0x01;\r
212                 if (joypad_0_buttons[(pad0Index<<2)+1]) data|=0x02;\r
213                 if (joypad_0_buttons[(pad0Index<<2)+2]) data|=0x04;\r
214                 if (joypad_0_buttons[(pad0Index<<2)+3]) data|=0x08;\r
215                 if (joypad_1_buttons[(pad1Index<<2)+0]) data|=0x10;\r
216                 if (joypad_1_buttons[(pad1Index<<2)+1]) data|=0x20;\r
217                 if (joypad_1_buttons[(pad1Index<<2)+2]) data|=0x40;\r
218                 if (joypad_1_buttons[(pad1Index<<2)+3]) data|=0x80;\r
219                 return(~data);\r
220         }\r
221         else\r
222         if (offset==3)\r
223         {\r
224                 uint8 data=((1<<5)|(1<<4)|0x0f) ;\r
225                 int pad0Index=joystick_ram[1]&0x0f;\r
226                 int pad1Index=(joystick_ram[1]>>4)&0x0f;\r
227                 \r
228                 if (!(pad0Index&0x01)) \r
229                 {\r
230                         if (joypad_0_buttons[BUTTON_PAUSE]) data^=0x01;\r
231                         if (joypad_0_buttons[BUTTON_A]) data^=0x02;\r
232                 }\r
233                 else\r
234                 if (!(pad0Index&0x02)) \r
235                 {\r
236                         if (joypad_0_buttons[BUTTON_B])          data^=0x02;\r
237                 }\r
238                 else\r
239                 if (!(pad0Index&0x04)) \r
240                 {\r
241                         if (joypad_0_buttons[BUTTON_C]) data^=0x02;\r
242                 }\r
243                 else\r
244                 {\r
245                         if (joypad_0_buttons[BUTTON_OPTION]) data^=0x02;\r
246                 }               \r
247                 return(data);\r
248         }\r
249         return(joystick_ram[offset]);\r
250 }\r
251 //////////////////////////////////////////////////////////////////////////////\r
252 //\r
253 //////////////////////////////////////////////////////////////////////////////\r
254 //\r
255 //\r
256 //\r
257 //////////////////////////////////////////////////////////////////////////////\r
258 uint16 joystick_word_read(uint32 offset)\r
259 {\r
260         uint16 data=joystick_byte_read((offset+0)&0x03);\r
261         data<<=8;\r
262         data|=joystick_byte_read((offset+1)&0x03);\r
263         return(data);\r
264 }\r