/* Color wire D W L V B G Y O R DB-9 pin 1 6 2 7 3 8 4 9 5 Sega port 0 4 1 6 2 - 3 5 + Color joy Y G O B R L F W D Sega joyA U A D 0 n n S Sega joyB U B D 1 L R C */ // define connection adapter joy to arduino #define MD_P0 14 // D #define MD_P1 16 // L #define MD_P2 17 // B #define MD_P3 18 // Y #define MD_P4 15 // W #define MD_P5 19 // O #define MD_P6 2 // V // define connection adapter arduino to sega joy on 74ls157 (3 buttons) #define MJ_S 10 // Start #define MJ_C 9 // C #define MJ_A 8 // A #define MJ_B 7 // B #define MJ_R 6 // Right #define MJ_L 5 // Left #define MJ_D 4 // Down #define MJ_U 3 // Up #define LED 13 boolean remap = false; int remap_cnt = 0; boolean keyUP; boolean keyDOWN; boolean keyLEFT; boolean keyRIGHT; boolean keyA; boolean keyB; boolean keyC; boolean keySTART; boolean keyX; boolean keyY; boolean keyZ; boolean keyMODE; //************************************************************ void readJoy() { digitalWrite(MD_P6, HIGH); //delay(2); // 2ms is minimum delay! delayMicroseconds(2500); // 2.5ms - for stability keyUP = !(digitalRead(MD_P0)); // U keyDOWN = !(digitalRead(MD_P1)); // D keyLEFT = !(digitalRead(MD_P2)); // L keyRIGHT = !(digitalRead(MD_P3)); // R keyB = !(digitalRead(MD_P4)); // B keyC = !(digitalRead(MD_P5)); // C digitalWrite(MD_P6, LOW); //delay(2); // 2ms is minimum delay! delayMicroseconds(2500); // 2.5ms - for stability keyUP = !(digitalRead(MD_P0)); // U keyDOWN = !(digitalRead(MD_P1)); // D keyA = !(digitalRead(MD_P4)); // A keySTART = !(digitalRead(MD_P5)); // S digitalWrite(MD_P6, HIGH); delayMicroseconds(2); digitalWrite(MD_P6, LOW); delayMicroseconds(2); digitalWrite(MD_P6, HIGH); delayMicroseconds(2); digitalWrite(MD_P6, LOW); // P0=P1=P2=P3=0 P4=A P5=S delayMicroseconds(2); digitalWrite(MD_P6, HIGH); delayMicroseconds(2); keyZ = !(digitalRead(MD_P0)); // Z keyY = !(digitalRead(MD_P1)); // Y keyX = !(digitalRead(MD_P2)); // X keyMODE = !(digitalRead(MD_P3)); // MODE keyB = !(digitalRead(MD_P4)); // B keyC = !(digitalRead(MD_P5)); // C digitalWrite(MD_P6, LOW); // P0=P1=P2=P3=1 P4=A P5=S delayMicroseconds(2); digitalWrite(MD_P6, HIGH); delayMicroseconds(2); digitalWrite(MD_P6, LOW); delayMicroseconds(2); } //************************************************************ void writeJoy() { if (!remap) // not remap { digitalWrite(MJ_S, !keySTART); // Start digitalWrite(MJ_C, !keyC); // C digitalWrite(MJ_A, !keyA); // A digitalWrite(MJ_B, !keyB); // B digitalWrite(MJ_R, !keyRIGHT); // Right digitalWrite(MJ_L, !keyLEFT); // Left digitalWrite(MJ_D, !keyDOWN); // Down digitalWrite(MJ_U, !keyUP); // Up } else // remapping ... { digitalWrite(MJ_S, !keySTART); // Start digitalWrite(MJ_C, !keyC); // C digitalWrite(MJ_A, !keyA); // A digitalWrite(MJ_B, !keyB); // B if (keyUP && !keyDOWN && !keyLEFT && !keyRIGHT) // U -> UR { digitalWrite(MJ_U, !true); // Up digitalWrite(MJ_D, !false); // Down digitalWrite(MJ_L, !false); // Left digitalWrite(MJ_R, !true); // Right } else if (!keyUP && !keyDOWN && !keyLEFT && keyRIGHT) // R -> RD { digitalWrite(MJ_U, !false); // Up digitalWrite(MJ_D, !true); // Down digitalWrite(MJ_L, !false); // Left digitalWrite(MJ_R, !true); // Right } else if (!keyUP && keyDOWN && !keyLEFT && !keyRIGHT) // D -> DL { digitalWrite(MJ_U, !false); // Up digitalWrite(MJ_D, !true); // Down digitalWrite(MJ_L, !true); // Left digitalWrite(MJ_R, !false); // Right } else if (!keyUP && !keyDOWN && keyLEFT && !keyRIGHT) // L -> LU { digitalWrite(MJ_U, !true); // Up digitalWrite(MJ_D, !false); // Down digitalWrite(MJ_L, !true); // Left digitalWrite(MJ_R, !false); // Right } else if (keyUP && !keyDOWN && keyLEFT && !keyRIGHT) // LU -> U { digitalWrite(MJ_U, !true); // Up digitalWrite(MJ_D, !false); // Down digitalWrite(MJ_L, !false); // Left digitalWrite(MJ_R, !false); // Right } else if (keyUP && !keyDOWN && !keyLEFT && keyRIGHT) // UR -> R { digitalWrite(MJ_U, !false); // Up digitalWrite(MJ_D, !false); // Down digitalWrite(MJ_L, !false); // Left digitalWrite(MJ_R, !true); // Right } else if (!keyUP && keyDOWN && !keyLEFT && keyRIGHT) // RD -> D { digitalWrite(MJ_U, !false); // Up digitalWrite(MJ_D, !true); // Down digitalWrite(MJ_L, !false); // Left digitalWrite(MJ_R, !false); // Right } else if (!keyUP && keyDOWN && keyLEFT && !keyRIGHT) // DL -> L { digitalWrite(MJ_U, !false); // Up digitalWrite(MJ_D, !false); // Down digitalWrite(MJ_L, !true); // Left digitalWrite(MJ_R, !false); // Right } else // send through ... { digitalWrite(MJ_R, !keyRIGHT); // Right digitalWrite(MJ_L, !keyLEFT); // Left digitalWrite(MJ_D, !keyDOWN); // Down digitalWrite(MJ_U, !keyUP); // Up } // end if of remap } } //************************************************************ void keyDebug() { Serial.print(keyUP); Serial.print(" "); Serial.print(keyDOWN); Serial.print(" "); Serial.print(keyLEFT); Serial.print(" "); Serial.print(keyRIGHT); Serial.print(" "); Serial.print(keyA); Serial.print(" "); Serial.print(keyB); Serial.print(" "); Serial.print(keyC); Serial.print(" "); Serial.print(keySTART); Serial.print(" || "); Serial.print(keyX); Serial.print(" "); Serial.print(keyY); Serial.print(" "); Serial.print(keyZ); Serial.print(" "); Serial.print(keyMODE); Serial.println(""); } //************************************************************ void setup() { pinMode(MD_P0, INPUT_PULLUP); pinMode(MD_P1, INPUT_PULLUP); pinMode(MD_P2, INPUT_PULLUP); pinMode(MD_P3, INPUT_PULLUP); pinMode(MD_P4, INPUT_PULLUP); pinMode(MD_P5, INPUT_PULLUP); pinMode(MD_P6, OUTPUT); pinMode(MJ_S, OUTPUT); pinMode(MJ_C, OUTPUT); pinMode(MJ_A, OUTPUT); pinMode(MJ_B, OUTPUT); pinMode(MJ_R, OUTPUT); pinMode(MJ_L, OUTPUT); pinMode(MJ_D, OUTPUT); pinMode(MJ_U, OUTPUT); digitalWrite(MD_P0, HIGH); digitalWrite(MD_P1, HIGH); digitalWrite(MD_P2, HIGH); digitalWrite(MD_P3, HIGH); digitalWrite(MD_P4, HIGH); digitalWrite(MD_P5, HIGH); pinMode(LED, OUTPUT); //readJoy(); //writeJoy(); //Serial.begin(115200); } //************************************************************ void loop() { readJoy(); writeJoy(); //keyDebug(); delay(100); remap_cnt++; if (keyMODE && (remap_cnt > 100)) { remap = !remap; remap_cnt = 0; if (remap) digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); } }