ヘアとキューハチと私 〜 私がシステムエンジニアになったきっかけ

私はシステムエンジニアという職業で、コンピュータシステムを作る仕事をしていますが、
この職業に就くことになったきっかけを考えてみました。


コンピュータというものに興味を持ったきっかけ、それは私が小学校5年生のときのことでした。
そのころ、家にはパソコンがありました。
親父はそれをキューハチと呼んでいました。
ペラペラのフロッピーが入るところが2個ついている、クリーム色の機械でした。


コンピュータの仕組みなんていうのは全く理解していませんでしたが、
ゲームのフロッピーを差し込んで、ガチャンとつまみを回して、電源ボタンを押せば
ゲームで遊べるようになるということは見て覚えました。
子供が興味を持つものというのは、親の影響というのも大きいわけです。


考えてみれば、今のパソコンのような複雑さがなく、
フロッピーを突っ込んで電源を入れればとりあえず動くという単純さは
今よりむしろ優れていたところかもしれません。


フロッピーディスクは紙の箱に入れられてまとめられていました。
親父の仕事用のフロッピーが入っている箱と、
ゲームのフロッピーが入っている箱に分かれていました。
片方には親父がどっからか持ってきたゲームがいろいろ入っていました。


私はゲームのフロッピーを手あたり次第遊んでいました。
そんなとき、別の箱に入っている、ちょっと雰囲気が違うフロッピーを発見しました。
ラベルに「ユング」と書いてありました。
私はそれをパソコンに挿入して起動してみることにしました。


しばらく待つとタイトル画面が表示されて、ゲームが始まりました。
記憶がおぼろげですが、たしかアドベンチャーゲームのようにコマンドを選択して
場所を移動したりしながら、話を進めていくゲームでした。
話がちょっと進んでいくと、女の子のキャラクタ―が現れてクイズで戦うことになりました。
アドベンチャークイズゲームが合わさったような内容だったと思います。


クイズで出題される内容は、小学生には全然わからないようなものでしたが、
やり直すと同じ問題が出るので、答えを暗記して進めました。
そして、クイズで正解をたくさん選べるようになると、
女の子が服を脱いでおっぱいを出しました。


そうです、これは
親父が隠し持っていた
エロゲーだったのです。


これは小学5年生には衝撃でした。
クイズの答えを必死に丸暗記してゲームをクリアしました。


こうして私はコンピュータというものに興味を持ち、
今では立派(?)なシステムエンジニアになりました。
今の私があるのも、親父とPC-98と電脳学園*1のおかげです。

*1:電脳学園IIIは、1989年7月にガイナックスより発売されたクイズゲーム。クイズに正解すると、登場するヒロインが服を徐々に脱いで最後は全裸になる脱衣ゲーム。

PIC32MXでビデオゲームマシン作成5(不具合対策)

アナログRGB信号が出力できて、モニタに一応表示できたのですが、信号が出ていないタイミングがあるため映像に縦線が入るのでした。
今回はその対策です。


RGB信号が歯抜けにならないように、デジタルRGBの段階で、データラッチICにてデータを保持するようにします。
部品箱をガサゴソしたら、74HC574(8回路入りのD-FF)が出てきたので、これを使ってみます。


本当は追加のICを使用せずにPIC32MXのみでやりたかったんですが、まあしょうがないです。
今回使用したPIC32MX250F128は、秋月電子で360円で買えます。
74HC574は、まあ100円ぐらいだと思うので、まだ部品代としては1000円以内です。



とりあえず配線しました。



モニタに映したら、いい感じになりました。


ただ、今気がついたのですが、RGBのビットの並びがなんか変です。
グラデーションを表示しようとしたら、0〜7の昇順だとグラデーションになりませんでした。
最下位ビットを最上位ビットを入れ替えて、真ん中のビットを反転したら、なぜが想定どおりの表示となりました。
なぜにこんなことになっているのか謎です。
どこで入れ替わっているのでしょうか。。。

PIC32MXでビデオゲームマシン作成4(DAコンバータの作成)

昨日までで、PIC32MXのIOポートに対して、RGB信号をデジタルで出力できるようになりました。
赤が3ビット、緑が3ビット、青が2ビットで、合計8ビットのRGB信号です。



こいつを抵抗数本の簡単な回路で、D/A変換しました。
D/A変換してアナログ信号になったので、VGAコネクタでディスプレイに接続しました。



で、あっさり映ったんですが、なんか変です。



縦に黒い隙間があります。
ほんとはベタ塗りになってる想定だったんですがが。


PIC32MXのPMP(パラレルマスタポート)の「バッファ付きパラレルスレーブ」モードを使用して、RGB信号を出力するようにしました。
このモードは、出力用に1バイトのバッファが4段ついていて、DMAから4バイトまとめて書き込みができます。
こうすることにより、1バイトごとにDMA転送するより高速化できるわけです。


