mirror of https://github.com/mgba-emu/mgba.git
Handle key, quit events
This commit is contained in:
parent
71986b0477
commit
3ca5e52de1
|
@ -150,6 +150,12 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) {
|
||||||
GBATimerUpdateRegister(gba, 3);
|
GBATimerUpdateRegister(gba, 3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case REG_KEYINPUT:
|
||||||
|
if (gba->keySource) {
|
||||||
|
return 0x3FF ^ *gba->keySource;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case REG_DMA0CNT_LO:
|
case REG_DMA0CNT_LO:
|
||||||
case REG_DMA1CNT_LO:
|
case REG_DMA1CNT_LO:
|
||||||
case REG_DMA2CNT_LO:
|
case REG_DMA2CNT_LO:
|
||||||
|
|
|
@ -26,6 +26,7 @@ static void* _GBAThreadRun(void* context) {
|
||||||
GBALoadROM(&gba, threadContext->fd);
|
GBALoadROM(&gba, threadContext->fd);
|
||||||
}
|
}
|
||||||
GBAAttachDebugger(&gba, &debugger);
|
GBAAttachDebugger(&gba, &debugger);
|
||||||
|
gba.keySource = &threadContext->activeKeys;
|
||||||
|
|
||||||
threadContext->started = 1;
|
threadContext->started = 1;
|
||||||
pthread_mutex_lock(&threadContext->mutex);
|
pthread_mutex_lock(&threadContext->mutex);
|
||||||
|
@ -51,6 +52,7 @@ int GBAThreadStart(struct GBAThread* threadContext) {
|
||||||
pthread_cond_init(&threadContext->cond, 0);
|
pthread_cond_init(&threadContext->cond, 0);
|
||||||
|
|
||||||
pthread_mutex_lock(&threadContext->mutex);
|
pthread_mutex_lock(&threadContext->mutex);
|
||||||
|
threadContext->activeKeys = 0;
|
||||||
threadContext->started = 0;
|
threadContext->started = 0;
|
||||||
pthread_create(&threadContext->thread, 0, _GBAThreadRun, threadContext);
|
pthread_create(&threadContext->thread, 0, _GBAThreadRun, threadContext);
|
||||||
pthread_cond_wait(&threadContext->cond, &threadContext->mutex);
|
pthread_cond_wait(&threadContext->cond, &threadContext->mutex);
|
||||||
|
|
|
@ -12,6 +12,7 @@ struct GBAThread {
|
||||||
// Input
|
// Input
|
||||||
struct GBAVideoRenderer* renderer;
|
struct GBAVideoRenderer* renderer;
|
||||||
int fd;
|
int fd;
|
||||||
|
int activeKeys;
|
||||||
|
|
||||||
// Threading state
|
// Threading state
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
|
|
|
@ -44,6 +44,7 @@ void GBAInit(struct GBA* gba) {
|
||||||
memset(gba->timers, 0, sizeof(gba->timers));
|
memset(gba->timers, 0, sizeof(gba->timers));
|
||||||
|
|
||||||
gba->springIRQ = 0;
|
gba->springIRQ = 0;
|
||||||
|
gba->keySource = 0;
|
||||||
|
|
||||||
ARMReset(&gba->cpu);
|
ARMReset(&gba->cpu);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,19 @@ enum GBALogLevel {
|
||||||
GBA_LOG_WARN
|
GBA_LOG_WARN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum GBAKey {
|
||||||
|
GBA_KEY_A = 0,
|
||||||
|
GBA_KEY_B = 1,
|
||||||
|
GBA_KEY_SELECT = 2,
|
||||||
|
GBA_KEY_START = 3,
|
||||||
|
GBA_KEY_RIGHT = 4,
|
||||||
|
GBA_KEY_LEFT = 5,
|
||||||
|
GBA_KEY_UP = 6,
|
||||||
|
GBA_KEY_DOWN = 7,
|
||||||
|
GBA_KEY_R = 8,
|
||||||
|
GBA_KEY_L = 9
|
||||||
|
};
|
||||||
|
|
||||||
struct GBABoard {
|
struct GBABoard {
|
||||||
struct ARMBoard d;
|
struct ARMBoard d;
|
||||||
struct GBA* p;
|
struct GBA* p;
|
||||||
|
@ -60,6 +73,7 @@ struct GBA {
|
||||||
} timers[4];
|
} timers[4];
|
||||||
|
|
||||||
int springIRQ;
|
int springIRQ;
|
||||||
|
int* keySource;
|
||||||
|
|
||||||
enum GBAError errno;
|
enum GBAError errno;
|
||||||
const char* errstr;
|
const char* errstr;
|
||||||
|
|
59
src/main.c
59
src/main.c
|
@ -1,5 +1,6 @@
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "gba-thread.h"
|
#include "gba-thread.h"
|
||||||
|
#include "gba.h"
|
||||||
#include "renderers/video-software.h"
|
#include "renderers/video-software.h"
|
||||||
|
|
||||||
#include <sdl.h>
|
#include <sdl.h>
|
||||||
|
@ -19,6 +20,7 @@ struct GLSoftwareRenderer {
|
||||||
static int _GBASDLInit(struct GLSoftwareRenderer* renderer);
|
static int _GBASDLInit(struct GLSoftwareRenderer* renderer);
|
||||||
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer);
|
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer);
|
||||||
static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer* renderer);
|
static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer* renderer);
|
||||||
|
static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_KeyboardEvent* event);
|
||||||
|
|
||||||
static const GLint _glVertices[] = {
|
static const GLint _glVertices[] = {
|
||||||
0, 0,
|
0, 0,
|
||||||
|
@ -112,8 +114,17 @@ static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer*
|
||||||
pthread_mutex_lock(&renderer->d.mutex);
|
pthread_mutex_lock(&renderer->d.mutex);
|
||||||
pthread_cond_broadcast(&renderer->d.cond);
|
pthread_cond_broadcast(&renderer->d.cond);
|
||||||
pthread_mutex_unlock(&renderer->d.mutex);
|
pthread_mutex_unlock(&renderer->d.mutex);
|
||||||
while(SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
|
switch (event.type) {
|
||||||
|
case SDL_QUIT:
|
||||||
|
// FIXME: this isn't thread-safe
|
||||||
|
context->debugger->state = DEBUGGER_EXITING;
|
||||||
|
break;
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
case SDL_KEYUP:
|
||||||
|
_GBASDLHandleKeypress(context, &event.key);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,3 +134,47 @@ static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer) {
|
||||||
|
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_KeyboardEvent* event) {
|
||||||
|
enum GBAKey key = 0;
|
||||||
|
switch (event->keysym.sym) {
|
||||||
|
case SDLK_z:
|
||||||
|
key = GBA_KEY_A;
|
||||||
|
break;
|
||||||
|
case SDLK_x:
|
||||||
|
key = GBA_KEY_B;
|
||||||
|
break;
|
||||||
|
case SDLK_a:
|
||||||
|
key = GBA_KEY_L;
|
||||||
|
break;
|
||||||
|
case SDLK_s:
|
||||||
|
key = GBA_KEY_R;
|
||||||
|
break;
|
||||||
|
case SDLK_RETURN:
|
||||||
|
key = GBA_KEY_START;
|
||||||
|
break;
|
||||||
|
case SDLK_BACKSPACE:
|
||||||
|
key = GBA_KEY_SELECT;
|
||||||
|
break;
|
||||||
|
case SDLK_UP:
|
||||||
|
key = GBA_KEY_UP;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
key = GBA_KEY_DOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_LEFT:
|
||||||
|
key = GBA_KEY_LEFT;
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
key = GBA_KEY_RIGHT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->type == SDL_KEYDOWN) {
|
||||||
|
context->activeKeys |= 1 << key;
|
||||||
|
} else {
|
||||||
|
context->activeKeys &= ~(1 << key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue