【问题标题】:Interrupt behavior of a 6502 in standalone test vs. in a Commodore PET6502 在独立测试与 Commodore PET 中的中断行为
【发布时间】:2015-07-04 13:03:17
【问题描述】:

我正在 FPGA 上构建 Commodore PET。我已经在 Kansas Lava 中实现了我自己的 6502 内核(代码可在 https://github.com/gergoerdi/mos6502-kansas-lava 获得),并且通过在其周围放置足够的 IO (https://github.com/gergoerdi/eightbit-kansas-lava) 我能够在其上启动原始 Commodore PET ROM,得到一个闪烁的光标然后开始打字。

但是,在输入经典的 BASIC 程序后

10 PRINT "HELLO WORLD"
20 GOTO 10

它会在一段时间后(几秒钟后)崩溃

?ILLEGAL QUANTITY ERROR IN   10

因为我的代码具有相当合理的每个操作码测试覆盖率,并且它通过了AllSuiteA,我想我会研究更复杂行为的测试,这就是我到达Klaus Dormann's interrupt testsuite 的方式。在堪萨斯熔岩模拟器中运行它指出了我最初的中断实现中的大量错误:

  • 进入中断处理程序时未设置I 标志
  • B 标志到处都是
  • IRQ 中断被完全忽略,除非 I 在到达时未设置(正确的行为似乎是在设置 I 时将中断排队,并且在未设置时仍应处理它们)

修复这些问题后,我现在可以成功运行 Klaus Dormann 测试,所以我希望通过将我的机器重新加载到真正的 FPGA 上,如果运气好的话,BASIC 崩溃可能会消失。

然而,新版本修复了所有这些中断错误,并在模拟器中通过了中断测试,现在无法响应键盘输入,甚至只是在真实 FPGA 上闪烁光标。请注意,键盘输入和光标闪烁都是响应外部 IRQ(从屏幕 VBlank 信号连接)完成的,因此这意味着 固定版本以某种方式破坏了所有中断处理...

我正在寻找任何可能出现问题或如何开始调试的模糊建议。

完整代码可在https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite 获得,有问题的提交(修复测试并破坏 PET 的提交)是7a09b794af。我意识到这与最小可行复制完全相反,但改变本身很小,因为我不知道哪里出了问题,而且因为复制问题需要一台功能足以启动库存 Commodore PET ROM 的机器,我不不知道怎么缩小...

添加:

我设法用一个非常简单(我敢说是最小的)ROM 而不是库存的 PET ROM 在相同的硬件上重现了同样的问题:

        .org $C000        

reset:
        ;; Initialize PIA
        LDY #$07
        STY $E813

        LDA #30
        STA $42
        STA $8000
        CLI
        JMP *

irq:
        CMP $E812               ; ACK irq

        DEC $42
        BNE endirq

        LDX $8000
        INX
        STX $8000

        LDA #30
        STA $42            
endirq: RTI

        .res $FFFC-*

        .org $FFFC
resetv: .addr reset
irqv:   .addr irq

【问题讨论】:

    标签: emulation interrupt 6502 commodore lava


    【解决方案1】:

    中断没有排队;在每条指令的倒数第二个周期对中断线进行采样,如果它处于活动状态,并且我未设置,则接下来会跳转到中断而不是获取/解码。是否会混淆 IRQ 是电平触发,而不是边沿触发,并且通常保持高电平一段时间,而不是单个周期?因此,如果它已经在进行中,那么清除 I 将导致立即发生中断。看起来 PET 中断在 CPU 确认之前一直处于活动状态?

    还要注意语义:SEICLI 在最后一个循环中调整标志。是否跳转中断的决定是在之前的循环中做出的。因此,SEI 作为中断进来的最后一件事,您将进入 I 设置的中断例程。如果在您点击CLI 时中断处于活动状态,那么处理器将在分支之前执行CLI 之后的操作。

    我正在打电话,所以除了提供那些陈词滥调之外,很难进行更全面的评估;我稍后会尝试正确审查。这些有用吗?

    【讨论】:

    • 是的!非常有用,谢谢!我将不得不查看我的代码以找出测试失败的原因,除非我将中断排队(我只是假设它是规范的)。但我也在电话 ATM 上?
    • 我最终接受了这个回复,因为我困惑的根源实际上是我认为 IRQ 输入已排队。不幸的是,结果修复了中断,因此它们在测试中工作,在 PET 中仍然不会使无限循环崩溃消失;那个,似乎有不同的原因......
    • 您是否尝试过其他任何测试程序?除了 AllSuiteA 和 Klaus Doormann 的作品,Wolfgang Lorenz 的作品也不错。它甚至在 PETSCII 中本地报告。
    • 谢谢,我去看看!我想我对此感到气馁,因为我看到它被链接为“C64 测试套件”,而且我觉得我距离构建完整的 C64 还需要几年的时间。但如果它至少有一部分可以在准系统 6502 或 PET 上运行,那么我会检查一下。
    • 是的——这是大量的单独测试用例,其中绝大多数是普通的 6502 指令。只有最后几个与 C64 硬件有关;即使您的测试实现让每个测试加载下一个,那么您可以在一个点停止并且不会错过任何通用的东西。无需完整的白名单。测试套件涉及的一个具体的事情是其他两个没有涉及的一个具体的事情是带有非 BCD 参数的 drcimal ADC/SBC。但大多数情况下,这只是很好的额外覆盖范围。
    猜你喜欢
    • 2020-11-05
    • 2015-10-30
    • 2015-09-24
    • 1970-01-01
    • 2022-01-21
    • 2015-03-31
    • 1970-01-01
    • 2018-02-25
    • 2019-07-12
    相关资源
    最近更新 更多