9と12のリビジョン間の差分 (その間の編集: 3回)
2020-11-06 08:15:14時点のリビジョン9
サイズ: 5125
編集者: keitaroh
コメント:
2020-11-06 08:30:00時点のリビジョン12
サイズ: 5583
編集者: keitaroh
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
## page was renamed from メインCPU基本システム
行 4: 行 5:
 * 電源を入れるとメインCPUリセット信号が送られ、ROMの割り込みベクタに書かれた起動時処理部実行アドレスに制御が  * 電源を入れるとメインCPUリセットれ、起動時処理部実行
行 7: 行 8:
 * そうでなければゲームモード処理部へ実行を移す(最終的にタイトル画面が描画される)。  * そうでなければゲームモード処理部へ実行を移す(各種初期化処理を行ったあと、タイトル画面が描画される)。
 * テストモードでは各種テスト結果の表示やディップスイッチ情報の表示、サウンドテスト、画面のゆがみを確認するための格子状画面の表示などが行える。
 * ゲームモードは通常通りドルアーガの塔が遊べるモードである。
行 11: 行 14:
= 起動までの流れ =

=
= メインCPU起動 ==
= メインCPU起動の仕組み =
行 20: 行 21:
== 起動時処理の実行 == = 起動時処理 =
行 46: 行 47:
 * 58XXより、レバー・ボタン入力情報を読み込んでワークエリアに記録する。
  * ※この時点ではまだ58XXは起動していない。

概要

  • メインCPUのプログラム群は、概ね「起動時処理部」/「テストモード処理部」/「ゲームモード処理部」の三つに大別できる。
  • 電源を入れるとメインCPUがリセットされ、起動時処理部へ実行を移す。
  • 起動時処理部では簡単なセルフテストが行われる。RAM/VRAMの読み書きテスト、垂直同期割り込みのテスト、プログラムROMのチェックサム確認など。
  • その後ディップスイッチの設定を確認し、オペレータがテストモード(サービスモード)を起動しようとしていたならテストモード処理部へ実行を移す(テストモード画面が描画される)。
  • そうでなければゲームモード処理部へ実行を移す(各種初期化処理を行ったあと、タイトル画面が描画される)。
  • テストモードでは各種テスト結果の表示やディップスイッチ情報の表示、サウンドテスト、画面のゆがみを確認するための格子状画面の表示などが行える。
  • ゲームモードは通常通りドルアーガの塔が遊べるモードである。

メインCPU起動の仕組み

  • リセット信号が送られると、メインCPUはいったん動作を停止して信号が終わるのを待つ。
  • 信号が終わると、メインCPUはコンディションコードレジスタの IRQ Mask と FIRQ Mask を1に(つまりIRQとFIRQを禁止)、ダイレクトページレジスタの値を $00 に設定する。
  • そしてメモリ上の割り込みベクタテーブルより、RESET信号受付時の実行アドレスを読みだして($FFFE~$FFFFにある)プログラムカウンタレジスタへ代入し、新たな実行先とする。
  • この新たな実行先が起動時処理部である。初期版ROMでは $D3EE、後期版ROMでは $D3F3 から始まっている。

起動時処理部

  • まず初めに“ANDCC #$FF”を実行する。
    • ……のだが、筆者にはこの命令の意図がわかっていない。
    • ぶっちゃけただのtypoのような気がするのだが、6809での開発経験がないので断定しかねるところ。
  • 次に 16XX に対して、メインCPUへの垂直同期割り込みの停止と、サウンドCPU/58XX/56XXの停止を指示する。
  • そのあと、RAM/VRAM/共有RAMに対して読み書きテストを行う。
  • 読み書きテストは以下の手順で行う。
    1. まずテスト値を$01に設定する。
    2. RAM、VRAM、共有RAMをテスト値で埋め、正しく読み出せるかテストする。
    3. テスト値を左シフトして、再び各種メモリをテスト値で埋めて読みだす。
    4. テスト値が桁あふれするまで($80までのテストが終わるまで)繰り返す。
    5. 次に「メモリへ書き込むたびにテスト値を +1 する」形で、同様に各種メモリをテストする。
    6. いずれの場合でも、異常な値が読みだされた場合はエラーコードをBレジスタにセットして、テストを中断する。
  • ※共有RAMのうち、音源チップ(15XX)用に確保された領域は読み書きテストの対象としない。
    • 音源チップの動作を止められない(=音源チップ用の領域が音源チップによって更新され続ける)ためである。
  • VRAMのネームテーブル領域を $20 で埋めて初期化する。
  • RAMを $00 で埋めて初期化する。
  • 読み書きテストに失敗していた場合、VRAM の非表示領域にエラーコードを書き込む。
  • メインCPUのプログラムROMのチェックサムを確認する。
  • 58XXと56XX(のメモリ?)に対して読み書きテストを行う。$01~$08の値。
    • ※58XXと56XXは4ビットCPUなので、$08まで。
  • スクロールBG部の大部分を初期化する。
  • 一時的なスタック領域を設定し、コンディションコードレジスタ及び16XXで垂直同期割り込みを許可する。
    • ※なお、ここで指定されるスタック領域は RAM ではなく VRAM である。
  • 垂直同期割り込み処理が実行されるまで待つ(ワークエリアの値で判断する)。
  • 58XXより、レバー・ボタン入力情報を読み込んでワークエリアに記録する。
    • ※この時点ではまだ58XXは起動していない。
  • 固定BG部のネームテーブル領域を $20 で初期化する。
  • 58XXと56XX(のメモリ?)を $00 で初期化する。
  • 16XXに対して、サウンドCPU/58XX/56XXの起動を指示する。
  • 58XXより、レバー・ボタン入力情報を5フレーム分読み込んでワークエリアに記録する。
  • 58XXと56XXの動作モードを切り替えて、レバー・ボタン入力情報を2フレーム分記録する。
  • サウンドCPU用のプログラムROMのチェックサムを確認する。
    • チェックサムの算出処理はサウンドCPU側で行う(サウンドCPU用のプログラムROMが見えないので)。
  • ディップスイッチ情報等を確認し、テストモード起動設定になっていればテストモード処理部へ分岐する。
  • そうでなければ、ゲームモード処理部へ分岐する。

メインCPUのプログラム (最終更新日時 2020-11-11 00:25:38 更新者 keitaroh)