Arduinoでテキスト表示器(CRTC)をつくってみる その1(実験編)
先日z80と6502を入手しこれでコンピューターを自作しようと考え、とりあえずLEDをチカチカさせてみようとしたものの動いたんだか動いていないんだがわからないままで終わりました。(一応通電はしたようです。)
やはりコンピューターといったら画面にテキストを表示できるようにならないと寂しいもの。いや、画面に文字が表示できるようになっていればモチベーションがかなり維持できるというもの(自分だけでしょうか)。そこで、Z80と74HCシリーズのみで回路を最初から組むのはさすがに無謀と考え、ひとまずArduinoでコンポジット出力によるROM内のキャラクター(文字)を表示できるようになってみようと考えました。
とりあえずネットでArduinoでビデオ出力と検索すると出てくるのが「TVout」というもの。抵抗二個とコンポジット端子一つで画面に文字や図形が表示できるという、すごい優れものです。おまけに3Dのブロックが回転するデモ付き。しかしこのプログラムは文字が表示できるもののどうやってプログラムで表示させているかまではわかりずらく、今回の目的には応用できそうになかったため没にしました。
やはりせっかく回路から組むのだからNTSC信号(ビデオ信号)がどのように生成され画面に映し出されているのかを自分で調べないともったいないということで今回こちらのサイトを見本にいろいろ実験してみることにしました。
■ビデオ信号はどういう信号なの?
■変数ではだめ、なら配列は?
_delay_us()の中に変数を入れると著しくタイミングが乱れてしまいまともに表示できないことがわかりました。しかしこのままでは任意の画像など表示できる訳がありません。しかし、この関数の中に変数を入れなければタイミングはあまり崩れることはないようです。そこで、配列の中に情報を入れ、IF文で切り替えるという方法をとってみました。
こんな感じで表示ができることが確認がとれました。つまり、この52.5usの間に黒か白かという信号をきちんと出し切り、かつずれが発生しないようにすれば表示器は完成するということです。プログラムであれこれとするとどうしても計算に時間がかかってしまったりするために水平同期信号のタイミングがずれてしまいそのあとの垂直同期信号もずれて画面がまともに映らなくなってしまう訳です。
これを防ぐにはどうしたらいいのか・・・特に動的なプログラム、外部からの読み込みとなると難しい部分が出てきそうです。
ちなみにArduinoにはアセンブリ言語で書く機能が備わっています。それでコードを書くと本来のマイコンの持っているスピードが出せて、この走査線の信号を出すのにも十分間に合うのではないかという。ただ、z80のアセンブリ言語は書いたことあるけどAVRは今までやったことがないという。また、タイマー割り込みをかけて強制的に処理の途中で信号を送るというのもまたありだと思いますが、どちらにせよ命令に何クロックかかるのかが予測できないので何ともいえません。
ビデオ信号、ほんとに奥が深いです…
コメント
コメントを投稿