4と7のリビジョン間の差分 (その間の編集: 3回)
2020-11-10 09:45:09時点のリビジョン4
サイズ: 8251
編集者: keitaroh
コメント:
2020-11-11 00:24:15時点のリビジョン7
サイズ: 8413
編集者: keitaroh
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 42: 行 42:
    * 一つを「本タスク」とし、そのタスクで三枚分のスプライトを全て操作する。     * 一つを「本タスク」とし、そのタスクで全てのスプライトを操作する。
行 116: 行 116:
  * ※このタスク自身にはスプライトが割り当てられないが、ギル用に三枚分のスプライトタスクが予め用意されている。
行 127: 行 128:
 * 正確な定義は筆者には分からない(筆者はゲーム業界にいたことすらない、ただの一般趣味プログラマである)が、黒須一雄氏によればマルチタスク機構部分とゲーム進行の管理処理(TODでは非制御用タスクとして実装)「ジョブコン」、スプライト制御用のタスクが「オブジェコン」という事のようだ。  * 正確な定義は筆者には分からない(筆者はゲーム業界にいたことすらない、ただの一般趣味プログラマである)が、黒須一雄氏によればマルチタスク機構部分とゲーム進行の管理処理(TODでは非スプライトタスクとして実装)「ジョブコン」、スプライト制御用のタスクが「オブジェコン」という事のようだ。

概要

  • 実際にドルアーガの塔を遊べるモード。通常モード。
  • 起動時処理部やテストモード処理部と異なり、マルチタスクで動作している。
  • ディップスイッチ等でテストモード起動設定へ切り替えると、起動時処理部へ分岐する(つまり再起動する)。
  • ディップスイッチで「画面の停止」設定へ切り替えると、動作を一時的に停止する。

マルチタスク機構

  • ゲームモードではマルチタスク機構が起動しており、大半の処理が「タスク」として記述され(見かけ上)並列動作する。

特徴

  • 協調的マルチタスク(ノンプリエンプティブ・マルチタスク)である。
    • タスク切り替えをタスク側で能動的に行う。
    • したがって、あるタスクが切り替え処理をしないまま無限ループに入るとシステム全体が停止する。
      • TODのマルチタスク機構は垂直同期割り込み処理と連携動作しているので、垂直同期割り込み処理も道連れにする。
      • ※実際にシステムが停止した場合はウォッチドッグ機構により再起動がかかる。
    • 自主的に切り替えない限りタスクの切り替えが行われないので、あるタスクの実行中に他のタスクが割り込むことがない。
      • タスク実行中は垂直同期割り込みが停止されるので、垂直同期割り込み処理すら実行されない。
  • メモリ保護はされない(というより、出来ない)。
  • レジスタの退避をしない。
    • タスクを切り替えた時点で全レジスタの内容が失われると考えなければならない。
    • 切り替え後に引き継ぎたいデータがある場合はワークエリアに保存する必要がある。
  • 軽量で高速に動作する。当時の非力な CPU でも十分なパフォーマンスが得られる。
  • 各タスクは一つの用途に専念できるため、単純で読みやすいプログラムコードを簡便に書くことができる。
    • 経験の乏しいプログラマでも、バグが少なくデバッグのしやすいコードを書ける。
    • とはいえマルチタスクには違いないので、同期ミスによるバグが混入するリスクがある。
      • そして同期ミスによるバグは発見が難しい。
  • ドルアーガのような「状態情報」を持つ敵のプログラミングをする場合でも、状態情報IDのような変数を用いずにプログラムできる(詳しくは後述(※まだ書いてない))。
  • スプライト制御用のタスクと、非制御用のタスクの二種類がある。

スプライトタスク

  • スプライト制御用のタスク。
  • 各タスク一つにスプライト一枚が割り当てられる。
    • 複数のスプライトを扱う場合は、他のスプライト用のタスクに「何もしない処理($14)」を割り当てる。
    • 例えばスプライトを三枚使う場合は、
      • スプライトタスクを三つ用意する。
      • 一つを「本タスク」とし、そのタスクで全てのスプライトを操作する。
      • 残り二つのスプライトタスクには「何もしない処理」を割り当て、スプライトを操作させないようにする。
  • 各タスクには、16バイト分のスタック領域と32バイト分のワークエリアが割り当てられる。

