- 30 -

            P10 has several entry points, of which one (the "normal" one, JSP10)
            is conditional, in the sense that the subprogram is only suspended if
            a peripheral holdup is present: all the other entries are guaranteed
            to suspend the subprogram. The following requirements apply to all
            entries:

            (i)   the correct parameters must be in Q4, and when the subprogram is
                  number 2,4,6 or 8, the correct priority number must be in M5 (to
                  address V25P104M5, etc.).

            (ii)  entry must be made using a "jump to subroutine" instruction.
                  If the subprogram is actually suspended, the link thus planted
                  will be stored in SHUL, so that when the subprogram is re-entered
                  (and this applies even if it is not suspended) it will be at the
                  instruction immediately after the "jump to subroutine".

            (iii) a parameter must be supplied which states how many items (up to
                  3) are to be transferred from SJNS to SHUL* if this entry causes
                  the subprogram to be suspended.

            (iv)  if the subprogram is suspended, P10 is left (after having deposited
                  the appropriate items in SHUL, SHUL* and SHUP) by obeying EXIT 1
                  or EXIT 2, and a further parameter must be supplied to say which
                  of these two alternatives if required. This parameter, and the
                  number of items n (0≤n≤3) which are to be transferred from SJNS to
                  SHUL*, are combined in. one word, referred to below as the "link
                  parameter", which takes the value n or ñ (i.e. -1-n) respectively,
                  according to whether EXIT 1 or EXIT 2 is to be obeyed when leaving
                  P10.

            Thus if P10 is entered with a link parameter of 2, and the subprogram is
            suspended, the overall effect on the SJNS after P10 has finished is that
            3 items have been erased: the top two go to SHUL*, and the third is used
            when EXIT 1 is obeyed to leave P10.   The link planted on entry to P10
            does not count as it goes straight to SHUL. When the subprogram is re-
            entered subsequently by P11 the SJNS will contain (starting at the top and
            working down): the 2 items from SHUL*, a link to return control to P11,
            and links to return control from P11 to P5 and from PS to the long path.

            Note that if a subprogram enters P10 but is not suspended, it will
            continue at the next instruction after the "jump to subroutine" with the
            SJNS, SHUL, etc., unaltered.

            The use of the SJNS to determine where control shall be transferred when
            P10 is left, means that P10 can be used to initiate a subprogram, i.e to
            suspend an activity in such a way that it can be re-entered as a sub­
            program by P11: provided that this initiation, or initial suspension,
            takes place within a subroutine, so that there is in SJNS a link which may
            be used, by EXIT 1 or EXIT 2, when transferring control from P10 after
            the latter has set up SHUL, SHUT,* and SHUP. Because there may be some
            significance in whether this link is used by EXIT 1 or EXIT 2, the choice
            must be specified in the link parameter.

            Once the subprogram has been initiated, and re-entered by P11, any
            subsequent suspension by P10 will cause control to revert to P11, via the
            link planted by the latter - i.e. the subprogram behaves like a subroutine


