9

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旗がいたるところにありました
  • IIRQ 割り込みは、到着時に設定されていない限り完全に無視されました (正しい動作は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
4

1 に答える 1

2

割り込みはキューに入れられません。割り込みラインは各命令の最後から 2 番目のサイクルでサンプリングされ、それがアクティブであり、設定を解除すると、次にフェッチ/デコードの代わりに割り込みへのジャンプが発生します。混乱は、IRQ がエッジ トリガーではなくレベル トリガーであり、通常は 1 サイクルではなく一定期間 High に保持されることでしょうか? したがって、クリアすると、割り込みが既に進行中の場合、すぐに割り込みが発生します。CPUがそれを認識するまで、PET割り込みがアクティブに保持されているように見えますか?

セマンティクスにも注意してください。最終サイクルでフラグSEIを調整します。CLI割り込みにジャンプするかどうかの決定は、前のサイクルで行われました。したがって、SEI割り込みが発生したときの最後の処理として、I を設定して割り込みルーチンに入ります。ヒットしたときに割り込みがアクティブな場合CLI、プロセッサはCLI分岐前の後に操作を実行します。

私は電話中なので、それらの決まり文句を提供するよりも徹底的に評価することは困難です。後でちゃんとレビューしようと思います。それは役に立ちますか?

于 2015-07-05T14:17:06.487 に答える