スプライトタスクで実行される処理の一覧

処理ID

処理の概要

$00

何もしない(ほかの処理が登録されるまで待つ)

$01

ブルー・ウィル・オー・ウィスプ(低速型)

$02

ブルー・ウィル・オー・ウィスプ(中速型、未使用)

$03

ブルー・ウィル・オー・ウィスプ(高速型)

$04

レッド・ウィル・オー・ウィスプ(低速型)

$05

レッド・ウィル・オー・ウィスプ(中速型、未使用)

$06

レッド・ウィル・オー・ウィスプ(高速型)

$07

グリーン・スライム

$08

レッド・スライム

$09

ブラック・スライム

$0A

ホワイト・スペル

$0B

レッド・スペル

$0C

ファイア・エレメント

$0D

メイジ

$0E

ソーサラー

$0F

グリーン・スペル

$10

ウィザード

$11

ドルイド

$12

ブルー・スペル

$13

メイジ・ゴースト

$14

何もしない(あるタスクが複数のスプライトを制御する際に利用)

$15

ブラック・ナイト

$16

ミラー・ナイト

$17

クォックス

$18

ドラゴンブレス

$19

$1A

$1B

レッド・ナイト

$1C

ハイパー・ナイト

$1D

タスクの終了(ワークエリアを初期化し、ほかの処理が登録されるまで待つ)

$1E

フロア60の処理(イシターの幻影、カイ、設置済みクリスタルロッドの処理を含む)

$1F

宝箱

$20

ブルー・ナイト

$21

ブルー・スライム

$22

ダークグリーン・スライム

$23

ドルアーガ

$24

初期配置の宝箱(フロア45)

$25

サッカバス

$26

グリーン・ローパー

$27

リザード・マン

$28

ダークイエロー・スライム

$29

ドルイド・ゴースト

$2A

ウィザード・ゴースト

$2B

レッド・ローパー

$2C

ブルー・ローパー

$2D

シルバー・ドラゴン

$2E

ブラック・ドラゴン

$2F

偽の扉(フロア29)

非スプライトタスク

  • スプライトが割り当てられないタスク。
  • 常駐タスクである。ゲームモードの開始時に起動し、ゲームモードを抜けるまで動作を続ける。
  • 16バイト分のスタック領域と、スタックポインタの保存領域(2バイト)が割り当てられる。
  • 専用のワークエリアを持たない。保存したいデータがある場合は、共用のワークエリアを使用する。

非スプライトタスクの一覧

  • ゲーム全体の進行管理タスク。
  • “1UP”“2UP”の文字を描画するタスク。
  • カレントプレイヤーのレバー入力情報管理タスク。
  • カレントプレイヤーの剣ボタン入力情報管理タスク。
  • クレジット数/クレジット投入音管理タスク。
  • 迷路生成処理タスク。
  • レバー方向補正タスク。
    • ※通路の途中で横にレバーを入れた時、進行方向にレバーを入れた扱いにする処理を行う。
  • ギルの処理タスク。
    • ※このタスク自身にはスプライトが割り当てられないが、ギル用に三枚分のスプライトタスクが予め用意されている。
  • TIME描画タスク。
  • 所持品描画タスク。
  • 宝箱出現判定タスク。
  • 時間切れウィスプ出現処理タスク。

備考

  • 当時ナムコでジョブコントローラまたはオブジェクトコントローラと呼ばれていたもの。
    • 深谷正一氏が開発したものをベースとしており、様々なゲームで利用されていたらしい。
    • 当時のナムコゲーのみならず、SFC版「かまいたちの夜」でもジョブコンの改良型が使われているとのこと。
  • 正確な定義は筆者には分からない(筆者はゲーム業界にいたことすらない、ただの一般趣味プログラマである)が、黒須一雄氏によればマルチタスク機構部分とゲーム進行の管理処理(TODでは非スプライトタスクとして実装)が「ジョブコン」、スプライト制御用のタスクが「オブジェコン」という事のようだ。

ゲームモード (最終更新日時 2020-11-20 15:33:16 更新者 keitaroh)