無謀!? PC-8801mkIIでアニメ映画作成講座

1998/5/5 By.ねこら
URL:http://www.mapletown.net/~nekora/
e-mail:nekora@mapletown.net

目次
1.始め
PC-8801mkII…8bit機です。発売当時既に“拘束グラフィックス”などと異名を取った88mkIIでそんなことできるのかーと思う人もいるでしょうが、 要はパソコンの画面を8mm(フィルム)カメラで1コマ1コマ撮影すればいいのです。 但し、画面に向かってそのままシャッターを切っても奇麗に写りませんーというか、暗くて暗くてとても観るに耐えないシロモノになってしまいます。
そこで、天体写真を撮影するのと同じ要領で長時間露光(ーといっても1秒程でOK)をします。

2.機材
ここで使用した機材の一覧を挙げましょう。
機材一覧
パソコンPC-8801mkII model30
増設メモリー1MB(馬鹿)
ディスプレイPC-KD551
8mmカメラフジカ シングル8 new ZC-1000
その他自動駒撮り機"ロビンちゃん"
(注:今命名した(笑))
8mmカメラで1コマ1コマ長時間露光が出来る機種は限られています。私はサークル所有のnew ZC-1000という機種を使いました。

3.長時間露光
ZC-1000とゆーか8mmカメラは、普通のカメラと違い、レリーズを押しっぱなしにしても長時間露光は出来ません。
どうするか、というと、ZC本体横のここそのうち写真入れますのネジ蓋を開けると出てくるシンクロカプラーを半回転させます。ZCはこのシンクロカプラーを半回転させるとシャッターが開き、もう半回転させるとシャッターが閉じ、1回転で1駒撮影されます。
すなわち、
  1. ディスプレイに撮影したい画像を表示させる
  2. シンクロカプラーを半回転させ、露光したい時間だけ露光する。
  3. シンクロカプラーを半回転させる
  4. 次の画像を表示させる…
を繰り返すのです。

4.PC−8801/mkIIによる8mmカメラ制御
上記の手順を人力でやる…なんてことは考えたくも無いので、当然PC-8801自身に制御させます。 モーターでシンクロカプラーを半回転づつ回すのが良いでしょう。
ここで電気工作に詳しい人だと、8255ボードを作るとかプリンター端子からの信号を使うなりして、 ステッピングモーターを回すらしいのですが、私は少々そちらには疎く“ステッピングモーターって何処に売ってるの?”って人間 なので、もう少し手近の店で手に入る材料で作りました。
ロビンちゃん 材料一覧
モーターマブチ RE-240
ギアボックス田宮 3段ギアボックス
ロータリースイッチロータリースイッチ
コネクターD-SUB9ピン コネクター
コネクターマイクロミニジャック コネクター
その他ビニール被膜な電線1m位
アルミパイプ5cm
エポキシパテ少々
完成図ロビンちゃんの写真。でかい
動作原理は、
  1. ギアボックスの回転位置(=シンクロカプラーの回転位置。180°反対の位置に2個所で検出する)を、ロータリースイッチにつないだバーコード端子から読み取り、
  2. カセットインターフェースのリモート端子でモーターへの電流をON/OFFします。
んー実に簡単…何ですが、モーターは電流を切ってもすぐには止まらないので位置が相当いいかげんになるのが弱点です…が、 シャッター開角度を100%にしておけばまず問題にはなりません。
バーコード端子の状態はI/Oポートで読み取り、カセットインターフェースのリモート端子はBASICの"MOTOR 1", "MOTOR 0"で制御出来ます。

5.正確な露光時間測定
モーターの回転速度/タイミングは上記の通り甚だいい加減なので、露光時間の制御はディスプレイ側のスクリーンの表示/非表示で行います。BASICの"SCREEN 0"で表示、"SCREEN 2"で非表示になります、が、 実際にはこの部分も含めてマシン語ルーチンで行います。
ちょっとここで、もう一度1駒の撮影の流れを整理しますと、
  1. 撮影する画像を表示…
  2. スクリーンを非表示にする(真っ黒)。
  3. モーターを制御してシンクロカプラーを半回転。シャッターを開く。
  4. スクリーンを表示にする
  5. 一定時間待ってフィルムを感光させる。
  6. スクリーンを非表示にする(真っ黒)。
  7. モーターを制御してシンクロカプラーを半回転。シャッターを閉じる。
  8. 次の画像を表示…
