HC-88でプログラミング! その5

f:id:PocketGriffon:20201016214758j:plain

ぎっちぎちなROM空間!

6301CPU側のROM解析を始めて1日経ちました。

だいたい覚えた&理解した(^-^)

むしろ逆アセンブラ(自作ツール)を充実させてた時間の方が長いと思うw

エントリアドレスやらワークエリアの情報を設定ファイルに記載して渡してやると、自動的に逆アセンブルリストに追加してくれるようにした。このおかげで、解析しながら設定ファイルを充実させていく事でどんどんリストが見やすくなる。

↓これはツールが出力された状態のファイル。

f:id:PocketGriffon:20201016213809j:plain

 

長年アセンブラばっかり触っているので、大体どのCPUのニーモニックであっても読み書きするのに困らない…と自負してるが、6301の「AIM / OIM / EIM / TIM」には慣れない…。それぞれ「And Immediate Memory」「Or / Eor / Tst」らしいのですが、アキュムレータを介さずに演算出来るところが素晴らしい。

アタマの中で「あいむ、おいむ、えいむ、ていむ」って呼んでますw

 

解析してみて分かってきたんだけどが、よくぞこれだけの機能を4KBのROMに納めたなぁ…って思う。今わかっている範囲だけど、なんと5バイトしか空いてない!(^-^;

もちろん、プログラムには省メモリ化のテクニックもちりばめられている。

 

例えばこんなコードがある。

$F000から実行されればAレジスタには$03が入り、その下の2行(CPX)は実行されるけど結果は気にせずJSRでサブルーチンコールされる。

F000 8603 LDAA #$03
F002 8C8602 CPX #$8602
F005 8C8601 CPX #$8601
F008 BDFF00 JSR $FF00

↓このコードの面白いところは、$F003から飛び込めばプログラムが変化するところだ。

F003 8602 LDAA #$02
F005 8C8601 CPX #$8601
F008 BDFF00 JSR $FF00

↑の場合はAレジスタに$02が入るのだ。

本来ならば↓のようなコードになるんだと思う。

F000 8603 LDAA #$03
F002 2006 BRA $F00A
F004 8602 LDAA #$02
F006 2002 BRA $F00A
F008 8601 LDAA #$01
F00A BDFF00 JSR $FF00

たかだか数バイト減らすためにこんな事を…とか言う無かれ! 1バイトを減らすために、ものすごく苦労した時代なのだ! 速度を取るかメモリを取るか、そんな事を大の大人が考え抜いてコードを書く時代だったのだ!(ちょっと大袈裟)

そしてこのようなテクニックがROMの至るところに入っている。
同じようなコードを昔FM-7(6809)で見たことがあったため、すんなり頭に入ってきた。

 

やりことをやるための調査が必要という大義名分…!

「HC-88でやってみたい事がある」という事を、以前ちょろっとだけ書いた。

実際に出来たらご紹介してみたいが、今のところは机上の空論に過ぎない。

作るためにはまだまだ調べないといけないことが残っているのだ。

 

アセンブラのソースを見てるだけではラチがあかず、エミュレータ書くか…って何度も思ったw でもエミュレータを書くには、今度はハードの情報が足りなさすぎる。途中でハマる事が見えているので、極力手をださないで行こうとココロの中で決めているw

 

今、これはどうしよう…と思っているのが6301用のアセンブラ。手元に適したアセンブラが無いのだ。そもそも6800のアセンブラを調べたこともない。

そんな大きなプログラムは組まないだろう…って自分でも思ってるんだけど、でもソースコードが変わるたびに相対ジャンプのアドレスを数えたくない!

過去にアセンブラは何度も書いているので、今回も書くべきか…

これはマジで悩み中(^^;

 

そんな事をもんもんと考えながら、今日も逆アセンブラリストとにらめっこするよ!

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