独立测试与 Commodore PET 中 6502 的中断行为

Interrupt behavior of a 6502 in standalone test vs. in a Commodore PET

我正在 FPGA 上构建 Commodore PET。我在堪萨斯熔岩中实现了我自己的 6502 核心(代码可在 https://github.com/gergoerdi/mos6502-kansas-lava), and by putting enough IO around it (https://github.com/gergoerdi/eightbit-kansas-lava 获得)我能够在其上启动原始的 Commodore PET ROM,获得闪烁的光标并开始输入。

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

10 PRINT "HELLO WORLD"
20 GOTO 10

一段时间后(几秒后)崩溃

?ILLEGAL QUANTITY ERROR IN   10

因为我的代码具有相当合理的每个操作码测试覆盖率,并且它通过了 AllSuiteA, I thought I would look into tests for more complicated behaviour, which is how I arrived at Klaus Dormann's interrupt testsuite。 运行 它在 Kansas Lava 模拟器中指出了我最初的中断实现中的大量错误:

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

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

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

完整代码可在 https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite, the offending commit (the one that fixes the test and breaks the PET) is 7a09b794af 获得。我意识到这与最小可行复制完全相反,但变化本身很小,因为我不知道哪里出了问题,而且因为复制问题需要一台功能足以启动股票 Commodore PET ROM 的机器,我不知道不知道如何缩小它...

已添加:

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

        .org $C000        

reset:
        ;; Initialize PIA
        LDY #
        STY $E813

        LDA #30
        STA 
        STA 00
        CLI
        JMP *

irq:
        CMP $E812               ; ACK irq

        DEC 
        BNE endirq

        LDX 00
        INX
        STX 00

        LDA #30
        STA             
endirq: RTI

        .res $FFFC-*

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

中断没有排队;中断线在每条指令的倒数第二个周期被采样,如果它是活动的,我取消设置,然后跳转到中断而不是 fetch/decode。令人困惑的是 IRQ 是电平触发的,而不是边沿触发的,并且通常在一段时间内保持高电平,而不是单个周期?因此,如果它已经在进行中,我将立即导致中断发生。看起来 PET 中断一直保持活动状态,直到 CPU 确认它?

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

我处于 phone 状态,所以除了提供这些陈词滥调之外很难进行更彻底的评估;稍后我会尝试适当地复习。这些有用吗?