tsutsuiの作業記録置き場

NetBSDとかPC-6001とかの作業記録のうち、Twitterの140字では収まらない内容や記事としてまとめるべき内容をとりあえず置いてみる予定

OSC大阪で PC-6001 と PC6001VX を展示しました

オープンソースカンファレンス 2017 大阪

1/28(土)に大阪産業創造館で行われた オープンソースカンファレンス2017 大阪日本NetBSDユーザーグループ ブース に PC-6001 実機とエミュレータの PC-6001VX をデモするノートPC を持ち込んで展示してきました。

展示ネタ問題

昨年の OSC京都 では PC-6001と LUNAとセットでの PSGデモOSC東京関西オープンソース ではいずれも IDEインターフェース付きドリームキャスト の展示、 OSC広島 では LUNAで PSG PCM再生ご当地列車接近BGM とそれぞれ展示をしましたが、そろそろネタ切れという感じで OSC大阪には何を持っていこうか考えあぐねていました。

以前のエントリで pkgsrc 化した PC6001VX をネタにする、という案はあったもののちょっと無理があるかなあと思っていたのですが、

このえびはらさんのツイートで腹が決まりました。「やっぱり自分がやって楽しかったものが一番」ということで、 PC6001VX のエミュレータ pkgsrc 化は半ばこじつけ(スイマセン)PC-6001 実機のデモをメインに展示とセミナー発表を考えることにしました。

展示用デモ改修

メインの展示ネタとして用意したのは、以前に動画としても投稿している以下の2つの P6 デモです。

どちらも「最初にBGMデータを読んだ後、テープから画像データを読み込みながら次々と表示していく」というオンメモリではないデモなので、展示で流そうとすると「テープを巻き戻さないといけない」という課題がありました。

解決のヒントは、上記のツイートを見て反応された思われる野首さんの以下のツイートでした。

とりあえず正月休みにエンドレステープだけは入手しておくかと Amazonを調べていたのですが、エンドレステープとしては 1分, 3分, 6分 のもののみが存在するようでした。

どちらのデモも最初に BASICの DATA文としてマシン語プログラム本体をロードして実行するのでエンドレステープとして録音が必要になるのは PSGドライバ、演奏データ、各画像データを含む動画後半部分のロード部分のみということになります。

これらの wav ファイルの長さを見ると

  • あぴミクさん動画はほぼ 4分ちょうど
  • テグザー月光動画は 3分40秒ほど

と「3分では入らないが 6分だと結構余る」という微妙な状況でしたが、とりあえず 6分のを買って余裕があれば何か考えるか、とテープだけは先に発注しました。

月光デモ改修

そもそも、どちらのデモも実装の中身についてブログに書こうと思いつつサボっていますが、それはまたいずれ……

動画を見てもらうとわかる人にはわかる(?)と思いますが、月光デモでは

  • 最初にスタッフロールを上から描画
  • テグザーロゴを下から描画

というオリジナル88版デモのオマージュ(?)という要素もあったりします。

このあたりの描画は「テープのロード速度がそのまま描画速度」なのでそこをリピートするならエンドレステープが必要ということになります。

雲海アニメの画像を減らして3分に入れるという案もあったのですが、さすがにそこまで作る気力はなく、デモとしての本題は BGM と雲海(?)アニメで十分だろうということで

「デモの最後まで行ったら雲海アニメ描画のまま BGMを繰り返す」

というオンメモリ動作の改修だけで済ませることにしました。

実装としては、最後に PSGドライバの演奏終了を見て BASIC にリターンしていたところを「再度演奏を開始して雲海描画のループ先頭に戻す」という変更をしただけです。

このあたりの作業をしていたのがこのツイート。

あぴミクさんデモ改修

あぴミクさんデモの方は、オンメモリのまま残っているのは PSGドライバと BGMデータだけで、各画像は以下のように読み込んでいます。

  • 上半分の Exomizer 圧縮データはバッファにロードして VRAMに直接展開
  • 下半分のデータはランレングス圧縮データをそのまま VRAMに展開 (一部例外あり)

なので、月光デモのように曲だけのループにすると「どれか1枚の固定画像のまま BGMだけが流れる」という、デモとしてはいまいちな構成になるので、エンドレステープの本命はこちらと思っていました。

ちなみにタイニーあぴミクさんデモのキャプチャ元動画はこちら

元のデモプログラムは以下の構成になっていました。

  1. SCREENモードの切り替え、画面クリア、 "Now Loading..." の表示までが BASIC
  2. PSGドライバと曲データのロードから、最後の画像ロード完了まではマシン語
  3. ロード終了後のクレジット表示待ちと演奏終了待ちは BASIC

ドライバと曲データはメモリ常駐なので2回目以降読む必要は無いのですが、エンドレステープを使うのであれば 1回目も2回目もデータを共通にする必要があり、そこは変えられません。
途中でテープを入れ替えれば可能ですがそれだと微妙に本末転倒

とりあえず、ロード終了から最後のミクさん画像表示待ちの時間、それと最後のクレジットの表示の時間だけでもテープを進めておけばそれだけ次の待ち時間が減らせます。測ってみると 30秒もないくらいでしたが、2分の待ち時間が少しでも減ればいいので、マシン語でのロードが終わって BASICに戻った直後に テープリレーONのROM内ルーチンを呼ぶようにしました。

残りの1分半のテープ送り待ちについてはあまり案も時間もなかったので、 "Now Loading..." の表示のところだけちょっと変更して、「SCREEN 3 の2画面目に残っているあぴミクさん画像の上にロード中の文字を重ねることでちょっとでも待ち時間中の見栄えを良くする」ということにしました。

終わってしまったあとにこう書くのは簡単なのですが、結構いろいろハマりました……。

クレジット表示のあとに FOR文とかで 30秒くらいの待ち時間を入れてやればクレジット表示と Loading 表示と待ち時間の分担をするという案も頭にありました。が、この修正に着手したのがすでに展示前日の夜で、かつ実機テストでテープにデータを録音しようとしたらデータレコーダーのベルトが滑ってうまく動作しないというトラブルに見舞われて、そちらの対処に時間も気力も取られてしまいました。

 

エンドレステープの罠

エンドレスカセットテープというものは今回初めて使ったのですが、いろいろと注意事項というかハマりポイントがありました。

オートリバース対応

エンドレスカセットの商品説明をよく見ると、「オートリバース不可」「オートリバース対応」の種類があるのがわかります。詳細までは確認できていませんが、おそらく「プレーヤーがテープが止まったことを検出する機構」によると思うのですが、要は「テープ再生時に巻取り側とは逆の送り側の回転軸も回るかどうか」だと思います。

データレコーダーの種類にもよると思いますが、デモで使用する PC-6082 だと送り側が止まることでオートストップが作動する機構になっているようなので、この「送り側が回る」ことが必要条件になります。

今回購入したテープ は「オートリバース対応」を謳っていて、実際に再生すると送り側の軸も回るのですが、そもそもエンドレステープ自体がどういう機構になっているのかがかなり謎です……

リテイク問題

いざ実際にデータをテープに録音しようと思って困ったのがこれです。

通常のテープであれば、テープを巻き戻して先頭から録音します。録音に失敗したら、再度巻き戻して先頭から録音します。リテイク時の録音時間が最初より短いと前の録音の音が残ってしまうので、リテイク時はテープのカウンタを見て十分にリテイク前の音が上書きできるまで(無音で)録音を続ける、というやり方になります。

しかし、いつもと同じ要領でリテイクをしようとすると、以下のようにエンドレステープ固有の問題が次々と発生しました。

  • 構造上巻き戻しはできない
  • 外観では「今テープ全体のどのあたりを再生しているのか」がわからない
  • 早送りはできるが、早送りの時のテープカウンタの進み方が通常再生時と合わない
  • 消去のために長めに録音しようとして行きすぎると録音先頭部分まで上書きされてしまう

