/* * Download Z80 load module into the RC702 * * Adapted (untested) to new ack.out format by * Ceriel Jacobs, Vrije Universiteit, Amsterdam */ #include #include #include 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'); }