2019年8月17日土曜日

IONAのデイジーチェーン対応

さっそくJVS I/O Monitorを使ってデバッグしてみた。

正常動作、ionaはシリアルログも存在する

って事で、naomi → SEGA I/O → iona(ターミネート)って構成での動作テストとデバッグ。今までこの構成だとnaomiが2台のデバイスを認識しつつもSEGA I/Oは反応なし、ionaは2番目のデバイスとして動作してた。この状況証拠だけでも気づけばバグの原因がわかったんだけど、残念ながらピンと来なくてモニター作りに精を出してしまいました。まぁ、便利な技術は色々と身についたから良しとする。


ちなみに、上の雑な基板がNEOGEO mini解析した時に作ったやつ。単純にUSBの信号を引き出すだけでパススルーするもの。下のやつがSTM32ベースの自作基板で、今回はJVSIOを監視してUSBシリアルとしてホストにデータ転送するファームを入れたもの。4端子だけフリーにしてあったのでGNDとD+に接続するヘッダを取り付け、D+を分圧してGPIOに入力。STM32は3.3V IOの子なんだな。大丈夫だろーと最初は適当に直結してたんですが、2個目を壊した所で現実を直視しました。石はいっぱい在庫あったので載せ替えるだけ、1つ130円くらいの損失です(人件費除く……面倒だった)。


合体!

ログを見て判明したのは、リセットからNode 1、Node 2のアドレス設定までは正常、その後のNode 1に対するクエリは全部応答がなく、Node 2宛てのGet I/O IDでionaが応答を返し始める事、後半の入力取得時には大きめのパケットをやり取りするんだけど、ここでチェックサムエラー出まくりな事。たぶん2台で応答返して信号衝突が起きてる。で、改めて考えてみたらionaがNode 2なのはおかしい。JVSは基本共有バスを張ることになるんだけど、SENSE信号だけはホップ毎に分離されており、このSENSE信号の取り決めに従い末端から順にアドレスを確定していく。なので最初のNode 1のアドレス設定がiona、次のNode 2がSEGA I/Oにならないとおかしい。

で、気づいたのがBroadcastの扱い。リセットやアドレス設定はBroadcastアドレス宛てに飛んでくるので各デバイスは設定済みアドレスかBroadcast宛てのパケットを受信しないといけないんだけど、アドレスに関しては設定済みの時は無視しないといけない。この部分がマルチデバイス対応のコード入れた時に落ちてしまった。って事で、ここを直したら無事に2台ともに正常認識されるようになりました。


こんな感じですね。ionaはJVS最初期のnaomiより上位のバージョンを返します。機能は存在の有無は別としてnaomiタイトルのチェックをパスするように選んでるのでSEGA I/Oの上位互換。


という事で、正常時の起動シーケンスはこんな感じ。定常モードに入ったら約60fpsで入力取得になります。なのでシンクロ連射入れたければ、ビデオのSYNCを見るよりこのタイミングに連動させた方が簡単で確実です。コインだけは120fpsなので60連射できそうです。

2019年8月16日金曜日

JVS I/O Monitor

しばらく前に海外からionaでマルチクライアントに対応できないかって相談があって。JVSIOってUSBケーブルでSCSIみたいにデイジーチェーン接続できる仕様なんですよね。今作ってる基板的には1台で2P対応できるし、特に必要な機能ってわけじゃないんだけど、コントローラ以外に特殊なI/Oが必要な時もあるかな、って。ソース状は対応しておいて、しばらくテストせずにいたわけですが、SEGA I/Oを1台目、ionaを2台目って構成ならすぐテストできる。というか、ionaの後ろに別のデバイスを接続するのはMP01-IONA-JSを使う限り口がないからできないんですが、こっちならできちゃう。そうなると動作確認はしておかないとまずいかな、と。

で、確認したら2台ともnaomiには認識されて、個別にアドレスは振られた模様。でもなぜかSEGA I/Oはアドレス持って認識されてはいるもののIDも空だし入力も送信できてない。なんか動作してないっぽい感じ。下流にいるionaはきっちり動作してるので電気的な問題じゃなさそう。となるとSEGA I/Oがなんらかの自粛モードに入ってるのか、ionaが通信を邪魔しちゃってるのか。これを調べるとなるとプロトコルアナライザーが必要だなー、と。

そこで作ることにしたのがJVS I/O Monitor。基本、D+に流れる信号をモニタしてやれば良いので難しくはありません。

こいつの出番

