SSブログ
English Version

Pic24MC68Kマイコン(その5)S-record ローダーの制作 [68K]

 前回の記事で書いたように PIC と MC68K のインターフェース動作が確認できたので MC68K 側のメモリにプログラムをダウンロードするためのモトローラ S-record フォーマットファイルのダウンローダーを準備します。

 今回は「3チップ構成68Kマイコンの構想(その3)Sレコード簡易ローダーの製作」の記事で書いた、以前 68008 環境で行ったことを 68000 環境に合わせて変更するだけなので既にある道を歩いているようなものです。

 まずは MC68K 側のプログラムですが、PIC とのインターフェース部分等を若干変更しました。アセンブル環境は EASy68K を使っています。

S-record ローダーの MC68K側プログラム(アセンブラ)
000FFC00 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/17 19:05:20 00000000 1 ************************************** 00000000 2 * S-record loader for Pic24MC68K 00000000 3 * ver 0.01 2021/12/17 by skyriver 00000000 4 ************************************** 00000000 5 00000000 6 00000000 =000FFDF0 7 PICWRK EQU $0ffdf0 ; PIC service work area 00000000 =000FFE00 8 PICDMA EQU $0ffe00 ; 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 =000FFDF0 20 FuncNo equ PICWRK ; ds 1 : function No 00000000 =000FFDF1 21 CoData equ PICWRK+1 ; ds 1 : conout data 00000000 =000FFDF2 22 RetVal equ PICWRK+2 ; ds 1 : return value 00000000 =000FFDF3 23 SelDk equ PICWRK+3 ; ds 1 00000000 =000FFDF4 24 Track equ PICWRK+4 ; ds 2 00000000 =000FFDF6 25 DmaAdr equ PICWRK+6 ; ds 2 00000000 =000FFDF8 26 Sector equ PICWRK+8 ; ds 1 00000000 27 00000000 28 000FFC00 29 org $0ffc00 000FFC00 30 000FFC00 227C 000FFDF0 31 start: move.l #PICWRK,a1 000FFC06 6100 0082 32 loop: bsr conin 000FFC0A B03C 0053 33 cmp.b #'S',d0 000FFC0E 66F6 34 bne loop 000FFC10 35 000FFC10 6100 0078 36 bsr conin 000FFC14 3200 37 move d0,d1 000FFC16 0400 0030 38 sub.b #'0',d0 000FFC1A 67EA 39 beq loop * if type 0 000FFC1C B03C 0004 40 cmp.b #4,d0 000FFC20 6C00 0056 41 bge exit 000FFC24 42 000FFC24 6100 0072 43 bsr conout 000FFC28 4242 44 clr d2 000FFC2A 1400 45 move.b d0,d2 * save type to d2 000FFC2C 6100 003E 46 bsr Hex2 * get length 000FFC30 4243 47 clr d3 000FFC32 1600 48 move.b d0,d3 * save counter 000FFC34 5503 49 sub.b #2,d3 * dec for sum 000FFC36 4284 50 clr.l d4 000FFC38 51 000FFC38 6100 0032 52 getadr: bsr Hex2 000FFC3C E18C 53 lsl.l #8,d4 000FFC3E 8800 54 or.b d0,d4 000FFC40 5303 55 sub.b #1,d3 000FFC42 51CA FFF4 56 dbf d2,getadr 000FFC46 57 000FFC46 2044 58 move.l d4,a0 000FFC48 6100 0022 59 getdat: bsr hex2 000FFC4C 10C0 60 move.b d0,(a0)+ 000FFC4E 51CB FFF8 61 dbf d3,getdat 000FFC52 60B2 62 bra loop 000FFC54 63 000FFC54 64 000FFC54 65 * input hex 1chara 000FFC54 66 * d0.b -> data 000FFC54 6100 0034 67 Hex1: bsr conin 000FFC58 B03C 0039 68 cmp.b #'9',d0 000FFC5C 6E00 0008 69 bgt Hex1_1 000FFC60 0400 0030 70 sub.b #'0',d0 000FFC64 4E75 71 rts 000FFC66 0400 0037 72 Hex1_1: sub.b #$37,d0 000FFC6A 4E75 73 rts 000FFC6C 74 000FFC6C 75 000FFC6C 76 * input hex 1byte(2chara) 000FFC6C 77 * d0.b -> data 000FFC6C 61E6 78 Hex2: bsr Hex1 000FFC6E 2200 79 move.l d0,d1 000FFC70 E909 80 lsl.b #4,d1 000FFC72 61E0 81 bsr Hex1 000FFC74 8041 82 or d1,d0 000FFC76 4E75 83 rts 000FFC78 84 000FFC78 85 000FFC78 6100 0010 86 exit: bsr conin 000FFC7C B03C 000D 87 cmp.b #13,d0 * check line end 000FFC80 66F6 88 bne exit 000FFC82 12BC 0000 89 move.b #FC_EXIT,(a1) 000FFC86 4E70 90 reset 000FFC88 60FE 91 bra * 000FFC8A 92 000FFC8A 93 000FFC8A 94 * console in 000FFC8A 95 * d0.w -> data 000FFC8A 12BC 0002 96 conin: move.b #FC_CONIN,(a1) 000FFC8E 4240 97 clr d0 000FFC90 4E70 98 reset 000FFC92 1029 0002 99 move.b (RetVal-PICWRK)(a1),d0 000FFC96 4E75 100 rts 000FFC98 101 000FFC98 102 000FFC98 103 * console out 000FFC98 104 * d1.b <- data 000FFC98 105 * 000FFC98 0041 0300 106 conout: ori.w #FC_CONOUT*256,d1 000FFC9C 3281 107 move.w d1,(a1) 000FFC9E 4E70 108 reset 000FFCA0 4E75 109 rts 000FFCA2 110 000FFCA2 111 end start No errors detected No warnings generated


 試験用のダウンロード対象のデータは次のような簡略なものにしました。実行コードではないので冒頭の"start"ラベルは不要なのですが、END ステートメントの後にラベルを書かないと warning が表示されるのでその回避用です。