結局泥縄式に以下のように対処するはめになりました。

  • テープをずっと再生で流してリテイク前の録音開始位置のカウンタをメモる
  • そのまま一周再生して「6分でカウンタがどれだけ進むか」をメモる
  • カウンタと再生時間を見て 6分経過直前くらいで止める
  • 録音後にリテイク前の音が残っていないか確認する
    (変に残っているとエラーになる可能性がある)

ただでさえデータレコーダがトラブっていた中で、こんな想定外のところでハマるとは思いませんでした……。

 

PC6001VXパッチ当て

展示の本命(?)は PC-6001 実機だったのですが、実機のトラブルも想定して上記の月光デモとあぴミクさんデモのいずれもプレゼン用兼デモ用ノートの PC6001VX 上でも動かせるよう事前に準備していました。

「BGMを鳴らしながらテープからロード」という技の元祖である TINY野郎さんのイース2デモのブログ にも書かれていますが、よっしゅさんのPSGドライバを鳴らしながらテープからのロードを実行するためには、テープのセーブにおいてストップビット増やして余裕時間を作ってやる必要があります。

具体的には、 wav 変換の設定でストップビットを標準の 3ビットから 4ビットの待ち時間を追加した 7ビットに設定してやる必要があります。

エミュレーターではテープのロード速度について標準のストップビット 3ビット(スタートビット1ビットを含めて 1バイト当たり 12ビット)でロードするので、テープのロード時間に合わせて画面描画その他のタイミングを合わせている月光デモやあぴミクさんデモではタイミングがズレるだけなくそもそも正常に動作しなくなってしまいます。

ここのところは PC6001VX が NetBSD で動いた当初に調べていたので、パッチを当てたバイナリを作ってそのままデモ用ノートで動作確認をしただけです。


具体的には、 PC6001VX の src/pc6001v.h の 73行目の DEFAULT_CMT_HZ

(DEFAULT_BAUD/12)

(DEFAULT_BAUD/(1+8+(3+4))

という具合に変えただけです。 PC6001VW だと設定でテープの速度を変えられるのですが、 PC6001VX (およびベースのPC6001V)では今のところ固定値のようです

ブース展示

準備について長々と書きましたが、OSC当日の実際の展示の様子については Togetter のまとめ のほうが詳しいのでそちらを参照してください。

P6実機デモについては冒頭のデモ動画のとおりです。ベルトが緩んでいて途中でトラブらないか心配していたデータレコーダも途中一度も止まることなく最後まで動いてくれました。もともと余裕があればほかのデモのテープも動かそうと思っていたのですが、そんな暇もないくらい P6に興味を持って話しかけてくれる方がいて、結果オーライでした

セミナー資料についても Togetter にあるとおり SpeakerDeck に上げてあります のでそちらを参照してください。「P6の話ばかり」というコメントもありましたが、一応は NetBSD と pkgsrc なネタも仕込んでいますので……。

感想とか

実はあぴミクさんデモも月光デモも OSCその他の展示とは全く関係なく、OSC京都およびOSC広島の準備をしているさなかに「こんなのを作ってみたら面白いかも!」と、どちらも突発的に休日をまる一日使って作ったものでした。本来のOSC準備はどうしたと怒られる

あぴミクさんデモは OSC京都でも何回かデモしていて結果として好評だったという実例はあったのですが、当日ブースで本体を並べているときですら「P6 をメインにした展示は許されるだろうか」という迷いがありました。

が、実際やってみると展示もセミナーも自分としてもとても楽しく大満足でしたし、来場者の方にもそれなりに好評だったようです。P6本体のもつ魅力に助けられたとはいえ、展示説明自体も楽しくできたことを思うと、やはり「動いたわーい」という「自分が楽しかったこと」が大事だな、という思いを新たにしたOSC展示でした。

謝辞

ブースに来ていただいたみなさん、ツイッターでふぁぼやRTを飛ばしてくれた方々、どうもありがとうございました。

次の関西のOSCは8月の京都までありませんが、3月の OSC東京でもまたなんか出してみようかなあ、などと考え中です。 さすがに P6連続展示はネタ的にも厳しそうですが