VRAMボードの製作の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
AVRとZ80でCP/Mの改良(AKI-80 CP/M)の応用例です。

http://star.gmobb.jp/koji/data/VRAM_CRT_C.jpg

久しぶりの更新で生存報告みたいですが、ネタがないわけではなく記事にする気力がないだけです。

さて、手持ち部品の消化といきますか。

表示装置としてはAVRビデオ端末の製作でワンチップマイコンを使った端末形式のものを製作済みですが、今回はCPUから直接アクセスできるVRAMボードです。仕様はNTSCビデオ出力でCGROMによる白黒キャラクタ表示40字×25行です。

ワンチップマイコンだと部品が少なくて作り易かったのですが、自分の作品ではない(Grantさんの改変)し何か物足りず、VRAMとCGROM外付けの昔ながらの方式で作ってみたいと思いました。配線が大変ですが、まあ何とかなるでしょう。

!回路設計
http://star.gmobb.jp/koji/data/VRAM_book.jpg

画像を作るタイミングの生成回路は、初期は当然ですが全て汎用ロジックで作られていました。その後HD46505等の専用LSIが登場し、作り易くはなったもののバスの配線があるためそれでも容易ではありません。今ではそれら全てをワンチップマイコンのソフトだけでやってしまうので、すごいことだと思います。

HD46505を入手してもよいのですが、今回は代替としてAVRとZ80でCP/Mの改良の製作後、予備として購入していたCPLD(XC9536XL-VQ44C)で実装しました。

昔の製作本の例では、横文字数が2進で切れの良い数(32文字とか)になっており最上位ビットをブランキング期間に割り当てています。しかし40字表示のMZ-80KとかPETとかはどうやっているんでしょうか?
[回路図(Enri's Home PAGEさん)|http://www43.tok2.com/home/cmpslv/Mz80k/EnrMzk.htm]を見てみると、わざわざラッチとプリセッタブルカウンタを使っているんですね。

これらをCPLDに書いていくんですがマクロセルが全然足りない。規模の大きいCPLDの購入も考えたのですが、そうすると手持ちの部品消化にならないし、なるべく有り合わせの部品だけで作りたい、ということで苦肉の策でCPLDを二個に分けました。タイミングを作る部分とVRAMのカウンタで分けると、間の配線は5本のみで一個と大して変わりないですよね^_^;

[CPLD内のブロック図|http://star.gmobb.jp/koji/data/VRAM_cir_blk.png]はこんな感じ。CPUから書込ができる状態では、垂直ブランキング期間以外はWAITが発生するようにしています。書込みの時のみWAITが発生するのが理想ですが間に合わないので読み出しでも発生するようになっちゃってます。

[CPLDのピンの割当て|http://star.gmobb.jp/koji/data/VRAM_cir_cpld.png]、[VRAM・CGROMの回路|http://star.gmobb.jp/koji/data/VRAM_cir01.png]

(部品の選定が変なのは全部有り合わせのものにしているからです)

!回路変更【グラフィックも表示】
RAMに32KBのものを載せているのに1KBしか使わないのが何か勿体ないような。そこでちょっと気が変わり320×200ドットのグラフィック表示もできるように変更しました。

[変更した回路図|http://star.gmobb.jp/koji/data/VRAM_cir02.png]

だいぶ複雑になったように見えますが、CPLDはそのままにIOポートを一個設けてVRAMの空いたアドレスを全部そちらに接続しただけです。VRAMのアドレスは本来はIOポートではなく素直にCPUのアドレスの方につなぐべきでしょう。ただこうするとグラフィック表示でも書きっぱなしなら1KBの空間で済みます。

!組立
AKI-80よりやや大きめの基板でどうにか収まりました。バスの配線は同じところに何本もはんだ付けするのが大変なのでピンを立ててラッピングしています。

http://star.gmobb.jp/koji/data/VRAM_BRD01s.jpg [拡大|http://star.gmobb.jp/koji/data/VRAM_BRD01.jpg]http://star.gmobb.jp/koji/data/VRAM_BRD02s.jpg [拡大|http://star.gmobb.jp/koji/data/VRAM_BRD02.jpg]

!CPUとの接続
このボードは読み出しができないのでVRAMはメインメモリにかぶせて接続し、読み出す時はメインメモリの方から読むことになります。CPLDのCSにCPUのMREQとアドレスデコードをANDしたものを入れます。

!動作テスト
今回は実験としてアドレスデコードをしないMREQとIOポートの1ビットのANDをCSに接続しています。こうするとIOポートで書込可不可を制御し、書込み可の時アドレスのどこに書いてもVRAMに書き込まれるという変な仕様になります。なぜこんな変なことをしたかというと、本来ならCP/Mのメモリサイズを変更しシステムが使わない領域を作るのですが、適当なところを指定して書き込めるならTPA内に指定してしまってもプログラムが小さければ動く可能性が高いからです。

これはいろいろ問題が多いので実験後は普通にした方がいいかなと思います。まず起動時にIOの出力が不定なので、いきなりWAITが入って起動できなかったり、パラパラ変わる変な画面を見ることになります。面白いですけどね。

プログラムを書くときも結構嵌ります。書込可の状態ではVRAMへの書込以外で書込が発生する命令は書けない。例えばPUSH命令。と、まあ、がんじがらめですw

!ソフトウェア
{{ref VRAMBRD20200927.zip,VRAMボードの製作,ソフトウェア一式(CPLDソース/ライブラリ/テストプログラム)}}

ハードの方は誤配もなくすんなり動いたんですが、ソフト作りは面倒くさくてちっとも進みません。

キャラクタ表示用の回路でのグラフィック表示は、同一アドレスに対し8本のラインを割り当てているので、IOポートでラインを選択して書き込みます。

CP/M上のHI-TECH Cでライブラリを作成し、テストプログラムを動作させてみました。
(ブラウン管は歪むので液晶ディスプレーに表示)

http://star.gmobb.jp/koji/data/VRAM_LCD_Cs.jpg[1|http://star.gmobb.jp/koji/data/VRAM_LCD_C.jpg]http://star.gmobb.jp/koji/data/VRAM_LCD_G01s.jpg[2|http://star.gmobb.jp/koji/data/VRAM_LCD_G01.jpg]http://star.gmobb.jp/koji/data/VRAM_LCD_G02s.jpg[3|http://star.gmobb.jp/koji/data/VRAM_LCD_G02.jpg]http://star.gmobb.jp/koji/data/VRAM_LCD_G03s.jpg[4|http://star.gmobb.jp/koji/data/VRAM_LCD_G03.jpg]http://star.gmobb.jp/koji/data/VRAM_LCD_G04s.jpg[5|http://star.gmobb.jp/koji/data/VRAM_LCD_G04.jpg]
----
*昔作りましたね。全部TTLで、RAMは1102だったかな?水晶が高価でOSCは74123でしたが、文字は表示できました。 - えびえび (2020年10月02日 01時52分49秒)
{{comment}}