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…
Reference in a new issue