SSブログ
English Version

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

 前回の記事で「68KとPICの連携処理のために68Kのreset命令が使えそう」と書きましたが、実験して確かめてみました。

 使っている68KはCMOS版ではないため、普段使っているブレッドボード用の電源が容量不足だったり、他にもハード的な問題があったりしましたがやっと安定に動いているように見える状態になりました ^^;

 68KとPICの連携処理の確認の話に戻すとZ80の3チップ構成のPic24CPMマイコンの時とほぼ同様な処理で実験してみました。
 68KとPICの処理の概要は次のとおりです。

  • 68K側の処理概要
    1. ワークエリアにPICに要求する処理IDと必要な情報を設定する。
    2. reset命令を実行する。
    3. ワークエリアにPICが設定した処理結果を参照する。

  • PIC側の処理概要
    1. RESET信号がアクティブになるまで待つ。
    2. BR/をアクティブにしバス制御を要求し、68Kからのバス引き渡し応答(BG/)がアクティブになるまで待つ。
    3. ワークエリアに設定された処理IDに基づき、処理を行い結果をワークエリアに書き込む。
    4. BR/をインアクティブにしバスを開放する。

 最初はコンソール出力の実験で68K側の処理は下記のソースのように'Hello.'の文字列をコンソールへ出力要求します(定番ですね)。
 アセンブル環境はEASy68Kを使っています。

68Kの'Hello.'出力処理
0001FC00 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2018/08/19 22:28:34 00000000 1 * CP/M-68K bios test 00000000 2 * by skyriver 2018/08/18 00000000 3 00000000 4 00000000 =0001FF70 5 PICWRK EQU $1ff70 ; PIC service work area 00000000 =0001FF80 6 PICDMA EQU $1ff80 ; DMA for PIC 00000000 7 00000000 =0000000D 8 CR EQU 13 00000000 =0000000A 9 LF EQU 10 00000000 10 00000000 11 00000000 =00000000 12 FC_EXIT equ 0 ; EXIT CP/M 00000000 =00000001 13 FC_CONST equ 1 ; CONST 00000000 =00000002 14 FC_CONIN equ 2 ; CONIN 00000000 =00000003 15 FC_CONOUT equ 3 ; CONOUT 00000000 =00000004 16 FC_READ equ 4 ; READ SD Card 00000000 =00000005 17 FC_WRITE equ 5 ; WRITE SD Card 00000000 =00000006 18 FC_PUNCH equ 6 ; PUNCH 00000000 =00000007 19 FC_READER equ 7 ; READER 00000000 20 00000000 21 ; ++++ work area for PIC Interface 00000000 =0001FF70 22 FuncNo equ PICWRK ; ds 1 : function No 00000000 =0001FF71 23 RetVal equ PICWRK+1 ; ds 1 : return value 00000000 =0001FF72 24 CoData equ PICWRK+2 ; ds 1 : conout data 00000000 =0001FF73 25 SelDk equ PICWRK+3 ; ds 1 00000000 =0001FF74 26 Track equ PICWRK+4 ; ds 2 00000000 =0001FF76 27 DmaAdr equ PICWRK+6 ; ds 2 00000000 =0001FF78 28 Sector equ PICWRK+8 ; ds 1 00000000 29 0001FC00 30 org $1fc00 0001FC00 31 0001FC00 32 0001FC00 33 0001FC00 2C7C 0001FC22 34 Start: move.l #StartMsg,a6 0001FC06 121E 35 Loop: move.b (a6)+,d1 0001FC08 B23C 0000 36 cmp.b #0,d1 0001FC0C 6700 0008 37 beq Exit 0001FC10 38 0001FC10 6100 001A 39 bsr Conout 0001FC14 60F0 40 bra Loop 0001FC16 41 0001FC16 13FC 0000 0001FF70 42 Exit: move.b #FC_EXIT,FuncNo 0001FC1E 4E70 43 reset 0001FC20 60FE 44 bra * 0001FC22 45 0001FC22 46 0001FC22 47 StartMsg: 0001FC22= 48 65 6C 6C 6F 2E ... 48 dc.b 'Hello.',CR,LF,0 0001FC2B 49 0001FC2B 50 0001FC2B 51 ; write to console 0001FC2B 52 ; d1.b <- out data 0001FC2B 53 0001FC2C 13C1 0001FF72 54 Conout: move.b d1,CoData 0001FC32 13FC 0003 0001FF70 55 move.b #FC_CONOUT,FuncNo 0001FC3A 4E70 56 reset 0001FC3C 4E75 57 rts 0001FC3E 58 0001FC3E 59 0001FC3E 60 end START No errors detected No warnings generated


 PIC側は自作のpicleコンパイラを使い、Pic24CPMマイコンのBIOS処理を流用し不要な部分を削除して使っています。
 上記の68Kのソースのアセンブル結果(Sレコードフォーマット)をバイナリ変換後、MemWR()ステートメントへの自動変換処理を通してpicleのソースに埋め込んでいます。

 試験実行時のログが下記でpicleソースを表示後、runしています。想定通り68Kから出力要求した文字が出力されました^^/

★2019/07/02 追記
 実装メモリサイズが512KBのバージョンに差し換えました(開発時はこの時点ではメモリサイズが128KBだったのでワークエリアのアドレス等が異なります)

68Kからの'Hello.'出力実験ログ
:l 1:# 3chips MC68008 Hello test 512KB version 2018/09/30 2:# by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgStart,ProgWrk,_WrkVal,_PicDma,WrkTrk; 8:var EscFlg,EscY; 9: 10: 11:proc PicSrv() { 12: var i,fno,rval; 13: 14: while (1) { 15: while (LATA[-1]&1) {} # wait reset 16: PmpOn(); 17: PmpSetAdr(ProgWrk); 18: fno = MemRd(); # dummy 19: for (i=0;i<3;i=i+1) { 20: _WrkVal[i] = MemRd(); 21: } 22: fno = _WrkVal[0]; # function No 23: 24: if (fno=1) { # CONST 25: if (InpChk_()) { 26: rval = $ff; 27: } else { 28: rval = 0; 29: } 30: } 31: else if (fno=2) { # CONIN 32: rval = InpChar_(); 33: } 34: else if (fno=3) { # CONOUT 35: PrnChar_( _WrkVal[2] ); 36: } 37: else if (fno=0) { 38: break; 39: } else { 40: PrnStr_("\nFunc err"); 41: } 42: PmpSetAdr(ProgWrk+1); 43: MemWr(rval); 44: 45: PmpOff(); 46: BusRelease(); 47: } 48:} 49: 50: 51:proc main() { 52: init(); 53: initPmp(); 54: initSpi(); 55:# initSd(); 56: 57: ProgStart = $fc00; # start addr(68K:07fc00) 58: ProgWrk = $ff70; # work addr(68K:07ff70) 59: _PicDma = $ff80; 60: _WrkVal = Alloc( 5 ); 61: WrkTrk = Alloc( 2 ); 62: 63: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a3 64: 65: PmpOn(); 66: PmpSetAdr(0); 67: MemWr($00);# stack 68: MemWr($02); 69: MemWr($00); 70: MemWr($00); 71: MemWr($00); # PC 72: MemWr($07); 73: MemWr($fc); 74: MemWr($00); 75: 76: PmpSetAdr(ProgStart); 77: 78: MemWr($2c);MemWr($7c);MemWr($00);MemWr($07); 79: MemWr($fc);MemWr($22);MemWr($12);MemWr($1e); 80: MemWr($b2);MemWr($3c);MemWr($00);MemWr($00); 81: MemWr($67);MemWr($00);MemWr($00);MemWr($08); 82: MemWr($61);MemWr($00);MemWr($00);MemWr($1a); 83: MemWr($60);MemWr($f0);MemWr($13);MemWr($fc); 84: MemWr($00);MemWr($00);MemWr($00);MemWr($07); 85: MemWr($ff);MemWr($70);MemWr($4e);MemWr($70); 86: MemWr($60);MemWr($fe);MemWr($48);MemWr($65); 87: MemWr($6c);MemWr($6c);MemWr($6f);MemWr($2e); 88: MemWr($0d);MemWr($0a);MemWr($00);MemWr($ff); 89: MemWr($13);MemWr($c1);MemWr($00);MemWr($07); 90: MemWr($ff);MemWr($72);MemWr($13);MemWr($fc); 91: MemWr($00);MemWr($03);MemWr($00);MemWr($07); 92: MemWr($ff);MemWr($70);MemWr($4e);MemWr($70); 93: MemWr($4e);MemWr($75); 94: 95: PmpOff(); 96: BusRelease(); 97: LATA[-2]=LATA[-2]|$3; # off reset:a0 halt:a1 98: 99: PicSrv(); 100: 101: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 102:} :run Hello. :


 'H'出力処理時のロジアナ波形が下記です。68Kがreset命令を実行することでRESET/信号が15.7us間アクティブになり、PIC側ではRESET/信号がアクティブになったことを検出し、バス要求(BR/をアクティブ)しています。
 PIC側は要求のあった処理を行った後、バスを開放しています。

68KからPICへの処理要求時の波形サンプル


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

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

nice! 1

コメント 7

Old68fun

