Jump to content
IGNORED

Flashback to ColecoVision controller


towmater

Recommended Posts

"They said it shouldn't be done"

 

My original controllers were trashed. So I repurposed the Flashback controllers.

 

There are just enough pins on an Atmega 168 to make one controller convertor, plus 10 3041 chips-thanks to Coleco's arcane wiring scheme, I couldn't just use a series of transistors - so at a minimum one could do this for about $30 if you already have an Arduino board to program the Atmega chip. (Assuming you didn't want to devote an Arduino board to this.)

 

So I would likely have been better off just sourcing some reasonably usable original controllers.

 

 

post-40446-0-10851300-1414257637_thumb.jpg

  • Like 1
Link to comment
Share on other sites

The current Arduino sketch: at this point I have not found enough 3041's to finish the keypad translation. I've found about 1-2 chips at every Fry's I've visited.

 

void setup() {

//flashback pins also include analog 0-3
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);//B DB-9 Pin 1
pinMode(3, INPUT_PULLUP);//D DB-9 Pin 4
pinMode(4, INPUT_PULLUP);//C DB-9 Pin 8
pinMode(5, INPUT_PULLUP); //E DB-9 Pin 9
//db9 pin3 to v++
//output to coleco:
pinMode(6, OUTPUT); //=Brown Coleco pin 1
pinMode(7, OUTPUT); //=Red Coleco pin 2
pinMode(8, OUTPUT); //=Orange Coleco pin 3
pinMode(9, OUTPUT); //=Yellow Coleco pin 4
pinMode(10, OUTPUT); //=Blue Coleco pin 6
pinMode(11, OUTPUT); //=Green Coleco pin 5
pinMode(12, OUTPUT); //=Grey Coleco pin 8
//defaults:
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
void loop() {
int A0;
int A1;
int A2;
int A3;
int D2;
int D3;
int D4;
int D5;
A0 = analogRead(0); //up DB-9 Pin 2 + 10k pulldown
A1 = analogRead(1); //down DB-9 Pin 5+ 10k pulldown
A2 = analogRead(2); //left DB-9 Pin 6+ 10k pulldown
A3 = analogRead(3); //right DB-9 Pin 7+ 10k pulldown
D2 = digitalRead(2); //B DB-9 Pin 1
D3 = digitalRead(3); //D DB-9 Pin 4
D4 = digitalRead(4); //C DB-9 Pin 8
D5 = digitalRead(5); //E DB-9 Pin 9
if (A0 > 500 && A2 == 0 && A3 == 0) {
digitalWrite(6, HIGH);
while (analogRead(0) > 500 && analogRead(2) == 0 && analogRead(3) == 0) //up and not LR
{ }
}
digitalWrite(6, LOW);
if (A1 > 500 && A2 == 0 && A3 == 0) {
digitalWrite(7, HIGH);
while (analogRead(1) > 500 && analogRead(2) == 0 && analogRead(3) == 0) //down and not LR
{ }
}
digitalWrite(7, LOW);
if (A2 > 500 && A1 == 0 && A0 == 0) {
digitalWrite(8, HIGH);
while (analogRead(2) > 500 && analogRead(1) == 0 && analogRead(0) == 0) //right
{ }
}
digitalWrite(8, LOW);
if (A3 > 500 && A1 == 0 && A0 == 0) {
digitalWrite(9, HIGH);
while (analogRead(3) > 500 && analogRead(1) == 0 && analogRead(0) == 0) //left
{ }
}
digitalWrite(9, LOW);
//diagonally
if (A0 > 500 && A2 > 500 && A3 == 0) {
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
while (analogRead(0) > 500 && analogRead(2) > 500) //up+left
{ }
}
digitalWrite(6, LOW);
digitalWrite(8, LOW);
if (A0 > 500 && A2 == 0 && A3 > 500) {
digitalWrite(6, HIGH);
digitalWrite(9, HIGH);
while (analogRead(0) > 500 && analogRead(3) > 500) //up+right
{ }
}
digitalWrite(6, LOW);
digitalWrite(9, LOW);
if (A1 > 500 && A2 > 500 && A3 == 0) {
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
while (analogRead(1) > 500 && analogRead(2) > 500) //down+left
{ }
}
digitalWrite(7, LOW);
digitalWrite(8, LOW);
if (A1 > 500 && A2 == 0 && A3 > 500) {
digitalWrite(7, HIGH);
digitalWrite(9, HIGH);
while (analogRead(1) > 500 && analogRead(3) > 500) //down+right
{ }
}
digitalWrite(7, LOW);
digitalWrite(9, LOW);
//triggers
if (A0 < 500 && A0 > 1 && D2 == 0) { //ltrigger
digitalWrite(10, HIGH);
while (analogRead(0) < 500 && analogRead(0) > 1 && digitalRead(2) == 0) //up and not LR
{ }
}
digitalWrite(10, LOW);
String diagnostic = "A0=";
diagnostic.concat(A0);
diagnostic.concat("\t");
diagnostic.concat("A1=");
diagnostic.concat(A1);
diagnostic.concat("\t");
diagnostic.concat("A2=");
diagnostic.concat(A2);
diagnostic.concat("\t");
diagnostic.concat("A3=");
diagnostic.concat(A3);
diagnostic.concat("\t");
diagnostic.concat("D2=");
diagnostic.concat(D2);
diagnostic.concat("\t");
diagnostic.concat("D3=");
diagnostic.concat(D3);
diagnostic.concat("\t");
diagnostic.concat("D4=");
diagnostic.concat(D4);
diagnostic.concat("\t");
diagnostic.concat("D5=");
diagnostic.concat(D5);
diagnostic.concat("\t");
Serial.print(diagnostic);
Serial.println("");
}
  • Like 1
Link to comment
Share on other sites

Where there's a will, there's a way! But like you said, some reasonable usable original controllers are easy enough to find and can be easily refurbished to working almost like new and seeing as you seem to have some skills... a shaft extension and ball knob mod will make the original controllers a dream to play with.

Link to comment
Share on other sites

Ya, I pretty much came to this conclusion some time ago when I saw the Atgames using 9 lines of communication while the original ColecoVision used 7. The logic of the keypad is all done via diodes in the controller whereas on the Atgames flashback part of the keyboard decoding is being done in the unit itself and not the controller. I made a interface cable using a Basic Stamp from Parallax, not very cost effective. So I just continue on modding any controller I get with microswitches :)

