Section 5.3

Special 150- instructions in Programmer's Mode

Numbers 35 - 54

5.3.35  150/35 Instruction - Get or Request Document

X is a programmer's peripheral name or 0 or 1 or 2

Y is the address of a core-store register or 0 Y 63

This instruction (except for the case X=0) is similar to the 150/33 instruction, except that if the requested document or scratch tape (this applies to input devices magnetic tape decks) is not loaded then the 150/35 prints the load message, sets OVR and lets the job continue.

Special Case

X=0

Y is the address of a core-store register

This instruction prints the load message, asking the operator to load the requested document (Y to Y+7 containing the document request name).  The job is then halted awaiting document on the next instruction.

 

5.3.36   The 150/36 Instruction - Change Name

150   *SR1   *SR5    36

X is a programmer's peripheral name.
Y is a programmer's peripheral name.

This instruction says "the peripheral device which was formerly called X will now be called Y".

X must be a programmer's peripheral name for a peripheral reserved (floating or allocated) for the job.  Y must be a programmer's peripheral name for a device of the same type as X, i.e. X and Y must be the same except for the last 5 bits.  A message of the following form is printed on the Flexowriter.

jobname   *SR1  NOW  *SR5

Styles of monitoring or failures on this device are unaltered by the change of name.

If X and Y are not for the same type of peripheral device then impermissible operand action will take place.  Impermissible operand if job already has device called Y.

 

5.3.40   150/40 Instruction - Get Document Name etc.

(also see 5.7.2.3)

 

X is a programmer's peripheral name.

Y is the address of a core-store register.

Slow Input Devices and Input Half of the Orion 2/1900 Direct Data Link

e.g.   150  *SR1   A100   40

When a document is loaded, OMP stores the document name in its drum working space and notes on which device this document is loaded.  If this device is allocated to the job and the job obeys a 150/40 for this device, then OMP gives the document name into the 8 registers Y to Y+7.  Characters are right-justified.

If this instruction is obeyed for a device which has been allocated to the job by ALLOCATE directive or by JOB or RERUN followed by RESERVE THIS directive then the 8 words will not be sensible.

Magnetic Tape Decks

e.g.   150  *MT1   A100   40

When a tape is loaded OMP stores the information in Block 0 of the tape in its own drum working space.  If this tape is allocated to a job, then the job may "re-write" Block 0 (150/41, 150/44, 150/43).  This new Block 0 information is stored in this drum working space and if the job obeys a 150/40 then OMP gives the information from the drum (i.e. the information obtained is the information last given to OMP for this tape).

The 11 registers Y to Y+10 will contain,

Y will contain the Date etc

D0 is the write permit bit.

D1 to D23 give the Date.

D1 to D11 give the year (e.g. value 1963 for 1963)

D12 to D15 give month (e.g. value 2 for February)

D16 to D20 give the date (e.g. value 5 for 5th of the month)

D21 to D23 are copied.

D24 is the date control bit.

D25   On a low density machine will be zero whatever the bit on the tape itself.  On a high density machine D25 will be the inverse of the bit on the tape itself and D25 will be 0 to mean high density and 1 to mean low density.

D33 to D47 are usually zero unless the tape is pre-addressed in which case this field is an integer.  OMP uses this as the block address of the last pre-addressed block on the tape.  When a write fail occurs between Block 0 and this block OMP will repeat the writing in situ (see 4.7.6.6.2)

Y+1 to Y+8 will contain the document name

The 8 registers contain the components right-justified.

Y+9 will contain non-sequential block information

The modifier half is the "position" of the last written non-sequential block.  This is an integer which is one greater than the block address of the block on the tape, before the last written non-sequential block.

Nothing should be assumed about the rest of Y+9.

Y+10 will contain the length and serial-number

D18 to D23 give the nominal length of the tape in hundreds of feet. This is 36 for full length tapes.

The modifier half is an integer which is the serial-number of the tape.