Old68funです。先日コメントさせていただきましたように、Pic24CPMとPic24CPM-68Kの製作中です。
最初はskyriverさんのガーバーデータで基板を発注したのですが、私は表面実装部品を持っていないので、改めてKiCadで回路図を書き直して通常部品用の基板を製作し直しました。若干のミス等もありましたが、Pic24CPMの方は「CP/M起動までの作業まとめ」のおかげで無事に動作しました。CP/Mの走るマイコンボードはいくつか持っているのですが、これは特に使い易い気がします。またpicleコンパイラで書き直せるのも良いですね。
そしてPic24CPM-68Kの方ですが、Pic24CPMと同様にKiCadで作り直した基板で製作しましたが、まだ動いていません。
「3チップ構成68Kマイコンの構想」でのメモリ書き込みの動作確認はできましたが、「3チップ構成68Kマイコンの構想(その2)」のHelloが出力されません。調べたところ PicSrv()が正常に動作していないようです。そもそも Pic24FJ64に書き込んでいるHexファイルがPic24CPMのものなので、それが原因だろうと思っています。
ブログにはCP/M用のBIOS処理を流用し不要な部分を削除したと書かれていますが、CP/MとCP/M-68KとではPic24のピンの使い方も異なっている部分がありますし、そのままでは動作しないことは分かるのですが、情けないことにCP/Mの知識もない上に、picleコンパイラも使いこなせていないので、先に進めません。
厚かましいお願いですが、Pic24CPM-68K用のPic24に書き込むHexファイルを公開していただけないでしょうか。Pic24が動けば、68K側のプログラムは自分で何とかできるかもと思っています。(全く自信はありませんが...)
もう次のV20に取り組んでおられてお忙しいとは思いますが、よろしくお願いします。
また、私のブログでPic24CPMとPic24CPM-68Kの製作記ということで紹介させていただけると有難いですが、よろしいでしょうか。

by Old68fun (2019-07-02 20:33) 

skyriver

 Old68funさん、こんにちは

 Pic24CPMを作成して動作したという報告を始めて頂きました^^
 このPic24CPMは私自身でもこんなのが欲しい(SDで立ち上る小型で高速なCP/Mマシン)というイメージに沿ったものに仕上げています。

 CP/M-80に比べればCP/M-68KはマイナーなのでPic24CPM68Kを作ろうとする人はほとんどいないだろうと思い、Pic24CPMのような起動手順を書いていませんでした^^;
 「その2」(このページ)の'Hello'が表示しない理由はこの時点ではメモリサイズが128KBだったのですがその後512KBに拡張したので公開した回路図ではメモリサイズが512KBになっていることが原因ではないかと思います。
 取り急ぎ「その2」と「その3」のpicleソースを512KBメモリ対応版に差し換えましたので試してみてください。

 PIC側のHEXファイルは後日公開したいと思いますが少し時間をください。

 お問合せ頂いたブログでの紹介は問題ありません(本サイトの関連ページへのリンクの記載をお願いします)

by skyriver (2019-07-03 00:03) 

skyriver

 差し換えたpicleのソースですがライブラリを使っているのでライブラリ無しでは動きませんね^^;
 後日HEXファイルとともに公開します。

by skyriver (2019-07-03 00:12) 

Old68fun

Old68funです。こんにちは。
早速対応していただきましてありがとうございます。
私も回路図を見てメモリアドレスの違いには気づきまして、$01xxxxを$07xxxxに変更をした結果、最初の動作確認はパスしたということでした。
PICのライブラリLibCpm.pidやLibSpiEsc.pidを眺めてみましたが、私にはどこを直せばよいのかは皆目見当もつきませんでした。
急ぎませんので、時間のある時で結構です。よろしくお願いします。
by Old68fun (2019-07-03 08:54) 

skyriver

 Pic24CPM68KでCP/M-68Kを起動させるまでの手順を下記の記事にまとめました。

https://piclabo.blog.so-net.ne.jp/Pic24CPM68K

 また、ガーバーデータをseeedさんの「Fusion gallery」の「Geek product」コーナーで公開しました。

https://www.seeedstudio.com/CP-M-68K-board-consisting-three-chips-g-1180375

by skyriver (2019-07-06 22:40) 

skyriver

追記 picleのソース自体はPICのhexファイル内に含まれているので変更時のメンテ性等を考慮しソースファイルとしてはアーカイブファイルに入れていません。
by skyriver (2019-07-06 23:07) 

Old68fun

skyriverさん こんにちは
Pic24CPM-68Kの作成手順を公開していただきましてありがとうございます。
早速本日、手順通りに進めた結果、無事に動作させることができました。これで、大昔から興味があったCP/M-68Kをいじることができます。(昔、X68000でOS-9/68Kをいじっていましたが、CP/M-68Kには縁がありませんでした。)

ただ教えられたとおりに操作しただけでは勉強になりませんので、順に段階を追って確認しようとしているのですが、第1回の動作確認のメモリの書き込みができません。以前はできましたのに、不思議です。逆に、前回はダメだった第2回のHello出力は、今回は正常に表示されました。
ということで、全体を理解するにはまだまだですが、少しずつ進んで行ければと思っています。

まだ少しいじっただけの感想ですが、立ち上がりも、SDの読み取りも速いので使い勝手が良いと思います。それにしてもpicleは使い易いですね、手になじむツールになりそうです。
ありがとうございました。

by Old68fun (2019-07-07 14:12) 

コメントを書く

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