ど~もeagle0wlです(再)

140文字では収まらないネタを記録するブログ

昔のメガデモでよく見るKefrens Barsをゲームボーイで再実装してみた

Kefrens Bars

20yというゲームボーイメガデモがあるのだが、
www.pouet.net

www.youtube.com

冒頭で表示されるオーロラみたいなエフェクト(メガデモ界ではkefrens barsと呼ばれる定番のもの)をモノにしたくて、20yをリバースエンジニアリングして再実装を試みた。リバースエンジニアリングにあたりIDA ProとBGBのデバッグ機能を使用した。Githubアセンブルコードを公開している。

github.com

再実装はC言語で開発できるGBDKでやりたかったが、メガデモ然とした処理になるとフルアセンブラで書かざるを得ず、結局rgbasmを使用した。H-Blank中に処理をさせる必要があるため、非常にシビアな実装になっていた(2サイクル冗長になった時点で処理画が間に合わなかった)。昔のメガデモで使われている定番のエフェクトをもっと学びたくなった。

ゲームボーイを起動すると降りてくるNintendoのロゴが商標権を主張するためという件について


はじめに

Togetterで以下の記事を読んだ。

ゲームボーイを起動すると降りてくるNintendoロゴ、実は商標を利用したコピーガードのトラップだった。
togetter.com

この記事について指摘してみたい。

ゲームボーイを起動するとNintendoのロゴが降りてくるが、カートリッジを差し込まなかったり、カートリッジの差し込みが甘いとロゴが化けてしまい、ゲームが立ち上がらないケースがある。

カートリッジの差し込み状態で化けることから、ロゴのデータはカートリッジ側に入っていると推察できるが、実のところロゴのデータは本体側も持っている。

仕組みとしては、起動時にカートリッジ側にあるNintendoのロゴデータを読みこんで、それを画面に表示する。ロゴが表示されたあとに、もういちどカートリッジ側にあるNintendoのログを読み込んで、本体側で持っているNintendoのロゴデータと比較して、Nintendoのロゴではなかった場合は起動が阻止される…というものになっている(この説明は正確ではない、後述)。

なぜ、このような起動シークエンスがあるのか。

これは商標権を盾にしたトラップとして有効なのか?

この起動シークエンスは、海賊版のカートリッジを製造販売している業者に対して、商標権を主張するためのトラップであるという見方が定説である。しかし、ロゴデータは暗号化されておらず、違法コピー自体を防ぐものではないため、これをコピーガードと呼ぶことはできない。

同じような起動シークエンスは、ファミコンスーパーファミコンにはないが、ゲームボーイゲームボーイカラーゲームボーイアドバンスといった携帯機では標準装備されている。

ゲームの起動時に強制的にNintendoのロゴが表示されるから、任天堂のライセンスを受けていないソフトウェアが開発された場合に商標権侵害で訴訟を起こすことを可能にした、というわけだ。

現在、いろいろなメーカーが起動シークエンスのない「FC互換機(ファミコンの表記を避けた表現)」向けにあえて新作ゲームを商業ベースで発売する動きがあるが、起動シークエンスのある「GB互換機」「GBA互換機」向けに新作ゲームが供給されないのは、こういった事情があるからかもしれない。

しかし、実際にこの起動シークエンスを盾にして任天堂海賊版業者を訴えたという事例は、国内外問わず見つけることはできなかった(知っている方おりましたらコメントください)。

起動シークエンスの問題はアメリカの裁判で争点になった

同じような起動シークエンスは、セガメガドライブにも存在して、起動時にSEGAのロゴが表示されるというものだが、こちらについてはセガが実際に訴訟を起こしていた。アメリカで起こった裁判で、ソフトウェアのリバースエンジニアリング著作権侵害をめぐる問題において影響力のある「Sega v. Accolade」事件で争点になっている。
en.wikipedia.org

結論から書くと「ゲームを起動させるためにやむを得ずロゴを表示せざるを得ない場合は、フェアユースの範疇である(大意)」といった判例が出ている。したがって、アメリカにおいては、任天堂が講じたトラップは無意味なものとみなされている

Wikipediaに書かれている裁判の内容を要約してみると、日本でもゲームボーイなどで発売された『石道』というゲームのパブリッシャーであるアコレード社は、メガドライブ向けに発売するにあたってセガとライセンス契約を結んではいた。しかし、セガ側は独占パブリッシャーになることを要求して他のゲーム機でリリースすることを妨げたり、ライセンス料が高騰するなどの理由で、他のメーカーから出ていたメガドライブのソフトをリバースエンジニアリングすることによって開発を行ったが、これが違反だとしてセガに訴えられている。
en.wikipedia.org

