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