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);