SSブログ
English Version

3チップ構成68Kマイコンの構想(その3)Sレコード簡易ローダーの製作 [68K]

 前回の「3チップ構成68Kマイコンの構想(その2)」で書いたようにPICと68Kの連携処理に関しては68Kのreset命令を利用することで実現できそうなのでCP/M-68KのBIOSは対応できる見込みが付きました。

 しかし、SDカードを使う上でのdisk関連のパラメータ等、調べる項目はまだまだあります。diskのパラメータについてはネットで探しましたが、68Kを使った今回の用途(SDカードをパーティション分けして使う)のような例は見つかりませんでした。
 CP/M-68Kではセクタサイズを512にしている例もあり、blocking/deblocking処理無しでSDカードが使えそうです。(また試していませんが一応disk関連のパラメータも決めました)

 最初に CP/M-68K 関連のファイルですが下記から入手しました。

 CP/M-68Kは本体(CPP+BDOS+BIOS)のサイズが大きいことからCP/M-80と違い1トラックに収まらないため、本体をCP/Mのファイルシステム上に置き、1トラック目に格納したCPMLDR.SYSがファイルシステム上に置かれたCP/M本体をロードする仕組みになっています。
 CPMLDR.SYSは1トラック内に格納できるようにするためにCP/Mのファイルシステムをアクセス可能な機能に絞った機能実装がされていてこれ用のBIOSもサブセット版とし、コンパクト化されています。

 今回の3チップ構成の68Kボードでは「3チップ構成68Kマイコンの構想」の記事で書いたようにPIC側からは68Kのごく一部のメモリしかアクセスできないのでSレコードファイルの簡易ローダーを作成してみました。

 アセンブル結果のリストが下記でチェックサムや16進数文字の範囲チェック等を省略し、小型化してみました。
 コンパクトではありますがアドレス表現部の桁数の異なるS1~S3タイプに対応しています。
 尚、Sレコードのフォーマットについては「モトローラ S レコードフォーマット」のサイト等を参考にさせて頂きました。

 また、アセンブル環境は前回同様にEASy68Kを使っています。

★2019/07/02 追記
 実装メモリサイズが512KBのバージョンに差し換えました。(開発時はこの時点でのメモリサイズは128KB)

