TANDY 200でプログラミング その3

f:id:PocketGriffon:20210709145237j:plain

TANDY200でマシン語プログラムを楽しんでいる。

直接バイナリのデータを送り込める機能がTANDY側にないため、マシン語プログラムをBASICのDATA文に入れてTANDYへ送り込み、実機上でPOKEした後に動かしていた。

 

f:id:PocketGriffon:20210709145623j:plain

↑こんな感じのBASICプログラムを自動生成して送り込むのだ!

これの利点は、まだマシンのことがあんまり分かっていない状態であっても、BASICプログラムさえ動けば各種実験がレトロマシン←→ホストマシンを通じて、比較的簡単に出来る点だ。

 

逆に欠点を言えば、実際に送り込みたいバイナリに比べて4倍くらいのサイズを送り込まないといけないこと、そしてBASICのPOKE文が想像以上に遅いことだ。

そのため、プログラムを更新してからロード→実行までの時間が結構掛かる。マシン語のプログラムが1KBを超える辺りから、分単位で時間がかかるようになる。プログラムにグラフィックデータを含んだりするとサイズがどどーんと大きくなり、先日の花札表示プログラムなどはだいーぶ気長に待つことになった。

 

バイナリ通信プログラムを作ってみたい!

過去のマシンでも同じような問題にぶち当たり、そのたびにバイナリ通信プログラムを開発してきた。せっかくなのでTANDY200でも作ってみよう!

 

…と思ったが、ここで困った問題に直面する。私はTANDYについて何も知らない。

そう、マシン語からシリアル転送をする方法が全く分からないのだ。TANDY200のROMを解析していってるが、RS-232C通信のエントリなどは全く探せていない。……さすがにピンポイントに探すの大変じゃね??(ToT)

 

途方に暮れつつもROMの解析を進めていくと、おぼろげながらも「とあること」に気がついた。

私はTANDY200とPC-8201の「マシン語レベルでの互換性」は無いと見ている。BASICは良く似ているけれども、マシン語プログラムはバイナリレベルでの共有が出来ない。

 

そう思いつつROMを見ていったのだけど、なーんとなくマシン語プログラムの中に「PC-8201の面影が残っている」ことに気がついた。アドレスはずれているけれども、良く似た構造が存在しているのだ!

 

例えばコレ。

f:id:PocketGriffon:20210709151201j:plain

8316hからが(Z80風で言う)LDIR、8321hからがLDDRのルーチンだ。

この処理、実はPC-8201にも同じものが存在していて、それぞれ6C78h、6C83hにある。

機械的に同じようなコードを探し出すことで、PC-8201の資料がとても役立つことに気づいたのだ(^-^)

 

やはりTANDY200は、PC-8201のROM(正確にいえばTANDY102?)を拡張する形で作られたんだろうな…と思った!こんなところで遺伝子を感じるとはw

 

マシン語のプログラムが見えてくると、解析もどどーんと進むようになった。

RS-232C通信をするのに必要なのは「RS-232C初期化」「RS-232Cから1バイトを得る」「RS-232C終了」の3つだ。これを探し出す事ができれば通信プログラムは作れそうだ!

 そしてそれらはとても簡単に見つかった!(^O^)

 

他にもタイマー割り込みの許可/不許可、16進数値→10進文字列変換などの有効なルーチンを見つける事が出来たので、これらも活用してバイナリ通信プログラムを組み立てる!

 

びっくり仕様が発覚!

先日のブログにも貼り付けたが、このページにあるビット長の説明にこんな事が書かれていた。

Tandy 200 (and 100) transfer to PC

「don't be fooled. You can't send 8 bit data」

直訳すれば「8bitの指定が出来るけど騙されちゃいけないよ!」的な注意文だ。

これはBASICで指定した場合には出来ないってことなんだろうな…と軽く考えていたw

そしたら……なんと実際に8bitのデータが受け取れないようなのだ!

 

8bit長のデータが受信できないという事は、マシン語データをそのままバイナリの形式で送る事は出来ないということになってしまう…orz

 

…出来ない事を悔やんでも仕方ない!でもBASICでマシン語データを贈り続けるのにも限界を感じている…どうするか!

…というわけで、単純に1バイトデータを2バイトASCIIに変換して送り込むことにした!

 

PNAANABOAACBBCNAHOLHMKBBNACDOFMNDMFAOBMDADNAMJEIGFGMGMGPCAFHGPHCGMGEAA

↑の2枚めの写真でお見せしたプログラムはこんな感じのテキストに変換される

f:id:PocketGriffon:20210709154020j:plain

BASICプログラムと比べると1/3のサイズとなった。本来のバイナリだったら、さらに半分なのだが致し方ない(T-T)

 

バイナリ転送プログラムと称しながらアスキーファイルを受け付けるのはどーかと思うけれども、まぁそれは誤差の範囲で(!?) ファイル名もbinと巧妙だ!(ひどい)

 

完成した転送プログラム

f:id:PocketGriffon:20210709155325j:plain

常にメモリに常駐する通信プログラムとなるので、出来る限りサイズを小さくしたい希望がある。希望は256バイト以下にしたかったが、説明文を表示させておかないと後で使った時にわからなくなりそうだったので、無理に省メモリ化はせず512バイト以内を目指した。

 

通信バッファはRAMのFFBBh〜FFFAhの64バイト固定となっていて、プログラムにハードコーディングされているため、場所を移動したり大きさを変更する事が出来ない。

 

私が作るプログラムは、常に先頭アドレス=実行開始アドレスとしている。転送が終わったらそのまま実行しても良いが、やはり気持ちを落ち着かせた上で実行開始をしたいw

そこで通信プログラムが終わった時点で、F8(ファンクションキー)に「CALLアドレス」を定義する事とした。F8キーを押せば読み込まれたアドレスから実行が出来るようになる。

これは便利!(^-^)

 

よーし、これで開発効率が爆上がりだ!!(^o^)

 

ところで…

TANDY200を使い始めた時に新品のアルカリ電池(単3電池4本)を入れたのだが、それ以来そのまま使い続けているけど電池切れにならない!

 このサイズの液晶を持つマシンとしては驚きの長持ちな気がする!

 

スペック的には10〜16時間くらい持つらしいので、いったん電池切れまでは使い続けてみたい。充電池を使いたいけれども、その場合は電圧が心配だ…。

 

本体のホワイトニングもしてみたいし、バンクを切り替えた先のメモリも有効活用してみたい。まだまだ遊ぶ事がたくさんあるなぁ!(^-^)

 

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