S-record ローダーの試験用データ(アセンブラ)
00000200 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/17 19:05:10 00000000 1 *************************************** 00000000 2 * sample data to test S-record loader 00000000 3 * Ver 0.01 2021/12/17 by skyriver 00000000 4 *************************************** 00000000 5 00000000 =00000200 6 ADRS EQU $000200 00000000 7 00000000 8 00000200 9 org ADRS 00000200 10 00000200= 00 01 02 03 04 05 ... 11 start: dc.b 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 00000210= 30 31 32 33 34 35 ... 12 dc.b '0123456789ABCDEF' 00000220= 0123 1234 2345 3... 13 dc.w $0123,$1234,$2345,$3456,$4567,$5678,$6789,$789A 00000230= 0000 0000 0000 0... 14 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 00000250 15 00000250 16 end start No errors detected No warnings generated


 アセンブルした結果、出力された S-record ファイルの内容が下記になります。

アセンブルして出力された S-record データ
S021000036384B50524F47202020323043524541544544204259204541535936384B6D
S1230200000102030405060708090A0B0C0D0E0F30313233343536373839414243444546C0
S12302200123123423453456456756786789789A00000000000000000000000000000000E2
S113024000000000000000000000000000000000AA
S804000200F9


 PIC 側のプログラムと実行結果が下記になります。PIC 側のプログラムには上記の MC68K のプログラムのアセンブル結果内容を変換して貼り付けています。プログラム起動後Teratermで S-record ファイルの内容をコピペ操作をしています。S-record ローダーは1レコード毎にレコードタイプを出力するようにしています(末尾の"111"部分)。

