我如何在 C++ 中模拟 6502 JMP、分支和 sub-routine?
How could I emulate the 6502 JMP, branching, and sub-routine in C++?
我有一个程序可以完全模拟 MOS Technologies 6502 处理器。我几乎已经将整个指令集完全实现为 c++ 函数,包括数学函数、按位函数。我什至可以模拟时钟速度。我没有成功实现的唯一指令是 JMP 和所有分支指令,以及子程序指令。这是因为我不知道如何为 C++ 创建 goto-like 循环。由于我的 header 太大而无法放入代码块,我将其链接为文件“6502.h”。任何 step-by-step 帮助将不胜感激。
https://drive.google.com/file/d/0B1j1lbKWU98iQ1dyVGNCVzRzdDA/view?usp=sharing 6502.h
部分我想将其作为题外话结束 - 'finish my code for me' 类型的问题和“为什么这段代码不起作用”在 SO 上是不可取的。
不过,现在是星期五下午,我应该写一些员工评论,这是一个很好的消遣。我不会给你代码,但我会给你一些提示:
- 您没有 PC(程序计数器)变量。
- BxC、BxS、JSR、JMP、RTI、RTS 和 BRK 都通过对 PC 进行更改来工作。
(顺便说一句,您可能想更仔细地查看 PHP/PLP 的操作码描述)
伪代码,给个思路;
// Emulation loop
opcode = memory[pc++]
switch(opcode)
case JMP
target = memory[pc] | memory[pc+1]<<8
pc = target
case JSR
target = memory[pc] | (memory[pc+1]<<8)
stack[sp--] = pc<<8
stack[sp--] = pc&0xff
pc = target
case RTS
pc = stack[sp+1] | (stack[sp+2]<<8)
sp += 2
...
我有一个程序可以完全模拟 MOS Technologies 6502 处理器。我几乎已经将整个指令集完全实现为 c++ 函数,包括数学函数、按位函数。我什至可以模拟时钟速度。我没有成功实现的唯一指令是 JMP 和所有分支指令,以及子程序指令。这是因为我不知道如何为 C++ 创建 goto-like 循环。由于我的 header 太大而无法放入代码块,我将其链接为文件“6502.h”。任何 step-by-step 帮助将不胜感激。
https://drive.google.com/file/d/0B1j1lbKWU98iQ1dyVGNCVzRzdDA/view?usp=sharing 6502.h
部分我想将其作为题外话结束 - 'finish my code for me' 类型的问题和“为什么这段代码不起作用”在 SO 上是不可取的。
不过,现在是星期五下午,我应该写一些员工评论,这是一个很好的消遣。我不会给你代码,但我会给你一些提示:
- 您没有 PC(程序计数器)变量。
- BxC、BxS、JSR、JMP、RTI、RTS 和 BRK 都通过对 PC 进行更改来工作。
(顺便说一句,您可能想更仔细地查看 PHP/PLP 的操作码描述)
伪代码,给个思路;
// Emulation loop
opcode = memory[pc++]
switch(opcode)
case JMP
target = memory[pc] | memory[pc+1]<<8
pc = target
case JSR
target = memory[pc] | (memory[pc+1]<<8)
stack[sp--] = pc<<8
stack[sp--] = pc&0xff
pc = target
case RTS
pc = stack[sp+1] | (stack[sp+2]<<8)
sp += 2
...