2018年6月25日月曜日

TAITO G-Net 麻雀配列

G-Netで麻雀っていうと麻雀王と兎くらいしかタイトル無いと思うんだけど、驚くほどオンラインにハーネス情報がないためか、兎が500円で大量に売りに出ているも誰も買わない。あるいはG-Netマザーの初期動作確認用に入手するくらい。

そんなわけで、ちょっくら兎の配線を調べてみたのでその情報共有。麻雀王もたぶん同じじゃないかなーとは思うけど、保証はできませんので悪しからず。

まず前提として、麻雀コネクタ、あるいは他のI/Oから麻雀に変換する場合、基本は4出力6入力のマトリクスで24種類(実際に使われているのは20種類)の入力を表現します。それぞれの入出力マトリクスの交点にスイッチを配置するだけ。デジタル回路的に理解するなら、出力は基本HIGHになっていて、4つのうち多くて1つが時分割でLOWに、そのLOWになっていた出力ピンに応じて6入力の解釈が変わるので、対応する信号をLOWにして送ってあげれば良い。

で、G-Netの場合は3P/4P用の拡張コネクタを流用しているようです。出力に使う4ピンは本来コインカウンター、コインロックアウトに使われている1番2番ピン。出力にとれるのがこれら2本しかないので、3Pと4Pを併用して4出力を確保します。入力は4P側の1レバー2ボタンを使います。コインはそのままJAMMAの1P/2P用コインが効いてるようです。

3P-1 3P-2 4P-1 4P-2
ABCD4P-5
EFGH4P-6
IJKL4P-7
MNチーポン4P-8
カンリーチロン4P-9
スタート4P-10

もし、麻雀コネクタに変換したいなら、以下のように対応させれば動作するはず。

G-Net3P-13P-24P-14P-24P-54P-64P-74P-84P-94P-10
麻雀コネクタA1B2MNPRST

自分はこんな感じで変換コネクタ作りました。入力だけ麻雀コネクタからとって、電源やら画面、コイン入力はJAMMAから。



麻雀コネクタの詳細はアーケードハーネス配線データベースさんの麻雀の項に詳しい情報がありますので、知らなかった人はそちらも参照の事。

2018年6月19日火曜日

赤が出ない基板

簡単だったやつも。

RGBで赤が出ないっていう基板。


目視だけで原因判明。TR2が取れてなくなってる。出口付近にトランジスタが3回路並んでたらほぼ間違いなくRGBの増幅回路。

表面実装の型番についてはMARKING CODE @wkiで調べるとLYが2SC2712 Grade Yだとわかる。幸い秋月でも扱ってるNPNの定番汎用トランジスタだったのでサクッとハンダ付けして修理完了。材料費5円。


写真もハンダも下手だけど完成図、そして記念撮影。


F2大マザー

今度は1200円のF2大マザー。起動しないってやつの修理に挑戦。(そう言えばTAITOロゴのAとASAHIネットのロゴ、少し似てる。僕にとってはどちらもUTMC繋がりなんだけど、何か関係あるのかな……zakさんなら知ってそう)


まずは目視で診断。このカスタムの160ピン側の角が3本ほど潰れてショートしてました。QFPには良くあるやつ。足を揃え直してハンダで補強。他にも潰れっぽいのがあったけどテスターで見る限りきちんと絶縁されてるようだったのでそのまま。

ここでひとまず電源を入れてみる……と5秒くらいで画面信号が出てくるんだけど真っ暗。仕方ないので68000のバスをロジアナで眺めてみると、普通に初期化はパスしてゲーム起動までいっているような雰囲気。

という事で音を確認。実はうちの環境、-5Vの電源はあるのにJAMMAハーネスには出してなかった。だって必要な基板今までなかったし。でもF2大マザーは-5Vがないと音が出ない子。という事で-5Vも配線して起動してみたら……音楽は普通になってた。コイン投入〜ゲームスタートできているので画面の問題っぽい。
って事で、少しやる気を無くしたんだけど、F2は同期が少し特殊で環境によっては画面がぶれる〜みたいな情報があったので、普段使ってるCGA→S端子ではなく、もう1つのCGA→VGAの変換基板で試してみると……


ふむふむ……出てるじゃないか……画面化けてるけど!そこまで難しい症状じゃないのでしばらく調べてみる事に。幸いロジックICは少なく、FFを中心に故障がないかざっとチェック。次にSRAMの塊を疑うことに。

