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



我正在FPGA上构建Commodore PET。我已经在堪萨斯熔岩中实现了我自己的 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的中断测试套件的方式。在堪萨斯熔岩模拟器中运行它指出了我原始中断实现中的大量错误:

  • 进入中断处理程序时未设置 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

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

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

我正在打电话,所以很难比提供这些陈词滥调更彻底地评估;我稍后会尝试正确审查。这些有帮助吗?

最新更新