Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
276 changes: 131 additions & 145 deletions ArcadeHacker_CPS1.ino
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ int adc_key_prev = 0;
int time = 25;

unsigned char bytes[][18] = {

{ 0x03, 0xF3, 0xFF, 0x17, 0xC3, 0x3E, 0x0F, 0x9C, 0x00, 0x00, 0x7C, 0xC0, 0x00, 0x1F, 0x00, 0x28, 0x01, 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, 0x70, 0x02, 0xC0, 0x69, 0x01, 0x50, 0x58, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x40 }, //Captain Comando CPS_B_21_BT3
Expand All @@ -53,11 +52,10 @@ unsigned char bytes[][18] = {
{ 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, 0x50, 0x58, 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[] =
{
char const* GameList[] =
{
"Cadillacs & Din.",
"Capcom World 2 ",
"Captain Commando",
Expand All @@ -72,20 +70,18 @@ char* GameList[] =
"Varth (Japan) ",
"Warriors of Fate"
};

unsigned char mask = 1; // Bit
unsigned char bits[8];
int c = -1;

void setup() {

unsigned char mask = 1; // Bit
unsigned char bits[8];
int current_game = -1;

void setup()
{
pinMode(PIN42, OUTPUT); pinMode(PIN44, OUTPUT);
pinMode(PIN61, OUTPUT); pinMode(PIN62, OUTPUT);
pinMode(PIN61, OUTPUT); pinMode(PIN62, OUTPUT);


digitalWrite(PIN42, LOW);
digitalWrite(PIN44, LOW);
digitalWrite(PIN42, LOW);
digitalWrite(PIN44, LOW);

lcd.begin(16, 2);
lcd.setCursor(0,0);
Expand All @@ -97,178 +93,168 @@ void setup() {
lcd.print("Select a game: ");
lcd.setCursor(0,1);
lcd.print(" --press down-- ");

}

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 < 72) return btnRIGHT;
if (adc_key_in < 237) return btnUP;
if (adc_key_in < 417) return btnDOWN;
if (adc_key_in < 624) return btnLEFT;
if (adc_key_in < 883) return btnSELECT;
return btnNONE;
}

void PIN42CLK()
{
digitalWrite(PIN42, HIGH); delay(time);
digitalWrite(PIN42, LOW); delay(time);
digitalWrite(PIN42, HIGH); delay(time);
digitalWrite(PIN42, LOW); delay(time);
}

void PIN61CLK()
{
digitalWrite(PIN61, HIGH); delay(time);
digitalWrite(PIN61, LOW); delay(time);
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();


}
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;
{
int i;
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--"); }
}
lcd.print("Unlocking... ");

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;
}
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;

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 (read_LCD_buttons() != btnSELECT)
{
lcd.setCursor(0,0);
lcd.print("--disconnect and ");
lcd.setCursor(0,1);
lcd.print("insert pcb--");
}
}

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)
current_game--;
if (current_game < 0)
{
if (c > 0) {c--;} else {c++;}
current_game = 0;
}
lcd.print(GameList[c]);
break;

lcd.print(GameList[current_game]);
break;
}
case btnDOWN:
{
if (c != sizeof(GameList)/sizeof(GameList[0])-1) {c++;}
lcd.print(GameList[c]);
current_game++;
int max = sizeof(GameList) / sizeof(GameList[0]);
if (current_game > max - 1)
{
current_game = max - 1;
}
lcd.print(GameList[current_game]);
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:
{
if (current_game != -1)
{
ProgramCPS1(current_game);
lcd.setCursor(0,0);
lcd.print("Select a game: ");
lcd.setCursor(0,1);
lcd.print(GameList[current_game]);
}
break;
}
}
}
}