Sレコード簡易ローダー
0001FC00 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2018/09/01 12:35:27 00000000 1 ************************************** 00000000 2 * S record loader for Pic24CPM68K 00000000 3 * ver 0.02 2018/08/31 by skyriver 00000000 4 ************************************** 00000000 5 00000000 6 00000000 =0007FCF0 7 PICWRK equ $7fcf0 ; PIC service work area 00000000 =0007FE00 8 PICDMA equ $7fe00 ; DMA for PIC 00000000 9 00000000 =00000000 10 FC_EXIT equ 0 * EXIT CP/M 00000000 =00000001 11 FC_CONST equ 1 * CONST 00000000 =00000002 12 FC_CONIN equ 2 * CONIN 00000000 =00000003 13 FC_CONOUT equ 3 * CONOUT 00000000 =00000004 14 FC_READ equ 4 * READ SD Card 00000000 =00000005 15 FC_WRITE equ 5 * WRITE SD Card 00000000 =00000006 16 FC_PUNCH equ 6 * PUNCH 00000000 =00000007 17 FC_READER equ 7 * READER 00000000 18 00000000 19 * ++++ work area for PIC Interface 00000000 =0007FCF0 20 FuncNo equ PICWRK * ds 1 : function No 00000000 =0007FCF1 21 ArgByte equ PICWRK+1 * ds 1 : byte argument 00000000 =0007FCF2 22 SdSec equ PICWRK+2 * ds 4 00000000 =0007FCF6 23 RetVal equ PICWRK+6 * ds 2 : return value 00000000 24 00000000 25 0007FC00 26 org $07fc00 0007FC00 27 0007FC00 227C 0007FCF0 28 start: move.l #PICWRK,a1 0007FC06 6100 0082 29 loop: bsr conin 0007FC0A B03C 0053 30 cmp.b #'S',d0 0007FC0E 66F6 31 bne loop 0007FC10 32 0007FC10 6100 0078 33 bsr conin 0007FC14 3200 34 move d0,d1 0007FC16 0400 0030 35 sub.b #'0',d0 0007FC1A 67EA 36 beq loop * if type 0 0007FC1C B03C 0004 37 cmp.b #4,d0 0007FC20 6C00 0056 38 bge exit 0007FC24 39 0007FC24 6100 0070 40 bsr conout 0007FC28 4242 41 clr d2 0007FC2A 1400 42 move.b d0,d2 * save type to d2 0007FC2C 6100 003E 43 bsr Hex2 * get length 0007FC30 4243 44 clr d3 0007FC32 1600 45 move.b d0,d3 * save counter 0007FC34 5503 46 sub.b #2,d3 * dec for sum 0007FC36 4284 47 clr.l d4 0007FC38 48 0007FC38 6100 0032 49 getadr: bsr Hex2 0007FC3C E18C 50 lsl.l #8,d4 0007FC3E 8800 51 or.b d0,d4 0007FC40 5303 52 sub.b #1,d3 0007FC42 51CA FFF4 53 dbf d2,getadr 0007FC46 54 0007FC46 2044 55 move.l d4,a0 0007FC48 6100 0022 56 getdat: bsr hex2 0007FC4C 10C0 57 move.b d0,(a0)+ 0007FC4E 51CB FFF8 58 dbf d3,getdat 0007FC52 60B2 59 bra loop 0007FC54 60 0007FC54 61 0007FC54 62 * input hex 1chara 0007FC54 63 * d0.b -> data 0007FC54 6100 0034 64 Hex1: bsr conin 0007FC58 B03C 0039 65 cmp.b #'9',d0 0007FC5C 6E00 0008 66 bgt Hex1_1 0007FC60 0400 0030 67 sub.b #'0',d0 0007FC64 4E75 68 rts 0007FC66 0400 0037 69 Hex1_1: sub.b #$37,d0 0007FC6A 4E75 70 rts 0007FC6C 71 0007FC6C 72 0007FC6C 73 * input hex 1byte(2chara) 0007FC6C 74 * d0.b -> data 0007FC6C 61E6 75 Hex2: bsr Hex1 0007FC6E 2200 76 move.l d0,d1 0007FC70 E909 77 lsl.b #4,d1 0007FC72 61E0 78 bsr Hex1 0007FC74 8041 79 or d1,d0 0007FC76 4E75 80 rts 0007FC78 81 0007FC78 82 0007FC78 6100 0010 83 exit: bsr conin 0007FC7C B03C 000D 84 cmp.b #13,d0 * check line end 0007FC80 66F6 85 bne exit 0007FC82 12BC 0000 86 move.b #FC_EXIT,(a1) 0007FC86 4E70 87 reset 0007FC88 60FE 88 bra * 0007FC8A 89 0007FC8A 90 0007FC8A 91 * console in 0007FC8A 92 * d0.w -> data 0007FC8A 12BC 0002 93 conin: move.b #FC_CONIN,(a1) 0007FC8E 4E70 94 reset 0007FC90 3029 0006 95 move.w (RetVal-PICWRK)(a1),d0 0007FC94 4E75 96 rts 0007FC96 97 0007FC96 98 0007FC96 99 * console out 0007FC96 100 * d1.b <- data 0007FC96 101 * 0007FC96 0041 0300 102 conout: ori.w #FC_CONOUT*256,d1 0007FC9A 3281 103 move.w d1,(a1) 0007FC9C 4E70 104 reset 0007FC9E 4E75 105 rts 0007FCA0 106 0007FCA0 107 end start No errors detected No warnings generated


 上記のソースのアセンブル結果をPIC側のpicle言語のソースに埋め込み、起動した状態でTeraTermにSレコードをコピペすることで68K上のメモリにロードされます。
 ロード試験用のソースはこんな感じです。

ローダー試験用ソース
00000400 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2018/08/30 23:11:19 00000000 1 ************************************** 00000000 2 * CP/M-68K 00000000 3 * S format loader for Pic24CPM68K 00000000 4 * ver 0.01 2018/08/27 by skyriver 00000000 5 ************************************** 00000000 6 00000300 7 org $0300 00000300 8 00000300= 30 31 32 33 34 35 ... 9 dc.b '0123456789ABCDEF' 00000310 10 0001FE00 11 org $01fe00 0001FE00= 41 42 43 44 45 46 ... 12 dc.b 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 0001FE1A 13 0001FE1A 14 end $0400 No errors detected No warnings generated


 アセンブル結果生成されるSレコードフォーマットのファイルは下記のようになります。