去年作った基板を使えばSTM32を使ってお手軽にUSBデバイスが作れますので、D+をモニタして解析した通信内容をログとしてUSBシリアルとしてホストに流してやるデバイスを検討。一晩もあれば作れるだろう……と思っていたのですが。

トラブルいっぱい。

USB側は慣れてたけど、USARTの扱いが色々といけてない。ログ解析をしながらUSBでデータを流しだし、USARTを取りこぼしなく処理する、というのはどうやら無理っぽいです。




という事で悲鳴の声。どうにも処理が安定しないので、デバイス側はログ収集に専念させ、ホスト側で解析をするよう方針を変えました。で、どうせホストでやるならWireshark使うよね?って事でざっくり調べてできそうな事を確認、方針を固めました。



しかしまた、いっきに遠回りに……。ホスト側の処理は正確にはシリアルから読んだ物をpcap形式にして名前付きパイプに書き込むって物でした。Wiresharkはデバイスだけじゃなくパイプを開いてログとる事もできるんですね。Linuxのシリアルも罠いっぱいで初めての人は色々とハマる(主にmodem周りのdaemonさんがATコマンド勝手に投げつけたり、ttyをrawにしなきゃいけなかったり)んだけど、それはまた別の話。慣れないLuaとドキュメント足りてないWiresharkのAPIと戦う事数日、なんとか動くようになるも、なんかまだ取りこぼしがある。リクエストの後にUSBにデータ送り出すと常にレスポンスのデータ間に合わずに見逃してる感じ。



って事でファームウェアをもう少し頑張るわけだけど……なんで取りこぼしなくデータ読むためだけに「俺SUGEEEE」みたいなバッファ回すコードかかなきゃならんのか。

そうこうしてるうちにLuaも少しはわかって来たので全体を少し手直し。綺麗になったのか良くわからないけど、まぁいっか。って事でようやくテスト環境が整ったのでした。


こんな感じに通信内容が赤裸々になってしまうSEGA I/Oさんなのでした。


例によって色々とこちらに。

2019年7月22日月曜日

IONA JVSIO 近況

最近また自作JVSIOをいじってます。



こんなツイートしてたんで想像つくかとは思いますが、近々店頭で頒布できるかと。当初は可能な限り安くキットの形で〜とか思ってたんだけど、表面実装でキットは厳しいかな……という事で完成品として。

Arduinoで試してくれた方もボチボチ国内外にいらっしゃり、動作情報も集まってきましたが、特殊な入力装置を使ってない限りは大手の主要システム基板で問題なく動いているようです。具体的に確認されてるのは

  • SEGA naomi
  • namco System 12/245/256
  • TAITO Type X2
あたりになります。

売りは
  • 低遅延(SEGA IOより2フレーム前後低遅延なのは動画解析により確認済み)
  • シンクロ連射内蔵(毎フレーム発行される入力取得コマンドに同期)
  • 省スペース
  • 安価かつ新品
ってあたりです。アケコンに埋め込んだりもできるサイズ。逆に欠点は
  • 入力以外は未対応(音声・映像等の変換はせず、パススルー用端子のみ搭載)
  • 複数のIOをデイジーチェーンで繋ぐことはできない(常に1台でターミネート)
通常の用途で問題になるような事はないかなぁ、とは思っていますが。

それはともかくとして、Type X2を試した時にクレジットが減り続けるバグがありまして。

こんなの。で、調べてたら面白い事に気づきました。JVSはIO側でクレジットの残数を管理していて、ゲーム側が問い合わせて残りのクレジット数を確認し、画面に表示するという仕組みになってるんだけど、この扱いがメーカー毎に全部違った。

一番素直なのはナムコ。クレジット数を問い合わせて画面に表示、クレジットを使った時にIOにクレジットを1減らすように依頼。次に問い合わせた時は減ったクレジット数が返ってくるのでそれを素直に表示する。仕様が求めてる動作に思える。このメリットはゲーム側が落ちてもIO側で管理してるクレジット数は維持できる点。

TAITOはクレジット数を問い合わせて0でなければ即時クレジットを1減らすように依頼。ゲーム側で管理するクレジット数を内部的に増やし、そちらの数字を画面に表示。つまりはゲーム側で完全に管理しています。メリットはIOが落ちても……ってなりますけど、普通に考えるとIOの方が堅牢かな。しかもこの作りのせいでNESiCAとかゲーム間でクレジット持ち越せなくなってるのでわ疑惑。

