Mercurial > repos > blastem
comparison render_sdl.c @ 66:7a22a0e6c004
Gamepad support
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 20 Dec 2012 00:44:59 -0800 |
parents | 2b1a65f4b85d |
children | a81c548cf353 |
comparison
equal
deleted
inserted
replaced
65:aef6302770c2 | 66:7a22a0e6c004 |
---|---|
1 #include <SDL.h> | 1 #include <SDL.h> |
2 #include <stdlib.h> | 2 #include <stdlib.h> |
3 #include <stdio.h> | 3 #include <stdio.h> |
4 #include "render.h" | 4 #include "render.h" |
5 #include "blastem.h" | |
5 | 6 |
6 SDL_Surface *screen; | 7 SDL_Surface *screen; |
7 uint8_t render_dbg = 0; | 8 uint8_t render_dbg = 0; |
8 | 9 |
9 uint32_t last_frame = 0; | 10 uint32_t last_frame = 0; |
158 return; | 159 return; |
159 } | 160 } |
160 } | 161 } |
161 } | 162 } |
162 | 163 |
164 #define DPAD_UP 0x01 | |
165 #define BUTTON_Z 0x01 | |
166 #define DPAD_DOWN 0x02 | |
167 #define BUTTON_Y 0x02 | |
168 #define DPAD_LEFT 0x04 | |
169 #define BUTTON_X 0x04 | |
170 #define DPAD_RIGHT 0x08 | |
171 #define BUTTON_MODE 0x08 | |
172 #define BUTTON_A 0x10 | |
173 #define BUTTON_B 0x10 | |
174 #define BUTTON_START 0x20 | |
175 #define BUTTON_C 0x20 | |
176 | |
163 #define FRAME_DELAY 16 | 177 #define FRAME_DELAY 16 |
164 #define MIN_DELAY 10 | 178 #define MIN_DELAY 10 |
165 uint32_t frame_counter = 0; | 179 uint32_t frame_counter = 0; |
166 uint32_t start = 0; | 180 uint32_t start = 0; |
167 void wait_render_frame(vdp_context * context) | 181 void wait_render_frame(vdp_context * context) |
168 { | 182 { |
183 FILE * outfile; | |
169 SDL_Event event; | 184 SDL_Event event; |
170 while(SDL_PollEvent(&event)) { | 185 while(SDL_PollEvent(&event)) { |
171 switch (event.type) { | 186 switch (event.type) { |
172 case SDL_KEYDOWN: | 187 case SDL_KEYDOWN: |
173 //TODO: Update emulated gamepads | 188 switch(event.key.keysym.sym) |
174 if (event.key.keysym.sym == SDLK_LEFTBRACKET) { | 189 { |
190 case SDLK_LEFTBRACKET: | |
175 render_dbg++; | 191 render_dbg++; |
176 if (render_dbg == 3) { | 192 if (render_dbg == 3) { |
177 render_dbg = 0; | 193 render_dbg = 0; |
178 } | 194 } |
179 } else if(event.key.keysym.sym == SDLK_t) { | 195 break; |
180 FILE * outfile = fopen("state.gst", "wb"); | 196 case SDLK_t: |
197 outfile = fopen("state.gst", "wb"); | |
181 fwrite("GST\0\0\0\xE0\x40", 1, 8, outfile); | 198 fwrite("GST\0\0\0\xE0\x40", 1, 8, outfile); |
182 vdp_save_state(context, outfile); | 199 vdp_save_state(context, outfile); |
183 fclose(outfile); | 200 fclose(outfile); |
184 puts("state saved to state.gst"); | 201 puts("state saved to state.gst"); |
202 break; | |
203 case SDLK_RETURN: | |
204 gamepad_1.input[GAMEPAD_TH0] |= BUTTON_START; | |
205 break; | |
206 case SDLK_UP: | |
207 gamepad_1.input[GAMEPAD_TH0] |= DPAD_UP; | |
208 gamepad_1.input[GAMEPAD_TH1] |= DPAD_UP; | |
209 break; | |
210 case SDLK_DOWN: | |
211 gamepad_1.input[GAMEPAD_TH0] |= DPAD_DOWN; | |
212 gamepad_1.input[GAMEPAD_TH1] |= DPAD_DOWN; | |
213 break; | |
214 case SDLK_LEFT: | |
215 gamepad_1.input[GAMEPAD_TH1] |= DPAD_LEFT; | |
216 break; | |
217 case SDLK_RIGHT: | |
218 gamepad_1.input[GAMEPAD_TH1] |= DPAD_RIGHT; | |
219 break; | |
220 case SDLK_a: | |
221 gamepad_1.input[GAMEPAD_TH0] |= BUTTON_A; | |
222 //printf("BUTTON_A Dn | GAMEPAD_TH0: %X\n", gamepad_1.input[GAMEPAD_TH0]); | |
223 break; | |
224 case SDLK_s: | |
225 gamepad_1.input[GAMEPAD_TH1] |= BUTTON_B; | |
226 gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_B; | |
227 break; | |
228 case SDLK_d: | |
229 gamepad_1.input[GAMEPAD_TH1] |= BUTTON_C; | |
230 gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_C; | |
231 break; | |
232 case SDLK_q: | |
233 gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_X; | |
234 break; | |
235 case SDLK_w: | |
236 gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_Y; | |
237 break; | |
238 case SDLK_e: | |
239 gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_Z; | |
240 break; | |
241 case SDLK_f: | |
242 gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_MODE; | |
243 break; | |
244 } | |
245 break; | |
246 case SDL_KEYUP: | |
247 switch(event.key.keysym.sym) | |
248 { | |
249 case SDLK_RETURN: | |
250 gamepad_1.input[GAMEPAD_TH0] &= ~BUTTON_START; | |
251 break; | |
252 case SDLK_UP: | |
253 gamepad_1.input[GAMEPAD_TH0] &= ~DPAD_UP; | |
254 gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_UP; | |
255 break; | |
256 case SDLK_DOWN: | |
257 gamepad_1.input[GAMEPAD_TH0] &= ~DPAD_DOWN; | |
258 gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_DOWN; | |
259 break; | |
260 case SDLK_LEFT: | |
261 gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_LEFT; | |
262 break; | |
263 case SDLK_RIGHT: | |
264 gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_RIGHT; | |
265 break; | |
266 case SDLK_a: | |
267 gamepad_1.input[GAMEPAD_TH0] &= ~BUTTON_A; | |
268 //printf("BUTTON_A Up | GAMEPAD_TH0: %X\n", gamepad_1.input[GAMEPAD_TH0]); | |
269 break; | |
270 case SDLK_s: | |
271 gamepad_1.input[GAMEPAD_TH1] &= ~BUTTON_B; | |
272 gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_B; | |
273 break; | |
274 case SDLK_d: | |
275 gamepad_1.input[GAMEPAD_TH1] &= ~BUTTON_C; | |
276 gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_C; | |
277 break; | |
278 case SDLK_q: | |
279 gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_X; | |
280 break; | |
281 case SDLK_w: | |
282 gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_Y; | |
283 break; | |
284 case SDLK_e: | |
285 gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_Z; | |
286 break; | |
287 case SDLK_f: | |
288 gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_MODE; | |
289 break; | |
185 } | 290 } |
186 break; | 291 break; |
187 case SDL_QUIT: | 292 case SDL_QUIT: |
188 puts(""); | 293 puts(""); |
189 exit(0); | 294 exit(0); |