2018年5月24日木曜日

沙羅曼蛇2を2周目BGMでスタートするパッチ

なんとなく沙羅曼蛇2のサウンドCPU側のコードを眺めてました。ホストからのコマンド、初期化の手順、全体的なデータのレイアウトくらいはわかったので少しメモ。たぶん他のSystem GXも同じ系譜なんじゃないかと(ヤッホー!軽く見てみたけど、ほぼほぼ同じだった。未使用曲は等に目新しいモノはなくMagical Melodyだけだった)

ホストからのコマンド

K056800を経由して8-bits x 4のデータを受け取ります。割り込みあがったらデータを呼んでコマンドを解釈。最初のバイトが0xF0以上の時は初期化やメモリチェック、サウンドチェック用の曲の再生など、特殊な要求がアサインされてます。それ以外の場合、最初のバイトに曲番号、2バイト目にバンク番号を指定して演奏開始。BGMはバンク1に、SEはバンク2から6にアサインされてました(ただし沙羅曼蛇2だと4〜6は同一)。

特殊コマンドはディスパッチするとこまでは追いかけたけど個別の処理は全部は追ってませんが、わかりやすいのだと0xF0が基板のテストモードから入れるSOUND SCALE CHECK。内部的に[0x0E, 0x01, 0x00, 0x00]のコマンドに置き換えられてテスト用のシーケンスが再生されます。0xF9はワークエリアの初期化、0xFEは起動時のROM RAM CHECKで7C/S、9C/S(沙羅曼蛇2の場合)のチェックの実体です。本格的にサウンドプログラムにパッチあてる場合には、このコマンドが成功するように修正する必要がある。

データ構造

0x000067e4 から 4Bytes x 8 x 2のアドレステーブルがあります。前半の4Bytes x 8が1周目、後半の4Bytes x 8が2周目のBGM/SE情報で、それぞれがバンク0〜7に対応する情報を格納する構造体のアドレスです。

各バンクの情報を格納する構造体は、単純に楽曲情報ヘッダのアドレスの配列です。1周目のBGM用バンク1の場合

.dc.b $00,$00,$6a,$fc ; SILVER WINGS AGAIN (STAGE 1)
.dc.b $00,$00,$6b,$08 ; SENSATION (STAGE 2)
.dc.b $00,$00,$6b,$14 ; ALL IS VANITY (STAGE 3)
.dc.b $00,$00,$6b,$20 ; SERIOUS! SERIOUS! SERIOUS (STAGE 4)
.dc.b $00,$00,$6b,$2c ; SPEED (STAGE 5)
.dc.b $00,$00,$6b,$38 ; DEAR BLUE (STAGE 6)
.dc.b $00,$00,$6b,$44 ; DEAR BLUE (STAGE 6)
.dc.b $00,$00,$6c,$16 ; DEAR BLUE (STAGE 6)
.dc.b $00,$00,$6c,$28 ; THEME OF THE LIVING BODY BOSS (3, 5 STAGE BOSS)
.dc.b $00,$00,$6b,$c8 ; WHAT'S YOUR NAME (NAMING)
.dc.b $00,$00,$6b,$98 ; AND THEN ...... (GAME OVER)
.dc.b $00,$00,$6b,$a4 ; A THEME OF THE SALAMANDER2 (TITLE)
.dc.b $00,$00,$6b,$b0 ; BEGINING FROM THE ENDLESS (ENDING)
.dc.b $00,$00,$6b,$f8 ; SOUND SCALE CHECK
.dc.b $00,$00,$6b,$5c ; THEME OF THE MECHANICAL BOSS (2, 4, 6 STAGE BOSS)
.dc.b $00,$00,$6b,$68 ; THEME OF THE LIVING BODY BOSS (3, 5 STAGE BOSS)
.dc.b $00,$00,$6b,$c8 ; WHAT'S YOUR NAME (NAMING)
.dc.b $00,$00,$6b,$50 ; NO FUTURE
.dc.b $00,$00,$6b,$74 ; PRELUDE OF THE LAST BATTLE (LAST STAGE)
.dc.b $00,$00,$6c,$04 ; THEME OF THE GOREM (STAGE 1 BOSS)
.dc.b $00,$00,$6b,$d4 ; THEME OF THE GOREM (STAGE 1 BOSS)
.dc.b $00,$00,$6b,$80 ; GIGA'S RAGE (LAST BOSS)
.dc.b $00,$00,$6b,$bc ; ENDING - AM SHOW VER.
.dc.b $00,$00,$6b,$e0 ; NERVOUS BREAKDOWN
.dc.b $00,$00,$6b,$ec ; FIRE TRIPPER
.dc.b $ff,$ff,$ff,$ff ; [n/a]
.dc.b $ff,$ff,$ff,$ff ; [n/a]
.dc.b $00,$00,$00,$00 ; [null]

