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