9999年12月31日金曜日

当ブログにおける注意点

全般的な注意点

Basically, all articles are written in Japanese, but please feel free to ask me to translate or explain it via Twitter, etc. At GitHub, I'm using English usually.

本ブログは個人の意見を発信する場となっています。ここで記述された情報、意見は所属する組織とは一切関係ありません。

また、記述された情報を利用する事で発生した問題についても当方では一切責任は負えません。自己責任でお願いします。

コメントの見落としが多いというか、ほとんどチェックしてなかったので、何かあればTwitter等のソーシャルメディアで突いてもらえれば捕まるかと思います。

電子工作・アーケード基板系の記事について


趣味で書いてる記事のため、わりと軽い感じで書いてたりはしますが、当方一応は電子工学学士、情報理工学修士です。元LSIの論理設計者でもあり、現役のソフトウェアエンジニアでもあります。適当にやってるようで実は難しい・あるいは危険を伴う事もあるので、専門的な知識、記事の理解なしに見よう見真似で試すのはやめて下さい。ソフトと違って不可逆な失敗のリスクはいたるところに転がっています。最悪、命を脅かすような事故にも繋がりますのでご留意下さい。不明な点はTwitter等で気軽に話しかけてもらえればアドバイスできる事もあるかもしれません。


ソフトウェア系の記事について


ソフトウェアに関しても低レイヤーの情報は一歩操作を誤るとデバイスの文鎮化、データの消失など重大な被害に繋がります。こちらも十分な知識なく、記事を鵜呑みにして実行するのはやめて下さい。


際どい技術情報について


特にメーカー保証の終了した基板の修理などは、修理・調査の過程で本来開示されていなかった技術情報、あるいは守秘義務によって守られるべき技術情報を偶発的に知ることが多々あります。調べた事は可能な限り共有しあう文化で育ってきたため、自分で調べた事は積極的に発信しています。その際、関係各所には配慮するなり、不利益がないよう考えてはいますが、所詮こちらの立場しか見えておらず、権利者からみたら不都合があるかもしれません。その際には連絡頂ければ直ちに双方にとって良い状況になるよう対処したいと考えています。よろしくお願いします。権利を持たない方からの警告等は対応いたしかねますが、個人的に妥当と思える場合には対処します。例えば権利は昔在籍した会社が所有するが、実際にその製品に関わっていた、といった人からの連絡などは間違いなく配慮します。

2021年11月15日月曜日

naomiのROM BOARD TEST

 naomiのROMボード修理中につき、ある程度まとまった情報になったら随時ブログにまとめときます。

今回はシステムのテストから実行できるROM BOARD TESTの話。

このテスト、搭載ROMのチェックサムを確認してくれるのですが、肝心のチェックサムはIC22の中に入っているため、IC22が読めないとチェックできません。故障が多いらしい837-14114-01タイプのROMではバッファの故障が多いため、IC22自体が読めずにROMチェックがほとんど意味をなさないようです。IC22が正しく読めないと、TYPE、RESULTが?で埋まります。この状態で故障等のアタリを付けるのは大変なので、ひとまずIC22に書かれたメタ情報について調べてみました。

IC22は、各ROMについて以下のような6-Bytesのデータを保持します。

struct rom_entry {
  uint16_t type;
  uint16_t byte_sum;
  uint16_t word_sum;
};

メンバーはlittle endianで格納されてます。typeについては

enum type {
  kRomType_16M = 0x0002,
  kRomType_32M = 0x0003,  // maybe?
  kRomType 64M = 0x0004,
  kRomType_NotInstalled = 0xffff,
};

って感じだと思います。NotInstalledだと検査自体されない。

で、IC22のオフセット0x0000015cから、

struct {
  struct rom_entry ic22;
  struct rom_entry ic1;
  struct rom_entry ic2;
  struct rom_entry ic3;
  struct rom_entry ic4;
  struct rom_entry ic5;
  struct rom_entry ic6;
  struct rom_entry ic7;
  struct rom_entry ic8;
  struct rom_entry ic9;
  struct rom_entry ic10;
  struct rom_entry ic11;
  struct rom_entry ic12;
  struct rom_entry ic13;
  struct rom_entry ic14;
  struct rom_entry ic15;
  struct rom_entry ic16;
  struct rom_entry ic17;
  struct rom_entry ic18;
  struct rom_entry ic19;
  struct rom_entry ic20;
  struct rom_entry ic21;
};

