java cpu模拟器_这是在JAVA中实现6502 CPU模拟器的“好”方法吗?
想要确保我不必回去并重做大块代码......我将每个操作码都作为实现Runnable的枚举中的值。有没有更有效的方法,我应该这样做,还是我在写轨道上准确地运行测试套件?这是在JAVA中实现6502 CPU模拟器的“好”方法吗?
package com.codeblox.nes.cpu;
public class CPU {
private byte x, y, ac, pcl, pch;
private short pc;
private boolean debugEnabled = false, isGood = true;
private static byte [] mainMem = new byte [0x10000];
public Opcode opcode;
CPU(boolean debugEnabled){
opcode =Opcode.nop;
pc = 0;
this.debugEnabled = debugEnabled;
}
public enum Opcode implements Runnable{
adc(){public void run(){System.out.println("adc");}},
and(){public void run(){System.out.println("and");}},
asl(){public void run(){System.out.println("asl");}},
bcc(){public void run(){System.out.println("bcc");}},
bcs(){public void run(){System.out.println("bcs");}},
beq(){public void run(){System.out.println("beq");}},
bit(){public void run(){System.out.println("bit");}},
bmi(){public void run(){System.out.println("bmi");}},
bne(){public void run(){System.out.println("bne");}},
bpl(){public void run(){System.out.println("bpl");}},
brk(){public void run(){System.out.println("brk");}},
bvc(){public void run(){System.out.println("bvc");}},
bvs(){public void run(){System.out.println("bvs");}},
clc(){public void run(){System.out.println("clc");}},
cld(){public void run(){System.out.println("cld");}},
cli(){public void run(){System.out.println("cli");}},
clv(){public void run(){System.out.println("clv");}},
cmp(){public void run(){System.out.println("cmp");}},
cpx(){public void run(){System.out.println("cpx");}},
cpy(){public void run(){System.out.println("cpy");}},
dec(){public void run(){System.out.println("dec");}},
dex(){public void run(){System.out.println("dex");}},
dey(){public void run(){System.out.println("dey");}},
eor(){public void run(){System.out.println("eor");}},
inc(){public void run(){System.out.println("inc");}},
inx(){public void run(){System.out.println("inx");}},
iny(){public void run(){System.out.println("iny");}},
jmp(){public void run(){System.out.println("jmp");}},
jsr(){public void run(){System.out.println("jsr");}},
lda(){public void run(){System.out.println("lda");}},
ldx(){public void run(){System.out.println("ldx");}},
ldy(){public void run(){System.out.println("ldy");}},
lsr(){public void run(){System.out.println("lsr");}},
nop(){public void run(){System.out.println("nop");}},
ora(){public void run(){System.out.println("ora");}},
pha(){public void run(){System.out.println("pha");}},
php(){public void run(){System.out.println("php");}},
pla(){public void run(){System.out.println("pla");}},
plp(){public void run(){System.out.println("plp");}},
rol(){public void run(){System.out.println("rol");}},
ror(){public void run(){System.out.println("ror");}},
rti(){public void run(){System.out.println("rti");}},
rts(){public void run(){System.out.println("rts");}},
sbc(){public void run(){System.out.println("sbc");}},
sec(){public void run(){System.out.println("sec");}},
sed(){public void run(){System.out.println("sed");}},
sei(){public void run(){System.out.println("sei");}},
sta(){public void run(){System.out.println("sta");}},
stx(){public void run(){System.out.println("stx");}},
sty(){public void run(){System.out.println("sty");}},
tax(){public void run(){System.out.println("tax");}},
tay(){public void run(){System.out.println("tay");}},
tsx(){public void run(){System.out.println("tsx");}},
txa(){public void run(){System.out.println("txa");}},
txs(){public void run(){System.out.println("txs");}},
tya(){public void run(){System.out.println("tya");}},
;
public String mnemonic = "";
public String addressMode;
public byte code;
public byte data;
Opcode(){
this.mnemonic = new String();
}
public void print(){
System.out.printf("Opcode: %02X %s %s\n",
this.code,
this.mnemonic.toUpperCase(),
this.addressMode);
}
public String getMode00(byte opcode){
switch(opcode){
case 0x00: return "Immediate";
case 0x04: return "ZeroPaged";
case 0x0C: return "Absolute";
case 0x14: return "IndexedZeroPagedX";
case 0x1C: return "IndexedAbsoluteX";
default: return "Type 0 undefined";
}
}
public String getMode01(byte opcode){
switch(opcode){
case 0x00: return "InirectIndexedZeroPagedX";
case 0x04: return "ZeroPaged";
case 0x08: return "Immediate";
case 0x0C: return "Absolute";
case 0x10: return "IndrectedZeroPagedY";
case 0x14: return "IndexedZeroPagedX";
case 0x18: return "IndexedAbsoluteY";
case 0x1C: return "IndexedAbsoluteX";
default: return "Type 1 Undefined";
}
}
public String getMode02(byte opcode){
switch(opcode){
case 0x00: return "Immediate";
case 0x04: return "ZeroPaged";
case 0x08: return "Accumulator";
case 0x0C: return "Absolute";
case 0x14: return "IndexedZeroPagedX";
case 0x1C: return "IndexedAbsoluteX";
default: return "Type 2 Undefined";
}
}
public String getMode03(byte opcode){ return "";}
public void decode(){
switch(this.code & 0x03){
case 0x00: this.addressMode = getMode00((byte)(this.code & 0x1C)); break;
case 0x01: this.addressMode = getMode01((byte)(this.code & 0x1C)); break;
case 0x02: this.addressMode = getMode02((byte)(this.code & 0x1C)); break;
case 0x03: this.addressMode = getMode03((byte)(this.code & 0x1C)); break;
default: break;
}
}
}
public void init(){
pc = 0;
}
public void start(){
while(isGood){
opcode.code = readMem(pc++);
CPU.Opcode.valueOf(opcode.mnemonic).run();
}
if(!isGood){
System.err.println("isGood == false");
}
}
public byte readMem(short ptr){
return mainMem[ptr];
}
public byte readMem(short ptr, byte addressMode){
return mainMem[ptr];
}
public void exec(){
opcode.decode();
switch(opcode.code & 0xFF){
case 0x69: case 0x65: case 0x75:
case 0x6D: case 0x7D: case 0x79:
case 0x61: case 0x71: opcode.mnemonic = "adc"; break;
case 0x29: case 0x25: case 0x35:
case 0x2D: case 0x3D: case 0x39:
case 0x21: case 0x31: opcode.mnemonic = "and"; break;
case 0x0A: case 0x06: case 0x16:
case 0x0E: case 0x1E: opcode.mnemonic = "asl"; break;
default: opcode.mnemonic = null;
}
//Opcodes.valueOf(this.mnemonic).run();
}
public void testOpcodes(){
opcode.code = 0;
while((opcode.code & 0xFF) < 0xFF){
//System.out.printf("PC = 0x%04X \n", PC);
exec();
if(opcode.mnemonic != null)
opcode.print();
//Opcode.valueOf(opcode.mnemonic).run();
opcode.code++;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
CPU cpu = new CPU(true);
cpu.init();
cpu.testOpcodes();
}
}
2016-11-20
Codeblox
+1
我说Runnable接口是错误的选择。您的OpCodes必须获取操作数(如果有的话),更改cpu中的寄存器并更改程序指针,因此要实现的方法必须具有(至少)cpu,RAM对象和当前程序指针作为参数,并返回新ProgramPointer。 –
+3
代码审查问题应发布在[codereview](http://codereview.stackexchange.com)网站上。 –
+0
我试着将它移动到codereview,但有一个冷却时间定时器,需要在帖子之间等待40分钟。对于那个很抱歉。蒂莫西 - 我可以让记忆和每个寄存器都是静态的。这样,他们可以从我的项目中的任何地方访问。否则,我可以将它从一个枚举移动到它自己的类中,并为每个引用CPU的操作码指定一个参数。 –
java cpu模拟器_这是在JAVA中实现6502 CPU模拟器的“好”方法吗?相关推荐
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- java 判断类型_如何快速入门Java编程学习(干货)
一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...
- 支持java虚拟主机_为何缺乏支持Java的虚拟主机
现在很多站长们,都青睐于香港虚拟主机建站.现在常见的是asp和PHP的程序空间很多,但是Java的少之又少,下面小编我给大家聊一聊! 一.香港Java虚拟主机成本高 使用Java程序建站,就必须要用支 ...
- java必读书籍_最佳5本Java性能调优书籍–精选,必读
java必读书籍 为什么Java开发人员应该阅读有关性能调优的书? 当我很久以前第一次面对这个问题时,我以为以后会做,但是我很长一段时间都没有回过头来. 仅当我在用Java编写的任务关键型服务器端财务 ...
- java future用法_纯干货:Java学习过程中的21个知识点和技术点
我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...
- java线程堆栈_深入JVM剖析Java的线程堆栈
在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象 ...
- java 下载加速_一种基于Java的大文件下载加速方法与流程
本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...
- java 监视锁_【转载】Java锁与监视器
锁的相关基本概念.了解底层的Object 监视器~ 在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Obje ...
- java strim性能_你所不知道的Java性能优化之String!
Java性能优化之String字符串优化 1.字符串对象及其特点 Java中八大基本数据类型没有String类型,因为String类型是Java对char数组的进一步封装. String类的实现主要由 ...
最新文章
- 人生只有七次机会,你抓住了几次?
- 详谈Windows消息循环机制
- mmseg java_MMSeg中文分词算法
- 在mac上安装gitlab
- 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路
- Java 并发实践 — ConcurrentHashMap 与 CAS
- mysql数据库 集群_mysql数据库集群
- VR全景可视化制作小程序功能模块源码v1.0.28
- 如何修改 SAP 登录界面的文字(事务码SE61)
- 人工智能发展趋势——深度AI科普调研团队
- 合成未来宝宝照片_当英国皇室宝宝长大:阿奇王子变卷毛星人,夏洛特公主颜值最能抗...
- ext 不能修改 输入框_在extjs中,如何用method改变textfield中inputType的问题
- HDU - 3564 Another LIS(LIS+线段树)
- 【win32汇编】0x04 第一个窗口程序
- 201771010111李瑞红《第十六周学习总结》
- 会议记录管理系统java_项目文档--会议记录标准与模板
- cmos逻辑门传输延迟时间_MOS管以及简单CMOS逻辑门电路原理图解析
- 多张图片怎么修改分辨率?手把手教你一键批量修改图片分辨率
- 以洪荒之力打开linux德·摩根定律
- 论文理解记录:The Lottery Ticket Hypothesis