ここでポイントとなるのは、一定時間待つ所です。走査線が画面をなめる回数を、全ての駒で正確に一致させないと、映像がチラツキます。
PC-8801には垂直同期割り込みがあるので(-まー無いパソコン見た事無いけど…)、これを利用しましょう。
具体的には垂直同期割り込みが掛かる度に呼び出されるフックアドレスから、自作のルーチンを呼び出し、 そこでカウンタを増加させていけば、走査線が画面をなめた回数を数えられます。
また、スクリーンの表示/非表示の切り替えも、垂直同期割り込みが掛かったタイミングで行います。

6.具体的な手順
PC-8801mkIIはZ-80A(3.58MHz)の8bitパソコンでしてその動作速度たるや、現在のパソコンとは比べ物にならない程遅いので、 実際問題画像を生成しながら撮影は出来ません。あらかじめ画像を生成してフロッピーディスクに保存しておき、 撮影時にはこれを読み出します。ハードディスク? 88には繋がりませ…いや、繋がらない事も無いですけど、価格的に 現実的ではありませんでした。
ちなみに8801mkIIのフロッピーディスクは2D(両面倍密度)です。GVRAMはベタで48Kバイトありますから、無論1枚2枚に 収まる筈もありません。圧縮と言っても、縦方向のランレングス圧縮よりも複雑な圧縮プログラムは組めなかったので、 やはりたかが知れています。ですから撮影中は人間がフロッピー交換係として付きっ切りで見なければなりません…でした。
ここで威力を発揮するのが、普段は1bitたりとも使われない1MByteの増設メモリーです。外部記憶装置全部より大きいこの メモリにあらかじめ画像を貯えてから、撮影を開始するのです。フロッピー交換の頻度が数分の1になり、撮影中に寝る事も 出来ました。
パソコン側の準備が出来たら、カメラと"ロビンちゃん"を接続し、がっちり固定します。ディスプレイの画面をフレームに収め、 ピントを合わせます。
私はディスプレイの輝度を最大、カメラの絞りを開放にして1秒露光しましたが、 露出を絞ってその分長時間露光する手もあります。 その方が被写界深度が深くなってピンぼけが防げるのですが、私は撮影時間の短縮の方を選択しました。 この辺の所は、ディスプレイの状態によっても変わりますので、何度かテスト撮影をしてみて会得してください。
撮影中は余計な光が入らない様に部屋を真っ暗にして、プログラムをRUNすれば撮影開始です。 カメラは絶対に動かさない様に。動かしたら最初からやり直しです。 わたしは撮影を夜中に行い、撮影させている間寝ていたんですが、ギアボックスがガーガーうるさくて良く眠れませんでした。

7.プログラムリスト
以下に、実行の要となるロビンちゃん制御ルーチン(N88 BASIC)と、指定時間だけスクリーンを表示ルーチン(Z80 マシン語)の リストを挙げ…る予定だったんですが、あいにくPC-8801mkIIとロビンちゃんは実家の押し入れで眠っていますので今回は割愛させて頂きます。あしからず。
とは言うものの、一応覚えてるとこだけは書きます。(ちなみに、これは当時の記憶を頼りに再コーディングたものです。実際に稼動したものではありません。よってバグはあるかも知れません…というか多分あります。)