S-record ローダーのプログラムリストと実行結果(picle言語)
:l 1:# S-record loader for Pic24MC68K 2:# Ver 0.01 2021/12/17 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgStart,ProgWrk,WrkVal,_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: while ((LATA[-1]&3) = 3) {} # wait reset 17: if ( (LATA[-1]&2) = 0 ) { 18: PrnStr_( "\nHALT!" ); 19: break; 20: } 21: PmpOn(); 22: PmpSetAdr(ProgWrk); 23: fno = MemRd(); # dummy 24: WrkVal[0] = MemRd(); 25: WrkVal[1] = MemRd(); 26: fno = _WrkVal[1]; # Func No 27: rval = 0; 28: 29: if (fno=1) { # CONST 30: if (InpChk_()) { 31: rval = $ff; 32: } 33: } 34: else if (fno=2) { # CONIN 35: rval = InpChar_(); 36: } 37: else if (fno=3) { # CONOUT 38: PrnChar_( _WrkVal[0] ); 39: } 40: else if (fno=0) { 41: break; 42: } else { 43: PrnStr_("\nFunc err:"); 44: PrnHexB_( fno ); 45: break; 46: } 47: _WrkVal[3] = rval; 48: PmpSetAdr(ProgWrk+1); 49: MemWr(WrkVal[1]); 50: 51: PmpOff(); 52: BusRelease(); 53: } 54:} 55: 56: 57:proc m( dat ) { 58: MemWr( dat ); 59:} 60: 61: 62:proc main() { 63: init(); 64: initPmp(); 65: initSpi(); 66:# initSd(); 67: 68: ProgStart = $0600; # start addr(68K:0ffc00) 69: ProgWrk = $06f8; # work addr(68K:0ffdf0) 70: _PicDma = $0700; # Dma addr(68K:0ffe00) 512 71: WrkVal = Alloc( 2 ); 72: _WrkVal = WrkVal; 73: WrkTrk = Alloc( 2 ); 74: 75: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 76: 77: PmpOn(); 78: PmpSetAdr(0); 79: MemWr($000f);# stack 80: MemWr($fc00); 81: MemWr($000f); # PC 82: MemWr($fc00); 83: 84: PmpSetAdr(ProgStart); 85: 86: m($227c);m($000f);m($fdf0);m($6100); 87: m($0082);m($b03c);m($0053);m($66f6); 88: m($6100);m($0078);m($3200);m($0400); 89: m($0030);m($67ea);m($b03c);m($0004); 90: m($6c00);m($0056);m($6100);m($0072); 91: m($4242);m($1400);m($6100);m($003e); 92: m($4243);m($1600);m($5503);m($4284); 93: m($6100);m($0032);m($e18c);m($8800); 94: m($5303);m($51ca);m($fff4);m($2044); 95: m($6100);m($0022);m($10c0);m($51cb); 96: m($fff8);m($60b2);m($6100);m($0034); 97: m($b03c);m($0039);m($6e00);m($0008); 98: m($0400);m($0030);m($4e75);m($0400); 99: m($0037);m($4e75);m($61e6);m($2200); 100: m($e909);m($61e0);m($8041);m($4e75); 101: m($6100);m($0010);m($b03c);m($000d); 102: m($66f6);m($12bc);m($0000);m($4e70); 103: m($60fe);m($12bc);m($0002);m($4240); 104: m($4e70);m($1029);m($0002);m($4e75); 105: m($0041);m($0300);m($3281);m($4e70); 106: m($4e75); 107: 108: PrnStr_( "\n S-record loader start\n" ); 109: 110: PmpOff(); 111: BusRelease(); 112: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 113: 114: PicSrv(); 115: 116: PmpOn(); 117: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 118:} :run S-record loader start 111 :


 問題無くダウンロードされているか簡易的に作ったメモリダンププログラムでメモリの内容を確かめてみます。PIC 側のメモリアドレスは MC68K の 1/2 なので、0x0100 からダンプすれば確かめられるはずです。
 末尾のダンプリストを見ると問題無くダウンロードされているみたいですね。

簡易メモリダンププログラムでダウンロード結果の確認(picle言語)
:l 1:# memori dump for Pic24MC68K 2:# Ver 0.01 2021/12/17 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:func GetHex() { 9: var adrs,c,cnt; 10: 11: adrs = 0; 12: cnt = 0; 13: do { 14: c = InpChar_(); 15: if ( (c >= 'a') & (c <= 'z') ) { 16: c = c - $20; 17: } 18: if ( ((c >= '0')&(c<='9')) | ((c>='A')&(c<='F')) ) { 19: PrnChar_( c ); 20: cnt = cnt + 1; 21: c = c - '0'; 22: if ( c > 9 ) { 23: c = c + ('0' - 'A' + 10); 24: } 25: adrs = adrs * 16 + c; 26: } 27: else if ( (c = 'H'-$40) & (cnt > 0) ) { 28: cnt = cnt - 1; 29: adrs = adrs / 16; 30: PrnChar_( c ); 31: PrnChar_( ' ' ); 32: PrnChar_( c ); 33: } 34: else if ( c = $1b ) { 35: adrs = $ffff; 36: break; 37: } 38: } while ( c <> $0d ); 39: return = adrs; 40:} 41: 42: 43:proc main() { 44: var adrs; 45: init(); 46: initPmp(); 47: initSpi(); 48:# initSd(); 49: 50: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 51: PmpOn(); 52: 53: while ( 1 ) { 54: PrnStr_( "\nadrs : " ); 55: adrs = GetHex(); 56: if ( adrs = $ffff ) { 57: break; 58: } 59: dump( adrs ); 60: } 61:} :run adrs : 100 0100 : 0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 0108 : 3031 3233 3435 3637 3839 4142 4344 4546 0110 : 0123 1234 2345 3456 4567 5678 6789 789A 0118 : 0000 0000 0000 0000 0000 0000 0000 0000 0120 : 0000 0000 0000 0000 0000 0000 0000 0000 0128 : 9E16 2155 E84D 0E91 A69F BB61 9880 0125 0130 : 28E1 6A36 ABB4 BA24 6891 3C94 AAD5 F89D 0138 : 00E6 FA6A 8C94 7B25 BE24 7217 2E42 B256 adrs :


 次はいよいよ CP/M-68K の移植ですね。でもその前にブレッドボードに SDコネクタを付けないと・・w


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

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

nice! 0

コメント 0

コメントを書く

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