たま日記

たまに書く

コールグラフを描いてみた

TX81Zの解析を続けている。MAMEのデバッガには逆アセンブラが内蔵されている。しばらく使っていたのだが実行場所から離れたアドレスのコードが表示できないことがあったり、switch-case文的な意味合いのコードを文面通りにしか出力してくれなかったり、不便に思えた。

作るのは難しくなさそうなので、MAMEソースツリー内の6800dasm.cppを参考にJavaで逆アセンブラを作った。メモリ64KB時代のプログラムの解析のために現代のPCの潤沢なメモリを使う気持ちよさを味わえた。富豪プログラミング、とは少し違うか…。

YM2414のレジスタに書き込む部分、本体のボタンで音色を変更する部分などを中心に処理の流れを追い始めたのだが、全体の流れも知りたくなった。そこでサブルーチン間の呼び出し関係を解析してコールグラフを作成してみた。

プログラムの開始アドレス

5つある。

  1. $8000:リセット後に実行されるアドレス。初期化などをした後、$82A2~$82B8のメインループを実行する。
  2. $802E:YM2414からの割り込みを処理するハンドラ。
  3. $800D:Timer1 Output Compare1,2の割込みハンドラ。前回の積み残し。動作はまだ解析できていない。MAMEの動作を見ていると、MIDIキーボードのキーオン時に1回、キーオフ時に1回呼び出されている。
  4. $8023:SIO割込みハンドラ。MIDIデータが到着したりするときに実行されるみたい。MIDIってシリアル通信で実現されているものだったんですね。知らなかった!
  5. $8018:Timer2 Counter Matchの割り込みハンドラ。一定時間ごとに呼び出される。PMD/AMDを変化させたり、ポルタメントやピッチベンドを担当しているようだ。

コールグラフ

次のプログラム片をサブルーチンと見なしたときのコールグラフを作成した。

  • jsr/bsrで呼び出されるアドレスから始まる
  • rtsで終了する
  • braやjmpなどでつながっている

開始アドレス2.~5.から始まるグラフはこんな感じ。Graphvizに描いてもらった。

$802E、$800D、$8023、$8018からのコールグラフ

開始アドレス1.のコールグラフは貼るには大きすぎるので自粛。本体の音色変更ボタンを押したときに実行される部分($91FE~$92B5)を代わりに貼る。左から2列目の各サブルーチンでYM2414のレジスタに書き込みを行っている。

音色変更時のコールグラフ

次は

コードやテーブル、音色データなどがROMのどこにあるのかは把握できた。次は各サブルーチンの処理内容を読んでSRAMのメモリマップを作ってみたい。