【问题标题】:6502 Emulation Enhanced Basic Infinite Loop $C000 to $E0ED6502 仿真增强型基本无限循环 $C000 至 $E0ED
【发布时间】: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


【解决方案1】:

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


从源代码工作:

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

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

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

C90A 是到E0ED 的跳远,即V_OUTP。这只是一个间接的JSRVEC_OUT,即0207。您的代码似乎仅在 02070208 找到 00s,因此向量不正确。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多