SSブログ
English Version

SuperSimpleController(その16)TMS9918Aの接続 [OriginalCPU]

 前回の記事ではオリジナルCPU(Simple8Z)での整数演算処理と逆ポーランド式電卓の作成について書きましたが、TeraTermの画面で処理するだけではあまり面白くないのでグラフィック画面を表示できるようにしたいと思います。

 グラフィック表示機能をTTLで作るのも面白そうではありますが、今回はいにしえのMSXで使われていたTMS9918Aという画面表示プロセッサ(VDP)を使うことにします。
 当時は16KB x 1bitのDRAM(4116)を8個付けるのが標準的な回路でした(TMS9918のデータシートにも4116の接続例が書いてありますし、Video Display Processorのサイトの「RAM interface」の箇所には具体的な接続が書いてあり参考になります)
 また、ネット上ではRASとCAS信号で多重化されたアドレス信号を574等で分離することでSRAMを接続する回路例も見つかります。

★追記 2021/11/10 {
 TMS9918Aに接続される8個のDRAMをSRAM化する元情報と思われる資料を見つけたのでリンクを貼っておきます。今回の試みであるTMS9918での4bit DRAM対応は使用チップ数も少なく、自分的にはかなり面白い試みだと思います。
 下記のリンク資料で最後の方にTMS91x8について言及されています。興味深いのはTMS9918用のSRAM化回路でDRAMへのライト時のデータバス切替え用のD-FF(74LS574)をソケットから抜けばTMS91x8に差し換えても動作すると書かれていることです。
 そうであれば、今回開発している4bit DRAM化回路でも同じことが言えるはずです。}

 SRAMを使うためにラッチのICを2つ使うよりも手持ちのuPD41464(64KB x 4bitのDRAM)を使えたら、より簡略な回路にできるのではないかと考えて挑戦してみました。一応ネットでも探してみましたがTMS9918に4BITのDRAMを接続した回路は見つかりませんでした。

 今回は自作のオリジナルCPU(Simple8Z)でコントロールするのでVDP周りは既知の実績のある回路を採用した方が断然楽なのですが、敢えて未踏の構成に挑戦するというのは趣味としての醍醐味でもあります。

 始めにTMS9918Aのデータシートに記載されているVRAMのリード/ライト時の信号タイミング図を下図に示します。

TMS9918AのVRAMリードサイクル



TMS9918AのVRAMライトサイクル



 リード/ライト制御信号が1つの信号なのは6116自体がデータ入力とデータ出力のピンが別々でリード専用の制御信号が無いためです。今回使用する41464のデータピンは一つで双方向になっていてリード(OE/)とライト(WE/)の制御信号が必要です。

 41464のデータシートに記載されているリード及びライトのタイミング図を貼っておきます。ライトサイクルにはEarly Write CycleとOE-controlled Write Cycleの二通りありますが、今回採用した後者のみを貼りました。

41464のリードサイクル



41464のライトサイクル(OE-controlled Write Cycle)



 TMS9918Aと41464のタイミングを見比べてみるとリードサイクルはまぁいいとしてもライト時にはOE/がアクティブにならないようにする必要があります。これはCASを一定時間ディレーした信号を作り、リード信号(ライト信号を反転したもの)とANDをとることでライト時にOE/がアクティブにならないようにしました(その他、NOTゲートを使ったタイミング調整等も行い、DRAMをアクセスできるようになりました)。

 また、ライト時にはライトデータがアドレス線と同じバス(ADn)に多重化されて出力されるので3ステートのバッファを介して41464のデータピンに接続しました。下図のMRW/信号はTMS9918Aから出力されるR/W信号です。

TMS9918Aからのライトデータのバッファリング



 具体的な回路図については動作確認後に別途ブログに記載する予定です。
 現時点での41464への制御信号の実測例を下図に示します。
 1:RAS/、2:CAS/、3:WE/、4:OE/ の信号で、中央部分がライトサイクルでその前後がリードサイクルです。

DRAM(41464)の制御信号波形例



 TMS9918Aのグラフィック1(モード0)を使って動作確認を行っています。VRAMのマッピングはMSXのSCREEN1に合わせました。

VRAMのマッピング
 PCGAD	EQU	0000H		; 0000 - 07FF : pattern generater table 
 VRAMAD	EQU	1800H		; 1800 - 1AFF : pattern name table
 SATRAD	EQU	1B00H		; 1B00 - 1B7F : sprite attribute
 COLTAD	EQU	2000H		; 2000 - 201F : color table
 SPATAD	EQU	3800H		; 3800 - 3FFF : sprite pattern


 色々いじくり回した結果、オリジナルCPU(Simple8Z)を使ってやっとHelloが表示できました^^/
 ビデオ出力部はTMS9918Aのデータシートに書いてあるように330Ωでプルダウンしただけですが、トランジスタ回路にするともっと綺麗になるかもしれません。

 下図はHello表示した際にNTSC信号をキャプチャしたもので記念に貼っておきます(手持ちの安いLCD式の小型モニタでも表示できました)。

Hello表示画面



 上記の内容はブレッドボードを使って評価中で、オリジナルCPUのI/O拡張用コネクタピンから信号線を取り出し、ブレッドボードに接続しています。ブレッドボード上にはモニタを動かすためにMC68B50を使ったシリアルインターフェースも組み込んでいます。

 いつもながらに混沌としていますがブレッドボードと接続した写真も貼っておきます。
 今のところ、オリジナルCPU側のマイクロコードの修正等は発生していません。

ブレッドボードでの評価状況




★追記 2021/05/15
 TMS9918のバリエーションとして4BitのDRAMに対応したTMS9118があります。
 VRAMのライトサイクルのタイミングが下図のようになっていてW/信号がCAS/より前にアクティブになるので、そのままでDRAMの Early Write Cycle に対応できます。
 また、ライトデータがアドレス線に多重化されていないので上記のTMS9918Aのようなバッファリングも不要になります。

TMS9118のVRAMライトサイクル




[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー