*DECK SSOCOL USETEXT TEXTSS PROC SSOCOL (SWTESS); # TITLE SSOCOL - CONTROL OVERLAY LOADING. # BEGIN # SSOCOL # # ** SSOCOL - CONTROL OVERLAY LOADING. * * S. H. FISCHER. 82/05/20. * * THIS ROUTINE CONTROLS THE LOADING AND EXECUTION OF OVERLAYS. * * PROC SSOCOL (SWTESS) * * ENTRY: * SWTESS = STATUS WORKLIST MONITOR ARRAY. * * EXIT: * RETURN PARAMETERS SET DEPENDING ON WHAT EVENT IS TO * RESTART THIS ROUTINE. * * METHOD: * WHEN AN OVERLAY IS NEEDED TO BE EXECUTED, THE REQUIRED MEMORY * IS REQUESTED FROM THE TABLE MANAGER, THE OVERLAY LOADED VIA CIO * FROM THE OVERLAY FILE AND A WORKLIST REQUEST MADE TO EXECUTE * THE OVERLAY. WHEN THE OVERLAY HAS COMPLETED EXECUTION, ANOTHER * OVERLAY IS LOADED IF A REQUEST WAS QUEUED OR THE OVERLAY AREA * RETURNED TO THE TABLE MANAGER. * # # **** PROC SSOCOL - XREF LIST. # XREF BEGIN PROC ABORT; # ABORT JOB (MACREL) # PROC MESSAGE; # ISSUE DAYFILE MESSAGE (MACREL) # PROC READ; # RANDOM READ TO CIO BUFFER # PROC RECALL; # RETURNS CONTROL WHEN COMPLETE BIT IS SET# PROC SSSAWR; # ACCEPT WORKLIST REQUESTS # PROC SSTSDA; # SET DYNAMIC BASE ADDRESS # END # **** # *CALL SWTESS $BEGIN ARRAY LOADERR [00:00] S(2); BEGIN ITEM LE$TEXT C(00,00,18) = ["OVERLAY LOAD ERROR"]; ITEM LE$ZERO U(01,48,12) = [0]; END $END ARRAY MREQ[00:00] S(1); BEGIN ITEM MREQ$WD U(00,00,59); ITEM MREQ$C B(00,59,01); # COMPLETION BIT # END ITEM ODTEC I; # OVERLAY DEFINITION TABLE ENTRY COUNT # ITEM NB I; # END OF OVERLAY # ITEM DONE B; # FLAG FOR SATISFIED MEMORY REQUEST # ITEM ODTINDX I; # LOOP INDUCTION VARIABLE # # ** OVLST - STATES ALLOWED FOR THE OVERLAY LOADER. * * THIS STATUS LIST DEFINES THE ALLOWED STATES FOR THE OVERLAY * PROCESSING. * # STATUS OVLST IDLE, # IDLE, NO OVERLAY REQUESTS AVAILABLE # WMEM, # WAIT MEMORY, NO SPACE AVAILABLE # WLOAD, # WAIT LOAD CONPLETION, CIO BUSY # WCOMP; # WAIT COMPLETION, STILL EXECUTING # ITEM OVLSTATE S:OVLST = S"IDLE"; SWITCH OVLJMP:OVLST LIDLE:IDLE, LWMEM:WMEM, LWLOAD:WLOAD, LCOMP:WCOMP; CONTROL EJECT; GOTO OVLJMP[OVLSTATE]; LIDLE: LCOMP: # SCAN OVERLAY REQUEST TABLE FOR LOWEST NUMBERED OVERLAY TO LOAD. # FOR ODTINDX = 1 STEP 1 WHILE (ODTINDX LQ NODT$) AND (ORT$MAP[ODTINDX] EQ 0 ) DO BEGIN END IF ODTINDX GR NODT$ THEN BEGIN # AT THIS POINT RELEASE THE OVERLAY AREA IF WE HAVE RESERVED CM. # SSTSDA(LOADBASE,MREQ,DONE); FOR ODTINDX=ODTINDX WHILE NOT DONE DO BEGIN RECALL(MREQ); SSTSDA(LOADBASE,MREQ,DONE); END ORC = 0; # WAIT FOR NEXT OVERLAY REQUEST # OVLSTATE = OVLST"IDLE"; STE$RTN = LOC(SSOCOL); STE$ADDR1 = LOC(ORC); STE$INIT1 = 0; STE$ADDR2 = 0; STE$INIT2 = 0; RETURN; END OVNUM = ODTINDX; MREQ$C = TRUE; # * SEARCH EACPM (5400) TABLE FOR REQUIRED OVERLAY (MATCH ON PRIMARY * LEVEL NUMBER. GET RELATIVE PRU ADDRESS OF DESIRED OVERLAY. # ODTEC = EAC$DL[0] / 2; # NUM OF PRIMARY OVERLAY ENTRYS # FOR ODTINDX=0 STEP 1 WHILE ODT$PLVL[ODTINDX] NQ OVNUM AND ODTINDX LS ODTEC DO # FIND REQUIRED OVERLAY DEF # BEGIN END $BEGIN IF ODTINDX GQ ODTEC THEN BEGIN MESSAGE (LOADERR, 0); ABORT; END $END LWMEM: # KEEP MAKING MEMORY REQUESTS UNTIL MEMORY IS AVAILABLE # OVLSTATE = OVLST"WMEM"; NB = ODT$LWA[ODTINDX]; SSTSDA( NB, MREQ, DONE ); IF NOT DONE THEN BEGIN STE$RTN = LOC(SSOCOL); STE$ADDR1 = LOC(MREQ); STE$INIT1 = MREQ$WD[0]; STE$CBIT1 = FALSE; STE$ADDR1 = 0; STE$INIT2 = 0; RETURN; END # START OVERLAY LOAD. # OF$LFN[0] = "OVLFILE"; OF$CBIT[0] = TRUE; OF$R[0] = TRUE; OF$L[0] = OFSIZ$-5; OF$FIRST[0] = LOADBASE; OF$IN[0] = LOADBASE; OF$OUT[0] = LOADBASE; OF$LIMIT[0] = NB + O"101"; # INSURE ALL OF OVL IS READ # OF$RR[0] = ODT$PRU[ODTINDX]; READ (OVLFET); OVLSTATE = OVLST"WLOAD"; LWLOAD: # WHEN LOAD IS COMPLETE, START EXECUTATION. # IF NOT OF$CBIT[0] THEN BEGIN STE$RTN = LOC(SSOCOL); STE$ADDR1 = LOC(OVLFET); STE$INIT1 = OF$WORD[0]; STE$CBIT1 = FALSE; STE$ADDR2 = 0; STE$INIT2 = 0; RETURN; END $BEGIN IF OF$LNAT[0] NQ 0 THEN BEGIN MESSAGE (LOADERR, 0); ABORT; END $END SSSAWR(SSOEOPW); # EXECUTE OVERLAY # SSOVLD = FALSE; OVLSTATE = OVLST"WCOMP"; STE$RTN = LOC(SSOCOL); STE$ADDR1 = LOC(SSOVLD); STE$INIT1 = 0; # FALSE # STE$ADDR2 = 0; STE$INIT2 = 0; RETURN; END # SSOCOL # TERM