PC-6001 SCREEN MODE3のアトリビュート情報を操作してみる

予備知識

PC-6001の画面は、512Byte(200H)のアトリビュート情報とサイズ可変のグラフィックデータ情報で構成されています。アトリビュート情報の扱い方はVDPのドキュメントに記載されているのですが、実際の細かい挙動は不明です。例えば、PC-6001 BASICのSCREEN MODE3では8色中の4色の組み合わせを2セット持っていて、どちらかへと切り替えができるようになっています。これはCOLOR命令の第3パラメータで指定できて、カラーセットを切り替えると画面全体の4色が一斉に変わります。この処理はVDPのアトリビュート情報全512Byteの各Byteの1Bitだけを変更するという方法で実装されているのですが、では、512Byte全てではなく、半分の256Byteの1Bitだけを変化させてみたらどうなるのでしょうか。

SCREEN MODE3では、グラフィック情報が32Byte×192ラインで6144Byteあります。4色表示が出来るので1ドットは2Bitで表現できますから、1Byteには4ドット分の色情報が含まれていることになります。これで横方向は32Byte×4ドット=128ドットになりますが、VDPは横方向を2倍に広げて表示しています。一方のアトリビュート情報は512Byteです。アトリビュート情報のとある1Bitを変えると色セットが切り替わるという仕組みです。1Byteのアトリビュート情報には他にも各種モードの設定が含まれています。

グラフィック情報6144Byteに対してアトリビュート情報は512Byteですから、少なくとも1ドット単位でカラーセットを切り替える事は出来そうにありません。6144/512 = 12ですから、単純に考えると1Byte分のアトリビュート情報で12ドットが変化するように思えます。では、どのような規則に従って変化するのかを調べてみました。

※アトリビュート情報は512Byte(200H)で、PC-6001初代機のページ2では、E000H~E1FFHに割り当てられています。

※PC-6001には隠しグラフィックモードがあることが知られていますが、これはそれほど隠しではありません。VDPのドキュメントにちゃんと記載されていて、PC-6001のBASIC命令でサポートしていないというだけです。VDPを直接制御すれば、BASICがサポートしていない画面モードにする事が出来ます。このページに書かれている内容は隠しモードとは別の調査です。

動作確認

下準備として、次のようなプログラムを実行します。ページ2をSCREEN MODE3にして、カラーセット1に変更しています。その後、この時のアトリビュート情報を調べています。BASICのグラフィックモードでは画面全体のアトリビュート情報を同じ値にしているので、1Byte分だけ調べれば充分です。

アトリビュート情報は140、160進数では8CHでした。ページキーで画面を切り替えてみます。

縁の色と画面の背景色が同じなので緑一色です。

ここで、アトリビュート情報1ByteだけをPOKE命令で書き換えてみます。8CHを8EHにします。これは、アトリビュート情報のカラーセットを切り替えるビットだけを変化させた値です。カラーセット1の緑色がカラーセット2の白色に変化するはずです。

結果は・・・

縦方向12カ所が一斉に変化しました。横のドットの長さは8ドットぐらい?でしょうか。SCREEN MODE3では横に2倍表示されるので実質的には半分のドット(4ドット?)になります。これだけではよくわからないので、アトリビュートの書き換えを横方向に16Byte(10H)だけ伸ばしてみます。

結果は・・・

画面の半分までカラーセットが変化しました。ということは、倍の32Byte(20HByte)で1ライン分のカラーセットが変化するようです。

縦方向に12カ所のラインが見えているので、192ライン / 12 = 16となりますから、縦方向のライン間隔は16ドットです。32Byte/ライン × 16ドット = 512Byteなので、アトリビュート情報のByte数ととピッタリ一致します。

せっかくですのでラインを描画領域一杯まで伸ばしてみます。

結果は・・・

なんと、画面描画領域をはみ出して、本来は額縁となる緑色の箇所まで変化してしまいました。画面描画領域の左側よくみるとラインがずれています。

これは推測なのですが、PC-6001のVDPは、描画領域右端のアトリビュート情報を使って、画面の額縁部分を描画しているようなのです。画面は左上から右下に向かってライン単位で描画されますから、右端まで描画したら1ライン下の左側へと続いていくので、このようなラインのズレが見られるのだと思われます。

確認のために、一度、画面を初期状態に戻してから、右端のアトリビュート情報だけを書き換えてみます。画面を初期化するにはSCREEN MODEを切り替えないと駄目なようですので、SCREEN4,2,2を先に実行しておきます。描画領域最上段の右端のアトリビュートはE01FH番地なので、ピンポイントで書き換えます。

結果は・・・

予想通りです。額縁の左右の色は右端のアトリビュート情報で決まる、ということがわかりました。となると、額縁の上下部分と四隅はどうやってきまるのでしょうか。予想立てすると、画面描画は上から下、左から右へと進み、右下に辿り着いたら左上に戻るので、描画領域右下のアトリビュート情報で決まりそうです。

さっそく試してみます。右下のアトリビュート情報はE1FFHなので、そこだけをピンポイントで書き換えます。

結果は・・・

予想外!上下四隅の色は予想通りに変化したのですが、なぜか左右の額縁の色まで変化してしまいました。よくわかないなーと何度か試していると・・・

なんかやばそう!ヘンな色になりました。

縁の挙動がよくわかりませんし、アトリビュート1Byteの変更で横方向だけでなく、縦方向12カ所が変化してしまいますから扱いが難しいですし、これが実用的なのかはなんともいえません。

最後にこれまでのテストの応用を。SCREEN MODE3で8色表示です。左半分のアトリビュートを変化させることで実現させています。

結論?

今回はSCREEN MODE3だけのテストでしたが、SCREEN MODE4と混在させたらどうなるの、とか、テキストモードと混在させれば、小さなテキストとカラーグラフィックを合成できそうとか次の疑問が出てきます。ただ、ちょっと試しただけでも画面が不思議な状態になってしまったので、検証は難しそうです。