セガのゲームソフトのリバースエンジニアリングによる)著作権法違反と、無許諾の非公式開発に対して、セガメガドライブに搭載した起動シークエンスを含む「商標セキュリティシステム(TMSS:Trademark Security System)」を盾に訴訟を起こした。訴訟を起こされたアコレード社は、ゲームの電源投入時にセガの商標が強制的に表示されることで、ゲームの出所が偽られたとして反訴を起こした。

連邦地裁ではセガの主張が全面的に認められたが、アコレード社は上訴。起動シークエンスの存在は「競合他社の製品に虚偽の表示をすること」であり「ゲーム機用のソフトウェアの競争を制限するために商標を利用した」とみなされ、セガ側の思惑とは真逆の結果となった。

その後、セガとアコレード社は和解。アコレード社は正式にライセンスを締結することとなった。

ただし、この判決は1976年の時点での著作権法を基にしているため、ソフトウェアの著作権著作権保護機能の理解が進んだ現在とは単純比較できないと筆者は思う。

とはいえ、判例がある以上、海賊版業者は別として個人による非公式開発が取り締まられるということは(アメリカにおいては)起こっていない。

(ここまで書いて気付いたが、PS3jailbreak事件や、現在任天堂が行っているニンテンドースイッチエミュレータ規制も加味するととても複雑な話になりそう…)

ゲームボーイの起動シークエンスの仕組みと回避方法

ここまで書いたところで、実際のゲームボーイの起動シークエンスの仕組みを記してみたい。

基本的な流れとしては、

(1)カートリッジからNintendoのロゴデータを読み込む
(2)読み込んだロゴデータを起動シークエンスに使用して画面に表示する
(3)もう一度カートリッジからNintendoのロゴデータを読み込む
(4)読み込んだロゴデータとゲームボーイ本体側にあるロゴデータを比較して、違っていれば起動を阻止する
(5)ゲームが起動する

という具合である。

1つめの手法としては(1)で表示用のカスタムロゴデータを、(3)で本物のロゴデータを読み込ませることができれば、Nintendoのロゴを表示させずにゲームを起動させるものがある(TOCTTOU脆弱性)。これを実現するにはソフトウェアだけではどうにもできず、専用のカスタムハードウェアが必要である。また、本体側のブートROMのバージョンによっては読み取りのタイミングや順序が異なるため、完全な方法とも言えない。カスタムマッパーを使用する実装もあれば、(ロゴデータを通過する)アドレスラインの一部を保持するコンデンサを使用して、変更されたロゴを含むROMの別領域にリードをリダイレクトする実装もあるようである。
dhole.github.io
www.youtube.com


2つめの手法としては、ゲームボーイカラー(とゲームボーイアドバンスゲームボーイカラーモード)限定の方法になるが、(4)におけるロゴデータの比較が、なぜかロゴデータの前半(ロゴの上半分)しか行われていない。したがって、上半分は正しいが下半分は正しくないロゴは、ゲームボーイカラーのブート時の起動チェックをバイパスできることになる。こちらの手法は、主にアジア方面で開発された海賊版や非公式タイトルで見られるようだ。

上3つの海賊版ロゴはNeo Fuji: go go logoから引用

fuji.12bit.club

結局、どうすればいいのやら

Pan Docsに記載されている方法として、Nintendoのロゴが降りてきたあとに、以下のようなメッセージを追加で表示すれば問題ないだろうとのこと。とのことで実装して実機で表示させてみた。

「このゲーム機はNintendoのライセンス品かもしれないが、このゲームは違います」

アメリカでは有効だろうが、日本において有効かどうかは不明。単にNintendoロゴの表示を受け継いで表示しているだけなのでハックも不要。

参考文献

ゲームボーイの技術資料
gbdev.io

ディスクシステム著作権表記の不備を改めてゲームボーイ著作権表記が生まれた旨の記載がある。
www.wizforest.com

ゲームボーイにカスタムロゴを表示させるデモ
dhole.github.io

Playstation VitaをニンテンドースイッチのTVモードみたいにできるVitaDock+を使ってみようとしたのだが…

VitaDock+という、表題のような機能を実現する Raspberry Pi 用のディストリビューションがある。結論から述べると、音声出力がうまくいかなかった。そしてそれを除いても利便性に微妙さを感じたのであまりオススメできない。

github.com

はじめに

これは Raspbery Pi を Playstation Vitaのドックに変身させて、ニンテンドースイッチのTVモードのような遊び方ができるようになるという代物である。同様のコンセプトの公式商品である PlayStation Vita TV が既にあるが、定価をはるかに超える価格になってしまったので、その代替としてVitaDock+が選択肢に入ったという具合。

ただしVitaDock+の方は、HenkakuをインストールしたVitaが必要なうえ、いろいろと設定が必要になるので、単に遊びたいだけの人には初期設定が面倒な代物だと思う。技術オタクであれば環境構築はいい暇つぶしになるので、いろいろと試してみたが、なんとも微妙な結果となってしまったので、せめて試行錯誤の記録を残しておきたいと思う。

