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