Love this site? Hate it? Leave us some comments.
*/
*/

View \UTIL.C

68Hc11 Cross-assembler

Submitted By: WEBMASTER
Rating: starstarstar (Rate It)


/*
 *      fatal --- fatal error handler
 */

fatal(str)
char    *str;
{
 printf("%s\n",str);
 exit(-1);
}
 
/*
 *      error --- error in a line
 *                      print line number and error
 */

error(str)
char    *str;
{
 if(N_files > 1)
  printf("%s,",Gargv[Cfn]);
 printf("%d: ",Line_num);
 printf("%s\n",str);
 Err_count++;
}
/*
 *      warn --- trivial error in a line
 *                      print line number and error
 */

warn(str)
char    *str;
{
 if(N_files > 1)
  printf("%s,",Gargv[Cfn]);
 printf("%d: ",Line_num);
 printf("Warning --- %s\n",str);
}
 
 
/*
 *      delim --- check if character is a delimiter
 */

delim(c)
char    c;
{
 if( any(c," \t\n"))
  return(YES);
 return(NO);
}
 
/*
 *      skip_white --- move pointer to next non-whitespace char
 */

char *skip_white(ptr)
char    *ptr;
{
 while(*ptr==BLANK || *ptr==TAB)
  ptr++;
 return(ptr);
}
 
/*
 *      eword --- emit a word to code file
 */

eword(wd)
int     wd;
{
 emit(hibyte(wd));
 emit(lobyte(wd));
}
 
/*
 *      emit --- emit a byte to code file
 */

emit(byte)
{
#ifdef DEBUG
 printf("%2x @ %4x\n",byte,Pc);
#endif
 if(Pass==1){
  Pc++;
  return(YES);
  }
 if(P_total < P_LIMIT)
  P_bytes[P_total++] = byte;
 E_bytes[E_total++] = byte;
 Pc++;
 if(E_total == E_LIMIT)
  f_record();
}
 
/*
 *      f_record --- flush record out in `S1' format
 */

f_record()
{
 int     i;
 int     chksum;
 
 if(Pass == 1)
  return;
 if(E_total==0){
  E_pc = Pc;
  return;
  }
 chksum =  E_total+3;    /* total bytes in this record */
 chksum += lobyte(E_pc);
 chksum += E_pc>>8;
 fprintf(Objfil,"S1");   /* record header preamble */
 hexout(E_total+3);      /* byte count +3 */
 hexout(E_pc>>8);        /* high byte of PC */
 hexout(lobyte(E_pc)); /* low byte of PC */
 for(i=0;i<E_total;i++){
  chksum += lobyte(E_bytes[i]);
  hexout(lobyte(E_bytes[i])); /* data byte */
  }
 chksum =~ chksum;       /* one's complement */
 hexout(lobyte(chksum)); /* checksum */
 fprintf(Objfil,"\n");
 E_pc = Pc;
 E_total = 0;
}
 
char    *hexstr = { "0123456789ABCDEF" } ;
 
hexout(byte)
int     byte;
{
 char hi,lo;
 
 byte = lobyte(byte);
 fprintf(Objfil,"%c%c",hexstr[byte>>4],hexstr[byte&017]);
}
 
/*
 *      print_line --- pretty print input line
 */

print_line()
{
 int     i;
 register char *ptr;
 
 if(P_total || P_force)
  printf("%04x",Old_pc);
 else
  printf("    ");
 
 for(i=0;i<P_total && i<6;i++)
  printf(" %02x",lobyte(P_bytes[i]));
 for(;i<6;i++)
  printf("   ");
 printf("  ");
 
 if(Cflag){
  if(Cycles)
   printf("[%2d -%8ld]  ",Cycles,Ctotal);
  else
   printf("                ");
  }
 ptr = Line;
 while( *ptr != '\n' )   /* just echo the line back out */
  putchar(*ptr++);
 for(;i<P_total;i++){
  if( i%6 == 0 )
   printf("\n    ");
  printf(" %02x",lobyte(P_bytes[i]));
  }
 printf("\n");
}
 
/*
 *      any --- does str contain c?
 */

any(c,str)
char    c;
char    *str;
{
 while(*str != EOS)
  if(*str++ == c)
   return(YES);
 return(NO);
}
 
/*
 *      mapdn --- convert A-Z to a-z
 */

char mapdn(c)
char c;
{
 if( c >= 'A' && c <= 'Z')
  return((char)(c+040));
 return(c);
}
 
/*
 *      lobyte --- return low byte of an int
 */

lobyte(i)
int i;
{
 return(i&0xFF);
}
/*
 *      hibyte --- return high byte of an int
 */

hibyte(i)
int i;
{
 return((i>>8)&0xFF);
}
 
/*
 *      head --- is str2 the head of str1?
 */

head(str1,str2)
char *str1,*str2;
{
 while( *str1 != EOS && *str2 != EOS){
  if( *str1 != *str2 )break;
  str1++;
  str2++;
  }
 if(*str1 == *str2)return(YES);
 if(*str2==EOS)
  if( any(*str1," \t\n,+-];*") )return(YES);
 return(NO);
}
 
/*
 *      alpha --- is character a legal letter
 */

alpha(c)
char c;
{
 if( c<= 'z' && c>= 'a' )return(YES);
 if( c<= 'Z' && c>= 'A' )return(YES);
 if( c== '_' )return(YES);
 if( c== '.' )return(YES);
 return(NO);
}
/*
 *      alphan --- is character a legal letter or digit
 */

alphan(c)
char c;
{
 if( alpha(c) )return(YES);
 if( c<= '9' && c>= '0' )return(YES);
 if( c == '$' )return(YES);      /* allow imbedded $ */
 return(NO);
}
 
/*
 * white --- is character whitespace?
 */

white(c)
char c;
{
 if( c == TAB || c == BLANK || c == '\n' )return(YES);
 return(NO);
}
 
/*
 * alloc --- allocate memory
 */

char *
alloc(nbytes)
int nbytes;
{
 char *malloc();
 
 return(malloc(nbytes));
}
 
/*
 * strcmp --- string compare
 */

strcmp(s,t)
char *s;
char *t;
{
 for(; *s == *t; s++,t++)
  if( *s == '\0')
   return(0);
 return(*s - *t);
}

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.
Resource Listings