[VectorScan] ATARI STARWARS on MAME Vector Draw Mod.

ずっと前からMAMEでのATARI STARWARSの描画に納得がいってなかった。敵弾はもっとギラギラ光ってたし、被ダメージ時には画面がチカチカするし、デス・スター爆発は眩しかったし。そう思ってたけど、修正するのは大変そう。

ちょっと前に、あることがきっかけで「MAMEでSTARWARSを動かして描画されたベクターデータをファイルにダンプ」「そのダンプファイルをSVGに変換して1フレームずつ表示するWebアプリ」をClaude Codeに作ってもらったことを書いた。その時にいろいろ調べた結果、「敵弾がキラキラする理由」「被ダメージ時に画面が点滅する理由」「デス・スター爆発が眩しく見える理由」がおおよそ判明した。

ATARIのカラーベクターゲームに使用されているAVG(Analog Vector Generator)では、下記のコマンドで描画を行う。実際にはジャンプやコール・リターンなどもあるけど省略。

  • CNTR 描画位置を画面中心にリセット
  • SCAL 描画時のスケールを設定
  • STAT 描画時の輝度・カラーを設定
  • VCTR 指定されたX/Y方向に指定した輝度でベクターを描画、輝度が0だと描画位置の移動のみ

STARWARSだとSTATで指定するIntensity(輝度)が8bit、VCTRで指定するIntensityが3bitである。で、眩しく光ってる敵弾とデス・スター爆発の時のベクターは「STAT Intensity:0xff」「VCTR Intensity:0x7」と最大レベル。つまり最高輝度で何かが起こってる。

古くから存在しているドキュメント「The Secret Life of Vector Generators」を改めて読んでみると、今まで気づかなかった部分を発見した。

The Secret Life of Vector Generators

該当部分を翻訳して引用したのが下記の一節。

デス・スターを思い通りに爆発させるには、同心円をたくさん描くだけでは不十分でした。ビームをぼかして、画面を埋め尽くしたかったのです。フォーカス電圧を制御するために、モニターに真空管を追加することも検討しました。幸いなことに、その部品の納期が長すぎました。そこで、ベクトルジェネレーターにモニターのカラー入力をオーバードライブする機能を持たせることにしました。入力をオーバードライブすると、CRTは通常よりも多くの電流を消費し、高電圧が低下します。これにより、フォーカスグリッド電圧とアノード電圧の通常の比率が変化し、ビームがぼやけます。

つまり設計上、Intensityはオーバードライブ領域まで突っ込めるようになっていて、その時にビームがぼやけて太くなると。コレですわ。

先の「ベクターダンプデータを元に表示するWebアプリ」に、そのオーバードライブ時の処理を入れてみたらいい感じに表示された。ビンゴだ。被ダメージ時に画面が点滅するのは、画面外にこのオーバードライブ状態のベクターが描かれたら光らせればいい。これも良い感じ。

じゃあこれをリアルタイムでやればいいのか? MAMEの改造とかしんどすぎるよ、と思いつつClaude Codeに頼んでみると行けそうな感じ。マジか?

しかし上手く行かない。bgfxとか知らなかったので、Claudeに指示する方もふんわりした言葉でしか出せないのが原因。作って壊して勉強しての繰り返し。なんとか三回目で納得いくものが出来た。

ある時、Windows限定でMAMEを「-video d3d -hlsl_enable」で起動すると、Direct3D9を利用したレンダラがベクタースキャンゲームで有効になることに気づく。こっちの方が見た目がいい。じゃあこれを急遽マルチプラットフォーム対応のbgfxに移植して、先のオーバードライブと画面点滅を実装すればいいんじゃねと。

しかしそのまま移植するとかなり重たくなってしまった。たまたま40fpsのSTARWARSだとギリギリで動いてしまうので気づかなかったけど、60fpsのTEMPESTだと処理落ちする始末。慌てて軽量版を作って回避したり、RTXの自動輝度補正が悪さをして原因究明に時間がかかったり。

そしてなんとかなった。ソースコード・ドキュメントはほぼすべてClaude Codeによるもの。動画はNVIDIAツールで録画しただけの代物。敵弾と被ダメージ表現は我ながらいい感じだと思う。デス・スター爆発はもうちょいなんとかしたかったけど、改善するにはMAMEの表示周りを大改造しないとダメだと思う。

