/* Numerical I/O Routines for Small C */ #asm ccnbuff: DEFS 10 ;I/P buffer #endasm /* getdec() Inputs a decimal number. Uses ccnbuff as I/P buffer putdec(n) Outputs a decimal number gethex() Inputs a hex number. Uses ccnbuff as I/P buffer putbyte(ch) Outputs an 8 bit number as 2 hex digits puthex(n) Outputs a 16 bit number as 4 hex digits atoi(ptr) Returns an integer from ASCII pointed to by ptr hextoi(ptr) ......................from hex ASCII no ........ */ /* I/P a signed decimal number */ getdec() { char *ptr; ptr=ccnbuff; putchar('?'); /* Prompt */ gets(ptr); return atoi(ptr); } /* Get char. from buffer, check if numeric and return value or -1 */ ccnum(ptr) char *ptr; {char c; c=*ptr&127; /* Mask off top bit */ if((c<'0')|(c>'9')) return -1; return c-'0';} /* Output a signed decimal number */ putdec(n) int n; {if(n<0){n=-n; putchar('-');} if((n/10)!=0) putdec(n/10); putchar(n%10+'0'); } /* Input a hex number. Similar to getdec() */ gethex() {int digval,n; char *ptr; n=0; ptr=ccnbuff; putchar('$'); /* Prompt */ gets(ptr); while(*ptr==32)ptr++; while(*ptr) {digval=cchex(ptr++); if(digval==-1)break; n=digval+n*16;} return n;} /* Get char. from buffer. Check if hex. Return value or -1 */ cchex(ptr) char *ptr; {char c; c=*ptr&127; if((c>='0')&(c<='9')) return c-'0'; if((c>='A')&(c<='F')) return c-55; if((c>='a')&(c<='f')) return c-87; return -1;} /* Output a byte in hex */ putbyte(byte) char byte; { char temp; temp=(byte>>4)&15; ccptnib(temp); temp=byte&15; ccptnib(temp);} /* Output nibble */ ccptnib(ch) char ch; { if(ch<10)putchar(ch+48); else putchar(ch+55);} /* Output a 16 bit hex number */ puthex(ptr) char *ptr; { char temp; temp=ptr>>8; putbyte(temp); temp=ptr; putbyte(temp);} /* Get a signed integer from a string in memory */ atoi(ptr) char *ptr; {int digval,sign,n; n=0; sign=1; while(*ptr==' ')ptr++; if(*ptr=='-'){sign=-1;ptr++;} while(*ptr) {digval=ccnum(ptr++); if(digval==-1)break; n=digval+n*10;} return n*sign;} /* Get hex value from string in memory */ hextoi(ptr) char *ptr; {int digval,n; n=0; while(*ptr==' ')ptr++; while(*ptr) {digval=cchex(ptr++); if(digval==-1)break; n=digval+n*16;} return n; } CONFG),A ;Mark as CON: JP ccsxt ;back with channel 1 in HL ; Set up g