147 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Id$ */
 | |
| /*
 | |
|  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  * See the copyright notice in the ACK home directory, in the file "Copyright".
 | |
|  */
 | |
| /*
 | |
|  * dit programma leest een a.out file
 | |
|  * voor een kleine uP (adres space = 64K)
 | |
|  * en levert aan de standaard output een
 | |
|  * download formaat voor de MCCPM computer.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #define MAXBYTE	24
 | |
| #include <stdio.h>
 | |
| #include <out.h>
 | |
| char hex[] =  "0123456789ABCDEF";
 | |
| char **s;
 | |
| int bytes, bytcnt, checksum;
 | |
| unsigned pc;
 | |
| unsigned offset;
 | |
| unsigned htou();
 | |
| 
 | |
| 
 | |
| main (argc,argv)
 | |
| int argc;
 | |
| char *argv[];
 | |
| 	{
 | |
| 	if (argc > 3)
 | |
| 		fatal ("usage: %s filename [start-adres]\n",argv[0]);
 | |
| 	offset = 0;
 | |
| 	if (argc == 3)
 | |
| 		if (!(offset = htou(argv[2])))
 | |
| 			fatal ("adres error %s\n", argv[2]);
 | |
| 	if (! rd_open(*++argv)) fatal ("can't open %s\n",*argv);
 | |
| 	else 	{
 | |
| 		s = argv;
 | |
| 		convert ();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| convert ()
 | |
| 	{
 | |
| 	struct outhead head;
 | |
| 	struct outsect sect[MAXSECT];
 | |
| 	int i;
 | |
| 
 | |
| 	rd_ohead(&head);
 | |
| 	if (head.oh_flags & HF_LINK) {
 | |
| 		fatal("%s contains unresolved references\n",s);
 | |
| 	}
 | |
| 	rd_sect(sect, head.oh_nsect);
 | |
| 	for (i = 0; i < head.oh_nsect; i++) {
 | |
| 		rd_outsect(i);
 | |
| 		pc = sect[i].os_base - offset;
 | |
| 		while (sect[i].os_size) {
 | |
| 			unsigned int sz = 8096, fl;
 | |
| 			extern char *calloc();
 | |
| 			register char *buf;
 | |
| 			char *pbuf;
 | |
| 
 | |
| 			if (sz > sect[i].os_size) sz = sect[i].os_size;
 | |
| 			sect[i].os_size -= sz;
 | |
| 			pbuf = buf = calloc(sz, 1);
 | |
| 			if (fl = sect[i].os_flen) {
 | |
| 				if (fl > sz) fl = sz;
 | |
| 				sect[i].os_flen -= fl;
 | |
| 
 | |
| 				rd_emit(buf, (long) fl);
 | |
| 			}
 | |
| 			while (sz >= MAXBYTE) {
 | |
| 				data(MAXBYTE, (int) pc, buf);
 | |
| 				checksum = 0;
 | |
| 				sz -= MAXBYTE;
 | |
| 				buf += MAXBYTE;
 | |
| 				pc += MAXBYTE;
 | |
| 			}
 | |
| 			if (sz > 0) {
 | |
| 				data(sz, (int) pc, buf);
 | |
| 				checksum = 0;
 | |
| 			}
 | |
| 			free(pbuf);
 | |
| 		}
 | |
| 	}
 | |
| 	printf (":00000001FF\n");
 | |
| 	}
 | |
| 
 | |
| 
 | |
| data (sz, pc, buf)
 | |
| 	register char *buf;
 | |
| {
 | |
| 	printf (":");
 | |
| 	outbyte (sz);
 | |
| 	bytcnt += 4;
 | |
| 	outbyte (pc >> 8);
 | |
| 	outbyte (pc);
 | |
| 	outbyte (0);
 | |
| 	while (sz != 0) 
 | |
| 		{
 | |
| 		outbyte (*buf++);
 | |
| 		sz--;
 | |
| 		}
 | |
| 	outbyte (-checksum);
 | |
| 	putchar ('\n');
 | |
| 	putchar (0);
 | |
| 	putchar (0);
 | |
| 	}
 | |
| 
 | |
| outbyte (b)
 | |
| int b;
 | |
| 	{
 | |
| 	checksum = (checksum + b) & 0xFF;
 | |
| 	putchar (hex[(b>>4) & 0xF]);
 | |
| 	putchar  (hex[b & 0xF]);
 | |
| 	}
 | |
| 
 | |
| fatal (s,a)
 | |
| 	char *s, *a;
 | |
| 	{
 | |
| 	fprintf (stderr,s,a);
 | |
| 	exit (-1);
 | |
| 	}
 | |
| 
 | |
| rd_fatal()
 | |
| {
 | |
| 	fatal("Read error\n");
 | |
| }
 | |
| /* convert a string of hex digits to an unsigned 16 bit number */
 | |
| 
 | |
| unsigned htou(t)
 | |
| char *t;
 | |
| {
 | |
| unsigned n = 0;
 | |
| char c;
 | |
| while(c = *t++){
 | |
| 	if(c >= '0' && c <= '9')
 | |
| 		c -= '0';
 | |
| 	else if(c >= 'a' && c <= 'f')
 | |
| 		c -= 'a' - 10;
 | |
| 	else if(c >= 'A' && c <= 'F')
 | |
| 		c -= 'A' - 10;
 | |
| 	else
 | |
| 		return(0);
 | |
| 	n = n * 16 + c;
 | |
| 	}
 | |
| return(n);
 | |
| }
 |