SSブログ
English Version

3チップ構成68Kマイコンの構想 [68K]

 「3チップ構成Pic24CPMマイコン(CP/M起動までの作業まとめ)」の記事でPIC24FJ64GA004を使った3チップ構成のZ80ワンボードドマイコンでCP/Mを立ち上げるまでの作業を書きましたが68Kで同様なことが可能か否かの実験中です。

 チップ構成はMC68008P10(10MHz版ですがPICからクロックを供給する関係で8MHzで動作)とHM628128ALP-7(128KByteの70nsのSRAM)とPIC24FJ64GA004の3チップでTTLやGAL等は一切使っていません。
 メモリは512KByteのK6T4008C1Bをebayで注文したので届いたら交換するかも・・
 動作確認はブレッドボードで行っていて(下の写真)、相変わらずゴチャゴチャした状態ですw
 右側に伸びている配線は写真では見えないですがロジアナに接続されています。
 撮影用に古い雑誌を本棚から持ち出して敷きましたw

3チップ構成のMC68008ブレッドボード

 数日前にtwitterでベンチマーク用のアスキーアートのことを書きましたが68Kの情報収集の際に見つけたものです。ここには68Kのシミュレータ上のディバッグ環境であるEASy68KでCP/M-68Kを立ち上げる手順も書いてあります(やってみたら動きました^^)。

 PICからのメモリアクセスはZ80の時と同様にBR/(BusRequest)してPICがバスマスターとなり直接メモリに書き込みますが、アドレス線が足りないのでAD0~AD10の11本分を出力しています。
 AD10が1の場合は上位アドレスも1になるようにしているのでPICからのアドレスと68K側のアドレスは下表のような対応になります。
 尚、68K側は003FFまではベクタテーブルです。

PIC address68K address
0000-03ff00000-003ff
0400-07ff01fc00-01ffff


 Z80の時はPICとの連携処理のインターフェースとしてHALT命令とRESET信号を使いましたが、68Kのマニュアルをざっと見たところPICと68Kの連携用のインターフェースとして68KのRESET命令が使えそうです。
 試しにEASy68Kで下記の短いソースをアセンブルし、ブレッドボードで動かしてみました。
 最初に書いてある3行のコメント行はCP/M-68Kのアセンブラとリンカーを使っていた時のアセンブル方法などのメモです。

EASy68Kでアセンブル


 下記が動作確認を行った時のログです。例のごとく自作のpicleコンパイラを使っています。
 68Kの仕様に従い、最初に0000hにスタックとジャンプ先を書いた後に上記のアセンブル結果を書込んでからバスリクエストをoffに変更後、リセットを解除(出力から入力状態にする)しています。
 実行後のダンプリストを見ると0410hに'1234'と書かれているので68K側のプログラムが動いていることが判ります。

picleコンパイラでの動作確認例
:l 1:# 3chips MC68008 OneBoard test 2018/08/17 2:# by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:proc main() { 9: var adr; 10: init(); 11: initPmp(); 12: initSpi(); 13:# initSd(); 14: 15: LATA[-2]=LATA[-2]&$fff6; # on reset:a0 halt:a3 16: 17: PmpOn(); 18: PmpSetAdr(0); 19: MemWr($00); # stack 20: MemWr($02); 21: MemWr($00); 22: MemWr($00); 23: MemWr($00); # PC 24: MemWr($01); 25: MemWr($fc); 26: MemWr($00); 27: 28: adr = $0400; # 68K's ADR:0001fc00 29: 30: PmpSetAdr(adr); 31: MemWr($30); # move #$1234,d0 32: MemWr($3C); 33: MemWr($12); 34: MemWr($34); 35: MemWr($33); # move.w d0,$0001fc10 36: MemWr($c0); 37: MemWr($00); 38: MemWr($01); 39: MemWr($fc); 40: MemWr($10); 41: MemWr($4e); # reset 42: MemWr($70); 43: MemWr($60); # bra * 44: MemWr($fe); 45: 46: MemWr($ff); 47: MemWr($ff); 48: MemWr($ff); # change 12 by 68K 49: MemWr($ff); # change 34 by 68K 50: MemWr($ff); 51: MemWr($ff); 52: 53: PmpOff(); 54: dump(0); 55:# dump(adr); 56: 57: BusRelease(); 58: LATA[-2]=LATA[-2]|$9; # off reset:a0 halt:a3 59: 60: Timer_=10; 61: while (Timer_) {} # 100ms wait 62: 63: LATA[-2]=LATA[-2]&$fff6; # on reset:a0 halt:a3 64: PrnStr_( "\n-------" ); 65: dump(adr); 66:} :run 0000 : 00 02 00 00 00 01 FC 00 FF FF 7F FE FF FF FF EB 0010 : 7C EF BB FF E8 D4 7B AD BF 5F B2 7C FF DF A1 CA 0020 : FF FF FF FF FF FB DF FF FF FF FB FF FF FF FF EB 0030 : 73 BC F6 AB FB A1 AC BF F2 FE 37 FF FE FB 5A CA 0040 : FB FF FF FF FF FF FF FF FF FF FF FF FF FF FF FA 0050 : FB D6 AF ED FF 78 FD 7D FF BE FF FE F7 F7 B7 CA 0060 : FF FF FF FF FF FF FF FF FF FF FF FF FF BF FF FA 0070 : D3 68 D6 D4 7B 99 7E 17 FF 6F DA BF FF FE BF CB ------- 0400 : 30 3C 12 34 33 C0 00 01 FC 10 4E 70 60 FE FF FF 0410 : 12 34 FF FF 61 00 00 34 60 EA 0D 0A 62 6F 69 73 0420 : 20 74 65 73 74 0D 0A 00 12 1E 61 00 00 1E B2 3C 0430 : 00 00 66 F4 4E 75 21 FC 00 01 FC 48 00 8C 2C 7C 0440 : 00 01 FC 1A 61 E2 4E 75 4E 75 13 C1 00 01 EB 72 0450 : 13 FC 00 03 00 01 48 70 4E 70 4E 75 13 FC 00 02 0460 : 00 01 FF 70 4E 70 42 40 10 39 00 01 FF 71 4E 75 0470 : 13 FC 00 01 00 01 61 70 4E 70 42 40 10 39 00 01 :


 68KのRESET命令での動作をロジアナで確認した結果が下のキャプチャです。MCS/とMRD/はそれぞれメモリに対するチップセレクトとリード信号です。
 reset命令の実行により68Kがreset端子を16usほどアクティブにしています。
 68KがPIC側に処理を要求する際には68K側でRESETを実行し、PIC側ではRESET信号を監視することでPic24CPMマイコンと同様なことができる可能性があると思います。


68KがRESET命令実行時の波形サンプル


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(1)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。