PC DEMOS FAQ

Version 2.01-J

The official FAQ of the Usenet Newsgroup comp.sys.ibm.pc.demos

This FAQ was last modified on July 10th 1997

日本語訳:森田尚 (hisashim at kt.rim.or.jp) 1997.12.15-1999.10.10


前のバージョンから新しくなった部分--お読みください
New Since Last Version -- PLEASE READ:

ISP(プロバイダ)を替えました! HTML版は以下の場所で手に入ります:

もうひとつ重要なお知らせ:私はだいたい6か月の間シーンから離れていました。このFAQの内容で、何か間違ったことやすでに内容が古くなっていることが書いてあったら、どうか、必ず、私に教えてください--ここにある情報の大部分は古くなっているように思います。新しい質問を加えたいのですが、それは古い情報を少し直した後にしたいと思います。そんなわけで、何か提案や訂正がありましたら私のアカウント(trixter@depaul.edu)あてにメールをください。

最後になりますが、もしかするとテキスト版で表組みやレイアウトがおかしい部分があるかもしれませんが、それは、現在ではHTML版を元にしてテキスト版が作られているためです。もし変なふうに見えていたらごめんなさい、でもこうしたほうがみんな幸せになれるというものです。


イントロダクション

これはPCデモ(ゲームや製品のデモではなくて、ハッカーやアンダーグラウンドのほうのデモです)に関してよく聞かれる質問と、その答えの一覧(FAQ)です。このFAQに含まれる情報は、一般的にデモに関して質問をしてくる人々にとっても有益ではありますが、主として、IBM PCとその互換機を持っていて、インターネット接続が可能な人々が対象です。すべての質問に答えているのは、管理者(trixter@depaul.edu)ですが、第三者による訂正や追加情報も歓迎します。

時には、Trixterはニューズグループcomp.sys.ibm.pc.demosでの個人の発言を利用または引用して、より効果的に質問に答えています。(これは「FAQへの寄稿、貢献(contributing to the FAQ)」として知られています -- 自分が寄稿しているとは知らない場合もありますが。:-)何らかの形でFAQに貢献してくれた人全員の名前一覧が、FAQの最後に載っています。寄稿してくれた筆者の名前は、決められた場所に記してあります。もし自分の名前をこのFAQの文中に見つけることができなかったら、私(Trixter)に訂正するようメールを書いてください。

このFAQを手に入れる他の方法:

もしこのFAQをWWW経由で読みたいなら、次のURLを参照してください:

もしAmigaのデモに興味があるなら、あなたが読むべきFAQはこれではありません。Amigaデモについては、Hollywood/AXIS (hollywood@kosmic.org)のalt.sys.amiga.demos FAQ for Amiga demosを読んでください。

もしあなたが何か特定の事項を探していて、読んでいるのがWWW版(URLは上記参照)でない場合は、ファイルを読むのに使っているプログラムの、大文字小文字を区別しない検索機能(case-insensitive search function)を使って、問題の語句が使われている場所を全部探し出してください。


目次:

一般

デモの作りかた

デモとインターネット

サウンドに関する質問

グラフィックスに関する質問:

スラング/用語集/術語

デモグループ

デモパーティ/コンポ

OSとプラットフォーム

技術/プログラミング情報

その他雑多な情報

FAQ情報

FAQ Greets


一般:

(1.0) デモとは何ですか?

デモとは、音声、音楽、グラフィックスを表示するプログラムで、たいていのものは3Dです。デモはそれが動作するマシン上では不可能なことをやってみせるので、見ていて非常に面白いものです。

要は、デモは「見せつける」ものだということです。デモは通常以下にあげる3つの方法のうち1つか2つ、または3つすべてを使って「見せつけ」ます:

デモは芸術のひとつの形です。それらは数学とプログラミング能力と創造性を混ぜ合わせて、視覚的・聴覚的に素晴らしい何かを作り出します。


(1.0.1) デモのはじまりとは

デモのはじまりは、クラックされたゲームのローダーでした(ローダーというのは、今プレイしているゲームをクラックしたのが誰かを識別する小さなプログラムです)。これがだんだんと単に楽しみのため、またはプログラマーが能力を見せつけるためにプログラムされるようになりました。

以下の場所で、デモの歴史に関してさらに詳しく知ることができます。

FAQ 9.3も読んでください。


(1.1) デモはどこで、どうすれば手に入れられるのですか?

多くのデモがローカルBBSで見つかるでしょうし、インターネットに接続しているならインターネットのサイトから簡単にダウンロードできます。いくつかのFTPサイトに関しては、FTP接続が必要です。以下にちょっとした表を載せておきます。

その他のいくつかのサイトを以下に挙げます:(これらのいくつかはftp.hornet.orgのミラーです)

デモは通常/demo、/demos、/pub/demos、または/pub/msdos/demosといったサブディレクトリにあります。

直接FTPサイトに接続できないけれど、電子メールが使えるという場合は、電子メールを通じてFTPサイトを利用することができます。詳しくはhttp://www.instantweb.com/~tech/topics/ftpmail.htmlを読んでください。


(1.2) 最高のデモはどれですか?

デモが芸術である以上、どのデモが一番であるとは誰も言えないわけです。ここにはデモがたくさんありますから、選ぶことができます。以下は、総合的に評判のよいデモ(いうなれば「クラシック」)のいくつかのリストです。デモシーンでの初心者にはとてもお勧めのものです。

Name Demogroup Sound Blaster? Gravis Ultrasound?
Unreal Future Crew Yes Yes, in v. 1.1
Panic Future Crew Yes No
Second Reality Future Crew Yes Yes
Crystal Dream I Triton Yes No
Crystal Dream II Triton Yes Yes
Show Majic 12 No No
Verses EMF Yes Yes
Dope Complex No Yes
Stars Nooon Yes Yes
Caero Plant & EMF Yes Yes
Inside CNCD Yes Yes
Contrast Oxygene Yes Yes

これらは「クラシック」であると考えてよいでしょう。これらを見れば、デモに関する広い理解が得られるでしょう。もちろん、ほかにも何千というデモがあります。

これらのデモは上記FAQ 1.1「デモはどこで、どうすれば手に入れられるのですか?」で挙げたFTPサイトで手に入ります。もしくはPC Demos Explained (FAQ 3.2参照)から直接手に入れることもできます。

どのデモがいいとか悪いとかいった評価を、継続的に知りたければ、インターネット上で皆がなんと言っているかを調べればいいでしょう(FAQs 3.0-3.3参照)。おおよそ隔週刊のニューズレターDemoNews (FAQ 3.3参照)でも、5つ星システムでデモを評価しています。

いいデモを見つけるもうひとつの方法は、いろいろなパーティでのcompo (competition)の結果をチェックすることです。最も大きなパーティはThe Party (TP) と呼ばれ、毎年クリスマス頃に開催されます。もうひとつの大きなパーティが夏に開催されるAssembly (ASM)で、これは最高のデモを見せることで知られています。以下にそれぞれのパーティでのトップ3を挙げます(1996年11月現在)。

The Party

TP93 PCDemo TP93 PCIntro
  1. Untitled by Dust
  2. The Good, The Bad, and The Ugly by S!P
  3. Cardiac by Infiny
  1. Cyboman by Gazebo
  2. Symbology by Admire
  3. Blackzone by Masque
TP94 PCDemo TP94 PCIntro
  1. Project Angel by Impact Studios
  2. No by Nooon
  3. Contagion by The Coexistence
  1. Cyboman 2 by Complex
  2. Peripheral Vision by Valhalla
  3. Finkel by Jamm
TP95 PCDemo TP95 PCIntro
  1. Caero by EMF & Plant
  2. Dream by Jamm
  3. Reanimator by Rage
  1. Lasse Reinbong by Cubic Team
  2. Illumination by Yodel
  3. Sea Robot of Love by Orange


Assembly

ASM93 PCDemo ASM93 PCIntro
  1. Second Reality by Future Crew
  2. Optic Nerve by Silents
  3. Elements by Xography
  1. Eclipse by EMF
  2. Tangle by Epical
  3. Debut by Darkzone
ASM94 PCDemo ASM94 PCIntro
  1. Verses by EMF
  2. Holistic by Cascada
  3. Heartquake by Iguana
  1. AirFrame by Prime
  2. Space Jam by Fascination
  3. Fyvush by Jamm
ASM95 PCDemo ASM95 PCIntro
  1. Stars by Nooon
  2. Juice by Psychic Link
  3. DX Project by RealTech
  1. Drift by Wild Light
  2. Stickman's World by Coma
  3. Bill G Force by Complex
ASM96 PCDemo ASM96 PCIntro
  1. Machines of Madness by Dubius
  2. Toasted by Cubic Team
  3. Vivid Experiment by Doomsday
  1. Blind by Eufrosyne
  2. We Go by Complex
  3. Nation Zero 2 by Jamm

(1.3) デモが動かない! どうすればいいですか?

何よりもまず、あなたのオペレーティングシステム(OS)や環境に問題がある可能性が高いです。以下のOSを動作させているなら、何らかの問題が起きることが考えられます。

Windows 3.1の場合、プログラムマネージャの[ファイル]-[終了]メニューを使ってWindowsを終了します。Windows 95の場合、「MS-DOSモードでコンピュータを再起動」します。OS/2の場合、フルスクリーンで「Vertical Retrace Emulation」をオフにしてデモを動かしてみてください。

もしこれがうまくいかず、エミュレーションではない本当のDOS(いわゆる生DOS)が動いていないのなら、コンピュータをDOS 3.3以降で再起動する必要があります。たとえば、以下の環境ではデモは動作しないと考えていいでしょう。

このようなことが起きる理由は、デモはときどきハードウェアのトリックに依存した方法でイフェクトを実現しているという点にあります。これらのOSはハードウェアへの直接のアクセスを許していないのです。実際のところ、これらのOSはDOSをエミュレートする(疑似動作させる)必要があるので、もしデモが動いたとしても倍は遅くなるでしょう。もし本当のDOSで起動してもまだデモが動かないのなら、昔からあるプロテクトモードの問題に引っかかったのかもしれません。多くの複雑なデモ(たとえば高速で特殊なグラフィックス)は、コンピュータのハードウェア全体を乗っ取ることができたときに最高のパフォーマンスが得られます。このことが色々なマシンで同じデモを動作させることをややこしくしています。(「友達のマシンでは動いたけど、僕のでは動かないのはなぜ?」などなど。)さらには、何年か前からデモプログラマーたちは、すでにシステム上で動いているのとは違う、彼ら独自のプロテクトモードルーチンをどんどん使いはじめたのです。そのため通常は、もしQEMM386、386MAX、EMM386などのプロテクトモードメモリマネージャがインストールされていると、デモは動きません(今日のメモリマネージャ上ではどんなデモも動かないというわけではありません--たとえばFuture Crewのデモはすべて問題なく動きます)。

だから、プロテクトモードメモリマネージャなしでコンピュータを再起動すればいいのです。「Starting MS-DOS」というメッセージが表示されているときにF5(Windows 95の場合F8)を押してクリーンブートをするか、または「まっさらの」config.sysautoexec.batを含んだ複数設定メニュー(a multiple config menu system)を作ることを、個人的にお勧めします。

以下に「まっさらの」設定がどのようなものかを示します。

CONFIG.SYS ファイル:

AUTOEXEC.BATファイル:

そしてそれ以外のサウンドカード初期化プログラム(もちろん、これらは使っているサウンドカードによって違います)

というわけです。これ以上は何もいりません。デモを動かしてみてください。何も邪魔するものがなければ、デモは動くはずです。

もし絶対に何かほかのプログラムがCONFIG.SYSAUTOEXEC.BATになければコンピュータが動かないというのなら、それらのプログラムのオプションが許す限り、メモリの消費量を少なく設定してみてください。

注意:プログラムにはEMSがないと動かないものもあります。そのためには、メモリマネージャが必要になります。そうするためには、上記のCONFIG.SYSの例の「HIMEM.SYS」の後に、以下の1行をつけ加えてください。

また、必要なだけのフリーなDOSメモリがないとデモが不平を言うことがあります。これを直すためには、上記のCONFIG.SYSの例の「HIMEM.SYS」の後に、以下の1行をつけ加えてください。


(1.3.1) デモを動かすのに一番いいPCシステムは?

皮肉なことに、コードがどれだけ優れているかがよくわかるので、従来は遅いシステムのほうがデモを楽しむにはよかったのです。初期のデモシーンでの注目されたことのひとつに、陰影付きの3Dオブジェクトを毎秒60〜70フレームで表示するにはどうしたらよいかということがありました--しかも16Mhzマシン上で。コードの優秀さは絶対に無視できない要素でした。

今日では、デモを楽しむのに最適なマシンはPentium 90でしょう。いかにコードが優れているかがわかる程度に低速で、しかしながら新しい世代のデモがめちゃくちゃ遅くはならない程度に高速である、というわけです。

もし互換性のことを考えに入れるのなら、Tseng Labs ET4000か、Cirrus LogicかS3のチップセットを使ったビデオボードを手に入れましょう。FAQ 5.0に最高速のビデオボードについての情報があります。

音を楽しみたいなら、Gravis Ultrasound(GUS)シリーズのサウンドカード(FAQ 4.0参照)が必要です。90%以上のデモがサポートし、サポートしているのはこれだけというデモも少なくありません。(サポートしているのがこれだけである理由については、FAQ's 4.1から4.3を参照)

RAMについては、多ければ多い程いいです。:-)しかし最低でも8MBはたぶん必要でしょう。


デモの作りかた

(2.0) どのコンパイラを使うか?

デモを作るためには、どうやってプログラムするかを知る必要があります。(説明の必要もないと思いますが、それでも一応言っておかなければいけなかったので:-))アセンブラやPascalやCおよびC++のような、DOSプログラミングに使える一般的な言語を知っている必要があります。

アセンブラをいくつか挙げます:

CおよびC++コンパイラをいくつか挙げます:

Pascalコンパイラをいくつか挙げます:


(2.1) プログラミングに関する参考資料にはどんなものがありますか?

デモ専門にですか? 1冊しかありませんが、もし最低限1冊というのなら、Michael Abrashの「Zen of Graphics Programming」第2版、The Coriolis Group刊、ISBN 1-883577-89-6(Michael Abrash's Zen of Graphics Programming, 2nd Edition, published by The Coriolis Group (ISBN 1-883577-89-6))を手に入れてください。アメリカ合衆国内での価格は約$44.99で、付属CD-ROMには「Zen of Assembler」がデジタルデータとして入っています。この本は、ローレベルのVGAハードウェアプログラミングから、高速アニメーションテクニック、3Dアルゴリズム、BSPツリー、Quakeまでのすべてを網羅しています。多くのデモコーダーの一致した意見は、これはこんなにクソthis is this shit)、という点です。:-)私たちは皆この本を6年前に読むことができたらよかったと思っています。しかしながら、もちろんそのころ私たちは全員これらのテクニックを同時に発見していたのでした。

以下にお勧めの本をもう少し挙げておきます:

アセンブラ:

C/C++:

VGA:

グラフィックス:

デモプログラミング:

雑誌:


(2.2)ソースコードの例はどこに行けば見つかりますか?

グラフィックイフェクト、サウンドルーチン、その他のソースコードの例が以下のFTPサイトで手に入ります:

ソースコードが手に入るCD-ROMに関しては、 the Nightowl CDROMシリーズ、Software Vault CD、それにEmerald CDが挙がっています。


(2.2.1)馬鹿にしないでくれ--「本物の」プログラミング情報はどこにあるんだ?

わかった、わかった--怒鳴らなくてもいいですよ。:-)上に挙げたもので大体は大丈夫なはずですが、そのほかにもいくつか参考になるものを、このFAQの読者の何人かが挙げてくれましたので、まだ知らないものがあれば試してみてください。

