*DECK MGETC IDENT MGETS SST ENTRY MGETS ENTRY MEM ENTRY CFOFLG ENTRY CFOWD ENTRY LDPM ENTRY PGNAME ENTRY RASSC EXT ABORT EXT MRELS EXT MSEIZE EXT OCFL EXT OMSG EXT XTRACE SYSCOM MEM EQU 0 LIST F *IF DEF,IMS *# *1DC MGETS * * 1. PROC NAME AUTHOR DATE * MGETS P. C. TAM 77/09/27 * * 2. FUNCTIONAL DESCRIPTION. * THIS ROUTINE IS RESPONSIBLE FOR GETTING A LARGE ENOUGH BUFFER * FROM FREE CHAIN FOR THE CALLING ROUTINE AND RETURN THE EXTRA * WORDS TO THE FREE CHAIN. * * 3. METHOD USED. * SCAN FREE CHAIN FOR A BUFFER FIT THE REQUESTED SIZE BEST. * IF CAN NOT FIND A BIG ENOUGH BUFFER THEN CALL OCFL TO ISSUE * MEMORY REQUEST TO THE OPERATING SYSTEM FOR ADDITIONAL SPACE * OF REQUESTED SIZE + 300 WORDS. (IF NIP MAXFL NOT REACHED YET) * DELINK THE BUFFER FOUND FROM FREE CHAIN. * RELEASE EXTRA WORDS FROM BUFFER FOUND. * ZERO OUT THE BUFFER AND SET BLOCK SIZE. * * 4. ENTRY PARAMETERS. * (X1) = ADDRESS OF THE REQUIRED SIZE OF BUFFER * * 5. EXIT PARAMETERS. * (A1)+1 = ADDRESS OF THE ADDRESS OF THE BUFFER ADDRESS * (A1)+2 = ADDRESS OF THE ADDRESS OF ZERO FLAG * * 6. COMDECKS CALLED. * CYBERDEFS FREETAB INPARU MACDEF * STATTAB2 SYSTIME * * 7. ROUTINES CALLED. * MSEIZE RELEASE BUFFER SPACE * OCFL MAKE MEMORY REQUEST TO OPERATING SYSTEM * OMSG LOG ERROR MESSAGE * XTRACE RECORD CALL * * 8. DAYFILE MESSAGES. * *MAX FL REACHED * *# *ENDIF *CALL SYSCOMD *CALL MACDEF *CALL CYBERDEFS *CALL INPARU *CALL FREETAB *CALL STATTAB2 *CALL SYSTIME MGETS SUBR = ENTRY/EXIT * (A0)=ADDRESS OF PARM BLOCK SX6 A1 (X6)=ADDR OF PARM BLOCK SA6 PARMA (PARMA)=ADDR OF PARM BLOCK SA0 A1 (X0)=ADDR OF PARM BLOCK IFEQ DEBUG,1,6 SX6 A1 SA6 TEMP SX1 XMGETC RJ XTRACE SA1 TEMP SA1 X1 * * STEP 1 SCAN FREE CHAIN FOR BEST FIT SPACE * FOLLOWING REGISTERS ARE SET IN THIS STEP: * (X1)=REQUIRED BUFFER SIZE (RQSIZE) * (X2)=FRESFB (TOTAL SIZE OF ALL FREE BUFFERS) * (X3)=FRENOFB (TOTAL NUMBER OF FREE BUFFERS) SA1 X1 (X1)=RQSIZE VALUE SB7 X1 (B7)=RQSIZE VALUE SA2 FRETAB+FRESFB# (X2)=FRESFB VALUE SB6 X2 (B6)=FRESFB VALUE SA4 MAXFL SB2 X4 (B2)=MAXFL B1 IFNE BESTFIT,1 LT B6,B7,MGTS8 BRANCH IF FRESFB LS RQSIZE MX0 -1 (X0)=-1 SA3 FRETAB+FRENOFB# (X3)=FRENOFB SA4 FRETAB+FREFBFP# (X4)=FREFBFP WORD BX7 X3 * (A4)=ADR OF BUFFER EXAMINED CURRENTLY * (B4)=A4 AFTER LOOP TERMINATED MGTS1 ZR X7,MGTS7 CHECK FOR LOOP TERMINATION SA4 X4 (X4)=FRBFBFP OR FREFBFP WORD BX5 X4 LX5 -FRBBS?+FRBBS$-1 (X5)=FRBBS FIELD RIGHT JUSTIFIED SX5 X5 IX5 X5-X1 (X5)=FRBBS[0]-RQSIZE ZR X5,MGTS7 BRANCH IF FRBBS[0]-RQSIZE ZERO PL X5,MGTS7 BRANCH IF FRBBS[0]-RQSIZE GR ZERO IX7 X7+X0 (X7)=X7-1 EQ MGTS1 LOOP BACK MGTS7 BSS 0 SB4 A4 SAVE CHOSEN BUFFER ADR S1 IFEQ STAT,1 IX7 X3-X7 UPDATE ST$GNB SA4 ST$GNB IX7 X4+X7 SA7 A4 S1 ENDIF ZR X5,MGTSZ FOUND BUFFER PL X5,MGTSZ FOUND BUFFER B1 ELSE SB5 X4 MAX FL LT B6,B7,MGTS8 BRANCH IF FRESFB LS RQSIZE MX0 -1 (X0)=-1 SA3 FRETAB+FRENOFB# SA4 FRETAB+FREFBFP# BX7 X3 * (A4)=ADDR OF CURRENT BUFFER EXAMINED * (B4)=SET TO A4 AT LOOP END MGTS1 ZR X7,MGTS7 CHECK FOR EXIT FROM LOOP SA4 X4 (X4)=FRBFBFP OR FREFBFP WORD BX5 X4 LX5 -FRBBS?+FRBBS$-1 (X5)=FRBBS FIELD RIGHT JUSTIFIED SX5 X5 IX5 X5-X1 (X5)=FRBBS-RQSIZE SB7 X5 LT B7,B0,MGTS2 BRANCH IF B7 LS ZERO GE B7,B5,MGTS2 BRANCH IF FRBBS-RQSIZE GR B5 SB5 B7 NEW MIN FRBBS-RQSIZE SB4 A4 CORRESPONDING BUFFER EQ B7,B0,MGTS7 BRANCH IF FRBBS-RQSIZE ZERO MGTS2 BSS 0 IX7 X7+X0 (X7)=X7-1 EQ MGTS1 LOOP BACK MGTS7 BSS 0 S1 IFEQ STAT,1 IX7 X3-X7 UPDATE ST$GNB SA5 ST$GNB IX7 X7+X5 SA7 A5 S1 ENDIF LT B5,B2,MGTSZ BRANCH IF FRBBS-RQSIZE IS SET B1 ENDIF *** * * CANNOT FIND BIG ENOUGH BUF * ASK SYSTEM FOR MORE SPACE IF NIP HAS NOT REACH MAX FL * MGTS8 BSS 0 RJ MSTAVF CALL INTERNAL PROC TO EXTEND PROGRAM LEN SA1 PARMA (X1)=ADDR OF PARM BLOCK SA0 X1 (A0)=ADDR OF PARM BLOCK SA1 X1 (X1)=RQSIZE ADDR SA1 X1 (X1)=RQSIZE VALUE (RESTORE X1) SA5 CTLSLWA (X5)=(CTLSLWA) SB7 X5 (B7)=(CTLSLWA) SA4 TEMP2 (X4)=(TEMP2) BX7 X4 (X7)=(TEMP2) SA7 A5 CTLSLWA=(TEMP2) IX4 X4-X5 (X4)=NEW CTLSLWA - OLD CTLSLWA SA2 FRETAB+FRESFB# (X2)=(FRESFB) IX7 X2+X4 (X7)=(FRESFB)+(TEMP1) SA7 A2 SA5 FRETAB+FREFBBP# (X5)=(FREFBBP WORD) MX0 -FRBBS$ (X0)=MASK FOR FRBBS FD LX5 -FREFBBP?+FREFBBP$-1 RIGHT JUSTIFY (FREFBBP) SB6 X5 (B6)=(FREFBBP) LX0 FRBBS?-FRBBS$+1 SHIFT TO APP POS IN WORD LOAD A5,B6,FRBBS# (X5)=(FRBBS[FREFBBP] WORD) BX6 -X0*X5 (X6)=(FRBBS[FREFBBP] FD) LX6 -FRBBS?+FRBBS$-1 RIGHT JUSTIFY (FRBBS[FREFBBP] FD) SB5 B6+X6 (B5)=(FRBBS[FREFBBP])+(FREFBBP) EQ B7,B5,MGTSR5 BRANCH IF CTLSLWA EQ (B5) * LAST FREE BUFFER NOT AT CTLSLWA SA3 FRETAB+FRENOFB# SET NEW FRENOFB MX7 -1 (X7)=-1 SB4 B7 BUFWA=(CTLSLWA ORIGINAL) IX7 X3-X7 (X7)=X3+1 SA7 A3 LX4 FRBBS?-FRBBS$+1 SHIFT TO APPP POS IN WORD SX7 FRETAB+FREFBFP# (X7)=FRETAB+FREFBFP BX7 X7+X4 (X7)=NEW BUFWA HEADER BS, FP SET SX6 B6 (X6)=(FREFBBP) LX6 FREFBBP?-FREFBBP$+1 SHIFT TO APP POS IN WORD BX7 X7+X6 (X7)=NEW BUFWA HEADER SA7 B4 WRITE TO CM EQ MGTSZ * LAST BUFFER AT CTLSLWA MGTSR5 SB4 B6 BUFWA=(FREFBBP) IX6 X6+X4 (X6)=FRBBS[FREFBBP]+TEMP1 LX6 FRBBS?-FRBBS$+1 SHIFT TO APP POS IN WORD BX7 X0*X5 (X7)=(FRBBS[FREFBBP] WORD MINUS BS FD) BX7 X7+X6 (X7)=NEW BUFFER HEADER SA7 B4 WRITE TO CM *** * FOUND, CALL MSEIZE TO DELINK FROM FREE CHAIN * MGTSZ BSS 0 SA4 A0+1 (BUFWA)=ADDR OF SELECTED BUFFER SX6 B4 SA6 X4 RJ MSEIZE EQ MGETSX EXIT * INTERNAL PROCEDURE USED IN TWO PLACES IN MGETC *IF DEF,IMS *# *1DC MSTAVF * 1. PROC NAME AUTHOR DATE * MSTAVF P.C.TAM 78/08/25 * * 2. FUNCTION DESCRIPTION. * INTERNAL PROCEDURE FOR MGETS. * * 3. METHOD USED. * UPDATE STATISTICS VARIABLES ST$FL, ST$FLW, ST$FLT. * CALL OCFL TO EXTEND PROGRAM LENGTH. * * 4. ENTRY PARAMETERS. * X7 NO OF WORDS PROGRAM LENGTH IS INCREASED * B7 NEW PROGRAM LENGTH * * 5. EXIT PARAMETERS. * NONE * * 6. COMMON DECKS CALLED. * NONE. * * 7. ROUTINES CALLED. * OCFL INCREASE PROGRAM LENGTH * * 8. DAYFILE MESSAGES. * NONE. * *# *ENDIF MSTAVF SUBR = ENTRY/EXIT S3 IFEQ STAT,1 MX6 -1 (X6)=-1 SA4 ST$FL INCR NO OF FL INCREASE IX6 X4-X6 (X6)=X4+1 SA6 A4 SA4 ST$FLW INCR NO OF WORD INCREASED IX6 X4+X7 SA6 A4 S3 ENDIF SA5 CTLSLWA SB7 X5 CURRENT LWA LT B7,B2,MSTAVF0 MAX FL NOT YET REACHED SA1 MSGERR MAXFL REACHED, NO BUFFER TO ALLOCATE RJ ABORT *----- ABORT -----* MSTAVF0 BSS 0 REQUEST OS FOR MORE MEMORY SX7 X1+577B (X7)=RQSIZE+320+63 AX7 6 LX7 6 (X7) ROUNDED TO NEAREST 100B SA5 CTLSLWA LWA OF FL IX6 X5+X7 * CHECK IF REACHED MAXIMUM FIELD LENGTH SA4 MAXFL MAX FIELD LENGTH FOR NIP IX7 X4-X6 COMPARE TO NEW LWA ZR X7,MSTAVF1 EXIT IF REACHED MAX FL PL X7,MSTAVF2 EXIT IF NOT EXCEEDED MAX FL MSTAVF1 SX6 X4 LWA SET TO MAX FL MX0 FREMFL$ SIZE OF FIELD OF MAX-FIELD-LENGTH FLAG SA4 FRETAB+FREMFL# WORD CONTAINING MAX-FIELD-LENGTH FLAG BX7 X4+X0 CLEAR MAX-FIELD-LENGTH FIELD SA7 A4 SET MAX-FIELD-LENGTH FLAG MSTAVF2 SA6 TEMP2 SAVE NEW LWA SA1 TMP2A RJ OCFL S4 IFEQ STAT,1 SA5 THETIME+RTSECS# SYSTEM TIME MX0 RTSECS$ MASK FOR RTSECS FD IFNE RTSECS?,WL-1,1 IF SEC FD NOT LEFT JUST. LX5 WL-1-RTSECS? LEFT JUST. BX5 X0*X5 SECOND FD ONLY SA4 TIMECFL TIME OF LAST OCFL CALL SA3 CTLSLWA OLD FL LX5 RTSECS$ RJ SECOND FD LX3 -6 OLD FL IN 100B MULTIPLE SA1 ST$FLT IX2 X5-X4 BX7 X5 DX6 X3*X2 (X6)=NIP OLD FL * ELAPSED TIME SA7 A4 UPDATE TIME OF LAST OCFL CALL IX6 X6+X1 ACC ST$FLT SA6 A1 UPDATE ST$FLT S4 ENDIF EQ MSTAVFX MSGERR VFD 60/MSGMFL BSSZ 1 MSGMFL DATA L*MGETC/MAXFL REACHED. * XMGETC DATA L*MGETC* TEMP BSS 1 TEMP2 BSSZ 1 PARMA BSSZ 1 TMP2A VFD 60/TEMP2 END