アセンブル結果生成されたSレコードファイル
S021000036384B50524F47202020323043524541544544204259204541535936384B6D S11303003031323334353637383941424344454647 S21E01FE004142434445464748494A4B4C4D4E4F505152535455565758595A03 S804000400F7


 試験時の操作ログを貼っておきます。
 Sレコード簡易ローダをロードするためのpicle言語のソースを表示後、'run'コマンドで実行しています。
 この状態で上記のローダー試験用のSレコードをTeraTermでコピペしています。
 68K内で動作しているSレコードローダーはレコードタイプを表示(下記のログの'12'の部分)しながらメモリに展開し、Sレコードの終了行を読込んだ後、PIC側に制御を渡します。

★2019/07/02 追記
 実装メモリサイズが512KBのバージョンに差し換えました。(開発時はこの時点でのメモリサイズは128KB)

Sレコード簡易ローダーのロードと実行とSレコードのロード試験
:l 1:# 3chips MC68008 OneBoard S fomat loader 2018/10/13 2:# Ver 0.10 adapted to 512KB by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgStart,ProgWrk,_WrkVal,_PicDma,SdSec; 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<2;i=i+1) { 20: _WrkVal[i] = MemRd(); 21: } 22: fno = _WrkVal[0]; # function No 23: rval = 0; 24: if (fno=1) { # CONST 25: if (InpChk_()) { 26: rval = $ff; 27: } 28: } 29: else if (fno=2) { # CONIN 30: rval = InpChar_(); 31: } 32: else if (fno=3) { # CONOUT 33: PrnChar_( _WrkVal[1] ); 34: } 35: else if (fno=6) { # PUN 36: PrnChar_( _WrkVal[1] ); 37: } 38: else if (fno=7) { # READER 39: if (InpChk_()) { 40: rval = InpChar_(); 41: } else { 42: rval = $ffff; 43: } 44: } 45: else if (fno=0) { 46: break; 47: } else { 48: for (;i<6;i=i+1) { 49: _WrkVal[i] = MemRd(); 50: } 51: if (fno=4) { # READ 52: ChkSd(); 53: rval = BlkRead( SdSec ); 54: if (rval=0) { 55: PmpSetAdr(_PicDma); 56: for (i=0;i<128;i=i+1) { 57: MemWr(_SpiBuf[i]); 58: } 59: } 60: } 61: else if (fno=5) { # WRITE 62: ChkSd(); 63: PmpSetAdr(_PicDma); 64: i = MemRd(); # dummy 65: for (i=0;i<128;i=i+1) { 66: _SpiBuf[i] = MemRd(); 67: } 68: rval = BlkWrite( SdSec ); 69: } else { 70: PrnStr_("\nFunc err"); 71: PrnHexB_(fno); 72: } 73: } 74: PmpSetAdr(ProgWrk+6); 75: MemWr(GetHi(rval)); 76: MemWr(rval); 77: PmpOff(); 78: BusRelease(); 79: } 80:} 81: 82: 83:proc M( dat ) { 84: MemWr( dat ); 85:} 86: 87: 88:proc main() { 89: init(); 90: initPmp(); 91: initSpi(); 92:# initSd(); 93: 94: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 95: ProgStart = $fc00; # start addr(68K:07fc00) 96: ProgWrk = $fcf0; # work addr(68K:07fcf0) 97: _PicDma = $fe00; # 512byte 98: _WrkVal = Alloc( 5 ); 99: SdSec = _WrkVal + 2; # long SdSectorNo 100: 101: 102: PmpOn(); 103: PmpSetAdr(0); 104: MemWr($00);# stack 105: MemWr($01); 106: MemWr($fc); 107: MemWr($00); 108: MemWr($00); # PC 109: MemWr($07); 110: MemWr($fc); 111: MemWr($00); 112: 113: PmpSetAdr(ProgStart); 114: 115: M($22);M($7c);M($00);M($07); 116: M($fc);M($f0);M($61);M($00); 117: M($00);M($82);M($b0);M($3c); 118: M($00);M($53);M($66);M($f6); 119: M($61);M($00);M($00);M($78); 120: M($32);M($00);M($04);M($00); 121: M($00);M($30);M($67);M($ea); 122: M($b0);M($3c);M($00);M($04); 123: M($6c);M($00);M($00);M($56); 124: M($61);M($00);M($00);M($70); 125: M($42);M($42);M($14);M($00); 126: M($61);M($00);M($00);M($3e); 127: M($42);M($43);M($16);M($00); 128: M($55);M($03);M($42);M($84); 129: M($61);M($00);M($00);M($32); 130: M($e1);M($8c);M($88);M($00); 131: M($53);M($03);M($51);M($ca); 132: M($ff);M($f4);M($20);M($44); 133: M($61);M($00);M($00);M($22); 134: M($10);M($c0);M($51);M($cb); 135: M($ff);M($f8);M($60);M($b2); 136: M($61);M($00);M($00);M($34); 137: M($b0);M($3c);M($00);M($39); 138: M($6e);M($00);M($00);M($08); 139: M($04);M($00);M($00);M($30); 140: M($4e);M($75);M($04);M($00); 141: M($00);M($37);M($4e);M($75); 142: M($61);M($e6);M($22);M($00); 143: M($e9);M($09);M($61);M($e0); 144: M($80);M($41);M($4e);M($75); 145: M($61);M($00);M($00);M($10); 146: M($b0);M($3c);M($00);M($0d); 147: M($66);M($f6);M($12);M($bc); 148: M($00);M($00);M($4e);M($70); 149: M($60);M($fe);M($12);M($bc); 150: M($00);M($02);M($4e);M($70); 151: M($30);M($29);M($00);M($06); 152: M($4e);M($75);M($00);M($41); 153: M($03);M($00);M($32);M($81); 154: M($4e);M($70);M($4e);M($75); 155: 156: PmpOff(); 157: BusRelease(); 158: LATA[-2]=LATA[-2]|$3; # off reset:a0 halt:a1 159: 160: PicSrv(); 161: 162: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 163:} :run 12 :


 今回ロードしたメモリの範囲はPIC側からもアクセス可能な範囲なのでメモリダンプして確かめてみましょう。
 想定通りの値になっています^^

