我正在 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