FC模拟器的实现 - CPU的抽象及定义(4) - JAVA

/ 编程技术 / 1 条评论 / 2290浏览

作者:玉米


上篇文章,我们已经对MOS6502有了进一步的了解。

接下来我们可以实现些CPU相关的骨架东西。

现实现一个异常类进行统一管理异常。

代码如下:

package com.mofum.common.exception;

/**
 * 模拟器异常
 * @author 玉米
 * @version 2018-03-20
 */
public class EmulatorException extends Exception {
	
	private static final long serialVersionUID = 1L;
	
	/**
	 * 错误异常代码
	 */
	private String code;
	
	/**
	 * 错误消息
	 */
	private String message;

	public EmulatorException(String code, String message) {
		super();
		this.code = code;
		this.message = message;
	}

	public EmulatorException() {
		super();
	}

	public EmulatorException(String message, Throwable cause, boolean enableSuppression,
			boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
	}

	public EmulatorException(String message, Throwable cause) {
		super(message, cause);
	}

	public EmulatorException(String message) {
		super(message);
	}

	public EmulatorException(Throwable cause) {
		super(cause);
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}

寄存器的定义:

package com.mofum.common.model.register;

/**
 * 寄存器接口
 * @author 玉米
 */
public interface IRegister{
	
	/**
	 * 设置值
	 * @param value 值
	 */
	public void setShortValue(short value);
	
	/**
	 * 获取值
	 * @return 值
	 */
	public short getShortValue();

	/**
	 * 设置值
	 * @param value 值
	 */
	public void setIntValue(int value);
	
	/**
	 * 获取值
	 * @return 值
	 */
	public int getIntValue();
	
	
	/**
	 * 设置值
	 * @param value 值
	 */
	public void setLongValue(long value);
	
	/**
	 * 获取值
	 * @return 值
	 */
	public long getLongValue();
}

内存定义:

package com.mofum.common.model.memory;

/**
 * 内存 接口实现
 * 
 * @author 玉米
 * @version 2018-03-20
 */
public interface IMemory {

	/**
	 * 读取long型值
	 * 
	 * @param address
	 *            地址
	 * @return
	 */
	public long readLongValue(long address);

	/**
	 * 读取int 型值
	 * 
	 * @param address
	 *            地址
	 * @return
	 */
	public int readIntValue(int address);

	/**
	 * 读取short 型值
	 * 
	 * @param address
	 *            地址
	 * @return
	 */
	public short readShortValue(short address);

	/**
	 * 写入long 型值
	 * 
	 * @param address
	 *            地址
	 * @param value
	 *            值
	 */
	public void writeLongValue(long address, long value);

	/**
	 * 写入int 型值
	 * 
	 * @param address
	 *            地址
	 * @param value
	 *            值
	 */
	public void writeIntValue(int address, int value);

	/**
	 * 写入short 型值
	 * 
	 * @param address
	 *            地址
	 * @param value
	 *            值
	 */
	public void writeShortValue(short address, short value);
}

指令定义:

package com.mofum.common.model.instruction;

import com.mofum.common.exception.EmulatorException;

/**
 * 指令
 * 
 * @author 玉米
 * @version 2018-03-20
 */
public abstract class Instruction {

	/**
	 * 操作码
	 */
	private int opCode;

	/**
	 * 指令周期
	 */
	private int cycle;

	/**
	 * 指令具体做的事
	 * 
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public abstract void work() throws EmulatorException;

	public int getOpCode() {
		return opCode;
	}

	public void setOpCode(int opCode) {
		this.opCode = opCode;
	}

	public int getCycle() {
		return cycle;
	}

	public void setCycle(int cycle) {
		this.cycle = cycle;
	}

}

寻址模式定义:

package com.mofum.common.model.address;

/**
 * 寻址方式
 * 
 * @author 玉米
 * @version 2018-03-20
 */
public interface IAddressingModel {

	/**
	 * int 型结果
	 * @return
	 */
	public int intResult();

	/**
	 * short 型结果
	 * @return
	 */
	public short shortResult();

	/**
	 * long 结果
	 * @return
	 */
	public long longResult();
	
}

最后是CPU定义:

package com.mofum.common.model.cpu;

import java.util.Map;

import com.mofum.common.exception.EmulatorException;
import com.mofum.common.model.address.IAddressingModel;
import com.mofum.common.model.memory.IMemory;
import com.mofum.common.model.register.IRegister;

/**
 * CPU 接口
 * 
 * @author 玉米
 * @version 2018-03-20
 */
public interface ICPU {

	/**
	 * 模拟一条指令
	 * 
	 * @return 指令时钟周期
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public int emulate() throws EmulatorException;

	/**
	 * 获得所有的寄存器集合
	 * 
	 * @return 寄存器集合
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public Map<String, IRegister> registersMap() throws EmulatorException;

	/**
	 * 根据名称获得寄存器
	 * 
	 * @param name
	 *            寄存器名称
	 * @return
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public IRegister getRegister(String name) throws EmulatorException;

	/**
	 * 添加一个寄存器
	 * 
	 * @param name
	 *            寄存器名称
	 * @param register
	 *            寄存器
	 * @return 寄存器
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public IRegister putRegister(String name, IRegister register) throws EmulatorException;

	/**
	 * 获得所有的内存集合
	 * 
	 * @return 内存集合
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public Map<String, IMemory> memoryMap() throws EmulatorException;

	/**
	 * 根据名称获得内存
	 * 
	 * @param name
	 *            内存名称
	 * @return
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public IMemory getMemory(String name) throws EmulatorException;

	/**
	 * 添加一个内存
	 * 
	 * @param name
	 *            内存名称
	 * @param memory
	 *            内存
	 * @return 内存
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public IMemory getMemory(String name, IMemory memory) throws EmulatorException;

	/**
	 * 注册寻址方式
	 * 
	 * @param addressingModel
	 *            寻址方式
	 * @throws EmulatorException
	 *             模拟器异常
	 */
	public void regAddressingModel(IAddressingModel addressingModel) throws EmulatorException;
}

做完这些我们的一期代码就算实现完了。

  1. www

    厉害厉害厉害

    回复