しかし、このモードは「スレーブ」なのでRD、WR、CSの制御信号を外から与える必要があります。
そのため、ドットクロックに相当する信号をタイマモジュールで作り、出力コンペアモジュールでIOポートへ出力し、その出力を配線でPMPのRDとCSの端子に接続して、PMPのRDとCSを一定周期(10MHz)でパタパタさせてやっています。
PIC32MXに自作自演させているわけです。


CSはアクティブな状態で固定して、RDだけパタパタ変化させる使いかたができればよかったんですが、
どうもCSをアクティブ固定にすると、信号がまったく出力されないっぽいです。
しょうがないのでCSもパタパタさせると、信号は出力されるようになりますが、当然、CSがアクティブではないタイミングでは、信号が出なくなります。
これがディスプレイ表示の黒い縦線の部分に相当します。


回避策としては、データラッチのICを追加するしかないかな。。。

PIC32MXでビデオゲームマシン作成3(RGB信号の生成)

なんだかすごい苦労しましたが、RGB信号が出力できるようになりました。たぶん。


PIC32MXにはDMAがあるから、RGB信号の出力も余裕だぜ!
と思っていたら、案外ハマりました。


DMAでVRAMの内容をポートに出力していくコードを普通に書いたら、ドットクロックにして3.4MHzのレートで出力するのが限界でした。
640x480 60HzのVGA画面は、本来の解像度だとドットクロックが25.175MHzです。
25.175MHzでRGB信号を出力すると、横640ドットの解像度が得られるということです。
そこへ、3.4MHzでRGB信号を出力すると、本来の周波数の1/7.4なので、横の解像度が86ドットになっちゃいます。


横86ドットはひどすぎます。
すごく・・・大きいです・・・(1ドットが)
ファミコンレベルを目指したはずが、Atari2600並みになってしまうところです。


PIC32MXには、PMP(パラレルマスタポート)というパラレルIOを制御するペリフェラルがあるのですが、これの「バッファ付きパラレルスレーブモード」というモードを利用したところ、高速にRGB信号を出力できました。
10MHzのドットクロックでRGB信号を出力できているようです。
これなら横254ドット表示できるはずなので、まあまあかと思われます。



水平同期信号(黄色)と、RGB信号(赤)



複数ラインを表示するとこんな感じ。


次は、DAコンバータの回路を作り、実際にモニタへ表示してみたいと思います。

PIC32MXでビデオゲームマシン作成2(同期信号の生成)

映像信号をPIC32MXに生成させようとしているわけですが、まずは同期信号を生成することにしました。

RGB信号を作っても、同期信号がないとディスプレイに表示できないわけで。
逆に、同期信号だけでもディスプレイは反応を示すはずです。

PIC32MXの出力コンペアというモジュールを使用して、水平同期信号を作ることにしました。
また、水平同期で割り込みがかかるようにして、水平ライン数を数えて、490〜491ラインの場合は垂直同期信号を出すようにしました。


生成した信号をオシロスコープで観察しました。
垂直同期の周波数が59.87Hzでパルス幅が63.52uS、
水平同期の周波数が31.49KHzでパルス幅が3.84uSと出ています。

VGAの640x480 60Hzの規格にほぼほぼ近い値なので、たぶん大丈夫そうです。

次はRGB信号を生成してみたいと思います。

PIC32MXでビデオゲームマシン作成(VGA出力編)

昨日はPIC32MXでLEDチカチカさせました。


次のステップとしては、いったんFAMIRGBからは離れて、PIC32MXでVGA信号を出力し、ビデオゲーム機っぽい映像をパソコンのモニタに表示させたいと思います。
まずは映像出力系から固めていくことで、作ってる感をわかりやすい形で醸し出す作戦です。
ディスプレイになんかしらの絵が出てしまえば、工作意欲も湧きやすいわけですね。

VGA出力

さて、PIC32MXでVGA出力ですが、なるべくゲーム用途に向いた方式で出力したいと思います。
今回使用するデバイスのPIC32MX250F128Bは、データメモリ(要するにRAM)が32キロバイトです。
これを多いと見るか少ないと見るかは、見方によって変わってきます。


最近のゲーム機はたぶん全てのものが、フレームバッファ方式でVRAMを持っていると思います。
要するに1画面分の画面データが1ドットごとそのままVRAMに入っているわけです。


フレームバッファを32キロバイトのメモリで持たせようとすると、かなり厳しいです。
横320ドット、縦240ドット、1ドットあたり1バイトのフレームバッファは、75キロバイトにもなります。
これだとそもそもメモリがたりませんね。
フレームバッファ方式にするとしたら、1ドットの色数をぐっと減らして、1ドット1ビットぐらいにしないと無理です。
横320ドット、縦240ドット、1ドットあたり1ビットのフレームバッファは、9600バイトです。
モノクロでも10キロバイト弱も使うわけです。


