.
. 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