スターソルジャー (FC) 解析資料

Published on: 2021-06-11
Updated on: 2021-06-21

RAM マップ

特に断らない限りリトルエンディアン。

概要

アドレス内容
$00-$0F雑用
$10u8PPU $2000 退避用
$11u8PPU $2001 退避用
$12u8PPU 描画有効フラグ (0:false, 1:true)
$13u8PPU スクロールx ($2005)
$14u8PPU スクロールy ($2005)
$15u8ゲームへの入力 (ABSTUDLR)
$16u8前フレームで Start を入力したか (0:false, 0x10:true)
$17u8デモ中かどうか (0:false, 1:true)
$18u8ゲームシーン描画有効フラグ (0:false, 1:true)
$19u8地形が有効かどうか (0:false, 1:true)
$1Au8通知
$1Bu8通知タイマー
$1Cu8敵弾スプライト書き込みルーチンで次に対象とする敵弾のインデックス
$1Du8オブジェクトスプライト書き込みルーチンで次に対象とするオブジェクトのインデックス
$1E(未使用)
$1Fu8フレームカウンタ
$20-$21ptr地形の圧縮データへのポインタ
$22u8宇宙内の行インデックス
$23u8地形内の行インデックス
$24u8地形のローテートフラグ (0:false, 0x80:true)
$25(未使用)
$26(未使用。起動時に 0xC8 が代入される)
$27u8敵編隊出現テーブル内インデックス
$28u8現在の敵編隊出現テーブルエントリ値 (bit0-5:オブジェクトID, bit6:ボスフラグ, bit7:複合禁止)
$29u8敵編隊パラメータロード済みフラグ (0:false, 1:true)
$2A-$2Bptr現在の敵編隊パラメータへのポインタ
$2C-$2Dptr現在の敵編隊パラメータ バイトコードへのポインタ
$2Eu8現在の敵編隊パラメータ 基本メタスプライトID
$2Fu8現在の敵編隊パラメータ 出現間隔
$30u8現在の敵編隊パラメータ 初期座標x
$31u8現在の敵編隊パラメータ 初期座標y
$32u8現在の敵編隊 残り出現数
$33u8現在の敵編隊 次の個体出現までの残り時間
$34u8現在の敵編隊パラメータ内インデックス
$35u8現在の敵編隊 ボスフラグ (0:false, 0x40:true)
$36u8現在の面 (1..=16)
$37u8残機
$38u8自動連射処理 作業用
$39u8星スプライトの基本タイルID (0x3D..=0x3F)
$3Au8自機座標x
$3Bu8自機座標y
$3Cu8自機パワー (0:初期, 1:スピードアップ, 2:3way弾, 3:バリア(3way/5way))
$3Du8自機バリア耐久力 (0..=5)
$3Eu8自機状態
$3Fu8自機状態タイマー
$40u8自機無敵タイマー
$41u8自機が裏潜り中か (0:false, 1:true)
$42u8自機がレーザーモードか (0:false, 1:true)
$43i8星の速度y 基本値
$44-$47u8[4]パレットアニメーションタイマー
$48-$4Bu8[4]パレットアニメーション明滅フラグ (0:明るくする, 1:暗くする)
$4Cu8スターブレインが逃走タイミングに達するまでのカウント (0..=5)
$4Du8$4C が 0 になったか (0:false, 1:true)
$4E-$4FptrスターブレインBGデータへのポインタ
$50u8フェードアウト演出における PPU スクロールy 目標値
$51u8(スターブレイン下降中) スターブレインのHP回復およびBG書き込み回数管理用 (0..=16)
$51u8(スターブレイン戦闘中) スターブレイン状態管理用 (16:生存, 16未満:撃破演出中)
$51u8(スターブレイン撃破/逃走後) スターブレインのBG消去状態管理用 (0..=16)
$52u8スターブレインの水平移動タイマー (0..=2)
$53u8スターブレインの垂直移動タイマー (0..=3)
$54u8スターブレインの水平移動方向 (0:右, 1:左)
$55u8スターブレインの垂直移動方向 (0:下, 1:上)
$56u8スターブレインの種別 (0:ビッグ, 1:通常)
$57u8CHR バンクID bit0 (これと $C9 の和が CHR バンクIDとなる)
$58u8各種演出用タイマー
$59u8星をBGの前面に表示するか (0:false, 1:true)
$5Au8フェードアウト演出におけるパレット変更タイマー
$5Bu8自機狙い弾生成パラメータ (bit4-5:スピード, bit7:誘導弾)
$5C-$5Dptr仮想マシン作業用: バイトコードへのポインタ
$5E(未使用)
$5Fu8フェードアウト演出におけるパレット変更間隔
$60u8ワープ処理における星速度制御用
$61-$62ptr現在の面前半の地形の圧縮データへのポインタ
$63-$64ptr現在の面後半の地形の圧縮データへのポインタ
$65-$66ptr現在の面の地形の特殊セルデータへのポインタ
$67u8野沢ボーナスを既に取得したか (0:false, 1:true)
$68u8デライラ同時撃破判定用タイマー
$69u8エクステンドした回数
$6Au8現在の地形のパレットアニメーション種別 (0:なし, 1:ローテート, 2:明るくする, 3:暗くする)
$6B-$6D(未使用)
$6Eu8エクステンド音を鳴らす残り回数
$6Fu8ワープ地形に触れた直後かどうか (0:false, 1:true)
$70u8敵弾の最大数 (1..=8)
$71u8敵弾の発射間隔 (0..=7)
$72u8敵弾の発射間隔管理用カウンタ
$73u8フルパワーの裏技を使っているか (0:false, 1:true)
$74u8タイトル画面で Select を入力した回数
$75u8フェードアウト演出における PPU スクロールy 変更量
$76u8黄金の指アイテムを取得したか (0:false, 1:true)
$77u8現在レーザーを撃っているか (0:false, 1:true)
$78u8現在撃っているレーザーに含まれる弾数 (0..=15)
$79u8レーザーの下端の座標y
$7Au8レーザーアイテムを取得したか (0:false, 1:true)
$7Bu8前フレームでマイク入力を行ったか (0:false, 4:true)
$7Cu8マイク入力認識用タイマー
$7Du8前フレームで Select を入力したか (0:false, 0x20:true)
$7Eu8地上物の爆発オブジェクト生成先インデックス
$7Fu8スターブレインを既に逃がしたか (0:false, 1:true) (自機が死ぬと 0 になる)
$80u8タイトル画面からデモに移行するまでのカウント (0..=10) (BGM終了後、64F ごとにデクリメント)
$81u8デモ入力生成用乱数インデックス
$82u8生のコントローラ入力 (ABSTUDLR)
$83u8敵編隊出現テーブル内インデックス保存用 (自機死亡時の復元に使われる)
$84u8現在行動中の敵の弾抑制フラグ (0:false, 0x01:true)
$85u8現在行動中の敵の弾高速化フラグ (0:false, 0x02:true)
$86u8現在行動中の敵の誘導弾化フラグ (0:false, 0x04:true)
$87u8現在行動中の敵の再行動フラグ (0:false, 0x08:true) (再行動後は 0)
$88u8現在行動中の敵の高速化フラグ (0:false, 0x10:true)
$89u8現在行動中の敵のランク (0..=7)
$8Au8現在行動中の敵の難易度
$8Bu8ゼグ破壊数
$8Cu8効果音管理用 (低優先度) (bit0-6:効果音ID, bit7:効果音初期化済フラグ)
$8Du8効果音管理用 (高優先度) (bit0-6:効果音ID, bit7:効果音初期化済フラグ)
$8E-$91u8[4]効果音 各チャンネルの残り再生時間 (F) (BGMとの排他制御用)
$92u8効果音 タイマー1
$93u8効果音 タイマー2
$94u8効果音 音符インデックス
$95u8bit0-6:BGM ID, bit7:BGM初期化済フラグ
$96u8BGM 中断状態管理用 (bit0:中断フラグ, bit7:消音完了フラグ)
$97-$9Cptr[3]BGM 各トラックデータへのポインタ (矩形波1, 矩形波2, 三角波)
$9D-$9Fu8[3]BGM 各トラックの音の再生時間 (F)
$A0-$A2u8[3]BGM 各トラックの音の残り再生時間 (F)
$A3-$A8ptr[3]BGM 各トラックのループ開始アドレス
$A9-$ABu8[3]BGM 各トラックのループカウンタ
$AC-$ADu16BGM 作業用変数 (周波数タイマー値)
$AEu8BGM 作業用変数 (雑用)
$AF-$B1u8[3]BGM 各トラックの設定値 ($4000, $4004, $4008 に書き込まれる)
$B2-$B4u8[3]BGM 長さカウンタマスク (8 固定。$4003, $4007, $400B に書き込む際に OR)
$B5u8BGM 現在処理中のトラック (0:矩形波1, 1:矩形波2, 2:三角波)
$B6u8BGM 作業用変数 (BGM終了フラグ)
$B7u8BGM 作業用変数 (読み出したトラックデータ)
$B8-$BFu8[8]現在の面の地形設定(前半、後半)
$C0-$C7u8[8]スコア (1桁1Byte, 上位桁から下位桁へ)
$C8(未使用)
$C9u8周回数 (0:1周目, 2:2周目)
$CA-$D1u8[8]ハイスコア (1桁1Byte, 上位桁から下位桁へ)
$D2(未使用)
$D3-$DAu8[8]ソフトリセット判定用 magic 文字列 ("NONTAMA." が書き込まれる)
$DB-$FF(未使用)
$0100-$018Fu8[144]スタック領域
$0190-$01DFu8[80]現在の地形に対応する PPU 属性テーブルバッファ
$01E0-$01FFu8[32]パレット
$0200-$027Fu8[128]PPU へのデータ転送キュー (低優先度)
$0280-$02FFu8[128]PPU へのデータ転送キュー (高優先度)
$0300-$03FFSprite[64]スプライトバッファ
$0400-$0417u8[24]オブジェクト ID
$0418-$042Fu8[24]オブジェクト 座標x
$0430-$0447u8[24]オブジェクト 座標y
$0448-$045Fu8[24]オブジェクト メタスプライトID
$0460-$0477u8[24]オブジェクト 基本メタスプライトID
$0460-$0477u8[24](爆発オブジェクトの場合) 爆発タイマー
$0478-$048Fu8[24]オブジェクト 仮想マシンのプログラムカウンタ
$0490-$04A7u8[24](ザコの場合) 被弾時の仮想マシンのジャンプ先
$0490-$04A7u8[24](ボスの場合) HP
$04A8-$04BFu8[24]オブジェクト 仮想マシンのバイトコードへのポインタ下位
$04A8-$04BFu8[24](ルイドの場合) 自機追尾タイマー (32 から 8F に1回デクリメントされ、1 で止まる)
$04A8-$04BFu8[24](リュークの場合) 自機追尾タイマー (0 から 1F に1回インクリメントされ、0xFF で止まる)
$04A8-$04BFu8[24](ソープラーの場合) 速度x変更用タイマー
$04A8-$04BFu8[24](パワーアップアイテムの場合) 水平移動の方向 (0:左, 1:右)
$04A8-$04BFu8[24](スターブレインのコア/砲台の場合) VRAM空間 (512x480) 内座標x上位
$04A8-$04BFu8[24](地上物の爆発オブジェクトの場合) VRAM空間 (512x480) 内座標x
$04C0-$04D7u8[24]オブジェクト 仮想マシンのバイトコードへのポインタ上位
$04C0-$04D7u8[24](ルイドの場合) 移動方向 (0..=0xF)
$04C0-$04D7u8[24](スターブレインのコア/砲台の場合) VRAM空間 (512x480) 内座標x下位
$04D8-$04EFu8[24]オブジェクト ボスかどうか (0:false, 非0:true)
$04F0-$0507u8[24]オブジェクト パーツ番号
$04F0-$0507u8[24](スターブレインの砲台の場合) 向き (0..=0xF)
$0508-$051Fu8[24]オブジェクト x方向の動きを反転するか (0:false, 0xFF:true)
$0520-$0537u8[24]オブジェクト y方向の動きを反転するか (0:false, 0xFF:true)
$0520-$0537u8[24](スターブレインのコア/砲台の場合) VRAM空間 (512x480) 内座標y
$0538-$054Fu8[24]オブジェクト 仮想マシンのループカウンタ
$0538-$054Fu8[24](スターブレインの砲台の場合) 弾発射タイマー (0..=16)
$0550-$0567u8[24]オブジェクト 仮想マシンのスリープタイマー
$0568-$057Fu8[24]オブジェクト 仮想マシンの自機追尾タイマー
$0580-$0597u8[24]オブジェクト 仮想マシンのループ開始アドレス
$0598-$0617u8[64][2]星の (座標y,座標x)
$0618u8乱数インデックス
$0619u8乱数ルーチン内雑用
$061A(未使用)
$061B-$0629u8[15]自弾 状態
$062A-$0638u8[15]自弾 座標x
$0639-$0647u8[15]自弾 座標y
$0648-$064Fu8[8]敵弾 状態
$0650-$0657u8[8]敵弾 座標x
$0658-$065Fu8[8]敵弾 座標y
$0660-$0667u8[8]敵弾 方向
$0668-$0687u8[32]オブジェクトIDごとのランク (0..=7)
$0688u8地形外観変更要求リングバッファ tail
$0689u8地形外観変更要求リングバッファ head
$068A-$06C9u8[64]地形外観変更要求リングバッファ
$06CA-$06D9u8[16]CHR-ROM 内の magic string チェック用
$06CA-$07F5u8[15][20]地形
$07F6-$07FF(未使用)

