2018年11月27日火曜日

「TV麻雀ゲーム」をコントローラだけ拝借

「TV麻雀ゲーム」という、一般名詞ではなく商品がありまして。ビデオ入力でテレビに繋げて遊ぶ麻雀ゲームです。内容的には8-bit時代の代物なんですが、3000円以下で売っていて、コントローラとして流用するにはわりと良さげな感じがしまして、1つ確保してあったやつをこの週末にばらしてみました。アーケード基板と互換性があればラッキーとか思ってたんですが、まったくさっぱり。


中はこんな感じ。なんとなくマトリクスで配線されてるんですが、まったく異なる配列になっていました。しかも直接信号を読むわけじゃなく、右側の黒玉マイコンが処理してからゲームを動かしている左側の黒玉マイコンに渡しているようです。

ケーブルのところを見ると、一応信号名が振ってあり、順番に

  • VDD
  • OUT0
  • OUT1
  • OUT2
  • GND
  • P2D4
  • P2D2
  • P2D3
  • P2D1
  • SEL
となっているんですが、信号名の数は10個、実際の線の数は11本。あれれ……という事で、あんまりあてになりませんでした。それでも信号名からなんとなくマトリクスで読み出してるんじゃないかって期待があったので、ホスト側のマイコン、コントローラ側のマイコン、それぞれに電源入れて、出力がどうなるか調べてみました。どうなるか、というのは信号がHIGHになるかLOWになるか、また軽くpull-up/downした時に信号を動かせるかどうかで出力なのか入力pull-up/downなのかを判断します。

結果、OUT0/1/2がホスト側出力と判明。負論理でone-hotを出しているように見えたのでやっぱり普通にマトリクスかなーって思えたんですが……Arduinoからマトリクス想定で信号を入れても、反応するボタンは数個しかありませんでした。

仕方ないので再びホストとコントローラを繋げて、間の通信をロジアナで観測。結果、無駄に3出力4入力も使うシリアル通信だと判明。中身すっかすか。

足りなかった信号名はP2D1とSELの間の信号で、仮にENDとしました。ホストからの出力はOUT2はENABLEだと思えば良い感じ。OUT0は通信開始時に半クロックだけHIGHになる。まぁ、クロックのエッジからこれくらい経ったら読んでねってマーク(で半世紀前)
ならまだわかるんだけど……コントローラ側は信号読まないので存在価値は謎。シフトレジスタのリセット信号わざわざ送ってるのかな?データについてもスカスカなのにわざわざneg edge/pos edge両方で信号送り出してて謎。そしてEND信号は最後のサイクルで終了マークとしてHIGHになります。

あと、セレクトボタンがホスト側の基板に載ってる関係でホストから配線してあげてるみたいで、これがSEL信号の正体。ただ、この信号を立てると立てた間ずっとP2D1が立ち上がるという……。オリジナルのホストはタイミングを合わせて10サイクル目だけ信号を出して、P2D1から戻ってくる半サイクル信号を見て「うん、よしよし」ってなるらしい。直接読んだほうが早いのになぜ?!

という事で、ツッコミどころ満載でしたが……まぁ、読めればいいので。例によってOrange Pi ZeroにGPIOで繋いで、キーボードとして認識するようにしてみました。そのままビデオ入出力も奪って、現在はスーパーリアル麻雀専用機と成り果てております。ピンヘッダつけたら微妙にケース内に入らなくなってしまったので、あとで電池ケース部分を壊してそこにZeroを内蔵しようかと。



あと、ホスト側の基板からボタンを取り外そうとしたら、ボタンが粉々に砕けてしまったため、代替になりそうなボタンを取寄中……。

わりとどうでも良い話でしたが、なんというかこのプロトコルの脱力感を誰かと分かち合いたくてorz


他の基板持ってる子達のデータも詰め込んでみた。コンポジットビデオ出力なんだけどインタレースなので、2画面分出してもわりと綺麗に表示できたりはする。

今回作った「TV麻雀ゲーム」をOrange Piでキーボードとして見せるユーザーランドドライバのコードはこちら。たぶんこれ、RP0で作るほうが正しいと思う。薄いから簡単に組み込めるだろうし。わざわざビデオ出力で喜びたいって変わった人向け。

2018年11月25日日曜日

疾風魔法大作戦(修理奮闘中)

出会い

ちょっと悩んだけど、安いジャンクを見かける機会も少ないし、疾風で3作揃うし、という事で修理できる確信はなかったんだけどKVClabさんで疾風魔法大作戦のジャンクを購入。店員さん「お勧めしません」「無茶しやがって」とか、なんで売ってるのそれって感じですが。