Nothing should be assumed about the rest of Y+10.

X must be for an input device or tape deck otherwise impermissible operand action will occur.

If X is for an input device or tape deck reserved as a "floating" peripheral then peripheral violation action will occur.

Y to Y+7 for input devices and Y to Y+10 for tape decks, must be within reservations otherwise reservation violation action will occur.

 

5.3.41   150/41 Instruction - Write Block 0 Unconditionally

e.g.   150   *MT5   A200   41

X is a programmer’s peripheral name.

Y is the address of a core-store register.

This provides OMP with Block 0 information required on the tape.

Y contains the Date etc. required

D0 is the write permit bit

D1 to D23 give the Date

D1 to D11 give the year (e.g. value 1966 for year 1966)

D12 to D15 give the month (e.g. value 1 for January)

D16 to D20 give the date (e.g. value 25 for 25th of month)

D21 to D23 are copied.

This Date should be the date on and after which the information on the tape is no longer required.

D24 is the date control bit.  If it is 0, then the Date is a void date, if it is 1, then it is a write permit date.

D25    On a low density machine this corresponding bit on the tape itself will always be zero whatever the bit is in the core.  On a high density machine, a high density job will set this bit to 1 to inform OMP that the information on this tape is to be written in low density (see 4.7.3 for more details); 0 means write in high.  This is CB (core bit).

D26 to D32 should be zero

D33 to D47 should be zero, unless the tape is pre-addressed in which case these bits are the block address of the last pre-addressed block on the tape.

Y+1 to Y+8 contain the document name required (see 6.1)

The 150/41 causes OMP to store this required Block 0 information in its drum working space and asks OMP to re-write Block 0 of this tape as soon as it is convenient for OMP to do so.  Thus if a 150/41 is obeyed after the 150/33, 34 or 35 or after rewind (i.e. when the tape is in the load position between blocks 0 and 1) then Block 0 is written straight away, otherwise Block 0 is written when the tape is next rewound.

When Block 0 is actually written onto the tape, OMP outputs a message on the Flexowriter.  The printing of the items in brackets is optional; only those items which have been changed since Block 0 was last written are printed.

jobname    MTg       Serial-number    (Date)    (NSn)    (PAm)    (Ll)
                (Document name)

Date printing gives the Date (e.g. 10.2.1966 means the date field is 10, the month field is 2 and the year field is 1966 thus 10th Feb 1966), and the setting of the write permit bit (P printed before the Date means it is 1) and the date control bit (P after the Date means it is 1) and the density (H printed after the Date (and P, if present) means that the information on the tape is in high density).

NSn  -  n is the position of the last written non-sequential block.
PAm - m is the number of pre-addressed blocks.
Ll - l is the nominal length in hundreds of feet.

For example

jobname    MTD     125     1.2.1966P      NS7
                A/B/C/D

X must be a programmer's peripheral name for a tape deck otherwise impermissible operand action will occur.  X must not be reserved as a "floating" peripheral, otherwise peripheral violation action will occur.

Y to Y+8 must be within core-store reservations otherwise reservation violation action will occur.

Y+1 to Y+8 must contain only legal characters for a document name (see 6.1), otherwise impermissible operand action will occur.

If OVR is set then writing with overflow set action will occur.

If the tape deck is isolated, then peripheral incident, writing on isolated deck action will occur.

 

5.3.42   150/42 Instruction - Current Block Address.

150       *MT1   A1        42

X is a programmer's peripheral name.

Y is the address of a core store register.

X must be a programmer's peripheral name for a tape deck which is reserved (not as a floating peripheral) for the job, otherwise peripheral violation action will occur.

Y must be within core store reservations.

After the instruction has been obeyed then, the general case gives

yu' = address of last block read on tape

ym' = address of next block, looking forwards on tape.

Note that y is the contents of the Block Address Register (see 4.7.2) shifted cyclically 24 places.

