|
|
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.