.
.         THE DISPATCHER
.
.      'WHEELS WITHIN WHEELS'
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
          PURE      CODE
.
DISPI*    P         HAPPEN              WAIT FOR SOMETHING TO HAPPEN
DISPR     P         CMDLOCK             MARK COMMAND QUEUE BUSY
          P         FISTAT              LOCK FACILITY STATUS
          LA        A3,CMDQUE+QFL       LOAD FIRST COMMAND
          TNE,U     A3,CMDQUE           ALL EMPTY ?
          J         DISPEX              YES.  GO AROUND AGAIN
          TNZ       CDBACT,A3           IS THIS TERMINATION PACKET ?
          J         DISPTR              YES.  SHUT DOWN THE DISPATCHER
DISPN     TE,U      A3,CMDQUE           BACK AT START AGAIN ?
          TNZ       CDBACT,A3           OR IS IT SPECIAL TERMINATION PACKET ?
          J         DISPEX              YES.  WAIT FOR SOMETHING ELSE TO HAPPEN
.
.         STEP 1.   MAKE SURE ALL REFERENCED FILES ARE FREE.
.                   IF THIS COMMAND USES THE FILE IN A READ-ONLY
.                   MANNER, IT WILL BE ALLOWED TO USE THE FILE
.                   IF IT IS BUSY AND THE WRITE LOCK IS ZERO.  MULTIPLE
.                   READ OPERATIONS ARE PERMITTED SIMULTANEOUSLY UNLESS
.                   READ CONCURRENCY IS ABOUT TO OVERFLOW THE FIELD.
.
          LA        A2,CDBPC,A3         LINK TO FIRST PARAMETER
DISPP     JZ        A2,DISPAC           THIS STEP O.K. IF LAST PARAMETER
          LA        A0,PBTYPE,A2        LOAD TYPE
          TNE,U     A0,BLOCK            IS IT A BLOCK ?
          J         DISPPB              YES.  WE MUST VALIDATE IT LIKE A FILE
          TE,U      A0,FILE             IS IT A FILE ?
          J         DISPLN              NO.  CHECK NEXT PARAMETER
DISPPB    LX        X8,PBVAL,A2         GET FDT POINTER
          LA        A0,FDLOCK,X8        A0 = IN-USE FLAG
          JZ        A0,DISPLN           FREE - IT'S O.K.
          TE,U      A0,1                BUSY ?
          J         DISPMR              NO.  MARK ROADBLOCKED
          LA        A0,PBFLAGS,A2       LOAD MODE BITS FOR THIS PARAMETER
          TNZ       FDWRITE,X8          IS WRITE IN PROGRESS ON THIS FILE ?
          TOP,U     A0,PBFRO            DOES COMMAND USE FILE READ-ONLY ?
          J         DISPRJ              NO.  CANNOT SELECT THIS COMMAND NOW
          LA        A0,FDREADC,X8       LOAD READS IN PROGRESS COUNT
          TG,U      A0,077              ABOUT TO OVERFLOW FIELD SIZE ?
          J         DISPRJ              YES.  KEEP CONCURRENCY WITHIN FIELD SIZE
          J         DISPLN              PERMIT COMMAND TO SIMULTANEOUSLY READ
.
.         FILE IS ROADBLOCKED.  FLAG FOR ROADBLOCK PROCESSING.
.
DISPMR    SNONZ     CDRB,A3             MARK COMMAND FOR REJECTION
.                                       ACCEPT THIS FILE AS NOT IN-USE
.
DISPLN    LA        A2,PBLINK,A2        LOOK AT NEXT PARAMETER
          J         DISPP               KEEP ON CHECKING PARAMETERS
.
DISPRJ    LA        A3,QFL,A3           LINK TO NEXT COMMAND
          J         DISPN               CHECK IT OUT