他にも以下のような技術的文書が、インターネット上で多数流通しています:


(2.3)ペイントプログラムはどこに行けば見つかりますか?

ほとんどのデモコーダーはElectronic ArtsのDeluxePaint ][eを使います。このプログラムはIBM用としては絶版ですが、どこかのバーゲンで見つけるか、Electronic Artsから直接購入することができるでしょう。また、Rebel Assault(LucasArtsが作ったゲーム)のオリジナルのCD-ROMを持っていれば、開発用ツールがいくつか入った隠しディレクトリがあって、その中にDeluxePaintもある、という噂があります。:-) Amigaを持っているなら、Amiga用のDeluxe Paint IVを簡単に購入して使うことができるでしょう(Brillianceのほうがよい製品だと言う人も多いですが)。

AutodeskのAnimator PRO 1.3aが、ビットマップ描画用プログラムでは最高だと言うDOSユーザの一団もいます。写真のようなビットマップ画像の編集では、Adobe Photoshopは間違いなく最高のプログラムのひとつでしょう。「自然なビットマップ」を作成するには、Fractal Design Painterが一番です。

Satan Paintというフリーウェアのプログラムもあります。これはAbuse(いかすシェアウェアゲーム)と同じ作者によるものです。Abuseはftp://ftp.hornet.org/pub/games/abuseで見つけることができるでしょう。

シェアウェアのペイントプログラムも、いくつかいいものがあります。Windows用のPaint Shop Pro 3.11 for Windowsや、DOS用のNeopaintがそうです。以下の場所で見つけられるでしょう:

GD / Hornetによる追加:「「Grafx 2」という新しいMSDOS用ペイントプログラムがhornetにあります...#traxで皆がそれについて話していたのを聞きました。詳しく知りたければ、「gfx2b」というファイル名で検索すればいいと思います...ファイル名の残りの部分はバージョン番号です。」


(2.4)作曲プログラムはどこにありますか?どれを使えばいいですか?

音楽に関しては、ほとんどのデモグループが、Amigaで使われはじめたフォーマットである「モジュール(music modules)」を使っています。しかしながらMODS(モジュール)はPCでは色々なフォーマットがあります。現在のところ標準的なフォーマットはS3M、IT、それにXMです。いくつかの古いフォーマットで、まだ使われているものに、MODとMTMがあります。

モジュールを作るためには、「トラッカー(Tracker)」と呼ばれるプログラムを使う必要があります。現在までの最高のトラッカーとしては、以下のようなものが挙げられます:

名前
読み込み
保存
Fast Tracker II v.2.06 by Triton MOD, XM, S3M XM
Scream Tracker v3.21 by Future Crew MOD, S3M, STM MOD,S3M
MultiTracker v1.01 by Renaissance 669, MOD, MTM MTM
Impulse Tracker v2.10 by Pulse MOD, S3M, IT, MTM, XM S3M, IT
Velvet Studio by Velvet MOD, S3M, AMS, XM AMS, XM

これらのトラッカーは、ftp://ftp.hornet.org/pub/demos/music/programs/trackersに行けば見つかります。

注意

さて、どれを使えばよいかについてですが、それはまず第一に、なぜ作曲しているかによって異なります。ただ単に楽しむために作曲しているのであれば、どのトラッカーでもいいですから使いやすいものを使いましょう。最も柔軟性の高いものを求めるなら、おそらくImpulse TrackerかFastTracker IIを使うべきでしょう。これらには非常に多くのオプションがあります。FT2には、古き良きAmiga時代と同じように、ビルトインサンプラーとサンプルエディタがついています。しかしながら、デモのために作曲しているのなら、あなたのチームのコーダーがサポートできるトラッカーを使うことを、忘れずに確認してください。Scream Tracker 3を使っているならどんな場合でも安全です。.s3mファイルフォーマットは2番目に多くプレイヤーにサポートされているフォーマットだからです(一番はMODです)。また、ST3はAmigaのMOD編集モードを持っており、そのため正しいMODフォーマットの曲をトラッカーで作ることもできます。

異なる種類のPCのMODフォーマットに関する、さらに詳しい情報は、PC Demos Explainedを参照してください--具体的には以下のURLです:


(2.4.1)自分の書いたコードから音楽モジュールをプレイするにはどうすればいいですか?

音楽を鳴らすためのライブラリは、いくつかのデモサイトにあります。そのひとつにftp://ftp.hornet.org/pub/demos/code/soundがあります。ここに行けば、以下のものを含む多くのライブラリが見つかることでしょう:

名前
ファイル名
フォーマット
言語
MIDAS v0.40 mdss*.zip XM以外のほとんどのフォーマット
Assembler, Pascal, C
MIDAS v0.5x mdss*.zip ほとんどのフォーマット
C
Mikmod v2.xx mik*.arj ほとんどのフォーマット
C
Bells, Whistles, and Sound Boards v.1.2x bwsb*.zip XM以外のほとんどのフォーマット
Assembler, Pascal, C, BASIC
CapaMOD v3.xx cmod3*.zip MOD, S3M, XM Assembler, Pascal, C
FMODDOC2 by FireLight fmoddoc2.zip ほとんどのフォーマット
C

上記のライブラリはどれもGUSでモジュールを鳴らすには十分すぎるほどで、そのうちいくつかは他のサウンドカード(Sound Blaster/Pro/16、Pro Audio Spectrum/+/16など)も多数サポートしています。FMODDOC2は、ファイル構造、終点の値(period values)、情報(information)などに関する素晴らしく完全な情報を含んでいます。自分でプレイヤーを書きたいのなら、これは非常におすすめです。

(これらのライブラリはMODやMOD関連のフォーマットを演奏するためのものであって、MIDI演奏用ではないことに注意してください。MIDI用には、広く普及している「Miles Drivers」や、もしGUSしか持っていないならUltraMIDかGUS SDKを使うことができます。詳しくは、GUS FAQを参照してください。)


デモとインターネット

(3.0)インターネット上で、デモについてもっと深く知ることができる場所はありますか?

実際のところ、いくつかあります:
There are several, actually: -->

(注意:このニューズグループは「demos」と最後についていますが、ゲームのデモ版などについて話し合うところではありません。そういうテーマについては、comp.sys.ibmpc.games.*以下のグループを調べてください。)

comp.sys.ibm.pc.demosはデモについて一般的な質問をするにはいいところですから、デモ関連の一般的な質問はここでまず訊ねてみてください。そんなわけで、この文書でもcomp.sys.ibm.pc.demosについてまず話し、次にIRCそしてWWWについて話すことにします。


(3.0.1)comp.sys.ibm.pc.demosではどんな話ができますか?

みんないろいろなことを投稿します。いくつかはデモに関することで、いくつかは技術的な質問です。たとえば:

他の雑多な投稿は、近いうちに公開される新しいプログラムに関することです。たとえばあなたがデモを書いたり、自分のソースコードのいくらかを公開したりしたなら、ここで私たちに教えてください。要は、それがデモに関することなら、投稿すればいいのです。:-)


(3.0.2)comp.sys.ibm.pc.demosではどんな話が「できません」か?

いくつかの記事はあまりにしばしば投稿されるために、ニューズグループの参加者の多くがうんざりしています。以下に避けるべき主題の例を挙げます:

題名(Subject)
投稿を避けたほうがよい理由
「GUSはSBより優れています!」

「SBはGUSより優れています!」

このような議論はcomp.sys.ibm.pc.soundcards.advocacyのようなサウンドカードグループに投稿すべきで、ここに投稿すべきではありません。
「最高速のPutPixelは何ですか?」
この質問はあまりにも何度も何度も訊ねられています。(ところで、このFAQの10.0でこれはカバーされています。)
「俺のデモはマジですげーぜ!(mY dEm0 t0TalLy rUleZ!)」
「エリートな」投稿は、基本的に「ださい」奴の特徴なので、無視されます。
「PCなんてダサダサだぜ!」
通常、これらは端末の利用者が席を離れている間に投稿されます:-)。そうでなければ、Amiga/Atari主義者が投稿したのです。
「mydemo.zip, part 1 of 23」
comp.sys.ibm.pc.demosにバイナリを投稿してはいけません!かわりにalt.binaries.demo-scene.ibm-pcに投稿しましょう。

これらの投稿は通常多くの返信をもらいます--友好的な返事ではありませんよ!

また、comp.sys.ibm.pc.demosはバイナリニューズグループではありません! 第3世界や豊かでない国の人の多くは、唯一可能な方法でこのニューズグループを受け取ります--彼らのホームコンピューターに直接配信されるのです。comp.sys.ibm.pc.demosにバイナリファイルがあったら、それだけで彼らは多くの出費を強いられることになります! だから、どうかバイナリは絶対に投稿しないでください。バイナリを投稿したいなら、かわりにalt.binaries.demo-scene.ibm-pcに投稿してください。他の多くのデモな人が手に入れられる場所に、バイナリファイルをアップロードしたいのなら、先に触れたftp sitesについての節を参照してください--通常、ftp://ftp.hornet.org/pub/demos/incoming/demosのような、FTPサイトの/incomingディレクトリには、アップロードすることもできるのです。


(3.0.3)まだあまりよく知らないんですが、どうすれば馬鹿にされないように投稿できますか?

もうひとつ、投稿するときに守るとよいルールとしては、元々のメッセージを編集して適切な返事を書くことです。例えば、前の投稿者が投稿して既に皆が読んだ文章を全部つけて投稿するのはよしましょう。前のメッセージを5ページ引用して、返事の内容が1文しかないというのは、たいていの場合やりすぎ(hassle)です。


(3.0.4)自分の投稿した古い記事を消すことはできますか?

使っているニューズリーダープログラムが、投稿を削除するオプション機能を持っているときに限り、可能です。削除機能がなければ記事を消すことはできません。いったん記事を投稿したら、それは投稿されるべきニューズグループすべてに投稿されるので、キャンセルされる前に誰かが読むかもしれません。だから、投稿する前によく考えましょう。もし間違ったものを投稿してしまったら、可能ならその投稿をすぐにキャンセルして、本当に言いたかったことを書いて投稿しましょう。そうすればたいていの場合、間違ったオリジナルメッセージに対して50通も返事が来ることはないでしょう。


(3.1)IRCとは何ですか? デモのためのIRCチャネルはありますか?

IRCとはインターネット中継チャット(Internet Relay Chat)の略です。alt.ircなどといったニューズグループでは、IRCについてさらに詳しい情報が手に入るでしょう。IRCでは、無線通信のように「チャネル」に入って、世界中の人々とリアルタイムで話をすることができます。立ち寄って質問をするにはいい場所です。

これを書いている時点で、デモに関する2つの主なチャネルは以下のようになっています:

注意:#traxはAnothernetに移ったので、もし#traxにjoinしても誰もいなかったら、/server neato.orgかまたはirc.phonet.comのように、別のAnothernetサーバの名前をタイプして試してみてください。詳しい情報が知りたければAnotherNetのホームページ「http://www.another.net」をチェックするといいでしょう。 また、#traxも自分自身のホームページを持っています。http://www.spaz.com/traxです。

デモとデモコーディングのためのチャネルは、ほかにもあります:

上記のチャネルはEuro-Efnet上にあります。Euro-Efnetに向いたアメリカ合衆国のサーバはirc.stealth.netです。

また、多くのグループが、ネットワーク上にいる時は、彼ら自身のチャネルを持っています。#massive#nativesがそうです。最後になりますが、パーティのいくつかは開催期間中チャネルを開いています:#asm95#naidなどがそうです。ためらわずに、いつでも参加してみてください。面白いし、かなり中毒性があります!

