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