■効果音 途中 ●63 xx yy 65,66命令との違いはパンの指定のみ (7E1C02) 63命令だと0x80固定、65,66命令の場合は操作キャラ,対象キャラの横位置をそのまま使用する 処理の流れは ・各レジスタをプッシュ、DBを0x00, Dを0x1C00に変更 ・7E1C05の値が0x7F以下、もしくは引数xxが0x00なら処理終了 ・引数xxが0x80以上なら060614の処理へ、0x10未満なら処理終了 ・引数xxが0x18以上なら分岐処理へ ・いずれの条件にも当てはまらない場合(引数xxが0x10〜0x17)の処理はBGM変更処理 分岐処理 ・引数xxが0x20未満 → 060614へ ・引数xxが0x70 → 06089aへ ・引数xxが0x71 → 060721へ ・引数xxが0x72 → 060a9dへ ・いずれにも当てはまらない → 処理終了 ■背景関連 ●資料 ・背景ID拡張 (AL982氏) ・RS3背景資料 (min氏) 0188ab: AB 0C yy 命令 010940: ラスタスクロール設定処理 010a13: ラスタスクロールデータ (0x20bytes*4) ■26バンク空き領域 269370-269800 不明 26AE80-26B000 背景パレット 26B200-26B380 なんかのパレット 26B380-26B400 <空き> 26B400-26B540 なんかのパレット 26B540-26B700 <空き> 26C140-26C630 ラスタスクロール, グラデーション等データ 26C630-26CB9D エフェクトオフセット等 26CB9D-26CED0 <空き> 26DFF0-26E400 敵グラフィック定義データの空き 26E580-26E980 敵画像オフセット 26E980-26EE00 <空き> 26FD00-270000 敵グラフィックパーツオフセット 26FDF0-270000 <一番使わなそう?> ■技タイプ ●資料 (6-912氏) ・計算式メモ.txt 7E147C: 腕力 (補正後) 7E147D: 器用さ (補正後) 7E147E: 素早さ (補正後) 7E147F: 体力 (補正後) 7E1480: 魔力 (補正後) 7E1481: 意思力 (補正後) 7E1482: 魅力 (補正後) 0x5B7000: 技タイプ0x32用分岐オフセット 0x5B7200: 技タイプ0x32用処理 (親処理は0x0280B2~) 0x0269DF: 参照値読み込み処理オフセットテーブル (0x68 bytes) CB6A D66A DC6A E76A 676B FFFF 686B 6E6B 746B 7A6B 806B FFFF 866B 8C6B 926B A66B AC6B AD6B AE6B C26B C36B C46B C56B FFFF DB6B E16B EC6B F46B FA6B FE6B 0B6C FFFF 116C 256C 376C 426C 436C 446C 4A6C FFFF 616C 736C 796C 846C 856C 866C 876C 886C 896C 8A6C 8B6C 8C6C 0x026E85: 技タイプ別オフセットテーブル (0x68 bytes) EE6E 366F 7E6F C66F 0E70 7470 7F71 BC71 F971 3672 7372 9D72 9573 D273 0C74 6F74 B674 3175 6475 C775 0876 8476 F976 5477 0A78 4C78 C178 1A79 8779 E579 4D7A 827A D07A 297B 6B7B B57B C17B F67B 207C 777C F77C 567D 937D B77E D77E 587F A87F 0F80 2E80 7380 B280 DF80 ■敵グラフィックパーツ ●資料 (2-658氏) ・old敵画像移植手順.txt ・敵変身設定手順.txt ・敵追加パレット設定手順.txt ●敵グラフィック設定 (0x26D000〜) 0x00: アドレス指定 0x01: X位置補正 (8px単位) 0x02: Y位置補正 (8px単位) 0x03: 登場時エフェクト (+0x40でパレット追加 →資料参照) 0x04: 00:そのまま, 01:パーツ追加 0x05: 不明 ----- 0x04の値の0x01が立っている場合追加 ----- 0x06: パーツオフセットID 0x07: パーツX位置補正? 0x08: パーツY位置補正? ●敵グラフィックパーツオフセット (0x26FD00〜) 2byteオフセット*256個 データが格納されているのは27バンク (ほぼパーツ専用バンク) パーツに対応するのは無理だなぁ ■エフェクト内での武器種(ADBB) 00: アイテム等 (+アビス術/銃) 01: 剣 02: 曲刀 03: 斧 04: 棍棒 05: 小剣 06: 大剣 07: 刀 08: 槍 09: 三叉槍 0A: 矛槍 0B: 弓 0C: 氷の剣 FF: 素手 80: 蒼龍 81: 朱鳥 82: 白虎 83: 玄武 84: 太陽 85: 月 ■陣形技オフセット 26CA35: 合成術オフセット (0x14個、参照先29xxxx、行動キャラ番号を含む) 26CA5D: 陣形技オフセット (0x20個、参照先2Axxxx、行動キャラ番号を含む) 26CA9D: 特殊処理オフセット (0x70個以上、参照先2Axxxx、行動キャラ番号を含まない) 17E3E6: 陣形技エフェクト指定 (0x30 bytes) 17E416: 合成術エフェクト指定 (0x10 bytes) ※参照先が2Aバンクになっている処理は  フラグ1のデータバンク指定で実処理のバンクが変化することに注意 ■AA 処理一覧はAA.txtに新しく記しています こっちはそれ以前の古いのだけ 2C: 7EA200〜7EA400までを0x00FFで埋める   7E0D80, 7E0D82 = 0x00 2D: 7E0D64 = 7E0D80 + 0x02 (ループカウンタ)   7EA201前後のデータを0x00にセット 以下逆汗 016de7 a9 00 LDA #$00 016de9 a2 e0 00 LDX #$00e0 016dec a0 e0 00 LDY #$00e0 016def 9d 01 a2 STA $a201,X 016df2 99 01 a2 STA $a201,Y 016df5 ca DEX 016df6 ca DEX 016df7 c8 INY 016df8 c8 INY 016df9 ce 64 0d DEC $0d64 ; 016dfc d0 f1 BNE $6def ※アビスの風の画面中心から縦に広がる表現がコレ 2E: 7EADB0 (回転半径) を参照するラスタスクロール (0x016e00〜)   7E0D64 = 0xFF00, $4203 = 0x00 - 0x26BE40? 7C: パレット05,06,07に対して3D命令を実行   味方5人のうち、対象になっていないキャラのパレットに3D命令を実行 7D: 43命令と3D命令を実行してパレット02-0Fをバックアップしたパレットへと戻す 7E: 味方5人のうち、対象になっていないキャラの表示フラグを変更   (7E113E = 7E113E AND 0xEF) 7F: 敵味方全員の表示フラグを変更   (7E113E = 7E113E OR 0x10, 7E106F = 7E106F OR 0x10) A8: 操作キャラと対象キャラ以外のパレットフェードを実行 (背景含む) A9: 敵キャラ全員の表示フラグを変更 (7E106F = 7E106F AND 0xEF)   最後に 7E11BA = 0x05, 7E11BB = 0x07 AA: 対象キャラの表示フラグを変更 (7E106F = 7E106F OR 0x10) 後、VRAM転送関連 ■AB 08: キャラ全員のY位置とグラデーション位置に引数yyを加算 14: 16色パレット読み込み 0x26B000 + yy << 5 → 7E0A40 (パレット10) 18: 7E1059 = 0x0900, 7E0900 = 7E0900 AND 0xFB 19: 7E0900 = 7E0900 OR ( 7E1059 AND 0x04 ) ■毒変化 呼びだし元の処理はは0x01BEE2から 01bf16 da PHX 01bf17 5a PHY 01bf18 c2 20 REP #$20 01bf1a a9 37 62 LDA #$6237 01bf1d 99 0c cb STA $cb0c,Y 01bf20 a9 d4 4d LDA #$4dd4 01bf23 99 0e cb STA $cb0e,Y 01bf26 a9 2f 3d LDA #$3d2f 01bf29 99 10 cb STA $cb10,Y 01bf2c e2 20 SEP #$20 01bf2e 7a PLY 01bf2f fa PLX 01bf30 60 RTS ■補完 7E0900: 各種機能の使用フラグ 0x40: ウインドウマスク 0x20: 固定カラーグラデーション 0x10: ラスタスクロール 7E0F01: 行動キャラ番号1 7E0F02: 行動キャラ番号2 7E0F03: 行動キャラ番号3 7E0F04: 行動キャラ番号4 7E0F05: 行動キャラ番号5 7E0F06: エフェクトに参加するキャラの数 7E0F0C: 行動キャラ1 使用武器ID (素手:FF, 術:武器種と同じ, 拡張:+0x80) 7E0F0D: 行動キャラ2 使用武器ID 7E0F0E: 行動キャラ3 使用武器ID 7E0F0F: 行動キャラ4 使用武器ID 7E0F10: 行動キャラ5 使用武器ID 7E0F1C: 対象の数 7E0F1D: 対象キャラ番号1 (+0x80:敵) 7E0F2E: 対象キャラ番号2 対象となるキャラは何らかのパラメータで管理されてるっぽくて それが0x0Ebytes単位に並んでるってことが分かるだけ /*------------------------------------------------------------*/ ■特殊エフェクト用タイルパターン 書式は以下の通り 0x00: 横繰り返し回数 0x01: 縦繰り返し回数 0x02: 横サイズ 0x03: 縦サイズ 0x04以降: 横サイズx縦サイズ分のタイル番号の羅列 BG用のタイルパターンは4A命令で変換されて、7E9600〜7EA600の領域に書き込まれる 7E9600〜7EA600の領域自体が32x32のタイルパターン (512x512px) のようなもので、 1タイルにつき2bytesで指定=0x40bytesで32個(1列分)の指定 となる どの領域からタイルパターンの矩形を書き込むかを引数で指定することで 複数のタイルパターンを描画させることが可能 (<4A 20 00>で横256px目から描画、<4A 40 00>で2列目から描画 など) 指定できるタイル番号は0x37まで (=画像は7枚まで) どのパレットを使用するかも4A命令を呼んだ時点で決定される(指定自体に含まれる)ため、 41命令と併用することで複数パレットを指定したBG内容を作ることも多分可 ■固定カラー値 何年経っても減法混色が頭の中で出来んー 括弧内は上位3ビットを表す 0x00 (000): 黒 0x20 (001): 赤 0x40 (010): 緑 0x60 (011): イエロー 0x80 (100): 青 0xA0 (101): マゼンダ 0xC0 (110): シアン 0xE0 (111): 白 /*------------------------------------------------------------*/ ■画像読み込み 7E103D: 転送元バンク 7E103E: 転送元オフセット 7E1040: 転送先 7E1042: 転送サイズ 7E1044: ? 7E1045: ? 7E1047: 画像アドレス (24bit) 01AA99: 画像オフセットの計算 ●50 yy オフセット: 0x2280C0 + yy * 3 (スプライト) 色数: 8 転送元: 7E9600〜7EA200 (0x0C00 bytes) 転送先: VRAM#4000, VRAM#4600 (スプライト) 備考: スプライト画像を6枚分読み込む (3枚*2) ●51 xx yy オフセット: 0x2280C0 + yy * 3 (スプライト) 色数: 8 転送元: 7E9600〜7E9A00 (0x0400 bytes) 転送先: VRAM#4000 + xx << 9 (スプライト) 備考: スプライト用デフォルト命令 ●52 xx yy オフセット: 0x228240 + yy * 3 (BG2) 色数: 8 転送元: 7E9600〜7E9A00 (0x0400 bytes) 転送先: VRAM#0200 + xx << 9 (BG2) 備考: BG2用デフォルト命令 ●53 xx yy オフセット: 0x228000 + yy * 3 (BG3) 色数: 4 転送元: 7E9600〜7E9800 (0x0200 bytes) 転送先: VRAM#2100 + xx << 8 (BG3) 備考: BG3用デフォルト命令 ●54 xx yy オフセット: 0x228240 + yy * 3 (BG2) 色数: 8 転送元: 7E9600〜7E9E00 (0x0800 bytes) 転送先: VRAM#0040 + xx << 11 (BG1?) 備考: モード7用デフォルト命令 転送先は多分BG1とは違った専用領域 ●55 xx yy オフセット: 0x228240 + yy * 3 (BG2) 色数: 8 転送元: 7E9600〜7E9E00 (0x0800 bytes) 転送先: VRAM#0040 + xx << 11 (BG1?) 備考: モード7用 画像を左右反転させて読み込む (タイルパターンでの反転は不可っぽい) ●56 xx yy オフセット: 0x228000 + yy * 3 (BG3) 色数: 4 転送元: 7E9600〜7E9A00 (0x0400 bytes) 転送先: VRAM#0200 + xx << 9 (BG2) 備考: BG3画像をBG2領域に読み込む ●57 xx yy オフセット: 0x2280C0 + yy * 3 (スプライト) 色数: 8 転送元: 7E9600〜7E9A00 (0x0400 bytes) 転送先: VRAM#0200 + xx << 9 (BG2) 備考: スプライト画像をBG2領域に読み込む ●58 xx yy オフセット: 0x228240 + yy * 3 (BG2) 色数: 8 転送元: 7E9600〜7E9A00 (0x0400 bytes) 転送先: VRAM#4000 + xx << 9 (スプライト) 備考: BG2画像をスプライト領域に読み込む ●59 xx yy オフセット: 0x228240 + yy * 3 (BG2) 色数: 8 転送元: 7E9600〜7E9E00 (0x0800 bytes) 転送先: VRAM#0040 + xx << 11 (BG1?) 備考: モード7用 画像を上下反転させて読み込む ●4D xx yy オフセット: 0x228240 + yy * 3 (BG2) 色数: 8 転送元: 7E9600〜7E9E00 (0x0800 bytes) 転送先: VRAM#0040 + xx << 11 (BG1?) 備考: モード7用 画像を左右反転させて読み込む    色指定が変わる? ●4E xx yy オフセット: 0x228240 + yy * 3 (BG2) 色数: 8 転送元: 7E9600〜7E9E00 (0x0800 bytes) 転送先: VRAM#0040 + xx << 11 (BG1?) 備考: モード7用 これも色がおかしい (暗くなるorグレースケール?)    4D,4Eは多分使う必要なし ●4F xx yy オフセット: 0x228000 + yy * 3 (BG3) 色数: 4 転送元: 7E9600〜7E9A00 (0x0400 bytes) 転送先: VRAM#4000 + xx << 9 (スプライト) 備考: BG3画像をスプライト領域に読み込む /*------------------------------------------------------------*/ ●AD ※未解析 ※嘘八百の可能性アリ まず7E106Fの内訳 0x10: スプライト表示フラグ 0x20: BG2表示フラグ 通常、戦闘中では常にどちらか片方のみが立つ (B7時は0x10がオン、B8時は0x20がオンになる) 次に5F命令について > 7E1092の0x30が立っている場合は、 > 7E106F = 7E106F AND 0xCF OR 0x10 > 7E1092の0x30が立っていないなら > 7E106F = 7E106F XOR xx 通常戦闘で7E1092の0x30が立っている状況を確認していないため、 5F命令は指定ビットの反転処理を行うだけの命令として考えていいはず んでAD命令 とりあえずAD命令の概要は<敵グラフィックを再配置する>というような感じで、 B7,B8と同じく敵グラフィックを別のレイヤーに移動させる用途で使用する B7,B8のように移動先のレイヤーが固定されている訳では無くて、 敵キャラごとの表示フラグを参照してスプライト/BG2どちらに移動させるかを決定する デフォルトでは対象キャラのみをBG2に移動させる目的で使われていて、 移動後に他のキャラを消すことで常に敵が1体のみという状況に持っていくことができる /*------------------------------------------------------------*/ ●EC xx yy ウインドウマスクを移動 7E0CB0が変更対象 ちなみに7E0CB0がX軸位置で7E0CB2がY軸位置となる ●ED xx yy ウインドウマスクを移動 こちらは7E0CF0が変更対象 ●EE 何もしない ●A0 xx yy 色変更フラグを変更 7E104D = 7E104D OR yyxx ●A1 xx yy 色変更フラグをクリア 7E104D = 7E104D AND yyxx反転値 7E104D, 7E104Eが色変更のON/OFFフラグになっていて、 各ビットがどのパレットに対応してるかは以下の通り 7E104D 0x80: パレット07 (敵3) 0x40: パレット06 (敵2) 0x20: パレット05 (敵1) 0x10: パレット04 (背景3) 0x08: パレット03 (背景2) 0x04: パレット02 (背景1) 0x02: パレット01 (汎用2) 0x01: パレット00 (汎用1) 7E104E 0x80: パレット0F (敵3) 0x40: パレット0E (敵2) 0x20: パレット0D (敵1) 0x10: パレット0C (味方5) 0x08: パレット0B (味方4) 0x04: パレット0A (味方3) 0x02: パレット09 (味方2) 0x01: パレット08 (味方1) ●B3 xx yy パンが操作キャラ側の効果音 63命令の最初の分岐が無いだけの命令 63命令は7E1038の0x08が立っているとそこで終了するが、この命令はその分岐が無い 盾の処理(0x2AC36F)で見られる 強制的に鳴らす か、これ以降の効果音を鳴らさない のどちらかだと思う 7E1038の使い方が理解できればもうちっと踏み込めるんだけど ●08 xx タイルパターンデータの加算値指定 引数xxは、0x08,0x10,0x18,0x20,0x28,0x30,0x38 のいずれか 例えば<08 10>とした状態でタイルパターンオフセットを<01 39 DC>と指定すると、 指定先のタイルパターン<01 01 03>が<01 01 13>として扱われる 使用箇所は主に陣形技 ADBC = ADBC AND 0xC7 OR 引数 /*------------------------------------------------------------*/ ■回転関連 ※推測で判断してる命令が多いです ●02〜06 xx yy 回転角度÷0x40+1が**ならタイルパターンオフセットを指定 ループ内は カウンタ+1 → 0x40減算 → 0未満ならループ終了 という流れなので、商に+1された値が比較対象になる ●F9/FA 回転エフェクト実行 (正円限定) *未解析 (使用例:ベルセルク) ●FB xx yy zz 回転エフェクト実行 (正円限定 xx:半径 zzyy:角度) 7EADB0 += xx 7EADAE += zzyy この後F9命令の処理に続く ●FC xx 回転エフェクト実行 (傾き参照) ●FE xx 回転エフェクトの位置を指定 引数xxの上位4bitで分岐 0x00: 対象キャラ位置 (下位4bitで上端or下端を選択) 0x10: 操作キャラ位置 (下位4bitで上端or下端を選択) 0x20: 画像表示位置 それ以外: 画面中心 (X:0x0080, Y:0x0070) 引数xxの下位4bitでキャラ位置からの演算を選択 0x00: キャラの下端 それ以外: キャラの上端 ●FF 回転エフェクト実行 (正円限定 角度によって画像を反転) *未解析 (使用例:ウインドダート) ●39 xx 回転エフェクトの中心と指定キャラの位置の二点の角度を求める 引数xxで分岐して以下の値からキャラの位置を算出 0x01: 7E0F2B 0x02: 7E0F39 その他: 対象キャラ番号 ※7E0F2Bと7E0F39もキャラ番号のはずだけど具体的には不明 ちょっと用途が不明なメモリが多いので後回し ※後半未解析 /*------------------------------------------------------------*/ ●DF xx 特殊エフェクト表示位置指定 引数xxの上位2bitで書き換わるメモリを指定 0x80: 7E0CF0 0x40: 7E0CB0 ※両方書き換えるのもOK  単純に考えてウインドウ1とウインドウ2の位置を書き換えてるってとこか 引数xxの下位6bitで位置を指定 0x00: 画像表示位置 (画面外なら無効) 0x01: 対象キャラ下端 0x02: 対象キャラ中心から右16上16 0x03: 対象キャラ上端 0x04: 対象キャラ右端 0x05: 対象キャラ左端 015dc1: キャラの位置やサイズ関連で良く使われる 7E0D64: X 7E0D66: Y 7E0D68: H/2 7E0D6A: W/2 DF命令でウインドウ位置、BF命令でBGの位置を変更するって感じ ●B0 7EAED6 = 7EAED6 OR 0x80 ●B1 操作キャラのキャラフラグ1の0x80が立っていなければ処理終了 (フラグ1の0x80をオフ) 7EADA0 = 7EADA0 AND 0x7F ●E5 キャラの左右反転フラグをフラグ2の左右反転フラグにセット 変更されるフラグは エフェクト処理全体の左右反転フラグと画像左右反転フラグ の2つ 9E命令と一緒に使用 7E0D64 = 7E114A AND 0x40 (左右反転フラグのみ持ってくる) 7EADA1 = 7EADA1 AND 0x3F OR 7E0D64 OR ( 7E0D64 << 1 ) ●91 操作キャラを左右反転表示、反転済みの場合戻す (操作キャラが敵の場合のみ実行) 7E107D = 7E107D XOR 0x40 88命令の敵キャラ版 ●A8 xx キャラを陣形位置へ戻す (xx 01:対象キャラ, 他:操作キャラ) A = ( xx == 0x01 ? 7EADB6 : 7EADB5 ) 移動対象が味方なら 7E1144 = 7E1141 << 3 7E1145 = 0x00 7E1147 = 7E1142 << 3 7E1148 = 0x00 7E0D68 = 0x10 7E0D6A = 0x0C 移動対象が敵なら 7E1077 = 7E1074 << 4 7E1078 = 0x00 7E107A = 7E1075 << 4 7E107B = 0x00 7E0D68 = 7E1073 << 4 7E0D6A = 7E1072 << 4 ●A7 xx 不明 7E104F = xx ●44 味方1人目の使用不可色を黄色に変更 7ECB06 = 0x033B 剣の黄色より原色に近い ●32 xx ウエイト指定 (操作キャラが陣形技内での何番目にあたるかでウエイトを乗算) コマンダーモード以外では使う必要はないかも ●E8 xx ※引数の使われ方だけ 0x0F: 図形を指定 16通りの分岐がちゃんと用意されとる 0x40: 7E0CB0に値をセット 0x80: 7E0CF0に値をセット ※長い 要気合 /*------------------------------------------------------------*/ ●BF xx yy 特殊エフェクトの位置を指定 引数xxの下位2bitで対象BGを指定 0x00: BG1 0x01: BG2 それ以外: BG3 引数yyの下位3bitで起点を指定 0x00: 対象キャラ位置 0x01: 対象キャラの足下位置 0x02: 操作キャラ位置 0x03: 画像表示位置 0x04: 操作キャラの足下位置 ※足下基準と書いてるけど違うかも (値の出し方が縦位置+縦サイズ)  そもそもキャラ位置がどこ基準なのかで変わってくるから確認の必要アリ 引数xxと引数yyの0xF8で位置の調整 上記の起点位置から引数の値が減算される んで指定したBGのスクロール位置レジスタに書き込んで終わり 【キャラ位置基準の共通処理】 キャラ位置に自身のサイズを加算 味方の場合は横12bytes,縦16bytesを加算 敵の場合は縦横のサイズと思われる値を左4シフトしてそれぞれ加算 特殊エフェクトっていうかBGの位置指定 ●99 xx yy zz 不明 7EF4A2の0x22が立っていない場合はスキップ 7E1C00 = xx 7E1C01 = yy 7E1C02 = zz 060004にロングジャンプ かなり深めなので勘弁 7EF4A2の参照て相当局所的な命令に思えるけど・・・ ●9D xx 以下の条件と合致すれば処理終了 (フラグ1の0x80をオフ) 条件 ・引数xxが0x00 ・対象が敵 ・7E0903の0x02が立っている 7EADA0 = 7EADA0 AND 0x7F 特定の戦闘でのみ使われそう? となるとプログラムから呼んでるエフェクトが怪しい ●5D xx 対象キャラをBG2へ移動 (対象が味方の場合のみ) ※情報元: ゴゴイチ氏 7E6600から0x1000bytesをVRAM#0400に転送 7E3A00から0x0400bytesを0x00で埋める 対象キャラのパレットをパレット01にコピー 対象キャラが透明状態でなければ以下に続く (7E1140の0x10が立っていない) この2つの処理は敵用と思われる箇所が無い 移動と言ってもスプライトを消すわけでは無いので コピーと言ったほうが分かりやすいかも BG2水平スクロール値指定 7E1015 = 0x0000 - 7E1144 7E1017 = 0x0000 - 7E1147 - 0x01 7E3A00 = 7E1149 - 0x40 7E3A02 = 7E3A00 + 0x02 7E3A40 = 7E3A00 + 0x20 7E3A42 = 7E3A00 + 0x22 7E3A01 = 0x24 7E3A03 = 0x24 7E3A41 = 0x24 7E3A43 = 0x24 7E3A00から0x0400bytesをVRAM#( 7E1002 AND 0xFC00 )に転送 /*------------------------------------------------------------*/ ■キャラグラフィック関連の再整理 ●88 操作キャラを左右反転表示、反転済みの場合戻す 7E114A = 7E114A XOR 0x40 ●89 操作キャラを上下反転表示、反転済みの場合戻す 7E114A = 7E114A XOR 0x80 ●8A xx 操作キャラグラフィック変更 7E114B = xx 7E1049 = 7E114C 7E1047 = 7E114D X = 7E114B AND 0x00FF << 5 7E0D64 = 7E1149 AND 0x007F << 5 色々処理があって、最後にVRAM転送 自キャラIDが0x04なら 7E6E00から0x0800bytesをVRAM#5C00に転送 それ以外なら 7E6600から0x0800bytesをVRAM#5800に転送 ワカンネ 【キャラグラフィックのポーズについて】 キャラグラフィックは32x32で表示されていて、 引数に応じた表示の指定も用意されている 指定データは0x26B700からで1ポーズにつき32bytes 8A命令の引数に従うため、7個目が構え、15個目がキック という風な順番になる チップの指定は2bytes単位で8x8のチップを縦横4つずつ 指定値はグラフィックデータを32bytes単位で分割した時のインデックス値 指定値が2bytes単位なのは多分巨大オブジェクトの仕様に合わせるためで、 NPC用のデータも考慮すると反転指定やサイズ指定があるはずなんだけど不明 引数は0x19までで、それ以降は別データがある どこかの空きに移せば新しい組み合わせのポーズを作ることも出来るはず ※0x04C977からも指定データくさい並びがあるけど明らかに数が足りん 【戦闘中の口パク修正】 0x26B928: DB 00 6F 00 98 00 FF 00 DC 00 DD 00 A8 00 FF 00 ●8F 操作キャラを右90度回転表示、回転済みの場合戻す 7E113E = 7E113E XOR 0x40 ※8F命令の後には8A命令が必要 ●8E xx 対象キャラグラフィック変更 8A命令の対象キャラ版 敵専用エフェクトとか味方を対象にするエフェクトからしか使えない ●92 対象キャラのキャラフラグ1を初期化 (結果的に非表示にする?) 7E106F = 0x00 ●9F xx 操作キャラの上下左右反転フラグを指定 7E114A = 7E114A AND 0x3F OR xx 7E107D = 7E107D AND 0x3F OR xx /*------------------------------------------------------------*/ ■パラメータ調査 ※相当読みづらいと思いますんでスルー推奨 (機会があればまとめます) 味方のパラメータ (7E113E付近で管理しているデータ) は0x13bytes単位 敵のパラメータは0x24bytes単位 味方パラメータ 7E113E: キャラフラグ1 (0x40:回転フラグ, 0x10:表示フラグ, 0x0F:未確定) 7E1140: ステータス異常表示フラグ (0x40:石化, 0x10:透明, 0x04:毒, 0x02:暗闇, 0x01:麻痺) 7E1141: 陣形位置X (8bytes単位? それっぽいけど未確定) 7E1142: 陣形位置Y (同上) 7E1144: キャラ位置X 7E1145: キャラ位置X 7E1146: 7E1147: キャラ位置Y 7E1148: キャラ位置Y 7E1149: 7E114A: キャラフラグ2 (0x80:上下反転、0x40:左右反転、0x30:未確定) 7E114B: キャラグラフィック (8A命令の引数と同じ) 7E114C: キャラグラフィックバンク 7E114D: キャラグラフィックオフセット 7E114E: キャラグラフィックオフセット 7E114F: パレットID 敵パラメータ 7E106F: キャラフラグ1 (0x10:表示フラグ, 0x0F:未確定) 7E1072: キャラサイズW (16bytes単位? 左4シフトして使ってる命令がある) 7E1072: キャラサイズH (同上) 7E1077: キャラ位置X 7E1078: キャラ位置X 7E107A: キャラ位置Y 7E107B: キャラ位置Y 7E107C: パレットID? 7E107D: キャラフラグ2 (0x80:上下反転、0x40:左右反転、0x30:未確定) 7E1092: 5F命令で参照 015e2b: 味方パラメータ用乗算 015e44: 敵パラメータ用乗算 ※関連命令でオフセットを求めるために良く使われる ●0x012bce- 不明 7E1149 = 0x3180 7E115C = 0x3384 7E116F = 0x3588 7E1182 = 0x378C 7E1195 = 0x39C0 7E11A8 = 0x3BC4 ●0x012a31- 不明 7E113F = 7E0F46 7E113E = 0x90 7E1142 = 7E0F44 7E1147 = 7E0F44 << 3 7E1141 = 7E0F45 7E1144 = 7E0F45 << 3 7E1143 = 0x00 7E1146 = 0x00 7E1148 = 0x00 7E1145 = 0x01 7E114B = 0x04 7E114F = 7E0F42 ●0x012ba5- キャラグラフィックオフセットの指定 7E113E = 0x00 7E114D = 39A001 AND 0xFFE0 7E114C = 0xDA ●0x0104e4- 敵味方のフラグ初期化? 7E113E = 7E113E AND 0xFC 7E114A = 7E114A AND 0xCF OR 0x20 7E1145 = 0x00 7E1148 = 0x00 7E1144 = 7E1141 << 3 7E1147 = 7E1142 << 3 7E106F = 7E106F AND 0x8C OR 0x10 7E107D = 7E107D AND 0xCF OR 0x20 7E1078 = 0x00 7E107D = 0x00 7E1077 = 7E1074 << 3 7E107A = 7E1075 << 3 /*------------------------------------------------------------*/ ■重なり関連 ●5F xx 不明 対象が敵の場合のみ実行 7E1092の0x30が立っている場合は、 7E106F = 7E106F AND 0xCF OR 0x10 7E1092の0x30が立っていないなら 7E106F = 7E106F XOR xx ●5E xx キャラの表示/非表示を切り替え 0x80で対象キャラ/操作キャラを選択、0x0Fでキャラ番号(04まで)を指定 引数xx 00:操作キャラ1 01:操作キャラ2 80:対象キャラ1 81:対象キャラ2 7E113E = 7E113E XOR 0x10 7E106F = 7E106F XOR 0x10 ●5C xx フラグ2の0x30を指定値に変更 7EADA1 = 7EADA1 AND 0xCF OR xx ●5B xx 対象キャラもしくは操作キャラのキャラフラグ2の0x30を指定値に変更 (変更対象は引数xxの0x01で変化 01:対象キャラ, 00:操作キャラ) ★引数xxの0x01が立っている  対象キャラが味方なら 7E114A = 7E114A AND 0xCF OR ( xx AND 0xFE )  対象キャラが敵なら  7E107D = 7E107D AND 0xCF OR ( xx AND 0xFE ) ★引数xxの0x01が立っていない  操作キャラが味方なら 7E114A = 7E114A AND 0xCF OR ( xx AND 0xFE )  操作キャラが敵なら  7E107D = 7E107D AND 0xCF OR ( xx AND 0xFE ) <5B 20> 操作キャラをBGの奥に配置 <5B 30> 操作キャラをBGの手前に配置 <5B 21> 対象キャラをBGの奥に配置 <5B 31> 対象キャラをBGの手前に配置 ●5A xx 敵味方全員のキャラフラグ2の0x30を指定値に変更 7E114A = 7E114A AND 0xCF OR xx 7E107D = 7E107D AND 0xCF OR xx <5A 20> 敵味方全員をBGの奥に配置 <5A 30> 敵味方全員をBGの手前に配置 ※5A,5B命令で変更対象となるキャラはスプライトである必要がある ●2C xx フラグ1の下位2bitを指定値に変更 7EADA0 = 7EADA0 AND 0xFC OR xx ●2D xx 操作キャラのキャラフラグ1の下位4bitを指定値に変更 操作キャラが味方なら 7E113E = 7E113E AND 0xF0 OR xx 操作キャラが敵なら 7E106F = 7E106F AND 0xF0 OR xx ●2E xx 対象キャラのキャラフラグ1の下位4bitを指定値に変更 対象キャラが味方なら 7E113E = 7E113E AND 0xF0 OR xx 対象キャラが敵なら 7E106F = 7E106F AND 0xF0 OR xx スプライトを操作キャラの奥に配置する場合は、<2D 02>を スプライトを対象キャラの奥に配置する場合は、<2E 02>を事前に呼んでおく その後、並列処理のフラグなり2C,5C命令なりで指定する 前に歩く処理から始まるエフェクトの場合は必要ないが その場からダッシュとかジャンプで始まったりする場合は これを知っとかないとドツボにハマる /*------------------------------------------------------------*/ ■ラスタスクロール ●D8 xx yy メモの通りラスタスクロールの基本命令として見ていいと思われる 引数xxで使用するBGや縦横スクロールの指定 引数yyで機能の切り替え (01:有効, それ以外:無効) 引数yyが0x01なら処理継続 7E0C68 = 0xF0 7E0C6B = 0xF0 7E0C69 = 0xA200 7E0C6C = 0xA2E0 7E0C6E = 0x00 $4341 = xx ($21xxに値を転送) $4340 = 0x42 (HDMA有効) $4344 = 0x7E $4347 = 0x7E $4342 = 0xF0 (7E0C68) 7E0900 = 7E0900 OR 0x10 引数yyが0x01以外なら 7E0900 = 7E0900 AND 0xEF ●D9 xx yy 26yyxxからデータを読み込んで展開、7EA200~に書き込む データの構造 0x00: カウンタ1 0x01: カウンタ2 0x02: データ カウンタ1のループ内にカウンタ2のループを仕込んで、 データから1byteをコピー、次の1byteを0x00で上書き と繰り返していく (16bitに直す?) 80 02 00 01 02 03 04...7E 7F というデータなら 00 00 00 00 01 00 01 00 02 00 02 00 03 00 03 00 04 00 04 00 ............7E 00 7E 00 7F 00 7F 00 となる ●DA xx yy zz 26zzyyからデータを読み込んで展開、7EA402~に書き込む 同じように1,2byte目がカウンタとなり、順次処理していく 除算 $4205 = ( 260002 + zzyy )の値 $4204 = 0x00 $4206 = xx AND 0x7F 7EA402 = 0x00 7EA403 = 0x00 7EA404 = $4214 (除算結果) xxの0x80が立っていれば以下が追加される 7EA403 = ( 260002 + zzyy )の値 ●DB xx yy 7EA200からの0x0200bytes分を、xxyyを加算しつつ2bytesずつ前にずらす 7EA400 = 7EA200 7EA200 = 7EA202の値 + xxyy てことは7EA200が表示用メモリ? ●DC xx 不明 (引数の0x03で分岐、0xF8は未確定、0x04は未使用?) X = ( xx AND 0x00FF ) >> 3 7E0D64 = ( 7E1011 + X )の値 (BG1水平スクロール値) 7EA802 = 7EA402 7EA804 = 7EA404 X = 0x0000 Y = 0x0000 以下分岐 7EA402-7EA802の値を処理して7EA200-7EA400に書き込む それぞれ違いは最初の値の求め方のみ ★xx:00 (0x03が立っていない) ※トルネード攻撃 A = 7EA406 + 7EA408 7EA402 = A XBA 7EA200 = A AND 0x00FF + 7E0D64 7EA404 = 7EA408 ★xx:01 ※トルネード竜巻 A = 7EA406 - 7EA408 7EA402 = A XBA 7EA200 = A AND 0x00FF + 7E0D64 7EA404 = 7EA408 ★それ以外 ※ショットウェイブ A = 7EA406 7EA402 = A XBA 7EA200 = A AND 0x00FF + 7E0D64 7EA404 = 7EA408 ●DD xx yy ( 260002 + yyxx )からのデータを7EAA08~にコピー 他の命令のように展開はなし ただコピーするだけ Y = 0xAA08 カウンタセット 7E0D66 = ( 260000 + yyxx )の値 7E0D67 = ( 260001 + yyxx )の値 コピー 7EAA08 = ( 260002 + yyxx )の値 /*------------------------------------------------------------*/ ■グラデーション ※下の命令から読んでください ●D5 xx yy グラデーションのフェード前カラー値指定 処理内容はCA命令と同じ 書き込み先が7EAB12なので、 フェード無しでグラデーションを即表示させたい時に使える なお、命令としては無いようだけど、 0x018A4Aからも7EAB12を変更する処理がある 多分どっかの命令で繋がるんじゃなかろーか ●CD グラデーションを1ピクセル上に移動 7EAB12の値を7EAC12にコピー 7EAC1Aの値を7EAD1Aにコピー 7EAB13からの0x0100byte分を一個前にずらす 7EAC1Bからの0x0100byte分を一個前にずらす そんだけ ●CC グラデーションのフェード処理 7EAB12から0x0100byte分のメモリをすべてインクリメントする 7EAC1Aからのメモリと照らし合わせて、同じ値ならスキップ 既存のエフェクトで指定している最大幅は大体が0x1F (E0からFF) なので、 0x20回呼んでるってわけやね ●CB グラデーションのフェード処理 (フレーム更新無し) ●C9 xx yy グラデーションのフェード前カラー値指定 こっちの命令で変更されるメモリが実際に表示に影響する パレットフェードで例えるとこっちがパレット00で、CA命令がパレット10にあたる 7E1010 = 0xE0 固定カラーを変更してから、引数yyが0x01かどうかで分岐する 基本的にカラー演算開始時は0x01, 終了時に0x00を投げる 引数yyが0x01の場合は、 7EAB12から0x0100byte分 (7EAC12まで) を引数xxで埋めて DMAでうにうにやって終わり 以下DMAとかのパラメータ 7E0C9A = 0xF4 7E0C9D = 0xF4 7E0C9B = 7EAB12 7E0C9E = 7CAB86 7E0CA0 = 0x00 $4350 = 0x40 (Parameters for DMA Transfer <0100 0000>) $4351 = 0x32 (B Address -> $2132) $4354 = 0x7E (A Address Bank) $4357 = 0x7E (Data Bank (H-DMA)) $4352 = 7E0C9A (A Address (Low Byte)) ●CA xx yy グラデーションのフェード後カラー値指定 26yyxxからデータを読み込んで展開、7EAC1A~に書き込む データの構造 括弧内は画面上での要素 0x00: カウンタ1 (グラデーションの色数) 0x01: カウンタ2 (1色あたりの縦サイズ) 0x02: 色指定データ んでカウンタ1のループ内にカウンタ2のループを仕込んでデータをコピーしていく 上手い説明ができない スコールのデータ (0x26C3D0) はこんなの 20 08 EF EE ED EC EB EA E9 E8 E7 E6 E5 E4 E3 E2 E1 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 7EAC1Aからのメモリはこうなる EF EF EF EF EF EF EF EF EE EE EE EE EE EE EE EE ED ED ED ED ED ED ED ED EC EC EC EC EC EC EC EC EB EB EB EB EB EB EB EB EA EA EA EA EA EA EA EA E9 E9 E9 E9 E9 E9 E9 E9 E8 E8 E8 E8 E8 E8 E8 E8 ...続く んでこのメモリを元に画面の上から1ピクセルごとに加減算して グラデーションの出来上がり ということ 多分 色指定はおなじみカラー演算値なので、 細かい色指定は多分出来ない (RGBCMYKで明度を変えるくらい) が、 勝利の詩で見られるように色指定範囲を目一杯使える (224色?) /*------------------------------------------------------------*/ ●62 xx yy zz 乱数生成 (最小値zzからyy個の範囲 結果はAD9E+xxに書き込まれる) 処理を簡単に書くとこんな感じ ( 7EAD9E + xx ) = ( 7EF30D << 8 + 7EF30C ) mod yy + zz パンチでの <62 1D 05 00> は AD9E + 1D = ADBB となり、武器種別を書き換えてることが確認できる 7EF30A: プレイ時間 (時) 7EF30B: プレイ時間 (分) 7EF30C: プレイ時間 (秒) 7EF30D: プレイ時間 (フレーム = 1/60秒) この命令の肝はメモリを書き換えること 画像表示位置(ADA5,ADA8)に適用してランダマイズとか ウエイトタイマ(ADB7)に適用して(ryとかができる ※超便利 ●4C xx BG2,3の初期化 引数xxが0x03かどうかで分岐する 引数が0x03の場合は7E1004、それ以外なら7E1003の値をコピー VRAM転送の前準備をしてから、4A命令の転送処理(と思われる箇所)にジャンプする コピーするメモリから推測するに、BG2orBG3の初期化? ゴゴイチ氏の解析とも合致するし多分これであってる BG2のエフェクト終了時に見かける<4C 02>が 実は形式だけの引数でしたってのがちょっと驚いた ●D1 特殊エフェクト用タイルパターン初期化 7E9600から7EA600までを0x00で埋め /*------------------------------------------------------------*/ ■メモリとレジスタ ここに書いている内容は 01cef7~ の内容に合わせて各命令をまとめたものです レジスタの説明はすすめ愛好会の説明を丸々引用してます 一部説明にタイプミスがあるような気もするけどスルーで 【補足】 1k WORD == 1024 WORD == 2048 bytes 【書式】 ●命令 書き換わるメモリ -> PPUレジスタの転送先アドレス ●37 xx 1000 = xx -> $2100 スクリーン表示設定 bit7: 表示ON/OFF(0:ON,1:OFF) bit3-0: 明るさ ●3B xx 1000 += xx 37命令参照のこと ●38 xx 1002 = xx 1040 = 1002 AND FC00 てな処理があるけど、これってモザイクに関係しなさそう? 今のとこ詳細不明 ●45 xx 1002 += xx ●3C xx yy 1033 = xxyy -> 7ECA00 パレット00の透過色を指定値に変更する? 意味分かんねぇ・・・ ●34 xx 101F = xx -> $2107 BG1アドレス/サイズ設定 bit7-2: マップアドレス(1KWORD単位) bit1-0: マップサイズ(00:32x32, 01:64x32, 10:32x64, 11:64x64) ●35 xx 1003 = xx -> $2108 BG2アドレス/サイズ設定 bit7-2: マップアドレス(1KWORD単位) bit1-0: マップサイズ(00:32x32, 01:64x32, 10:32x64, 11:64x64) ●36 xx 1004 = xx -> $2109 BG3アドレス/サイズ設定 bit7-2: マップアドレス(1KWORD単位) bit1-0: マップサイズ(00:32x32, 01:64x32, 10:32x64, 11:64x64) ●22 xx 1001 = xx -> $2105 BGモード変更 bit7: BG4のタイルサイズ(0:8x8, 1:16x16) bit6: BG3のタイルサイズ(0:8x8, 1:16x16) bit5: BG2のタイルサイズ(0:8x8, 1:16x16) bit4: BG1のタイルサイズ(0:8x8, 1:16x16) bit3: BGモード1のときのBG3の優先順位 bit2-0: BGモード選択 MODE BG数 色数   パレット数 備考 0   4  4/4/4/4 8/8/8/8 1   3  16/16/4 8/8/8 2   2  16/16  8/8 3   2  256/16  1/8 4   2  256/4  1/8 5   2  16/4   8/8     インタレース 6   1  16    8      インタレース 7   1  256   1      拡張BG(拡大縮小回転)使用可能 ●25 xx yy 1005 = xxyy -> $2123,$2124 BG1-4ウィンドウマスク設定 ※ウィンドウのIN/OUTはウィンドウの内側/外側のどちらを有効にするか決めます。 BG1,BG2ウィンドウマスク設定 bit7: BG2:ウィンドウ2有効(1:有効) bit6: BG2:ウィンドウ2IN/OUT(0:IN, 1:OUT) bit5: BG2:ウィンドウ1有効(1:有効) bit4: BG2:ウィンドウ1IN/OUT(0:IN, 1:OUT) bit3: BG1:ウィンドウ2有効(1:有効) bit2: BG1:ウィンドウ2IN/OUT(0:IN, 1:OUT) bit1: BG1:ウィンドウ1有効(1:有効) bit0: BG1:ウィンドウ1IN/OUT(0:IN, 1:OUT) BG3,BG4ウィンドウマスク設定 bit7: BG4:ウィンドウ2有効(1:有効) bit6: BG4:ウィンドウ2IN/OUT(0:IN, 1:OUT) bit5: BG4:ウィンドウ1有効(1:有効) bit4: BG4:ウィンドウ1IN/OUT(0:IN, 1:OUT) bit3: BG3:ウィンドウ2有効(1:有効) bit2: BG3:ウィンドウ2IN/OUT(0:IN, 1:OUT) bit1: BG3:ウィンドウ1有効(1:有効) bit0: BG3:ウィンドウ1IN/OUT(0:IN, 1:OUT) ●27 xx yy 1008 = xxyy -> $212A,$212B ※パラメータ設定 00: OR, 01: AND, 10: XOR, 11: XNOR BGのウィンドウ演算マスク設定 bit7-6: BG4のパラメータ設定 bit5-4: BG3のパラメータ設定 bit3-2: BG2のパラメータ設定 bit1-0: BG1のパラメータ設定 カラー,スプライトウィンドウ演算マスク設定 bit3-2: カラーウィンドウのパラメータ設定 bit1-0: スプライトウィンドウのパラメータ設定 ●28 xx yy 100A = xxyy -> $212C,$212D メイン/サブスクリーンに設定するBG,スプライトを選択 メインスクリーンに設定するBG,スプライトを選択 bit4: スプライト(1:設定) bit3: BG4(1:設定) bit2: BG3(1:設定) bit1: BG2(1:設定) bit0: BG1(1:設定) サブスクリーンに設定するBG,スプライトを選択 bit4: スプライト(1:設定) bit3: BG4(1:設定) bit2: BG3(1:設定) bit1: BG2(1:設定) bit0: BG1(1:設定) ※メイン/サブスクリーンについては以下URL http://vip.rgr.jp/sm4wiki/index.php?HDMA%C6%FE%CC%E7#g3bb16ac ●29 xx yy 100C = xxyy -> $212E,$212F ウィンドウマスク設定 ウィンドウマスク設定(メインスクリーン) bit4: スプライト(1:有効) bit3: BG4(1:有効) bit2: BG3(1:有効) bit1: BG2(1:有効) bit0: BG1(1:有効) ウィンドウマスク設定(サブスクリーン) bit4: スプライト(1:有効) bit3: BG4(1:有効) bit2: BG3(1:有効) bit1: BG2(1:有効) bit0: BG1(1:有効) ●2A xx yy 100E = xxyy -> $2130,$2131 カラー演算設定 bit7-6: メインスクリーン演算設定 bit5-4: サブスクリーン演算設定  00: すべて有効  01: ウィンドウ内のみ  10: ウィンドウ外のみ  11: すべて有効 bit1: 演算カラー選択(0:固定色($2132で設定), 1:サブスクリーンの色) bit0: ダイレクトカラー(1:有効)(モード3,4,7のみ) カラー演算式、影響スクリーン選択 bit7: カラー加算減算選択(0:加算, 1:減算) bit6: カラー演算倍率(0:そのまま, 1:1/2の色) bit5: BGカラー(1:有効) bit4: スプライト(1:有効) bit3: BG4(1:有効) bit2: BG3(1:有効) bit1: BG2(1:有効) bit0: BG1(1:有効) 例えば、乱れ雪月花で呼んでる <2A 02 84> をビットで表すと、 xx: 02 <0000 0010> yy: 84 <1000 0100> となり、  演算カラー: サブスクリーンの色  加算減算選択: 減算  影響スクリーン: BG3 という要素になる BG3の表示内容は、透過色無しの雪画像と白1色(パレットフェードで白/薄灰/灰に変化) の組み合わせなので白ベタということになる んで <28 17 13> で BG3をメインにだけ入れてるので、 メイン(白ベタ)からサブ(本来の表示内容)を減算して反転効果を得る ということだと思う ・・・都合よく解釈しすぎ感がものすごいんだけど BG2,3の半透明エフェクトも加算型の投影だと考えれば、 まぁ今よりかは理解しやすい? ●D6 x1 x2 y1 y2 1021 = x1x2 -> $2126, $2127 1023 = y1y2 -> $2128, $2129 ウィンドウ座標を指定 ウィンドウ1左座標 ウィンドウ1右座標 ウィンドウ2左座標 ウィンドウ2右座標 ウィンドウについては理解度ゼロ ●33 xx 1020 = xx -> $210B BG1,BG2キャラクタアドレス bit7-4: BG2キャラクタアドレス(4KWORD単位) bit3-0: BG1キャラクタアドレス(4KWORD単位) すずめ愛好会ではキャラクタアドレスとなっているが、 タイルデータアドレスと言ったほうが分かりやすいかも 8KB単位ってことは、 32byteで4bppの8x8チップが出来ることから128x128の画像ってことか てーことはやっぱりチップセットのアドレスってことでいいのかな ●26 xx 1007 = xx -> $2125 カラーウィンドウ,スプライトウィンドウマスク設定 bit7: Color:ウィンドウ2有効(1:有効) bit6: Color:ウィンドウ2IN/OUT(0:IN, 1:OUT) bit5: Color:ウィンドウ1有効(1:有効) bit4: Color:ウィンドウ1IN/OUT(0:IN, 1:OUT) bit3: スプライト:ウィンドウ2有効(1:有効) bit2: スプライト:ウィンドウ2IN/OUT(0:IN, 1:OUT) bit1: スプライト:ウィンドウ1有効(1:有効) bit0: スプライト:ウィンドウ1IN/OUT(0:IN, 1:OUT) ●2B xx 1010 = xx -> $2132 カラー演算固定色指定 bit7: 青 bit6: 緑 bit5: 赤 bit4-0: 色の明るさ ●31 xx 1010 += xx 2B命令参照のこと ●?? 1025 = xx -> $211A モード7設定 bit7-6: スクリーン外の描画設定  00: スクリーン外をスクリーンパタンを繰り返して埋める  10: スクリーン外をキャラクタ0で埋める  11: スクリーン外をBG色で埋める bit1: 垂直方向反転(1: 反転) bit0: 水平方向反転(1: 反転) ●?? 1027 = xx -> $211B (1度目) 1028 = xx -> $211B (2度目) 拡大縮小回転マトリクス モード7の拡大縮小回転変換の2x2マトリクスを設定します。 [0,0] = $211B, [0,1] = $211C, [1,0] = $211D, [1,1] = $211E([行,列])になります。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 値は小数部8bitの固定小数になります。 1027 -> $211B 1028 -> $211B 1029 -> $211C 102A -> $211C 102B -> $211D 102C -> $211D 102D -> $211E 102E -> $211E ●?? 102F = xx -> $211F (1度目) 1030 = xx -> $211F (2度目) 拡大縮小回転の中心X位置 拡大縮小回転の中心X位置を13bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●?? 1031 = xx -> $2120 (1度目) 1032 = xx -> $2120 (2度目) 拡大縮小回転の中心X位置 拡大縮小回転の中心Y位置 拡大縮小回転の中心Y位置を13bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●?? 1011 = xx -> $210D (1度目) 1012 = xx -> $210D (2度目) BG1水平スクロール値 BG1の水平スクロール値を11bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●?? 1013 = xx -> $210E (1度目) 1014 = xx -> $210E (2度目) BG1垂直スクロール値 BG1の垂直スクロール値を11bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●?? 1015 = xx -> $210F (1度目) 1016 = xx -> $210F (2度目) BG2水平スクロール値 BG2の水平スクロール値を11bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●?? 1017 = xx -> $2110 (1度目) 1018 = xx -> $2110 (2度目) BG2垂直スクロール値 BG2の垂直スクロール値を11bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●?? 1019 = xx -> $2111 (1度目) 101A = xx -> $2111 (2度目) BG3水平スクロール値 BG3の水平スクロール値を11bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●?? 101B = xx -> $2112 (1度目) 101C = xx -> $2112 (2度目) BG3垂直スクロール値 BG3の垂直スクロール値を11bitで指定します。 このレジスタは2度書きレジスタで、 最初に書いた値が下位8bit、次に書いた値が上位8bitになります。 ●7E1xxx 1046 -> $2115 VRAMアドレスインクリメント bit7: インクリメントタイミング(0:BYTEアクセス毎, 1:WORDアクセス毎) bit3-0: インクリメントサイズ  値  サイズ  0100 アクセス毎アドレスを+8  1000 アクセス毎アドレスを+8  1100 アクセス毎アドレスを+8  0000 アクセス毎アドレスを+1  0001 アクセス毎アドレスを+32  0010 アクセス毎アドレスを+64  0011 アクセス毎アドレスを+128 1040 -> $2116,$2117 VRAMアクセスアドレス R/Wを行うVRAMのアドレスを指定します。 1045 -> $4371 : B Address 103E -> $4372 : A Address (Low Byte) 103D -> $4374 : A Address Bank 1042 -> $4375 : Number Bytes to Transfer (Low Byte) (DMA) 103C -> $420B : Regular DMA Channel Enable 1044 -> $4370 : Parameters for DMA Transfer /*------------------------------------------------------------*/ ●4A xx yy ※引数の使われ方だけ 引数xxyyは2byteオフセットとして扱われ、 特殊エフェクト用に変換されたタイルパターンデータが ( 7E9600 + yyxx ) のアドレスを起点にして書き込まれる 7E0D64: 引数xxyy 7E0D69: ( フラグ2 << 1 ) AND 0x3C ※スプライト用のパレット指定は無視 7E0D7E: 特殊エフェクト用タイルパターンサイズ 7E0D7C: 通常タイルパターンサイズ 7E9600~ タイルパターンを特殊エフェクト用に変換して格納? ●CF xx yy 4A命令と似た内容 モード7用の4A命令・・・かな ●AA xx 引数で分岐して個別処理を実行する 7E0D64 = ( 0x0165AF + ( 引数yyxx AND 0x00FC ) >> 1 ) のアドレスの値 A = ( 引数yyxx AND 0x0003 ) << 1 + 7E0D64の値 7E11B0 = ( 0x010000 + A ) のアドレスの値 んで7E11B0 のアドレスにジャンプ 【説明】 まず、0x0165AFからのデータはこうなっている 4566 E366 5967 A567 3C68 8168 EF69 0D6A 256A A26A 8C6D B76D 556E 036F 9770 446F 2170 D670 C171 0072 8572 4D73 DE73 3E74 0575 4A75 D675 4176 6676 C977 5F78 637A 067B 477C E87C 1F7D 6B7D 887D 997D 297E 8B7E BA7E 3A7F C37F 7480 CE80 1981 8881 C181 1E82 C182 FA82 0E83 2B83 5A83 7783 A583 EB83 4585 FC85 2A86 9C86 DE86 F086 これを2byte区切りのオフセットとして扱って、 引数xxが 00〜03 なら最初の <4566>、04〜07 なら2個目の というオフセットが最初に参照される このオフセットの先には更に4つのオフセットが並んでいて(*1)、 どれを参照するかは引数xxの下位2bitで指定する 引数xxが 01 の場合だと、 最初に参照するオフセットが <4566> で、 0x016645 からのデータは <4B66 5166 D166...> となっている 下位2bitが 01 なので、2byte目からの <5166> が処理オフセットとなり、 0x016655から処理を実行する エフェクトから使用する分には参照がどーたらってのは関係無いので、 引数ごとに違う命令内容になるって認識でOKだけど、 正直なところ数が多すぎて今後解析されるかってゆーとまず無いかと (*1) 0x016645からして3つしか並んでないわけだが! もしかしたら使えない引数があるか、なんかミスリードしてるかも ●AB xx yy AA命令と同じだがこちらは0x01662Bからのオフセットを参照する これで倍率ドンの個別処理があることになるんですねー気が遠くなりますねー ふと思ったけど、xxで命令分岐でyyが引数ってことかな? /*------------------------------------------------------------*/ ●95 1038 = 1038 OR 0x04 ●9C xx yy zz [条件xxが真ならyyzzにジャンプ] 条件xx 00:対象が2人なら 01:対象が3人なら 03:技始動で前に移動しない戦闘(術戦車等) 05:対象がパンチで左右反転しない(アルジャーノン等) (上記4つは2-658氏が解析済み) 02:1038の0x04が立っていれば ●B4 1038 = 1038 AND 0xFC ●B5 1038 = 1038 AND 0xFC OR 0x01 ●B6 1038 = 1038 AND 0xFC OR 0x02 ●63,65,66,67 1038の0x08が立っていない場合のみ効果音を鳴らす さっぱり掴めん ゴゴイチ氏の解析通り、B5,B6でフラグ立ててB4で戻すって事くらい? 1038自体は結構多岐に使われてる感じ スプライトレイヤーの固定は確定 /*------------------------------------------------------------*/ ■戦闘中のパレット調査 ※ゴゴイチ氏のメモ等と同じことを書いたりしてますが  思考整理の意味も兼ねてますんでご了承ください 戦闘中はBGモード1 (BG数3で BG1:16色*8, BG2:16色*8, BG3:4色*8) スプライトはモードに関係なく128個表示でき、 16色のパレットを8個まで指定可能 スプライトの指定はレジスタ0x2104を介して行い、 その際パレット番号は3ビットで指定する ※何故$2104を介して〜と書いたのか今になってわからんようになってしまった  多分ウソこいてる 実際に描画時に割り当てられるパレットデータはCGRAMに格納されていて、 CGRAMの容量は0x0200バイト=256色が限界 描画に関係しないパレット 7E0A40: パレット10 パレットフェードなどの内部演算用 7E0A60: バックアップパレット00 7E0A80: バックアップパレット01 7E0AA0: バックアップパレット02 7E0AC0: バックアップパレット03 7E0AE0: バックアップパレット04 7E0B00: バックアップパレット05 7E0B20: バックアップパレット06 7E0B40: バックアップパレット07 7E0B60: バックアップパレット08 7E0B80: バックアップパレット09 7E0BA0: バックアップパレット0A 7E0BC0: バックアップパレット0B 7E0BE0: バックアップパレット0C 7E0C00: バックアップパレット0D 7E0C20: バックアップパレット0E 7E0C40: バックアップパレット0F 描画に関係するパレット 7ECA00: パレット00 戦闘メニューウインドウ用 (4色×4) 7ECA20: パレット01 地相グラフィック用 (8色×2) 7ECA40: パレット02 (背景1) 7ECA60: パレット03 (背景2) 7ECA80: パレット04 (背景3) 7ECAA0: パレット05 (敵1) 7ECAC0: パレット06 (敵2) 7ECAE0: パレット07 (敵3) 7ECB00: パレット08 (味方1) ※武器パレットとしても使用 7ECB20: パレット09 (味方2) 7ECB40: パレット0A (味方3) 7ECB60: パレット0B (味方4) 7ECB80: パレット0C (味方5) 7ECBA0: パレット0D (敵1) 7ECBC0: パレット0E (敵2) 7ECBE0: パレット0F (敵3) ※パレット00,01はエフェクト中は空き 描画に関係するパレット (CGRAMに転送されるデータ?) のうち、 00-07までがBG1-3用、08-0Fまでがスプライト用 (多分 エフェクト開始時 (B7時) 、 スプライトに指定できるパレットは 味方5人分と敵3種の8個=すでに空きなし B8を呼ぶことで敵3種がBG2(05-07)に移動し、3つの空き(0D-0F)ができる パレット0D,0Fはエフェクト命令から見た場合の80,81として利用可能 武器画像読み込みの16色変換時に細工して パレット0D,0Fの後ろ8色を使うようにしてやればB8時限定で個別化は可能 (51命令参照) パレット0Eは敵の色変更で使用される (A3命令参照) キャラ専用技ならなんとか可能 例えばアルカイザーならキャラパレットの5,6色目を青系統にしといて レイブレードのグラフィックを1-6色目を使うように+拡張命令で4色目を青に変更 あとは拡張命令で自身のパレットを参照するようにすれば、白,枠,青系統3色の5色が使える ●3E xx yy/3F xx yy/40 xx yy パレット読み込み まず読み込み元のアドレスとデータサイズ(ループ回数)の指定をしてから 共通の処理にジャンプ、xx:10の場合は別分岐になり、xx:8xの場合のみ別処理が入る ★xx=10 そのままパレット10にデータを書き込む ★xx=80以上 ( xx AND 0x03 + 7E11BA )のアドレスの値 + 0x08 の結果で書き込み先のパレット番号を出す 7E11BA,7E11BBはB8命令でそれぞれ0x05,0x07にセットされるため xx:80の場合は0D, xx:81の場合は0Fとなる ★xx=80未満 xxがそのままパレット番号になる ●A2,A4 正直全然分かりません とりあえず引数にパレット番号を指定するってのが分かる程度 ●A3 xx 色変更用のパレット読み込み xxは16色パレット読み込み命令の引数yyに相当 ★xx:0xFF (術詠唱限定) エフェクトに参加しているキャラ全員のパレットを武器種に合わせて上書きする 武器種が0x80未満ならそのキャラはスキップ どのパレットデータを読み込むかは ( 武器種 AND 0x7F + 0x08 ) で求められる ★xx:0x00 無効 ※以下の分岐処理は対象となるキャラ全員にそれぞれ実行される 改めて見ると処理無効の分岐と敵味方の区別に分かれてるだけ ★7E0F1Eの0x01が立っている ★7E0F1Fの0x04が立っている ★7E0F28の0x80が立っている 処理をスキップ ミスフラグ、耐性フラグ、無効化フラグってとこ? ★対象キャラが敵の場合 7E1092の0x30が立っていれば、 引数xxのパレットデータをパレット0Eに読み込む ※割り当ての変更らしき処理は無い ★対象キャラが味方の場合 引数xxのパレットデータを対象キャラのパレットに読み込む 上書きされるデータは12色分で、前4色は変更されない ●A5 パレットをバックアップ パレット00-0Fをバックアップパレットにコピーする ●A6 バックアップからパレットを戻す バックアップパレットをパレット00-0Fに戻す A5,A6共に処理の流れは全く同じで 0x0200バイト分(パレット全部)のコピーを行う ●43 xx yy バックアップパレットyyをパレットxxに戻す コピー元: yy << 5 + 0x0A60 コピー先: xx << 5 + 0xCA00 (xx=10の場合は0x0A40で固定) ●51 xx yy 8色画像読み込み 7E0D66 = 引数yy + 0x40 (4色画像も含めたグラフィックオフセットのID) 7E1040 = 引数xx << 9 + 0x4000 (引数xx*0x0200+0x4000) 53命令だと 引数xx << 8 + 0x2100 (引数xx*0x0100+0x2100) 7E103E = 0x9600 転送元アドレス 7E1042 = 0x0400 転送サイズ 7E103D = 0x7E 転送元バンク 7E0D64 = 0x00 VRAM転送用の準備をして、 X = 7E0D66 * 0x03 7E1047 = 0x228000 + X 7E1049 = 0x228002 + X オフセットを持ってきて 7E0D69 = 0x0018 タイル1個のサイズ? 7E0D68 = 0x20 多分ループカウンタ (8x8タイルx32個) の後に圧縮を解除して7E9600-7E99FFに書き込みとか 最後ごにょごにょしてVRAM転送くさい処理して終わり --- 8色画像はすべて16色に変換される (4色画像はBG3での表示専用で変換は無し) ※4色画像でも8色として読み込んだ場合は変換される 変換と言っても結果だけ見れば単に00を8バイト追加してるだけ 前8色指定を後8色指定に変えて パレット読み込み命令を追加してやれば使える色が増える 具体的には8x8タイル1個のデータが 0000 0000 0000 0000 0003 030C 0E11 000E 0000 0000 0000 0000 0000 0000 0000 0000 こうなってるところを 0000 0000 0000 0000 0003 030C 0E11 000E 0000 0000 0000 0000 0003 000F 001F 000E こうしてやる 処理的にはこんな感じ (数字は32バイト中の何バイト目かを表す) 11 = 00 OR 01 OR 10 13 = 02 OR 03 OR 12 15 = 04 OR 05 OR 14 17 = 06 OR 07 OR 16 19 = 08 OR 09 OR 18 1B = 0A OR 0B OR 1A 1D = 0C OR 0D OR 1C 1F = 0E OR 0F OR 1E 8色パレットを2つ増やすのも手だし (単純に2つ増えるってわけでは無いけど) 16色画像の読み込み命令を追加してエフェクト用に使うのもアリ 処理内容見る限り問題ない ●60 xx 画像の左右反転フラグをセット 7EADA1 AND 0xBF OR xx 素直に使うなら引数は 0x00 か 0x40 のどちらか 他のフラグも立てることだけはできるので使いようによってはなんとか 5C命令も同じ仕様 ●41 xx 画像パレット指定 引数を左シフトして、 キャリーが立っている(=引数が0x80以上)場合のみさらに OR 0x01 して、 演算結果をフラグ2の下位4ビットに代入する ちょっと解釈を間違っていたので訂正 味方5人分のパレットを武器用としてどう扱っているかはこんな感じ 7ECB00: パレット08 (味方1) -> 剣類 7ECB20: パレット09 (味方2) -> 軌跡 and 氷の剣 7ECB40: パレット0A (味方3) -> 斧 and 棍棒 7ECB60: パレット0B (味方4) -> 盾 7ECB80: パレット0C (味方5) -> 槍 7ECBA0: パレット0D (敵1)  -> 80 7ECBC0: パレット0E (敵2)  -> 色変更用 (82としても使えるかは未調査) 7ECBE0: パレット0F (敵3)  -> 81 41命令の引数またはフラグ2のパレット番号をどの値にするとどのパレットが使われるか というのをまとめると 引数  Flg2    使用パレット  00 or 00  ->  08  01 or 02  ->  09  02 or 04  ->  0A  03 or 06  ->  0B  04 or 08  ->  0C  80 or 01  ->  0D  81 or 03  ->  0F  82 or 05  ->  0E // ここは推測 となる 以前パレット番号の内訳云々を書いてたけど 内訳が分かったところで意味はあんまり無い 上記のまとめがあればまず困らないかと ●42 武器パレット初期化 キャラパレットの使用不可色等を上書きする命令 以下のメモリが指定値に書き換わる 7ECB06: 02B7 (黄) 7ECB26: 52D6 (灰) 7ECB46: 1195 (茶) 7ECB66: 68C0 (青) 7ECB86: 001F (赤) ついでにキャラ全員の2,3色目もリセットされる ●B2 武器の種類に応じた画像パレットを設定 そのまんまの意味 武器の種類に応じた値をフラグ2の0x0Fビットに上書き 剣類    : 0x00 刀・氷の剣 : 0x02 斧・棍棒  : 0x04 槍     : 0x08 ●AC xx 103A XOR xx