126 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						|
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 | 
						|
 */
 | 
						|
static char rcsid[] = "$Header$";
 | 
						|
#define MAXBYTE	24
 | 
						|
#include <stdio.h>
 | 
						|
#include <out.h>
 | 
						|
char hex[] =  "0123456789ABCDEF";
 | 
						|
FILE *fp, *fopen();
 | 
						|
char **s;
 | 
						|
int bytes, bytcnt, checksum;
 | 
						|
long pc;
 | 
						|
struct outhead ohead;
 | 
						|
struct outsect sect[MAXSECT];
 | 
						|
 | 
						|
 | 
						|
main (argc,argv)
 | 
						|
int argc;
 | 
						|
char *argv[];
 | 
						|
	{
 | 
						|
	if (argc != 2)   fatal ("usage: %s filename\n",argv[0]);
 | 
						|
	if (! rd_open (*++argv))
 | 
						|
		fatal ("can't open %s\n",*argv);
 | 
						|
	else 	{
 | 
						|
		s = argv;
 | 
						|
		convert ();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
convert ()
 | 
						|
	{
 | 
						|
	int i;
 | 
						|
 | 
						|
	rd_ohead(&ohead);
 | 
						|
	if (ohead.oh_flags & HF_LINK) {
 | 
						|
		fatal("%s contains unresolved references\n",s);
 | 
						|
	}
 | 
						|
	rd_sect(sect, ohead.oh_nsect);
 | 
						|
	for (i = 0; i < ohead.oh_nsect; i++) {
 | 
						|
		rd_outsect(i);
 | 
						|
		pc = sect[i].os_base;
 | 
						|
		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 > 0) {
 | 
						|
				int p = bytcnt = sz < MAXBYTE ? sz : MAXBYTE;
 | 
						|
				checksum = 0;
 | 
						|
				sz -= p;
 | 
						|
				if (pc > 0xffffL) 
 | 
						|
					S2record (buf);
 | 
						|
				else S1record (buf);
 | 
						|
				buf += p;
 | 
						|
			}
 | 
						|
			free(pbuf);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	printf ("S9030000FC\n");
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
S2record (buf)
 | 
						|
	char *buf;
 | 
						|
	{
 | 
						|
	printf ("S2");
 | 
						|
	bytcnt += 4;
 | 
						|
	outbyte (bytcnt);
 | 
						|
	outbyte ((int) (pc >> 16));
 | 
						|
	outbyte ((int) (pc >> 8));
 | 
						|
	outbyte ((int) pc);
 | 
						|
	record (buf);
 | 
						|
	}
 | 
						|
 | 
						|
S1record (buf)
 | 
						|
	char *buf;
 | 
						|
	{
 | 
						|
	printf ("S1");
 | 
						|
	bytcnt += 3;
 | 
						|
	outbyte (bytcnt);
 | 
						|
	outbyte ((int) (pc >> 8));
 | 
						|
	outbyte((int) pc);
 | 
						|
	record (buf);
 | 
						|
	}
 | 
						|
 | 
						|
record (buf)
 | 
						|
	register char *buf;
 | 
						|
	{
 | 
						|
	while (bytcnt != 0) 
 | 
						|
		{
 | 
						|
		outbyte (*buf++);
 | 
						|
		pc ++;
 | 
						|
		}
 | 
						|
	outbyte (~checksum);
 | 
						|
	putchar ('\n');
 | 
						|
	putchar (0);
 | 
						|
	putchar (0);
 | 
						|
	}
 | 
						|
 | 
						|
outbyte (b)
 | 
						|
int b;
 | 
						|
	{
 | 
						|
	checksum = (checksum + b) & 0377;
 | 
						|
	putchar (hex[(b>>4) & 017]);
 | 
						|
	putchar  (hex[b & 017]);
 | 
						|
	-- bytcnt;
 | 
						|
	}
 | 
						|
 | 
						|
rd_fatal() { fatal("Read error\n"); }
 | 
						|
 | 
						|
fatal (s,a)
 | 
						|
	{
 | 
						|
	printf (s,a);
 | 
						|
	exit (-1);
 | 
						|
	}
 |