13e12c5d1SDavid du Colombier #include "l.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier #define Dbufslop 100 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier long 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; 173e12c5d1SDavid du Colombier if(s->type != STEXT) 183e12c5d1SDavid du Colombier diag("entry not text: %s", s->name); 193e12c5d1SDavid du Colombier return s->value; 203e12c5d1SDavid du Colombier } 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier void 23*219b2ee8SDavid du Colombier wput(ushort w) 24*219b2ee8SDavid du Colombier { 25*219b2ee8SDavid du Colombier CPUT(w); 26*219b2ee8SDavid du Colombier CPUT(w>>8); 27*219b2ee8SDavid du Colombier } 28*219b2ee8SDavid du Colombier 29*219b2ee8SDavid du Colombier void 303e12c5d1SDavid du Colombier asmb(void) 313e12c5d1SDavid du Colombier { 323e12c5d1SDavid du Colombier Prog *p; 333e12c5d1SDavid du Colombier long v; 343e12c5d1SDavid du Colombier int a; 353e12c5d1SDavid du Colombier uchar *op1; 363e12c5d1SDavid du Colombier 373e12c5d1SDavid du Colombier if(debug['v']) 383e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f asmb\n", cputime()); 393e12c5d1SDavid du Colombier Bflush(&bso); 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier seek(cout, HEADR, 0); 423e12c5d1SDavid du Colombier pc = INITTEXT; 433e12c5d1SDavid du Colombier curp = firstp; 443e12c5d1SDavid du Colombier for(p = firstp; p != P; p = p->link) { 453e12c5d1SDavid du Colombier if(p->as == ATEXT) 463e12c5d1SDavid du Colombier curtext = p; 473e12c5d1SDavid du Colombier if(p->pc != pc) { 483e12c5d1SDavid du Colombier if(!debug['a']) 493e12c5d1SDavid du Colombier print("%P\n", curp); 503e12c5d1SDavid du Colombier diag("phase error %lux sb %lux in %s\n", p->pc, pc, TNAME); 513e12c5d1SDavid du Colombier pc = p->pc; 523e12c5d1SDavid du Colombier } 533e12c5d1SDavid du Colombier curp = p; 543e12c5d1SDavid du Colombier asmins(p); 553e12c5d1SDavid du Colombier if(cbc < sizeof(and)) 563e12c5d1SDavid du Colombier cflush(); 573e12c5d1SDavid du Colombier a = (andptr - and); 583e12c5d1SDavid du Colombier if(debug['a']) { 593e12c5d1SDavid du Colombier Bprint(&bso, pcstr, pc); 603e12c5d1SDavid du Colombier for(op1 = and; op1 < andptr; op1++) 613e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", *op1 & 0xff); 623e12c5d1SDavid du Colombier Bprint(&bso, "%.*s", (24+7-printcol)/8, "\t\t\t"); 633e12c5d1SDavid du Colombier Bprint(&bso, "%P\n", curp); 643e12c5d1SDavid du Colombier } 653e12c5d1SDavid du Colombier memmove(cbp, and, a); 663e12c5d1SDavid du Colombier cbp += a; 673e12c5d1SDavid du Colombier pc += a; 683e12c5d1SDavid du Colombier cbc -= a; 693e12c5d1SDavid du Colombier } 703e12c5d1SDavid du Colombier cflush(); 713e12c5d1SDavid du Colombier switch(HEADTYPE) { 723e12c5d1SDavid du Colombier default: 733e12c5d1SDavid du Colombier diag("unknown header type %d\n", HEADTYPE); 743e12c5d1SDavid du Colombier case 0: 753e12c5d1SDavid du Colombier seek(cout, rnd(HEADR+textsize, 8192), 0); 763e12c5d1SDavid du Colombier break; 773e12c5d1SDavid du Colombier case 1: 783e12c5d1SDavid du Colombier textsize = rnd(HEADR+textsize, 4096)-HEADR; 793e12c5d1SDavid du Colombier seek(cout, textsize+HEADR, 0); 803e12c5d1SDavid du Colombier break; 813e12c5d1SDavid du Colombier case 2: 823e12c5d1SDavid du Colombier seek(cout, HEADR+textsize, 0); 833e12c5d1SDavid du Colombier break; 843e12c5d1SDavid du Colombier case 3: 85*219b2ee8SDavid du Colombier case 4: 863e12c5d1SDavid du Colombier seek(cout, HEADR+rnd(textsize, INITRND), 0); 873e12c5d1SDavid du Colombier break; 883e12c5d1SDavid du Colombier } 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier if(debug['v']) 913e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f datblk\n", cputime()); 923e12c5d1SDavid du Colombier Bflush(&bso); 933e12c5d1SDavid du Colombier for(v = 0; v < datsize; v += sizeof(buf)-Dbufslop) { 943e12c5d1SDavid du Colombier if(datsize-v > sizeof(buf)-Dbufslop) 953e12c5d1SDavid du Colombier datblk(v, sizeof(buf)-Dbufslop); 963e12c5d1SDavid du Colombier else 973e12c5d1SDavid du Colombier datblk(v, datsize-v); 983e12c5d1SDavid du Colombier } 993e12c5d1SDavid du Colombier 1003e12c5d1SDavid du Colombier symsize = 0; 1013e12c5d1SDavid du Colombier spsize = 0; 1023e12c5d1SDavid du Colombier lcsize = 0; 1033e12c5d1SDavid du Colombier if(!debug['s']) { 1043e12c5d1SDavid du Colombier if(debug['v']) 1053e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f sym\n", cputime()); 1063e12c5d1SDavid du Colombier Bflush(&bso); 1073e12c5d1SDavid du Colombier switch(HEADTYPE) { 1083e12c5d1SDavid du Colombier default: 1093e12c5d1SDavid du Colombier case 0: 1103e12c5d1SDavid du Colombier seek(cout, rnd(HEADR+textsize, 8192)+datsize, 0); 1113e12c5d1SDavid du Colombier break; 1123e12c5d1SDavid du Colombier case 1: 1133e12c5d1SDavid du Colombier seek(cout, rnd(HEADR+textsize, INITRND)+datsize, 0); 1143e12c5d1SDavid du Colombier break; 1153e12c5d1SDavid du Colombier case 2: 1163e12c5d1SDavid du Colombier seek(cout, HEADR+textsize+datsize, 0); 1173e12c5d1SDavid du Colombier break; 1183e12c5d1SDavid du Colombier case 3: 119*219b2ee8SDavid du Colombier case 4: 1203e12c5d1SDavid du Colombier debug['s'] = 1; 1213e12c5d1SDavid du Colombier break; 1223e12c5d1SDavid du Colombier } 1233e12c5d1SDavid du Colombier if(!debug['s']) 1243e12c5d1SDavid du Colombier asmsym(); 1253e12c5d1SDavid du Colombier if(debug['v']) 1263e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f sp\n", cputime()); 1273e12c5d1SDavid du Colombier Bflush(&bso); 1283e12c5d1SDavid du Colombier if(debug['v']) 1293e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f pc\n", cputime()); 1303e12c5d1SDavid du Colombier Bflush(&bso); 1313e12c5d1SDavid du Colombier if(!debug['s']) 1323e12c5d1SDavid du Colombier asmlc(); 1333e12c5d1SDavid du Colombier cflush(); 1343e12c5d1SDavid du Colombier } 1353e12c5d1SDavid du Colombier if(debug['v']) 1363e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f headr\n", cputime()); 1373e12c5d1SDavid du Colombier Bflush(&bso); 1383e12c5d1SDavid du Colombier seek(cout, 0L, 0); 1393e12c5d1SDavid du Colombier switch(HEADTYPE) { 1403e12c5d1SDavid du Colombier default: 1413e12c5d1SDavid du Colombier case 0: /* garbage */ 1423e12c5d1SDavid du Colombier lput(0x160L<<16); /* magic and sections */ 1433e12c5d1SDavid du Colombier lput(0L); /* time and date */ 1443e12c5d1SDavid du Colombier lput(rnd(HEADR+textsize, 4096)+datsize); 1453e12c5d1SDavid du Colombier lput(symsize); /* nsyms */ 1463e12c5d1SDavid du Colombier lput((0x38L<<16)|7L); /* size of optional hdr and flags */ 1473e12c5d1SDavid du Colombier lput((0413<<16)|0437L); /* magic and version */ 1483e12c5d1SDavid du Colombier lput(rnd(HEADR+textsize, 4096)); /* sizes */ 1493e12c5d1SDavid du Colombier lput(datsize); 1503e12c5d1SDavid du Colombier lput(bsssize); 1513e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */ 1523e12c5d1SDavid du Colombier lput(INITTEXT-HEADR); /* va of base of text */ 1533e12c5d1SDavid du Colombier lput(INITDAT); /* va of base of data */ 1543e12c5d1SDavid du Colombier lput(INITDAT+datsize); /* va of base of bss */ 1553e12c5d1SDavid du Colombier lput(~0L); /* gp reg mask */ 1563e12c5d1SDavid du Colombier lput(0L); 1573e12c5d1SDavid du Colombier lput(0L); 1583e12c5d1SDavid du Colombier lput(0L); 1593e12c5d1SDavid du Colombier lput(0L); 1603e12c5d1SDavid du Colombier lput(~0L); /* gp value ?? */ 1613e12c5d1SDavid du Colombier break; 1623e12c5d1SDavid du Colombier lputl(0); /* x */ 1633e12c5d1SDavid du Colombier case 1: /* unix coff */ 1643e12c5d1SDavid du Colombier /* 1653e12c5d1SDavid du Colombier * file header 1663e12c5d1SDavid du Colombier */ 1673e12c5d1SDavid du Colombier lputl(0x0004014c); /* 4 sections, magic */ 1683e12c5d1SDavid du Colombier lputl(0); /* unix time stamp */ 1693e12c5d1SDavid du Colombier lputl(0); /* symbol table */ 1703e12c5d1SDavid du Colombier lputl(0); /* nsyms */ 1713e12c5d1SDavid du Colombier lputl(0x0003001c); /* flags, sizeof a.out header */ 1723e12c5d1SDavid du Colombier /* 1733e12c5d1SDavid du Colombier * a.out header 1743e12c5d1SDavid du Colombier */ 1753e12c5d1SDavid du Colombier lputl(0x10b); /* magic, version stamp */ 1763e12c5d1SDavid du Colombier lputl(rnd(textsize, INITRND)); /* text sizes */ 1773e12c5d1SDavid du Colombier lputl(datsize); /* data sizes */ 1783e12c5d1SDavid du Colombier lputl(bsssize); /* bss sizes */ 1793e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */ 1803e12c5d1SDavid du Colombier lputl(INITTEXT); /* text start */ 1813e12c5d1SDavid du Colombier lputl(INITDAT); /* data start */ 1823e12c5d1SDavid du Colombier /* 1833e12c5d1SDavid du Colombier * text section header 1843e12c5d1SDavid du Colombier */ 1853e12c5d1SDavid du Colombier s8put(".text"); 1863e12c5d1SDavid du Colombier lputl(HEADR); /* pa */ 1873e12c5d1SDavid du Colombier lputl(HEADR); /* va */ 1883e12c5d1SDavid du Colombier lputl(textsize); /* text size */ 1893e12c5d1SDavid du Colombier lputl(HEADR); /* file offset */ 1903e12c5d1SDavid du Colombier lputl(0); /* relocation */ 1913e12c5d1SDavid du Colombier lputl(0); /* line numbers */ 1923e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */ 1933e12c5d1SDavid du Colombier lputl(0x20); /* flags text only */ 1943e12c5d1SDavid du Colombier /* 1953e12c5d1SDavid du Colombier * data section header 1963e12c5d1SDavid du Colombier */ 1973e12c5d1SDavid du Colombier s8put(".data"); 1983e12c5d1SDavid du Colombier lputl(INITDAT); /* pa */ 1993e12c5d1SDavid du Colombier lputl(INITDAT); /* va */ 2003e12c5d1SDavid du Colombier lputl(datsize); /* data size */ 2013e12c5d1SDavid du Colombier lputl(HEADR+textsize); /* file offset */ 2023e12c5d1SDavid du Colombier lputl(0); /* relocation */ 2033e12c5d1SDavid du Colombier lputl(0); /* line numbers */ 2043e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */ 2053e12c5d1SDavid du Colombier lputl(0x40); /* flags data only */ 2063e12c5d1SDavid du Colombier /* 2073e12c5d1SDavid du Colombier * bss section header 2083e12c5d1SDavid du Colombier */ 2093e12c5d1SDavid du Colombier s8put(".bss"); 2103e12c5d1SDavid du Colombier lputl(INITDAT+datsize); /* pa */ 2113e12c5d1SDavid du Colombier lputl(INITDAT+datsize); /* va */ 2123e12c5d1SDavid du Colombier lputl(bsssize); /* bss size */ 2133e12c5d1SDavid du Colombier lputl(0); /* file offset */ 2143e12c5d1SDavid du Colombier lputl(0); /* relocation */ 2153e12c5d1SDavid du Colombier lputl(0); /* line numbers */ 2163e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */ 2173e12c5d1SDavid du Colombier lputl(0x80); /* flags bss only */ 2183e12c5d1SDavid du Colombier /* 2193e12c5d1SDavid du Colombier * comment section header 2203e12c5d1SDavid du Colombier */ 2213e12c5d1SDavid du Colombier s8put(".comment"); 2223e12c5d1SDavid du Colombier lputl(0); /* pa */ 2233e12c5d1SDavid du Colombier lputl(0); /* va */ 2243e12c5d1SDavid du Colombier lputl(symsize+lcsize); /* comment size */ 2253e12c5d1SDavid du Colombier lputl(HEADR+textsize+datsize); /* file offset */ 2263e12c5d1SDavid du Colombier lputl(HEADR+textsize+datsize); /* offset of syms */ 2273e12c5d1SDavid du Colombier lputl(HEADR+textsize+datsize+symsize);/* offset of line numbers */ 2283e12c5d1SDavid du Colombier lputl(0); /* relocation, line numbers */ 2293e12c5d1SDavid du Colombier lputl(0x200); /* flags comment only */ 2303e12c5d1SDavid du Colombier break; 2313e12c5d1SDavid du Colombier case 2: /* plan9 */ 2323e12c5d1SDavid du Colombier lput(4*11*11+7); /* magic */ 2333e12c5d1SDavid du Colombier lput(textsize); /* sizes */ 2343e12c5d1SDavid du Colombier lput(datsize); 2353e12c5d1SDavid du Colombier lput(bsssize); 2363e12c5d1SDavid du Colombier lput(symsize); /* nsyms */ 2373e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */ 2383e12c5d1SDavid du Colombier lput(spsize); /* sp offsets */ 2393e12c5d1SDavid du Colombier lput(lcsize); /* line offsets */ 2403e12c5d1SDavid du Colombier break; 2413e12c5d1SDavid du Colombier case 3: 242*219b2ee8SDavid du Colombier /* MS-DOS .COM */ 243*219b2ee8SDavid du Colombier break; 244*219b2ee8SDavid du Colombier case 4: 245*219b2ee8SDavid du Colombier /* fake MS-DOS .EXE */ 246*219b2ee8SDavid du Colombier v = rnd(HEADR+textsize, INITRND)+datsize; 247*219b2ee8SDavid du Colombier wput(0x5A4D); /* 'MZ' */ 248*219b2ee8SDavid du Colombier wput(v % 512); /* bytes in last page */ 249*219b2ee8SDavid du Colombier wput(rnd(v, 512)/512); /* total number of pages */ 250*219b2ee8SDavid du Colombier wput(0x0000); /* number of reloc items */ 251*219b2ee8SDavid du Colombier v = rnd(HEADR-(INITTEXT & 0xFFFF), 16); 252*219b2ee8SDavid du Colombier wput(v/16); /* size of header */ 253*219b2ee8SDavid du Colombier wput(0x0000); /* minimum allocation */ 254*219b2ee8SDavid du Colombier wput(0xFFFF); /* maximum allocation */ 255*219b2ee8SDavid du Colombier wput(0x0000); /* initial ss value */ 256*219b2ee8SDavid du Colombier wput(0x0100); /* initial sp value */ 257*219b2ee8SDavid du Colombier wput(0x0000); /* complemented checksum */ 258*219b2ee8SDavid du Colombier v = entryvalue(); 259*219b2ee8SDavid du Colombier wput(v); /* initial ip value (!) */ 260*219b2ee8SDavid du Colombier wput(0x0000); /* initial cs value */ 261*219b2ee8SDavid du Colombier wput(0x0000); 262*219b2ee8SDavid du Colombier wput(0x0000); 263*219b2ee8SDavid du Colombier wput(0x003E); /* reloc table offset */ 264*219b2ee8SDavid du Colombier wput(0x0000); /* overlay number */ 2653e12c5d1SDavid du Colombier break; 2663e12c5d1SDavid du Colombier } 2673e12c5d1SDavid du Colombier cflush(); 2683e12c5d1SDavid du Colombier } 2693e12c5d1SDavid du Colombier 2703e12c5d1SDavid du Colombier void 2713e12c5d1SDavid du Colombier lput(long l) 2723e12c5d1SDavid du Colombier { 2733e12c5d1SDavid du Colombier 2743e12c5d1SDavid du Colombier CPUT(l>>24) 2753e12c5d1SDavid du Colombier CPUT(l>>16) 2763e12c5d1SDavid du Colombier CPUT(l>>8) 2773e12c5d1SDavid du Colombier CPUT(l) 2783e12c5d1SDavid du Colombier } 2793e12c5d1SDavid du Colombier 2803e12c5d1SDavid du Colombier void 2813e12c5d1SDavid du Colombier lputl(long l) 2823e12c5d1SDavid du Colombier { 2833e12c5d1SDavid du Colombier 2843e12c5d1SDavid du Colombier CPUT(l) 2853e12c5d1SDavid du Colombier CPUT(l>>8) 2863e12c5d1SDavid du Colombier CPUT(l>>16) 2873e12c5d1SDavid du Colombier CPUT(l>>24) 2883e12c5d1SDavid du Colombier } 2893e12c5d1SDavid du Colombier 2903e12c5d1SDavid du Colombier void 2913e12c5d1SDavid du Colombier s8put(char *n) 2923e12c5d1SDavid du Colombier { 2933e12c5d1SDavid du Colombier char name[8]; 2943e12c5d1SDavid du Colombier int i; 2953e12c5d1SDavid du Colombier 2963e12c5d1SDavid du Colombier strncpy(name, n, sizeof(name)); 2973e12c5d1SDavid du Colombier for(i=0; i<sizeof(name); i++) 2983e12c5d1SDavid du Colombier CPUT(name[i]) 2993e12c5d1SDavid du Colombier } 3003e12c5d1SDavid du Colombier 3013e12c5d1SDavid du Colombier void 3023e12c5d1SDavid du Colombier cflush(void) 3033e12c5d1SDavid du Colombier { 3043e12c5d1SDavid du Colombier int n; 3053e12c5d1SDavid du Colombier 3063e12c5d1SDavid du Colombier n = sizeof(buf.cbuf) - cbc; 3073e12c5d1SDavid du Colombier if(n) 3083e12c5d1SDavid du Colombier write(cout, buf.cbuf, n); 3093e12c5d1SDavid du Colombier cbp = buf.cbuf; 3103e12c5d1SDavid du Colombier cbc = sizeof(buf.cbuf); 3113e12c5d1SDavid du Colombier } 3123e12c5d1SDavid du Colombier 3133e12c5d1SDavid du Colombier void 3143e12c5d1SDavid du Colombier datblk(long s, long n) 3153e12c5d1SDavid du Colombier { 3163e12c5d1SDavid du Colombier Prog *p; 3173e12c5d1SDavid du Colombier char *cast; 3183e12c5d1SDavid du Colombier long l, fl, j; 3193e12c5d1SDavid du Colombier int i, c; 3203e12c5d1SDavid du Colombier 3213e12c5d1SDavid du Colombier memset(buf.dbuf, 0, n+Dbufslop); 3223e12c5d1SDavid du Colombier for(p = datap; p != P; p = p->link) { 3233e12c5d1SDavid du Colombier curp = p; 3243e12c5d1SDavid du Colombier l = p->from.sym->value + p->from.offset - s; 3253e12c5d1SDavid du Colombier c = p->from.scale; 3263e12c5d1SDavid du Colombier i = 0; 3273e12c5d1SDavid du Colombier if(l < 0) { 3283e12c5d1SDavid du Colombier if(l+c <= 0) 3293e12c5d1SDavid du Colombier continue; 3303e12c5d1SDavid du Colombier while(l < 0) { 3313e12c5d1SDavid du Colombier l++; 3323e12c5d1SDavid du Colombier i++; 3333e12c5d1SDavid du Colombier } 3343e12c5d1SDavid du Colombier } 3353e12c5d1SDavid du Colombier if(l >= n) 3363e12c5d1SDavid du Colombier continue; 337*219b2ee8SDavid du Colombier if(p->as != AINIT && p->as != ADYNT) { 3383e12c5d1SDavid du Colombier for(j=l+(c-i)-1; j>=l; j--) 3393e12c5d1SDavid du Colombier if(buf.dbuf[j]) { 3403e12c5d1SDavid du Colombier print("%P\n", p); 3413e12c5d1SDavid du Colombier diag("multiple initialization\n"); 3423e12c5d1SDavid du Colombier break; 3433e12c5d1SDavid du Colombier } 344*219b2ee8SDavid du Colombier } 3453e12c5d1SDavid du Colombier switch(p->to.type) { 3463e12c5d1SDavid du Colombier case D_FCONST: 3473e12c5d1SDavid du Colombier switch(c) { 3483e12c5d1SDavid du Colombier default: 3493e12c5d1SDavid du Colombier case 4: 3503e12c5d1SDavid du Colombier fl = ieeedtof(&p->to.ieee); 3513e12c5d1SDavid du Colombier cast = (char*)&fl; 3523e12c5d1SDavid du Colombier if(debug['a'] && i == 0) { 3533e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT); 3543e12c5d1SDavid du Colombier for(j=0; j<c; j++) 3553e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[fnuxi4[j]] & 0xff); 3563e12c5d1SDavid du Colombier Bprint(&bso, "%.*s", (24+7-printcol)/8, "\t\t\t"); 3573e12c5d1SDavid du Colombier Bprint(&bso, "%P\n", curp); 3583e12c5d1SDavid du Colombier } 3593e12c5d1SDavid du Colombier for(; i<c; i++) { 3603e12c5d1SDavid du Colombier buf.dbuf[l] = cast[fnuxi4[i]]; 3613e12c5d1SDavid du Colombier l++; 3623e12c5d1SDavid du Colombier } 3633e12c5d1SDavid du Colombier break; 3643e12c5d1SDavid du Colombier case 8: 3653e12c5d1SDavid du Colombier cast = (char*)&p->to.ieee; 3663e12c5d1SDavid du Colombier if(debug['a'] && i == 0) { 3673e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT); 3683e12c5d1SDavid du Colombier for(j=0; j<c; j++) 3693e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[fnuxi8[j]] & 0xff); 3703e12c5d1SDavid du Colombier Bprint(&bso, "%.*s", (24+7-printcol)/8, "\t\t\t"); 3713e12c5d1SDavid du Colombier Bprint(&bso, "%P\n", curp); 3723e12c5d1SDavid du Colombier } 3733e12c5d1SDavid du Colombier for(; i<c; i++) { 3743e12c5d1SDavid du Colombier buf.dbuf[l] = cast[fnuxi8[i]]; 3753e12c5d1SDavid du Colombier l++; 3763e12c5d1SDavid du Colombier } 3773e12c5d1SDavid du Colombier break; 3783e12c5d1SDavid du Colombier } 3793e12c5d1SDavid du Colombier break; 3803e12c5d1SDavid du Colombier 3813e12c5d1SDavid du Colombier case D_SCONST: 3823e12c5d1SDavid du Colombier if(debug['a'] && i == 0) { 3833e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT); 3843e12c5d1SDavid du Colombier for(j=0; j<c; j++) 3853e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff); 3863e12c5d1SDavid du Colombier Bprint(&bso, "%.*s", (24+7-printcol)/8, "\t\t\t"); 3873e12c5d1SDavid du Colombier Bprint(&bso, "%P\n", curp); 3883e12c5d1SDavid du Colombier } 3893e12c5d1SDavid du Colombier for(; i<c; i++) { 3903e12c5d1SDavid du Colombier buf.dbuf[l] = p->to.scon[i]; 3913e12c5d1SDavid du Colombier l++; 3923e12c5d1SDavid du Colombier } 3933e12c5d1SDavid du Colombier break; 3943e12c5d1SDavid du Colombier default: 3953e12c5d1SDavid du Colombier fl = p->to.offset; 3963e12c5d1SDavid du Colombier if(p->to.type == D_ADDR) { 3973e12c5d1SDavid du Colombier if(p->to.index != D_STATIC && p->to.index != D_EXTERN) 3983e12c5d1SDavid du Colombier diag("DADDR type%P\n", p); 3993e12c5d1SDavid du Colombier if(p->to.sym) { 4003e12c5d1SDavid du Colombier fl += p->to.sym->value; 4013e12c5d1SDavid du Colombier if(p->to.sym->type != STEXT) 4023e12c5d1SDavid du Colombier fl += INITDAT; 4033e12c5d1SDavid du Colombier } 4043e12c5d1SDavid du Colombier } 4053e12c5d1SDavid du Colombier cast = (char*)&fl; 4063e12c5d1SDavid du Colombier switch(c) { 4073e12c5d1SDavid du Colombier default: 4083e12c5d1SDavid du Colombier diag("bad nuxi %d %d\n%P\n", c, i, curp); 4093e12c5d1SDavid du Colombier break; 4103e12c5d1SDavid du Colombier case 1: 4113e12c5d1SDavid du Colombier if(debug['a'] && i == 0) { 4123e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT); 4133e12c5d1SDavid du Colombier for(j=0; j<c; j++) 4143e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi1[j]] & 0xff); 4153e12c5d1SDavid du Colombier Bprint(&bso, "%.*s", (24+7-printcol)/8, "\t\t\t"); 4163e12c5d1SDavid du Colombier Bprint(&bso, "%P\n", curp); 4173e12c5d1SDavid du Colombier } 4183e12c5d1SDavid du Colombier for(; i<c; i++) { 4193e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi1[i]]; 4203e12c5d1SDavid du Colombier l++; 4213e12c5d1SDavid du Colombier } 4223e12c5d1SDavid du Colombier break; 4233e12c5d1SDavid du Colombier case 2: 4243e12c5d1SDavid du Colombier if(debug['a'] && i == 0) { 4253e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT); 4263e12c5d1SDavid du Colombier for(j=0; j<c; j++) 4273e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi2[j]] & 0xff); 4283e12c5d1SDavid du Colombier Bprint(&bso, "%.*s", (24+7-printcol)/8, "\t\t\t"); 4293e12c5d1SDavid du Colombier Bprint(&bso, "%P\n", curp); 4303e12c5d1SDavid du Colombier } 4313e12c5d1SDavid du Colombier for(; i<c; i++) { 4323e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi2[i]]; 4333e12c5d1SDavid du Colombier l++; 4343e12c5d1SDavid du Colombier } 4353e12c5d1SDavid du Colombier break; 4363e12c5d1SDavid du Colombier case 4: 4373e12c5d1SDavid du Colombier if(debug['a'] && i == 0) { 4383e12c5d1SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT); 4393e12c5d1SDavid du Colombier for(j=0; j<c; j++) 4403e12c5d1SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi4[j]] & 0xff); 4413e12c5d1SDavid du Colombier Bprint(&bso, "%.*s", (24+7-printcol)/8, "\t\t\t"); 4423e12c5d1SDavid du Colombier Bprint(&bso, "%P\n", curp); 4433e12c5d1SDavid du Colombier } 4443e12c5d1SDavid du Colombier for(; i<c; i++) { 4453e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi4[i]]; 4463e12c5d1SDavid du Colombier l++; 4473e12c5d1SDavid du Colombier } 4483e12c5d1SDavid du Colombier break; 4493e12c5d1SDavid du Colombier } 4503e12c5d1SDavid du Colombier break; 4513e12c5d1SDavid du Colombier } 4523e12c5d1SDavid du Colombier } 4533e12c5d1SDavid du Colombier write(cout, buf.dbuf, n); 4543e12c5d1SDavid du Colombier } 4553e12c5d1SDavid du Colombier 4563e12c5d1SDavid du Colombier long 4573e12c5d1SDavid du Colombier rnd(long v, long r) 4583e12c5d1SDavid du Colombier { 4593e12c5d1SDavid du Colombier long c; 4603e12c5d1SDavid du Colombier 4613e12c5d1SDavid du Colombier if(r <= 0) 4623e12c5d1SDavid du Colombier return v; 4633e12c5d1SDavid du Colombier v += r - 1; 4643e12c5d1SDavid du Colombier c = v % r; 4653e12c5d1SDavid du Colombier if(c < 0) 4663e12c5d1SDavid du Colombier c += r; 4673e12c5d1SDavid du Colombier v -= c; 4683e12c5d1SDavid du Colombier return v; 4693e12c5d1SDavid du Colombier } 470