最近AnotherNet(#traxが既に移行し、#codersが移行しようとしているIRCネットワークです)への接続に問題がある人のために、問題を解決する短いスクリプトを、なんとかやっと私が自分で用意しました。

手順はこうです:

  1. IRCクライアントを起動します(このスクリプトはircll用に書かれています)。
  2. スクリプトを読み込みます。
  3. サーバに接続します。

これがそのスクリプトです:

この3行をコピーして「initping.irc」として保存し、.ircrcファイルに1行加えるだけです。そうすれば完璧に動作するはずです。


(3.2)WWWとは何ですか? WWW上にはデモについて知ることができる場所はありますか?

スイスにあるCERNの教授たちが作り出したWWWは、ハイパーテキストのネットワークで、他のハイパーテキストに接続することができます。MosaicやNetscapeなどのWWW「ブラウザ」でアクセスすれば、WWWページに接続することができ、記事を読んだり、絵を見たり、ファイルをダウンロードしたりといったことができます。手短かに言えば、まだWWWを試したことがないのなら、インターネットの新しい側面をまるまるすべて見失っているといえるでしょう。

ブラウザを探しているなら、これら3つのうちどれかを使ってみるといいでしょう:

デモシーンの多くのグループが、自身のホームページを持っており、その一覧はここに全部載せるには長すぎますが、TrixterがPCデモに関する説明と多くのデモリソースのリストを載せたホームページを持っています。以下のURLでアクセスできます:


(3.3) デモに関するニューズレターはありますか?

不定期に発行されるdiskmags(FAQ 6.0参照)以外に、デモシーン関連では2つの隔週刊ニューズレターがあります:DemoNewsとTraxWeeklyです。

DemoNewsは、ftp.hornet.org(Hornetの本拠地であり、インターネット上で最大のデモサイト)に新しくアップロードされたファイルの一覧と、ニュース、インタビュー、そしてデモシーンに関連した記事の両方からなっています。DemoNewsはDan Wright (Pallbearer / Toxic Zombies & Hornet)によって創設され、Hornetデモグループによって引き継がれています。

TraxWeeklyは、DemoNewsに似ていますが、ミュージックシーンのために存在しています。IRCチャネルの#trax(FAQ 3.1参照)から派生したので、「TraxWeekly」と呼ばれています。

これらのマガジンを購読するための方法を以下に書いておきます(TraxWeeklyからの抜粋です)。

 _____TraxWeeklyの購読方法

TraxWeeklyの購読は無料で、以下の方法でリクエストできます:


以下の宛先にメールを送る:
        listserver@unseen.aztec.co.za
メッセージ本体には以下のように記入:
        subscribe trax-weekly [あなたの本名]

購読を中止したい場合には、以下のように書いたメールを同じアドレスに送る:

                              unsubscribe trax-weekly

 TraxWeeklyはftp.hornet.orgの以下のディレクトリでも手に入ります:

 /pub/demos/incoming/info/  には一番新しくアップロードされた版が、そして
 /pub/demos/info/traxw/     にはバックナンバーが全部あります。

DemoNewsはだいたい週に1回の割合で発行され、直接電子メールで配信を受けることができます。毎回のDemoNewsによると、購読する方法は以下のとおりです。

 _____DemoNewsの購読方法

以下の宛先にメールを送る:
        listserver@unseen.aztec.co.za
メッセージ本体には以下のように記入する:
        subscribe demuan-list [名前] [名字]

listserverがあなたのe-mailのリターンアドレスにDemoNewsを配送します。

 _____バックナンバー

DemoNewsの古い号は、/pub/demos/info/demonewsディレクトリにあります。
新しくリリースされた号は/pub/demos/incoming/infoに投稿されます。

最後になりますが、私がRAW mag on-lineについて触れていないと誰かが指摘しました。これは、私がそれについて何の情報も持っていないからです。WWW上を探してみてください。


(3.4)デモに関係している人たちとコンタクトを取るにはどうすればいいですか?

デモ関係者に連絡をとるとき、一番簡単なのは、e-mailを送ることです。出す側も受け取る側も少ししかお金がかからないし、大きな時差の影響を避けることができます。もし相手のe-mailアドレスが見つからなかったら、IRC上で探してみたり(FAQ 3.1参照)、comp.sys.ibm.pc.demosに相手を探している旨の投稿をしたり(FAQ 3.0参照)、SCouT/SuccesSが管理している「demo contact list」をhttp://utopia.knoware.nl/users/rolandoでチェックしてみたりするとよいでしょう。 Snowmanもhttp://www.hornet.org/ha/pages/email.cgmlでリストを管理しています。 rob@span.comが管理していた古いリストがありましたが、18か月以上も古いものです。


(3.5)インターネット上にデモBBSはありますか?

以前、Digital Horizonsという大規模なものがdragon.axs.netにありましたが、なくなってしまいました。私はそのほかに次の2つしか知りません。BlueWaterがhttp://www.Bluewater.chにあり、LooK BBSがhttp://www.geocities.com/siliconvalley/Heights/8481/にあります。


サウンドに関する質問

(4.0)GUSサウンドカードのバリエーションにはどんなものがありますか?

現在のところ4種類が出回っており、大きな違いは主に録音能力に関する部分です。

カード
録音
再生
Gravis Ultrasound 44.1KHz, 8-bit stereo 44.1KHz, 16-bit stereo
Gravis Ultrasound MAX 48KHz, 16-bit stereo 48KHz, 16-bit stereo
Gravis Ultrasound ACE (cannot record) 44.1KHz, 16-bit stereo
Gravis Ultrasound PnP 48KHz, 16-bit stereo 48KHz, 16-bit stereo

Gravis Ultrasoundはもう製造されていませんが、まだいろいろなところで$50くらいの安い値段で注文することができます。MAXの小売価格は米国ドルで$179、ACEは同じく約$99です。米国での実勢価格はたいてい小売価格よりも20〜30%低くなっています。(訳注:日本ではGUS PnP以外は入手が困難です。PnPは、秋葉原のOverTopなどで、約2万〜2万4千円程度で売っています。またGUSとSBにハードウェア互換のGUS Extremeが、ヨーロッパでは既に発売されています(97年9月現在))

Gravis Ultrasound PnPは、主にWindows 95のようなPlug-and-Play OSのためにデザインされたPlug-and-Playカードですが、非Plug-and-PlayのOSでも同様に利用できます。直接サポートしないプログラムに対しては、もしRAMが増設してあれば、普通のGUSであるかのように振る舞います。PnPは、拡張性はありますがRAMは標準ではついておらず、PnP Proは512KのRAMを標準で内蔵しています。また、従来のGUSカードとは異なり、PnPはAMDのInterwaveチップがベースになっていて、General MIDIの機能を内蔵しています。RAMを増設すれば、昔のGUSカードと同様に、General MIDIの音色をディスクから読み込むことができます。PnPは従来のGUSの制限のいくつかを打ち破ることに成功しています。例えば1MBまでしかRAMを増設できなかったのが8MBまで増設できるようになったり、14チャンネル以上では音質が低下していたのが、ネイティブのInterwaveモードで使用すれば音質の低下は起こらなくなっています。最後に、GUS PnPは従来のGUSカードよりもSound Blasterとの互換性が高いです。

PnPの小売価格は$179です。


(4.1)デモでは、Gravis UltrasoundサウンドカードのほうがSound Blasterよりも多くサポートされているのはなぜですか?

いくつか理由があります:


(4.2)デモでは、Gravis UltrasoundサウンドカードのほうがGeneral MIDIよりも多くサポートされているのはなぜですか?

General MIDIは、より高品質な楽器が使えますが、楽器の数と楽器そのものについては生来の制限があります。つまり、楽器を変えることはできないのです。例えば、ある特定のピアノの音が好きではなかったとしても、どうしようもありません。それに対して、MODやMOD系のフォーマットでは(FAQ 2.4参照)、作曲者が使いたいどんな楽器でも、好きなものを使うことができるのです。

また、General MIDI用拡張ボードは、価格面と音質・音色の質の面において、製品ごとに大きな違いがあり、同じ曲を演奏しても、あるGMIDIボードでは他のボードと同じように聞こえないかもしれません。

最後に、高品質なGeneral MIDI用拡張ボードは$200以上します--これはデモシーンのメンバーほとんどの予算から言って、通常手に入れられる値段ではありません。


(4.3)MIDIがデモに使われたことはありますか?

信じるかどうかはともかく、使われたことはあります。Five And Then SomeのSuperunknown (TG '94)では、MIDIファイルとカスタムGUSパッチが音楽に使われていました(ただし、このデモの音楽をまともに聴くためには、GUSが必要です。GMIDIボードでは音楽は鳴りません)。そして、The Phony CodersのデモはRoland MT-32しかサポートしていません。FMシンセはどうかというと、いろいろな場面で使われていますが、これはMIDIでもないしMIDIシーケンサで作曲されるものでもありません。このためのカスタムトラッカーが存在するのです。


(4.4)デモでは、Gravis UltrasoundサウンドカードのほうがSound Blaster AWE32よりも多くサポートされているのはなぜですか?

SB Awe32がGUSによく似ていて、勝っている点さえいくつかあるにしても、デモコミュニティにうまく受け入れられてはいません。主な理由は、カードに関する(ハードウェアに近い)低レベルの情報が、長い間無料で手に入れることができなかったという点です。また、今では変わりましたが、最近になるまで、SB AWE32はGUSよりも50%近くも高い値段でした。しかし、GUSはSB AWE32に比べて3年以上も歴史が長いので、GUSははるかに多く市場に出回り、はるかに多くの無料ソースコードが存在するのです。(公正な言い方をするならば、Renaissanceが元々、何が起こっているのか検知するドライバの機能をオフにしていたところ、Gravisがヒントを得て開発キットを公開したのですけれども。)

幾人かのコーダーが、ドライバをリバースエンジニアリングして(reverse-engineered)、SB AWE32を動作させるだけではなく、その上でMODやXMをエコー・コーラス・リバーブ効果つきで再生するCソースコードができあがりました。この情報は、ftp://ftp.hornet.org/pub/demos/code/soundに行けば見つかります。 AWE32をサポートするトラッカーもいくつかあります:The Ultimate TrackerとRamTrackです。これらはftp://ftp.lysator.liu.seなどのサイトで見つかるでしょう。


(4.5)私の持っているSound BlasterでGUSをエミュレートできますか?

いいえ。GUSは非常にSound Blasterに比べてあまりに多くの機能を持っているため、エミュレータを書くのは困難きわまりない作業になるでしょう。このことと、多くのデモがハードウェアを完全に乗っ取るという事実を合わせて考えてみると、エミュレータを書くのが不可能であるということがはっきり理解できるでしょう。

ええ、これはまったくの真実というわけではありません。DPMIとIOパーミッションビットマップ(IO permission bitmaps)に関しては、不可能ではありません。PentiumならCPU時間の20%以上は消費しないでしょう(32-channels at 44kHzであると仮定して)。しかし、ほとんどの人が、これは受け入れられないと考えるでしょう。

もちろん、GUSのハードウェアエミュレータは存在します。:-) それはGUS ACE(FAQ 4.0参照)と呼ばれており、既にあるサウンドカードと共存するようにデザインされています。アメリカでは約$80しかしません。


(4.6)私のSound Blaster 16はどうしてデモの音をステレオで出力しないのですか?

もしそのデモがSB16を直接サポートするのなら、ステレオで鳴るし問題はまったくないはずです。ステレオで鳴らないという問題は大抵の場合、そのデモがSBProだけをサポートしている場合に起こります。これはデモが悪いのではなくCreative Lab(Sound Blasterシリーズを製造しているメーカー)のせいです。SBProはそれぞれのチャンネルに2つのDACを持っており、これらのDACの出力がステレオにミックスされるか、モノラルにミックスされるかを制御するビットが、オンボードフィルタにあります。SB16のミキサーはこのステレオ/モノラルフィルタのビットを認識しません--ただ単に、ビットが回路上に存在しないのです。そのためモノラルになるという訳です。

通常この現象は、SBとSBProだけをサポートする古いデモに関してのみ現れます。


グラフィックスに関する質問:

(5.0)デモを見るのに一番いいビデオカードはどれですか?

デモプログラマーというものは、最低のハードウェアで最高にイカすものをプログラムしたがるものなのです。別の言葉で言うなら、もしすべてがそうではないにしても、ほとんどのデモにはレジスター互換のVGAカードが必要なのです。デモを最高品質で楽しみたいなら、可能な限り高速なビデオカードが必要です。高速グラフィックを表示するときには、ほとんどのビデオカードが一番のボトルネックになるからです(PCのメモリはビデオカードのメモリよりもずっと高速なのです)。以下に一般的なガイドラインを記します:

Hercules Stingrayは、ARK-xxxxシリーズのチップを使っています。Hercules Dynamite Pro/Powerは、Tseng ET4000 W32pチップセットを使っています。これらはたぶん、同チップセットの実装としては最高速のものです。ARKチップセットを使ったStingrayは、Dynamiteシリーズに比べて、DOSではtadに速く、Windowsではもう少しよくわかる程度に速く動作します。

本当に最新のチップセットが要るのなら、ET6000を手に入れるべきです。GrafixStar 600では、1秒あたり約100mb/sを達成します!! しかしながら、Windows環境ではMatrox Milleniumよりも7%ほど遅くなります。マルチバンクRAM(multi-bank ram)が1チャンネルしかないし、RamDACは最高のものではないのです。(マルチバンクRAMを2チャンネル持っていて、カード上では1G毎秒近く出るカードが出るのを待ちましょう)

最後になりますが、何人かの人がMatrox Milleniumの次期バージョンを薦めています。DOSでのパフォーマンスが高いことだけが理由ではなく、VESA 2.0規格をハードウェアで満たしているためです。VESA 2.0はいくつかの高解像度のデモがサポートし始めています。カードのBIOSにVESA 2.0がない場合、たいていScitech SoftwareのUNIVBE(現Scitech Display Doctor、FAQ 5.3参照)のような一般的なVESAプログラムでエミュレートすることができます。

ATI 3D Expression+PC2TVカードも、BIOSでVESA 2.0と各種低解像度、それにトゥルーリニアフレームバッファ(true linear framebuffer)をサポートしています。それに加えて、TV出力もついているのです--多くのデモを自分のTVで見たり、ビデオテープに録画したりできます。:-) しかしながら、そのためにボードは画面のリフレッシュレートを強制的に60Hzにしてしまうので、他のリフレッシュレートに同期しているデモはおかしくなってしまいます。

最新のビデオベンチマークについて知りたいなら、comp.sys.ibm.pc.hardware.videoを読んでみるといいでしょう。


(5.1)モードXとは何ですか?

モードX(とその変種であるモードY)は、Michael Abrashによるスラングで、デモで使われる、2種類の最も一般的な、制約の少ない256色VGAモードを指します。「制約の少ない」というのは、ビデオメモリの制約を外して、そのすべてにアクセスを可能にする方法から来ています。普通のモード13(320x200x256色)は「制限があり」ます。モードXは320x240で、モードYは320x200です。

ビデオメモリの制約を外すことには、少々短所があります。メモリの組織構成が異なり、プログラムするのが難しくなります(「バイト平面(planes of bytes)」で組織されているので、普通のモード13のような標準的な直線(linear)フォーマットよりも、取り扱うのが難しくなります)。しかしながら、その長所ははかりしれません。ビデオメモリの制約を外せば、以下のようなことが可能になります:

「古い時代」のIBM PCデモでは、モードXプログラミングは、当時の遅いISAバスと遅いビデオカードで速いスピードを得るための唯一の方法でした。今日では、2つの理由から、普通のモード13が復活を果たしています:

以下にモードXプログラミングの背景を少し書いておきます:

制約を外すと、256kのVGA RAMのすべてにアクセスすることが許されます。不幸なことに、A000:0-A000:FFFFではたった64kしかアドレスすることができません。そこでVGAは色選択の方法として平面法(plane method)を利用します。とある妙なハードウェアの「仕様」のために、各平面に1ビットが存在してそれぞれのピクセルの色を制御するのではなく、各平面に1バイトを割り当てて各ピクセルの色を制御するのです。これは以下の式によって表されます:

So:

Q 2.2.1で触れたように、モードXをプログラムするための優れたPascalとCのライブラリが、ftp://x2ftp.oulu.fi/pub/msdos/programming以下の「xlib」ディレクトリ全部にあります。また、Zoombapup // CodeXの管理によるモードX FAQを読むこともできます。これが現在も保守管理されているかどうかは不明ですが、http://www.depaul.edu/~trixter/docs/modex.faqで第何版かを手に入れられるでしょう。


(5.2)モード13がモードXよりも速いことが時々あるのはなぜですか?

モードXではページフリッピング(page flipping)よりもビット転送(blit)が速いと、時々言われます。これは描画ルーチンがどの程度賢いか、ビデオカードがどのくらい高速であるかという点に完全に依存します。

例えば:モードXを利用するためのフラットシェードポリフィラーを書いたとすれば、一回の書き込みで最高4つまでのピクセルをビデオメモリに描くことができます。ところが、スクリーン外のバッファに完全に書き込んでから、VLBかPCIビデオカードでディスプレイメモリに移動するとすれば、そうです、ただ単に一発rep movsdしたほうがモードXにコピーするよりも速いのです。なぜならモードXでは、(単純な例では)16kコピーしてから、VGAに2バイト書き込んでプレインを切り替え、そしてまた次の16kをコピーしたりしなければならないのです。64k全体が処理されるまでこれが続けられるのです。

以下にblittingのための手早い例(Pascal, real-mode)をちょっと載せておきます:

Procedure move_repmovsd(src,dst:pointer;size:word); assembler;
{for moving off-screen buffers to Mode 13 display memory for VLB or PCI} 
asm 
  push ds 
  les di,dst 
  lds si,src 
  mov cx,size 
  shr cx,2 
  db $66; rep movsw 
  pop ds 
end;

Procedure copyvscreentox(sourceseg,destseg,count:word);assembler; 
{blits 64K buffer from RAM to unchained video memory; thanks to Jussi L. for help}
asm
  push ds
  mov ds,[sourceseg] 
  mov es,[destseg] 
  sub si,si 
  sub di,di 
  mov bl,1 

@loop1:
  mov dx,3c4h 
  mov ah,bl 
  mov al,2 
  out dx,ax 
  mov cx,[count] 
  shr cx,3 

@loop2:
  mov al,[ds:si] 
  mov ah,[ds:si+4] 
  mov [es:di],ax 
  add si,8 
  add di,2 
  dec cx
  jnz @loop2

  sub si,[count] 
  inc si 
  sub di,di 
  shl bl,1 
  cmp bl,16 
  jne @loop1

  pop ds 
end;

というわけで、モードX画面をコピーするにはどれだけ多くのものが関わってくるかがわかるでしょう。ただし、それでもなおこれを使う利益はあるのです:隠されたビデオページにコピーしておいて、垂直回帰を待ち、ただ単にページを切り替えることができます。こうすれば、目に見える画面の更新はちらつかないことが保証されます。

前に言ったように、あなたが何をしようとしているかによって話は違います。星空の場面なら、上のどちらの方法も使ってはいけません。星1つごとにa couple of port writesするのはばかばかしいサイクルの無駄でしかないからです。ですから、再トレース(retrace)を待って、そしてビデオメモリ上の古い星を全部消してから描画すればいいのです。さらに言えば、新しい星を描くたびに古い星を消しているなら、再トレースを待つ必要さえないのです。こうすることで発生するちらつきは、ほとんど目にとまりません。


(5.3)このデモにはVESAかUNIVBEが必要です。どこに行けばそれは手に入りますか?

好きなほうを選んでください:http://www.scitechsoft.comか、ftp://ftp.scitechsoft.com

ところで、UNIVBEは公式にはScitech Display Doctorと改名されています。


スラング/用語集/術語

(6.0)Diskmagとは何ですか?

Diskmagは、ほぼ定期的に配布される電子雑誌やニュースレターのことです。普通はデモシーンのニュースやレビュー、パーティのリポート、それに一般的な話題がいろいろと掲載されています。:-) Diskmagは表示用プログラムつきの実行形式のプログラムで、いい選曲のBGMとインターフェースグラフィックスがあるという点で、musicdisk(FAQ 6.1参照)に似ています。

多数のdiskmagがftp://ftp.hornet.org/pub/demos/magsにあります。


(6.1)Musicdiskとは何ですか?

Musicdiskとは、単一のミュージックグループかデモグループ、またはディスク1枚を配布メディアとするミュージシャンによってリリースされた曲を集めたものです。まれに、いくつかのグループの曲からなるものもあります(例としては複数グループのmusicdisks、ChromatiksとEpidemicを参照のこと)。Musicdiskはそれぞれ専用に作られたプレーヤを持っていて、diskにある曲だけを再生するのです。また通常はいかしたGUIがあったり、曲について作曲者が詳しい情報を書いていたりします。Musicdiskは、収録するのに十分な量の曲を作ったとグループが判断すれば、いつでも公開されるので、不定期かつ折々にしかリリースされないのです。

ftp://ftp.hornet.org/pub/demos/music/disksに行けば、いろいろなmusicdiskが見つかるでしょう。


(6.2)MusicdiskはMusicpackとどこが違うのですか?

Music packはmusikdiskによく似ていますが、いくつか重要な違いがあります。以下はその違いの一覧です:

要点は、伝統的にいって、music diskはAmigaやC64同様に1枚のディスクに収まり、自分自身でプレーヤを持っています。ですから、極端なことを言えば、1枚のディスクに収まりきらなかったり、独自のプレーヤが付属していなかったりしたら、それはmusikdiskと呼ぶにふさわしいものではないでしょう。

多くの人がこのような見方に反対していますが、反対する人のほとんどが、デモシーンの人ではなく、純粋なミュージックシーンの人なのです。このFAQはcomp.sys.ibm.pc.demosのためのものなので、私はデモの視点から判断します。


デモグループ

(7.0)デモグループを作ったり、参加したりするにはどうすればいいですか?

宣伝しなさい。身近にあるデモ指向のBBSや、comp.sys.ibm.pc.demosにメッセージを投稿するのもたぶんよい方法でしょう。関連のIRCチャネル(FAQ 3.1参照)にいる誰かに話しかけるとか、デモグループのWWWページ(FAQ 3.2参照)を検索するということもできます。個々のグループに電子メールで直接連絡を取ることさえできるのです。


(7.1)Future Crewはどうなりましたか?

(5/10/96現在での情報です:)

グループとしては、何もオフィシャルなことはありません(グループはまだ公式には解散していません)。Henchmanは、Pyramid3Dチップが市場に出ると同時に、Windows 95用のデモをやるのではないかと示唆しています。

商業的側面:

デモ:

個人:


(7.2)Tritonはどうなりましたか?

Tritonは最近デモから商用のゲームに移行しました。Tritonの名前はそのままですが、もうデモは作っていませんし、その予定もありません。

(5/10/96現在の情報です:)

商業的側面:

デモ:

個人:


(7.3)Cascadaはどうなりましたか?

Cascadaには1994年以来いくつかの変化がありました。まずグループは商業ベンチャーであるCascada VRとその他のメンバーに分裂し、Cascada VRに行かずに残ったメンバーはしばらくの間Imphobiaに参加しましたが、長くは続きませんでした。

(5/10/96現在での情報です:)

商業的側面:

デモ:

個人:


(7.4)Twilight Zoneはどうなりましたか?

Twilight Zoneは、GUSをはじめてサポートしたおもしろいデモ(Jungly Kitchen and Monty Python)を作り、初期に人気を博しました。その後彼らはゲーム会社を興しました。

商業的側面:

デモ:

個人:


(7.5)Byterapersはどうなりましたか?

Byterapersは、確実に、現在も続いている中では最も古いデモグループです。C64とAmigaに始まり、今ではC64とPCの両方でプロジェクトを進めています。現在の彼らの状態については、以下のようなプレスリリースを出しています。それによれば・・・ええと、読めば分かるでしょう:

今年で10周年記念を祝うデモグループであるByterapers, Inc.は、Finlandの
Ouluで開催されたAbduction'96デモパーティで「Drill Me, Please Me」を発表し
て、1996年6月第1週にPCデモシーンに参加した。

この初のPCリリースとなる作品は、Abductionのデモコンペティションにおいて、
2位と3位のエントリの獲得票数の2倍に迫るすばらしい票差をつけて1位を獲得した。

Byterapersの最初のPCリリースが1位を獲得したということは、結成から10年の歴
史を持つこのグループが、いまだ生き残っており活発であることのしるしとして
十分なものである。今後も、このFinlandのOuluで開催されたAbduction'96デモ
パーティですでに確立された路線を継続する予定である。

World of Codeシリーズ(WOC、WOC 2、WOC 3)やExtremesのような作品は、C-64
デモシーンでは最高の部類に属するものであり、われわれの最新の3つのデモコン
ペティション参加作品のうち2つは1位を、残る1つは2位を獲得した。これを追っ
て「Drill Me, Please Me」が瞬く間に成功を収めている。

Byterapersの歴史は1986年に始まる。この年、志を持った4人の面々が、自分たち
の小さな作品でByterapersの名を使いはじめた。2年後の1988年にはグループは
Amigaでの活動を始めて、多国籍に成長し、かなり広く知られるようになる。
1989年にはグループはC-64での活動を停止して、Amigaでのキャリアに集中し、そ
こでも才能を発揮するようになる。1991年から1992年にかけてグループは長い休
眠期間に入り、初期の活動から休止して自身の内的活動やピクニック、
BytePartiesなどを精力的にこなすが、作品を仕上げることはなかった。

この6年の間に、(B)という略称で知られるByterapersは以下の実績を上げている:
イントロや他の小さな作品を含めずに約150のデモと、数え切れないほどのクラッ
クをC-64でリリース
世界的なクラッキンググループチャートの上位NO:9以内に常に位置する(この活
動は後に禁止され、完全に停止された)
7つのmusicdiskをAmigaでリリース
イントロや他の小さな作品を含めずに約20のデモをAmigaでリリース
その他数多くのおかしな楽しみのためのリリース
コンテスト以外での、常に酔っぱらっていて騒々しく奇妙なことをやらかして
奇妙な格好をしバーからバーへと渡り歩くが結局のところ非常に無害な超級
パーティ野郎としての名誉

(B)は1994年にWorld of Codeデモをspring'94でリリースし、復帰を果たす。これ
は以下のように多くのデモ関連の賞を獲得している:
今年の最優秀復帰賞(comeback of the year)
今年の最優秀デモグループ賞(demogroup of the year)
今年の最優秀デモ賞(demo of the year)
今年の最優秀プログラマー賞(coder of the year)
これは「複数の」優れたC-64ディスクパブリッシングでの投票結果である。

1996年以降に注目すると、(B)は存在し続けて飲んだくれ、機会があれば時折
C-64とPCでデモをリリースする予定でいる。

ByterapersのサイドカンパニーであるByterapers Movie Productionsは、
Byterapersの4番目のワールドクラス高品質ホームムービー「Splattered Death 
II - River Runs Red(スプラッタード・デスII 〜 川は赤く流れる)」の最終仕
上げにかかっている。これは予定通りなら今年の夏に公開されるもので、
なんとかしていくらか稼いでカメラのレンタル代に充て、フィルムの編集権
を得ようとしているところである。

初期のByterapersの映画作品、大金投入・高品質・一晩中・家族全員・血は一滴
も流れない映画は次の通り:
Splattered Death
Fochrybenis
(B) Files

後者は大成功を収めた有名なX-Filesのパロディで、この秋に続編が予定されてい
る! 「Byterapers goes Doom」もまた予定に上っている。


Byterapers - ケツの痛み
Byterapers - あなたが勃起する原因

警告:
「Byterapersはあなたの脳に悪影響を与えます。過度の飲酒は脳細胞を破壊します。
Byterapersのオフィシャルメンバー条件には、大量のアルコールを摂取できる能
力が含まれています」
「Byterapersはデモグループではありません。それは生き方です」

(B)メンバーステータス:

名前 (場所) E-Mail 機種*仕事

(B) Pielavesi
Nico - Amiga*gfx
Lasse - -*hitman
Proton - -*hitman, wall
Enema - *hitman, king fartTampere
Mr. Sex b150542@proffa.cc.tut.fi C64*kooder,laatta
Dr. Dick t136344@proffa.cc.tut.fi C64/Amiga*kooder,hw-huru-ukko,guru
Birra jsoini@vip.fi PC*hitman, myy halvalla, sheepish partyguard

(B) Savon SNTL
Reznor - -*hitman,kiljudoctor, movie master
Hazard hazi@finhost.fi Amiga*hitman,teknokko,gamemaster,warlock,hirmu
Jazz jazz-b@freenet.hut.fi -*muzza, party, Her Royal Cuteness
Grendel jkauppin@muikku.jmp.fi C64/Amiga/PC*hitman,hirmu
Kasper jarkko.sonninen@lut.fi C64/PC*kooder,hitman
Professor Fate PC*hitman
Lanttu U.S.Army on PC*kooder,hw-huru-ukko,hitman,official mascot
T.o.B - PC*muzza,hitman
Sivu - PC*kooder,hirmu

(B) Muualla
Icemann Vantaa - PC*hitman, expensive partyguard (batman)
TP Helsinki/Somero pomppuju@atki.helbp.fi Amiga/PC*kooder
Mike Jyväskylä - C64*gfx
Jate Jyväskylä ? PC*gfx
Micron Raahe mhyvonen@ratol.fi on PC*hitman
Albert Helsinki ? Amiga*hitman
Kemu Oulu mysti@stekt.oulu.fi C64/Amiga*Design,juoppohullu
Kraku ? cracker@freenet.hut.fi PC*kooderRuåtti/Tukholma
Dr. Star ? ?*?
CSA f93-caa@nada.kth.se ? ?*?
Speed-Head damaskus@algonet.se amigamuzzak,3d,unix ja nettaus



このプレスリリースは、お馬鹿なグループの創始者であるGrendel/Byterapersが
ハイネケンビールを飲みながら作成した。
楽しんでいただきたい。

追伸
デモの入手については追って告知する。おそらくパーティの主催者が配布すると
思われるが、われわれは修正版を作成する予定である。

grendel/(B)

-- 
Jukka O. Kauppinen  Mail: Sankarinkatu 9A3,74100 IISALMI,FINLAND
Journalist          E-Mail: jkauppin@muikku.jmp.fi
MikroBITTI          Tel/fax +358-77-24225
  Byterapers Inc.   Amiga 500/1200(030),PC486,CD32,C64,Spectrum


(7.6)Vibrantsはどうなりましたか?

Vibrantsは、C64では最も有名で誰もが好んだグループのひとつで、さまざまなプラットフォーム用のさまざまなゲームのために仕事をした有名なミュージシャンを多数輩出しています。彼らはPCのAdlibミュージックにも関わり、異論はあるにせよそれまでで最高のAdlibミュージックとAdlibトラッカーを生み出しました。このプレスリリースが示すように、彼らは今では完全にPCに移行しています:

Vibrants、PCでの制作を開始

ゲームプロジェクトで音楽が必要なときは、どうぞお気軽に以下のアドレス経由
でVibrantsに連絡してください:

        Vibrants
        Co. / Thomas Egeskov Petersen
        Merkurvej 2
        6600 Vejen

64ではるか以前に創立されたVibrantsは、数年をかけて各種のプラットフォーム
上で実力を示すまでになった。現在ではPCでの制作が主で、内容としてはMOD、
MIDI、またはCD(もちろんどのCD-ROMベースのプラットフォームでも再生できる
もの)となっている。

Vibrantsメンバー:

Thomas Mogensen         (aka. Drax )
Torben Hansen           (aka. Metal)
Jesper Olsen            (aka. JO)
Jens Christian Huus     (aka. JCH)
Thomas Egeskov Petersen (aka. Laxity)

興味のある方は遠慮なく連絡してください!


デモパーティ/コンポ

(8.0)デモパーティとは何ですか?/デモコンポとは何ですか?

デモパーティとはその名が示す通りのもの--デモを祝うパーティです。みながコンピューターを持ち寄って集まり、エフェクトを見せつけ、デモを観賞し、音楽を作曲したりといったことをします。たいていは小さなもので、参加者は50人以下です。

それに対して、デモ「コンポ」(ヨーロッパのスラングで「competition(コンペティション、競争)」の意)は、最高位のデモとイントロに対して賞が贈られるコンペティションです。パーティが小規模なのに対し、コンポは大規模です。コンポは普通400人以上が参加し(The PartyとAssemblyが最大のもので、3500人以上が参加します)、主に学校で開催されます。簡単に借りられて、費用も少なくて済むためです。一日24時間を通して各種のイベントが行われるので、眠ったり、何かいかすものを見逃さないようにするのは難しいでしょう。結果として、参加者の多くはコンポの開催期間中、単に眠らないのです。:-)

パーティやコンポの後、いくつかのグループが出す「パーティリポート」では、パーティ・コンポ会場で撮影された写真を見たり、コンポの結果を書いた記事を読んだり、イベントと人々の写真を見たりすることができます。パーティリポートは、たとえばhttp://ftp.hornet.org/pub/demos/partyにあります。


(8.1)デモパーティはいつ、どこで開催されるのですか?

北米のシーンにとっては悔しいことに、ほとんどのデモコンポは海外であるヨーロッパで開催されます。例年行われるパーティでは唯一NAIDが北米(カナダのケベック州モントリオール(Montreal, Quebec, Canada))で開催されますが、1996年以降はもう開催されないのではないかと噂されています。Eclipse '97がその後を引き継ぐとも噂されています。

デモコンポには毎年ほぼ同じ時期に開かれるものがあります:

aschlud@autelca.ascom.ch (Denis Schluchter)が親切にもFAQのためにスケジュールを書いてくれました:

                        DEMO EVENTS '95:

Bizarre                       9/10  September   Etten-Leur, Holland
Wired                         3/4/5 November    Mons, Belgium
The Party                     Winter

                        DEMO EVENTS '96:

The Partyplaces may change! (I took those from last year ...)

X                                Spring         Utrecht, Holland
The Gathering
NAiD                                            Canada
Abduction

Somewhere in Holland             Summer         Roosendaal, Holland
Juhla                                           Iisalmi, Finland
Bushparty
The Summer Encounter                            Denmark
Assembly                                        Helsinki, Finland
Gasp                                            Montpellier, France

Wired                            Fall           Mons, Belgium

The Party                        Winter

Phoenix / Hornetがより新しい情報に基づく以下のリストを提供してくれました(おっと、これは彼の仕事の一覧でもあるんですが :-)):

その他の定期的なデモパーティ:
Other Regular Demo Parties: code on hornet.org Spring: X Holland since 1995 X9? Cache Hungary since 1994 CAC9? Saturne France since 1994 SAT9? Scenest Hungary since 1995 SCE9? Mekka/Symposium Germany since 1996 MEK9?/SYM9? Summer: Abduction Finland since 1994 ABD9? Enlight Russia since 1995 ENL9? Euskal Spain since 1995 EUS9? Icing Sweden since 1995 I9? Remedy Sweden since 1995 REM9? Summer Encounter Denmark since 1995 SE9? The Scene Singapore since 1995 TS9? Fall: Bizarre Holland since 1994 BIZ9? Movement Israel since 1995 MOV9? Wired Belgium since 1994 WIR9?