こんな順に並んでました。ホストからのコマンドで最初のバイトで指定する順です。CD等に収録されてる未収録曲もばっちりアサインされてます(が、YOU TAKAMINE版のThunderboltは見つからず)。2周目用テーブルでは1面、4面、5面の箇所に別アドレスが入っており、POWER OF ANGER、LAST EXIT、PLANET PATISを指してます。同じ曲が複数入っているのは使い分けよくわかってないんだけど、曲番号に応じて特殊な初期化が走るコードを見かけたので、たぶん状況によって曲がうまく切り替わらない時があって、その時はワークアラウンド的に強制初期化+再生が無理やり走るような仕組みになってる気がする。

各楽曲情報を示すアドレスは、12Bytesだったかの構造体になっていて、なんらかのフラグ情報とシーケンスデータのアドレスを含んでる模様。この先はまだ調べてないけど、シーケンスデータもそのうち調べたい、というか沙羅曼蛇2音源で好き勝手演奏させたい(その後の調査でだいたい理解できた。基本演奏と音色、LFO、パンくらいは好き勝手できるようになったので簡単な曲くらいは作れそう)

ワークエリア

RAMの先頭(0x00100000)からいきなりチャンネルごとのワークが並んでいるっぽい。各チャンネル512Bytesで16チャンネル分。詳細はシーケンスフォーマットの調査と合わせていずれ。

1周目と2周目のBGMを入れ替えるパッチ

一番最初のテーブルで入れ替えちゃうのが楽です。7CのROMに対して以下の2Bytesを書き換えればOK。

0x000033f5 : 0xc4 => 0x54
0x00003405 : 0x54 => 0xc4

この入れ替えだったら起動時のチェックも素通りできます。

一応、mame用のcheatも紹介しておくとこんな感じ。
<mamecheat version="1">
  <cheat desc="Loop 1 BGM">
    <parameter>
      <item value="0xc4">Loop 1</item>
      <item value="0x54">Loop 2</item>
    </parameter>
    <script state="run">
      <action>soundcpu.rb@67EB=param</action>
    </script>
  </cheat>
</mamecheat>

2018年5月3日木曜日

ジャンク遊び - naomi編

ジャンクでDIMMボードとnaomi2を入手したので少しメモ。

DIMMボード

ERROR 22が出るというボードを入手。元々PC133 256MBが1枚載ったDIMMボードを持っていたので、故障ボードからDIMMだけ抜いて2枚刺しで512MBに……と思っていたんだけど、ばらしてみたらPC100 128MB x2だったので野望はついえた(笑)。ただ、バッテリーは生きてたので今まで使ってた方に移植。

あと、実際に我が家のnaomiで起動した際にはそもそもボードを刺すと本体が起動しなくなる、という症状でした。これ、実は単純にコネクタの接触不良って事が多いみたいで、今回もばらしてみたら内部の2層基板を繋いでるコネクタが抜けかかっており、そこを刺し直したら普通に認識されました。

