! 06/01/89 - Combined aux stack support for IMP and Pascal ! The old routine iauxst is included for back compatability ! but will eventually be dropped ! %constinteger trace=0 %constinteger auxsize=x'20000' !* ! ! dont disturb the order of the next 3 lines assumed by IMp compiler ! %externalinteger auxcur %alias "p_aux" %owninteger auxtop %owninteger auxbase=0 !* %externalintegerfnspec malloc(%integer size) !* %externalroutine Initaux (%integer auxsize { in Kilobytes}) %integer amount %if auxbase#0 %then %return; ! already initialised %if Auxsize < 16 %then Auxsize=16 Amount = auxsize<<10 Auxbase=malloc (Amount+8192) %if Auxbase=0 %then %signal %event 2,2 Auxtop=auxbase+amount auxcur=auxbase %end %externalintegerfn iauxst %alias "i_auxst"(%integer ep,val) %switch e(0:2) %integer i,j %if trace#0 %thenstart printstring("i_auxst ") write(ep,4);write(val,4);newline %finish ->e(ep) !* e(0): %if auxbase=0 %thenstart Init aux(Auxsize>>10) %finish %result=auxcur !* e(1): %if auxcur+val>auxtop %thenstart printstring(" *** attempt to exceed auxiliary stack size *** ") %monitor %stop %finish j=auxcur auxcur=auxcur+((val+7)>>3)<<3 integer(i)=x'80808080' %for i=j,4,auxcur-4 %result=auxcur !* e(2): %unless auxbase<=val<=auxtop %thenstart printstring(" *** invalid reset of aux stack *** ") %monitor %stop %finish auxcur=val %result=auxcur %end;! iauxst %endoffile