SRAMに関しては/CSを強制pull-upしたり、/WEを強制pull-downしたりする事で該当チップがある程度予測可能。今回SRAMはIC1〜8、IC11〜18の合計16個あるわけですが、/CSは奇数番ICと偶数番ICの2系列だけでした。こいつらピクセルクロックの半分の速度で交互にアサートされて、奇数・偶数合わせてピクセルクロックで画像を送り出してます。今回、奇数側の動作を止めることでノイズが消えたため、問題は奇数番ICと判断しました。次に/WEで絞り込み。常に書き込みを指示する事で、バスにデータを出させないようにして疑似的な休眠状態を作ります。これでノイズ部分が消えたり同じ部分に別種のノイズが乗るところが怪しい。/WEから推測されるのはIC3,4,13,14のうちどれかの故障。/CSの条件と合わせて考えるとIC3かIC13の不良です。

最後はデータバスにゴミを載せて化け方を比較し、IC13の不良と判断……としたのですが……正しくはIC3だった。おかげで面倒なSRAM載せ替えを2枚分。ソケット化してたのでIC13には元々のチップを載せて、IC3だけ手元の在庫と交換しました。20年近く前に秋葉で買ったSRAM、最後の1枚。

木星に着いたよお〜       着いた〜!!(なぜ全裸?)
流石TAITO、クイズでも地球が割れる

IC3の差し替え中にうっかりIC13からIC12へ伸びてるA12の線を切ってしまったらしく画面が大きく乱れて焦りましたが……断線によってピンが浮いてしまった場合、触ると0/1揺れてノイズ乗るので問題特定しやすい。ちなみにIC18→IC11→IC1→IC8って方向にチェイン状に接続されているので、IC13からIC12への接続が切れると、IC1からIC12まで全部の足が浮きます。逆に接続は1から12のどこかのA12を13から18のどこかのA12へ繋いであげれば大丈夫。ここはソケット化した3と13と繋ぐことにしました。無駄にジャンパーorz


修理後のSRAM群。右にあるカスタム0200OBJ、0210FBCに繋がってます。アドレスもデータも両チップに分割して接続されており、両チップが密に連携してスプライトとオブジェ面を合成してる様子が伺えます。CPUから見えない場所にあるのでテストモードの診断とかでは検出されない。一応、必要なとこだけ作った雑なメモを貼っときます。


それと何かの確認で役にたつかもしれない最終的なボード写真。右下がサウンドで、左ほぼ半分が画面ですね。配線も素直だし、これくらいの部品点数なら調査も楽で助かる。値段分以上に楽しめた。



しかしチップの取り外し難しい。特にVCCとGNDのピンがハンダとれない事が多い。昔のトラ技の動画に従いヒートガンで温めながらチップを抜く……ところまでは綺麗にいく。でも残ったハンダを表からコテで温めて裏から吸引器で〜ってやってもハンダが溶けてくれずに吸えない箇所が必ず出てくる。VCCとGNDとかは常に吸い取れなくて。基板の内側に配線層があって接続されてる場合なのか、それとも電流多く流れると合金化が進むのか……。良い方法知っている人いれば教えてください。とりあえずヒートガンで温めて針形の工具で貫通させて吸い取ったりとかはそこそこうまくいってる。

2018年6月13日水曜日

飛翔鮫・修理(もうちっとだけ続くんじゃ)

遊幻さん@ヤフオクにてジャンクの飛翔鮫(伏せ字IDバレちゃう……)を入手。わりと簡単に治せると踏んでたんですが……ちょっと手こずってる。気力が続かないし、次に時間できるまで少し間が空きそうなので、軽くメモを残しておこうかと。

元の状態はオークションの写真の通り。BG面は正しく描画されてるっぽいけど、スプライト面がゴミまみれ。というかハード性能以上の枚数スプライト出てる(笑)

で、基板を見ると……


ガッツリ修理跡。しかもハンダ面めちゃくちゃ汚い。SRAMは2面対になっているうちの1面がソケット化されてて、しかも刺さってるやつオリジナルは120nsなのに200nsの遅いやつ。これは勝ったか!と思って120nsのやつに差し替えてみたけど世の中そんなに甘くない。症状かわりませんでした、残念。そのくらいは遊幻さんでも試してそう。ちなみに後に調べた感じだとこのSRAMx2はオブジェクトRAMっぽいですぞ。スプライトのパタン番号や座標なんかが出てきてる。