このリスト以外にも、デモ関連のイベントを探しているならhttp://hagar.arts.kuleuven.ac.be/~sdog/party/に行けば見つかります。ここではデモパーティとデモコンポについて書かれたWWWページを一覧にしています。


(8.2)デモコンポはどういうふうに審査されるのですか?

いい質問ですね。まず最初に、前提としてポイント制への合意が必要です。ポイント制にもいろいろな方法がありますが、たとえばNAID'95では、各デモはグラフィックス、プログラミング、音楽、総合デザインのそれぞれについて最高で5点までを与えられます。この場合、合計得点が最も高いデモが優勝を勝ち取り、2番目に高いものが2位に、といったふうになります。次に、あまりに多くのエントリーがあった場合、すべてのエントリーは事前にふるいにかけられ、略式の投票によって標準以下のエントリーが除外されます。(このステップは審査委員会が存在するコンポに限られます。下記参照のこと)

さて、一体誰が審査をするのでしょうか? 普通は異なった2種類の方法によります:公開投票と、審査委員会です。
Now, who actually does the judging? Usually, there are two different methods: A public vote, and a juding panel.

注意してほしいのは、これらの方法のどれかが必ずしも他の方法より優れている訳ではない、ということです。時々これらの方法を組み合わせることもあります。NAID'95では公開投票で「大衆人気賞」の受賞作品を決定し、審査委員会が「公式な」1位から10位の順位付けと上位3位の受賞作品を決定しました。


OSとプラットフォーム

(9.0)Windows/Windows 95用のデモがひとつもないのはどうしてですか?(訳注:Windows用デモもいくつかあります)

多分、システムパフォーマンスを阻害したり、ハードウェアへの直接アクセスを制限するといったことを含めて、典型的なデモコーダーの行動を制限するようなことをWindowsがしているという単純な事実が理由でしょう。これらの制限には抜け道がありますが、単にDOSに落ちてアセンブリ言語を使ったほうがずっと簡単なので、誰もWindows用のデモを作りたがらないのでしょう。

Windowsは遅くて馬鹿でかいので、一般にデモコミュニティでは見下されています。多くの人が、Windowsは今までに書かれた中で一番ダサいデモのひとつだというジョークを口にします。 :-)

その一方でWindows 95は、DirectX APIを生かしてデモのプラットフォームになる可能性が少しあります。DirectXはDirectSound、DirectDrawといったハードウェアへの直接のインターフェースを持っているので、上に示した制限を克服できる可能性があります。ですが、APIはやはりオーバーヘッドなので、デフォルト状態では生DOSと同じ速度で動作することは無理です。そしてそういう訳で、いまだにWindowsはデモコーダーからは見下されています。

もしWindows 95用のデモをコーディングするのに興味があるのなら、Win95 Game SDKを直接Microsoftに注文して、まったくの無料で入手できます。もしくは彼らのウェブサイトのhttp://www.microsoft.comからダウンロードすることもできます。彼らに連絡するにあたっては、「自分が開発中のゲームを、Windows 95 DirectXプラットフォームに移植しようとしている」のだと伝えるだけでいいのです。The Game SDK (GDK)にはDirectDraw、DirectSound、DirectPlayが含まれています。

しかし、Windows 95アプリケーションを全面的に開発するためには、Win32 SDKが必要になるかもしれません。Win32 SDKはMicrosoft Developer Network (MSDN) level 2についてきます。これは一年あたり$500米ドルするもので、MSのSDKすべて(CD約30枚)が含まれており、年4回のアップデートサービスもついてきます。

DirectXについてもっと詳しく知りたければ、以下のリンクをたどってみてください:

以下の文章はLuc-Eric Rousseauの提供によるものです:

オーケイ、(Windowsディベロッパーとしての)私のコメントはこうです。
DirectXを使えばプログラマーはDOSでできることは何でもできるようになりま
す。けれども、作業量が減る訳ではありません。これは単にWindows 95環境でク
リーンで安全にハードウェアを直接使うための方法なのです。そういう訳で、デ
モコーダーは好きなようにコードを書けばいいのです。望むなら全部アセンブラ
で書いてもいいし、そうすることでたしかにパフォーマンスは大幅に向上しま
す。でももちろんDirectXのデモは常に、DOSよりも動作が遅くなります。その反
面、デモはよりユーザーフレンドリーになります(クリーンリブートは必要ない
し、すべてのサウンドカードとの互換性が手に入ります。その他諸々)

デモコーダーはDirect3Dには興味がないでしょう。カスタムメイドの3Dルーチン
にはそれだけの効果があるし、なんにしろデモを書く面白さはそこにあるのだか
ら。Direct3Dは、芸術指向のグループに使われるかもしれません。

DirectSoundは、とても簡単に新しいオーディオカードをプログラムできます。
DOSのMODプレーヤーを1週間以内にWindowsに移植することが可能だと私は確信し
ています。もしDirectSoundがなかったとしても、Windowsで再生できる音楽は数
多くあるということが、Mod4Winを見ればわかるでしょう。

たったひとつ問題なのは、中級のWindowsプログラマにとっては説明書が理解しづ
らいということです。でもそれはVESAに少し似ていて、長い間難解なものだった
けれど、今はもうまったくそんなことはないのです。

DirectX SDKは作られてから6か月も経っていません。みなが慣れるまでには、少
なくともあと1年はかかるでしょう。逆に多くのグループがLinuxに乗り換えるか
もしれませんが、そこには観客は存在しません。もちろんDOSはいつでも動きます
が、デバッグが楽な他の環境にみな移ることでしょう。2台のモニタが接続されて
いる環境でなければ、DOSプログラムをデバッグするのは楽しい作業ではありませ
ん。

私の予想では、1年以内に、今現在あるVESAデモと同じくらい多くのデモが、
Windows95で走るようになるでしょう。まだまだ経験豊かなプログラマー向けだろ
うとは思いますが、最初の2、3のリリースは非常に注目を集めるでしょう。

(9.1)Linux用のデモがないのはどうしてですか?

実際のところ1つあります:SkalのHard Roxがそうです。しかし、Linuxが高速な32ビットマルチタスクOSで、うまく最適化してくれるコンパイラがフリーで使えることを考えれば、もっとたくさん存在するとあなたは思うかもしれません。しかしLinuxのSVGAlibを使ったスクリーンセーバーがデモであるとしても、「本当の」デモは見あたりません(自分のデモをLinuxに移植中だと主張する人は多いのですが)。

可能性としてひとつ考えられるのは、OSが持つマルチタスクの性質そのものが、CPUがひとつの最優先タスクに集中するのを妨げているということです。たとえばテクスチャマッピングエンジンの内部ループや、垂直回帰割り込み(vertical-retrace interrupts)や、その他CPUを占有して使う必要のある処理です。別の説明としては、たとえCPUを独占的に使えたとしても、デバイスドライバを書かなくてはそういった処理をできないということが考えられます。デバイスドライバは、デモコーダーの多くが書きたがらないもののひとつです。それでもなお、Linuxがフリーで高速だということだけ取ってみても、Windows用にデモが書かれるよりも先にLinux用にデモが書かれるほうが可能性として高いように思えます。


(9.2)DOSベースではなくPC上で動くデモは何かありますか?

私が知っているのは次の2つだけです:OS/2 3.0 (MMPM/2 extentionをインストール済みのOS/2 Warp)用にEthosが書いた、Peripheral Evolution OS/2という名前のデモがあります。これにはソースコードが付属しています。Linux用のデモも存在しています。SkalのHard Rox です。これはWired '96デモコンペティションで優勝しており、DOS上でも動作します。

現在進行中のDemOSプロジェクトでは、デモを書くのに特化したオペレーティングシステムを作ろうとしています。これに関する情報は、以下の3箇所で得られるでしょう:

北米にいる人にとっては、リストの最初のURL (cdrom.com)が最も速いでしょう。


(9.3)PCを持ってないんですが、ほかのコンピュータ用のデモはありますか?

実際のところ、いくつかあります。元々デモが誕生したのはPCではありません。ソフトウェア海賊が自分のリリースに張りつけたcracktroを起源として、デモは10年間以上歴史を重ねてきました。今では、デモグループはクラッキンググループとは何の関係もありません。実際には、ほとんどのPCデモグループは一回もクラッキンググループと関係したことがありません。

以下に挙げるプラットフォーム用のデモが存在します(だいたい歴史的な順序にリストしてあります):

ゲーム専用機用にもいくつかデモが存在します! 嘘ではありません。たとえばSuper NES(スーパーファミコン)用のデモグループでは、「カートリッジコピー機」を経由してSNESにAmigaを接続し、そういうふうにしてプログラムします。SNESは出来のよいサウンドチップとテクスチャワーピングエンジンを内蔵しているので、好奇心をそそられた人がいたのでしょう。:-) http://www.futureone.com/~damaged/Consoles/SNES/demos.htmlにいくつかサンプルがあります。


(9.4)アミガグループはPCに移行しつつあるのですか?

コモドール社が死んでしまった今、Amigaの未来もまた明らかではありません。いくつかのグループは部分的または完全にPCに移行することを決定しています。最近数か月のあいだにPCデモシーンでは、CNCD、Oxygene、Bomb、Silents、Scoopex、Byterapersなどの元メンバーが、ミュージック、グラフィックス、または完全なデモをリリースしています。

Nooonには元Sanityのメンバーが数人(MobyとRA)います。Pulseのメンバーの多くもまたAmigaシーン出身です(DreamDealers)。

Oxygeneは実際には元Atariと元Amigaのグループです。:-) Oxbabとその仲間たちが書いたデモには、古いAtari STマシン用の最高のデモのひとつに数えられるものがあります。


(9.5) Javaのデモはありますか?

現在のところJavaでは、いくつかの理由により、デモ関連では大したものは何も存在しません:
As of the moment, nothing serious demo-related exists for Java, for a couple of reasons:

ですが、多くの人がこれに取り組んでいます。http://www.hornet.org/pub/demosには、ウェブ上のデモエフェクトをいくつかリストしたDemo Javaへのリンクがあります。その他にも資料があります:


(9.6) BeBox用のデモがないのはどうしてですか?
(訳注:今ではあるはずです)

BeBoxデモが存在しないのは、プラットフォームが新しすぎることと、所有している人がほとんどいないことが理由でしょう。しかし、BeBoxはデモ用としては最高の新しいマシンのように思えます。高速グラフィックスに関して言えば、Beの製品デモには同時に6つのTrue Colorビデオを表示するパートがありますが、ぎこちなさはありません。それに加えて、BeBoxには標準的なサウンドインターフェースがあります。

さらに詳しい情報については、Beのホームページ(http://www.be.com/)と、Beに関するニューズグループ(comp.sys.be)を見てください。


技術/プログラミング情報
(訳注:この項、訳者は全然理解していないので、いろいろ間違いがあるはずです)

(10.0)最高速のPutPixelは何ですか?

基本的なバージョンが2つあります:ひとつは参照テーブル(lookup table)を使うやり方で、もうひとつは使わないやり方です。参照テーブルを使うほうの方法が最高速です。

参照テーブルを使わない方法:

Procedure PutPixel(X,Y:Word; c:Byte); Assembler;
Asm
  mov AX,0A000h
  mov ES,AX
  mov AH,Byte Ptr Y
  mov BX,X
  add BX,AX
  ShR AX,2
  add BX,AX
  mov AL,c
  mov ES:[BX],AL
End;

参照テーブルを使う方法:


Var 
  lut : Array[0..199] Of Word;

Procedure PutPixel_LUT(X, Y : Word;  C : Byte);  Assembler;
{ code from  Jannie Hanekom  }
{ optimized by  Andreas Jung }
Asm
  mov  BX, Y
  add  BX, BX
  mov  AX, 0A000h
  mov  ES, AX
  mov  BX, Word Ptr lut[BX]  { Note:  BX not changed within 2 cycles }
  mov  CX, X
  add  BX, CX
  mov  AL, C
  mov  Byte Ptr ES:[BX], AL  { Again 1 cycle before memory move }
End;

プロシージャを使う前に、参照テーブルを作っておくのを忘れずに。こんなふうにすればいいでしょう: for i := 0 To 199 Do lut[i] := i*320

Kneebiterは386プロテクトモードによる同様のコードを提供してくれました:

;eax - color
;edi - y
;ebx - x
;
; The fastest (?!?) non-table version

    shl    edi, 6                ; ebx *= 64                    3 clocks
    lea    edi, [edi*4+edi]      ; ebx *= 5   (64*5 = 320)      1 clock
    mov    [edi+ebx+0a0000h], al ;                              memory ref

; The fastest (?!?) table version

    mov    edi, [edi*4 + table]  ;                              memory ref
    mov    [edi+ebx+0a0000h], al ;                              memory ref

本当に最高速のputpixelとは、自分のコードやpolyfillerなどの中に組み込まれたものがそうだということに、多くの人が気づいていません。レジスタをスタックにpushして関数を呼び出すのにかかる時間は、実際にピクセルを描画する時間よりも長いのです! だから、関数を作って呼び出すのではなく、これらのメソッドを自分のプログラムに組み込んでみてください。


(10.1)Vertical-Blank Interrupt(VBI)をプログラムするにはどうすればいいですか?

VBIはこんなふうにすればできます:

proc INT8 ; VBI
  SetVGAStartAddress ;optional
  WaitForVRT
  SetPalette ;optional...
  ReprogramTimer ;with a rate FASTER than the screen refresh rate
  EOI
end

これをさらに拡張すると、どんなスキャンラインにも達することができるシステムができます。たとえば以下のように:

proc INT8_part1 ; VBI
  WaitForVRT
  ReprogramTimer ; make the int occur in the middle of the screen
                 ; or any scanline you want
  SetInt8Vector(INT8_part2)
  EOI
end

proc INT8_part2 ; some scan line X -interrupt
  WaitForHRT
  DoSomeFancyStuffWithTheScreen
  ReprogramTimer ; make the int occur before the VRT
  SetInt8Vector(INT8_part1)
  EOI
end

好きなだけこれに追加してください! よい例として、RenaissanceのWhite Shadow(もうRenaissanceにはいませんが)の作品を見てください。ftp.hornet.orgにいくつかあります。最初は、DoWhackaDoとDeadBeat BBSイントロを見てみてください。

次はプロテクトモードのアセンブラの例です。ほかのアセンブラベースの言語で変更が必要な部分は、主に割り込みのフック(interrupt hooking)です。

        
.386p
code32  segment para public use32
        assume cs:code32, ds:code32

include pmode.inc

public  VBI_function
public  frame

; DATA

DELAY   EQU             16805

old_pmode_irq0_vect     dd      ?
old_rmode_irq0_vect     dd      ?
irq0_buffer             db      21 dup (?)
old_pmode_irq1_vect     dd      ?
old_rmode_irq1_vect     dd      ?
irq1_buffer             db      21 dup (?)
VBI_function            dd      ?
frame                   dd      ?

; CODE

_main:
        sti

        mov     VBI_function, offset _ret      ; notice that I initialize
                                               ; VBI_function before hooking 
                                               ; the IRQs
        call    hookirq1
        call    hookirq0
        
        ; blah, blah, blah...

        call    unhookirq1
        call    unhookirq0
        jmp     _exit

hookirq1:                                   ; hook the keyboard
        mov     bl, 1
        call    _getirqvect
        mov     old_pmode_irq1_vect, edx    ; in pmode
        mov     edx, offset newirq1
        call    _setirqvect
        mov     edi, offset irq1_buffer
        call    _rmpmirqset                 ; and in real mode, just in case.
        mov     old_rmode_irq1_vect, eax
        ret

unhookirq1:
        mov     bl, 1
        mov     eax, old_rmode_irq1_vect    ; unhook real mode kb IRQ
        call    _rmpmirqfree
        mov     edx, old_pmode_irq1_vect    ; unhook pmode kb IRQ
        call    _setirqvect
        ret

newirq1:                                    ; just completely ignore the keyboard
        push    eax
        in      al, 60h
        mov     al, 20h
        out     20h, al
        pop     eax
        sti
        iretd

hookirq0:                                   ; see comments from hookirq1
        cli
        mov     bl, 0
        call    _getirqvect
        mov     old_pmode_irq0_vect, edx
        mov     edx, offset newirq0
        call    _setirqvect
        mov     edi, offset irq0_buffer
        call    _rmpmirqset
        mov     old_rmode_irq0_vect, eax

        ; I assume that the timer is in its normal mode of operation at program
        ; startup and I have the ISR reprogram the timer for me.  That's also
        ; why I do the hooking early in the program set up, to make sure that
        ; atleast one timer interrupt goes off.  I'll synch the timer to the
        ; routines later in setup.

        sti
        ret

unhookirq0:
        cli
        mov     bl, 0
        mov     eax, old_rmode_irq0_vect
        call    _rmpmirqfree
        mov     edx, old_pmode_irq0_vect
        call    _setirqvect

        mov     al,  00110110b          ; timer 0, 16-bit counter, mode 3
        out     43h, al                 ; resets the timer.  What about
        xor     ax, ax                  ; reseting the time based on the
        out     40h, al                 ; CMOS clock?  Their time will be
        mov     al, ah                  ; wrong.
        out     40h, al

        ; this resets the timer to its normal mode of operation

        sti
        ret

newirq0:
        pushad
        cli
        
        call    wait_retrace   ; retrace is 1/70th of a sec, timer is usually 1/18.2
                               ; of a second.  No problem before first setting the
                               ; timer of having recursion.  After that the timer is
                               ; set for one shot, so there's no way the ISR goes
                               ; off twice.
                               ;
                               ; The CLI instruction just before doesn't hurt either
                               ; :-)
        
        ;
        ; reprogram the timer here...
        ;

        mov             al,  00111000b   ; timer 0, 16-bit counter, mode 4 (one shot)
        out             43h, al
        mov             ax, DELAY        ; the delay is just under 1/70th of a sec.  I don't
        out             40h, al          ; want to wait too long and miss the retrace.  Give
        mov             al, ah           ; a little room for interrupt latency and computers
        out             40h, al          ; that run nearer to 68 Hz refresh.
                
        call    [VBI_function]   ; put your blitting routine here?

        ; poll the music player here.
        ;
        ; makes life a little easy if the music is at a certain BPM

        inc     frame            ; frame count
        mov     al, 20h
        out     20h, al          ; EOI
        popad                    ; restore stack
        sti                      ; set interrupts
        iretd                    ; return

