Cac*_*tus 8 interrupt 6502 emulation lava commodore
我正在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
Run Code Online (Sandbox Code Playgroud)
它会在一段时间后(几秒钟后)崩溃
?ILLEGAL QUANTITY ERROR IN 10
Run Code Online (Sandbox Code Playgroud)
因为我的代码具有相当合理的每操作码测试覆盖率,并且它通过AllSuiteA,我想我会考虑更复杂行为的测试,这就是我如何到达Klaus Dormann的中断测试套件.在Kansas Lava模拟器中运行它已经指出了我原来的中断实现中的大量错误:
I进入中断处理程序时未设置该标志B标志是所有的地方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
Run Code Online (Sandbox Code Playgroud)
中断不会排队;中断线在每条指令的倒数第二个周期进行采样,如果它当时处于活动状态,并且我取消设置,则接下来会跳转到中断,而不是获取/解码。令人困惑的是,IRQ 是电平触发的,而不是边沿触发的,并且通常会在一段时间内而不是一个周期内保持高电平?因此,如果中断已经在进行中,则清除 I 将立即导致中断发生。看起来 PET 中断在 CPU 确认之前一直保持活动状态?
另请注意语义:SEI并CLI在最终循环中调整标志。是否跳转到中断的决定是在之前的周期中做出的。因此,SEI当中断到来时,最后一件事是,您将进入我设置的中断例程。如果当您点击 a 时中断处于活动状态,CLI则处理器将执行CLIbefore 分支之后的操作。
我正在打电话,所以很难比提供这些陈词滥调更彻底地评估;稍后我会尝试正确审查。这些有帮助吗?
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |