IDENT SWAP ERR VV HAS IT 21 FEB '71 TITLE PROCESS SWAPPER * PROCESS SWAPPER * THIS ENTRY IS USED TO SWAP AT QUANTUM OVERFLOW * * NOTE.. B1 IS SET UP FOR THE CURRENT PROCESS * THE EXCHANGE PACKAGE FOR THE USER IS IN THE * USUAL PLACE ( AT B1+P.XPACK ) * S.OLDTIM HAS JUST BEEN UPDATED * EXT I.LOCK * * INTSYS XTEXT PROCSYM XTEXT * EXT S.RETU EXT MAPIN,MAPOUT,E.ECS,E.MOT,PRODUCE EXT S.USERA,S.USRB1 EXT S.SAVE1,S.SAVE2 EXT S.CHARG,S.OLDTM,S.SWPTM,S.QUANT EXT S.IDLTM EXT S.USRTM EXT CLKWAIT,PACKBUF EXT S.CMFL,S.ECSRA,S.ECSFL * * * QUANTUM CLOCK DOES NOT INCREMENT IF IS EQUALS ZERO * OR IF THE HIGH ORDER BYTE EQUALS 4000B * WHEN THE CLOCK IS ZERO, THE PPU WILL ATTEMPT ^MEJ^ * TO PACKAGE AT ^S.FSWAP^ * * * ******** FORCED SWAP ... TIMER RAN OUT * * ENTRY S.FSWAP * * EXCHANGE PACKAGE USED BY PPU TO FORCE A SWAPOUT * S.FSWAP BSSZ 16 P-COUNTER ETC. SET IN ^INITL^ * * * ENTRY FORSWAP * FORSWAP SA1 S.USRB1 GET B1 FOR THE USER SB1 X1 NO 1 TURN OFF TRACE SA1 S.CHARG UPDATE USER TIME SA2 S.OLDTM SA3 B1+P.USRTIM BX6 X1 SA6 A2 IX5 X1-X2 IX7 X5+X3 SA4 S.USRTM SA7 A3 IX6 X5+X4 SA6 A4 * * STOP QUANTUM CLOCK CHECKING * MX6 1 . SET 4000B IN UPPER PART OF SA6 S.QUANT . QUANTUM CLOCK * * MOVE USER EXCHANGE PACKAGE * SX0 PACKBUF SA0 S.FSWAP + WE 16 RJ E.ECS SA0 B1+P.XPACK + RE 16 RJ E.ECS * * RESTORE OWN AXCHANGE PACKAGE SX6 FORSWAP P-COUNTER LX6 36 SA6 S.FSWAP BX6 X6-X6 RA SA6 A6+1 SB5 36 SA1 S.CMFL LX6 X1,B5 SA6 A6+1 SA1 S.ECSRA LX6 X1,B5 SA6 A6+2 SA1 S.ECSFL LX6 X1,B5 SA6 A6+1 ******* SEQUENCE INTO ^SWAPOUT^ ***** * EJECT * ENTRY SWAPOUT * * SWAPOUT BX6 X6-X6 STOP PPU CHECKING OF RA+1 SB7 SWAPOUT1 CALL SCHEDULER FOR NEXT PROCESS SA6 S.USERA SX6 1 SET INTERRUPT LOCKOUT FOR SCHEDULER SA6 I.LOCK SA6 2 SET SWAP FLAG SX6 0 SA6 E.ECS JP PRODUCE CALL SCHEDULER * SWAPOUT1 BX6 X6-X6 CLEAR PPU LOCK OUT SA6 I.LOCK SA3 B1+P.ROHEAD LX3 6+36 MX6 39 SX0 X3+0 READ MOT OF CURRENT PROCESS SA0 B1+0 + RE 1 RJ E.ECS SA3 A0 SB5 B0 INSURE B5 IS NON-NEGATIVE FOR MAPOUT BX6 -X6*X3 BX7 X1 SAVE STUFF ABOUT NEW PROCESS SA6 B1+P.SCR2 . SAVE ECS ADDR. OF CURRENT PROC SA7 S.SAVE1 BX6 X2 * MX7 1 . SET HIGH ORDER OF TIMER = 4000B TO * STOP PPU INCREMENTING IT SA6 S.SAVE2 SAVE NEW QUANTUM SA7 S.QUANT * * SWAPOUT ALL MAPS * SA1 B1+P.MAPSIN SB7 SWAPOUT3 ASSUME B7 PRESERVED BY ^MAPOUT^ MX2 1 LX2 59 SB3 B0 INSURE B3 AND B4 ARE NON-NEGATIVE SB4 B0 FOR MAPOUT * * SWAPOUT2 SA3 B1+X1 CLEAR MAP IN FLAG BX6 -X2*X3 SA6 A3 SB2 A3 SAVE ABS CM ADDR OF PTR TO NEXT MAP SA5 A3+3 GET POINTERS TO MAP JP MAPOUT * SWAPOUT3 SA1 B2+7 NZ X1,SWAPOUT2 * * WRITE OUT READ/WRITE DISCRIPTOR * SA1 B1+P.SCR2 . RECOVER ECS ADDR OF PROC SX2 P.PROCRO IX0 X1+X2 ADD LEN OF R/O DISCRIPTOR SA0 B1+P.RWHEAD + WE P.PROCRW RJ E.ECS * * WRITE OUT PROCESS VARIABLE DISCRIPTOR * SA3 B1+P.ROHEAD+1 SB2 X3 LX3 6+36 SX3 X3 IX0 X1+X3 SA3 B1+P.CTABLE LX3 6+18+1 SX3 X3+P.LOCALC SA0 B1+X3 + WE B2 RJ E.ECS * * DO PROCESS READ ONLY DISCRIPTOR * SX6 1 LOCK OUT PPU INTERRUPTS SA6 I.LOCK BX0 X1 MX2 1 CLEAR ^INCORE^ FLAG LX2 60-6 SA0 B1 + RE 1 RJ E.ECS SA3 A0 BX6 -X2*X3 SA6 A0+0 + WE 1 RJ E.ECS BX6 X6-X6 SA6 I.LOCK * * UPDATE CLOCKS * SA1 S.CHARG SA2 S.OLDTM SA3 B1+P.SWPTIM USER TOTAL SWAP TIME BX6 X1 SA6 A2 IX5 X1-X2 IX7 X5+X3 SA4 S.SWPTM SYSTEM TOTAL SWAP TIME SA7 A3 IX6 X5+X4 SA6 A4+0 * * WRITE OUT USER CLOCKS * SX2 P.USRTIM-P.ROHEAD IX0 X0+X2 SA0 B1+P.USRTIM + WE 3 RJ E.ECS * * END OF SWAP OUT STUFF................................ * * *******SEQUENCE TO SWAPIN ****** SPACE 5 * CODE TO SWAP IN A NEW PROCESS TO RUN * * ENTERED FROM SWAPOUT * ENTRY SWAPIN EXT SYSRET * * SET QUANTUM CLOCK * SWAPIN SA1 S.SAVE2 RECOVER SAVED QUANTUM * * GET 1ST WD OF PROCESS DISCRIPTOR * SA3 S.SAVE1 RECOVER SAVED ECS ADDR OF PROC ZR X3,NOPROC JP IF NO PROCESS TO RUN SA0 S.SAVE2 USE S.SAVE2 AS SCRATCH BX0 X3 BX6 -X1 SA6 S.QUANT SET INTERVAL TIMER * SX6 1 LOCT OUT PPU INTERRUPTS SA6 I.LOCK + RE 1 READ 1ST WD OF PROCESS DISCRIPTOR RJ E.ECS SA1 A0 SET ^INCORE^ NOW IN ECS MX6 1 LX6 60-6 BX6 X1+X6 SA6 A0 + WE 1 RJ E.ECS BX6 X6-X6 RELEASE PPU INTERRUPT LOCKOUT SA6 I.LOCK * * COMPUTE B1 FOR PROCESS SB2 X1 SA2 S.CMFL SB1 X2 SB1 B1-B2 SX6 B1 SAVE USER B1 IN CASE OF QUANTUM INT SA6 S.USRB1 SET IN SYSTEM CELLS SX6 S.RETU SET STANDARD RETURN SA6 S.SAVE2 * * READ IN PROC READ ONLY AND PROC READ/WRITE DISCRIPT SA0 B1+P.ROHEAD + RE P.PROCRO+P.PROCRW RJ E.ECS * * * READ PROC VARIABLE LEN DISCRIPTOR * SA2 B1+P.ROHEAD+1 SB2 X2 LEN OF PROC VAR DISC LX2 6+36 SX2 X2+0 ORIG OF VAR DISC IN ECS IX0 X0+X2 SA2 B1+P.CTABLE COMPUTE ROOM FOR LOCAL C-LIXT BUFFER LX2 6+18+1 SX2 X2+P.LOCALC SA0 B1+X2 + RE B2 READ IT IN RJ E.ECS * * * CHECK FOR EXTRA STUFF TO DO NG X1,SWAPIN7 JP IF STUFF PENDING * SWAPIN0 BSS 0 * * BRING IN FULL PATH * SWAPIN1 SA1 B1+P.STACK GET TOP OF PATH ANDCURR SUBP FROM SA1 B1+X1 THE TOP OF THE STACK SB2 X1 CURRENT SUBP INDEX LX1 6+36 SB3 X1 TOP OF PATH INDEX MX2 1 MASK FOR ADDING MAP IN FLAG LX2 60-1 SB4 P.MAPSIN SB7 SWAPIN2 SB5 B3 SAVE TOP OF PATH * SWAPIN2 SA1 B1+B3 WD 0 OF CURR SUBP OF INTEREST BX6 X2+X1 SET MAP IN FALG SA6 A1+0 SX7 B3 CHAIN INTO MAP CHAIN SA7 B1+B4 SB4 B3+7 INCREMENT MAP CHAIN POINTER NE B3,B2,SWAPIN3 CHECK FOR END OF PATH SB7 SWAPIN4 SWAPIN3 SA5 A1+3 GET POINTERS FOR ^MAPIN^ SB3 X1+0 STEP CURRENT CUBP OF INTEREST JP MAPIN * SWAPIN4 BX6 X6-X6 STORE 0 AT END OF MAP CHAIN SA6 B1+B4 * * DO DIRECT ECS ACCESS MAP * B2 = CURRENT SUBPROCESS * SA1 B1+P.XPACK+4 CLEAR OUT ECSRA AND ECSFL SA2 B1+P.XPACK+5 MX7 24 BX1 -X7*X1 BX2 -X7*X2 SB3 B2+3 SA3 B1+B3 GET POINTER TO MAP FOR CURRENT SUBP SX3 X3+1 SA3 B1+X3 1ST DATA WD OF COMPILED MAP LX3 1 PL X3,SWPIN44 SKIP IF NO ECS ACCESS LX3 23 GET ECS RA MX7 39 BX6 -X7*X3 LX6 36 SA4 S.ECSRA IX6 X6+X4 BX1 X6+X1 LX3 36 GET ECS FL LX6 36 SX6 X3+0 BX2 X6+X2 SWPIN44 BX6 X1 STORE ECS RA AND ECS FL BX7 X2 SA6 A1 SA7 A2 * * BRING IN LOCAL C-LIST * SA1 B1+B2 SA3 A1+5 SX0 X3 SA0 B1 SA4 A1+4 GET C-LIST LENGTH LX4 1 MX5 39 * + RE 1 READ MOT ENTRY AND CHECK UNIQUE NAME RJ E.ECS * SA2 A0 BX3 X3-X2 BX3 X5*X3 SB3 X4 NZ X3,SWPIN13 LOCAL C-LIST MISSING - KILL PROCESS BX0 -X5*X2 SA2 B1+P.XPACK+1 GET RA WORD FROM EXCHANGE PACKAGE SA0 B1+P.LOCALC-1 + RE B3+1 READ IN LOCAL C-LIST RJ E.ECS * * * FIX UP EXCHANGE PACKAGE (X1 = WD O OF SUBP ) LX1 6+36 SX7 X1+B1 SA7 S.USERA SET USER RA FOR PPU LX7 36 MX5 6+18 MASK FOR USE WITH EXCHANGE PACKAGE SA3 B1+P.XPACK+2 BX2 -X5*X2 CLEAR OUT OLD RA BX6 X2+X7 SA6 A2 STORE FIXED UP RA SX7 X1 SA4 B1+B5 WD 0 OF TOP OF PATH DISCRIPTOR LX4 6+18 SX6 X4 RA+FL OF TOP OF PATH (REL B1) IX6 X6-X7 LX6 36 SA4 B1+P.XPACK+6 MA WORD OF XPACK BX3 -X5*X3 BX6 X3+X6 FIX UP NEW FL SA6 A3 STORE NEW FL SX7 B1+P.XPACK NEW MA BX4 -X5*X4 CLEAR OUT OLD MA LX7 36 BX6 X7+X4 SA6 A4 STORE NEW MA * * * SA1 S.SAVE2 CHECK FOR INTERRUPT PROCESSED NZ X1,SWPIN51 JP IF NO INTERRUPT SX6 S.RETU RESTORE EXIT SA6 A1 * INITIALIZE CORE OF INTERRUPT SUBP SA1 B1+P.STACK SA1 B1+X1 SB2 X1 CURRENT (INTERRUPT) SUBPROCESS SA2 A1-2 SX2 X2 CALLER (SORT OF ) SB6 SWPIN50 RETURN LINK JP SUBPCOR * * SWPIN50 SB4 B2+4 GET INTERRUPT DATA SA1 B1+B4 LX1 6+18 SX6 X1 SA6 A6-3 STORE INTERRUPT DATA IN SUBP CORE SWPIN51 BSS 0 * * INCREMENT CLOCKS * SWAPIN5 SA1 S.CHARG SA2 S.OLDTM SA3 B1+P.SWPTIM USER TOTAL SWAP TIME BX6 X1 SA6 A2 IX5 X1-X2 IX7 X5+X3 SA4 S.SWPTM SYSTEM TOTAL SWAP TIME SA7 A3 IX6 X5+X4 SA6 A4+0 * * TRANSFER TO THE USER SA1 S.SAVE2 RETURN TO USER SB6 X1 SX6 0 SET RUNNING USER SA6 2 SX6 0 SA6 E.ECS JP B6 * * * NOPROC SB7 NOPROC1 CALL SCHEDULER SB6 I.PAUSE PAUSE TIME FOR PPU INTERRUPTS NOPROC2 SB6 B6-1 NE B6,B0,NOPROC2 SX6 1 LOCK OUT INTERRUPTS FOR SCHEDULER SA6 I.LOCK SX6 4 SA6 2 SET TO IDLE SX6 0 SA6 E.ECS SA1 S.CHARG SA2 S.OLDTM SA3 S.IDLTM BX6 X1 SA6 A2 IX5 X1-X2 IX7 X3+X5 SA7 A3 * JP PRODUCE NOPROC1 BX6 X6-X6 SA6 I.LOCK CLEAR LOCK ZR X1,NOPROC BX6 X1 GOT A PROCESS BX7 X2 SA6 S.SAVE1 SA7 S.SAVE2 * UPDATE IDLE TIME CLOCK SA1 S.CHARG SA2 S.OLDTM SA3 S.IDLTM BX6 X1 SA6 A2 IX5 X1-X2 IX7 X3+X5 SA7 A3 JP SWAPIN * * SOMETHING PENDING ON SWAPIN * SWAPIN7 LX1 1 NG X1,SWPIN10 WAKE UP WAITING (EVENT CHANNEL STUFF) SWAPIN8 LX1 2 NG X1,SWPIN12 INTERRUPT TO PROCESS SWAPIN9 LX1 1 NG X1,SWPIN13 DESTROY TIME LX1 3 NG X1,SWPIN20 EVENT TO PROCESS SWPIN19 SA1 S.SAVE1 RESET FLAGS IN ECS BX0 X1 ECS ADDR PROCESS SA0 B1+P.ROHEAD SX6 1 SET INTERRUPT LOCK OUT SA6 I.LOCK + RE 1 RJ E.ECS SA1 A0 SX2 6620B LX2 36+12 BX6 -X2*X1 SA6 A0 + WE 1 RJ E.ECS BX6 X6-X6 CLEAR INTERRUPT LOCK OUT SA6 I.LOCK JP SWAPIN0 * * * MUST UNCHAIN FROM EVENT CHANNELA * EXT UNCHAIN,I.WAIT RECS MACRO A + RE A RJ =XE.ECS RECS ENDM WECS MACRO A + WE A RJ =XE.ECS WECS ENDM SWPIN10 SA2 S.SAVE1 RECOVER ECS ADDR OF PROCESS SX5 P.PROCRO+P.PROCRW IX5 X2+X5 GET ADDR OF CHAINING WORDS SX4 1 MX7 0 SB6 SWPIN11 RETURN LINK FROM UNCHAIN SX6 1 LOCK OUT INTERUPTS SA6 I.LOCK SWPIN11 BX0 X5 READ A CHAINING WORD SA0 B1 SA2 I.WAIT SEE IF INTERRUPTS ARE PENDING ZR X2,SWPIN15 SA7 I.LOCK UNLOCK INTERRUPTS SB5 I.PAUSE SWPIN17 SA2 I.WAIT WAIT FOR THE INTERRUPT TO OCCUR ZR X2,SWPIN16 HOORAY, IT DID SB5 B5-1 NE B5,B0,SWPIN17 RJ =XDISASTR INTERRUPT FAILED TO OCCUR SWPIN16 SX6 1 RELOCK INTERRUPTS SA6 I.LOCK SWPIN15 RECS 1 SA2 A0 FETCH THE CHAINING WORD SA7 A0 CLEAR AND REWRITE IT IX5 X5+X4 WECS 1 NZ X2,UNCHAIN UNCHAIN UP TO THE ZERO WORD BX6 X6-X6 UNLOCK INTERUPTS AGAIN SA6 I.LOCK JP SWAPIN8 SPACE 5 * * INTERRUPT TO PROCESS * SWPIN302 SB2 A2 SX2 X2 JP SWPIN303 * SWPIN12 SA2 B1+P.STACK CHECK FOR INTERRUPT SA2 B1+X2 IN PATH OF CURRENT SUBPROCESS SB2 B0 SWPIN30 SA2 B1+X2 CURRENT SUBP NG X2,SWPIN302 JP IF COUNG INTERRUPT SUBP SX2 X2 SWPIN303 NZ X2,SWPIN30 LOOP TO ROOT OF SUP TREE EQ B2,B0,SWAPIN9 JP IF NO INTERRUPT * * MUST CALL INTERRUPT SUBP * SA4 B1+P.STACK SX6 2 INCREMENT STACK POINTER IX6 X6+X4 SA3 B2+6 CHECK FOR ROOM IN STACK SX3 X3-1 MAX ALLOWED STACK POINTER SX4 X4 IX3 X3-X4 NG X3,SWAPIN9 JP IF NOT ROOM IN STACK SA3 B1+X4 .CHECK FOR INTERRUPT SAME AS TOP- SB3 B1+X3 OF-STACK AND INTERRUPT INHIBITED NE B3,B2,SWPIN301 LX3 2 NG X3,SWAPIN9 .EXIT IF INTERRUPT INHIBITED SWPIN301 BSS 0 SA6 A4 SA2 B1+P.INTERR DECREMENT SX6 X2-1 SA6 A2 * SA2 B2 RESET INTERRUPT FLAG IN SUBPROCESS MX6 1 BX6 -X6*X2 SA6 A2 SA2 B1+P.XPACK SAVE OLD P-COUNTER IN STACK SB4 B1+X4 ABS ADDR OF OLD TOP OF STACK SA3 B4+1 TOP OF STACK ( WD 1 ) LX2 6+18 SX7 X2 SX6 X3 BX6 X3-X6 CLEAR OLD P-COUNTER BX6 X6+X7 SA6 A3 BX2 X2-X7 CLEAR OLD P-COUNTER SA4 B2+2 GET NEW P-COUNTER LX4 6+18 SX7 X4-2 OFFSET ENTRY POINT TO INDICATE * INTERRUPT CALL BX6 X2+X7 LX6 36 SA6 A2 * SA2 B4 * CHECK FOR EVENT ALSO MX6 1 LX6 60-4 BX6 X6*X1 NZ X6,SWPIN35 JP IF NOT TO SET INTERRUPT FLAG * MX6 1 SET ^INTERRUPTES^ FLAG IN STACK LX6 60-1 BX6 X2+X6 SA6 A2 SWPIN35 LX2 6+36 FORM NEW STACK ENTRY SX6 X2 NEW TOP OF PATH = OLD TOP OF PATH LX6 18 SA7 B4+3 SET P-COUNTER IN NEW STACK ENTRY SB2 B2-B1 SX7 B2 NEW (INTERRUPT) SUBPROCESS BX7 X6+X7 MX4 1 LX4 60-2 BX7 X7+X4 SA7 B4+2 NEW STACK ENTRY * * FORM FULL C-TABLE * SA4 B1+P.CTABLE ORIG OF FULL C-TABLE SB3 B1+X4 SB2 B1+B2 ABS ORIG OF CURRENT (INTERRUPT) SUBP LX6 6+36 BX4 X6 BX6 X6-X6 INNITIALIZE C-TABLE POINTER SA6 B3 * SWPIN121 SB4 X4+B1 ABS ORIG OF SUBP OF INTEREST SA2 B4+5 GET C-LIST UNIQUE NAME AND MOT INDEX BX6 X2 SA6 A6-1 SA3 B4+4 GET C-LIST LENGTH SX6 X3 SA6 A6-1 SA4 B4 NE B2,B4,SWPIN121 LOOP UNTIL FINISHED W/ FULL PATH * SB3 A6-B1 SET P.CLIST SX6 B3 SA6 B1+P.CLIST * * BX6 X6-X6 SET FLAG FORLATER IN SWAPIN SA6 S.SAVE2 JP SWAPIN9 SPACE 5 * EXT DESCHED EXT DELOBJ * * DESTROY THIS PROCESS * SWPIN13 SA1 B1+P.ROHEAD DESCHEDULE THIS PROCESS LX1 6+36 SX1 X1 SB7 SWPIN130 SX6 1 SET INTERRUPT LOCK SA6 I.LOCK JP DESCHED * SWPIN130 BX6 X6-X6 RELEASE INTERRUPT LOCK SA6 I.LOCK * * RESET REFERENCE COUNTS OF ALL MAPS * EXT REFER SA1 B1+P.SUBPDT LX1 6+36 SX6 X1+3 1ST SUBP +3 SA6 B1+P.TEMP1 SAVE CURRENT SUBP SA1 B1+X6 LX1 6+36 SX6 X1-3 SA6 B1+P.TEMP2 SAVE CURRENT LOG MAP POINTER SB4 SWPIN133 SB6 B4 SB7 B4 MX5 59 DECREMENT REFERENCE COUNTS * SWPIN133 SA1 B1+P.TEMP2 SX1 X1+3 SWPIN134 SA2 B1+X1 NZ X2,SWPIN135 JP IF GET SWAP DIRECTIVE NG X2,SWPIN136 JP IF END OF LOG MAP SX1 X1+3 INCREMENT LOG MAP POINTER JP SWPIN134 SWPIN135 SX4 377777B SET HUGE FL BX6 X1 SA6 A1 JP REFER * SWPIN136 SA1 B1+P.TEMP1 MUST DO NEXT SUBP SX1 X1+8 SA2 B1+P.SUBPDT LX2 6+18 SX2 X2 LAST SUBP+9 IX2 X2-X1 NG X2,SWPIN137 JP IF DONE BX6 X1 SA6 A1 SA1 B1+X1 GET POINTER TO LOG MAP LX1 6+36 SX6 X1-3 SA6 B1+P.TEMP2 SAVE LOG MAP SWP DIR PTR JP SWPIN133 * * * SWPIN137 SA1 B1+P.ROHEAD CONSTRUCT WD 2 OF LX1 6+36 CAPABILITY TO DESTROY OPBJECT SX0 X1 SA0 B1 + RE 1 RJ E.ECS * SA2 A0 MOT ENTRY FOR THIS PROCESS MX6 39 BX5 X6*X2 BX5 X5+X0 * SB7 SWPIN131 JP DELOBJ DESTROY THE PROCESS * SWPIN131 SX6 1 CALL SCHEDULER SA6 I.LOCK SB7 SWPIN132 JP PRODUCE * SWPIN132 BX6 X6-X6 SA6 I.LOCK BX6 X1 SAVE NEW PROCESS NAME BX7 X2 SAVE NEW PROCESS QUANTUM SA6 S.SAVE1 SA7 S.SAVE2 JP SWAPIN SPACE 4 EXT SUBPCOR SWPIN20 SA5 S.SAVE2 CHECK FOR INTERRUPT STRIKING ZR X5,SWPIN19 DO NOT RESET EXIT IF ENTERRUPT SX6 SYSRET SA6 S.SAVE2 JP SWPIN19 END