|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.