Последовательность Фибоначчи в пользовательской сборке - PullRequest
0 голосов
/ 28 сентября 2019

Я сделал собственный 8-битный компьютер в java, похожий на макетный компьютер Бена Итера.У меня работала Фибоначчи, но затем я решил изменить размер оперативной памяти, и мне пришлось также изменить размер счетчика программы.С тех пор, как это изменение, программа только что выплюнула нули вместо последовательности Фибоначчи.Вот весь класс:

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

}

Извините, если это немного трудно читать.Спасибо

...