lineno = 1;
seg = 0;
for(done = 0; !done; lineno++){
err = rdcpline(b, &c);
if(err)
sysfatal("%s line %d: %s", file, lineno, err);
switch(c.type){
case 0: /* data */
addr = seg + c.addr;
if(addr + c.dlen > Memsize)
sysfatal("addr out of range: %lux-%lux", addr, addr+c.dlen);
if(seek(mfd, addr, 0) < 0)
sysfatal("seeking to %lud: %r", addr);
if(write(mfd, c.bytes+Doff, c.dlen) != c.dlen)
sysfatal("writing: %r");
if(seek(mfd, addr, 0) < 0)
sysfatal("seeking to %lud: %r", addr);
if(read(mfd, buf, c.dlen) != c.dlen)
sysfatal("reading: %r");
if(memcmp(buf, c.bytes+Doff, c.dlen) != 0)
print("readback error at %lux\n", addr);
if(dump)
print("%8.8lux: %d\n", addr, c.dlen);
break;
case 1: /* termination */
done = 1;
break;
case 2: /* segment */
seg = ((c.bytes[Doff]<<8) | c.bytes[Doff+1]) <<4;
if(seg >= Memsize)
sysfatal("seg out of range: %lux", seg);
if(dump)
print("seg %8.8lux\n", seg);
break;
default: /* ignore */
if(dump)
print("bad type %d\n", c.type);
break;
}
}
Bterm(b);
}
void
main(int argc, char **argv)
{
int unit;
int cfd, mfd;
char file[128];
unit = 0;
ARGBEGIN{
case 'd':
dump = 1;
break;
case 'i':
image = 1;
break;
case 'n':
noload = 1;
break;
case 's':
nostart = 1;
break;
case '0':
unit = 0;
break;
case '1':
unit = 1;
break;
case '2':
unit = 2;
break;
case '3':
unit = 3;
break;
}ARGEND;