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