【发布时间】: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