被ダメージ時のモニタ点滅のメカニズムを動画で再現、蛍光面の外に強いビームを出すとブラウン管内部で拡散されてモニタが光る。エミュレータでもちゃんと実物と同じ動きをするのは作った本人でも感動する。

TEMPESTデモアトラクトも出しておく。実機には負けるけどタイトルの眩しい感がポン出しで出せたのは嬉しい、実機だとモニタが焼けるほどの輝度だし。

Windows 64bitバイナリは下記からダウンロード出来るので、試せる人は試してください。当たり前だがROMイメージは付いてないので自分で用意する事。アーカイブ中のvector-mod.txtを読んでbgfxにしないと見た目が変わらないので注意。非力なマシンだとちょい厳しい。CPUよりグラボ依存。

Release MAME Vector CRT Mod (0.288, Windows x64) · okaz-code/mame

そしてMAME devにpull requestも出してしまった。ちゃんと規則を守って出してる。大丈夫なんかなコレ。

MAMEに元からあるD3D hlslから移植・改造した項目は下記の通り

  • 蛍光体残像
  • 色変換/コンバージェンス
  • デフォーカス
  • シャドウマスク
  • 球面(樽)歪み
  • 長いベクター線の輝度減少
  • 多段BLOOM(8 段・RGBA16F 累積)、オリジナルの15段を軽量化

自分で設計して追加した項目は下記の通り

  • ベクター線両端の円描画処理
  • HALO平滑化(BLOOMの段数が少なくなった代わりの措置)
  • 糸巻き歪み
  • 縮小によるオーバースキャン領域の表示
  • フレーム単位でのフリッカー処理
  • RGBカラーの調整
  • オーバードライブ(STARWARSのみ)
  • モニター発光(STARWARSのみ)

その他いろいろあったかも。ありすぎて分からん。

非力なマシンではダメだと思ってはいたけど、手持ちのSurface Pro4でフレームレートガタ落ちになったのには笑えなかった。さすがに仕方がないか?

まだやりたいネタは色々あるけど、これ以上は流石に手間暇が大変そうなのでちょっと休もう。

[ベクタースキャン] LLMでVectrexエミュレータを作ってみる

本件、どちらかというとコーディングエージェントの話です。

ちょっとやってみたいことがあってVectrexエミュレータを作れるかAIに相談したら「Pythonで行けるよ」と言われたのでClaude無料プランで壁打ちを始めたのが一週間くらい前のこと。しかし無料プランはすぐにリミットを使い果たす。Claude Codeを使ってみたかったので先週金曜日にお試しでProプラン(外税$20)を課金してみた。

Claudeは5時間ごとの区切りでレートリミットがあり(使わない場合でも溜まるとかはない)、さらに一週間の区切りで別のリミットがある。この5時間ごとのレートリミットが厳しくて、Claude Codeはプロンプト一発で30分くらい悩んだ末にリミットまで使い切ってしまうことも珍しくない。「Claude CodeはMAXプラン(外税$100から)じゃないと使い物にならない」と皆が言ってた理由を思い知る。

CPUと表示・音声・コントローラ周りを制御するVIA周りの最低限の部分は割とすぐ動いたのだが、画面描画が全然ダメで滅茶苦茶な絵しか出ない。そこから正しく描画させるのにめちゃくちゃ苦労する。他エミュレータのソースとかも参照させてみる。

Anthropicから「色々ゴタゴタがあったので課金枠をプレゼントするよ」って出てProプランだと$20.0分の枠をくれた、この追加分は通常のレートリミットとは別に使えるのだが早々に使い切ってしまう。

数日格闘して月曜に起動時の外枠と文字の塊らしきものが表示されて歓喜していたのだが、この辺りでついにClaudeの一週間のレートを使い切ってしまう。すなわち金曜まで課金しないとClaudeはマジで何も出来ない。

仕方がないので別口で課金しているGitHub Copilotにタッチ。使用するモデルはAutoモードだとSonnet4.6を使うけど、Claude Codeで嫌な目にあったのでGPT5.3-Codexにバトンタッチ。

