Core: Unify peripheral attachment

This commit is contained in:
Vicki Pfau 2017-04-09 19:37:43 -07:00
parent 5646ba7d60
commit e063e05662
10 changed files with 40 additions and 29 deletions

View File

@ -110,8 +110,7 @@ struct mCore {
void (*getGameTitle)(const struct mCore*, char* title); void (*getGameTitle)(const struct mCore*, char* title);
void (*getGameCode)(const struct mCore*, char* title); void (*getGameCode)(const struct mCore*, char* title);
void (*setRotation)(struct mCore*, struct mRotationSource*); void (*setPeripheral)(struct mCore*, int type, void*);
void (*setRumble)(struct mCore*, struct mRumble*);
uint32_t (*busRead8)(struct mCore*, uint32_t address); uint32_t (*busRead8)(struct mCore*, uint32_t address);
uint32_t (*busRead16)(struct mCore*, uint32_t address); uint32_t (*busRead16)(struct mCore*, uint32_t address);

View File

@ -54,6 +54,12 @@ struct mKeyCallback {
uint16_t (*readKeys)(struct mKeyCallback*); uint16_t (*readKeys)(struct mKeyCallback*);
}; };
enum mPeripheral {
mPERIPH_ROTATION = 1,
mPERIPH_RUMBLE,
mPERIPH_CUSTOM = 0x1000
};
struct mRotationSource { struct mRotationSource {
void (*sample)(struct mRotationSource*); void (*sample)(struct mRotationSource*);

View File

@ -408,14 +408,18 @@ static void _GBCoreGetGameCode(const struct mCore* core, char* title) {
GBGetGameCode(core->board, title); GBGetGameCode(core->board, title);
} }
static void _GBCoreSetRotation(struct mCore* core, struct mRotationSource* rotation) { static void _GBCoreSetPeripheral(struct mCore* core, int type, void* periph) {
struct GB* gb = core->board; struct GB* gb = core->board;
gb->memory.rotation = rotation; switch (type) {
} case mPERIPH_ROTATION:
gb->memory.rotation = periph;
static void _GBCoreSetRumble(struct mCore* core, struct mRumble* rumble) { break;
struct GB* gb = core->board; case mPERIPH_RUMBLE:
gb->memory.rumble = rumble; gb->memory.rumble = periph;
break;
default:
return;
}
} }
static uint32_t _GBCoreBusRead8(struct mCore* core, uint32_t address) { static uint32_t _GBCoreBusRead8(struct mCore* core, uint32_t address) {
@ -620,8 +624,7 @@ struct mCore* GBCoreCreate(void) {
core->frequency = _GBCoreFrequency; core->frequency = _GBCoreFrequency;
core->getGameTitle = _GBCoreGetGameTitle; core->getGameTitle = _GBCoreGetGameTitle;
core->getGameCode = _GBCoreGetGameCode; core->getGameCode = _GBCoreGetGameCode;
core->setRotation = _GBCoreSetRotation; core->setPeripheral = _GBCoreSetPeripheral;
core->setRumble = _GBCoreSetRumble;
core->busRead8 = _GBCoreBusRead8; core->busRead8 = _GBCoreBusRead8;
core->busRead16 = _GBCoreBusRead16; core->busRead16 = _GBCoreBusRead16;
core->busRead32 = _GBCoreBusRead32; core->busRead32 = _GBCoreBusRead32;

View File

@ -405,14 +405,18 @@ static void _GBACoreGetGameCode(const struct mCore* core, char* title) {
GBAGetGameCode(core->board, title); GBAGetGameCode(core->board, title);
} }
static void _GBACoreSetRotation(struct mCore* core, struct mRotationSource* rotation) { static void _GBACoreSetPeripheral(struct mCore* core, int type, void* periph) {
struct GBA* gba = core->board; struct GBA* gba = core->board;
gba->rotationSource = rotation; switch (type) {
} case mPERIPH_ROTATION:
gba->rotationSource = periph;
static void _GBACoreSetRumble(struct mCore* core, struct mRumble* rumble) { break;
struct GBA* gba = core->board; case mPERIPH_RUMBLE:
gba->rumble = rumble; gba->rumble = periph;
break;
default:
return;
}
} }
static uint32_t _GBACoreBusRead8(struct mCore* core, uint32_t address) { static uint32_t _GBACoreBusRead8(struct mCore* core, uint32_t address) {
@ -619,8 +623,7 @@ struct mCore* GBACoreCreate(void) {
core->frequency = _GBACoreFrequency; core->frequency = _GBACoreFrequency;
core->getGameTitle = _GBACoreGetGameTitle; core->getGameTitle = _GBACoreGetGameTitle;
core->getGameCode = _GBACoreGetGameCode; core->getGameCode = _GBACoreGetGameCode;
core->setRotation = _GBACoreSetRotation; core->setPeripheral = _GBACoreSetPeripheral;
core->setRumble = _GBACoreSetRumble;
core->busRead8 = _GBACoreBusRead8; core->busRead8 = _GBACoreBusRead8;
core->busRead16 = _GBACoreBusRead16; core->busRead16 = _GBACoreBusRead16;
core->busRead32 = _GBACoreBusRead32; core->busRead32 = _GBACoreBusRead32;

View File

@ -242,7 +242,7 @@ static void _setup(struct mGUIRunner* runner) {
mCoreLoadForeignConfig(runner->core, &runner->config); mCoreLoadForeignConfig(runner->core, &runner->config);
} }
runner->core->setRotation(runner->core, &rotation.d); runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation.d);
if (hasSound != NO_SOUND) { if (hasSound != NO_SOUND) {
runner->core->setAVStream(runner->core, &stream); runner->core->setAVStream(runner->core, &stream);
} }

View File

@ -398,7 +398,7 @@ bool retro_load_game(const struct retro_game_info* game) {
blip_set_rates(core->getAudioChannel(core, 0), core->frequency(core), 32768); blip_set_rates(core->getAudioChannel(core, 0), core->frequency(core), 32768);
blip_set_rates(core->getAudioChannel(core, 1), core->frequency(core), 32768); blip_set_rates(core->getAudioChannel(core, 1), core->frequency(core), 32768);
core->setRumble(core, &rumble); core->setPeripheral(core, mPERIPH_RUMBLE, &rumble);
savedata = anonymousMemoryMap(SIZE_CART_FLASH1M); savedata = anonymousMemoryMap(SIZE_CART_FLASH1M);
struct VFile* save = VFileFromMemory(savedata, SIZE_CART_FLASH1M); struct VFile* save = VFileFromMemory(savedata, SIZE_CART_FLASH1M);

View File

@ -203,11 +203,11 @@ void mPSP2Setup(struct mGUIRunner* runner) {
rotation.d.readTiltX = _readTiltX; rotation.d.readTiltX = _readTiltX;
rotation.d.readTiltY = _readTiltY; rotation.d.readTiltY = _readTiltY;
rotation.d.readGyroZ = _readGyroZ; rotation.d.readGyroZ = _readGyroZ;
runner->core->setRotation(runner->core, &rotation.d); runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation.d);
rumble.d.setRumble = _setRumble; rumble.d.setRumble = _setRumble;
CircleBufferInit(&rumble.history, RUMBLE_PWM); CircleBufferInit(&rumble.history, RUMBLE_PWM);
runner->core->setRumble(runner->core, &rumble.d); runner->core->setPeripheral(runner->core, mPERIPH_RUMBLE, &rumble.d);
frameLimiter = true; frameLimiter = true;
backdrop = vita2d_load_PNG_buffer(_binary_backdrop_png_start); backdrop = vita2d_load_PNG_buffer(_binary_backdrop_png_start);

View File

@ -87,8 +87,8 @@ GameController::GameController(QObject* parent)
m_threadContext.startCallback = [](mCoreThread* context) { m_threadContext.startCallback = [](mCoreThread* context) {
GameController* controller = static_cast<GameController*>(context->userData); GameController* controller = static_cast<GameController*>(context->userData);
context->core->setRotation(context->core, controller->m_inputController->rotationSource()); context->core->setPeripheral(context->core, mPERIPH_ROTATION, controller->m_inputController->rotationSource());
context->core->setRumble(context->core, controller->m_inputController->rumble()); context->core->setPeripheral(context->core, mPERIPH_RUMBLE, controller->m_inputController->rumble());
#ifdef M_CORE_GBA #ifdef M_CORE_GBA
GBA* gba = static_cast<GBA*>(context->core->board); GBA* gba = static_cast<GBA*>(context->core->board);

View File

@ -130,7 +130,7 @@ int main(int argc, char** argv) {
mSDLPlayerLoadConfig(&renderer.player, mCoreConfigGetInput(&renderer.core->config)); mSDLPlayerLoadConfig(&renderer.player, mCoreConfigGetInput(&renderer.core->config));
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
renderer.core->setRumble(renderer.core, &renderer.player.rumble.d); renderer.core->setPeripheral(renderer.core, mPERIPH_RUMBLE, &renderer.player.rumble.d);
#endif #endif
int ret; int ret;

View File

@ -641,8 +641,8 @@ void _guiPrepare(void) {
} }
void _setup(struct mGUIRunner* runner) { void _setup(struct mGUIRunner* runner) {
runner->core->setRotation(runner->core, &rotation); runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation);
runner->core->setRumble(runner->core, &rumble); runner->core->setPeripheral(runner->core, mPERIPH_RUMBLE, &rumble);
_mapKey(&runner->core->inputMap, GCN1_INPUT, PAD_BUTTON_A, GBA_KEY_A); _mapKey(&runner->core->inputMap, GCN1_INPUT, PAD_BUTTON_A, GBA_KEY_A);
_mapKey(&runner->core->inputMap, GCN1_INPUT, PAD_BUTTON_B, GBA_KEY_B); _mapKey(&runner->core->inputMap, GCN1_INPUT, PAD_BUTTON_B, GBA_KEY_B);