$15 - ゲームへの入力

ABSTUDLR 形式。
デモ中ならばデモ専用の乱数で生成された入力となる。
デモ中でなければ $82 と同じ値になる。

$1A - 通知

画面中央の文字列表示("BONUS 80000" など)を「通知」と呼ぶ。
通知には以下の種類がある:

通知ID内容
0(通知なし)
1"STAGE ?? START"
2"PAUSE"
3"GAME OVER"
4"ATTACK BIG STAR BRAIN"
5"ATTACK STAR BRAIN"
6"BONUS ???????"
7"BRAIN ESCAPED"
8"WARP NEXT STAGE"
9"COMPLETE WARP"

ボーナス通知(ID:6)の場合、ボーナスIDに対応した文字列が表示される:

ボーナスID内容
0"80000"
1"2000000"
2"40000"
3"10000"
4"4000"
5"1000"
6"500"
7"80000"

$1A の内容は以下の通り:

通知は通知タイマー $1B が非0である間表示される。

$3E - 自機状態

ID名称説明
0通常状態自機が生存しており、プレイヤー操作可能
1小爆発状態1自機が死亡して小爆発中 (1段階目)
2小爆発状態2自機が死亡して小爆発中 (2段階目)
3小爆発状態3自機が死亡して小爆発中 (3段階目)
4小爆発状態4自機が死亡して小爆発中 (4段階目)
5ワープ状態1スターブレイン撃破直後、またはワープセルに触れた直後。自機が y=240 まで自動で上へ移動する
6ワープ状態2ワープ状態1で自機が y=240 まで移動した後、またはスターブレインが逃走してフェードアウトした後
7出撃状態1自機が現在の面に出現した直後 (自機座標y を 240 に設定し、直ちに出撃状態2へ遷移する)
8出撃状態2自機が現在の面に出現し、自動で上へ移動している状態
0x80不在状態自機が死亡して小爆発が終了した直後、または周回クリア時

