📄 instructionfetcher.java
字号:
/**
* InstructionFetcher.java 2007/11/16 version1.0
*/
package com.vmpu.core;
import com.vmpu.util.Mask16;
/**
* 取指令部件: 包括指令寄存器、PC和4KB指令cache等
*
*
* @author 周良
*
*/
public class InstructionFetcher {
/**
* 16位指令寄存器,初始化为NOP 只有取指部件才能修改,其他部件只能读取
*/
private char instrReg = 0xF000;
/**
* 16位程序计数器,初始化为0 其他部件不能直接访问
*/
private char pc = 0x0000;
/**
* 指令缓存:4KB 其他部件不能直接访问
*/
private byte[] instrCache = new byte[4 * 1024];
/**
* 所属的MPU
*/
private MicroProcessingUnit owner = null;
/**
* 初始化
*/
public void init() {
instrReg = 0xF000;
pc = 0x0000;
for(int i = 0;i < instrCache.length;i ++)
instrCache[i] = 0;
}
/**
* 构造函数,需要指明属于哪一个MPU
* @param owner
*/
public InstructionFetcher(MicroProcessingUnit owner) {
this.owner = owner;
this.init();
}
/**
* 第一次取指,只是简单的取出指令,并不计算PC(初始为0)
*/
public void firstFetchInstr() {
// fetch instruction
byte instrH = instrCache[pc];// 指令高半字
byte instrL = instrCache[pc + 1];// 指令低半字
instrReg = (char) ((instrH << 8) | instrL);
}
/**
* 取指
*/
public void fetchInstr() {
// 修改CPU状态寄存器
owner.setStatusReg(MicroProcessingUnit.MPU_INSTR_FETCH);
// is_nPC_sel1=true,nPC_sel1=1,else,0
boolean is_nPC_sel1 = (owner.getController().getCtrlSgnlReg() & Mask16.mask16[1]) == Mask16.mask16[1];
// is_nPC_sel2=true,nPC_sel2=1,else,0
boolean is_nPC_sel2 = (owner.getController().getCtrlSgnlReg() & Mask16.mask16[0]) == Mask16.mask16[0];
// imm2
char imm2 = (char) (owner.getController().getImmReg1() & 0x0003);
// imm12
char imm12 = (char) (owner.getController().getImmReg2() & 0x0FFF);
// compute next pc
if (is_nPC_sel2) {
// imm2 -> pc
pc = imm12;
} else {
if (is_nPC_sel1) {
pc = imm12;
} else {
pc += imm2;
}
}
// fetch instruction
byte instrH = instrCache[pc];// 指令高半字
byte instrL = instrCache[pc + 1];// 指令低半字
instrReg = (char) ((instrH << 8) | instrL);
}
public char getInstrReg() {
return instrReg;
}
public char getPc() {
return pc;
}
public byte[] getInstrCache() {
return instrCache;
}
/**
* 装载指令半字(一个字节)到指令缓存
* @param instr
*/
public void loadHalfInstr(byte halfInstr,int to) {
if(to >= 0 && to < this.instrCache.length)
this.instrCache[to] = halfInstr;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -