3

我终于达到了我的 6502 仿真器通过了 AllSuiteA.asm 中的所有测试的地步,但我的仿真器无法模拟增强型基本版,我以 C000 美元的价格加载了它。发生的情况是 PC 缓慢攀升至 $C03E,然后 JSR 攀升至 $C892。之后,它稳步上升到 $C908,在那里它再次 JSR 到 $E0ED,然后 JMP 间接到 $0。

尽管 AllSuiteA 说我的模拟器很好,为什么增强型基本无限循环?

以下是相关功能:

操作码:

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。 此小提琴中包含 ehbasic.bin 的十六进制表示。

4

1 回答 1

3

简短版本:当您配置好汇编时,您的 CPU 需要模拟复位,而不仅仅是在C000. FF80如果您只想在一行中解决问题,请加入。


从源代码工作:

C892LAB_CRLF,应该“打印 CR/LF”。

例程做的第一件事是加载 A,0D然后JSR LAB_PRNA输出它。这会带你到C8ED.

那里的代码将要打印的字符与 ' ' 进行比较,并在发现它正在打印控制字符时分支到LAB_18F9/ 。C90A

atC90A是跳远到E0ED,也就是V_OUTP。这只是一个间接的JSRthrough VEC_OUT,即 at 0207。您的代码似乎只找到了00s at02070208向量不正确。

看起来你正在使用min_mon.asm. 这将相关的输入/输出向量设置为复位例程 at 的一部分FF80(从 6502 复位向量 at 到达FFFC)。但是,您的模拟器不会模拟重置,它只是以PC = C000.

因此,向量永远不会被初始化,并且虽然正确模拟了跳转,但它并没有到达它应该到达的地方。

于 2015-03-23T02:47:43.667 回答