naomi2

いわゆる動作未確認ジャンク。ジャンクを買ったら動作しなかったので転売します、の意味のヤフオクスラングだと思ってる。

今回のnaomi2も試したら画面信号も確認できず真っ暗のまま。さっそく分解してみたら……
バックパネルのコネクタ周辺になんか焦げてるパタンが……。反対側のコネクタのハンダ面を見たら、足が曲がって隣のピンと接触すれすれになってた。おそらく最初に手放したオーナーがショートさせたんだろうな。曲がってた足はペンチで治して調査続行。焦げてるパタンの前後をテスターで調べてみたら、やっぱり断線。接続先はVGAコネクタのGND。そりゃ何も表示されないわな。という事で「安心しろ、傷は浅い」と周辺にたくさんあるGNDピンと接続。幸いにしてバックパネルは初代naomiと共通のようだったので、初代もばらして修理したバックパネルが動作する事は確認できました。

で、これで治れば御の字だったんですが、そうは問屋が降ろさず……。結局またもやチップの接触不良。ファンの載ってないヒートシンクだけの石が2つあるんですが、それを押さえてると綺麗に起動してくれる。ちょっと力加減が悪いと画面にクロスハッチ状のマスクがかかったり、スローモーションになったり、とイマイチご機嫌ななめ。力で基板が歪む事もあり、実際にどのチップのどのあたりの足に問題があるのかまでは特定困難でした。しかもBGAなんですよね……素人がリワークやったところで不具合再発は時間の問題。わざわざ修理する価値があるかは微妙なところですね。

まぁ、naomi2が動いても追加で遊べるのバーチャ4くらいだし。どちらかと言えばDIMMボードと色が揃ったケースが欲しかっただけって感じでもあるので。まぁ、いいかなー、とか。

2018年5月1日火曜日

続・【修理】System GX【4枚目】

昨日のブログの後、忘れないうちにと問題箇所の恒久的な処置をしました。とりあえずダメ元で問題のviaにハンダを流し込んでみる。するとアドレス線とコネクタは無事に電気通るようになったので、残るラダー抵抗までの配線を線材使ってパッチする事にしました。
こんな感じで、傷は浅い!外観を損なわない修理で済んでよかったー。日本ではあまり基板修理ログブックみたいなのは見かけないんだけど、海外にはあるとこにはあって(笑)以前読んだ記事にやっぱりviaの接続不良ってケースがあったので発見の時はヒントになりました。

で、この時点で試しに電源入れたら……



サウンドROM刺しても無事に起動。チェックも全部通りましたが、その後にだんまり。流石に何も思いつかなかったので、この日はそのまま作業終了。

そして翌日。ひとまずメインCPUからのチェックは通ってるので、サウンドCPU側のバスが化けててサウンドCPUが暴走〜ってあたりを想定してサウンドROMの足にロジアナ仕込もうと思ってたんですが……念の為、だんまりの後にチップを叩いて回ってみたらセキュリティチップを叩くとワーニングメッセージに進むことが判明。という事で、セキュリティチップのコマンド完了割り込み待ちで固まってる線で再調査。



重りを載せてる間は動くけど、外すと固まったりリセットかかったり。割り込み線が浮いててノイズで予期しない割り込みが出てリセットしてるとかかな?
この子。下側の右端の方が浮いてたみたい。昨日、清掃・リフローした箇所が左下だったりするので、その時に反対側を浮かせてしまった可能性も(笑)

でもまぁ、このチップ、サブボード交換の時に歪みやすい箇所に載ってるんだよね。頻繁に抜き差ししてるとこの足が浮くって故障はそれなりに多いんじゃないかなぁ。

その後、問題の箇所を再リフローする事で、重りとかなしで安定動作するようになりました。重い調査作業を想定してたけど、ものの5分で原因特定、作業自体も30分かからずに終了しました。

【修理】System GX【4枚目】

ジャンクの沙羅曼蛇2とセットでお安く入手。たまにしか起動せず、起動してもキャラ化けが酷いとの事で、まぁ起動するなら大怪我ではあるまい、と踏んで甘くみておりました。とりあえず手元で試した限りでは画面まっくらで何も表示されません。というか同期信号すら出てきてない。という事で王道に従いmameのソース(konamigx.cpp)見つつ修理。まだ未解決だけど、とりあえずログ。コメント歓迎。

最初に疑ったのがソケットに刺さったサウンドプログラム用EEPROM。9cのほうに変な力がかかって斜めによれて全部の足が曲がってた。これならいいなー、と思って直してみたけど世の中そんなに甘くなかった。あとソケットのROMは念の為読んでみて既知のCRC/SHA1と一致する事は確認した。

次に疑ったのがカスタムのセキュリティチップ。これが死んでたら or 壊したら、もう直せないやつ(笑)。いっきにハードになった。
写真左上のピン5本くらいが、若干錆びて相互に接触してる雰囲気を醸し出してるんですよね。この子はDMAでスプライトの並び替えとかまでやらかすので、足がショートしてたらキャラ化けとか確かにありそう。という事で、ループで眺めながらピンセットで足元の掃除。最後に最近使い始めたヒートガン的なもので軽くハンダを溶かして再固定。テスターで周辺のピンとの接続、隣接ピンがショートしてない事を確認。

……でも変化なし……

で、とりあえずプログラムROMの足をロジアナで調べて、どこで止まってるか見てみようと思ったら……アドレス線が0に張り付いたまま動かない。どうもメインCPUが起きてきてない模様。サブボードからそんな事できるんだ……セキュリティチップかサウンドCPUが初期化後にリセット解除するのかなぁ……的な想像だけど不明。でも、ダメ元でサウンドプログラムROMを引っこ抜いて起動を試みる。
やった!ちなみに沙羅曼蛇2は画面信号が出てROMチェックが始まるまでに5秒弱かかり、他のサブボードと比べるとかなり遅め。この画面をじっと見つめると、文字コードに0x08がORされてる事がわかる。一行目がROM RAM CHECKなので、RがZ、AがIとか対応はすぐわかるはず。

これが元所有者の言うキャラ化けだとしたら、スプライト(セキュリティチップ)は問題なさそう。おそらくタイルを読み出すアドレス線が上位のほうで浮いてるんだろうと推測して、プルダウン抵抗片手に17h、15h、13cの足を調べてみる。と、17h、15hの3番ピン、13cの4番ピンを落とすとZがRに戻った(文字コードに0xF7でANDとってる事になるので、別の文字が一部化ける事になるけど問題なし)。ピン配列同じはずのROMのうち、13cだけピンが違うのは、おそらく他のが16-bitsでこいつだけ8-bitsで使ってるから。

でこのピンから出てる配線を追って裏面、表面といったりきたりしたら、何もないつきあたりで線が途絶えてた。
下のラダー抵抗の上に(DH)って文字があると思うけど、その「(」と「D」の間の部分。汚れを削ったら下からviaらしき穴が……。なんかラダー抵抗も汚れてるし、この部分になんらかのダメージがあった可能性が高いなー。本来、この行き止まりの配線はvia越しにラダー抵抗に繋がって、その先で(DH)の文字上部裏側にあるコネクタに接続されていた模様。ピン的には「(」のすぐ上の部品面からは配線されていないピンがそれ。
という事で、ひとまずコネクタとEEPROMの足をショートさせてみる。うまくいくようなら、後でハンダ付け配線。
やった!キャラ化けに関しては解決!後半のBADはサウンドのROMを抜いてるせいですね。サウンドROMは刺すとやっぱりメインCPUが起きてこないので、まだ別箇所に似たような問題があると推測。ひとまず疲れたので記録だけとって次号にコンティニュー。