.
.         STEP 2.   ALL FDT'S REQUIRED BY THIS COMMAND ARE
.                   AVAILABLE.  NOW MAKE SURE THAT NO
.                   COMMANDS EARLIER IN THE QUEUE, BUT
.                   UNPROCESSED BECAUSE OF EARLIER IN-
.                   USE CONFLICTS, REFERENCE THIS FDT.
.                   THIS PREVENTS THE CASE:
.                       POSITION C.,1
.                       COPY A.,B.
.                       COPY B.,C.
.                       REWIND C.
.                   FROM PERFORMING IN A NON-SERIAL MANNER WHEN THE
.                   POSITION C FINISHES BEFORE THE COPY A.,B.  (WERE
.                   IT NOT FOR THIS CHECK, WE WOULD GO AHEAD AND DO
.                   THE REWIND C., SINCE C IS FREE AS SOON AS THE
.                   MOVE COMPLETES.
.                   IF THIS COMMAND USES A FILE FOR READING ONLY, THEN
.                   PREVIOUS COMMANDS MAY REFERENCE THE FILE IN READ-MODE,
.                   BUT IF ANY PREVIOUS COMMAND USES THE FILE FOR WRITING,
.                   OR THIS COMMAND WRITES THE FILE, WE CANNOT INITIATE THE
.                   COMMAND AT THIS TIME.
.
DISPAC    TNZ       CDBPC,A3            ANY PARAMETERS TO CHECK ?
          J         DISPRG              NO.  SKIP SOME VITAL CODE
          LA        A0,CMDQUE+QFL       GET POINTER TO FIRST COMMAND
DPAC1     TNE,U     A0,,A3              HAVE WE GOTTEN TO CURRENT COMMAND YET ?
          J         DISPRM              YES.  NO CONFLICTS FOUND
          LX        X8,CDBPC,A0         GET PARAMETER CHAIN HEAD
DPAC2     TNZ       X8                  END OF PARAMETER CHAIN ?
          J         DPAC3               YES. THIS COMMAND HAS NO CONFLICTS
          LA        A7,PBTYPE,X8        LOAD TYPE OF PARAMETER
          TNE,U     A7,BLOCK            IS IT A BLOCK BUFFER ?
          J         DPAC7               YES.  VALIDATE CONFLICT POSSIBILITY
          TE,U      A7,FILE             IS IT A FILE ?
          J         DPAC4               NO.  CANNOT BE IN CONFLICT
.         AHA!  A FILE.  NOW IS IT IN CONFLICT WITH ANY
.         FILE IN THE PROSPECT FDT ?
DPAC7     LA        A2,CDBPC,A3         GET PARAMETER CHAIN HEAD OF PROSPECT
DPAC5     JZ        A2,DPAC4            THIS ONE O.K., CHECK NEXT
          LA        A1,PBTYPE,A2        LOAD TYPE
          TE        A1,A7               SAME TYPE AS ONE BEING VERIFIED ?
          J         DPAC6               NO.  LOOK AT NEXT PROSPECT PARAMETER
          LA        A1,PBVAL,A2         LOAD FDT POINTER
          TE        A1,PBVAL,X8         IS IT SAME AS CHECKED PARAMETER
          J         DPAC6               NO.  CHECK NEXT PARAMETER
          LA        A1,PBFLAGS,A2       LOAD FLAGS FOR CURRENT PARAMETER
          LA        A4,PBFLAGS,X8       LOAD FLAGS FROM PREVIOUS PARAMETER
          TEP,U     A4,PBFRO            IS PREVIOUS USE READ-ONLY ?
          TOP,U     A1,PBFRO            YES.  IS CURRENT PARAMETER READ-ONLY ?
          J         DISPRJ              NO.  CAN'T PERMIT THIS COMMAND TO BE
.                                       EXECUTED IF READ/WRITE CONFLICT EXISTS.
DPAC6     LA        A2,PBLINK,A2        LINK TO NEXT PROSPECT PARAMETER
          J         DPAC5               CHECK IT OUT NOW
DPAC4     LX        X8,PBLINK,X8        LINK TO NEXT PARAMETER OF CHECKED COMMAN
          J         DPAC2               GO THROUGH VERIFICATION FOR IT
DPAC3     LA        A0,QFL,A0           LINK TO NEXT COMMAND
          J         DPAC1               REVERIFY FOR THAT PARAMETER
.
.         STEP 3.   AT LAST!  WE'VE FOUND A COMMAND FOR WHICH ALL
.                   FILES ARE AVAILABLE, AND NO PREVIOUS USE
.                   CONFLICTS EXIST.  NOW WE'LL MARK ALL THE
.                   FDT'S USED BY THE COMMAND AS BUSY, REMOVE
.                   THE COMMAND FROM THE QUEUE ATTACHED TO
.                   CMDQUE, AND GO ON TO FINAL SETUP IN STEP 4.
.
DISPRM    LA        A2,CDBPC,A3         GET HEAD OF PARAMETER CHAIN
DRM1      LA        A0,PBTYPE,A2        LOAD TYPE OF PARAMETER
          TNE,U     A0,BLOCK            IS IT A BLOCK BUFFER ?
          J         DRM3                YES.  MARK IT BUSY
          TE,U      A0,FILE             IS IT A FILE ?
          J         DRM2                NO.  DON'T MARK IT
DRM3      LA        A0,PBVAL,A2         GET FDT ADDRESS
          LA,U      A1,1                GET BUSY INDICATOR
          TNZ       FDLOCK,A0           IS FDT ROADBLOCKED ?
          SA        A1,FDLOCK,A0        SET FDT BUSY
          LA        A1,PBFLAGS,A2       LOAD FLAGS FOR THIS PARAMETER
          TOP,U     A1,PBFRO            READ-ONLY FILE USE ?
          J         DRM4                NO.  SET WRITE LOCK
          LA        A1,FDREADC,A0       LOAD READ COUNT
          AA,U      A1,1                INCREMENT READ CONCURRENCY
          SA        A1,FDREADC,A0       UPDATE READ COUNT
          J         DRM2                EXAMINE NEXT PARAMETER
DRM4      LA,U      A1,1                GET A ONE
          SA        A1,FDWRITE,A0       SET WRITE LOCK FOR FILE
DRM2      LA        A2,PBLINK,A2        LINK TO NET PARAMETER
          JNZ       A2,DRM1             KEEP ON GOING IF NOT END
.
DISPRG    LA        A0,QFL,A3           GET NEXT COMMAND IN CHAIN
          LA        A1,QHL,A3           GET PREVIOUS COMMAND IN CHAIN
          SA        A0,QFL,A1           LINK NEXT TO LAST
          SA        A1,QHL,A0           LINK LAST TO NEXT
.
.         STEP 4.   NOW THE COMMAND IS REMOVED AND ALL FDT'S ARE
.                   MARKED BUSY.  WE CAN NOW CLEAR PROTECTION ON
.                   THE COMMAND CHAIN AND FACILITY STATUS, THEN
.                   GO AND FIRE UP A COMMAND ACTIVITY.
.
          V         FISTAT              UNLOCK FACILITY STATUS
          LA,U      A1,,A3              LOAD ADDRESS OF COMMAND ITEM
          INSERT    INPROCQ             PUT ON IN-PROCESS QUEUE
          V         CMDLOCK             UNLOCK COMMAND CHAIN
          LX,U      X8,,A3              PASS COMMAND BUFFER TO ACTIVITY IN X8
          JNOL      'B',LBEGN           LIST COMMAND INITIATION ?
          LX        X5,CDIMG,X8         YES.  LOCATE COMMAND IMAGE
          R$DIT     .                   ENTER EDITING MODE
          JDEM      DPRFX               IF DEMAND EDIT ABBREVIATED PREFIX
          E$MSG     STRTX               EDIT 'STARTED'
          LMJ       X6,ESN              EDIT STATEMENT NUMBER
          E$COL     TXCOL               TAB TO TEXT COLUMN
DPXR      E$COPY    80,IMIMG,X5,U       COPY IMAGE TO LINE
          R$PRTX    1                   PRINT THE LINE AND RELEASE THE BUFFER
LBEGN     LA        A1,CDBACT,X8        LOAD ENTRY ADDRESS
          TNE,U     A1,COMPLETE         WAS IT THE 'CLEAR' COMMAND ?
          SZ        CDRB,X8             YES.  CAN'T ROADBLOCK THE CLEAR COMMAND
          TZ        CDRB,X8             IS THE COMMAND ROADBLOCKED ?
          LA,U      A1,ROADBLOCK        YES.  DIVERT TO ROADBLOCK ROUTINE
          FORK      .                   MAKE A PROCESSING ACTIVITY
          J         DISPR               TRY AGAIN TO FIND SOMETHING
.
DPRFX     LMJ       X6,ESN              EDIT STATEMENT NUMBER
          E$CHAR    'B'                 EDIT STARTED INDICATOR
          E$SKIP    1                   SKIP A SPACE
          J         DPXR                RETURN TO PROCESSING
.
.         WE GET HERE AFTER A PASS FAILS TO FIND ANYTHING TO DO
.
DISPEX    V         FISTAT              UNLOCK FACILITIES
          V         CMDLOCK             UNLOCK COMMAND CHAIN
          J         DISPI               GO THROUGH DISPATCHER AGAIN
.
.         DISPATCHER TERMINATION
.
DISPTR    REMOVE    CMDQUE              PULL OFF THE FINAL PACKET
          BRELP     A1                  RELEASE TERMINATION BUFFER
          V         FISTAT              RELEASE FACILITY STATUS LOCK
          V         CMDLOCK             UNLOCK COMMAND TABLES
          V         ENDLESS             INDICATE TERMINATION OF DISPATCHER
          EXIT      .                   KILL THE DISPATCHER
.
          PURE      DATA
STRTX     'STARTED   !'
          END