Annotation of researchv10dc/cmd/PDP11/11reloc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * mjm: modified to run on VAX
                      3:  *     added short data type to some variables
                      4:  * relocate command--
                      5:  * 11reloc file [-]octal [ - ]
                      6:  *
                      7:  * relocate object or 11a.out file up in core
                      8:  * by the possibly negated octal number.
                      9:  *
                     10:  * if optional 3rd arg is given,
                     11:  * replace "setd" at start by "nop"
                     12:  */
                     13: 
                     14: short  tbuf[256];      /* mjm */
                     15: short  rbuf[256];      /* mjm */
                     16: int    fin;
                     17: int    fout;
                     18: short  *txtp;          /* mjm */
                     19: short  *relp;          /* mjm */
                     20: long   relloc;
                     21: long   txtloc;
                     22: int    dotdot;
                     23: long   txtsiz;
                     24: unsigned short t1;     /* mjm */
                     25: unsigned short t2;     /* mjm */
                     26: unsigned short t4;     /* mjm */
                     27: unsigned short t7;     /* mjm */
                     28: int    txtw;
                     29: 
                     30: main(argc, argv)
                     31: char *argv[];
                     32: {
                     33:        int sign, c;
                     34: 
                     35:        if (argc<3) {
                     36:        usage:
                     37:                write(1, "11reloc file [-]octal\n", 22);
                     38:                exit(1);
                     39:        }
                     40:        dotdot = 0;
                     41:        if (*argv[2] == '-') {
                     42:                sign = -1;
                     43:                argv[2]++;
                     44:        } else
                     45:                sign = 1;
                     46:        while (*argv[2]) {
                     47:                c = *argv[2]++ - '0';
                     48:                if (c<0 || c>7)
                     49:                        goto usage;
                     50:                dotdot = (dotdot<<3) + c;
                     51:        }
                     52:        dotdot *= sign;
                     53:        if ((fin = open(argv[1], 0)) < 0) {
                     54:                write(1, "File not readable\n", 18);
                     55:                exit(1);
                     56:        }
                     57:        if ((fout = open(argv[1], 1)) < 0) {
                     58:                write(1, "File not writable\n", 18);
                     59:                exit(1);
                     60:        }
                     61:        txtw = read(fin, (char *)tbuf, 512);
                     62:        if (tbuf[0]!=0411 && tbuf[0]!=0410 && tbuf[0]!=0407) {  /* magic */
                     63:                write(1, "Bad format\n", 11);
                     64:                exit(1);
                     65:        }
                     66:        if (tbuf[7] != 0) {             /* relocation? */
                     67:                write (1, "No relocation bits\n", 19);
                     68:                exit(1);
                     69:        }
                     70:        t1 = tbuf[1];
                     71:        t2 = tbuf[2];
                     72:        t4 = tbuf[4];
                     73:        txtloc = 020;
                     74:        if (argc>3 && argv[3][1]=='o') {
                     75:                dotdot += 020;
                     76:                tbuf[0] = 0405; /* old magic */
                     77:                tbuf[1] += tbuf[2];
                     78:                tbuf[2] = 0;
                     79:                tbuf[4] = tbuf[3];
                     80:                tbuf[3] = 0;
                     81:                tbuf[6] = 0240;
                     82:                tbuf[7] = t7 = 0240;
                     83:        }
                     84:        txtsiz = (unsigned)tbuf[1];
                     85:        txtsiz += (unsigned)tbuf[2];
                     86:        relloc = txtloc + txtsiz;
                     87:        txtsiz /= 2;
                     88:        lseek(fin, relloc & ~0777, 0);
                     89:        read(fin, (char *)rbuf, 512);
                     90:        txtp = &tbuf[8];
                     91:        relp = &rbuf[(relloc&0777) >> 1];
                     92:        if (argc>3)             /* nop out "setd" at start */
                     93:                if (tbuf[8] == 0170011)
                     94:                        tbuf[8] = 0240;
                     95:        while(txtsiz--) {
                     96:                switch (*relp & 017) {
                     97: 
                     98:                case 01:        /* pc ref to abs */
                     99:                        *txtp -= dotdot;
                    100:                        break;
                    101: 
                    102:                case 02:        /* ref to text */
                    103:                case 04:                /* ref to data */
                    104:                case 06:                /* ref to bss */
                    105:                        *txtp += dotdot;
                    106: 
                    107:                }
                    108:                advance();
                    109:        }
                    110:        if (txtp != &tbuf[0])
                    111:                write(fout, (char *)&tbuf[0], txtw);
                    112: 
                    113: 
                    114:        txtsiz = t4 / 2;
                    115:        relloc = 020;
                    116:        relloc += t1;
                    117:        relloc += t1;
                    118:        relloc += t2;
                    119:        relloc += t2;
                    120:        lseek(fin, relloc & ~0777, 0);
                    121:        lseek(fout, relloc & ~0777, 0);
                    122:        txtw = read(fin, (char *)tbuf, 512);
                    123:        txtp = &tbuf[(relloc&0777) >> 1] + 4;
                    124:        while((txtsiz -= 6) > 0) {
                    125:                switch(*txtp & 77) {
                    126: 
                    127:                case 2:
                    128:                case 3:
                    129:                case 4:
                    130:                        *(txtp + 1) += dotdot;
                    131:                }
                    132:                adv6();
                    133:        }
                    134:        if(txtp != &tbuf[0])
                    135:                write(fout, (char *)&tbuf[0], txtw);
                    136:        exit(0);
                    137: }
                    138: 
                    139: advance()
                    140: {
                    141:        
                    142:        relp++;
                    143:        relloc += 2;
                    144:        if (relp == &rbuf[256]) {
                    145:                lseek(fin, relloc, 0);
                    146:                read(fin, (char *)&rbuf[0], 512);
                    147:                relp = &rbuf[0];
                    148:        }
                    149:        txtp++;
                    150:        txtloc += 2;
                    151:        if (txtp >= &tbuf[256]) {
                    152:                write(fout, (char *)&tbuf[0], txtw);
                    153:                lseek(fin, txtloc, 0);
                    154:                txtw = read(fin, (char *)&tbuf[0], 512);
                    155:                txtp = &tbuf[0];
                    156:        }
                    157: }
                    158: 
                    159: adv6()
                    160: {
                    161:        txtp += 6;
                    162:        if(txtp >= &tbuf[256]) {
                    163:                write(fout, (char *)tbuf, txtw);
                    164:                txtw = read(fin, (char *)tbuf, 512);
                    165:                txtp -= 256;
                    166:        }
                    167: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.