9

我正在 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 的中断测试套件的方式。在堪萨斯熔岩模拟器中运行它指出了我最初的中断实现中的大量错误:

  • 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
4

1 回答 1

2

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

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

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

于 2015-07-05T14:17:06.487 回答