2と4のリビジョン間の差分 (その間の編集: 2回)
2020-11-06 07:38:24時点のリビジョン2
サイズ: 2317
編集者: keitaroh
コメント:
2020-11-06 07:52:15時点のリビジョン4
サイズ: 3152
編集者: keitaroh
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 27: 行 27:
 * 読み書きテストは以下の手順で行う。
  1. まずテスト値を$01に設定する。
  1. RAM、VRAM、共有RAMをテスト値で埋め、正しく読み出せるかテストする。
  1. テスト値を左シフトして、再び各種メモリをテスト値で埋めて読みだす。
  1. テスト値が桁あふれするまで($80までのテストが終わるまで)繰り返す。
  1. 次に「メモリへ書き込むたびにテスト値を +1 する」形で、同様に各種メモリをテストする。
  1. いずれの場合でも、異常な値が読みだされた場合はエラーコードをワークエリアに書き込んで、テストを中断する。
 * VRAMのネームテーブル領域を $20 で埋めて初期化する。
 * RAMを $00 で埋めて初期化する。

概要

  • メイン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に対して読み書きテストを行う。
  • 読み書きテストは以下の手順で行う。
    1. まずテスト値を$01に設定する。
    2. RAM、VRAM、共有RAMをテスト値で埋め、正しく読み出せるかテストする。
    3. テスト値を左シフトして、再び各種メモリをテスト値で埋めて読みだす。
    4. テスト値が桁あふれするまで($80までのテストが終わるまで)繰り返す。
    5. 次に「メモリへ書き込むたびにテスト値を +1 する」形で、同様に各種メモリをテストする。
    6. いずれの場合でも、異常な値が読みだされた場合はエラーコードをワークエリアに書き込んで、テストを中断する。
  • VRAMのネームテーブル領域を $20 で埋めて初期化する。
  • RAMを $00 で埋めて初期化する。

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