Annotation of researchv10no/cmd/compat/unixstart.c, revision 1.1

1.1     ! root        1: #
        !             2: /*     Start up a version 6 or version 7 pdp-11 UNIX compatability mode
        !             3:  *     program. Must set up the memory layout with args etc.
        !             4:  *     Art Wetzel      August 1979
        !             5:  */
        !             6: #include <stdio.h>
        !             7: #include "defs.h"
        !             8: #define        MAXARGS 100
        !             9: start(argv, envp) unsigned char **argv, **envp; {
        !            10:        register unsigned char *sp, *ap;
        !            11:        register unsigned short *ssp;
        !            12:        register int i, argc, envc;
        !            13:        unsigned char *envps[MAXARGS], *argps[MAXARGS], **av, *p1, *p2;
        !            14:        extern unsigned char *progname, *nameend;
        !            15:        /* set up initial memory layout for unix */
        !            16:        /* set stack pointer to top of memory */
        !            17:        sp = memsiz;
        !            18: #ifdef V7UNIX
        !            19:        /* zero top 2 bytes */
        !            20:        *(--sp) = 0;
        !            21:        *(--sp) = 0;
        !            22:        /* point to environment pointer list */
        !            23:        av = envp;
        !            24:        envc = 0;
        !            25:        /* count up number of env elements */
        !            26:        while(*(av++)) envc++;
        !            27:        /* last UNIX V7 env ptr is 0 */
        !            28:        envps[envc] = (unsigned char *)0;
        !            29:        /* copy actual environment (assume byte text) - last first */
        !            30:        for(i=envc-1; i>=0; i--) {
        !            31:                ap = envp[i];
        !            32:                while(*(ap++)) ;
        !            33:                while(ap != envp[i]) *(--sp) = *(--ap);
        !            34:                /* force stack word alignment - required per arg in v7 */
        !            35:                if((int)sp & 1) {
        !            36:                        ap = sp--;
        !            37:                        while((*(ap-1) = *ap)) ap++;
        !            38:                }
        !            39:                envps[i] = sp;
        !            40:        }
        !            41: #endif
        !            42:        /* point to argument pointer list */
        !            43:        av = argv;
        !            44:        argc = 0;
        !            45:        /* count up number of args */
        !            46:        while(*(av++)) argc++;
        !            47: #ifdef V7UNIX
        !            48:        /* last UNIX V7 arg ptr is 0 */
        !            49:        argps[argc] = (unsigned char *)0;
        !            50: #endif
        !            51: #ifdef V6UNIX
        !            52:        /* last UNIX V6 arg ptr is -1 */
        !            53:        argps[argc] = (unsigned char *)-1;
        !            54: #endif
        !            55:        /* copy actual arguments (assume byte text) - last first */
        !            56:        for(i=argc-1; i>=0; i--) {
        !            57:                ap = argv[i];
        !            58:                while(*(ap++)) ;
        !            59:                while(ap != argv[i]) *(--sp) = *(--ap);
        !            60:                /* force stack word alignment - required per arg in v7 */
        !            61:                if((int)sp & 1) {
        !            62:                        ap = sp--;
        !            63:                        while((*(ap-1) = *ap)) ap++;
        !            64:                }
        !            65:                argps[i] = sp;
        !            66:        }
        !            67:        ssp = (unsigned short *)sp;
        !            68: #ifdef V7UNIX
        !            69:        /* clear a word */
        !            70:        *(--ssp) = 0;
        !            71:        /* set up environment pointers */
        !            72:        for(i=envc; i>=0; i--) {
        !            73:                *(--ssp) = (short)(long)envps[i];
        !            74:        }
        !            75:        /* clear another word */
        !            76:        *(--ssp) = 0;
        !            77: #endif
        !            78:        /* set up argument pointers */
        !            79:        for(i=argc; i>=0; i--) {
        !            80:                *(--ssp) = (short)(long)argps[i];
        !            81:        }
        !            82:        /* then argument count */
        !            83:        *(--ssp) = argc;
        !            84:        /* set up stack pointer */
        !            85:        regs[6] = (int)ssp;
        !            86:        /* set up a psl with cleared condition codes */
        !            87:        psl = 0x83c00000;
        !            88:        /* copy out part of the program name and args where ps can get them */
        !            89:        /* flag it with a * so it shows up as a compatability mode process */
        !            90:        /* check for case with no env and reset nameend */
        !            91:        if(nameend < progname) nameend = (unsigned char *)2147483647;
        !            92:        for(p1=progname, *p1++ = '*', i=1, p2=argv[0]; p1<nameend; p1++) {
        !            93:                if((*p1 = *p2))
        !            94:                        p2++;
        !            95:                else if(argv[i])
        !            96:                        p2 = argv[i++];
        !            97:                else break;
        !            98:        }
        !            99:        while(p1 < nameend) *p1++ = ' ';
        !           100:        *p1 = 0;
        !           101:        /* clear out registers other than sp */
        !           102:        regs[0] = 0;
        !           103:        regs[1] = 0;
        !           104:        regs[2] = 0;
        !           105:        regs[3] = 0;
        !           106:        regs[4] = 0;
        !           107:        regs[5] = 0;
        !           108:        /* finally get around to actually starting up in compatability mode */
        !           109:        incompat++;
        !           110:        compat();
        !           111: }

unix.superglobalmegacorp.com

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