Последовательность Фибоначчи в пользовательской сборке
Я сделал собственный 8-битный компьютер на Java, похожий на 8-битный макет Ben Eater. У меня работал Фибоначчи, но затем я решил изменить размер оперативной памяти, и мне также пришлось изменить размер программного счетчика. С тех пор, как это изменение, программа просто выплевывала нули вместо последовательности Фибоначчи. Вот весь класс:
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();
}
}
Извините, если это немного трудно читать. Спасибо