/****************************************************************/ // Sample for main.c // Add Monitor 2011.6.2 // Modify 2011.6.3 Bitcraft // LEDの点滅サンプルソフトの、main.c と置き換えるだけで動作する。 /****************************************************************/ #include // Include machine.h #include "iodefine.h" // Include iodefine.h #define SCBRR_SET 25 #define RSPI_CH 1 // 使用するSPIポートの選択: 0:RSPIA-A, 1:RSPIB-A, 10:RSPIA-B, 11:RSPIB-B #define CS_LOW() {PORT3.DR.BIT.B1 = 0;} // CS#(P31/SSLB0-A)をLにする(RSPI_CH=1のとき) #define CS_HIGH() {PORT3.DR.BIT.B1 = 1;} // CS#(P31/SSLB0-A)をHにする(RSPI_CH=1のとき) #define PCLK 48000000UL // PCLKの周波数[Hz] #define CLK_FAST 24000000UL // SCLKの周波数[Hz] (動作中) #define CLK_SLOW 400000UL // SCLKの周波数[Hz] (初期化中) #define RSPI RSPI1 // MISOB-A, MOSIB-A を使う #define SPI_ATTACH() { \ PORT3.ICR.BIT.B0 = 1; \ IOPORT.PFHSPI.BYTE = 0x0E; \ MSTP_RSPI1 = 0; \ } #define FCLK_FAST() { \ RSPI.SPCR.BIT.SPE = 0; \ RSPI.SPBR.BYTE = PCLK/2/CLK_FAST-1; \ RSPI.SPCR.BIT.SPE = 1; \ } // 以下、モニタを追加 char getcon(void); void putcon(char); void putscon(char *); 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)(); /* アドレスとして関数呼び出し */ }; #define COLUMN 80 char htol(long *,char **); void crlf(void); int chex(char ); void ckasci(short ); void cprintf(); void spacen(int ); //==================================================== char getcon(void); void putcon(char ); void putscon(char *); int combuf2f; //char combuf2[COLUMN]; /* 前回のコマンド記憶 */ char combuf[COLUMN]; /* コマンド入力バッファー */ union param32 param[8]; int dumpm(union param32 *); int cksjis(unsigned short s); 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); int setmemo(union param32 *,int,int ); void findp(union param32 *); long cpysstr(char *,char *,long ); long gosub(union param32 addr); int dhrymain(void); // int leddata; // LED点滅ソフトの main.c の部分を改造 void main(void) { int i; // int data; // PORT2.ICR.BIT.B1 = 1; // SCI0スタンバイ解除 SYSTEM.MSTPCRB.BIT.MSTPB31 = 0; // SCI設定 SCI0.SCR.BYTE = 0x00; // TE=0,RE=0,CKE1=0 SCI0.SMR.BYTE = 0x00; // CHR=0,PE=0,STOP=0,CKS=00(Pφ/1) SCI0.BRR = SCBRR_SET; // 分周設定 115200 bps SCI0.SEMR.BIT.ABCS = 1; // ABCS=1 for(i=0;i<0x800000;i++);// 1bit時間ウェイト SCI0.SCR.BYTE = 0x30; // TIE=0,RIE=0,TE=1,RE=1 // PORT3.DR.BIT.B1 = 1; // CS#=OUT PORT3.DDR.BIT.B1 = 1; // CS#=H PORT0.ICR.BIT.B7 = 1; // INS#=IN // FCLK_FAST(); SPI_ATTACH(); // Initialize RSPI module RSPI.SPCR.BYTE = 0; // Stop SPI RSPI.SPPCR.BYTE = 0; // Fixed idle value, disable loop-back mode RSPI.SPSCR.BYTE = 0; // Disable sequence control RSPI.SPDCR.BYTE = 0x20; // SPLW=1 RSPI.SPCMD0.WORD = 0x0700; // LSBF=0, SPB=7, BRDV=0, CPOL=0, CPHA=0 RSPI.SPBR.BYTE = PCLK / 2 / CLK_SLOW - 1; // Bit rate RSPI.SPCR.BYTE = 0x49; // Start SPI in master mode CS_LOW(); // とりあえず、タイマー割り込みを削除 PORT1.DDR.BIT.B5 = 1; // P15 is Output // MSTP( CMT0 ) = 0; // Wakeup CMT0,CMT1 // CMT0.CMCOR = 48000000/512/2 - 1; // CMCOR is 500ms Count 0xB71A // CMT0.CMCR.WORD = 0x0043; // CMIE is Enable,CKS is PCLK/512 // IEN( CMT0, CMI0 ) = 1; // CMI0 Enable // IPR( CMT0, CMI0 ) = 1; // CMI0 Interrupt Level is 1 // set_psw( 0x00010000 ); // Set I=1, IPL=0 of PSW // CMT.CMSTR0.BIT.STR0 = 1; // Start CMT0 /* while(1) { if (SCI0.SSR.BYTE & 0x40) { // データを受信したか。 パソコンのターミナルソフトから1文字送信すると、エコーバックする data = SCI0.RDR; SCI0.SSR.BYTE = SCI0.SSR.BYTE & 0x80; SCI0.TDR = data; SCI0.SSR.BYTE = SCI0.SSR.BYTE & 0x40; PORT1.DR.BIT.B5 ^= 1; // Reverse P15(LED) // break; } else if (SCI0.SSR.BYTE & 0x80) { // 送信バッファが空いているか // SCI0.TDR = 0x55; // SCI0.SSR.BYTE = SCI0.SSR.BYTE & 0x40; // break; } } */ while( 1 ) mainmoni(0); // モニタを呼び出す } // 割り込み処理は、そのまま残す #pragma interrupt CMI0(vect=VECT( CMT0, CMI0 )) void CMI0(void) // Interrupt Function { // Multiple Interrupt Enable // int data; PORT1.DR.BIT.B5 ^= 1; // Reverse P15(LED) /* while(1) { if (SCI0.SSR.BYTE & 0x40) { // データを受信したか。 パソコンのターミナルソフトから1文字送信すると、エコーバックする data = SCI0.RDR; SCI0.SSR.BYTE = SCI0.SSR.BYTE & 0x80; SCI0.TDR = data; SCI0.SSR.BYTE = SCI0.SSR.BYTE & 0x40; break; } else if (SCI0.SSR.BYTE & 0x80) { // 送信バッファが空いているか SCI0.TDR = 0x55; SCI0.SSR.BYTE = SCI0.SSR.BYTE & 0x40; break; } } RSPI.SPDR.LONG = 0x48; // Start transmission. 0x48をSPIポートから出力します。 // while (!RSPI.SPSR.BIT.SPRF) ; // Wait for end of transfer RSPI.SPDR.LONG; // Discard received data */ } // ここからが、モニタの本体 // モニタのBIOS。モニタを操作するのは、この3個のBIOSのみ。 // RS232Cから受信文字があると、1をリターン char statcon() { int i; i = 0; if (SCI0.SSR.BYTE & 0x40) i = 1; return i; } // RS232Cから1文字受信するまで待つ。 char getcon() { int data; while(1) { if (SCI0.SSR.BYTE & 0x40) break; } data = SCI0.RDR; SCI0.SSR.BYTE = SCI0.SSR.BYTE & 0x80; return data; } // RS232Cに1文字出力。 void putcon(char c) { while(1) { if (SCI0.SSR.BYTE & 0x80) break; } SCI0.TDR = c; } // 以下、最後までが、モニタの本体。MAIN int mainmoni (int mode) { int ret; char *comp,c;//*cp; // int coma; int i,j,l; // int *lsp,*ldp; // int pret; int ts,te; putscon("\r\nCustom Monitor 2011.6.3\r\n"); while(1) { LOOP: putscon("RX62N-Bug>"); if((ret=getscon(combuf,COLUMN-1,0))== -1) { crlf(); goto LOOP; } comp=combuf; // cpysstr(combuf2,combuf,15L); c= *comp; switch(c) { case 'd': j=0; comp++; // if((*comp=='S')||(*comp=='s')) // { // j |= 1; // comp++; // } if(j==0) { if(*comp ==0) { l = param[1].l32 - param[0].l32 + 2; 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+0x7e; } } } else { param[0].l32=0; param[1].l32=0x3f; } dumpm(param); break; case 'm': j=0; comp++; if((*comp=='W')||(*comp=='w')) { j=1; comp++; } else if((*comp=='L')||(*comp=='l')) { j=2; comp++; } if((i=argck(&comp,param,3)) != 3) { paramer(); break; } // ts = ((long *)TIMER0BASE)[1]; movem(param,(long)j); // te = ((long *)TIMER0BASE)[1]; break; // case 'V': case 'v': comp++; if((i=argck(&comp,param,3)) != 3) { paramer(); break; } // ts = ((long *)TIMER0BASE)[1]; verify(param); // te = ((long *)TIMER0BASE)[1]; break; /* case 'F':// フィルデータ comp++; if((i=argck(&comp,param,5)) != 5) { paramer(); break; } ts = ((long *)TIMER0BASE)[1]; fillp(param); te = ((long *)TIMER0BASE)[1]; break; */ case 'f': comp++; if((i=argck(&comp,param,4)) != 4) { paramer(); break; } // ts = ((long *)TIMER0BASE)[1]; findp(param); // te = ((long *)TIMER0BASE)[1]; break; /* set memory */ case 'g': comp++; if((i=argck(&comp,param,1))== -1) { paramer(); break; } // ts = ((long *)TIMER0BASE)[1]; ret = param[0].ppoint(); // ret = gosub((union param32)param[0].l32); // te = ((long *)TIMER0BASE)[1]; cprintf("\r\nret= %08lX",ret); break; // case 'L': case 'l': j=0; comp++; if((i=argck(&comp,param,1))== -1) { paramer(); break; } crlf(); srload(param,1); break; case 's': j=0; comp++; if((*comp=='N')||(*comp == 'n')) { j=4; comp++; } if((*comp=='W')||(*comp=='w')) { j |= 1; comp++; } else if((*comp=='L')||(*comp=='l')) { 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 = ((long *)TIMER0BASE)[2]; setmemo(param,j,i); // te = ((long *)TIMER0BASE)[2]; break; // case 'D':// dhry stone テスト // ret = dhrymain(); // cprintf("\r\nTimer HEX = %lX,",ret); cprintf(" time = %ld",ret); // break; /* case 'S':// エラトステネスのふるいで、素数を求めたときの実行時間 ts = ((long *)TIMER0BASE)[1]; ret = sievemain(); te = ((long *)TIMER0BASE)[1]; cprintf("sieve=%ld ",ret); l=te-ts; // l /= 1000; cprintf("\r\nTimer HEX = %lX,",l); cprintf(" time = %ld",l/48); l /= 5; cprintf(".%dμs",l%10); break; */ case 'T': l=te-ts; // l /= 1000; cprintf("\r\nTimer HEX = %lX,",l);// cprintf(" time = %ld",l/48); // l /= 5; // cprintf(".%dμs",l%10); // prnt6k(l);// 6桁10進表示 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<1000;iter++) { count=0; // l=0; for(i=0;i<=SIZE;i++) { buf[i]=1; // l++; } for(i=0;i<=SIZE;i++) { if(buf[i]) { k=i+i+3; prime=k; k += i; // l++; for(;k'); 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"); } /* 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; } } void movem(union param32 *param,long ll) { register long l; register char *s,*d; register short *sp; long *lp,*ldp; short *dp; s=param[0].cpoint; sp=param[0].spoint; d=param[1].cpoint; dp=param[1].spoint; lp=param[0].lpoint; ldp=param[1].lpoint; l=param[2].l32; if(ll==0) { while(l--) { *d++ = *s++; } } else if(ll==1) { while(l--) { *dp++ = *sp++; } } else if(ll==2) { while(l--) { *ldp++ = *lp++; } } } 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) { unsigned char *cp; // short *sp; short i,sum,ls; unsigned int s,sjf; union param32 u; unsigned char sbuf[16]; char c2; unsigned long len; // short sbuf[8]; param[0].l32 &= 0xfffffff0l; param[1].l32 &= 0xffffffffl; len = param[1].ul32 - param[0].ul32 + 1; cp=param[0].ucpoint; // sp=param[0].spoint; dumpmt(); sjf=0; ls=0; 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(); } } /* cprintf("%08lX",(long)sp); spacen(1); for(i=0;i<8;i++) { s= *sp++; sbuf[i]=s; cprintf("%04X",s); spacen(1); if(statcon()) { if(getcon()==3)return; if(getcon()==3)return; } } putcon(0x2a); // '*' for(i=0;i<8;i++) { s=sbuf[i]; ckasci(s >> 8); ckasci(s); } putcon(0x2a); if(sp >= param[1].spoint) { return; } u.spoint=sp; if((u.l32 & 0xf)==0) { crlf(); if((u.l32 & 0xff)==0) dumpmt(); } */ } } int cksjis(unsigned short 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; } 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; } long cpysstr(char *d,char *s,long n) { register char c; register long l; l=0; while(n--) { c= *s++; if((c == ' ') || (c == '\0'))break; *d++ = c; l++; } *d++ = '\0'; return(l); } void spacen(int n) { while(n--) { putcon(0x20); } } 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(short s) { s &= 0xff; if(((s >= 0x20) && ( s <= 0x7e))) // || ((s >= 0xa0) && ( s <= 0xfe))) { putcon(s); } else { putcon(0x2e); } } long 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')) { 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((short)l); 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; // hex8b(keta); for(j=10-keta;j<10;j++) *dp++ = cb[j]; wlen += keta; } } else { *dp++ = c; wlen++; } if(wlen >= (COLUMN -1))return wlen; } return wlen; }