必要なハードウェア

※アフィリンクは筆者が実際に購入して使用した(or試した)ものを貼っている。

 Henkaku導入済みであること。ここでは詳細は省略する

 3B、3B+、4Bが推奨されているようだが、筆者の手元にあるのは2Bと3Bだったので、これで試してみた

 接続用

  • USB mini-Bケーブル(と電源タップ)

 電源確保用

  • DualShock4

 BluetoothでVita本体とペアリングするのに必要。USB接続したVitaを手持ちするのであれば不要
 (DualShock3だとVitaが持つBluetoothのチャンネルを専有するので良くないらしいが、自分の環境ではそもそもペアリングできなかった)

 Bluetoothレシーバを内蔵していない Raspberry Pi では必要。Bluetoothレシーバを内蔵しているRaspberry Piであっても、Bluetoothの相性が悪い場合は必要
 ※今回Bluetoothによる接続はうまくいかなかった。試してみたがうまくいかなかったレシーバは以下↓

TP-Link UB400はペアリングはできたが、Bluetoothヘッドフォンと認識されず音声を送れなかった

TP-Link UB500はVitaDock+起動時にドライバエラーが出て認識できなかった

中国メーカーのTP-Link製品の挙動はいろいろと行儀が悪いので、価格以外はオススメできない。

  • AUXケーブル(3.5mmオーディオケーブル)(Vitaの音声をAUX経由でVitaDock+に送る場合)

  • USBオーディオ変換アダプタ(Vitaの音声をAUX経由でVitaDock+に送る場合)

  • 必要であればVitaを立てかけるスマホスタンド

それぞれのハードウェア構成図と所感

Vitaの音声をBluetoothで送るかAUXで送るかでハードウェア構成が異なる。

Vitaの音声出力をBluetoothで送る場合

筆者の環境ではVita本体とVitaDock+とのペアリングはできたが、Bluetoothヘッドフォンと認識されず音声を送れなかった。Bluetooth接続なので、音声の遅延は少なからず発生するものと思われる。

Vitaの音声をBluetoothで送る場合の構成

Vita本体とBluetoothスピーカーをペアリングすることで解決してしまう方法もあるにはある。

Vitaの音声をBluetoothスピーカーに送る場合の構成

この方法なら音声出力ができた。

Vitaの音声出力をAUXで送る場合

Bluetooth接続と異なり音声の遅延は発生しないが、Vita本体とVitaDock+を接続するケーブルが2本になってしまうのが難点。

Vitaの音声出力をAUXで送る場合の構成

筆者はこの方法でも音声出力させることができなかった。

その他の所感

  • VitaDock+をシャットダウンする際にマウス操作が必要になる

 →GPIOの特定のピンをショートさせればいいらしいので、ボタンを取り付ければよいが保留

  • VitaDock+が投影しているVitaの画面の画質がなんかボケている

 →Vita本体のプラグインであるudcd_uvcの問題らしい

  • VitaとVitaDock+をUSB接続している間、Vita本体のバッテリーは充電されない

 →長時間プレイに対応できない、据え置きとして遊ぶのであれば結構致命的。こればかりはどうにもできない

ということで、実際のとりまわしを考えると、はじめからそう設計されたニンテンドースイッチと違って、克服すべき各種欠点が残ってしまっており、実用上は若干面倒になってしまっている。

番外編

VitaDockを用意しなくても、PCとVitaをUSBケーブルで接続すれば映像を拾うことができる。OBS Studioを使うと全画面出力ができるので、PCを24時間起動している筆者のようなスタイルであればこれでいいような気もした。

Vitaの映像だけはOBS Studioでキャプチャできる

参考にしたサイト

github.com
note.com

レトロゲーム勉強会#09に参加した

レトロゲーム勉強会#09でゲームボーイゲームボーイアドバンスのカスタマイズを行った旨の発表を行ったので、使用したスライドを公開しました。ゲームボーイ本体の修理・改造に関するトピックです。しかしSlideshareは広告がとてもとてもウザくなっていますね…。

retrog.connpass.com

ゲーム『MOTHER2』のドキュメンタリー映画 Earthbound, USAが公開されています

ゲーム『MOTHER2』のファンコミュニティを追ったドキュメンタリー動画が、10年の制作期間を経てfangamerからついに公開されました。
earthboundusa.com

blu-ray版もありますが、FangamerからDigital Rentalを選んで7ドル払えばすぐ閲覧できます。全編英語ですが日本語字幕がついています! 本ドキュメンタリーの作成時に糸井重里氏と面会を果たしたreidman(starmen.net管理人でfangamerの代表)によると、年明けにiTunes/Amazon/Googleでも配信されるようです。

