サイズ: 4822
コメント:
|
サイズ: 4828
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 20: | 行 20: |
== 起動時処理部 == | == 起動時処理の実行 == |
概要
- メインCPUのプログラム群は、概ね「起動時処理部」/「テストモード処理部」/「ゲームモード処理部」の三つに大別できる。
- 電源を入れるとメインCPUにリセット信号が送られ、ROMの割り込みベクタに書かれた起動時処理部の実行アドレスに制御が移る。
- 起動時処理部では簡単なセルフテストが行われる。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に対して読み書きテストを行う。
- 読み書きテストは以下の手順で行う。
- まずテスト値を$01に設定する。
- RAM、VRAM、共有RAMをテスト値で埋め、正しく読み出せるかテストする。
- テスト値を左シフトして、再び各種メモリをテスト値で埋めて読みだす。
- テスト値が桁あふれするまで($80までのテストが終わるまで)繰り返す。
- 次に「メモリへ書き込むたびにテスト値を +1 する」形で、同様に各種メモリをテストする。
- いずれの場合でも、異常な値が読みだされた場合はエラーコードをBレジスタにセットして、テストを中断する。
- VRAMのネームテーブル領域を $20 で埋めて初期化する。
- RAMを $00 で埋めて初期化する。
- 読み書きテストに失敗していた場合、VRAM の非表示領域にエラーコードを書き込む。
- メインCPUのプログラムROMのチェックサムを確認する。
- 58XXと56XX(のメモリ?)に対して読み書きテストを行う。$01~$08の値。
- ※58XXと56XXは4ビットCPUなので、$08まで。
- スクロールBG部の大部分を初期化する。
- 一時的なスタック領域を設定し、コンディションコード及び16XXで垂直同期割り込みを許可する。
- ※なお、ここで指定されるスタック領域は RAM ではなく VRAM である。
- 垂直同期割り込み処理が実行されるまで待つ(ワークエリアの値で判断する)。
- 固定BG部のネームテーブル領域を $20 で初期化する。
- 58XXと56XX(のメモリ?)を $00 で初期化する。
- 16XXに対して、サウンドCPU/58XX/56XXの起動を指示する。
- 58XXより、レバー・ボタン入力情報を5フレーム分読み込んでワークエリアに記録する。
- 58XXと56XXの動作モードを切り替えて、レバー・ボタン入力情報を2フレーム分記録する。
- サウンドCPU用のプログラムROMのチェックサムを確認する。
- チェックサムの算出処理はサウンドCPU側で行う(サウンドCPU用のプログラムROMが見えないので)。
- ディップスイッチ情報等を確認し、テストモード起動設定になっていればテストモード処理部へ分岐する。
- そうでなければ、ゲームモード処理部へ分岐する。