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

f:id:PocketGriffon:20210708055552j:plain

先日、ROMのデータをホストマシンへ送るところまで成功した。

これでROM(の一部?)が逆アセンブル可能となった。

 

私自身、TANDY200の事をまーったく知らない。

カタログスペック的に知ってるのは、CPUに8085が使われているという事くらい。

ROMを引っこ抜けたとしても、結局のところは1から調べていかないといけない。

普通、こういう場合はうんざりするんだろうけれども、マイナー機種ダイスキーな私はこういうちまちました作業が大好き(^^; むしろこういう事をしたいがためにレトロマシンを使ってるとも言えるので、あまりまとめサイトなどを見に行く事はない。

 

とりあえず起動時に表示されるタイトル文字列(TANDY 200 Software...)のデータを足がかりに、表示系の解析から始めることとした。

今は画面に自由に画像を表示出来るところまで出来るようになった。

ここに至るまでの過程を、備忘録も含めて書いてみようと思う!(^-^)

 

そういえば、しれっとRS-232Cを繋げているが、これはMPRS-225Rという通信アダプタを使ってる。標準的な25ピンシリアルを持つ機種と簡単に繋げる事が出来るスグレモノだ!私はPC-8201やPC-8801などともこのアダプタを利用して接続している。

これ…今も手に入るのかな…。壊れてしまうといきなり通信する手段が無くなってしまうので、もうひとつ予備に手に入れておきたい気持ちが強いのだが…(T-T)

f:id:PocketGriffon:20210705003149j:plain

 

LCDコントローラを知る

1文字表示ルーチンを調べていくと、$FA30からスクリーンバッファがある事が分かった。はたしてVRAMそのものがメインメモリに配置されているのか、それとも何かのコントローラを通してアクセスするのか、まずはそこから調べていく。

 

PC-8201系列だとするとLCDコントローラが存在するのかも知れない。

ネットでTANDY200について調べてみると、分解記事を書いてくれている方がいた!この写真はホントに役立った!

 

LCDコントローラ(LCDC)はHD61830Bというチップが使われているらしい。

f:id:PocketGriffon:20210707133151j:plain

……聞いたこと無い(^^;;

PC-8201はHD41102Bというチップが使われていたので、この時点でハードウェア的な上位互換性は無さそうだ。

 

最近はチップ名さえ分かれば、ネット上でデータシートを見つけるのも簡単だ。さっそく調べてみると、詳しいデータシートが見つかった。ここに各レジスタへのアクセス方法なども詳細に記載されていた。これとROMのプログラムを照らし合わせながら見ていく事とする。

 

こういうデータシートって英語表記が多い……。そのままでも「技術資料に限っては」読み解く事が難しくないけれども、私はいつも翻訳しながら自分メモに書き直している。自分の体験的に「読めば覚えられる、書けば理解できる」という感覚があるため、面倒であっても自分の言葉で書き写すようにしている。おかげでさらっと読み流してしまいそうなところも、ばっちり理解できた…と思う(^^;;

 

どうやらI/Oポートは2つあり、コマンドレジスタ、データレジスタという感じで使うらしい。コマンドレジスタに設定したい項目(0〜15)を設定し、その情報をデータレジスタに書き込む。使い方としてはとても単純だ。

 

問題は…どの順番で設定しないといけないのか、などの情報が全く無い事だ。

簡単な実験プログラムを書いてみたところ、どうやらコマンド単体で独立して動くものばかりなような感じだ。こういうチップはとても使いやすい!(^-^)

 

グラフィックスを表示してみる!

まずはともあれ画面に画像を表示してみたい。こういう時は「豆腐」の表示が定番だ(^^; 画面に無機質な四角を表示させるため豆腐と呼ばれているようだけど、絵が用意出来ないプログラマとしてはコレが一番てっとり早い(^^)

 

ひとつ気になった事が。このLCDC、テキストモードとグラフィックモードの2モードあるらしい。それぞれのモードに特徴があるのは理解出来るが、おそらく混在した表示は出来ないはず。そしてTANDY200がどちらのモードで動いてるのかがはっきりしない。

 

BASICで文字を表示させつつPSET命令でドットを点灯させてみたところ、混在して表示されたことから、おそらくBASICではグラフィックモードで動いてるんだろうと推測。テキストモードの事は一旦忘れる事とした。いつか実験が出来たら…とは思う。

 

ちなみにこのLCDCには「ドットを打つ/消す」というコマンドが存在している。BASICのLINE文を高速に実行するためのモノだろう…と思っているのたが、PSET時のアドレス計算が複雑になっていて優位性を活かせていない。超高速LINEルーチンとか作りたくなっちゃうねw

f:id:PocketGriffon:20210708065638j:plain

 

そしてグラフィック表示実験中、奇妙な事に気がついた。VRAM自体は横方向にビットがドットに対応している、いわゆる水平型(PC-8801PC-9801と同じ)なんだけど、横が6ドットしか表示されない。そのため、横240ドットなのでてっきり240/8で30バイト1ラインかと思いきや、実際には240/6の40バイト構成だった!なんじゃこれは!(@_@;

 

確かに横8ドットの構成で6ドットフォントを表示しようとすると、SHIFTしてANDしてORする…など結構頑張らないといけない。ハード的に横6ドット構成ならば面倒な計算を省けるので表示は速くなるはずだ。その分、グラフィックを描画しようとすると横6ドットという計算がネックとなり、速度が遅くなる(上記でPSETが遅いと書いたのはこの部分)。

 

実はこれ、LCDCの機能のひとつだ。1バイト8ドットの構成のうち、何ドットを表示するかを指定出来る。指定できるのは6〜8の3タイプだけだ。ここに8を指定すれば、普通に1バイト8ドットが表示できるようになった。この機能は面白いw

f:id:PocketGriffon:20210708073737j:plain

↑ 1バイト8ドット

f:id:PocketGriffon:20210708073759j:plain

↑ 1バイト6バイト

 

もうひとつ、横方向のバイト数(先ほど書いた240/6=40バイト)も変更可能だ。ここは24/8=30バイトにするのが良さそうだ。アドレス計算的に32にした方がいいんじゃない?とも思ったが、LCDC側のアドレスを更新する処理が少し面倒になるので30とした。

 

メインメモリに256x128ドット分の仮想VRAM(4096バイト)を持ち、そこのメモリに対して描画を行い、出来上がったデータをLCDCへ転送する仕組みを作った。

f:id:PocketGriffon:20210708055552j:plain

ドットの並びはMSB→LSBの順(PC-8801など)ではなく、LSB→MSB(MZ-80B)となっている。そのため他の機種からデータを持ってくる際には変換が必要だった。

 

ところで…この実験をしている最中に気がついたけど、チップ的にVRAMは8KBあるっぽい。そして表示は240x128ドット/8ビットで約4KBだ。…ということは、設定の仕方によっては画面2枚分持てる??画面切り替えしてチラツキ無しとか出来そうな気もする。

VRAM→VRAMの転送(BitBlt)が機能があったら面白い使い方が出来たんだけど、さすがに年代的にそれは無かった。

 

LCDC的にVRAMが連続してアクセス出来る。10個のコントローラへ別々にアクセスが必要なPC-8201に比べて、VRAMへの転送プログラムは高速になる。かつLCDCへのアクセスがCPU速度についてこられるらしく、データを連続して書き込む事が出来る。PC-8201だと1データを転送するたびにBusyフラグが落ちるのを待っていたが、TANDY200はWAITなしでガンガン書ける。これは速い!

 

LCDだけでだいーぶ面白い使い方が出来そうな気がして、もう少し実験をしてみたい!

画面が広い分、何かやってみたくなりますねー(^-^)

PC-1600KのCP/Mも中途半端になってしまってるのでやらないと…ぐぬぬ(^^;;

 

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