0

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

0 Answers0