とりあえず店頭で画面見せてもらった時の見込みでは故障個所は最低で2つ。1つは画面が水平同期方向(縦モニタ用だから縦方向)に尾を引く現象。もう1つはオブジェ化け。これは線が入るとかじゃなくて、違うオブジェが表示されるタイプ。

(写真は自宅で撮影)

前者は飛翔鮫の経験から後段で面合成してるあたりのラッチが弱ってくると起きる現象ってのは想像できる。古い基板なら間違いなく74シリーズの交換で済むところなんだけど、この時期の基板だとカスタムの中の可能性もあり少し微妙……なんだけど、のすけさんのガレッガ修理の話で、東亜系ライジング基板はJAMMAコネクタ付近に出てる74シリーズでやってる事はわかってた。

後者も過去の経験からすると、オブジェクトチップ読み出しの際のアドレス線が化けて違うオブジェクトが選択されて起きる現象。正しく表示される物も混在している、化けるキャラはBG面、スプライトともに混在している、というあたりからROM読み出し時のアドレスかな?という想像はできた。原因は様々で基板上のショートや断線、ROMの劣化、半田クラック、あとはアドレスを出力する側のトランジスタ故障あたり。最悪カスタムの出口なんだけど、結論から言うと最悪のケースだった(笑)ので、まだ奮闘中、というわけで途中経過報告です。

水平の滲みの修理


特定は凄く簡単でした。まず、のすけさんが記録を残してくれていた通り、JAMMAコネクタ付近に273が並んでいる事。そして御丁寧にもそのうちの1つに鉛筆でバツ印。どうやら前のオーナーが修理挑戦して諦めた類ですね。よくよく見るとカスタムに近いSRAMも交換した後がある。こっちはオブジェクト化けにあたりをつけて交換したけど効果なくて諦めたって感じかな。という事でバツ印の273をロジアナで観測するところからスタート。


こんな感じで「俺たちは雰囲気でフリップフロップをやっている」みたいな感じの適当な出力が出まくり。という事で、こいつを交換したところ滲みは完全に直りました。



オブジェクト化け


さて、難問のこちら。まずは化けた場所の特定から。ROMの足を弱い抵抗でpull-up/downして問題の個所を予想する方法もあるんですが、今回はエミュレータを使用。特定のアドレス線が0/1に張り付いた場合の読み出し結果を再現するようROMを変換するツールを作ってありまして。変換したROMでゲーム起動。基板と同じ化け方が出てこないか調べたところ、A18が0に張り付いている時の化け方だとわかりました。という事でROMのA18を抵抗で吊ってみたところ、確かに化け方に変化が起きました。という事でA18に繋がっている物を調べたところ、マスクROM2枚とカスタムチップだけ。ショートしてるような個所も見当たりませんでした。

時々A18が1側に張り付いて、化け方が反転する事もありました。場面によっては正常に近い状態の画面が出ます。



次の手を考える前にオシロで波形の確認。1V程度の振幅で矩形の信号が出ていました。この時点では出力はまだ出ていて、壊れたマスクROMでGNDに引っ張られている可能性を期待していました。という事で頑張って大きなマスクROM2枚を引き剥がします。この基板ではオブジェクト用のマスクROM2枚とサウンド用のマスクROM1枚が直接半田で固定されてます。


ヒートガンで350度くらいに熱しながら、IC引き抜く工具でROMを強引に取り外します。このサイズになると均等に力も入らないし、基板もかなりしなった状態になるので心臓に悪いです。表面に少し傷がついて配線が露出してしまったのでこの後ショートがない事を確認しつつソルダーレジストを再塗布してます。残った半田は吸い取り線で処理しつつ、やっぱり残る電源ピン。pull-up/downされてるような端子も同じですね。やっぱり経年で合金化が進むのかなぁ……。今回は残った部分は吸い取るのを諦め、0.5mmのハンドドリルで削りだす事にしました。試した限りこれでランドが取れたりすることもなく、無理して温めまくるより時間もかからず、基板へのダメージも少なそうです。

で、この状態で信号線を再確認してみたのですが、やはり振幅1V程度のままでした。この信号が正しい信号ならレベル変換して再利用する手もあったのですが、改めてオシロで確認したところ、となりのA17の変動と一致している事がわかりました。つまりA18は浮いていてA17の信号をノイズとして拾って振動している、と。このレベルでノイズを拾っているとなるとトランジスタ故障というよりはパッケージ内で断線しているのかもですね。念のためカスタムの出口(160番ピン)でも信号をとってみましたが結果はかわらず。途中で断線という希望も絶たれました。

