Mercurial > repos > blastem
diff 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 |
line wrap: on
line diff
--- a/render_sdl.c Wed Dec 19 22:15:16 2012 -0800 +++ b/render_sdl.c Thu Dec 20 00:44:59 2012 -0800 @@ -2,6 +2,7 @@ #include <stdlib.h> #include <stdio.h> #include "render.h" +#include "blastem.h" SDL_Surface *screen; uint8_t render_dbg = 0; @@ -160,28 +161,132 @@ } } +#define DPAD_UP 0x01 +#define BUTTON_Z 0x01 +#define DPAD_DOWN 0x02 +#define BUTTON_Y 0x02 +#define DPAD_LEFT 0x04 +#define BUTTON_X 0x04 +#define DPAD_RIGHT 0x08 +#define BUTTON_MODE 0x08 +#define BUTTON_A 0x10 +#define BUTTON_B 0x10 +#define BUTTON_START 0x20 +#define BUTTON_C 0x20 + #define FRAME_DELAY 16 #define MIN_DELAY 10 uint32_t frame_counter = 0; uint32_t start = 0; void wait_render_frame(vdp_context * context) { + FILE * outfile; SDL_Event event; while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: - //TODO: Update emulated gamepads - if (event.key.keysym.sym == SDLK_LEFTBRACKET) { + switch(event.key.keysym.sym) + { + case SDLK_LEFTBRACKET: render_dbg++; if (render_dbg == 3) { render_dbg = 0; } - } else if(event.key.keysym.sym == SDLK_t) { - FILE * outfile = fopen("state.gst", "wb"); + break; + case SDLK_t: + outfile = fopen("state.gst", "wb"); fwrite("GST\0\0\0\xE0\x40", 1, 8, outfile); vdp_save_state(context, outfile); fclose(outfile); puts("state saved to state.gst"); + break; + case SDLK_RETURN: + gamepad_1.input[GAMEPAD_TH0] |= BUTTON_START; + break; + case SDLK_UP: + gamepad_1.input[GAMEPAD_TH0] |= DPAD_UP; + gamepad_1.input[GAMEPAD_TH1] |= DPAD_UP; + break; + case SDLK_DOWN: + gamepad_1.input[GAMEPAD_TH0] |= DPAD_DOWN; + gamepad_1.input[GAMEPAD_TH1] |= DPAD_DOWN; + break; + case SDLK_LEFT: + gamepad_1.input[GAMEPAD_TH1] |= DPAD_LEFT; + break; + case SDLK_RIGHT: + gamepad_1.input[GAMEPAD_TH1] |= DPAD_RIGHT; + break; + case SDLK_a: + gamepad_1.input[GAMEPAD_TH0] |= BUTTON_A; + //printf("BUTTON_A Dn | GAMEPAD_TH0: %X\n", gamepad_1.input[GAMEPAD_TH0]); + break; + case SDLK_s: + gamepad_1.input[GAMEPAD_TH1] |= BUTTON_B; + gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_B; + break; + case SDLK_d: + gamepad_1.input[GAMEPAD_TH1] |= BUTTON_C; + gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_C; + break; + case SDLK_q: + gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_X; + break; + case SDLK_w: + gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_Y; + break; + case SDLK_e: + gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_Z; + break; + case SDLK_f: + gamepad_1.input[GAMEPAD_EXTRA] |= BUTTON_MODE; + break; + } + break; + case SDL_KEYUP: + switch(event.key.keysym.sym) + { + case SDLK_RETURN: + gamepad_1.input[GAMEPAD_TH0] &= ~BUTTON_START; + break; + case SDLK_UP: + gamepad_1.input[GAMEPAD_TH0] &= ~DPAD_UP; + gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_UP; + break; + case SDLK_DOWN: + gamepad_1.input[GAMEPAD_TH0] &= ~DPAD_DOWN; + gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_DOWN; + break; + case SDLK_LEFT: + gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_LEFT; + break; + case SDLK_RIGHT: + gamepad_1.input[GAMEPAD_TH1] &= ~DPAD_RIGHT; + break; + case SDLK_a: + gamepad_1.input[GAMEPAD_TH0] &= ~BUTTON_A; + //printf("BUTTON_A Up | GAMEPAD_TH0: %X\n", gamepad_1.input[GAMEPAD_TH0]); + break; + case SDLK_s: + gamepad_1.input[GAMEPAD_TH1] &= ~BUTTON_B; + gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_B; + break; + case SDLK_d: + gamepad_1.input[GAMEPAD_TH1] &= ~BUTTON_C; + gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_C; + break; + case SDLK_q: + gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_X; + break; + case SDLK_w: + gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_Y; + break; + case SDLK_e: + gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_Z; + break; + case SDLK_f: + gamepad_1.input[GAMEPAD_EXTRA] &= ~BUTTON_MODE; + break; } break; case SDL_QUIT: