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) 
共通テーマ:趣味・カルチャー