Adaptateur de manette pour ; - Master system - Megadrive - Saturn - Dreamcast - Nes - Snes - N64 - PS1 - PS2
Dependencies: mbed mbed-MapleMini USBDevice_STM32F103 USBJoystick
Diff: sega.cpp
- Revision:
- 0:0ce3bda826e8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sega.cpp Sun May 26 20:50:21 2019 +0000
@@ -0,0 +1,426 @@
+#include "MapleMini.h"
+#include "mbed.h"
+#include "nintendo.h"
+
+int *SegaMasterGenesisSaturn()
+{ // AUTRE SATURN SATURN 3D
+ USB2.input(); // UP DATA 1 0v DATA 1 0v
+ USB3.input(); // DOWN DATA 0 0v DATA 0 5v
+ USB4.input(); // LEFT SELECT0 SELECT
+ USB5.input(); // RIGHT DATA 3 5v DATA 3 0v
+ USB6.input(); // B DATA 2 5v DATA 2 0v
+ USB7.output(); // SELECT SELECT1 REQ
+ USB8.input(); // C -- ACK
+
+ USB2.mode(PullUp);
+ USB3.mode(PullUp);
+ USB4.mode(PullUp);
+ USB5.mode(PullUp);
+ USB6.mode(PullUp);
+ USB8.mode(PullUp);
+
+ // Flag des boutton
+ const int UP = 1;
+ const int DOWN = 2;
+ const int LEFT = 4;
+ const int RIGHT = 8;
+ const int X = 16;
+ const int Z = 32;
+ const int C = 64;
+ const int B = 128;
+ const int Y = 256;
+ const int A = 512;
+ const int START = 2048;
+ const int GND = 0;
+ const int MODE = 8192;
+
+ // Tableau avec les pin et leur valeur
+ // pin, Master System, 3 btn select 0V, 3 btn select 5V, 6 btn........
+/* int buttonMap[6][11] = {
+ //SMS SMD - SMD6 - - - - - - -
+ //0V 0V 5V 0 1 2 3 4 5 6 7
+ {UP, UP, UP, UP, UP, UP, UP, GND, Z, 0, 0}, //USB2
+ {DOWN, DOWN, DOWN, DOWN, DOWN, DOWN, DOWN, GND, Y, 0, 0}, //USB3
+ {LEFT, GND, LEFT, GND, LEFT, GND, LEFT, 0, X, 0, 0}, //USB4
+ {RIGHT, GND, RIGHT, GND, RIGHT, GND, RIGHT, 0, MODE, 0, 0}, //USB5
+ {B, A, B, A, B, A, B, 0, 0, 0, 0}, //USB6
+ {C, START, C, START, C, START, C, 0, 0, 0, 0} //USB8
+ };
+
+ USB2 DATA 1
+ USB3 DATA 0
+ USB4 SELECT0 SELECT
+ USB5 DATA 3
+ USB6 DATA 2
+ USB7 SELECT1 REQ
+ USB8 ACK
+
+ */
+
+ int buttons = 0;
+ int analog_x = 0;
+ int analog_y = 0;
+ int analog_l = -128;
+ int analog_r = -128;
+
+ int controller = 0; // 0 master system, 3 btn megadrive, 6 btn megadrive
+ // 4 saturn, 5 saturn 3d
+ int controllerOld = 0;
+
+
+ USB7 = 0;
+ wait_us(1700);
+ for (int i = 0; i < 8; i++)
+ {
+ if (i % 2 == 0) //nombre pair
+ {
+ USB7 = 0;
+ wait_us(20);
+ if (i == 2 && !USB4 && !USB5)
+ {
+ controller = 3; // Magadrive
+ }
+ if (i == 4 && !USB2 && !USB3)
+ {
+ controller = 6; // Megadrive 6 btn
+ }
+ }
+ else //nombre impair
+ {
+ USB7 = 1;
+ wait_us(20);
+ if (i == 7 && !USB2 && !USB3 && USB6) // && USB5 && USB6)
+ {
+ controller = 4; // Saturn
+ break;
+ }
+ if (i == 7 && !USB2 && USB3 && !USB6) // && !USB5 && !USB6)
+ {
+ controller = 5; // Saturn 3D
+ break;
+ }
+ if (i == 5 && controller == 6 && controllerOld == 0 && !USB5) // Utile ou pas utile ????
+ {
+ controller = 3; // Magadrive
+ }
+ }
+ }
+
+ switch (controller) {
+ case 0: // Master system
+ // Lecture des boutons
+ if(!USB2) buttons |= UP;
+ if(!USB3) buttons |= DOWN;
+ if(!USB4) buttons |= LEFT;
+ if(!USB5) buttons |= RIGHT;
+ if(!USB6) buttons |= B;
+ if(!USB8) buttons |= C;
+
+ //buttons |= 16384;
+ break;
+ case 3: // Megadrive 3 btns
+ USB7 = 0;
+ wait_us(1700);
+ if(!USB2) buttons |= UP;
+ if(!USB3) buttons |= DOWN;
+ // if(!USB4) buttons |= GND;
+ // if(!USB5) buttons |= GND;
+ if(!USB6) buttons |= A;
+ if(!USB8) buttons |= START;
+ USB7 = 1;
+ wait_us(20);
+ if(!USB2) buttons |= UP;
+ if(!USB3) buttons |= DOWN;
+ if(!USB4) buttons |= LEFT;
+ if(!USB5) buttons |= RIGHT;
+ if(!USB6) buttons |= B;
+ if(!USB8) buttons |= C;
+
+ //buttons |= 32768;
+ //getMegadrive3Buttons();
+ //return controller;
+ break;
+ case 4: // Saturn
+ //buttons = 2;
+ // Lecture des boutons
+ USB4.output();
+
+ USB4 = 1;
+ USB7 = 1;
+ wait_us(100);
+
+ USB4 = 0;
+ USB7 = 1;
+ wait_us(30);
+
+ if(!USB5) buttons |= RIGHT;
+ if(!USB6) buttons |= LEFT;
+ if(!USB2) buttons |= DOWN;
+ if(!USB3) buttons |= UP;
+
+ USB4 = 1;
+ USB7 = 0;
+ wait_us(30);
+
+ if(!USB5) buttons |= START;
+ if(!USB6) buttons |= A;
+ if(!USB2) buttons |= C;
+ if(!USB3) buttons |= B;
+
+ USB4 = 0;
+ USB7 = 0;
+ wait_us(30);
+
+ if(!USB5) analog_r = 127; // 8192
+ if(!USB6) buttons |= X;
+ if(!USB2) buttons |= Y;
+ if(!USB3) buttons |= Z;
+
+ USB4 = 1;
+ USB7 = 1;
+ wait_us(30);
+
+ if(!USB5) analog_l = 127; // 4096
+
+ //buttons |= 131072;
+
+ break;
+ case 5: // Saturn 3D
+ //buttons = 4;
+ int bite = 0;
+ bool analog = false;
+
+ USB4.output();
+
+ USB4 = 0;
+ wait_us(50);
+ USB7 = 0;
+
+ for (int i = 0; i <= 100; i++) {
+ if(!USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog = true;
+
+ USB7 = 1;
+
+ for (int i = 0; i <= 100; i++) {
+ if(USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) bite |= 1;
+ if(USB2) bite |= 2;
+ if(USB6) bite |= 4;
+ if(USB5) bite |= 8;
+
+ USB7 = 0;
+
+ for (int i = 0; i <= 100; i++) {
+ if(!USB8) break;
+ wait_us(5);
+ }
+
+ if(!USB3) buttons |= UP;
+ if(!USB2) buttons |= DOWN;
+ if(!USB6) buttons |= LEFT;
+ if(!USB5) buttons |= RIGHT;
+
+ USB7 = 1;
+
+ for (int i = 0; i <= 100; i++) {
+ if(USB8) break;
+ wait_us(5);
+ }
+
+ if(!USB3) buttons |= B;
+ if(!USB2) buttons |= C;
+ if(!USB6) buttons |= A;
+ if(!USB5) buttons |= START;
+
+ USB7 = 0;
+
+ for (int i = 0; i <= 100; i++) {
+ if(!USB8) break;
+ wait_us(5);
+ }
+
+ if(!USB3) buttons |= Z;
+ if(!USB2) buttons |= Y;
+ if(!USB6) buttons |= X;
+ if(!USB5) analog_r = 127;
+
+ USB7 = 1;
+
+ for (int i = 0; i <= 100; i++) {
+ if(USB8) break;
+ wait_us(5);
+ }
+
+ /*if(!USB3) buttons |= 4096;
+ if(!USB2) buttons |= 8192;
+ if(!USB6) buttons |= 16384;*/
+ if(!USB5) analog_l = 127;
+
+ if(bite == 6 && analog){
+
+ analog_l = 0;
+ analog_r = 0;
+
+ USB7 = 0;
+
+ for (int i = 0; i <= 100; i++) {
+ if(!USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_x |= 16;
+ if(USB2) analog_x |= 32;
+ if(USB6) analog_x |= 64;
+ if(USB5) analog_x |= 128;
+
+ USB7 = 1;
+
+ for (int i = 0; i <= 100; i++) {
+ if(USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_x |= 1;
+ if(USB2) analog_x |= 2;
+ if(USB6) analog_x |= 4;
+ if(USB5) analog_x |= 8;
+
+ USB7 = 0;
+
+ for (int i = 0; i <= 100; i++) {
+ if(!USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_y |= 16;
+ if(USB2) analog_y |= 32;
+ if(USB6) analog_y |= 64;
+ if(USB5) analog_y |= 128;
+
+ USB7 = 1;
+
+ for (int i = 0; i <= 100; i++) {
+ if(USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_y |= 1;
+ if(USB2) analog_y |= 2;
+ if(USB6) analog_y |= 4;
+ if(USB5) analog_y |= 8;
+
+ USB7 = 0;
+
+ for (int i = 0; i <= 100; i++) {
+ if(!USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_r |= 16;
+ if(USB2) analog_r |= 32;
+ if(USB6) analog_r |= 64;
+ if(USB5) analog_r |= 128;
+
+ USB7 = 1;
+
+ for (int i = 0; i <= 100; i++) {
+ if(USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_r |= 1;
+ if(USB2) analog_r |= 2;
+ if(USB6) analog_r |= 4;
+ if(USB5) analog_r |= 8;
+
+ USB7 = 0;
+
+ for (int i = 0; i <= 100; i++) {
+ if(!USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_l |= 16;
+ if(USB2) analog_l |= 32;
+ if(USB6) analog_l |= 64;
+ if(USB5) analog_l |= 128;
+
+ USB7 = 1;
+
+ for (int i = 0; i <= 100; i++) {
+ if(USB8) break;
+ wait_us(5);
+ }
+
+ if(USB3) analog_l |= 1;
+ if(USB2) analog_l |= 2;
+ if(USB6) analog_l |= 4;
+ if(USB5) analog_l |= 8;
+
+ analog_x = analog_x - 128;
+ analog_y = analog_y - 128;
+ analog_l = analog_l - 128;
+ analog_r = analog_r - 128;
+
+ }
+
+ //buttons |= 262144;
+
+ break;
+ case 6: // Megadrive 6 btns
+ USB7 = 0;
+ wait_us(1700);
+
+ USB7 = 1;
+ wait_us(20);
+
+ USB7 = 0;
+ wait_us(20);
+ if(!USB2) buttons |= UP;
+ if(!USB3) buttons |= DOWN;
+ // if(!USB4) buttons |= GND;
+ // if(!USB5) buttons |= GND;
+ if(!USB6) buttons |= A;
+ if(!USB8) buttons |= START;
+ USB7 = 1;
+ wait_us(20);
+ if(!USB2) buttons |= UP;
+ if(!USB3) buttons |= DOWN;
+ if(!USB4) buttons |= LEFT;
+ if(!USB5) buttons |= RIGHT;
+ if(!USB6) buttons |= B;
+ if(!USB8) buttons |= C;
+ USB7 = 0;
+ wait_us(20);
+ // if(!USB2) buttons |= GND;
+ // if(!USB3) buttons |= GND;
+ USB7 = 1;
+ wait_us(20);
+ if(!USB2) buttons |= Z;
+ if(!USB3) buttons |= Y;
+ if(!USB4) buttons |= X;
+ if(!USB5) buttons |= MODE;
+
+ //buttons |= 65536; // 15
+ //getMegadrive6Buttons();
+ //return controller;
+ break;
+ }
+
+ controllerOld = controller;
+ int array[] = {analog_r, analog_l, analog_x, analog_y, buttons, 0};
+ return array;
+}
+
+int *SegaDreamcast()
+{
+ int array[] = {0, 0, 0, 0, 0, 0};
+ return array;
+}
\ No newline at end of file
fabien cruz