code32  ends
end


(10.2)特定のマシン上で、1「クロックサイクル」はどのぐらいの長さですか?

これはコンピュータ(xxMhz)の単純な速度です。そんなわけで、垂直回帰(vertical retrace)と同期をとるプログラムでは、たとえばもし486/33上で動作している場合には、1回の回帰につきたった33000000/70 = 471428クロックサイクルしかありません。


(10.3)どうすれば環境マッピング(environment mapping)ができますか?

もしあなたがテクスチャマップルーチンを作れたのなら、環境マッピングはすぐそこです。たとえばオブジェクトの面ひとつに環境マッピングを施したいとすると、頂点の法線(?)(vertex normal)(単に隣接している面の法線すべての平均です)を計算して、球面座標(spherical coordinates)に変換します(Rho、Phi、Thetaです。法線は長さが1なので、実際のところRhoは関係ないのですが)。さて、PhiとThetaはこの頂点の球面方向になりました。あなたがここで何をすればいいかというと、これら2つの角度を、理論的にオブジェクトを取り囲む、巨大な球面テクスチャマップへの参照として使うのです。球体の「ラッピング」をするにはいくつもの方法があります。私の場合は256x256のイメージを前面の中心に置き、背面にいくにしたがって四隅を湾曲させました(一方向では128プラスマイナスphiで、もうひとつの方向ではプラスマイナスthetaです。わかったでしょうか... わからなければ数式そのものを投稿してもいいんですが、非常に簡単です)。こうして、2つの角度を使って、ラップしたテクスチャへの値を計算し、その頂点でのテクスチャのU、Vを求めればよいのです。これを4つの頂点すべてについて実行し、普通にテクスチャマップします。この工程をすべての面について行えば、自作の環境マッピングの出来上がりです。

ただ注意してほしいのは、中心にマップのある球体オブジェクト(立方体は単に6つの側面を持った球体であることに注意)のすべてについて、頂点法線はまさに法線化(?)(normalize)された頂点だということです。このため少々おかしな結果になります... 頂点自体とは同一の法線を持たないオブジェクトを使ったほうが、環境マッピングをそれっぽく見せることができるでしょう。


(10.4)DMA PutpixelまたはDMA Mem-to-Mem copyをするにはどうすればいいですか?

これには手を出さない方がいいでしょう。DMAコントローラは64Kセグメントに限定されているばかりでなく、最も低速なPC(ここで言っているのは8086のことです)以外では、REP MOVSWするよりも遅いのですから。

もちろんDMAメモリ転送(DMA memory transfer)はCPU時間をまったく使いませんが、それでもなお近頃のPCでは遅すぎるので、使わないほうがいいでしょう。もし、本当に動作するかどうかを試すために、何がなんでも本当にやってみたいのであれば、Patrick & David O'Rivaによる1989年の短い記事が参考になるでしょう。1989年の286上では、これはREP MOVSBよりも高速だったことは覚えておいてください。しかし386ではREP MOVSDのほうが高速だったので、これを再掲載しているのは歴史的な参照だけのためです。

高速メモリ移動のためのDMA転送

もし超高速なメモリブロック移動が必要で、そのためならいろいろな制約もいとわないというのなら、3クロックサイクルごとに1バイトの割合で移動する方法が、PC環境には存在します。rep movsbに必要なクロック数と比べてみれば、それほど速くないというでしょう。これはどんなプログラマーにも向くという方法ではないし、たしかにたった何バイトかを移動するのに毎回使うようなものでもありません。

DMAチップは4チャンネルデバイスです。チャンネル0は、メモリのリフレッシュのために予約されています。メモリのリフレッシュには、メモリのどこかから、連続した256バイトが、4ms以下のインターバルで読み出されることが最低限必要です。ほかの3つのチャンネルは、ディスクドライブやポートの間で情報を転送するといった用途に使うことができます。ここまでは、面白いうんちく話で、メモリを動かすには役立たない情報です。ここからがいやなところなのですが、8259 DMAはセグメントに関して何も知らないのです。知っているのは64Kの世界だけです。ページレジスタが関係してくる理由はこれです。ページレジスタは各オペレーションについて、8259は(64Kを境界に)どのページを見るのかを決定します。予想どおり、レジスタは4つではなくて、2つ+デフォルトしかありません。チャンネル1でも2でもなければ、チャンネル3にプログラムされたデフォルトレジスタを使うのです。

8259のデータシートを注意して読むと、メモリ間転送が可能なことがわかりますが、これはチャンネル0と1の間でしかできません。このせいで、この方法を使うにあたっては少し手際を要するのです。自分自身のパラメータを設定するには、チャンネル0からタイマーが何ミリセカンドかごとにDMAを要求するのを無効にして、8259を再設定し、メモリのリフレッシュをする責任を引き受けなければいけません。実際には、思ったほどひどくはありません。8259の設定と再設定はそんなに長くかからないし、少なくとも連続した256バイトを移動すれば、次の2、3ミリセカンドの間のメモリリフレッシュ要求は満たせます。ページレジスタをなんとかするためには、チャンネル1と3を同じ値にセットすればいいのです。

下に挙げたのは、アイデアをテストするためだけに私が書いたプログラム例です。セットアップの大部分は、この短い記事では説明しきれないほど複雑ですが、もし興味があって調べてみたいのなら、8259のデータシートが必要になるでしょう。私のマシンではこのプログラムはきちんと動作しましたし、ほとんどの互換機上でも同じように動くでしょう。あまり互換性の高くないマシン上では、動かないということも十分あり得ます。このリストが十分にうまくコメントされていて、皆が理解して、いつか役立てるようなことがあればいいのですが。