Link to comment
Share on other sites

Wait... so the Flashback controllers ARE NOT backwards compatible? That kinda kills it for me. I was planning to buy a CV Flashback because I read in the thread that they were backwards compatible. :-(

 

Correct they are not compatible and apparently they did not realize this until they were too far along in production to address it.

Link to comment
Share on other sites

Correct they are not compatible and apparently they did not realize this until they were too far along in production to address it.

I'm sorry, but I don't believe that for a second. From what I've read in another thread, the internals of the CV FB controllers are quite different from the original Coleco controllers, and this must have been a case of the designer(s) redesigning the controller electronics from scratch to cut costs as much as possible. They must have known from the beginning that their new controller wasn't going to be compatible with the original console. So whoever AtGames employee told Bill Loguidice that the controllers were backward compatible didn't know what he/she was talking about and simply put his/her foot in his/her mouth.

  • Like 1
Link to comment
Share on other sites

I think we knew the ColecoV

 

I'm sorry, but I don't believe that for a second. From what I've read in another thread, the internals of the CV FB controllers are quite different from the original Coleco controllers, and this must have been a case of the designer(s) redesigning the controller electronics from scratch to cut costs as much as possible. They must have known from the beginning that their new controller wasn't going to be compatible with the original console. So whoever AtGames employee told Bill Loguidice that the controllers were backward compatible didn't know what he/she was talking about and simply put his/her foot in his/her mouth.

 

This.

 

Intellivision: not sure what happened; ColecoVision: hardly a chance.

Edited by 5-11under
Link to comment
Share on other sites

Maybe they'll rectify this for version 2, if there is one....

Maaaaybe... I wonder how much this will hurt sales. Probably not a lot, but I know I'm out because of it. I'll just be hoping for a second version that's geared a little more toward hobbyists. Here's to hoping.

Link to comment
Share on other sites

I'm sorry, but I don't believe that for a second. From what I've read in another thread, the internals of the CV FB controllers are quite different from the original Coleco controllers, and this must have been a case of the designer(s) redesigning the controller electronics from scratch to cut costs as much as possible. They must have known from the beginning that their new controller wasn't going to be compatible with the original console. So whoever AtGames employee told Bill Loguidice that the controllers were backward compatible didn't know what he/she was talking about and simply put his/her foot in his/her mouth.

 

It was not an employee, it was the owner of the company who I personally know as a stand up individual. There was a miscommunication from the top (management) down to engineering on the two new Flashbacks, which was exasperated by the compressed timelines. The issue was literally discovered too late to do anything about it. There's no grand conspiracy there and the issue is supposed to be addressed if there are future versions. You might have a case for something being afoot (i.e., not believing me or the best possible source) if not for the fact that both the Atari and Sega products are fully cross compatible.

  • Like 2
Link to comment
Share on other sites

im sure that the extra chips can be done away with if you used a better micro controller such as a mega for example?

 

i haven't looked at the code in much detail but i want to attempt something similar, basically a jaguar controller converter. obviously this will need a better controller due to the amount of pins needed for the jaguar controller

Link to comment
Share on other sites

im sure that the extra chips can be done away with if you used a better micro controller such as a mega for example?

 

i haven't looked at the code in much detail but i want to attempt something similar, basically a jaguar controller converter. obviously this will need a better controller due to the amount of pins needed for the jaguar controller

But the isolators are in the adapter because Coleco didn't provide a common ground. There isn't much that a microcontroller alone can do with that, and npn transistor switching requires the ground as well, in any case $1 isolators chips are a good way to protect the Coleco's io ic's.

Link to comment
Share on other sites

  • 2 years later...

 

The current Arduino sketch: at this point I have not found enough 3041's to finish the keypad translation. I've found about 1-2 chips at every Fry's I've visited.

 

void setup() {

//flashback pins also include analog 0-3
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);//B DB-9 Pin 1
pinMode(3, INPUT_PULLUP);//D DB-9 Pin 4
pinMode(4, INPUT_PULLUP);//C DB-9 Pin 8
pinMode(5, INPUT_PULLUP); //E DB-9 Pin 9
//db9 pin3 to v++
//output to coleco:
pinMode(6, OUTPUT); //=Brown Coleco pin 1
pinMode(7, OUTPUT); //=Red Coleco pin 2
pinMode(8, OUTPUT); //=Orange Coleco pin 3
pinMode(9, OUTPUT); //=Yellow Coleco pin 4
pinMode(10, OUTPUT); //=Blue Coleco pin 6
pinMode(11, OUTPUT); //=Green Coleco pin 5
pinMode(12, OUTPUT); //=Grey Coleco pin 8
//defaults:
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
void loop() {
int A0;
int A1;
int A2;
int A3;
int D2;
int D3;
int D4;
int D5;
A0 = analogRead(0); //up DB-9 Pin 2 + 10k pulldown
A1 = analogRead(1); //down DB-9 Pin 5+ 10k pulldown
A2 = analogRead(2); //left DB-9 Pin 6+ 10k pulldown
A3 = analogRead(3); //right DB-9 Pin 7+ 10k pulldown
D2 = digitalRead(2); //B DB-9 Pin 1
D3 = digitalRead(3); //D DB-9 Pin 4
D4 = digitalRead(4); //C DB-9 Pin 8
D5 = digitalRead(5); //E DB-9 Pin 9
if (A0 > 500 && A2 == 0 && A3 == 0) {
digitalWrite(6, HIGH);
while (analogRead(0) > 500 && analogRead(2) == 0 && analogRead(3) == 0) //up and not LR
{ }
}
digitalWrite(6, LOW);
if (A1 > 500 && A2 == 0 && A3 == 0) {
digitalWrite(7, HIGH);
while (analogRead(1) > 500 && analogRead(2) == 0 && analogRead(3) == 0) //down and not LR
{ }
}
digitalWrite(7, LOW);
if (A2 > 500 && A1 == 0 && A0 == 0) {
digitalWrite(8, HIGH);
while (analogRead(2) > 500 && analogRead(1) == 0 && analogRead(0) == 0) //right
{ }
}
digitalWrite(8, LOW);
if (A3 > 500 && A1 == 0 && A0 == 0) {
digitalWrite(9, HIGH);
while (analogRead(3) > 500 && analogRead(1) == 0 && analogRead(0) == 0) //left
{ }
}
digitalWrite(9, LOW);
//diagonally
if (A0 > 500 && A2 > 500 && A3 == 0) {
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
while (analogRead(0) > 500 && analogRead(2) > 500) //up+left
{ }
}
digitalWrite(6, LOW);
digitalWrite(8, LOW);
if (A0 > 500 && A2 == 0 && A3 > 500) {
digitalWrite(6, HIGH);
digitalWrite(9, HIGH);
while (analogRead(0) > 500 && analogRead(3) > 500) //up+right
{ }
}
digitalWrite(6, LOW);
digitalWrite(9, LOW);
if (A1 > 500 && A2 > 500 && A3 == 0) {
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
while (analogRead(1) > 500 && analogRead(2) > 500) //down+left
{ }
}
digitalWrite(7, LOW);
digitalWrite(8, LOW);
if (A1 > 500 && A2 == 0 && A3 > 500) {
digitalWrite(7, HIGH);
digitalWrite(9, HIGH);
while (analogRead(1) > 500 && analogRead(3) > 500) //down+right
{ }
}
digitalWrite(7, LOW);
digitalWrite(9, LOW);
//triggers
if (A0 < 500 && A0 > 1 && D2 == 0) { //ltrigger
digitalWrite(10, HIGH);
while (analogRead(0) < 500 && analogRead(0) > 1 && digitalRead(2) == 0) //up and not LR
{ }
}
digitalWrite(10, LOW);
String diagnostic = "A0=";
diagnostic.concat(A0);
diagnostic.concat("\t");
diagnostic.concat("A1=");
diagnostic.concat(A1);
diagnostic.concat("\t");
diagnostic.concat("A2=");
diagnostic.concat(A2);
diagnostic.concat("\t");
diagnostic.concat("A3=");
diagnostic.concat(A3);
diagnostic.concat("\t");
diagnostic.concat("D2=");
diagnostic.concat(D2);
diagnostic.concat("\t");
diagnostic.concat("D3=");
diagnostic.concat(D3);
diagnostic.concat("\t");
diagnostic.concat("D4=");
diagnostic.concat(D4);
diagnostic.concat("\t");
diagnostic.concat("D5=");
diagnostic.concat(D5);
diagnostic.concat("\t");
Serial.print(diagnostic);
Serial.println("");
}

 

Ok i have come back to this after all this time because i want to do a similar thing and i don't have a descent working coleco controller, i have studied the above program and i think there is an issue, ( by this time you have probably discovered this yourself however )

it looks like the movement and a button does work, however if your pushing right for instance your stuck in the while loop and the program never gets to the part of the program that checks if a fire button is pressed.

 

it would be better to read all the buttons into variables and then apply the relevant switching at the bottom of the loop so that everything can be accounted for instead of dealing with specific button presses straight away which stops any future code from being run.

 

also something to note, analogue pins can act as digital pins if they are set as such, for example digitalWrite(A0,HIGH) / digitalRead(A0) works fine...

 

 

my plan is to do with with the jaguar controller to convert it into colecovision so no hardware modifications are required (which i have attempted before and works)

 

so save doing research and such i am asking if you could provide some details of how you connected up those opto isolator chips, i think i can get the general idea from the picture but would just like ot be sure.

 

 

obviously i cant just use a standard atmega microcontroller due to the available pins so would probably get a cheapo arduino mega clone from ebay / china to run this when i have finished development.

Link to comment
Share on other sites

Pin 1 on the OI goes through a 39Ohm resistor to an MC output. Make it high to switch the IO.

(Alternatively put P1 on VCC, hold Pin2 high and low the MC pin to make it go - that way you can limit the voltage to the OI if your MC is too high. It seemed to work either way without failure.)

Pin 2 to GND shared with MC (or alternative mentioned)

Pin 4 to common side of CV joy button

Pin 5 to floating side of CV joy button (my orig. drawing shows a diode feeding into the OI on this line, though it looks like it was unnecessary.)

 

You are right about the code, be clever with yours.

Link to comment
Share on other sites

  • 3 weeks later...

just wanted to post some progress here on my project based uppon this

 

i have a working prototype built now that converts the atari jaguar into colecovision

the option button sets the fire buttons from being either

cb

ba

ca

on the jaguar controller, which maps to left and right fire on colecovision

 

i am also incorporating a 128x64 oled screen as there are some free pins on the mega, this screen will display some basic information about what configuration has been set up and running, i also want so save the last configuration and reload it again

 

currently the jaguar pause button although checked for does not do anything colecovision wise, perhaps use it to save the fire button configuration?

Link to comment
Share on other sites

  • 1 month later...

I have now finished the program to control this project (the ability exists to reprogram the controller so future updates can be done

 

every jaguar joypad button does something

the buttons directly mapping to the colecovision joypad perform the came function.

 

the jaguar pad option button has three settings, set jaguar pad buttons c/b, b/a, c/a as colecovision left and right fire buttons

 

jaguar pad button pause saves the current fire button configuration to the controllers internal eeprom, this is then reloaded when during the next power on, this way the user can set what is most comfortable for them

 

i need to make a prototype on strip board and give it a good test before i do anything about making this a product / kit, hopefully there will be no or very few issues uncovered,

 

power is still an issue but i have something coming that i am hoping will fix that how i want (steal power from the colecovision joypad port), that however is still WIP

 

tests so far show this to be working correctly

 

 

 

for those of you who like numbers:

 

the controller program is 2.36k compiled

the program uses 35 bytes controller ram

the program uses 1 byte of eeprom space

  • Like 4
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...