電子工作ネタ再び

春がやってまいりました...実際は雪降ってるけど。


毎年この季節になると、夢がMORIMORIな感じになりますので、なんか作りたくなります。
毎年作れてませんが。


今年は、『安いブラウン管テレビのドライブ回路を作ってRGB入力のマルチスキャンモニタを作ろう!』、から始まって、なぜか『PICマイコンで、PC98とかX68とか用のRGB15ピンモニタ用のカラーバー発生器くらいしか作れないよ...』に落ち着きました。
ということで、回路書いてます。

最近の1チップマイコンは超速いので...

秋月で、72Mhzとか180Mhzも出るSTMのCortex-M搭載、しかもUSB接続でほぼなんも用意しなくても開発可能なマイコン基板が、わずか2000円弱で売ってます。


これらのマイコン一つをまるまる映像チップ(フレームバッファ+コンポジット信号計算)として転用すれば、このマイコン一個でRGB各色3bitくらいのビデオチップにできそうな塩梅。
プロセッサが高速なので、コンポジットビデオの黄色のピンプラグに出す信号計算も、CPUの演算でやってのけるくらいの余力すらもあります。
180Mhzの奴はFPUすら搭載してますので、かなり正確に計算できそう


問題点はプロセッサのSRAM容量が少ない、つまりビデオメモリが少ないので、RGB4bitのパレット16色とかは無理かもねー。
SRAM容量は最大でも128KB。
X68でVRAM512KB、PC98でも128KBは載ってたもんな。


プログラムはフラッシュROM上のものをそのまま走らせる*1としてもワークメモリ2KB程度は必要で、残りからフレームバッファ裏表の二面を用意すると、おのずと解像度と色数は決まってくる。
32Kbyteくらいは、ユーザプログラム用にとっとくとすると、320x224(256)の4bitが1面でトータル40Kbyteくらい。残りの30KBのうち、タイルパターン式の8x8BGパターン面が10Kx2面、デジタル8色(3bit+1bit)の8x8テキスト画面が4Kくらいとか。


このほかに、最近の1チップマイコンに特化したファクターとして、フラッシュROMに画像用意したコールドフレームバッファも実装できそう。
要するに銭湯の壁の富士山みたいなもんで、動的改変不可の画像を背景にするくらいならフラッシュROMからリードしても速度的に間に合うと思う。
これが320x224(256)のRGB16bitくらいで140kbyteとか。


出力はSTM32内蔵のDAC12bitに、全部ソフトウェアで計算して、コンポジット出力。
DACは二系統あるので、Y/Cに分ければS端子出力もいけるかも。
まあ、テレビになんで、そんなもんでもなんとか。


音声さえなんとかなれば、ゲーム機になりそうだなー

大切なことなので二度書きますが、プロセッサが1チップマイコンとしては爆速なのです。


ということなので、上述のCRTCの真似事をソフトウェアでやったとしても、CRTの非表示期間の遊んでる時間だけでも結構な余力が残ってそうです。
その余力の間だけでも、10MhzのX68程度のパフォーマンスは出るんじゃないか?
ちなみにMC68000は一命令を実行するのに10クロック〜3クロック程度かかってるので、全命令がほぼ1クロックで走るRISCでハーバードあーキティクチャのCortex-Mと比較する場合は1/5くらいで考えます。
つまりSTM32の場合2Mhz〜4Mhzもありゃ、同等ではないかと。


ということはMSXグラディウスくらい、2000円のマイコン一枚+FM音源チップ基板で達成できるんじゃないかな??
いやメガドライブくらいはなんとか....

ってか、妄想楽しいなー。

つか、やるしか。
新しいPC物色してる場合じゃない...。


いろいろ書いたり検討してみてなんとなくわかった

スプライト機能が搭載されてる昔のゲーム機や基板は、フレームバッファじゃなくてラインバッファつかってる。
10nsとか20nsのめちゃくちゃ高速な"『バイポーラ』メモリ"をラインバッファに搭載し、そのラインバッファに一定時間内に書き込みを完了させ、テレビが水平ラインを表示するタイミングにあわせてCRTCがそれを読み出して表示してた。
その描画と表示の処理を垂直224ライン分とか256ライン分とか繰り返して、一枚の画像を作り上げてたのが昔のゲームマシン。
水平ライン一本分の表示にかかる時間は、当時のプロセッサの速度からすると極わずかな時間なので、ラインバッファへの描画は最適に設計された独自ハードウェア(以下VDP)が行った。
ラインバッファはVDPのみから接続されてるので、CPUは直接読み書きはできない。


CPU〜プログラム〜は、VDPが描画に使う材料となるVRAMへデータを用意するのが主な仕事になり、描画の為の演算はほとんどやらない。
またそのVRAMは、CPUとVDPが同時にアクセスする為、デュアルポートRAMのような二回路が同時に読み書きできるRAMが使われた。これはラインバッファに使ってるRAMほどではないにしろ、やっぱり高価なのでVRAMは大容量にできなかった。
例外としてX68000は、85年の当時の家庭用PC/ゲーム機の常識からすると、ありえないほどのデュアルポートRAMを並べた大容量VRAMを用意したハードウェアでデビューしている。
安価なファミコンと比較してそれ以上になる為には、最先端のアーケードゲーム機で走っているゲームをそのまま持ってきて動かせるハードを作る必要性があると考えた結果だと思う。
また高度成長期からバブル期の流れで高学歴連中の給与やボーナスが増えまくったことで売れると判断したんだろう。


時代が進んで半導体の集積技術が向上すると、一般のメモリは大容量化し、製造プロセスが微細化すると高速になった。
ということでバイポーラベースの高価なラインバッファに対して演算描画をしてたアーキティクチャから、大容量の一般メモリや、それに毛が生えた程度に高速な中容量のメモリを用意して、テレビ画面一枚分のフレームバッファに対して描画するアーキティクチャに代わった。


このフレームバッファはたいていの場合二組用意されてて、表面の一枚はテレビの表示に使い、裏面の一枚は次表示する内容を描画する形になる。
フレームバッファが表示されるまでの描画に使える時間は、画面一枚が表示される時間、つまり1/60秒。
この時間内に描画を完了させられるならば、GPUチップがハードウェアで描画をしようが、CPUがプログラムで描画をしようがどちらでも問題ない。
ゲーム機のセガサターンは、フレームバッファに対してハードウェアで描画を行っていたので異次元のスプライト性能を誇っていた一方、PC98シリーズは、描画のためのVDPの機能はラスタオペレーション*2しかもっていなかったため、黒塗りつぶし以外の描画はソフトウェアで行ってた。
そんな感じ。



1チップマイコンでビデオ出力を実現する場合は、ラインバッファとして設定したチップ内のSRAMメモリ*3に対して、CPUの地力を生かしてプログラムで描画する形になる。
なかなか面白い試みではある。と思うのよ。

*1:STMのフラッシュROMはめちゃくちゃ高速です

*2:ORとかXORとかANDとか基本的なビット演算しかできない

*3:たいていの場合ノーウェイトで1クロックで読み書きできる