GitHub Copilotのレートは月単位で毎月1日の日本時間9時(つまりはGMT+0)にリセット。見ていると使用枠は食いつぶしてるけどClaudeよりはマシな気がする。途中エンバグしまくって大変な目にあったけど、月の使用量を一日で20%くらい使ってなんとか表示が正常化出来た。

ここまで苦労した理由は、ラスタベースのハードだと普通は「メモリに書き込んだ内容」がほぼそのまま画面に出るんだけど、VectrexはベクターRAMに書き込んだ内容をベクタースキャンで描画する部分がデジタルとアナログのハイブリッド回路なのが原因。結果人間が見て調整するしかなかった。

これはラスタベースのハードでも「BGとスプライトのプライオリティが変」とかよく見る奴、この辺りはどちらかというとアナログ回路の話である。ポリゴン系ハードもベクターみたいな問題が出そうなんだけど、あちらは基本デジタルなんでマシなんだろうか。

Python+PyGameなのだが思ったより(正確には生成AIが想定してたより)速度が出ない。一部モジュールをCython化してもらって音無しで実機と同じ程度までは高速化したけどこれ以上は厳しそう。なので今回のアプローチはここまで。音声用のAY-3-8910コアも実装済みのはずなんだけど動作確認はしていない。

一応MineStormはそこそこ動くけど、2面から出てくる機雷を倒すと一時的に描画がおかしくなる問題を確認済み。Scrambleはなんかちらつきがひどいし、ArmorAttackに至っては起動しないという状態。ここら辺で嫌になってこれ以上の確認はしてない。全部のソフトで動作確認をするのってすごく大変。

結局最初の「やりたいこと」は出来てないので、また別の方法を考える必要がある。ただコーディングエージェントの勉強にはなったなと。Vectrexのハードに対する知見も得られた、このハードでゲームを作りこむのめちゃ厳しい。

[ベクタースキャン] ATARI STARWARSにおけるダメージ表現の手法

以前から、アナログオシロスコープに384kHzまで再生出来るUSBオーディオを繋げてベクタースキャンを再現してる人が居て、MAMEを改造してATARI STARWARSの表示までたどり着いていた。すごい。

ダメージ時に白い枠が出ることに気づいておられた。コレってオレも動画で紹介しようと思って棚上げにしてたんすよね。オレしかやる人が居ないならやるしかないか、という事で夜に作業開始。

まずSTARWARS基板を引っ張り出して、表示系のX/Y-SIZEを調整する半固定抵抗を調べる。STARWARSは基板側シルク印刷に「X-SIZE」「Y-SIZE」とか書いてないの。説明書を引っ張り出しても書いておらず、結局回路図も引っ張り出して確認する羽目に。

半固定回路が付いているベクター出力アナログ回路側を上にしてハーネスを接続して電源投入。久々だけどちゃんと映って一安心。んで半固定抵抗を回す、ちゃんと動くね。

スマホと三脚、雲台にスマホを固定するプラケットを引っ張り出してセッティングして撮影。最初は露出が高すぎて全然ダメだった。スマホの画面だと良い感じに見えても、Macに持ってきてモニタに映すとダメだったりするので難しい。

色々と試行錯誤してなんとか撮影完了。しかしiCloudでの転送がめちゃ遅い。有線で繋げばすぐなんだけど、放置してブルアカの続きをプレイしてたら終わったのでiMovieで切り出し。

まずは通常設定でのダメージ表現の例、ダメージを受けるとモニタが光るのが分かる。

次に基板側で表示サイズを最小サイズにして、先ほどと同じカメラ位置で撮影。ダメージ時には周囲に白くて太い線で四角を描いてるのが分かる。上下がどうやってもはみ出るので手でY-CENTERを調整してみた、上が歪んでるのは何だろう?

オマケでみんな大好きデス・スター爆発シーン。この「同心円状爆発表現」はモニタの外側にも描いてる、そのせいかモニタも光ってるのが分かると思う。というか光りすぎてモニタの木枠まで見えてしまっている。

考えたけど「モニタの外に描画すると光る」というよりは「偏向ヨークによる電子銃の偏向角度は多分飽和するので、偏向ヨークの限界まで引っ張ってビームを出すと、ちょうどオーバースキャン領域のところに集まる」ために「蛍光面に当たらずに反射した電荷が蛍光面に当たって光る」のではないかなあ。単なる推測だけども。

