激速マシン MSX1
HOME | 自作MSXゲーム | ものすごいヤツ | 百戦危うからず | MSXリンク | 正義の願い |
速さの秘密 |
MSXのVRAMは、VDPというグラフィックチップ(今で言うGPU)に管理されていて、他の国産8ビットPCの様にCPUが直接に読み書きすることは出来ません。読み書きするにはCPU←→VDP←→VRAMという過程を踏まなければならないのです。これは、CPUが直接読み書きするのと比較して実測平均で1.5倍弱遅いので、当時は散々攻撃の的になっていました。 よほど興味がないと退屈なだけの説明は飛ばして要点だけ見る方はこちら 手早く結論を知りたい方はこちら まず、ちょっとMSX1の解説を MSX1互換のVRAMに書き込む方法 HLに書き込むVRAMの先頭アドレスを入れて LD A,L ; アドレス下位 DI ; ↓ 割り込み禁止 OUT (99H),A ; VIDEOレジスタに送る LD A,H ; アドレス上位 AND 3FH ; ビット7を0 OR 40H ; ビット6を1。読む時は0 OUT (99H),A ; VIDEOレジスタに送る EI ; 割り込み許可 これで、書き込み開始アドレス設定完了 あとはDE等に書き込むデータの先頭アドレスを入れて 256バイト以下の場合 LD B,255 ; 0なら256回 DI LOOP: LD A,(DE) OUT (98H),A ; V-RAMに送る INC DE DJNZ LOOP EI 257バイト以上の場合 LD BC,65535; 0なら65536回 DI LOOP: LD A,(DE) OUT (98H),A ; V-RAMに送る INC DE DEC BC LD A,C OR B JP NZ,LOOP EI 参考:実機MSX1では動作が不安定な高速版転送 という具合にデータの分OUTすれば、自動的に 連続したVRAMに書き込まれていく 画面とメモリの対応(例として画面左上、座標(0,0)〜(24,8)) X0 8 16 24 縦に8バイトずつ連続しているので ---------------- 8×8でも、16×8でも、1つの Y0| 0 | 8 | 10 | キャラを描く場合に、開始アドレス | 1 | 9 | 11 | を設定すれば、後はデータの分だけ | 2 | A | 12 | OUTすれば良い | 3 | B | 13 | | 4 | C | 14 | 横に連続して並んだキャラや背景を | 5 | D | 15 | 描く場合にも、開始アドレスを設定 | 6 | E | 16 | すれば、後はデータの分OUTする | 7 | F | 17 | だけである |---------------- 8|100 |108 |110 | ただし、形と色の二箇所に要OUT これが他機種、たとえばPC-8801系なら
グラフィック画面にキャラを出す という具合らしいです。なんとなくだけど、MSX1の方が楽そーでしょ? MSX1 PC-8801系 VDPが管理 それぞれ別バンクのアドレスC000-FFFF ---------- ---------- ---------- ---------- 0000 形状 C000 C000 C000 17FF GVRAM0 青 GVRAM1 赤 GVRAM2 緑 ---------- 1800 名称 1AFF ---------- 1B00 略 1FFF ---------- 2000 色 37FF ---------- 3800 略 3FFF FFFF FFFF FFFF ---------- ---------- ---------- ---------- 寄り道ですが、88は各バンクの任意の位置のビットが立つと、画面のその位置にビットが立った色が出て、2進数の青赤緑3ビットで表す8色を自由に配置できるわけです。MSX1は3ビットに照度の1ビットを加えた4ビットで16色ですが、1バイト毎に2色、すなわち横8ピクセル毎に2色という制限があります。ファミコンは背景に一度に使えるのは13色で16×16ピクセル内に4色でしたよね?? いずれにしろ昔は大変でしたね。 私の理解するファミコンのカラー表示能力 チップが出せるという52色(?)中27色は、パレットの都合で色がカブっ ているのか? 白黒の階調(白黒テレビ用に特別の出力があって27段階の濃淡 に見えるというのを別にカウントしているの)か? 私には不明だが、とにかく 52から27引いた25色がファミコンの出せる色数で、25色中背景13色、 スプライト12色を同時に設定可。 ただし、背景16×16ピクセル内4色、1スプライトにつき透明色を除く3 色まで使用可。 つまり背景用4パレット、スプライト用4パレット。1パレットに4色指定可。 内1色は全パレット共通色(スプライトの場合は透過色)ですが、実画面を見て 思うに、パレットかメモリの都合か何かで、同時に使える色の組み合わせが限ら れるといった風な、何らかの制約が他に有るのかも?? 海外サイトでは、同時 表示16色と書いている所が多いので、背景+スプライトで16色制限とか?? (例)8×8の模様を「表示可能な色数と並べ方」で比率を合わせシミュってみる この比較法だとファミコンが特にショボく見えますが、例えばアニメ絵なら、 外側+輪郭線+内側の3色が必須なワケで、16×16内4色のファミコンでは 比較的簡単ですが、MSX1だと横8ピクセル内2色ですから、ファミコンより コツが要ります。8ビット機はソフト製作者の工夫しだいで、全く違ってきます。 では本題に戻って、ここからがお立会い。88で8×8のキャラを描く場合、各色バンクの同じメモリ位置に8バイトずつ計24バイトを送ります。MSX1の場合は、形状に8バイト+色に8バイトの16バイト送る必要がありますが、同じキャラをもう一度どこかに描く場合は、今描いた位置と同じ名称番号の1バイトを名称表に送ればいいのです。 と、一言でいってもワケが分からないので、下図で説明します。 MSX1画面高速書き換え MSX1の画面のしくみ MSX1で市販ゲームがよく使う画面の1行は32キャラであり 1画面24行である。すなわち32×24で768キャラとなる。 実画面 キャラの枠 0・・・・・・・・・・31 ------------ 0・・・・・・・・・・・・31 0 | | : : : | | : : : | | : : : | | : : : | | : : : | | : : : | | : : 23| | : : ------------ 736・・・・・・・・・767 その768キャラを、8ビットで扱える256ずつに分けて管理 している。 VRAMと画面の対応 (ここではアドレスは考慮しない) 名称テーブル 形状テーブル 色テーブル 画面左上 画面左上 画面左上 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 : : : : : : 224・・・・・・・・・・255 224・・・・・・・・・・255 224・・・・・・・・・・255 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 : : : : : : 224・・・・・・・・・・255 224・・・・・・・・・・255 224・・・・・・・・・・255 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 : : : : : : 224・・・・・・・・・・255 224・・・・・・・・・・255 224・・・・・・・・・・255 画面右下 画面右下 画面右下 1枠1バイト 1枠8バイト 1枠8バイト 画面は768個の枠で構成され、0〜255の3段に区切られている 単に管理上256ずつ区切っただけなので、VRAMを読み書き する時は普通に各テーブル768枠分連続したアドレスである。 1)画面にキャラを出してみる 形状テーブルと色テーブルの同じ位置に形と色を送れば、その 位置にキャラが出現する。 例1.3段の内、上段の127の位置に星の形と色を送る 実画面 形状テーブル 色テーブル -------------- 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 | * | : 形 : : 色 : | | 224・・・・・・・・・・255 224・・・・・・・・・・255 | | 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 | | : : : : | | 224・・・・・・・・・・255 224・・・・・・・・・・255 | | 0・・・・・・・・・・・・・31 0・・・・・・・・・・・・・31 | | : : : : -------------- 224・・・・・・・・・・255 224・・・・・・・・・・255 2)わずか1バイト送ればキャラ表示! その位置の番号を、名称テーブルの上段の任意の位置に送れば そこにもそのキャラが出現する。 例2.名称テーブル上段の別の位置に127を送るとそこにも星が でる 実画面 名称テーブル -------------- 0・・・・・・・・・・・・・31 | * * | : 127 127 : | | 224・・・・・・・・・・255 | | 0・・・・・・・・・・・・・31 | | : : | | 224・・・・・・・・・・255 | | 0・・・・・・・・・・・・・31 | | : : -------------- 224・・・・・・・・・・255 つまり、テキスト画面のメモリに65と書けばAが表示されるの と同じで、名称テーブルに0〜255の任意の番号を書けば、形 状テーブルと色テーブルのその番号に設定したキャラが表示され るのである。
要するに、1キャラ=1バイトのいわゆる「仮想画面」が始めからハード的に用意されていて、そこを書き換えれば画面も書き換わるのです。(注1) (ちなみに、BASICやCADのように図形を書きたいときは、名称テーブルはいじらず、素直に形と色を形状テーブル&色テーブルに送ればいいわけです) スムーズスクロールするMSX1ゲームの代表である「エグゾイドZエリア5」や「Malaika」等々、MSX2ですが「ファイアホーク」や「真魔王ゴルベリアス」「サイコワールド」といった高速で横スクロールするゲームも、高速化のために、これを利用しています。(注2)
結論MSX1の画面と同じサイズのキャラを国産8ビットPCの代表とされているPC-8801系で書き換えてみる場合、88が8M高速モードで動いているとすれば(おそらく88の方がループが長くなるプログラムに関する部分の時間はクロックの違いから相殺で無視するとして)、CPUクロックはMSX1の2.235倍で、仮に転送が1.5倍速く出来るとしても、送るサイズは通常24倍ですから 24÷2.235÷1.5 で 約7.16倍 MSX1の方がキャラ表示が速いのです。 さらに、実際の1画面サイズどうしの比較の場合は88はMSX1より約2.6倍画面が広いですから 7.16×2.6 で 約18.6倍 MSX1の方が全画面書き換えが速いのです。 まだ疑われる方は、MSX以外の国産8ビットPCの「1ピクセル単位で別の色が付けられるモード」対応ゲームで、黒い画面などを挟まず瞬時に別の場面に全画面が切り替わるものが、どのくらい有るか?を調べてみればいいでしょう。殆どのMSX1ゲームは、あらゆる場面で瞬時に全画面を切り替えられますよね。 基準の取り方を、転送速度ではなく「実際のゲームでどうなるか?」にすれば、他の主な国産8ビットPCの「1ピクセル単位で別な色の付けられる多色モード」に比べ、この様に「圧倒的にMSX1は高速」です。そして現在でもそうですが、本当に意味があるのは「バスの転送速度が3割も速い」では無くて「実際のソフトレベルでどうなのか?」なハズですが・・・ 注1.テキスト表示画面の強化版とも言えます、海外ではパターンモードと呼んでい るようです。余談ですが、MSXでは本当のテキスト用画面でも文字の形を自 由に設定したり色を付けられるので、雑誌掲載のBASICゲームは大抵テキ スト画面でした。 注2.スムーズにスクロールするゲームについて詳しくはピクセルスクロールのページ を参照してください。 (MSX2以降専用)OTIR命令を使う高速版転送256バイト以下
もしCが空いているなら、HLに書き込むデータの
先頭アドレス、Bにバイト数を入れて
LD C,98H ; V-RAM
DI
OTIR
EI
RET
(MSX2以降専用)OTIR命令を使う高速版転送257バイト以上
HLにデータの先頭アドレス、Dに送るバイト数を
256で割った数、Aに余りのバイト数を入れて
LD C,98H ; V-RAM
LOOP: LD B,0 ; 0 = 256
DI
OTIR
EI
DEC D
JP NZ,LOOP
OR A
RET Z
LD B,A
DI
OTIR
EI
RET
このページは、1024×768画面に合わせて作りました。ちゃんと見えなかったらスミマセン |