我终于让我的6502模拟器通过了AllSuiteA.asm的所有测试,但我的模拟器未能成功模拟Enhanced Basic,我已将其加载到$C000。发生了什么事是PC慢慢上升到$C03E,然后JSR到$C892。之后它稳步上升直到$C908,在那里它再次JSR到$E0ED,然后间接地JMP到$0。
为什么Enhanced Basic无限循环,尽管AllSuiteA说我的模拟器没问题?
以下是相关函数: Opcodes: JSR:
注意:opcode[2]是正在执行的操作码的字节数。 这里有一个运行程序的JSFiddle。在这个fiddle中包含了ehbasic.bin的十六进制表示。
为什么Enhanced Basic无限循环,尽管AllSuiteA说我的模拟器没问题?
以下是相关函数: Opcodes: JSR:
case "JSR":
var t = pc + 1;
memory[0x0100 + sp] = (t & 0xFF00) >> 8;
sp--;
memory[0x0100 + sp] = t & 0x00FF;
sp--;
pc = address - opcode[2];
break;
JMP:
case "JMP":
pc = address - opcode[2];
break;
寻址方式:
IND:
case "IND":
var b1 = memory[pc + 1];
var b2 = memory[pc + 2];
var mem = (b2 << 8) | b1;
var bb1 = memory[mem];
var bb2 = memory[mem + 1];
address = (bb2 << 8) | bb1;
break;
ABS:
case "ABS":
var b1 = memory[pc + 1];
var b2 = memory[pc + 2];
address = (b2 << 8) | b1;
break;
注意:opcode[2]是正在执行的操作码的字节数。 这里有一个运行程序的JSFiddle。在这个fiddle中包含了ehbasic.bin的十六进制表示。
opcode [2]
,因为稍后在你的代码中有像pc += opcode [2]
这样的内容,它更干净,让它按照那个顺序发生?真正的6502将在获取每个字节时递增PC,并仅在最后一个周期中加载它,这意味着没有这样的减法,这看起来有点刺眼,但我认为这不是问题。 - Tommy