整頓中コメントスパムがひどいのでコメント欄を閉じています。古典的タスクシステムとギャラクシアンという2つのキーワードがテーマです。報告書」という、2009年の時点でのゲーム開発に関する様々な情報がまとまっている資料があります。ネットからでもPDFファイルとして閲覧可能です。報告書」この資料のP162から数十ページにわたり、ゲームにおけるタスクシステムについて、タスクシステムの仕組みだけでなく、その歴史について書かれています。そこから、初期のタスクシステムについて記述されている箇所を引用します。Load」(Peto氏)で紹介されている。同サイトでは、ギャラクシアンで使われたであろうタスクシステムが、リバースエンジニアリングによって、後のTCBを使ったシステムに発展したと記している。(ただし、本当にギャラクシアンがタスクシステムを使用したかどうかについては、確認はとれていない。Archiveで閲覧することができます。コンピュータゲームのからくりそこから引用すると...タスクの歴史は古く、NAMCOがギャラクシアンを作るときに考案されたとの説が有力ですが、定かではありません。昔に私もこのページを見たことがあり、『ギャラクシアンからなのかぁ』と記憶していました。そのサイトに記述されているTCBがどのようなものかを、失礼ながらも大雑把にまとめると、タスク単位で固有のメモリ領域と実行すべきプログラムのアドレス(ポインタ)を管理し、それらをリストかスタックのような形式で繋いで、順次実行するような仕組みということになります。Linuxでシステム寄りのプログラムを書いたことのある人なら、TCBやPCB(プロセスコントロールブロック)という名前になじみがあると思います。UNIXのようなOSでは1970年代頃には使われていた仕組みのようです。MS-DOSやHuman68KにもPSPやPCBがありますね。ギャラクシアン説は、ゲーム開発系の書籍でも触れられています。...「ゲームの世界では、1回の描画のことを1フレームと呼びます。あらゆるキャラクターは、フレーム単位で移動します。通例、1フレームごとに、キャラクターの移動関数が1回呼び出されます。移動関数は、1回分の移動処理を行ったあと帰還します。この処理を実現するために、さまざまな方法が編み出されました。その歴史の教科書を紐解けば、古くはNAMCOのギャラクシアンにまで遡ると言われています」と書かれています。筆者さんは、フレーム単位で処理を回していくという方式はギャラクシアンから、と説明されています(断言はしていません)。この本では、「~ギャラクシアン移行主流となったのは、この章で紹介する古典的タスクシステムでした」と続いていて、Peto氏のタスクシステムと同じようなTCBを使った方式(とその発展系)の実装と解説をしています。ギャラクシアン以前にフレーム単位で処理を回す、つまり、VSync(VBlank)周期で動作していていたゲームがあったかどうか私は知りません。MAMEのDriverソースをみた感じでは、1978年頃のゲームでもVBLANKで割込みをかけているタイトルはあるように思えます。...「タスクシステムの由来についてははっきりしませんが、ナムコのギャラクシアンで開発されたという説があります」と書かれています。この本でのTCBの実装方法は、タスク単位でワークエリアと実行すべき処理へのポインタを管理し、それらをリストで持つ方式です。ところで、「デジタルコンテンツ制作の先端技術応用に関する調査研究」では、実際にナムコで開発に携われていた方へのインタビューも掲載されています。P301ページからの、タスクシステムについての黒須一雄氏へのインタビューという内容で、ナムコで使われていたタスクの管理方法について書かれているのですが、ナムコ内ではタスクコントロールではなく、ジョブコントローラー(ジョブコン)と呼ばれていたことが読み取れます。タスク(ジョブ/オブジェクト)の管理方法は、リスト構造を取りつつも、タスクの切り換え自体は、各タスクがスイッチさせるという方法になっています。Windows3.1やMacOS9の頃までに使われていた疑似マルチタスクのような実装方式で、概念としてはコルーチンのようなものでしょうか。インタビューを読んだ印象としては、前述のTCBとは名前や仕組みが異なるようです。名称はともかく、管理方法は似てるような、微妙に似てないような感じがします。アセンブラとC/C++では扱いやすいデータの管理方法やプログラムの記述方法が変わってきますから、その辺の違いかもしれません。前置きが長くなりましたが、ここからが本編です。実際のギャラクシアンでは、どのようなタスク管理方法をとっていたのかを調べてみました。プログラム全体の1/3くらいしか読んでいませんが全体像は掴んでいます。あと、バージョン違いで管理方法が違うかも知れませんし、読み違いもありえるので参考程度ということで。結論から書くと、ギャラクシアンでは、ジャンプテーブルとフラグによる分岐が主な処理方法でした。各種データの管理は固定サイズの配列で、これをループで順に処理していますから、いわゆる古典的タスクシステムは用いていません。主処理ギャラクシアンのCPUはZ80です。(HL)が使われる事が多いですが、ギャラクシアンでは主にRST命令を使っています。処理先5処理先では更にジャンプテーブルを用いて分岐している場合もあります。パラメータ(ここでは$4005に書かれている1バイトの値)を使ってテーブルを参照しています。ゲーム中の主処理はこんな感じです。DEMOプレイ中の自機の動き???これは、CALL命令の箇所だけを抜粋したのではなく、実際にCALL命令が上記のようにずらっと並んでいます。これがゲーム本体主要部のほぼ全てのプログラムです。処理の内容は、ゲーム中に起きる全ての処理を順番に呼び出しているというものです。各処理先では、今、この処理を実行すべきかどうかをフラグで判定しています。自弾の発射ルーチンの先頭では、自機が破壊されている状態だと自弾を発射できないので、自機の破壊状態フラグ(グローバル変数)を調べて即座にRET、といった具合です。プログラムの全体象は、VBLANK割込み時にワークエリアからスプライトやBG面への転送を行った後に、ゲームの主処理を実行します。非割込み時は何をしているのかというと、敵編隊や文字列といった表示周りのイベント受付をしています。割込み中のゲームの主処理でイベントを発行し、非割込み時のメインルーチンでまとめてイベントを消化していきます。表示されている敵編隊は二次元配列です。縦横6×10の編成ですが、行番号・列番号の計算をし易くするためか、メモリ上では横16バイトとして管理しています。敵の編隊状態は存在するかしないかの1Bitの情報ですが、贅沢にも敵1機につき1Byte使っています。ちなみに縦方向は8行分あるので、ちょっと書き換えると8×16編成も可能です。敵の種別は行位置で決まります。プログラムでは、この編成配列全体をループで処理しています。(つまり、1キャラ=1タスクではないということです)降下攻撃の敵ギャラクシアンでは最大で7(8?)機の敵が同時に攻撃してきます。1機あたり32バイトのデータで管理されています。波状移動演算用C言語でいうところの構造体みたいなものですね。このデータが8機分用意されていて、敵の処理は8個のワークエリアを順次処理しています。状態別処理を実行EXXADDIX,DEDJNZLOOPRET敵の各種処理(移動や弾の発射等々)は、ワークエリアの+4Byte目にある値を使ってテーブルジャンプしています。処理先でこの値を変えることで処理内容を変えていきます。まとめギャラクシアンでは、最初に述べたようなワークエリアと処理アドレスポインタをリストで持つようなTCBを用いたタスクの管理ではなく、フラグとテーブルジャンプとVBLANK割込み単位での動作という方式で実装されていました。ギャラクシアンではジョブコンは使われてないということになります。ギャラクシアンのような処理方式がギャラクシアン以前から使われていたのかどうかは、それ以前のゲームのプログラムを調べてみない事にはわからないです。ギャラクシアンの発売は1979年です。Z80を搭載したMZ-80が1978年、PC-8001が1979年に発売されたような時代です。MAMEのデータベースをみると、ギャラクシアンと同時期かそれ以前にZ80を使ったアーケードゲームはほとんどなかったようですから、ギャラクシアンが1979年当時のゲームシステム/プログラムとして画期的で先駆けであり、他社がギャラクシアンのプログラムを参考にしてゲームシステムの実装方法を発展させていったというのは充分にありえる話だと思います。前に趣味で読んだドンキーコング(池上通信/Z80/1981年)も、テーブルジャンプ、構造体、主処理がイベント待機、ゲーム本体がCALLだらけという作りでした。25面を遊んでる時でも50,75,100面の各処理を実行してますし。ゲームではなく、コンピュータプログラミングにおけるデータを構造体の形式として管理する方法の歴史はもっと古く、1960年代には既にあったようです。話が昔過ぎてわかりません。Vol.7に、ギャラクシアンを作った男たちという記事が掲載されています。ギャラクシアンの開発に携われた石村繁一さんと田城幸一さんへのインタビュー記事で、開発当時の事を克明に語られていて、ハードソフト両面の技術的な説明もあり、読み応えのある内容です。その記事中では、ジョブコンについても触れているので、引用させて頂きます。『ギャラクシアン』開発時にはまだ「ジョブコン」は無かったと思います。「ジョブコン」を開発したのは深谷正一さんで、私は使用したことがありません。いうわけで、開発者自ら、ギャラクシアンにはジョブコン(タスクシステム)が使われていないことを明言されていました。追記]アーケードゲーム『バラデューク』30周年イベントの岸本好弘氏のトーク内において、ジョブコンは深谷正一氏が作られたという話が出てきます。バラデュークではジョブコンが使われていたのですね。おまけギャラクシアンで使われている乱数処理は線形合同法でした。ナムコ作品で見る乱数の歴史で触れられてる8ビットLCG(5+1)です。背景の星はLFSRなのですね。カテゴリーに公開されました。フィードで購読することができます。現在コメント、トラックバックともに受け付けておりません。コメントは受け付けていません。