独立测试与 Commodore PET 中 6502 的中断行为
Interrupt behavior of a 6502 in standalone test vs. in a Commodore PET
我正在 FPGA 上构建 Commodore PET。我在堪萨斯熔岩中实现了我自己的 6502 核心(代码可在 https://github.com/gergoerdi/mos6502-kansas-lava), and by putting enough IO around it (https://github.com/gergoerdi/eightbit-kansas-lava 获得)我能够在其上启动原始的 Commodore PET ROM,获得闪烁的光标并开始输入。
但是,在输入经典 BASIC 程序后
10 PRINT "HELLO WORLD"
20 GOTO 10
一段时间后(几秒后)崩溃
?ILLEGAL QUANTITY ERROR IN 10
因为我的代码具有相当合理的每个操作码测试覆盖率,并且它通过了 AllSuiteA, I thought I would look into tests for more complicated behaviour, which is how I arrived at Klaus Dormann's interrupt testsuite。 运行 它在 Kansas Lava 模拟器中指出了我最初的中断实现中的大量错误:
- 进入中断处理程序时未设置
I
标志
- 到处都是
B
旗帜
- IRQ 中断被完全忽略,除非
I
在它们到达时被取消设置(正确的行为似乎是在设置 I
时将中断排队,并且当它被取消设置时,它们仍然应该被处理)
修复这些问题后,我现在可以成功 运行 Klaus Dormann 测试,所以我希望通过将我的机器重新加载到真正的 FPGA 上,幸运的话 BASIC 崩溃可能会消失。
然而,新版本修复了所有这些中断错误,并在模拟器中通过了中断测试,但现在无法响应键盘输入,甚至只是在真实 FPGA 上闪烁光标。请注意,键盘输入和光标闪烁都是响应外部 IRQ(从屏幕 VBlank 信号连接)完成的,因此这意味着 固定版本以某种方式破坏了所有中断处理...
我正在寻找任何可能出错的模糊建议或我如何开始调试它。
完整代码可在 https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite, the offending commit (the one that fixes the test and breaks the PET) is 7a09b794af 获得。我意识到这与最小可行复制完全相反,但变化本身很小,因为我不知道哪里出了问题,而且因为复制问题需要一台功能足以启动股票 Commodore PET ROM 的机器,我不知道不知道如何缩小它...
已添加:
我用一个非常简单的(我敢说是最小的)ROM 而不是库存的 PET ROM 在相同的硬件上重现了同样的问题:
.org $C000
reset:
;; Initialize PIA
LDY #
STY $E813
LDA #30
STA
STA 00
CLI
JMP *
irq:
CMP $E812 ; ACK irq
DEC
BNE endirq
LDX 00
INX
STX 00
LDA #30
STA
endirq: RTI
.res $FFFC-*
.org $FFFC
resetv: .addr reset
irqv: .addr irq
中断没有排队;中断线在每条指令的倒数第二个周期被采样,如果它是活动的,我取消设置,然后跳转到中断而不是 fetch/decode。令人困惑的是 IRQ 是电平触发的,而不是边沿触发的,并且通常在一段时间内保持高电平,而不是单个周期?因此,如果它已经在进行中,我将立即导致中断发生。看起来 PET 中断一直保持活动状态,直到 CPU 确认它?
还要注意语义:SEI
和 CLI
在最后一个循环中调整标志。是否跳转到中断的决定是在之前的循环中做出的。因此,SEI
作为中断进入时的最后一件事,您将进入我设置的中断例程。如果在您点击 CLI
时中断处于活动状态,则处理器将在分支之前执行 CLI
之后的操作。
我处于 phone 状态,所以除了提供这些陈词滥调之外很难进行更彻底的评估;稍后我会尝试适当地复习。这些有用吗?
我正在 FPGA 上构建 Commodore PET。我在堪萨斯熔岩中实现了我自己的 6502 核心(代码可在 https://github.com/gergoerdi/mos6502-kansas-lava), and by putting enough IO around it (https://github.com/gergoerdi/eightbit-kansas-lava 获得)我能够在其上启动原始的 Commodore PET ROM,获得闪烁的光标并开始输入。
但是,在输入经典 BASIC 程序后
10 PRINT "HELLO WORLD"
20 GOTO 10
一段时间后(几秒后)崩溃
?ILLEGAL QUANTITY ERROR IN 10
因为我的代码具有相当合理的每个操作码测试覆盖率,并且它通过了 AllSuiteA, I thought I would look into tests for more complicated behaviour, which is how I arrived at Klaus Dormann's interrupt testsuite。 运行 它在 Kansas Lava 模拟器中指出了我最初的中断实现中的大量错误:
- 进入中断处理程序时未设置
I
标志 - 到处都是
B
旗帜 - IRQ 中断被完全忽略,除非
I
在它们到达时被取消设置(正确的行为似乎是在设置I
时将中断排队,并且当它被取消设置时,它们仍然应该被处理)
修复这些问题后,我现在可以成功 运行 Klaus Dormann 测试,所以我希望通过将我的机器重新加载到真正的 FPGA 上,幸运的话 BASIC 崩溃可能会消失。
然而,新版本修复了所有这些中断错误,并在模拟器中通过了中断测试,但现在无法响应键盘输入,甚至只是在真实 FPGA 上闪烁光标。请注意,键盘输入和光标闪烁都是响应外部 IRQ(从屏幕 VBlank 信号连接)完成的,因此这意味着 固定版本以某种方式破坏了所有中断处理...
我正在寻找任何可能出错的模糊建议或我如何开始调试它。
完整代码可在 https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite, the offending commit (the one that fixes the test and breaks the PET) is 7a09b794af 获得。我意识到这与最小可行复制完全相反,但变化本身很小,因为我不知道哪里出了问题,而且因为复制问题需要一台功能足以启动股票 Commodore PET ROM 的机器,我不知道不知道如何缩小它...
已添加:
我用一个非常简单的(我敢说是最小的)ROM 而不是库存的 PET ROM 在相同的硬件上重现了同样的问题:
.org $C000
reset:
;; Initialize PIA
LDY #
STY $E813
LDA #30
STA
STA 00
CLI
JMP *
irq:
CMP $E812 ; ACK irq
DEC
BNE endirq
LDX 00
INX
STX 00
LDA #30
STA
endirq: RTI
.res $FFFC-*
.org $FFFC
resetv: .addr reset
irqv: .addr irq
中断没有排队;中断线在每条指令的倒数第二个周期被采样,如果它是活动的,我取消设置,然后跳转到中断而不是 fetch/decode。令人困惑的是 IRQ 是电平触发的,而不是边沿触发的,并且通常在一段时间内保持高电平,而不是单个周期?因此,如果它已经在进行中,我将立即导致中断发生。看起来 PET 中断一直保持活动状态,直到 CPU 确认它?
还要注意语义:SEI
和 CLI
在最后一个循环中调整标志。是否跳转到中断的决定是在之前的循环中做出的。因此,SEI
作为中断进入时的最后一件事,您将进入我设置的中断例程。如果在您点击 CLI
时中断处于活动状态,则处理器将在分支之前执行 CLI
之后的操作。
我处于 phone 状态,所以除了提供这些陈词滥调之外很难进行更彻底的评估;稍后我会尝试适当地复习。这些有用吗?