For the purpose of describing the information given by the 150/42 instruction then, given that the read-write heads are in the position shown by   , then assume that there is a block on each side of the read-write heads and that the address of the block nearer the beginning is n and that the address of the block nearer the end is n+1.

Beginning of tape 

n

   

n+1

   

End of tape

After writing operation

n

    

n+1

i.e. Block n has just been written.  A 150/42 would give

yu' = n

ym' = n+1

After writing non-sequential block OMP positions the tape thus,

 

n

  

non-sequential block

and a 150/42 would give

yu' = n

ym' 8191 but n+1

After a reading operation

Forwards

 

n

  

n+1

i.e. Block n has just been read forwards.  A 150/42 would give

yu' = n

ym' = n+1

Backwards

 

n

  

n+1

i.e. Block n+1 has just been read backwards.  A 150/42 would give

yu' = n+1

ym' = n+1

After reading non-sequential block, OMP positions the tape thus,

 

n

  

non-sequential block

A 150/42 would give

yu' = n+1

ym' 8191 but n+1

 

5.3.43   The 150/43 Instruction - write non-sequential block

e.g.   150   *MT1   0   43

X is a programmer's peripheral name

Y is 0 or 1

Y=0

When writing to a tape, after writing the last information block, the program should obey a 150/43 with Y=0 to ask OMP to write a non-sequential block as the next block on the tape.

OMP writes a one word block giving it the address 8191 (if 8191 would be sequential then 8190 is used instead) and then OMP positions the tape between the last information block and the non-sequential block.

The position of the last written non-sequential block is an item of Block 0 information, so OMP stores this information in the drum working space for this tape and makes a note that Block 0 of this tape must be rewritten when the tape is next rewound.

Y=1

This asks OMP to re-write the Block 0 information as stored in its drum working space, to the tape as soon as it is convenient for OMP to do so.  It does not cause a non-sequential block to be written and hence the record of the position of the last written non-sequential block is not altered.

X must be a programmer's peripheral name for a magnetic tape deck, otherwise impermissible operand action will occur.

If X is for a tape deck reserved as a "floating" peripheral then peripheral violation will occur.

If OVR is set then writing with overflow set action will occur.

If the deck is isolated then peripheral incident, writing on isolated deck will occur.

Y greater than 1 will cause impermissible operand action.

 

5.3.44   150/44 Instruction - Write Block 0 conditionally

e.g.   150   *MT2    A100   44

The purpose of this instruction is to ensure that Block 0 is re-written only e.g. if a non-sequential block is written. (e.g. only if the program comes to a successful conclusion).  If the job is abolished before a non-sequential block is written, then Block 0 on the tape is left as it was and in the common case, the tape is left scratch, instead of having a future void date with rubbish on the tape.

The Block 0 information required on the tape is contained in Y to Y+8 (see 5.3.41)

The 150/44 causes OMP to store this required Block 0 information in its drum working space and asks OMP not to rewrite Block 0 straight away, but to re-write Block 0 only if subsequent instructions or events ask OMP to do so.  Thus this Block 0 information is stored on the drum and is written to the tape only

    (a)  if subsequently, a non-sequential block is written on the tape or a 150/43 with Y =1 is obeyed (before X is relinquished that is)

or (b) if since Block 0 was last written, a non-sequential block has been written or a 150/41 instruction or a 150/43 with Y = 1 obeyed.

 

5.3.50   The 150/50 Instruction - Chapter Change

The chapter change instruction is usually compiled by Symbolic Input from the macro 1000.  It occupies two words, the first being a 150/50 instruction - the second is not an instruction.

The X-address of the 150/50 instruction holds the working store starting address, X, and the Y-address is the length, N.  The whole of the upper half of the second word holds the drum starting address, D, and the Y-address position of the second word is the entry point, J.

The effect is as if the following sequence of instructions were obeyed:

    141.1      0      D
    142        X      N
     75        J      0

