首页 > 解决方案 > 自定义装配中的斐波那契数列

问题描述

我用 java 制作了一个自定义的 8Bit 计算机,类似于 Ben Eater 的 8Bit 面包板计算机。我让斐波那契工作,但后来我决定改变内存大小,我还必须改变程序计数器的大小。自从那次更改以来,该程序一直在吐出零而不是斐波那契数列。这是整个班级:

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();
    }

}

对不起,如果它有点难以阅读。谢谢

标签: javaemulationfibonacci8-bit

解决方案


推荐阅读