という事で最後の手段はA17の出力論理を推測して外部回路で生成する、と。当初は付近のSRAMから使うオブジェクトのインデックスを拾ってきてるだろうから、その線を覗いて簡単な論理被せれば作れるだろう、くらいに思っていたのですが……波形観測したら、そうもいかないようで。ちょっとここで苦戦してます。

色々とソケット化された魔法基板
これはこれで嬉しい(ただし動作すれば)

現在観測、想像している範囲だとオブジェクト用のROMは、16bitモードを2枚並べて並列32bitで使用。各pixelが4bitなのでオブジェクトの横8pixelを同時に読みだせます。20bitのアドレスの内訳は、最上位bitがBG/スプライト選択、下位3bitでライン指定、間の16bitがオブジェクト指定です。壊れてるA18はオブジェクト指定の最上位bitにあたります。

カスタム付近のSRAMは8kB x 2です。これもアドレス同時指定で16bitで読み出してます。カスタムは6.75MHz動作で、これがpixel clockと一致しているはず。SRAMはCPUからは直接は見えなくて、カスタム経由でアドレス指定、データ読み書きの手順で触ります。ので、実際のフォーマットはCPUから見えている形式と違う可能性もあり、エミュレータのソース通りとも限りません。そもそもSRAMとオブジェクトROMの読み出しがpixel clockなんですね。オブジェクトROMが8 pixel分同時に読み出せる事を考えてもpixelあたり8サイクルしかない。BG3面とスプライトがあり、BGのアトリビュートを読むのに2サイクル、スプライトで1枚あたり4サイクルって考えると、あれ?足りない……。となるとBGは16x16かな?さらにスプライトは256枚中どれを表示用に読み出すか事前に選定する必要がありますが、HBLANK期間は推定112サイクルしかないので256枚分処理するのは無理。って事で、色々と工夫されてそう。16kBを外に置くくらいなのでカスタムの中のメモリはラインバッファを構成する最低限になってそうだし。

という事で、この辺は自分でコード書いて基板で走らせながら調査を進めるしかなさそう。まぁ、この基板で自分で書いたコード動かすってだけでも楽しいかな。

ちなみにBGやスプライトの原理についてはお気楽古典電子工作のZ80 ゲーム機を作ろう(その6)(その7)に説明があったり、世の中には古いアーケード基板の回路図が出回っていたり、と。参考になる資料は多いのでありがたいです。実際組んだことはないけど、原理は理解できてるつもり。フレームバッファの時代になるまで、基本的な考え方は変わらずに進化してるので、今回もなんとか解析できないかなぁ……と。まぁ、すでに値段分は楽しんだ気になってるわけですが……。あ、学生実験でBG1面+マウスポインタ用スプライト1枚って論理は組んだ事ありました。

2018年11月11日日曜日

コットン・オリジナル

出張中の移動時間を使ってPS版コットン・オリジナルで練習してたんだけど、アーケードとの違いに気づいたのでメモ。とりあえずPS版はワンコイン達成したけど、アーケードはあまりやってないので気のせいな事もあると思う。という事でツッコミ歓迎。

以下、アーケードと比べたPS版の特徴

前半が易しくなっており、全体的に遊びやすく再調整されてる

・中/大ボスを倒すと大宝石が出るので対空のパワーアップが全体的に早い
・初期の対地の威力が底上げされているので積極的に当てるとボスを瞬殺できる
・宝石で色付き時に弾を数発当てても色が変わらず、魔法アイテムが集めやすい
・1面中ボス周囲の岩が破壊可能
・初見殺し系の弾速が遅めに調整されてる
・ボーナスで湯呑の数が若干少なくシークレットボーナスを取りやすい
・2周目が存在しない

音源が違う

・アーケード版はFM音源だけど、PS版は違う。PSの音源使ってるのかな?
・負荷があがってもテンポ落ちしない
・シーケンスが違う箇所もある(1面中盤のメロディラインとか)

その他、些細な事

・4ボス残骸が湯呑より表示優先度が高くシークレット狙っても湯呑が見えず事故る
・フェアリーの障害物当たり判定が違う(3ボス開幕で投げるとアーケードのみ刺さる)
・エクステンド時に「増えた」と喋らない
・たまにシステムエラーで落ちる(えー
・移植版エンディングロールの追加



全体的にみて完成度はPS版オリジナルの方が高いのかなぁ、という印象でした。

ちなみにX68k版は完成度の高いアレンジ移植。後半に進むに従ってオリジナルとの違いが大きくなり、中盤以降はほぼ別ゲーム。これはこれでやり込んでみたい気がする。