【发布时间】:2015-05-25 21:46:40
【问题描述】:
我的 6502 仿真器终于通过了 AllSuiteA.asm 中的所有测试,但我的仿真器无法仿真增强型基本版,我以 C000 美元的价格加载了它。发生的情况是 PC 缓慢攀升至 $C03E,然后 JSR 攀升至 $C892。之后,它稳步上升到 $C908,再次 JSR 到 $E0ED,然后 JMP 间接到 $0。
尽管 AllSuiteA 说我的模拟器没问题,但为什么增强型 Basic 会无限循环?
以下是相关功能:
操作码:
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] 是正在执行的操作码的字节数
And here is a JSFiddle of the running program. 包含在这个小提琴中的是 ehbasic.bin 的十六进制表示。
【问题讨论】:
-
只是要明确一点:您要减去
opcode[2],因为稍后在您的代码中您有类似pc += opcode[2]的内容,只是允许按该顺序发生更清洁?真正的 6502 会在获取每个字节时增加 PC,并且只会在最后一个周期加载它,这意味着没有这样的减法,这使它看起来有点刺耳,但我认为这不是问题。
标签: javascript emulation addressing-mode 6502