User Tools

Site Tools


cdc:nos2.source:opl.opl871:deck:smfex.001

Deck SMFEX Part 001

14 Modifications

Listing Sections

Source

Seq #  *Modification Id* Act 
----------------------------+
01996  M00S01960.smfex   +++|INSTSESSION:
01997  M00S01961.smfex   +++|    STATWORD[3]=STATWORD[3]+1;
01998  M00S01962.smfex   +++|    RETURN;
01999  M00S01963.smfex   +++|
02000  M00S01964.smfex   +++|INSTTRANS:
02001  M00S01965.smfex   +++|    STATWORD[4]=STATWORD[4]+1;
02002  M00S01966.smfex   +++|    RETURN;
02003  M00S01967.smfex   +++|
02004  M00S01968.smfex   +++|INSTRSPNS:
02005  M00S01969.smfex   +++|    STATWORD[5]=STATWORD[5]+DATA;
02006  M00S01970.smfex   +++|    ADDVECT(DISTRSTM,DATA/16);
02007  M00S01971.smfex   +++|    RETURN;
02008  M00S01972.smfex   +++|
02009  M00S01973.smfex   +++|INSTTHNK:
02010  M00S01974.smfex   +++|    STATWORD[6]=STATWORD[6]+DATA;
02011  M00S01975.smfex   +++|    ADDVECT(DISTTKTM,DATA/1024);
02012  M00S01976.smfex   +++|    RETURN;
02013  M00S01977.smfex   +++|
02014  M00S01978.smfex   +++|INSTPREEMPT:               # WORDS 7, 8, 9  #
02015  M00S01979.smfex   +++|    STATWORD[6+DATA]=STATWORD[6+DATA]+1;
02016  M00S01980.smfex   +++|    RETURN;
02017  M00S01981.smfex   +++|
02018  M00S01982.smfex   +++|INSTXSTTO:
02019  M00S01983.smfex   +++|    STATWORD[10]=STATWORD[10]+1;
02020  M00S01984.smfex   +++|    RETURN;
02021  M00S01985.smfex   +++|
02022  M00S01986.smfex   +++|INSTBREAK:
02023  M00S01987.smfex   +++|    STATWORD[11]=STATWORD[11]+1;
02024  M00S01988.smfex   +++|    RETURN;
02025  M00S01989.smfex   +++|
02026  M00S01990.smfex   +++|INSTHANG:
02027  M00S01991.smfex   +++|    STATWORD[12]=STATWORD[12]+1;
02028  M00S01992.smfex   +++|    RETURN;
02029  M00S01993.smfex   +++|
02030  M00S01994.smfex   +++|INSTCLOCK:
02031  M00S01995.smfex   +++|    STATWORD[13]=MAXLOGGED;
02032  M00S01996.smfex   +++|    STATWORD[14]=LOGGEDIN;
02033  M00S01997.smfex   +++|    STATWORD[15]=TIMEOFDAY;
02034  M00S01998.smfex   +++|    STATWORD[16]=SLICECOUNT;
02035  M00S01999.smfex   +++|    RETURN;
02036  M00S02000.smfex   +++|
02037  M00S02001.smfex   +++|INSTSWPE:
02038  M00S02002.smfex   +++|    STATWORD[17]=STATWORD[17]+1;
02039  M00S02003.smfex   +++|    RETURN;
02040  M00S02004.smfex   +++|
02041  M00S02005.smfex   +++|INSTSWPD:
02042  M00S02006.smfex   +++|    STATWORD[18]=STATWORD[18]+1;
02043  M00S02007.smfex   +++|    RETURN;
02044  M00S02008.smfex   +++|
02045  M00S02009.smfex   +++|INSTSWPTIM:
02046  M00S02010.smfex   +++|    STATWORD[19]=STATWORD[19]+DATA;
02047  M00S02011.smfex   +++|    RETURN;
02048  M00S02012.smfex   +++|
02049  M00S02013.smfex   +++|INSTEDTCIO:
02050  M00S02014.smfex   +++|    STATWORD[20]=STATWORD[20]+DATA;   # CIO MSECS         #
02051  M00S02015.smfex   +++|    STATWORD[21]=STATWORD[21]+DATA2;   # CIO COUNT         #
02052  M00S02016.smfex   +++|    IF DATA2 EQ 0 THEN STATWORD[22]=STATWORD[22]+1;  # NUM ZERO CIO  #
02053  M00S02017.smfex   +++|    IF DATA2 GQ 16 THEN
02054  M00S02018.smfex   +++|      BEGIN
02055  M00S02019.smfex   +++|      STATWORD[23]=STATWORD[23]+1;     # NUM CRUNCHERS     #
02056  M00S02020.smfex   +++|      STATWORD[24]=STATWORD[24]+DATA2; # CRUNCHY EFFORT    #
02057  M00S02021.smfex   +++|      END
02058  M00S02022.smfex   +++|    ADDVECT(DISTCICT,DATA2);
02059  M00S02023.smfex   +++|    RETURN;
02060  M00S02024.smfex   +++|
02061  M00S02025.smfex   +++|INSTBGNEDT:
02062  M00S02026.smfex   +++|    STATWORD[25]=STATWORD[25]+BUILDCIO;     # FILEBUILD CIOS    #
02063  M00S02027.smfex   +++|    RETURN;
02064  M00S02028.smfex   +++|
02065  M00S02029.smfex   +++|INSTENDEDT:
02066  M00S02030.smfex   +++|    ADDVECT(DISTTRCT,ACCTTRANS);
02067  M00S02031.smfex   +++|    ADDVECT(DISTFLSZ,PALAST[0]);
02068  M00S02032.smfex   +++|    RETURN;
02069  M00S02033.smfex   +++|
02070  M00S02034.smfex   +++|INSTINPUT:
02071  M00S02035.smfex   +++|    STATWORD[26]=STATWORD[26]+DATA;    # NUM WORDS         #
02072  M00S02036.smfex   +++|    RETURN;
02073  M00S02037.smfex   +++|
02074  M00S02038.smfex   +++|INSTXMIT:
02075  M00S02039.smfex   +++|    STATWORD[27]=STATWORD[27]+DATA;    # NUM WORDS         #
02076  M00S02040.smfex   +++|    STATWORD[28]=STATWORD[28]+DATA2;   # NUM BLOCKS        #
02077  M00S02041.smfex   +++|    ADDVECT(DISTMGSZ,DATA);
02078  M00S02042.smfex   +++|    RETURN;
02079  M00S02043.smfex   +++|
02080  M00S02044.smfex   +++|INSTKWIK:
02081  M00S02045.smfex   +++|    STATWORD[29]=STATWORD[29]+1;
02082  M00S02046.smfex   +++|    RETURN;
02083  M00S02047.smfex   +++|
02084  M00S02048.smfex   +++|INSTUTIL:
02085  M00S02049.smfex   +++|    STATWORD[30]=STATWORD[30]+DATA;
02086  M00S02050.smfex   +++|    RETURN;
02087  M00S02051.smfex   +++|
02088  M00S02052.smfex   +++|INSTWORK:
02089  M00S02053.smfex   +++|    STATWORD[31+DATA]=STATWORD[31+DATA]+1;  # WORDS 31 THRU 41 #
02090  M00S02054.smfex   +++|    RETURN;
02091  M00S02055.smfex   +++|
02092  M00S02056.smfex   +++|INSTDROP:
02093  M00S02057.smfex   +++|    STATWORD[42]=STATWORD[42]+1;
02094  M00S02058.smfex   +++|    RETURN;
02095  M00S02059.smfex   +++|
02096  M00S02060.smfex   +++|    END                        # OF INSTRUMENT     #
02097  M00S02061.smfex   +++|CONTROL FI;
02098  M00S02062.smfex   +++|PAGE                         # USER-STATE CODE   #
02099  M00S02063.smfex   +++|                             # BASIC WAIT/INTERRUPT HOOKS  #
02100  M00S02064.smfex   +++|
02101  M00S02065.smfex   +++|
02102  M00S02066.smfex   +++|PROC SMFDLY;
02103  M00S02067.smfex   +++|  IOBEGIN(SMFDLY)
02104  M00S02068.smfex   +++|#
02105  M00S02069.smfex   +++|**        SMFDLY - INTERFACE FOR TASKS TO DELAY.
02106  M00S02070.smfex   +++|*
02107  M00S02071.smfex   +++|*         EDITING CODE USE COMPILE-TIME MACROS TO REDEFINE THE
02108  M00S02072.smfex   +++|*         KEYWORD "DELAY" INTO A CALL TO "SMFDLY" FOR MULTI-USER
02109  M00S02073.smfex   +++|*         CODE.  SMFDLY INTERFACES TO THE PAUSE ROUTINE, WHICH IN
02110  M00S02074.smfex   +++|*         TURN WORKS WITH RUNJOBS TO CONTROL THE TASK.
02111  M00S02075.smfex   +++|*
02112  M00S02076.smfex   +++|*         ENTRY  NO CONDITIONS.
02113  M00S02077.smfex   +++|*
02114  M00S02078.smfex   +++|*         EXIT   AFTER DELAYING.
02115  M00S02079.smfex   +++|*
02116  M00S02080.smfex   +++|*         CALLS  PAUSE.
02117  M00S02081.smfex   +++|*
02118  M00S02082.smfex   +++|*         USES   CHNGSTATUS.
02119  M00S02083.smfex   +++|#
02120  M00S02084.smfex   +++|  CHNGSTATUS=TASKST"DELAY";
02121  M00S02085.smfex   +++|  PAUSE;
02122  M00S02086.smfex   +++|  IOEND                        # OF SMFDLY        #
02123  M00S02087.smfex   +++|
02124  M00S02088.smfex   +++|
02125  M00S02089.smfex   +++|PROC SMFRCL(AFET);
02126  M00S02090.smfex   +++|  IOBEGIN(SMFRCL)
02127  M00S02091.smfex   +++|#
02128  M00S02092.smfex   +++|**        SMFRCL - INTERFACE FOR TASKS TO AUTO-RECALL ON AN EVENT.
02129  M00S02093.smfex   +++|*
02130  M00S02094.smfex   +++|*         EDITING CODE USE COMPILE-TIME MACROS TO REDEFINE THE
02131  M00S02095.smfex   +++|*         KEYWORD "RECALL" INTO A CALL TO "SMFRCL" FOR MULTI-USER
02132  M00S02096.smfex   +++|*         CODE.  SMFDLY INTERFACES TO THE PAUSE ROUTINE, WHICH IN
02133  M00S02097.smfex   +++|*         TURN WORKS WITH RUNJOBS TO CONTROL THE TASK.
02134  M00S02098.smfex   +++|*
02135  M00S02099.smfex   +++|*         NOTE THAT EDITING CODE IS NOT ALLOWED TO SPECIFY AUTO-RECALL
02136  M00S02100.smfex   +++|*         ON ANY RA+1 CALL.  INSTEAD, EDITING CODE MUST ISSUE
02137  M00S02101.smfex   +++|*         RA+1 AND THEN CALL THIS ROUTINE TO RECALL UNTIL THE SYSTEM
02138  M00S02102.smfex   +++|*         FUNCTION IS COMPLETE.
02139  M00S02103.smfex   +++|*
02140  M00S02104.smfex   +++|*         ENTRY  AFET - COMPLETION WORD.
02141  M00S02105.smfex   +++|*
02142  M00S02106.smfex   +++|*         EXIT   AFTER COMPLETION BIT IS FOUND TO BE ON.
02143  M00S02107.smfex   +++|*
02144  M00S02108.smfex   +++|*         CALLS  PAUSE.
02145  M00S02109.smfex   +++|*
02146  M00S02110.smfex   +++|*         USES   CHNGSTATUS, TASKRCLADR[CURTASK].
02147  M00S02111.smfex   +++|#
02148  M00S02112.smfex   +++|  ARRAY AFET;;
02149  M00S02113.smfex   +++|  TASKRCLADR[CURTASK]=LOC(AFET);
02150  M00S02114.smfex   +++|  CHNGSTATUS=TASKST"RECALLFET";
02151  M00S02115.smfex   +++|  PAUSE;
02152  M00S02116.smfex   +++|  IOEND                        # OF SMFRCL        #
02153  M00S02117.smfex   +++|
02154  M00S02118.smfex   +++|
02155  M00S02119.smfex   +++|PROC CLEARINT;
02156  M00S02120.smfex   +++|  IOBEGIN(CLEARINT)
02157  M00S02121.smfex   +++|#
02158  M00S02122.smfex   +++|**        CLEARINT - ACKNOWLEGE USER BREAK.
02159  M00S02123.smfex   +++|*
02160  M00S02124.smfex   +++|*         EDITING CODE IS REQUIRED TO CALL THIS ROUTINE AS SOON AS
02161  M00S02125.smfex   +++|*         A USER BREAK HAS BEEN NOTICED, AND ALL EDITOR-SPECIFIC
02162  M00S02126.smfex   +++|*         RESPONSES HAVE BEEN PERFORMED.  CLEARINT CLEARS FLAGS
02163  M00S02127.smfex   +++|*         INDICATING UNACKNOWLEGED INTERRUPT, SINCE ONLY EXECUTIVE
02164  M00S02128.smfex   +++|*         CODE CAN ACCESS SUCH FLAGS.
02165  M00S02129.smfex   +++|*
02166  M00S02130.smfex   +++|*         ENTRY  NO CONDITIONS.
02167  M00S02131.smfex   +++|*
02168  M00S02132.smfex   +++|*         EXIT   CURUSINTRPT - FALSE.
02169  M00S02133.smfex   +++|*                BUFFERED OUTPUT PURGED.
02170  M00S02134.smfex   +++|*                TASKREQUE - FALSE UNLESS TASK RECOVERY IN EFFECT.
02171  M00S02135.smfex   +++|*
02172  M00S02136.smfex   +++|*         CALLS  CLEARQUE.
02173  M00S02137.smfex   +++|#
02174  M00S02138.smfex   +++|  IF CURUSINTRPT THEN TASKNXTTTO[CURTASK]=0;
02175  M00S02139.smfex   +++|  CLEARQUE;
02176  M00S02140.smfex   +++|  CURUSINTRPT=FALSE;
02177  M00S02141.smfex   +++|  IOEND                        # OF CLEARINT       #
02178  M00S02142.smfex   +++|
02179  M00S02143.smfex   +++|
02180  M00S02144.smfex   +++|PROC CLEARQUE;
02181  M00S02145.smfex   +++|  BEGIN
02182  M00S02146.smfex   +++|#
02183  M00S02147.smfex   +++|**        CLEARQUE - ATTEMPT TO CLEAR TASKREQUE FLAG.
02184  M00S02148.smfex   +++|*
02185  M00S02149.smfex   +++|*         CLEARQUE CLEARS THE TASKREQUE FLAG UNLESS TASK RECOVERY IS
02186  M00S02150.smfex   +++|*         IN EFFECT.  TASKREQUE IS SET BY DOINPUT WHEN A USER NEEDS
02187  M00S02151.smfex   +++|*         TO BE SCEDULED TO A TASK BUT IS ALREADY IN A TASK.  DOINPUT
02188  M00S02152.smfex   +++|*         HAS NO WAY TO KNOW IF THE TASK ALREADY RUNNING WILL DETECT
02189  M00S02153.smfex   +++|*         OR IGNORE THE INPUT EVENT.  THUS, THE TASKREQUE FLAG IS
02190  M00S02154.smfex   +++|*         SET.  IF THE EDITING CODE NEVER USES CLEARQUE TO SHOW
02191  M00S02155.smfex   +++|*         ACKNOWLEGEMENT, THEN WHEN THE TASK SWAPS OUT THE RUNJOBS
02192  M00S02156.smfex   +++|*         ROUTINE WILL IMMEDIATELY PUT THE USER BACK IN THE SWAPIN
02193  M00S02157.smfex   +++|*         QUEUE.  IF THE EDITING CODE ACKNOWLEGES THE INPUT EVENT,
02194  M00S02158.smfex   +++|*         WHICH IS USUALLY A USER BREAK, THEN CLEARQUE GETS RID OF
02195  M00S02159.smfex   +++|*         THE RESCHEDULING AT END OF TRANSACTION.
02196  M00S02160.smfex   +++|*
02197  M00S02161.smfex   +++|*         THE TASKREQUE FLAG IS PRESERVED IF RECOVERY IS ON.
02198  M00S02162.smfex   +++|*         RECOVERY DEALS WITH JOB DETACHMENT AND SUBSYSTEM EXITS.
02199  M00S02163.smfex   +++|*
02200  M00S02164.smfex   +++|*         ENTRY  CURUSRCVRY - WHETHER RECOVERY IN EFFECT.
02201  M00S02165.smfex   +++|*                TASKREQUE[CURTASK] - WHETHER RESCHEDULING PLANNED.
02202  M00S02166.smfex   +++|*
02203  M00S02167.smfex   +++|*         EXIT   TASKREQUE[CURTASK] - UPDATED.
02204  M00S02168.smfex   +++|#
02205  M00S02169.smfex   +++|  TASKREQUE[CURTASK]=TASKREQUE[CURTASK] AND CURUSRCVRY;
02206  M00S02170.smfex   +++|  END                          # OF CLEARQUE       #
02207  M00S02171.smfex   +++|
02208  M00S02172.smfex   +++|
02209  M00S02173.smfex   +++|PROC SPINWHEELS;
02210  M00S02174.smfex   +++|  IOBEGIN(SPINWHEELS)
02211  M00S02175.smfex   +++|#
02212  M00S02176.smfex   +++|**        SPINWHEELS - DELAY TASK UNTIL INPUT ARRIVES.
02213  M00S02177.smfex   +++|*
02214  M00S02178.smfex   +++|*         SPINWHEELS ALLOWS A TASK TO HOLD ONTO ITS RESOURCES FOR
02215  M00S02179.smfex   +++|*         BRIEF TIME INTERVALS IN EXPECTATION OF A USEFUL EXTERNAL
02216  M00S02180.smfex   +++|*         ARRIVING PROBABLY WITHIN A FRACTION OF A SECOND.  IF
02217  M00S02181.smfex   +++|*         RESOURCES ARE TIGHT WE TERMINATE THE WAIT SO THE CALLER CAN
02218  M00S02182.smfex   +++|*         SWAP OUT.
02219  M00S02183.smfex   +++|*
02220  M00S02184.smfex   +++|*         ENTRY  TIMEOFDAY - CURRENT TIME.
02221  M00S02185.smfex   +++|*                TASKREQUE[CURTASK], TASKTIME[CURTASK], REMAINTTI,
02222  M00S02186.smfex   +++|*                    TASKAVAIL, TASKSBUSY - EVENT/RESOURCE DATA.
02223  M00S02187.smfex   +++|*                SPINTIME - TIME ALREADY SPENT SPINNING.
02224  M00S02188.smfex   +++|*
02225  M00S02189.smfex   +++|*         EXIT   TIMEOFDAY - CURRENT TIME MAY HAVE ADVANCED.
02226  M00S02190.smfex   +++|*                SPINTIME - POSSIBLY INCREMENTED.
02227  M00S02191.smfex   +++|*
02228  M00S02192.smfex   +++|*         CALLS  OKTOWAIT(INTERNAL), SMFRCL.
02229  M00S02193.smfex   +++|*
02230  M00S02194.smfex   +++|*         USES   SPINSTART, TASKPULSE[CURTASK].
02231  M00S02195.smfex   +++|#
02232  M00S02196.smfex   +++|
02233  M00S02197.smfex   +++|  FUNC OKTOWAIT B;
02234  M00S02198.smfex   +++|    BEGIN
02235  M00S02199.smfex   +++|#
02236  M00S02200.smfex   +++|**        OKTOWAIT - COMPUTE RULES FOR SPINWHEELS.
02237  M00S02201.smfex   +++|*
02238  M00S02202.smfex   +++|*         OKTOWAIT DETERMINES THE EVENT/RESOURCE THRESHOLDS FOR THE
02239  M00S02203.smfex   +++|*         SPINWHEELS ROUTINES.  A TASK MAY SPIN ITS WHEELS, HOLDING
02240  M00S02204.smfex   +++|*         RESOURCES, UNTIL/UNLESS ANY OF THE FOLLOWING --
02241  M00S02205.smfex   +++|*
02242  M00S02206.smfex   +++|*         1. THE DESIRED INPUT ARRIVES FROM IAFEX (TASKREQUE)
02243  M00S02207.smfex   +++|*
02244  M00S02208.smfex   +++|*         2. TWO SECONDS EXPIRE.
02245  M00S02209.smfex   +++|*
02246  M00S02210.smfex   +++|*         3. ONE-HALF SECOND EXPIRES AND THERE ARE MORE USERS
02247  M00S02211.smfex   +++|*            SCHEDULED FOR TASKS THAN TASKS LEFT TO TAKE THEM.
02248  M00S02212.smfex   +++|*
02249  M00S02213.smfex   +++|*         4. REGARDLESS OF TIMING, LESS THAN HALF OF THE TERMINAL
02250  M00S02214.smfex   +++|*            INPUT BUFFERS ARE LEFT OVER. (MOST CRITICAL RESOURCE)
02251  M00S02215.smfex   +++|*
02252  M00S02216.smfex   +++|*         ENTRY AND EXIT - SEE OUTER PROCEDURE.
02253  M00S02217.smfex   +++|#
02254  M00S02218.smfex   +++|    OKTOWAIT=TRUE;
02255  M00S02219.smfex   +++|    IF TASKREQUE[CURTASK] OR TIMEOFDAY-TASKTIME[CURTASK]
02256  M00S02220.smfex   +++|      GR 2000 THEN OKTOWAIT=FALSE;
02257  M00S02221.smfex   +++|    IF NUMTTIBUF-REMAINTTI GR TASKSAVAIL-TASKSBUSY AND
02258  M00S02222.smfex   +++|      TIMEOFDAY-TASKTIME[CURTASK] GR 500 THEN OKTOWAIT=FALSE;
02259  M00S02223.smfex   +++|    IF REMAINTTI LQ NUMTTIBUF/2 THEN OKTOWAIT=FALSE;
02260  M00S02224.smfex   +++|    END
02261  M00S02225.smfex   +++|
02262  M00S02226.smfex   +++|
02263  M00S02227.smfex   +++|  # SPINWHEELS MAIN CODE STARTS HERE #
02264  M00S02228.smfex   +++|
02265  M00S02229.smfex   +++|  SPINSTART=TIMEOFDAY;
02266  M00S02230.smfex   +++|  WHYLE OKTOWAIT DO
02267  M00S02231.smfex   +++|    BEGIN
02268  M00S02232.smfex   +++|    TASKPULSE[CURTASK]=2;          # SIMULATE BUSY FET #
02269  M00S02233.smfex   +++|    P<MOVTO>=LOC(TASKPULSE[CURTASK]);
02270  M00S02234.smfex   +++|    SMFRCL(MOVTO);      # APPROX 05-HZ DELAY LOOP     #
02271  M00S02235.smfex   +++|    END
02272  M00S02236.smfex   +++|  SPINTIME=SPINTIME+TIMEOFDAY-SPINSTART;
02273  M00S02237.smfex   +++|  IOEND                       # OF SPINWHEELS     #
02274  M00S02238.smfex   +++|PAGE                         # RELIABILITY/METERING HOOKS  #
02275  M00S02239.smfex   +++|
02276  M00S02240.smfex   +++|
02277  M00S02241.smfex   +++|PROC FATALTRAP;
02278  M00S02242.smfex   +++|  IOBEGIN(FATALTRAP)
02279  M00S02243.smfex   +++|#
02280  M00S02244.smfex   +++|**        FATALTRAP - INTERFACE FOR FAILING TASKS.
02281  M00S02245.smfex   +++|*
02282  M00S02246.smfex   +++|*         FATALTRAP IS CALLED BY EDITING CODE WHICH DETECTS ITS OWN
02283  M00S02247.smfex   +++|*         UNCORRECTABLE ALGORITHMIC INCONSISTENCY.  THIS INTERFACE
02284  M00S02248.smfex   +++|*         WAITS FOR ANY CIO CALL TO FINISH THEN BRANCHES DIRECTLY
02285  M00S02249.smfex   +++|*         TO THE RUNJOBS EXECUTIVE.
02286  M00S02250.smfex   +++|*
02287  M00S02251.smfex   +++|*         ENTRY  FET - MAYBE ACTIVE.
02288  M00S02252.smfex   +++|*
02289  M00S02253.smfex   +++|*         EXIT   FET - COMPLETE.
02290  M00S02254.smfex   +++|*                VIA AFTEREDIT LABEL.
02291  M00S02255.smfex   +++|*
02292  M00S02256.smfex   +++|*         CALLS  SMFRCL, AFTEREDIT.
02293  M00S02257.smfex   +++|#
02294  M00S02258.smfex   +++|  XREF LABEL AFTEREDIT;
02295  M00S02259.smfex   +++|  SMFRCL(FET);        # WAIT IO DONE      #
02296  M00S02260.smfex   +++|  GOTO AFTEREDIT;              # TERMINATE TASK    #
02297  M00S02261.smfex   +++|  END                          # OF FATALTRAP      #
02298  M00S02262.smfex   +++|
02299  M00S02263.smfex   +++|
02300  M00S02264.smfex   +++|PROC ABTPAUSE;
02301  M00S02265.smfex   +++|  IOBEGIN(ABTPAUSE)
02302  M00S02266.smfex   +++|#
02303  M00S02267.smfex   +++|**        ABTPAUSE - TRY TO CHECKPOINT WORKFILE AFTER ABORT.
02304  M00S02268.smfex   +++|*
02305  M00S02269.smfex   +++|*         ABTPAUSE IS CALLED AS EDITING CODE BY THE RUNJOBS EXECUTIVE
02306  M00S02270.smfex   +++|*         WHEN A TASK HAS ABORTED ITSELF.  THE INTENT IS TO ATTEMPT
02307  M00S02271.smfex   +++|*         TO CHECKPOINT THE WORKFILE BEFORE TRANSITIONING BACK TO
02308  M00S02272.smfex   +++|*         SINGLE-USER.  IF THIS CAN BE DONE, THEN THE SINGLE EDITOR
02309  M00S02273.smfex   +++|*         WILL DETECT THE ABORTED FLAG IN THE DATA SEGMENT OF THE
02310  M00S02274.smfex   +++|*         WORKFILE AND WILL KNOW THAT IT CANNOT PROCEED.  ABTPAUSE
02311  M00S02275.smfex   +++|*         MAY NOT SUCCEED, AND RUNJOBS IS RESPONSIBLE TO KEEP TRACK
02312  M00S02276.smfex   +++|*         OF ABTPAUSE FAILURE AND INSTEAD CALL ABTKILL.
02313  M00S02277.smfex   +++|*
02314  M00S02278.smfex   +++|*         CALLS  PAUSEIO.
02315  M00S02279.smfex   +++|#
02316  M00S02280.smfex   +++|  PAUSEIO;
02317  M00S02281.smfex   +++|  IOEND                        # OF ABTPAUSE       #
02318  M00S02282.smfex   +++|
02319  M00S02283.smfex   +++|
02320  M00S02284.smfex   +++|PROC ABTKILL;
02321  M00S02285.smfex   +++|  IOBEGIN(ABTKILL)
02322  M00S02286.smfex   +++|#
02323  M00S02287.smfex   +++|**        ABTKILL - KILL OFF TASK AFTER DOUBLE ABORT.
02324  M00S02288.smfex   +++|*
02325  M00S02289.smfex   +++|*         THE RUNJOBS EXECUTIVE CALLS ABTKILL AS A LAST RESORT WHEN A
02326  M00S02290.smfex   +++|*         TASK HAS DELIBERATELY ABORTED ITSELF, THEN HAS ABORTED
02327  M00S02291.smfex   +++|*         ITSELF A SECOND TIME WHEN ABTPAUSE ATTEMPTED TO CHECKPOINT
02328  M00S02292.smfex   +++|*         THE WORKFILE.  ABTKILL ATTEMPTS TO ZAP THE WORKFILE TO
02329  M00S02293.smfex   +++|*         CONTAIN EXACTLY ONE WORD OF ZEROES, WHICH WOULD NOT BE
02330  M00S02294.smfex   +++|*         ACCEPTED AS A VALID TRANSITION ONCE THE SINGLE-USER EDITOR
02331  M00S02295.smfex   +++|*         GETS BACK IN CONTROL.  THE INTENT IS TO BE AS CERTAIN AS
02332  M00S02296.smfex   +++|*         POSSIBLE THAT THE SINGLE EDITOR WILL NOT PICK UP AND
02333  M00S02297.smfex   +++|*         CONTINUE A HOPELESS EDIT SESSION.
02334  M00S02298.smfex   +++|*
02335  M00S02299.smfex   +++|*         CALLS  SMFRCL, WRITEO, REWRITR, SMFRCL.
02336  M00S02300.smfex   +++|*
02337  M00S02301.smfex   +++|*         USES   FET.
02338  M00S02302.smfex   +++|#
02339  M00S02303.smfex   +++|  SMFRCL(FET);
02340  M00S02304.smfex   +++|  FETRR=1;
02341  M00S02305.smfex   +++|  WRITEO(FET,0);
02342  M00S02306.smfex   +++|  REWRITR(FET,0);
02343  M00S02307.smfex   +++|  SMFRCL(FET);
02344  M00S02308.smfex   +++|  IOEND                      # OF ABTKILL #
02345  M00S02309.smfex   +++|
02346  M00S02310.smfex   +++|
02347  M00S02311.smfex   +++|CONTROL IFEQ METERING,1;
02348  M00S02312.smfex   +++|
02349  M00S02313.smfex   +++|  PROC BGNMETER;
02350  M00S02314.smfex   +++|    BEGIN
02351  M00S02315.smfex   +++|#
02352  M00S02316.smfex   +++|**        BGNMETER - INSTRUMENT BEGINNING OF EDIT SESSION.
02353  M00S02317.smfex   +++|*
02354  M00S02318.smfex   +++|*         BGNMETER ALLOWS THE SINGLE-USER EDITOR TO PASS DATA FROM
02355  M00S02319.smfex   +++|*         ITS FILE-BUILD PROCESS, INTO THE CORRESPONDING TASK IN
02356  M00S02320.smfex   +++|*         THE MULTI-USER EDITOR, WHICH CAN USE THIS INTERFACE TO
02357  M00S02321.smfex   +++|*         GLOBALLY RECORD THE DATA.
02358  M00S02322.smfex   +++|*
02359  M00S02323.smfex   +++|*         CALLS  INSTRMNT1.
02360  M00S02324.smfex   +++|#
02361  M00S02325.smfex   +++|    INSTRMNT1(INSTST"BGNEDT");
02362  M00S02326.smfex   +++|    END
02363  M00S02327.smfex   +++|
02364  M00S02328.smfex   +++|
02365  M00S02329.smfex   +++|  PROC WIOSTAT(ORDINAL);
02366  M00S02330.smfex   +++|    BEGIN
02367  M00S02331.smfex   +++|#
02368  M00S02332.smfex   +++|**        WIOSTAT - WORKIO STATISTICS INTERFACE.
02369  M00S02333.smfex   +++|*
02370  M00S02334.smfex   +++|*         WIOSTAT IS CALLED BY THE WORKFILE MANAGER AT NOTEWORTHY
02371  M00S02335.smfex   +++|*         EVENTS SO THAT STATISTICS CAN BE INCREMENTED.
02372  M00S02336.smfex   +++|*
02373  M00S02337.smfex   +++|*         ENTRY  ORDINAL - WHICH ACCUMULATOR TO INCREMENT.
02374  M00S02338.smfex   +++|*
02375  M00S02339.smfex   +++|*         CALLS  INSTRMNT2.
02376  M00S02340.smfex   +++|#
02377  M00S02341.smfex   +++|    ITEM ORDINAL;
02378  M00S02342.smfex   +++|    INSTRMNT2(INSTST"WORKIO",ORDINAL);
02379  M00S02343.smfex   +++|    END
02380  M00S02344.smfex   +++|
02381  M00S02345.smfex   +++|CONTROL FI;
02382  M00S02346.smfex   +++|PAGE                         # FNT MANAGEMENT    #
02383  M00S02347.smfex   +++|
02384  M00S02348.smfex   +++|
02385  M00S02349.smfex   +++|PROC RTRNWRKFIL;
02386  M00S02350.smfex   +++|  IOBEGIN(RTRNWRKFIL)
02387  M00S02351.smfex   +++|#
02388  M00S02352.smfex   +++|**        RTRNWRKFIL - RETURN THE WORKFILE FNT.
02389  M00S02353.smfex   +++|*
02390  M00S02354.smfex   +++|*         BEFORE SMFEX CAN TRANSITION A USER BACK TO THE SINGLE
02391  M00S02355.smfex   +++|*         USER EDITOR, IT MUST GET RID OF ITS LOCAL FNT FOR THE
02392  M00S02356.smfex   +++|*         USERS WORKFILE.  RTRNWRKFIL DOES THIS AND IS
02393  M00S02357.smfex   +++|*         DESIGNED TO BE CALLED BY RUNJOBS IN USER STATE JUST AFTER
02394  M00S02358.smfex   +++|*         THE TASK HAS TERMINATED AT THE AFTEREDIT LABEL.
02395  M00S02359.smfex   +++|*
02396  M00S02360.smfex   +++|*         ENTRY  FET - SETUP.
02397  M00S02361.smfex   +++|*
02398  M00S02362.smfex   +++|*         EXIT   CURUSDONE - TRUE.
02399  M00S02363.smfex   +++|*
02400  M00S02364.smfex   +++|*         CALLS  RETERN, SMFRCL.
02401  M00S02365.smfex   +++|#
02402  M00S02366.smfex   +++|  RETERN(FET,0);
02403  M00S02367.smfex   +++|  CURUSDONE=TRUE;  # ASSURE NO RECOVERY          #
02404  M00S02368.smfex   +++|  SMFRCL(FET);
02405  M00S02369.smfex   +++|
02406  M00S02370.smfex   +++|  IOEND                       # OF RTRNWRKFIL     #
02407  M00S02371.smfex   +++|
02408  M00S02372.smfex   +++|
02409  M00S02373.smfex   +++|PAGE                         # LOGIN/LOGOUT CONTROL        #
02410  M00S02374.smfex   +++|
02411  M00S02375.smfex   +++|
02412  M00S02376.smfex   +++|PROC SENDLOGOUT;
02413  M00S02377.smfex   +++|  IOBEGIN(SENDLOGOUT)
02414  M00S02378.smfex   +++|#
02415  M00S02379.smfex   +++|**        SENDLOGOUT - TRANSMIT LAST OUTPUT AND ROLLIN SINGLE.
02416  M00S02380.smfex   +++|*
02417  M00S02381.smfex   +++|*         SENDLOGOUT PERFORMS THE LAST PROCESSING WHEN A TASK
02418  M00S02382.smfex   +++|*         COMPLETES ALL MULTI-USER PROCESSING.  SENDLOGOUT SHOULD
02419  M00S02383.smfex   +++|*         BE CALLED ONLY BY RUNJOBS AFTER THE TASK HAS EXITED
02420  M00S02384.smfex   +++|*         AT LABEL AFTEREDIT AND AFTER THE WORKFILE LOCAL FNT HAS
02421  M00S02385.smfex   +++|*         BEEN RETURNED.  SENDLOGOUT ASSURES THAT ANY OUTPUT LEFT
02422  M00S02386.smfex   +++|*         IN OUR BUFFERS IS SEND ON TO IAF, THEN TELLS IAF THE
02423  M00S02387.smfex   +++|*         USER IS LEAVING MULTI-USER MODE, THEN ISSUES AN EESET
02424  M00S02388.smfex   +++|*         FUNCTION TO CAUSE ROLLIN OF THE SINGLE USER JOB.
02425  M00S02389.smfex   +++|*
02426  M00S02390.smfex   +++|*         THE TLX FUNCTION USED BY THE SINGLE USER JOB TO ROLLOUT
02427  M00S02391.smfex   +++|*         WILL BE RECALLED TO VERIFY THAT SMFEX HAS PROPERLY
02428  M00S02392.smfex   +++|*         DISPENSED WITH THE WORKFILE.  TLX THEN CONFORMS TO IAF
02429  M00S02393.smfex   +++|*         THAT THE MULTI-USER SESISON IS OVER.
02430  M00S02394.smfex   +++|*
02431  M00S02395.smfex   +++|*         ENTRY  TASKNXTTTO[CURTASK] - INDICATES RESIDUAL OUTPUT.
02432  M00S02396.smfex   +++|*
02433  M00S02397.smfex   +++|*         EXIT   TASKNXTTTO[CURTASK] - ZERO.
02434  M00S02398.smfex   +++|*
02435  M00S02399.smfex   +++|*         CALLS  TTOTRAP, TRANSMIT, EESET.
02436  M00S02400.smfex   +++|*
02437  M00S02401.smfex   +++|*         USES   TTOADDR, TTOLEN, TTOTYPE.
02438  M00S02402.smfex   +++|#
02439  M00S02403.smfex   +++|  IF TASKNXTTTO[CURTASK] NQ 0 THEN
02440  M00S02404.smfex   +++|    BEGIN
02441  M00S02405.smfex   +++|    TTOADDR=0;
02442  M00S02406.smfex   +++|    TTOLEN=0;
02443  M00S02407.smfex   +++|    TTOTYPE=TTOST"FORCE";
02444  M00S02408.smfex   +++|    TTOTRAP;
02445  M00S02409.smfex   +++|    END
02446  M00S02410.smfex   +++|  TASKTYPTTO[CURTASK]=SMF2IAF"LOGOUT";
02447  M00S02411.smfex   +++|  TRANSMIT;
02448  M00S02412.smfex   +++|  EESET((TTEQ*4096)+USEREJT[CURUSER]);
02449  M00S02413.smfex   +++|
02450  M00S02414.smfex   +++|  IOEND                        # OF SENDLOGOUT     #
02451  M00S02415.smfex   +++|PAGE                         # TRANSMIT TO IAFEX #
02452  M00S02416.smfex   +++|
02453  M00S02417.smfex   +++|
02454  M00S02418.smfex   +++|PROC TRANSMIT;
02455  M00S02419.smfex   +++|  IOBEGIN(TRANSMIT)
02456  M00S02420.smfex   +++|#
02457  M00S02421.smfex   +++|**        TRANSMIT - TRANSMIT A FUNCTION CODE/MESSAGE TO IAFEX.
02458  M00S02422.smfex   +++|*
02459  M00S02423.smfex   +++|*         TRANSMIT IS USED FOR THE ISSUANCE OF ALL CODES TO IAFEX
02460  M00S02424.smfex   +++|*         EXCEPT FOR THE SPECIAL CASE WHERE DOINPUT NEEDS TO
02461  M00S02425.smfex   +++|*         DISCONNECT A TERMINAL IN SERIALIZED OPERATION FOR
02462  M00S02426.smfex   +++|*         OVERFLOWED TABLES.  TRANSMIT EXECUTES IN USER MODE, THUS
02463  M00S02427.smfex   +++|*         THE EXECUTIVE HAS NO WAY TO SEND MESSAGES TO IAFEX EXCEPT
02464  M00S02428.smfex   +++|*         FOR THE CASE ALREADY MENTIONED.
02465  M00S02429.smfex   +++|*
02466  M00S02430.smfex   +++|*         EACH TASK HAS ITS OWN OUTPUT BUFFER WHICH IS USED TO
02467  M00S02431.smfex   +++|*         ACCUMULATE AND BATCH OUTPUT TEXT TOGETHER TO MINIMIZE CALLS
02468  M00S02432.smfex   +++|*         TO TRANSMIT.  ONCE TRANSMIT IS CALLED, IT USES THE SCP/UCP
02469  M00S02433.smfex   +++|*         FACILITY TO SEND THE TASK'S BUFFER TO IAF.  IF THE SCP/UCP
02470  M00S02434.smfex   +++|*         FUNCTIONS INDICATE THAT THE MESSAGE COULD NOT BE SENT TO
02471  M00S02435.smfex   +++|*         IAF ON THIS RECALL CYCLE, THEN THE TASK IS DELAYED
02472  M00S02436.smfex   +++|*         (ALLOWING OTHER TASKS TO EXECUTE IN PARALLEL) AND THE
02473  M00S02437.smfex   +++|*         SCP/UCP OPERATION WILL BE TRIED AGAIN.
02474  M00S02438.smfex   +++|*
02475  M00S02439.smfex   +++|*         ENTRY  TASKTYPTTO[CURTASK] - FUNCTION CODE FOR IAFEX.
02476  M00S02440.smfex   +++|*                TASKNXTTO[CURTASK] - AMOUNT OF TEXT TO GO WITH
02477  M00S02441.smfex   +++|*                    FUNCTION CODE.
02478  M00S02442.smfex   +++|*                CURUSIAFNUM - IAFEX TERMINAL NUMBER.
02479  M00S02443.smfex   +++|*                TTOWORDS, TTOBLOCKS - STATISTICAL ACCUMULATORS.
02480  M00S02444.smfex   +++|*                CURUSLASTIM, TIMEOFDAY - ALSO FOR STATISTICS.
02481  M00S02445.smfex   +++|*                CURUSRCVRY, CURUSINTRPT - INDICATE PURGE BUFFER.
02482  M00S02446.smfex   +++|*
02483  M00S02447.smfex   +++|*         EXIT   TTOWORDS, TTOBLOCKS - INCREMENTED.
02484  M00S02448.smfex   +++|*                CURUSLASTIM, TIMEOFDAY - UP TO DATE.
02485  M00S02449.smfex   +++|*
02486  M00S02450.smfex   +++|*         CALLS  MELT, SYSTEM, INSTRMNT2, SMFDLY.
02487  M00S02451.smfex   +++|*
02488  M00S02452.smfex   +++|*         USES   IAFHEADER, P<SSCBUFFER>.
02489  M00S02453.smfex   +++|#
02490  M00S02454.smfex   +++|  ITEM TMP1;
02491  M00S02455.smfex   +++|
02492  M00S02456.smfex   +++|  TRCSTR("NTR TRSMT$");
02493  M00S02457.smfex   +++|  CONTROL IFEQ TRACEFLAG,1;
02494  M00S02458.smfex   +++|    TMP1=TASKNXTTTO[CURTASK];
02495  M00S02459.smfex   +++|    TRACEBOTH("NXTTTO$",TMP1);
02496  M00S02460.smfex   +++|    TMP1=TASKTYPTTO[CURTASK];
02497  M00S02461.smfex   +++|    TRACEBOTH("TYPTTO$",TMP1);
02498  M00S02462.smfex   +++|  CONTROL FI;
02499  M00S02463.smfex   +++|
02500  M00S02464.smfex   +++|  CONTROL IFGQ PARANOIA,2;
02501  M00S02465.smfex   +++|    IF TASKNXTTTO[CURTASK] GR SIZTTOBUF THEN MELT("TRANSMIT 1$");
02502  M00S02466.smfex   +++|    IF CURUSIAFNUM GR MAXCONNECT THEN MELT("TRANSMIT 2$");
02503  M00S02467.smfex   +++|  CONTROL FI;
02504  M00S02468.smfex   +++|
02505  M00S02469.smfex   +++|  IF CURUSINTRPT OR CURUSRCVRY THEN
02506  M00S02470.smfex   +++|    BEGIN
02507  M00S02471.smfex   +++|    TASKNXTTTO[CURTASK]=0;
02508  M00S02472.smfex   +++|    IF SHUTDOWN EQ 2 OR TASKTYPTTO[CURTASK] EQ SMF2IAF"MSGOUT" OR
02509  M00S02473.smfex   +++|      TASKTYPTTO[CURTASK] EQ SMF2IAF"PROMPT" THEN
02510  M00S02474.smfex   +++|      BEGIN
02511  M00S02475.smfex   +++|      TASKTYPTTO[CURTASK]=0;
02512  M00S02476.smfex   +++|      IORET
02513  M00S02477.smfex   +++|      END
02514  M00S02478.smfex   +++|    END
02515  M00S02479.smfex   +++|
02516  M00S02480.smfex   +++|  IAFFUNC=TASKTYPTTO[CURTASK];
02517  M00S02481.smfex   +++|  IAFLEN=TASKNXTTTO[CURTASK]+1;
02518  M00S02482.smfex   +++|  IAFPTR=0;
02519  M00S02483.smfex   +++|  IAFTERM=CURUSIAFNUM;
02520  M00S02484.smfex   +++|  TTOBUFF[1]=IAFHEADER;
02521  M00S02485.smfex   +++|  CONTROL IFEQ METERING,1;
02522  M00S02486.smfex   +++|    TTOWORDS=TTOWORDS+IAFLEN;
02523  M00S02487.smfex   +++|    TTOBLOCKS=TTOBLOCKS+1;
02524  M00S02488.smfex   +++|  CONTROL FI;
02525  M00S02489.smfex   +++|
02526  M00S02490.smfex   +++|TRYTOSEND:                   # BACK HERE IF RETRY NEEDED   #
02527  M00S02491.smfex   +++|
02528  M00S02492.smfex   +++|  TTOBUFF[0]=0;
02529  M00S02493.smfex   +++|  P<SSCBUFFER>=LOC(TTOBUFFER);
02530  M00S02494.smfex   +++|  SSCTYPE=O"3";
02531  M00S02495.smfex   +++|  SSCCOUNT=IAFLEN;
02532  M00S02496.smfex   +++|  SYSREQ("SSC",0,LOC(SSCBUFFER),IAFSSID);
02533  M00S02497.smfex   +++|  IF SSCSTATUS LAN O"7776" EQ 0 THEN   # NO ERROR          #
02534  M00S02498.smfex   +++|    BEGIN
02535  M00S02499.smfex   +++|    CONTROL IFEQ TRACEFLAG,1;
02536  M00S02500.smfex   +++|      ITEM TMP2,TMP3;
02537  M00S02501.smfex   +++|      IAFHEADER=TTOBUFF[1];    # SINCE MAY HAVE LOST CTL     #
02538  M00S02502.smfex   +++|      TMP1=IAFFUNC;
02539  M00S02503.smfex   +++|      TMP2=IAFTERM;
02540  M00S02504.smfex   +++|      TMP3=IAFLEN-1;
02541  M00S02505.smfex   +++|      P<MOVFROM>=LOC(TTOBUFF[2]);
02542  M00S02506.smfex   +++|      TRACEBOTH("FUNCOUT$",TMP1);
02543  M00S02507.smfex   +++|      TRACEDEC(TMP2);
02544  M00S02508.smfex   +++|      IF IAFLEN GR 1 THEN TRACEWORDS(MOVFROM,TMP3);
02545  M00S02509.smfex   +++|    CONTROL FI;
02546  M00S02510.smfex   +++|    CONTROL IFEQ METERING,1;
02547  M00S02511.smfex   +++|      IF NOT CURUSOLDSND THEN
02548  M00S02512.smfex   +++|        BEGIN
02549  M00S02513.smfex   +++|        TMP1=TIMEOFDAY-CURUSLASTIM;
02550  M00S02514.smfex   +++|        INSTRMNT2(INSTST"RSPNS",TMP1);
02551  M00S02515.smfex   +++|        END
02552  M00S02516.smfex   +++|    CONTROL FI;
02553  M00S02517.smfex   +++|    IF TASKTYPTTO[CURTASK] EQ SMF2IAF"MSGOUT" THEN CURUSOLDSND=TRUE;
02554  M00S02518.smfex   +++|    ELSE CURUSOLDSND=FALSE;
02555  M00S02519.smfex   +++|    CURUSLASTIM=TIMEOFDAY;
02556  M00S02520.smfex   +++|    IORET
02557  M00S02521.smfex   +++|    END
02558  M00S02522.smfex   +++|  ELSE IF SSCSTATUS LAN O"7776" EQ 4 THEN   # IAF BUSY NOW      #
02559  M00S02523.smfex   +++|    BEGIN
02560  M00S02524.smfex   +++|    SMFDLY;
02561  M00S02525.smfex   +++|    GOTO TRYTOSEND;
02562  M00S02526.smfex   +++|    END
02563  M00S02527.smfex   +++|  ELSE MELT("CANT TALK TO IAFEX$");
02564  M00S02528.smfex   +++|
02565  M00S02529.smfex   +++|  IOEND                        # OF TRANSMIT       #
02566  M00S02530.smfex   +++|PAGE                         # VOLUNTEER TO SURRENDER TASK #
02567  M00S02531.smfex   +++|
02568  M00S02532.smfex   +++|
02569  M00S02533.smfex   +++|PROC VOLUNTEER;
02570  M00S02534.smfex   +++|  IOBEGIN(VOLUNTEER)
02571  M00S02535.smfex   +++|#
02572  M00S02536.smfex   +++|**        VOLUNTEER - SEE IF THIS TASK SHOULD SLOW DOWN.
02573  M00S02537.smfex   +++|*
02574  M00S02538.smfex   +++|*         VOLUNTEER IS USED TO PREVENT A TASK FROM EXCESSIVE RESOURCE
02575  M00S02539.smfex   +++|*         USAGE.  EDITING CODE SHOULD CALL VOLUNTEER PERIODICALLY
02576  M00S02540.smfex   +++|*         INSIDE ANY PROCESS WHICH IS POTENTIALLY LONG-RUNNING.  NOTE
02577  M00S02541.smfex   +++|*         THAT ANY CODE IN THE WORKFILE MANAGER (THE WORKIO MODULE)
02578  M00S02542.smfex   +++|*         IS A "MUST COMPLETE" FUNCTION - THAT MEANS THAT VOLUNTEER
02579  M00S02543.smfex   +++|*         CAN BE CALLED BY ACTUAL EDITING CODE BUT CANNOT BE CALLED
02580  M00S02544.smfex   +++|*         FROM WORKIO ITSELF.
02581  M00S02545.smfex   +++|*
02582  M00S02546.smfex   +++|*         VOLUNTEER FIRST CONSIDERS WHETHER THE TASK IS USING
02583  M00S02547.smfex   +++|*         EXCESSIVE CPU TIME ON AN INSTANTANEOUS BASIS.  THE
02584  M00S02548.smfex   +++|*         OPERATING SYSTEM REAL TIME MILLISECOND CLOCK IS FRESHLY
02585  M00S02549.smfex   +++|*         ACCESSED, AND THE CURRENT TIME IS COMPARED TO THE TIME
02586  M00S02550.smfex   +++|*         TAKEN AT THE START OF THE RECALL CYCLE TO SEE IF MORE THAN
02587  M00S02551.smfex   +++|*         A FEW MILLISECONDS OF CPU HAVE BEEN USED.  A CALCULATION
02588  M00S02552.smfex   +++|*         ATTEMPTS TO SELECT A THRESHOLD SUCH THAT SMFEX WILL NEVER
02589  M00S02553.smfex   +++|*         USE MORE THAN ABOUT HALF OF THE CPU.  THIS MEANS THAT FOR
02590  M00S02554.smfex   +++|*         AN INSTALLATION WHICH INTENDS THAT SUBSTANTIALLY ALL OF THE
02591  M00S02555.smfex   +++|*         CPU SHOULD BE USED FOR TEXT EDITING, SMFEX MAY BE
02592  M00S02556.smfex   +++|*         UNSUITABLE AND THE SINGLE-USER EDITORS MAY BE BETTER.
02593  M00S02557.smfex   +++|*
02594  M00S02558.smfex   +++|*         IF THE TASK IS CURRENTLY USING MORE THAN A FEW MILLISECONDS
02595  M00S02559.smfex   +++|*         OF CPU, IT DELAYS, AND THE REMAINDER OF THE VOLUNTEER
02596  M00S02560.smfex   +++|*         ALGORITHM WILL CONTINUE ON A LATER RECALL CYCLE.
02597  M00S02561.smfex   +++|*
02598  M00S02562.smfex   +++|*         THE REMAINDER OF THE VOLUNTEER ALGORITHM CONSIDERS WHETHER
02599  M00S02563.smfex   +++|*         A TASK HAS RESIDED IN ITS SWAPPED-IN MEMORY IMAGE FOR TOO
02600  M00S02564.smfex   +++|*         MUCH REAL TIME.  WE CALCULATE THE REAL TIME FROM THE TIME
02601  M00S02565.smfex   +++|*         AT WHICH THE TASK SWAPPED IN UNTIL THE PRESENT TIME.  IF
02602  M00S02566.smfex   +++|*         THE TIME DELTA EXCEEDS THE "VOLTIME" THRESHOLD AND THERE IS
02603  M00S02567.smfex   +++|*         QUEUED TERMINAL OUTPUT, THE TASK WILL SWAP OUT SO THE
02604  M00S02568.smfex   +++|*         OUTPUT CAN BE SENT.  IF THE TIME DELTA EXCEEDS THE
02605  M00S02569.smfex   +++|*         THRESHOLD AND THERE ARE MORE USERS AWAITING SWAPIN THAN THE
02606  M00S02570.smfex   +++|*         NUMBER OF TASKS FREE TO SWAP THEM IN, THEN THIS TASK WILL
02607  M00S02571.smfex   +++|*         SWAPOUT SO ANOTHER USER CAN SWAPIN.  IF THE NUMBER OF
02608  M00S02572.smfex   +++|*         TERMINAL INPUT BUFFERS IS DOWN TO APPROXIMATELY ONE FOURTH
02609  M00S02573.smfex   +++|*         OF THE TOTAL, THEN THIS TASK WILL SWAP OUT REGARDLESS OF
02610  M00S02574.smfex   +++|*         WHETHER WE HAVE EXCEEDED THE THRESHOLD.
02611  M00S02575.smfex   +++|*
02612  M00S02576.smfex   +++|*         THUS, THE "VOLTIME" THRESHOLD REPRESENTS THE AMOUNT OF TIME
02613  M00S02577.smfex   +++|*         A TASK IS ASSURED THAT IT CAN REMAIN SWAPPED IN.  IF THE
02614  M00S02578.smfex   +++|*         TASK IS NOT PRODUCING OUTPUT AND THERE IS NO EXCESS QUEUE
02615  M00S02579.smfex   +++|*         FOR SWAPIN, THE TASK CAN EXCEED THE TRESHOLD.  BUT IF THERE
02616  M00S02580.smfex   +++|*         IS A CRITICAL RESOURCE SHORTAGE (INPUT BUFFERS) THEN ALL
02617  M00S02581.smfex   +++|*         BETS ARE OFF AND WE SWAP THIS TASK AS SOON AS IT HAS
02618  M00S02582.smfex   +++|*         VOLUNTEERED, WITHOUT ALLOWING THE NORMAL GUARANTEED TIME.
02619  M00S02583.smfex   +++|*
02620  M00S02584.smfex   +++|*         ENTRY  TIMEOFDAY - TIME AT WHICH THIS RECALL CYCLE STARTED.
02621  M00S02585.smfex   +++|*                OLDTIMEDAY - TIME FOR START OF PREVIOUS RECALL CYCLE,
02622  M00S02586.smfex   +++|*                    OR TIME OF VOLUNTEER EXECUTION WITHIN PREVIOUS
02623  M00S02587.smfex   +++|*                    RECALL CYCLE IF VOLUNTEER WAS CALLED.
02624  M00S02588.smfex   +++|*                TASKTIME[CURTASK] - WHEN THIS TASK SWAPPED IN.
02625  M00S02589.smfex   +++|*                TASKNXTTTO[CURTASK] - WHETHER OUTPUT IS PENDING.
02626  M00S02590.smfex   +++|*                TASKSAVAIL - TOTAL USABLE TASKS.
02627  M00S02591.smfex   +++|*                TASKSBUSY - NUMBER OF TASKS USED NOW.
02628  M00S02592.smfex   +++|*                SWPQSIZE - NUMBER OF USERS AWAITING SWAPIN.
02629  M00S02593.smfex   +++|*                REMAINTTI - NUMBER OF UNUSED INPUT BUFFERS.
02630  M00S02594.smfex   +++|*
02631  M00S02595.smfex   +++|*         EXIT   TIMEOFDAY - UP TO DATE.
02632  M00S02596.smfex   +++|*                TASKNXTTTO[CURTASK] - CLEARED IF SWAPPED.
02633  M00S02597.smfex   +++|*                TASKTIME[CURTASK] - NEW VALUE IF SWAPPED.
02634  M00S02598.smfex   +++|*                CURUSCRUNCH - TRUE IF SWAP FOR OVERTIME BUT NO OUTPUT.
02635  M00S02599.smfex   +++|*                TASKREQUE[CURTASK] - TRUE IF SWAP NOT FOR OUTPUT.
02636  M00S02600.smfex   +++|*
02637  M00S02601.smfex   +++|*         CALLS  RTIME, MIN, MAX, SMFDLY, INSTRMNT1, INSTRMNT2,
02638  M00S02602.smfex   +++|*                TTSYNC, TTOTRAP.
02639  M00S02603.smfex   +++|*
02640  M00S02604.smfex   +++|*         USES   TTOADDR, TTOLEN, TTOTYPE.
02641  M00S02605.smfex   +++|#
02642  M00S02606.smfex   +++|  ITEM DELTA, SURRENDER;
02643  M00S02607.smfex   +++|
02644  M00S02608.smfex   +++|  RTIME(NEWTIMEDAY);
02645  M00S02609.smfex   +++|  NEWTIMEDAY=B<24,36>NEWTIMEDAY;
02646  M00S02610.smfex   +++|  DELTA=MAX(50,MIN(10,(TIMEOFDAY-OLDTIMEDAY)/2));
02647  M00S02611.smfex   +++|  IF NEWTIMEDAY-TIMEOFDAY GR DELTA THEN
02648  M00S02612.smfex   +++|    BEGIN
02649  M00S02613.smfex   +++|    SMFDLY;
02650  M00S02614.smfex   +++|    CONTROL IFEQ METERING,1;
02651  M00S02615.smfex   +++|      INSTRMNT1(INSTST"DROPCPU");
02652  M00S02616.smfex   +++|    CONTROL FI;
02653  M00S02617.smfex   +++|    END
02654  M00S02618.smfex   +++|
02655  M00S02619.smfex   +++|  # NEXT CODE IS NON-REENTRANT, MUST RUN INSTANTANEOUSLY #
02656  M00S02620.smfex   +++|
02657  M00S02621.smfex   +++|  DELTA=TIMEOFDAY-TASKTIME[CURTASK];
02658  M00S02622.smfex   +++|  SURRENDER=0;
02659  M00S02623.smfex   +++|
02660  M00S02624.smfex   +++|  # TRY TO MOVE IF SITTING ON TYPABLE OUTPUT FOR A LONG TIME #
02661  M00S02625.smfex   +++|  IF TASKNXTTTO[CURTASK] NQ 0 AND DELTA GQ VOLTIME*4
02662  M00S02626.smfex   +++|    THEN SURRENDER=1;
02663  M00S02627.smfex   +++|
02664  M00S02628.smfex   +++|  # ALSO TRY TO MOVE IF SHORT ON TASKS FOR A SHORT TIME #
02665  M00S02629.smfex   +++|  IF TASKSAVAIL-TASKSBUSY LS SWPQSIZE AND DELTA GQ VOLTIME
02666  M00S02630.smfex   +++|    THEN SURRENDER=2;
02667  M00S02631.smfex   +++|
02668  M00S02632.smfex   +++|  # MOVE IF CRITICAL RESOURCE SHORTAGE REGARDLESS OF TIME #
02669  M00S02633.smfex   +++|  IF REMAINTTI LQ (NUMTTIBUF+3)/4
02670  M00S02634.smfex   +++|    THEN SURRENDER=3;
02671  M00S02635.smfex   +++|
02672  M00S02636.smfex   +++|  # END OF INSTANTANEOUS ALGORITHM #
02673  M00S02637.smfex   +++|
02674  M00S02638.smfex   +++|  IF SURRENDER NQ 0 THEN       # FACE WRITING ON WALL        #
02675  M00S02639.smfex   +++|    BEGIN
02676  M00S02640.smfex   +++|    TRCBOTH("PREEMPT$",CURUSER);
02677  M00S02641.smfex   +++|    CONTROL IFEQ METERING,1;
02678  M00S02642.smfex   +++|      INSTRMNT2(INSTST"PREEMPT",SURRENDER);
02679  M00S02643.smfex   +++|    CONTROL FI;
Line S02644 Modification History
M01 (Removed by) smfex3
Seq #  *Modification Id* Act 
----------------------------+
02680  M01S02644.smfex3  ---|    IF TASKNXTTTO[CURTASK] EQ 0 THEN
02681  M01S02645.smfex3  ---|      BEGIN
02682  M01S02646.smfex3  ---|      IF DELTA GQ 0 THEN CURUSCRUNCH=TRUE;
02683  M01S02647.smfex3  ---|      TASKREQUE[CURTASK]=TRUE;
02684  M01S02648.smfex3  ---|      END
02685  M01S02649.smfex3  ---|    # NEED FOR INSTANTANEOUS COMPUTATION ENDS HERE #
02686  M01S02650.smfex3  ---|    IF SCREENMODE THEN VDSYNCH;
02687  M01S02651.smfex3  ---|    ELSE TTSYNC;
Line S00001 Modification History
M01 (Added by) smfex3
Seq #  *Modification Id* Act 
----------------------------+
02688  M01S00001.smfex3  +++|    IF SCREENMODE THEN
02689  M01S00002.smfex3  +++|      BEGIN                          # IF IN SCREEN MODE #
02690  M01S00003.smfex3  +++|      VDSYNCH;                       # MUST PRECEED TASKNXTTTO CHECK #
02691  M01S00004.smfex3  +++|      END                            # SINCE OUTPUT MAY BE FLUSHED #
02692  M01S00005.smfex3  +++|    ELSE
02693  M01S00006.smfex3  +++|      BEGIN                          # LINE MODE #
02694  M01S00007.smfex3  +++|      TTSYNC;                        # MUST PRECEED TASKNXTTTO CHECK #
02695  M01S00008.smfex3  +++|      END                            # SINCE OUTPUT MAY BE FLUSHED #
02696  M01S00009.smfex3  +++|    IF TASKNXTTTO[CURTASK] EQ 0 THEN
02697  M01S00010.smfex3  +++|      BEGIN                          # IF NO OUTPUT QUEUED FOR USER #
02698  M01S00011.smfex3  +++|      CURUSCRUNCH=TRUE;              # NO OUTPUT, JUST CRUNCHING #
02699  M01S00012.smfex3  +++|      TASKREQUE[CURTASK]=TRUE;       # SHOULD BE REQUEUED #
02700  M01S00013.smfex3  +++|      END
02701  M00S02652.smfex   +++|    TTOADDR=0;
02702  M00S02653.smfex   +++|    TTOLEN=0;
02703  M00S02654.smfex   +++|    TTOTYPE=TTOST"FORCE";
02704  M00S02655.smfex   +++|    TTOTRAP;
02705  M00S02656.smfex   +++|    END
02706  M00S02657.smfex   +++|
02707  M00S02658.smfex   +++|  IOEND                        # OF VOLUNTEER      #
02708  M00S02659.smfex   +++|PAGE                         # TTY INPUT HOOK    #
02709  M00S02660.smfex   +++|
02710  M00S02661.smfex   +++|
02711  M00S02662.smfex   +++|PROC TTITRAP;
02712  M00S02663.smfex   +++|  IOBEGIN(TTITRAP)
02713  M00S02664.smfex   +++|#
02714  M00S02665.smfex   +++|**        TTITRAP - PROVIDE EDITOR CODE WITH INPUT TEXT.
02715  M00S02666.smfex   +++|*
02716  M00S02667.smfex   +++|*         TTITRAP IS CALLED BY THE EDITOR IN LIEU OF CIO READ
02717  M00S02668.smfex   +++|*         FUNCTIONS AGAINST AN INPUT FET.  CALLING TTITRAP INSTEAD OF
02718  M00S02669.smfex   +++|*         CIO IS DONE BY CONDITIONAL COMPILATION OF CODE IN THE
02719  M00S02670.smfex   +++|*         TERMIO MODULE.  THE EDITOR IS NOT ALLOWED TO OBTAIN INPUT
02720  M00S02671.smfex   +++|*         BY ANY MEANS EXCEPT TO CALL TERMIO AND LET IT DECIDE WHICH
02721  M00S02672.smfex   +++|*         MECHANISM IS APPROPRIATE FOR THE VERSION OF THE EDITOR.
02722  M00S02673.smfex   +++|*
02723  M00S02674.smfex   +++|*         IN ADDITION TO PROVIDING INPUT, TTITRAP ALSO PROVIDES A
02724  M00S02675.smfex   +++|*         MEANS TO PURGE ANY UNUSED INPUT FROM THE BUFFERS CHAINS.
02725  M00S02676.smfex   +++|*         THIS IS INDICATED BY A NEGATIVE VALUE IN THE TTILEN
02726  M00S02677.smfex   +++|*         PARAMETER.
02727  M00S02678.smfex   +++|*
02728  M00S02679.smfex   +++|*         WHEN INPUT IS DESIRED, TERMIO USES A POSITIVE VALUE IN THE
02729  M00S02680.smfex   +++|*         TTILEN PARAMETER TO INDICATE THE MAXIMUM NUMBER OF WORDS IT
02730  M00S02681.smfex   +++|*         CAN ACCEPT.  THE WORKING BUFFER IS POINTED TO BY THE
02731  M00S02682.smfex   +++|*         TTIADDR PARAMETER.  THE TTINEXT PARAMETER IS MAINTAINED BY
02732  M00S02683.smfex   +++|*         THIS ROUTINE TO KEEP TRACK OF WHAT PORTIONS OF THE CURRENT
02733  M00S02684.smfex   +++|*         BUFFER CHAIN HAVE ALREADY BEEN TRANSMITTED.
02734  M00S02685.smfex   +++|*
02735  M00S02686.smfex   +++|*         INPUT FROM IAFEX IS MAINTAINED BY SMFEX, UNTIL TTITRAP IS
02736  M00S02687.smfex   +++|*         READY TO PASS ON TO THE EDITING CODE, IN A CHAIN OF ONE OR
02737  M00S02688.smfex   +++|*         MORE TERMINAL INPUT BUFFERS.  ONE BUFFER IS CHAINED FOR
02738  M00S02689.smfex   +++|*         EACH MESSAGE FRAGMENT SENT BY IAFEX.  TTITRAP MAINTAINS THE
02739  M00S02690.smfex   +++|*         TTILAST PARAMETER, WHICH IS THE TEXT OF THE LAST WORD
02740  M00S02691.smfex   +++|*         PASSED TO TERMIO, TO KNOW WHETHER THE PREVIOUS TTITRAP
02741  M00S02692.smfex   +++|*         CYCLE ENCOUNTERED A ZERO BYTE TERMINATOR.  THIS ENABLES
02742  M00S02693.smfex   +++|*         TTITRAP TO KNOW WHETHER THE EDITING TASK IS IN THE MIDDLE
02743  M00S02694.smfex   +++|*         OF A SERIES OF FRAGMENTS OR IS AWAITING THE FIRST FRAGMENT
02744  M00S02695.smfex   +++|*         OF A MESSAGE.
02745  M00S02696.smfex   +++|*
02746  M00S02697.smfex   +++|*         IF TTITRAP DETERMINES THAT THE TASK IS IN THE MIDDLE OF A
02747  M00S02698.smfex   +++|*         SERIES OF FRAGMENTS, BUT DOES NOT YET HAVE THE NEXT
02748  M00S02699.smfex   +++|*         FRAGMENT FROM IAFEX, TTITRAP WILL ATTEMPT TO KEEP THE TASK
02749  M00S02700.smfex   +++|*         DELAYING IN MEMORY, USING THE SPINWHEELS FUNCTION.  THIS IS
02750  M00S02701.smfex   +++|*         DONE BECAUSE THERE IS AN EXCELLENT PROBABILITY THAT THE
02751  M00S02702.smfex   +++|*         NEXT INPUT FRAGMENT WILL ARRIVE FROM IAFEX WITHIN A FEW
02752  M00S02703.smfex   +++|*         MILLISECONDS.  ON THE OTHER HAND, WHEN THE EDITING TASK
02753  M00S02704.smfex   +++|*         ASKS FOR THE FIRST FRAGMENT OF A MESSAGE AND NO TEXT HAS
02754  M00S02705.smfex   +++|*         ARRIVED YET FROM IAFEX, IT IS LIKELY THAT SEVERAL SECONDS
02755  M00S02706.smfex   +++|*         WILL PASS BEFORE THE INPUT ARRIVES, SO THAT TASK IS ALLOWED
02756  M00S02707.smfex   +++|*         TO SWAPOUT.
02757  M00S02708.smfex   +++|*
02758  M00S02709.smfex   +++|*         ONCE THE TASK ADVANCES THRU TTITRAP BEYOND ANY WHEELSPIN OR
02759  M00S02710.smfex   +++|*         ANY SWAPOUT, TTITRAP ASSEMBLES AS MUCH INPUT TEXT AS IT
02760  M00S02711.smfex   +++|*         CAN, UNTIL EITHER THE TTILEN PARAMETER IS EXHAUSTED OR THE
02761  M00S02712.smfex   +++|*         END OF ONE BUFFER IS REACHED.  TEXT FROM THE NEXT BUFFER OF
02762  M00S02713.smfex   +++|*         A CHAIN OF SEVERAL FRAGMENTS CANNOT BE PROCESSED UNTIL THE
02763  M00S02714.smfex   +++|*         NEXT CALL TO TTITRAP.  THIS MEANS THAT THE SIZE OF EACH
02764  M00S02715.smfex   +++|*         FRAGMENT ALLOWED BY IAFEX AND SMFEX MUST BE ADEQUATE FOR
02765  M00S02716.smfex   +++|*         COMPLETE INPUTS WHEN THE EDITOR IS USED IN LINE MODE.  THIS
02766  M00S02717.smfex   +++|*         RESTRICTION IS IN EFFECT BECAUSE THE LINE EDITOR REQUESTS
02767  M00S02718.smfex   +++|*         INPUT IN COMPLETE LINE IMAGES.  THE SCREEN EDITOR, HOWEVER,
02768  M00S02719.smfex   +++|*         ASKS FOR INPUT ONE WORD AT A TIME, SO MULTIPLE FRAGMENTS
02769  M00S02720.smfex   +++|*         CAN BE PROCESSED WITH MULTIPLE TTITRAP CALLS.
02770  M00S02721.smfex   +++|*
02771  M00S02722.smfex   +++|*         WHEN TTITRAP DECIDES TO SWAP THE TASK OUT, IT CALLS PAUSEIO
02772  M00S02723.smfex   +++|*         IN THE WORKFILE MANAGER.  THIS IS DONE BECAUSE WORKIO HOLDS
02773  M00S02724.smfex   +++|*         SOME TRANSIENT RESOURCES, SUCH AS ITS CIRCULAR BUFFER, AND
02774  M00S02725.smfex   +++|*         NEEDS THE OPPORTUNITY TO COMPLETE ITS USAGE OF THESE
02775  M00S02726.smfex   +++|*         RESOURCES.
02776  M00S02727.smfex   +++|*
02777  M00S02728.smfex   +++|*
02778  M00S02729.smfex   +++|*         ENTRY  TTILEN - NEGATIVE MEANS PURGE UNUSED INPUT.
02779  M00S02730.smfex   +++|*                         POSITIVE IS TASKS CAPACITY FOR TEXT.
02780  M00S02731.smfex   +++|*                TTIADDR - WHERE THE TEXT SHOULD GO.
02781  M00S02732.smfex   +++|*                CURUSTTIBUF - FIRST BUFFER LINKAGE.
02782  M00S02733.smfex   +++|*                TTINEXT - WHERE TTITRAP PREVIOUS EXTRACTED TEXT.
02783  M00S02734.smfex   +++|*                TTILAST - LAST WORD OF TEXT FROM PREVIOUS TTITRAP.
02784  M00S02735.smfex   +++|*                RUNTIME - FOR STATISTICS.
02785  M00S02736.smfex   +++|*                TIMEOFDAY, TASKTIME[CURTASK] - FOR STATISTICS.
02786  M00S02737.smfex   +++|*                ACCTCIO, ACCTTRANS - STATISTICS/ACCOUNTING.
02787  M00S02738.smfex   +++|*                TTOWORDS, TTOBLOCKS - FOR STATISTICS.
02788  M00S02739.smfex   +++|*                TTIBUFADDR[ALL] - SETUP.
02789  M00S02740.smfex   +++|*                TTIBUFLNK[ALL] - LINKAGES.
02790  M00S02741.smfex   +++|*                TTIBUFLEN[ALL] - FRAGMENT SIZES.
02791  M00S02742.smfex   +++|*                TTIBITS - ALLOCATION BITMASK FOR BUFFERS.
02792  M00S02743.smfex   +++|*
02793  M00S02744.smfex   +++|*         EXIT   TTINEXT - INCREMENTED.
02794  M00S02745.smfex   +++|*                CURUSTTIBUF - ADVANCED/CLEARED VIA LINKAGE.
02795  M00S02746.smfex   +++|*                TIMEOFDAY - UP TO DATE.
02796  M00S02747.smfex   +++|*                TASKTIME[CURTASK] - TIME OF SWAPOUT IF ANY.
02797  M00S02748.smfex   +++|*                RUNTIME, ACCTCIO, ACCTTRANS - INCREMENTED.
02798  M00S02749.smfex   +++|*                SPINTIME, RUNTIME, CIOCOUNT - CLEARED IF SWAPPED.
02799  M00S02750.smfex   +++|*                CURUSOKOUT - TRUE.
02800  M00S02751.smfex   +++|*                TTILEN - DECREMENTED.
02801  M00S02752.smfex   +++|*                TTILAST - UPDATED.
02802  M00S02753.smfex   +++|*                REMAINTTI - INCREMENTED IF BUFFER EMPTIED.
02803  M00S02754.smfex   +++|*                TTOWORDS, TTOBLOCKS - CLEARED IF SWAPPED.
02804  M00S02755.smfex   +++|*
02805  M00S02756.smfex   +++|*         CALLS  PURGETTI, SPINWHEELS, CLEARQUE, PAUSEIO, INSTRMNT1,
02806  M00S02757.smfex   +++|*                INSTRMNT2, INSTRMNT3, TTOTRAP, MIN, MOVEWD, DEALLOC.
02807  M00S02758.smfex   +++|*
02808  M00S02759.smfex   +++|*         USES   TTOLEN, TTOTYPE.
02809  M00S02760.smfex   +++|#
02810  M00S02761.smfex   +++|  ITEM TMP1, TMP2, TMP3;
Line S02762 Modification History
M01 (Removed by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
02811  M01S02762.smfex1  ---|  ITEM QUESTION1=O"71000013000000000000";
02812  M01S02763.smfex1  ---|  ITEM QUESTION2=O"71550002000000000000";
02813  M01S02764.smfex1  ---|  ITEM XPTINCTL=O"00064704001500000000";
Line S00001 Modification History
M01 (Added by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
02814  M01S00001.smfex1  +++|  ITEM QUESTION1  I=O"7100 0013 0000 0000 0000";  # PROMPT ONE #
02815  M01S00002.smfex1  +++|  ITEM QUESTION2  I=O"7155 0013 0000 0000 0000";  # PROMPT TWO #
02816  M01S00003.smfex1  +++|  ITEM XPTINCTL   I=O"0006 4704 0015 0000 0000";  # XPARENT INPUT #
02817  M00S02765.smfex   +++|
02818  M00S02766.smfex   +++|  TRCSTR("NTR ITRP$");
02819  M00S02767.smfex   +++|
02820  M00S02768.smfex   +++|  IF TTILEN LS 0 THEN          # PURGE ANY BUFFERS #
02821  M00S02769.smfex   +++|    BEGIN
02822  M00S02770.smfex   +++|    IF CURUSTTIBUF NQ 0 THEN PURGETTI;
02823  M00S02771.smfex   +++|    TTINEXT=0;
02824  M00S02772.smfex   +++|    IORET
02825  M00S02773.smfex   +++|    END
02826  M00S02774.smfex   +++|
02827  M00S02775.smfex   +++|  IF CURUSTTIBUF EQ 0 AND B<48,12>TTILAST NQ 0 THEN
02828  M00S02776.smfex   +++|    BEGIN                    # DELAY SINCE MORE INPUT DUE ASAP       #
02829  M00S02777.smfex   +++|    SPINWHEELS;              # DELAY TILL INPUT ARRIVES OR TIMEOUT   #
02830  M00S02778.smfex   +++|    CLEARQUE;
02831  M00S02779.smfex   +++|    END
02832  M00S02780.smfex   +++|
02833  M00S02781.smfex   +++|  IF NOT CURUSOKOUT THEN             # FIRST TRANSACTION #
02834  M00S02782.smfex   +++|    BEGIN
02835  M00S02783.smfex   +++|    CURUSOKOUT=TRUE;
Line S02784 Modification History
M01 (Removed by) ns2186
Seq #  *Modification Id* Act 
----------------------------+
02836  M01S02784.ns2186  ---|    IF NOT SCREENMODE THEN
Line S00002 Modification History
M01 (Added by) ns2186
Seq #  *Modification Id* Act 
----------------------------+
02837  M01S00002.ns2186  +++|    IF SCREENMODE THEN
02838  M01S00003.ns2186  +++|      BEGIN
02839  M01S00004.ns2186  +++|      ROWPAINT[COMMANDROW]=TRUE;
02840  M01S00005.ns2186  +++|      END
02841  M01S00006.ns2186  +++|    ELSE
02842  M00S02785.smfex   +++|      BEGIN
02843  M00S02786.smfex   +++|      TTOADDR=LOC(QUESTION1);
02844  M00S02787.smfex   +++|      TTOLEN=1;
02845  M00S02788.smfex   +++|      TTOTYPE=TTOST"NORMAL";
02846  M00S02789.smfex   +++|      TTOTRAP;
02847  M00S02790.smfex   +++|      END
02848  M00S02791.smfex   +++|    END
02849  M00S02792.smfex   +++|
02850  M00S02793.smfex   +++|  IF CURUSTTIBUF EQ 0 THEN   # NORMAL TRANSACTION SO SWAPOUT         #
02851  M00S02794.smfex   +++|    BEGIN
02852  M00S02795.smfex   +++|    PAUSEIO;                   # LET WORKIO PP'S DROP        #
02853  M00S02796.smfex   +++|    RUNTIME=TIMEOFDAY-TASKTIME[CURTASK]+RUNTIME;
02854  M00S02797.smfex   +++|    TASKTIME[CURTASK]=TIMEOFDAY;
02855  M00S02798.smfex   +++|    ACCTCIO=ACCTCIO+CIOCOUNT;
02856  M00S02799.smfex   +++|    ACCTTRANS=ACCTTRANS+1;
02857  M00S02800.smfex   +++|    CONTROL IFEQ METERING,1;
02858  M00S02801.smfex   +++|      INSTRMNT2(INSTST"TASKUTIL",RUNTIME);
02859  M00S02802.smfex   +++|      INSTRMNT3(INSTST"EDTCIO",RUNTIME-SPINTIME,CIOCOUNT);
02860  M00S02803.smfex   +++|      INSTRMNT1(INSTST"TRANS");
02861  M00S02804.smfex   +++|    CONTROL FI;
02862  M00S02805.smfex   +++|    IF NOT CURUSINTRPT THEN
02863  M00S02806.smfex   +++|      BEGIN                     # NO FRESH BREAK, CAN PROMPT  #
02864  M00S02807.smfex   +++|      TTOADDR=LOC(QUESTION2);
Line S02808 Modification History
M01 (Removed by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
02865  M01S02808.v23l617 ---|      IF SCREENMODE THEN TTOADDR=LOC(XPTINCTL);
02866  M00S02809.smfex   +++|      TTOLEN=1;
Line S00006 Modification History
M01 (Added by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
02867  M01S00006.v23l617 +++|      IF SCREENMODE THEN             # IF SCREEN MODE #
02868  M01S00007.v23l617 +++|        BEGIN
02869  M01S00008.v23l617 +++|        IF TABTYPHEAD[0] THEN TTOLEN=0;  # IF TYPEAHEAD USED #
02870  M01S00009.v23l617 +++|        ELSE TTOADDR=LOC(XPTINCTL);  # NO TYPEAHEAD #
02871  M01S00010.v23l617 +++|        END
02872  M00S02810.smfex   +++|      TTOTYPE=TTOST"PROMPT";
02873  M00S02811.smfex   +++|      TTOTRAP;
02874  M00S02812.smfex   +++|      END
02875  M00S02813.smfex   +++|    SPINTIME=0;
02876  M00S02814.smfex   +++|    RUNTIME=0;
02877  M00S02815.smfex   +++|    CIOCOUNT=0;
02878  M00S02816.smfex   +++|    CONTROL IFEQ METERING,1;
02879  M00S02817.smfex   +++|      INSTRMNT3(INSTST"XMIT",TTOWORDS,TTOBLOCKS);
02880  M00S02818.smfex   +++|      TTOBLOCKS=0;
02881  M00S02819.smfex   +++|      TTOWORDS=0;
02882  M00S02820.smfex   +++|    CONTROL FI;
02883  M00S02821.smfex   +++|    END
02884  M00S02822.smfex   +++|                             # NOW WE KNOW WE HAVE SOMETHING         #
02885  M00S02823.smfex   +++|
02886  M00S02824.smfex   +++|  MEM[TTIADDR]=0;            # ASSURE DEFAULT NULL LINE    #
02887  M00S02825.smfex   +++|  WHYLE CURUSTTIBUF NQ 0 AND TTILEN GR 0 DO
02888  M00S02826.smfex   +++|    BEGIN
02889  M00S02827.smfex   +++|    TMP1=CURUSTTIBUF;
02890  M00S02828.smfex   +++|    P<MOVFROM>=TTIBUFADDR[TMP1]+TTINEXT;
02891  M00S02829.smfex   +++|    P<MOVTO>=TTIADDR;
02892  M00S02830.smfex   +++|    TMP2=TTIBUFLEN[TMP1]-TTINEXT;
02893  M00S02831.smfex   +++|    TMP3=MIN(TMP2,TTILEN);
02894  M00S02832.smfex   +++|    MOVEWD(TMP3,MOVFROM,MOVTO);
02895  M00S02833.smfex   +++|    TTINEXT=TTINEXT+TMP3;    # INCREMENT SOURCE ADDR       #
02896  M00S02834.smfex   +++|    TTILEN=TTILEN-TMP3;      # DECREMENT CALLERS COUNT     #
02897  M00S02835.smfex   +++|    TTILAST=MEM[LOC(MOVFROM)+TMP3-1];    # SHOWS WHETHER EOL SEEN    #
02898  M00S02836.smfex   +++|    IF TTINEXT GQ TTIBUFLEN[TMP1] THEN
02899  M00S02837.smfex   +++|      BEGIN                     # RELEASE THIS BUFFER, POINT NEXT    #
02900  M00S02838.smfex   +++|      TTINEXT=0;
02901  M00S02839.smfex   +++|      DEALLOC(TTIBITS,TMP1,NUMTTIBIT);
02902  M00S02840.smfex   +++|      REMAINTTI=REMAINTTI+1;
02903  M00S02841.smfex   +++|      CURUSTTIBUF=TTIBUFLNK[TMP1];
02904  M00S02842.smfex   +++|      END
02905  M00S02843.smfex   +++|    END
02906  M00S02844.smfex   +++|
02907  M00S02845.smfex   +++|  IOEND                        # OF TTITRAP        #
02908  M00S02846.smfex   +++|PAGE                         # TTY OUTPUT AND SWAPOUT HOOK #
02909  M00S02847.smfex   +++|
02910  M00S02848.smfex   +++|
02911  M00S02849.smfex   +++|PROC TTOTRAP;
02912  M00S02850.smfex   +++|  IOBEGIN(TTOTRAP)
02913  M00S02851.smfex   +++|#
02914  M00S02852.smfex   +++|**        TTOTRAP - QUEUE/ISSUE OUTPUT, SWAP AS NEEDED.
02915  M00S02853.smfex   +++|*
02916  M00S02854.smfex   +++|*         TTOTRAP IS CALLED BY EDITOR CODE IN LIEU OF CIO WRITE
02917  M00S02855.smfex   +++|*         FUNCTIONS AGAINST AN OUTPUT FET.  EDITING CODE IS REQUIRED
02918  M00S02856.smfex   +++|*         TO INTERFACE ALL OUTPUT THRU THE TERMIO MODULE, WHICH USES
02919  M00S02857.smfex   +++|*         CONDITIONAL COMPILATION TO SELECT THE RIGHT TECHNIQUE OF
02920  M00S02858.smfex   +++|*         OUTPUT FOR THE VERSION OF THE EDITOR.
02921  M00S02859.smfex   +++|*
02922  M00S02860.smfex   +++|*         TTOTRAP IS ALSO USED BY THE VOLUNTEER AND TTITRAP ROUTINES
02923  M00S02861.smfex   +++|*         OF SMFEX.  TTOTRAP PROVIDES SWAPOUT LOGIC FOR THOSE CALLERS
02924  M00S02862.smfex   +++|*         TOGETHER WITH ISSUANCE OF RESIDUAL OUTPUT.
02925  M00S02863.smfex   +++|*
02926  M00S02864.smfex   +++|*         TTOTRAP IS CONTROLLED PRIMARILY BY THE TTOTYPE PARAMETER.
02927  M00S02865.smfex   +++|*         THE "NORMAL" VALUE INDICATES THAT THE CALLER'S INTENT IS TO
02928  M00S02866.smfex   +++|*         OFFER SOME OUTPUT TEXT.  TTOTRAP QUEUES THIS TEXT INTO THE
02929  M00S02867.smfex   +++|*         TASK'S UNIQUE OUTPUT BUFFER AS POSSIBLE, CALLING THE
02930  M00S02868.smfex   +++|*         TRANSMIT ROUTINE TO SEND TO IAFEX WHENEVER THE BUFFER IS
02931  M00S02869.smfex   +++|*         FULL.  FOR THIS TYPE OF COMMUNICATION TO IAFEX, TTOTRAP
02932  M00S02870.smfex   +++|*         THEN USES THE SPINWHEELS FUNCTION TO HOLD ONTO THE TASK FOR
02933  M00S02871.smfex   +++|*         A FEW EXTRA MILLISEONDS, SINCE THERE IS ABOUT AN EVEN
02934  M00S02872.smfex   +++|*         CHANCE THAT IAFEX WILL QUICKLY RESPOND AND ASK SMFEX TO
02935  M00S02873.smfex   +++|*         CONTINUE TASK EXECUTION.  IF IAFEX FAILS TO RESPOND WITHIN
02936  M00S02874.smfex   +++|*         THE LIMITATIONS OF THE SPINWHEELS ROUTINE, THEN TTOTRAP
02937  M00S02875.smfex   +++|*         ASSUMES IT WILL BE SEVERAL SECONDS BEFORE IAFEX AND THE
02938  M00S02876.smfex   +++|*         NETWORK CAN ACCEPT ANY OTHER OUTPUT FOR THIS USER, AND
02939  M00S02877.smfex   +++|*         TTOTRAP SWAPS THE TASK OUT.
02940  M00S02878.smfex   +++|*
02941  M00S02879.smfex   +++|*         THE SECOND BASIC VALUE FOR THE TTOTYPE PARAMETER IS
02942  M00S02880.smfex   +++|*         "PROMPT".  THIS IS USED WHEN TTITRAP CALLS TTOTRAP.
02943  M00S02881.smfex   +++|*         TTOTRAP IS EXPECTED TO IMMEDIATELY TRANSMIT ANY RESIDUAL
02944  M00S02882.smfex   +++|*         QUEUE OF OUTPUT TEXT TO IAFEX, THEN SWAP THE TASK OUT.
02945  M00S02883.smfex   +++|*         TTOTRAP ASSUMES THAT THE CALLER (TTITRAP) HAS ALREADY MADE
02946  M00S02884.smfex   +++|*         A DETERMINATION AS TO LOW PROBABILITY OF RAPID REPLY FROM
02947  M00S02885.smfex   +++|*         IAFEX.
02948  M00S02886.smfex   +++|*
02949  M00S02887.smfex   +++|*         THE THIRD AND LAST BASIC FUNCTION OF TTOTRAP IS THE "FORCE"
02950  M00S02888.smfex   +++|*         VALUE OF THE TTOTYPE PARAMETER.  THIS IS USED BY VOLUNTEER
02951  M00S02889.smfex   +++|*         WHEN IT IS DETERMINED THAT SOME RESIDUAL TEXT HAS BEEN
02952  M00S02890.smfex   +++|*         QUEUED IN THE TASK'S OUTPUT BUFFER FOR AN EXCESSIVE REAL
02953  M00S02891.smfex   +++|*         TIME DELAY, AND OUGHT TO BE SENT TO THE USER'S TERMINAL.
02954  M00S02892.smfex   +++|*         WHEN TTOTRAP PROCESSES THE "FORCE" FUNCTION, IT TRANSMITS
02955  M00S02893.smfex   +++|*         THE BUFFER CONTENT TO IAF AND PROCEEDS TO SWAP THE TASK
02956  M00S02894.smfex   +++|*         WITHOUT ANY USAGE OF THE SPINWHEELS FUNCTION.
02957  M00S02895.smfex   +++|*
02958  M00S02896.smfex   +++|*         WHEN TTOTRAP DECIDES TO SWAPOUT, IT MUST CALL PAUSEIO IN
02959  M00S02897.smfex   +++|*         THE WORKFILE MANAGER.  THIS IS BECAUSE WORKIO DEALS WITH
02960  M00S02898.smfex   +++|*         SOME TRANSIENT RESOURCE, SUCH AS ITS CIRCULAR BUFFER, AND
02961  M00S02899.smfex   +++|*         NEEDS THE OPPORTUNITY TO COMPLETE ITS USAGE OF SUCH
02962  M00S02900.smfex   +++|*         RESOURCES.
02963  M00S02901.smfex   +++|*
02964  M00S02902.smfex   +++|*         ENTRY  TTOTYPE - FUNCTION CODE.
02965  M00S02903.smfex   +++|*                TTOADDR - ADDRESS OF TEXT.
02966  M00S02904.smfex   +++|*                TTOLEN - LENGTH OF TEXT.
02967  M00S02905.smfex   +++|*                TASKNXTTTO[CURTASK] - AMOUNT OF TEXT ALREADY QUEUED.
02968  M00S02906.smfex   +++|*                TTOBUFFER - ADDRESS OF THIS TASK'S BUFFER.
02969  M00S02907.smfex   +++|*                ALL SPINWHEELS PARAMETERS SETUP.
02970  M00S02908.smfex   +++|*
02971  M00S02909.smfex   +++|*         EXIT   TTOLEN - DECREMENTED.
02972  M00S02910.smfex   +++|*                TTOADDR - INCREMENETED.
02973  M00S02911.smfex   +++|*                TASKNXTTTO[CURTASK] - AMOUNT OF TEXT NOW IN BUFFER.
02974  M00S02912.smfex   +++|*                RUNTIME - INCREMENTED IF SWAPOUT.
02975  M00S02913.smfex   +++|*                ACCTOUT - INCREMENTED.
02976  M00S02914.smfex   +++|*
02977  M00S02915.smfex   +++|*         CALLS  MIN, MOVEWD, MELT, INSTRMNT1, TRANSMIT,
02978  M00S02916.smfex   +++|*                SPINWHEELS, CLEARQUE, PAUSEIO, ENDTRANS.
02979  M00S02917.smfex   +++|*
02980  M00S02918.smfex   +++|*         USES   TTOQUIT, TASKTYPTTO[CURTASK].
02981  M00S02919.smfex   +++|#
Line S02920 Modification History
M01 (Removed by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
02982  M01S02920.smfex1  ---|  ITEM TMP1, TMP2;
Line S00004 Modification History
M01 (Added by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
02983  M01S00004.smfex1  +++|  ITEM TMP1       I;                 # TEMPORARY STORAGE #
02984  M01S00005.smfex1  +++|  ITEM TMP2       I;                 # TEMPORARY STORAGE #
02985  M01S00006.smfex1  +++|  ITEM ENDBLOCK   I=O"0014 0000 0000 0000 0000";  # BLOCK TERMINATOR #
02986  M00S02921.smfex   +++|
02987  M00S02922.smfex   +++|  TRCSTR("NTR OTRP$");
02988  M00S02923.smfex   +++|
02989  M00S02924.smfex   +++|  IF NOT CURUSOKOUT THEN IORET     # FIRST TRANS ONLY  #
02990  M00S02925.smfex   +++|
02991  M00S02926.smfex   +++|  P<MOVFROM>=TTOADDR;
02992  M00S02927.smfex   +++|  ACCTOUT=ACCTOUT+TTOLEN;            # ACCOUNT FOR OUTPUT #
02993  M00S02928.smfex   +++|
02994  M00S02929.smfex   +++|  TTOQUIT=FALSE;
02995  M00S02930.smfex   +++|  WHYLE NOT TTOQUIT DO         # SEND ALL TEXT     #
02996  M00S02931.smfex   +++|    BEGIN
Line S02932 Modification History
M01 (Removed by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
02997  M01S02932.smfex1  ---|    TMP1=SIZTTOBUF-TASKNXTTTO[CURTASK];  # ROOM AVAIL        #
Line S00007 Modification History
M01 (Added by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
02998  M01S00007.smfex1  +++|    TMP1=SIZTTOBUF-TASKNXTTTO[CURTASK]-1;  # AVAILABLE ROOM #
02999  M00S02933.smfex   +++|    TMP2=MIN(TMP1,TTOLEN);     # AMOUNT TO SEND    #
03000  M00S02934.smfex   +++|    P<MOVFROM>=TTOADDR;
03001  M00S02935.smfex   +++|    P<MOVTO>=LOC(TTOBUFFER)+2+TASKNXTTTO[CURTASK];
03002  M00S02936.smfex   +++|    MOVEWD(TMP2,MOVFROM,MOVTO);
03003  M00S02937.smfex   +++|    TTOLEN=TTOLEN-TMP2;
03004  M00S02938.smfex   +++|    TTOADDR=TTOADDR+TMP2;
03005  M00S02939.smfex   +++|    TASKNXTTTO[CURTASK]=TASKNXTTTO[CURTASK]+TMP2;
03006  M00S02940.smfex   +++|    TASKTYPTTO[CURTASK]=0;     # DETERMINE TRANSMIT          #
03007  M00S02941.smfex   +++|    CONTROL IFGQ PARANOIA,4;
03008  M00S02942.smfex   +++|      IF TASKNXTTTO[CURTASK] GR SIZTTOBUF THEN MELT("TTOTRAP 1$");
03009  M00S02943.smfex   +++|    CONTROL FI;
03010  M00S02944.smfex   +++|    CONTROL IFEQ METERING,1;
Line S02945 Modification History
M01 (Removed by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
03011  M01S02945.v23l617 ---|      IF TASKNXTTTO[CURTASK] GQ SIZTTOBUF
Line S00011 Modification History
M01 (Added by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
03012  M01S00011.v23l617 +++|      IF TASKNXTTTO[CURTASK] GQ SIZTTOBUF-1
03013  M00S02946.smfex   +++|        THEN INSTRMNT1(INSTST"XSTTO");
03014  M00S02947.smfex   +++|    CONTROL FI;
03015  M00S02948.smfex   +++|    IF (TTOTYPE EQ TTOST"FORCE" AND TASKNXTTTO[CURTASK] NQ 0)
Line S02949 Modification History
M01 (Removed by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
03016  M01S02949.smfex1  ---|      OR TASKNXTTTO[CURTASK] GQ SIZTTOBUF
Line S00008 Modification History
M01 (Added by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
03017  M01S00008.smfex1  +++|      OR TASKNXTTTO[CURTASK] GQ (SIZTTOBUF-1)
03018  M00S02950.smfex   +++|      THEN TASKTYPTTO[CURTASK]=SMF2IAF"MSGOUT";
03019  M00S02951.smfex   +++|    IF TTOTYPE EQ TTOST"PROMPT" AND TTOLEN EQ 0
03020  M00S02952.smfex   +++|      THEN TASKTYPTTO[CURTASK]=SMF2IAF"PROMPT";
03021  M00S02953.smfex   +++|    IF TASKTYPTTO[CURTASK] NQ 0 THEN     # TRANSMIT          #
03022  M00S02954.smfex   +++|      BEGIN
Line S02955 Modification History
M01 (Removed by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
03023  M01S02955.smfex1  ---|      TRANSMIT;
Line S00009 Modification History
M01 (Added by) smfex1
Seq #  *Modification Id* Act 
----------------------------+
03024  M01S00009.smfex1  +++|      P<MOVFROM>=LOC(ENDBLOCK);      # ADD 0014 CONTROL BYTE #
03025  M01S00010.smfex1  +++|      P<MOVTO>=LOC(TTOBUFFER)+2+TASKNXTTTO[CURTASK];
03026  M01S00011.smfex1  +++|      MOVEWD(1,MOVFROM,MOVTO);
03027  M01S00012.smfex1  +++|      TASKNXTTTO[CURTASK]=TASKNXTTTO[CURTASK]+1;
03028  M01S00013.smfex1  +++|      TRANSMIT;                      # TRANSMIT BUFFER TO IAFEX #
03029  M00S02956.smfex   +++|      TASKNXTTTO[CURTASK]=0;
03030  M00S02957.smfex   +++|      IF TTOTYPE NQ TTOST"FORCE" AND TASKTYPTTO[CURTASK]
03031  M00S02958.smfex   +++|        EQ SMF2IAF"MSGOUT" THEN          # ATTEMPT CONTINUE  #
03032  M00S02959.smfex   +++|        BEGIN
03033  M00S02960.smfex   +++|        SPINWHEELS;            # LOOK FOR QUICK ACKNOWLEGE   #
03034  M00S02961.smfex   +++|        IF TASKREQUE[CURTASK] THEN       # CAN CONTINUE      #
03035  M00S02962.smfex   +++|          BEGIN
03036  M00S02963.smfex   +++|          TRCSTR("KWIK TOCIN$");
03037  M00S02964.smfex   +++|          CLEARQUE;                      # ACKNOWLEDGE       #
03038  M00S02965.smfex   +++|          TASKTYPTTO[CURTASK]=0;         # AVOID SWAPOUT     #
03039  M00S02966.smfex   +++|          CONTROL IFEQ METERING,1;
03040  M00S02967.smfex   +++|            INSTRMNT1(INSTST"KWIKTOC");
03041  M00S02968.smfex   +++|          CONTROL FI;
03042  M00S02969.smfex   +++|          END
03043  M00S02970.smfex   +++|        END
03044  M00S02971.smfex   +++|      END
03045  M00S02972.smfex   +++|    IF TASKTYPTTO[CURTASK] NQ 0 OR TTOTYPE NQ TTOST"NORMAL" THEN
03046  M00S02973.smfex   +++|      BEGIN
03047  M00S02974.smfex   +++|      PAUSEIO;
03048  M00S02975.smfex   +++|      RUNTIME=RUNTIME+TIMEOFDAY-TASKTIME[CURTASK];
03049  M00S02976.smfex   +++|      ENDTRANS;
03050  M00S02977.smfex   +++|      END
03051  M00S02978.smfex   +++|    IF TTOLEN LQ 0 THEN TTOQUIT=TRUE;
03052  M00S02979.smfex   +++|    END
03053  M00S02980.smfex   +++|
03054  M00S02981.smfex   +++|  IOEND                        # OF TTOTRAP        #
03055  M00S02982.smfex   +++|PAGE                         # SWAPPING ROUTINE  #
03056  M00S02983.smfex   +++|
03057  M00S02984.smfex   +++|
03058  M00S02985.smfex   +++|PROC SWAP;
03059  M00S02986.smfex   +++|  IOBEGIN(SWAP)
03060  M00S02987.smfex   +++|#
03061  M00S02988.smfex   +++|**        SWAP - SWAP THIS TASK IN OR OUT.
03062  M00S02989.smfex   +++|*
03063  M00S02990.smfex   +++|*         THE SWAP ROUTINE READS OR WRITE THE SWAP PAGE FOR THE
03064  M00S02991.smfex   +++|*         CURRENTLY EXECUTING TASK.  FOR A SWAPIN, WE READ THE PAGE
03065  M00S02992.smfex   +++|*         ALREADY ASSIGNED TO THE USER.  FOR A SWAPOUT, WE ASSIGN A
03066  M00S02993.smfex   +++|*         PAGE.  THE FIRST PRIORITY IN PAGE SELECTION IS EXTENDED
03067  M00S02994.smfex   +++|*         MEMORY IF AVAILABLE, HEALTHY, AND NOT YET FILLED UP.  THE
03068  M00S02995.smfex   +++|*         LOWER PRIORITY IS TO SELECT A DISK PAGE.  DISK PAGES ARE
03069  M00S02996.smfex   +++|*         PHASED OR INTERLEAVED ROUND-ROBIN ACROSS THE SEVERAL SWAP
03070  M00S02997.smfex   +++|*         DATABASES.
03071  M00S02998.smfex   +++|*
03072  M00S02999.smfex   +++|*         THE SWAP ROUTINE CAN RECOVER FROM A PARITY ERROR IN AN
03073  M00S03000.smfex   +++|*         EXTENDED MEMORY TRANSFER, BUT DOES NOT ATTEMPT TO HANDLE
03074  M00S03001.smfex   +++|*         DEVICE ERRORS ON DISKS.  WHEN AN ERROR IS DETECTED FROM
03075  M00S03002.smfex   +++|*         EXTENDED MEMORY, A USER BEING SWAPPED IN WILL HAVE HIS TASK
03076  M00S03003.smfex   +++|*         ABORTED, WHILE A USER BEING SWAPPED IS UNHARMED.  ERROR
03077  M00S03004.smfex   +++|*         RECOVERY INCLUDES THE FAULT-OUT OF THE BAD PAGE,
03078  M00S03005.smfex   +++|*         DETERMINATION WHETHER THE ENTIRE EXTENDED MEMORY FIELD
03079  M00S03006.smfex   +++|*         LENGTH SHOULD BE ABANDONED DUE TO WIDESPREAD ERRORS, AND
03080  M00S03007.smfex   +++|*         FOR SWAPOUT WE ALSO ALLOCATE ANOTHER PAGE AND TRY THE SWAP
03081  M00S03008.smfex   +++|*         AGAIN.
03082  M00S03009.smfex   +++|*
03083  M00S03010.smfex   +++|*         WHILE SWAP IS EXECUTING, THE DISPATCHING AREA IN THE COMMON
03084  M00S03011.smfex   +++|*         BLOCK IS CONSIDERED TO BE IRRELEVANT.  THEREFORE, THE
03085  M00S03012.smfex   +++|*         ROUTINE WHICH MANAGES THE BRUTE-FORCE SHUFFLING OF THE
03086  M00S03013.smfex   +++|*         COMMON BLOCK (SUBROUTINE GETCOMON) NEEDS TO KNOW WHEN
03087  M00S03014.smfex   +++|*         SWAPPING IS IN EFFECT.  THIS SWAP ROUTINE IS THUS REQUIRED
03088  M00S03015.smfex   +++|*         TO TURN THE TASKSWPNOW FLAG ON AT ENTRY TIME AND TO TURN IT
03089  M00S03016.smfex   +++|*         OFF AT EXIT TIME.  NO REENTRANT EVENTS CAN OCCUR BETWEEN
03090  M00S03017.smfex   +++|*         THE ACTUAL ENTRY OR EXIT AND THE SETTING OF THE TASKSWPNOW
03091  M00S03018.smfex   +++|*         FLAG.
03092  M00S03019.smfex   +++|*
03093  M00S03020.smfex   +++|*         ENTRY  TASKSWPIN[CURTASK] - DIRECTION OF SWAP.
03094  M00S03021.smfex   +++|*                TIMEOFDAY - CURRENT.
03095  M00S03022.smfex   +++|*                SWAPBITS - ALLOCATION BITMASK.
03096  M00S03023.smfex   +++|*                P<SWAPMASK> - ENABLES/DISABLES EXTENDED MEMORY PAGES.
03097  M00S03024.smfex   +++|*                CURUSSWPPAG - USERS PAGE FOR SWAPIN.
03098  M00S03025.smfex   +++|*                TASKADDR[CURTASK] - MEMORY ADDRESS FOR SWAP PAGE.
03099  M00S03026.smfex   +++|*                SWAPLEN - LENGTH OF A PAGE IN WORDS.
03100  M00S03027.smfex   +++|*                SWAPPRUS - LENGTH OF A PAGE IN SECTORS.
03101  M00S03028.smfex   +++|*                ECSERRORS - PREVIOUS EXTENDED MEMORY ERRORS.
03102  M00S03029.smfex   +++|*                SWPFETDONE[ALL] - INTERLOCKS ON DISK FILES.
03103  M00S03030.smfex   +++|*                SWPFET[ALL] - THE DISK FET'S.
03104  M00S03031.smfex   +++|*                MAXSWPPAG - HIGHEST DISK PAGE CREATED TO DATE.
03105  M00S03032.smfex   +++|*
03106  M00S03033.smfex   +++|*         EXIT   TIMEOFDAY - CURRENT.
03107  M00S03034.smfex   +++|*                SWAPBITS - UPDATED.
03108  M00S03035.smfex   +++|*                SWAPGOOD - EXTENDED MEMORY ERRORS FAULTED HERE.
03109  M00S03036.smfex   +++|*                ECSERRORS - INCREMENTED IF ERRORS.
03110  M00S03037.smfex   +++|*                MAXSWPPAG - INCREMENTED IF HIGHWATERMARK RAISED.
03111  M00S03038.smfex   +++|*                TASKTIME[CURTASK] - TIMEOFDAY.
03112  M00S03039.smfex   +++|*                STATUSMSG - MAY CONTAIN ERROR MSG.
03113  M00S03040.smfex   +++|*                CURUSSWPPAG - PAGE SELECTED FOR SWAPOUT.
03114  M00S03041.smfex   +++|*                CURUSVICTIM - TRUE IF ECS PARITY ERROR ON SWAPIN.
03115  M00S03042.smfex   +++|*
03116  M00S03043.smfex   +++|*         CALLS  ALLOC, MELT, INSTRMNT1, READECS, WRITECS,
03117  M00S03044.smfex   +++|*                FORCEALLOC, SMFDLY, MAKEFET, READ, WRITER, REWRITR,
03118  M00S03045.smfex   +++|*                SMFRCL, INSTRMNT2.
03119  M00S03046.smfex   +++|*
03120  M00S03047.smfex   +++|*         USES   TASKSWPNOW[CURTASK], TASKSWPFIL[CURTASK],
03121  M00S03048.smfex   +++|*                TASKSWPPRU[CURTASK], P<MOVFROM>, P<MOVTO>, SWPFET.
03122  M00S03049.smfex   +++|#
03123  M00S03050.smfex   +++|  ITEM TMP1,TMP2;
03124  M00S03051.smfex   +++|
03125  M00S03052.smfex   +++|  # SWAP IS REQUIRED TO SET TASKSWPNOW BEFORE ANY DELAYS OCCUR #
03126  M00S03053.smfex   +++|
03127  M00S03054.smfex   +++|  TRCSTR("NTR SWP$");
03128  M00S03055.smfex   +++|  TASKSWPNOW[CURTASK]=TRUE;
03129  M00S03056.smfex   +++|  TASKTIME[CURTASK]=TIMEOFDAY;
03130  M00S03057.smfex   +++|
03131  M00S03058.smfex   +++|SWAPSTART:
03132  M00S03059.smfex   +++|
03133  M00S03060.smfex   +++|  IF NOT TASKSWPIN[CURTASK] THEN         # ALLOC PAGE        #
03134  M00S03061.smfex   +++|    BEGIN
03135  M00S03062.smfex   +++|    ALLOC(SWAPBITS,SWAPMASK,TMP1,NUMSWPBIT);
03136  M00S03063.smfex   +++|    IF TMP1 EQ 0 THEN MELT("SWPO 2$");
03137  M00S03064.smfex   +++|    CURUSSWPPAG=TMP1;          # SAVE INVIOLATE    #
03138  M00S03065.smfex   +++|    END
03139  M00S03066.smfex   +++|
03140  M00S03067.smfex   +++|  TRCBOTH("PAGE$",CURUSSWPPAG);
03141  M00S03068.smfex   +++|
03142  M00S03069.smfex   +++|  IF CURUSSWPPAG LQ NUMSWPECS THEN       # ECS SWAP          #
03143  M00S03070.smfex   +++|    BEGIN
03144  M00S03071.smfex   +++|    TRCSTR("SWPECS$");
03145  M00S03072.smfex   +++|    CONTROL IFEQ ECSCODE,0;
03146  M00S03073.smfex   +++|      CONTROL IFGQ PARANOIA,1;
03147  M00S03074.smfex   +++|        MELT("SWP 3$");
03148  M00S03075.smfex   +++|      CONTROL FI;
03149  M00S03076.smfex   +++|    CONTROL FI;
03150  M00S03077.smfex   +++|    CONTROL IFEQ ECSCODE,1;
03151  M00S03078.smfex   +++|      CONTROL IFEQ METERING,1;
03152  M00S03079.smfex   +++|        INSTRMNT1(INSTST"SWPE");
03153  M00S03080.smfex   +++|      CONTROL FI;
03154  M00S03081.smfex   +++|      P<MOVFROM>=TASKADDR[CURTASK];
03155  M00S03082.smfex   +++|      P<MOVTO>=(CURUSSWPPAG-1)*SWAPLEN;
03156  M00S03083.smfex   +++|      IF TASKSWPIN[CURTASK] THEN READECS(SWAPLEN,MOVTO,MOVFROM,TMP1);
03157  M00S03084.smfex   +++|      ELSE WRITECS(SWAPLEN,MOVFROM,MOVTO,TMP1);
03158  M00S03085.smfex   +++|      CONTROL IFGQ ECSERRMAX,0;
03159  M00S03086.smfex   +++|        IF TMP1 NQ 0 THEN      # ECS ERROR, RETRY OR KILL    #
03160  M00S03087.smfex   +++|          BEGIN
03161  M00S03088.smfex   +++|          ECSERRORS=ECSERRORS+TMP1;
03162  M00S03089.smfex   +++|          IF ECSERRORS GQ ECSERRMAX THEN
03163  M00S03090.smfex   +++|            BEGIN
03164  M00S03091.smfex   +++|            ECSDOWN=TRUE;
03165  M00S03092.smfex   +++|            C<22,6>STATUSMSG="EM OFF";
03166  M00S03093.smfex   +++|            END
03167  M00S03094.smfex   +++|          # FAULT OUT THIS PAGE TO PROTECT FUTURE USERS #
03168  M00S03095.smfex   +++|          FORCEALLOC(SWAPGOOD,CURUSSWPPAG,NUMSWPBIT);
03169  M00S03096.smfex   +++|          IF TMP1 GQ 3 AND TASKSWPIN[CURTASK] THEN CURUSVICTIM=TRUE;
03170  M00S03097.smfex   +++|          IF NOT TASKSWPIN[CURTASK] THEN GOTO SWAPSTART;
03171  M00S03098.smfex   +++|          END
03172  M00S03099.smfex   +++|      CONTROL FI;
03173  M00S03100.smfex   +++|      CONTROL IFLS ECSERRMAX,0;
03174  M00S03101.smfex   +++|        IF TMP1 NQ 0 THEN MELT("ECS HARDWARE$");
03175  M00S03102.smfex   +++|      CONTROL FI;
03176  M00S03103.smfex   +++|    CONTROL FI;
03177  M00S03104.smfex   +++|    END
03178  M00S03105.smfex   +++|  ELSE                         # DISK SWAPPING     #
03179  M00S03106.smfex   +++|    BEGIN
03180  M00S03107.smfex   +++|    TASKSWPFIL[CURTASK]=1+MOD(CURUSSWPPAG-1-NUMSWPECS,NUMSWPFET);
03181  M00S03108.smfex   +++|    TASKSWPPRU[CURTASK]=1+(CURUSSWPPAG-1-NUMSWPECS)/NUMSWPFET*SWAPPRUS;
03182  M00S03109.smfex   +++|    TRCBOTH("SWPDSK$",TASKSWPFIL[CURTASK]);
03183  M00S03110.smfex   +++|    TRCDEC(TASKSWPPRU[CURTASK]);
03184  M00S03111.smfex   +++|    CONTROL IFEQ METERING,1;
03185  M00S03112.smfex   +++|      INSTRMNT1(INSTST"SWPD");
03186  M00S03113.smfex   +++|    CONTROL FI;
03187  M00S03114.smfex   +++|    WHYLE NOT SWPFETDONE[TASKSWPFIL[CURTASK]] DO SMFDLY;
03188  M00S03115.smfex   +++|    TMP1=TASKSWPFIL[CURTASK];  # VALID TILL SMFRCL          #
03189  M00S03116.smfex   +++|    C<0,6>TMP2="SMFSWP";
03190  M00S03117.smfex   +++|    C<6,1>TMP2=O"33"+TMP1-1;
03191  M00S03118.smfex   +++|    P<ANYFET>=LOC(SWPFET[TMP1]);
03192  M00S03119.smfex   +++|    P<MOVFROM>=TASKADDR[CURTASK];
03193  M00S03120.smfex   +++|    MAKEFET(ANYFET,TMP2,MOVFROM,SWAPBUFLEN);
03194  M00S03121.smfex   +++|    SWPFETR[TMP1]=TRUE;
03195  M00S03122.smfex   +++|    SWPFETRR[TMP1]=TASKSWPPRU[CURTASK];
03196  M00S03123.smfex   +++|    IF TASKSWPIN[CURTASK] THEN READ(ANYFET,0);
03197  M00S03124.smfex   +++|    ELSE
03198  M00S03125.smfex   +++|      BEGIN
03199  M00S03126.smfex   +++|      SWPFETIN[TMP1]=SWPFETIN[TMP1]+SWAPLEN;
03200  M00S03127.smfex   +++|      IF CURUSSWPPAG GR MAXSWPPAG THEN
03201  M00S03128.smfex   +++|        BEGIN
03202  M00S03129.smfex   +++|        MAXSWPPAG=CURUSSWPPAG;
03203  M00S03130.smfex   +++|        SWPFETRR[TMP1]=LOC(DUMB);
03204  M00S03131.smfex   +++|        WRITER(ANYFET,0);
03205  M00S03132.smfex   +++|        END
03206  M00S03133.smfex   +++|      ELSE REWRITR(ANYFET,0);
03207  M00S03134.smfex   +++|      END
03208  M00S03135.smfex   +++|    SMFRCL(ANYFET);
03209  M00S03136.smfex   +++|    END
03210  M00S03137.smfex   +++|
03211  M00S03138.smfex   +++|  # ONCE TASKSWPNOW IS CLEARED, SWAP CANNOT DELAY ANYMORE #
03212  M00S03139.smfex   +++|
03213  M00S03140.smfex   +++|  TASKSWPNOW[CURTASK]=FALSE;
03214  M00S03141.smfex   +++|  CONTROL IFEQ METERING,1;
03215  M00S03142.smfex   +++|    TMP1=TIMEOFDAY-TASKTIME[CURTASK];
03216  M00S03143.smfex   +++|    INSTRMNT2(INSTST"SWPTIM",TMP1);
03217  M00S03144.smfex   +++|  CONTROL FI;
03218  M00S03145.smfex   +++|  TASKTIME[CURTASK]=TIMEOFDAY;
03219  M00S03146.smfex   +++|
03220  M00S03147.smfex   +++|  IOEND                        # OF SWAP           #
03221  M00S03148.smfex   +++|PAGE                         # USER/SYSTEM-STATE CHANGING CODE       #
03222  M00S03149.smfex   +++|
03223  M00S03150.smfex   +++|
03224  M00S03151.smfex   +++|PROC PAUSE;
03225  M00S03152.smfex   +++|  IOBEGIN(PAUSE)
03226  M00S03153.smfex   +++|#
03227  M00S03154.smfex   +++|**        PAUSE - INTERFACE TO EXECUTIVE TO START/END TIME SLICE.
03228  M00S03155.smfex   +++|*
03229  M00S03156.smfex   +++|*         PAUSE IS THE ROUTINE USED BY USER-MODE ROUTINES TO END A
03230  M00S03157.smfex   +++|*         SLICE ON THE CPU, AND BY THE EXECUTIVE TO RESUME EXECUTION
03231  M00S03158.smfex   +++|*         WHERE THE PREVIOUS TIME SLICE ENDED.  THUS, PAUSE EXITS TO
03232  M00S03159.smfex   +++|*         LABEL AFTERSLICE AND PROVIDES THE LABEL RESUME, WHICH
03233  M00S03160.smfex   +++|*         RUNJOBS WILL JUMP TO JUST IN FRONT OF THE DEFINITION OF THE
03234  M00S03161.smfex   +++|*         AFTERSLICE LABEL.
03235  M00S03162.smfex   +++|#
03236  M00S03163.smfex   +++|  XDEF LABEL RESUME;
03237  M00S03164.smfex   +++|  XREF LABEL AFTERSLICE;
03238  M00S03165.smfex   +++|  GOTO AFTERSLICE;
03239  M00S03166.smfex   +++|
03240  M00S03167.smfex   +++|RESUME:                      # HERE FOR NEW TIMESLICE      #
03241  M00S03168.smfex   +++|
03242  M00S03169.smfex   +++|  IOEND                        # OF PAUSE          #
03243  M00S03170.smfex   +++|
03244  M00S03171.smfex   +++|
03245  M00S03172.smfex   +++|PROC TRANSACT;
03246  M00S03173.smfex   +++|  BEGIN
03247  M00S03174.smfex   +++|#
03248  M00S03175.smfex   +++|**        TRANSACT - TRANSITION FROM EXECUTIVE TO USER FOR SWAPIN.
03249  M00S03176.smfex   +++|*
03250  M00S03177.smfex   +++|*         TRANSACT IS USED BY THE RUNJOBS EXECUTIVE, JUST BEFORE
03251  M00S03178.smfex   +++|*         RUNJOBS DEFINES THE AFTERTRANS LABEL, TO SWITCH FROM
03252  M00S03179.smfex   +++|*         EXECUTIVE MODE TO USER MODE AND PERFORM SWAPINS.  TRANSACT
03253  M00S03180.smfex   +++|*         THEN REPAIRS THE COMMON BLOCK DISPATCHING AREA, REPAIRS THE
03254  M00S03181.smfex   +++|*         RETURN JUMP WORDS IN ALL ACTIVE SUBROUTINE ENTRY POINTS,
03255  M00S03182.smfex   +++|*         CHECKS FOR CERTAIN INTERRUPT CONDITIONS, AND EXITS VIA A
03256  M00S03183.smfex   +++|*         JUMP TO THE MORETRANS LABEL IN THE ENDTRANS ROUTINE.  THIS
03257  M00S03184.smfex   +++|*         TYPE OF EXIT IS USED BECAUSE THE TASK IS PRESUMED TO HAVE
03258  M00S03185.smfex   +++|*         HAVE COMPLETED ITS PREVIOUS SWAPPED-IN TRANSACTION BY
03259  M00S03186.smfex   +++|*         CALLING ENDTRANS, AND ENDTRANS IS RESUMED TO HAVE JUMPED TO
03260  M00S03187.smfex   +++|*         THE EXECUTIVE JUST IN FRONT OF THE DEFINITION OF LABEL
03261  M00S03188.smfex   +++|*         MORETRANS.
03262  M00S03189.smfex   +++|*
03263  M00S03190.smfex   +++|*         ENTRY  MAY BE CALLED ONLY BY RUNJOBS TRANSACTION SECTION.
03264  M00S03191.smfex   +++|*                CURUSINTRPT - AN INTERRUPT MUST BE COMMUNICATED TO
03265  M00S03192.smfex   +++|*                    USER-MODE CODE AFTER SWAPIN IS COMPLETE.
03266  M00S03193.smfex   +++|*                SHUTDOWN - CAUSES SYNTHESIS OF INTERRUPTS.
03267  M00S03194.smfex   +++|*                CURUSRCVRY - FSE JOB DETACHING.
03268  M00S03195.smfex   +++|*                RSTKPTR - SIZE OF REENTRANCY STACK.
03269  M00S03196.smfex   +++|*
03270  M00S03197.smfex   +++|*         EXIT   VIA LABEL MORETRANS.
03271  M00S03198.smfex   +++|*                RENTSTK - REENTRANCY STACK.
03272  M00S03199.smfex   +++|*                COMMON BLOCK AND SUBROUTINE ENTRIES REBUILT.
03273  M00S03200.smfex   +++|*                USRBRK - 1 IF ANY INTERRUPT PASSED TO USER.
03274  M00S03201.smfex   +++|*                CURUSVICTIM - TRUE IF SWAPIN RUINED USER DATA.
03275  M00S03202.smfex   +++|*                FORCESINGLE, FORCENULL - ADDITIONAL INTERRUPTS.
03276  M00S03203.smfex   +++|*                WORKFILE CHECKPOINTED AND EXIT VIA LABEL AFTEREDIT
03277  M00S03204.smfex   +++|*                    IF CURUSRCVRY IS ON.
03278  M00S03205.smfex   +++|*
03279  M00S03206.smfex   +++|*         CALLS  SWAP, DEALLOC, GETCOMMON, CHECKIO, MOVEWD, SPREAD.
03280  M00S03207.smfex   +++|*
03281  M00S03208.smfex   +++|*         USES   SWAPRSTK, TASKSWPIN[CURTASK].
03282  M00S03209.smfex   +++|#
03283  M00S03210.smfex   +++|  XREF LABEL AFTEREDIT;
03284  M00S03211.smfex   +++|  XREF LABEL AFTERTRANS;
03285  M00S03212.smfex   +++|  XREF LABEL MORETRANS;
03286  M00S03213.smfex   +++|
03287  M00S03214.smfex   +++|  TRCSTR("NTR TRNSCT$");
03288  M00S03215.smfex   +++|  TASKSWPIN[CURTASK]=TRUE;
03289  M00S03216.smfex   +++|
03290  M00S03217.smfex   +++|  SWAP;
03291  M00S03218.smfex   +++|  # ONCE SWAP RETURNS, WE CANNOT REENTER UNTIL AFTER GETCOMMON #
03292  M00S03219.smfex   +++|  IF SHUTDOWN NQ 2 THEN DEALLOC(SWAPBITS,CURUSSWPPAG,NUMSWPBIT);
03293  M00S03220.smfex   +++|  CURUSSWPPAG=0;
03294  M00S03221.smfex   +++|  LASTTASK=0;                # RECONSTRUCT COMMON AFTER SWAP         #
03295  M00S03222.smfex   +++|  GETCOMMON;
03296  M00S03223.smfex   +++|  # END OF TIME-CRITICAL SEQUENCE #
03297  M00S03224.smfex   +++|
03298  M00S03225.smfex   +++|  IF CURUSINTRPT THEN USRBRK=1;
03299  M00S03226.smfex   +++|  IF CURUSVICTIM THEN
03300  M00S03227.smfex   +++|    BEGIN
03301  M00S03228.smfex   +++|    SMFVICTIM=TRUE;
03302  M00S03229.smfex   +++|    ERRSTRING="ECS HARDWARE$";
03303  M00S03230.smfex   +++|    END
03304  M00S03231.smfex   +++|  IF SHUTDOWN NQ 0 THEN FORCESINGLE=TRUE;
03305  M00S03232.smfex   +++|  IF SHUTDOWN GR 1 THEN
03306  M00S03233.smfex   +++|    BEGIN
03307  M00S03234.smfex   +++|    CURUSINTRPT=TRUE;
03308  M00S03235.smfex   +++|    USRBRK=1;
03309  M00S03236.smfex   +++|    FORCENULL=TRUE;
03310  M00S03237.smfex   +++|    END
03311  M00S03238.smfex   +++|  IF CURUSRCVRY THEN           # CHKPT AND END EDIT          #
03312  M00S03239.smfex   +++|    BEGIN
03313  M00S03240.smfex   +++|    FORCENULL=TRUE;
Line S03241 Modification History
M01 (Removed by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
03314  M01S03241.ns2136  ---|    #VFYWRKFIL#
Line S00005 Modification History
M01 (Added by) ns2136
M02 (Removed by) ns2186
Seq #  *Modification Id* Act 
----------------------------+
03315  M02S00005.ns2186  ---|    IF NOT CURUSDROP THEN USRBRK=0;
Line S00007 Modification History
M01 (Added by) ns2186
Seq #  *Modification Id* Act 
----------------------------+
03316  M01S00007.ns2186  +++|    IF SHUTDOWN EQ 2 THEN
03317  M01S00008.ns2186  +++|      BEGIN
03318  M01S00009.ns2186  +++|      USRBRK=0;
03319  M01S00010.ns2186  +++|      CURUSINTRPT=FALSE;
03320  M01S00011.ns2186  +++|      END
Line S03242 Modification History
M01 (Removed by) smfex2
Seq #  *Modification Id* Act 
----------------------------+
03321  M01S03242.smfex2  ---|    CHECKIO;
Line S00001 Modification History
M01 (Added by) smfex2
Seq #  *Modification Id* Act 
----------------------------+
03322  M01S00001.smfex2  +++|    IF NOT CURUSDONE THEN
03323  M01S00002.smfex2  +++|      BEGIN                    # IF WORKFILE NOT YET CHECKPOINTED #
03324  M01S00003.smfex2  +++|      CHECKIO;                 # CHECKPOINT WORKFILE #
03325  M01S00004.smfex2  +++|      END
03326  M00S03243.smfex   +++|    GOTO AFTEREDIT;
03327  M00S03244.smfex   +++|    END
03328  M00S03245.smfex   +++|  MOVEWD(RSTKPTR-1,SWAPRSTK,RENTSTK);
03329  M00S03246.smfex   +++|  SPREAD(RSTKPTR,RENTSTK);
03330  M00S03247.smfex   +++|
03331  M00S03248.smfex   +++|  #   OUR RETURN GOES NOT TO CALLER BUT TO USER   #
03332  M00S03249.smfex   +++|  GOTO MORETRANS;            # LET GATHERED CODE RETURN TO USER      #
03333  M00S03250.smfex   +++|
03334  M00S03251.smfex   +++|  END                          # OF TRANSACT       #
03335  M00S03252.smfex   +++|
03336  M00S03253.smfex   +++|
03337  M00S03254.smfex   +++|PROC ENDTRANS;
03338  M00S03255.smfex   +++|  IOBEGIN(ENDTRANS)
03339  M00S03256.smfex   +++|#
03340  M00S03257.smfex   +++|**        ENDTRANS - END A TRANSACTION WITH SWAPOUT.
03341  M00S03258.smfex   +++|*
03342  M00S03259.smfex   +++|*         ENDTRANS IS CALLED ONLY BY TTOTRAP, FOR THE PURPOSE OF
03343  M00S03260.smfex   +++|*         SWAPPING THE CURRENT TASK OUT.  ENDTRANS CONSOLIDATES DATA
03344  M00S03261.smfex   +++|*         FROM SUBROUTINE ENTRY POINTS AND FROM THE DISPATCHABLE
03345  M00S03262.smfex   +++|*         COMMON BLOCK, THEN SWAPS THE MEMORY IMAGE OUT.  ENDTRANS
03346  M00S03263.smfex   +++|*         THEN EXITS BY JUMPING TO LABEL AFTERTRANS IN THE RUNJOBS
03347  M00S03264.smfex   +++|*         EXECUTIVE.  ENDTRANS PROVIDES THE DEFINITION OF LABEL
03348  M00S03265.smfex   +++|*         MORETRANS SO THAT WHEN RUNJOBS CALLS TRANSACT TO SWAP THIS
03349  M00S03266.smfex   +++|*         USER BACK IN, TRANSACT CAN JUMP TO THE ADDRESS AT WHICH THE
03350  M00S03267.smfex   +++|*         TASK HAD FORFEITED CONTROL.
03351  M00S03268.smfex   +++|*
03352  M00S03269.smfex   +++|*         ENDTRANS IS ALLOWED TO BE CALLED ONLY BY TTOTRAP BECAUSE
03353  M00S03270.smfex   +++|*         THE TASK CANNOT SWAPOUT WITH ANY RESIDUAL OUTPUT LEFT IN
03354  M00S03271.smfex   +++|*         THE BUFFER OWNED BY THE TASK.
03355  M00S03272.smfex   +++|*
03356  M00S03273.smfex   +++|*         ENTRY  ONLY FROM TTOTRAP.
03357  M00S03274.smfex   +++|*                RSTKPTR - DEPTH OF REENTRANCY STACK.
03358  M00S03275.smfex   +++|*                RENTSTK - THE REENTRANCY STACK.
03359  M00S03276.smfex   +++|*
03360  M00S03277.smfex   +++|*         EXIT   VIA LABEL AFTERTRANS.
03361  M00S03278.smfex   +++|*
03362  M00S03279.smfex   +++|*         CALLS  GATHER, MOVEWD, PUTCOMMON, SWAP, MELT.
03363  M00S03280.smfex   +++|*
03364  M00S03281.smfex   +++|*         USES   SWAPRSTK, TASKSWPIN[CURTASK].
03365  M00S03282.smfex   +++|#
03366  M00S03283.smfex   +++|  XREF LABEL AFTERTRANS;
03367  M00S03284.smfex   +++|  XDEF LABEL MORETRANS;
03368  M00S03285.smfex   +++|
03369  M00S03286.smfex   +++|  TRCSTR("NTR NDTRNS$");
03370  M00S03287.smfex   +++|  GATHER(RSTKPTR,RENTSTK);
03371  M00S03288.smfex   +++|  MOVEWD(RSTKPTR-1,RENTSTK,SWAPRSTK);
03372  M00S03289.smfex   +++|
03373  M00S03290.smfex   +++|  # MUST EXECUTE INSTANTLY FROM PUTCOMMON INTO START OF SWAP #
03374  M00S03291.smfex   +++|  PUTCOMMON;                   # MAKE COMMON SWAPPABLE       #
03375  M00S03292.smfex   +++|  TASKSWPIN[CURTASK]=FALSE;
03376  M00S03293.smfex   +++|  SWAP;
03377  M00S03294.smfex   +++|  # END OF TIME-CRITICAL SEQUENCE #
03378  M00S03295.smfex   +++|
03379  M00S03296.smfex   +++|  CONTROL IFGQ PARANOIA,3;
03380  M00S03297.smfex   +++|    IF TASKNXTTTO[CURTASK] NQ 0 THEN MELT("NTRNS 2$");
03381  M00S03298.smfex   +++|  CONTROL FI;
03382  M00S03299.smfex   +++|  GOTO AFTERTRANS;
03383  M00S03300.smfex   +++|
03384  M00S03301.smfex   +++|  # RETURN GOES BACK TO USER #
03385  M00S03302.smfex   +++|MORETRANS:
03386  M00S03303.smfex   +++|
03387  M00S03304.smfex   +++|  IOEND                        # OF ENDTRANS       #
03388  M00S03305.smfex   +++|PAGE                         # INITIALIZATION AND TERMINATION        #
03389  M00S03306.smfex   +++|
03390  M00S03307.smfex   +++|
03391  M00S03308.smfex   +++|PROC INITMON;
03392  M00S03309.smfex   +++|  BEGIN
03393  M00S03310.smfex   +++|#
03394  M00S03311.smfex   +++|**        INITMON - INITIALIZE SMFEX.
03395  M00S03312.smfex   +++|*
03396  M00S03313.smfex   +++|*         INITMON IS THE PRESET ROUTINE FOR SMFEX.  THE FOLLOWING
03397  M00S03314.smfex   +++|*         FUNCTIONS ARE PERFORMED --
03398  M00S03315.smfex   +++|*
03399  M00S03316.smfex   +++|*         THE PARAMETERS CRACKED BY THE OPERATING SYSTEM AT RA+2 ARE
03400  M00S03317.smfex   +++|*         CHECKED FOR RECOVERY MODE OR FOR A NUMBER OF TASKS TO BE
03401  M00S03318.smfex   +++|*         FORMATTED.  THE SHUTDOWN FLAG IS SET FOR RECOVERY MODE, AND
03402  M00S03319.smfex   +++|*         THE TASKSAVAIL FLAG IS SET AND FORCED WITHIN REASONABLE
03403  M00S03320.smfex   +++|*         BOUNDS FOR A NUMERIC PARAMETER.
03404  M00S03321.smfex   +++|*
03405  M00S03322.smfex   +++|*         MISCELLANEOUS POINTERS AND LENGTH FIELDS ARE COMPUTED.  THE
03406  M00S03323.smfex   +++|*         FIELD LENGTH IS THEN INCREASED TO MAKE ROOM FOR THE MODEL
03407  M00S03324.smfex   +++|*         FORMAT OF THE COMMON BLOCK.  THE FIELD LENGTH IS INCREASED
03408  M00S03325.smfex   +++|*         TO ALLOCATE THE TERMINAL INPUT BUFFERS.  THE BITMAPS USED
03409  M00S03326.smfex   +++|*         FOR ALLOCATION OF SMFEX RESOURCES ARE INITIALIZED.  THEN
03410  M00S03327.smfex   +++|*         EACH TASK IS BUILT OUT OF INCREASED FIELD LENGTH.
03411  M00S03328.smfex   +++|*
03412  M00S03329.smfex   +++|*         TASK CONSTRUCTION IS DELEGATED TO THE BUILDTASK ROUTINE.
03413  M00S03330.smfex   +++|*         THE COMMON BLOCK IS USED TO CONSTRUCT THIS TASK'S POINTERS
03414  M00S03331.smfex   +++|*         FOR A NUMBER OF PER-TASK ARRAYS.  THEN COMMON BLOCK IS THEN
03415  M00S03332.smfex   +++|*         COPIED INTO THE EXTENDED FIELD LENGTH SO EACH TASK CAN
03416  M00S03333.smfex   +++|*         CONTAIN ITS OWN BASE ADDRESSES FOR ARRAYS.
03417  M00S03334.smfex   +++|*
03418  M00S03335.smfex   +++|*         THE EXTENDED MEMORY FIELD LENGTH IS DETERMINED BY SEEING
03419  M00S03336.smfex   +++|*         HOW MUCH MEMORY IS DESIRED FOR THE COMPILE-TIME
03420  M00S03337.smfex   +++|*         CONFIGURATION AND HOW MUCH IS ACTUALLY AVAILABLE FROM THE
03421  M00S03338.smfex   +++|*         RUNNING SYSTEM.  THE ALLOCATION BITMAPS ARE MODIFIED IF
03422  M00S03339.smfex   +++|*         NEEDED TO ALLOW FOR THE NUMBER OF ECS SWAP PAGES ACTUALLY
03423  M00S03340.smfex   +++|*         OBTAINED.  EXTENDED MEMORY SWAPPING IS COMPLETELY DISABLED
03424  M00S03341.smfex   +++|*         IF THE RUNNING SYSTEM CANNOT PROVIDE ANY SECONDARY FIELD
03425  M00S03342.smfex   +++|*         LENGTH AT ALL.
03426  M00S03343.smfex   +++|*
03427  M00S03344.smfex   +++|*         FOR SUBSYSTEM RECOVERY, A SHORTENED INITMON ALGORITHM TAKES
03428  M00S03345.smfex   +++|*         EFFECT.  WE ASSUME THE PREVIOUS SMFEX JOB STEP EXECUTED AN
03429  M00S03346.smfex   +++|*         IDENTICAL VERSION OF THIS PROGRAM (I.E., SMFEX HAS NOT BEEN
03430  M00S03347.smfex   +++|*         SYSEDITED WHILE RUNNING) AND THAT THE TERMINATION OF THE
03431  M00S03348.smfex   +++|*         PREVIOUS SMFEX JOB STEP EXITED INTO A "DMB" FORMAT DUMP
03432  M00S03349.smfex   +++|*         FILE.  THE DUMP FILE IS SCANNED TO OBTAIN THE USER TABLE.
03433  M00S03350.smfex   +++|*         WE CHECK ALL USER TABLE ENTRIES FOR RECOVERABLE TASKS AND
03434  M00S03351.smfex   +++|*         QUEUE THOSE USERS FOR SWAPIN.  RECOVERABLE TASKS ARE THOSE
03435  M00S03352.smfex   +++|*         WHICH EXIST ON A SWAP PAGE BUT NOT IN MEMORY.  FOR
03436  M00S03353.smfex   +++|*         SUBSYSTEM RECOVERY, THE INITMON ALGORITHM TERMINATES AT
03437  M00S03354.smfex   +++|*         THIS POINT IN THE FLOW.
03438  M00S03355.smfex   +++|*
03439  M00S03356.smfex   +++|*         FOR TRUE SUBSYSTEM INITIATION, THE REMAINDER OF THE INITMON
03440  M00S03357.smfex   +++|*         ALGORITHM IS AS FOLLOWS --
03441  M00S03358.smfex   +++|*
03442  M00S03359.smfex   +++|*         ALL DISK SWAP FILES ARE EVICTED.
03443  M00S03360.smfex   +++|*
03444  M00S03361.smfex   +++|*         THE NEGATIVE FIELD LENGTH IS BOOSTED TO ITS ANTICIPATED
03445  M00S03362.smfex   +++|*         HIGH WATER MARK BY ALLOCATING THEN RETURNING A LARGE GROUP
03446  M00S03363.smfex   +++|*         OF TOKEN FILES.  THIS IS DONE BECAUSE THE TLX PP ROUTINE
03447  M00S03364.smfex   +++|*         WHICH TRANSITIONS USERS FROM SINGLE USER MODE TO MULTI USER
03448  M00S03365.smfex   +++|*         MODE IS UNABLE TO INCREASE OUR NEGATIVE FIELD LENGTH TO
03449  M00S03366.smfex   +++|*         MAKE ROOM FOR LOCAL FNT'S FOR THE TRANSFERRED WORKFILES.
03450  M00S03367.smfex   +++|*         TLX TREATS OUR PRE-ALLOCATED NEGATIVE FIELD LENGTH AS A
03451  M00S03368.smfex   +++|*         LIMITATION AS TO WHETHER A PARTICULAR SINGLE USER EDITOR
03452  M00S03369.smfex   +++|*         JOB WILL BE ACCEPTED INTO MULTI USER MODE.
03453  M00S03370.smfex   +++|*
03454  M00S03371.smfex   +++|*         FINALLY, COMMUNICATIONS ARE ESTABLISHED WITH IAFEX VIA THE
03455  M00S03372.smfex   +++|*         SCP/UCP FACILITY.  SMFEX IS THE UCP AND IAFEX IS THE SCP.
03456  M00S03373.smfex   +++|#
03457  M00S03374.smfex   +++|  ITEM TMP1,TMP2,TMP3,TMP4;
03458  M00S03375.smfex   +++|
03459  M00S03376.smfex   +++|  P<CORE>=0;
Line S00001 Modification History
M01 (Added by) ns2167
Seq #  *Modification Id* Act 
----------------------------+
03460  M01S00001.ns2167  +++|  IF B<00,01>MEM[CSMR] EQ 0 THEN     # IF SYSTEM CHARACTER SET = 63 #
03461  M01S00002.ns2167  +++|    BEGIN
03462  M01S00003.ns2167  +++|    XLTINTXP[O"00"]=O"4045";         # COLON = PERCENT #
03463  M01S00004.ns2167  +++|    XLTINTXP[O"63"]=O"4072";         # PERCENT = COLON #
03464  M01S00005.ns2167  +++|    XLTDSPXP[O"00"]=O"4045";         # COLON = PERCENT #
03465  M01S00006.ns2167  +++|    XLTDSPXP[O"63"]=O"4072";         # PERCENT = COLON #
03466  M01S00007.ns2167  +++|    XLTDSPINT[O"00"]=O"0063";        # COLON = PERCENT #
03467  M01S00008.ns2167  +++|    XLTDSPINT[O"63"]=O"0000";        # PERCENT = COLON #
03468  M01S00009.ns2167  +++|    XLTXPINT[O"45"]=O"0000";         # PERCENT = COLON #
03469  M01S00010.ns2167  +++|    XLTXPINT[O"72"]=O"0063";         # COLON = PERCENT #
03470  M01S00011.ns2167  +++|    XLTINTDSP[O"00"]=O"0055";        # COLON = BLANK #
03471  M01S00012.ns2167  +++|    END
03472  M00S03377.smfex   +++|
03473  M00S03378.smfex   +++|  SFMCSTF;
03474  M00S03379.smfex   +++|
03475  M00S03380.smfex   +++|  IF C<0,7>MEM[2] EQ "RECOVER" THEN SHUTDOWN=2;
03476  M00S03381.smfex   +++|  ELSE
03477  M00S03382.smfex   +++|    BEGIN
03478  M00S03383.smfex   +++|    TMP1=0;
03479  M00S03384.smfex   +++|    TMP2=0;
03480  M00S03385.smfex   +++|    TMP3=C<0,1>MEM[2]-O"33";
03481  M00S03386.smfex   +++|    WHYLE TMP2 LQ 6 AND TMP3 GQ 0 AND TMP3 LQ 9 DO
03482  M00S03387.smfex   +++|      BEGIN
03483  M00S03388.smfex   +++|      TMP1=TMP1*10+TMP3;
03484  M00S03389.smfex   +++|      TMP2=TMP2+1;
03485  M00S03390.smfex   +++|      TMP3=C<TMP2,1>MEM[2]-O"33";
03486  M00S03391.smfex   +++|      END
Line S03392 Modification History
M01 (Removed by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
03487  M01S03392.v23l617 ---|    TASKSAVAIL=MAX(MIN(TMP1,NUMTASKS),2);
Line S00012 Modification History
M01 (Added by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
03488  M01S00012.v23l617 +++|    IF TMP1 GQ 2 AND TMP1 LQ NUMTASKS THEN TASKSAVAIL=TMP1;
03489  M00S03393.smfex   +++|    END
03490  M00S03394.smfex   +++|
03491  M00S03395.smfex   +++|  P<SWAPMASK>=LOC(SWAPGOOD);
03492  M00S03396.smfex   +++|  SWAPLEN=LOC(SWAPEND)-LOC(DATASTART);
03493  M00S03397.smfex   +++|  DISPATLEN=LOC(DISPATEND)-LOC(DATASTART);
03494  M00S03398.smfex   +++|  FIELDLEN=B<42,18>MEM[O"65"];
03495  M00S03399.smfex   +++|  MODELPTR=FIELDLEN;
03496  M00S03400.smfex   +++|  MODELLEN=LOC(SWAPEND)-LOC(DATAEND);
03497  M00S03401.smfex   +++|  FIELDLEN=MODELPTR+MODELLEN;
03498  M00S03402.smfex   +++|  FLDLEN(FIELDLEN+4);
03499  M00S03403.smfex   +++|  P<MOVTO>=MODELPTR;
03500  M00S03404.smfex   +++|  MOVEWD(MODELLEN,DATAEND,MOVTO);
03501  M00S03405.smfex   +++|  FOR TMP3=1 STEP 1 UNTIL NUMTTIBUF DO
03502  M00S03406.smfex   +++|    BEGIN
03503  M00S03407.smfex   +++|    TTIBUFADDR[TMP3]=FIELDLEN;
03504  M00S03408.smfex   +++|    FIELDLEN=FIELDLEN+SIZTTIBUF;
03505  M00S03409.smfex   +++|    FLDLEN(FIELDLEN+4);
03506  M00S03410.smfex   +++|    END
03507  M00S03411.smfex   +++|  FOR TMP1=1 STEP 1 UNTIL MAXREENT DO RSTK[TMP1]=LOC(RSTK[TMP1]);
03508  M00S03412.smfex   +++|  INITBITMAP(SWAPBITS,NUMSWPBIT,NUMSWPECS+NUMSWPDSK);
03509  M00S03413.smfex   +++|  INITBITMAP(TTIBITS,NUMTTIBIT,NUMTTIBUF);
03510  M00S03414.smfex   +++|  INITBITMAP(SWAPGOOD,NUMSWPBIT,NUMSWPECS+NUMSWPDSK);
03511  M00S03415.smfex   +++|  INITBITMAP(SWAPBAD,NUMSWPBIT,NUMSWPECS+NUMSWPDSK);
03512  M00S03416.smfex   +++|  INITBITMAP(TTIGOOD,NUMTTIBIT,NUMTTIBUF);
03513  M00S03417.smfex   +++|  KILLECSBITS(SWAPBAD);
03514  M00S03418.smfex   +++|  MEM[USRBASE]=LOC(USERTAB);   # FOR EASY C DISPLAY          #
03515  M00S03419.smfex   +++|  MEM[SLTBASE]=LOC(TASKTAB);
03516  M00S03420.smfex   +++|  CONTROL IFEQ METERING,1;
03517  M00S03421.smfex   +++|    MEM[STTBASE]=LOC(INSTDATA);
03518  M00S03422.smfex   +++|  CONTROL FI;
03519  M00S03423.smfex   +++|  FOR CURTASK=1 STEP 1 UNTIL TASKSAVAIL DO BUILDTASK(CURTASK);
03520  M00S03424.smfex   +++|  SWAPLEN=SWAPLEN+TASKDSPADR[1]-TASKADDR[1];
03521  M00S03425.smfex   +++|  SWAPPRUS=((SWAPLEN+O"100")/O"100");
03522  M00S03426.smfex   +++|  SWAPBUFLEN=1+SWAPPRUS*O"100";
03523  M00S03427.smfex   +++|  FLDLEN(FIELDLEN+4);
03524  M00S03428.smfex   +++|
03525  M00S03429.smfex   +++|  CONTROL IFEQ ECSCODE,1;
03526  M00S03430.smfex   +++|    # REQUEST ECS FIELD LENGTH/ SEE IF IT IS THERE #
03527  M00S03431.smfex   +++|    GETFLCE(ECSFIELD);         # GET VALIDATION LIMIT        #
03528  M00S03432.smfex   +++|    TESTECS(TMP1);             # GET EXISTENCE/ENABLED       #
03529  M00S03433.smfex   +++|    IF B<0,12>ECSFIELD NQ 0 AND TMP1 NQ 0 THEN
03530  M00S03434.smfex   +++|      BEGIN
03531  M00S03435.smfex   +++|      # ALLOCATE DESIRED OR AVAILABLE ECS FIELD LENGTH #
03532  M00S03436.smfex   +++|      ECSFIELD=MIN(NUMSWPECS*SWAPLEN,512*B<0,12>ECSFIELD);
03533  M00S03437.smfex   +++|      FLDLENE(ECSFIELD);
03534  M00S03438.smfex   +++|      SETRFLE((ECSFIELD+511)/512);
03535  M00S03439.smfex   +++|      PROTEON;               # SINCE ABORT RECOVERY ADVANCES         #
03536  M00S03440.smfex   +++|      # TURN OFF ANY SWAP PAGES BEYOND AVAILABLE FIELD LENGTH #
03537  M00S03441.smfex   +++|      TMP1=ECSFIELD/SWAPLEN;
03538  M00S03442.smfex   +++|      FOR TMP2=TMP1+1 STEP 1 UNTIL NUMSWPECS
03539  M00S03443.smfex   +++|        DO FORCEALLOC(SWAPGOOD,TMP2,NUMSWPBIT);
03540  M00S03444.smfex   +++|      END
03541  M00S03445.smfex   +++|    ELSE KILLECSBITS(SWAPGOOD);   # TURN OFF ALL ECS SWAP PAGES #
03542  M00S03446.smfex   +++|  CONTROL FI;
03543  M00S03447.smfex   +++|  CONTROL IFEQ ECSCODE,0;
03544  M00S03448.smfex   +++|    KILLECSBITS(SWAPGOOD);
03545  M00S03449.smfex   +++|  CONTROL FI;
03546  M00S03450.smfex   +++|
03547  M00S03451.smfex   +++|  IF SHUTDOWN EQ 2 THEN
03548  M00S03452.smfex   +++|    BEGIN
03549  M00S03453.smfex   +++|    TERMMON;                   # SHUT OFF ANY INPUT          #
03550  M00S03454.smfex   +++|    P<MOVFROM>=FIELDLEN;
03551  M00S03455.smfex   +++|    MAKEFET(DMBFET,"ZZZZDMB",MOVFROM,O"1001");
03552  M00S03456.smfex   +++|    FIELDLEN=FIELDLEN+O"1001";
03553  M00S03457.smfex   +++|    FLDLEN(FIELDLEN+4);
03554  M00S03458.smfex   +++|    REWIND(DMBFET,1);
03555  M00S03459.smfex   +++|    READ(DMBFET,0);
03556  M00S03460.smfex   +++|    TMP1=0;
03557  M00S03461.smfex   +++|    TMP4=0;
03558  M00S03462.smfex   +++|    FOR TMP2=0 STEP 1 UNTIL O"61" DO
03559  M00S03463.smfex   +++|      BEGIN                  # UNTIL RIGHT (CM) CONTROL WORD         #
03560  M00S03464.smfex   +++|      READO(DMBFET,TMP1,TMP4);         # ACCESS NEXT CONTROL WORD    #
03561  M00S03465.smfex   +++|      IF TMP4 NQ 0 THEN MELT("RCVR 1$");
03562  M00S03466.smfex   +++|      END
03563  M00S03467.smfex   +++|    IF C<0,2>TMP1 NQ "CM" THEN MELT("RCVR 2$");
03564  M00S03468.smfex   +++|    FOR TMP2=1 STEP 1 UNTIL LOC(USERTAB) DO
03565  M00S03469.smfex   +++|      BEGIN                            # CONSUME LOWER FIELD LENGTH  #
03566  M00S03470.smfex   +++|      READO(DMBFET,TMP1,TMP4);
03567  M00S03471.smfex   +++|      IF TMP4 NQ 0 THEN MELT("RCVR 3$");
03568  M00S03472.smfex   +++|      END
03569  M00S03473.smfex   +++|    # FINALLY READ IN THE USER TABLE #
03570  M00S03474.smfex   +++|    FOR TMP2=1 STEP 1 UNTIL 3*NUMSMFUSR DO
03571  M00S03475.smfex   +++|      BEGIN
03572  M00S03476.smfex   +++|      P<MOVTO>=LOC(USERTAB)+TMP2-1;
03573  M00S03477.smfex   +++|      READO(DMBFET,MOVTO,TMP4);
03574  M00S03478.smfex   +++|      IF TMP4 NQ 0 THEN MELT("RCVR 4$");
03575  M00S03479.smfex   +++|      END
03576  M00S03480.smfex   +++|    REWIND(DMBFET,1);        # IN CASE TAKE ANOTHER DUMP   #
03577  M00S03481.smfex   +++|    FOR CURUSER=1 STEP 1 UNTIL NUMSMFUSR DO
03578  M00S03482.smfex   +++|      BEGIN                     # UPDATE AND QUEUE CHECKPT    #
03579  M00S03483.smfex   +++|      GETUSER;
03580  M00S03484.smfex   +++|      IF CURUSINTASK THEN CURUSDONE=TRUE;
03581  M00S03485.smfex   +++|      CURUSINQUE=FALSE;
03582  M00S03486.smfex   +++|      CURUSTTIBUF=0;
03583  M00S03487.smfex   +++|      CURUSQUELNK=0;
03584  M00S03488.smfex   +++|      CURUSINTASK=FALSE;
03585  M00S03489.smfex   +++|      IF CURUSLOGGED AND CURUSSWPPAG NQ 0 AND NOT CURUSDONE THEN
03586  M00S03490.smfex   +++|        BEGIN
03587  M00S03491.smfex   +++|        TRCBOTH("RECOVER$",CURUSER);
03588  M00S03492.smfex   +++|        CURUSRCVRY=TRUE;
03589  M00S03493.smfex   +++|        CURUSINTRPT=TRUE;
03590  M00S03494.smfex   +++|        PUTINQ;
03591  M00S03495.smfex   +++|        END
03592  M00S03496.smfex   +++|      PUTUSER;
03593  M00S03497.smfex   +++|      END
03594  M00S03498.smfex   +++|    FOR TMP1=1 STEP 1 UNTIL NUMSWPFET DO SWPFETDONE[TMP1]=TRUE;
03595  M00S03499.smfex   +++|    TRCSTR("END INITMON RCVR$");
03596  M00S03500.smfex   +++|    RETURN;                  # SO THAT NOTHING ELSE IS DONE          #
03597  M00S03501.smfex   +++|    END
03598  M00S03502.smfex   +++|
03599  M00S03503.smfex   +++|  FOR TMP1=1 STEP 1 UNTIL NUMSWPFET DO
03600  M00S03504.smfex   +++|    BEGIN
03601  M00S03505.smfex   +++|    CONTROL IFGR NUMSWPFET,8; BADSTUFF; CONTROL FI; # CODE DEPENDENT #
03602  M00S03506.smfex   +++|    C<0,6>TMP2="SMFSWP";
03603  M00S03507.smfex   +++|    C<6,1>TMP2=TMP1+O"32";
03604  M00S03508.smfex   +++|    P<ANYFET>=LOC(SWPFET[TMP1]);
03605  M00S03509.smfex   +++|    P<MOVFROM>=TASKADDR[1];
03606  M00S03510.smfex   +++|    MAKEFET(ANYFET,TMP2,MOVFROM,SWAPBUFLEN);
03607  M00S03511.smfex   +++|    READ(ANYFET,1);          # ASSURE FNT ALLOCATE #
03608  M00S03512.smfex   +++|    EVICT(ANYFET,1);         # ASSURE NO OLD DATA #
03609  M00S03513.smfex   +++|    END
03610  M00S03514.smfex   +++|
03611  M00S03515.smfex   +++|
03612  M00S03516.smfex   +++|    PROC GENNULL;
03613  M00S03517.smfex   +++|      BEGIN
03614  M00S03518.smfex   +++|      C<0,2>TMP2="NE";
03615  M00S03519.smfex   +++|      TMP3=TMP1;
03616  M00S03520.smfex   +++|      FOR TMP4=6 STEP -1 UNTIL 2 DO
03617  M00S03521.smfex   +++|        BEGIN
03618  M00S03522.smfex   +++|        C<TMP4,1>TMP2=O"33"+MOD(TMP3,10);
03619  M00S03523.smfex   +++|        TMP3=TMP3/10;
03620  M00S03524.smfex   +++|        END
03621  M00S03525.smfex   +++|      MAKEFET(NULLFET,TMP2,CORE,O"101");
03622  M00S03526.smfex   +++|      END                       # OF GENNULL        #
03623  M00S03527.smfex   +++|
03624  M00S03528.smfex   +++|
03625  M00S03529.smfex   +++|    FOR TMP1=1 STEP 1 UNTIL NUMSMFUSR DO
03626  M00S03530.smfex   +++|      BEGIN                  # MANY NULL FILES TO ENLARGEN NFL       #
03627  M00S03531.smfex   +++|      GENNULL;
03628  M00S03532.smfex   +++|      READ(NULLFET,1);       # ASSURE FNT ALLOCATE #
03629  M00S03533.smfex   +++|      END
03630  M00S03534.smfex   +++|    FOR TMP1=1 STEP 1 UNTIL NUMSMFUSR DO
03631  M00S03535.smfex   +++|      BEGIN                  # THEN RELEASE THE FNT SPACE  #
03632  M00S03536.smfex   +++|      GENNULL;
03633  M00S03537.smfex   +++|      RETERN(NULLFET,1);
03634  M00S03538.smfex   +++|      END
03635  M00S03539.smfex   +++|  IAFPTR=LOC(SSCINP[0]);
03636  M00S03540.smfex   +++|  INITSSCWORD[1]=IAFHEADER;
03637  M00S03541.smfex   +++|
03638  M00S03542.smfex   +++|  P<SSCBUFFER>=LOC(INITSSC);
03639  M00S03543.smfex   +++|  SSCSTATUS=-1;
03640  M00S03544.smfex   +++|  # DELAY UNTIL IAF HANDSHAKE WORKS OR IDLE COMMAND DETECTED #
03641  M00S03545.smfex   +++|  WHYLE SSCSTATUS LAN O"7776" NQ 0 AND MEM[0] LAN O"100000" EQ 0 DO
03642  M00S03546.smfex   +++|    BEGIN
03643  M00S03547.smfex   +++|    SSCWORD=O"0000 0000 0000 0103 0000";
03644  M00S03548.smfex   +++|    SYSREQ("SSC",0,LOC(SSCBUFFER),IAFSSID);
03645  M00S03549.smfex   +++|    RECALL(0);
03646  M00S03550.smfex   +++|    END
03647  M00S03551.smfex   +++|
03648  M00S03552.smfex   +++|  SFMSSTF;
03649  M00S03553.smfex   +++|  TRCSTR("END INITMON$");
03650  M00S03554.smfex   +++|
03651  M00S03555.smfex   +++|  END                          # OF INITMON        #
03652  M00S03556.smfex   +++|
03653  M00S03557.smfex   +++|
03654  M00S03558.smfex   +++|PROC TERMMON;
03655  M00S03559.smfex   +++|  BEGIN
03656  M00S03560.smfex   +++|#
03657  M00S03561.smfex   +++|**        TERMMON - TERMINATE SMFEX NORMALLY.
03658  M00S03562.smfex   +++|*
03659  M00S03563.smfex   +++|*         CALLS  SFMCSTF.
03660  M00S03564.smfex   +++|#
03661  M00S03565.smfex   +++|  SFMCSTF;
03662  M00S03566.smfex   +++|  TRCSTR("COMPLETE$");
03663  M00S03567.smfex   +++|  TRCFRC;
03664  M00S03568.smfex   +++|  END                         # OF TERMMON        #
03665  M00S03569.smfex   +++|
03666  M00S03570.smfex   +++|
03667  M00S03571.smfex   +++|PROC MELT(STR);
03668  M00S03572.smfex   +++|  BEGIN
03669  M00S03573.smfex   +++|#
03670  M00S03574.smfex   +++|**        MELT - TERMINATE SMFEX ABNORMALLY.
03671  M00S03575.smfex   +++|*
03672  M00S03576.smfex   +++|*         ENTRY  STR - ERROR MESSAGE FOR INTERNAL ABORT CONDITION.
03673  M00S03577.smfex   +++|*                COMPLETE - IF ALREADY SET, THEN MELT FUNCTIONS AS
03674  M00S03578.smfex   +++|*                    AN INTERFACE TO PRODUCE A DAYFILE MESSAGE THEN
03675  M00S03579.smfex   +++|*                    ALLOW NORMAL TERMINATION.  NORMALLY, COMPLETE
03676  M00S03580.smfex   +++|*                    IS FALSE AND MELT ABORTS THE JOB STEP.
03677  M00S03581.smfex   +++|*
03678  M00S03582.smfex   +++|*         EXIT   VIA LABELS ABORT OR ENDRUN.
03679  M00S03583.smfex   +++|*
03680  M00S03584.smfex   +++|*         CALLS  MESSAGE, TERMMON.
03681  M00S03585.smfex   +++|#
03682  M00S03586.smfex   +++|  ITEM STR C(30);
03683  M00S03587.smfex   +++|  ITEM STR2 C(30);
03684  M00S03588.smfex   +++|  ITEM TMP1,TMP2;
03685  M00S03589.smfex   +++|
03686  M00S03590.smfex   +++|  TRCSTR(STR);
03687  M00S03591.smfex   +++|  TRCFRC;
03688  M00S03592.smfex   +++|  STR2=STR;
03689  M00S03593.smfex   +++|  TMP2=0;
03690  M00S03594.smfex   +++|  FOR TMP1=0 STEP 1 UNTIL 29 DO
03691  M00S03595.smfex   +++|    BEGIN
03692  M00S03596.smfex   +++|    IF TMP2 EQ 0 AND C<TMP1,1>STR2 EQ "$" THEN TMP2=TMP1+1;
03693  M00S03597.smfex   +++|    END
03694  M00S03598.smfex   +++|  FOR TMP1=29 STEP -1 UNTIL TMP2 DO C<TMP1,1>STR2=0;
03695  M00S03599.smfex   +++|  MESSAGE(STR2,0,1);
03696  M00S03600.smfex   +++|  TERMMON;
03697  M00S03601.smfex   +++|  IF COMPLETE THEN ENDRUN;
03698  M00S03602.smfex   +++|  ELSE ABORT;
03699  M00S03603.smfex   +++|
03700  M00S03604.smfex   +++|  END                          # OF MELT #
03701  M00S03605.smfex   +++|PAGE
03702  M00S03606.smfex   +++|
03703  M00S03607.smfex   +++|#
03704  M00S03608.smfex   +++|**        SMFEX - MAIN ALGORITHM.
03705  M00S03609.smfex   +++|*
03706  M00S03610.smfex   +++|*         THE SMFEX MAIN ALGORITHM INITIALIZES THE SUBSYSTEM, THEN
03707  M00S03611.smfex   +++|*         LOOPS ON THE THREE MAIN PROCESSES UNTIL A COMPLETION FLAG
03708  M00S03612.smfex   +++|*         IS DETECTED.  THE SUBSYSTEM IS THEN TERMINATED.
03709  M00S03613.smfex   +++|*
03710  M00S03614.smfex   +++|*         THE THREE PROCESSING PHASES PERFORM TIME-DEPENDENT FUNCTIONS,
03711  M00S03615.smfex   +++|*         RECEIVE AND QUEUE MESSAGES FROM IAFEX, AND EXECUTE TASKS AND
03712  M00S03616.smfex   +++|*         REPLY TO IAFEX.
03713  M00S03617.smfex   +++|*
03714  M00S03618.smfex   +++|*         CALLS  INITMON, DOTIMER, DOINPUT, RUNJOBS, INITMON.
03715  M00S03619.smfex   +++|#
03716  M00S03620.smfex   +++|ITEM TMP1;
03717  M00S03621.smfex   +++|
03718  M00S03622.smfex   +++|INITMON;                     # GET EVERYTHING SET UP       #
03719  M00S03623.smfex   +++|
03720  M00S03624.smfex   +++|WHYLE NOT COMPLETE DO        # MAIN LOOP         #
03721  M00S03625.smfex   +++|  BEGIN
03722  M00S03626.smfex   +++|  DOTIMER;                   # RECALL CPU, HANDLE TIMER AND OPERATOR #
03723  M00S03627.smfex   +++|  DOINPUT;                   # PROCESS INPUT FROM IAFEX    #
03724  M00S03628.smfex   +++|  RUNJOBS;                   # EXECUTE ANY TASKS THAT CAN  #
03725  M00S03629.smfex   +++|  END                         # OF MAIN LOOP      #
03726  M00S03630.smfex   +++|
03727  M00S03631.smfex   +++|TERMMON;                     # CLOSE UP SHOP     #
03728  M00S03632.smfex   +++|ENDRUN;
03729  M00S03633.smfex   +++|
03730  M00S03634.smfex   +++|
03731  M00S03635.smfex   +++|END TERM
cdc/nos2.source/opl.opl871/deck/smfex.001.txt ยท Last modified: by 127.0.0.1