$7C - マイク入力認識用タイマー

普段は 0。マイク入力の変化を検出すると 60 になり、1F で 1 ずつ減少して 0 に戻る。
この値が非0の間、マイク入力が認識される。

on->off, off->on いずれの場合もマイク入力として認識されることに注意。
これは、ファミコンのバージョンによってはマイク入力 bit が反転している問題に対処するため。
(参考: 「助けてハドソン!」とマイク入力 | Colorful Pieces of Game)

$82 - 生のコントローラ入力

以下の全入力の論理和(ABSTUDLR 形式):

$0200-$027F, $0280-$02FF - PPU へのデータ転送キュー

PPU へのデータ転送を非同期に行うための機構。
メインスレッドで転送すべきデータをキューに書き込み、NMI スレッドがキューからデータを取り出して実際の転送を行う。
NMI スレッドはキュー $0280- が空でなければそれを処理し、さもなくばキュー $0200- を処理する。

データ転送キューの要素は以下のような構造になっている:

フィールド内容
ヘッダu80:キュー終端, 1:横方向へ書き込み, 2:縦方向へ書き込み
PPUアドレスu16be転送先 PPU アドレスの始点。
書き込みサイズu8
書き込むデータu8[]

$068A-$06C9 - 地形外観変更要求リングバッファ

バッファの要素は 2Byte 単位で、以下のような構造になっている:

内容
u8
u8bit0-3:行, bit4-7:外観変更ルーチンID (テーブル $A29E 参照)