SBC68系用 MC6847 VDG ビデオボード

MC6847

SBC6800ルーズキットなどのSBC68系のシングルボードコンピューターにビデオボードを接続してみたいという野望がありまして、モトローラ MC6847 LSIをつかってビデオボードを作ってみました。

マイコンにVRAMを装備してみたい

マイコンにVRAMを装備してみたいという野望としては、以前Z80マイコンMSXもどきをつくった際にTI社のTMS9918Aビデオボードを作りました。

高校時代にマイコンを持っていなかったときに買った専門書がありまして、以下の写真の本ですが モトローラ6800CPUを使ったマイコンに、VRAM装備したボードを追加したりキーボードを追加したりとスタンドアロンなコンピューターを実現されていたのに憧れてはや数十年という感じなので、68系マイコンにもビデオボードを作ってみたいというのは私の長年の夢でした。

MC6847テスト回路

モトローラMC6847 VDG LSIですが、かつてはPC-6001やTRS-80といったパソコンに搭載されていた有名チップであります。LSIを入手したとしてまずはテストできるのだろうか?というところがありますが、以下のようにテスト回路を公開されている方がいらっしゃいまして、ちょっとやってみようかという気になったわけであります。

MC6847 test circuit (part 3)
The MC1372 modulator chip has finally arrived, so I can test the MC6847 in full color. The only problem is that it requires completely different clock and ampli...

ブレットボードにモトローラMC6847とMC1372、トランジスタなどの回路だけで、キャラクター一覧がカラーで出ています。カッコイイ!!

実チップの入手ですが、国内で古のLSI入手といえば若松通商。ということで注文して組み上げてみました。無事稼動です。嬉しい!

MC1372は映像コンポジット信号を生成するICです。水晶クロック発振もこのICで行うのですが、ちょっと抵抗器などを調整しないと私の環境ではただしく3.57MHzで発振してくれませんでした。
MC1372の1番ピンへつなぐ抵抗値を5.6kΩ→1kΩへ変更しています。

あとは、RCA端子のDIP変換基板の端子の半田付けを忘れてて「映像が出ない!!」と慌てたりしましたが、まぁお約束な感じでw

ちょっと映像が黄色っぽいとか気になるところはありますが、ほぼMC6847 LSI単独でキャラクターまで出たのは感動です。MC6847はキャラクターのCGを内蔵しているのでCG ROM(キャラクタのビットパターンROM)がなくてもキャラクターが出るみたいです。

MC6847 Datasheet

ちょっと残念なのは、通常のASCIIコードとちょっとズレているところです。だいたいあっているのですが、$40以降がリバースキャラクターに割り当てられていたりしてですね….
ただ、自分でキャラクターを設計しなくて良いのは楽チン。

SBC6800につないでみたい

せっかくモトローラのビデオLSIなので古のモトローラ6800CPUを搭載したSBC6800ルーズキットにつないでみたいと思いました。同じファミリー?LSIだと思うので、わりとすんなりつながりそうです。

参考回路について

以下の2015年ごろの掲示板のディスカッションで、MC6847 VDGを使ったZ80マイコン用のビデオボードを設計して動かしておられる方がいらっしゃいました。

https://micro-dev.de/showthread.php?tid=227&page=5

回路図も公開されていまして、こちらの回路図とMC6847のデータシートを見ながら回路を検討いたしました。

おおまかな仕組みと回路図

MC6847ビデオボードのおおまかな仕組みは以下になります。

  • SBC6800マイコンボードとの接続は、Tomi9さん作の SBC6800 Adapter経由で40ピンフラットケーブルで接続します。(SBC6303ルーズキットに似ている配置です)
  • Tomi9さん作のSBC-IOと共存できるようなVRAM/制御レジスタ配置にしたいと思います。
    • VRAMはいつも使っている62256型SRAMを使用します。VRAMのアドレスはSBC-IOで空きRAMへ設定できる$A000〜BFFFにします。SRAMの容量としてはあまりますが、上記の回路図を参考にバンク切り替えができるようにしました。
    • MC6847の制御用レジスタのラッチ(74HCT573)のアドレスは、SBC-IOに搭載しているICの制御アドレスを避けて $8110に設定したいと思います。
  • MC6847はVRAMのSRAMへ常時VRAMアドレスを出力してデータの読み出しを行なっています。SBC6800ルーズキットマイコン側からVRAMへの書き込みが来た場合に信号がぶつからないように調停する必要があります。
    • アドレスバスは74LS244、データバスは上に書いたリンクの回路図を参考に74LS245を使って制御します。
    • バスの制御切り替えはSBC6800アダプターによってSBCバスに乗せていただいているアドレス$A000のデコード信号を使います。6800マイコンが$A000からのVRAMメモリーにアクセスしてくるとLレベルとなりますので、その際にMC6847の MS端子へ入れてMC6847のアドレスバスをHiZ(ハイインピーダンス)にします。逆にアドレスバス、データバスの調停をしている74LS244や74LS245は活性化させます。これで6800マイコンが$A000からのVRAMメモリーを読み書きできます。
  • MC1372まわりの回路は、先人の皆様の回路やデータシートの回路を参考に定数を決めています。

ちなみに、Tomi9さんのSBC-IOのアドレス配置は以下の引用のようになっています。

SBC-IO REV2

というわけで….
上記を検討して作って見た回路図がこちらです。アドレスデコード関係で余ったNORゲートをつかって、VRAMのバンク切り替え番号をLED表示できるようにしてみました。

ユニバーサル基板で試作