最後のSEGAが一番トリッキーで。クレジット残数を問い合わせはするんだけど、クレジットを減らす依頼は一切なし。前回読んだ数字より増えていればゲーム側で管理するクレジットを増加、使ったらゲーム側で管理するクレジットのみ減らす作りらしい。内部で累積クレジット数の差分だけ見て動いてる。メリットは……あるのか不明。IOそのままでゲームが再起動すると、累積クレジット数を見ていきなりクレジットMAXになったりします。ロケでの運用考えるとリスクでしかないのでわ?!

という事で、後者になるほどソフトウェアの安定性に自信がある、と(笑)

で、件のバグですが、クレジット減算依頼の際、対象とすべきユニットがずれてました。なんとなく0スタートだと思ってたんですが、正しくは1P側クレジットはユニット1、2P側クレジットはユニット2でした。問題のケースでは

  1. コイン投入、IO内のユニット1のコインカウントが1に
  2. ゲーム側でコイン数を読み出し、クレジットの存在を確認
  3. 即時コイン回収のためユニット1のクレジット減算を依頼
  4. バグのためユニット2のクレジットを減算してしまい-1枚(255枚)になる
  5. ゲーム側でコイン数を読み出し、クレジットが合計で256枚もある!
  6. 即時コイン回収のためユニット1とユニット2のクレジット減算を依頼
  7. バグのためユニット2のクレジットのみ減算して-2枚(254枚)になる
  8. ゲーム側でコイン数を読み出し、クレジットは合計でまだ255枚…
  9. 以下、6へ戻り繰り返しながらクレジットは256→1→256→…とループ
これがnamcoだとクレジットが減らないだけ、SEGAだと減算依頼しないので問題なし、という結果になっておりました。標準化って難しいですね。

2019年6月16日日曜日

ラジルギスワッグ(SW)

出たら買おうと思ってたんだけど、気づいたら発売日過ぎてた。他の人のツイートみて気づいてゲット、一先ずクリアまで。



視点が今までみたいな真上じゃなくて斜め上のレイストームタイプになってたけど、レイストームみたいな避けにくさはなかった。最初は普通に遊んでて3面で躓いてて。しばらくしたら3面スタートするアイテムが貰えたので3面やってたら4面行ける事も出てきて。そうこうしてたら5面行った事ないのに4面スタートと5面スタートのアイテムが貰えたので5面で遊んでみる事に。で、普通に遊べるレベルじゃないのでアブソネット入れっぱなしにしたりスピードアップ取ったり試行錯誤してるうちに遊び方見えてきた。スピード全開にしてるとアブソネットゲージの回復も早いので、あとはひたすら速と充を集めながらアブソネット展開して無敵時間に特攻&チャージ。後半面のほうが敵が多いからチェーン繋げやすい。だからいきなり未達の後半面まで開放するとかいう思い切ったデザインになってるのかー。

最初は5面スタートでクリア。徐々にスタート位置を手前にしていくっていう通常の攻略とは逆パターン。繋げるのに慣れてきたら1面で速を2つ取ったら、あとは最後までずっとチェーンで俺のターン。って感じで普通にクリアして1.3億点くらい。ランキングで100位前後ですが、遊んでる人多いみたいでグングン下がる(笑)ちなみに、タイムラインで見た方々は2億点のラインで楽しんでるようで……5位圏内の戦いでした。しばらくやってクリアは安定したけどスコアは最初が1番良くて以降は1.3億届かないくらい。まぁ、普段から稼がない・稼げない人なので、この辺で。


そう言えば上達したプレイヤーほど進行を速くさせてインカムを……みたいな試みは疾風とか、まもるクンとか、あまりうまくいった話を聞きませんが、こやつ家庭用の癖にうまくまとまってるような。あと1プレイ10〜15分ってのは楽しみやすくて好き。

2019年6月7日金曜日

カラドリウス(PS3 / PS4 / AC)

たぶん昔にPS Plusでフリープレイ対象だったのをダウンロードしたんだと思うんだけど、PS3とPS4両方にインストールされてまして。ランク格付けだと0とかなってるけど、いくら水の防御ESつけててもそれはない。普通に7くらいあると思う。ALL.Net P-ras MULTIに入ってるおかげで今でもわりと多くのゲーセンで遊べます。脱衣シューティングってのがアレだけど、ゲーム自体は面白いし特にボス戦はテンポが良く、形態変化に合わせて攻撃方法を選んでいくのが楽しいです。