- 31 - of P11. Whether EXIT 1 or EXIT 2 is used to return control to P11 is immaterial, as either will reenter P11 at the point where it updates Q4 and goes on to examine the next subprogram. Whenever P10 suspends subprogram 2,4,6 or 8, it also sets D47 of the appropriate member of V25P104M5 so that during its suspension, the priority of which this is the main subprogram is also held up. P10 is not used to close down a subprogram, because, as explained in 4.1.5, when a subprogram is re-entered its SHUL is cleared. All that a subprogram needs to do to close itself down is to obey EXIT 1 or EXIT 2 using the link planted by P11. The full power of the P11-P10 combination will be shown in the examples of its uses in connection with FLEX and OUT interrupts. Entries to P10 are as follows:- (a) JSP10: obeyed with the link parameter in N1.. The subprogram is suspended if, and only if, the store area defined by the absolute addresses in I7 and M7 is locked out, or (if C7 is nonzero) if the peripheral unit, whose number is in C7, is busy. The suspension will be the first type of subprogram hold-up, i.e. D0 of SHUL is made zero, and Q7 is transferred to SHUP, by P10. When the subprogram resumes, at the instruction after JSP10, the link parameter will have been erased from N1 and Q7 will be in status quo. (b) JS2P10: obeyed with the link parameter in N3. N2 contains a quantity which P10 will OR with the link before transferring the latter to SHUL. N1 contains the quantity to be transferred by P10 to SHUP. Suspension is unconditional. P10 will erase N1, N2, N3. When the subprogram is reentered by P11 (at the instruction following JS2P10) the disposition of items in Q7, the Nest, etc., will of course depend on the type of suspension determined by D0 of SHUL, and SHUP (see 4.1.5). (c) JS3P10: obeyed with the link parameter in N1. This entry is exactly equivalent to obeying ZERO; Q7; JS2P10; (i.e. like JSP10, with suspension guaranteed). (d) JS4P10: exactly equivalent to obeying ZERO; ZERO; ZERO; JS2P10; This is a simple method of suspending, or initiating, a subprogram so that its re-entry next time P11 is entered is guaranteed, since D0 of SHUL=0 and SHUP.O. SHUL' is also cleared. Apart from the link parameter, the entry JSP10 is the almost exact equivalent of the JS/RWL5/; used in the non-Time-Sharing Director (N6.2). Entry 2 (JS2P10) is so flexible, permitting any type of suspension to be set in SHUL and SHUP, that it is used to set up almost all the subprogram hold-ups implicit in other subroutines, e.g. P8 and P58. P8, the subroutine to set a typewriter query in the flexowriter queue (4.1.3), requires the link parameter in N3 on entry, and its last instruction, after inserting the transfer parameters in the queue, is J2P10. P58 is a subroutine used by OUT 4 and OUT 10 which, given a 2-word identifier in N1
- 32 - and N2, will suspend the subprogram in the correct manner if the required tape is not available. To do this it will obey: REV; (interchange 2 words of identifier) =E20M4; (store 2nd word in SHUP*) SET1; (link parameter - to preserve link for P58 in SHUL*) ZERO; NOT; STR; NEV; (sets D0 in N1) CAB; (1st word of identifier to N1, for SHUP) JS2P10; (to hold up subprogram - SHUL has D0=1) When the subprogram is reentered by P11, which will occur when the new identifier marker, V0P101, is non-zero, the identifier will be transferred by P11 from SHUP and SHUP* to N1 and N2. The link for P58 will be in SJNS, so that the position is exactly as it was when P58 was first entered. The next instruction is therefore: JP58; Note that a subprogram may address its SHUL, SHUP, SHUP*, SHUL*, as E0M4, E10M4, E20M4 and E30M4, respectively. 4.2 FLEX. The action of P4 The subroutine P4 is entered from the long path if FLEX has occurred, i.e. if V16P0 is found to be non-zero. Its first action is to set V19P0 (the EDT marker) non-zero, to ensure that by pressing the Interrupt key on the Flexowriter the operator can force an "artificial" EDT. Subprogram 0 will be used to type the query "TINT". If this subprogram is found to be active (i.e. its SHUL word, V1P11, is non-zero) P4 exits to the long path without clearing V16P0 - this will cause the Director to cycle round the inner loop of the long path until the FLEX RFI can be dealt with. If V1P11 is zero, P4 sets up Q4 with the correct parameters for subprogram 0 (a copy of V0P11) and enters P8 to put the parameters for typing the "TINT" query into the Flexowriter queue, with a link parameter of zero. As explained in 4.1.6, this will cause SHUL (with D0=0) and SHUP (with D0=1) for subprogram 0 to be set up, and will then cause control to be returned to the long path when P8(P10) obeys the link (using EXIT 1) which was planted by the entry to P4. The subsequent actions of P4 therefore take place in subprogram 0, following re-entry by P11 after the query has been answered (giving EDT automatically) and checked. The reply to the query is checked to ensure it is a letter in the right range. If it is not, the query is typed again (preceded by AGAIN): this time, P8 transfers control back to P11 rather than to the long path. When a satisfactory answer is received, a branch is made depending on the value of the letter typed. This branch is made to look like a subroutine jump, so that in effect each TINT is dealt with by a subroutine of P4. These subroutines are: TINT A - P33 " B - P34 TINT M - P45 " E - P37 " P - P48 " G - P39 " R - P50 " H - P40 " S - P51 " I - P41 " T - P52 " J - P42 " U - P53 " L - P44 " V - P54
- 33 - and when each is entered in this context, there will be four links in SJNS: the links to return control to P4, from P4 to P11, from P11 to P5, and from P5 to the long path. Each of these subroutines has two exits. EXIT 2 is the normal exit for a successful execution. EXIT 1 is obeyed when any check fails and causes the TINT query (preceded by AGAIN) to be repeated. To illustrate the ways in which these TINT subroutines exploit P10 and the subprogram system, P33, P41, P45, and P52 are discussed below in some detail. The other TINT subroutines are quite straightforward, and examination of any of them will show that they work in a simple way, and finish by obeying either EXIT 1 (failure) or EXIT 2 (successful execution). Following the successful execution of any of these subroutines, Q4 is liable to have been altered, so the instructions to which EXIT 2 leads are: V0P11; = Q4; EXIT 1; which reset Q4 to the value required by P11, and then return control to P11, leaving subprogram 0 closed down. The value of M5 is immaterial when P11 is resumed. The subroutines P31 (fetch character) and P32 (fetch octal number) are much used by P4 and by the TINT subroutines (they are analogous to /RFC/ and /RFN/ in the non-Time-Sharing Director - see N5.3). Also useful is P56, which extracts a program letter from C7 (where it will have been left by P31) and sets the corresponding priority number in M5. 4.2.1 P33 - TINT A (Terminate program) P31 and P56 are entered to get the priority number of the program concerned into M5. V29P104M5 is examined to see whether the program is in process of termination (V29P104M5 nonzero) or not. If the program is already being terminated, P33 merely sets a 1 in D1 of V29P104M5 if D2 of that word is nonzero (see 2.5), and then ends EXIT 2. If the program is not already in process of termination, TINT A must end it. To do this, it first clears D45 of V25P104M5 (see 2.4) and then, by obeying JS2P10 with a link parameter of -1 (which makes P10 clear SHUL*, and end by obeying EXIT 2) sets up the main subprogram of the priority to be terminated, closing down subprogram 0 as shown below. The steps performed by P33 in doing this are: JSP30; (this most useful subroutine sets up in Q4 the parameters appropriate to the main subprogram of the priority whose number is given in M5) ZERO; NOT; (link parameter) ZERO; (to ensure D0 of SHUL=0) C7; (the character following the program letter; if it is +, the TINT A procedure is different. Here it is masquerading as the final absolute address (in the range 0-63) of a potentially locked-out area, and will thus be stored in SHUP. Since locations 0-63 are never locked-
- 34 - out this is more or less legitimate). JS2P10; (this causes SHUL and SHUP of the priority's main subprogram to be set up as indicated by the parameters in N1 and N2. SHUL* is cleared and P10 obeys EXIT 2 to return control to P4. P4 now restores Q4 to its original value, for subprogram 0, and obeys EXIT1 to return control to P119 Which will soon come to deal with the subprogram newly set up. Subprogram 0 is left closed down since its SHUL is still zero. When the new subprogram is re-entered by P11, M7 will now contain the character following the program letter. If this is + (octal 35), an ending number(4) is placed in V0P29 and P2 entered at reference 2 (see 5.1), causing the Nest and SJNS to be typed out before entry to P15 which sets off the normal termination procedure. Otherwise P15 is entered direct. Note that TINT A does not check whether the priority's main subprogram is suspended or closed down, before taking it over. This characteristic is shared by TINT I (see 4.2.2). It implies that any activity carried out by the main subprogram while its parent program is not being terminated must always suspend itself in such a way that it does not matter if it is closed down (because of program termination or restart) during any suspension. 4.2.2 P41 - TINT I (Restarts) Like P33, P41 uses P31 and P56 to set up the appropriate priority number in M5, and then examines V29P104M5: action is only taken if the latter is zero. This action consists of adding an extra link to the program's SJNS, causing it to resume at syllable 0 (even restart) or 3 (odd restart) of word E4. In the former case, P41 clears the SHUL of the priority's main subprogram, and removes D47 of V25P104M59 by obeying: JSP30; ZERO; =M0M4; SET 1; JSP114; 4.2.3 P45 - TINT M (Store Post-Mortem) TINT M has to carry out two operations which may cause hold-ups: it must allocate itself (the Director) a paper tape punch, and it must output a sequence of messages on that punch. It uses subprogram number 1 for these activities, and accordingly sets up Q4. It may, or may not, be suspended, in the process of obtaining the paper tape punch, and so the first suspension could occur then, or during the output of paper tape: for this reason, a link parameter of -1 has to be used both for suspending the subprogram if a paper tape punch is not available (in which case SHUL is negative and SHUP = D0+D47: JS2P10 is used) and also for the conditional suspension (JSP10) occurring during the actual punching of paper tape. The first suspension closes down subprogram O. Care must be exercised when using P45 because it does not check that subprogram 1 is already in use before using it itself.
- 35 - 4.2.4 P52 - TINT T (Input B program) P52 must read in the priority number at which the B program is to be input, and check that it is not occupied or involved in a priority swop, and that B-program input is not proceeding at any other level. Other checks must be performed on the "operator's store limit", if present, and also on whether 32 words are available for reading the B block. If all the checks are passed, P118 is used to set up the Base Address in V0P104, and the priority number in V0P52 (indicating which priority is involved in B program input). Then the main subprogram of that priority is set up (just as P120 sets up this subprogram when initiating the input of an A program - see 4.1.4). A point of interest about the way this subprogram is set up is that it uses P134 to do it. P134 itself uses JS2P10; the significant thing is that P10 must preserve an extra link (that from P52 to P134) in SHUL*, because this is part of the subprogram rather than the procedures outside it. Also the link parameter must be negative since EXIT 2 is required: so its value is actually -2. Another interesting point is that, once the subprogram is re-entered, it may return to the same setting-up point (in P52 this is:- 3; SET -2; ZERO; ZERO; JSP134;) to suspend itself if a paper tape reader is not available. The same link parameter is used because the P52-P134 link must still be preserved in SHUL*, and it does not matter that P10 returns control to P11 using EXIT 2. Note that when the subprogram suspends itself because there is no paper tape reader available, it does not use the convention of setting D0 of SHUL =1, and SHUP . D0+type number, because this does not give the operator any opportunity of using TINT A to terminate the input request (hence the use of P134). If TINT A occurs, the subprogram clears V2P52 and enters P121 (CRNP FO). Until a paper tape reader is actually allocated and its number stored in V2P529 this V-store is used to hold an indication of whether the PTR is to be pre-allocated (status P) or not. If the unit is not pre-allocated it retains status U but the program letter is inserted in its descriptor to prevent it from being allocated for any other use. It will be noted that, in these four examples, some other subprogram, besides 0, is involved. However the other subprogram is never set up until all the necessary checks have been performed - the failure of a check leads to EXIT 1 and the repetition of the TINT; query. After the new subprogram is set up (using an altered value of Q4) P10 transfers control back to P4 via EXIT 2; this resets Q4 and then returns to P11, leaving subprogram 0 closed down.
- 36 - 5. OUTS (P3, etc) Program Failure (P2) When P3 is entered from the long path following an OUT, its first action is to clear V20P0, the OUT marker. Then it adds 3 syllables to the programs return address which is stored in V16P1, and checks that there is an "OUT number" in the right range stored at the top of the Nest, in V0P1. A copy of this is transferred to the SJNS, and this is used to perform a branch to one of a set of routines dealing with individual OUTS. Unlike the branch following a TINT, this one is not performed like a "jump to subroutine", and the only item in the SJNS when one of these OUT routines has been entered is the link to return control from P3 to the long path. This link will be used by EXIT 1 at the end of an OUT routine, or at its first suspension, At this stage the OUT number, in V0P1, has not been erased from the program's Nesting store, whose contents are in the V-stores of P1. The individual OUT routines are permitted to refer to the program's Nest in these locations, but only until the first suspension occurs, after which P29 must, of course, be used to refer to these items. Each OUT routine must make its own arrangements to remove the OUT number (and any other erasable parameters), and to insert "results", in the program's Nest. The convention is followed that should a program failure occur in one of these OUT routines, P2 (the Program Failure routine) will be entered after the OUT number has been erased from the programs Nest, but will find other parameters as they were on entry to Director. Any OUT routine may want to initiate the main subprogram of the interrupted priority. Anticipating this, the long path will already have stored this priority number in M5, and using P30 will have set the correct parameters for this subprogram in Q4, before entering P3. Also, before branching to the appropriate OUT routine, P3 will set V19P0 (the EDT marker) non-zero, so that after P3 has returned control to the long path, P5, and hence P11, will subsequently be entered, giving the opportunity of re-entry to a suspended subprogram. By causing any OUT activity which involves a hold-up to be carried out by the appropriate subprogram, the Director ensures that the activity has the correct relative priority. The quartets V45P104M5 and V49P104M5 can be used by these subprograms to hold parameters, The OUT routines are: OUT 0 - P15 OUT 6 - P21 OUT 1 - P16 OUT 7 - P21 OUT 2 - P17 OUT 8 - P23 OUT 3 - P18 OUT 9 - P24 OUT 4 - P19 OUT 10 - P61 OUT 5 - P20 Before describing a few of them in detail, it is worth having a closer look at P2, the "Program Failure" subroutine.
- 37 - 5.1 P2 (Program Failure) P2 is entered (using JSP2) from the long path, if a LIV, NOUV, Time Expiry, RESET or "Spurious Interrupt" failure occurs in a program; and also (using JP2) if a check fails in one of the OUT routines, or following a CRNP failure (P121) after OUT 1 - in these cases, there is already a link in SJNS which P2 can use to return control to the long path or to P11. On entry to P2, M5 should contain the failed programs priority number, and Q4 the parameters for its main subprogram. There must be a failure indicator in N1, which is typed out either just as it stands (D0-38 non- zero), or, if D0-38 = 0, as the two-digit octal number in D39-44, followed by L, N, T according to which, if any, of D45, 46, 47 are non-zero (this is the same as the failure indicator required by /RW8/ in the non-Time­ Sharing Director - N7.1). If program termination is unconditional, V0P2 must contain a non-zero "Ending number"; otherwise the familiar "REACT;" -query will be typed later, and termination only occurs if the answer to this query is "A". P2 has a second entry point at reference 2, which occurs after the failure indicator has been typed. This entry is used by TINT A (P33 - see 4.2.1), which sets the ending number "4" in V0P2 before obeying J2P2. At this point P12 is entered to type out the, contents of the programs Nest and SJNS. P12 uses P29 for all references to the Nest and SJNS, except when V6P12 is non-zero: this only occurs following a NOUV interrupt, when it is certain that the contents of the Nest and SJNS are still in the V-stores of P1. After being typed, the program's Nest and SJNS are cleared. If V0P2 is non-zero, this ending number is set in N1, and control now passes to P15 (see 5.2.1) using J1P15. If V0P2 is zero, as is the case for most program failures, the "REACT;" query is typed using the priority's main subprogram. Because this query has to be typed in a different form for each program, it is stored in its four different forms in the V-stores of P2, thus: V2 - 4 - Program P V5 - 7 - Program Q V8 - 10 - Program R V11 - 13 - Program S This avoids falling into the trap mentioned in 4.1.3. The query is typed using P8 with a zero link parameter. If the first character of the reply (in V4, 7, 10 or 13 of P2) is "A", the program must be terminated - the ending number 7 is set in N1, and control passed to P15, using J1P15. Otherwise, the value 4 is stored in the program's SJNS (to act as the re-entry address), and the programs time limit is replaced by its run time to date plus 4 seconds. P2 ends by obeying EXIT 1, thus closing down the main subprogram.
- 38 - 5.2 OUT Routines All these routines act as extensions of P3, and, in the case of P15, of P33 (TINT A), and P2 (Program Failure). All are expected to end EXIT 1, and therefore to use a positive link parameter at any subprogram suspension. P23 has features intended for use by all OUTs, present and future, which perform peripheral transfers on a programs behalf, and is discussed separately in section 5.3. Before describing individual routines, mention should be made of the useful subroutine P62. This is used before any suspension occurs. It erases the OUT number from the programs Nest, checks that the latter contains at least one more item, and leaves two copies of that next item in N1 and N2, without erasing it. 5.2.1 P15 (OUT 0) and P17 (OUT 2) P15 has 3 entry points. The initial actions of P15 are described below, with the entry points indicated. - main entry (JP15 - used by OUT 0): set ending number of zero in N1; - second entry point (J1P15 - used by P2 and P33): given the ending number in the Nest, sets 5 (the termination marker, to be stored in V29P104M5), in N1; - third entry point (J2P15 - used by P17 (OUT 2)): at this stage the ending number is in N2 and the termination marker is in Nl. The latter has the value 5 unless termination is by OUT 2, in which case it is 8 (A-program) or 9 (B-program). From this point the important actions of P15 are:- - to add D0 to the termination marker, store it in V29P104M5, and set D46 of V25P104M5 non-zero. - to dispose of peripheral units. Any unit allocated or pre- allocated to a program has its current transfer cleared. If it is a magnetic tape, a "block-counting" rewind is performed. Units of other types revert to status U, unless OUT 2 is being performed for an A-program, in which case these units revert to status P. Note that it is possible to find a unit in status A even after the program has obeyed OUT 6 to deallocate it, because the unit must stay in that status until it is no longer busy (the program being prevented from continuing by reason of a suspension of its main subprogram). If, while the unit is still busy, TINT A is executed, the subprogram is forcibly closed down, the unit remains in status A, and, if it is still busy, will have its transfer cleared. Thus there is a slight danger that if a busy unit is de-allocated by OUT 6, the transfer may still be cut short if TINT A occurs before it has finished. This could not
- 39 - arise with the non-Time-Sharing Director because no TINT could be performed while the Director was waiting for the transfer to end. - if the second (OUT 8) subprogram of this priority is closed down, i.e. if E1M4 is zero, P15 sets it up again so that its SHUP (E11M4) and SHUL* (E31M4) are zero, and its SHUL (E1M4) contains a (positive) link causing it to be entered at reference 99 of P23 (see 5.3). P15 now suspends itself (using JS4P10) until V29P104M5 is positive. It will be recalled that D0 of this word was made non- zero at the third entry point to P15. This is interpreted by the second subprogram as a signal that the program is to be terminated and accordingly it winds up all OUT 8 - type processes. When it has done this and the programs store area is free of lock-outs, it clears D0 of V29P104M5 and closes itself down. P15 can now resume and it types out on the log the details of the last program. If OUT 2 is in progress, P15 next modifies the program's NOL if required, using a value left by P17 in V45P1O4M5, and ends by obeying J44P120 - this causes P120, the program input routine, to be joined at the point where the details of the new program are typed on the log, and, inter alia, V29P104M5 and D46 of V25P104M5 are cleared before EXIT 1 is obeyed, closing down the main subprogram. If not initiated by OUT 2, P15 obeys J10P121 - this transfers control to the last stage of the CRNP failure routine, in which BA and NOL (V9P0M5) are cleared, the "program present" bit is removed from V0P104, the area the program occupied is checked to ensure no lockouts remain, and that priority's PHU store is cleared. EXIT 1 is obeyed to close down the main subprogram. V29P104M5 is left with the value 5 in it. P17 (OUT 2) first carries out various checks on the new program identifier, store size, etc. before setting an ending number of 2 and a termination marker value of 8 (A-program) or 9, and obeying J2P15. Any failure will lead to P2, an ending number of 6 first having been placed in V0P2. One interesting feature is the preservation of the contents of D24-47 of E0 in V33P104M5. This is a buffer used by TINT B, if executed while a program is in process of termination, and its contents will be restored to E0 by P120 when it is eventually entered at reference 44. The value of NOL for the new program is left by P17 in V45P104M5, to be used by P15.