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

f:id:PocketGriffon:20210722190648j:plain

先日から取り組み始めたAI-1000!

twitterで詳細をツイートしていくと、なんだか読んでる人も盛り上がってくれてるような気がする(^^; 進む先は困難しか待ち構えてないぞ…とも読めるし(^-^;;

 

頂いた話でとても気になったのが「未定義命令がそれなりにあるらしい」「メモリの見えない部分があるっぽい」の2つ。この2つの影響が、解析中にどのくらいクリティカルヒットなのか、今は想像も出来ないが、どちらも自分の手に負える気がしていない(^^;

 

まぁ飽きっぽい私ですので、楽しめているうちは頑張っていこうと思う!

 

さて、今までの流れのように「通信を確立」→「ROMデータの引っこ抜き」→「解析」という感じに進めていこうと考えていたが、どうやらそんな単純でもなさそうだ…と気がついた。

気がつくまでの段階で何をやっていたのかを書いていってみたい。

 

メモリ内容をホストマシンへ送る

まずはともあれ、見えているメモリ情報をホストへ送る事をやっていきたい。

BASICからRS-232Cが使えるようになれば、特に難しい話ではない。

f:id:PocketGriffon:20210722200937j:plain

16バイト分を文字列に変換してCOM0:へ出力すれば良い。

実際に動かしてみたところ、16バイトを転送するのに1秒くらい掛かる。64KBを転送するのに約70分くらい掛かる計算だったけど、測ってみたらホントにそのくらいで終わったw

※後に気がつくことになるのだが、実はこのプログラムではダメらしい(^^;;

 

ホスト側で受け取ったテキストのデータを、バイナリへ変換するツールをさくっと作る。

TANDY200でも同じような事をやっていたので、そのソースを移植しただけ(^-^)

これで64KB分のメモリ内容がホストで見られるようになった。

RAMの状況、ROMのデータが含まれている事を祈っていたのだが…汗

 

開発する環境を考えてみる

さて、HD61700の開発を行うための環境について考えてみる。

歴史が長いCPUなので、世の中には優れたアセンブラ、逆アセンブラがあるんだと思う。

もしかしたらコンパイラなども用意されているのかも知れない。

 

しかし今回は(も?)出来る限り自前で作っていきたいと考えてる!

だってそういう環境を作るのも楽しみのひとつじゃん!(^-^)

その代わり、完成度の高い環境は期待出来ないが、その見返りとしてデンジャラス感も楽しめるw

 

というわけで、まずはROMデータを解析するための逆アセンブラを検討をし始める。

私は、自分が所有していない機種についても、出来る限り書籍を購入してきた。

しかし…X1とPB関連の資料はびっくりするほど所有していない。PB-1000に関する資料は……もしかして1冊もないかも???

 

手元にあるのはAI-1000、PB-1000に付属してきた説明書のみ…に近い。

あ、ポケコンジャーナルはほぼ全部揃ってるので、これも参考になりそう。

 

f:id:PocketGriffon:20210722214831j:plain

↑すっかり忘れていた存在として、国会図書館で「PB-1000テクニカルハンドブック」の一部を複写してきてあった。しかしPB-1000のハードやROMに関係しているところを複写してあったので、これがAI-1000で活用できるとはあんまり思えない(T-T) もしかしたら内部ROMのエントリだけは一緒とかないかなぁ…(望み薄そう)。

 

アセンブラ検討

私はCPUの機能やニーモニックを覚えるという意味で、逆アセンブラを作る事が多い。ROMの解析にも使えるので一石二鳥だ!

 

アセンブラを作るためには、各命令のバイナリコードを知る事が必要だ。これはPB-1000付属のマニュアル「PB-1000コマンドリファレンス」の最後にある「ニーモニック一覧」が役に立った。

f:id:PocketGriffon:20210722215845j:plain

…頭の回転が良くない私は、これを見ただけではバイナリの分布などが分からない。

一旦Excelなどにまとめてみる。

f:id:PocketGriffon:20210722220353j:plain

こんな感じに私は書いて(打って)覚えるという方法をとる(^-^) 昔っから人よりも手間を掛けないと覚えない頭の悪さがある!(自慢

出来上がった表を見てると、いくつかのことに気がつく。

まず同じコードに複数の命令が入ってる事だ。

これは2バイト目以降にプリフィックスが入ってるんだろうと予想。そう思ってもう一度本を見直すと、何のことはない、書いてあったw

f:id:PocketGriffon:20210722221740j:plain

最初の1バイトを読んだだけでは命令が確定しない。ここは注意ポイント!

 

もうひとつ気がついた点は、未使用となっているコードが多い。2バイト目にまたがるプリフィックスの存在もあることから、未定義命令の存在が疑われた。

Twitterで嘆いたところ、やはり未定義命令があるっぽい。

うーん…これはどうにもならないなぁ…orz

せめてROMの中で使われていないことを祈りたい!

 

バイナリを見て疑問に思う…

実機から転送してきた64KBのバイナリを見て……ここでも気がつくことがあった。

それは……どうもRAMっぽいデータが並んでいるのだ。

f:id:PocketGriffon:20210722222926j:plain

↑例えばコレ。アドレスが$0800付近にBASICプログラムらしいものが入っている。そのままテキストが見えているので、メモリディスクにセーブされたテキストデータのようだ。

 

f:id:PocketGriffon:20210722223354j:plainf:id:PocketGriffon:20210722223415j:plain

↑同じように$8000とか$C000の辺りを見ても、やっぱりプログラムコードっぽくない。

どうやらPEEK命令ではROMが見えないのかも知れない。

 

そう思ってどっかにメモリマップがないかなぁ…と探してみると、やっぱりあったw

先に資料を見なくちゃダメだ!(T-T)

f:id:PocketGriffon:20210722223821j:plain

↑これを見る限り、BASICのPEEK命令はバンク1のデータを読むっぽい。

……はたしてBASICからバンク0を読む方法があるんだろうか…汗

 

もうひとつ、気になる記述を見つけてしまった。

f:id:PocketGriffon:20210722224308j:plain

↑これ!

これはCLEAR命令の説明文章の一部なんだけど「BASICのPEEK、POKE、MONで読み書き可能な、領域を確保」と書かれている。

もしかして…CLEAR文で宣言したアドレス領域以外は読むことが出来ないんだろうか??

 

…そんな事を調べてみたら、もっと厄介なことに気がついた!

BASIC命令の中に、マシン語を実行する命令が無い気がするのだが……滝汗

……いやそんなはずは無い気もするし…。

頑張って過去のポケコンジャーナルなどを漁ってみる!

 

そんな感じの流れが「今」だ!

最初のメモリを引っこ抜くところまで戻らないといけなくなってしまった!

うむむ…これは一筋縄ではいかなくなってきてるよ(T-T)

けっこう大変なモノに足を踏み入れた感がしないでもない…orz

次回、もう少し調査を進めてみたい!

 

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