そしてこの頃、nosuke様の俺基板(いた)本がBEEPに再入荷してたので、先人の知恵として有り難く購入。
ロジックICも壊れるんだ、つらそー……とか他人事のように思いたかったんだけど、SRAM以外にもロジックIC何個か交換されてて。前のオーナーが怪しいと思って修理した箇所か、壊した箇所のいずれかだろうと。自分も先人に習って周辺のロジックを疑ってみる事にしました。
まじかよーって感じでインバータが壊れてた。なんかこういう故障モードは学生実験でトランジスタ描いてSPICE回してた頃に見たことあるような気がするけど、波形が鈍ってたり電源足りなかったりとか、あとゲート壊れかけてたり?そっちはあまり得意じゃなかったから自信ないけど。
って事で、スプライトは表示されるんだけど、何もないはずの後方位置に同じスプライトデータが何度もリピートされる感じ。
とまぁ、そんな感じで少しだけ前進。

ちなみにPROMはアドレスに回り続けるカウンタの値をもらってデータを読み出し、それがデコーダに入って負論理のワンホット信号が出てく感じ。シーケンサのタイミング生成的に使われてる。ここでPROMの後段、タイミング信号を受け取ってるdemuxの先を追いかければ面合成部分の論理にたどり着くかなーって思ったんだけど。demuxの信号調べてるうちにクロック波形が崩れてるんじゃないかって気がしてきて。先のNOTの故障もクロック鈍ってた影響で特性悪い個体がノイズ出してただけって可能性もある。という事でクロックツリーをテスターで追いかけてみたら、すぐに壊れたFFを見つけることができました。CLKと出力1bitが内部でショートしてる模様。実際に波形とってみたら出力がCLKに引きずられてた。そんなわけで該当ICも交換。
IC取り外すの大変なので、事前に短時間で検証できる事はやっておき、ある程度の確信が持てたら交換。
という事で、これだけでは全ては直らず。おそらく似たような故障がもう1箇所ある……。キャラが常に化けるというよりは、スプライトが何かの影に入っている時だけ縦縞が入る感じです。自機も出撃時に建物の影で縞々になる。縦縞なので同じピクセルクロックで動いてる素子だと思うんだけど……。まぁ、ロジック追って少し満足してしまいモチベーションがぐっと下がったのでしばし休憩。

今まで論理回路はチップの中ばかりみてきたので基板上の回路を追うのはちょっと新鮮だった。ほんと学生実験以来な感じ。流石にチップと比べると規模は桁違いに小さいけど、物理的な配線を追うのはちょっと手間。見えてないとこテスターで総当たりしないとだし。そして当時のシステム、わりと愚直にロジックIC積み上げただけなんだなーって。当たり前の事なんだろうけど感心。バスがそれぞれ独立してるのとかも汎用PCになれちゃってると不思議な感じ。画像データとかROM使ってると確かにCPUから読み書きする必要はないもんね。

2018年6月4日月曜日

沙羅曼蛇2用のサウンドデータ作成方法

興味持ってる人がいるようだったので、とりあえず手元でデータ生成に使ってるツール一式をまとめてみました。と言っても、データ生成はほぼほぼarm用のアセンブリでやってます。本来はm68k用を使うべきなんでしょうが、命令を吐く必要がないのでbig endianが指定できればなんでも良いのです。

ツール一式は前エントリのサンプルデータと共にGitHubにて。

data/ 以下にサンプルデータとデータ生成スクリプトが入ってます。スクリプトはPOSIX環境向けなのでWindowsの人はWSLなりCygwin、MinGWあたりを使って道具を揃えてもらえれば、と。とは言ってもpureなWindows環境向けに同等のツールを揃えることは、ある程度の知識があれば大きな手間はかからないと思います。

生成に使っている開発ツールですが、自分はmac上のbrewでarm-none-eabi-gccを使ってます。Ubuntuでもパッケージでさくっと入れられるかと思いますので、Windowsの人はWSLを使っていれば同様に簡単に環境が揃うかと。

