Initial revision
This commit is contained in:
		
							parent
							
								
									85830c5f63
								
							
						
					
					
						commit
						23bbc93a92
					
				
					 1 changed files with 167 additions and 0 deletions
				
			
		
							
								
								
									
										167
									
								
								mach/z80/int/dlbin.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								mach/z80/int/dlbin.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,167 @@ | |||
| /*
 | ||||
|  * 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'); | ||||
| } | ||||
		Loading…
	
	Add table
		
		Reference in a new issue