I've made a custom 8Bit computer in java similar to Ben Eater's 8Bit breadboard computer. I had Fibonacci working but then I decided to change the ram size and I had to also change the size of the program counter. Ever since that change, the program has just been spitting out zeroes instead of the Fibonacci Sequence. Heres the entire class:
public class CPU {
boolean running = true;
int hz;
int pc = 0, addr;
short a, b, s, i, psc = 0;
boolean c, z, hlt = false;
short[] ram;
public CPU() {
hz = 8;
ram = new short[34];
//Fibonacci Sequence Code
ram[0] = 0b00000101; //LDI
ram[1] = 0b00000001; //1
ram[2] = 0b00000100; //STA
ram[3] = 0b00000000;
ram[4] = 0b00100000; //32 a
ram[5] = 0b00000101; //LDI
ram[6] = 0b00000000; //0
ram[7] = 0b00000100; //STA
ram[8] = 0b00000000;
ram[9] = 0b00011111; //31 b
ram[10] = 0b00000001; //LDA
ram[11] = 0b00000000;
ram[12] = 0b00011111; //31 b
ram[13] = 0b00001110; //OUT
ram[14] = 0b00000001; //LDA
ram[15] = 0b00000000;
ram[16] = 0b00100000; //32 a
ram[17] = 0b00000010; //ADD
ram[18] = 0b00000000;
ram[19] = 0b00001111; //32 a
ram[20] = 0b00000100; //STA
ram[21] = 0b00000000;
ram[22] = 0b00011111; //31 b
ram[23] = 0b00000011; //SUB
ram[24] = 0b00000000;
ram[25] = 0b00100000; //32 a
ram[26] = 0b00000100; //STA
ram[27] = 0b00000000;
ram[28] = 0b00100000; //32 a
ram[29] = 0b00000110; //JMP
ram[30] = 0b00000000;
ram[31] = 0b00001010; //10
long lastTime = System.nanoTime();
double ns = 1000000000 / (hz*7);
double delta = 0;
while(running){
long now = System.nanoTime();
delta += (now-lastTime) / ns;
lastTime = now;
while(delta >= 1){
update();
delta--;
}
}
}
void executeMicroCode() {
switch(i) {
case 1:
if(psc==2) a = ram[(int)ram[pc]<<8|ram[pc+1]]; //LDA
if(psc==3) pc+=2;
break;
case 2:
if(psc==2) b = ram[(int)ram[pc]<<8|ram[pc+1]]; //ADD
if(psc==3) s = (short) (a+b);
if(psc==4) a = s;
c = (s>=256)?true:false;
z = (s==0)?true:false;
if(psc==5) pc+=2;
break;
case 3:
if(psc==2) b = ram[(int)ram[pc]<<8|ram[pc+1]]; //SUB
if(psc==3) s = (short) (a-b);
if(psc==4) a = s;
c = (s>=256)?true:false;
z = (s==0)?true:false;
if(psc==5) pc+=2;
break;
case 4:
if(psc==2) addr = (int)ram[pc]<<8|ram[pc+1]; //STA
if(psc==3) ram[addr] = a;
if(psc==4) pc+=2;
break;
case 5:
if(psc==2) a = ram[pc]; //LDI
if(psc==3) pc++;
break;
case 6:
if(psc==2) pc = (int)ram[pc]<<8|ram[pc+1]; //JMP
break;
case 7:
if(psc==2) if(c) pc = (int)ram[pc]<<8|ram[pc+1]; //JC
if(psc==2) if(!c) pc+=2;
break;
case 8:
if(psc==2) if(z) pc = (int)ram[pc]<<8|ram[pc+1]; //JZ
if(psc==2) if(!c) pc+=2;
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
case 13:
break;
case 14:
if(psc==2) {
System.out.println(a); //OUT
}
break;
case 15:
hlt = true; //HLT
break;
}
}
void update() {
if(!hlt) {
if(psc>=6) psc = 0;
if(pc>=16) pc = 0;
if(a>=255||a<0) a&=0xFF;
if(b>=255||b<0) b&=0xFF;
if(s>=512||s<0) s = 0;
if(psc==0) addr = pc;
if(psc==0x1) {
i = ram[addr];
pc++;
}
executeMicroCode();
psc++;
}
}
public static void main(String[] args) {
new CPU();
}
}
Sorry if it is a little hard to read. Thank you