13e12c5d1SDavid du Colombier #include "l.h"
23e12c5d1SDavid du Colombier
33e12c5d1SDavid du Colombier #define Dbufslop 100
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier long
entryvalue(void)63e12c5d1SDavid du Colombier entryvalue(void)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier char *a;
93e12c5d1SDavid du Colombier Sym *s;
103e12c5d1SDavid du Colombier
113e12c5d1SDavid du Colombier a = INITENTRY;
123e12c5d1SDavid du Colombier if(*a >= '0' && *a <= '9')
133e12c5d1SDavid du Colombier return atolwhex(a);
143e12c5d1SDavid du Colombier s = lookup(a, 0);
153e12c5d1SDavid du Colombier if(s->type == 0)
163e12c5d1SDavid du Colombier return INITTEXT;
179a747e4fSDavid du Colombier switch(s->type) {
189a747e4fSDavid du Colombier case STEXT:
199a747e4fSDavid du Colombier break;
209a747e4fSDavid du Colombier case SDATA:
21375daca8SDavid du Colombier if(dlm)
229a747e4fSDavid du Colombier return s->value+INITDAT;
239a747e4fSDavid du Colombier default:
243e12c5d1SDavid du Colombier diag("entry not text: %s", s->name);
259a747e4fSDavid du Colombier }
263e12c5d1SDavid du Colombier return s->value;
273e12c5d1SDavid du Colombier }
283e12c5d1SDavid du Colombier
29*8153b942SDavid du Colombier /* these need to take long arguments to be compatible with elf.c */
303e12c5d1SDavid du Colombier void
wputl(long w)31*8153b942SDavid du Colombier wputl(long w)
32219b2ee8SDavid du Colombier {
3359cc4ca5SDavid du Colombier cput(w);
3459cc4ca5SDavid du Colombier cput(w>>8);
35219b2ee8SDavid du Colombier }
36219b2ee8SDavid du Colombier
37219b2ee8SDavid du Colombier void
wput(long w)38*8153b942SDavid du Colombier wput(long w)
39375daca8SDavid du Colombier {
40375daca8SDavid du Colombier cput(w>>8);
41375daca8SDavid du Colombier cput(w);
42375daca8SDavid du Colombier }
43375daca8SDavid du Colombier
44375daca8SDavid du Colombier void
lput(long l)45260f7b65SDavid du Colombier lput(long l)
46260f7b65SDavid du Colombier {
47260f7b65SDavid du Colombier cput(l>>24);
48260f7b65SDavid du Colombier cput(l>>16);
49260f7b65SDavid du Colombier cput(l>>8);
50260f7b65SDavid du Colombier cput(l);
51260f7b65SDavid du Colombier }
52260f7b65SDavid du Colombier
53260f7b65SDavid du Colombier void
lputl(long l)54260f7b65SDavid du Colombier lputl(long l)
55260f7b65SDavid du Colombier {
56260f7b65SDavid du Colombier cput(l);
57260f7b65SDavid du Colombier cput(l>>8);
58260f7b65SDavid du Colombier cput(l>>16);
59260f7b65SDavid du Colombier cput(l>>24);
60260f7b65SDavid du Colombier }
61260f7b65SDavid du Colombier
62260f7b65SDavid du Colombier void
llput(vlong v)63*8153b942SDavid du Colombier llput(vlong v)
64*8153b942SDavid du Colombier {
65*8153b942SDavid du Colombier lput(v>>32);
66*8153b942SDavid du Colombier lput(v);
67*8153b942SDavid du Colombier }
68*8153b942SDavid du Colombier
69*8153b942SDavid du Colombier void
llputl(vlong v)70*8153b942SDavid du Colombier llputl(vlong v)
71*8153b942SDavid du Colombier {
72*8153b942SDavid du Colombier lputl(v);
73*8153b942SDavid du Colombier lputl(v>>32);
74*8153b942SDavid du Colombier }
75*8153b942SDavid du Colombier
76*8153b942SDavid du Colombier void
strnput(char * s,int n)77260f7b65SDavid du Colombier strnput(char *s, int n)
78260f7b65SDavid du Colombier {
79260f7b65SDavid du Colombier for(; *s && n > 0; s++){
80260f7b65SDavid du Colombier cput(*s);
81260f7b65SDavid du Colombier n--;
82260f7b65SDavid du Colombier }
83260f7b65SDavid du Colombier while(n > 0){
84260f7b65SDavid du Colombier cput(0);
85260f7b65SDavid du Colombier n--;
86260f7b65SDavid du Colombier }
87260f7b65SDavid du Colombier }
88260f7b65SDavid du Colombier
89260f7b65SDavid du Colombier void
asmb(void)903e12c5d1SDavid du Colombier asmb(void)
913e12c5d1SDavid du Colombier {
923e12c5d1SDavid du Colombier Prog *p;
939a747e4fSDavid du Colombier long v, magic;
943e12c5d1SDavid du Colombier int a;
953e12c5d1SDavid du Colombier uchar *op1;
963e12c5d1SDavid du Colombier
973e12c5d1SDavid du Colombier if(debug['v'])
983e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f asmb\n", cputime());
993e12c5d1SDavid du Colombier Bflush(&bso);
1003e12c5d1SDavid du Colombier
1013e12c5d1SDavid du Colombier seek(cout, HEADR, 0);
1023e12c5d1SDavid du Colombier pc = INITTEXT;
1033e12c5d1SDavid du Colombier curp = firstp;
1043e12c5d1SDavid du Colombier for(p = firstp; p != P; p = p->link) {
1053e12c5d1SDavid du Colombier if(p->as == ATEXT)
1063e12c5d1SDavid du Colombier curtext = p;
1073e12c5d1SDavid du Colombier if(p->pc != pc) {
1083e12c5d1SDavid du Colombier if(!debug['a'])
1093e12c5d1SDavid du Colombier print("%P\n", curp);
1106b6b9ac8SDavid du Colombier diag("phase error %lux sb %lux in %s", p->pc, pc, TNAME);
1113e12c5d1SDavid du Colombier pc = p->pc;
1123e12c5d1SDavid du Colombier }
1133e12c5d1SDavid du Colombier curp = p;
1143e12c5d1SDavid du Colombier asmins(p);
1153e12c5d1SDavid du Colombier if(cbc < sizeof(and))
1163e12c5d1SDavid du Colombier cflush();
1173e12c5d1SDavid du Colombier a = (andptr - and);
1183e12c5d1SDavid du Colombier if(debug['a']) {
1193e12c5d1SDavid du Colombier Bprint(&bso, pcstr, pc);
1203e12c5d1SDavid du Colombier for(op1 = and; op1 < andptr; op1++)
1213e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", *op1 & 0xff);
1229a747e4fSDavid du Colombier Bprint(&bso, "\t%P\n", curp);
1239a747e4fSDavid du Colombier }
124375daca8SDavid du Colombier if(dlm) {
1259a747e4fSDavid du Colombier if(p->as == ATEXT)
1269a747e4fSDavid du Colombier reloca = nil;
1279a747e4fSDavid du Colombier else if(reloca != nil)
1286b6b9ac8SDavid du Colombier diag("reloc failure: %P", curp);
1293e12c5d1SDavid du Colombier }
1303e12c5d1SDavid du Colombier memmove(cbp, and, a);
1313e12c5d1SDavid du Colombier cbp += a;
1323e12c5d1SDavid du Colombier pc += a;
1333e12c5d1SDavid du Colombier cbc -= a;
1343e12c5d1SDavid du Colombier }
1353e12c5d1SDavid du Colombier cflush();
1363e12c5d1SDavid du Colombier switch(HEADTYPE) {
1373e12c5d1SDavid du Colombier default:
138406758d9SDavid du Colombier diag("unknown header type %ld", HEADTYPE);
1393e12c5d1SDavid du Colombier case 0:
1403e12c5d1SDavid du Colombier seek(cout, rnd(HEADR+textsize, 8192), 0);
1413e12c5d1SDavid du Colombier break;
1423e12c5d1SDavid du Colombier case 1:
1433e12c5d1SDavid du Colombier textsize = rnd(HEADR+textsize, 4096)-HEADR;
1443e12c5d1SDavid du Colombier seek(cout, textsize+HEADR, 0);
1453e12c5d1SDavid du Colombier break;
1463e12c5d1SDavid du Colombier case 2:
147260f7b65SDavid du Colombier case 5:
1483e12c5d1SDavid du Colombier seek(cout, HEADR+textsize, 0);
1493e12c5d1SDavid du Colombier break;
1503e12c5d1SDavid du Colombier case 3:
151219b2ee8SDavid du Colombier case 4:
1523e12c5d1SDavid du Colombier seek(cout, HEADR+rnd(textsize, INITRND), 0);
1533e12c5d1SDavid du Colombier break;
1543e12c5d1SDavid du Colombier }
1553e12c5d1SDavid du Colombier
1563e12c5d1SDavid du Colombier if(debug['v'])
1573e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f datblk\n", cputime());
1583e12c5d1SDavid du Colombier Bflush(&bso);
159375daca8SDavid du Colombier
160375daca8SDavid du Colombier if(dlm){
161375daca8SDavid du Colombier char buf[8];
162375daca8SDavid du Colombier
163375daca8SDavid du Colombier write(cout, buf, INITDAT-textsize);
164375daca8SDavid du Colombier textsize = INITDAT;
165375daca8SDavid du Colombier }
166375daca8SDavid du Colombier
1673e12c5d1SDavid du Colombier for(v = 0; v < datsize; v += sizeof(buf)-Dbufslop) {
1683e12c5d1SDavid du Colombier if(datsize-v > sizeof(buf)-Dbufslop)
1693e12c5d1SDavid du Colombier datblk(v, sizeof(buf)-Dbufslop);
1703e12c5d1SDavid du Colombier else
1713e12c5d1SDavid du Colombier datblk(v, datsize-v);
1723e12c5d1SDavid du Colombier }
1733e12c5d1SDavid du Colombier
1743e12c5d1SDavid du Colombier symsize = 0;
1753e12c5d1SDavid du Colombier spsize = 0;
1763e12c5d1SDavid du Colombier lcsize = 0;
1773e12c5d1SDavid du Colombier if(!debug['s']) {
1783e12c5d1SDavid du Colombier if(debug['v'])
1793e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f sym\n", cputime());
1803e12c5d1SDavid du Colombier Bflush(&bso);
1813e12c5d1SDavid du Colombier switch(HEADTYPE) {
1823e12c5d1SDavid du Colombier default:
1833e12c5d1SDavid du Colombier case 0:
1843e12c5d1SDavid du Colombier seek(cout, rnd(HEADR+textsize, 8192)+datsize, 0);
1853e12c5d1SDavid du Colombier break;
1863e12c5d1SDavid du Colombier case 1:
1873e12c5d1SDavid du Colombier seek(cout, rnd(HEADR+textsize, INITRND)+datsize, 0);
1883e12c5d1SDavid du Colombier break;
1893e12c5d1SDavid du Colombier case 2:
190260f7b65SDavid du Colombier case 5:
1913e12c5d1SDavid du Colombier seek(cout, HEADR+textsize+datsize, 0);
1923e12c5d1SDavid du Colombier break;
1933e12c5d1SDavid du Colombier case 3:
194219b2ee8SDavid du Colombier case 4:
1953e12c5d1SDavid du Colombier debug['s'] = 1;
1963e12c5d1SDavid du Colombier break;
1973e12c5d1SDavid du Colombier }
1983e12c5d1SDavid du Colombier if(!debug['s'])
1993e12c5d1SDavid du Colombier asmsym();
2003e12c5d1SDavid du Colombier if(debug['v'])
2013e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f sp\n", cputime());
2023e12c5d1SDavid du Colombier Bflush(&bso);
2033e12c5d1SDavid du Colombier if(debug['v'])
2043e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f pc\n", cputime());
2053e12c5d1SDavid du Colombier Bflush(&bso);
2063e12c5d1SDavid du Colombier if(!debug['s'])
2073e12c5d1SDavid du Colombier asmlc();
208375daca8SDavid du Colombier if(dlm)
209375daca8SDavid du Colombier asmdyn();
210375daca8SDavid du Colombier cflush();
211375daca8SDavid du Colombier }
212375daca8SDavid du Colombier else if(dlm){
213375daca8SDavid du Colombier seek(cout, HEADR+textsize+datsize, 0);
214375daca8SDavid du Colombier asmdyn();
2153e12c5d1SDavid du Colombier cflush();
2163e12c5d1SDavid du Colombier }
2173e12c5d1SDavid du Colombier if(debug['v'])
2183e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f headr\n", cputime());
2193e12c5d1SDavid du Colombier Bflush(&bso);
2203e12c5d1SDavid du Colombier seek(cout, 0L, 0);
2213e12c5d1SDavid du Colombier switch(HEADTYPE) {
2223e12c5d1SDavid du Colombier default:
2233e12c5d1SDavid du Colombier case 0: /* garbage */
2243e12c5d1SDavid du Colombier lput(0x160L<<16); /* magic and sections */
2253e12c5d1SDavid du Colombier lput(0L); /* time and date */
2263e12c5d1SDavid du Colombier lput(rnd(HEADR+textsize, 4096)+datsize);
2273e12c5d1SDavid du Colombier lput(symsize); /* nsyms */
2283e12c5d1SDavid du Colombier lput((0x38L<<16)|7L); /* size of optional hdr and flags */
2293e12c5d1SDavid du Colombier lput((0413<<16)|0437L); /* magic and version */
2303e12c5d1SDavid du Colombier lput(rnd(HEADR+textsize, 4096));/* sizes */
2313e12c5d1SDavid du Colombier lput(datsize);
2323e12c5d1SDavid du Colombier lput(bsssize);
2333e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */
2343e12c5d1SDavid du Colombier lput(INITTEXT-HEADR); /* va of base of text */
2353e12c5d1SDavid du Colombier lput(INITDAT); /* va of base of data */
2363e12c5d1SDavid du Colombier lput(INITDAT+datsize); /* va of base of bss */
2373e12c5d1SDavid du Colombier lput(~0L); /* gp reg mask */
2383e12c5d1SDavid du Colombier lput(0L);
2393e12c5d1SDavid du Colombier lput(0L);
2403e12c5d1SDavid du Colombier lput(0L);
2413e12c5d1SDavid du Colombier lput(0L);
2423e12c5d1SDavid du Colombier lput(~0L); /* gp value ?? */
2433e12c5d1SDavid du Colombier break;
2443e12c5d1SDavid du Colombier case 1: /* unix coff */
2453e12c5d1SDavid du Colombier /*
2463e12c5d1SDavid du Colombier * file header
2473e12c5d1SDavid du Colombier */
2483e12c5d1SDavid du Colombier lputl(0x0004014c); /* 4 sections, magic */
2493e12c5d1SDavid du Colombier lputl(0); /* unix time stamp */
2503e12c5d1SDavid du Colombier lputl(0); /* symbol table */
2513e12c5d1SDavid du Colombier lputl(0); /* nsyms */
2523e12c5d1SDavid du Colombier lputl(0x0003001c); /* flags, sizeof a.out header */
2533e12c5d1SDavid du Colombier /*
2543e12c5d1SDavid du Colombier * a.out header
2553e12c5d1SDavid du Colombier */
2563e12c5d1SDavid du Colombier lputl(0x10b); /* magic, version stamp */
2573e12c5d1SDavid du Colombier lputl(rnd(textsize, INITRND)); /* text sizes */
2583e12c5d1SDavid du Colombier lputl(datsize); /* data sizes */
2593e12c5d1SDavid du Colombier lputl(bsssize); /* bss sizes */
2603e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */
2613e12c5d1SDavid du Colombier lputl(INITTEXT); /* text start */
2623e12c5d1SDavid du Colombier lputl(INITDAT); /* data start */
2633e12c5d1SDavid du Colombier /*
2643e12c5d1SDavid du Colombier * text section header
2653e12c5d1SDavid du Colombier */
266260f7b65SDavid du Colombier strnput(".text", 8);
2673e12c5d1SDavid du Colombier lputl(HEADR); /* pa */
2683e12c5d1SDavid du Colombier lputl(HEADR); /* va */
2693e12c5d1SDavid du Colombier lputl(textsize); /* text size */
2703e12c5d1SDavid du Colombier lputl(HEADR); /* file offset */
2713e12c5d1SDavid du Colombier lputl(0); /* relocation */
2723e12c5d1SDavid du Colombier lputl(0); /* line numbers */
2733e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */
2743e12c5d1SDavid du Colombier lputl(0x20); /* flags text only */
2753e12c5d1SDavid du Colombier /*
2763e12c5d1SDavid du Colombier * data section header
2773e12c5d1SDavid du Colombier */
278260f7b65SDavid du Colombier strnput(".data", 8);
2793e12c5d1SDavid du Colombier lputl(INITDAT); /* pa */
2803e12c5d1SDavid du Colombier lputl(INITDAT); /* va */
2813e12c5d1SDavid du Colombier lputl(datsize); /* data size */
2823e12c5d1SDavid du Colombier lputl(HEADR+textsize); /* file offset */
2833e12c5d1SDavid du Colombier lputl(0); /* relocation */
2843e12c5d1SDavid du Colombier lputl(0); /* line numbers */
2853e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */
2863e12c5d1SDavid du Colombier lputl(0x40); /* flags data only */
2873e12c5d1SDavid du Colombier /*
2883e12c5d1SDavid du Colombier * bss section header
2893e12c5d1SDavid du Colombier */
290260f7b65SDavid du Colombier strnput(".bss", 8);
2913e12c5d1SDavid du Colombier lputl(INITDAT+datsize); /* pa */
2923e12c5d1SDavid du Colombier lputl(INITDAT+datsize); /* va */
2933e12c5d1SDavid du Colombier lputl(bsssize); /* bss size */
2943e12c5d1SDavid du Colombier lputl(0); /* file offset */
2953e12c5d1SDavid du Colombier lputl(0); /* relocation */
2963e12c5d1SDavid du Colombier lputl(0); /* line numbers */
2973e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */
2983e12c5d1SDavid du Colombier lputl(0x80); /* flags bss only */
2993e12c5d1SDavid du Colombier /*
3003e12c5d1SDavid du Colombier * comment section header
3013e12c5d1SDavid du Colombier */
302260f7b65SDavid du Colombier strnput(".comment", 8);
3033e12c5d1SDavid du Colombier lputl(0); /* pa */
3043e12c5d1SDavid du Colombier lputl(0); /* va */
3053e12c5d1SDavid du Colombier lputl(symsize+lcsize); /* comment size */
3063e12c5d1SDavid du Colombier lputl(HEADR+textsize+datsize); /* file offset */
3073e12c5d1SDavid du Colombier lputl(HEADR+textsize+datsize); /* offset of syms */
3083e12c5d1SDavid du Colombier lputl(HEADR+textsize+datsize+symsize);/* offset of line numbers */
3093e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */
3103e12c5d1SDavid du Colombier lputl(0x200); /* flags comment only */
3113e12c5d1SDavid du Colombier break;
3123e12c5d1SDavid du Colombier case 2: /* plan9 */
3139a747e4fSDavid du Colombier magic = 4*11*11+7;
314375daca8SDavid du Colombier if(dlm)
3159a747e4fSDavid du Colombier magic |= 0x80000000;
3169a747e4fSDavid du Colombier lput(magic); /* magic */
3173e12c5d1SDavid du Colombier lput(textsize); /* sizes */
3183e12c5d1SDavid du Colombier lput(datsize);
3193e12c5d1SDavid du Colombier lput(bsssize);
3203e12c5d1SDavid du Colombier lput(symsize); /* nsyms */
3213e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */
3223e12c5d1SDavid du Colombier lput(spsize); /* sp offsets */
3233e12c5d1SDavid du Colombier lput(lcsize); /* line offsets */
3243e12c5d1SDavid du Colombier break;
3253e12c5d1SDavid du Colombier case 3:
326219b2ee8SDavid du Colombier /* MS-DOS .COM */
327219b2ee8SDavid du Colombier break;
328219b2ee8SDavid du Colombier case 4:
329219b2ee8SDavid du Colombier /* fake MS-DOS .EXE */
330219b2ee8SDavid du Colombier v = rnd(HEADR+textsize, INITRND)+datsize;
331260f7b65SDavid du Colombier wputl(0x5A4D); /* 'MZ' */
332260f7b65SDavid du Colombier wputl(v % 512); /* bytes in last page */
333260f7b65SDavid du Colombier wputl(rnd(v, 512)/512); /* total number of pages */
334260f7b65SDavid du Colombier wputl(0x0000); /* number of reloc items */
335219b2ee8SDavid du Colombier v = rnd(HEADR-(INITTEXT & 0xFFFF), 16);
336260f7b65SDavid du Colombier wputl(v/16); /* size of header */
337260f7b65SDavid du Colombier wputl(0x0000); /* minimum allocation */
338260f7b65SDavid du Colombier wputl(0xFFFF); /* maximum allocation */
339260f7b65SDavid du Colombier wputl(0x0000); /* initial ss value */
340260f7b65SDavid du Colombier wputl(0x0100); /* initial sp value */
341260f7b65SDavid du Colombier wputl(0x0000); /* complemented checksum */
342219b2ee8SDavid du Colombier v = entryvalue();
343260f7b65SDavid du Colombier wputl(v); /* initial ip value (!) */
344260f7b65SDavid du Colombier wputl(0x0000); /* initial cs value */
345260f7b65SDavid du Colombier wputl(0x0000);
346260f7b65SDavid du Colombier wputl(0x0000);
347260f7b65SDavid du Colombier wputl(0x003E); /* reloc table offset */
348260f7b65SDavid du Colombier wputl(0x0000); /* overlay number */
349260f7b65SDavid du Colombier break;
350260f7b65SDavid du Colombier case 5:
351*8153b942SDavid du Colombier elf32(I386, ELFDATA2LSB, 0, nil);
3523e12c5d1SDavid du Colombier break;
3533e12c5d1SDavid du Colombier }
3543e12c5d1SDavid du Colombier cflush();
3553e12c5d1SDavid du Colombier }
3563e12c5d1SDavid du Colombier
3573e12c5d1SDavid du Colombier void
cflush(void)3583e12c5d1SDavid du Colombier cflush(void)
3593e12c5d1SDavid du Colombier {
3603e12c5d1SDavid du Colombier int n;
3613e12c5d1SDavid du Colombier
3623e12c5d1SDavid du Colombier n = sizeof(buf.cbuf) - cbc;
3633e12c5d1SDavid du Colombier if(n)
3643e12c5d1SDavid du Colombier write(cout, buf.cbuf, n);
3653e12c5d1SDavid du Colombier cbp = buf.cbuf;
3663e12c5d1SDavid du Colombier cbc = sizeof(buf.cbuf);
3673e12c5d1SDavid du Colombier }
3683e12c5d1SDavid du Colombier
3693e12c5d1SDavid du Colombier void
datblk(long s,long n)3703e12c5d1SDavid du Colombier datblk(long s, long n)
3713e12c5d1SDavid du Colombier {
3723e12c5d1SDavid du Colombier Prog *p;
3733e12c5d1SDavid du Colombier char *cast;
3743e12c5d1SDavid du Colombier long l, fl, j;
3753e12c5d1SDavid du Colombier int i, c;
3763e12c5d1SDavid du Colombier
3773e12c5d1SDavid du Colombier memset(buf.dbuf, 0, n+Dbufslop);
3783e12c5d1SDavid du Colombier for(p = datap; p != P; p = p->link) {
3793e12c5d1SDavid du Colombier curp = p;
3803e12c5d1SDavid du Colombier l = p->from.sym->value + p->from.offset - s;
3813e12c5d1SDavid du Colombier c = p->from.scale;
3823e12c5d1SDavid du Colombier i = 0;
3833e12c5d1SDavid du Colombier if(l < 0) {
3843e12c5d1SDavid du Colombier if(l+c <= 0)
3853e12c5d1SDavid du Colombier continue;
3863e12c5d1SDavid du Colombier while(l < 0) {
3873e12c5d1SDavid du Colombier l++;
3883e12c5d1SDavid du Colombier i++;
3893e12c5d1SDavid du Colombier }
3903e12c5d1SDavid du Colombier }
3913e12c5d1SDavid du Colombier if(l >= n)
3923e12c5d1SDavid du Colombier continue;
393219b2ee8SDavid du Colombier if(p->as != AINIT && p->as != ADYNT) {
3943e12c5d1SDavid du Colombier for(j=l+(c-i)-1; j>=l; j--)
3953e12c5d1SDavid du Colombier if(buf.dbuf[j]) {
3963e12c5d1SDavid du Colombier print("%P\n", p);
3976b6b9ac8SDavid du Colombier diag("multiple initialization");
3983e12c5d1SDavid du Colombier break;
3993e12c5d1SDavid du Colombier }
400219b2ee8SDavid du Colombier }
4013e12c5d1SDavid du Colombier switch(p->to.type) {
4023e12c5d1SDavid du Colombier case D_FCONST:
4033e12c5d1SDavid du Colombier switch(c) {
4043e12c5d1SDavid du Colombier default:
4053e12c5d1SDavid du Colombier case 4:
4063e12c5d1SDavid du Colombier fl = ieeedtof(&p->to.ieee);
4073e12c5d1SDavid du Colombier cast = (char*)&fl;
4083e12c5d1SDavid du Colombier if(debug['a'] && i == 0) {
4093e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
4103e12c5d1SDavid du Colombier for(j=0; j<c; j++)
4113e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[fnuxi4[j]] & 0xff);
4129a747e4fSDavid du Colombier Bprint(&bso, "\t%P\n", curp);
4133e12c5d1SDavid du Colombier }
4143e12c5d1SDavid du Colombier for(; i<c; i++) {
4153e12c5d1SDavid du Colombier buf.dbuf[l] = cast[fnuxi4[i]];
4163e12c5d1SDavid du Colombier l++;
4173e12c5d1SDavid du Colombier }
4183e12c5d1SDavid du Colombier break;
4193e12c5d1SDavid du Colombier case 8:
4203e12c5d1SDavid du Colombier cast = (char*)&p->to.ieee;
4213e12c5d1SDavid du Colombier if(debug['a'] && i == 0) {
4223e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
4233e12c5d1SDavid du Colombier for(j=0; j<c; j++)
4243e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[fnuxi8[j]] & 0xff);
4259a747e4fSDavid du Colombier Bprint(&bso, "\t%P\n", curp);
4263e12c5d1SDavid du Colombier }
4273e12c5d1SDavid du Colombier for(; i<c; i++) {
4283e12c5d1SDavid du Colombier buf.dbuf[l] = cast[fnuxi8[i]];
4293e12c5d1SDavid du Colombier l++;
4303e12c5d1SDavid du Colombier }
4313e12c5d1SDavid du Colombier break;
4323e12c5d1SDavid du Colombier }
4333e12c5d1SDavid du Colombier break;
4343e12c5d1SDavid du Colombier
4353e12c5d1SDavid du Colombier case D_SCONST:
4363e12c5d1SDavid du Colombier if(debug['a'] && i == 0) {
4373e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
4383e12c5d1SDavid du Colombier for(j=0; j<c; j++)
4393e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff);
4409a747e4fSDavid du Colombier Bprint(&bso, "\t%P\n", curp);
4413e12c5d1SDavid du Colombier }
4423e12c5d1SDavid du Colombier for(; i<c; i++) {
4433e12c5d1SDavid du Colombier buf.dbuf[l] = p->to.scon[i];
4443e12c5d1SDavid du Colombier l++;
4453e12c5d1SDavid du Colombier }
4463e12c5d1SDavid du Colombier break;
4473e12c5d1SDavid du Colombier default:
4483e12c5d1SDavid du Colombier fl = p->to.offset;
4493e12c5d1SDavid du Colombier if(p->to.type == D_ADDR) {
4503e12c5d1SDavid du Colombier if(p->to.index != D_STATIC && p->to.index != D_EXTERN)
4516b6b9ac8SDavid du Colombier diag("DADDR type%P", p);
4523e12c5d1SDavid du Colombier if(p->to.sym) {
453375daca8SDavid du Colombier if(p->to.sym->type == SUNDEF)
454375daca8SDavid du Colombier ckoff(p->to.sym, fl);
4553e12c5d1SDavid du Colombier fl += p->to.sym->value;
4569a747e4fSDavid du Colombier if(p->to.sym->type != STEXT && p->to.sym->type != SUNDEF)
4573e12c5d1SDavid du Colombier fl += INITDAT;
458375daca8SDavid du Colombier if(dlm)
459375daca8SDavid du Colombier dynreloc(p->to.sym, l+s+INITDAT, 1);
4603e12c5d1SDavid du Colombier }
4613e12c5d1SDavid du Colombier }
4623e12c5d1SDavid du Colombier cast = (char*)&fl;
4633e12c5d1SDavid du Colombier switch(c) {
4643e12c5d1SDavid du Colombier default:
4656b6b9ac8SDavid du Colombier diag("bad nuxi %d %d\n%P", c, i, curp);
4663e12c5d1SDavid du Colombier break;
4673e12c5d1SDavid du Colombier case 1:
4683e12c5d1SDavid du Colombier if(debug['a'] && i == 0) {
4693e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
4703e12c5d1SDavid du Colombier for(j=0; j<c; j++)
4713e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi1[j]] & 0xff);
4729a747e4fSDavid du Colombier Bprint(&bso, "\t%P\n", curp);
4733e12c5d1SDavid du Colombier }
4743e12c5d1SDavid du Colombier for(; i<c; i++) {
4753e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi1[i]];
4763e12c5d1SDavid du Colombier l++;
4773e12c5d1SDavid du Colombier }
4783e12c5d1SDavid du Colombier break;
4793e12c5d1SDavid du Colombier case 2:
4803e12c5d1SDavid du Colombier if(debug['a'] && i == 0) {
4813e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
4823e12c5d1SDavid du Colombier for(j=0; j<c; j++)
4833e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi2[j]] & 0xff);
484375daca8SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
4853e12c5d1SDavid du Colombier }
4863e12c5d1SDavid du Colombier for(; i<c; i++) {
4873e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi2[i]];
4883e12c5d1SDavid du Colombier l++;
4893e12c5d1SDavid du Colombier }
4903e12c5d1SDavid du Colombier break;
4913e12c5d1SDavid du Colombier case 4:
4923e12c5d1SDavid du Colombier if(debug['a'] && i == 0) {
4933e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
4943e12c5d1SDavid du Colombier for(j=0; j<c; j++)
4953e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi4[j]] & 0xff);
4969a747e4fSDavid du Colombier Bprint(&bso, "\t%P\n", curp);
4973e12c5d1SDavid du Colombier }
4983e12c5d1SDavid du Colombier for(; i<c; i++) {
4993e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi4[i]];
5003e12c5d1SDavid du Colombier l++;
5013e12c5d1SDavid du Colombier }
5023e12c5d1SDavid du Colombier break;
5033e12c5d1SDavid du Colombier }
5043e12c5d1SDavid du Colombier break;
5053e12c5d1SDavid du Colombier }
5063e12c5d1SDavid du Colombier }
5073e12c5d1SDavid du Colombier write(cout, buf.dbuf, n);
5083e12c5d1SDavid du Colombier }
5093e12c5d1SDavid du Colombier
5103e12c5d1SDavid du Colombier long
rnd(long v,long r)5113e12c5d1SDavid du Colombier rnd(long v, long r)
5123e12c5d1SDavid du Colombier {
5133e12c5d1SDavid du Colombier long c;
5143e12c5d1SDavid du Colombier
5153e12c5d1SDavid du Colombier if(r <= 0)
5163e12c5d1SDavid du Colombier return v;
5173e12c5d1SDavid du Colombier v += r - 1;
5183e12c5d1SDavid du Colombier c = v % r;
5193e12c5d1SDavid du Colombier if(c < 0)
5203e12c5d1SDavid du Colombier c += r;
5213e12c5d1SDavid du Colombier v -= c;
5223e12c5d1SDavid du Colombier return v;
5233e12c5d1SDavid du Colombier }
524