2013年6月24日月曜日

ニューファミコンでプレゼンするためのツール集を作ってみた

「ファミコン用の自作ソフトを作って遊ぼう」の記事の続きです。社内の勉強会でプレゼンする機会があったので、ファミコンソフトを作って発表してみました。

参考:社内勉強会の発表資料
(Chrome推奨。枠内をクリックしてから、左右キーでページ送りします)

ソフトウェア編

テキストと画像をまとめてファミコンで動かせるプレゼンROMカートリッジを作るためのプログラムを書いてみました。データの圧縮しやすさにもよりますが、少なくとも20〜30枚分くらいのデータは入るかと思います。

こんなことができます

  • 各ご家庭に1台はあるファミコンでプレゼンができます。
  • もちろん、使いなれたコントローラでページ送り操作ができます。
  • 日本語フォント(漢字・かな・英数・記号)の表示に対応します。
  • ページ内に任意の画像を配置できます。

こんなことはできません(いまのところ)

  • ページ遷移のときの画面エフェクト(フェードアウト・インに固定)
  • 1画面表示中のアニメーション効果
  • 文字の強調(色の変更、点滅など)
  • もんたメソッド的なもの
  • 動画の埋め込み
  • Webなど、ネットワークが必要なサービスへのアクセス
ツールはgithubからダウンロードできます。Apache 2.0 Licenseにしています(一部、流用させていただいたライブラリはパブリックドメイン相当です)。
実行にはJavaコンパイラ(J2SE)と、CC65というコンパイラが必須です。

ツールの使いかた

ほぼREADMEにある通りですが書いておきます。重要なとこを太字にしています。
  • スライドに表示するテキスト(必須)を用意します。ファイル名は「0000.txt」から始まる連番です。1ファイル=1ページです。文字エンコードはUTF-8で、英数記号を含め、全ていわゆる全角文字で記述したファイルです。全角英数文字をずっと眺めていると頭が破裂します。適宜休憩を入れてください。1ファイルは、横32文字 × 縦28行です。
  • タイトルや挿絵などの画像を用意します。そのページに画像を付けないのであれば不要です。PNG形式で横256×縦224ピクセルです。テキストを画像化したものに加算合成されます。つまり「黒」は透過色扱いです。ファミコンは8×8ピクセルで1ブロックなので、そこを意識して画像を作ると良いかもしれません(適当な画像データでも変換はしますが)。
  • この状態でターミナルからmake.shを実行すると各種変換処理が実行され、cc65というフォルダの中にmain.nesというファイルが生成されます。
  • main.nesファイルをてきとうなエミュレータで開けば動作確認ができるはずです。Iコンの左右ボタンでページ送り・戻しができます。
ROMの種類はマッパー1(MMC1)です。FlashROMを作成して書き込めば実機で動作させることができます。FlashROMカートリッジの作成と書き込みについては、前回の記事を参照してください。

制限事項

いわゆる仕様です。
  • CHRROMは128KBまで使えるように作っていますが、PRGROMは16KBのみを使っています。あまりにページ数が多いとこちら側の制限でデータが入らないかも。PRGROMのバンク切り替えの方法がわかれば、もっと入るのですが、頓挫しています。RLEでそこそこ圧縮できているので、個人的にはあまり不満はないかな、と。
  • 一画面に255種類より多いキャラクタパターンがあると各種データ生成に失敗します。埋め込む画像を小さくするなりページを分けるなりで対応してください。(RLEかどうかのフラグとして一種類を使っているので、256ではなく255です)。
描画フォントは「美咲フォント」を使用しています。罫線など一部の文字を除いて、7x7ピクセルに収まっているので、ファミコンでも漢字が比較的読みやすいです。PNG形式でのデータ提供があるので、ソフトウェア的にも扱いやすかったです。

ハードウェア編

注意:ハードウェアの改造は自己責任で行ってください。

無線コントローラ

プレゼンをファミコン付属の有線コントローラでやると、動き回って解説したりできませんね。ダイナミックなプレゼンテーションをするためには、ここは無線での操作にするべきでしょう。
というわけで、赤外線リモコンをニューファミコンのコントローラにしてみます。手順は以下のような感じです。
  • てきとうな赤外線リモコンを入手します。今回使ったのは日本橋のデジットさんで売っていた100円のリモコンです。ハードオフとかでも適当なリモコンが売っています。実際に付近で使われている家電のリモコンでやると、いろいろと誤爆するのでオススメしません。
  • 赤外線受信モジュールを入手します。よく秋月のこれを使っていますが、似たような仕様の部品で良いでしょう。
  • 4021というICを入手します。ファミコンコントローラに搭載されているシフトレジスタICです。あまり扱ってるところがないかも…?
  • 赤外線受信モジュールをお好きなマイコンにつないで、赤外線リモコンの信号を解析します。ArduinoのIRremoteというライブラリのサンプルを使用すると楽ができます。
  • プレゼンに必要なのは左右ボタン程度ですが、念のため8ボタン分(4方向+スタート・セレクト・A・B)を割り当てました。
  • リモコン信号を受信したらファミコンを操作したという信号を4021(ファミコンコントローラに搭載されているシフトレジスタIC)に送るだけ、という簡単なコードを適当なマイコンで実装したら完了です。気をつけるのは負論理(ビットが0 → 押されていると判定)なことくらいです。ここでもArduinoを使うと楽に出来るでしょう。
 こんな感じです

仕組み自体は正規のコントローラと同じなので、プレゼン専用コントローラというわけでもありません。パズルやテーブルゲーム程度ならプレイできるかもしれません。

モバイル電源化

ファミコンがノートPCと決定的に違うもの、それは電源環境(バッテリー)です。コンセントがないと発表ができないのでは、プレゼン環境としては力不足です。
というわけで、ニューファミコンをバッテリーで動作するようにしてみます。
  • ACアダプタの端子付近にある、三端子レギュレータ(7805)を外します。
  • 三端子レギュレータのあったところからUSBケーブルを生やします。5VとGNDをつなぎましょう。
こんな感じで…。

これで、モバイルブースター等5Vの電源を使ってポータブルにプレゼンができるようになります。注:電源スイッチは効かなくなります。

注意:ハードウェアの改造は自己責任で行ってください。