Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@DusteDdk
Last active February 15, 2022 20:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DusteDdk/39f6568c0efa24fe23e2de43b74a1f84 to your computer and use it in GitHub Desktop.
Save DusteDdk/39f6568c0efa24fe23e2de43b74a1f84 to your computer and use it in GitHub Desktop.
// This is a firmware for making an arduino pro micro into a switchless rom controller for selecting address pins on
// a 64 kib rom for kernals and a 16 kib rom for charsets in a c64.
// It also does a simple RGB thingy, adjust the ledMin to adjust brightness, depends on your led, resistors and preference for eye-burning.
// I used 5k3 resisters on my RGB led, it's pretty sensitive
const int ledMin=128;
int r=ledMin;
int g=ledMin+21;
int b=ledMin+60;
const int slowness = 30; // adjust how fast it rotates the rgb colors, smaller = faster, minimum 1
// nothing more should need tweaking
#include <EEPROM.h>
const int restorePin = A0; // hooks to the ~RESTORE line
const int kernA13 = 16; // kernal rom, address 13 pin, goes to pin 16 on the pro micro
const int kernA14 = 14;
const int kernA15 = 15;
const int charA13 = 19; // character rom, address 13 pin goes to pin A1 on the micro
const int charA14 = 20; // Pin A2
const int LEDR = 9;
const int LEDG = 5;
const int LEDB = 6;
const int LEDPWR = 10;
void load() {
int chkA = EEPROM.read(0);
int chkB = EEPROM.read(1);
int chkC = EEPROM.read(2);
int kernSetting = EEPROM.read(3);
int charSetting = EEPROM.read(4);
if( ! (chkA == 'C' && chkB == '6' && chkC == '4')) {
kernSetting=0;
charSetting=1;
}
digitalWrite( kernA13, (kernSetting&(1<<0))>>0 );
digitalWrite( kernA14, (kernSetting&(1<<1))>>1 );
digitalWrite( kernA15, (kernSetting&(1<<2))>>2 );
digitalWrite( charA13, (charSetting&(1<<0))>>0 );
digitalWrite( charA14, (charSetting&(1<<1))>>1 );
}
void set(int ker, int cha) {
EEPROM.write(0,'C');
EEPROM.write(1,'6');
EEPROM.write(2,'4');
EEPROM.write(3, (char)ker);
EEPROM.write(4, (char)cha);
load();
}
void setup() {
pinMode(restorePin, INPUT);
analogReference(DEFAULT);
pinMode(kernA13, OUTPUT);
pinMode(kernA14, OUTPUT);
pinMode(kernA15, OUTPUT);
pinMode(charA13, OUTPUT);
pinMode(charA14, OUTPUT);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
pinMode(LEDPWR, OUTPUT);
digitalWrite(LEDPWR, HIGH);
load();
}
// 10 ms
bool btn() {
delay(2);
int sum=analogRead(restorePin);
delay(2);
sum+=analogRead(restorePin);
delay(2);
sum+=analogRead(restorePin);
delay(2);
sum+=analogRead(restorePin);
delay(2);
sum+=analogRead(restorePin);
return ( sum < 500);
}
// if down for milliseconds.
bool btnDn(int n) {
int t = 0;
while(btn()) {
t+=10;
if(t<n) {
analogWrite(LEDR, ledMin);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
} else {
return true;
}
}
return false;
}
void debounce() {
while(btn()) {
delay(50);
}
}
int rd=1;
int gd=1;
int bd=1;
int fd=0;
void loop() {
fd++;
if(fd==slowness) {
fd=0;
r+=rd;
if(r<ledMin) {
rd=1;
}
if(r>254) {
rd=-1;
}
g+=gd;
if(g<ledMin) {
gd=1;
}
if(g>254) {
gd=-1;
}
b+=bd;
if(b<ledMin) {
bd=1;
}
if(b>254) {
bd=-1;
}
}
analogWrite(LEDR, r);
analogWrite(LEDG, g);
analogWrite(LEDB, b);
int ker=0;
int cha=0;
int act;
if(btnDn(2000)) {
analogWrite(LEDR, 255);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, 255);
debounce();
analogWrite(LEDR, 255);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
act=2000;
while(act) {
act-=10;
if(btn()) {
debounce();
ker++;
if(ker>7) {
ker=0;
}
switch(ker) {
case 0:
analogWrite(LEDR, 255);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
break;
case 1:
analogWrite(LEDR, 255);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, 255);
break;
case 2:
analogWrite(LEDR, 255);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, ledMin);
break;
case 3:
analogWrite(LEDR, ledMin);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
break;
case 4:
analogWrite(LEDR, ledMin);
analogWrite(LEDG, 255);
analogWrite(LEDB, ledMin);
break;
case 5:
analogWrite(LEDR, ledMin);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, 255);
break;
case 6:
analogWrite(LEDR, ledMin);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, ledMin);
break;
case 7:
analogWrite(LEDR, 255);
analogWrite(LEDG, 255);
analogWrite(LEDB, ledMin);
break;
}
act=2000;
}
}
for(int i=0; i < 5; i++) {
analogWrite(LEDR, ledMin);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, ledMin);
delay(100);
analogWrite(LEDR, 255);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
delay(100);
}
analogWrite(LEDR, 255);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
act=2000;
while(act) {
act-=10;
if(btn()) {
debounce();
cha++;
if(cha>3) {
cha=0;
}
switch(cha) {
case 0:
analogWrite(LEDR, 255);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
break;
case 1:
analogWrite(LEDR, 255);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, 255);
break;
case 2:
analogWrite(LEDR, 255);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, ledMin);
break;
case 3:
analogWrite(LEDR, ledMin);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
break;
}
act=2000;
}
}
for(int i=0; i < 5; i++) {
analogWrite(LEDR, ledMin);
analogWrite(LEDG, ledMin);
analogWrite(LEDB, ledMin);
delay(100);
analogWrite(LEDR, 255);
analogWrite(LEDG, 255);
analogWrite(LEDB, 255);
delay(100);
}
set(ker,cha);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment