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 の interrupt testsuiteにたどり着いた方法です。Kansas Lava シミュレーターで実行すると、元の割り込み実装に大量のバグが指摘されました。
I
割り込みハンドラに入ったときにフラグが設定されませんでしたB
旗がいたるところにありましたI
IRQ 割り込みは、到着時に設定されていない限り完全に無視されました (正しい動作はI
、設定されているときに割り込みをキューに入れ、設定が解除されたときに割り込みを処理する必要があるようです)。
これらを修正した後、Klaus Dormann テストを正常に実行できるようになったので、マシンを実際の FPGA にロードし直して、BASIC クラッシュがなくなることを期待していました。
ただし、これらすべての割り込みバグが修正され、シミュレータでの割り込みテストに合格した新しいバージョンでは、キーボード入力に応答しなかったり、実際の FPGA でカーソルが点滅したりすることさえありません。キーボード入力とカーソル点滅の両方が外部 IRQ (画面の VBlank 信号から接続) に応答して行われることに注意してください。これは、修正バージョンが何らかの形ですべての割り込み処理を壊したことを意味します ...
何がうまくいかないのか、またはこれをデバッグし始める方法について、漠然とした提案を探しています。
完全なコードはhttps://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewriteで入手できます。問題のあるコミット (テストを修正して PET を壊すもの) は7a09b794afです。これは最小限の実行可能な複製とは正反対であることを認識していますが、変更自体はごくわずかであり、どこで問題が発生するのかわかりません。また、問題を再現するには、ストックコモドール PET ROM を起動するのに十分な機能を備えたマシンが必要であるため、変更は必要ありません。縮める方法がわからない…
追加した:
ストック PET ROM の代わりに非常に単純な (あえて最小限の) 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