もうちょっとオマケ、コックピット筐体のみモニター周りに反射テープが貼ってあります。正式名称「モニターサラウンド」という大仰なやつ。効果はそれなり。

自分が大昔YouTubeとニコ動にアップしてたベクタースキャン動画ってSANYO Xactiで撮影してたけど、そろそろまとめて撮り直すかーみたいな気分になってる。

今回の撮影はiPhone13 Pro Maxを使用。後で調べたら1080pの30fpsでガッカリ、道理でフリッカーが出るわけだ。4K60fpsも撮れるはずだけどデータ量が凄いことになりそう。せめて1080p60fpsで撮り直したいところ。

久々にベクタースキャンモニタを動かしたけど、これをラスタスキャンモニタで再現するの厳しすぎるって気分にしかならない。

[Vectrex/光速船]最新トレンドの紹介

寺町電人さんがここ最近のトレンドをまとめてたので紹介。

VECTREX2025年最新トレンド(おまけで光速船1983~84年) – Classic Videogame Station ODYSSEY 2025

オレは心が離れたというよりは、真面目に追いかけるとお金がいくらっても足りないからねえ…。あと「Google Reader」で追いかけるのが出来なくなったのもデカい。

[Vectrex/光速船]レプリカコントローラー

マルチカート作成でお馴染みのSean Kelly氏が手掛けたレプリカコントローラーが買えるようになっていた。

Vectrex Controller

送料別$85はかなり安いと思う、デカールも北米・欧州・日本全部選べるし。ただ日本版デカールは実物と比べるとちょっと色味とか違うらしい、まあ仕方がない。自分は買うかどうかちょっと悩み中。買うとしたらレンチキュラー版かなあ。

[光速船/Vectrex]バンダイ光速船 発売40周年

今日は「バンダイ光速船 発売40周年」なんすよ、当然のようにネタは用意しておりません。

いい加減今時のWebサイトに書き換えたいとは思ってるんだけども、どうするのがいいんですかね、一時期はatWikiに書き換えようと思ったけどコレも古いか?

[ベクタースキャン]USB-DVG(Digital Vector Generator)起動!

去年の春先だったか、eBayでUSB-DVGなるものが出品されているのを見つける。ちょっと調べたら「USB接続してベクタースキャンモニタをドライブする機器」らしい、つまりはオレの持ってる「ZEKTOR ZVG(こちらはパラレル端子)」と同様の内容でUSB接続出来る代物。なにそれ欲しい。

色々調べたら、FaceBookで作者自ら頒布している模様。んでeBayに出てたのは2回目頒布のキャンセル分の販売だったっぽい。ちょうど3回目頒布の予約中だったのでFaceBookのアカウントを取ってコンタクト。昨年のうちに支払いも済ませたが、このご時世なんで遅れまくり。今週の月曜日にようやく到着。お値段は$350、これに国際送料が$20。

しかし届いたはいいがセットアップマニュアルが無い、基板にシルク印刷してあるドメインも失効しているっぽい。調べたら公式サイトはある模様。インストールガイドとかはあるけど正直全然情報が足りない気がする。何よりモニタ出力がD-SUB15ピン三段、つまりはVGAコネクタなんだけどピンアサインが載ってないやん。

Home | Vector Head Arcade

FaceBookで検索をかけたら「普通のアナログVGAと同じだよ、H/VがX/Y」って書いてあって納得。なるほどR/G/BそれぞれにRTNがあるのでそれがGNDだ、H/V-SYNCのGNDは共通だけども。線材が無いのでAWG20の線材と同時にD-SUB15ピンのターミナルコネクタも見つけたので発注。ターミナルコネクタはAliで売ってるような代物だった、まあ使えるだろ。

他にラズパイ4が必要。こちらは事前に用意済み。ラズパイ4+32GB以上のmicroSDHC+電源が最低条件。実際にはキーボードとモニタ、LANケーブルも必要。ラズパイ4はメモリ2GBモデルで行けるかは不明、まあ4GB以上買っとけ。4B 8GBモデルを買ったけど問題は無い模様。

そして配線。モニタ側はお決まりのMolex MLXコネクタなので手持ちのコンタクトピンを圧着してコネクタに刺す。反対側はターミナルコネクタに配線。ピン抜きも持っているので配線をミスっても気軽に変更可能、はんだ付けするだけが脳ではない。USB-DVG側でR/G/B/X/YのGNDは全部共通なのをテスターで確認したので線も一本でいいやろ、ひとまずハーネスを配線完了。

