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 */
72 push_frame(SP); /* remember AB */
77 read_proctab(new_PI, &proctab);
78 st_inc(proctab.pr_nloc);
81 LOG(("@p5 call: new_PI = %lu, nloc = %lu, ep = %lu",
82 new_PI, proctab.pr_nloc, proctab.pr_ep));
85 /************************************************************************
86 * Loading a function result. *
87 ************************************************************************/
93 wtrap(WILLLFR, EILLINS);
96 LOG(("@p5 lfr: size = %ld", sz));
103 warning(FRASize < sz ? WRFUNSML : WRFUNLAR);
111 /************************************************************************
112 * Returning from a procedure. *
113 ************************************************************************/
119 wtrap(WILLRET, EILLINS);
122 LOG(("@p5 ret: size = %ld", sz));
124 /* retrieve return value from stack */
133 ES = btol(FRA[sz-1]);
136 running = 0; /* stop the machine */
144 running = 0; /* stop the machine */