CASIO AI-1000を使ってみる!その5

HD61700のニーモニックや命令を覚えることを目的として、逆アセンブラを作り始めた。

f:id:PocketGriffon:20210724232659j:plain

↑これがソースの先頭に書いてあるコメントなんだけど、1発めからキレイに作れる感じがしなかったので、作り直す前提で作り始めてる。割り切り感満載のプログラムだ!

 

理由(のひとつ)は、今の時点では未定義命令の規模が見えてこないからだ。命令フォーマットが今分かってる分類に属していれば拡張で行けるんだけど、まーったく違う構造を有してるとすると、きっと作り直した方が早いかも…ってなるかも知れない(^^;

 

せっかくなので今回は「こんな感じの逆アセンブラ作ってます」というご紹介をしてみたい。

まだ出来上がってもいないモノを紹介するのはどーかと思うけど!!

 

仮設計

まず逆アセンブラを作ろうとしたら、命令フォーマットを調べる必要がある。

f:id:PocketGriffon:20210725003721j:plain

↑これはPB-1000コマンドファレンスに書かれている情報そのままだ。

なぜこれをわざわざExcelに書き移したのか…と言えば、これも未定義命令に対応するため。

おそらく…これ以外のフォーマットがあるんだろうな…と思い、自由に修正書き足しが出来る状態にしておきたかった。

 

手元にある資料では、どの命令がどのフォーマットに対応してるのかの情報が見当たらない。命令のバイト数から推測をしながら解析していくしかないかと考えている。

 

命令のデコード方針が決まったら、あとは各命令フォーマットのプログラムを書いていけば良い。1命令逆アセンブルするプログラムはワリと簡単に作れるのだ!

 

エントリファイル

私が作る逆アセンブラは、ほぼすべてエントリファイルを読み込むようにしている。

これはもう見てもらったら一発でわかるかと思う。

f:id:PocketGriffon:20210725005944j:plain

#…コメント行

F…読み込みファイル指定(バンク、アドレス、ファイル名)

E…逆アセンブルを始めるアドレス

C…そのアドレス行に挿入するコメント

 

指定のファイルを読み込み、指定されたアドレスから逆アセンブルを始める。

内部的にジャンプコードを認識し、プログラムの流れを追いかける形で逆アセンブルするアドレスを増やしていく。

内部的には2パス方式になっていて、最終的にはコードとデータが分離された状態の逆アセンブルリストが、コメント付きで出てくる…というワケだ。

 

これの利点は、プログラムの解析結果をエントリファイルに付け加えていけば、機械的に出力される逆アセンブルリストにコメントがどんどん挿入されていく事だ。

 

テーブルジャンプなどを自動的に判別させるのが簡単ではないので、そこは手動でエントリファイルへ追加していく流れとした。

まだ開発中なので機能が充実していないが、過去に作ったものでは「M…メモリ書き換え」とか付けていた!

 

そして一度プログラムを完成させておけば、PB-1000用のエントリファイルを追加するだけでPB-1000にも対応が出来る。

 

解析を始めたいんだけど…

アセンブラを作っている最中に、テストでROMの逆アセをしようとしたが、はて、どこのアドレスから解析をしたら良いのかが分からない。

 

そもそもHD61700というCPUは、電源を入れた時にどのアドレスから実行が開始されるんだろうか…?? こればっかりはCPUによって違うので、情報がないとどーにもならない。

手持ちの資料を見てみたが、バンクレジスタについてはRESET時の動作が書かれていたが、PCについては記述が無い気がする…。

ここは(勝手に)バンク0の&H0000からスタートする…と解釈したいが、残念ながら&H0000は例の見えないROM領域だ(T-T) 

 

どこかエントリになりそうなアドレス情報がほしい!

アセンブラの動作確認用なので、プログラムの場所であればワリとどこでも良い。

ROMの中を探してみる事にするが、手当り次第探すだけの根性もない(^^;;

 

そこで命令コードに着目する事にした。どこかしらの場所に「JP m」という命令が並んでいる可能性がある。ジャンプテーブルだったりHookだったりする場所があるに違いない。

そうして&H37(JP m)の命令コードをROMの中から探してみる。

f:id:PocketGriffon:20210725012249j:plain

……ものすごくジャンプ命令が並んでる感じがしない!?

先頭から「JP &H30FE」「JP &H3168」「JP &H01BC」…という感じに読める。

内蔵ROMのアドレスへ飛ぶのは解析出来ないが、外部ROMならば解析が可能だ。

よっし、こんな感じで解析していこう(^-^)

 

なんだか地道な事をやってるな…と思われるだろうが、まさにそうかも(^^;

この先は、きっとアセンブラも自作するんだろうな…と思う。アセンブラについては少し思うところがあるので、今回は冒険してみようと思ってる!(意味深

 

まだHD61700を理解していると言えるレベルでは到底ないけれども、とても直行性の高いアーキテクチャっぽく感じている。コンパイラが作りやすいんだろうなぁ…と思ってるけれども、C言語とか用意されちゃったりしてないのかな…??

 

なんだか夢が広がるCPUだなー!(^-^)

ココ数日は妄想ばっかりが広がってる(^^;;

 

ではまた次回(^-^)ノ