* * PROCEDURE CALL REQUIRES THE FOLLOWING OPERATIONS * IN THE ORDER SPECIFIED * * 1 ) P_SP <-- P_SP - (PARM_AREA_SIZE) * 2 ) MP <-- P_SP * 3 ) STACK[MP+2] <-- P_PC * 4 ) STACK[MP+4] <-- BASE * 5 ) P_PC <-- (ENTRY_POINT_ADDRESS) * 6 ) BASE <-- P_PC * 7 ) STOR[MP+6] <-- DISPLAY[N_LVL] * 8 ) DISPLAY[N_LVL] <-- MP * 9 ) P_PC <-- P_PC+10 * * * THE LINK AREA CONSISTS OF THE FOLLOWING FIELDS: * * LNKAREA : OLD_MP, * LNKAREA+2 : RETURN ADDRESS, * LNKAREA+4 : OLD_BASE, * LNKAREA+6 : OLD_DISP[N_LVL] * * * AND AFTER PROCEDURE ENTRY WE HAVE (NEW) MP == LNKAREA+8 * * * * WHERE P_PC ::= P_MACHINE PROGRAM COUNTER * P_SP ::= P_MACHINE STACK POINTER * N_LVL ::= STATIC LEVEL OF THE CALLED (NEW) * PROCEDURE * MP ::= MARK POINTER * BASE ::= 'CURRENT' PROC BASE ADDRESS * O_LVL ::= STATIC LEVEL OF THE CALLING ROUTINE * * * * ZCUP, CALL USER PROCEDURE; LONG FORMAT * PROCTBL IS ALLIGNED ON PAGE BOUNDARY * ZCUP INX B LDAX B PICK THE PROC # JMP ZENT * * ZCUP1, CALL USER PROCEDURE; SHORT FORM. * ZCUP1 LDAX B ANI 00FH GET THE PROC # * ZENT POP H SHLD MP SET NEW_MP XCHG , DE <-- NEW_MP LHLD BASE PUSH B SET RETURN ADDR. PUSH H SET OLD BASE ADDR. FIELD * ADD A COMPUTE PROC. ENTRY ADDRESS. * LD L,A * LD H,PROCTBL,< LHLD PROCTBL MVI B,0 MOV C,A DAD B MOV A,M INX H MOV H,M MOV L,A HL <-- PROC ENTRY POINT ADDR. * * * FORMAT OF THE ENTRY POINT OF PROCEDURES: * * ------------------------------------------------------ * \ LEVEL \-PRM_SZE \DATA_AREA_SIZE \ PROC. ID. * ... * ------------------------------------------------------ * SHLD BASE UPDATE PROGRAM BASE MOV A,M A <-- LEVEL OF CALLED PROC. LXI H,DISP ADD L MOV L,A MOV C,M MOV M,E UPDATE DISP[OLD_LVL] WHILE COPYING INX H MOV B,M BC <-- CURRENT DISP[OLD_LVL] MOV M,D PUSH B SAVE OLD DISP. * LHLD BASE INX H INX H MOV A,M PICK THE SIZE OF DATA AREA ADD D MOV D,A INX H MOV A,M ADD E ADD IT TO CURRENT P_SP MOV E,A JNC E06 INR D TO OBTAIN NEW P_SP E06 LXI B,ENTAREA-3 DAD B MOV B,H POINT TO BEGINNING OF PROCEDURE BODY MOV C,L JMP FET1 * * * * THE PROCEDURE RETURN SEQUENCE SHOULD INCLUDE THE * FOLLOWING * ACTIONS IN THE SPECIFIED ORDER * * * 1) P_SP <-- MP ; (RESET P_STACK * PTR) * 2) P_PC <-- STACK[P_SP+2] ; (SET RETURN * ADDRESS) * 3) DISPLAY[N_LVL] <-- STACK[MP+6] ; (OLD DISPLAY * VALUE) * 4) IF N_TYP <> 'PROC' THEN P_SP <-- P_SP+2 ; * (ADJUST P_SP FOR FUNC. * RETURNS) * 5) BASE <-- STACK[MP+4] ; (RESTORE OLD * BASE) * 6) MP <-- DISPLAY[O_LVL] ; (RESTORE MP * ) * 7) GOTO 'FETCH' ; * * * * * * * ZRET, RETURN FROM USER PROCEDURE. * ZRET POP B PICK UP ORIGINAL DISP. VALUE LHLD BASE MOV A,M ADI >DISP MVI H,DISP MVI H,