data/gxsnd.S がサンプルデータなので中を覗いてみてください。gxsnd.hっていうヘッダの中で色々とコマンドを定義して、それを使ってアセンブリ言語向けのデータを埋めてく感じです。

先頭の.org 0x00108000はデータを配置するメモリ上のアドレスを表しており、この値はmame向けのテスト環境で前提にしている値です。サウンド用のサブCPU内のアドレスを表しており、このアドレスは沙羅曼蛇2では未使用のRAM領域です。実機で試したい場合には、既存のデータを上書きする形でROM内に配置する必要があります。また、その際にはROMチェックを通るようにチェックサムの辻褄を合わせる必要もあります。このあたりの解析情報も持ち合わせているのですが、今回はこの点については割愛。

続くHEAD:部は、全16チャンネルのデータ位置とデータ末尾を示すラベルで埋めます。この部分はいじらないで下さい。

続けてCH_1からCH_16まで、実際のデータが続きます。各チャンネルのデータは必ずENDで終わらせて下さい。またデータ末尾にも必ずENDが必要です。

データについてはMMLを知っていればある程度推測できる範囲にあるとは思うのですが、わかりにくい部分だけ補足します。

一般的なMMLでは音程と音長を組み合わせてA4などと指定するのが一般的です。またLコマンドで省略時の音長も指定でき、単純にAと書けばラの音が指定できます。一方、このシステムでは、音程に対して、音長、ゲートタイム、音量を合わせて指定するのが基本になります。A4LG(L4,100,127)と書くと、ラの音を100%のゲートタイム、音量最大127で指定する事になります。Aの後の4は音長ではなくオクターブです。また2音目以降はゲートタイム、または音長とゲートタイムを省略可能です。A4LGではなく、A4Lと書けばゲートタイムが省略、A4と書けば音長とゲートタイムが省略され、前回の値が再利用されます。ただし音量は必ず毎回指定する必要があります。この点が少し不便。音量は96が四分音符相当で最大255までしかとれません。よって直接指定するのは二分音符までとし、それより長い場合にはタイ(TIE)で繋いで下さい。タイも音長とゲートタイムを引数に取ります。音調に関しては直接数字で記述しても良いですし、gxsnd.hで定義されているL4などの文字を使っても構いません。付点はL4_などとアンダーバーで表現できます。

ドラムに関してはRHYTHM_ONでリズム音源モードというか。ノート毎に違うサンプリングデータがアサインされてるモードになります。C0からBb2まで、バスドラ数種、スネア数種、シンセタム、生タム、ハット、金物各種、色物系みたいな順で並んでます。そうそう、通常の音色もサンプリング番号+ADSRチックなエンベロープ個別指定になってます。よって沙羅曼蛇2をベースにする限り、沙羅曼蛇2のROMに入ってるサンプリング音色しか使えません。65音色くらいあったと思います。一応音色一覧的なのもあるけど主観で命名してるので環境手に入れたら自分の耳で確認してもらうほうが確か。

各コマンドの値に指定できる値は基本的には0-255の8-bitsの値になります。が、コマンドによって成約もあります。PANは1が左、8が中央、16が右でその間の値もとれます。REVERBは2つの引数ともに0-15までしか取れません。DETUNEに関してはsigned charで-128から127で考えて良いかと思います。

繰り返しについてはREPEAT_START / REPEAT_ENDで囲んで下さい。REPEAT_ENDの第1引数が繰り返し回数です。第2、第3については不明ですが、既知のデータでは0が指定されていました。

ループポイントについてはLOOPコマンドに続けて戻りたい場所のシンボル名を後続の.dc.lラインで指定して下さい。内部的な挙動はマクロ呼出しと同じですが、コマンドは別途アサインされていました。マクロについてはサンプルでは使っていませんが、CALLコマンドに続けて.dc.lでシンボルを指定すると、任意シンボル内のデータを演奏してから呼び出し元に再生位置が戻ります。これらのデータはDATA_ENDより手前、通常はCH_16の後ろに置かれ、他のデータ同様にENDで終了します。

再生環境についてはmameを流用するのが簡単です。とは言っても沙羅曼蛇2のROMを所有している必要がありますので、この点に関しては著作権遵守でお願いします。駿河屋で2万ちょっとが店頭での最安値かな?ヤフオクで見張ればもっと安く手に入ることもありますが、慣れてない人にはおすすめできません。基板環境ない人でもプラス数万払えば実機で演奏する環境も夢ではありませんよ。

