commit 435a31bb31afceb79288b1e046a576cc973b187e Author: ArcadeHacker Date: Sun Jul 5 18:41:27 2015 +0200 Version 1.0 diff --git a/ArcadeHacker_CP1.ino b/ArcadeHacker_CP1.ino new file mode 100644 index 0000000..fed2c28 --- /dev/null +++ b/ArcadeHacker_CP1.ino @@ -0,0 +1,257 @@ +// CP1 Desuicider 1.0 by arcadehacker.blogspot.com +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(8, 9, 4, 5, 6, 7); + +// CPS1 C Board interface pins +#define PIN62 3 //Data. Connect programmer pin 3 to CNB pin 62 +#define PIN61 2 //Clock #2. Connect programmer pin 4 to CNB pin 61 +#define PIN42 11 //Clock #1. Connect programmer pin 5 to CNA pin 19 +#define PIN44 12 //Setup. Connect programmer pin 6 to CNA pin 20 + + +int lcd_key = 0; +int adc_key_in = 0; +int adc_key_prev = 0; + +#define btnRIGHT 0 +#define btnUP 1 +#define btnDOWN 2 +#define btnLEFT 3 +#define btnSELECT 4 +#define btnNONE 5 + +// delay amount +int time = 25; + +unsigned char bytes[][18] = { + +{ 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00 }, //Cadillacs & Dinosaurs CPS_B_21_QS2 +{ 0x00, 0x08, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x58, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x40 }, //Capcom World 2 CPS_B_21_BT6 +{ 0x00, 0x60, 0x02, 0xC0, 0x68, 0x01, 0x50, 0x58, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x40 }, //Captain Comando CPS_B_21_BT3 +{ 0x01, 0xEC, 0x0E, 0xC3, 0x68, 0x19, 0x50, 0x58, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00 }, //King of Dragons CPS_B_21_BT2 +{ 0x00, 0x70, 0x02, 0xC0, 0x60, 0x41, 0x10, 0x48, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0xA0, 0x01, 0x40 }, //Knights of the Round CPS_B_21_BT4 +{ 0x04, 0x0E, 0xE0, 0xB0, 0x2B, 0x01, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x83 }, //Muscle Bomber CPS_B_21_QS4 +{ 0x08, 0x0D, 0xE0, 0x70, 0x33, 0x01, 0x80, 0x5C, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x83 }, //Muscle Bomber Duo CPS_B_21_QS5 +{ 0x00, 0x04, 0xE0, 0x30, 0x0B, 0x40, 0x40, 0x2C, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x48, 0x00, 0x83 }, //Punisher CPS_B_21_QS3 +{ 0x00, 0x04, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00 }, //Quiz & Dragons CPS_B_21_BT7 +{ 0x04, 0x0E, 0xE0, 0xB0, 0x2B, 0x01, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x83 }, //Slammasters CPS_B_21_QS4 +{ 0x00, 0xEB, 0x26, 0xC1, 0x60, 0xC9, 0x11, 0xC8, 0x00, 0x00, 0x0A, 0x60, 0x00, 0x00, 0x00, 0xA0, 0x01, 0x42 }, //Three Wonders CPS_B_21_BT1 +{ 0x00, 0xEB, 0x26, 0xC1, 0x68, 0x49, 0x10, 0x48, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x40 }, //Varth (Japan) CPS_B_21_BT5 +{ 0x00, 0x0C, 0x00, 0xB0, 0x2A, 0x81, 0x40, 0x4C, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x88, 0x01, 0x00 } //Warriors of Fate CPS_B_21_QS1 + +}; + +char* GameList[] = + { + "Cadillacs & Din.", + "Capcom World 2 ", + "Captain Comando ", + "King of Dragons ", + "Knights of the R", + "Muscle Bomber", + "Muscle Bomb. Duo" + "Punisher ", + "Quiz & Dragons ", + "Slammasters ", + "Three Wonders ", + "Varth (Japan) ", + "Warriors of Fate", + }; + +unsigned char mask = 1; // Bit +unsigned char bits[8]; +int c = -1; + +void setup() { + + + pinMode(PIN42, OUTPUT); pinMode(PIN44, OUTPUT); + pinMode(PIN61, OUTPUT); pinMode(PIN62, OUTPUT); + + + digitalWrite(PIN42, LOW); + digitalWrite(PIN44, LOW); + + lcd.begin(16, 2); + lcd.setCursor(0,0); + lcd.print("CPS1 Desuicide"); + lcd.setCursor(0,1); + lcd.print("By ArcadeHacker"); + delay(2500); + lcd.setCursor(0,0); + lcd.print("Select a game: "); + lcd.setCursor(0,1); + lcd.print(" --press down-- "); + +} + +void PIN42CLK() +{ + digitalWrite(PIN42, HIGH); delay(time); + digitalWrite(PIN42, LOW); delay(time); +} + +void PIN61CLK() +{ + digitalWrite(PIN61, HIGH); delay(time); + digitalWrite(PIN61, LOW); delay(time); +} + +void program_unlock() +{ + digitalWrite(PIN44, HIGH); + delay(time); + delay(time); + delay(time); + PIN42CLK(); + PIN42CLK(); + PIN42CLK(); + PIN42CLK(); + + digitalWrite(PIN62, HIGH); + PIN61CLK(); + digitalWrite(PIN62, LOW); + PIN61CLK(); + digitalWrite(PIN62, HIGH); + PIN61CLK(); + digitalWrite(PIN62, LOW); + PIN61CLK(); + digitalWrite(PIN62, HIGH); + PIN61CLK(); + PIN61CLK(); + + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + PIN61CLK(); + + +} + +void ProgramCPS1(int prg) + { + int i; + int test; + lcd.clear(); + lcd.setCursor(0,1); + lcd.print("Unlocking... "); + + + program_unlock(); + + + lcd.setCursor(0,0); + lcd.print("Programming "); + lcd.setCursor(0,1); + lcd.print("CPS1... "); + + + for(i=0; i<18; i++) + { + for (int b = 7; b > -1; b--) { + + bits[b] = (bytes[prg][i] & (mask << b)) != 0; + printf("%d",bits[b]); + + if (bits[b] == 1) { + digitalWrite(PIN62, HIGH);} + else { + digitalWrite(PIN62, LOW);} + PIN61CLK(); + } + } + + lcd.clear(); + lcd.setCursor(0,1); + lcd.print("Done! "); + delay(1000); + +//pinMode(PIN42, INPUT); pinMode(PIN44, INPUT); +//pinMode(PIN61, INPUT); pinMode(PIN62, INPUT); + +while (analogRead (0) != 638) { + lcd.setCursor(0,0); lcd.print("--disconnect and "); lcd.setCursor(0,1); lcd.print("insert pcb--"); } + } + +int read_LCD_buttons() +{ + adc_key_in = analogRead(0); + delay(5); + int k = (analogRead(0) - adc_key_in); + if (5 < abs(k)) return btnNONE; + + if (adc_key_in > 1000) return btnNONE; + if (adc_key_in < 50) return btnRIGHT; + if (adc_key_in < 195) return btnUP; + if (adc_key_in < 380) return btnDOWN; + if (adc_key_in < 555) return btnLEFT; + if (adc_key_in < 790) return btnSELECT; + return btnNONE; +} + +void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ +{ + + adc_key_prev = lcd_key ; // Looking for changes + lcd_key = read_LCD_buttons(); // read the buttons + + if (adc_key_prev != lcd_key) + { + + lcd.setCursor(0,1); // move to the begining of the second line + + switch (lcd_key) // depending on which button was pushed, we perform an action + { + case btnRIGHT: + { + break; + } + case btnLEFT: + { + break; + } + case btnUP: + { + if (c != 0) {c--;} + lcd.print(GameList[c]); + break; + } + case btnDOWN: + { + if (c != sizeof(GameList)/sizeof(GameList[0])-1) {c++;} + lcd.print(GameList[c]); + break; + } + case btnSELECT: + { + if (c != -1) + { + ProgramCPS1(c); + lcd.setCursor(0,0); + lcd.print("Select a game: "); + lcd.setCursor(0,1); + lcd.print(GameList[c]); + } + break; + } + case btnNONE: + { + break; + } + } + } +} + + + +