TITLE CLOCK1 - CLOCK, CONTEXT SWITCHING, AND JOB STARTUP AND STOP ROUTINES - V412 SUBTTL APRINT TH/TH/CHW TS 20 MAY 69 XP VCLOCK1,412 ; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP ENTRY CLOCK1 ;ALWAYS LOAD CLOCK1 IF LIBRARY SEARCH CLOCK1: ;THIS SERVICE ROUTINE RUNS ON A HIGH PRIORITY CHANNEL ;AND REQUESTS INTERRUPTS ON LOWER CLK CHANNEL ;FOR SCHEDULING JOBS AND ERROR HANDLING THAT THE USER ;IS NOT ENABLED TO HANDLE HIMSELF EXTERNAL TIME,TIMEF,CLKFLG,REQCLK,APRCHL,APRPC,UPTIME EXTERNAL JOBDAT,JOBTPC,JOBCNI,JOBAPR,APRERR,SCHEDF EXTERNAL APRILM,COMMAN,CONMES,DEVCHK,DEVSRC,ERROR,INLMES EXTERNAL RELEA9,CRSHWD,CRASHX INTERNAL FTTTYSER ;THIS ROUTINE MAY BE ASSEMBLED TO WORK WITH EITHER ; THE OLD SCNSER OR THE NEW TTYSER. INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL DATA,APRCON,APRIN1,CLKS17,DAMESS,UUO0,CLOCK INTERNAL UUO1 > IFE FTCHECK+FTMONP,< INTERN CLOCK,DAMESS EXTERN CIPWTM APRCON: 231000 ;MONITOR ENABLED CPU FLAGS APRIN1: 0 ;USER ENABLED CPU FLAGS CLKS17: 0 ;PLACE TO SAVE AC17 ON CLOCK INTERRUPT DAMESS: ASCIZ /-JAN-/ CLOCK: POINT 36,CIPWTM,35 ;BYTE POINTER TO CLOCK REQ QUEUE > INTERN APRINT APRINT: JRST APRPAR ;ALWAYS CHECK APR AND PI DEVICES JRST . ;CHECK OTHER DEVICES APRPCL: CONO PI,240000 ;TURN OFF MEM PAR. ERR, AND ; ENABLE FOR MEM PAR AND TRY AGAIN ; (DO NOT TURN OFF POWR FAIL AS THAT PERMANENTLY ; DISABLES POWR FAIL INTERRUPT) APRPAR: CONSZ PI,600000 ;MEM PARITY ERROR OR POWER FAILURE? HALT APRPCL ;YES, HALT MACHINE, CLEAR FLAGS AND TRY AGAIN ; ON CONTINUE CONSO APR,@APRCON ;INTERRUPT FOR APR? ; ALWAYS AT LEAST FOR CLOCK,ILM,NXM,PD OVF ; RH MODIFIED EACH TIME USER RUNS IN CASE HE IS ; ENABLED FOR PC CHANGE OR AR OVF JRST APRINT+1 ;NO,CHECK OTHER DEVICES ON THIS PI CHANNEL SKIPE CRSHWD ;IS LOC. 30 CLOBBERED? JRST CRASHX ;YES - GO SAVE AC'S & STATE OF ALL DEVS. CONSO APR,001000 ;YES, IS IT CLOCK? JRST APRER ;NO, GO CHECK ERROR FLAGS AOS TIME ;YES, INCREMENT TIME OF DAY AOS UPTIME ;UPTIME IS LOADED AS ZERO,AND IS NEVER CLEARED SETOM TIMEF ;FLAG THAT APR CLOCK HAS TICKED SETOM CLKFLG ;SET FLAG FOR CLK FORCED INTERRUPT CONO PI,REQCLK ;REQUEST INTERRUPT ON CLK CHANNEL CONSZ APR,@APRIN1 ;IS USER ENABLE FOR ANY FLAGS(INCLUDING CLOCK) ; RH ALSO MODIFIED EACH TIME A USER RUNS JRST APRER1 ;YES, GO PROCESS TRAP CONO APR,1000+APRCHN ;NO, CLEAR ONLY THE CLOCK FLAG JEN @APRCHL ;DISMISS INTERRUPT ;HERE ON CLOCK FLAG AND IT OR SOME OTHER FLAG IS ON WHICH USERS WANTS APRER1: CONO APR,1000+APRCHN ;NOW CLEAR CLOCK FLAG EXCH TAC,APRCHL ;SAVE TAC, GET PC TLNE TAC,USRMOD ;IS PC FROM USER MODE? JRST APRER4 ;YES, GO TRAP TO HIM JRST APRER2 ;NO, GO CHECK IN CASE ALSO A SERIOUS ERROR ;OTHER APR INTERRUPTS BESIDES CLOCK APRER: EXCH TAC,APRCHL ;SAVE TAC, GET PC TLNE TAC,USRMOD ;IS PC IN USER MODE? CONSO APR,@APRIN1 ;YES, IS USER ENABLED FOR THIS ERROR JRST APRER2 ;NO, PRINT ERROR MESSAGE AND STOP JOB APRER4: EXCH JDAT,JOBDAT ;YES, SAVE JDAT, GET CURRENT JOB DATA AREA ADR. MOVEM TAC,JOBTPC(JDAT) ;STORE PC IN JOB DATA AREA CONI APR,JOBCNI(JDAT) ;STORE APR IN JOB DATA AREA HLLZS JOBENB(JDAT) ;CLEAR SOFTWARE FLAGS SO THAT USER MUST DO ; ANOTHER APRENB UUO IN ORDER TO ENABLE TRAPS SETZM APRIN1 ;ALSO CLEAR USER APR CONSO FLAGS HRRI TAC,231000 ;AND SET MONITOR TO LOOK ONLY FOR HRRM TAC,APRCON ;PD OVF,ILM,NXM, AND CLOCK HRR TAC,JOBAPR(JDAT) ;GET USER LOC TO TRAP TO EXCH JDAT,JOBDAT ;RESTORE JDAT,JOBDAT CONO APR,440+APRCHN ;DISABLE FOV, AROVF IN CASE ON ;SO USER MUST REENABLE WITH SETAPR UUO APRER3: TLZ TAC,440000 ;CLEAR FOV (PC CHANGE ON PDP-6) AND AR OVF FLAGS ; SO INTERRUPT MAY BE DISMISSED EXCH TAC,APRCHL ;RESTORE TAC & APRCHL CONO APR,430110+APRCHN ;CLEAR ALL ERROR FLAGS WHICH CAN CAUSE INTERRUPTS ; EXCEPT CLOCK FLAG(ELSE LOSE TIME OF DAY) JEN @APRCHL ;DISMISS INTERRUPT APRER2: CONSO APR,NXM!ILM!POV ;DOES EXEC CARE? JRST APRER3 ;NO. IGNORE EXEC OVERFLOW (MUST BE FOV OR AROVF) MOVEM TAC,APRPC ;STORE ERROR PC FOR CLK CHANNEL CONI APR,APRERR ;STORE ERROR FLAGS ; (ALSO USED AS ERROR FLAG) SETOM CLKFLG ;SET FLAG FOR CLK INTERRUPT SETOM SCHEDF ;FLAG THAT RESCHEDULING IS NEEDED ; (EVEN THOUGH PC MAY BE IN EXEC MODE) CONO PI,REQCLK ;REQUEST INTERRUPT IN CLK CHANNEL CONSZ APR,ILM ;WAS ERROR ILLEGAL MEMORY(FROM USER)? HRRI TAC,0 ;YES,CLEAR RH OF PC,SO A SECOND ILM INTERRUPT ; WILL NOT OCCUR IF THIS IS A WILD PC(AND A PDP-10) IFN FTHALT,< CONSZ PI,003400 ;ARE ANY PI'S IN PROGRESS OF LOWER PRIORITY THAN APR? ; (PDP-10 BITS ONLY) HALT .+1 ;YES, HALT SO CONTINUE WILL TRY TO RECOVER > JRST APRER3 ;NO,MUST BE UUO LEVEL(OR USER MODE AND ; MEMORY DROPPED OUT) SUBTTL CLOCK - LOW PRIORITY CLOCK SERVICE(CLK) ;THIS ROUTINE RUNS ON THE LOWEST PRIORITY PI CHANNEL AND AT UUO LEVEL ;TO CAUSE AN INTERRUPT ON CLK CHANNEL: ; SETOM CLKFLG ;FLAG THAT INTERRUPT HAS BEEN REQUESTED ; CONO PI,CLKREQ ;REQUEST PI INTERUPT ON LOWEST PI CHANNEL ;THE FOLLOWING OTHER FLAGS MUST ALSO BE SET ;APRERR-APR DETECTED ERROR IN CURRENT JOB ;SCHEDF-RESCHEDULING MUST TAKE PLACE(EVEN THOUGH PC IN EXEC MODE) ;TIMEF-APR CLOCK HAS TICKED ON HIGH PRIORITY CHANNEL ;SEE APRSER AND RUNCSS TO SEE HOW THIS ROUTINE IS CALLED ;CLK SERVICE PERFORMS THE FOLLOWING ON A REGULAR BASIS: ;PROCESSES CLOCK QUEUE REQUESTS ;CALLS CONSOLE MONITOR COMMAND DECODER ;CALLS CORE SHUFFLER ;THEN CALLS SCHEDULER ;IF THE CURRENT JOB IS IN EXEC MODE THE ABOVE 4 TASKS ARE ;DELAYED UNTIL THE CURRENT JOB ENTERS A STOPPABLE STATE: I.E., UNTIL ; 1. JOB STARTS TO WAIT FOR A BUSY SHARABLE DEVICE ; 2. JOB STARTS TO WAIT FOR IO TO COMPLETE ; 3. CONTROL ABOUT TO RETURN TO USER MODE ;THEN CLK SERVICE IS ENTERED AT THE UUO LEVEL STOR=DAT T=TAC T1=TAC1 JA=JDAT ;THE CLOCK REQUEST QUEUE PROVIDES THE REST OF THE MONITOR ;WITH THE ABILITY TO BE TRAPPED TO AFTER A NUMBER OF CLOCK TICKS ;HAVE OCCURRED ;TO MAKE A REQUEST: ; CONO PI,PIOFF ; IDPB AC,CLOCK ;STORE CLOCK REQUEST IN QUEUE ; CONO PI,PION ;TURN PI BACK ON ;C(AC)=XWD ADDRESS,NO. OF CLOCK TICKS+DATA*10000 ;WHERE DATA IS 6 BITS OF INFO NEEDED WHEN TIME RUNS OUT ;CLK SERVICE WILL PUSHJ PDP,ADR ;WHEN TIME RUNS OUT WITH DATA RIGHT JUSTIFIED IN AC TAC ;ALL ACS ARE FREE TO USE WHEN CALL IS MADE INTERNAL CLKINI EXTERNAL CIPWTM1,PION,PIOFF CLKINI: MOVEI TAC,CIPWTM1 ;SETUP CLOCK QUEUE BYTE POINTER HRRM TAC,CLOCK ;LH NEVER CHANGES(36 BIT BYTE) POPJ PDP, ;HERE AT UUO LEVEL WHEN JOB GOES INTO IO WAIT OR SHARABLE DEVICE WAIT ;CALL: PUSHJ PDP,WSCHED ; RETURN HERE WHEN RUNABLE AGAIN INTERNAL WSCHED EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL WSCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA MOVEI AC3,JOBDAC(JDAT) ;SAVE ACS 0-16 IN DUMP ACS BLT AC3,JOBD16(JDAT) ;IN CURRENT JOB DATA AREA MOVEI PDP,NULPDL ;NULL JOB PD LIST HRLI PDP,MJOBP1 ;USED TO CALL SCHEDULER AND COMMAND DECODER ; OTHERWISE GET PD OUF JRST RSCHED ;GO RESCHEDULE ;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE ;FROM A UUO CALL AND EITHER: ; 1. CURRENT JOB TYPED CONTROL C WHILE IN EXEC MODE ; 2. CLOCK FLAG WENT OFF WHILE CURRENT JOB WAS ; IN EXEC MODE ;CALL: PUSHJ PDP,USCHED ;FROM UUOCON(UUO HANDLER RETURN TO USER) ; RETURN HERE WHEN RUNABLE INTERNAL USCHED EXTERNAL JOBDPG,JOBDPD,USRPC USCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA MOVEM PROG,JOBDPG(PROG) ;SAVE PROG IN DUMP AC AREA MOVEM PDP,JOBDPD(PROG) ;SAVE PDP JRST RSCHED ;GO RESCHEDULE ;HERE AT CLK INTERRUPT LEVEL INTERNAL CLKINT INTERNAL FTTIME EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL CLKINT: SKIPN CLKFLG ;CLK INTERRUPT REQUEST? JRST CLKINT ;NO, CHECK OTHER DEVICES MOVEM 17,CLKS17 ;SAVE AC 17 MOVE 17,CLKCHL ;IS CURRENT JOB IN USER MODE? TLNN 17,USRMOD SKIPE SCHEDF ;NO, IS THIS A FORSCED RESCHEDULING INTERRUPT? JRST SAVPC ;YES, IT IS OK TO RESCHEDULE NOW MOVE 17,CLKS17 ;NO, LEAVE TIMEF SET AND DISMISS INT. JEN @CLKCHL SAVPC: MOVEM 17,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA ; STORAGE FOR CURRENT JOB CLKERR: SKIPN 17,JOBDAT ;CURRENT JOB DATA AREA, IS THERE ONE? MOVEI 17,NULDAT ;NO, MUST BE NULL JOB OR CORE 0 ; RUNS AT UUO LEVEL,REQUESTS CLK INT. TO STOP MOVEM 16,JOBD16(17) ;SAVE AC 16 IN DUMP AC PART OF JOB DATA AREA MOVEI 16,JOBDAC(17) ;SOURCE=0,DESTINATION=DUMP AC 0 BLT 16,JOBD15(17) ;SAVE ACS 0-15 JUST BELOW AC 16 MOVE TAC,CLKS17 ;NOW SAVE 17 IN JOB DATA AREA MOVEM TAC,JOBD17(17) ;ALONG WITH OTHER ACS MOVEI PDP,NULPDL ;SET UP PUSH DOWN LIST IN NULL JOB DATA ; AREA IN LOWER CORE HRLI PDP,MJOBP1 ;-LENGTH+1(LEAVE ROOM FOR UUO PC) SKIPE TAC,APRERR ;IT THIS AN ERROR INTERRUPT? PUSHJ PDP,APRILM ;YES, GO PROCESS ERROR,APRILM WILL CLEAR APRERR ; FLAG IMMEDIATELY EXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JOB,PMONTB RSCHED: SKIPN TIMEF ;HAS CLOCK GONE OFF SINCE LAST CALL? JRST CIP6 ;NO, JUST RESCHEDULE ;TIME ACCOUNTING EXTERNAL TIME,MIDNIT,THSDAT,MONTAB IFN FTTIME,< EXTERNAL RTIME,TTIME,JOB SKIPN ITEM,JOB ;WAS LAST JOB NULL JOB? SKIPN POTLST ;YES-WAS IT A LOST TICK? JRST INCTIM ;NO-PROCEED NORMALLY AOS LSTWRD ;YES-INCREMENT LOST TIME COUNT SETZM POTLST ;AND CLEAR LOST TICK INDICATION INCTIM: AOS RTIME(ITEM) ;INCR. CURRENT JOB INCREMENTAL RUN TIME AOS TTIME(ITEM) ;INCR. CURRENT JOB TOTAL RUN TIME > IFN FTKCT,< EXTERN USRREL,JBTKCT LDB TAC,[POINT 8,USRREL,25] ;GET NO. OF 1K BLOCKS-1FOR CURRENT USER ADDI TAC,1 ;MAKE IT NO. OF 1K BLOCKS ADDM TAC,JBTKCT(ITEM) ;ADD IN ACCUMULATED CORE RUNNING TIME PRODUCT ; (KILO-CORE TICKS) IFN FT2REL,< EXTERN CHGHGH PUSHJ PDP,CHGHGH ;CHARGE USER FOR HIGH SEGMENT IF HE HAS ONE > > ;MIDNITE CHECK MOVE TAC1,TIME CAMGE TAC1,MIDNIT ;GONE PAST MIDNITE? JRST CIP2 ;NO CIP3: SETZB IOS,TIME ;YES. RESET TIME OF DAY AOS TAC,THSDAT ;UPDATE DAY IDIVI TAC,^D31 DIVI IOS,^D12 ;NO. LDB TAC,PMONTB CAMGE TAC,TAC1 ;END OF MONTH? JRST CIP3 ;YES. ;PROCESS TIMING REQUESTS STORED IN QUEUE CIP2: HRRZ STOR,CLOCK ;GET END OF LIST CIP4: CAIN STOR,CIPWTM1 ;END YET? JRST CIP5 ;YES SOS TAC1, (STOR) ;DECREMENT TIMING REQUEST TRNE TAC1, 7777 ;TIME EXPIRED YET SOJA STOR, CIP4 ;NO, CONTINUE SCAN CONO PI, PIOFF ;YES, MOVE LAST ITEM IN LIST TO THIS MOVE TAC, @CLOCK SOS CLOCK MOVEM TAC, (STOR) CONO PI,PION LDB TAC, [POINT 6, TAC1, 23] ;GET 6 BIT DATA ITEM MOVSS TAC1 ;SETUP DISPATCH ADDRESS PUSH PDP, STOR ;SAVE ONLY VALUABLE AC PUSHJ PDP, (TAC1) ;AND DISPATCH TO TIMING REQUEST ROUTINE POP PDP, STOR SOJA STOR, CIP4 ;GO BACK FOR MORE REQUESTS CIP5: SOSG HNGTIM ;DECREMENT HUNG IO DEVICE PUSHJ PDP,DEVCHK ;GO CHECK FOR HUNG IO DEVICES SKIPE COMCNT ;ANY COMMANDS TO PROCESS? PUSHJ PDP,COMMAND ;YES, CALL COMMAND DECODER CIP6: PUSHJ PDP,NXTJOB ;CALL SCHEDULER SETZM CLKFLG ;CLEAR CLK INTERRUPT FLAG ; SET ON ALL FORCED CLK INTERRUPTS SETZM TIMEF ;CLEAR TIMED (1 JIFFY) INTERRUPT FLAG. SETZM SCHEDF ;CLEAR FORCED SCHEDULING FLAG CAMN ITEM,JOB ;IS NEXT JOB SAME AS LAST ONE? JRST CIP8 ;YES, JUST RESTORE ACS AND DISMISS ;DIFFERENT JOB, SAVE SOFTWARE STATE(HARDWARE ALREADY SAVED) EXTERNAL JOB,JOBDAT,JOBPRT,USRPRT,USRHCU,JOBJDA SKIPN JA,JOBDAT ;NULL JOB OR CORE 0 ON OLD JOB? JRST CIP7 ;YES, DO NO SAVE SOFTWARE STATE MOVEI T,JOBPRT(JA) ;DEST.=FIRST LOC PROTECTED FROM USER HRLI T,USRPRT ;SOUR.=SYSTEM DATA STORAGE FOR CURRETN JOB SKIPL T1,USRHCU ;MOVE NO. OF OLD USER IO CHAN. IN USE CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT ; CLOBBER IF ADDRESS CHECKING MISSES) MOVEI T1,0 ;MOVE ONLY CHN 0 IF NEG, OR GR 17 ; SAVGET SETS LH NEGATIVE DURING IO AS A FLAG ; SINCE IT DOES IO INTO AND OUT OF ; CHANNEL LOCATIONS (JOBJDA+1...JOBJDA+17). ADD JA,T1 ;RELOCATE TO USER AREA BLT T,JOBJDA(JA) ;MOVE TO USER JOB DATA AREA ; STOP WITH USER CHANNEL 0-1+C(USRHCU) ;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE INTERNAL NULJOB,NULADR EXTERNAL JOB,JBTDAT,JOBDAT,USRPRT,JOBPRT EXTERNAL JOBHCU,USRJDA,JOBENB,APRCHN,APRNUL,NULDAT,NULERR NULJOB: ;TRANSFER HERE FROM SYSINI WITH ITEM=0 CIP7: MOVEM ITEM,JOB ;STORE NEW CURRENT JOB NUMBER NULADR: PUSHJ PDP,SETRL1 ;GO SETUP HARDWARE AND SOFTWARE RELOCATION ; INFORMATION FOR NEW CURRENT USER JUMPE ITEM,NULJB ;IS NEW JOB THE NULL JOB? IFN FTHALT,< SKIPN JA ;DOES JOB HAVE CORE ASSIGNED? HALT . ;NO -ELSE CLOBBER MONITOR > MOVEI T,USRPRT ;NO, DEST.=PROTECTED AREA IN MONITOR HRLI T,JOBPRT(JA) ;SOURCE=FIRST PROTECTED LOC. IN JB DATA AREA SKIPL T1,JOBHCU(JA) ;MOVE NO. OF USER IO CHAN. IN USE CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT CLOBBER ; IF ADRRESS CHECKING MISSES MOVEI T1,0 ;MOVEJUST CHAN 0 IF NEG. OR GREATER THAN 17 ; SAVEGET SETS NEG.DURING IO BLT T,USRJDA(T1) ;AND MOVE INTO MONITOR ;RESTORE HARDWARE STATE OF CURRENT JOB CIP8: SKIPN JA,JBTDAT(ITEM) ;JOB DATA AREA(IS THERE ONE?) MOVEI JA,NULDAT ;NO, MUST BE NULL JOB MOVSI 17,JOBDAC(JA) ;RESTORE DUMP ACS BLT 17,17 SKIPE APRERR ;DID AN ERROR OCCUR WHILE CLKPI IN PROGRESS ; (ON CLK PI OR HIGHER) JRST CLKERR ;YES, GO PROCESS ERROR SKIPN JOB ;IS THIS JOB THE NULL JOB? SKIPN NULERR ;YES, HAS AN ERROR OCCURRED WHILE NULL JOB ; WAS RUNNING? IF YES, RESTORE ACS ; ILL UUO LOSED ACS JEN @USRPC ;DISMISS CHANNEL(IF INTERRUPT IN PROGRESS) ;THE NULL JOB ;RUNS IN USER MODE WITH PC=1 AND COUNTS IN AC 0 EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR NULJB: IFN FTCHECK, SETZB 0,NULERR ;CLEAR AC 0 USED FOR USUAL MONITORING ; CLEAR FLAG SAYING ERROR IN NULL JOB ; OF NULL TIME INTERVAL ; LOC JOBDAT (LOCATION OF NULL JOB DATA AREA) TO 0 ; AS A FLAG (ONLY DUMP ACS USED IN NULL JOB DATA AREA) ; IF ANY ERRORS (APRERR NON-ZERO) OCCURRED ; WHILE CLK IN PROGRESS ; CATCH THEM NEXT CLK INTERRUPT MOVE 1,[AOJA 0,1] ;INSTR. TO AC1 JRST 11,1 ;DISMISS IF INTERUPT IN PROGRESS ;ROUTINE TO SET HARDWARE AND SOFTWARE RELOCATION INFORMATION FOR CURRENT USER ;CALLED FROM: ; CLOCK ROUTINE WHEN NEW USER IS DIRRERENT FROM OLD USER ; CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER ; CORE UUO ; REMAP UUO ; CALL RESET UUO ; CALL SETUWP UUO ;CALL: STORE RELOCATION AND PROTECTION FOR LOW SEG IN JOBADR(JOB NUMBER) ; STORE LENGTH-1 AND ABS ORIGIN FOR HIGH SEG IN JBTADR(HIGH SEG NO) ; (MOVE ITEM,JOB NUMBER - IF CALLING SETRL1) ; PUSHJ PDP,SETREL OR SETRL1 ; ALWAYS RETURN, C(ITEM)=JOB NUMBER, C(PROG)=XWD PROT,RELOC, FOR LOW SEG INTERN SETREL EXTERN JOB,JBTADR,JOBADR,USRREL,JBTDAT,JOBDAT,JOBREL,KT10A SETREL: MOVE ITEM,JOB ;CURRENT JOB NUMBER SETRL1: MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION FOR LOW SEG MOVEM PROG,JOBADR ;SAVE TO MAKE UUO HANDLER FASTER HLRZM PROG,USRREL ;SAVE PROTECTION FOR ADDRESS CHECKING ; (HIGHEST LEGAL REL ADDRES FOR CURRENT USER IN LOW SEG) IFN JDAT-PROG,< MOVE JA,JBTDAT(ITEM) ;LOC OF JOB DATA AREA MOVEM JA,JOBDAT ;SAVE IT TOO FOR UUO HANDLER > JUMPE PROG,SETHRD ;IF 0 (NULL JOB OR JOB DOING CORE 0 OR KJOB) ; DO NOT STORE IN JOB DATA AREA (SINCE IT WILL BE ; IN EXEC LOWER CORE. ALSO DO NOT STORE ; IN LOC 33, SO CAN SEE LAST REAL USER TO RUN HLRZM PROG,JOBREL(JA) ;SET PROTECTION IN USER JOB DATA AREA ; FOR HIM TO LOOK AT IFN FT2REL,< EXTERN SETHGH PUSHJ PDP,SETHGH ;SET UP FOR HIGH SEG, IF USER HAS ONE ; PROG SETUP FOR DATAO > IFE FT2REL,< TLZ PROG,1777 ;CLEAR OUT PROTECTION FOR HIGH SEG ; JUST IN CASE THIS IS A 2 REG. MACHINE(EVEN THOGH ; SOFTWARE CANNOT HANDLE 2 SEGS) > MOVEM PROG,KT10A ;STORE IN LOWER CORE SO IT CAN BE FOUND OUT ; USING SWITCHES WHAT IS IN SECOND REGISTER ; OPTION DOES NOT COME WITH PANEL LIGHTS ; SO NOT STORE 0 FOR NULL JOB SO CAN SEE ; LAST JOB TO RUN IN LOC 33 SETHRD: DATAO APR,PROG ;SET APR HARDWARE FOR RELOCATION AND PROTECTION ; FOR LOW(AND HIGH SEGS) SKIPN PROG,JOBADR ;RESTORE PROG TO XWD PROT,RELOC FOR JUST LOW SEG ; (IS THERE ONE)? TDZA TAC,TAC ;NO, MUST BE NULL JOB OR CORE0 OR KJOB ; SET FOR NO SPECIAL INTERRUPTS TO USER MOVE TAC,JOBENB(JA) ;USER APR CONSO FLAGS (THE ONES HE WANTS TO HANDLE ; FALL INTO SETAPR ROUTINE ;ROUTINE TO ENABLE/DISABLE APR FOR TRAPPING TO USER AND EXEC ;CALL: MOVEI TAC, APR CONSO FLAGS FOR USER TRAPPING ; PUSHJ POP,SETAPR ; RETURN WITH APR RESET AND INTERRUPT LOCATION CONSO'S SET INTERN SETAPR EXTERN APRFOV SETAPR: ANDI TAC,231010+APRFOV ;MASK OUT ALL BUT PD OVF, ILL MEM, NXM, ; CLOCK, FOV(ONLY PDP-10), AND AROVF CONSO FLAGS ; FOV=PC CHANGE ON PDP-6 WHICH IS NEVER ALLOWED ; UNDER TIME SHARING BECAUSE IT TRAPS MONITOR TOO HRLS TAC ;PRESERVE USER BITS IN LH TRO TAC,231000 ;MAKE SURE MONITOR ALWAYS LOOKING FOR ; PD OVF, ILM, NXM, CLOCK FLAGS MOVE TAC1,TAC ;DUPLICATE BITS IN TAC1 FOR CONO TO APR. XORI TAC1,110 ;COMPLEMENT FOV(PDP-10 ONLY) AND AROV FLAGS ADDI TAC1, 330 ;SET DISABLE OR ENABLE FOR EACH ANDI TAC1,660 ;MASK OUT ALL BUT DISABLE/ENABLE ; BITS FOR FOV(PDP-10 ONLY) AND AROVF CONO PI,PIOFF ;DISABLE PI'S SO NO INTS. MAY OCCUR WHILE ;CHANGING HARDWARE & SOFTWARE STATE FOR ;APR TRAPPING HLRM TAC,APRIN1 ;STORE USER BITS HRRM TAC,APRCON ;STORE EXEC BITS CONO APR,APRCHN(TAC1) ;ENABLE OR DISABLE APR FOR ; FOV(PDP-10 ONLY) AND AR OVF SEPARATELY CONO PI,PION ;ENABLE PI'S AGAIN POPJ PDP, SUBTTL RUNCSS - RUN CONTROL(STARTING AND STOPPING OF JOBS) ;RUN CONTROL IS A COLLECTION OF ROUTINES WHICH ;SET AND CLEAR BITS IN THE JOB STATUS WORDS OF ;ALL JOBS SO THAT THE SCHEDULER WILL START AND STOP ;THEM ACCORDINGLY ;COMMON ERROR STOPPING ROUTINES ;CALLED AT ANY LEVEL(UUO,CLK, OR INTERRUPT) ;CALL: MOVE ITEM,JOB CAUSING ERROR OR BEING STOPPED ; MOVE DEVDAT,ADRRESS OF THAT JOB TTY DEVICE DATA BLOCK ; MOVE DAT,BYTE POINTER TO LAST CHAR. ALREADY MOVED ; ;TO TTY OUTPUT BUFFER ; PUSHJ PDP,KSTOP,PHOLD,HOLD,OR ESTOP ; NEVER RETURN IF CALLED AT UUO LEVEL ;ROUTINE TO STOP JOB AFTER KJOB COMMAND ;CALLED AT UUO LEVEL IF JOB HAD CORE,CLK LEVEL IF NOT INTERNAL KSTOP EXTERNAL HIGHJB KSTOP: MOVSI TAC,JNA+JLOG+JACCT ;CLEAR JOB NUMBER ASSIGNED AND LOGGED IN BITS ANDCAM TAC,JBTSTS(ITEM) IFN FTLOGIN,< EXTERN PRJPRG SETZM PRJPRG(ITEM) ;CLEAR PROJECT-PROGRAMMER NUMBER WHEN JOB LOGS OUT > ; IF THIS IS THE LARGEST JOB IN USE,FIND NEXT ; HIGHEST AND SET HIGHJB CAMGE ITEM,HIGHJB ;IS THIS THE BIGGEST JOB NUMBER ASSIGNED? JRST ESTOP ;NO, LEAVE HOLE MOVSI TAC1,JNA ;YES,JOB NUMBER ASSIGNED BIT HRRZ TAC,ITEM ;SCAN DOWNWARD TDNN TAC1,JBTSTS(TAC) ;IS JNA BIT SET FOR THIS JOB? SOJG TAC,.-1 ;NO,KEEP LOOKING,FINISHED(TRUE IF THIS THE ONLY JOB MOVEM TAC,HIGHJB ;YES,STORE NEW HIGHEST JOB NUMBER ASSIGNED JRST ESTOP ;GO SET ERROR BIT ;ROUTINE TO STOP JOB, SET ERROR BIT AND PRINT MESSAGE ;THEN ADD ^C ;CALL: MOVEI TAC,ADR. OF MESSAGE ; PUSHJ PDP,PHOLD INTERN PHOLD PHOLD: PUSHJ PDP,CONMES ;MOVE MESSAGE TO TTY OUTPUT BUFFER ; FALL INTO HOLD ;ROUTINE TO STOP JOB, SET ERROR BIT, ;AND ADD "^C INTERNAL HOLD,HOLD1 EXTERNAL TTYSTC HOLD: PUSHJ PDP,INLMES ASCIZ / ^C ./ HOLD1: PUSHJ PDP,TTYSTC ;MAKE SURE TTY STAYS IN MONITOR MODE ; AND START TTY TYPING OUT MESSAGE ; FALL INTO ESTOP ;ROUTINE TO STOP USER AND FLAG AS ERROR STOP INTERNAL ESTOP,ESTOP1 EXTERNAL JBTSTS,STUSER,STREQ,STAVAL EXTERNAL SCHEDF,JOB,CPOPJ ESTOP: JUMPE ITEM,CPOPJ ;IS THIS ERROR IN JOB 0? MOVSI TAC,JACCT ;NO, CLEAR ACCOUNTING BIT(IN CASE LOGGING ANDCAM TAC,JBTSTS(ITEM) ;IN OR OUT) SO USER CAN USE CONTROL C ; TO RECOVER ESTOP1: MOVSI TAC,JERR ;SET ERROR BIT IN JOB STATUS WORD IORM TAC,JBTSTS(ITEM) ;SO JOB CAN NOT CONTINUE(CONT COM.) CAME ITEM,STUSER ;SYSTEM TAPE USER? JRST STOP1 ;NO MOVSI TAC,637163 ;FIND SYS DDB PUSHJ PDP,DEVSRC ;SYSTEM ERROR IF NOT FOUND JSP DAT,ERROR PUSHJ PDP,RELEA9 ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING ;ROUTINE TO STOP ANY JOB FROM BEING SCHEDULED ;CALL: ; MOVE ITEM, JOB NUMBER ; PUSHJ PDP, STOP1 ; EXIT ;RETURN HERE IMMEDIATELY, IF CALLED FROM HIGHER ;PRIORITY PI CHANNEL THAN CLK(LOWEST), OTHERWISE WHEN JOB IS RUNABLE ;CALLED FROM COMMAND DECODER WHEN C TYPED IN BY USER ;OR ON ANY ERROR MESSAGE(SEE PREVIOUS PAGE) INTERNAL STOP1 EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB STOP1: MOVSI TAC, RUN CONO PI, PIOFF ;DONE AT INTERUPT LEVEL HIGHER THAN DT LEVEL CAME ITEM,STUSER ;IS THIS JOB CURRENTLY USING THE SYSTEM TAPE? TDNN TAC,JBTSTS(ITEM) ;NO, IS RUN BIT OFF IN JOB STATUS WORD JRST STOP1A ;YES ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT CONO PI, PION LDB TAC,PJBSTS ;GET JOB WAIT QUEUE CODE(IF ANY) CAIG TAC,MAXQ ;DOES STATE HAVE Q ? SOSL REQTAB(TAC) ;YES. REDUCE IT. JRST STOP1A ;NO SOSGE AVALTB(TAC) ;YES REDUCE COUNT SETZM AVALTB(TAC) ;CLEAR AVAL FLAG IF NO ONE WAITING STOP1A: CONO PI, PION ;MAKE SURE PI ON CAME ITEM, JOB ;NO, IS THIS JOB CURRENT USER INTERNAL FTSWAP IFE FTSWAP,< POPJ PDP, ;NO > IFN FTSWAP,< JRST REQUE ;SET REQUE JOB FLAG > SKIPL TAC,JBTSTS(ITEM) ;RUN FLAG OFF? TLNN TAC,JERR ;YES. ERROR FLAG ON? JRST STOP2 ;NO SETOM SCHEDF ;YES, FORCE RESCHEDULING EVEN IF JOB IN EXEC MODE JRST STOP2 ;YES, MAKE CLK RESCHEDULE ANOTHER JOB ;ROUTINE TO REQUE JOB WHICH HAS HAD A COMMAND TYPED ;WHICH NEEDS CORE AND THE CORE IMAGE IS ON THE DISK. ;OR IS IN CORE AND HAS ACTIVE DEVICES. ;CALLED FROM COMMAND DECODER ;CALL: MOVE ITEM,JOB NO. ; PUSHJ PDP,DLYCOM INTERNAL DLYCOM DLYCOM: MOVSI TAC,CMWB ;SET COMMAND WAIT BIT IFN FTSWAP,< EXCH TAC,JBTSTS(ITEM) > IORM TAC,JBTSTS(ITEM) ;IN JOB STATUS WORD INTERNAL FTSWAP IFN FTSWAP,< TLNN TAC,CMWB PUSHJ PDP,REQUE > POPJ PDP, ;ROUTINE TO PUT JOB IN NO CORE QUEUE INTERNAL FTSWAP IFN FTSWAP, ;ROUTINE TO SETUP MONITOR JOB TO RUN LATER AT UUO LEVEL ;CALLED BY COMMANDS WHICH MAY OR MAY NOT NEED TO ;RUN MONITOR JOB DEPENDING ON WHETHER JOB HAS CORE(KJOB,IJOB) ;TTY WILL REMAIN IN MONITOR MODE ;JOB MUST HAVE CORE ASSIGNED ;CALL: MOVE ITEM, JOB NUMBER ; MOVEI TAC1,ADDR. OF MONITOR JOB TO BE RUN ; PUSHJ PDP,MONJOB ;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS INTERNAL MONJOB MONJOB: PUSHJ PDP,MSTART ;START WITH PC IN MONITOR JRST SETRUN ;SET TTY TO START JOB WHEN COMMAND RESPONSE ; IS FINISHED AND KEEP TTY IN MONITOR MODE ;ROUTINE TO SETUP ACS FOR MONITOR JOB STARTING AT UUO LEVEL ;SETS UP ITEM, WITH JOB NO.; PROG WITH RELOCATION, AND PDP ;WITH PUSH DOWN LIST ADR. IN JOB DATA AREA ;USED BY KJOB,CORE 0,SAVE,GET,RUN,R,REASSIGN AND FINISH COMMANDS ;CALL: MOVEI TAC1,MONITOR JOB STOP ADDRESS ; JSP TAC,MONSTR ; RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP INTERNAL MONSTR EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT MONSTR: MOVE ITEM,JOB ;CURRENT JOB NUMBER MOVE JDAT,JBTDAT(ITEM) ;ADR. OF JOB DATA AREA IFN JDAT-PROG,< MOVE PROG,JBTADR(ITEM) ;JOB RELOCATION > MOVSI PDP,MJOBPD ;MINUS LENGTH OF SYSTEM PD LIST HRRI PDP,JOBPDL(JDAT) ;FIRST LOC.-1 OF PD LIST PUSH PDP,TAC1 ;SAVE STOP ADRRESS JRST (TAC) ;RETURN AND DO MONITOR JOB ; WITH TTY DDB,OUTPUT BYTE POINTER, AND JOB NO. ;ROUTINE TO SET JOB STATE TO BE SCHEDULED TO RUN ;WITH SPECIFIED STARTING ADDRESS INCLUDING PC FLAGS ;CALLED ONLY WHEN JOB IN CORE AND AFTER JOB HAS BEEN ;SAFELY STOPPED IN ONE OF 3 STATES: ;1) PC IN USER MODE ;2) JOB IN A WAIT FOR SHARABLE DEVICE, OR IO WAIT ;3) JOB JUST ABOUT TO RETURN TO USER MODE FROM A UUO CALL ;CALL: MOVE TAC1,STARTING PC ; MOVE ITEM, JOB NUMBER ; MOVE JDAT,ADR. OF JOB DATA AREA WHICH MUST BE IN CORE ; PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE) ; RETURN HERE IMMEDIATELY INTERNAL MSTART,USTART EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1 USTART: MOVE TAC,JOBPC(JDAT) ;GET OLD PC TLNE TAC,USRMOD ;IS IT IN USER MODE TOO? JRST USTRT1 ;YES, DUMP ACS AND PC FLAGS ARE ALREADY HIS MOVEI TAC,JOBDAC(JDAT) ;NO, MOVE USERS(UUO) ACS TO DUMP ACS HRL TAC,JDAT ;SOURCE=REL. 0,DEST.=JOBDAC IN JOB DATA AREA BLT TAC,JOBD17(JDAT) ;MOVE ALL ACS MOVE TAC,JOBPD1(JDAT) ;UUO PC HAS LAST PC HRRI TAC,-1(TAC) ;SUBTRACT 1 FROM RIGHT HALF AND ; PRESERVE LH PC FLAGS. ; (RH=0 ON HALT 0 OR FIRST START) USTRT1: MOVEM TAC,JOBOPC(JDAT) ;STORE OLD PC FOR USER TO LOOK AT HLL TAC1,TAC ;PRESERVE USER APR FLAGS TLO TAC1,USRMOD ;MAKE SURE NEW PC IN USER MODE TLZ TAC1,37 ;MAKE SURE NO INDIRECT BITS OR INDEX FIELD MSTART: MOVEM TAC1,JOBPC(JDAT) ;STORE NEW PC MOVSI TAC,JERR+WTMASK ANDCAM TAC,JBTSTS(ITEM) ;CLEAR ERROR AND WAIT STATUS BITS JRST TTYSET ;SET TTY STATE TO INITIAL COND. ; TTYUSR OR TTYURC SHOULD BE CALLED ; TO INDICATE WHETHER TTY TO USER OR EXEC MODE ; AND THAT JOB IS TO RUN(RUN BIT =1) WHEN ; MONITOR COMMAND RESPONSE FINISHES. ; SEE SETRUN BELOW ;ROUTINE TO SET JOB STATUS RUN BIT(RUN) ;CALLED BY SCANNER SERVICE WHEN TTY MONITOR COMMAND ;RESPONSE FINISHES. THIS ACTION IS ENABLED BY CALLING ;TTYUSR, OR TTYURC IN SCNSER ;CALL: MOVE ITEM,JOB NUMBER ; PUSHJ PDP,SETRUN INTERNAL SETRUN EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT EXTERNAL MAXQ SETRUN: LDB TAC,PJBSTS ;GET JOB STATUS WAIT QUEUE CODE CAILE TAC,MAXQ ;DOES JOB STATUS CODE HAVE A QUEUE? JRST SETR1 ;NO AOSLE REQTAB(TAC) ;ADD TO REQUEST COUNT JRST SETR1 ;OTHERS WAITING? AOSG AVALTB(TAC) ;MAKE AVAILABLE SETOM AVALTB(TAC) ;FLAG AS JUST AVAILABLE, BECAUSE ; NO JOB WAS USING DEVICE. SCHEDULER ; WILL SCAN THIS QUEUE SETR1: MOVSI TAC,RUN ;SET RUN BIT IN JOB STATUS WORD IORM TAC,JBTSTS(ITEM) SETR2: MOVE TAC,RNQUNT ;SET QUANTUM TIME TO RUN QUEUE QUANTUM HRRM TAC,JBTSTS(ITEM) ;RUN QUEUE QUANTUM INTERNAL FTSWAP IFE FTSWAP,< JRST NULTST ;GO SEE IF NULL JOB IS RUNNING > IFN FTSWAP,< INTERNAL REQUE EXTERNAL QJOB,JBTSTS REQUE: MOVSI TAC,JRQ ;MARK JOB TO BE REQUEUED WITH JRQ BIT TDNN TAC,JBTSTS(ITEM) ;INCREMENT COUNT ONLY ONCE FOR EACH JOB AOS QJOB ;INCREMENT COUNT OF NO. OF JOBS WAITING TO BE REQUEUED IORM TAC,JBTSTS(ITEM) ;SET REQUE BIT FOR SCHEDULER POPJ PDP, > ;ROUTINE TO PUT A JOB TO SLEEP AND WAKE UP AGAIN LATER ;CALLED AFTER CLOCK QUEUE REQUEST PUT IN BY UUO ROUTINE INTERNAL FTSLEEP IFN FTSLEEP,< INTERNAL SETSLP EXTERNAL JBTSTS,SLPQ SETSLP: MOVSI TAC,CLKR ;FLAG THAT A CLOCK REQUEST HAS BEEN PUT IN IORM TAC,JBTSTS(ITEM) ;SO ONLY ONE PER JOB MOVEI AC1,SLPQ ;SLEEP STATE CODE JRST SETSTT ;SET STATUS AND RESCHEDULE ;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP ;JOB NO. IN AC TAC INTERNAL WAKE EXTERNAL PJBSTS,RNQ,SLPQ WAKE: MOVEI TAC1,RNQ ;RUN QUEUE CODE MOVE ITEM,TAC ;JOB NO. MOVSI TAC,CLKR ;CLEAR CLOCK REQUEST BIT FOR THIS JOB ANDCAM TAC,JBTSTS(ITEM) ;SO IT CAN PUT ANOTHER ONE IN LDB TAC,PJBSTS ;GET QUEUE CODE CAIE TAC,SLPQ ;IS JOB STILL SLEEPING? POPJ PDP, ;NO. RETURN TO CLOCK ROUTINE DPB TAC1,PJBSTS ;YES, STORE RUN QUEUE CODE ; (CONTROL C, START CAN GET JOB OUT OF SLEEP) JRST SETR2 > ;ROUTINE TO GET DATA CONTROL AND ANOTHER SHARABLE DEVICE ;JOB NEVER GETS ONE DEVICE AND WAITS FOR SECOND, SINCE TYPING ;CONTROL C WOULD NEVER FINISH WITH FIRST DEVICE ;CALL PUSHJ PDP,GETDCXX ; AOSE XXREQ ;REQUEST COUNT FOR OTHER DEVICE ; RETURN WHEN BOTH AVAILABLE INTERNAL GETDCDT,GETDCMT EXTERNAL DCREQ,REQTAB,AVALTB,DCAVAL,CPOPJ1 GETDCDT:GETDCMT: XCT @(PDP) ;INCREASE SHARABLE DEVICE REQ. COUNT GETWT: PUSHJ PDP,DVWAT1 ;NOT AVAIL., GO WAIT FOR IT AOSN DCREQ ;IS DATA CONTROL AVAILABLE? JRST CPOPJ1 ;YES, RETURN BOTH AVAILABLE MOVE AC1,@(PDP) ;DATA CONTROL NOT AVAILABLE SUBI AC1,REQTAB SOSL REQTAB(AC1) ;REDUCE REQ. COUNT FOR OTHER ; SHARABLE DEVICE. SETOM AVALTB(AC1) ;SET AVAILABLE IF OTHER JOBS WAITING JFCL DCREQ ;ARGUMENT FOR DCWAIT PUSHJ PDP,DCWAIT ;WAIT FOR DATA CONTROL FREE MOVE AC1,@(PDP) ;INCREMENT REQ. COUNT AOSN @AC1 ;NOW IS SHARABLE DEVICE FREE? JRST CPOPJ1 ;YES SOSL DCREQ ;NO, REDUCE DATA CONTROL REQUEST SETOM DCAVAL ;SET AVAIL., SOME OTHER JOB WAITING FOR IT JRST GETWT ;TRY AGAIN ;ROUTINE TO WAIT FOR A SHARABLE DEVICE ;CALLED AT UUO LEVEL ONLY BY DEVICE SERVICE ROUTINES ;CALL: AOSLE XXREQ ;ADD 1 TO SHARABLE DEVICE REQUEST COUNT ; ;IS DEVICE AVAILABLE? ; PUSHJ PDP,XXWAIT ;NO, PUT JOB IN WAIT QUEUE ; RETURN WHEN DEVICE AVAILABLE ;INITIALLY THE REQUEST COUNT IS -N, WHERE N IS THE ;NUMBER OF JOBS WHICH CAN USE THE SHARABLE DEVICE AT THE SAME TIME ;A REQUEST COUNT OF 0 MEANS THE MAXIMUM NO. OF JOBS ARE ;USING THE DEVICE, A POSITIVE NUMBER IS THE ;NUMBER OF JOBS WAITING IN THE SHARABLE DEVICE WAIT QUEUE INTERNAL DVWAIT INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT EXTERNAL JOB,REQTAB MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT: DVWAIT: MOVE AC1,(PDP) ;GET ADR. OF CALLER MOVE AC1,-2(AC1) ;GET AOSLE XXREQ INSTRUCTION JRST .+2 DVWAT1: MOVE AC1,@-1(PDP) ;GET ADR. OF CALLER OF THIS ROUTINE SUBI AC1,REQTAB ;COMPUTE WAIT-STATE QUEUE CODE SETSTT: MOVE AC3,JOB ;CURRENT JOB NO. DPB AC1,PJBS1 ;STORE IN JOB STATUS WORD JRST WSCHED ;GO SCHEDULE ANOTHER AND RETURN TO CALLER ; WHEN SHARABLE DEVICE BECOMES AVAILABLE ; SEE CLOCK AND CLKCSS PJBS1: POINT JWSIZ,JBTSTS(AC3),JWPOS ;BYTE POINTER TO JOB STATUS ; WORD WAIT QUEUE CODE ;ROUTINE TO SET JOB TO RUN AFTER IT HAS BEEN STOPPED ;BECAUSE IT HAD TO WAIT FOR IO TO COMPLETE FOR SOME DEVICE ;EACH SERVICE ROUTINE AT INTERRUPT LEVEL ;CHECK EACH TIME IT FINISHED A TASK(BUFFERFUL) ;TO SEE IF THE JOB USING THE DEVICE HAS ;PREVIOUSLY CAUGHT UP WITH DEVICE AND HAS BEEN STOPPED ;CALL: MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK ; MOVE IOS,DEVIOS(DEVDAT) ;GET DEVICE IO STATUS WORD FROM DDB ; TLZE IOS,IOW ;IS JOB IN AN IO WAIT FOR THIS DEVICE? ; PUSHJ PDP,SETIOD ;YES, GO FLAG JOB TO START UP AGAIN ; RETURN ;SETS THE JOB QUEUE WAIT CODE TO WSQ IN JOB STATUS WORD. ;THE SCHEDULER THEN SEES THAT THIS JOB HAS ITS ;IO WAIT SATISFIED AND IS WAITING TO BE RUN AGAIN INTERNAL SETIOD,STTIOD EXTERNAL WSQ,WSAVAL,TSQ,TSAVAL,JOB,PJOBN PJBS2: POINT JWSIZ,JBTSTS(TAC),JWPOS ;BYTE POINTER TO JOB STATUS ; WORD QUEUE CODE STTIOD: MOVEI TAC1,TSQ ;SET TTY IO WAIT SATISFIED QUEUE CODE AOS TSAVAL JRST SETID1 SETIOD: MOVEI TAC1,WSQ ;REQUE TO WAIT SATISFIED Q AOS WSAVAL ;INCR. NO. OF JOBS WITH IO WAIT ; SATISFIED. NON-ZERO WSAVAL WILL ; CAUSE SCHED. TO SCAN FOR IO ; SATISFIED JOB. SETID1: LDB TAC,PJOBN DPB TAC1,PJBS2 ;IN JOB STATUS WORD INTERNAL FTSWAP IFN FTSWAP,< EXTERN QJOB,JBTSTS MOVSI TAC1,JRQ ;SET JOB TO BE REQUEUED AT NEXT CLOCK TICK TDNN TAC1,JBTSTS(TAC) ;IS REQUE BIT ALREADY ON? AOS QJOB ;NO, INCREMENT COUNT ONCE FOR EACH JOB IORM TAC1,JBTSTS(TAC) ;SET REQUEUEING BIT FOR SCHEDULER > NULTST: SKIPE JOB ;IS NULL JOB RUNNING? POPJ PDP, ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPPED TO ;ROUTINE TO CAUSE CLK ROUTINE TO RESCHEDULE ;CALLED AT ANY LEVEL ;CALL: PUSHJ PDP,STOP2 ; RETURN IMMEDIATELY EXCEPT IF AT UUO LEVEL ; IF AT UUO LEVEL, RETURN WHEN JOB IS RUNABLE AGAIN INTERNAL STOP2 EXTERNAL PICLK,CLKFLG STOP2: CONO PI,PIOFF ;PREVENT CLOCK INTERRUPT DURING STOP2 CODE SETOM CLKFLG ;SET FLAG TO INDICATE CLK INTERRUPT ; EVEN THOUGH CLK INTERRUPT IS NOT A TIME INTERRUPT CONO PI,PICLK ;TURN PI BACK ON AND REQUEST INTERRUPT TO ; CLK PI CHANNEL(LOWEST PRIORITY CHANNEL) POPJ PDP, ;INTERRUPT IMMEDIATELY IF AT UUO LEVEL ;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INACTIVE ,CALLING SEQUENCE , PUSHJ PDP, WAIT1 , EXIT ALWAYS RETURNS HERE ,IF THE DEVICE IS INACTIVE (IOACT=0), RETURNS TO EXIT. OTHERWISE. SETS ,IOW:=1 AND ENTERS WAIT UNLESS IOACT BECOMES ZERO BEFORE THE ,JUMP IS MADE, IN WHICH CASE IT SETS IOW:=0 AND RETURNS TO EXIT. ,ON LEAVING THE WAIT STATE, RETURNS TO EXIT. ,THIS ROUTINE PREVENTS THE STATE IOACT=0 AND IOW=1 FROM OCCURING ,CALLING SEQUENCE , PUSHJ PDP, WSYNC , EXIT ALWAYS RETURNS HERE ,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0. INTERNAL WAIT1 WAIT1: MOVE IOS,DEVIOS(DEVDAT) TRNN IOS, IOACT ;IS DEVICE ACTIVE? (IOACT=1?) POPJ PDP, ;RETURN PUSHJ PDP,WSYNC ;WAIT JRST WAIT1 ;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE ;IE UNTIL CURRENT BUFFER ACTIVITY IS COMPLETED ;CALLED ONLY FROM UUO LEVEL ;CALL: MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK ; PUSHJ PDP,WSYNC ; RETURN IMMEDIATELY IF DEVICE IS INACTIVE ; RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE INTERNAL WSYNC EXTERNAL IOWQ,TIOWQ,PION,PIOFF WSYNC: MOVSI IOS,IOW ;SETUP DEVICE IO WAIT BIT MOVEI AC1,IOWQ ;IO WAIT STATE CODE MOVE AC3,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS TLNE AC3,DVTTY ;IS THIS DEVICE A TTY? MOVEI AC1,TIOWQ ;YES, SET TTY WAIT STATE CODE MOVE AC3,JOB ;CURRENT JOB NO. MOVEI AC2,IOACT ;DEVICE ACTIVE BIT CONO PI, PIOFF ;TURN PI OFF TDNN AC2,DEVIOS(DEVDAT) ;IS THE DEVICE ACTIVE? JRST WSYNC1 ;NO IORM IOS,DEVIOS(DEVDAT) ;YES, SET DEVICE IO-WAIT BIT ; AND SETUP IOS FOR RETURN WHEN WAIT SATISFIED DPB AC1,PJBS1 ;SET JOB WAIT STATE CODE ; IN JOB STATUS WORD CONO PI, PION ;TURN PI ON PUSHJ PDP,WSCHED ;CALL SCHEDULER TO FIN ANOTHER JOB TO RUN ; RETURN WHEN NEXT BUFFERFUL IS FINISHED ; WITH ACS 0-14 OCTAL RESTORED ; RETURN WHEN IO-WAIT FINISHED WSYNC1: CONO PI, PION ANDCAB IOS, DEVIOS(DEVDAT) ;CLEAR DEVICE IO-WAIT BIT POPJ PDP, CLKEND: END