先ずは、シャッターを開くBASICルーチンです。バーコードリーダーのI/Oポートが不明なので実用性はありませんが。シャッターを閉じるルーチンもほぼ同じ(30行、90行のバーコードリーダーの状態の判定の論理がそれぞれが逆になるだけ)ですので割愛します。 10 *SHUTOPEN:' シャッターヒラク 20 A = INP(バーコードリーダーのポート) 30 A = A AND 何かしらのビットパターン 40 IF A <> 0 THEN RETURN 50 ' 60 MOTOR 1 70 ' 80 A = INP(バーコードリーダーのポート) 90 A = A AND 何かしらのビットパターン 100 IF A <> 0 THEN 80 110' 120 MOTOR 0 130' 140 RETURN
次にスクリーンを一定時間だけ正確に表示するルーチンです。BASICからの引数を受け取るやり方とか、ちょっと忘れてるかも…。これも、I/Oポートの具体的な番号を忘れてるのでいまいち実用性に欠けてますが。ちなみにZ80ニーモニックだからモニタのアセンブラでは使えませんけど、まぁいいよね。8080ニーモニックは本当に忘れてしまいました。 INIT: DI LD HL, COUNT LD (E80AH), HL ;これでVRTC割込の度にCOUNTが呼び出される EI RET COUNT: DI ;いらないよーな気もするけど一応割り込みを禁止する。 WORK LD A, 0 ;ちなみにAFレジスタは既に待避されているので保存は不要 INC A ;画面をなめた回数を+1 LD (WORK+1), A ;今時こーゆーコーディングをしてはいけません JR 3080H ;本来の割込処理ルーチンへ飛ぶ SCRON: ;BASICからA=USR(露光時間(1/60秒単位))で呼び出す。 LD E, (HL) INC HL LD D, (HL) EX HL,DE LD C,(HL) ;たしかこれでCに露光時間が入った筈… ;詳しくは忘れてしまったけど、どっかのI/Oポートを監視して画面走査終了まで待つ WAIT1 IN A,どっかのI/Oポート AND 何かしらのビットパターン JR Z, WAIT1 ;もしかしたら、JR NZかもしれない… ;カウンターを0にする DI XOR A; LD (WORK+1), A EI ;どこかのIOポートにデータを送って画面を表示する LD A, (どっかのシステムワークエリア) OR 何かしらのビットパターン OUT どこかのI/Oポート, A ;カウンターが指定の値になるまで待つ WAIT2 LD A,(WORK+1) CP C JR NZ, WAIT2 ;詳しくは忘れてしまったけど、どっかのI/Oポートを監視して画面走査終了まで待つ WAIT3 IN A,どっかのI/Oポート AND 何かしらのビットパターン JR Z, WAIT3 ;もしかしたら、JR NZかもしれない… ;画面を非表示にする LD A, (どっかのシステムワークエリア) AND 何かしらのビットパターン(画面を表示にした時と逆にする) OUT どこかのI/Oポート, A RET 起動したら1度だけINITを呼び出します。 BASICで撮影する画面を準備したら、SCREENを非表示にして、シャッターを開き、からDEF USR文で定義しておいたSCRONを呼び出します。すると、指定時間だけ画面を表示して、BASICに戻ってきます。戻ってきたら、シャッターを閉じ、次の画像を準備します。

8.作製した映像
Final Projectの冒頭のCACCのロゴ、Final Project 3のエンディング、4月の雪のエンディングに使用しました。4月の雪の場合は、 普通の画像との合成を行なっています。

CGといえばワイヤーフレーム


CGといえばワイヤーフレーム 9KB

テクスチャーマッピングな板がクルクル回る


テクスチャーマッピングな板がクルクル回る7KB

9.余談
実は…って見れば分かりますが、Final Project 3のエンディングでは大きなミスを犯してしまいました。
8801mkIIは8色しか表示出来ないのですが、露光時間と組み合わせて中間色を出せる(例えば赤を30/60秒、黄を30/60秒ずつ撮影すればオレンジ色になる)と考えました。そこで、スタッフ等、スクロールする文字の色を黄→赤→青→…等々ランダムな順番で移り変わらせてみました。
表にするとこんな感じです
赤 1/60秒黄 59/60秒
赤 2/60秒黄 58/60秒
赤 3/60秒黄 57/60秒
赤 59/60秒黄 1/60秒
赤 60/60秒なし
赤 59/60秒青 1/60秒
赤 58/60秒青 2/60秒
赤 57/60秒青 3/60秒
予想では、文字が複雑な色合いの変化を見せる筈だったのですが、実際には明滅してしまいました。 輝度を考慮せず、色をランダムに混ぜ合わせた為です(青100%より黄100%の方が明るいですよね)。
輝度Y = 0.3R + 0.59G + 0.11B
となりますから、このYが常に一定にならなければならなかったのです。同じ試みをする(そんな人いるのかなぁ…(笑))方は注意して下さい。

バーコード端子

正確にはバーコードリーダー端子。SR以降のジョイスティック端子とはピン配置が違うので注意が必要です。
アマチュアアニメの話へ戻る
ホームページへ戻る
御用はnekora@mapletown.netまで☆