2 * Sources of the "PROCEDURE CALL" group instructions
5 /* $Id: do_proc.c,v 2.4 1994/06/24 10:46:46 ceriel Exp $ */
13 #include "memdirect.h"
22 extern int running; /* from main.c */
26 DoCAI() /* proc identifier on top of stack */
28 /* CAI -: Call procedure (procedure identifier on stack) */
29 register long pi = spop(psize);
31 LOG(("@P6 DoCAI(%lu)", pi));
32 call(arg_p(pi), RSB_CAL);
38 /* CAL p: Call procedure (with identifier p) */
40 LOG(("@P6 DoCAL(%lu)", pi));
41 call(arg_p(pi), RSB_CAL);
47 /* LFR s: Load function result */
49 LOG(("@P6 DoLFR(%ld)", l));
56 /* RET z: Return (function result consists of top z bytes) */
58 LOG(("@P6 DoRET(%ld)", l));
62 /************************************************************************
63 * Calling a new procedure. *
64 ************************************************************************/
70 /* legality of new_PI has already been checked */
71 register size nloc = proctab[new_PI].pr_nloc;
72 register ptr ep = proctab[new_PI].pr_ep;
74 push_frame(SP); /* remember AB */
82 LOG(("@p5 call: new_PI = %lu, nloc = %lu, ep = %lu",
86 /************************************************************************
87 * Loading a function result. *
88 ************************************************************************/
94 wtrap(WILLLFR, EILLINS);
97 LOG(("@p5 lfr: size = %ld", sz));
104 warning(FRASize < sz ? WRFUNSML : WRFUNLAR);
112 /************************************************************************
113 * Returning from a procedure. *
114 ************************************************************************/
120 wtrap(WILLRET, EILLINS);
123 LOG(("@p5 ret: size = %ld", sz));
125 /* retrieve return value from stack */
134 ES = btol(FRA[sz-1]);
137 running = 0; /* stop the machine */
145 running = 0; /* stop the machine */