1: #include "global.h"
   2: #include <signal.h>
   3: 
   4: 
   5: mmuladd(a,b,c,m)
   6: long a,b,c,m;
   7: {
   8:     long work[2]; char err;
   9:     emul(a,b,c,work);
  10:     ediv(work,m,err);
  11:     return(work[0]);
  12: }
  13: /*mmuladd (a, b, c, m)
  14: int a, b, c, m;
  15: {
  16: 	asm ("emul	4(ap),8(ap),12(ap),r0");
  17: 	asm ("ediv	16(ap),r0,r2,r0");
  18: }
  19: 
  20: Imuldiv() {
  21: asm("	emul	4(ap),8(ap),12(ap),r0");
  22: asm("	ediv	16(ap),r0,*20(ap),*24(ap)");
  23: }*/
  24: 
  25: Imuldiv(p1,p2,add,dv,quo,rem)
  26: long p1, p2, add, dv;
  27: long *quo, *rem;
  28: {
  29:     long work[2]; char err;
  30: 
  31:     emul(p1,p2,add,work);
  32:     *quo = ediv(work,dv, &err);
  33:     *rem = *work;
  34: }
  35: /*C library -- write
  36:   nwritten = write(file, buffer, count);
  37:   nwritten == -1 means error
  38: */
  39: write(file, buffer, count)
  40: char *buffer;
  41: {
  42:     register lispval handy;
  43:     int retval;
  44:     if((file != 1) || (Vcntlw->a.clb == nil)) goto top;
  45:     /* since ^w is non nil, we do not want to print to the terminal,
  46: 	   but we must be sure to return a correct value from the write
  47: 	   in case there is no write to ptport
  48: 	*/
  49:     retval = count;
  50:     goto skipit;
  51: 
  52: top:
  53: 
  54:     retval = _write(file,buffer,count);
  55: 
  56: skipit:
  57:     if(file==1) {
  58:     handy = Vptport->a.clb;
  59:     if(handy!=nil && TYPE(handy)==PORT && handy->p->_file!=1) {
  60:         fflush(handy->p);
  61:         file = handy->p->_file;
  62:         goto top;
  63:     }
  64:     }
  65:     return(retval);
  66: }
  67: 
  68: /*
  69: # C library -- read
  70: 
  71: # nread = read(file, buffer, count);
  72: #
  73: # nread ==0 means eof; nread == -1 means error
  74: */
  75: #include <errno.h>
  76: read(file,buffer,count)
  77: {
  78:     extern int errno;
  79:     register int Size;
  80: again:
  81: 
  82:     Size = _read(file,buffer,count);
  83:     if ((Size >= 0) || (errno != EINTR)) return(Size);
  84:     if(sigintcnt > 0) sigcall(SIGINT);
  85:     goto again;
  86: }
  87: 
  88: lispval
  89: Lpolyev()
  90: {
  91:     register int count;
  92:     register double *handy, *base;
  93:     register struct argent *argp;
  94:     lispval result; int type;
  95:     char *alloca();
  96: 
  97:     count = 2 * (((int) np) - (int) lbot);
  98:     if(count == 0)
  99:         return(inewint(0));
 100:     if(count == 8)
 101:         return(lbot->val);
 102:     base = handy = (double *) alloca(count);
 103:     for(argp = lbot; argp < np; argp++) {
 104:         while((type = TYPE(argp->val))!=DOUB && type!=INT)
 105:             argp->val = (lispval) errorh2(Vermisc,"%%machine-polyev:non-real arg",nil,TRUE,73,lbot,argp->val);
 106:         if(TYPE(argp->val)==INT) {
 107:             *handy++ = argp->val->i;
 108:         } else
 109:             *handy++ = argp->val->r;
 110:     }
 111:     count = count/sizeof(double) - 2;
 112: /*	asm("polyd	(r9),r11,8(r9)");
 113: 	asm("movd	r0,(r9)");*/
 114:     result = newdoub();
 115:     result->r = *base;
 116:     return(result);
 117: }
 118: 
 119: lispval
 120: Lrot()
 121: {
 122:     register rot,val;       /* these must be the first registers */
 123:     register struct argent *mylbot = lbot;
 124: 
 125:     chkarg(2,"rot");
 126:     if((TYPE(mylbot->val) != INT) || (TYPE(mylbot[1].val) != INT))
 127:         errorh2(Vermisc,
 128:                "Non ints to rot",
 129:                nil,FALSE,0,mylbot->val,mylbot[1].val);
 130:     val = mylbot[0].val->i;
 131:     rot = mylbot[1].val->i;
 132:     rot = rot % 32 ;    /* bring it down below one byte in size */
 133:     if(rot < 0) {
 134:         rot = -rot;
 135:         {asm("roll	d7,d6");}
 136:     } else {asm("rorl	d7,d6");}
 137:     return( inewint(val));
 138: }
 139: 
 140: myfrexp() { error("myfrexp called", FALSE);}
 141: #if os_unisoft | os_unix_ts
 142: syscall() { error("vsyscall called", FALSE);}
 143: #endif
 144: 
 145: #include "structs.h"
 146: prunei(what)
 147: register lispval what;
 148: {
 149:     extern struct types int_str;
 150:     int gstart();
 151:     if(((long)what) > ((long) gstart)) {
 152:         --(int_items->i);
 153:         what->i = (long) int_str.next_free;
 154:         int_str.next_free = (char *) what;
 155:     }
 156: }
 157: #include "68kframe.h"
 158: /* new version of showstack,
 159: 	We will set fp to point where the register fp points.
 160: 	If we find that the saved pc is somewhere in the routine eval,
 161:    then we print the first argument to that eval frame. This is done
 162:    by looking on the stack.
 163: */
 164: lispval
 165: Lshostk()
 166: {   lispval isho();
 167:     return(isho(1));
 168: }
 169: static lispval
 170: isho(f)
 171: int f;
 172: {
 173:     register struct machframe *myfp; register lispval handy;
 174:     int **fp;   /* this must be the first local */
 175:     int virgin=1;
 176:     lispval linterp(), Ifuncal();
 177:     lispval _qfuncl(),tynames();    /* locations in qfuncl */
 178:     extern int plevel,plength;
 179: 
 180:     if(TYPE(Vprinlevel->a.clb) == INT)
 181:     {
 182:        plevel = Vprinlevel->a.clb->i;
 183:     }
 184:     else plevel = -1;
 185:     if(TYPE(Vprinlength->a.clb) == INT)
 186:     {
 187:         plength = Vprinlength->a.clb->i;
 188:     }
 189:     else plength = -1;
 190: 
 191:     if(f==1)
 192:         printf("Forms in evaluation:\n");
 193:     else
 194:         printf("Backtrace:\n\n");
 195: 
 196:     myfp = (struct machframe *) (&fp +1);   /* point to current machframe */
 197: 
 198:     while(TRUE)
 199:     {
 200:         if( (myfp->pc > eval  &&        /* interpreted code */
 201:          myfp->pc < popnames)
 202:         ||
 203:         (myfp->pc > Ifuncal &&      /* compiled code */
 204:          myfp->pc < Lfuncal)  )
 205:         {
 206:           { handy = (myfp->fp->ap[0]);
 207:         if(f==1)
 208:             printr(handy,stdout), putchar('\n');
 209:         else {
 210:             if(virgin)
 211:                 virgin = 0;
 212:             else
 213:                 printf(" -- ");
 214:             printr((TYPE(handy)==DTPR)?handy->d.car:handy,stdout);
 215:         }
 216:           }
 217: 
 218:         }
 219: 
 220:         if(myfp > myfp->fp) break;  /* end of frames */
 221:         else myfp = myfp->fp;
 222:     }
 223:     putchar('\n');
 224:     return(nil);
 225: }
 226: 
 227: /*
 228:  *
 229:  *	(baktrace)
 230:  *
 231:  * baktrace will print the names of all functions being evaluated
 232:  * from the current one (baktrace) down to the first one.
 233:  * currently it only prints the function name.  Planned is a
 234:  * list of local variables in all stack frames.
 235:  * written by jkf.
 236:  *
 237:  */
 238: lispval
 239: Lbaktrace()
 240: {
 241:     isho(0);
 242: }
 243: 
 244: /*
 245:  * (int:showstack 'stack_pointer)
 246:  * return
 247:  *   nil if at the end of the stack or illegal
 248:  *   ( expresssion . next_stack_pointer) otherwise
 249:  *   where expression is something passed to eval
 250:  * very vax specific
 251:  */
 252: lispval
 253: LIshowstack()
 254: {
 255:     int **fp;   /* must be the first local variable */
 256:     register lispval handy;
 257:     register struct machframe *myfp;
 258:     lispval retval, Ifuncal();
 259:     Savestack(2);
 260: 
 261:     chkarg(1,"int:showstack");
 262: 
 263:     if((TYPE(handy=lbot[0].val) != INT) && (handy != nil))
 264:         error("int:showstack non fixnum arg", FALSE);
 265: 
 266:     if(handy == nil)
 267:         myfp = (struct machframe *) (&fp +1);
 268:     else
 269:         myfp = (struct machframe *) handy->i;
 270: 
 271:     if((int ***)myfp <= &fp) error("int:showstack illegal stack value",FALSE);
 272:     while(myfp > 0)
 273:     {
 274:         if( (myfp->pc > eval  &&        /* interpreted code */
 275:             myfp->pc < popnames)
 276:         ||
 277:         (myfp->pc > Ifuncal &&      /* compiled code */
 278:         myfp->pc < Lfuncal)  )
 279:         {
 280:         {
 281:         handy = (lispval)(myfp->fp->ap[0]); /* arg to eval */
 282: 
 283:         protect(retval=newdot());
 284:         retval->d.car = handy;
 285:         if(myfp > myfp->fp)
 286:             myfp = 0;   /* end of frames */
 287:         else
 288:             myfp = myfp->fp;
 289:         retval->d.cdr = inewint(myfp);
 290:         return(retval);
 291:         }
 292:     }
 293:     if(myfp > myfp->fp)
 294:          myfp = 0;  /* end of frames */
 295:     else
 296:          myfp = myfp->fp;
 297: 
 298:     }
 299:     return(nil);
 300: }
 301: #include "frame.h"
 302: /*
 303:  * this code is very similar to ftolsp.
 304:  * if it gets revised, so should this.
 305:  */
 306: lispval
 307: dothunk(func,count)
 308: lispval func;
 309: long count;
 310: {
 311:     register long *arglist = (& count) + 3;
 312:     lispval save;
 313:     pbuf pb;
 314:     Savestack(1);
 315: 
 316:     if(errp->class==F_TO_FORT)
 317:         np = errp->svnp;
 318:     errp = Pushframe(F_TO_LISP,nil,nil);
 319:     lbot = np;
 320:     np++->val = func;
 321:     for(; count > 0; count--)
 322:         np++->val = inewint(*arglist++);
 323:     save = Lfuncal();
 324:     errp = Popframe();
 325:     Restorestack();
 326:     return(save);
 327: }
 328: /*
 329: _thcpy:
 330: 	movl	sp@,a0
 331: 	movl	a0@+,sp@-
 332: 	movl	a0@+,sp@-
 333: 	jsr	_dothunk
 334: 	lea	sp@(12),sp
 335: 	rts*/
 336: static char fivewords[] = "01234567890123456789";
 337: 
 338: lispval
 339: Lmkcth()
 340: {
 341:     register struct argent *mylbot = lbot;
 342:     register struct thunk {
 343:         short   nop;
 344:         short   jsri;
 345:         char    *thcpy;
 346:         long    count;
 347:         lispval func;
 348:     } *th;
 349:     long handy = (long) pinewstr(fivewords);
 350:     extern char thcpy[];
 351: 
 352:     chkarg(2,"make-c-thunk");
 353:     handy = ((handy - 1 ) | 3) + 1;
 354:     th = (struct thunk *) handy;
 355:     th->nop = 0x4e71;
 356:     th->jsri = 0x4eb9;
 357:     th->thcpy = thcpy;
 358:     th->func = mylbot->val;
 359:     th->count = mylbot[1].val->i;
 360: 
 361:     return((lispval)th);
 362: }

Defined functions

Imuldiv defined in line 25; never used
LIshowstack defined in line 252; never used
Lbaktrace defined in line 238; never used
Lmkcth defined in line 338; never used
Lpolyev defined in line 88; never used
Lrot defined in line 119; never used
Lshostk defined in line 164; never used
dothunk defined in line 306; never used
isho defined in line 169; used 3 times
mmuladd defined in line 5; never used
myfrexp defined in line 140; never used
prunei defined in line 146; never used
read defined in line 76; never used
syscall defined in line 142; never used
write defined in line 39; never used

Defined variables

fivewords defined in line 336; used 1 times

Defined struct's

thunk defined in line 342; used 2 times
  • in line 354(2)
Last modified: 1985-08-14
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1137
Valid CSS Valid XHTML 1.0 Strict