167 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Download Z80 load module into the RC702
 | 
						|
 *
 | 
						|
 * Adapted (untested) to new ack.out format by
 | 
						|
 * Ceriel Jacobs, Vrije Universiteit, Amsterdam
 | 
						|
 */
 | 
						|
#include	<stdio.h>
 | 
						|
#include	<assert.h>
 | 
						|
#include	<out.h>
 | 
						|
 | 
						|
int	disp = 0;
 | 
						|
 | 
						|
char	hex[] = "0123456789ABCDEF";
 | 
						|
 | 
						|
#define	DATTYPE		0
 | 
						|
#define	EOFTYPE		1
 | 
						|
#define	SEGTYPE		2
 | 
						|
#define	PCTYPE		3
 | 
						|
 | 
						|
#define	MAXBYTE		32
 | 
						|
 | 
						|
char *progname;
 | 
						|
 | 
						|
struct outhead ohead;
 | 
						|
struct outsect sect[MAXSECT];
 | 
						|
 | 
						|
long pc;
 | 
						|
 | 
						|
main(argc,argv) char **argv; {
 | 
						|
	register unsigned nd;
 | 
						|
	register char *s;
 | 
						|
	int first = 1;
 | 
						|
	int i;
 | 
						|
 | 
						|
	progname = argv[0];
 | 
						|
	while (argc > 1 && argv[1][0] == '-') {
 | 
						|
		switch (argv[1][1]) {
 | 
						|
		case 'd':
 | 
						|
			/* displacement at load time */
 | 
						|
			disp = atoi(&argv[1][2]);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		argc--;
 | 
						|
		argv++;
 | 
						|
	}
 | 
						|
	s = "a.out";
 | 
						|
	if (argc == 2)
 | 
						|
		s = argv[1];
 | 
						|
	else if (argc != 1) {
 | 
						|
		fprintf(stderr,"usage: %s [flags] [object file]\n",progname);
 | 
						|
		exit(-1);
 | 
						|
	}
 | 
						|
	if (! rd_open(s)) {
 | 
						|
		fprintf(stderr,"%s: can't open %s\n",progname,s);
 | 
						|
		exit(-1);
 | 
						|
	}
 | 
						|
	rd_ohead(&ohead);
 | 
						|
	if (ohead.oh_flags & HF_LINK) {
 | 
						|
		fprintf(stderr,"%s: %s contains unresolved references\n",progname,s);
 | 
						|
		exit(-1);
 | 
						|
	}
 | 
						|
	rd_sect(sect, ohead.oh_nsect);
 | 
						|
	for (i = 0; i < ohead.oh_nsect; i++) {
 | 
						|
		rd_outsect(i);
 | 
						|
		pc = sect[i].os_base;
 | 
						|
		if (first) {
 | 
						|
			first = 0;
 | 
						|
			putchar('L');
 | 
						|
			putchar('S');
 | 
						|
		}
 | 
						|
		segment(i);
 | 
						|
		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);
 | 
						|
				sz -= MAXBYTE;
 | 
						|
				buf += MAXBYTE;
 | 
						|
				pc += MAXBYTE;
 | 
						|
			}
 | 
						|
			if (sz > 0) {
 | 
						|
				data(sz, (int) pc, buf);
 | 
						|
			}
 | 
						|
			free(pbuf);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if (first == 0) eof();
 | 
						|
	exit(0);
 | 
						|
}
 | 
						|
 | 
						|
segment(sg) {
 | 
						|
 | 
						|
	newline(2,0,SEGTYPE);
 | 
						|
	word(sg);
 | 
						|
	endline();
 | 
						|
}
 | 
						|
 | 
						|
data(nd,pc,buf)
 | 
						|
	register char *buf;
 | 
						|
	int pc;
 | 
						|
{
 | 
						|
	register i;
 | 
						|
 | 
						|
	newline(nd, pc+disp, DATTYPE);
 | 
						|
	for (i = 0; i < nd; i++) {
 | 
						|
		byte(*buf++);
 | 
						|
	}
 | 
						|
	endline();
 | 
						|
}
 | 
						|
 | 
						|
int check, bytecount;
 | 
						|
 | 
						|
newline(n,pc,typ) {
 | 
						|
 | 
						|
	check = 0;
 | 
						|
	bytecount = n+5;
 | 
						|
	putchar('\n');	/* added instruction */
 | 
						|
	putchar(':');
 | 
						|
	byte(n);
 | 
						|
	word(pc);
 | 
						|
	byte(typ);
 | 
						|
}
 | 
						|
 | 
						|
endline() {
 | 
						|
 | 
						|
	byte(-check);
 | 
						|
	assert(bytecount == 0);
 | 
						|
}
 | 
						|
 | 
						|
word(w) {
 | 
						|
 | 
						|
	byte(w>>8);
 | 
						|
	byte(w);
 | 
						|
}
 | 
						|
 | 
						|
byte(b) {
 | 
						|
 | 
						|
	check += b;
 | 
						|
	bytecount--;
 | 
						|
	putchar(hex[(b>>4) & 017]);
 | 
						|
	putchar(hex[b & 017]);
 | 
						|
}
 | 
						|
 | 
						|
rd_fatal()
 | 
						|
{
 | 
						|
	fprintf(stderr, "%s: Read error\n", progname);
 | 
						|
	exit(-1);
 | 
						|
}
 | 
						|
 | 
						|
eof() {
 | 
						|
 | 
						|
	newline(0,0,EOFTYPE);
 | 
						|
	byte(0xFF);
 | 
						|
	putchar('\n');
 | 
						|
}
 |