Annotation of 43BSD/ucb/lisp/franz/68k/68k.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.