From 23bbc93a9217dad66cc039f82b3a4f07ff5b7164 Mon Sep 17 00:00:00 2001 From: ceriel Date: Wed, 4 Feb 1987 10:35:30 +0000 Subject: [PATCH] Initial revision --- mach/z80/int/dlbin.c | 167 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 mach/z80/int/dlbin.c diff --git a/mach/z80/int/dlbin.c b/mach/z80/int/dlbin.c new file mode 100644 index 000000000..bdf6fc7e0 --- /dev/null +++ b/mach/z80/int/dlbin.c @@ -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 +#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'); +} -- 2.34.1