といった感じでデータが並んでます。これを見てチェックサムを計算し、byteとwordともに期待値と一致していたらGOODを表示します。IC22自身についてはtypeは参考にするけどチェックサム自体は意味がないので無視して常に`----`を表示するようです。というか、ここは間違った値が入ってたので、単に無視してるのか別の用途で使ってるのか……。またtypeが未知だとTYPEとRESULTを`?`で埋めるんだと思います。GIGA WING2ではIC22が読めずにサイズがわからなくともbyteとwordについて正常時と同じ値が計算されるのは確認しました。ROMタイプが64M以外の時に正しい値になるかは不明です。

ちなみに応答するROMがなかった場合は0xFFではなく0x00が読み出されるようデータバスはpull-downされているようです。

2021年11月6日土曜日

naomiのガンコン対応ゲームをお家で遊ぶぞい

IONA-USを作ったので、USBのコントローラさえ存在すれば、あとはファームウェアなんとかするだけでJVSの特殊コントローラとして動作させる事ができる。そんなわけで、今回はアーケードゲームを家庭で遊ぶ上でやっかいなガンシューに対応してみようと思います。

まず肝心なのは、液晶環境で動作する汎用ガンコンを見つけるところ。調べたところ、どうやらPS3のタイムクライシス4に付属していたガンコン3が液晶でも遊べるとのこと。ヤフオクなどで5,000円前後くらいで入手できそうです。同時期に同じような仕組みでPC向けなどに出ていたガンコン(TopGun III、Single Arcade Guns、ArmTrak)もあるようなのですが、10年前、20年前ならまだしも、今は入手が難しいですね。Cabela's Top Shot Elite Firearm ControllerってのがWii/PS3/Xbox 360のバリエーションがあって辛うじてebayで手に入るかな。playasiaにあったので注文したら「ごめん、やっぱなかった」って払い戻し面倒でした。って事で日本ならガンコン3が入手性の面でもオススメ。現実的な値段で入手するならガンコン3がレア化するギリギリ前の今が最後のチャンスなのかもしれません。おそらくFPS勢は既にVRに行っちゃってますからね。モニタの座標をとる必要のあるUSBデバイスとかPS4世代以降は需要がないんだと思います。Switchのジョイコンのセンサーにアタッチメントってあたりならワンチャン……って感じなのかな。

ガンコン3の設置はそこまで難しくなくて。USBから電源だけとってる2つのマーカーLEDがあり、これをモニタの左上、右上に正面を向けて置くだけ。電源もらってるだけなので、このUSBは充電アダプタとかに繋げるのでもOK。一方でガンコン側のUSBとしての挙動は少し複雑。期待してたのは標準的なPS3互換のレポートでアナログ部分に座標が入ってくるってくらいだったんだけど、完全に独自クラスどころか、表向きは1ポートのUSB Hubで、その向こうにベンダー固有クラスを使ったデバイスが仮想的に接続され、データをシャッフルして通信する独自プロトコルになってます。これ、先行して調べてくれてる人がいなかったら面倒で投げ出してましたね。ちなみにこの人が調べてるのはHubの向こうに仮想的にぶら下がってるデバイスのプロトコルのみ。ハブ部分は標準通りなので一般的なOSならシステムが処理してくれて、ハブ越しに現れるデバイスのドライバさえ書いてやれば動く。という事で、IONA-USにはハブの簡易対応コードを追加し、その上でこの独自デバイスを仮想HIDとして扱い、そこからJVSにマップしてやるコードを追加しました。

JVSへのマップについてはnaomiのDeath Crimson OXに対応してみました。アナログ0と1が1PのX座標とY座標、アナログ2と3が2PのX座標とY座標になってます。それぞれボタン1がショットという素直な配置。スタートボタンも必要だったのでA1っていうボタンをアサインしました。

