------------------------------------------------------------------------------- EGCを使った16色スプライトドライバ SPRITE16.COM Version 0.04 Copyright(C) 1996/3/14 Promisence Soft ------------------------------------------------------------------------------- _/SPRITE16.COMとは? ・VRAMの下をスプライト領域として使用するEGCによる16色スプライトドライバです。 ・初めに常駐させて他のプログラムからファンクションを呼んで実行します。 ・386以上のEGC搭載の98および互換機のDOS環境で動作します。 ・ベクタは42Hを使用しますがそれ以外を使うこともできます。 _/SPRITE16.COM の開発経緯 「PromisenceSoft」がパソコン通信上で流した「SKASH BoM!」や「The Star Strik er」などといった、一連のシューティングゲームはユーザーが楽しんでそれで終わり・・・の筈でし た。ところが、作り手にとっては思いもよらぬ意外な反応が、配布先のユーザーの間で は起こっていたのです。 「パソコン通信やってる友達を通して入手したんですけど、98でスプライトをどのように?」 「隠しI/Oポートかなんかでパターン高速転送機能でもあるんですか?」 などといった、単なる遊び手としての楽しみにとどまらず、作り手としての積極的な 挑戦を試みる方々が郵便、電話を通して大変多くの質問をいただきました。 趣味でプログラミングを楽しむ日曜プログラマーでも、簡単に扱えるスプライト・・・むろん、 ゲームを作るのにスプライトが必要というわけでもないのですが、これが使えるか 否かで、趣味の範囲内でも、表現できる幅もぐっと広がるのではないか?ということで 「PromisenceSoft」からこの度、スプライト常駐ドライバとして開発、公開されました。 当初、ライブラリ配布・・・としての形態を構想していたのですが、256色環境(PC/AT,9821) にも対応するべく、常駐ドライバという形態で公開しました。 さて、時代は Microsoft自ら徹底的に整備したGameAPIによるWin95ゲーム環境が 主流になることは火を見るよりも明らかです。そして、「PromisenceSoft」としても 「The Star Striker for Win95」などのシューティングの開発も進めており、完成、公開 に向けて精進しております。にもかかわらず、このような時期に DOS ベースのゲーム開発 ドライバを公開した理由は、それなりのわけがあります。それは、現行マシン上での Direct Draw を通した画像処理性能の思ったよりも低い性能・・・です。 そして、さらに深刻な問題が、ユーザーのパソコン普及状況です。とあるネット(ZOB-Station) でのPromisence Soft のサポートノートで実施した保持マシンアンケートや、TAKERU での保有機種 アンケートを吟味するかぎり、満足のいくゲームを、Win95上でDOSと同等のQualityで仕上げ るのには非常に困難な状況に直面していることを確認しました。ご参考までに、ZOB- Stationは開発関係の方々が非常に多く、積極的なパソコンユーザーが大変多い・・・にも関ら ずです。Win95上でのゲーム環境の快適さはビデオボードの性能に大きく依存するわけです が、重要なのはこれらゲーム専用ボードがない状況では、ゲームアプリの快適さは極端に落ちる のにビジネスアプリはほぼ通常どおり快適に動いてしまう・・・という点です。 パソコンゲームユーザー層のほとんどが、仕事のついでにゲームで一息入れる・・・という方々が ほとんどなので、これらゲーム専用ビデオボードが「生活必需品」でないことを考慮すると、雑誌などで騒がれているほど急速な普及は少々考えられにくい状況です。 とりあえず、オール1パソコンのような一体型パソコンを買えばいつの間にか高性能ビデオボード も付いてくる・・・という状況が半年以上続くまでは「本格的な普及」と呼べないので それまでは、「PromisenceSoft」としては DOS ベースの 16,256色ゲームも WIN95と 並列して公開していく予定です。 ちなみに、320*200*8Bit という画像モードでの DOS ベーススプライトドライバも公開予定なの ですが、かなり高スペックなPCのWin95上での同画像モードのスペックと比較しても、 遜色がないばかりか圧勝します。これは、実際の測定結果を元にした比較なのですが、 ここでは測定数字を羅列するよりも、スプライトドライバを通して実際に動くゲームを遊んで いただいた方が、理解しやすいと思いますので敢えて載せないことにします。 よく、広告やカタログなどに 秒間xxxxピクセル!!なんて性能表示が出てますね。 では、次の数字は何のスペックを意味するでしょうか? 4 Bitカラー 秒間 245,760 ピクセル合成表示可能!! これは、何のマシンのスペックでしょう? 実は、コレ、1983に発売された旧ファミコンのスプライト機能の性能値です。 全く数字だけでは見当がつきませんね(^^) もちろん、現在発売されているビデオボードは表示方法こそ違え、上とは全く比較に ならないスペックを持っているわけですが、カタログに載っているポリゴン描画機能数値や ピクセル数を「x十万」といわれてもピン!ときません。 やはり、「どのようなゲームが動いているか」にユーザーの焦点が集まります。 是非、サンプルゲーム「StormySpace」を通して吟味してみてください。 なお、本ゲーム(正確にはスプライトドライバ)は、御持ちのマシンのVRAM性能に著しく 依存します。ですから、286や386ベースのパソコンに486(50,66MHz)相当のチップに載せ変え ても、その効果は全く期待できませんので予めご了承ください。 _/使い方  sprite16 -z ・・・・ 常駐(ディフォルトベクタ 42H 使用) sprite16 -r ・・・・ 解放  もし他のベクタ 50H を使用する時は以下のようにします。  sprite16 -v 50h -z ・・・・ 常駐(ベクタ 50H 使用) sprite16 -v 50h -r ・・・・ 解放  常駐するとメインメモリにマスクデータ用バッファ(16000バイト)とベタデー  タ用バッファ(16000バイト)の合計32000バイトのメモリを確保しコード  を含めて約36Kバイトを消費します。 _/常駐チェック方法 ベクタ42hから読み出したセグメント値:オフセット102Hのアドレスから8バ イト分が "SPRITE16" の文字列であれば常駐しています。文字列の次は00h固定で す。そして00hの次にバージョン番号があります。バージョン1.23ならば10 進数の123になっています。 _/ファンクションについて  ファンクション番号はAHに指定し、引数は他のレジスタに格納します。  全てのファンクションは全ての汎用レジスタを保護します。 全てのファンクションに戻値はありません。 内部では割込み許可になっています。 ファンクションは、 %ファンクション0 VRAM加工 %ファンクション1 マスクデータ作成 %ファンクション2 スプライト表示 %ファンクション3 単色表示ON/OFF設定 %ファンクション4 単色表示カラー設定 %ファンクション5 マスク(AND)処理ON/OFF設定 %ファンクション6 EGC-アクセスプレーン設定 %ファンクション7 EGC-ROP設定 %ファンクション8 EGC-MASK設定 %ファンクション9~16 予約 これだけあります。 最初に一度だけ0と1のファンクションでスプライトを準備しファンクション2で 表示します。重要なのはこの3つのファンクションだけです。 この他にも、VRAM一括32Bit消去・・・など重要なファンクションが必要なのですが、現時点で は装備されておりません。 また、ラスタースクロール、上下反転表示、縦方向拡大、特殊ラスター加工機能・・・などが、 9~16に配置される予定です。 次にそれぞれの詳しい解説をします。 文章中のONは0以外の整数でOFFは0とします。 それとベタデータとはマスクデータを反転したデータという意味で使っています。 ------------------------------------------------------------------------------- %ファンクション0 VRAM加工  プログラマ側が何らかの方法でVRAM400ラインに用意したグラフィックデータ  をファンクション1のマスクデータ作成に備えて200ライン用に加工します。加工  内容は、まず表400ライン分のデータを縦半分に圧縮し、それを下200ライン分  にコピーし、さらに裏下200ライン分にコピーします。プログラムで裏ページを使  わない場合はこの裏下200ライン分にコピーする作業は無駄に終わる事になります  が、普通は表裏ページを切り替える方法と取ると思われるので裏にもコピーしていま  す。  次にファンクション1でマスクデータを作成してください。  自分でVRAM加工するか200ライン用に既に加工済みのグラフィックデータを直  接ローダー等でVRAMの表下にロードした場合などはこのファンクションを使う必  要はなくファンクション1を最初に実行してください。  (グラフィックエディッターの都合上、400ラインでしか絵データを編集できない時など  に使用します。) ------------------------------------------------------------------------------- %ファンクション1 マスクデータ作成  表下200ライン分のグラフィックデータからマスクデータをメインメモリ上のバッ  ファに取り込みます。またマスクデータを反転したベタデータもメインメモリのバッ  ファに作成します。(実際は4プレーンを全てORしたベタデータが先に作成される)  スプライト表示ファンクションを実行する前に1度実行しておいてください。  400ライン用のグラフィックデータを使う場合はあらかじめファンクション0で  200ライン用に変換したグラフィックデータを表下に作成しておいてからこのファ  ンクションを実行してください。 ------------------------------------------------------------------------------- %ファンクション2 スプライト表示  ファンクション1で取り込んだマスクデータとVRAMの下200ラインにあるスプ  ライトデータを使ってVRAMの上200ラインに指定サイズのスプライトを表示し  ます。このファンクション内ではEGCのON、OFFはまったく行いません、その  ため、あらかじめEGC拡張モードONにしておいてから実行してください。  (EGCのON、OFFはかなりのオーバーヘッドがあるためこのような仕様にしました)  引数は以下の通りです。   DX 表示X座標 (画面内:0~639)   BX 表示Y座標 (画面内:0~199)   DI 転送元オフセット(0~15998)   AL Xサイズ (1:16ドット 2:32ドット 3:48ドット・・・)   CX Yライン数 (1~200) それぞれの値の正当範囲チェックは行っていません。だからもしXサイズやライン 数に0を指定するとVRAMが破壊されるので注意してください。 座標はドット単位で指定します。画面では左上が(0,0)です。 X,Y座標の比は400ラインで見るとX:Y=1:1ですが200ラインで見ると X:Y=1:2になります。これは実行直前にY座標を半分にすれば200ラインで もX:Y=1:1になります  上下はクリッピングしているのではみ出してもかまいません。例えばスプライトの縦  ライン数が100でY座標が-60なら40ライン分が画面に表示されます。 横方向はクリッピングしていません。X座標の範囲チェックは完全にプログラマ側に 任せております。 ALに指定する値はXドットサイズ/16の値を指定します。 例えば16ドットならば1を、32ドットならば2を指定します。 CXに指定するライン数は実際の表示ライン数を指定します。 だから200ラインモード時見かけ上32ラインならその半分の16を指定します。 C言語であれば #define XSIZE16 (16/16) #define XSIZE32 (32/16) #define XSIZE64 (64/16) #define YSIZE16 (16/2) #define YSIZE32 (32/2) #define YSIZE64 (64/2) こんな風にテキスト定義しておくと分かりやすいと思います。 DIには転送元スプライトパターンを指定します。 VRAM下200ラインに格納されているスプライトの左上のオフセットを指定する のですがこの時、重要なのが転送元オフセットは必ず偶数アドレスから始まらなけれ ばならないということです。予めスプライトパターンの横の配置を16ドット単位に しておけば問題ありません。  任意のオフセットを指定可能なので、前景物から徐々に姿を表す・・・といった  場面でも無理なく表現できます。  (なお、この転送元スプライト設定方法は、98VRAMの構成に影響を受けておりますが  256色版スプライトドライバでも、このファンクションをサポートします) ------------------------------------------------------------------------------- %ファンクション3 単色表示ON/OFF設定 ディフォルトはOFFですがDXに1を指定してコールすると単色表示モードONに なり、次のスプライト表示からスプライトが1色で表示されるようになります。 この1色(パレット番号)はファンクション4で設定できます。 単色表示ではマスクを行う必要がないため通常よりかなり高速です。 (高速化度は機種依存) ------------------------------------------------------------------------------- %ファンクション4 単色表示カラー設定 このファンクションで指定した色番号がスプライト単色表示の色に使用されます。 設定方法はDXにパレット番号0~15を入れて実行します。 ディフォルトはパレット番号15に設定しています。 256色版スプライトドライバでは、パレット番号は0~255が有効になります。 ------------------------------------------------------------------------------- %ファンクション5 マスク(AND)処理ON/OFF設定 通常スプライト表示ではマスク(AND)処理をしてからOR転送しますが OFFにすると、マスク処理を省略します。 ディフォルトはONです。 単色描画モードONの時はマスクする必要が無いので強制的にマスクは省略されます 引数はDXに指定します。 ------------------------------------------------------------------------------- %ファンクション6 EGC-アクセスプレーン設定 スプライト表示時にEGCの04A0hに出力するアクセスプレーンの設定です。 ディフォルトは4プレーン同時アクセスのFFF0hです。 引数はDXに指定します。  なお、256色スプライトドライバではこのファンクションは未定義になります。 ------------------------------------------------------------------------------- %ファンクション7 EGC-ROP設定 通常スプライト表示時にEGCの04A4hに出力するROPの設定です。 ディフォルトは28FCh(VRAM間OR転送)になっています。 引数はDXに指定します。  なお、256色スプライトドライバではこのファンクションは未定義になります。 ------------------------------------------------------------------------------- %ファンクション8 EGC-MASK設定 スプライト表示時にEGCの04A8hに出力するマスク値の設定です。 ディフォルトはFFFFhですがAAAAhに変更すると薄暗い感じで表示されます 引数はDXに指定します。 256色スプライトドライバでもMASK機能としてはサポートされます。 ------------------------------------------------------------------------------- 以上、現バージョンのスプライトドライバの機能紹介でした。 この他にも、上下反転表示、縦方向拡大、特殊ラスター加工機能・・・などの機能を 盛り込み、Cで手軽に使用可能になるべくヘッダファイルの添付、サンプルソース、および 最適化済みスプライトドライバ全ソースのセットを「最光速スプライトドライバ for 16Color」として シェアウェア公開する予定です。 何か問題点、疑問点などがございましたら御連絡ください。 _/著作権など 当スプライトドライバおよび付属サンプルゲーム「StormySpace」の 著作権は「PromisenceSoft」にあります。 他人への譲渡、コピーは自由ですが、他ネットへの転載は事後でもよろしい ので御報告お願いします。 池田 晃(A.Ikeda) Nifty MHF03553 PC-VAN LRD16898 葛目元公(Mocky) Nifty PXM05370 東京BBS MOTOKIMI ZOB ZOB15200 EXJ_Z ZOB ZOB18245