BASICのROMをげっと!
先日から触り始めたJR-800。
もっと戯れてみたいけれども、シリアルでの通信もカセットインターフェースでのやりとりもうまくいかず、なかなか突破口の見えない状態が続いていた。
本体でその場限りのBASICを使っていても大した解析は出来ないよなぁ…と思う日が続く。
なにげにメモリダンププログラムをBASICで書いてみた。$8000以降はBASICのROMが入っている事が分かっているので、そこを表示させてみた感じだ。この時には気がついてなかったが、1バイトの上位4ビットが0に化けてたw
JR-800のHuBASICは、ちゃんとHEX$が装備されていてメモリダンプが作りやすい。唯一びっくりしたのが論理演算のANDが無い(^^; チェックサムの下位8ビットのみを残そうとして「SUM AND 255」とやったらError。さすがにANDが無いとは想像もしていなかったので、エラーの原因が分かるまで相当「うーん」ってなった!
試しに最初の数バイトだけを打ち込んでみる。
うんなるほど、こんな感じか。最初のアドレスは生成するプログラムをちゃちゃっと書いてやれば良いし、スペースもナシで大丈夫か…そこまで見づらくはない。
打ち込んでみると4バイト4バイト1バイトって感じで区切りもわかりやすい。
……出来るところまで打ち込んでみるか!!(^^;;;
JR-800のメモリマップはこんな感じ。
ROMは$8000〜$BFFFの16KBと、$F000〜$FFFFの4KB、合計20KBだ。
BASICのプログラムを改造して、7行表示してキー入力待ち、キーが入ったら次の7行を表示する…という単純なダンプを作った。それと合わせてパソコン側で打ち込んでいく。チェックサムは入力だけしておいて、あとで合わせるという魂胆だ。
ひたすら20KBをちまちまと打ち込む作業が始まった(^-^;
それからは何かちょっとでも手が空いた時間が出来ると、写経のごとく打ち込んでいく。これがZ80のダンプリストだったら「あ、ブロック転送してる」「ここでループしてるのか」とかバイナリから感じ取れる構造があるんだけど、これは6301。バイナリコードをまーったく暗記していないので、ひたすら16進文字を打ち込むだけの作業となる。
途中、ASCIIコードっぽい部分を打ち込む時にはちょっとだけ楽しかったがw
結局、トータル約8時間掛けて20KBを打ち込んだ!チェックサムの合わせにも約1時間くらい掛かった。もーやだ、ダンプ見たくないってところまで追い込まれた(^^;
解析のマネゴト
なにはともあれROMのバイナリコードが手に入った。これを逆アセンブルしてみるにする。
HC-88のスレーブCPUを制御するために必死に作った逆アセンブラがここでも生きる!
幸い、逆アセンブラはHC-88に依存せずに作ってあったので、JR-800のROMでも問題なく動かす事が出来た。ただ…HC-88では使われていなかった命令(ちゃんとした6301の命令)がいくつもあったため、中途半端に作られていた逆アセンブラの完成度を高める必要はあったがw
6301CPUはリセットされると$FFFEに書かれた2バイトをPCの値として取り込む。
とっかかりとして分かっているのはこの情報だけだ。
逆アセンブラリストを見て真っ先に思ったのは「やべぇ、6301忘れてる」(^^;;;
あれだけHC-88の時に入れ込んでいたのに、もはやレジスタ構成すら忘れてる体たらく(^^; もう一度復習するところから始める事に……orz
ブートするコードを追いかけていくと、なんだか値を見て分岐する箇所があった。マニュアルを見たところ「R+S+Tを押しながら起動するとコールドスタートする」という機能があるらしい。ははぁなるほど、キー情報はこうやって読み込んで判断していくのか。
さらに起動時の「JR-HuBASIC 1.0」を表示するコードを発見。ということはコレは文字列表示ルーチン、その先に呼び出されるのが1文字表示ルーチンだ。
1文字表示ルーチンを見ていくと、$00〜$1Fは文字表示というよりは機能コード(コントロールコード)となっていて、32個のテーブルジャンプで構成されている。という事はこっちが画面クリア、こちらがカーソル移動か…。
みたいな感じで、ちょっとずつ手がかりを見つけながら解析をしていってる。
何か作ろうにもコードを送り込む方法が無いので、今のところは何も出来ないが…orz
気力が続くうちはもう少しだけ頑張ってみるよ!!
何か作れたらホント楽しいだろうなぁ!!!(^-^)
ではまた次回!(^-^)ノ