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
  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: }

Defined functions

start defined in line 14; used 1 times

Defined variables

sccsid defined in line 2; never used

Defined macros

MAXARGS defined in line 13; used 2 times
  • in line 18(2)
Last modified: 1984-05-06
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 731
Valid CSS Valid XHTML 1.0 Strict