java - 自定义装配中的斐波那契数列
问题描述
我用 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();
}
}
对不起,如果它有点难以阅读。谢谢
解决方案
推荐阅读
- java - Java 词频按长度排序,然后按字母顺序排序
- javascript - 使用 AJAX 将数据从 Javascript 发送到 PHP 以更新现有的 Mysql 数据库
- swiftui - 有什么方法可以在 SwiftUI 中调用子视图的功能?
- javascript - 在循环中使用逻辑或运算符对数组进行排序
- javascript - 如何防止组件在位于组件外部的悬停事件上重新渲染?
- mongodb - 用户可以更改管理员权限
- java - 如何“同步”线程依次运行?
- discord.js - 如何检测何时提到机器人
- reactjs - react-i18next - 初始化后如何向 i18n 添加后端?
- ruby-on-rails - 覆盖设计控制器的 SessionsController#create 操作时如何设置标题?