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