その他デバッグ用のインタフェースを記述しています。 _
|
内部ブロックRAMが余ったので、 CPUの命令レジスタをトレースする部分をくっつけました。 過去256命令を記録したものをシリアルポートから取得できます。 現在は確認できていませんが、 ハードウエアエラーや未定義命令などでトレース結果が役に立ちそうです。 | ! |
すくねえ… すくねえ… |
_ |_| ←こいつ |_|.
8セグメントとは言わないんでしょうか。 評価キットの取り扱い説明書にあるピン配置で表示してみてもサッパリだったので調べなおしました。
CQ出版社 Spartan-IIE300評価キット向け
instruct seg7_set any{ seg_data==0x0 : seg7 = 0b00111111; seg_data==0x1 : seg7 = 0b00000110; seg_data==0x2 : seg7 = 0b01011011; seg_data==0x3 : seg7 = 0b01001111; seg_data==0x4 : seg7 = 0b01100110; seg_data==0x5 : seg7 = 0b01101101; seg_data==0x6 : seg7 = 0b01111101; seg_data==0x7 : seg7 = 0b00000111; seg_data==0x8 : seg7 = 0b01111111; seg_data==0x9 : seg7 = 0b01100111; seg_data==0xA : seg7 = 0b01110111; seg_data==0xB : seg7 = 0b01111100; seg_data==0xC : seg7 = 0b00111001; seg_data==0xD : seg7 = 0b01011110; seg_data==0xE : seg7 = 0b01111001; seg_data==0xF : seg7 = 0b01110001; }
TAS(Tool-Assisted Superplay(Speedrun))の記録は [TASVideos] にまとまっていて、それぞれのゲームに対するキー入力ファイルや実行動画が公開されている。 TAS成果のファイルフォーマットとして .fm2 と .bk2 が扱いやすい。 .fm2はテキストファイルとしてそのままキー入力が記録されている。 .bk2は展開すると Input Log.txt が含まれていて、これがキー入力となっている。 それぞれテキストベースで、各行がそのフレームで入力するキー情報となっている。 以下は Input Log.txt の一部で、マリオがBダッシュしながらジャンプしているところ。
|..|...R..B.| |..|...R..B.| |..|...R..B.| |..|...R..B.| |..|...R..B.| |..|...R..BA| |..|...R..BA| |..|...R..BA| |..|...R..BA| |..|...R..BA| |..|...R..BA| |..|...R..B.| |..|...R..B.|
まずは自作エミュで実行してみて問題なし。 FPGAの方にもロジックを追加してみた。 一行を読み込みつつキー入力文字があればキー入力バッファの該当ビットに1を立てる。 これをVSyncのタイミングでバッファからキー入力レジスタに更新する。 コードはこのあたり。
キー入力情報は約数百kByteほどあり、どうFPGA内にバッファしようかと思ったけど、 60fpsで1フレームが約16.6msecに対し、SDカードからの1行の最大読み込み時間が約3.3msecほどのため、 全てをバッファする必要はなく、毎フレーム Input Log ファイルから1行分読み込んでいる。NES on FPGA:TAS input file 読み込めるようにしてみたけど、フレームパーフェクトでちゃんと動いてる。ちなみに1フレームでもずれると1面の土管に引っかかる pic.twitter.com/o9rScab7XX
— かんな丸?!!? (@pgate1) March 14, 2024
SNES on FPGAの方にも同様に実装してみたけど、 どうもフレームタイミングが合わず正常に動作しない。 DMAやAPUとの通信あたりでTASリファレンスエミュとの違いがあるのか何なのか調査中。