ゲーム用途ではモノクロ表示はさびしいですね。
そこで、ラインバッファ方式で映像出力することを考えます。
VRAMとして持つのは横1ライン分のメモリだけです(実際はダブルバッファリングするので、横2ライン分持ちますが)。
これなら、横320ドットで1ドット1バイトなら、320バイトのメモリで済むわけです。
ダブルバッファにしても、640バイトで済みますね。
1ドット1バイトということは、固定256色表示が可能です。
MSX2のSCREEN8相当といえば、伝わる人には伝わりやすいかと思います。


ラインバッファは2本用意します。
ひとつめのラインバッファからDMA転送によってIOポートへRGB値を出力している間に、もう一方のラインバッファに対して、次の水平ラインに表示する内容をCPUによって展開していきます。
これを2水平ラインごとに交互に切り替えながら処理するわけです。
2ラインを同じ内容で出力することで、縦240ドット表示にします。


タイミング

VGA(640x480 60Hz)のタイミングで、映像を出力するためのタイミングを検討します。
H-SYNCの周期は31.778マイクロ秒とのことなので、この周期でタイマ割り込みをかけます。
この割り込み処理で、H-SYNCをアクティブにして、DMA転送を開始して映像出力します。
その裏でCPUが次のラインの画面イメージを展開していきます(ラインバッファ展開)。
これを480回繰り返します。
横方向のタイミングをちゃんとやっておけば、あとは適当でもたぶんモニタに映るのではないかと思います。

スプライト

PIC32MX250F128Bは、プログラムメモリ(要するにROM)が128キロバイトなので、プログラムとキャラクタデータをそのサイズに収める必要があります。
128キロバイトは、1メガビットです。
ゲームのデータ容量として、現在の感覚としてはかなり少ないです。
ファミコンドラクエIIが1メガビットROMだったらしいので、感覚的にはあれぐらいの容量です。

この容量に収めるためには、ゲームのキャラクタ画像はビットマップの一枚絵で持つことは無理です。
スプライトやPCGのような形式で持つ必要があります。
とりあえずスプライトのみを扱えるようにすることを考えます。
スプライトは1ドットあたり4色(2ビットカラー)で、16x16サイズ固定とします。
画面表示自体は256色なので、256色中から4色選ぶパレットカラー方式です。
パレットを4つ定義できるようにして、スプライトごとに4つのパレットから1つ使用するものを選べるようにします。
プログラムメモリの128キロバイトの半分を画像データで使ってよいことにすると、1ドットあたり2ビットなので、64キロバイトだと262144ドット分の画像データが入ります。
262144の√は512なので、縦512ドット、横512ドット分のキャラクタパターンを定義できます。


PIC32MX250F128Bのメモリでゲーム機を作ろうと思うと、ファミコンと同レベルであまり余裕がありませんが、CPUパワーという観点でみるとMIPS32の40MHz動作なのでかなり余裕があると思います。
CPUの計算能力を生かして、スプライトパターンを圧縮して持っておき、ラインバッファ展開時に解凍するのもいいかもしれません(まあ、圧縮アルゴリズムは単純なランレングス法とかしか出来ないと思いますが)。


ひとまずこんな感じで実装してみます。
つづく。

PIC32MX LEDチカチカ

PIC32MXの開発環境をそろえた。

総合開発環境としてMicrochip純正である「NetBeans IDE v2.35」をインストールしました。
コンパイラを別途インストールする必要があり「XC32-v1.34」をインストールしました。


マイコンへの書き込みにはPICKit3というライターを用意しました。
これもMicrochip純正。
秋月電子で4500円なり。


要するに、メーカー純正の開発環境を一式用意したわけです。
純正なら変なところでハマることもなかろうと思ったわけです。
しかし、ばっちりハマりましたw


PICKit3が案外くせもの。
バイスをプログラミングするためのツールである「PLAB IPE v2.35」からPICKit3とうまく通信できませんでした。
"Connection failed"というつれないメッセージしかでません。


しばらくごにょごにょすることして解決しました。
「MPLAB_IDE_8_87.zip」をダウンロードしてきて、PICKit3のファームウェアを一度最新に更新すると、
その後は、MPLAB X IDEからプログラミングが可能になりました。


「MPLAB IDE」というのが、Microchip独自開発のIDEで、古いやつらしいです。
「MPLAB X IDE」というのが、NetBeansをベースに開発されたIDEで新しいやつです。

NetBeansというとJavaでコード書くときのIDEというイメージでしたが、
こういうところでも使われているのですね。


売っている状態のPICKit3は、ファームウェアが古すぎて、新しいMPLAB X IDEから認識できないということのようです。
なので、旧IDEのMPLAB IDEで一度、ファームウェアを更新しておけば、MPLAB X IDEでも認識できるようになると。。。
なかなか初心者泣かせですねー



ブレッドボードにとりあえずテスト回路を組んでみた。
ポート出力をON/OFFを繰り返すだけのプログラムを書き込んでみて、とりあえずLEDが点滅することを確認した。


すごく簡単なプログラムですが、これができないことには始まらないわけです。