上記回路が正しく動作するかどうかを確認してみたかったので、いつもの秋月電子Bタイプユニバーサル基板に搭載して配線してみました。

Bタイプユニバーサル基板をつかって配線するときは、ラッピング用単芯ワイヤーをつかって基板表面配線をすることが多いのです。今回はIC間の空きが2つ穴づつ取れなかったこともあり基板裏面配線となりました。

基板裏面配線だとポリウレタン銅線の方が被覆も熱に強めなのでやりやすいかとおもい、0.26mmぐらいのポリウレタン銅線をつかって配線しました。被覆は配線するたびにあらかじめ切断面から予備ハンダをして配線するとわりと配線効率が良かったです。ちょっと被覆が焦げるにおいがクサイですが….

ポリウレタン銅線だとバス配線もICの足にくるくると巻いて一筆書き配線できるのも良いです。ピンセットで巻きながらだったので、ちょっと慣れが必要ですが。ワイヤリングペンなどがあると楽なのかもです。

写真を見るとやけにコンデンサや抵抗器が乱立していますが、回路定数に合うものが手持ちになかったため並列やら直列やらで似たような値にしてみた苦肉の策の趾であります。

さて配線後の確認ですが、いつものように各ICソケットの+5VとGND間の電圧が正しくきているかを確認したのち、上の写真のようにMC1372だけ挿して電源を入れ水晶発振が正しくきていることを確認しました。大丈夫そうです。

他の部品もすべて実装して、電源ONするとVRAMのランダムな内容が画面に表示されました!!

SBC6800ルーズキットへ搭載したUniversalMonitorのメモリー変更コマンドをつかって$A000からのRAMアドレスに$00,$01,$02….と入力して見ると、@→A→B→C…と左肩から表示されました! 無事動いていそうです。

テストプログラム作成(6800アセンブラ)

以下のような6800CPUのアセンブラで書いた プログラムを書いてテストを実施しました。

ASCIIキャラクター全表示

テスト回路と表示がいっしょでちょっと面白みはないですが、$A000からのVRAMへ$00〜$FFを順番に書き込んで全キャラクター表示をしてみたいと思います。プログラムは以下にあります。

K68-VDG/sample/asciilist-6800/asciilist.asm at master · kuninet/K68-VDG
Contribute to kuninet/K68-VDG development by creating an account on GitHub.

The Macroassembler ASでクロスアセンブルするためのmakeファイルもつけてあります。

ブレッドボードで試作したときよりは綺麗な表示で良い感じです。

キーボード入力を表示するサンプル

つぎは、キーボード入力したものをビデオ画面に出してみたかったので、SBC6800のシリアル入力のデータをVRAMへ編集するエコーバック?プログラムを作ってみました。ソースコードは以下にあります。

K68-VDG/sample/echoback-6800/echoback-6800.asm at master · kuninet/K68-VDG
Contribute to kuninet/K68-VDG development by creating an account on GitHub.

プログラムが起動すると、MC6847の初期化を実施したあとVRAM領域のクリアを実施します。

MC6847はカーソルを出す機能は無い?と思ったので、ブロック的なキャラクターをカーソル風に表示してみました。

キーボードから入力された文字をVRAMへ編集していきますが、キャラクターコードのまま出力すると文字化け(英小文字に別のキャラクタが定義されています)したり、リバース表示したりするので適宜キャラクターコードを置き換えながら表示するようにしました。当初は黒っぽい背景に文字を表示するようにしてみましたが、視認性が低かったので背景を緑、文字を黒にしてみました。こちらもあまり見やすいとは言えないような….^^)

ちなみに、改行キーで次の行へ移動、最終行で改行キーを押したり、最後のカラム以降に文字を入れようとするとソフトウェアスクロールします。
このプログラムを応用してUniversalMonitorや電大版TinyBASIC用の出力ルーチンを作ればてスタンドアロンコンピューターの夢にも一歩近づきそうです。

回路図、サンプルプログラムはgithubで

回路図、サンブルプログラムはいつものとおりgithubに公開しました。

GitHub - kuninet/K68-VDG
Contribute to kuninet/K68-VDG development by creating an account on GitHub.

今後は…

ある程度安定して動作することがわかったので、今後プリント基板化してみたいとおもいます。そのときは、外部CG ROMも搭載して見たいなぁとか野望は膨らむわけですが、いつできるかなぁという所であります。

あとは別の68系マイコンボード SBC6303やSBC6809でも動かしてみたいとおもいます。

今回シリアル入力はパソコンのTeraTERMで行いましたが、スタンドアロンなシリアルターミナル基板キットもpicoさんのところなどで頒布されていますので、そちらをつないでスタンドアロンパソコン風にするのもイイナと思ったりしています。妄想は膨らみます。^^)

コメント

  1. enakaji より:

    自分も、HD6445とかuPD3301とかuPD7220とかいつか動かそうと、若松さんで買って死蔵しているCRTCがいっぱい (^_^;)
    若松さんで買えるuPD70236A(V53A)とかMC68030とか、ダイナミックバスサイジングに対応しているCPUとなら、繋ぐのそんなに難しくないんだけど、ソフト作るのが面倒で放置してる。

    • kuninet より:

      わたしも、uPD7220を1個持ってます。
      いつかはZ80マイコンなどで動かしてやろうと、昔の雑誌コピーとか先人の回路図をあつめています。
      いつか動かしたいですねぇ。^^);;;

      uPD3301が動くとPC-8001互換機が作れそうですよね。
      DMAコントローラーも必要みたいですけど。