Files
gb6/system6/input.c
T

51 lines
1.1 KiB
C

#include <Events.h>
#include "../src/dmg.h"
#include "emulator.h"
#include "input.h"
#include "dialogs.h"
// indices match keyMappings order
// (up, down, left, right, a, b, select, start)
static struct {
int button;
int field;
} buttonMap[8] = {
{ BUTTON_UP, FIELD_JOY },
{ BUTTON_DOWN, FIELD_JOY },
{ BUTTON_LEFT, FIELD_JOY },
{ BUTTON_RIGHT, FIELD_JOY },
{ BUTTON_A, FIELD_ACTION },
{ BUTTON_B, FIELD_ACTION },
{ BUTTON_SELECT, FIELD_ACTION },
{ BUTTON_START, FIELD_ACTION }
};
#define KEY_COMMAND 0x37
#define KEY_IS_DOWN(raw, code) (((raw)[(code) >> 3] >> ((code) & 7)) & 1)
// edge-detect against the last poll
void PollGameInput(void)
{
KeyMap keys;
unsigned char *raw = (unsigned char *) keys;
static unsigned char prev[8];
int k, cmd;
GetKeys(keys);
cmd = KEY_IS_DOWN(raw, KEY_COMMAND);
for (k = 0; k < 8; k++) {
int code = keyMappings[k];
// treat everything as released while a menu shortcut is being typed
unsigned char down = cmd ? 0 : KEY_IS_DOWN(raw, code);
if (down == prev[k]) {
continue;
}
prev[k] = down;
dmg_set_button(&dmg, buttonMap[k].field, buttonMap[k].button, down);
}
}