ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

Space Invaders(9) - ビーム処理

rst1割り込みの最初に処理されるのがビームの様なのでこちらから見ていく。

割り込みはrst1とrst2の2種類があり、画面上下それぞれのブラウン管の掃引が終わったタイミングで入る様だ。 正確には半分ではなくて上は96ラインの所らしい。X*1は224ラインあるので42%くらいになるが掃引が元に戻る時間も含めて割込が入る時間が等しくなる様にしているのではないかと思われる。

どちらの割り込みかはRAMの0x2072に書かれていて上が終わったタイミングでは0x00で下が終わったタイミングでは0x80になる。

ビームの処理はGameObj1から始まる。

https://computerarcheology.com/Arcade/SpaceInvaders/Code.html#GameObj1

最初にCompYToBeamが呼び出されているが、これがビームがある方の描画中かどうかを判断していて描画中なら何もせずに終了している*2。 画面を二つに分けることでオフスクリーンバッファ的な使い方になっていて、掃引されない間にVRAMに書き込む様になっている。

そのあとはRAMの0x2025の値で処理が分かれる。switch文に相当する処理がされる。

  • この時1ならビームが発射された直後でInitPlyShotで自機のX座標をビームのX座標として初期化し次の状態2に変更してビームをVRAMに書き込んでいる。
  • 2ならビームが飛行中でEraseShiftedで前回描画した領域をBit反転のマスクで消し込んでいる。そのあとshotDeltaX(0x202C)分Yを増加させている。増加分は4dotの様である。 次にDrawSprCollisionでビームの当たり判定とVRAMへの書き込みを行っている。当たり判定はビームの書き込む箇所に既にドットがあるかで判断している。

当たり判定の箇所がわかったので、エミュレータで当たり判定がされていないのを調べてみよう。

katsuyoshi.hatenadiary.com

*1:プレイ時のX方向の意味

*2:VRAMに書き込める時にCarryが立つ