.
.         PROCS FOR SCHEDULER CALLING SEQUENCES
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
Q         PROC      1
P*        NAME      0
V*        NAME      1
INSERT*   NAME      2
REMOVE*   NAME      3
PUT*      NAME      4
GET*      NAME      5
PMAY*     NAME      6
PUSH*     NAME      7
          DO        Q(1)>0 , LA,14*(Q(1)<3) 12,Q(1,1),Q(1,2),Q(1,3)
          DO        Q(0,0)=0 , LMJ 11,P
          DO        Q(0,0)=1 , LMJ 11,V
          DO        Q(0,0)=2 , LMJ 11,INSERT
          DO        Q(0,0)=3 , LMJ 11,REMOVE
          DO        Q(0,0)=4 , LMJ 15,PUT
          DO        Q(0,0)=5 , LMJ 15,GET
          DO        Q(0,0)=6 , LMJ 11,PMAY
          DO        Q(0,0)=7 , LMJ 11,PUSH
          END
.
.         FORK      <ADDRESS>
.
P         PROC      *1
FORK*     NAME      0
          DO        P(1)>0 , LA,14*(P(1)<3) 13,P(1,1),P(1,2),P(1,3)
          DO        P(0,0)=0 , LMJ 11,FORK
          END
.
P         PROC      0,1
EXIT*     NAME      0
          LMJ       X11,EXIT
          END
.
.         INITQ     <QUEUE ADDRESS>
.
P         PROC      *1
INITQ*    NAME      0
          DO        P(1)>0 , ;
          LA,14*(P(1)<3) 12,P(1,1),P(1,2),P(1,3)
          LMJ       11,INITQ
          END
.
.         INITPVQ   <COUNT>,<P/V QUEUE ADDRESS>
.         INITBB    <COUNT>,<BOUNDED BUFFER ADDRESS>
.
P         PROC      *1
INITPVQ*  NAME      0
INITBB*   NAME      1
          DO        P(1)>0 , LA,14 13,P(1,1)
          DO        P(1)>1 , ;
          LA,14*(P(1)<4) 12,P(1,2),P(1,3),P(1,4)
          DO        P(0,0)=0 , LMJ 11,INITPVQ
          DO        P(0,0)=1 , LMJ 11,INITBB
          END
.
.         QUEUE     [FIRST[,LAST]]
.
P         PROC      1,QL
QUEUE*    NAME      0
A(0)      EQU       $
          DO        P(1)>0 ,A(0) EQU P(1,1).
A(1)      EQU       A(0)
          DO        P(1)>1 ,A(1) EQU P(1,2)
          *         A(1),A(0)
          DO        1-(TSQ=0) , T$CELL 0
          DO        TSQ=0 , * 0
          END
.
.         PVQUEUE  N                    N = INITIAL COUNT, >=0.
.
P         PROC      1,QPL
PVQUEUE*  NAME      0
          DO        TSQ=0 , * $,$       QUEUE HEAD UNLESS TS QUEUING
          *         0,P(1,1)            COUNT, WORD 0 OR 1
          DO        TSQ=1 , TCELL$ 0
          END
.
P         PROC      1,QL+2*QPL
BBUF*     NAME      0
          QUEUE     .                   DATA QUEUE
          PVQUEUE   0                   NOT-EMPTY QUEUE.
          PVQUEUE   P(1,1)              NOT-FULL QUEUE.
          END
.
.         THE PROCEDURE 'SCHDEF' DEFINES THE FIELDS USED
.         BY THE SCHEDULER.  ANY ELEMENT WHICH REFERENCES
.         THE PROCS 'QUEUE', 'PVQUEUE', OR 'BBUF' MUST
.         CALL SCHPROC BEFORE THE FIRST SUCH REFERENCE.  THE
.         TAG 'TSQ' DEFINES WHETHER THE SCHEDULER WILL USE
.         TEST AND SET QUEUEING FOR SYNCHRONISATION.  IF
.         IT IS CHANGED, THE SCHEDULER ITSELF MUST BE
.         REASSEMBLED.
.
          DEF
QHEAD     EQUF      1                   T/S CELL.
QHL       EQUF      0,,2                QUEUE BACK LINK.
QFL       EQUF      0,,1                QUEUE FORWARD LINK.
QN        EQUF      1-TSQ,,3            QUEUE COUNT.
QL        EQU       2                   LENGTH OF QUEUE HEADER.
QPL       EQU       2                   P/V QUEUE HEADER SIZE.
SCHDEF*   PROC      0
          END