3年くらい前からやってるんですが、久々にオリジナルモードをやってみたらするっとラスボス倒せまして……と思ってたら、コンティニューせずに倒した時だけ6面に進むんですね。

6面道中は近くから自機狙い撃たれまくりでヒヤヒヤ。特に難しいとかではないけどR-TYPEの最終面みたいに神経をすり減らされる。で真ボスと初対面なわけですが、さすがに勝てなかった。


けど、だいぶ惜しかったので、もう1プレイ。今度はもう少し余裕を持って6面に入れ、そのまま無事にクリア。


わーい。これで今年9本目です。ここのところ調子が良い!


そう言えばランキングの入力、昔は「T.T」を使ってたんだけど、これ始めたころに「TAK」を使うようになって……でも最近ちゃんたけ大先生が「TAK」と入力してるのを目撃してから、恐れ多くなって「T.T」に戻しました……が、このゲームではとりあえず「TAK」に統一。

今回はまさかクリアまで行くとは思ってなかったから録画してなかったー。アーケードモードとかボスラッシュモードはまだ続けるつもりなので、どっかのタイミングで攻略法を忘れないうちに録画できたら、と。

(2019.06.18追記) 近所のゲーセンでAC版のアーケードモードをクリアしました。

2019年6月1日土曜日

疾風魔法大作戦(SS / AC)

とりあえず日和ってクリア優先で1周しました。



もちろんチッタでプレイ。ずっと右側のステージを選び、最後は一番右のCを選択。他のコースはあまりやってないけど、たぶん一番簡単なコース。レースで1位になると「魔法娘はおとしごろ」を経て2周目。この展開から2周目入るとコースは選択無しで左側ってのは確認したけど、これは1周目選ばなかったコースになるのか、常に左なのかは未調査。レース2位でもチッタに「こんどはあなたと1位とりたいな♥」と言われるので満足度高い。

クリア優先だと前作よりはだいぶ簡単な気がする。右コースを取る限りは特訓が必要になる類の道中やボスは存在しないし、1周15分くらいだから気軽に楽しめ練習も捗る。ただ各面ノーミスでクリアできるようになるまではすぐなんだけど、レース要素のせいでなかなか安定はしない。それでも某格付けサイトのランクで言えば、たぶん1桁後半くらいの難易度じゃないかなぁ……実際には14とかついてるけど。もちろん他のコースや2周目入りを考えるとぐっと難しい。



あ、基板の修理はまだ完了していません。M2が移植するまでには直すぞー。

2019/06/04追記:サターン版の隠しモードでレース要素を落とした「シューティングモード」なるものがあるらしいので試してみました。ちなみに公式サイトでは「オプションのサウンドにカーソルを合わせて「上上下下左右左右BA」と入力することで、項目が増える。 」とありますが、実際には「オプションで上上下下左右左右と入力した後、サウンドにカーソルを合わせてスタートボタン」かな?
いざ遊んでみると、やっぱりバランスとかレベルデザインはレースモードでとられてるんだなぁ、という当たり前の感想。レース要素が消えた事で緊張感が足りなかったり、空白地帯ができちゃったり。左コースはそれでも難しいですが。クリアできるようになったコースだと物足りない感じはしますね。
あと、このモードはクリアさえすればレース1位と同じ扱いなので、へっぽこプレイでも2周目に入れる。ので、左コースを選ぶとどうなるかの確認ができました。2周目は1周目で選択してないコースに自動的に進むんですね。となると1周目は左を選ぶのが2周クリアへの最短の道か……。

2019年5月29日水曜日

LIFE FORCE(SS / PSP)

大阪にでかけている間に少し遊んでクリアできるようになったので、PSPの録画環境のテストも兼ねて記録を残してみました。

前回の沙羅曼蛇は敢えて処理落ち制御を外して1周13分ほど。今回のPSP版はM2のエミュレーションベースなのでアーケードと同程度かと思いますが、18分くらいで1周しました。

しかし沙羅曼蛇、名作とは言え、どっちのバージョンもお茶目なバグが多め。でも、そういう細かいとこは無視して〜と言えるくらい惹きつける何かがあるのかな。個人的には音楽もそうだけど効果音がね。レーザーやミサイルの音はやっぱり凄い。



沙羅曼蛇ポータブル、まだアーカイブスでダウンロード販売ありますので。PSP/VITA/PS3でしか動かないので現行ハード向けじゃないですが。そっちはアケアカで。でもXEXEXやスムーズスクロール版GRADIUS 2が遊べるのは沙羅曼蛇ポータブルだけ!M2のねじ込み力!