⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 instructionfetcher.java

📁 一个微处理器的模似器
💻 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 + -