` DMA SOURCE

PAGE 60,132
TITLE DMA MEMORY TO MEMORY

DMA         EQU 0

STACK       SEGMENT PUBLIC 'STACK'
            DB  32 DUP('STACK')
STACK       ENDS

DATA        SEGMENT PUBLIC 'DATA'
SOURCE      DW   08000H
TARGET      DW   09000H
NUMBER      DW   800H
INCDEC      DB   0
PAGER       DB   0BH    ;PAGE (O TO F)
FILL        DB   0      ;2 IF A FILL OP
DATA ENDS

ASSUME CS:CODE,DS:DATA,ES:DATA
CODE SEGMENT PUBLIC 'CODE'

START:
     MOV AX,DATA
     MOV DS,AX
     MOV AX,0B800H
     MOV ES,AX

PAGE:
     MOV AL,PAGER      ;PAGE TO OPERATE IN
     OUT 83H,AL

UNDMA:
     OUT 0DH,AL        ;MASTER RESET OF DMA
     MOV DX,03D8H
     MOV AL,1
     OUT DX,AL
     MOV AX,SOURCE     ;WHERE IS IT COMING FROM
     OUT 0H,AL
     MOV AL,AH
     OUT 0H,AL
     MOV AX,TARGET     ;WHERE TO PUT IT
     OUT 2H,AL
     MOV AL,AH
     OUT 2H,AL
     MOV AX,NUMBER     ;HOW MANY
     OUT 3H,AL
     MOV AL,AH
     OUT 3H,AL
     MOV AL,009H       ;ENABLE M TO M,COMPRESSED
     OR  AL,FILL       ;WILL BE 2 IF FILL OP
     OUT 8H,AL
     MOV AL,088H       ;BLOCK MODE, INC, READ
     OR  AL,INCDEC     ;WILL BE 20H IF DEC
     OUT 0BH,AL
     MOV AL,85H        ;BLOCK MODE, INC, WRITE
     OR  AL,INCDEC     ;WILL BE 20H IF DEC
     OUT 0BH,AL
     MOV AL,4          ;THIS IS THE REQUEST
     OUT 9,AL          ;DO IT
     MOV AL,9
     OUT DX,AL

RESET:      
     OUT  0DH,AL       ;THIS IS A MASTER RESET
     OUT 0CH,AL        ;RESET F/L F/F
     MOV AL,01
     OUT 0,AL
     OUT 0,AL

REINIT:
     MOV AL,0
     OUT 83H,AL        ;MOVES REFRESH TO BASE PAGE
     MOV AL,0FFH
     OUT 1,AL
     PUSH   AX
     OUT 1,AL
     OUT 0BH,AL
     INC AL            ;MODE CHAN3

     OUT 0BH,AL
     PUSH   AX
     POP AX
     POP AX
     POP AX
     MOV AH,4CH
     INT 21H

CODE ENDS
END  ART

ThreesomeのKneebiterは以下の言葉を追加してくれました:「もしピクセルをputするためにこれをやろうとしているのなら、ビデオバッファに書き込むのはDMAバッファに書き込むのと同じくらい時間がかかると言っておきましょう。もしメモリ画面をblitするために使いたいのなら、最高でも毎秒15フレームが限度で、ユーザーはDMAがコピーをしているところを見てとることができます。それに加え、チャンネル0と1という特定の2つのDMAチャンネルを使う必要があるのは非常に厄介です。チャンネル0は、自由になると保証されてはいません。どうしてデモのサウンドがDMAチャンネル0をサポートしないか、不思議に思ったことはありませんか?」

どうしてこのことについて訊ねてはいけないか、なんとなくわかってきましたか? :-)


(10.5)プロテクトモードとは何ですか?

デモとPCについての話をする上でのプロテクトモードとは、古いリアルモードと比較していくつかの利益をコーダーにもたらす、Intel 386以降のCPUが持つオペレーティングモードです。その利益には、以下のようなものがあります:

http://207.239.225.146/articles/pmbasics/tspec_a1_doc.htmlは、プロテクトモードプログラミングについてさらに詳しく知ることができる場所です。


(10.6)バンプマッピング(bump mapping)をするにはどうすればいいですか?

バンプマッピングは環境マッピング(environment mapping)にくらべてそれほど難しいわけではありません:ある角度での(フォン、グローからの)法線を変化させるマップを事前に計算するだけでいいのです。テクスチャマップと組み合わせて、その動きに合わせれば、でこぼこして見えます。

PowersourceのMr. Pは、さらに以下のようにつけ加えてくれました:

バンプマッピングが適用できるのは、ほぼ完全にフォンシェーディングだけです。
他のシェーディングモデルに適用するのは、その性質からいってずっと難しいで
しょう。

何をするかというと、テクスチャマップのようにマップの中を進んでいくのです
が、ここでは色を読みこむ代わりに、X置換とY置換を読み込むのです。そしてこ
れらの値をそのピクセルでの表面法線に加算して(フォンが最適な訳はもう明ら
かですね)、強度を計算し、保存するのです。

必要に応じて、適当な座標システムを再度使ってもいいでしょう。私は2次元座標
置換を選びました。環境マッピングされたフォンの場合のやり方は基本的にそう
なっているからです。

Rex Deathstarは以下のように要約しています:envmap[x+bumpx][y+bumpy] :-)


(10.7)平方根を高速に計算する方法は?

私の相棒、IguanaのJareは、親切にも以下のソースコードを提供してくれました:

/*
 * A High Speed, Low Precision Square Root
 * by Paul Lalonde and Robert Dawson
 * from "Graphics Gems", Academic Press, 1990

 * Modified by Javier Arevalo to avoid some unnecessary shifts.
 * Seems like this adds some precision too, but I'm unsure.
 */

/*
 * SPARC implementation of a fast square root by table
 * lookup.
 * SPARC floating point format is as follows:
 *
 * BIT 31   30  23  22  0
 *     sign exponent    mantissa
 */

#include <math.h>

long sqrttab[0x100]; // declare table of square roots

void build_table(void) {
    unsigned short i;
    float f;
    unsigned int *fi = (unsigned*)&f;   // To access the bits of a float in
                                        // C quickly we must misuse pointers
    for (i = 0; i <= 0x7f; i++) {
        *fi = 0;

            // Build a float with the bit pattern i as mantissa
            // and an exponent of 0, stored as 127
        *fi = (i << 16) | (127 << 23);
        f = sqrt(f);

            // Take the square root then strip the first 7 bits of
            // the mantissa into the table
        sqrttab[i] = (*fi & 0x7fffff);

            // Repeat the process, this time with an exponent of 1,
            // stored as 128
        *fi = 0;
        *fi = (i << 16) | (128 << 23);
        f = sqrt(f);
        sqrttab[i+0x80] = (*fi & 0x7fffff);
    }
}

    // fsqrt - fast square root by table lookup, original C version
float fsqrt(float n) {
    unsigned int *num = (unsigned *)&n; // to access the bits of a float in C
                                        // we must misuse pointers

    short e;        // the exponent
    if (n == 0) return (0); /* check for square root of 0 */
    e = (*num >> 23) - 127; /* get the exponent - on a SPARC the */
                            /* exponent is stored with 127 added */
    *num &= 0x7fffff;   /* leave only the mantissa */
    if (e & 0x01) *num |= 0x800000;
                /* the exponent is odd so we have to */
                /* look it up in the second half of  */
                /* the lookup table, so we set the high bit */
    e >>= 1;    /* divide the exponent by two */
                /* note that in C the shift */
                /* operators are sign preserving */
                /* for signed operands */
        // Do the table lookup, based on the quaternary mantissa,
        // then reconstruct the result back into a float
    *num = ((sqrttab[*num >> 16])) + ((e + 127) << 23);
    return(n);
}

// ---------------------------------------------------------------------
// Optimized Watcom inline version, 9-cycle? (Pentium), tested with 10.6.
// By Javier Arevalo, A.K.A. Jare/Iguana in 1996.
// E-mail me at jarevalo@ran.es for comments.

extern float VSSQ_Sqrt(float a);
#pragma aux VSSQ_Sqrt modify nomemory [EBX EDX] parm [EAX] value no8087 = \
"   MOV     EDX,EAX              " \
"   AND     EAX,0x007FFFFF       " \
"   SUB     EDX,0x3F800000       " \
"   MOV     EBX,EDX              " \
"   AND     EDX,0xFF000000       " \
"   SAR     EDX,1                " \
"   AND     EBX,0x00800000       " \
"   ADD     EDX,0x3F800000       " \
"   OR      EAX,EBX              " \
"   SHR     EAX,16               " \
"   MOV     EBX,OFFSET sqrttab   " \
"   DB      0x8B, 0x04, 0x83     " \
"   ADD     EAX,EDX              "

// Note that DB ... means MOV EAX,[4*EAX+EBX] which WC won't accept :(
// Unluckily it won't accept "MOV EAX,[4*EAX+sqrttab]" in DB either. :((
// It doesn't generate the relocation info for DD OFFSET sqrttab.
// Yes Watcom inline ASM sucks bigtime, but it's better than nothing.
// Will 2 AGIs be generated by both EBX & EAX being assigned before the
// address generation? I don't know but I can't fix this for inline code.

#include <stdio.h>

//#define TRY(a) (printf(#a ": sqrt() == %f, fsqrt() == %f, error == %f\n", 
sqrt(a), fsqrt(a), fabs(sqrt(a)-fsqrt(a))))
#define TRY(a) (printf(#a ": sqrt() == %f, fsqrt() == %f, error == %f\n", 
sqrt(a), VSSQ_Sqrt(a), fabs(sqrt(a)-VSSQ_Sqrt(a))))

main() {
    build_table();
    TRY(1.0);
    TRY(2.0);
    TRY(4.0);
    TRY(1.522756);
    TRY(12341.1345);
    TRY(2346.522756);
    TRY(0.004522756);
}

Jyrki Alakuijalaは別の方法を考え出しました:

整数平方根(Integer SQRT)についての話は尽きません。以下に紹介するのは、
私が2、3年前にここで発表したアプローチの進化したバージョンです。これは別
のアプローチに基づいています:生成されたC++コードです。ということは、コン
パイルして走らせなければいけません。その後、標準出力に生成された結果をコ
ンパイルして、それを平方根を計算するのに利用するのです。この方法は、値と
関数ポインタ、固定小数点piecewise線形近似値、それにバイナリサーチのルック
アップテーブルを使います(へへ)。以前持っていた、全範囲(0 - (2^32 - 
1))で+-1の精度があることを確認したバージョンをなくしてしまったので、今回
投稿するのは+-2の精度のバージョンではないかと思います。
私のマシン上では、ドクタードブズジャーナル(Dr Dobbs)に最近掲載された コードより、3〜4倍高速に動作します。けれども、このコードにはそれほどの価 値がありません。何かの用途に使うには、生成されるコードは大きすぎるかもし れません。しかしながら、任意の関数を模するのに使うことができるテクニック を、これは十分にデモンストレーションします。
これは「非常に高速」だとはいえません。それでもなお、私が見つけた中では最 も高速です。しかし、計算されたgotoと、ちょっと気の利いたアセンブラでの工 夫と、整数乗算の回避によって、さらに50%までは高速化することが可能なはずで す。
ところで、実際の関数(isqrt)はインラインにしてください。
-----CLIP------ #include <stdio.h> #include <stdlib.h> #include <math.h> #define FUNCNAME "i_sqrt" #define FUNCTABLESHIFT 24 #define FUNCTABLESIZE 256 #define SMALLSQRTTABLE 256 #define NESTING() {int i; for (i = n; i--;) printf (" ");} void muladd(double a0, double b0) { #define SCALERA 0.3000 #define SCALERB 0.3333 double a = (1.0 - SCALERA) * a0 + SCALERA * b0; /* hilliton kluge */ double b = (1.0 - SCALERB) * b0 + SCALERB * a0; /* hilliton kluge */ double mul = (sqrt(b) - sqrt(a)) / (b - a); int shift = (int)(- (log(mul) / log(2.0))); // round down int jappe = (1 << shift); unsigned int imul = (unsigned int)((mul * jappe * (1<<16)) + 0.5); if (sqrt(b0) > 65530.0) { printf ("{R US((%u+(((int)(val-%u)>>%d))*%d)>>16);}", (unsigned long)(sqrt(a) + 0.5) * (1 << 16), (unsigned long)(a + 0.5 - (0.4 * (1 << shift))), shift, imul); } else { printf ("{R US((%u+(((int)(val-%u)>>%d))*%d)>>16);}", (unsigned long)(sqrt(a) + 0.5) * (1 << 16), (unsigned long)(a + 0.5 - (0.5 * (1 << shift))), shift, imul); } } void recursion (double a, double b, int n) { if ((unsigned long)b <= (unsigned long)SMALLSQRTTABLE) { printf("\n"); NESTING(); printf("{return " FUNCNAME "SmallTable[val];}"); return; } double midp = 0.5*a+0.5*b; double error = sqrt(midp) - (0.5*sqrt(a)+0.5*sqrt(b)); if (error > 0.15) { printf("\n"); NESTING(); printf("if(val<%u)", (unsigned long)((a + b) / 2.0 + 0.5)); recursion (a, midp, n + 1); printf("\n"); NESTING(); printf ("else"); recursion (midp, b, n + 1); } else { muladd(a,b); } } void main () { int i, j; printf("unsigned char "FUNCNAME"SmallTable[] = {\n"); for (j = 0; j < SMALLSQRTTABLE; j++) { printf("%d, ", (int) (sqrt(j))); if ((j % 16) == 15) printf("\n"); } printf("};\n\n"); printf("#define T(j) unsigned short j(register unsigned long val)\n"); printf("#define R return\n"); printf("#define UL (unsigned long)\n"); printf("#define US (unsigned short)\n\n"); for (i = 0; i < FUNCTABLESIZE; i++) { double start = i * (double)(1 << FUNCTABLESHIFT); double end = ((i + 1) * (double)(1 << FUNCTABLESHIFT)); printf("\nT(%s%d){", FUNCNAME, i); recursion (start, end - 1.0, 1); printf("}"); } printf("\nunsigned short (*sqrtFuncTable[])(unsigned long) = {\n"); for (i = 0; i < FUNCTABLESIZE; i++) { printf("%s%d,", FUNCNAME, i); if ((i % 7) == 6) printf("\n"); } printf("};\n\n" "unsigned short isqrt (register unsigned long val){\n" " return sqrtFuncTable[val >> %d](val);\n" "}", FUNCTABLESHIFT ); } -----CLAP------ Have fun! --Jyrki Alakuijala


(10.8) Karl/NoooNの有名な40バイトサインジェネレータとは何ですか?

ACE CD #2より:

--(sin.txt)-------------------------------------------------------

 これは、ACE BBSの宣伝で使われている、サインテーブル生成ルーチンについて
 の説明です。
 使っている方法は再帰サイン合成(recursive sinus sythesis)です。すで
 に計算されたサイン値2つと、cos(2ã/N)(nは1単位時間あたりの値の
 数)の値から、新しいサイン値をすべて計算することが可能です。
  

  こんな感じです:
  

  Sin(K)=2.Cos(2ã/N).Sin(K-1)-Sin(K-2)

  または
  

  Cos(K)=2.Cos(2ã/N).Cos(K-1)-Cos(K-2)

  最後のものが一番簡単に使えます。コサインテーブルの最初の2つの値は1 &
  amp; cos(2ã/n)で、この2つの値からその後の値をすべて作り出せるか
  らです。
  

 ちょっとシンプルなコード:
  

  コサインテーブルは-2^24から2^24までの1024の値を持ちます。
  

  build_table:          lea    DI,cos_table
                        mov    CX,1022
                        mov    EBX,cos_table[4]
                        mov    EAX,EBX
  @@calc:
                        imul   EBX
                        shrd   EAX,EDX,23
                        sub    EAX,[DI-8]
                        stosd
                        loop   @@calc


  cos_table             dd     16777216     ; 2^24
                        dd     16776900     ; 2 ^24*cos(2ã/1024)
                        dd     1022 dup (?)




                               Enjoy  KarL/NoooN

---(sin.txt)------------------------------------------------------


(10.9) VESAプログラミングについてもっと情報を得るには、どこへ行けばいいですか?

手始めにhttp://www.vesa.orgへ行くといいでしょう。Scitech(FAQ 5.3参照)からも情報を得ることができます。


(10.10) VESA 2.0 リニアフレームバッファ(Linear Frame Buffer)がうまく動かないんですが、なにかヒントはありますか?

「Get Mode Info」関数を使いなさい。そうすると構造体が満たされて、メンバのひとつにリニアフレームバッファを指すポインタの物理アドレスが入ります。この物理アドレスにアクセスするには、DPMI関数800hを呼び出して、自分で使うことができるリニアアドレスにマップしなくてはいけません。UNIVBEをロードしているときは、4096MBにリニアフレームバッファが位置している、などと言ってくるでしょうが、それは物理アドレスを参照しているので、コードをテストするときはこれを二重にチェックすることができます。ただ注意しなくてはならないのは、ほとんどのシステムでは物理アドレスは異なっているので、VESA Mode Info関数を使って取得する必要が出てくるという点です。


(10.11) Intel 80x86のopcode一覧はどこにありますか?

初めての人は、まずhttp://www.quantasm.comから始めてみてください。


その他雑多な情報

(11.0)デモ関連の内容を収録したCD-ROMにはどんなものがありますか?

デモやデモミュージックのファイルを収録したCD-ROMに関する情報については、Dan Wright(dmw@gate.net)にメールで聞けば、そこそこ完全なリストが手に入るでしょう。Danに連絡がつかなかったら、http://www.depaul.edu/~trixter/docs/scenecds.txtでもこのリストのコピーが手に入ります。

Walnut Creek CDROMはHornet Underground Volume 1を刊行しており、これには1996年3月時点でHornet Archiveにあったすべてのデモを収録されています。聞くところによるとHornet Underground Volume 2も制作中だそうです。詳しくはhttp://www.cdrom.comで確かめてください。

Hugo Habetsが、いくつかのAssembly Organizing's party CDに関して以下の短い紹介文を書いてくれました:

page@ie2.u-psud.frに言われて、次のことを思い出しました:

> もうひとつオーディオCDを知っています:
>    Dr Awesome and Fleshbrain's "hoBbiTs & SpACesHipS"
>    by Bjorn A. Lynne and Seppo Hurme
>    from DENS DESIGN/CRUSADERS and Audio Visual Magic
>    (c) 1992
> with 12 songs and a time of 71'02".
> 
> The ACE Demo Collection Vol. 1 & 2 は99フランします。
> ボリューム3が1995年の12月に、ボリューム4が1996年の7月に出るでしょう。

以下はRene V. C.(DiffusionのZteel)による追加です:

>思い出せる限りでは、こんなものがあります。
>
>Assembly '94
>The Party '94
>ACE #1
>ACE #2
>
>ところで、ACE CDの情報については、yvon@sept.frにメールを書いてください。
>
>ともかく、「The Party CD」は、Assembly会場では120FIM(フィンランドの通貨単位?)
>で手に入れることができ、中にはThe Party 1994の全作品と、Abductionと
>Juhlaのベスト作品が詰まっていたと思います。The Assembly CDには、
>Assembly 1994の全部と、ムービーとアニメーションがたっぷり収録されて
>います。
>
>The ACEシリーズは、約80F(フランスフラン)します。


(11.1)自分でデモやデモ音楽のCD-ROMを作りたいんですが、何が必要になりますか?

通常、ほとんどのデモコーダーは、自分たちの承諾なしにCD-ROMに作品が収録されるのを望みません。CD-ROMの販売者が、自分たちの作品を使って利益を得ると思うからです。だから今までに作られた唯一本物のデモCD-ROMは、Dan Wright(dmw@gate.net)が制作、販売するものです。これらはいつも「差し引きゼロ」です。これは重要なことです:彼は儲けもしないが、損もしないので、誰も利用されたとは思わないのです。まったくイカす男です。 :-)

Dan Wrightは、自分でCD-ROMを作成することについて、優れた記事を書いています。この記事は、Freedom CDに収録されている「demobook」の一部分です。一部手に入れたければ、彼にメールを送ればいいでしょう。

MODスタイルの音楽のオーディオCDを作る方法について、Dan Wrightは以下の記事を寄稿してくれました:

もうひとつの方法は、Mod4Winの「direct-to-disk」モードか、Cubic Playerの「Disk Writer」デバイスを使うというものです。モジュールを再生する代わりに、これらの方式では44.1KHz 16-bitステレオの.WAVファイルに曲を書き出します。これはオーディオCDが使うフォーマットです。多くのCD-ROMライターソフトウェアは、.wavファイルからCDオーディオトラックに直接焼くことができます。


(11.2)デモシーンでの面白い発言にはどんなものがありますか?

TrixterがPCデモシーンで見聞されたおもしろい出来事の(ちょっとした :-))リストを管理しています。http://www.depaul.edu/~trixter/docs/demoquot.txtで手に入ります。


(11.3)デモの隠されたパートにはどんなものがありますか?

Phoenix / KFMF (vossa@rpi.edu)がデモの隠しパートのリストを作成しています。このリストの最新版は、Phoenixに直接頼むか、WWW上のhttp://www.rpi.edu/~vossa/secret.txtで読むことができます。


(11.4)「I am not an Atomic Playboy」のサンプルのオリジナルは何ですか?

(このサンプルは、Purple MotionによるSecond Realityのサウンドトラックの中で使われています。)

実際のところ、いろいろな説があります。ひとつは「I am not an Atomic Playboy」という言葉は、Atomic Playboyという名前のアメリカのロックグループの「Atomic Playboy」という曲からきたという説です(質問は受け付けません)。このバンドは、マイケルジャクソンのビデオ「Dirty Diana」のギタリストであるSteve Stevensがフロントです。(Stevensは、Top Gunの素晴らしいテーマ曲を、Harold Faltermayerと共に担当してもいます。)

もうひとつは、「I am not an Atomic Playboy」のサンプルはRichard Nixon(昔々、アメリカの大統領だった人です)の演説からきたものだという説です。

IOR / Hornetは、さらにもうひとつの説を示唆しています:

もちろん私が思うに、Radio BikiniでスピーチをしているのがRichard Nixonである可能性については、IORは考えてみなかったのでしょう。:-)


(11.5)「Is everybody in?」のサンプルのオリジナルは何ですか?

Verses / EMFで使われた「Is everybody in? Is everybody in? The ceremony is about to begin.」のサンプルは、バル・キルマー(Val Kilmer)主演の映画「The Doors」からのものです。


(11.6)NoooNの「Stars」のハチのオブジェクトには本当に23800もポリゴンがあるのですか?

Aumury Aubelが以下のように分析しています:

Nooonのハチが鬼のように最適化されているということ、それは確かです。オリジ
ナルの3Dモデルが23800の面からなっているというのも、十分あり得る話です。
でも彼らはどうやってこれを実現したのでしょうか?

誰かが指摘したように、ハチは1つの軸に沿って動いています。こうすることで、
乗算の回数を劇的に減らすことができます。また、明らかなことですが、23800の
面が同時に見えることもありません...

ハチはあまり大きく動き回らないので、隠れた面をテストする必要性から簡単に
逃れることができます。私の意見としては、まったくテストしていないと思いま
す。私の友人たちがやってみせるのを見たことがありますが、完璧に動作しました。
:)

広く噂されていることに、彼らはハチの位置をすべて計算している訳ではないと
いうものがあります:8フレームごとの1フレームと、その間の線形補間(linear 
interpolation)を使うのです。これはうまくいく「可能性」がありますが、私自
身試したことがありませんし、知り合いで試したという人もいません。しかし、
古いAmigaのデモで使われたことがあると、誰かが言うのを聞いたことがありま
す。

可能性のあるトリックの第3番目は、除算をすべて避けるというものです。
ベクトルを遠近法で投影するには除算を実行する必要があるなんて言っている
のは誰ですか? 除算は乗算以外の何者でもありません。いま一度考えてみてく
ださい。

さらによい解決策としては、乗算もすべてなくしてしまうのです。これは成立可
能でしょう。私はこれがやりとげられたのを見たことがあります! ずっと高速
に動作し、大きな事前計算テーブル(precalculation table)を作る必要もない
のです... 私は疑問に思いますが、Nooonは同様のことをしたのかもしれません。

回転・投影の部分と、 隠れた面のテストを取り除いたら、残りはどこを最適化す
ればよいのでしょうか。レンダリングです... Nooonのレンダリングアルゴリズム
は徹底的に最適化されています。彼らが作ったさまざまなトーラス(ドーナツ型
図形)を見れば、すぐにわかるでしょう。しかしそれでも、賭けてもいいですが、
「有効時間のほとんどがこの部分で費やされる」ことに変わりはありません。
 
結局のところ、彼らは何か別のトリックも使っているかもしれません。彼らが実
際のベクトルを使っているとは、誰も言っていません。ハチの羽根をスプライト
で代用するのは簡単なことです... 確かにこれは非常に気がつきにくいことで
しょう... これはデモであることを忘れないでください。別の言葉で言えば、こ
れは本当のリアルタイムではないということです。

最後になりますが見落としてはならないことは、私はKarlに2度会っていますが、
彼がめちゃくちゃ優秀なコーダーだということです。このことだけでも、彼らの
超越したエフェクトのほとんどが説明がつくのではないでしょうか。

Amaury.


(11.7)comp.sys.ibm.pc.demosはどのくらいの人数が購読しているのですか?

Makrusはある日サーフィンをしていて、統計資料を見つけました:

私はただサーフィンをしていて、異なるニューズグループについての統計
を、あるサイト(tile.net)が保存しているのを見つけたのです。以下が、
c.s.i.p.d(訳注:comp.sys.ibm.pc.demos)についての記述です:

「読者の実際の人数:29000
 1日あたりの平均メッセージ数:30
 1日あたりのキロバイト数:163k
 このグループを受け取るインターネットサイトのパーセンテージ:70%
 クロスポスト:13%」

個人的には、読者の数に驚きました(非常に不正確かもしれませんが!)。あな
たはどう思いますか?(29000は予想よりも多かった?)では、デモシーン人口は
どのくらいの数になるのでしょうか(シーンのすべての人が読んでいる訳ではあ
りません)?


ただ比較するために、alt.sys.amiga.demosの統計を調べてみました:
11000 / 6 / 10K / 56% / 10%
--
Makrus
Abd'96 MO

29000はちょっと多いと私は思いますが、数字が10000以上だったとしても私は驚かなかったでしょう。


FAQ情報

(100.0)誰がこのFAQに貢献していますか?

創始者はHouman Ghahremanlouで、Trixter / HornetのPC Demos Explainedのページを多少参考にして、質問の1.0から3.0までの答えを書きました。次にTrixterがFAQのフォーマットを改定し、残りの部分を加えて、管理者となり、そして追加を重ねてきました。

いったんリリースされると、多くの人々が寄稿文を送ってくれました。ここに含まれている貴重な情報を、このFAQやcomp.sys.ibm.pc.demosに投稿してくれたことに対して、Trixterは以下の人々に感謝したいと思います。

"Luc-Eric Rousseau" (l.e.rousseau@usa.net)
"RC Hoeft" (rchoefz1@ulkyvm.louisville.edu)
"Warren E. Downs" (downwa@wwc.edu)
Alain Chardonnens <100124.1007@compuserve.com>
Amaury AUBEL (amaury@cln46fw.der.edf.fr)
Andréas Kühne (andreas.kuhne@mailbox.swipnet.se)
Anssi.Saari@lmf.eua.ericsson.se (Anssi Saari)
Bastiaan_Zapf@p77.secobox.leine.de (Bastiaan Zapf)
Ben Shelton (diablo@wcarchive.cdrom.com)
Blake Kadatz (blake_kadatz@mindlink.bc.ca)
CMSLHES1@vaxc.livjm.ac.uk (Liam the lemming)
Canard@ax.com (Canard)
Captain Hook / THI (pjscorreia@telepac.pt)
Charles Scheffold (daredevi@amanda.dorsai.org)
Chris Hargrove (kiwidog@vt.edu)
Christian Cohnen (cohnen@uni-koblenz.de)
Cobra@aloha.com (cobra)
Dan Wright... enough said.  :-)
Diogo 'Spellcaster' Andrade (l42686@alfa.ist.utl.pt)
Frans Bouma (perseus@xs4all.nl)
GD / Hornet  (gd@ftp.hornet.org)
Gary D Stowasser (gary+@andrew.cmu.edu)
Hamid Moazed (hamid@rs.com)
Heikki Ylinen (flap / Capacala) (flap@flap.pp.fi)
Houman Ghahremanlou (ghahrema@bowler.dacc.wisc.edu)
Jason Maas (clueless@WPI.EDU)
Jason Nunn (root@superr.topend.com.au)
Jesse Rothenberg (jroth@mailhost2.csusm.edu)
Johannes Lehtinen (jle@cs.hut.fi)
Jordan Phillips (jordanp@cent.com)
Jyrki Saarinen (jsaarinen@kone.fipnet.fi)
Kemal Bayram (omeec@westminster.ac.uk)
Kenneth Foo Chuan Khit (kenfoo@techm.pl.my)
Kilian Hekhuis (jal@hacom.nl)
Kim Davies (kimba@it.com.au)
Lars Troen (Lars.Troen@colargol.idb.hist.no)
Lee Chun Kwok (h9504367@hkueee.hku.hk)
Lewis Berrie (hd66@dial.pipex.com)
Lewis Sellers (bcannon@usit.net)
Luca D'Ambros (micro@comedia.it)
Mark Edward Hardwidge (hardwidg@tvd0002.urh.uiuc.edu)
Michael Seow (Eaglehawk@c031.aone.net.au)
Morten Eriksen (MORTENER@sofus.hiof.no)
Niklas Kring 
Paul Bragiel (bragiel@students.uiuc.edu)
Paul Hsieh (qed@xenon.chromatic.com)
Pekka Aakko (pehu@icon.fi)
Peter Kendell (P.Kendell@bra0119.wins.icl.co.uk)
Petteri.Kangaslampi@research.nokia.com (Petteri Kangaslampi)
Phil Jones (fil@muon.demon.co.uk)
Praveen \"Ripclaw\" Reddy (praveen@elf.udw.ac.za)
Quantum Porcupine (jshagam@nmsu.edu)
Renaud Guerin (renaudg@club-internet.fr)
Rene Vinding Christensen (rvc@vision.auc.dk)
S M Carless (S.M.Carless@durham.ac.uk)
Sam (Samuel.Marshall@durham.ac.uk)
Samuli Syvahuoko (gore@clinet.fi)
Sietze Dijkstra (sdijkstr@cs.ruu.nl)
Simon Bostock (Simon@simjohn.demon.co.uk)
Sleeping Dog / The Natives
Snowman / Hornet (r3cgm@hornet.org)
Stephen Takacs (takacs@eng.usf.edu)
Sumaleth@starfury.apana.org.au (Rowan Crawford)
T H Pineapple (thp@cix.compulink.co.uk)
THE ROPESTER (mjfi3sjr@umist.ac.uk)
TORNERO@LAMBDA.UPC.ES (TORNERO GARCIA, JOSE)
Tero Pulkkinen (terop@kotka.cs.tut.fi)
Todd M Zimnoch (tz26+@andrew.cmu.edu)
Toni Lindroos (tonilind@netti.fi)
Totty (totty@mi.net)
XtaC (jwalther@smartt.com (XtaC))
ac@interaccess.com (Andrew Carlson)
adia@egnatia.ee.auth.gr (Alejandros Diamandidis)
alang012 (dsteg838@student2.uwsp.edu)
ammo@xs4all.nl (ammo)
andreas.kuhne@mailbox.swipnet.se (Andréas Kühne)
aronchce@sp.zrz.TU-Berlin.DE (AiRoN)
aschlud@autelca.ascom.ch (Denis Schluchter)
azure@people-s.people.de (Tim Boescke)
beppu@rigel.oac.uci.edu (John Beppu)
beren@infolink.no (Niklas Saers)
blake@widomaker.com (Blake Patterson)
bq689@freenet.carleton.ca (Anis Ahmad)
centero@mail.ddnet.es
chaos@wiloyee.shnet.org
chuck@freeside.fc.net (Chuck Walbourn)
clef@suburbia.net (Phil Sweeney)
dagsm@infolink.no (Finrod / Ewox)
daredevi@dorsai.org (Charles Scheffold)
davidm@them.com (David Mandala)
deathstr@singnet.com.sg (Rex Guo Yiwei)
dennisc@community.net (dennis courtney)
devine@cs.ualberta.ca (Michael Devine)
devries@cam.org (Mike DeVries)
dhk_fj@p10.nix.fido.teuto.de (Christian Kram)
dmw@gate.net (Out There!)
dominion@ripco.com (Michael Chisari)
ekallion@cc.Helsinki.FI (Esa J Kallioniemi)
fc@fee.uva.nl (Frank Compagner)
fischerj@Informatik.TU-Muenchen.DE (Juergen Fischer)
fmah@morse.ecn.purdue.edu (Frederick Y Mah)
francois.baligant@ping.be (Francois Baligant)
fuller (fuller@hap.arnold.af.mil)
fuzz@ionline.net (Arlo Gingerich)
gberigan@cse.unl.edu (Greg Berigan)
gerald@parker.EECS.Berkeley.EDU (THE Gerald)
ghahrema@bowler.dacc.wisc.edu (Houman Ghahremanlou)
grosje_s@epita.fr (Le Fongus jaune)
gruel@hondo.cyberverse.com (Nick)
gt4148b@prism.gatech.edu (Stephen Carter Morgan)
habets@worldaccess.nl
hb@cafu.fl.net.au (Nicholas Vinen)
ithomson@mortimer.com (Ian Thomson)
j.fenkes@public.ndh.com (Joachim Fenkes)
jakarppi@raita.oulu.fi (Jari Karppinen)
jarevalo@sip.es
jarno heikkinen (jmag@cOmPLeX.math.jyu.fi)
jean-marc.leang@ping.be (JML)
jeanmarc.leang@ping.be (marmelade)
jim@kd3bj.ampr.org (Jim Paris)
jisidoro@acs.bu.edu
joemess@mail.utexas.edu (helpless boy)
jroth@coyote.csusm.edu (Jesse Rothenberg)
jsno@amigar.apana.org.au
jth@jth.ping.de (Jens Theisen)
jukkak@dns.mikrobitti.fi (Jukka O Kauppinen)
kimmy@planet.fi (Kimmy/PULP)
kiwidog@mail.vt.edu (Chris Hargrove)
larsen@lal.cs.utah.edu (Steve Larsen)
larstr@colargol.idb.hist.no (Lars Troen)
lcs@lysator.liu.se (Martin Blom)
lodder@cuci.nl
matthewp@netcom.com (Matt Pritchard)
maurala@cc.hut.fi (Markus Aurala)
mdaniel@zeus.polsl.gliwice.pl (Milosz Danielewski)
millen3@alum01.its.rpi.edu (Neal W. Miller)
mithril@ict.org (Jeremy Tavan)
mithril@ng.netgate.net (Jeremy Tavan)
more@stekt.oulu.fi (Jyrki Alakuijala)
mrp@spartan.pei.edu (Mr.P / Powersource)
mrytkola@tor.abo.fi (Markus Rytk|l{ INF)
mud@merlin.sedona.net (Justin Frankel)
mystical@inet.uni-c.dk (Asbjorn Andersen)
page@ie2.u-psud.fr
perseus@xs1.xs4all.nl
plexus@plexus.seanet.com (James B. Johnson)
porat@ibm.net (Hand of Fate)
ppsloan@buzzworm.cs.utah.edu (Peter Sloan)
prsam1@MFS02.cc.monash.edu.au (Paul Sampson)
rawvibes@ix.netcom.com
rbarnhar@freenet.niagara.com (Robert Barnhardt)
rbeath@julian.uwo.ca (Stephen Beath)
rcskb@minyos.xx.rmit.EDU.AU (Kendall Bennett)
resimmon@students.uiuc.edu (simmons russel evan)
rimbo@ccwf.cc.utexas.edu
rob@span.com
rolando@knoware.nl (Scout/SuccesS)
rvc@vision.auc.dk
ryan.mahoney@tssbbs.com (Ryan Mahoney)
ryston@login.cz (Martin Pilny)
s106275@cs.tut.fi (Anssi Saari)
s9106065@student.utwente.nl (Sparcus / Nostalgia)
sci-slb@groper.jcu.edu.au (Stephen Banhuk)
slmyv@paradise.declab.usu.edu (Denys Larry)
smh@europa.com (smh)
src@cray.tuug.utu.fi (Saracen / EMF)
sschaem@teleport.com (Stephan Schaem)
sshah@intranet.ca
tedjones@voyager.co.nz (Oliver Jones)
then@superpallo.cs.hut.fi (Tomi Holger Engdahl)
thomasep@funcom.com (Thomas Egeskov Petersen)
tom@halls1.cc.monash.edu.au (Tom PATON - Tom)
trixter@depaul.edu (Trixter / Hornet)
tst@dcs.ed.ac.uk (Tristan Tarrant)
tw@wile.thetech.org (Tod Weitzel)
vossa@matisse.its.rpi.edu (xproject)
whippet1@quiknet.com (Scott Tyson)
yrmafa@utu.fi (Yrj| Fager)
yvon@sept.fr (christophe yvon)
zsazS (kfpeters@artsci.wustl.edu)


(100.1)何かを投稿するためにあなた(FAQ作成者)にコンタクトを取るにはどうすればいいですか?

このFAQをより大きく、よりよくするものは何でも歓迎ですので、どうか私のところ(trixter@depaul.edu)まであなたの提案をメールで送ってください。


FAQ Greets:

「インターネット上のデモ関連のこと」すべてを1992年に始めた、Dan Wrightにリスペクト。もちろん、これを始めたHoumanに感謝。よい友人で、1995年に私がやめようとしたときにシーンに引き戻してくれたSnowmanにもgreet。最後に、過去と現在のcomp.sys.ibm.pc.demosメンバーと姿の見えない読者すべてに感謝。