画面内・外の判定はキャリブレーションをやればゲーム側で勝手に判定してくれます。最初、キャリブレーションをIONA側でやるとしたら大変だなーって思ってたんですよ。マイコン的にはクロックはそこそこ早いとは言えアーキテクチャは8051ですから。ホモグラフィ変換行列の計算(プロジェクションマッピングとかと同種の計算ですね)とか、自前で浮動小数点と三角関数を用意しないとかなーって。でもゲーム側でキャリブレーションするなら生のデータを送ってやれば最低限はOK。デバイス的には見える世界を二次元の投影で理解して、マーカーの位置から向いてる方向を計算しているだけの値が上がってきます。各地点で奥行きの距離とか考えて歪補正したりはしてません(そこまで自動でやるにはマーカーは4つ必要だし)。

ただ、ゲーム側のキャリブレーションもそこまで真面目な計算はやってないんですよね。なので、基本的にはモニタの真正面から、投影に歪みの出ない位置関係で遊んでやるのが望ましい。という事で、本当はIONA側でホモグラフィ変換かけてやれば追跡精度も上がるんだろうなぁ。キャリブレーションが2重になってわかりにくくなっちゃうけど、設定モードつけて画面4隅をマークさせればホモグラフィー行列も求められて、斜めから撃ってもゲーム側では補正された正方形とかで判定できます。まぁ、今の所そこまでやる予定はないですが、興味ある方の改造をお待ちしております(笑)。ただ、ファームウェアサイズ的にはメインに取り込むにはキツイとは思ってるのでマージできるかはサイズ次第かな。

という事で、実際に遊んでみた動画がこちら。

1.31から正式に対応してます。 

2021年9月21日火曜日

Egret II 麻雀用Jコネクタ

Egret IIのコンパネ用のコネクタ情報はArcade Otakuに一通りまとまってるんだけど、麻雀パネルのJコネクタに関する情報が見つからなかったので調べてみた。1番ピンから順に9, 8, 10, 11, 1, 5, 6, 7, 2, 3, NC, NC, NC, NC, 4って配線。これなら麻雀からJAMMAに変換するハーネス作っといて、電源、画像、音声はそのまま繋ぎ、麻雀用のI/OをJ端子上で同じピンになるJAMMAのI/Oに繋げとけば良いのかな?

パドルのパネルも確保したんだけど、こっちは端子が違ったので繋ぎ方はまた後で考える。

追記:最後の4が繋がる端子、マニュアルのWiringを見るとJAMMAのD端子の5Vに繋がってる。トリッキーだけど、ゲーム基板側でこの辺がショートしてなければ独立した端子として機能するのかな?という事で、4はDに繋げれば良さそう。

2021年8月28日土曜日

基板修理:eX-BOARD

動かないeX-BOARDが2つほどあったんだけど、息抜きに少しいじってみたら簡単に直ってしまったのでメモ。のすけさんの修理本も参考にしました。

壊れてた2台は電源入れてもLEDが点かない状態で、電源の故障を疑って放置してました。んで、Pico PSUを用意して作業を開始したのですが、実際はBIOSの電池切れで存在しない電源ボタンを押されるのを待ってる状態でした。

という事で、まずは下側の基板にある電池を交換。普通にCR2032で交換可能なソケットに刺さってるので交換は簡単。この状態で仮組みして電源を入れると、電源ボタン待ち状態になる。

で、電池の左に見える2x8ピン(1ピン欠けてるので実際は15ピンだけど)がフロントパネル用のコネクタ。このへんはマザーボードのマニュアル見っけてくれば載ってる。写真の向きで、

1+5VDUAL2+5V
3+5VDUAL4HD_LED
5-PLED_26PW_BN
7+5V8GND
9NC10RST_SW
11NC12GND
13SPEAK14+5V
15欠落16-SLEEP_LED

らしいので、このうち6番のPW_BNをGNDに瞬間的に落として上げると電源オン、もう一度瞬間的に落とすと電源オフ、の繰り返しかな。基本的には電池を交換してあげれば、あとはここをショートさせて電源を入れるのは1回だけで良いはず。それ以降はマザーボード的には電プチで強制終了されるので、BIOSの電源管理設定により、次回の電源投入時には前の状態に戻ろうとして自動で電源が入ります。

続けてこの状態から電源を入れると、BIOS設定の初期化をちゃんとしろって怒られるところで止まっちゃう。

