スプライト機能拡張付 PC-6001mkII 用 VGA アダプタ

イントロダクション

80年代の初頭、日本で初めて本格的にパソコンが売り出された。まだインターネットなどというものはなく、ハードディスクはおろかフロッピーディスクも普及しておらず、もっぱら音楽用のカセットテープにプログラムやデータを記録していた。ワープロにも使えなかった。漢字フォントを記録したROMも高価で、今のように、ひらがな漢字変換を簡単にできるソフトもなかった。パソコンで出来ることは少なかった。

でも最高に楽しいことができた。ゲームだ。表向きは、勉強に使える、仕事に使える、ということで宣伝されていたが、実際にはパソコンはゲーム用だった。1983年にファミコンが発売されるまで、まともなゲームができるのはゲームセンターとパソコンだけだった。

当時、ゲームセンターのゲームも進歩していた。ギャラクシアンやパックマン、ディグダグなどは、キャラクタを動かす専用の機能を使っていて、とても滑らかに動いた。それを何とかパソコンで実現しようと、多くの人がトライしたが、パソコンには、キャラクターを動かす専用の機能が付いておらず、普通にグラフィック画面に描画して動かさなければならなかった。当時の CPU は 8 ビット。クロックは 4 MHz が標準だったが、メモリから画面にデータを転送するために CPU が止まってしまう機種が多く、実質 1~2 MHz というところ。ゲームセンター並みのゲームなど無理な話。それでも多くの人がそれに近づけるように頑張った。

1983年に MSX という標準規格のパソコンが各社から発売された。その少し前に、ソードという会社が M5 というパソコンを出していた。セガからは SC-3000、トミーからはぴゅう太というパソコンも出ていた。これらは、原始的ながらキャラクターを滑らかに動かす専用の機能が付いていた。スプライト機能だ。それまでのパソコンとは比較にならない滑らかなゲームが可能だった。

そんな時代にパソコンを使っていた人たちには、スプライト機能に強烈な憧れがある人も多い。ファミコンにも、もちろんスプライト機能が付いていた。その後、シャープから X68000 という高級パソコンが発売され、その頃がパソコンのスプライト機能の全盛期だった。その後、CPU が高速になり、スプライト機能がなくても十分に滑らかにキャラクターを動かせるようになった。

今回、PC-6001mkII の VGA アダプタの設計を思い立った時、スプライト機能を付けるというアイデアを思い付いた。設計の環境も整えたし、FPGA も割と安く手に入る。PC-6001mkII のプリンタ・ポートで制御すればいいじゃないか。ハードウェアでスプライトを作るという夢を実現できる目途が立ったのだ!

(もうわかった。。)

機能と性能

PC-6001mkII を VGA モニタに接続して使うことができるようになります。スプライト機能、横スクロール機能が追加されます。

PC-6001mkIISR/PC-6601SRには使用できません。PC-6601は不明です。

VGA出力

水平同期 31.27KHz、640x480 ピクセル(実際は320x200ドット)、ピクセルクロック 25.12 MHz

拡張機能

スプライト機能

横スクロール機能

PC-6001mkII の画面を横方向にドット単位で筒状スクロール可能。

重ね合わせ機能

PC-6001mkII の16 色の各色毎に、PC-6001mkII の画面、スプライトのどちらを優先する かを指定可能。

基本機能の使い方

拡張機能の使い方

拡張機能のデモはこちらでダウンロード。

PC-6001mkII のプリンタポート (ポート 91h, 93h) からコマンドを送信。91h がデータ出力用ポート、93h がストローブ出力用ポート。

LED が点灯していれば、コマンド受付可能な状態になっている。点灯していなければアダプタの電源を入れ直す。

PC-6001mkIIをリセットしてもアダプタは初期化されないので、初期化したい場合はアダプタの電源を入れ直す。

基本的なコマンド・シーケンス出力の方法

ポート 91h にコマンドを出力し、ポート 93h に 1 を出力する。次にポート 91h にデータを出力し、ポート 93h に 0 を出力する。

また、ポート c0h のビット 1 で、垂直帰線期間を読むことができる(0で垂直帰線期間)。

スプライト関連コマンド

コマンド 10h

各属性値を設定する対象のスプライト番号 (0-255) を設定する。

ld a,10h
out 91h,a
ld a,1
out 93h,a
ld a,スプライト番号
out 91h,a
ld a,0
out 93h,a

若い番号のスプライトが手前に来るが、横に 21 個以上並んだ場合、若い番号のスプライトから消える。

コマンド 20h

スプライトのアトリビュート値を設定する。

アトリビュート値の詳細
ld a,20h
out 91h,a
ld a,1
out 93h,a
ld a,アトリビュート値
out 91h,a
ld a,0
out 93h,a

コマンド 21h

スプライトの X 座標の下位 1 ビットを設定する。

ld a,21h
out 91h,a
ld a,1
out 93h,a
ld a,X座標の下位1ビット
out 91h,a
ld a,0
out 93h,a

コマンド 22h

スプライトの X 座標の上位 8 ビットを設定する。

ld a,22h
out 91h,a
ld a,1
out 93h,a
ld a,X座標の上位8ビット
out 91h,a
ld a,0
out 93h,a

