|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.