1 #ifndef lint
2 static char sccsid[] = " unixstart.c 4.2 84/05/05 ";
3 #endif
4
5 /* From Lou Salkind: compat/RCS/unixstart.c,v 1.2 84/01/31 13:34:27 */
6
7 /* Start up a version 6 or version 7 pdp-11 UNIX compatability mode
8 * program. Must set up the memory layout with args etc.
9 * Art Wetzel August 1979
10 */
11 #include <stdio.h>
12 #include "defs.h"
13 #define MAXARGS 100
start(argv,envp)14 start(argv, envp) unsigned char **argv, **envp; {
15 register unsigned char *sp, *ap;
16 register unsigned short *ssp;
17 register int i, argc, envc;
18 unsigned char *envps[MAXARGS], *argps[MAXARGS], **av, *p1, *p2;
19 extern unsigned char *progname, *nameend;
20 /* set up initial memory layout for unix */
21 /* set stack pointer to top of memory */
22 sp = memsiz;
23 #ifdef V7UNIX
24 /* zero top 2 bytes */
25 *(--sp) = 0;
26 *(--sp) = 0;
27 /* point to environment pointer list */
28 av = envp;
29 envc = 0;
30 /* count up number of env elements */
31 while(*(av++)) envc++;
32 /* last UNIX V7 env ptr is 0 */
33 envps[envc] = (unsigned char *)0;
34 /* copy actual environment (assume byte text) - last first */
35 for(i=envc-1; i>=0; i--) {
36 ap = envp[i];
37 while(*(ap++)) ;
38 while(ap != envp[i]) *(--sp) = *(--ap);
39 /* force stack word alignment - required per arg in v7 */
40 if((int)sp & 1) {
41 ap = sp--;
42 while((*(ap-1) = *ap)) ap++;
43 }
44 envps[i] = sp;
45 }
46 #endif
47 /* point to argument pointer list */
48 av = argv;
49 argc = 0;
50 /* count up number of args */
51 while(*(av++)) argc++;
52 #ifdef V7UNIX
53 /* last UNIX V7 arg ptr is 0 */
54 argps[argc] = (unsigned char *)0;
55 #endif
56 #ifdef V6UNIX
57 /* last UNIX V6 arg ptr is -1 */
58 argps[argc] = (unsigned char *)-1;
59 #endif
60 /* copy actual arguments (assume byte text) - last first */
61 for(i=argc-1; i>=0; i--) {
62 ap = argv[i];
63 while(*(ap++)) ;
64 while(ap != argv[i]) *(--sp) = *(--ap);
65 /* force stack word alignment - required per arg in v7 */
66 if((int)sp & 1) {
67 ap = sp--;
68 while((*(ap-1) = *ap)) ap++;
69 }
70 argps[i] = sp;
71 }
72 ssp = (unsigned short *)sp;
73 #ifdef V7UNIX
74 /* set up environment pointers */
75 for(i=envc; i>=0; i--) {
76 *(--ssp) = (short)(long)envps[i];
77 }
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