www.facebook.com

ゲームの『MOTHER2』は日本ではヒットしており、主人公のネスは初代スマブラから参戦し続けているほどですが、北米版『Earthbound』の発売時の反応は宣伝のまずさなどもあり酷評の嵐で、ガイドブック同梱でかさばることなどの理由でワゴンセールの常連でした。しかし、根強いファンによる長い長いファン活動の末に再評価が進んだタイトルで、現在『Earthbound』の中古価格は非常に高騰しています。ただし、海外版の『ニンテンドークラシックミニ スーパーファミコン』に『Earthbound』が収録されたので、現在では遊びやすくなっています(日本版クラミニに『MOTHER2』は未収録)。

私は、reidman率いるfangamerのスタッフが糸井重里氏と面会するために来日していた際に、いちMOTHER2ファンとして中野で取材を受けたことがあります。10年以上前の話になりますが、fangamerのチャリティーオークション向けに当時クレーンゲームの景品として展開中だったグッズを大量に寄付したことがあったので、その縁でした。
fangamer.com

スタッフロールでは私の名前がクレジットされていました。感謝。

Earthbound, USAスタッフロール

ゲームボーイアドバンスとゲームボーイアドバンスSPを修理がてらハウジングと液晶を交換した


手持ち無沙汰になったので、ヤフオクで入手した電源の入らないゲームボーイアドバンスSPを修理しつつ、ハウジングと液晶を交換した。ついでにゲームボーイアドバンスも同じように電源を修理しつつハウジングと液晶を交換した。

ゲームボーイアドバンスゲームボーイアドバンスSPは電源が入らなくなる(入りにくくなる)不具合がよく見られるらしい。ハウジングを取っ払って、スイッチ部分を清掃すれば好転するが、それでもダメな場合はスイッチ部分を交換すれば良い。交換パーツはAmazonでは手に入らないが、AliExpressならバラで売ってるし、ヤフオクでもバラで出品しているケースがある。

https://ja.aliexpress.com/item/1005003623206453.html
これを購入した。


清掃してダメなら、古くなったスイッチを剥がして交換すると良い。基板の形状を合わせればいいので位置取りは楽。ただ、動作上は問題ないとはいえ交換用スイッチは3点スイッチ(OFF-ON-OFF)なのが少し気になった。

続いてハウジングを交換した。ハウジングは値段によって品質が違うので、AliExpressで売っている1000円程度の安物は選ばず、以下のものを購入した。

実際に届いたハウジングを手に取ったところ、プラスチック特有のつるつるした安っぽさは無く、手触りも良く個人的には大当たりだと思った。

ゲームボーイアドバンスの液晶はライトが付いていないのでとても暗い。国内盤のゲームボーイアドバンスSPはフロントライトだが、やはり暗い。せっかくなので、(1つ7000円前後と)少々値は張るがIPS液晶というものに交換することにした。

AliExpressで以下のIPS液晶キットを購入した。
https://ja.aliexpress.com/item/1005005147317883.html
https://ja.aliexpress.com/item/1005005372868806.html

取り付けは非常に簡単だった。はんだ付けも1~3箇所で十分。ただ、ゲームボーイアドバンスの場合はハウジングを加工する必要があった。

プラスチックカッターとニッパーで削り取る必要がある。切断面は隠れるのであまり神経質になる必要はない。

ゲームボーイアドバンスのソフトは(バックライト液晶の)ニンテンドーDSLiteでも遊べるので、別にIPS液晶を取り付けてまで遊ぶ必要はないだろうと思っていたが、実物を見てその考えを改めた。IPS液晶の発色はメガデモ映えする。

ゲームボーイアドバンスSPに取り付けたIPS液晶を接写してみた。この美しさは素晴らしいぞ。

最後に、LSDjのステッカーを自作してカートリッジに貼り付けた。LSDjのロゴは正規登録するとダウンロードできるpdfのマニュアルから拝借できる。これを「コンビニシール倶楽部」を使ってシール化すれば良い。このアプリは、台紙データに画像を貼り付ける際に、画像の寸法がミリメートルで表示されるのでサイズを合わせやすい。
play.google.com

あとはファミマの複合機で印刷すればよい。L判のサイズで240円だった。

印刷品質の良いシールを貼り付けると、それだけで高級感があふれるので良い。

本拠地を移転しました

遅くなりましたが新年明けましておめでとうございます。
20年近く使っていた本拠地のサーバーが閉鎖になってしまったので移転しました。

新)http://www.eagle0wl.net/
旧)http://www.mysys.org/eagle0wl/

この告知があるはてなブログはそのままにしたいと思います。
たいしたコンテンツもないサイトですが、今後ともよろしくお願いいたします。