- 40 -

       5.2.2 P16 (OUT 1)

             After various checks, the value 2 (A-program) or 3 is set in V29P104M5,
             and D46 of V25P104M5 made non-zero. The main subprogram is suspended
             if the store area of the program is locked out, if the second (OUT 8)
             subprogram is not closed down, or if V0P120 (A program)/V0P52 (B
             program) is positive, and will not be resumed until all these
             conditions are absent On resumption, the priority number will be
             stored in V0P120 or V0P52, to indicate that A- or B-program input is
             going on.

             Before this suspension a message "OUT 1" is typed: the operator will
             be aware that the suspension has not been lifted if the new program
             identifier is not typed subsequently.

             Finally P16 obeys J22P120 to transfer control to the program input
             routines. Parameters for P120 will have been left in V1P104M5 (the
             amount of store used by the previous section, not to be exceeded
             by the new one) and in V45P104M5 (the identifier of the required
             new program section).

             Any failures after entry to P120 will of course be dealt with by
             P121 (CRNP failure), which recognises that the program input was
             initiated by OUT 1 (since D46 of V29P104M5 is non-zero) and
             accordingly transfers control to P2 - having first set the ending
             number 5 in V0P2 to guarantee termination.

       5.2.3 P18 (OUT 3) and P24 (OUT9)

             These two very simple routines are examples of the way in which
             OUT routines may, until their first suspension, rely on the
             program's Nest staying in the V-stores of Pl. The appropriate
             times (Run or Real) are transferred to V0P1 (N1 of the program's
             Nest). Thus the OUT number is erased and the result inserted
             with just one instruction.

       5.2.4 P19 (OUT 4) and P61 (OUT 10)

             These routines both, after performing all the necessary checks,
             use P58, whose action has been described in 4.1.6. If the
             required identifier is one-word, an artificial second word is
             introduced which has D0-2 0, D2-47 = all l's.

             A marker is set in V45P104M5 to distinguish OUT 4 (marker non­
             zero) from OUT 10 (marker zero).

       5.2.5 P20 (OUT 5) and P21 (OUT 6). P26

             The behaviour of the OUT 5 routine depends largely on whether the
             program obeying OUT 5 is A or B. An A program can only be
             allocated units of status P, and program failure results if there
             are none available. A B program will be allocated a P unit if
             there is one (a unit may be pre-allocated to a B program either
             as the result of TINT T, which can pre-allocate the input paper


- 41 - tape reader, or following the de-allocation of a unit previously allocated by OUT 5*); if there is no P unit of the required type, a U unit must be allocated and if there is not one of these the "AWAITS TYPE tt" message is typed and the subprogram suspended (with SHUL negative, and SHUP = type number + D0). This suspension is cleared either by a unit of the right type becoming available, or by TINT A or I0. OUT 5* (when the type number supplied by the program in N2 has D44 added) is dealt with as follows:- When a B-program asks for a unit of a certain type in this way, P20 inserts a marker bit in V21P104M5. The bits of this word are assigned to type numbers in such a way that type (16a + b) is represented by D(48 - 8a - b). When a B-program uses OUT 6 to de-allocate a unit whose type bit in V21P104M5 is non-zero, P21 clears that bit and the unit is given status P, rather than U as would normally happen. If a B-program tries to use OUT 5 or 5* to allocate a unit, specifying a type whose bit is non-zero, Program Failure 2 occurs even if a unit of the required type is available. The system. thus has exactly the same effect as in the non-Time-Sharing Director. This only applies to B-programs. Because any unit (not magnetic tape) which is de-allocated by an A-program is given status P, and only one unit of each type is pre-allocated, OUT 5 and OUT 5* are identical for A-programs. For an A-program V21P104M5 instead contains a record of all the units pre-allocated to the program: D47 = unit 0, D46 = unit 1, D37 = unit (octal) 12, etc. This correspondence of bits with unit numbers, which is the same as that used in CPDAR (N2.1.4), also applies to the copy of the programs CPDAR kept in V17P104M5, which is updated by P20 and P21 as units are allocated and de-allocated. When de-allocating a magnetic tape unit, P21 sets a brick indicator and uses JS10P100 (see 4.1.1) to alter the unit's status to W. For any other type of unit, P21 has to wait until the unit is not busy before changing its status to P or U. Therefore if the unit is busy the subprogram is suspended, with SHUL positive and the unit number in D0-15 of SHUP, The end of such a suspension will not usually be signalled by an EDT and so may have to wait for an EDT from some other source. As has already been pointed out (5.2.1) if TINT A is used to terminate the program while this suspension is still present, the unit, if still busy, may have its transfer forcibly terminated. The "descriptor" of unit n is stored in Vn of P26. Each descriptor is laid out as follows: D0 - 11 = (octal) 0207 D12 - 23 = Type number (octal) in character form D24 - 29 = Status character D30 - 41 = Unit number (octal) in character form D42 - 47 = program letter if any
- 42 - P26 is used for finding a unit or units having a particular type, status and program letter. It has 3 entries and 2 exits. The first 2 entries (JS1P26, JS2P26) require in N1 a parameter comprising:- D33 - 38 - required type number D39 - 44 - required status character D45 - 47 = 4 if program letter is to be blank = 0, 1, 2, 3 if P, Q, R, S. The list is searched backwards, i.e. through decreasing unit numbers. The first entry (JS1P26) is used if the search is to start at the highest unit number, the second entry (JS2P26) if the search is to resume after the last unit found (i.e. with Q6 unaltered since the last EXIT 2). EXIT 1 is obeyed if no unit was found: the parameter in N1 will have been erased. EXIT 2 is obeyed after a successful search, when C6 and M6 will both contain the number of the required unit, with I6 = -1. After EXIT 2, N1 will contain a modified version of the original parameter, and if desired the search may immediately be resumed, without re-specifying the original parameter, by obeying JS4P26. (Compare P26 with /RPS1/ and /RPS2/ of the non-Time-Sharing Director - N5.3). 5.3 P23 and OUT 8 All transfers executed by the Director on behalf of a program (OUT 8 is the obvious example) have certain features in common. A system has therefore been evolved into which additional facilities of this type can be fitted without too much difficulty, and the framework of this system forms part of P23, the OUT 8 routine. Besides using the main (even) subprogram, the system makes use of the second (odd) subprogram of the priority instigating the transfer - i.e. for priority p, subprograms 2p + 2 and 2p + 3. The second subprogram is used because these transfers, once started, do not require the program to be held up - the transfer area being protected by ordinary lock-outs - but do require that when they end, a procedure be used which not only checks the transfer but also signals that a further transfer may now take place, For this procedure the main subprogram is not suitable, since it would hold up the program unnecessarily, but the second subprogram is ideal. All Director transfers of the OUT 8 type pass through 4 stages The first stage involves erasing the OUT number from the program's Nest and checking that the parameters provided by the program in its Nest are valid - e.g. that the addresses are reasonable. It is assumed that OUTS which perform this sort of transfer will supply all parameters in N2, and that these will implicitly or explicitly specify the relative addresses of the transfer area. This stage will end after these parameters have been copied into V45P104M5 (and possibly V49P104M5) without erasing them from the programs Nest, and the initial and final absolute addresses of the transfer area into I7 and M7. P133 (q.v.) is a useful subroutine for this purpose - it also checks that these addresses are valid. The first stage ends by obeying JSP139.
- 43 - The subroutine P139 causes the main subprogram to be suspended until the area involved in the transfer is not locked out, and the second subprogram is closed down (E1M4 = 0). When both these conditions are satisfied, the second stage can begin. In this stage the Director, still acting through the main subprogram, is able to check, and if necessary alter, the transfer area itself: and, because the second subprogram has been closed down, it may check any failure indicators (e.g. parity) left by the previous transfer of this type, which must now be over. It is a feature of the Time-Sharing Director that each priority may only carry out one transfer of this type at a time, because each transfer requires the use of the second subprogram. Causes of program failure (JP2) may be found in the second as well as in the first stage. At the end of the second stage the main subprogram is ready to initiate the second subprogram, which is going to actually perform the transfer. To do this the main subprogram must obey J97P23 with certain parameters in the nesting store. They are:- N1 - SHUP* of second subprogram. This is to contain, in D16-31 and D32-47, the initial and final relative addresses of the transfer. D0-15 may contain any other parameter. N2 - SHUL of second subprogram, defining its point of entry. N3 - a marker which is zero if the transfer is going to be queued, nonzero otherwise. On entry at reference 97, P23 transfers N1 and N2 to SHUP* and SHUL of the second subprogram (E21M4 and. E1M4), and clears SHUL* (E31M4) and SHUP (E11M4) - the latter guarantees that at the very next opportunity, i.e. as soon as the main subprogram returns control to P11, the second subprogram will be entered. The main subprogram now obeys JS3P29 to erase the parameter word (originally in N2) from the programs Nest, and returns control to P11 - it does this by obeying either EXIT 1 (thus closing down the main subprogram altogether) if the transfer is not to be queued, in which case D44 of V25P104M5 is first made non-zero, or by obeying JS4P10, if it is queued. Stage three of the process takes place in the second subprogram. This will extract the parameters from SHUP*, make the addresses absolute, and initiate the transfer, either by entering it in a queue or by using an ordinary transfer instruction. If the latter, D44 of V25P104M5 is cleared as soon as the transfer is started, since this will cause lock-outs to be set up on the transfer area, making it safe to allow the program to resume; the second subprogram is suspended until the end of the transfer, and the first subprogram is already closed down. However, if the transfer is queued there is no guarantee that it will start immediately, so it is not yet safe to return control to the program. It will not in general be possible for the second subprogram to hold up the program only until the lock-out is set up, because it will itself probably be suspended until the very end of the transfer. This is why, in this case, the main subprogram is not closed down; it remains active (thereby holding up the program) and
- 44 - only closes itself down when either the area becomes locked out, or the transfer parameters (taken from E21M4, which must not be altered by the second subprogram) are found to be absent from all the peripheral queues. The main subprogram repeatedly tests these conditions, suspending itself with JS4P10 after each test cycle, until at last it obeys EXIT 1 when it is safe to return to the program. It is possible that a TINT A or TINT I0 may close down the main subprogram before this time: in these special circumstances this does not matter, and the second subprogram is not affected. The second subprogram, continuing the third stage of the process, must remain active until the transfer is complete and checked (after repetition if need be). If it is necessary for this subprogram to hold up the program it can reset D44 of V25P104M5. The parameters in its SHUP* must not be disturbed if the transfer is queued. Even if no check on the working of the transfer is needed at its end, the ending of the third stage must be delayed until the transfer is complete; so that, if the program is terminated before the transfer ended, it will still be possible to indicate definitely when all lock-outs on the program's store area should have been removed. The fourth and final stage of the process is entered by obeying J99P23. At this point (at which P15 will restart the second subprogram if it finds the latter already closed down see 5.2.1) V29P104M5 will be examined: if it is positive, the second subprogram can be closed down, but if it is negative, indicating that the program is being terminated, a winding-up procedure for all OUT 8 type activities must first be performed, culminating in D0 of V29P104M5 being made zero again. Before the second subprogram is closed down, D44 of V25P104M5 is cleared. Also, since the main subprogram may be suspended in P139 waiting for the closing-down of the second subprogram, the subprogram parameters in Q4 are adjusted as if they referred to the last subprogram but one; in this way, when EXIT 1 is obeyed to close down the subprogram and return to P11, the latter will now try to re-enter the main subprogram. In other words the subprogram counter is effectively stepped back one place instead of forward when the second subprogram is closed down. The common features of all these OUT - instigated peripheral transfers are thus: - a first stage, leading to P139 - a second stage leading to 97P23 (these two stages carried out by the main subprogram) - a third stage, carried out by the second subprogram, which performs the transfer, and leads to - the final stage, entered at 99P23, leading to the closing down of the second subprogram (and reverting to the main subprogram) To fully appreciate the way these common features are exploited, it is worth examining and comparing the coding for the different types of OUT 8 process in P23, and for the OUT 11 - OUT 12 (drum transfer) routines P151 and P152.
- 45 - 6. Subroutine Index The table below gives against each subroutine a brief title, the number of the section (if any) of the preceding text in which the subroutine is described most fully, and, where applicable, an indication of which Q-stores it alters. A single asterisk against a subroutine indicates that it requires M5 preset with a priority number; a double asterisk, that Q4 is to be preset with subprogram parameters. P0 Long and Short. Paths (3.1) P1 Dump programs Nest, etc. (3.3) **P2 Program Failure (5.1) **P3 OUT (5) P4 FLEX (4.2) P5 EDT (4.1) P6 Enter Message words in Flexowriter queue (4.1.3) Alters Q7, C5 P7 Enter Parameters in Flexowriter queue (4.1.3) Alters Q7, C5 **P8 Flexowriter query (4.1.3) *P9 Convert cell count, used by P12 **P10 Suspend subprogram (4.1.6) P11 Re-enter subprograms in order (4.1.5) *P12 Type program's Nest, etc. (5.1) Alters Q6, Q7 *P13,P14 Set and clear "software HU" bit in V0P104 Alters C5 **P15 OUT 0 (5.2.1) **P16 OUT 1 (5.2,2) **P17 OUT 2 (5.2.1) **P18 OUT 3 (5.2.3) **P19 OUT 4 (5.2.4) **P20 OUT 5 (5.2.5) **P21 OUT 6,7(5.2.5) **P23 OUT 8 (5.3) **P24 OUT 9 (5.2.3) *P25 Check program A or B. Alters C6 P26 Find unit with given type, status and program letter (5.2.5) Alters Q6 *P27 Alter unit status on de-allocation Alters Q7 *P28 Look for P unit Alters Q6 *P29 Manipulate program's Nest, etc. (3.3) Alters Q6 *P30 Set up main subprogram parameters in Q4 (4.2.1) P31 Fetch character to 07 (4.2) Alters Q6 Q7 P32 Fetch number (4.2) Alters Q6, Q7 **P33 TINT A (4.2.1) **P34 TINT B (4.2)
- 46 - **P37 TINT E (2.5) **p39 TINT G (4.2) **P40 TINT H (4.2) **P41 TINT I (4.2.2) **P42 TINT J (4.2) **P44 TINT L (4.2) **P45 TINT M (4,2,3) **P48 TINT P (4.2) (also used in Phase 0) **P50 TINT R (4.2) **P51 TINT S (4.2) **P52 TINT T (4.2.4) **P53 TINT U (4.2) **P54 TINT V (4.2) *P55 Obtain program letter, given priority number P56 Obtain priority number given program letter in C7 (402) Alters Q5 P57 Convert time for typing **P58 Find tape with given identifier (4.1.6) P59 Update Flexowriter queue (4.1.3) Alters Q7, C5 P60 Deal with RPM (303) Alters no Q stores **P61 OUT 10 (5.2.4) *P62 Initial housekeeping for OUTS (5.2) Alters Q6 P100 Controller of W mag tape bricks (4.1.1) P101 W mag tape bricks (4.1.1) **P102 Hold up subprogram before transfer P103 Check before transfer (2.4) Alters Q6, Q7 P104 Priority parameters (204) P105 Consolidate store and swop priorities (4.1.2) P106 Set up Q7 with program parameters Alters Q7 P107 Test lock-out on programs area Alters Q7 P108 Test whether given transfer area lies within area specified in Q7 P109 Modify transfer parameters after store move P110 Alter priority number if necessary after swop P111 Set up priority swop P112 Store new BA/NOL (P106 - 112 are primarily used in P105) *P113,P114 Set or clear given bit in V25P104M5 (2.4) P115 Set priority related parameters in C6 and M6 Alters C6, M6 P116 Form table of BA/NOL words in order of decreasing BA Alters Q6, Q7 P117 Form parameters of the "Hole in the Middle" Alters Q6, Q7 *P118 Set up parameters before program input (4.2.4) Alters C5,M6
- 47 - P119 Check program name P120 Look for A input priority (4.1.4) (later entries: ** general program input) **P121 CRNP failures (2.5) P122 Check tape identifier Alters C7 *P123 Dispose of program input PTR Alters C7 *P124 Set AV0P52 or AV0P120 in M6 (2.5) Alters M6 *P125 Check validity and ownership of peripheral unit *P126 Set addresses of E0 and E7 in 17, M7 Alters 17, M7 P127 Check for parameter word in Flexowriter queue *P128 Makes absolute addresses in Q7 Alters I7, M7 P129 Checks given parameters to see if still in Flexowriter queue Alters Q6 P137 Leaves 3 times M6 in N1 P132 Check length of identifier given first word *P133 Checks transfer parameters in first stage of OUT 8 process (5.3) Alters Q7 **P134 Hold-up program input so it can be terminated by TINT A (4.2.4) P135 Dispose of program tape *P136 Store new BA/NOL, check lock-outs, clear PHU Alters Q7 P137 Compare N1 and N2, ignoring octal 36 in N1 Alters C6 *P138 Alter bit in V17P104M5 (copy of CPDAR) **P139 End of stage 1 of OUT 8 process (503) P200 "Phase 0" (N 3.1) P201 Type message in Phase 0 P202 Type query in Phase 0 Alters Q5, C6 P204 Read decimal number in Phase 0 P206 Type unit list in Phase 0 Alters Q5, Q6 P208 Read OUT 8 reel number in Phase 0 Alters Q5, Q6 (Subroutines P200 onwards are overwritten as soon as Phase 0 ends)