except that the drum transfer may overwrite the compound instruction.  The address X and N may be pre-modified or replaced as usual; the addresses D and J may be replaced by setting the RX and RY bits respectively in the second word to 1 but they may not be premodified.  The Z-address position of word 2 is used in the ENTER directive (see 5.7.3.4) but is ignored in the 150/50 instruction.  Thus, the compound instruction:

    150   (MOD1)   (MOD2)   50
    00S   (MOD3)   (MOD4)    0

is equivalent to:

    141.1    0     (MOD3)
    142   (MOD1)   (MOD2)
     75   (MOD4)

A check is made that X, X+N-1 and J are within working store reservations and that D and D+N-1 are within drum reservations, otherwise reservation violation occurs.  N=0 causes impermissible operand.

If the program is monitoring on drum references, the drum read implicit in this instruction is monitored as usual; if style 7 is used the address given is that of the 150/50 instruction, the usual return by 150/23 will work.  The instruction is not regarded as a jump for the purpose of monitoring on jumps.

 

5.3.51   150/51 Instruction - Load Chapter of Semi-built-in program (SBIP)

e.g.   150   3   A506  51

X is an integer
Y is the address of a core-store register.

This instruction asks OMP to load Chapter X of program y into the job’s core-store.

If X is odd then the appropriate chapter is loaded and entered (i.e. the program’s control number is set as requested by the chapter).  If X is even then the appropriate chapter is only loaded and then return is to the instruction after the 150/51 unless Y is the register after the 150/51 in which case return is to Y+1 (i.e. if X=2n in 150/51 and Y=V2+1, then return is to V2+2, hence the name can always be safely put after the 150/51.)  X=2n causes a chapter to be loaded whereas X=2n-1 causes the same chapter to be loaded and entered.

Basic Input and semi-built-in programs are stored on the drum outside any program’s reserved drum region in a relocatable form.  A chapter when required, is loaded by OMP into the job’s reserved core region, the datum point being added when appropriate.  Basic is stored permanently on the drum, whereas a semi-built-in program is loaded on to the drum when it is to be used and is removed when not in use if the drum space is needed.

Basic Input (see 7.1.5)

If y=0, then chapter X of Basic Input is loaded into the job’s core-store.  X=0 and y=0 will cause impermissible operand action.

Semi-built-in program (see 6.3)

If y0, then Y contains the name of a semi-built-in program.  Chapter X is loaded into the job’s core store.

Y contains the name e.g. PREADD, in character form right-justified, i.e. the name must conform to the rules governing a component of a document name (see 6.1) but + or - are not allowed, otherwise impermissible operand action will occur.

If X=0 and y0 then semi-built-in program y is regarded as no longer in use.  If X=0 and the job has not been using y then impermissible operand action will occur.

If a job asks for a semi-built-in program which is not on the drum and conditions are such that it can be stored on the drum, then the job is “suspended loading a semi-built-in program”.  The job is temporarily given the jobname of the calling job with the character 0 (zero) appended e.g. BLOGGS0 while Basic Input loads this semi-built-in program on the drum.  When finished a message on the Flexowriter informs the operator

e.g.      BLOGGS0  PREADD  IN

The job continues normally by obeying the 150/51 again.  Basic uses A64 to A255 of the job’s core and so these will be overwritten.  The job must have at least 256 words of core reserved otherwise reservation violation action will occur.

Note that jobs which use even-numbered chapters of SBIP'S must make sure that the SBIP is already in as otherwise the instruction following the 150/51 may be overwritten by semi-built-input (i.e. by BLOGGS0)

If the requested SBIP is not in the drum and, either the same or a different SBIP is being read, or there is not enough drum space available then the job is halted and a message on the Flexowriter informs the operator

e.g.      BLOGGS0  PREADD  NOT     IN

If there are fewer than 2 words of drum available or there are already 8 SBIP’S then the job is halted awaiting space, the message on the Flexowriter being

          BLOGGS   (not BLOGGS0)   NO SPACE

