IDENT EVENT TITLE EVENT CHANNEL ROUTINES TITLE CREATE EVENT CHANNEL * CREATE AN EVENT CHANNEL * * PARAMETERS * AP1 C..ALLOCATION BLOCK * AP2 D..INDEX IN FULL C-LIST * AP3 D..LENGTH OF EVENT QUEUE * INTSYS XTEXT BLKBOX XTEXT PROCSYM XTEXT TYPES XTEXT OPTIONS XTEXT INTSYS XTEXT * RECS MACRO A + RE A RJ =XE.ECS RECS ENDM WECS MACRO A + WE A RJ =XE.ECS WECS ENDM ECSMAC XTEXT CBLOCK MICRO 1,,*/EEVENT/* EXT MAKEOBJ,PUTCAP,CAPAB,SYSRET EXT E.ECS,E.MOT ECSCODE MEVCH * * MKEVCH SA1 B1+P.PARAM+2 TEST CAPABILITY INDEX NG X1,MKEVCH5 ERROR..INDEX NEGATIVE SA2 B1+P.CLIST SA2 B1+X2 IX1 X1-X2 NG X1,MKEVCH2 MKEVCH1 SA2 A2+2 ZR X2,MKEVCH6 ERROR..INDEX TOO LARGE IX1 X1-X2 PL X1,MKEVCH1 SPACE 2 MKEVCH2 SA1 B1+P.PARAM+3 COMPUTE SPACE NEEDES SX2 X1-1 NG X2,MKEVCH4 ERROR..LESS THAN 1 EVENT IN QUEUE LX1 1 SB2 X1+3 AX1 16 ERROR IF EVENT QUEUE LARGER THAN NZ X1,MKEVCH4X 2EXP15-1 SA5 B1+P.PARAM+1 CALL ALLOCATOR SX7 AT.EVCH SB4 MKEVCH3 RETURN LINK JP MAKEOBJ SPACE 3 MKEVCH3 BX0 X5 ECS ADDR OF EVENT CHANNEL SX1 B2 LENGTH OF EVNET CHANNEL SX2 3 BX6 X2 LX6 18 BX6 X6+X2 LX6 18 BX6 X6+X1 SA6 B1 STORE 1ST WORD OF EVENT CHANNEL SPACE 2 SA5 CAPAB+1 MOT INDEX OF EVENT CHANNEL SX5 X5 SB3 -1 LX5 30 PX6 B3,X5 BX7 X6 LX6 30 BX6 X6+X7 SA6 B1+1 STORE CHAINING WORD SPACE 2 SA1 B1+P.PARAM+3 3RD WORD OF EVENT CHANNEL BX6 X1 SA6 B1+2 SPACE 2 * WRITE OUT 3 WORD HEADER FOR EVENT CHAN SA0 B1 + WE 3 RJ E.ECS SPACE 2 * PUT CAPABILITY FOR EVNET CHANNEL * IN FULL C-LIST * SA1 B1+P.PARAM+2 CAPABILITY INDEX SB5 CAPAB SB6 SYSRET JP PUTCAP ENDECS MEVCH EJECT * * DESTROY AND EVENT CHANNEL * * PARAMETERS: * AP1 CAPABILITY FOR THE EVENT CHANNEL * * IF PROCESSES ARE HUNG ON THE EVENT CHANNEL, * AN F-RETURN RESULTS * ECSCODE DSECH DSECH SA5 B1+P.PARAM+1 FETCH EVENT CHANNEL MOT SA0 B1 SX0 X5 RECS 1 SA2 A0 CHECK THAT THE UNIQUE NAME MX1 39 MATCHES BX4 X5-X2 BX4 X1*X4 NZ X4,ERRMOT ERROR IF UNIQUE NAMES DONT MATCH SX6 1 LOCK OUT PPUS SA6 I.LOCK BX2 -X1*X2 IX0 X2+X6 FETCH PROCESS CHAINING WORD OF RECS 1 CHANNEL SA2 B1 UX2 B2,X2 SB7 EVENT.5 GO DELETE EVENT CHANNEL IF NO LT B2,B0,=XDELOBJ PROCESS ARE HUNG ON IT BX6 X6-X6 OTHERWISE, CLESR PPU LOCKOUT AND SA6 I.LOCK F-RETURN EQ =XSYSFRET ENDECS DSECH SPACE 2 ERRNUMS XTEXT * * .....ERRORS..... * MKEVCH4 SX7 E.NEGQ EQ CL9 MKEVCH4X SX7 E.BIGQ EQ CL9 ERRMOT SX7 E.NOCHAN CL9 SX6 E.EVENT EQ E.ERROR MKEVCH5 SX7 E.NEGIX EQ CL2 MKEVCH6 SX7 E.BIGIX SA1 A1 CL2 LX1 18 MX3 42 BX1 X1*X3 BX7 X1+X7 SX6 E.PARMS EQ E.ERROR TITLE SEND EVENT * THIS ROUTINE DISPOSES OF AN EVENT ON A SPECIFIED * EVENT CHANNEL AND RETURNS TO THE CALLER THE PECISE * ACTION TAKEN * * SUBROUTINES CALLED * SUBROUTINES CALLED ^CHECKDUP^ AND ^UNCHAIN^ * AND ^UNHUNG1^ * * ENTRY FROM USER CALL * PARAMETERS ARE IN THE ACTUAL PARAMETER AREA. * AP1 = CAPABILITY FOR AN EVENT CHANNEL * AP2 = EVENT DATUM * EC.QUE EQU 1 EVENT QUEUED EC.PASS EQU 2 EVENT PASSED TO PROCESS EC.LOSE EQU 3 YOU LOSE EVENT PUT ON QUEUE EC.FULL EQU 4 FULL QUEUE * EXT I.LOCK,SCHED,UNHUNG1 ENTRY EVNT,EVENT1 * EVNT SX6 1 LOCK OUT PPU INTERRUPTS SA6 I.LOCK * SA2 B1+P.PARAM+1 GET MOT INDEX AND UNIQ. NAME OF EV CH SX0 X2 SA0 B1 RE 1 FETCH MOT ENTRY OF EVENT CHANNEL RJ E.ECS SA1 A0 BX2 X2-X1 MX4 39 BX2 X2*X4 NZ X2,ERRMOT . ERROR UNIQUE NAMES DON^T MATCH BX1 -X4*X1 ABS ECS ADDRESS OF EVENT CHAN SA2 B1+P.PARAM+2 GET EVENT DATUM SA4 B1+P.ROHEAD GET MOT OF USER PROCESS INTO X6 BX7 X2 LX4 6+36 SX6 X4+0 SB6 P.XPACK+14 LOC TO RETURN RESULT OF ACTION SB7 EVENT.5 JP EVENT1 * * RELEASE PPU LOCK OUT EVENT.5 BX6 X6-X6 SA6 I.LOCK JP SYSRET * * ENTRY POINT FROM PPU INTERRUPT * REGISTER ALLOCATION EXPECTED FROM PPU * X1 = ECS ADDRESS OF EVENT CHANNEL * X6 = PROCESS MOT * X7 = EVENT DATUM * B1 = ORIG OF SCRATCH AREA * B6 = ADDR REL TO B1 TO RETURN RESULT * B7 = RETURN LINK * EVENT1 SX0 X6 READ MOT ENTRY FOR SENDING PROCESS SA0 B1 RECS 1 SA2 B1 MX3 39 BX6 X2*X3 LX6 39 SETUP PROC UNIQUE NAME IN LOW BITS OF X6 BX0 X1 SA0 B1+0 RE 3 READ EVENT CHAN HEADER RJ E.ECS BX2 X0 SAVE ECS ADDRESS IN X2 * * TEST FOR EMPTY QUEUE SA1 A0+0 SB2 X1 LENGTH OF EVENT CHANNEL LX1 6+18 SB3 X1 INPOINTER LX1 18 SB4 X1 OUTPUTINTER SA3 B1+2 NE B3,B4,EVENT8 JP ON NON-FULL EVENT QUEUE NZ X3,EVENT12 POINTERS ARE =,BUT THERE ARE SLOTS, * SO THE EVENT QUE IS EMPTY * * * CHECK FOR ROOM IN QUEUE * EXPECT ECS ADDR EVENT CHAN IN X0 EVENT8 ZR X3,EVENT10 JP IF NO ROOM SA6 B1+3 SAVE X6 SX6 X3-1 DECREMENT EMPTY COUNT SA6 A3 ZR X6,EVENT11 JP IF ^YOU LOSE^ TIME SX6 EC.QUE RESPONSE TO CALLER * * PLACE EVENT IN QUEUE EVENT8.7 SA7 B1+4 SA6 B1+B6 RESPONSE TO CALLER SB3 B3+2 INCREMENT IN POINTER LT B3,B2,EVENT9 JP IF NO WRAP AROUND SB3 3 EVENT9 SA1 B1 FIX POINTER E IN HEADER LX1 6+18 SX5 X1 X5 = IN POINTER BX1 X1-X5 SX4 B3 BX6 X1+X4 LX6 36 SA6 A1 SA0 B1 + WE 3 COPY EVENT CHANNEL HEADER OUT RJ E.ECS SA0 B1+3 IX0 X0+X5 + WE 2 COPY OUT EVENT RJ E.ECS JP B7 RETURN * * EVENT QUEUE FULL EVENT10 SX6 EC.FULL CALLER NOTIFICATION SA6 B1+B6 JP B7 * * ^YOU LOSE^ EVENT EVENT11 SX6 EC.LOSE MX7 60 -0 IS ^YOU LOSE^ EVENT DATUM JP EVENT8.7 * * * EVENT QUEUE EMPTY * MUST SEARCH PROCESS QUEUE EVENT12 SA1 B1+1 GET EVENT CHANNEL CHAINING WORD SA0 B1+3 * EVENT13 UX1 B5,X1 UNPACK POINTER AX1 30 MOT INDEX OF A PROCESS IN THE QUEUE LT B5,B0,EVENT8 JP IF END OF PROCESS QUEUE BX0 X1 GET MOT OF NEXT PROCESS MX5 39 + RE 1 RJ E.ECS SA4 A0 BX0 -X5*X4 + RE 2 READ HEADER WD OF PROCESS RJ E.ECS SA4 A0 LX4 1 TEST FOR ^ WAKE UP WAITING^ PL X4,EVENT14 JP IF THE PROC NOT ^WAITING^ * SX4 B5+0 GET CHAINING WD FROM THIS PROCESS IX0 X0+X4 + RE 1 RJ E.ECS SA1 A0 BX0 X2 RESTORE ECSADDR OF EVENT CHANNEL IN * CASE OF JUMP TO ^EVENT8^ JP EVENT13 * * GOT A PROCESS TO TAKE THE EVENT EVENT14 LX4 4 CHECK FOR PSEUDO PROCESS NG X4,EVENT17 * LX4 60-5 SET ^WAKE UP WAITING^ AND * ^PENDING ACTION^ AND ^RUNNING^ FLAGS SB5 B5-P.PROCRO-P.PROCRW+1 PX6 B5,X6 INSERT THE CHAINING WORD IN THE EVENT SA6 A0+2 STORE EVENT IN USER X6 AND X7 SA7 A0+3 MX5 3 BX6 X4+X5 MX5 1 SET ^EVENT^ FLAG LX5 60-7 BX6 X6+X5 SA6 A0 + WE 2 WRITE HEADER TO PROCESS RJ E.ECS * * ************* NOTE THIS WON^T WORK ON TWO CPU S * MX6 1 CHECK FOR PROCESS IN CORE LX6 60-6 BX6 X6*X4 ZR X6,EVENT16 JP IF NOT IN CORE * EXT S.USRB1 * SA3 S.USRB1 BET B1 SB5 X3 SA3 A0+2 COPY EVENT TO X6 AND X7 SA2 A0+3 BX6 X3 BX7 X2 SA6 B5+P.XPACK+14 SA7 B5+P.XPACK+15 * SA3 B5+P.XPACK INCREMENT P COUNTER MX6 1 LX6 60-23 IX6 X3+X6 SA6 A3 * * COPY STUFF TO ECS COPY OF PROCESS * * EVENT16 SA0 A0+2 WRITE EVENT TO USER X6 AND X7 SX6 P.XPACK+14-P.ROHEAD IX0 X0+X6 + WE 2 RJ E.ECS * * INCREMENT P-COUNTER SX6 14 IX0 X0-X6 + RE 1 READ WD 0 OF X-PACK RJ E.ECS SA5 A0 MX6 1 LX6 60-23 IX6 X5+X6 SA6 A0 + WE 1 RJ E.ECS SPACE 2 EVENT21 SX6 EC.PASS SEND REPLY = EVENT PASSED TO PROCESS SA6 B1+B6 LX4 2 PL X4,SCHED JP IF PROCESS NOT ALREADY RUNNING JP B7 * * MUST UNCHAIN PSEUDO PROCESS * FROM PROCESS QUEUE EVENT17 SA6 B1+1 SAVE EVENT SX6 EC.PASS RESPONSE TO CALLER SA6 B1+B6 SB6 EVENT18 SX4 B5 SA7 B1+2 BX1 X0 SAVE ECS ADDR OF PSEUDO PROCESS * TO PASS TO ^UNHUNG1^ IX0 X4+X0 ECS ADDR OF CHAINING WD OF PSEUDO PROC + RE 1 READ CHAINING WD RJ E.ECS SA2 A0 JP UNCHAIN * EVENT18 SA2 B1+1 FETCH UP EVENT BX6 X2 SA2 B1+2 BX7 X2 JP UNHUNG1 * EJECT TITLE CHECK PROCESS QUEUE OF EVENT CHANNEL * * * * THIS ROUTINE CHECKS THE PROCESS QUE OF A SPECIFIED * EVENT CHANNEL TO SEE IF ANY PROCESSES ARE HUNG ON IT. * * PARAMETERS ARE: * * X1 = ECS ADDRESS OF EVENT CHANNEL * B1 = SCRATCH AREA * B7 = RETURN * * RETURNS: B2 LESS THAN 0 IF NO PROCESS HUNG * B2 GREATER THAN 0 IF A PROCESS HUNG WITHOUT * WAKEUP WAITING FLAG SET * * USES: X0-A0,X2-A2,X3,X4,B2 * ENTRY EVENTCK * EVENTCK BX0 X1 . ECS ADDRESS OF EVENT CHANNEL SA0 B1 . SCRATCH AREA MX3 60-21 . MASK FOR ECS ADDRESSES + RE 2 . READ EVCH HEADER TO SCRATCH AREA RJ E.ECS SA2 B1+1 . FETCH CHAINING WORD SX0 X2+0 . MOT INDEX OF NEXT ON CHAIN EVENTCK1 LX2 30 . POSITION LOWER POINTER UX2 B2,X2 . OFFSET OF CHAIN WORD IN B2 LT B2,B0,EVENTCK2 . END OF CHAIN, NO ONE FOUND, RETURN + RE 1 . READ MOT FOR NEXT PROCESS RJ E.ECS SA2 A0+0 . FETCH MOT BX0 -X3*X2 . EXTRACT ECS ADDRESS SX4 B2 . OFFSET IN X4 + RE 1 . READ PROCESS HEADER RJ E.ECS SA2 A0+0 . FETCH HEADER LX2 1 . POSITION WAKE UP WAITING FLAG IX0 X0+X4 . ADDRESS + OFFSET GIVES CHAIN WORD NG X2,EVENTCK3 . THIS PROCESS NOT HUNG, CONTINUE EVENTCK2 JP B7 . RETURN WITH B2 = WHATEVER EVENTCK3 RE 1 . READ UP CHAIN WORD RJ E.ECS SA2 A0 . CHAIN WORD SX0 X2 . MOT INDEX OF NEXT PROCESS EQ EVENTCK1 . LOOP * * * EJECT TITLE HANG ON EVENT CHANNEL * * THIS ROUTINE GETS AN EVENT FROM AN EVENT CHANNEL * OR HANGS * IT CALLS ^HANG^ * * ENTRY IS FROM THE USER * EXT S.CHARG,S.OLDTM,S.SYSTM EXT S.QUANT EXT CLKWAIT EXT DESCHED,SWAPOUT ENTRY EVCHANG EVCHANG SX6 1 SET PPU LOCKOUT SA6 I.LOCK * SA1 B1+P.ROHEAD PREPARE TO CALL !HANG^ LX1 6+36 SX1 X1 SA2 B1+P.PARAM+1 MOT AND UNIQUE NAME OF EVENT CHAN SX0 X2 SA0 B1 RE 1 RJ E.ECS SA3 A0 MX0 60-21 BX2 X2-X3 BX2 X0*X2 NZ X2,ERRMOT ERROR-UNIQUE NAMES DID NOT MATCH BX2 -X0*X3 ABS ECS ADDRESS OF EVENT CHAN SB2 P.PROCRO+P.PROCRW CHAINING WORD INDEX SB7 EVCHNG1 RETURN LINK JP HANG * EVCHNG1 NG X2,EVCHNG2 JP IF NO EVENT SA6 B1+P.XPACK+14 PASS EVENT TO USER REGISTERS SA7 B1+P.XPACK+15 * BX6 X6-X6 CLEAR PPU LOCKOUT SA6 I.LOCK * JP SYSRET * * NO EVENT....MUST HANG * EVCHNG2 SA2 B1+P.XPACK DECREMENT P-COUNTER MX6 59 LX2 6+18 IX6 X2+X6 LX6 36 SA6 A2 * SA1 B1+P.ROHEAD LX1 6+36 SX0 X1 CLEAR RUNNING AND WAKE UP BITS SA0 B1 MX6 39 + RE 1 READ MOT RJ E.ECS SA2 A0 BX0 -X6*X2 MX6 2 LX6 60-1 + RE 1 READ PROCESS HEADER WORD RJ E.ECS * SA2 A0 BX6 -X6*X2 SA6 A2 + WE 1 RJ E.ECS * SB7 EVCHNG3 DESCHEDULE PROCESS SX1 X1 JP DESCHED * * CLEAR PPU LOCKOUT EVCHNG3 BX6 X6-X6 SA6 I.LOCK * EVCHNG4 MX6 1 TURN OFF QUANTUM CLOCK SA6 S.QUANT SB6 CLKWAIT EVCHNG5 SB6 B6-1 PAUSE TO GIVE PPU TIME TO MESS NE B6,B0,EVCHNG5 IT UP SA1 A6 LX1 1 NG X1,EVCHNG4 * SA1 S.CHARG UPDATE SYSTEM TIME CLOCKS SA2 S.OLDTM SA3 B1+P.SYSTIM BX6 X1 SA6 A2 IX5 X1-X2 IX7 X5+X3 SA4 S.SYSTM SA7 A3 IX6 X5+X4 SA6 A4 * * JP SWAPOUT * TITLE GET EVENT OR FRETURN * GETEVF IS AN ECS ACTION WHICH GETS AN EVENT OR FRETURNS * IF THERE IS AN EVENT, IT IS EQUIVALENT TO ^EVCHANG^ * PARAMETER: AP1: C - EVENT CHANNEL ENTRY GETEVF EXT SYSFRET GETEVF BSS 0 SX6 1 SA6 I.LOCK .LOCK OUT PPU INTERRUPTS SA2 B1+P.PARAM+1 .MOT AND UNIQUE NAME OF EVCH SX0 X2 SA0 B1 RE 1 RJ =XE.ECS SA3 A0 .MOT ENTRY MX0 39 BX2 X2-X3 BX2 X0*X2 NZ X2,ERRMOT .UNIQUE NAMES DID NOR MATCK BX6 -X6-X6 .^DO NOT HANG^ BX2 -X0*X3 SB2 P.PROCRO+P.PROCRW + SB7 *+1 .RETURN LINK EQ HANG PL X2,EVCHNG1 .EVENT OBTAINED - BRANCH TO OTHER ACTIO SX6 0 SA6 I.LOCK .UNLOCK EQ SYSFRET TITLE HANG EJECT * THIS ROUTINE HANGS A SPECIFIED PROCESS OR PSEUDO * PROCESS ON AN EVENT CHANNEL IF THE EVENT QUEUE * OF THE EVENT CHANNEL IS EMPTY ... OTHERWISE * IT RETURNS AN EVENT FROM THE EVENT CHENNEL * * PARAMETERS B1 = ORIG OF SCRATCH AREA * B2 = CHAIN WD INDEX TO USE WITH PROCES * B7 = RETURN LINK * X1 = MOT INDEX OF PROCESS * X2=ABS ECS ADDRESS OF EVENT CHAN * X6 = NEGATIVE FOR ^DO NOT HANG^ * * RETURNS X2 = NEGATIVE IF PROCESS HUNG * X2 = POSITIVE IF EVENT FOUND * X6 / X7 = EVENT * * REGISTERS USED A0 -X0 * A2 -X2 * A3 - X3 * A4 - X4 * A6 - X6 * X7 * B4 , B5, B6 * ENTRY HANG * HANG SA0 B1+0 GET EVENT CHAN HEADER BX0 X2 + RE 3 READ EVENC CHANNEL HEADER RJ E.ECS * * TEST FOR EVENTS IN QUEUE SA3 A0 SB4 X3 LENGTH OF EVENT CHANNEL LX3 6+18 SB5 X3 IN POINTER LX3 18 SB6 X3 OUT POINTER NE B5,B6,HANG2 JP IF EVENTS AVAILABLE SA4 A0+2 NUMBER OF EMPTY SPACES ON EVENT Q ZR X4,HANG2 JP IF FULL QUEUE * NG X6,HANG4 .DONT HANG WAS SPECIFIED * * MUST HANG PROCES ON PROCESS QUEUE * LX1 30 FORM PTR TO NEW PROCESS PX7 B2,X1 * SA3 A0+1 CHAIN NEW PROC TO EVENT CHAN MX6 30 BX2 -X6*X3 X2 = PTR TO OLD END OF QUEUE AX7 30 BX3 X6*X3 BX6 X3+X7 SA6 A3 * + WE 3 WRITE OUT EVENT CHAN HEADER RJ E.ECS * * GET POINTER FROM OLD END OF QUEUE LX2 30 UX3 B5,X2 X3 = MOT OF OLD END OF QUEUE AX3 30 SX0 X3 + RE 1 RJ E.ECS MX6 39 SA3 A0 BX0 -X6*X3 GE B5,B0,HANG1 JP IF QUEUE NOT PREVIOUSLY EMPTY SB5 -B5 HANG1 SX3 B5 CHANING WORD INDEX OF OLD END OF QUEUE IX0 X0+X3 + RE 1 READ POINTER FROM OLD END OF Q RJ E.ECS SA3 A0 MX6 30 BX4 X6*X3 SAVE PTR TO EVENT CHAN FOR Q TAIL LX2 30 BX2 X2+X4 PTO DORD FOR NEW Q TAIL BX3 -X6*X3 LX7 30 BX6 X3+X7 SA6 A3 + WE 1 WRITE REPAINER PTR FOR OLD END OF Q RJ E.ECS * * WRITE POINTER TO NEW END OF QUEUE LX1 30 SX0 X1+0 MX6 39 + RE 1 READ MOT ONTRY OF NEW PROCESS RJ E.ECS SA3 A0 BX0 -X6*X3 SX3 B2 IX0 X0+X3 BX6 X2 SA6 A0 + WE 1 WRITE PTR TO NEW END ON QUEUE RJ E.ECS * MX2 1 SIGNAL NO EVENT JP B7 RETURN * * * GET EVENT FROM EVENT QUEUE * HANG2 SA2 A0+2 EMPTY COUNT SB5 B6+2 INCREMENT OUT POINTER LT B5,B4,HANG3 JP IF NO WRAP AROUND SB5 3 HANG3 MX6 59 X6 = -1 TO INCREMENT EMPTYY COUNT IX6 X2-X6 SA6 A2 SX2 X3 OLD OUT POINTER BX3 X3-X2 SX6 B5 BX6 X6+X3 LX6 18 SA6 A3+0 + WE 3 WRITE OUT EVENT CHANNEL HEADER RJ E.ECS IX0 X0+X2 ADDR OF EVENT + RE 2 READ EVENT RJ E.ECS SA3 A0 GET EVENT INTO X6 /X7 BX6 X3 SB4 B2-P.PROCRO-P.PROCRW+1 PUT THE CHAINING WORD PX6 B4,X6 INDEX INTO THE EVENT SA3 A0+1 BX7 X3 * BX2 X2-X2 SET X2 NON-NEGATIVE JP B7 RETURN * HANG4 BX2 -X2-X2 .SET X2 TO _NO EVENT_ JP B7 TITLE HANG ON MULTIPLE EVENT CHANNELS EJECT EJECT * THIS ROUTINE GETS AN EVENT FROM ONE OF A LIST OF EVENT * CHANNELS. MEVHANG HANGS ON ALL THE CHANNELS IF NONE HAS * AN EVENT; MEVHNGF F-RETURNS IF AN EVENT ISN'T AVAILABLE * ON AT LEAST ONE OF THE CHANNELS. * * HANG, UNCHAIN, AND GETCAP ARE CALLED * * AP1 = POINTER TO LIST OF INDICES OF CAPABILITIES FOR * EVENT CHANNELS * AP2 = NUMBER OF EVENT CHANNELS IN THE LIST * * ALL CAPABILITIES ARE CHECKED FOR APPROPRIATE TYPE AND * OPTION BITS, INDEPENDENT OF THE EXISTENCE OR NON-EXISTENCE * OF EVENTS ON ONE OF THE CHANNELS * EXT I.WAIT ENTRY MEVHANG,MEVHNGF MEVHANG SB2 41-OB.GETEV "HANG" FLAG TO B2 SA1 B1+P.ROHEAD LENGTH OF QUEUEING BUFFER+1 TO X1 LX1 24 MX0 48 SA2 B1+P.PARAM+1 ERROR IF NUMBER OF CHANNELS AS LARGE AS BX1 -X0*X1 IX1 X2-X1 SIZE OF QUEUEING BUFFER NG X1,MEV1 * * 2,1 TYPE ERORS * SX7 2 ER21 LX7 18 SX6 1 IX7 X6+X7 ER2X SX6 2 EQ =XE.ERROR ER20 SX7 0 EQ ER2X ER22 SX7 2 EQ ER2X * * F-RETURN ENTRY (SAME PARAS AS ABOVE) * MEVHNGF SB2 41-OB.GTEVF MEV1 SA1 B1+P.PARAM+1 ERROR IF CHANNEL COUNT NEGATIVE NG X1,ER20 ZR X1,ER20 SB3 X1 EROR IF CHANNEL COUNT EXCEEDS SB4 P.PARAML-2 (AVAILABLE SCRATCH SPACE -2) SX7 3 LT B4,B3,ER21 SA2 B1+P.PARAM+0 ERROR IF LIST POINTER NEGATIVE NG X2,ER22 IX3 X1+X2 ERROR IF POINTER+LENGTH SA1 B1+P.XPACK+2 EXCEEDS FIELD LENGTH LX1 6+18 SX4 X1 IX4 X4-X3 SX7 1 NG X4,ER21 * * CHECK ALL CAPABILITIES FOR TYPE AND OPTIONS. READ THE * MOT ENTRY AND CHECK THAT THE EVENT CHANNEL STILL EXISTS. * SAVETHE ABSOLUTEECS ADDRESSES OF THE CHANNELS IN THE * PARAMETER REA. * SA1 B1+P.XPACK+1 GET RA LX1 6+18 SB4 X1 SB4 X2+B4 RA+PTR GIVES ADDRESS OF LIST SB7 B0 INITIAL TQLLY MEV3 SA1 B4+B7 FETCH INDEX FROM LIST SB6 MEV2 RETURN LINK EQ =XGETCAP RETURNS ADDRESS OF CAP IN A0 MEV2 SA1 A0 SB5 X1 ERROR IF CAP NOT FOR EVENT CHANNEL SB6 T.EVCH NE B6,B5,ER72 LX1 B2,X1 ERROR IF OB.GETEV (OR OB.GTEVF) ISN T ON PL X1,ER72 SA1 A0+1 MX3 60-21 BX0 -X3*X1 SA0 B1 RECS 1 READ MOT ENTRY FOR CHANNEL SA2 A0 BX1 X2-X1 BX1 X1*X3 NZ X1,ERRMOT ERROR IF UNIQUE NAMES DON T MATCH SB6 B1+P.PARAM+2 BX7 -X3*X2 SAVE ECS ADDRESS OF EVCH SA7 B6+B7 SB7 B7+1 LT B7,B3,MEV3 * * CHECK FOR EVENTS WITHOUT HANGING ON THE CHANNELS * SB7 MEV4 RETURN LINK SX5 B2 SAVE HANG/FRETURN FLAG IN X5 SB2 P.PROCRO+P.PROCRW SB3 B3+B2 SETUP TALLY AND ENDTEST SX6 1 LOCK OUT THE PPU S SA6 I.LOCK MEV6 SB4 B1+B2 FETCH ECS ADDR OF CHANNEL SA2 B4+P.PARAM+2-P.PROCRO-P.PROCRW MX6 1 DON T HANG FLAG EQ HANG GO LOOK FOR AN EVENT MEV4 SB2 B2+1 ADVANCE COUNT PL X2,EVCHNG1 GOT AN EVENT SA2 I.WAIT CHECK FOR INTERRUPT PENDING ZR X2,MEV5 SX6 0 SA6 I.LOCK SB4 I.PAUSE MEV5P1 SA2 I.WAIT EQ B4,B0,DISAS INTERRUPT FAILED TO TUN SB4 B4-1 NZ X2,MEV5P1 SX6 1 SA6 I.LOCK RELOCK INTERRUPTS MEV5 LT B2,B3,MEV6 SB4 X5 RECOVER ENTRY FLAG SB2 41-OB.GTEVF IF NO EVENT AND F-RETURN CASE, INITIATE F-RETURN EQ B4,B2,=XSYSFRET * * NO EVENT WAS WAITING AND HE WANTS TO HANG. SIGH. PROCEED * WITH THE MESSY BUISNESS OF HANGING ON THE CHANNELS * (AND THEN UNCHAINING IF NECESSARY). * SA1 B1+P.ROHEAD AX1 18 SX1 X1 PTR TO PROCESS MOT TO X1 SX0 X1 SB3 B0 SET INITIAL TALLY SB7 MEV7 RETURN LINK SA0 B1+P.TEMP1 GET ECS ADDRESS OF PROCESS INTO TEMP1 RECS 1 FOR LATER CHECKING MEV9 SB4 B1+P.PARAM+2 ECS ADDR OF EVCH TO X2 SA2 B4+B3 MX6 0 SET HANG FLAG SB2 P.PROCRO+P.PROCRW+B3 CHAINING WORD INDEX TO B2 EQ HANG GO TEST FOR EVENT AND HANG MEV7 PL X2,MEV8 AN EVENT SNUCK IN SINCE WE LOOKED LAST SB3 B3+1 SA2 B1+P.PARAM+1 SB2 X2 GE B3,B2,EVCHNG2 HUNG ON ALL CHANNELS. GO SWAP PROCESS OUT SA2 I.WAIT IF NO INTERRUPT PENDING, PROCEED BB1 TEST MACRO, NORMALLY NULL ZR X2,MEV9 TO HANG ON NEXT CHANNEL SB4 I.PAUSE RELEASE PPU LOCKOUT AND WAIT FOR INTERRUPT SX6 0 SA6 I.LOCK MEV12 SA2 I.WAIT ZR X2,MEV11 JUMP OUT AFTER INTERRUPT OCCURS SB4 B4-1 NE B4,B0,MEV12 DISAS RJ =XDISASTR INTERRUPT FAILED TO RUN MEV11 SX6 1 RELOCK INTERRUPTS SA6 I.LOCK SA2 B1+P.TEMP1 AFTER AN INTERRUPT, READ THE PROCESS MX0 39 HEADER FORM ECS AND SEE IF IT GOT AN EVENT SA0 B1 ON ONE OF THE CHANNELS IT WAS HUNG ON BX0 -X0*X2 RECS 1 SA2 A0 LX2 1 PL X2,MEV9 NO EVENT, GO HANG SOME MORE SA2 B1+P.XPACK RESTORE P-COUNTER MX6 1 LX6 60-23 IX6 X2-X6 SA6 A2 EQ MEV10 * * CAUGHT IN THE ACT - * B3 SAYS HOW MUCH UNCHAINING IS NECESSARY * MEV8 SA6 B1+P.XPACK+14 STORE EVENT IN USER X6,X7 SA7 B1+P.XPACK+15 EQ B3,B0,EVENT.5 FINISHED (GOT AN EVENT FORM THE FIRST CHANNEL) SA2 B1+P.TEMP1 SET THE W BIT TO MX0 39 PREVENT THIS PROCESS FROM BX0 -X0*X2 GETTING ANOTHER EVENT SA0 B1 MX6 1 RECS 1 LX6 60-1 SA2 A0 BX6 X6+X2 SA6 A0 WECS 1 * * MEV10 SX4 1 UNCHAIN THE PROCESS SX1 P.PROCRO+P.PROCRW MX7 0 IX1 X1+X0 SB6 MEV15 MEV15 BX0 X1 SA5 I.WAIT CHECK TO SEE IF INTERRUPTS ARE PENDING SA0 B1 ZR X5,MEV14 SA7 I.LOCK UNLOCK INTERRUPTS SB5 I.PAUSE MEV13 SA5 I.WAIT SB5 B5-1 EQ B5,B0,DISAS NZ X5,MEV13 SX6 1 SA6 I.LOCK MEV14 RECS 1 SA2 A0 SA7 A0 IX1 X1+X4 WECS 1 NZ X2,UNCHAIN QUIT AT THE ZERO WORD SA2 B1+P.TEMP1 MX0 39 BX0 -X0*X2 SA0 B1 SX6 202B LX6 51 RECS 1 GET THE PROCESS DESCRIPTOR SA2 A0 AND CLEAR THE W AND V BITS BX6 -X6*X2 SA6 A0 WECS 1 JP EVENT.5 * * CAP TYPE OR OPTIONS BAD ERROR * ER72 SX7 B7+1 INDEX AS MODIFIER SX6 2 LX7 18 IX7 X6+X7 SX6 7 EQ E.ERROR EJECT EJECT * THIS ROUTINE DELINKS A PROCESS CHAINING WD FROM * A PROCESS QUEUE * * PARAMETERS X2 = CHAINING WD TO UNCHAIN * B6 = RETURN LINK * * REGISTERS USED A0-X0, X2, A3-X3,B5, A6-X6 * SCRATCH AREA USED STARTING AT B1 + 4 * ENTRY UNCHAIN * UNCHAIN SA0 B1+4 UX3 B5,X2 EXPAND CHAINING WORD ( FORE POINTER ) AX3 30 MX6 39 SX0 X3 READ MOT OF NEXT IN CHAIN + RE 1 RJ E.ECS GE B5,B0,UNCHAIN1 TEST FOR LAST IN QUEUE SB5 -B5 UNCHAIN1 SA3 A0 READ PROPER CHAINING WD OF NEXT IN Q BX0 -X6*X3 SX3 B5 IX0 X0+X3 + RE 1 RJ E.ECS SA3 A0+0 PATCH CHAINING WORD OF NEXT IN Q MX6 30 BX3 X6*X3 BX6 -X6*X2 BX6 X6+X3 SA6 A3+0 + WE 1 WRITE OUT REPAIRED CHAINING WORD RJ E.ECS * * FIX PROCEDING ELEMENT IN QUEUE LX2 30 UX3 B5,X2 EXPAND BACK POINTER AX3 30 MX6 39 SX0 X3 GET MOT OF PROCEDING PROC + RE 1 RJ E.ECS GE B5,B0,UNCHAIN2 TEST FOR FIRST IN QUEUE SB5 -B5 UNCHAIN2 SA3 A0 BX0 -X6*X3 SX3 B5 CHAINING WD INDEX IX0 X0+X3 + RE 1 RJ E.ECS SA3 A0+0 PATCH OF CHAING WORD MX6 30 BX3 -X6*X3 BX6 -X6*X2 LX6 30 BX6 X6+X3 SA6 A3+0 + WE 1 WRITE OUT MODIFIED CH WD RJ E.ECS * JP B6 RETURN EJECT END