MC6883でDRAM駆動しているSBC6809EルーズキットのMPUをすげかえて、MC6800を動かしてみたいと思ってプリント基板を作りました。
せっかくの究極の8bit CPUが載ってるボードに、モトローラの初CPUを載せるという暴挙ですw
MC6800のφ1、φ2クロック信号
MC6800 MPUはご存知のとおり外部からφ1、φ2の2相クロック信号が必要です。SBC6800ルーズキットではPICによってこの2相クロックを生成しています。
SBC6809Eルーズキットでは、MC6883がDRAMとクロックのコントロールをしてましてE信号(φ2)を生成しています。問題はφ1が生成されないことなんですが、前回も掲載しましたが MC6883のデータシートに以下のようなサンプル回路が出てましてフリップフロップでE信号からφ1、φ2の2相クロック信号を作ることが可能のようです。
MC6883データシートでは、74LS28を使って出力をプルアップすることで0ボルト〜5Vまでフルスイングさせている模様。ここは74HCT02とかCMOSのNORゲートICを使えばいい気がします。
あとはMC6809E CPUのソケットからアドレスバス、データバス、制御信号なんかを引っ張り出してMC6800 MPUにつなぐと変換基板ができそう。
変換基板の回路図
MC6800をSBC6809EルーズキットのCPUコネクタへ小亀タイプで載せる基板の回路図を作ってみました。
回路自体は単純ですが、アドレスバス16本、データバス8本、制御信号…と結構な結線数があってユニバーサル基板で試作する根性がなかったので、プリント基板化することにして JLCPCBさんへ依頼しました。
なんと、いまなら10cm x 10cm以下の基板 5枚の試作が$2。送料もOCS NEPという国内ではネコポスで送っていただけるサービスでなんと$1の送料。$3でプリント基板を作っていただけるという夢のような話…
ちなみにこの基板のデータはいつもどおりgithubにUPしています。
プリント基板完成 & 部品組み付けて確認
プリント基板のガーバーデータを登録して製造依頼して1週間とちょっとぐらいで無事ネコポスでポストインされて届きました。お届け方法もポストインというところが在宅してなくて良いし、嬉しいですね。
一緒の時期に頼んだ、PC-8001 CPUバスからSBC8080系バスへの変換基板も届きました。それぞれ別の注文として同じ時期にお願いしたものです。合わせても$6です。お安い!
部品を実装してE信号から74HC02経由で2相クロック信号が出てることをオシロスコープで確認しました。(実はこの先に書いているUniversal Monitorがソース修正不足で起動しなくて、波形を観測したんですが…^^)>)
ちなみに、MC6803E CPUソケットとの接続部分は秋月電子で売ってる細ピンヘッダを装着しました。板ばねICソケットでしたけど、ちょっと固かったですね…
回路図では74HCT02を使う予定だったんですが、手持ちにHCTタイプがなくてHCタイプを使っちゃいました。E信号だったらHCタイプでもいいかな?とか…
動作確認 〜 Universal Monitor
さて、SBC6809E用のROMだとMC6809 用プログラムなので、MC6800 MPUでは動きません。そこでいつもお世話になってるUniversal Monitorで動作確認してみたいと思います。
SBC6809E用のビルドも公開されていて、MC6809Eのアセンブルリストファイルもあったりして、たいへん参考になるであります。
動かすためのポイントは SBC6809Eルーズキット基板に載ってるシリアルIC MC68A50 ACIAのアドレスを合わせることと、DRAMのウォーミングアップルーチンを追加することです。
ソースの取得と、config.incの準備
UniversalMonitorのソースをゲットしてきます。最新ソースunimon-latest.tar.gzを展開すると”6800″というフォルダにMC6800用のソースがMakefileと共に入ってます。
シリアルIC ACIAのアドレスをSBC6809Eのアドレスへ合わせる必要があるため、config.incを編集します。SBC6800用のconfig.incをCOPYして編集がおすすめです。
;;;
;;; Special INIT
;;;
USE_SPINIT = 1
IF USE_SPINIT
SPINIT MACRO
;; Initialize SN74LS783
STA $FFDD ; M1=1 (MSIZE 64KB)
ENDM
ENDIF
;;;
;;; Motorola MC6850
;;;
USE_DEV_6850 = 1
IF USE_DEV_6850
;; ACIA
ACIAC: equ $DFFE ; Control / Status Register
ACIAD: equ $DFFF ; Data Register
ACCR_V: EQU $15 ; Control: x16, 8-bit, N, 1
ENDIF
MC6883(74LS783)用の初期設定ルーチン(USE_SPINIT)あたりの追加と、MC6850 ACIAのアドレス$DFFE、$DFFFを修正します。
DRAMウォーミングアップルーチン追加
SRAMでは特に考慮は要らなかったんですが、DRAMの場合ウォーミングアップの時間をとる必要があるみたいです。SBC6809E用のUniversal Monitorのアセンブルソースをみると$0800あたりまでインデクスレジスタを更新しながらロード命令を実行していました。そのルーチンを参考にMC6800アセンブラ命令で、”unimon_6800.asm”の ROMスタートのCSTARTルーチンの先頭にDRAMのウォーミングアップのルーチンを追加しました。
;;;
;;; ROM area
;;;
ORG ROM_B
CSTART:
;; DRAM warming up
LDX #0
RESET1: LDA ,X ; DRAM WARMING UP
INX
CPX #$0800
BNE RESET1
;
; 以下は元のルーチン
LDS #STACK
JSR INIT
クロスアセンブラでアセンブリ&PROM準備
Universal MonitorはThe Macroassembler ASでアセンブリできます。MakefileはUNIX系のasl命令でアセンブリするようになってますので、WIndowsネィティブのGNU makeとかThe Macroassembler ASでアセンブルするときは asw命令でアセンブルするように少々修正してmakeしてください。
makeしてアセンブリが無事通ると unimon_6800.hex ($E000〜)というインテルHex形式のファイルができます。TL866II Plus等のROMライターで適当なPROMに焼いてください。
私はW27C512という64kB EPROMに書き込みしましたので、とくにアドレス変換はしませんでした。8kB EPROMに焼く場合は 焼きソフトで $E000→$0000へ焼くなど工夫してください。
動作確認 〜 動いた!
SBC6809EのCPUソケットに変換基板を装着して、74HC02、MC6800 MPUを搭載。電源の5V ACアダプタと、シリアル-USB変換をつないで電源ON! すると、Universal Monitorの起動メッセージが出て、$0100番地あたりのメモリー値変更もうまくできました。
68系MPUでDRAMマイコンとして動きました! 感動!
あまりいろんなソフトは動かしてないので、これから色々と動かしてみます。
また、この基板を応用してMC6803E MPUも動かす基板を作ってみたいと思います。
コメント