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が起きてこないので、まだ別箇所に似たような問題があると推測。ひとまず疲れたので記録だけとって次号にコンティニュー。

2018年4月28日土曜日

4月までのゲームまとめ

またサボりがちだったので、連休前にまとめ。

原始島2(AC - MVS)

という事で、唯一クリアに至ったゲーム(汗。20連入れてる。

ツインビーヤッホー!(AC - System GX)


こんな感じではじめたけど、今一番力入れてます。Bボタンに20連入れて、ボタンは分けずにAボタンで溜めオプションと併用するスタイル。ランク調整のためにミカエルは1つ目逃して2つ目からとってる……けど、滅多に4面まで持ち越せないので、あまり取る意味ないかも。
だいたいいつもクリアまで3コインかなぁ。けど、
こんな感じでボチボチ。エース再戦も瞬殺できるようになったし、5ボス、6中ボスは完全に見きったと思う。ときめきレーザーも避けられるようになったのでワンコインクリアも見えてきた感じ。

ガレッガ(Xbox One)

魔法大作戦もクリアしたし、と戻ってきたけど、ようやく去年のとこまで調子が戻ったって感じかな。箱版でハイスコア更新した。箱は人少ないんで世界ランク12位とかだった記憶w我こそは!って人は箱版も買ってランクインするのだ!
ってな感じで、まだ6面で苦しんでます。ツインビーに次いで遊んでる感じ。まぁ、ツインビーは勲章取る訓練なので(とか

式神の城II(AC - naomi)

ゆかりん出てるしって事ではじめてみたけど、まだやり込んでない。3-2ボスで撃沈。15kHzばかりやってると、たまに見る31kHzは綺麗(笑)。

赤い刀 真(Xbox360)

って事でその後も少しやってみたけど、まだ5面のまま。これは少しやればいけそうな気もするし、最終面まではすぐ行けて、そこからが時間かかるパターンのような気もする。僕くらいの初心者レベルだと楽しみつつ訓練できる丁度よい難易度かも。


真はアーケードから元々なのかもしれないけど、ケイブ直々(時に開発M2だったりもするけど)の360移植はどれも高解像度化されてて嬉しい。ここ重要。m2stgのケツイにも期待。

ストライカーズ1945PLUS(AC - MVS)

弾の速いのが苦手なので(雷電とかほぼ1面で死ぬし)、少し彩京シューの練習を……という事で、中でも弾の遅い1945PLUSを手始めにやってたんですが、あまり上達せず。


5面ボスで撃沈ですねー。わりと好きになってきたんですが、まだ先は長い。

という事で、もっと集中せにゃ駄目ですな。

2018年3月23日金曜日

基板修理

MV-1AGX以外にも修理関係の話があったので、それも記録に。

まず1つ目は修理とは少し違うけど、画面がモノクロになっちゃう問題を調べた話。
これ、基板側を色々調べたわりには結局は相性問題の一種だった。間に別の機器を挟むことで似たような問題を回避してる人もいるみたい。この並列に抵抗を挟む解決方法はかなり雑かつノイズも乗りやすいので、真面目に対処したい人は分圧なりの回路を挟むほうが良いかと。基板にあまり手を入れたくなかったのでこういう対処になったんだけど、考えたらハーネスにSYNCのボリューム回路でも挟んでおけば万全だったのかもしれず。RGBはS端子に変換するとこで個別のボリューム付いてたんだけどSYNCはなかったので。

もう1件は起動最初の画面で固まっちゃう基板。もともとこの事は明記されてたジャンクで、基板には液漏れの跡があり、一部のコンデンサの足がやや腐食気味。1つだけ完全に腐ってて、電解ではないんだけど容量抜けの状態って言って良いのかな?セラミックなんだけど、ほぼ足しか残ってないような状態で。このコンデンサ取り替えれば生き返るかなぁ、というのが最初の目論見だったんだけど、見事に外れて。
その後、こんな感じでエミュレータで動作確認してみたりとか。まぁ、サポート追加と言っても共通のベースボード使ってるタイトルがあったので、タイトル追加してサブボード部分のコードを追加したくらい。ほんの30分くらいのハックで起動してます。

で、起動してみてわかったのが起動時には日時が表示されていて、実機ではその直前に固まってるようにみえる。なので、とりあえずRTCとして使われてるM6242Bのクロックをエミュレーション上で止めてみたところ同じところで固まった。という事で、基板ではM6242Bのすぐ横にあった32.768kHzのクリスタル、少し変色してたので交換してみたところ、すんなり起動しました。


外したクリスタル。宇宙人じゃないよ、うじゃじゃ。

これで今のところ直せてないのはOBJ RAMが死んでるヴァンパイアハンターのみ。

2018年3月22日木曜日

うちのアーケード基板用コントローラの話

公私共に忙しくなってきて、ちょっと暫くはアップデートできそうにないので。この辺りで一度整理しておこうかと。ウェブで色々公開している人達は仕上げも凄い綺麗なんだけど、僕はそっち方面にはズボラなのでご容赦。ものすごーく雑です。

まず、コントローラの基本的な部分。


Xbox360向けのコントローラを安く入手して改造してあります。この辺りの詳しい解析結果なんかはQiitaの記事Xbox360のコントローラをばらして*Piに繋げるにまとめてあります。


で、裏面を見るとこの通り。電源刺すと単体でHDMI出力できて、そのままゲームが遊べたりする(笑)。X68000のエミュレータが動くので超連射68kとか結構快適。実体はRetrOrangePi / OrangePi ONEですが、追加で色々とドライバが突っ込んであります。この辺りはGitHubでopipadとして公開しているもの。GPIOに繋いだコントローラがそのままjoystickに見えたり、モードを切り替えるとキーボードエミュレーションしてくれたり。あと、ドライバ自体に連射サポート機能がついてます。Xboxボタン押しながら各ボタンを押すと連射ON/OFFみたいな感じで。連射が入ってるボタンはLEDでわかったりします。ドナーの機能をフル活用してる!またUSBでPCに繋げる事でUSBコントローラとしても認識されるようになってます。


でまぁ、我が家の場合、JAMMA用電源側にUSBコントローラ挿せるようにしちゃってたんで、そっちにUSBで挿せばそのまま使えはしたんですが。JVSに繋げる時に直接あった方が便利かなーってのと、電源側には1Pしか刺せなかったので。2P側として挟めると便利かなーとか思って。いつもボッチで遊んでるけど!でも2P側で入ったほうが簡単なシューティングってそこそこあるし。って事でJAMMAコネクタ用のブリッジが2種類ついてます。

ここはちょっと配線……ってわけにはいかなくて、Orange PiのGPIO側と共通で繋がっているためにちょっと面倒な事に。整流なりしときゃよかったんですが直結しちゃってるんで、Orange Piの電源が入ってないとGND側に1kΩくらいで吸い込まれる。なので、わりとで電気もったいないなーって思うくらいの値でpull-upしてあげる必要がありました。忘れないうちに……って書いてるのにもう忘れてる!たぶん100とか200Ωくらい。でもまぁ、このおかげで、ほとんどのケースはこのコントローラで用が足りちゃってます。


あと使ってるうちにどうしても欲しくなって付けちゃったもう1つの便利回路がコレ。連射装置+α。高橋くんと命名してGitHubに公開してあります。ATMEGA-88があれば作れるので数百円くらい。主に3つ機能があって、

  • ボタン1〜4の連射
  • 4ボタン・6ボタン配置の変更
  • 2ボタン時に連射ボタンを別割り当て
という。あまり融通は利かないんですが、よくあるユースケースはカバーしてる感じの機能になってます。まぁ、完全に自分の好みに合わせて作ってますね。

連射については速度切替がついていて毎秒10/15/20/30連射の切り替えが可能。

4ボタン・6ボタン配置の変更ってのは分かりにくいんですが……コントローラのボタン配置って

         (X)    (Y)
   (B)
        (L)    (R)
  (A)
みたいになってて。これを通常は
         (3)    (4)
   (2)
        (5)    (6)
  (1)
この配置で使ってる。これだとNEOGEO系の4ボタンで遊びやすいし、シューティングで2ボタン、3ボタンでもこっちの配置の方が手の形に馴染む。

で、6ボタンモードをONにすると
         (2)    (3)
   (1)
        (5)    (6)
  (4)
こっちの配置に切り替わる。CPS2で6ボタンのゲームやろうと思うとこっちの配置でないと辛い。Atomiswave系で使いやすいのはケースバイケースかなぁ……5ボタンはほとんどやり込んでなかったので特に好みはないし、BAXLYみたいな配置だと今の作りじゃ実現できない。そもそもその時期ゲーセン行ってないので、本物がどう配置されてたのか知らない。

で、これらの機能とは独立して2x2ボタンモードってのがあって。このモードをONにすると、ボタン3/4の入力がボタン1/2にも反映される。利用方法としては2ボタンで手連射が必要なシューティング対策。2x2ボタンモードONでボタン3の連射をONにすれば、ボタン3が連射付きボタン1として機能する。作戦名ラグナロクとかGダライアスVer.1向けにどうしても欲しくて……。

とまぁ、そんな感じ。


あとオマケ。麻雀用のコントローラ。配線面倒だった。麻雀コネクタからJAMMAへの変換ブリッジも兼ねてる。

だいたいコントローラ回りでやるべき事は尽きてきた感じで。あとは麻雀コネクタをJVSの変換ボードに繋げるようにするくらいかな。そうそう、JVS変換ボードのionaも、少しアップデートして特殊なコントローラを要求しないnaomiのゲームなら試した限りは通るようになってます。思った以上にデバイス名のSEGA〜をチェックしてるゲーム多いみたいだったけど。あと2Pがないと駄目とか。なので他社のJVS基板では弾かれる可能性は高いなー。まぁ、そこはArduinoになってるんで、カジュアルにデバイス名を修正して対処、と。