ロードデータのダンプリスト
:l 1:# 3chips MC68008 OneBoard S-Format Loader Test 2018/08/30 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: dump($0300); 19: PrnStr_( "\n-------" ); 20: dump($fe00); 21:} :run 0300 : 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0310 : 5A 4B 08 2C A6 31 21 D8 D0 FB CC 16 80 F2 78 52 0320 : FE FF FB F7 FF FF FF FD FF FB EF FB FF FD EF 37 0330 : 51 98 20 20 24 8C 13 09 C7 CB 94 A4 A0 E1 B6 D2 0340 : FF FF FE FE F7 DF 7F DF BF FF FF DD FF FF FF FE 0350 : EB 60 58 84 51 32 D0 AA F0 DA 2C E4 DB 0F 0F 39 0360 : FF FF FF DF FF EF FE F3 7F FF FB FF FF FF F6 FF 0370 : 15 8C 54 03 F8 B0 2A AF 97 25 E9 78 3E 45 BB 52 ------- FE00 : 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 FE10 : 51 52 53 54 55 56 57 58 59 5A BA 76 30 8C C2 66 FE20 : BF FF 7F FF FF FF 7F FF FF FF F3 F7 FF FF EF FF FE30 : 5D CF 69 D2 67 85 41 76 2C 1C 34 85 50 62 0E 05 FE40 : 7F FF FF FD FF 9F EF 3F 7F CF 7F FF F6 FF FF FF FE50 : 60 3D 4D 20 B2 14 0C F1 6D 15 C0 41 80 0E 92 F1 FE60 : BF FF FF EF ED 77 7F D7 EF FE DF BB EF CE FF FB FE70 : D7 54 D4 0F 1D F0 8E 62 40 60 59 4A 02 04 1A 17 :


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

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

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

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

PICkit3でコネクトエラー [PIC]

 久々にPICkit3で PIC24FJ64GA004 に書き込みを行おうとしたら

The target circuit may require more power than the debug tool can provide. An external power supply might be necessary. Connection Failed.

のエラーが出て接続できず・・・・
電源はPICkit3から供給していますが接続されているのはPIC単体のみに近い状態なので電流不足は考えにくい状況なのですが・・

 このエラーは以前も何度か出ていましたが PICkit3 からの供給電圧を 3.15Vに下げることで問題回避できていました。
 今回は電圧を下げても状況が変わらず、予備のPICkit3に変えたり、 PICを PIC24FJ64GA002 に変更しても変化なし・・orz

 しばらく悩んだけど MPLAB IPE を立ち上げてからPICkit3をパソコンに接続したらPICにコネクトできました ^^
 尚、IPEのバージョンは3.35です。

 なんなんでしょうねぇ~

タグ:IPE PIC24FJ Pickit3
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー