Skip to content

Commit 62498f8

Browse files
committed
genesis example
1 parent a1eb7a9 commit 62498f8

File tree

3 files changed

+97
-15
lines changed

3 files changed

+97
-15
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <USBXBox360.h>
2+
#include <GameControllers.h>
3+
4+
// NB: connect A10 to TX, A9 to RX
5+
6+
GenesisController gen(PA0, PA1, PA2, PA3, PA4, PA5, PA6);
7+
USBXBox360 XBox360;
8+
GameControllerData_t data;
9+
10+
#define XBOX_A 13
11+
#define XBOX_B 14
12+
#define XBOX_X 15
13+
#define XBOX_Y 16
14+
#define XBOX_DUP 1
15+
#define XBOX_DDOWN 2
16+
#define XBOX_DLEFT 3
17+
#define XBOX_DRIGHT 4
18+
#define XBOX_START 5
19+
#define XBOX_LSHOULDER 9
20+
#define XBOX_RSHOULDER 10
21+
#define XBOX_GUIDE 11
22+
23+
const uint16_t remap_retroarch[16] = {
24+
XBOX_B, // A
25+
XBOX_A, // B
26+
XBOX_X, // C
27+
XBOX_LSHOULDER, // X
28+
29+
XBOX_Y, // Y
30+
XBOX_RSHOULDER, // Z
31+
XBOX_START, // START
32+
XBOX_GUIDE, // MODE
33+
34+
XBOX_DLEFT, // LEFT
35+
XBOX_DRIGHT, // RIGHT
36+
XBOX_DDOWN, // DOWN
37+
XBOX_DUP, // UP
38+
39+
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
40+
};
41+
42+
const uint16_t* remap = remap_retroarch;
43+
44+
inline int16_t range10u16s(uint16_t x) {
45+
return (((int32_t)(uint32_t)x - 512) * 32767 + 255) / 512;
46+
}
47+
48+
void setup() {
49+
gen.begin();
50+
USBComposite.setProductString("GenesisToXBox360");
51+
XBox360.begin();
52+
XBox360.setManualReportMode(true);
53+
}
54+
55+
void loop() {
56+
if (gen.read(&data)) {
57+
XBox360.X(range10u16s(data.joystickX));
58+
XBox360.Y(-range10u16s(data.joystickY));
59+
uint16_t mask = 1;
60+
for (int i = 0; i < 16; i++, mask <<= 1) {
61+
uint16_t xb = remap[i];
62+
if (xb != 0xFFFF)
63+
XBox360.button(xb, 0 != (data.buttons & mask));
64+
}
65+
XBox360.send();
66+
}
67+
}
68+

src/GameControllers.h

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,25 @@ const uint16_t gcmaskDLeft = 0x100;
3434
const uint16_t gcmaskDRight = 0x200;
3535
const uint16_t gcmaskDDown = 0x400;
3636
const uint16_t gcmaskDUp = 0x800;
37+
const uint16_t gcmaskZ = 0x1000;
38+
const uint16_t gcmaskR = 0x2000;
39+
const uint16_t gcmaskL = 0x4000;
40+
3741
const uint16_t gcmaskDPad = 0xF00;
3842
const uint16_t gcmaskStart = 0x10;
39-
const uint16_t buttonMaskC = 0x20;
40-
const uint16_t buttonMaskZ = 0x40;
41-
const uint16_t buttonMaskMode = 0x80;
43+
44+
const uint16_t segaMaskA = 1;
45+
const uint16_t segaMaskB = 2;
46+
const uint16_t segaMaskC = 4;
47+
const uint16_t segaMaskX = 8;
48+
const uint16_t segaMaskY = 16;
49+
const uint16_t segaMaskZ = 32;
50+
const uint16_t segaMaskStart = 64;
51+
const uint16_t segaMaskMode = 128;
52+
const uint16_t segaMaskLeft = gcmaskDLeft;
53+
const uint16_t segaMaskRight = gcmaskDRight;
54+
const uint16_t segaMaskDown = gcmaskDDown;
55+
const uint16_t segaMaskUp = gcmaskDUp;
4256

4357
typedef struct {
4458
uint16_t buttons;

src/genesis.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ bool GenesisController::read(GameControllerData_t* data) {
2525
data->cX = 512;
2626
data->cY = 512;
2727
if (state & SC_CTL_ON) {
28-
data->buttons = ( (state & SC_BTN_A) ? gcmaskA : 0 ) |
29-
( (state & SC_BTN_B) ? gcmaskB : 0 ) |
30-
( (state & SC_BTN_C) ? buttonMaskC : 0 ) |
31-
( (state & SC_BTN_X) ? gcmaskX : 0 ) |
32-
( (state & SC_BTN_Y) ? gcmaskY : 0 ) |
33-
( (state & SC_BTN_Z) ? buttonMaskZ : 0 ) |
34-
( (state & SC_BTN_MODE) ? buttonMaskMode : 0 ) |
35-
( (state & SC_BTN_START) ? gcmaskStart : 0);
28+
data->buttons = ( (state & SC_BTN_A) ? segaMaskA : 0 ) |
29+
( (state & SC_BTN_B) ? segaMaskB : 0 ) |
30+
( (state & SC_BTN_C) ? segaMaskC : 0 ) |
31+
( (state & SC_BTN_X) ? segaMaskX : 0 ) |
32+
( (state & SC_BTN_Y) ? segaMaskY : 0 ) |
33+
( (state & SC_BTN_Z) ? segaMaskZ : 0 ) |
34+
( (state & SC_BTN_MODE) ? segaMaskMode : 0 ) |
35+
( (state & SC_BTN_START) ? segaMaskStart : 0);
3636
if (dpadToJoystick) {
3737
if (state & SC_BTN_LEFT)
3838
data->joystickX = 0;
@@ -45,10 +45,10 @@ bool GenesisController::read(GameControllerData_t* data) {
4545
data->joystickY = 1023;
4646
}
4747
else {
48-
data->buttons |= ( (state & SC_BTN_UP) ? gcmaskDUp : 0 ) |
49-
( (state & SC_BTN_DOWN) ? gcmaskDUp : 0 ) |
50-
( (state & SC_BTN_LEFT) ? gcmaskDLeft : 0 ) |
51-
( (state & SC_BTN_RIGHT) ? gcmaskDRight : 0 );
48+
data->buttons |= ( (state & SC_BTN_UP) ? segaMaskUp : 0 ) |
49+
( (state & SC_BTN_DOWN) ? segaMaskDown : 0 ) |
50+
( (state & SC_BTN_LEFT) ? segaMaskLeft : 0 ) |
51+
( (state & SC_BTN_RIGHT) ? segaMaskRight : 0 );
5252
}
5353
return true;
5454
}

0 commit comments

Comments
 (0)