ここでキーボードが必要になるので、シール封印してある部分を開けるか、下のボードもケースから出すかしてUSBキーボードを指す必要がある。

この部分。シールはピンセットで端からペロってめくればほぼノーダメージではがせます。で、DELキーを押してBIOS設定画面に入るとパスワードを聞かれるので「onestar7」でENTER。しれっと書きますけど。で、BIOSに入ったら初期状態のまま何もせずに保存して終了で問題なし。再起動が始まるのでキーボードはすぐに抜くこと。抜かないとWindows起動後にドライバ云々のダイアログで止まります。

以上で作業完了。あとは元通りに組み立て直して完成。

ちなみに、片方のマザーは下のボードのコンデンサが1つ死んでました。

このままの状態だと電源投入が不安定になってました。一度動き出せば安定するんですが、数秒で落ちちゃう時と動き出すときが半々くらい。まぁ、明らかに良くない状態なので、これに関しては交換で対応。1500uF - 10Vだったかな。基板のハンダは自分の設備だと450度くらいまで上げないと溶けなかった。普段190度のハンダを320度設定くらいで使ってるので、きっと出てる数値は高め。適度に融点低めのハンダと混ぜながら吸い取って引っ張りました。

そんなわけで、のすけ先生の記事はBGAのチップのハンダ不良を直したりという離れ業をやってたのでガクガクブルブルだったのですが、手に入れた故障基板は比較的簡単な修理で済みました。

余談:eX-BOARDの電源はJAMMAから供給するか、裏側の12Vアダプター経由で供給するか選べるようになっているけど、JAMMAから取る場合、12Vのみを取り込んで電源ユニットでATX電源に必要な各種電圧を作る。アダプターの容量から考えると5A必要なのでJAMMA側から供給するのは諦めたほうが無難。あと中の電源基板についても、壊れてたらさっさとPico PSUとかに交換しちゃった方が今なら省電力で発熱も押さえられるかも。

追記:BIOS設定画面は最近のモニタだと映らないかもしれないくらい低解像度かつS端子からも表示出てない気がするので将来の自分のために画面見ずにタイプするためのメモ。DELを押したら数秒待ってパスワードonestar7↩、BIOSに入ったはずなのでカーソルで↑↑でSAVE & EXITに移動して↩↩(2回目は確認ダイアログのYes選択)

おまけ:マザーのDIPSWは

  1. JAMMA経由の音声出力
  2. JAMMA経由の映像出力
  3. タイトル固有設定
  4. タイトル固有設定
  5. タイトル固有設定
  6. タイトル固有設定
  7. タイトル固有設定
  8. タイトル固有設定(AH2では15kHz画面出力)

2021年8月16日月曜日

2021年春から夏にかけて遊んだゲーム

スラップファイトMD版SPECIAL

メガドラミニで去年ノーマルモードを1周してたけど、やはり古代ファンとしてはスペシャルモードもクリアしないとね、という事で。

R-TYPE Final 2

クラファンでサポートしてた待望の新作。PS4版でNORMALはノーミス、BYDOはワンコインでクリアできました。iremゲームで(はないけど)ワンコインしたのは初めて。

戦刃アレスタ

ついにM2のオリジナルシューティング、しかもアーケード。おまえどこの世界線から来たの?って突っ込みたくなるようなキメラ感。それに今までM2STGシリーズのアレンジモードを遊んできた人だと、その流れも感じられるゲームデザインになっていて、アレスタであり、東亜でもケイブでもライジングでもありながら、きっちりとM2STGな感じが良いです。

ひとまずカジュアルでクリアしたけど、まだまだ遊ぶ。というかせっかくAPM3というどこのゲーセンでも遊べる状況なのに、未だコロナの状況が芳しく無く、ゆっくりと遊びに行けないのが悲しい。今は隔週の医者の帰りに薬局で薬を待ってる間に1プレイって感じ。



Xマルチプライ

今やりこんでるのがこれ。アケアカ@PS4にて。ラスボス第二形態まで来てるので今にも1周できそうな感じなんだけどね。

IONA-USが(製造的な意味で)できるまで

なんとなく製作記事です。

