Last active
February 15, 2022 20:45
-
-
Save DusteDdk/39f6568c0efa24fe23e2de43b74a1f84 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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