Z80 ゲーム機を作ろう(その4)
なかなか時間が取れず,前回から2週間以上経過してしまいました。
前回は,CPU ボードを作りました。
3 枚目の基板です。今回は,画面同期信号生成回路を作る予定でしたが,基板の面積に余裕があったので,サウンド機能も載せてしまいました。
…で,こちらが基板です。一番下一列が,音源周りの回路です。
画面出力はアナログ RGB 信号
昨今の PC やゲーム機の画面出力と言えば,ほぼ液晶で,HDMI 信号が一般的になりましたよね。
ですが,この Z80 ゲーム機は,35 年前のアーケードゲームを参考に作成するので,画面出力信号として,アナログ RGB 方式で出力します。
画面出力に必要な信号として,水平同期信号,垂直同期信号,ピクセル色信号があります。
当時のゲーム機は画面をブラウン管に映していました。
このブラウン管,電子ビームが画面左上から右に横移動し,一段下の左に戻って,下まで行ったら上に戻って…と言う説明は色んなサイトで見ることができるので,省略します(笑)。
水平同期信号は,ブラウン管の電子ビームが左から右に横移動し,右端から 1ライン下の左端に戻るタイミングを決める信号です。
垂直同期信号は,これまた耳にしたこともあるかと思いますが,ブラウン管の電子ビームが水平同期信号に合わせてラインを走査していき,画面の全ラインをすべて走査しきったら,下端から上端に戻りますが,この戻るタイミングを決める信号です。
当時のアーケードゲームは,一部例外もありますが,概ね 60Hz に近いタイミングが一般的です。
1秒間に 60 回画面が更新されるということですね。
左から右へ水平方向に,一定数のドットを 1 ライン表示して,また左へ戻って,ひとつ下のラインを同じように表示していくので,この 1 ドット表示する時間を最小単位とすれば,この時間から各種信号を生成できます。
今回は,画面解像度を 240 * 192 として表示しますが,この 1 ドットを表示する時間を 5MHz のクロック信号として生成します。
横方向の表示ドット数は,240 ドットですが,水平同期信号を含む水平ブランク期間がありますので,これを含めると 1 ライン,312 クロック分となります。
垂直方向も,表示ライン数は 192 ラインですが,垂直同期信号を含む垂直ブランク期間を合わせて 262 ライン分になります。
5MHz の 1 クロック分の時間は,200ns(ナノ秒)つまり 0.0000002 秒です。
水平方向が 312 クロック分で,それが 262 ライン分ですので,1 画面分の時間は,掛け算して… 0.0163488 秒,約 16.3ms(ミリ秒)となります。
ということは 1 秒間に表示する画面数は,割り算すると…,61.1665688,つまり,垂直表示周波数が 61Hz ということになります。秒間 60 フレームよりもちょっと速いと言った感じですかね。
ちなみに,水平表示周波数はと言うと,1 ラインの表示にかかる時間なので,1クロック分の時間の水平方向のクロック数分です。掛け算すると,0.0000624秒。
周波数は,1 秒間に表示するライン数なので,割り算すると,16.025Khz になります。
よく聞く表示周波数は,水平 15.75Khz,垂直 60Hz ですが,まぁ,近いことは近いですね。この辺の誤差は,モニターが何とかうまく調整してくれます。
音源は矩形波出力の DCSG 音源
(その1)でも紹介しましたが,音源は,テキサスインスツルメンツの SN76489 を 2 つ使います。
矩形波のトーン信号を 3 つ,ノイズを 1 つ発生することができます。
似たような音源に,AY-3-8910,いわゆる PSG があり,DCSG は,それと比較してハードウェアエンベロープが無く,ノイズが独立したチャンネルになっていて云々…は ウィキペディア に詳しく書かれています(笑)。
まぁ,音自体は,どちらも基本は入力周波数を分周させた矩形波なので,聞いた感じは似たような音に聞こえます。
ただ,PSG に比べて,レジスタが少なくまた,チップ自体が小さいので,これを複数搭載したケースもよくありましたね。
その音の出力ですが,チップから出力された信号を,オペアンプで適当にミックス,フィルタして出力しています。
この辺のアナログ部分は,あまりこだわりがないし,鳴ればいいやって感じなので,あまり突っ込まないでください…。
前回までの基板に載っけて 3 階建て
Z80 と接続してみました。やっと 3 階建てです。なんとなく,ゲーム機っぽくなってきたような気がしますね…。
…んで,モニターにも出力してみました。
画面は,まだ表示する絵がないので,水平方向 8 ドットごとに色を変えて,カラーバーにしています。
音源は,せっかく入力部分と出力部分の基本部分ができたので,実際にジョイスティックから入力して音を出してみます。
…んで,鳴らしてみました。
ちょっとノイジーな気もしますが,一応,鳴っているので良しとします…。
今回はちょっとハマりました
今回は,データバスのビット 0 とビット 1 が化ける不具合に悩まされましたが,実はハンダブリッジしていたという初歩的なミスでした。
はんだづけした箇所は一通りチェックはするのですが,ホントに最後のほうで端折った部分がミスっていたという…。
このような手配線の回路は確実にチェックをしないと後で泣きを見るということを痛感しましたし,また,こういうミスも重ねることで経験値も蓄積し,レベルアップしていくのかな…とも思いました。(ただ,問題に気づかないと先に進まなくなるので,一気にモチベーションもダウンしてしまいますけど…)
さて,進捗がかなりゆっくりではありますが,次は,BG 画面を作りたいと思います。年末でいろいろと忙しいのですが,気長に進めていけたらな〜なんて思います。