公式サイトのGoogleDriveからラズパイ用のOSイメージをダウンロードして、PCからRaspberry Pi ImagerでmicroSDHCに書き出し。これお手軽で良いけど、後々の事を考えると結構頭が痛い。OSのセットアップ方法もどこかに載せて欲しいんだが。

ラズパイとUSB-DVGは付属してきた短いUSB-A・microBケーブルで接続する、これはUSB-DVGへの電源供給も兼ねてる。後で調べたけどUSB-DVGそのものは高速USBシリアル機器としてラズパイ側から制御するだけなのね(おそらく通信速度はRS-232Cの115200bpsを軽く超える)、多分長いとかヘボいケーブルだとダメなんだろう、だから付属ケーブルを使えと。

ラズパイの電源を繋いで、さらに制御用のキーボードとマウス(今回はLogicool Unifyingレシーバを使用)、電源とモニタケーブルを接続。ベクタースキャンモニタはちょっと怖いので手持ちの「VectorVGA」を使用する。ATARI仕様カラーベクタースキャンモニタと同じインタフェースでアナログSVGAに変換してくれるレアアイテムである。おお映った、青がドリフト気味だが問題無さそう。USB-DVG側の基板についてる二個のVRがなんだかサッパリ説明が無いんだが、これX/Yのサイズですね。リニアリティとかはソフトウェアで設定可能。

USB-DVG自体は単なるUSBシリアルで受け取るだけの機器かと思ったらインテリジェントデバイスで、モニタ設定メニューとかはこれ単体で動いてしまうのね、なので基板上に操作用のタクトスイッチが付いてると。んでUSBシリアルで接続するとクライアントデバイスとしてふるまう。

問題はなさそうなので手持ちのAmplifone’19モニタに接続。おお映った。これはUSB-DVG単体の起動画面。

そしてラズパイに接続するとAdvenceMAMEの起動画面、そこからラズパイに接続されたキーボードを操作するとゲーム選択画面が出てくる。これはZEKTOR ZVGの頃にあった奴と同じ、ただ一回ソースを紛失したので(一時期ソースはZEKTORサイトからDL出来たと思うんだけど)一回作り直したとか言ってた記憶。

にしても青が強い。描画されてない所でも出ちゃう&終点の輝度が強くてモニタが焼けるんじゃないかとヒヤヒヤする。モニタ設定を弄っても調整できず、モニタ基板側で調整する必要があるんだなコレ。めんどくさいので今回はそこまで動かさず。

MAMEはZEKTOR ZVGの頃からバージョンが上がってて、当時は動かなかったこんなゲームも一応動くのです、すげえ、コレがベクタースキャンモニタで動くのを見られるとは思わんかった。モニタが焼けそうなんでまともに遊べないけど。

後で気づいたけど、USB-DVG単体のモニタ調整メニューからクレジットを出して、そこからある操作でイースターエッグの「パックマン」が起動する。ベクターをほぼラスター描画してるだけで特に嬉しくはない、USB-DVGの基板側タクトスイッチで操作しないとならないので厳しい。

とりあえず本日はここまで。とにかくモニタの焼き付きが怖い、あとでFaceBookの過去ログ漁って、モニタ基板の調整。とこkまで書いて気付いたがハーネスの途中、R/G/BにそれぞれVRを仕組んだ方がいいかも。最悪Bだけでもいいけど。モニタ基板側で設定しても通常のゲーム基板と整合が取れなかったら繋ぎ変えるたびにモニタ基板側を設定する羽目になる、さすがにそれはめんどくさい。

多分日本で初めてUSB-DVGを動かしたと思うので(買った人は別に居る)もうちょっと満足しちゃった感はある。これでZEKTOR ZVGはPCごと捨てられるかなあ。まだ動くか知らんけども。

ここまで結構疲れた。午前中に久々にカラーベクタースキャンモニタ(Amplifone’19)に火入れするのも結構緊張して疲れた。Major Havoc筐体(こちらのモニタはWG6100)も久々に火入れしたけど元気に動いております。

