// SH2A monitor // Copyright Bitcraft Co.Ltd 2011.5.4 // All rights reserved. // //#include "iodefine.h" // gcc に移行準備のため、iodefine.h は使わない #include // モニタ関数用32ビットサイズの引数 union param32{ long l32; int i32; unsigned long ul32; short s16[2]; unsigned short us16[2]; char c8[4]; unsigned char uc8[4]; char *cpoint; unsigned char *ucpoint; short *spoint; unsigned short *uspoint; long *lpoint; unsigned long *ulpoint; union param32 *upoint; long (*ppoint)(); // アドレスとして関数呼び出し float f32; // 単精度浮動小数点 サインビット、指数8ビット、化数部24ビット float *f32point; }; #define COLUMN 80 // コマンド入力バッファーサイズ char htol(long *,char **); void crlf(void); int chex(char );// ヘキサ文字コードから、4ビットのバイナリに変換。ヘキサ以外なら−1。 void ckasci(int );// void spacen(int ); //==================================================== void putscon(char *); int combuf2f; char combuf[COLUMN]; // コマンド入力バッファー char combuf2[COLUMN]; // 前回のコマンド記憶 int combuf2f; // 前回のコマンドを有効にするフラグとポインタ union param32 param[8]; // 引数格納 int dumpm(union param32 *,int mode); int cksjis(unsigned int s); // シフトJISの漢字コードかをチェック void dumpmt(void); void movem(union param32 *,long ); // メモリのコピー int argck(char **,union param32 *,int ); // コマンド文字列の引数チェック char htol(long *,char **); // ヘキサ文字列からバイナリに変換 void paramer(void); int verify(union param32 *); // メモリを比較 void srload(union param32 *,int); // モトローラSレコードをホストから受信してメモリにロード int setmemo(union param32 *,int,int ); // メモリの変更 void findp(union param32 *); // データ列をメモリから探す。 long cpynstr(char *d,char *s,long n); int cstrlen(char *cp,char f); long gosub(union param32 addr); // アセンブラ呼び出しの場合 int dhrymain(void);// dhrystone int mainmoni (int);// monitor エントリー void putcon(int c);// コンソールに1文字出力(RS232C) int getcon(void);// コンソールから1文字受信するまで待つ(RS232C) int statcon(void);// コンソールから1文字受信したとき、!=0 // SH7262レジスタアドレス。gcc 移行の用意のため、iodefine.h は使わない //#define STBCR4 ((volatile unsigned char *)(0xFFFE040C)) // スタンバイコントロールレジスタ4 //#define PFCR1 ((volatile unsigned short *)(0xFFFE38AC)) // ポートF コントロールレジスタ1 //#define PFCR0 ((volatile unsigned short *)(0xFFFE38AE)) // ポートF コントロールレジスタ0 //#define PFIOR0 ((volatile unsigned short *)(0xFFFE38B2)) // ポートF・IO レジスタ0 //#define SCSMR3 ((volatile unsigned short *)(0xFFFE9800)) // シリアルモードレジスタ //#define SCBRR3 ((volatile unsigned char *)(0xFFFE9804)) // ビットレートレジスタ_3 //#define SCSCR3 ((volatile unsigned short *)(0xFFFE9808)) // シリアルコントロールレジスタ_3 //#define SCFCR3 ((volatile unsigned short *)(0xFFFE9818)) // FIFO コントロールレジスタ_3 //#define SCEMR3 ((volatile unsigned short *)(0xFFFE9828)) // シリアル拡張モードレジスタ_3 #define SCFTDR3 ((volatile unsigned char *)0xFFFE980C) // 送信FIFO #define SCFRDR3 ((volatile unsigned char *)0xFFFE9814) // 受信FIFO #define SCFSR3 ((volatile unsigned short *)(0xFFFE9810)) // シリアルステータスレジスタ_3 #define CMCNT0 ((volatile unsigned short *)(0xFFFEC004)) // カウンタ。1カウントで、21.33 μ秒 // モニタ用RS232CのBIOS // 1文字送信 void putcon(int c) { while(1) { if(*SCFSR3 & 0x20) break; } *SCFTDR3 = (char)c; *SCFSR3 &= 0xFFDF; } // 1文字受信するまで待つ int getcon(void) { unsigned int read; while(1) { if(*SCFSR3 & 0x2) break; } read = *SCFRDR3; *SCFSR3 &= 0xFFFD; return read; } // 1文字受信したかのチェック //モニタを実行中、処理を中断したい場合、処理のループ内で呼び出す。 // 1 をリターンすると、getcon() で受信文字を確かめ、中断か、否かを判定。 int statcon(void) { int stat; stat = *SCFSR3; *SCFSR3 = stat & 0x0063; if(stat & 2) return 1; return 0; } // 以下、最後までが、モニタの本体。 // デバッグ用整数書式出力、cprintf,csprintf は、最後に置く。 void cprintf();// printf の簡易版。整数、文字列のみ int csprintf();// sprintf の簡易版。整数、文字列のみ int mainmoni (int mode) // mode は割り込みなどの場合に使う予定 { int ret; char *comp,c;//*cp; // int coma; int i,j,l; // int *lsp,*ldp; // int pret; int ts,te; combuf2f=0; combuf2[0] = 0; putscon("\r\nCustom Monitor 2011.6.29\r\n"); while(1) { LOOP: putscon("SH2A-Bug>"); ret=getscon(combuf,COLUMN-1,0); if(ret == 0) { if(combuf2[0]) // 前回のコマンド記憶の先頭 { combuf2f = 1; if(getscon(combuf,COLUMN - 1,0) == -1) { crlf(); goto LOOP; } cpynstr(combuf2,combuf,COLUMN); // コマンド記憶 } } else { if(ret == -1) { crlf(); goto LOOP; } cpynstr(combuf2,combuf,COLUMN); // memory command } comp=combuf; c= *comp; // コマンド解析。最初の1文字で判定し、続く引数(ヘキサ限定)をチェック。 switch(c) { // メモリダンプ。モトローラSレコードのダンプも選択できる。( dsx,y ) case 'd': j=0; comp++; param[2].l32 = 0; if((*comp=='S')||(*comp=='s')) // モトローラSレコードでダンプするオプション判定。 { j |= 1; comp++; } if(*comp ==0)// 引数なしは、前回ダンプしたアドレスの次をダンプする。 { l = param[1].l32 - param[0].l32 + 1; l &= 0xfffffffe; param[0].l32 += l; param[1].l32 += l; } else { if((i=argck(&comp,param,1))== -1) { paramer(); break; } if(i==1) { param[1].l32=param[0].l32+0x7f; } } dumpm(param,j); break; // メモリのコピー case 'm': j=0; comp++; if((*comp=='W')||(*comp=='w')) { j=1; comp++; } else if((*comp=='L')||(*comp=='l')) { j=2; comp++; } param[3].l32 = 0x11;// ソース、デスティネーションアドレス更新 if((i=argck(&comp,param,3)) < 3) { paramer(); break; } ts = *CMCNT0; movem(param,(long)j); te = *CMCNT0; break; // メモリの比較。ここでは、バイト単位のみ // case 'V': case 'v': comp++; if((i=argck(&comp,param,3)) != 3) { paramer(); break; } ts = *CMCNT0; verify(param); te = *CMCNT0; break; // いわゆる、フィルメモリ。s コマンドで代用可能なので、割愛。 /* case 'F':// フィルメモリ comp++; if((i=argck(&comp,param,5)) != 5) { paramer(); break; } ts = *CMCNT0; fillp(param); te = *CMCNT0; break; */ // 4バイトまでのデータ列をメモリにあるかを検索。 case 'f': comp++; if((i=argck(&comp,param,4)) != 4) { paramer(); break; } ts = *CMCNT0; findp(param); te = *CMCNT0; break; // 任意番地をサブルーチン形式で呼び出す。 case 'g': comp++; if((i=argck(&comp,param,1))== -1) { paramer(); break; } ts = *CMCNT0; ret = param[0].ppoint(); // ret = gosub((union param32)param[0].l32);// アセンブラ呼び出しの場合 te = *CMCNT0; cprintf("\r\nret= %08lX",ret); break; // ホストから送られてくるモトローラSレコード形式のヘキサデータを、アドレス指定でメモリにロード // 元のアドレス情報に、バイアス値を加算できる。 // case 'L': case 'l': j=0; comp++; if((i=argck(&comp,param,1))== -1) { paramer(); break; } crlf(); srload(param,1); break; // メモリ(I/O)を、バイト、ワード、ロング単位を指定して、インタラクティブに表示、変更。 // 引数の指示で、フィルメモリなどもできる。 case 's': j=0; comp++; if((*comp=='N')||(*comp == 'n'))// このオプションは、元のメモリ(I/O)を読まずに変更。 { j=4; comp++; } if((*comp=='W')||(*comp=='w'))// 16ビット単位 { j |= 1; comp++; } else if((*comp=='L')||(*comp=='l'))// 32ビット単位 { j |= 2; comp++; } // デフォルトの引数オプションを初期設定 param[2].l32 = 1; param[3].l32 = 0; param[4].l32 = 0; param[5].l32 = 0; param[6].l32 = 0; // param[7].l32 = 0; if((i=argck(&comp,param,1))== -1) { paramer(); break; } ts = *CMCNT0;// インタラクティブの場合は、あまり意味がない。 setmemo(param,j,i); te = *CMCNT0; break; // case 'D':// dhry stone テスト // l = dhrymain(); // cprintf("\r\nTimer HEX = %lX,",l); // l *= 2133; // l /= 100; // cprintf("%d μs",l); // break; /* case 'S':// エラトステネスのふるいで、素数を求めたときの実行時間 ts = *CMCNT0; ret = sievemain(); te = *CMCNT0; cprintf("sieve=%ld ",ret); l=te-ts; cprintf("\r\nTimer HEX = %lX,",l); l *= 2133; l /= 100; cprintf(" time = %ld μs",l); break; */ case 'T': l=te-ts; cprintf("\r\nTimer HEX = %lX, ",l); l *= 2133; l /= 100; cprintf("%d μs",l); crlf(); break; default: // 未定義コマンド cprintf("default"); break; } crlf(); } return 0; } /*long gosub(union param32 addr) { return addr.ppoint(); } */ /* #define SIZE 2559 #define SIZEPL 2560 //char buf[SIZEPL]; sievemain() { long prime,k,i,count,iter; // long l,ts,te; // long time(); int n; char *buf; // l=0; // ppcDisable(); // printf("type return to do 10000 iterations:"); // getchar(); // ts=time(NULL); // scanf("%d",&n); buf = (char *)0x3200; for(iter=0;iter<10000;iter++) { count=0; // l=0; // test for(i=0;i<=SIZE;i++) { buf[i]=1; // l++; // test } for(i=0;i<=SIZE;i++) { if(buf[i]) { k=i+i+3; prime=k; k += i; // l++; //test for(;k= COLUMN-1)combuf2f=0; return c2; } else { combuf2f=0; return getcon(); } } else return getcon(); } int getscon(char *cp,int cn,int f) { int n,n2; char c; int s; // int i; // int insf; n=0; n2=0; // insf=1; *cp=0; while(n <= cn) { c=getcon_combuf2(); // c=getcon(); if(c =='\3') { return(-1); } if(c==0xd) // CR { cp[n2]='\0'; return(n2); } /* if(c == 'O'-0x40) // ctrl O { insf ^= 1; if(insf & 1) { for(i=0;i<=n;i++) putcon(0x8); putcon('>'); for(i=0;i n) { for(i=n;i 0)) { n--; putcon(0x8); // back space code } */ /* if((c == 'D'-0x40) && (n2 > n)) { putcon(cp[n++]); // edit point char } */ if(((c=='\10') || (c==0x7f)) && (n)) { if(n == n2) { cp[n--]='\0'; n2--; putcon(0x8); // back space code putcon(0x20); // space code putcon(0x8); // back space code } /* else if((n2 > n) && (n)) { n--; putcon(0x8); /// back space code for(i=n;i= 0x20) && ((c & 0x7f) < 0x7f)) { if(n == n2) { cp[n++]=c; s=c; putcon(s); if(n > n2)n2=n; } /* else if(n2 > n) { if(insf) { for(i=n2-1;i>=n;i--) { cp[i+1]= cp[i]; } cp[n] = c; for(i=n;i=n) { return(count); } else { return(-1); } } else { if(c != ',') return(-1); } } } void paramer(void) { putscon("\r\nPARAMETER ERROR !\r\n"); } // cprintf を使わないヘキサ出力 /* void hex8b(long l) { putcon(hex(l>>4)); putcon(hex(l)); } void hex16b(long l) { putcon(hex(l>>12)); putcon(hex(l>>8)); putcon(hex(l>>4)); putcon(hex(l)); } void hex32b(long l) { hex16b(l>>16); hex16b(l); } */ char htol(long *lp,char **cp) { char c; char *p; long l; short s; p= *cp; l=0l; while(1) { c= *p++; // hex32b(c); s = chex(c); // hex32b(s); if(s== -1) { *lp = l; *cp = p; return(c); } l <<= 4; l |= s; } } // メモリコピー // ソースとデスティネーションのアドレス更新オプションがある。 // param[3].l32 は、指定無ければ0x11で、両方更新する。 // 0x10 ソースアドレスを更新し、デスティネーションアドレスは固定。 // 0x1 デスティネーションアドレスを更新し、ソースアドレスは固定。 // 0x0 どちらのアドレスも固定。 // この機能は、周辺回路で、特定のアドレスのレジスタにアクセスすると、 // 内部のメモリバッファーに、順番に読み(書き)だすような場合に有効。 void movem(union param32 *param,long ll) { register long l; volatile char *s,*d; volatile short *sp; volatile long *lp,*ldp; volatile short *dp; int upf; l=param[2].l32; upf = param[3].l32; if(ll==0) { s=param[0].cpoint; d=param[1].cpoint; switch(upf) { case 0x1: while(l--) *d++ = *s; break; case 0x10: while(l--) *d = *s++; break; case 0: while(l--) *d = *s; break; default: while(l--) *d++ = *s++; break; } } else if(ll==1) { sp=param[0].spoint; dp=param[1].spoint; switch(upf) { case 0x1: while(l--) *dp++ = *sp; break; case 0x10: while(l--) *dp = *sp++; break; case 0: while(l--) *dp = *sp; break; default: while(l--) *dp++ = *sp++; break; } } else if(ll==2) { lp=param[0].lpoint; ldp=param[1].lpoint; switch(upf) { case 0x1: while(l--) *ldp++ = *lp; break; case 0x10: while(l--) *ldp = *lp++; break; case 0: while(l--) *ldp = *lp; break; default: while(l--) *ldp++ = *lp++; break; } } } void findp(union param32 *param) { register long bytec; register long l; register char *s,*d; /* register char c1,c2;*/ register short count; short shot; long ld; short lfn; s=param[0].cpoint; d=param[1].cpoint; bytec=param[2].l32; l=param[3].l32; if(bytec==0)return; if(bytec==1)l &= 0xffl; if(bytec==2)l &= 0xffffl; if(bytec==3)l &= 0xffffffl; lfn=0; crlf(); while(s != d) { ld=0; for(count=0;count=8) { lfn=0; crlf(); } if(statcon()) { if(getcon()==3)return; if(getcon()==3)return; } } s++; } } void dumpmt(void) { putscon("\r\nADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ascii\r\n"); } int dumpm(union param32 *param,int mode) { unsigned char *cp; // short *sp; int i,sum,ls; unsigned int s,sjf,l; union param32 u; unsigned char sbuf[16]; char c2; unsigned long len; // short sbuf[8]; if(param[0].ul32 > param[1].ul32) return 0; len = param[1].ul32 - param[0].ul32 + 1; cp=param[0].ucpoint; // sp=param[0].spoint; sjf=0; ls=0; if(mode==1) // dsxxxx { crlf(); u.ucpoint=param[0].ucpoint; while(1) { l = u.ul32; // if(hiki==3) l += param[2].l32; if(u.ul32 & 0xf) { if(param[1].ul32 >= (u.ul32 | 0xf)) { ls = (0x10 - (u.ul32 & 0xf)); // putscon("S3"); // hex8b(ls + 5); cprintf("S3%02X",ls + 5); sum = (0xff - ls - 5); } else { ls = param[1].ul32 - u.ul32 + 1; // putscon("S3"); // hex8b(ls + 5); cprintf("S3%02X",ls + 5); sum = (0xff - ls - 5); } } else if(param[1].ul32 >= (u.ul32 + 16)) { sum=0xEA; /* FF-15 */ ls = 16; putscon("S315"); } else { ls = param[1].ul32 - u.ul32 + 1; // putscon("S3"); // hex8b(ls + 5); cprintf("S3%02X",ls + 5); sum = (0xff - ls - 5); } cprintf("%08lX",l); // hex32b(l); sum -= (l >> 24) & 0xff; sum -= (l >> 16) & 0xff; sum -= (l >> 8) & 0xff; sum -= l & 0xff; for(i=0;i param[1].ul32) break; if(u.ul32 < param[0].ul32) break; if(statcon()) if(getcon()==3)break; } putscon("S70500000000FA\r\n"); } else { param[0].l32 &= 0xfffffff0l; param[1].l32 &= 0xffffffffl; dumpmt(); while(1) { // hex32b((long)cp); spacen(1); cprintf("%08lX ",(long)cp); for(i=0;i<16;i++) { s= *cp++; sbuf[i++]=s; // hex8b(s); cprintf("%02X",s); s= *cp++; sbuf[i]=s; // hex8b(s); cprintf("%02X",s); spacen(1); if(statcon()) { c2=getcon(); if((c2==3) || (c2==0xd))return(-1); c2=getcon(); if((c2==3) || (c2==0xd))return(-1); } } len -= 0x10; putcon('['); /* '[' */ s = ls; for(i=0;i<16;) { if(sjf) { s = sbuf[i++]; if(i==16) { sjf=0; break; } s <<= 8; sum = sbuf[i++]; sum &= 0xff; s |= sum; if(cksjis(s)) { putcon(s>>8); putcon((char)s); // i++; } else { ckasci(s>>8); sjf=0; // i++; } } else { s <<= 8; sum = sbuf[i++]; sum &= 0xff; s |= sum; if(cksjis(s)) { putcon(s>>8); putcon((char)s); sjf=1; } else { if(i==1) { putcon(' '); } else ckasci(s>>8); } } } if(sjf==0) ckasci(s); ls=s; putcon(']'); u.ucpoint=cp; if((u.ul32 > param[1].ul32) || (len <=0)) { return 0; } u.ucpoint=cp; if((u.l32 & 0xf)==0) { crlf(); if((u.l32 & 0xff)==0) dumpmt(); } } } } int cksjis(unsigned int s) { int i; i = s>>8; i &= 0xff; if(((i>= 0x81) && (i<= 0x9f)) || ((i>= 0xE0) && (i<= 0xEF))) { s &= 0xff; if((s >= 0x40) && (s <= 0x7e)) return 1; if((s >= 0x80) && (s <= 0xfc)) return 1; } return 0; } // 多機能セットメモリコマンド s // // 引数の数により、3種類の機能を選べる。 // 引数1 s1c009000 (enter) など。 // 0x1C009000 番地から、1個単位に変更データを入力して、アドレスを進める。 // 引数2 s1c009000,6f (enter) など。 // 0x1c009000 番地を、バイトで、0x6Fに書き換える。 // 引数3以上 // 0x1c009000,i,n,u,b,a,d (enter) n 以降は、入力がなければ、それぞれ、1,0,0,0,0,0 に初期化されている。 // i: 最初に書くデータの値。データ初期値 // n: 書き換える総データ個数 // u: 1個書いた後にデータを i=i+u とする。 // b: 以降の a,d の設定に有効で、0 の場合は、無効になる。 // 0以外は、指定個数アドレスをUPしながら書いた後、データ初期値を、i=i+d とする。 // このとき、カレントアドレスを、a だけ加算する。 // 引数3以上、例1  // SH2A-Bug>s1c009000,1,10,1,2  これは、s1c009000,1,10,1,2,0,0 と同じ。 // SH2A-Bug>d1c009000 // ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ascii // 1C009000 0102 0102 0102 0102 0102 0102 0102 0102 [ ................] // 1C009010 0000 0000 0000 0000 0000 0000 0000 0000 [ ................] // // 引数3以上、例2 // SH2A-Bug>s1c009000,61,10,2,4,3,5 // SH2A-Bug>d1c009000 // ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ascii // 1C009000 6163 6567 0000 0066 686A 6C00 0000 6B6D [ aceg...fhjl...km] // 1C009010 6F71 0000 0070 7274 7600 0000 0000 0000 [ oq...prtv.......] // 1C009020 0000 0000 0000 0000 0000 0000 0000 0000 [ ................] // // 引数3以上、例3 // SH2A-Bug>sw1c009000,3030,4,0101,1,7,0202 // SH2A-Bug>d1c009000 // ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ascii // 1C009000 3030 0000 0000 0000 0000 0000 0000 0000 [ 00..............] // 1C009010 3232 0000 0000 0000 0000 0000 0000 0000 [ 22..............] // 1C009020 3434 0000 0000 0000 0000 0000 0000 0000 [ 44..............] // 1C009030 3636 0000 0000 0000 0000 0000 0000 0000 [ 66..............] // 1C009040 0000 0000 0000 0000 0000 0000 0000 0000 [ ................] // // いわゆる、フィルメモリコマンド。0x1c009000 番地からワード値0x1234を0x10個書く。 // SH2A-Bug>sw1c009000,1234,10 // SH2A-Bug>d1c009000 // ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ascii // 1C009000 1234 1234 1234 1234 1234 1234 1234 1234 [ .4.4.4.4.4.4.4.4] // 1C009010 1234 1234 1234 1234 1234 1234 1234 1234 [ .4.4.4.4.4.4.4.4] // 1C009020 0000 0000 0000 0000 0000 0000 0000 0000 [ ................] int setmemo(union param32 *param,int wf,int argc) { char *cp; short *sp; long *lp; // short s,j; /* union param32 u;*/ char buf[16]; long l,i,updatea,updated; char *c; int wof; wof=0; if(wf & 4) { wof=1; wf &= 3; } if(wf==1) { // param[0].l32 &= 0xfffffffel; // ワードアライメント sp=param[0].spoint; } else if(wf==2) { // param[0].l32 &= 0xfffffffcl;// ロングワードアライメント lp=param[0].lpoint; } else { cp=param[0].cpoint; } if(argc >= 2) { // param[2] count param[3] update param[4] address segment param[5] adjust address update param[6] data update // default param[2].l32 = 1; // param[3].l32 = 0; // param[4].l32 = 0x0; // param[5].l32 = 0; // param[6].l32 = 0; updatea = param[4].l32; updated = param[1].l32; while(param[2].l32--) { switch(wf) { case 0: *cp++ = (char)updated; break; case 1: *sp++ = (short)updated; break; case 2: *lp++ = (long)updated; break; } updated = updated + param[3].l32; updatea--; if(updatea == 0) { updatea = param[4].l32; cp = &cp[param[5].l32]; sp = &sp[param[5].l32]; lp = &lp[param[5].l32]; param[1].l32 += param[6].l32; updated = param[1].l32; } } } if(argc == 1) while(1) { crlf(); if(wf==1) { cprintf("%08lX",(long)sp); // hex32b((long)sp); } else if(wf==2) { cprintf("%08lX",(long)lp); // hex32b((long)lp); } else { cprintf("%08lX",(long)cp); // hex32b((long)cp); } putcon('='); if(wof==0) { if(wf==1) { cprintf("%04X",*sp); // hex16b(*sp); } else if(wf==2) { cprintf("%08lX",*lp); } else { cprintf("%02X",(short)*cp & 0xff); } } putcon(' '); i=getscon(buf,15,1); if(i == -1)return(0); if(i>15) { if((i=='R')||(i=='r')) { if(wf==1) { sp--; } else if(wf==2) { lp--; } else { cp--; } } else if(((i=='X')||(i=='x'))&&(wof==1)) { if(wf==1) { cprintf("%04X",*sp); } else if(wf==2) { cprintf("%08lX",*lp); } else { cprintf("%02X",(short)*cp & 0xff); } putcon(' '); } else /* 'N' */ { if(wf==1) { sp++; } if(wf==2) { lp++; } else { cp++; } } } else { c=buf; if(*c == '.')break; htol(&l,&c); i=l; if(wf==1) { *sp++ = i; } else if(wf==2) { *lp++ = i; } else { *cp++ = i; } } } return 0; } int verify(union param32 *param) { register long l; register char *s,*d; register char c1,c2; short shot; s=param[0].cpoint; d=param[1].cpoint; l=param[2].l32; while(l--) { c1= *s; c2= *d; if(c1 != c2) { crlf(); cprintf("%08lX=",(long)s); // putcon('='); shot=c1; cprintf("%02X ",shot & 0xff); // spacen(1); cprintf("%08lX=",(long)d); // putcon('='); shot=c2; cprintf("%02X",shot & 0xff); if(statcon()) { if(getcon()==3)return(0); if(getcon()==3)return(0); } } s++; d++; } return(0); } int cmpstr(char *d,char *s) { register long l; register char c1,c2; l=250l; while(l--) { c1= *s++; c2= *d++; if(c1 > c2) { return(1); } if(c1 < c2) { return(-1); } if((c1 == 0) && (c2 == 0)) { return(0); } if((c1 == 0) || (c2 == 0)) break; } return(1); } void srload(union param32 *param,int m) { /* extern short ring0v; extern short ring0r; */ char *cp,*cpb; // char *rp; register long l; register int i,j,k,sm; int ii,flag; long len; // char (*func)(); len=0; flag=0; // if(m==1) // func = (char (*)())getcon; // len=0; flag=0; SRLDL: if((i=getcon()) ==3) goto SRLDE; if(i != 'S')goto SRLDL; if((i=getcon())==3) goto SRLDE; if(i == '9') goto SRLDE; if(i == '8') goto SRLDE; if(i == '7') goto SRLDE; if(i == '0') goto SRLDL; if(i == '5') goto SRLDL; if((i >= '1') && (i <= '3')) { j=(i & 3)+1; /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; k=chex(i); /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; i=chex(i); k= k*16 + i; if(k==0) { i='9'; goto SRLDE; } sm = 0xFF; sm -= k; k--; l=0; while(j--) { /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; ii=chex(i); /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; ii = ii*16 +chex(i); sm -= ii; l = (l << 8) + ii; k--; } cp = param[0].cpoint; cp = &cp[l]; if(flag==0) { flag=1; cpb=cp; /* putscon("start loading address = ");*/ /* hex32b((long)cp);*/ /* crlf(); */ } while(k--) { /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; ii=chex(i); /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; ii = ii*16 + chex(i); sm -= ii; *cp++ = ii; len++; } /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; ii=chex(i); /* dly(10);*/ if((i=getcon()) ==3) goto SRLDE; ii = ii*16+ chex(i); if((sm & 0xFF) != (ii & 0xff)) { putscon("check sum error !! "); cprintf("%04X %04X",(short)sm,(short)ii);//cprintf(" %04X",(short)ii); // hex16b((short)ii); /* printf("sm=%x ii=%x",sm,ii);*/ i = -2; goto SRLDE; } goto SRLDL; } else { putscon("S1~S3 abarble\r\n"); return; } SRLDE: /* s0icls();*/ if(i == -1) { // putscon("BREAK BY CONSOLE !!\r\n"); return; } if(i == -2) { putscon("SUM CHECK ERROR\r\n"); return; } if((i == '9')||(i == '8')||(i == '7')) { for(j=26-(i & 0xf)*2;j>0;j--) getcon(); putscon("start loading address = "); cprintf("%08lX",(long)cpb); // crlf(); putscon("\r\nEND. bytes loaded = "); cprintf("%08lX\r\n",len); // crlf(); return; } putscon("????? S load stop\r\n"); return; } void spacen(int n) { while(n--) { putcon(0x20); } } long cpynstr(char *d,char *s,long n) { register char c; register long l; l=0; while(n--) { c= *s++; if(c == '\0')break; *d++ = c; l++; } *d++ = '\0'; return(l); } void crlf() { putcon('\r'); putcon('\n'); } int chex(char c) { // hex32b(0); if((c >= 'a') && (c <= 'z'))c -= ' '; if((c >= '0') && (c <= '9'))return(c & 0xf); if((c >= 'A') && (c <= 'F'))return(c -= 0x37); return(-1); } int hex(int i) { i &= 0xF; if(i>9) i+=7; i+=0x30; return(i); } void ckasci(int s) { s &= 0xff; if(((s >= 0x20) && ( s <= 0x7e))) // || ((s >= 0xa0) && ( s <= 0xfe))) { putcon(s); } else { putcon(0x2e); } } // f==0 ではstrlen とほぼ同じ。長さ制限が80文字で、終了文字指定。 int cstrlen(char *cp,char f) { long i; for(i=0;i= '0') && (c <= '9')) { if(c=='0') { zs=0; i++; c = fmt[i]; } if((c >= '1') && (c <= '9')) { keta=c & 0xf; i++; c = fmt[i]; if((c >= '0') && (c <= '9')) { keta *= 10; keta += c & 0xf; i++; c = fmt[i]; } } else zs=1; } if((c == 'l') || (c == 'L')) { siz=4; i++; c = fmt[i]; } if((c == 'x') || (c == 'X')) { if(c == 'x') lower = 1; else lower = 0; c='x'; } else if((c == 'd') || (c == 'D')) { c='d'; } if(c == 'c') { *dp++ = l; wlen++; } else if(c == 's') { cp = (char *)l; while(*cp) { *dp++ = *cp++; wlen++; if(wlen >= (COLUMN -1))break; } } else { if(siz==2) l &= 0xFFFF; if(keta>10)keta=10; cb[10]=0; if(c == 'x') { cb[0]=' '; cb[1]=' '; for(j=9;j>=2;j--) { s = hex((int)l); if((lower) && (s > '9')) s |= ' ';// 英小文字 cb[j]=s; l >>= 4; } } else { for(j=9;j>=0;j--) { s = (unsigned long)l%10; cb[j]=s | '0'; l = (unsigned long)l/10; } } for(j=0;j<9;j++) { c = cb[j]; if(c == '0') { if(zs) cb[j]=' '; } else if(c != ' ') break; } if(keta < (10-j)) keta=10-j; if((wlen + keta) >= (COLUMN -1)) return wlen; for(j=10-keta;j<10;j++) *dp++ = cb[j]; wlen += keta; } } else { *dp++ = c; wlen++; } if(wlen >= (COLUMN -1))return wlen; } return wlen; }