なお X 座標は、0 で 16x16 ドットのスプライトが完全に画面左端に隠れ、16 で完全に現れる。8x8 ドットの場合も同じ、16 で完全に現れる。

コマンド 23h

スプライトの Y 座標を設定する。

ld a,23h
out 91h,a
ld a,1
out 93h,a
ld a,Y座標
out 91h,a
ld a,0
out 93h,a

なお Y 座標も、0 で 16x16 ドットのスプライトが完全に画面上端に隠れ、16 で完全に現れる。8x8 ドットの場合も同じ、16 で完全に現れる。

コマンド 24h

スプライト・キャラクタ番号 (0-191) を設定する。

ld a,24h
out 91h,a
ld a,1
out 93h,a
ld a,スプライト・キャラクタ番号
out 91h,a
ld a,0
out 93h,a

コマンド 25h

リンク・スレーブ・スプライトにおいて、リンク・マスター・スプライトの番号(0-255) を設定する。

リンク・スレーブ・スプライトは、リンク・マスターのスプライトの座標に、自分の座標を加えた位置に表示される。

このコマンドで、リンク・スレーブ・スプライトの番号を指定してはいけない。

ld a,25h
out 91h,a
ld a,1
out 93h,a
ld a,リンク・マスター・スプライトの番号
out 91h,a
ld a,0
out 93h,a

コマンド 30h

スプライト用キャラクタのデータを設定する。コマンド、キャラクタ番号を送信後、キャラクタデータを 128 バイト送信。

ld a,30h
out 91h,a
ld a,1
out 93h,a
ld a,キャラクタ番号(0-191)
out 91h,a
ld a,0
out 93h,a
ld a,データ1
out 91h,a
ld a,1
out 93h,a
ld a,データ2
out 91h,a
ld a,0
out 93h,a
...
ld a,データ126
out 91h,a
ld a,1
out 93h,a
ld a,データ127
out 91h,a
ld a,0
out 93h,a

キャラクタのデータは 1 ドットあたり 4 ビットで 16 色の色を指定。色は BASIC の色コード (1-16) から 1 を引いた値。横 16 ドットで 2 バイト、合計 128 バイト。

8x8 ドットのキャラクタはなく、16x16 のキャラクタを 4 分割したものを使う。

スクロール関連コマンド

コマンド 40h

スクロール値の下位 1 ビットを設定する。初代機の画面モードでは、この値は無視され、上位 8 ビットのみが使われる。

ld a,40h
out 91h,a
ld a,1
out 93h,a
ld a,スクロール値の下位1ビット
out 91h,a
ld a,0
out 93h,a

コマンド 41h

スクロール値の上位 8 ビットを設定する。

ld a,41h
out 91h,a
ld a,1
out 93h,a
ld a,スクロール値の上位8ビット
out 91h,a
ld a,0
out 93h,a

スクロールは横方向の筒状で、値は 0-319(初代機の画面モードでは 0-255 )。値 1 で左に 1 ドット、スクロールする。

画面サイズ切り替えコマンド

コマンド 50h

PC-6001mkII の画面サイズのモードにする(デフォルト)。

ld a,50h
out 91h,a
ld a,1
out 93h,a
ld a,0
out 93h,a

コマンド 51h

初代機の画面サイズのモードにする。

ld a,51h
out 91h,a
ld a,1
out 93h,a
ld a,0
out 93h,a

画面優先順位設定コマンド

コマンド 60h

画面優先順位の下位 1 バイトを指定する。

ld a,60h
out 91h,a
ld a,1
out 93h,a
ld a,画面優先順位の下位1バイト
out 91h,a
ld a,0
out 93h,a

コマンド 61h

画面優先順位の上位 1 バイトを指定する。

ld a,61h
out 91h,a
ld a,1
out 93h,a
ld a,画面優先順位の上位1バイト
out 91h,a
ld a,0
out 93h,a

画面優先順位は全 16 ビットで、各ビットが各色に対応する。 ビット0が透明、ビット1が青紫、など。 ビットが立っていれば、スプライトよりも PC-6001mkII の画面が優先される。

PC-6001mkII画面表示禁止コマンド

コマンド 70h

PC-6001mkIIの画面表示を許可する(デフォルト)。

ld a,70h
out 91h,a
ld a,1
out 93h,a
ld a,0
out 93h,a

コマンド 71h

PC-6001mkIIの画面表示を禁止し、スプライトのみ表示する。

ld a,71h
out 91h,a
ld a,1
out 93h,a
ld a,0
out 93h,a

画面左右切り取りコマンド

コマンド 80h

画面の左端を切り取るドット数0-31を指定する。

ld a,80h
out 91h,a
ld a,1
out 93h,a
ld a,画面の左端を切り取るドット数(0-31)
out 91h,a
ld a,0
out 93h,a

コマンド 81h

画面の右端を切り取るドット数0-31を指定する。

ld a,81h
out 91h,a
ld a,1
out 93h,a
ld a,画面の右端を切り取るドット数(0-31)
out 91h,a
ld a,0
out 93h,a

FPGAコンフィグレーションROMの書き換え

以下に示す、適切なケーブルを自作することにより、新たなヴァージョンのコンフィグレーションがリリースされた際に、ユーザー自身でアップデートすることができます。

書き換えの手順