にしても届く直前までUSB-DVGについては調べなかったけど、改めて調べ始めたら想像以上にクローズドな状態でちょっと面食らった。なにかソフトを書こうと思ってたけど出来るんかな。別の人がオープンソースで同じようなハード&ソフトを作ってるのだけど理由が分かったかも。クローズドにする意味は正直分からん、儲けられるほど高価でもないし、数も出ないし。

[光速船/Vectrex]PiTrex 導入編

Vectrexでいま一番熱い周辺機器は「PiTrex」だろう。Vectrexはカートリッジスロットに全部出てるのでCPUの乗っ取りが可能(カセットビジョンみたいだ)、そこでRaspberry Pi ZeroをCPU代わりにするという代物である。安価なのがポイント。

PiTrex Wiki Index

先日購入したDCコネクタ付きが無事オーストラリアから届いた(DCコネクタはVectrexを使わない開発時の電源供給用)。のでRaspberry Pi Zero WH(「W」は「Wireless」、「H」は「pinHeader」)と32GBのmicroSDカードも別途購入。

Raspberry Pi Zero WHと32GBのmicroSDカードも届いたのでサクッとセッティング。やり方はこれだけ、このお手軽さがまた実に素晴らしい。Raspberry Pi Zeroのセッティングすら不要なのはすごい。

  • microSDカードをFAT32でフォーマットする、OSによっては要ソフト、32GBなら大抵購入時の時点でFAT32でフォーマット済みっぽい
  • 配布ファイルをダウンロードして解凍して、指定されたフォルダの中身をmicroSDカードにコピー
  • Raspberry Pi Zero WHにmicroSDカードを刺す
  • PiTrexにRaspberry Pi Zero WHのピンヘッダを刺す
  • PiTrexの「Raspberry Pi Zeroを刺した側」を上にしてVectrexに刺してVectrexの電源を入れる

そして出てきた映像がまた凄い。うちのVectrexで「Bad Apple!」が動いて感動する。この手のデバイスではVectrex32ってのがあって(持ってる)、そっちは刺せば起動はするけどソフトの転送とかはUSBシリアル経由で結構ハードル高かったので。開発する気がないならRaspberry Pi Zeroは安い無印にピンヘッダを自分で半田付けしても良さそう。

色々デモを見た感じ、Vectrexってモニタの描画速度は結構速くてCPU速度の方がネックだったのか、という感想。Raspberry Pi Zero上で本体より高速に動くVectrexエミュレータを動かすのは中々倒錯感があってよろしい。でもPCMサウンドプレイヤーに「これそのまま入れて配布しちゃダメだろ!」って奴がある辺りは海外って感じがする。

青いオーバーレイを被せて白黒の線画を見たらカラーブレイキング現象が出る(白線に青や赤の境界線が見える)のにはちょっとビックリした。当たり前な気がするんだが全然想定してなかった。

これ弄ってたらキリがない(PiTrexのソフト自体もどんどん進化してる)ので、仕事がひと段落したら開発環境周りを弄る予定。ひと段落っていつ? 最低あと一か月くらいですかね。「ベクタースキャンでなんでもいいから自分の作ったものを動かす」のはずっと夢だったので、ええ。

[光速船/Vectrex]37周年ネタ

結局今年もまたネタを仕込めなかった。いや正直腰痛でそれどころでは無かったんですが、なんかやろうとは思ってたんですよ。

Twitterを見たら光速船で「Bad Apple!」を再生しているお方が。「Bad Apple!」再生ネタは随分前にも紹介してて、その時は外部CPUを使ってた。でも今回はそれと遜色ない動きなのに刺したカートリッジだけで動いている、なんだろう?

と思ったらどうやらコレっぽいです。新型マルチカートなんだけどSTM32が載ってて実質Vectrex32も包括してるみたいな。このマルチカートにはVectrexネイティブなゲームと、STM32で動くソフトの両方が入れられるわけね。んで「Bad Apple!」は後者と。

GitHub – technobly/VEXTREME: VEXTREME – Vectrex Multicart

開発環境はDockerで提供されてて、正直Vectrex32のBASICで書くよりはまだ敷居が低そうな気がする。欲しいけど、STM32向けコードを書いてもやっぱり動かせる人が相当限られるよねえ。ううむ。

というネタを持ちまして37周年記念で。