Kernel/VM 補完計画
はじめに
この記事はKernel/VM 探検隊@東京 No18での発表「ワープロって実は計算機で 」を補完するものです。そちらと合わせて読むとより楽しめるかと思います。
基板関連
OASYS の画面を変換するための基板に関してはかなり前から構想があり、Tang Primer 20Kを使用して画面の変換とスーパーディスク(PATA)エミュレータ を一緒に載せてスーパーディスクの部分に入れ替えるという形で考えていました。
高画質版回路図
7月中旬頃になってこの基板はおそらくKernel/VM までに完成しないと悟ったので、機能縮小版として画面に専念した基板が設計されます。
妥協の産物
この基板の設計がだいたい完成したのが7/15で、慎重に一日置いて眺めたら案の定ADCへの電源ラインがつながっていなかったので一日置くことの大事さを感じました。(使わなかったのでどうでもいいけど)
JLCPCBに投げたのは7/16の夜手前くらいで、一番安いオプションで投げて7/22に手元に届きました。
なお、この期間は第二種電気工事士 技能試験の準備と被っており、ジョジョ5部のキャラみたいな発言 をしながら両方やっていました。
FPGA は今回Tang Nano 9kを使用しました。これは過去にLX-3000(モノクロ機種)で似たようなことをしたときに使っていたからというのと、前述の全部載せ基板を作ろうとした時の部品選定時に秋月で売っているTang系FPGA ボードでDIP 型で一番上が9kだったというのが理由です。
なお早速7/24にADCのクロックが生成できないことを嘆いている作業ログがあります。音まで載せられたら面白かったのになあ。
しかもGowin EDA からIPコアの生成をする際に何故かよく失敗する(根気よく再生成し続けると通る)という謎の現象にずっと苦しめられました。次Efinixにしようかな。
で、初期の内部構成の構想というのは下のようなものだったんですね。
まあこれだけだと簡単に見えるんですが、入力側はVSYNCを見て適切にフレームバッファ の頭に戻る必要があるので、FIFO を挟むとフレームバッファ であるPSRAM書き込み部分ではどう同期を取ればいいのかわからなくなるので困るわけです。
ということで、実際には入力FIFO 前でピクセル データにVSYNCがアクティブかどうかのビットを追加してPSRAM手前まで引き回しています。
しかしこの構成には問題があり、同期が全然合いません。MN89304の出力するVSYNCは2ピクセル 目のDCLKのposedgeと同時に立ち上がるため、それまでピクセル データの頭出しができず、3クロックデータを溜める部分でグチャグチャになるわけです。 この時点で8月5日になっており焦りが出てきます。
というわけで次の構成がこうなります。
1ラインデータを貯める君はDCLKごとに貯める君のデータを左8ビットシフトしたものと今のピクセル データをくっつけた物で更新されていきます。このレジスタ をhsyncをクロックとして使用することで安定して1ラインをFIFO にいれることができるようになります。(ちなみにhsyncはDCLKが動いていないときに動くので周りの高周波の変動に影響を受けないという地味な利点があります 多分)
しかしこの構成にも問題があり、GowinのFIFO IPコアの生成ではビット幅が1~1024bitに制限されています。横640ピクセル なのでRGBで1920bitが入る必要がありますがそのようなFIFO は作れません。
ということで、入力段を単純に分割して入力FIFO を5個くらい並べたのですが、今度はFIFO がBlock RAMを食いつぶしてしまいそもそも合成不能 になって頭を抱えます。
しかもKernel/VM は着実に近づいており、配線の混雑度が上がって少しコードを弄るだけでFmaxが大きく落ちるような状態の中、皆さんの目を守るための平均化をする余裕がなくなってきました。結果最終的な構成は下図になりました。
だいぶ簡略化されましたね。したんですがリソース使用量はこうなりました。
そりゃあちょっと弄ったらすぐ関係ないところのFmax落ちるわという感じですね。フィードバックFIFO を入れる余裕もなさそうです。ちなみに2個しか無いPLLをメモリとTMDS用に使用しているので本当にADCのクロックを生成する方法がありませんでした。よく考えろよな。
斯くしてワープロ の画面は正しく変換されるようになりました。8月8日の午前4時に。
途中で何度かこれ間に合わんから普通にPCでやったほうがいいんじゃないかと思いました。
あと謎現象として、ワープロ の信号を入れるとなぜかHDMI の信号がロストするようになったことがありました。最初は自分のコードを疑ったのですがexampleのコードすらろくに出力できなかったのでなにかおかしいと思い、別のTang Nano 9kにすると動いたのでア〜となりました。
ところで動いた方のTang Nano 9kは昔LX-3000の画面を変換するために"5V信号ラインに直結されていた"ものです。スライドで「なんか5Vになってるけどヨシ!」というのはそういう経緯もあります。逆に壊れたほうなんで壊れたんですか?
あとこれは同期がおかしくてデスノート 二期OPの夜神月 がいっぱいいるところみたいな見た目になった動画です(?)。
VIDEO
スライド映す君関連
画面変換君ができていないとスライド映す君を作ってもしょうがないのでFPGA 側がまともになるまで手を付けていなかったのですが、結果として1日で映す君を作る羽目になりました。
1枚絵を映すだけなら既にできていたので、問題となるのは画像読み込みの遅さと操作系の実装になるのですが、画面読み込みに関してはかなり右往左往しました。
というのが、当初発表の通りGIFを読み込めるようにしようと考えていたのですが、問題としてOASYS のフレームバッファ が64KBごとに細切れにされていると言うところがあります。展開した結果のバイト列を書き込む際64KB境界を跨いだときのことを考えようとして、1分くらい考えかけたところで今やるのは無理だなとなりました。多分デバッグ 込みで2~3日は確保すべきものです。
仕方がないので生画像を入れるわけですが、生画像は1枚300KBあるのでフロッピー1枚に3枚までしか画像が入りません。(DOS/V フォーマットなら4枚で行けたと思う)
しかも300KBをいちいち読み出すというのはかなり時間のかかるものなので、そのままだとプレゼンに使うにはかなり厳しいレイテンシで画面が切り替わります。(それもそれで面白かったかもしれませんが)
というわけでメモリ上に次のスライドを先に読んでおくという手法でスライド切り替えを高速化することにしました。ですが、300KBというのはDOS のメモリにとってもかなり重いものです。OASYS のDOS は空きメモリが400KBくらいしか無いので一か八か試しに32KBの領域を複数malloc してみました。
すると案の定途中でmalocに失敗しました。
しかし、OASYS はDOS から見えるメモリの外にさらに6MB存在しているはずです。これを扱うためのドライバがEMM.SYS(システムディスク内にある)です。
EMM.SYSは、DOS から見えるメモリ領域上の一部を使用して「窓」 を作ります。この窓を通して本来DOS からアクセスできないメモリ領域を見せることでDOS でもメモリがたくさん使えるというわけです。
ちなみにOASYS 上での実装は、チップセット 内のメモリバンク切り替えレジスタ を切り替えることで行われています。便利〜
さらにこのEMM.SYSはシステムコール が他のEMM実装とちゃんと互換なのでそこら辺の資料とかChatGPTを使って呼び出しを書けます 。おかげでサクッと拡張メモリを実装して先読みバッファを作ることができました。
さて、先読み自体の実装は楽ですが一つ考慮しなければならない点として、「先読み対象のファイルが次/前のフロッピー」にあるときというものがあります。
今回ここの管理をケチって「R」キーを押すととりあえず無条件に先読みを走らせるという仕様にしたのですが、getch()でキー入力を受けているためにうっかり連打するととんでもないことになります。さらにフラグ管理をしていないので、先読みに失敗しても何も言わないしそのまま内部のインデックスを進めてしまいます。結果として状態の整合性が取れなくなり、次のスライドを表示することがままならなくなります。(発表時3枚目のディスクに入れ替え失敗しPCにフォールバックした際に発生した現象です)
ちょっと次は全体的にいい感じにして再チャレンジと行きたいですね。
当日の発表について
発表が午後一番だったのですが、昼飯の量の予測に失敗しギリギリお腹に詰め込むことに成功しました。一瞬お腹のFIFO がスタックに変わるかと思いましたが辛うじて会場に戻るまでには落ち着きました。
機器セットアップは昼休み中にやっておこうかと思ったのですが午後の会場案内とかで発表台が使われるのと昼飯のせいでそのような余裕はなく急いで準備しました。(その結果キャプチャ画面のアス比がおかしくなっているのを直す時間がありませんでした あれはキャプチャ側の設定なので)
発表中に仕込んだネタは多分全部ウケてたので良かったです。レイン◯ーアートとかすぐ通じるかちょっと心配だったんですよね。
突然画面を切り替えてワープロ になるのも大ウケでした。ロード時間が長めなので先に1枚目を表示させた状態で待機させておこうかとも思っていたのですが、多分こっちのほうがウケがいいだろうということで起動時から出しておきました。
画面とプリンターが取り外されていることに関してそれって外しても動くんだという反応がちょくちょくあったのですが、一応動きます。ただしプリンターを抜いた状態でプリンター関連の動作をさせるとフリーズします。まあしょうがない。どちらもネジ抜いてケーブル抜くだけなのでそんなに面倒ではないです。
ディスク交換は実は手元メモ(配信だとたまに映り込んでいる)にこのタイトルのスライドになったらディスクを交換せい!というのが書いてあったのですが、絶妙に時間が足りなくなっていて急いでいたのですっかり忘れていました。まあPC側でキャプチャした画面を投影してるだけなのでフォールバックは簡単です。
あとはキャプチャした画面に乗ってるノイズに関しては多分スライドを画像として出力した際のアンチエイリアス のせいですね。やはり皆さんの目を守っておくべきだったか〜
視聴者の皆さんをたくさん怖がらせることができたので満足です。お疲れ様でした。
次回はな〜んだ?