这是周末,所以我通过写一个爱好项目来度过整周的编程.
我昨天编写了一个MOS 6502 CPU仿真器的框架,实现了寄存器,堆栈,内存和所有操作码.(链接到下面的来源)
我可以在我编写的调试器中手动运行一系列操作,但是我想加载一个NES rom并按指令指向程序计数器,我认为这是找到有缺陷的操作码的最快方法.
我写了一个快速的NES rom加载程序并将ROM库加载到CPU内存中.
问题是我不知道操作码是如何编码的.我知道操作码本身遵循每个操作码一个字节的模式,该模式唯一地标识操作码,
0 - BRK
1 - ORA (D,X)
2 - COP b
Run Code Online (Sandbox Code Playgroud)
等等
但是我不确定我应该在哪里找到操作码参数.是直接跟随的字节吗?在绝对记忆中,我想它可能不是一个字节而是一个短.
有人熟悉这个CPU的内存模型吗?
编辑:我意识到这可能是在黑暗中拍摄,但我希望有一些老学校的苹果和Commodore黑客潜伏在这里.
编辑:感谢大家的帮助.在我实施适当的更改以对齐每个操作后,CPU可以加载并运行Mario Brothers.除了循环等待Start之外它什么也没做,但它是一个好兆头:)
我上传了这个来源:
http://www.codeplex.com/Cpu6502/SourceControl/DirectoryView.aspx?SourcePath=&changeSetId=1810
如果有人想知道模拟器是如何工作的,那么它很容易理解.至少没有优化,但是再次,我在2.4ghz机器上模拟一个以2mhz运行的CPU :)
我在Scanner班上遇到一个非常奇怪的问题.我正在使用特殊的EOF令牌Scanner来读取消息Socket.如果客户端一次写入所有请求,或者请求有数据,那么一切正常,但阻塞hasNext()操作在服务器上挂起,反过来客户端,当消息以块的形式写入时,下一个令牌应该是空字符串.
什么会导致这个?我该如何避免这种情况?
这是我正在尝试做的简化版本,\n用于测试目的,假设分隔符可以是任何字符串.
服务器代码:
ServerSocketChannel serverChannel = null;
try {
serverChannel = ServerSocketChannel.open();
ServerSocket serverSocket = serverChannel.socket();
serverSocket.bind(new InetSocketAddress(9081));
SocketChannel channel = serverChannel.accept();
Socket socket = channel.socket();
InputStream is = socket.getInputStream();
Reader reader = new InputStreamReader(is);
Scanner scanner = new Scanner(reader);
scanner.useDelimiter("\n");
OutputStream os = socket.getOutputStream();
Writer writer = new OutputStreamWriter(os);
while (scanner.hasNext()) {
String msg = scanner.next();
writer.write(msg);
writer.write('\n');
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally …Run Code Online (Sandbox Code Playgroud)