The job continues when the reason for the stoppage has been removed.  Directives allowed for BLOGGS0 are PRINTOUT, DIRENT, TIME, HALT, RUN, ABOLISH and ABANDON; the others are not allowed.

Reservation violation action will occur if Y is not within core reservations or if the job’s core is not large enough for the chapter requested.

 

5.3.52   The 150/52 Instruction - Change Drum Reservations

e.g.   150   A100   A1   52

The modifier half of X is the number of words of drum required for the job.

If the requested amount of drum, xm is available then the drum reservations for the job are changed; a message is printed on the Flexowriter

e.g.      jobname   DRUM      100

and the amount of drum reserved, xu, is put into Y.

If the requested amount of drum as not available then OVR is set and the maximum amount available is put into Y (i.e. y will be less than xm).  The programmer can then decide if it is worth trying to compromise on the drum space available.

If the length of the reserved region is being shortened the contents of the reserved region remaining will be unaltered.  If it is being lengthened the contents of the old reserved region will be unaltered and the additional space will be clear.

The minimum amount of drum that a job can have is 2 words, so that if xm = 0 or 1, then 2 words will be reserved.

When a drum reservation is made other programs may be moved about, as all programs are relocatable on the drum.

X and Y must be within reservations otherwise reservation violation action will occur.

 

5.3.53  The 150/53 Instruction - Change Core Store Reservations.

This instruction will, depending on the setting of Y, increase or decrease core store reservations in one of three ways if the requested space is available.  In all cases X is the number of words of core store required; it may be larger or smaller than the current reservations.

a) General Case

Often an increase in reservations will not be available without a change in the location of the program within the core store.  In this case the program may be relocated with a different datum point.  Y is the address of a core store register which, after the old and the prospective datum points have been added in, is within the old and the prospective new reservation respectively; if it is not reservation violation will occur.  If the requested amount is available the new datum point is put into Y.  The new core length and the new datum point (if changed) will be output on the monitoring peripheral or the flexowriter in the form:-

BLOGGS     CORE    4096     512

the second figure being the datum point.

If the amount requested is not available the amount that is available is put into Y and OVR is set.  Whether or not the amount of core requested in X is available, monitoring conditions are returned to standard; monitoring on *OWN will remain as before, so the starting address for the *OWN routine is checked to be within the proposed new reservations, if it is not reservation violation will occur.  The instruction will normally be followed by a jump if OVR instruction and a 150/51 instruction so that Basic Input or the semi-built-in program can enter the correctly relativised chapter.

b) Same Datum Point Case

In this case the change in core store reservations, if possible, is carried out with same datum point.  Y is to be A0 in the 150 instruction.  If the amount is available, the new core length is output on the monitoring peripheral or flexowriter.  If it is not available OVR is set.  Monitoring conditions are not set to standard; *OWN monitoring is still checked to be within the proposed new reservations, else reservation violation will occur.  However, the addresses of any style 7 restarts are not checked, so care must be taken that any such subroutines occur within the new reservations.

c) Different Datum Point Case

In this case Y is set to an integer, and the instruction will attempt to reserve X words of core store with datum point 64Y.  If it is available the new core length and datum point will output on the monitoring peripheral or flexowriter.  OVR will be set if the space is not available.  If 64Y is greater than the core size, reservation violation will occur.  In this case all monitoring is set to standard and any *OWN addresses are checked.

In all cases OVR is set if the amount requested is not available.  Thus it is advisable to follow the 150/53 instruction with a jump if OVR instruction.  All three cases may be used with branched programs.

 

5.3.54    The 150/54 Instruction - Semi-built-in Program In

This instruction may only  be obeyed by the chapter of basic input which stores semi-built-in programs on the drum.

Any other program attempting to obey a 150/54 instruc­tion will be suspended due to illegal instruction.