From 9ae91778cf840bcac08430d9f51c5a6a82fd61e5 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 19:30:40 -0700 Subject: [PATCH 1/8] Remove trailing whitespace --- ArcadeHacker_CPS1.ino | 100 +++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index a395915..9dbf3b9 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -56,8 +56,8 @@ unsigned char bytes[][18] = { }; -char* GameList[] = - { +char* GameList[] = + { "Cadillacs & Din.", "Capcom World 2 ", "Captain Commando", @@ -72,18 +72,18 @@ char* GameList[] = "Varth (Japan) ", "Warriors of Fate" }; - -unsigned char mask = 1; // Bit + +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); + pinMode(PIN61, OUTPUT); pinMode(PIN62, OUTPUT); + - digitalWrite(PIN42, LOW); digitalWrite(PIN44, LOW); @@ -97,7 +97,7 @@ void setup() { lcd.print("Select a game: "); lcd.setCursor(0,1); lcd.print(" --press down-- "); - + } void PIN42CLK() @@ -121,8 +121,8 @@ void program_unlock() PIN42CLK(); PIN42CLK(); PIN42CLK(); - PIN42CLK(); - + PIN42CLK(); + digitalWrite(PIN62, HIGH); PIN61CLK(); digitalWrite(PIN62, LOW); @@ -134,7 +134,7 @@ void program_unlock() digitalWrite(PIN62, HIGH); PIN61CLK(); PIN61CLK(); - + PIN61CLK(); PIN61CLK(); PIN61CLK(); @@ -147,9 +147,9 @@ void program_unlock() PIN61CLK(); PIN61CLK(); PIN61CLK(); - - -} + + +} void ProgramCPS1(int prg) { @@ -157,60 +157,60 @@ void ProgramCPS1(int prg) int test; lcd.clear(); lcd.setCursor(0,1); - lcd.print("Unlocking... "); + lcd.print("Unlocking... "); + + + program_unlock(); - - program_unlock(); - - lcd.setCursor(0,0); + lcd.setCursor(0,0); lcd.print("Programming "); lcd.setCursor(0,1); - lcd.print("CPS1... "); + lcd.print("CPS1... "); + + + for(i=0; i<18; i++) + { + for (int b = 7; b > -1; b--) { - - 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(); + else { + digitalWrite(PIN62, LOW);} + PIN61CLK(); } } - + lcd.clear(); lcd.setCursor(0,1); - lcd.print("Done! "); - delay(1000); + lcd.print("Done! "); + delay(1000); //pinMode(PIN42, INPUT); pinMode(PIN44, INPUT); -//pinMode(PIN61, INPUT); pinMode(PIN62, INPUT); +//pinMode(PIN61, INPUT); pinMode(PIN62, INPUT); -while (analogRead (0) != 638) { +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); + 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; -} + 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 )----*/ { @@ -222,7 +222,7 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ { 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: @@ -239,7 +239,7 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ { if (c > 0) {c--;} else {c++;} } - + lcd.print(GameList[c]); break; } @@ -251,9 +251,9 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ } case btnSELECT: { - if (c != -1) + if (c != -1) { - ProgramCPS1(c); + ProgramCPS1(c); lcd.setCursor(0,0); lcd.print("Select a game: "); lcd.setCursor(0,1); From ffb41029514f2014955e532ea0d9fdb55482bd5c Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 19:39:17 -0700 Subject: [PATCH 2/8] Reformat with a consistent style. --- ArcadeHacker_CPS1.ino | 194 ++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 100 deletions(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index 9dbf3b9..0d1dd15 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -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 @@ -53,7 +52,6 @@ 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[] = @@ -77,15 +75,13 @@ unsigned char mask = 1; // Bit unsigned char bits[8]; int c = -1; -void setup() { - - +void setup() +{ pinMode(PIN42, OUTPUT); pinMode(PIN44, 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); @@ -97,104 +93,108 @@ void setup() { 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); + 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; + int test; lcd.clear(); lcd.setCursor(0,1); lcd.print("Unlocking... "); + program_unlock(); - program_unlock(); - - - lcd.setCursor(0,0); - lcd.print("Programming "); - lcd.setCursor(0,1); - lcd.print("CPS1... "); - + 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]); + 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(); - } - } + if (bits[b] == 1) + { + digitalWrite(PIN62, HIGH); + } + else + { + digitalWrite(PIN62, LOW); + } + PIN61CLK(); + } + } - lcd.clear(); - lcd.setCursor(0,1); - lcd.print("Done! "); - delay(1000); + lcd.clear(); + lcd.setCursor(0,1); + lcd.print("Done! "); + delay(1000); -//pinMode(PIN42, INPUT); pinMode(PIN44, INPUT); -//pinMode(PIN61, INPUT); pinMode(PIN62, INPUT); + //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--"); } - } + while (analogRead (0) != 638) + { + lcd.setCursor(0,0); + lcd.print("--disconnect and "); + lcd.setCursor(0,1); + lcd.print("insert pcb--"); + } +} int read_LCD_buttons() { @@ -214,13 +214,11 @@ int read_LCD_buttons() 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 @@ -235,30 +233,30 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ } case btnUP: { - if (c !=0) + if (c !=0) { - if (c > 0) {c--;} else {c++;} + if (c > 0) c--; else c++; } - lcd.print(GameList[c]); - break; + lcd.print(GameList[c]); + break; } case btnDOWN: { - if (c != sizeof(GameList)/sizeof(GameList[0])-1) {c++;} - lcd.print(GameList[c]); + 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]); - } + 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: @@ -268,7 +266,3 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ } } } - - - - From a3f5f4d7c6f3f626471cc18edbc6fce0708992e2 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 21:19:38 -0700 Subject: [PATCH 3/8] Calculate button values based on the schematic. The buttons switch in resistors forming a voltage divider. --- ArcadeHacker_CPS1.ino | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index 0d1dd15..141b702 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -204,11 +204,11 @@ int read_LCD_buttons() 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; + 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; } From 048a34f827d3dead8d5a8f7e0a1b32388488b109 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 21:20:27 -0700 Subject: [PATCH 4/8] Remove empty case statements for button handling. --- ArcadeHacker_CPS1.ino | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index 141b702..f8b83b0 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -223,14 +223,6 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ switch (lcd_key) // depending on which button was pushed, we perform an action { - case btnRIGHT: - { - break; - } - case btnLEFT: - { - break; - } case btnUP: { if (c !=0) @@ -259,10 +251,6 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ } break; } - case btnNONE: - { - break; - } } } } From 807868c0c050e66b8f112d8a006eadfdc7ed7810 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 21:22:06 -0700 Subject: [PATCH 5/8] Fix compiler warnings. --- ArcadeHacker_CPS1.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index f8b83b0..d81873a 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -54,7 +54,7 @@ unsigned char bytes[][18] = { { 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 ", @@ -147,7 +147,6 @@ void program_unlock() void ProgramCPS1(int prg) { int i; - int test; lcd.clear(); lcd.setCursor(0,1); lcd.print("Unlocking... "); From 62b82c7dd4c8f2f806d116217bbc039b93877889 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 21:24:52 -0700 Subject: [PATCH 6/8] Wait for select press instead of precise analog value. --- ArcadeHacker_CPS1.ino | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index d81873a..b0d2ded 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -95,6 +95,22 @@ void setup() 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); @@ -186,7 +202,7 @@ void ProgramCPS1(int prg) //pinMode(PIN42, INPUT); pinMode(PIN44, INPUT); //pinMode(PIN61, INPUT); pinMode(PIN62, INPUT); - while (analogRead (0) != 638) + while (read_LCD_buttons() != btnSELECT) { lcd.setCursor(0,0); lcd.print("--disconnect and "); @@ -195,22 +211,6 @@ void ProgramCPS1(int prg) } } -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 loop() /*----( LOOP: RUNS CONSTANTLY )----*/ { adc_key_prev = lcd_key ; // Looking for changes From 64c5c8e0c70f76025d01b5ceb33ec0f4f8fc2ece Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 21:29:34 -0700 Subject: [PATCH 7/8] Remove printf statement. I assume this is leftover from debugging. --- ArcadeHacker_CPS1.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index b0d2ded..5c4b45d 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -180,7 +180,6 @@ void ProgramCPS1(int prg) for (int b = 7; b > -1; b--) { bits[b] = (bytes[prg][i] & (mask << b)) != 0; - printf("%d",bits[b]); if (bits[b] == 1) { From 0a55f50770d83cec8bd38ab90d6f7b65756622d9 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 4 Jun 2020 22:31:37 -0700 Subject: [PATCH 8/8] Simplify game selection logic. --- ArcadeHacker_CPS1.ino | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/ArcadeHacker_CPS1.ino b/ArcadeHacker_CPS1.ino index 5c4b45d..f235cb8 100644 --- a/ArcadeHacker_CPS1.ino +++ b/ArcadeHacker_CPS1.ino @@ -73,7 +73,7 @@ char const* GameList[] = unsigned char mask = 1; // Bit unsigned char bits[8]; -int c = -1; +int current_game = -1; void setup() { @@ -223,29 +223,35 @@ void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ { case btnUP: { - if (c !=0) + current_game--; + if (current_game < 0) { - if (c > 0) c--; else c++; + current_game = 0; } - lcd.print(GameList[c]); + 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) + if (current_game != -1) { - ProgramCPS1(c); + ProgramCPS1(current_game); lcd.setCursor(0,0); lcd.print("Select a game: "); lcd.setCursor(0,1); - lcd.print(GameList[c]); + lcd.print(GameList[current_game]); } break; }