6 void record(uchar*, long);
8 void segment(vlong, vlong);
27 main(int argc, char **argv)
40 addr = strtoull(ARGF(), 0, 0);
43 psize = strtoul(ARGF(), 0, 0);
67 Binit(&stdout, 1, OWRITE);
69 bio = Bopen(argv[0], OREAD);
71 fprint(2, "ms2: open %s: %r\n", argv[0]);
76 if((dir = dirfstat(Bfildes(bio))) == nil) {
77 fprint(2, "ms2: stat failed %r");
80 segment(0, dir->length);
81 Bprint(&stdout, "S9030000FC\n");
88 if(!crackhdr(Bfildes(bio), &exech)) {
89 fprint(2, "ms2: can't decode file header\n");
93 totsz = exech.txtsz + exech.datsz + exech.bsssz;
94 fprint(2, "%s: %lud+%lud+%lud=%llud\n",
95 exech.name, exech.txtsz, exech.datsz, exech.bsssz, totsz);
98 segment(exech.datoff, exech.datsz);
100 segment(exech.txtoff, exech.txtsz);
101 addr = (addr+(psize-1))&~(psize-1);
102 segment(exech.datoff, exech.datsz);
105 if(supressend == 0) {
109 Bprint(&stdout, "S9030000FC\n");
112 Bprint(&stdout, "S705000000FA\n");
123 segment(vlong foff, vlong len)
127 uchar t, buf[2*Recordsize];
134 n = Bread(bio, buf, l);
138 fprint(2, "ms2: read error: %r\n");
143 fprint(2, "ms2: data must be even length\n");
146 for(i = 0; i < n; i += 2) {
158 record(uchar *s, long l)
166 Bprint(&stdout, "S1%.2lX%.4lluX", l+3, addr);
168 cksum += (addr>>8)&0xff;
172 Bprint(&stdout, "S2%.2lX%.6lluX", l+4, addr);
174 cksum += (addr>>8)&0xff;
175 cksum += (addr>>16)&0xff;
179 Bprint(&stdout, "S3%.2lX%.8lluX", l+5, addr);
181 cksum += (addr>>8)&0xff;
182 cksum += (addr>>16)&0xff;
183 cksum += (addr>>24)&0xff;
187 for(i = 0; i < l; i++) {
189 Bprint(&stdout, "%.2X", *s++);
191 Bprint(&stdout, "%.2luX\n", (~cksum)&0xff);
198 fprint(2, "usage: ms2 [-dsbh] [-a address] [-p pagesize] ?.out\n");