6502仿真增强版无限循环基础知识:$C000到$E0ED

3
我终于让我的6502模拟器通过了AllSuiteA.asm的所有测试,但我的模拟器未能成功模拟Enhanced Basic,我已将其加载到$C000。发生了什么事是PC慢慢上升到$C03E,然后JSR到$C892。之后它稳步上升直到$C908,在那里它再次JSR到$E0ED,然后间接地JMP到$0。
为什么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
1个回答

3
简短版:当您配置好您的组合时,您的CPU需要模拟一个复位,而不仅仅是跳转到。如果您只想在单行中修复问题,请跳转到。
从源代码开始: 是,应该“打印CR / LF”。
该例程的第一件事是将A加载为<0D>,然后输出。那会把你带到。
在那里的代码将要打印字符与' '进行比较,并在发现它正在打印控制字符时分支到/。
在处是长跳转到,即。那只是通过(位于<0207>)的间接。您的代码似乎只在<0207>和<0208>处找到<00>,因此向量不正确。
看起来您正在使用。那会在(从6502重置向量到达)的重置例程中设置相关的输入/输出向量。但是,您的仿真器没有模拟重置,它只从开始。
因此,向量从未初始化,尽管正确地模拟了跳转,但并没有跳转到应该去的地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接