KVClab.さんでの販売が始まりましたが、どんな過程で製造してるのか簡単に紹介。前作のIONA-JS以上に部品が細かくなっているので作るのも大変。テスト含めて色々と工夫してます。

一番最初はまず裏面のmicro USB端子から始めます。このハンダ付けが一番難しく、また電源なのでショートしてたら大惨事なので、このようにテストボードに繋いでショートしてないか、GNDと電源が正しく繋がっているか、テスターで確認しています。

次のステップではマイコンと周辺のチップ抵抗、チップコンデンサをハンダ付けし、JVSのコネクタを実装します。抵抗やコンデンサはこの時点で必要ないものも含まれています。というのも、コネクタを付けてしまうと後からハンダ付けするのが難しくなってしまうからですね。

続けて、ファームウェアの書き込み。ここでPCと接続し、サポートページにあるファームウェア更新ページを使って出荷用のファームウェアを書き込みます。ファームウェアを書き込むまではサービスボタンを押さずに電源を入れてもファームウェア更新モードになるため、ボタンを実装している必要はありません。これによりマイコンの基本的な動作確認とJVSコネクタ、電源コネクタのテストができた事になります。

次にLEDの実装。電源を入れて点滅すればファームウェアは無事に起動しています。あとLEDを逆向きに挿してないことの確認にも(笑)

ここまで来たら、あとはボタンとUSBコネクタのハンダ付けをして完成させます。

最後に最終動作テスト。右側の白い基板がIONA-USのテスト用に作った基板で、JVSホストの機能を持つUSBデバイスです。PCに繋ぐと2つのゲームパッドとして認識され、JVS側に繋いだI/Oからの入力を反映させる事ができます。これにより、JVSバスで正しく通信できる事、テストとサービスボタンが正しく反応する事が確認できます。またUSBコネクタにゲームパッドをそれぞれ繋げ、入力が正しく伝達する事を確認します。対応パッドを繋げばLEDが点滅するのでUSBバスの動作は確認できるし、ボタンについても同時押し2回で保存データの初期化を行えばLEDが点滅するため、実はこのボードがなくても確認はできるんですけど。やっぱりあると色々と便利で開発効率があがります。

IONA-JSの場合は最後のテストがもう少し大変で。ボタン毎に断線・ショートがないか確認しなければならないため、このフェーズでボタンを1つずつ押して個別に反応するか調べなければなりません。

実は最初の頃は1枚1枚naomiとJAMMA環境に繋ぎ、ボタンを1つずつ確認をしていましたが、あまりにも面倒なので途中でこのボードを作りました。このボードはJAMMAの入力をマイコンから制御し、右側に出ているJVSホストを使い、JAMMAからの入力がJVSを通して正しく返ってくるか確認する事ができます。これを使って自動的に個別のパターンを送ってテストしています。テストに失敗したらどのピンに異常があるかわかるので、該当ピンを虫眼鏡で見ると浮いてたりブリッジしてたりするので修正するって感じです。だいぶ手間が減りました。最後にnaomiに繋いで認識されるかだけは確認しています。これはVer 1系のボードで本番環境だと電源との相性なのか、クロックがうまく入らずに動作しないケースが稀にあったためです。Ver 2系のマイコンは内蔵クロックで動くため、この辺の心配はなさそうです。あと最近はテストボードでSENSE信号の電圧も測定するようにしているので、その辺も相性問題が出そうな個体を事前に識別するのに役立ってるかもしれません。

まぁ、そんなわけで、ありがたいことに同人ハードとしては結構な人気商品になりました。アーケード環境維持のために少しでも役立っていれば嬉しいです。

おまけ:筐体を置く場所もなく今までDYIでアーケード環境を作ってきた結果生まれてきた同人ハードでしたが、新居を構えるに際し、ついに筐体を購入しました。シューティング好きという事もあり、モニタの回転が比較的簡単にできるイーグレット2です。なかなか中古市場にも出てこないため、引っ越しまでずっと張り付いてないとかなーって思ってましたが、探し始めてすぐ「近日入荷」のお知らせを見つけ、連絡して契約成立。今はまだ新居に近い妻の実家に置いてありますが、来年春には新居も完成し、自分の仕事部屋に基板格納庫とともに設置されます。楽しみ:)