Initial revision
authorceriel <none@none>
Wed, 4 Feb 1987 10:35:30 +0000 (10:35 +0000)
committerceriel <none@none>
Wed, 4 Feb 1987 10:35:30 +0000 (10:35 +0000)
mach/z80/int/dlbin.c [new file with mode: 0644]

diff --git a/mach/z80/int/dlbin.c b/mach/z80/int/dlbin.c
new file mode 100644 (file)
index 0000000..bdf6fc7
--- /dev/null
@@ -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');
+}