mame/mame.diff のパッチをあててmameをbuildする必要があります。あるいはdebugモードで起動すれば本体に手を入れずともデバッガコマンドから再生する事は可能なのですが……実際にデータ作って〜となると面倒でやってられません。このパッチは特定アドレスにデータを読み込むフックをかけてます。実際には0x00800000を叩くとgxsnd.datというファイル名をメモリに読み、サウンドチェック用の曲ヘッダが指す先を読み込んだメモリ上のデータに差し替え、再生用のホストコマンドを入れて割り込みをあげます。

該当アドレスを叩くのはmame/cheat/salmndr2.xmlのcheatを通して行います。mame以下に「cheat 1」と書いたmame.iniファイルを置くとcheat以下の定義が読み込まれ、cheatメニューにLoad GXSND、BGM Test、Loop 1 BGMなどが追加されます。この中のLoad GXSNDを選ぶと該当アドレスが叩かれてデータの再生が始まるはずです。

BGM Test、Loop 1 BGMはおまけ。前者は曲を選んで再生できます。後者は1週目から2週目BGMを再生するハック。

ざっくりこんな感じで。何か質問があればTwitterなどで質問して頂ければ。あと、著作者からの要望があれば、前置きなく解析情報を削除することもあるかと思います。まぁ、68アセンブリ読めれば誰でも数時間でわかるような内容ではありますが。

ちなみにSilver Wings Againに使われているコマンドは0xd0以外は解析できてます。引数の数はコード見ればすぐにわかるんだけど、効果はROM書き換えながら耳で確かめたり、コード見たりでまちまち。0xd0に関しては聴覚上に違いがなかったような気もするけど、mameで確認してる関係上、きちんとエミュレートされてない部分で変化してる可能性も。他の曲でまだ未確認なコマンドだとフルタイムポルタメントとかもありそう。ROM内のサウンドデータを同ツールでbuild可能なソースに変換する解析ツールも作ってあるんだけど、コード適当だし、解析ツールについて権利者がどう思うかもわからないので、今の所公開は考えてません。

2018年6月3日日曜日

沙羅曼蛇2のサウンドドライバを攻略するの巻

とりあえず、ROMの指定アドレスからサウンドデータをデコードして、アセンブラから再びドライバが認識するデータに再コンパイルする環境を整えた。

で、実機でROM焼きながら曲作るわけにもいかないので、開発用環境としてmameをほげって、特定のアドレスを叩くとファイルからデータを読んでサウンド側のRAMに配置するような環境を用意した。実際にはcheat機能も使って、cheatメニューからLOADを選ぶと該当アドレスが叩かれ、続けてK056800経由でサウンド再生の命令が飛ぶようになってる。

現状で把握してるサウンドドライバ用の命令は以下の通り。

  • ノート(音長指定あり/なし、ゲート指定あり/なし、音量指定あり)
  • タイ
  • 休符
  • ドラムモード(ON/OFF)
  • 繰り返し制御
  • マクロ呼出し
  • パン指定
  • オートパン(指定した時間で2点間を移動)
  • 音色指定
  • テンポ指定(チャンネルごと)
  • アタックレート指定
  • ディケイ指定
  • リリースレート指定
  • デチューン指定
  • LFO
  • LFOオートメーション(深さの時間変化)
  • リバーブ(チャンネルごと)
  • ループ指定
ヘッダ情報とかマクロやループポイントは絶対アドレスで指定するので、ROM配置に合わせてデータをコンパイルしてやる必要がある。このあたり、開発環境がかなり原始的だった可能性あるなぁ……。MSX時代だとほぼほぼバイナリエディタみたいなので作曲してるっていう話もあったけど、それとMMLの中間くらい?自分はとりあえずアセンブリのマクロを使って読みやすくした状態でアセンブラかけてデータを作ってるけど。ノート毎に音量指定するのが結構面倒で、あとから音量変えるのも手間。MMLから専用コンパイラでアセンブラのソースに変換してた可能性が高いかな?



とりあえず簡単な曲を作って再生させてみた。実験の延長なので曲自体凝ったことはできてないけど。音色からなんとなく沙羅曼蛇2感みたいなのは伝わってくるかな。

FMPSGの新譜はSystem GXの実機でいきたいなぁ。