概要
- 実際にドルアーガの塔を遊べるモード。プレイモード。
- 起動時処理部やテストモード処理部と異なり、マルチタスクで動作している。
- ディップスイッチ等でテストモード起動設定へ切り替えると、起動時処理部へ分岐する(つまり再起動する)。
- ディップスイッチで「画面の停止」設定へ切り替えると、動作を一時的に停止する。
マルチタスク機構
- ゲームモードではマルチタスク機構が起動しており、大半の処理が「タスク」として記述され(見かけ上)並列動作する。
特徴
- 協調的マルチタスク(ノンプリエンプティブ・マルチタスク)である。
- タスク切り替えをタスク側で能動的に行う。
- したがって、あるタスクが切り替え処理をしないまま無限ループに入るとシステム全体が停止する。
- TODのマルチタスク機構は垂直同期割り込み処理と連携動作しているので、垂直同期割り込み処理も道連れにする。
- ※実際にシステムが停止した場合はウォッチドッグ機構により再起動がかかる。
- 自主的に切り替えない限りタスクの切り替えが行われないので、あるタスクの実行中に他のタスクが割り込むことがない。
- タスク実行中は垂直同期割り込みが停止されるので、垂直同期割り込み処理すら実行されない。
- メモリ保護はされない(というより、出来ない)。
- レジスタの退避をしない。
- タスクを切り替えた時点で全レジスタの内容が失われると考えなければならない。
- 切り替え後に引き継ぎたいデータがある場合はワークエリアに保存する必要がある。
- 軽量で高速に動作する。当時の非力な CPU でも十分なパフォーマンスが得られる。
- 各タスクは一つの用途に専念できるため、単純で読みやすいプログラムコードを簡便に書くことができる。
- 経験の乏しいプログラマでも、バグが少なくデバッグのしやすいコードを書ける。
- とはいえマルチタスクには違いないので、同期ミスによるバグが混入するリスクがある。
- そして同期ミスによるバグは発見が難しい。
- ドルアーガのような「状態情報」を持つ敵のプログラミングをする場合でも、状態情報IDのような変数を用いずにプログラムできる(詳しくは後述(※まだ書いてない))。
- スプライト制御用のタスクと、非制御用のタスクの二種類がある。
スプライトタスク
スプライトタスクを参照。
非スプライトタスク
- スプライトが割り当てられないタスク。
- 常駐タスクである。ゲームモードの開始時に起動し、ゲームモードを抜けるまで動作を続ける。
- 16バイト分のスタック領域と、スタックポインタの保存領域(2バイト)が割り当てられる。
- 専用のワークエリアを持たない。保存したいデータがある場合は、共用のワークエリアを使用する。
非スプライトタスクの一覧
- ゲーム全体の進行管理タスク。
- “1UP”“2UP”の文字を描画するタスク。
- カレントプレイヤーのレバー入力情報管理タスク。
- カレントプレイヤーの剣ボタン入力情報管理タスク。
- クレジット数/クレジット投入音管理タスク。
- 迷路生成処理タスク。
- レバー方向補正タスク。
- ※通路の途中で横にレバーを入れた時、進行方向にレバーを入れた扱いにする処理を行う。
- ギルの処理タスク。
- ※このタスク自身にはスプライトが割り当てられないが、ギル用に三枚分のスプライトタスクが予め用意されている。
- TIME描画タスク。
- 所持品描画タスク。
- 宝箱出現判定タスク。
- 時間切れウィスプ出現処理タスク。
備考
- 当時ナムコでジョブコントローラまたはオブジェクトコントローラと呼ばれていたもの。
- 深谷正一氏が開発したものをベースとしており、様々なゲームで利用されていたらしい。
- 当時のナムコゲーのみならず、SFC版「かまいたちの夜」でもジョブコンの改良型が使われているとのこと。
- 正確な定義は筆者には分からない(筆者はゲーム業界にいたことすらない、ただの一般趣味プログラマである)が、黒須一雄氏によればマルチタスク機構部分とゲーム進行の管理処理(TODでは非スプライトタスクとして実装)が「ジョブコン」、スプライト制御用のタスクが「オブジェコン」という事のようだ。
参考:「4.10.1 タスクシステムについて黒須一雄氏インタビュー」(http://www.dcaj.or.jp/project/report/pdf/2008/dc_08_03.pdf の 301P辺りから)。