diff --git a/src/system/dedefs.2 b/src/system/dedefs.2 new file mode 100644 index 00000000..ac0c41e3 --- /dev/null +++ b/src/system/dedefs.2 @@ -0,0 +1,30 @@ +%devec==120 ;Interrupt vector + +%debas==774510 ;Register base address, on UBA3 + +%decr0=%debas ;PCSR0 + %dgpcb==000001 ;Get PCB address + %dgcmd==000002 ;Execute command + %dtest==000003 ;Self test + %dstrt==000004 ;Start + %dboot==000005 ;Boot + %dpdmd==000010 ;Polling demand + %dstop==000017 ;Stop + %drset==000040 ;Reset + %dinte==000100 ;Enable interrupts + %dintr==000200 ;Interrupt + %dusci==000400 ;Unsolicited state change + %drcbi==002000 ;Receive buffer unavailable + %ddni ==004000 ;Done + %dtxi ==010000 ;Transmit + %drxi ==020000 ;Receive + %deri ==040000 ;Command error + %deri ==100000 ;Status error + +%decr1=%debas+2 ;PCSR1 + %dxpwr==100000 ;Transciever power ok + %dicab==040000 ;Link ok + %dpcto==000200 ;Port command time-out + +%decr2=%debas+4 ;PCSR2 +%decr3=%debas+6 ;PCSR3 diff --git a/src/system/deuna.1 b/src/system/deuna.1 new file mode 100644 index 00000000..b841b68f --- /dev/null +++ b/src/system/deuna.1 @@ -0,0 +1,8 @@ +; DEUNA/DELUA SERVICE ROUTINE + + EBLK +DEBRK: 0 + BBLK + JSR UTCSAV + ;IODRI A,%DECR0 + JRST DEEX diff --git a/src/system/deuna.6 b/src/system/deuna.6 new file mode 100644 index 00000000..ee79ca62 --- /dev/null +++ b/src/system/deuna.6 @@ -0,0 +1,13 @@ +; DEUNA/DELUA SERVICE ROUTINE + +$INSRT DEDEFS + +DECNT: 0 + + EBLK +DEBRK: 0 + BBLK + JSR UTCSAV + ;AOS DECNT + IORDI A,%DECR0 + JRST DEEX diff --git a/src/system/its.1648 b/src/system/its.1649 similarity index 99% rename from src/system/its.1648 rename to src/system/its.1649 index 846fd131..06df4f29 100644 --- a/src/system/its.1648 +++ b/src/system/its.1649 @@ -15982,6 +15982,7 @@ IFN NUNITS,[ $INSRT UTAPE ] +$INSRT DEUNA $INSRT DISK IFN NETP,[ ; General ITS network code, includes specific nets @@ -19179,6 +19180,7 @@ IFN TM03S,[ SKIPN MGTBZY JRST MGSBRK ] +DEEX: IMPEX: MGEX: DSKEX: MOVSI U,UTACS @@ -19509,6 +19511,7 @@ UBAIIT: .MAX.==0 IF2, .BAS.==UBAIIB +UBINT 120, JSR DEBRK ; DEUNA/DELUA IFE TM03S, UBIDV 224 ; Tape UBIDV 300 ; NI1010 In UBIDV 304 ; NI1010 Out diff --git a/src/system/its.1650 b/src/system/its.1650 new file mode 100644 index 00000000..06df4f29 --- /dev/null +++ b/src/system/its.1650 @@ -0,0 +1,21944 @@ +;-*-MIDAS-*- +;;; Copyright (c) 1999 Massachusetts Institute of Technology +;;; See the COPYING file at the top-level directory of this project. + +.SYMTAB 12003.,5500. +TITLE ITS + +SUBTTL DEFINITIONS + +.NSTGWD .SEE PATB ;NO STORAGE WORDS ALLOWED UNTIL PATB + +IF1 [ PRINTX \MACHINE NAME = \ +;WELL-KNOWN MACHINE NAMES ARE: +; AIKA AI LAB KA10 (R.I.P.) +; MLKA MATHLAB KA10 (R.I.P.) +; DM DYNAMIC MODELING KA10 (R.I.P.) +; MC Mail Computer KS10 +; AI AI Lab KS10 +; MX The ex-MC KL10 +; ML Math Lab KS10 +; MD Mostly Development KS10 +; SI Stacken ITS KS10 +; FU Australian KS10 +; PM PandaMonium KS10 +; DX DigeX KS10 +; NX Non-eXistent KS10 (KLH10) +;THE FILE "CONFIG" HAS ASSEMBLY SWITCHES AS A FUNCTION OF MACHINE. + +.TTYMAC A +IFN ASCII/A/&ASCII/ /,.FATAL USE UPPER CASE! +DEFINE MCOND X ;0 IFF THIS IS MACHINE X. +,TERMIN +DEFINE MNAME X ;USED TO SUBSTITUTE IN THIS MACHINE'S NAME. +X!!A!!TERMIN +FOO==.TTYFLG ;MAKE ERR FILE LOOK NICE +.TTYFLG==1 +PRINTX/A +/ +.TTYFLG==FOO +TERMIN ];IF1 + +IFNDEF PCLSW,PCLSW==1 ;1 => ASSEMBLE PCLSR TEST FEATURE +IFNDEF TT11BY,TT11BY==8 ;PDP11-TV OUTPUT BUFFER BYTE SIZE. +.MLLIT==1 ;MULTI-LINE LITERAL MODE +ASTIME==.OP .OPER+@,0,.RTIME ;GET ASSEMBLY TIME AND DATE IN SIXBIT. +ASDATE==.OP .OPER+@,0,.RDATE ;RH OF INSN MUST BE 0, SO MIDAS WILL PUT IN PROPER AC FLD. + +;AC DEFS + +A=1 +B=2 +C=3 +D=4 +E=5 +TT=6 +I=7 +Q=10 +J=11 +R=12 +W=13 +H=14 +P=15 ;DO NOT CHANGE! ;PDL POINTER +T=16 ;" +U=17 ;" ;USER INDEX + +.XCREF A,B,C,D,E,TT,I,Q,J,R,W,H,P,T,U + +IF1 EXPUNGE APR,OCT,DEC ;FOR NEW CALENDAR HACK + +NULBLK==4 ;NUMBER OF LOCKED SWITCH BLKS IN USR VARIABLES + ;USES 2 WDS OF USER VAR PER + +NPVSEC==30. ;NUMBER OF SECONDS A USER IS ALLOWED TO BE IN THE PRIVILEDGED SWAPPING CLASS +IF2 LIOBLK==_-10. ;LOWEST BLOCK NEVER TO BE SHUFFLED + ;ALSO MAX # OF BLOCKS SYS JOB MAY HAVE +IF2 MAXJ==/LUBLK ;ROUND UP TO ACTUAL MAX #JOBS + +DIRMAP==1 ;ENABLE DIRECT MAPPING OF HIGH HALF + ;I DON'T THINK IT WORKS TO TURN THIS OFF. +NIOCHN==20 ;NUMBER OF I/O CHANNELS PER USER + +DEFINE $INSRT $%$%$% ;PRINTX MESSAGE WHEN FILE GETS INSERTED + .INSRT $%$%$% > + PRINTX \ ==> INSERTED: \ + .TYO6 .IFNM1 + .TYO 40 + .TYO6 .IFNM2 +PRINTX \ +\ +TERMIN + +;;; CONFIG uses this macro... +DEFINE CONC A,B +A!B!TERMIN + +$INSRT CONFIG ;CONFIGURATION SWITCHES FOR ALL KNOWN MACHINES + +$INSRT BITS ;DEFINITIONS OF MANY BIT NAMES + +;IN BADBTS => CLASS 2 OR 1 INTERRUPT ;IN VBDBTS=> CLASS 1 INTERRUPT +VBDBTS==%PIB42\%PIVAL\%PIBRK\%PIC.Z\%PI1PR\%PITRP\%PIDCL +BADBTS==VBDBTS\%PIMPV\%PIIOC\%PIILO\%PIMAR\%PIDIS\%PIOOB\%PILOS\%PIFET\%PIWRO\%PIPAR\%PITTY\%PIPDL\%PINXI + +UUOMIN==40000,, ;SMALLEST NUM THAT COULD BE A SYSTEM CALL +UUOMAX==50000,, ;ONE GREATER THAN LARGEST NUM " +UIOT=UUOMAX ;USE FOR USER I/O INST TRAP + + ;MAX DYN ALLOC ALLOC IO BUFFERS +MXIOB==100 ;MAX POSSIBLE + +SIOMT==50 ;MAX SIZE TRANSLATION TABLE + +LUPDL==50 ;LENGTH USER PDL MUST BE >= 40 FOR 2311 GC +LUIOP==20 ;LENGTH OF USER IO PDL +CPDLL==40 ;LENGTH CLOCK CHANNEL PDL +LUTCP==40 ;LENGTH UTC PDL (NETWORKS AND DISKS) +LSYSP==100 ;SYSTEM JOB PDL +LTTYP==40 ;LENGTH OF TTY (INTERRUPT LEVEL) PDL + +DMNSZ==20 ;# ENTRIES IN DEMON BUFFER (DMNBF) + +MXCZS==5 ;MAX NUMBER ^Z'S PER CLOCK BREAK + +SCLKI==30. ;60'THS PER SLOW CLOCK +VSCLKI==2*60.*60. ;60'THS PER VERY SLOW CLOCK TICK +MXOPT==8. ;SLOW CLOCK MAX UT OP CAN TAKE +NINFP==8. .SEE UFIN ;MAX # OF DIRECT INFERIORS A PROCEDURE MAY HAVE + +SSCHDB==100 ;LENGTH OF SCHEDULER HISTORY BUFFER + +SPD==60.*60.*24. ;# SECS IN A DAY (FITS IN A HALFWORD) + PDUPS==60. ;# PDCLK INCREMENTS/SEC + +OPNCOM==410300 ;COMMAND FIELD IN LH OF FIRST OPEN WORD + +IFN 340P,N340PB==10. ;# EXEC PGS USED FOR 340 DATA MUST BE EVEN +IFN N11TYS,[ + NTTPG==6 ;# EXEC PGS FOR PDP11 TV TTYS. + NTVBP==11 ;THESE PAGES ADDRESS THE WHOLE VIDEO BUFFER MEMORY ADDRESS + ;SPACE OF THE TV 11. THE LAST OF THESE ADDRESSES THE + ;TV CONSOLE REGISTER +] +NUVPG==256. ;NUMBER OF VIRTUAL PAGES PER USER. SIZE OF PAGE TABLE VARS. + ;DON'T TRY TO CHANGE THIS. +;CIRCULAR PAGE LINK FORM +;2.9=0 +;1.1-1.8 PAGE # +;2.8-1.9 USER # +;2.9=1 +;2.8=0 2.7-1.1 LINK TO MMP TABLE +;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE +;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED + +SUBTTL GOBBLE TTYTYP FILE + +IFN XGP\N11TYS,[IFE TEN11P,[ + .ERR XGP OR N11TYS WITHOUT TEN11P + N11TYS==0 + XGP==0 +] +] +IFNDEF UNSPLP,UNSPLP==*DEMON*<1-TPLP> + ;1 IF THE "UNSPOO" PROGRAM DOES LPT SPOOLING. + +IFNDEF TSYSM,[ +MNAME PRINTX \NO PARAMS KNOWN FOR , MACHINE. +\ +.INSRT TTY: +] + +IF2,[ +;TTY LINES DEFINITIONS + +;MACRO WHICH RETURNS THE %TY BIT FOR THE CONTROLLER ACCORDING TO THE LINE NUMBER + +DEFINE CNTRLR +IRPS F,,[0 NFKSTY NFETY NFNTY NFNVTY NFDZTY NFDPTY NFMTY NFDLTY NFSTTY NF11TY + ]NT,,[NOTYS NKSTYS NETYS NNTYS NNVTTS NDZTYS NDPTYS NMTYS NDLTYS NSTTYS N11TYS + ]FG,,[%TYOTY %TYKST %TYETY %TYNTY %TYNVA %TYDZT %TYDPK %TYMTY %TYDL %TYSTY %TY11T] + IFGE -F,[IFL -,[FG]]TERMIN TERMIN + +;MACRO WHICH RETURNS $TTISP, $TTOSP BITS GIVEN BAUD RATES + +DEFINE SPEEDC +*%TTISP+*%TTOSP!TERMIN + +DEFINE SPEED1 +IRPS BD,,[0 600 110 150 300 1200 1800 2400 4800 9600 25K 40K 50K 80K + ]CD,,[0 1 2 3 4 5 6 7 10 11 12 13 14 15 ] +IFSE BAUD,BD,[CD] TERMIN TERMIN + +;KEYWORD PARAMETERS TO TTY DEFINITION MACROS +; FOR OVER-RIDING DEFAULTS +;SPEED NUMBER OF BAUDS OUTPUT +;ISPEED NUMBER OF BAUDS INPUT IF DIFFERENT +;TT LH(TTTYP) IN ADDITION TO SPEED CODE +;TY RH(TTYTYP) IN ADDITION TO CONTROLLER BIT +;TO LH(TTYOPT) IN ADDITION TO USUAL CODES FOR TERMINAL TYPE +;TP RH(TTYOPT) IN ADDITION TO PAD CODES +;TCT TCTYP +;HOR SCREEN WIDTH +;VER SCREEN HEIGHT +;ROL LINES PER GLITCH WHEN SCROLLING + +;DEFINE TTY AS PRINTING. +;IF SPEED IS 110, ASSUME TTY IS TELETYPE, +;MEANING CAN'T BS, STANDARDIZE ALTMODES. +;IF KA10 CONSOLE TTY OR TK10 TTY, NEED PARITY +DEFINE TTDPRT N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNPRT,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==80.-IFE 110-SPEED,8 +T!N!$VER==MOVE +T!N!$OPT==TO+%TOOVR+%TOALT+IFN 110-SPEED,[%TOMVB+%TOLWR-%TOALT],,<1+IFE 300-SPEED,[IFE TY&<%TYDIL\%TYRLM>,[3]]>*%TPPCR+TP +T!N!$TYP==TT+\\,[%TTPAR]]>,,TY+ +T!N!$TCT==TCT +T!N!$ROL==1 +TERMIN + +;DEFINE TTY AS MEMOREX +DEFINE TTDMRX N,+SPEED=600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==MOVE +T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,4*%TPPLF+6*%TPPCR+TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==%TNMEM +T!N!$ROL==1 +TERMIN + +;DEFINE TTY AS TERMINET. +DEFINE TTDTRM N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==MOVE +T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,5*%TPPLF+TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==%TNTRM +T!N!$ROL==1 +TERMIN + +;DEFINE TTY AS A LPT. +DEFINE TTDLPT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=0,HOR=200.,TCT=%TNPRT,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==MOVE +T!N!$OPT==TO+%TOMVB+%TOOVR,,TP +T!N!$TYP==%TTDDI+TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==1 +TERMIN + +;DEFINE TTY AS AN LA36 DECWRITER. +DEFINE TTDLA36 N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=132.,TCT=%TNPRT,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==MOVE +T!N!$OPT==TO+%TOMVB+%TOOVR+%TOLWR,,TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==1 +TERMIN + +;DEFINE TTY AS IMLAC. (RUNNING SOFTWARE-TTY PROGRAM) +DEFINE TTDIML N,+SPEED=50K,ISPEED=25K,TT=0,TY=0,TO=0,TP=0,HOR=90.,VER=44.,TCT=%TNSFW,ROL=10.,SMARTS=%TQIM1 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOOVR+%TOLWR+%TOMVB+%TOMVU+%TOERS+%TOLID+%TOCID,,TP +T!N!$TYP==%TTDDI+TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE TTY AS VT52 +DEFINE TTDVT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNESC,ROL=1,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS,,TP+%TPPTB* + ;DIRECT POSITIONING LOSES AT 9600 +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE TTY AS H19 +DEFINE TTDH19 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNH19,ROL=1,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3 +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE TTY AS AAA +DEFINE TTDAAA N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+%TPMTA,HOR=80.,VER=48.,TCT=%TNAAA,ROL=1,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*2 +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE TTY AS C100 +DEFINE TTDC100 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=79.,VER=24.,TCT=%TNHDS,ROL=1,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3+ +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE TTY AS TEKTRONIX. +DEFINE TTDTEK N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNTEK,HOR=73.,VER=35.,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVU+%TOOVR+%TOMVB+%TOLWR+%TOMOR,,TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==0 +TERMIN + +;DEFINE TTY AS A LOSING DATAPOINT +DEFINE TTDLSR N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$TCT==%TNODP +T!N!$HOR==71.-IFN MCOND AIKA,1 ;OTHER DATAPOINTS HAVE SHORTER SCREENS. +T!N!$VER==25. +T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP +T!N!$TYP==TT+,,TY+ +T!N!$ROL==1 +TERMIN + +;DEFINE TTY AS DATAPOINT. +DEFINE TTDDPT N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=[72.-IFN MCOND AIKA,[1]],SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$TCT==%TNDP +T!N!$HOR==HOR ;OTHER DATAPOINTS HAVE SHORTER SCREENS. +T!N!$VER==25. +T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP +T!N!$TYP==TT+,,TY+ +T!N!$ROL==1 +TERMIN + +;DEFINE TTY AS A TELERAY 1061 +DEFINE TTDRAY N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$TCT==%TNRAY +T!N!$HOR==HOR +T!N!$VER==24. +T!N!$OPT==TO+%TOMVU+%TOMVB+%TOERS+%TOLWR+%TOLID+%TOCID,,3*%TPPTB+TP +T!N!$TYP==TT+,,TY+ +T!N!$ROL==1 +TERMIN + +;DEFINE A TTY THAT IS A GT40. +DEFINE TTDGT40 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNDP,HOR=72.,VER=32.,ROL=1,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOOVR+%TOLWR,,TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE A TTY THAT IS A LINE TO A PDP11. +DEFINE TTD11 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=0,TCT=%TNPRT,HOR=72.,VER=MOVE,ROL=1,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVB+%TOOVR+%TOALT,,TP +T!N!$TYP==TT+%TTDDI+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE A TTY THAT IS RANDOM. +DEFINE TTDRAN N,+SPEED=FOO.,ISPEED=,TT=0,TY=0,TO=FOO.,TP=FOO.,TCT=FOO.,HOR=FOO.,VER=FOO.,ROL=FOO.,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO,,TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DATAMEDIA +DEFINE TTDDTM N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+3*%TPPCR,HOR=80.,VER=24. +T!N!$SMT==0 +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOLWR+%TOLID+%TOCID,,TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==%TNDTM +T!N!$ROL==1 +TERMIN + +;DEFINE A PDP11 TV COMMUNICATING VIA TEN-11 INTERFACE. NO OPTIONS. +DEFINE TTDTV N +T!N!$SMT==%TQGRF+%TQVIR+%TQREC+%TQXOR+<.DPB 14,<.BP %TQHGT>>+<.DPB 6,<.BP %TQWID>>,,%TRSCN +T!N!$HOR==96. +T!N!$VER==45 +T!N!$OPT==%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC +T!N!$TYP==%TTLCL+,,%TY11T +T!N!$TCT==%TNTV +T!N!$ROL==4 +TERMIN + +;DEFINE A PDP11 TV COMMUNICATING AS A SOFTWARE TTY. TYPICALLY A GRINNELL (512x512). +DEFINE TTDGRN N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPCBS+%TPORS,HOR=86.,VER=50.,TCT=%TNSFW,ROL=0,SMARTS=0 +T!N!$SMT==SMARTS,, +T!N!$HOR==HOR +T!N!$VER==VER +T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI,,TP +T!N!$TYP==TT+,,TY+ +T!N!$TCT==TCT +T!N!$ROL==ROL +TERMIN + +;DEFINE AN STY LINE. NO OPTIONS. +DEFINE TTDSTY N +T!N!$SMT==0,, +T!N!$HOR==81. +T!N!$VER==MOVE +T!N!$OPT==%TOMVB+%TOOVR+%TOLWR+%TORAW,,%TPORS +T!N!$TYP==%TYSTY +T!N!$TCT==%TNPRT +T!N!$ROL==1 +TERMIN + +DEFINE MCONDX MCHN +IFE MCOND MCHN,TERMIN + +;;; THE NEXT TWO MACROS CAUSE TTYTYP FILE TO BE INSERTABLE BY BOTH +;;; PDP-10 AND PDP-11 PROGRAMS. + +DEFINE .ENDC +TERMIN + +DEFINE .ENDR +TERMIN + + .CRFOFF +$INSRT TTYTYP + .CRFON +EXPUNGE TTDPRT,TTDTRM,TTDDPT,TTDMRX,TTDGT40,TTD11,TTDRAN,TTDGRN,TTDVT,TTDTEK +EXPUNGE TTDTV,TTD2741,TTDSTY,TTDLPT,TTDIML,TTDLA36,TTDLSR +EXPUNGE SPEEDC,SPEED1,CNTRLR,MCONDX,.ENDC,.ENDR +] ;END OF IF2 + +SUBTTL BUG MACROLOGY + +;Macro for reporting a bug or other interesting condition +;Use this in place of JRST 4, especially when condition is automatically +;recoverable or wants explanation typed out for benefit of loser. +; +;First argument is one of the following symbols: +; INFO - just print on the system console +; CHECK - same as INFO unless SYSDBG non-zero or buffer full, then same as PAUSE +; PAUSE - print message, go to DDT, allow alt-P +; HALT - print message, go to DDT, do not allow alt-P +; DDT - PAUSE but not because of a bug (shorter message), allow alt-P +; AWFUL - same as HALT but usable when there is no pdl in P +; Should there be a combination of AWFUL and PAUSE? +; That would require restoring P upon attempt to continue +;Arguments after the first are either strings to be printed +;(enclose in brackets), or format,value pairs. Value is any +;address; indexing and indirection are allowed, however registers +;P and TT may not be referenced. +;A format is one of the following symbols: +; OCT - octal number, with ,, if bits on in the left halt +; DEC - decimal number +; THOU - decimal number with commas every three digits +; CR - print a carriage return (unfortunately swallows and ignores an arg) +; SIXBIT - sixbit word +; ASCIZ - asciz string +;Undefined formats will be taken as strings to be printed. +;The maximum number of value arguments is 6 +;A space is printed after each formatted value. A space is also +;printed after the last string and before any additional formatted values. +; +;With no arguments, BUG may be used in place of JRST 4,. +;It uses the same amount of storage but has the advantage of going +;straight to DDT. In this case there won't be a specific message +;about what the bug was, of course. +; +;Note that the BUG macro always generates one word of code, and hence +;may be skipped over. +;All registers are preserved. +;P must point at a valid PDL. +; +;Due to Midas inadequacy, the BUG macro may not be used from inside +;a literal. You will get an error (label inside brackets) if you try it. +; +;Example: +; BUG PAUSE,[DSK: DRIVE NUMBER ],OCT,Q,[IS OFF-LINE.] +; +DEFINE BUG FLAVOR,ARGS/ +IFNB [FLAVOR][ + ;Make sure we are not in a literal, since cannot get value of "." +BUGBUG: EXPUNGE BUGBUG + ;Generate call to appropriate flavour of subroutine + ZZ==0 + IRPS FLA,,[INFO,CHECK,PAUSE,HALT,DDT]SUB,,[BUGINF,BUGCHK,BUGPSE,BUGHLT,BUGDDT] + IFSE [FLAVOR]FLA,[ + PUSHJ P,SUB + ZZ==1 ] + TERMIN + IFSE [FLAVOR]AWFUL, JSR BUGAWF + .ELSE IFE ZZ, .ERR "FLAVOR" UNKNOWN FLAVOUR OF BUG + + BUGB==0 ;Initialize formatting bits + + ;Initialize remote macros +DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003* +ZZ001!ZZ002!ZZ003!TERMIN + +DEFINE BUGMC4 ZZ001 +ZZ001 +TERMIN + + BUGN==0 ;number of accumulated arguments + BUGNN==0 ;total number of arguments + BUGF==0 ;next thing not argument + IRP ARG,,[ARGS] + ;; Processing "ARG" + IFN BUGF,[ ;Address of word to print + BUGN==BUGN+1 + BUGNN==BUGNN+1 + BUGMC5 [ARG] + BUGF==0 + ] + .ELSE [ ;Name of format in which to print? + IRPS FMT,,OCT DEC THOU CR UNUSED5 SIXBIT ASCIZ + IFSE [ARG]FMT,[ + BUGF==1 + BUGB==BUGB+<<.IRPCNT+1>_<<5-BUGNN>*3>> + ] + TERMIN + IFE BUGF,[ ;Just a string to be printed + IFN BUGN,[ ;Say to output some arguments before this string + BUGMC3 BUGN + BUGN==0 + ] + BUGMC2 [ARG] + ] ] + TERMIN + IFG BUGNN-6, .ERR MORE THAN 6 WORDS TO BE PRINTED IN BUG MACRO + ;Make bug table entry: length,,pc ? bits,,string ? args + IF1, BUGMC1 'ZZ==[ASCIZ|',,'|]' + IF2,[ + ZZ==. + LOC BUGTAB+LBUGTB + BUGNN+2,,ZZ + BUGMC1 'BUGB,,[ASCIZ|',,'|]' + BUGMC4 + LOC ZZ + ] + LBUGTB==LBUGTB+BUGNN+2 +];end IFNB +.ELSE PUSHJ P,BUGNIL +TERMIN + +LBUGTB==0 ;Initialize length of bug table + +;This support macro appends a string to the middle argument of BUGMC1 +DEFINE BUGMC2 STRING +BUGMC1 //,[DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003* +ZZ001!ZZ002!]//,STRING!!ZZ003!TERMIN +TERMIN + +;This support macro appends a character, given by number, to the middle +;argument of BUGMC1 +;Only for characters 0 through 7 +DEFINE BUGMC3 #N +IRPC C,,.QUOTE// + IFE .IRPCNT-N,{ + BUGMC2 C + .ISTOP } +TERMIN +TERMIN + +;This one is a simple remote macro +DEFINE BUGMC5 STR +BUGMC4 [DEFINE BUGMC4 ZZ001 +ZZ001]STR +TERMIN +TERMIN + +SUBTTL DEFINE PI CHANNELS + +LPTP==OLPTP+NLPTP+GLPTP ;ANY KIND OF LPT EXCEPT A TTY LPT +IFE NMTCS,[ ;IF NO MAG TAPES AT ALL +TM10A==0 ; CAN'T HAVE ANY KIND! +TM10B==0 +TM03S==0 +] ;IFE NMTCS +TM10P==TM10A+TM10B ;SOME KIND OF A TM10 MAGTAPE PRESENT +IFN TABP,TABCLK==0 ;1=>PUT TABLET ON CLOCK CHNL + +;PRIORITY INTERRUPT CHANNEL ASSIGNMENTS + DCCHN==1 ;DC CHANNEL + DCLOC=40+2*DCCHN ;DC INTERRUPT LOCATION +IFN IMPP, IMPCHN==1 ;IMP STUFF +IFN NETP, NETCHN==2 ;SOFTWARE ACTIVATED... + UTCCHN==2 ;UTC CHANNEL + DSKCHN==UTCCHN ;2314 CHANNEL + MTCCHN==UTCCHN ;MAG TAPE CONTROL CHANNEL + LPTCHN==4 ;LINE PRINTER, PAPER TAPE, ETC. CHANNEL + TTYCHN==3 ;TTY CHANNEL +IFN PLTP, PLTCHN==4 ;PLOTTER CHANNEL +IFN PTRP, PCHCHN==4 ;PTP CHANNEL +IFN PTRP, PTRCHN==4 ;PAPER TAPE READER CHANNEL +IFN NTYP, NTYCHN==4 ;NTY 11 KLUDGE +IFN 340P, SDCHN==4 ;DISPLAY SPECIAL CHANNEL +IFN DSDP, DSDCHN==4 ;INTERRUPT FROM OTHER PROCESSOR +IFN ARMP, TIPBCH==5 ;ARM TIP BREAK CHNL +IFN OMXP, OMPCHN==5 ;OUTPUT MULTIPLEXOR +IFN VIDP, NVDCHN==5 ;NEW VIDI +IFN TABP, IFE TABCLK, TABCHN==5 ;TABLET +IFN 340P\E.SP, DISCHN==6 ;DISPLAY DATA CHNL +IFN CH10P, CHXCHN==5 ;CHAOSNET + ;WOULD BE 6 BUT PI 6 BROKEN IN ML-KA TTLIOB +IFN CH11P, CHXCHN==6 ;UNIBUS CHAOSNET PACKET COPYING +IFN TABP, IFN TABCLK, TABCHN==7 ;TABLET + APRCHN==7 ;DO NOT CHANGE + + PIOFF==400 ;TURN OFF PI SYSTEM + PION==200 ;TURN ON PI SYSTEM + PICOFF==1200 ;TURN OFF PI CHANNEL + PICON==2200 ;TURN ON PI CHANNEL + PICIRQ==4200 ;REQUEST INTERRUPT ON PI CHANNEL + CLKON==2201 ;ABSOLUTE + CLKOFF==1201 +IFN OMXP, OMXON==CLKON\<400_-OMPCHN-1> +IFN OMXP, OMXOFF==CLKOFF\<400_-OMPCHN-1> + LPTON==CLKON\<400_-LPTCHN-1> + LPTOFF==CLKOFF\<400_-LPTCHN-1> +IFN PTRP, PTPON==CLKON\<400_-PCHCHN-1> +IFN PTRP, PTROFF==CLKOFF\<400_-PCHCHN-1> +IFN PTRP, PTRON==CLKON\<400_-PTRCHN-1> +IFN PTRP, PTROFF==CLKOFF\<400_-PTRCHN-1> + TTYON==CLKON\<400_-TTYCHN-1> + TTYOFF==CLKOFF\<400_-TTYCHN-1> + UTCON==CLKON\<400_-UTCCHN-1> + UTCOFF==CLKOFF\<400_-UTCCHN-1> +IFN NETP, NETON==UTCON +IFN NETP, NETOFF==UTCOFF +IFN KL10P, DTEON==CLKON +IFN KL10P, DTEOFF==CLKOFF + + DSKRQ==PICIRQ\PICON\<200_-DSKCHN> ;RQ INT + TURN ON FOR SAKE OF KL + MTCRQ==PICIRQ\PICON\<200_-MTCCHN> + UTCRQ==PICIRQ\PICON\<200_-UTCCHN> + TTYRQ==PICIRQ\PICON\<200_-TTYCHN> + CLKRQ==PICIRQ\PICON\<200_-APRCHN> +IFN NETP,NETRQ==PICIRQ\PION\<200_-NETCHN> +IFN CH11P,CHXRQ==PICIRQ\PICON\<200_-CHXCHN> + +IFN TABP,[ +IFN TABCLK,[ +TABON==CLKON +TABOFF==CLKOFF +] +IFE TABCLK,[ +TABON==CLKON\<400_-TABCHN-1> +TABOFF==CLKOFF\<400_-TABCHN-1> +] +] + +IFN NUNITS, IFE NEWDTP, CUINT==5000+UTCCHN ;CONO TO UTC TO ACTIVATE UTAPE INTERRUPT + +PMLCAD==(.BP ) ;BYTE POINTER TO L.H. REAL CORE ADR +PMRCAD==(.BP PMRCM) ;BYTE POINTER TO R.H. REAL CORE ADR + +SUBTTL DEFINE DEVICE CODES, IOBFT CHNL NUMBERS + +IFN STKP, STK==70 ;STANFORD KEYBOARD +IFN OLPTP, OLPT==124 ;LINE PRINTER +IFN NLPTP, NLPT==464 +IFN TM10P, MTC==340 ;MAG TAPE CONTROL +IFN TM10P, MTS==344 ;MAG TAPE STATUS +IFN VIDP, NVDX==620 ;NEW VIDI X +IFN VIDP, NVDY==624 ;NEW VIDI Y +IFN VIDP, NVDT==630 ;NEW VIDI T (DEFLECTION DELAY) +IFN PLTP, PLT==654 ;CAL COMP PLOTTER +IFN HCLKP, CLK1==710 ;HOLLOWAY CLOCK +IFN HCLKP, CLK2==714 ; " +IFN IMXP, MPX==574 ;INPUT MULTIPLEXOR +IFN OMXP, OMPX==570 ;OUTPUT MULTIPLEXOR +IFN TK10P\NTYP, NTY==600 ;KNIGHT TTY KLUDGE +IFN MTYP, MTY==400 +IFN DL10P, DLB==60 ;DL10 BASE +.ALSO DLC==64 ;DL10 CONTROL +IFN PDCLKP, PDCLK==500 ;DE-CORIOLIS CLOCK (FOR ML-KA AND DM, CALENDAR CLOCK) +IFN DSDP, DSDEV==20 ;DE SELECTION AND INTER COM DEVICE +IFN DSDP, DSDEVN==24 ;DE SELECTION DEV (FOR DEVICES YOU DATAO DEV CODE TO DSDEVN) +IFN ARMP, TIPDEV==504 ;TIP BREAK DEVICE +IFN RBTCP, RBTCON==514 ;ROBOT CONSOLE +IFN DPKPP, DPK==604 ;DATA POINT KLUDGE +IFN DC10P, DC0==610 ;2314 DISK CONTROL +IFN DC10P, DC1==614 ;2314 DISK CONTROL +IFN RP10P, DPC==250 ;RP10 DISK CONTROL +IFN RH10P, DSK==270 ;RH10 DISK CONTROL +IFN KAIMP, IMP==460 ; AI-KA/ML-KA/MC-KL IMP interface +IFN DMIMP, FI==424 ; DM IMP hardware +IFN NUNITS,[ +IFN NEWDTP,[ + DTC==320 + DTS==324 +] ;END OF IFN NEWDTP +] ;END OF IFN NUNITS + + +;IOBFT CHANNEL NUMBERS - 77 MEANS "FREE" + +IFN NUNITS, NUTIC==8 ;NUMBER UT IN CHNLS +.ELSE NUTIC==0 +IFN NUNITS, NUTOC==8 ;NUMBER UT OUT CHNLS +.ELSE NUTOC==0 + NFCLC==NUTIC+NUTOC+1 ;# OF FIRST CORE LINK CHNL + NCLCH==14 ;NUMBER CORE LINK CHNLS + NFNETC==NFCLC+NCLCH ;# OF FIRST NCP NET CHNL (if any) + ;NNETCH DEFINED IN CONFIG +IFG NFNETC+NNETCH-77, .ERR TOO MANY IOBFT CHANNELS + +SUBTTL RANDOM DEFINITIONS FOR I/O DEVICES + +IFN DSDP, IFN VIDP, DSNVID==200000,, ;DEASSIGN BIT FOR NVD +IFN DSDP, IFN 340P, DSNDIS==4000,, ;DEASSIGN BIT FOR DIS +IFN DSDP, IFN NMTCS, DSMTC==1,, ;DEASSIGN BIT FOR MAG TAPE + +IFN RBTCP, RLTSWC==17 ;ROBOT CONSOLE SELECT FOR LIGHTS AND SWITCHES +IFN RBTCP, IFN TABP, RTABC==16 ;ROBOT CONSOLE SELECT FOR TABLET + +IFN IMXP, LCHN==177 ;MULTIPLEXOR LIMIT ON READ IN + + NUDCH==14 ;NUMBER DIRECTORY CHNLS +IFN IMXP, NPOTCH==20. ;NUMBER POT CHANNELS +IFG NQCHN+1+NQS-77, .ERR MORE THAN 6 BITS OF DISK CHANNEL NUMBER + +IFN CODP, CODBFL==5 ;CODE BUFFER +IFN PTRP, PUNSIZ==20 ;PTP BUF SIZ +IFN PTRP, REDSIZ==200 ;PTR BUF SIZ +IFN PLTP, LPLBUF==200 ;PLT BUF SIZ +IFN LPTP, LPTBSZ==1000 ;LPT BUF SIZ +IFN VIDP, NVDLNG==340 ;NVD BUF SIZE +IFN TPLP, TPLBSZ==100 ;TPL BUFFER SIZE IN SYS JOB +IFN TABP, LTABBF==100 ;TABLET BUFFER +IFN N11TYS, TT11CR==764044 ;UNIBUS ADR OF TV11 CONSOLE REG + +EOFCH==3 ;SYSTEM END OF FILE CHR +EOFWRD=REPEAT 5,[EOFCH_<.RPCNT*7+1>\]0 ;WORD OF EOFCH'S + +IFN 340P, DVEF==4000 ;DISPLAY VERTICAL EDGE FLAG +IFN 340P, DHEF==1000 ;DISPLAY HOR EDGE FLAG + +IFN 340P, EWRT==400./12. ;EQIV "COST" IN DISPLAY WRDS FOR TRIP THRU RECYC +IFN 340P, MDISWD=70000 ;MAX # WDS SENT TO SCOPE IN 1/2 SEC + +NSWPV==E.SP\340P+VIDP+IMXP ;# OF DEVICES THAT CAN SWAPIN PAGES + +IFN C1MXP,[ +IFN NMTCS, MAGLOC==76 ;INTERRUPT LOCS FOR MAGTAPE +IFN NUNITS, DCMLOC==74 ;" " FOR DC +IFN IMXP, IMXLC==66 ;" " IMX +IFN IMPP,[ + IMPILC==70 ;INPUT FROM IMP + IMPOLC==72 ;OUTPUT TO IMP +] +] + +IFE C1MXP,[ +IFN NMTCS, MAGLOC==42 +IFN NUNITS, DCMLOC==42 +] +IFN PLTP,[ +;PLOTTER CONTROL BITS +SD==4000 +PD==10000 +PUP==200 +PDN==400 +SDC==20000 +PDC==40000 +SDS==1000 +PDS==2000 +] + IFN KA10P,[ + +SUBTTL STUFF PECULIAR TO KA-10 PROCESSOR + +;;;PAGING BOX INSTRUCTIONS + +LPM=102000,, ;LOAD PG MEM STATE VECTOR DONT CLR ASSOC MEM +LPMR= LPM 2, ;CLEAR ASSOC MEM AND LOAD +SPM= LPM 1, ;STORE PG MEM STATE VECTOR +LPMRI=LPM 6, ;LOAD PM, CLEAR ASSOC REG, AND CAUSE INTERRUPT +EXPGNG==4 .SEE UPQUAN ;4 TO TURN ON EXEC PAGING +XCTR=103000,, ;EXECUTE INSTRUCTION WITH MAPPING CONTROLLED BY AC FIELD + ;VIOLATION CAUSES USER MEM PROTECT INTERRUPT UNLESS INHIBITED + ;VIOLATION ALSO SKIPS BUT THIS IS OF NO CONSEQUENCE UNLESS + ;INTERRUPT IS INHIBITED SINCE PC WILL BE RESET FROM OPC +XCTRI= XCTR 4, ;XCTR WITH PAGE FAULT INHIBITED (SKIPS ON FAULT) + ; AC FIELD VALUES FOR XCTR AND XCTRI + XR==1 ;MAP READ MAIN OPERAND OF SIMPLE INSTRUCTION (MOVE, SKIPL, HLL) + XW==2 ;MAP WRITE MAIN OPERAND OF SIMPLE INSTRUCTION (MOVEM) + XRW==3 ;MAP READ/WRITE OPERAND OF SIMPLE INSTRUCTION (E.G. IORM) + XBYTE==3;MAP BYTE DATA AND BYTE POINTER (ILDB, IDPB) + XBR==1 ;MAP BLT READ + XBW==2 ;MAP BLT WRITE + XBRW==3 ;MAP BOTH OPERANDS OF BLT + ;KA10 PAGING BOX GOES BY WHETHER IT'S A READ OR WRITE (OR RW) CYCLE + ;KL10 PAGING BOX WORKS DIFFERENTLY (SEE BELOW) + ;DO NOT USE MULTI-OPERAND INSTRUCTIONS (DMOVE, PUSH, ETC.) WITH XCTR + +DEFINE CLRPGM U ;CLEAR PAGER ASSOCIATIVE MEMORY. ARG IS USUALLY "(U)". + SPM UPGML!U ;STORE SO DON'T LOSE QUANTUM TIMER + LPMR UPGML!U +TERMIN + +;;; MISCELLANEOUS BUILTIN I/O DEVICES + +PI==4 ;INTERRUPT SYSTEM +LIGHTS==PI ;DEVICE CODE FOR DATAO THAT SETS CONSOLE LIGHTS. +CLK==0 ;DEVICE CODE FOR 60 HZ CLOCK INTERRUPT (APR) +CLKINT==1000 ;CONI CLK, BIT FOR INTERRUPT. ALSO CONO BIT TO CLEAR. +PTR==104 ;PAPER TAPE READER +PTP==100 ;PAPER TAPE PUNCH +TTY==120 ;CONSOLE TTY +DTC==320 ;DECTAPE CONTROL +IFN 340P, DIS==130 ;340 DISPLAY + +PI0LOC==40 ;INTERRUPT VECTOR BASE + +OIPBIT==%PC1PR ;PC BITS FOR 1-PROCEED. +BADPC==%PCUIO+%PCSPC+37 ;BITS IN PC USER NOT ALLOWED TO TURN ON + +DEFINE UUOH ;UUO HANDLER LOCATIONMS ARE REFERENCED THROUGH THESE MACROS +XUUOH!TERMIN + +DEFINE FORTY +40!TERMIN + +DEFINE SYSCTX ;SET UUO LEVEL AC BLOCKS +TERMIN + +DEFINE USRCTX ;SET USER-MODE AC BLOCKS +TERMIN + +DEFINE OVHMTR NAME ;OVERHEAD METERING DOESN'T WORK ON KA'S +TERMIN +] ;END OF IFN KA10P + IFN KL10P,[ + +SUBTTL STUFF PECULIAR TO KL-10 PROCESSOR + +;;;PAGING BOX INSTRUCTIONS + +XCTR=074000,, ;EXECUTE INSTRUCTION WITH MAPPING, PAGE FAILS ENABLED +XCTRI=075000,, ;SAME BUT SKIPS IF THERE IS PAGE FAIL (DONE SNEAKILY BY SOFTWARE) +LPMR=076000,, ;LOAD PAGER MEMORY (JPC, DBRS) AND CLEAR PT DIR +SPM=077000,, ;STORE PAGER MEMORY + ;AC FIELD VALUES FOR XCTR AND XCTRI + XR==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING) + XW==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR WRITING) + XRW==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING AND WRITING) + XBYTE==5;MAP BYTE DATA AND BYTE POINTER + XBR==1 ;MAP BLT SOURCE + XBW==4 ;MAP BLT DESTINATION + XBRW==5 ;MAP BOTH BLT OPERANDS + XEA==16 ;MAP EFFECTIVE ADDRESS COMPUTATION + ;IN KL10 BITS ARE: 14 INDIRECT WORDS + ; 10 XR UNDER SOME RANDOM WIERD CONDITIONS (?) + ; 4 MAIN OPERAND " " " ALSO BYTE WRITE + ; 2 INDEX REGISTER, @ AND XR IN BYTE PTRS + ; 1 2ND OPND - BLT SOURCE, BYTE READ, STACK DATA + +DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS. ARG IS USUALLY "(U)". + CONO PAG,660000+ +TERMIN + +;;; INTERNAL "I/O" DEVICES + +PI==4 ;INTERRUPT SYSTEM +PAG==10 ;CONO, DATAO PAG SET UP PAGING + ..D010==0 ;FOR DDT +CCA==14 ;CACHE OPERATIONS +TIM==20 ;TIMER DEVICE +MTR==24 ;METERS DEVICE + +IFN PDCLKP,[ ;IF THIS KL-10 HAS FREEMAN KL-UDGE BOARD, +LIGHTS==500 ;DATAO LIGHTS, SETS CONSOLE LIGHTS. +CLK==500 ;60 HZ CLOCK INTERRUPT (ON KL-UDGE BOARD) +CLKINT==10 ;CONI CLK, BIT FOR INTERRUPT. ALSO CONO BIT TO CLEAR. + ;ALSO DATAI 500, IS THE DECORIOLIS CLOCK. + ;AND CONO 500,400000 TURNS CLOCK BACK ON AFTER POWER FAIL. +] + +OIPBIT==%PS1PR ;1-PROCEED BITS IN THE PC. +BADPC==%PSUIO+37 ;%PSPUB IS OK? + +;;; SPECIAL INSTRUCTIONS + +SWPIA=DATAI CCA, ;INVALIDATE WHOLE CACHE +SWPIO=CONI CCA, ;INVALIDATE ONE PAGE OF CACHE +SWPUO=CONSO CCA, ;UNLOAD ONE PAGE OF CACHE +SWPUA=DATAO CCA, ;UNLOAD WHOLE CACHE +WRPAE=702100,, ;WRITE PERFORMANCE-COUNTER ENABLES +APRID==BLKI ;READ CPU SERIAL NUMBER AND OPTIONS +RDERA=BLKI PI, ;READ ERROR ADDRESS +RCCL=DATAI TIM, ;READ CALENDAR CLOCK (DOUBLE WORD) +RPERFC=BLKI TIM, ;READ PERFORMANCE COUNTER (DOUBLE WORD) +REBOXC=DATAI MTR, ;READ EBOX CYCLE COUNTER (DOUBLE WORD) +RMBOXC=BLKI MTR, ;READ MBOX CYCLE COUNTER (DOUBLE WORD) + +;;;EPT LOCATIONS + +$INSRT EPT + +;;;PAGE FAIL WORD - UPFW(U) + + %PF==1,,405000 + %PFUSR==400000 ;USER PAGE + %PFCOD==370000 ;FAILURE CODE: + %PFPRO==210000 ;PROPRIETARY VIOLATION + %PFMAR==230000 ;MAR BREAK + %PFILW==240000 ;ILLEGAL WRITE IN READ ONLY + %PFPNA==330000 ;PAGE NO ACCESS + %PFPTP==250000 ;PAGE TABLE PARITY + %PFPAR==360000 ;PARITY ERROR, DATA IN AR + %PFPRX==370000 ;PARITY ERROR, DATA IN ARX + %PFPUB==4000 ;PUBLIC PAGE + %PFCCH==2000 ;CACHED + %PFPAG==1000 ;PAGED + $PFPNO==121000 ;VIRTUAL PAGE NUMBER + ;1.1-3.5 VIRTUAL ADDRESS + +DEFINE UUOH ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS +XUUOH(U)TERMIN + +DEFINE FORTY +MUUODP(U)TERMIN + +;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR) OLDACS, +; UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME FOR UPT. +; DISABLE, IF NONBLANK, CAUSES ACCOUNTING UPDATING NOT TO BE DONE EVEN THOUGH +; UPT IS BEING SET. +DEFINE SPCCTX CURACS,OLDACS,UPT,DISABLE +DATAO PAG,[IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+2^13+CURACS_33+OLDACS_30+UPT/1000+400000-IFNB UPT,[IFB DISABLE,[400000]]] +TERMIN + +SYSCTX=SPCCTX 0,1 ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1. +USRCTX=SPCCTX 1,1 ;USERS RUN IN BLOCK 1. +IRPC N,,[234567] + AC!N!CTX=SPCCTX 0,N ;CUR AC 0, PREV N. USE XCTR TO ACCESS SPECIAL ACS +TERMIN + +;AC BLOCK USAGE: +; 0 ACCUMULATORS FOR SYSTEM (AT UUO LEVEL) +; 1 ACCUMULATORS FOR USER +; 2 USED TEMPORARILY BY TTY INPUT INTERRUPTS +; 3-5 NOT USED +; BLOCKS 2 & 3 ARE USED BY THE UNFINISHED MUSIC MICROCODE +; BLOCKS 4 & 5 ARE USED BY THE UNFINISHED JPC RING FEATURE +; 6-7 USED BY MICROCODE +] ;END OF IFN KL10P + IFN KS10P,[ + +SUBTTL STUFF PECULIAR TO THE KS-10 PROCESSOR + +EPT==:0 ; This MUST agree with the Salvager! +HSB==:500 +$INSRT KSDEFS + +DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS. ARG IS USUALLY "(U)". + WREBR 20000+ +TERMIN + +OIPBIT==1000 ;BIT 8 (SYMBOLIC NAME %PSINH) +BADPC==%PSUIO+37 ;BITS IN PC THAT USER CANNOT TURN ON + +DEFINE UUOH ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS +XUUOH(U)TERMIN + +DEFINE FORTY +MUUODP(U)TERMIN + +;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR) +; OLDACS, UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME +; FOR UPT. +DEFINE SPCCTX CURACS,OLDACS,UPT +WRUBR [IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+CURACS_33+OLDACS_30+UPT] +TERMIN + +SYSCTX=SPCCTX 0,1 ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1. +USRCTX=SPCCTX 1,1 ;USERS RUN IN BLOCK 1. +IRPC N,,[234567] + AC!N!CTX=SPCCTX 0,N ;CUR AC 0, PREV N. USE XCTR TO ACCESS SPECIAL ACS +TERMIN + +;AC BLOCK USAGE: +; 0 ACCUMULATORS FOR SYSTEM (AT UUO LEVEL) +; 1 ACCUMULATORS FOR USER +; 2 USED TEMPORARILY BY TTY INPUT INTERRUPTS +; 3-6 NOT USED +; 7 USED BY MICROCODE (AC0 GETS BAD DATA WHEN MEMORY ERROR OCCURS, THIS +; COULD BE FIXED IF ANYONE THINKS IT IS WORTH IT...) +] ;END OF IFN KS10P + +IFE KS10P,[ ; For the benefit of processors without UMOVE and UMOVEM. + +DEFINE UMOVE (AC,ADDR) +XCTR XR,[MOVE AC,ADDR] +TERMIN + +DEFINE UMOVEM (AC,ADDR) +XCTR XW,[MOVEM AC,ADDR] +TERMIN + +] ;IFE KS10P + +SUBTTL SYS IOC STATUS WORD FORMAT + +;RIGHT HALF WORD DEVICE STATUS +;1.1-1.6 SYS PHYSICAL DEVICE CODE +;1.7-1.9 OPEN MODE +;2.1 SYS BUFF CAP FULL +;2.2 " " " EMPTY +;2.9-2.3 DEVICE DEPENDANT + +;LEFT HALF WORD CHANNEL STATUS +;3.6-3.1 SET BY OPENS THAT DONT SKIP +;4.5-3.7 SET BY IOC ERRORS (INTERRUPTS) AT IOT OR OPER TIME + ;3.9-3.7 ARE FOR 340 OR E&S ERRORS + ;4.5-4.1 ARE FOR OTHER DEVICES +;A LIST OF ERROR CODES FOR OPEN FAILURES ARE IN THE FILE BITS. + +NDOPL==7 ;NUM OF DIS OPNL + +;4.5-3.7 SET BY IOC ERRORS AT IOT OR OPER TIME + +;3.9-3.7 SET BY 340 ROUTINES +;1 ILLEGAL SCOPE MODE +;2 SCOPE HUNG +;3 MORE THAN 1K SYS SCOPE BUF +;4 MEMORY PROTECT +;5 ILLEGAL SCOPE OP +;6 MEMORY PROTECT ON PDL POINTER +;7 ILLEGAL PARAMETER SET + +;4.5-4.1 +;DECIMAL CODE +;13 DIRECTORY'S ALLOCATION EXHAUSTED +;12 DIRECTORY FULL +;11 ILLEGAL CHR AFTER ^P ON TTY DISPLAY +;10 CHNL IN ILLEGAL MODE WHEN .IOT ATTEMPTED +;9 DEVICE FULL +;8 CHANNEL NOT OPEN +;7 USR OP CHNL DOES NOT HAVE USR OPEN +;6 ATTEMPT TO OVER IOPUSH +;5 ATTEMPT TO OVER IOPOP +;4 NON-EXISTANT SUB DEVICE +;3 NON-RECOVERABLE DATA ERROR ;NON-EX-MEM ON PDP6 REF +;2 END OF FILE +;1 DEVICE HUNG OR REPORTING NON-DATA ERROR + +MIOTER==1 ;LOWEST IOCERR CODE USED +NIOTER==13. ;NUMBER " " + +;4.9-4.5 ALWAYS ZERO (USED BY IOPUSH FOR CHNL NUM) + +;SYS PERIPHERAL DEVICE CODES + +;1.6 INDICATES DIRECTORY DEVICE +;1.5 INDICATES NON PHYSICAL DEVICE + +SNTTY==1 +SNTDS==2 ;TERMINAL DISPLAY +SNLPD==3 ;DATA PRODUCTS LPT +SNVID==4 +SNBAT==5 +SNPLT==6 +SNPTP==7 +SNIMPX==10 +SNOMPX==11 +SNPTR==12 +SN340==13 ;340 AS ASCII DEVICE +;SN340I==14 ;INTERPRETED DISPLAY ON 340 +SNMTC==15 ;MAGTAPE +SNCOD==16 ;CODE DEVICE +SNTAB==17 +SNNUL==21 +SNJOB==22 +SNBOJ==23 +SNSPY==24 +SNSTY==25 +SNNET==26 ; Arpanet NCP +SNLPV==27 ;VOGUE LPT +SNSTK==30 ;STANFORD KEYBOARD +SNMSP==31 ;CROCK "IPC" FOR NOW +IFN CHAOSP,SNCHA==32 ;CHAOS NET +IFN TCPP,SNTCP==33 ; Internet TCP/IP network device +SNTRAP==34 ;TRAP "DEVICE" +IFN INETP,SNIPQ==35 ; Internet Queue +IFN KS10P,SNUBI==36 ; Unibus interrupt +SNUTC==41 +SN2311==43 +SNFUSR==60 +SNUSR==61 +SNCLK==62 ;CLO, CLU, & CLI +SNDIR==63 +SNPDP==64 ;PDP6 +SNDIRH==65 ;DIRHNG "DEVICE" +SNLCK==66 ;LOCK "DEVICE" + +SUBTTL SYSTEM VERSION NUMBER & MISC MACROS + +ITSMCH==: ; Define SIXBIT machine name symbol +ITSVRS==:.FNAM2 ; Preserve SIXBIT symbol value of ITS version # +FNM==ITSVRS ;SRI GETS VERSION NUMBER + ;WORKS FOR DECIMAL IGNORES LOW ORDER NON-NUMERIC CHRS +DEFINE VNAM +.TAG FOO + ZZZQ==FNM&77 + IFGE ZZZQ-'0,IFLE ZZZQ-'9,.GO BAR + FNM==FNM_-6 + .GO FOO +.TAG BAR + ZZZQ==1 + SRI==0 +.TAG MUM + IFE FNM,.GO END + ZCHR==FNM&77-'0 + IFL ZCHR,.GO END + IFG ZCHR-9,.GO END + SRI==SRI+ZZZQ*ZCHR + ZZZQ==ZZZQ*10. + FNM==FNM_-6 + .GO MUM +.TAG END + TERMIN + +IF1 VNAM + +DEFINE SRITYP A +ZZZ==10 ;SAVE OLD RADIX +RADIX 10. + MOVEI I,[MNAME [.ASCII ? +] ITS !SRI A?] +RADIX ZZZ + TERMIN + + ;"MONTHS OF THE YEAR" MACRO + +DEFINE MNIRP A +IRPS M,,[JAN:FEB:MAR:APR: +MAY:JUN:JUL:AUG: +SEP:OCT:NOV:DEC:]L,,[31. 29. 31. 30. +31. 30. 31. 31. +30. 31. 30. 31.] +A +TERMIN +TERMIN + +FOO==-1 ;ACCUMULATED VALUE FOR FOLLOWING DEFINITION: + +MNIRP [M==FOO +FOO==FOO+L] ;JAN=-1, FEB=30., MAR=59., ETC. + +DEFINE INFORM A,B +IF1,[PRINTX \A = B +\]TERMIN + +ZZZ==10 +RADIX 10. +INFORM VERSION,\SRI +RADIX ZZZ + +SSYS==0 ;LENGTH OF SYS CODE + +DEFINE EBLK +IFN CKPAR,.ERR LOSS AT EBLK +CKPAR==1 +IFE .-CKZZ,.STOP ;NO WORDS BETWEEN BBLK AND EBLK +CONC CK,\CKNUM,==CKZZ-.,,CKZZ +CKNUM==CKNUM+1 +SSYS==SSYS+.-CKZZ +TERMIN + +DEFINE BBLK +CKZZ==. +IFE CKPAR,.ERR LOSS AT BBLK +CKPAR==0 +TERMIN + +CKPAR==1 +CKNUM==0 + + +;INSERT CALL TO THIS MACRO AT ANY PLACE IT IS POSSIBLE TO PCLSR +;(IF IT IS DESIRED FOR PCLSR TEST FEATURE TO TEST THAT SECTION) + +DEFINE PCLT +IFN PCLSW,[ + SKIPE PCLDBM + PUSHJ P,PCLTST +] +TERMIN + +DEFINE PCLTH A +IFN PCLSW,[ + SKIPN PCLDBM + JRST .+3 + PUSHJ P,PCLTSH + A +] +TERMIN + +DEFINE PI2SAF + CONSO PI,20000 + CONSO PI,40 + CAIA + JRST 4,. ;PI 2 NOT OFF AND NOT IN PROGRESS +TERMIN + +SUBTTL DEFINE EXEC PAGES + +EXPGN==0 + +DEFINE EXECPG X +X==EXPGN +EXPGN==EXPGN+1 +ZZQ==&1 +ZZQQ==X_-1 +.!X==220000*ZZQ+2200,,ZZQQ +TERMIN + +;EXEC MAP ASSIGNMENTS +IFN 340P,[ +EXECPG 340P1, ;USED TO FETCH + TRACE 340 PNTRS +EXECPG 340P2, +REPEAT N340PB,CONC [EXECPG DPG]\.RPCNT,; ;DATA AREA PNTRS FOR 340 DATA +] +EXECPG CORJF, ;CORE JOB FROM PAGE +EXECPG CORJT, ;CORE JOB TO PAGE +IFN VIDP,[ +EXECPG VSB1, ;.VSCAN B1 +EXECPG VSB2, ;.VSCAN B2 +] +IFN TEN11P,[ +EXECPG T11CP, ;TEN11 CONTROL PAGE +] +EXECPG PAREP, ;USED BY SYSTEM IN ITS DILIGENT EFFORTS TO FIX PARITY ERRORS + +IFN ECCMEM, EXECPG ECCPG, ;PAGE USED TO ACCESS ECC HISTORY + +IFN XGP,[ +EXECPG XGPC, ;LOW 2K OF XGP PDP-11 (USED TO TRACE BUFF POINTERS) +EXECPG XGPB, ;2K BUFFER IN PDP-11 (CHANGES LOCATION) +EXECPG XGPUB, ;XGP USER CORE EXEC PG SETUP TO POINT TO USER CORE DURING XGPIM SYSTEM CALL +] +IFN N11TYS,[ +REPEAT NTTPG,[CONC [EXECPG TTPG]\.RPCNT, +] +REPEAT NTVBP,[CONC [EXECPG TTR]\.RPCNT, +]] +IFN CHAOSP,[ IFN T11CHP,[ +EXECPG CHSPG ;CHAOS NET 10-11 COMMUNICATION PAGE +T11CHS=400000+CHSPG*2000 +]] ;CHAOSP, T11CHP +;^ INSERT NEW EXEC PAGES HERE +;EXEC PAGES BELOW THIS POINT WILL BE COPYABLE BY USERS +REPEAT NMMP,CONC [EXECPG MMP]\.RPCNT,; ;MMP TABLE + MMP=MMP0*2000+400000 ;VIRTUAL ADDRESS OF MMP +EXPUNGE EXECPG +NEXPGS==EXPGN ;# EXEC PGS USED + +SUBTTL LOW CORE + +.YSTGWD ;STORAGE WORDS OKAY NOW + +IFN KL10P, LOC EPT+1000 ;KL needs a full DEC page for EPT +IFN KS10P,[ + IFE KSIMP\SSIMP, LOC EPT+1000 ;KS needs a full DEC page, too, + IFN KSIMP\SSIMP, LOC EPT+2000 ; unless you are losing even worse. +] + +PATB=. +LOC 20 + BBLK + +IFN KS10P,[ +LOC 30 ; 8080 communications area + EBLK +] ;IFN KS10P + +IFN TM10B,[ + LOC 30 + EBLK +MICWA: MIOWD + 0 +IFE RP10P+RH10P,BBLK +] +IFN RP10P+RH10P,[ + LOC 32 +IFE TM10B,EBLK +QICWA: QIOWD + 0 +IFN QRDCMP,[ +RCICWA: 0 + 0 +];QRDCMP + BBLK +] +IFN E.SP,[ + LOC 34 + E.SPM ;POINTER , NEVER CHANGES +] + +IFE KS10P,[ +LOC 37 + EBLK +] ;IFE KS10P + +LOC 41 +IFN KA10P, JSR UUOH ;UUO TRAP +IFE KA10P, JSR LUUOEX ;USER UUO IN EXEC MODE (ERROR) + +LOC PI0LOC+2 + REPEAT 2, JSR RINT1 + REPEAT 6*2, JSR RINT ;INITIALIZE ANY UNUSED PI LOCNS + +LOC 61 +IFN KA10P, JSR 60H ;60 TRAP +IFN C1MXP, REPEAT 2*7., JSR RINT1 ;INITIALIZE C1MPX LOCNS + +LOC PI0LOC+2*APRCHN + JSR CLKBRK ;PROCESSOR OR CLOCK INTERRUPT + JRST 4,. + +LOC PI0LOC+2*LPTCHN + JSR LPTBRK ;LPT,DISPLAY,PTP,PTR,OTHER PROCESSOR +IFN 340P, JSR DRECYC ;HACK HACK + +LOC PI0LOC+2*TTYCHN + JSR TTYBRK ;TTY,DATAPOINT KLUDGE + JRST 4,. + +LOC PI0LOC+2*UTCCHN + JSR UTCBRK ;MICRO TAPE OR DISK (S) + JRST 4,. + +IFN E.SP,[ +LOC PI0LOC+2*DISCHN + JSR ESBRK + JRST 4,. +] +IFN 340P,[ +LOC PI0LOC+2*DISCHN + JSR DIGNOR ;340 DISPLAY BLKO GETS PATCHED IN HERE + CONO PI,4000+200_<-SDCHN> ;HACK HACK +] +IFN CH10P+CH11P,[ +LOC PI0LOC+2*CHXCHN + JSR CHXBRK + JRST 4,. +];CH10P + +IFN VIDP,[ +LOC PI0LOC+2*OMPCHN + JSR OMPXBK ;OUTPUT MPXR, NVID, ETC. + JRST 4,. +] +IFN KAIMP,[ +LOC PI0LOC+2*IMPCHN + JSR IMPBRK +LOC IMPILC + JSR IMPIBK + 0 +LOC IMPOLC + JSR IMPOBK + 0 +] ; IFN KAIMP + +IFN KL10P,[ +LOC PFOPC +PFOPC: 0 ;PAGE FAIL OLD PC STORED HERE +PFNPC: PFAIL ;WHERE TO GO FOR PAGE FAIL + +LOC EPTDIA +EPTDIA: JRST SALV ;STD COMMAND START ADDRESS ("DIAGNOSTIC") +EPTDDT: JRST DDT ;DDT COMMAND START ADDRESS +EPTSTL: JRST DSKDMP ;STL COMMAND START ADDRESS ("LOADER") +EPTITS: JRST BEG ;STM COMMAND START ADDRESS ("MONITOR") + ;SALV THEN GO +LOC EPTTR1 +EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED +EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR +EPTTR3: JSR ILLTRP ;ONE PROC CODE? + +LOC DTEBPO +DTEBPO: 0 ;BYTE TRANSFER NOT USED +DTEBPI: 0 ;BYTE TRANSFER NOT USED +DTELOC: ;INTERRUPT FROM CONSOLE 11 +IFE PDCLKP, JSR DTEBRK ;IF USING 11 FOR CLOCK, FIRST CHECK FOR CLOCK INTR +.ELSE JSR TTYBRK ;OTHERWISE JUST USING 11 FOR TTYS. + 0 ;UNUSED WORD +DTEPRO: 0 ;NO PROTECTED EXAMINES +DTERLO: 0 ;.. +DTEPRI: 0 ;NOR PROTECTED DEPOSITS +DTERLI: 0 ;.. + +LOC EPT+430 +REPEAT 8,MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES + +LOC EPTEBC +EPTEBC: 0 ? 0 ;EBOX COUNT FOR PROC BRK ROUTINES AND NULL JOB +EPTMBC: 0 ? 0 ;MBOX DITTO + +LOC TIMLOC + JSR OVHBRK ;INTERVAL TIMER INTERRUPT, EVERY 39 MILLISEC ON CHANNEL 1 + +;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED +;ON KL10 OVHBRK CHECKS WHERE THE PC IS IF IT IS IN EXEC MODE. + +DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE +OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME +TERMIN + +;KLUDGE MACRO +DEFINE OVHMT1 NAME,POINT +OVHTAB [DEFINE OVHTAB FOO +FOO] <(SIXBIT/NAME/)>,,POINT ? 0 +TERMIN +TERMIN + +;THIS IS THE CORRESPONDING REMOTE MACRO +DEFINE OVHTAB FOO +FOO +TERMIN +] ;END OF IFN KL10P + +IFN KS10P,[ + +LOC EPTUIT+UBAQ + UBAQIB ; Pointer to interrupt table for Unibus Q (dsk) + +LOC EPTUIT+UBAI + UBAIIB ; Pointer to interrupt table for Unibus I (other) + +LOC EPTPFW +EPTPFW: 0 ; Page fail word +EPTPFO: 0 ; Page fail old PC +EPTPFN: PFAIL ; Page fail new PC + +IRP I,,[1,2,3,4,5,6,7] +LOC EPTP!I!W +EPTP!I!W: 0 ; Page fail word +EPTP!I!O: 0 ; Page fail old PC +EPTP!I!N: PF!I!AIL ; Page fail new PC at PI level I +TERMIN + +LOC EPTTR1 +EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED +EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR +EPTTR3: JSR ILLTRP ;TRAP 3 SHOULD NOT HAPPEN + +LOC EPT1PO +EPT1PO: 0 ;ONE-PROCEED OLD-PC +EPT1PN: MUUOEX ;ONE-PROCEED SHOULD NOT HAPPEN IN UPT=EPT MODE + +LOC EPTUEN +EPTUEN: MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES +EPTUET: MUUOEX +LOC EPTUUN +EPTUUN: MUUOEX +EPTUUT: MUUOEX + +IFN KSIMP\SSIMP,[ +;Here because with EPT at 0, this is the second half of physical +; page 0, which is uncached, which we want, and otherwise unused. +; +LOC EPT+1000 ; IMP data reformatting buffers +IMPIBF: BLOCK 400 +IMPBFS==.-IMPIBF +IMPOBF: BLOCK 400 +] + +;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED +;ON KS10 PC SAMPLING FACILITY IS USED, 60-CYCLE CLOCK COLLECTS THAT DATA +;NOTE THAT THE TABLE FORMAT IS NOT THE SAME AS ON KL10, FOR SPEED REASONS + +DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE +OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME +TERMIN + +;KLUDGE MACRO +DEFINE OVHMT1 NAME,POINT +OVHTAB [DEFINE OVHTAB FOO +FOO] POINT,,<(SIXBIT/NAME/)> +TERMIN +TERMIN + +;THIS IS THE CORRESPONDING REMOTE MACRO +DEFINE OVHTAB FOO +FOO +TERMIN +] ;END OF IFN KS10P + +IFN DL10P,[ ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE +IFN KL10P, LOC 500 ;500-777 RESERVED FOR DL10 AREA AND BUFFERS +IFN KA10P, LOC 100 ;IF KA10, PUT DL10 AREA JUST BELOW START OF SYSTEM +IFN KS10P, .ERR DL10 on KS10 system? + +DL10AR: JSR TTYBRK ;INTERRUPT INSTRUCTION (NOT ACTUALLY USED) + +;FOLLOWING LOCATIONS MUST AGREE WITH IOELEVEN PROGRAM + +DL10VR: NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER" +DL10UP: 0 ;INCREMENTED BY -11 EVERY 1/60 SECOND. + ;SETOM'ED BY 10 EVERY 1/2 SECOND. DETECTS UP/DOWNNESS. + +DL10SO: 0 ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11. + +DL10IL: 0 ;LINE # WITH INPUT AVAILABLE. CLEARED BY -10 AFTER CHAR READ. +DL10IC: 0 ;CHARACTER RECEIVED FROM THAT LINE. + +DL10OD: 0 ;LINE # WITH OUTPUT DONE. CLEARED BY -10 WHEN PROCESSED. +DL10BS: 0 ;BUFFER SIZE FOR THAT LINE. + +DL10BP: 0 ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER. +DL10CC: 0 ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY. +DL10LN: 0 ;LINE # OUTPUT BEING SENT TO. CLEARED BY -11 WHEN GOBBLED. + +DL10CL: 0 ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10. + ;0000NN => LINE # NN DISCONNECTED. + ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T. + +DL10PL: 0 ;LINE # TO SET PARAMETERS OF. CLEARED BY -11 WHEN PROCESSED. +DL10PR: 0 ;VALUE OF DH11 LPR REGISTER. +DL10PS: 0 ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED. + +DL10XD: 0 ;1=EXAMINE -11 CORE, 2=DEPOSIT. CLEARED BY -11 WHEN DONE. +DL10XA: 0 ;EXAMINE/DEPOSIT ADDRESS +DL10XW: 0 ;EXAMINE/DEPOSIT WORD + +GLPTBP: 0 ;BYTE POINTER TO BUFFER FOR GOULD LPT +GLPTBC: 0 ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11. +GLPTER: 0 ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN. +GLPGRF: 0 ;NONZERO => GRAPHICS MODE (SET BY 10). + +;CHAOS NET SHARED VARIABLES +DLCINI: 1 ;THE COMMENTS ARE IN THE CHAOS FILE +DLCSP1: 0 +DLCSP2: 0 +DLCSS1: 0 +DLCSS2: 0 +DLCRP1: 0 +DLCRP2: 0 +DLCRS1: 0 +DLCRS2: 0 + +;^ ADD MORE HERE + +DLXEND:: ;END OF ASSIGNED DL10 AREA + +IFG .-DL10AR-100, .ERR DL-10 AREA TOO BIG, CHANGE CONO IN TSS INITIALIZATION +LOC DL10AR+100 ;SKIP OVER 11-ACCESSIBLE AREA + +DL10BF: BLOCK <261.+3>/4 ;OUTPUT BUFFER, 8-BIT BYTES. HAS TO BE NON-ENCACHED. + +IFN GLPTP,[ +GLPBSZ==255. ;BUFFER SIZE IN WORDS. MAXIMUM POSSIBLE WITHOUT MODIFYING (ELIMINATING) + ;"WORD COUNT" HARDWARE IN DL-10. +GLPMPP: 0 ;MAIN PROGRAM POINTER - IF NONZERO BUFFER IS ACTIVE BY M.P. LEVEL (PDP10) +GLPMPC: 0 ;MAIN PROGRAM COUNTER +GLPTBF: BLOCK GLPBSZ ;ONE BUFFER FOR NOW +] ;END IFN GLPTP + +IFN KL10P, IFG .-1000,.ERR DL10 STORAGE TOO BIG, DOESN'T FIT IN UNENCACHED PAGE +IFN KA10P, PATB=. ;MOVE ORIGIN OF SYSTEM UP +] ;END IFN DL10P + +IFN NETYS,[ ;ASSEMBLE DTE20 CONTROL AREA +IFE KL10P, .ERR DTE20 WITHOUT KL10? +LOC 400 + +DTEVER: NETYS_8+NFETY ;400 I/O VERSION NUMBER, SET BY 10, CHECKED BY 11 + +DTECHK: 0 ;401 INCREMENTED BY 11 60 TIMES PER SECOND + ;SETOMED BY 10 EVERY HALF SECOND. + ;USED TO TELL 11 THAT 10 IS UP. + +DTEINP: -1 ;402 -1 IF IDLE, ELSE INPUT REQUEST FROM 10 TO 11 + ;SETUP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING THIS. + ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES HERE +DTEOUT: -1 ;403 -1 IF IDLE, ELSE OUTPUT REQUEST FROM 10 TO 11 + ;SETUP DTEBPO IN EPT BEFORE SETTING THIS. + ;CONTENTS OF DTEINP AND DTEOUT ARE DESCRIBED BELOW. + ;THESE ARE SET BY THE 10, SETOMED BY 11 WHEN TRANSFER STARTS. + ;RH # BYTES EXPECTED. LH COMMAND+LINE#. COMMANDS ARE: + %DCTYO==1000 ;TELETYPE OUTPUT (NOTE 4.1=0 INPUT, =1 OUTPUT) + %DCETI==2000 ;ETHERNET INPUT (N.Y.I.) + %DCETO==3000 ;ETHERNET OUTPUT (N.Y.I.) + +DTELSP: -1 ;404 LINE # WHOSE SPEED IS TO BE SET, SET BY 10, SETOMED BY 11 +DTELPR: -1 ;405 CORRESPONDING DH11 LINE PARAMETER REGISTER,,BUFFER SIZE + +DTEOST: -1 ;406 LINE# TO START OUTPUT ON (SET OUTPUT DONE). + ;SET BY 10, SETOMED BY 11 + + BLOCK 1 ;407 NOT USED + +DTETYI: -1 ;410 TELETYPE INPUT. SET BY 11, SETOMED BY 10. + ;LH LINE#,,RH CHAR RCVED. + +DTEODN: -1 ;411 TELETYPE OUTPUT DONE. SET BY 11, SETOMED BY 10. + ;LH LINE#,,RH BUFFER SIZE. + +DTEHNG: -1 ;412 HANGUP/DIALIN WORD. SET BY 11, SETOMED BY 10. + ;0000NN LINE # NN HUNG UP. + ;01RTNN LINE # NN HAS SPEED RCV=R, XMT=T (CODES AS IN TTYTYP) + +;^ ADD MORE LOCATIONS HERE, NOT TO EXCEED 437 + +;LOCATIONS 440-457 ARE KNOWN ABOUT BY BOTH IOELEV AND KLDCP, +;USED MOSTLY FOR NON-TIMESHARING PROGRAMS. +];NETYS + +LOC PATB + + ;FOR VARIABLES (MONITORABLE WITH KEYS) +NSKED: 0 ;# TIMES NON-NULL JOB IS RUN +NNSKED: 0 ;# TIMES NULL JOB IS RUN +NRSKED: 0 ;# OF FULL SCHEDULES (MUST SCAN ALL JOBS) +NSSKED: 0 ;# OF SCHEDULES SAVED BY SCHBLN FEATURE. +NRESKED:0 ;# TIMES A JOB SCHEDULED JUST AFTER IT RAN. +NSCHDU: 0 ;TOTAL NUMBER OF JOBS FOUND RUNNABLE IN FULL SCHEDULES +NNULBK: 0 ;# OF CONSECUTIVE BLOCKS OF NULLTIME. +NUINT: 0 ;# TIMES USER GIVEN INTERRUPT +NAUINT: 0 ;# ATTEMPTED USER INT (POSSIBLY UNSUCCESSFUL DUE TO PG FAULT) +NPCLSR: 0 ;# ATT TO PCLSR +NEPCLS: 0 ;# PCLSRS WHERE JOB WAS IN EXEC MODE +NFPCLS: 0 ;# OF PCLSRS THAT FAILED (JOB WAS IN EXEC MODE AND NOT BLOCKED) +NSOUSR: 0 ;# ATT TO SWAP OUT USR +NSOPGS: 0 ;# TIMES THRU LOOP LOOKING FOR PG TO SWAP OUT +NPGSO: 0 ;# TIMES AT SWOPG +NAGEAB: 0 ;# TIMES SWAP OUT ABORTED BY AGE BITS +NSHRAB: 0 ;# TIMES SWAP OUT ABORTED BY SHARING +NPGFLT: 0 ;# PAGE FAULT (ALL CAUSES) +NCLKI: 0 ;# CHNL 7 INTS (ALL CAUSES) +NPGLD: 0 ;# TIMES AT PGLDU +NUFLS: 0 ;# TIMES AT UFLS +NTUSB: 0 ;# TIMES USER SWAP BLOCKED +NTSBUP: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND LET IN +NTSBUB: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND BLOCKED +NTSBUU: 0 ;# TIMES SWAP BLOCKED USER UNBLOCKED BEFORE TIME (MEM APPARENTLY AVAIL) +NAGES: 0 ;# TIMES AROUND PAGE-AGEING LOOP + +;THE FOLLOWING FOUR MUST BE CONSECUTIVE +NRPI: 0 ;# REFS TO PAGE IN (BUT MAP WAS NOT SET UP, ETC) +NRPCI: 0 ;# PAGE FAULTS REFS TO PAGE COMMING IN +NRPO: 0 ;# REFS TO PAGE OUT +NRPGO: 0 ;# TO PAGES GOING OUT +CLKBRS: 0 ;CLKBRK COPIED INTO HERE (SINCE CLKBRK GETS CHANGED) + +PAT: IFG .-PATB-40,.ERR PAT TOO HIGH + +LOC PATB+40 + +BBLK + +PATCH: BLOCK 140 ;PATCH SPACE CODE AND CONSTANTS + +EBLK + +VPATCH: +VPAT: +BLOCK 40 ;PATCH SPACE VARIABLES + +SUBTTL PROCESSOR BREAK ROUTINES + +DEFINE CLKSAV BRK=CLKBRK +IFE KA10P, XCT CLCXSV ;DATAI PAG,CLCX(U) + XCT CLUSAV ;STORE U IN AC17S FOR CURRENT USER (UNLESS NULL JOB) + MOVE U,BRK ;SAVE AWAY BRK + MOVEM U,CLKBRS +IFSN BRK,CLKBRK, MOVEM U,CLKBRK ;SAVE IN CLKBRK IF NOT CLKBRK +TERMIN + +IFE KA10P,[ +DEFINE CLKLEV ;ENTER CLOCK-LEVEL CONTEXT + SPCCTX 0,1,EPT ;UPT = EPT; CLOCK LEVEL CONTEXT. + MOVE U,USER + JRST 2,@.+1 ;MAKE XCTR WORK RIGHT + %PSPCU,,.+1 + MOVE P,CPDLP +TERMIN +] ;IFE KA10P +IFN KA10P,[ +DEFINE CLKLEV + MOVE U,USER + MOVE P,CPDLP +TERMIN +] ;IFN KA10P + +IFN KL10P,[ ;CODE USED IF GETTING 60-CYCLE CLOCK FROM PDP11 (IN CASE MAIN CLOCK DOWN) + +;HACKING THE DTE: + +;THE TTY CODE ASSUMES, SINCE THE DTE20 IS USED BY ITS SOLELY AS +;THE INTERFACE TO THE CONSOLE TTY AND THE LINE-FREQUENCY CLOCK, +;THAT IT MAY FREELY GIVE THE "MONITOR TTY OUTPUT" COMMAND WHEN +;THE "MONITOR TTY OUTPUT DONE" INTERRUPT IS RECEIVED. ANY CODE +;WHICH HACKS THE DTE OTHER THAN AT PI LEVEL OR IN ITS INITIALIZATION +;MUST THEREFORE OBSERVE THE FOLLOWING PROTOCOL: +; CONO PI,DTEOFF +; SKIPN DTEFLG ;WAIT FOR MONITOR TTY OUTPUT TO GO THROUGH +; JRST .-1 +; SETZM DTEFLG +; ;HERE SET DTECMD +; CONO DTE,%DBL11 +; SKIPN DTEFLG ;WAIT FOR THIS COMMAND TO GO THROUGH +; JRST .-1 +; CONO PI,DTEON +; + +DTEBRK: 0 +BBLK + CONSO PI,1_<7-APRCHN> ;TEMPORARY (I HOPE) HARDWARE BUG IN KL10 PI HARDWARE + JRST 4,. ;ALLEGEDLY FIXED + CONO PI,TTYRQ ;REALLY WANTED TO INTERRUPT ON TTY CHANNEL, + JFCL ; BUT HAVE TO DO IT THIS WAY DUE TO + JFCL ; MISFEATURES IN THE PI HARDWARE + SKIPN DTECLK ;DON'T TAKE OUT THE JFCLS!! + JRST 12,@DTEBRK + CLKSAV DTEBRK ;TAKE CLOCK INTERRUPT + JRST CLKB2A +EBLK +];KL10P + +CLKBRK: 0 ;PC SAVED HERE BY JSR FOR CLOCK INT. + +BBLK +IFN KL10P,[ + CONSO PI,1_<7-APRCHN> ;HARDWARE BUG IN KL10 PI SYSTEM + JRST 4,. ;ALLEGEDLY FIXED +] +IFE KA10P, CONO PI,020000+200_<-APRCHN> ;BAG-BITING DEC LOSERS CHANGED + ;FUNCTIONAL SPECIFICATION OF + ;PROGRAMMED REQUESTS +CLKBR2: CLKSAV ;SAVE AC BLK STATUS AND U. +CLKB2A: AOS NCLKI + SKIPGE U,USER ;PICK UP INDEX OF CURRENT USER, SKIP UNLESS NULL JOB + JRST [ SPM UPGML ;JUMP IF NULL JOB WAS RUNNING + JRST CLKBKR ] + SPM UPGML(U) ;STORE PAGE MAP AWAY + AOSN UFLSF ;SKIP UNLESS GOT HERE FROM UFL6 + JRST CLUFLS + MOVEM T,AC16S(U) ;STORE AWAY T + MOVEI T,AC0S(U) + BLT T,AC15S(U) ;STORE REST OF ACS +CLKBKR: CLKLEV ;SET UP CROCK-LEVEL CONTEXT HARDWARE + +;;; CHECK FOR THINGS OTHER THAN CLOCK TICKS (PAR ERR, PG FAULT, NXM, PDLOV, +;;; AROV AND ARFOV ARE POSSIBLE ON ONE MACHINE OR THE OTHER). + +IFN KA10P,[ + CONSZ 270220 ;CHECK PDL OV, MEM PROTECT, NXM, FOV, AR OV + JRST CLKB1 ;JUMP ON LOSSAGE +CLKB1D: CONSZ PI,200000 + JRST CLKB1E ;PARITY +] ;KA10P + +IFN KL10P,[ + AOSG PFAILF + JRST PFA6 ;PAGE FAULT + CONSZ 7740 ;This is all but the cache sweep done bit (=20). + JRST CLKB2 ;APR ERROR INTERRUPT +] ;KL10P + +IFN KS10P,[ + AOSG PFAILF + JRST PFLU2 + CONSZ 7620 ;This is all but the interval timer's bit (=40). + JRST CLKBKS ; (Memory ECC (=100) doesn't interrupt) + CONSO 40 + JRST CLK1F +] ;KS10P + +IFN PDCLKP\KA10P,[ ;IF 60 HZ CLOCK IS IN HARDWARE + CONSO CLK,CLKINT + JRST CLK1F ;INTERRUPT NOT FROM CLOCK, MUST BE SPURIOUS (OR + ;PREEMPT) +] ;PDCLKP\KA10P + +;DROP THROUGH FOR PLAIN CLOCK-TICK. + ; +; 60-CYCLE CLOCK INTERRUPT +; +CLKTIC: +;IFN 340P, DATAI CLK1,LQTIM + SOSG @CLROOT ;COUNT DOWN, SKIP IF NOT YET TO NEXT REQUEST + JRST CLQBRK ;SERVICE CLOCK QUEUE REQUEST +CLQBRT: +IFN KS10P, CONO 020040+APRCHN ;Clear interval flag +IFN PDCLKP\KA10P, CONO CLK,CLKINT+APRCHN ;Clear hardware clock flag +IFE PDCLKP\KA10P\KS10P, SETZM DTECLK ;Clear software clock flag +IFN KA10P,[ + DATAI CLKBSW + SKIPGE CLKBSW +] ;KA10P +IFN KL10P, SKIPGE DTESWR +IFN KS10P, SKIPE 8SWIT0 + BUG DDT,[SWITCH 0 IS UP] +IFN KS10P, SETZM 8SWIT0 ; Allow hacker to P +IFN CHAOSP, IFN T11CHP, PUSHJ P,T11WAK ;RUN TEN-11 CHAOS NET INTERFACE +IFN XGP,[ + SKIPL XGPUSR + PUSHJ P,XGPCLK +] +IFN 340P,[ + AOSGE T,DTIME + JRST DSTPD ;WAIT IF DTIME CLOBERED DUE TO RATE EXCEEDED + CAILE T,2 + MOVEI T,2 + MOVEM T,DTIME + SKIPL CDISOF + SKIPGE DISOFF + JRST DSTPD + AOSG DISON + CONO DIS,1100\SDCHN_3\DISCHN ;RESTART DISPLAY +DSTPD: +] +IFN E.SP,[ + SKIPN T,E.SPGW ; E&S WAITING FOR PAGE + JRST E.SOK + HRRZM T,DISSPG ; SAVE FOR SWPPIN + SKIPL T,DISUSR ; -1 IMPLIES NO USER + MOVEM T,DISSWI ; USER INDEX FOR SWPPIN +E.SOK: +] +IFN N11TYS,[ + SKIPE @TT11HD ;ANY INPUT FROM PDP11? + PUSHJ P,TT11IN ;YES, DO INPUT INT LVL STUFF FOR IT,. +] +IFN DZ11P,[ + PUSHJ P,DZSCAN ;SCAN DZ'S FOR INPUT +] + MOVS T,TTERQS + CAIE T,(MOVE) + PUSHJ P,TTECH ;CHARACTERS TO BE ECHO ED +IFN NETP,[ + SKIPE STYNTA ;IF THERE ARE STY'S CONNECTED TO NETWORK I/O, + PUSHJ P,STYNTC ;XFER BETWEEN THEM. +] +IFN KS10P, PUSHJ P,OVHCLK + SETCMM CLKFL1 + SKIPL CLKFL1 + AOS TIME ;GET HERE EVERY THIRTIETH OF A SECOND +IFN PAGPRE,[ + SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT + JRST PRESCD +];PAGPRE + AOSG SCHFLG + JRST CLKB5 ;TIME NOT UP + AOS NLPCLK + JRST SCHED ;SCHEDULE + +CLK1F: +IFN PAGPRE,[ + SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT. THIS IS HERE + JRST PRESCD ; BECAUSE OF SCREW CASE WHEREBY DLSRCH PREVENTS + ; PREEMP FROM DOING ANYTHING, AND PREEMP WOULD + ; PREVENT CLOCK FLAG FROM GETTING CLEARED IF IT WAS + ; TESTED BEFORE CLOCK. +];PAGPRE +; MOVEI J,APRCHN ;DO NOT TAKE THESE OUT WITHOUT SEEING RG!!!! +; JSP E,SPUR +; JRST SCHED + AOS CHSPUR+APRCHN ;COUNT SPURIOUS INT + JRST SCHED ;(MIGHT HAVE BEEN RUNNING NULL JOB) + +IFN PAGPRE,[ +PRESCD: AOS NLPPRE + JRST SCHED +];PAGPRE + +IFN KL10P,[ +CLKB2: CONSZ 2000 ;NXM + PUSHJ P,MEMHNG + CONSZ 1040 ;POWER FAIL OR I/O PAGE FAIL + BUG HALT,[KL: POWER FAIL OR I/O PAGE FAIL] + CONSZ 300 ;CACHE DIR OR PT DIR PAR ERR. + BUG HALT,[KL: CACHE OR MAP DIR PAR ERR] + CONSO 4400 ;SBUS ERR OR MB PAR ERR + JRST SCHED ;CALLED MEMHNG, AND NOTHING ELSE => SCHEDULE. + SETOM PARRSN ;TEL PAR ERR SCANNER THIS IS AN INTERRUPT, NOT A PG FAIL. + RDERA PARERA ;STORE ADDR OF PAR ERR. + JRST CLKB1E +] ;IFN KL10P + +IFN KS10P,[ +CLKBKS: CONSZ 7600 ; Any bad guys? (8080 -> KS is 20, Interval is 40, + JRST CLKKS1 ; Memory ECC is 100.) + CONO 020020+APRCHN ; 8080 wants service. Clear the bit. + MOVEI I,NFKSTY ; TTY # (fancy name for 0) + CONO PI,TTYOFF ; Pretend this is TTY interrupt level. + SKIPN A,8CTYIN ; Any input from 8080? + JRST CLKKS2 + SETZM 8CTYIN ; Yes: Make room for more. + PUSHJ P,NTYI1 ; Stuff it into the tty. + MOVEI I,NFKSTY ; Just in case... +CLKKS2: SKIPN 8CTYOT ; Room for output yet? + PUSHJ P,TYPSC ; Yes: Get some now. + CONO PI,TTYON ; No: 8080 will wake us up later. + JRST SCHED ; Null job might have been running. + +CLKKS1: CONSZ 1000 ;Power failure + BUG HALT,[KS: POWER FAIL] + CONSZ 6000 ;KS -> 8080 or Flag 24 + BUG HALT,[KS: KS->8080 FLAG OR FLAG 24 SET] + CONSZ 400 ;NXM + PUSHJ P,MEMHNG + CONSO 200 ;Bad memory data + JRST SCHED + IORD B,[KSECCS] + MOVEM B,PARERA + JRST CLKB1E + +] ;IFN KS10P + +CLUFLS: CONO PI,CLKON ;FROM UFLS + CLKLEV + MOVE T,UPC(U) + MOVEM T,CLKBRK + AOS NUFLS + AOS NLPUFL + JRST SCHED2 + + ;CLOCK QUEUE SERVICE +CLQBRK: SKIPG U,CLROOT ;GET POINTER TO CURRENT BLOCK + BUG ;CLK QUEUE SCREWED + SKIPG T,1(U) ;GET POINTER TO NEXT BLOCK + BUG ;CLK QUEUE SCREWED + MOVEM T,CLROOT ;SET UP POINTER FOR NEXT BLOCK + SETOM 1(U) ;INDICATE CURRENT BLOCK IDLE + XCT 2(U) ;EXECUTE REQUEST (PROBABLY A JRST) + ;FALL THROUGH IF SINGLE INST RQ +CLQRET: ;RETURN FROM REQUEST + SKIPN @CLROOT ;SKIP IF TIME TILL NEXT RQ NONZERO + JRST CLQBRK ;ZERO TIME DELTA, DO NEXT RQ + JRST CLQBRT ;RETURN TO CLOCK ROUTINE + +CLQTTR: JUMPE TT,CLQRET ;COMMON RETURN FOR TT IDLE FLAG +CLQREE: MOVEI E,CLQRET ;RE ENTER RQ + +;CLOCK OFF OR IN PROGRESS LEVEL ADD TO CLOCK QUEUE, CALL BY JSP E, + ; T HAS TIME TILL RQ IN 60'THS + ; C POINTS TO THREE WORD BLOCK, RQ'ED INST IS IN THIRD +CLQPUT: MOVEI B,CLROOT-1 +CLQPU2: MOVE A,B ;REPLACE POINTER TO PREV BLOCK WITH CURRENT + SKIPG B,1(B) ;GET LINK TO NEXT BLOCK + BUG ;CLK QUEUE SCREWED + SUB T,(B) ;SUBTRACT TIME DELTA FOR NEXT BLOCK + JUMPG T,CLQPU2 ;JUMP IF RQ LATER THAN CURRENT BLOCK + JUMPE T,CLQPU6 ;JUMP IF RQ SAME AS " " (COULD USE PU2 BUT THIS FASTER) + ADD T,(B) ;RQ EARLIER, ADD BACK + MOVEM T,(C) ;SET DELTA OF BLOCK BEING ADDED + SUB T,(B) ;COMPUTE NEG OF DELTA FOR NEXT BLOCK + MOVNM T,(B) ;SET TIME DELTA FOR NEXT BLOCK + MOVEM B,1(C) ;SET LINK OF NEW BLOCK TO NEXT + MOVEM C,1(A) ;SET LINK OF PREV BLOCK TO NEW + JRST (E) + +CLQPU6: SETZM (C) ;SET TIME DELTA OF NEW BLOCK TO ZERO + MOVE A,1(B) ;GET POINTER TO NEXT BLOCK + MOVEM A,1(C) ;SET POINTER OF NEW TO NEXT BLOCK + MOVEM C,1(B) ;SET POINT OF CURRENT TO NEW BLOCK + JRST (E) + +;MAIN PROG LEVEL ADD TO CLOCK QUEUE +;CALL BY PUSHJ P,CLQADD +;WITH POINTER TO BLOCK IN NEXT WORD AND TIME TILL RQ IN T IN 60'THS +;POINTER TO BLOCK SHOULD NOT BE INDEXED BY C + +CLQAD1: MOVEI T,1 ;RQ IN ONE TICK +CLQADD: PUSH P,C + MOVE C,@-1(P) ;GET BLOCK POINTER + MOVEI C,@C + SKIPL 1(C) ;SKIP IF IDLE + JRST POPCJ1 ;IGNORE THIS RQ, BLOCK ALREADY ACTIVE + PUSH P,A + PUSH P,B + PUSH P,E + SKIPN (C) ;DELTA WORD OF IDLE BLOCK SHOULD BE ZERO + SKIPG T ;TIME SHOULD BE NON-ZERO + BUG ;CLK QUEUE SCREWED + CONO PI,CLKOFF + JSP E,CLQPUT ;ADD RQ +CLQDE4: CONO PI,CLKON + POP P,E + POP P,B + POP P,A + JRST POPCJ1 + +;DELETE CLOCK QUEUE ENTRY +;CALL BY PUSHJ P,CLQDEL WITH POINTER TO BLOCK IN NEXT WORD +CLQDEL: PUSH P,C + MOVE C,@-1(P) ;GET BLOCK POINTER + MOVEI C,@C + CONO PI,CLKOFF + SKIPGE 1(C) ;IGNORE RQ TO DELETE IF IDLE + JRST CKOCJ1 + PUSH P,A + PUSH P,B + PUSH P,E + JSP E,CLQCLR + JRST CLQDE4 + +CLQCLR: MOVEI B,CLROOT-1 ;CLOCK OFF OR IN PROGRESS VERSION +CLQDE2: MOVE A,B + SKIPG B,1(B) ;GET POINTER TO NEXT BLOCK + BUG ;CLK QUEUE SCREWED + CAME B,C ;SKIP IF FOUND BLOCK TO DELETE + JRST CLQDE2 + SKIPG B,1(B) ;GET POINTER TO BLOCK AFTER ONE TO DELETE + BUG ;CLK QUEUE SCREWED + MOVEM B,1(A) ;PATCH AROUND DELETED BLOCK + MOVE A,(C) + ADDM A,(B) ;ADD DELTA OF DELETED BLOCK TO NEXT + SETZM (C) ;CLEAR DEL + SETOM 1(C) ;MARK IDLE + JRST (E) + +OVHMTR PGF ;PAGE FAULT + +IFN KL10P,[ +EBLK +PFAILU: 0 ;SAVED U AS OF A PAGE FAILURE +PFINST: 0 ;PF INSTRUCTION IF XCT +PFOPC1: 0 ;SAVE PFOPC WHILE SWITCHING TO CLK LEVEL (PROTECT AGAINST XCTRI) +BBLK + +;PAGE FAULTS COME HERE, WITH PC IN PFOPC, AND PI SYSTEM TURNED OFF. + +PFAIL: MOVEM U,PFAILU + HLRZ U,EPTPFW + ANDI U,%PFCOD ;GET THE PFAIL CODE FROM THE PFW + CAIE U,%PFPAR + CAIN U,%PFPRX + JRST PFA2 ;IT'S A PAR ERR; BYPASS XCTR HACKS + MOVE U,PFOPC + TLNE U,%PCUSR + JRST PFA2 + LDB U,[331100,,(U)] ;GET OPCODE OF LOSING INSTRUCTION. + ;ASSUME THAT IN EXEC MODE VIRTUAL + ; AND PHYSICAL ADDRESSES ARE IDENTICAL + ; FOR INSTRUCTION FETCHES. ALSO ASSUME + ; THAT NOBODY DOES XCT OF XCT OF XCTR. +PFA4: CAIE U,XCTRI_-33 ;SKIP IF "XCTR WITH INHIBIT" + JRST PFA1 +REPEAT 2, AOS PFOPC ;ONCE COMPENSATING FOR INSTR ABORT, AND ONCE TO SKIP + MOVE U,PFAILU + JRST 17,@PFOPC ;KL-10 CROCK: JRST 17, TURNS ON PI SYSTEM + +PFA1: CAIE U,XCTR_-33 ;SKIP IF "XCTR WITH NO INHIBIT" + JRST PFA3 +PFA2: CONSO PI,77400 ;PI IN PROGRESS? + CONSO PI,1 ;CHANNEL 7 ENABLED? + BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS OR CLKOFF] + SKIPGE USER + BUG AWFUL,[PAGE FAULT IN NULL JOB] + MOVE U,PFOPC + MOVEM U,PFOPC1 + MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT +TPFLT1: SETOM PFAILF + CONO PI,CLKRQ ;CAUSE CLK BREAK AND PI SYSTEM ON + JRST . ;TAKES A WHILE TO GO OFF + +;COME BACK HERE PI IN PROGRESS ON CLK CHANNEL +PFA6: MOVE T,PFOPC1 + MOVEM T,CLKBRK ;SAVE PC AS OF PAGE FAULT AS PLACE INTERRUPTED FROM + AOSN PFAILF ;IF INTERRUPTED FROM INTPFL, + JRST PFA9 ; PC DOESN'T POINT TO FAULTING INSTRUCTION + TLNE T,%PSUSR ;MAYBE SPURIOUS MPV ON IOT IN USER MODE? + TLNE T,%PSUIO + JRST PFA9 ;CAN'T BE, I/O IS LEGAL + HLRZ TT,UPFW(U) + ANDI TT,%PFCOD + CAIE TT,%PFPNA ;CAN'T BE IF PAGE FAULT IS REALLY SOME OTHER RANDOM BREAK + CAIN TT,%PFILW ;SUCH AS A PARITY ERROR + JRST PFA11 +PFA9: +; MOVE T,PFOPC +; MOVEM T,UPOPC(U) ;SOLELY FOR THE .OPC USER VARIABLE + LDB E,[$PFPNO,,UPFW(U)] ;FAILING PAGE NO + HLRZ D,UPFW(U) + ANDI D,%PFCOD ;GET THE PAGE-FAULT CODE. + MOVEI A,0 ;INIT USER INT BITS + CAIE D,%PFPNA + CAIN D,%PFILW + JRST PFA5 ;REAL PAGE FAULT OR RWF + CAIN D,%PFMAR + JRST PFA7A + CAIN D,%PFPRO + JRST PFA7 ;OTHER RANDOM BREAKS + CAIE D,%PFPAR + CAIN D,%PFPRX + JRST PFA14 ;PARITY ERROR + MOVSI D,SCLBPF ;UNKNOWN PFW, GET SYSTEM JOB TO BARF ABOUT IT + TDNE D,SUPCOR + BUG PAUSE,[BAD PAGE FAIL WORD ],OCT,BPFPFW ;LOSING IN REAL TIME + IORM D,SUPCOR + AOS BPFERR + MOVEM U,BPFUSR + MOVE D,UPFW(U) + MOVEM D,BPFPFW + MOVE D,CLKBRK + MOVEM D,BPFPC + JRST SCHED ;IGNORE THE FAULT (BUT DO A FULL SCHEDULE SO SYS JOB WAKES) + +PFA14: SETZM PARRSN ;SAY THIS IS PAR ERR TRAP, NOT PAR ERR INTERRUPT. + MOVE D,UPFW(U) + MOVEM D,PARPFW ;SAVE PFW OF PAR ERR FOR ERROR MESSAGE + AC7CTX ;SELECT AC BLOCK 7, USED BY UCODE. + UMOVE D,0 ;SAVE THE AC THAT HOLDS THE BAD WORD + MOVEM D,PARWRD + SYSCTX ;AND RESET THE DATAO PAG TO NORMAL VALUE + JRST CLKB1E ;GO SCAN FOR THE ERROR. + +PFA3: CAIE U,XCT_-33 + BUG HALT,[PAGE FAULT IN SYSTEM AT ],OCT,PFOPC ;BARF! + MOVE U,@PFOPC ;QUUX! LET ONE LEVEL OF XCT WIN + MOVEM U,PFINST + MOVE U,PFAILU + LDB U,[331100,,@PFINST] + JRST PFA4 + +PFA11: XCTRI XR,[MOVE T,(T)] ;GET INSTRUCTION IN WHICH PAGE FAIL OCCURRED + TLCA T,700000 ;AND CHECK HIGH THREE BITS OF OPCODE + JRST PFA9 ;JUMP IF FAULT WAS ON INSTRUCTION FETCH + TLCE T,700000 + JRST PFA12 ;JUMP IF INSTRUCTION NOT AN IOT +PFA13: MOVSI TT,(HRRI T,) + DPB T,[2700,,TT] + XCTRI XEA,TT ;COMPUTE ITS EFFECTIVE ADDRESS + TLZA T,37 ;CLEAR @+XR, BUT LEAVE OPCODE AND AC + JRST PFA9 ;JUMP IF FAULT ON INDIRECT WORD + MOVEM T,MUUODP(U) ;IT WAS A SPURIOUS MPV, SO + MOVE T,CLKBRK ; SIMULATE TRAPPING AS A UUO + HRRI T,1(T) + MOVEM T,XUUOH(U) ;STORE OLD PC + MOVE T,CLCX(U) + MOVEM T,MUUOCX(U) ;AND OLD CONTEXT + MOVE T,MUUOCN(U) + MOVEM T,CLKBRK ;GET NEW PC + JRST CLKB5 ;AND RESTART USER AT UUOH0 + +PFA12: TLNN T,700000 ;MAYBE AN INSTRUCTION OVERLAYED ON AN MUUO, E.G. LPMR + TLNN T,040000 ;OPCODES 040-077 QUALIFY. + TLCA T,(XCT) + JRST PFA13 ;YUP. + TLNE T,777000 ;SKIP IF OPCODE WAS XCT + JRST PFA9 +; TLZ T,777740 +; TLO T,(MOVEI T,) +;Following instruction is suspected of not working (sometimes using wrong AC block) +; XCTRI XEA,T ;COMP EFFECTIVE ADDRESS OF XCT IN USER CONTEXT +;; JRST PFA11 ;AND GO PROCESS INSTRUCTION AT THAT ADDRESS +; JRST [ MOVEM T,TRMNAM(U) ;TEMPORARY FOR DEBUGGING +; JRST PFA11 ] +; JRST PFA9 ;HERE IF FAULT WAS IN INDIRECT CYCLE +;Replacement code: +PFA15: DATAI PAG,TT ;HMM, SEE IF WRONG AC BLOCK SELECTED + TLNN TT,100 + BUG + LDB TT,[220400,,T] ;CHECK FOR NEED TO SIMULATE INDEXING + JUMPE TT,PFA16 + UMOVE TT,(TT) + ADD TT,T + HRR T,TT +PFA16: TLNN T,(@) ;CHECK FOR NEED TO SIMULATE INDIRECT + JRST PFA11 + XCTRI XR,[MOVE T,(T)] + JRST PFA15 ;PROCESS INDIRECT WORD + JRST PFA9 ;TAKE FAULT ON INDIRECT WORD +;End replacement code. +];KL10P + +IFN KS10P,[ + +EBLK + +IRP I,,[1,2,3,4,5,6,7] +PF!I!SVU: 0 ;Saved U at PI level I page fail +PF!I!SVT: 0 ;Saved T at PI level I page fail +PF!I!INS: 0 ;Instruction at PI level I page fail +TERMIN +IFN .-PF1SVU-21., .ERR Wrong length PFXSVU block. + +BBLK + +IRP I,,[1,2,3,4,5,6,7] +PF!I!AIL: ;;PI level I page fail comes here. + MOVEM T,PF!I!SVT ;Save T + MOVEM U,PF!I!SVU ;Save U + JSP U,PIFAIL ;Set up U and join common code +TERMIN +IFN .-PF1AIL-21., .ERR Wrong length PFXAIL block. +PFXSVT==:0,,> +PFXINS==:0,,> +PFXWRD==:0,,> +PFXOPC==:0,,> + +PIFAIL: MOVE T,PFXWRD(U) ;Check page fail word + TLNE T,%PFNXI + BUG AWFUL,[NON-EX IO REG WITH PI IN PROGRESS ],OCT,PFXWRD(U),[PC=],OCT,PFXOPC(U) + TLNE T,%PFNXM\%PFPAR + BUG AWFUL,[NXM OR PARITY ERROR WITH PI IN PROGRESS] + MOVE T,PFXOPC(U) ;Check for user mode. + TLNE T,%PSUSR + BUG AWFUL,[PAGE FAULT IN USER MODE WITH PI IN PROGRESS] + SKIPA T,(T) ;We assume that it wasn't the instruction + ;fetch itself that caused the fault. +PIFL2: MOVEI U,PF7AIL-PF7XCT(U) ;Correct U on return from PFXXCT + MOVEM T,PFXINS(U) ;Save instruction that caused fault + LSH T,-33 ;Look at opcode + CAIE T,XCTRI_-33 ;XCTRI gets special treatment: + JRST PIFL1 +REPEAT 2, AOS PFXOPC(U) ;Arrange for it to skip. + JRST PFXRET(U) ;And return. + +IRP I,,[1,2,3,4,5,6,7] +PF!I!RET: + MOVE T,PF!I!SVT ;Restore T + MOVE U,PF!I!SVU ;Restore U + JRST 2,@EPTP!I!O ;Return +TERMIN +IFN .-PF1RET-21., .ERR Wrong length PFXRET block. +PFXRET==:0,,> + +;;;Let XCT chains that end in XCTRI win. We assume that none of the +;;;fetches along the way to the XCTRI itself caused the fault. +PIFL1: CAIE T,XCT_-33 + BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS] + MOVE T,PFXSVT(U) ;Restore T + JRST PFXXCT(U) ;Go pick up word XCT'ed + +IRP I,,[1,2,3,4,5,6,7] +PF!I!XCT: + MOVE U,PF!I!SVU ;Restore U + MOVE T,@PF!I!INS ;Pick up XCTed instruction + JSP U,PIFL2 ;Set up U again and rejoin common code +TERMIN +IFN .-PF1XCT-21., .ERR Wrong length PFXXCT block. +PFXXCT==:0,,> + +EBLK + +PFLCLK: 0 ; Did page fault happen with CLKOFF? +PFLSVU: 0 ; Saved U during page fail +PFLSVT: 0 ; Saved T during page fail +PFLINS: 0 ; Faulting instruction + +BBLK + +;;; Note! +;;; If we are swapped out while running with Exec mode PC between PFAIL and +;;; PFAILE inclusive, EPTPFO is saved as our PC. (There are actually only +;;; a few PC's for which this is possible given that we mostly run CLKOFF.) + +PFAIL: SETZM PFLCLK + CONSO PI,1 + SETOM PFLCLK + CONO PI,CLKOFF ; Don't bother me + MOVEM U,PFLSVU ; Save U + MOVEM T,PFLSVT ; Save T + SKIPGE U,USER + BUG AWFUL,[PAGE FAULT IN NULL JOB] + MOVE T,EPTPFW ; Get the explanation + MOVEM T,UPFW(U) ; Save it for others + MOVE U,PFLSVU ; Restore U, only needed it for a moment. + TLNE T,%PFNXM\%PFPAR ; Bad stuff should interrupt us, right? + BUG AWFUL,[NXM OR PARITY ERROR DIDN'T INTERRUPT] + MOVE T,EPTPFO + TLNE T,%PSUSR ; In Exec mode? + JRST PFLUSR + MOVE T,(T) ; We assume that it wasn't the instruction + ; fetch itself that caused the fault. +PFLOOP: MOVEM T,PFLINS ; Save instruction that caused fault. + LSH T,-33 ; Check opcode for XCTRI + CAIN T,XCTRI_-33 ; Should we skip? + JRST PFLSKP + CAIN T,XCTR_-33 ; Touching user address? + JRST PFLUSR + CAIE T,UMOVE_-33 ; These guys are just like XCTR + CAIN T,UMOVEM_-33 + JRST PFLUSR + ;; Let XCT chains win. We assume that none of the fetches along + ;; the way caused the fault. + CAIE T,XCT_-33 + BUG HALT,[PAGE FAULT IN SYSTEM AT],OCT,EPTPFO + MOVE T,PFLSVT ; Restore T for a moment + MOVE T,@PFLINS ; Pick up XCTed instruction + JRST PFLOOP + +;;; Come here to cause faulting instruction to skip. +PFLSKP: MOVE T,PFLSVT ; Restore T +REPEAT 2, AOS EPTPFO + SKIPL PFLCLK ; Unless clock was already off + CONO PI,CLKON ; turn it back on +PFAILE: JRST 2,@EPTPFO + +;;; Come here on NXI error. +PFLNXI: + +;;; We come here when the page fault is "soft" and it happened in user mode +;;; or while using XCTR, UMOVE, or UMOVEM. +PFLUSR: MOVE T,EPTPFW + TLNN T,%PFNXI ; Non-existent IO Register? + JRST PFLU1 ; Nope + MOVE T,EPTPFO + TLNE T,%PSUSR ; NXI in User IOT mode is not fatal. + TLNN T,%PSUIO + BUG AWFUL,[NON-EX IO REG ],OCT,EPTPFW,[PC=],OCT,EPTPFO +PFLU1: MOVE T,PFLSVT ; Restore T + SKIPGE PFLCLK ; Check for lossage + BUG AWFUL,[PAGE FAULT WITH CLKOFF AT],OCT,EPTPFO +TPFLT1: SETOM PFAILF ; Cause CLK level to go to PFLU2 +CCLKRQ: CONO PI,CLKRQ + JRST . ; Takes a while to go off... + +;;;CLKBRK comes back here at CLK level. +PFLU2: MOVE T,EPTPFO + MOVEM T,CLKBRK ;Save PC of page fault as place interrupted + ;from. + LDB E,[$PFPNO,,UPFW(U)] ;E: Virtual page number + HLRZ D,UPFW(U) + ANDI D,%PFNXI\%PFWRT\%PF2.9\%PF2.8 ;D: Page fault code + MOVEI A,0 ;A: User interrupt bits + TRNE D,%PFNXI ;NXI in User IOT mode. + JRST PFA7A + +;Drops through into PFA5 + +] ;KS10P + +IFN KA10P,[ +CLKB1: MOVE T,CLKBRK + CONSZ 200 + JRST CLKFO1 ;FLOATING OVERFLOW ENABLED +CLKFO2: CONSZ 20 ;SKIP IF AR OV INT NOT ENABLED + CONSO 10 ;OV ENABLED, SKIP IF OV + CONSZ 270000 ;NOT OV, CHECK PDL OV, MEM PROTECT, NXM + JRST CLKB1C ;PDL OV, NXM, ETC + JRST CLKB1D ;ONLY CLOCK BREAK, AR OV JUST ENABLED + +CLKFO1: CONSO 100 ;SKIP ON FLOATING OVERFLOW + JRST CLKFO2 ;NOT REALLY FLOATING OVERFLOW +CLKB1C: JUMPL U,CNLJL ;NULL JOB LOST + MOVEI A,0 ;SET UP INTERRUPT BITS FOR USER + CONSZ 20 ;SKIP IF OV NOT ENABLED + CONSO 10 ;OV ENABLED, SKIP ON OV + JRST CLB1A ;NOT AROV + PUSHJ P,AROV +CLB1A: CONSZ 200 ;SKIP IF FL OV NOT ENABLED + CONSO 100 ;FL OV ENABLED, SKIP ON FL OV + JRST CLB1B ;NOT FLOATING OVERFLOW + PUSHJ P,ARFOV +CLB1B: CONSO 270000 ;SKIP IF PDL OV, NXM, OR MEM PROTECT + JRST CLB1X + CONSZ 10000 ;NON EX MEM + PUSHJ P,MEMHNG + CONSO 200000 + JRST CLKB1H + TRO A,%PIPDL ;PDL OVFLO + TLNN T,%PCUSR ;SKIP IF IN USER MODE + BUG HALT,[PDL OVERFLOW IN EXEC MODE] +CLKB1H: CONSO 20000 ;MEM PROTECT + JRST CLKB1G + HLLZ D,UPQUAN(U) ;PICK UP FAULT BITS + TLNE D,1000 + TLNN D,770 ;ALL CONDITIONS WHICH ABORT INSTRUCTION + JRST CLKB1J ;(PLUS PAGE NXM FOR RANDOMNESS) + TRZ A,%PIPDL ;INSTRUCTION ABORTED, DON'T SET PDL OV + HLLZ T,UPOPC(U) + LSH T,5 + HRR T,UPOPC(U) ;FIX UP OPC + MOVEM T,CLKBRK ;RESET PC FROM OPC + AOS NPGFLT + HLRZ E,UPJPC(U) ;GET VIRTUAL PAGE # (LH OF JPC) + TRNN E,400 + JRST CFHFPF + ANDI E,377 ;FLUSH AGE ETC +] ;KA10P + ;DROP THROUGH INTO PFA5 + +IFE KA10P,[ +PFA5: AOS NPGFLT +] ;IFE KA10P + MOVE TT,LUMPS + HRRZ W,USER +IFN KA10P,[ + TLNE D,320 ;SKIP IF REALLY PAGE FAULT + JRST CFH4 ;OTHERWISE WRITE IN READ ONLY OR EXECUTING IMPURE PAGE +] ;KA10P + +;COME HERE WITH +; A BITS FOR USER'S PIRQC +; D PAGE FAULT BITS OR CODE +; E VIRTUAL PAGE NUMBER OF PAGE FAILURE +; TT THE UMAPS SETTING +;THE MYSTERIES OF W: +; RH IS A USER INDEX +; LH 0 => NORMAL PAGE FAULT +; NON0 => SWAP IN REQUEST FOR OTHER REASON. D,TT SHOULD BE 0. +; SPECIFICALLY, +; 4.9 => DMA DEVICE SWAP-IN, SEE SWIRQB, SWPPIN +; 4.8 => FROM SCHEDULER, TO GIVE INTERRUPT (?) THIS IS NO LONGER USED, +; PROBABLY. +; 4.7 => FROM CFHAHD, TO PAGE AHEAD. THIS IS ONE LEVEL OF RECURSIVE +; USE OF CFHSW1. +; FOR A NORMAL PAGE FAULT, THE USER PC IS IN CLKBRK. + +CFHSW1: HRRZM E,CFHUVP ;USER'S VIRTUAL PAGE NUMBER + TRZN E,200 + JRST CFH1 + MOVEI C,UPGCPH(W) ;VIRTUAL ADDRESS IN USER'S HIGH SEG + TLNN TT,%UMMPU ;IS MY UPPER NORMAL? + JRST CFH2 ;YES, USE MY UPPER CPB + MOVEI C,UPGCPH(TT) ;NO, TRY HIS UPPER. + TLNE TT,%UMUTL ;IS MY UPPER GOING TO HIS LOWER? + MOVEI C,UPGCP(TT) ;YES, TRY HIS LOWER. + JRST CFH2 + +CFH1: MOVEI C,UPGCP(W) ;VIRT ADDRESS IN USER'S LOW SEG + TLNN TT,%UMMPL + JRST CFH2 ;MY LOWER DBR NOT HACKED + MOVEI C,UPGCP(TT) + TLNE TT,%UMLTU ;WAS MY LOWER HACKED TO POINT TO UPPER? + MOVEI C,UPGCPH(TT) ;YES. +CFH2: ROT E,-1 + ADD C,E + HRLI C,222200 + SKIPGE E + HRLI C,2200 + MOVE T,C ;CALCULATE MAP ENTRY B.P. FROM CIRC PTR B.P. + ADD T,[(200000-2000)UPGMP-UPGCP] + LDB E,C ;CIRC MEM USE POINTER FOR PAGE FAULT + JUMPE E,CFH4 ;ADDRESS IS IN REAL ILM + CAIN E,-1 + JRST CFH4 ;ON REFERENCE TO ABS PAGE ALSO ILM +IFN KL10P,[ CAIE D,%PFILW + JRST CFHW1 + LDB I,T + JRST .+1(I) + BUG ;? + JRST CFH4 ;WRITE IN READ ONLY? + JRST CFHRWF ;READ WRITE FIRST + BUG ;? +] ;KL10P +IFN KS10P,[ CAIN D,%PFWRT\%PF2.8 ;WRITE IN READ ONLY + JRST CFH4 + CAIN D,%PFWRT\%PF2.9 ;READ WRITE FIRST + JRST CFHRWF + TRNE D,%PF2.8\%PF2.9 ;PAGE NOT IN MAP + BUG HALT,[BOGUS PAGE FAIL CODE] +] ;KS10P +IFN KA10P,[ + TLNE D,40 + JRST CFHRWF +] ;KA10P +;REFERENCE TO PAGE WITH NO ACCESS IN MAP. +CFHW1: SKIPGE RPCL(W) + JUMPGE W,CFF1 ;BEING RPCLSRED? + MOVEM A,CFHAS + AOSE CIRPSW + JRST CFH5 ;CIRPSW NOT AVAILABLE + TRZE E,400000 + TRNE E,200000 + JRST CFHSW3 + CAML E,MMPMX + BUG ;MMP OUT OF RANGE + MOVE C,E ;CIRC PNTR ALREADY POINTS TO MMP + ADD C,MMPEAD + JRST CFHSW4 + +CFHSW3: PUSHJ P,UCPRL ;FIND MMP + 200000,,.+2 + BUG ;NONE? + SUB P,[4,,4] +CFHSW4: LDB D,[410200,,(C)] ;TWO BITS OF MMP ENTRY GIVES DISPOSITION OF PAGE + AOS NRPI(D) + JRST @CFHDT(D) + +CFHDT: CFHPI ;IN + CFHPCI ;COMING IN + CFHPO ;OUT + CFHPGO ;GOING OUT + +;PAGE FAULT IN JOB BEING PCLSR'D. +CFF1: MOVE C,CLKBRK + TLNE C,%PCUSR + BUG ;BEING RPCLSRED IN USER MODE +IFN KA10P,[ + MOVSI D,1770 + ANDCAM D,UPQUAN(W) ;CLR PG FLT + LPMR UPGML(W) + CONO 470000+APRCHN ;CLR PDL OV + QT OV + MPV + NXM +] ;KA10P + MOVE T,[BADBTS] + IOR T,MSKST(W) + AND T,A + IORM T,PIRQC(W) +IFE KA10P,[ + MOVE T,CLCX(W) ;RESTORE UPT BUT NOT ACS + HRLI T,300000 + DATAO PAG,T +] ;IFE KA10P + CONO PI,CLKOFF ;GO ALLOW SELF TO GET RPCLSRED + JRST 10,UFL1 ;GO INTO UFLS WITH CLK OFF RATHER THAN + ;IN PROGRESS + +CFHRWF: ;HANDLE "WRITE IN READ-WRITE-FIRST PAGE" PAGE FAULT. +IFN KA10P,[ + TLNE D,10 + JRST CFHW1 ;SOMETIMES NO ACCESS SEEMS TO BE ON TOO + LDB I,T + CAIE I,2 + BUG ;GOT "WRITE IN R-W-F PAGE" BUT PAGE ISN'T R-W-F. +] ;KA10P + MOVEI I,3 + DPB I,T + MOVEM A,CFHAS + JRST CFHX1 + +;; EXIT FROM PAGE FAULT HANDLING FOR NON-ERROR FAULT. +;; C SHOULD CONTAIN 0 IF CAN CONTINUE NOW, OR A FLSINS TO WAIT WITH. +;; A SHOULD CONTAIN -1 IF FAULT HANDLED SUCCESFULLY (PAGE IN OR ON ITS WAY), ELSE 0. +CFHX: SETOM CIRPSW + TLNN W,200000 + JUMPL W,CPOPJ +CFH5A: JUMPE C,CFHX1 ;IF NOT GOING TO WAIT, SKIP NPGWTU CODE + MOVSI D,%SWPGW + IORM D,USWST(W) ;WAITING FOR PAGE + AOS NPGWTU ;KEEP COUNT OF USERS WAITING FOR A PAGE + SKIPN FLSINS(W) + MOVEM C,FLSINS(W) + SKIPE FLSINS(W) + CLEARM DLSRCH +CFHX1: MOVE A,CFHAS +IFN KA10P, MOVSI D,1770 ;CLEAR FAULT STATUS BITS + MOVE U,USER + JRST CFH6 + +;; WAIT FOR CIRPSW TO BE AVAILABLE. +CFH5: SETZ A, + JUMPL W,CPOPJ + MOVE C,[SKIPL CIRPSW] + AOS NLPPGC + JRST CFH5A + +;PAGE FAULT ON PAGE THAT'S REALLY IN CORE. +CFHPI: PUSHJ P,CFHAHC ;SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND. + MOVSI D,MMPPGA + TDNE D,(C) + AOS NPGAHR ;COUNT NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED. + ANDCAB D,(C) + MOVSI D,MMPPGB + TDNE D,(C) + AOS NPGBHR ;COUNT NUMBER OF PAGES AGED BY PAGE-BEHIND WHICH WERE USED AGAIN. + ANDCAB D,(C) + HRLI C,2200 + PUSH P,C ;SAVE MMP ENTRY ADDRESS FOR PPIUM. + PUSHJ P,UCPRL + 100000,,.+2 ;RETURN ON MEMPNT + BUG ;NO MEMORY LINKED IN? + SUB P,[4,,4] ;FIND MEMBLT INDEX + POP P,C + TLNE D,MMPBAD ;WAS THIS PAGE RECENTLY A PAR ERR VICTIM? + JRST CFHPB ;YES; READ IT BACK OFF THE DISK IF POSSIBLE. +IFN E.SP,[ + JUMPGE W,E.SBAR ;IF NOT CALLED FROM SWPPIN + HRRZ H,DISUSR ;CHECK TO SEE IF SERVICING E&S + CAIN H,(W) ;NOT DISPLAY, THEN SKIP + PUSHJ P,E.SPGI ;ELSE TIE DOWN PAGE +E.SBAR: +] + MOVE A,T + HLLZS MMSWP(A) ;CLEAR LENGTH OF CIRC LIST (BUT NOT EXEC PGS COUNT) + MOVE D,C + HRLI D,(TDNE T,) + PUSHJ P,PPIUM ;PUT PAGE INTO USERS' MAPS +IFN E.SP,SETZM E.SPGH ; CLEAR QSWI1 FLAG + MOVEI C,0 + MOVNI A,1 + JRST CFHX + +;COME HERE FOR PAGE WHICH SEEMS TO BE IN CORE, BUT HAD A PAR ERR RECENTLY. +;"SWAP IT OUT", SO IF IT'S PURE IT WILL JUST BE READ BACK FROM DISK. +CFHPB: PUSH P,W + MOVE A,T + SETOM CIRPSW ;UNLOCK, SO SWPOPG CAN RE-LOCK. + MOVE C,USER ;TELL SWPOPG WHICH JOB SHOULDN'T BE PCLSR'ED. + PUSHJ P,SWPOPL ;"SWAP OUT" THE PAGE (EVEN IF LOCKED DOWN) + JRST [ POP P,W ;FAILED TO GO OUT. COULD BE EXEC PAGE POINTING TO IT, + SETZ A, ;OR A JOB THAT CAN'T BE PCLSRED RIGHT NOW. + MOVSI C,(CAIA) ;WAIT A LITTLE AND TRY AGAIN (HOPE FOR THE BEST) + JRST CFHX ] + POP P,W + AOSE CIRPSW ;SWPOPG UNLOCKS; RE-LOCK. + JRST CFH5 ;OR ELSE GO INTO PAGE-WAIT TILL CIRPSW FREE. + MOVE C,SWOMMP + JRST CFHSW4 ;TRY AGAIN TO REFERENCE PAGE, SWAPPING IT BACK IN. + +;ON A RANDOM PAGE FAULT, SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND. +;ASSUMES W SET UP AS FOR CFHSW1, AND TT +CFHAHC: MOVE D,CFHUVP ;GET USER'S VIRTUAL PAGE NUMBER. + TLNN W,-1 ;PAGE AHEAD ONLY FOR NORMAL PAGE FAULT (SO PC IS IN CLKBRK). + SKIPN PAGAHD(W) ;IS PAGE-AHEAD WANTED FOR THIS JOB? + POPJ P, + MOVSI T,%UMMPU + TRNN D,200 + MOVSI T,%UMMPL + TDNE TT,T ;NO PAGE-AHEAD ON PAGE NOT MAPPED NORMALLY. + POPJ P, + HLRZ H,PAGRAN(W) + HRRZ T,PAGRAN(W) + CAML D,H ;IS PAGE IN RANGE FOR AUTOMATIC PAGE-AHEAD? + CAML D,T ;IF SO, GO DO IT. + POPJ P, + PUSH P,C + PUSHJ P,CFHAHD + POP P,C + POPJ P, + +;AUTOMATIC PAGE-AHEAD AND PAGE-BEHIND. +;WHEN PAGE N IS PUT INTO THE MAP, PAGE N+1 IS SWAPPED IN +;AND PAGE N-1 IS SWAPPED OUT. +;(ACTUALLY, 1 IS A PARAMETER, IN THE PAGAHD VARIABLE) +CFHAHD: PUSH P,CFHUVP +;LOOP, REQUESTING SWAP-IN FOR THE NEXT N PAGES. E HAS PAGE NUMBER TO SWAP IN. +CFHAH1: MOVE E,CFHUVP + HLRE A,PAGAHD(W) + MOVE T,A + ADD A,(P) + CAMN A,E ;DETECT END OF LOOP. + JRST CFHAH2 + SKIPL T ;ELSE INCREMENT OR DECREMENT PAGE NUMBER. + AOSA E + SOS E + PUSHJ P,CFHRNG ;IS PAGE NUMBER IN RANGE FOR PAGE-AHEAD? + JRST CFHAH2 + PUSH P,W + HRLI W,500000 ;PAGE AHEAD THE PAGE. 100000 MEANS PAGE-AHEAD. + SETZB D,TT + SETOM CIRPSW ;ALLOW CFHSW1 TO LOCK CIRPSW. + PUSH P,CFHAS + PUSHJ P,CFHSW1 + POP P,CFHAS + SETZM CIRPSW ;BUT REALLY IT'S ALREADY LOCKED SO KEEP IT SO. + POP P,W + SKIPN A + AOS NPGAH1 ;COUNT NUMBER OF TIMES AN ATTEMPT FAILS. + JRST CFHAH1 + +;NOW IT'S TIME FOR PAGE-BEHIND. E HAS PAGE NUMBER TO SWAP OUT. +CFHAH2: MOVE E,(P) +;???? IS THERE ANY NEED TO PRESERVE U, EVER, INSIDE CFHSW1? + PUSH P,U + HRRE A,PAGAHD(W) ;GET PAGE-BEHIND DISTANCE. + JUMPE A,CFHAH4 + ADDB A,E ;COMPUTE WHICH PAGE TO PAGE OUT. + PUSHJ P,CFHRNG ;SKIP IF PAGE IS IN RANGE FOR PAGE-BEHIND. + JRST CFHAH4 + MOVE U,W + PUSHJ P,UPLC ;LOOK UP THE PAGE IN THE MAP. + LDB D,Q ;D GETS CIRC PNTR + JUMPE D,CFHAH4 ;NO PAGE THERE + CAIN D,-1 + JRST CFHAH4 ;ABSOLUTE PAGE, DO NOTHING. + LDB D,T + TRO D,PMAGEM ;AGE THE PAGE, IF THE PAGE IS REALLY IN THE MAP, + TRNE D,600000 + DPB D,T + AOS NPGBHA ;COUNT PAGES AHED FOR PAGE-BEHIND. + MOVE D,T ;SAVE B.P. TO PAGE MAP HALFWORD, FOR CFHAH6. + MOVE C,Q ;STARTING FROM CIRC PTR, FIND MMP + PUSHJ P,UCPRL + 200000,,.+2 + BUG ;IF NONE FOUND + SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT + MOVE E,C ;SAVE ADDRESS OF MMP ENTRY + MOVSI T,MMPTMP\MMPOUT ;IF PAGE IS IN TRANSIT OR OUT, DO NOTHING TO IT. + TDNE T,(C) + JRST CFHAH6 + MOVE T,CLKBRK + TLNN T,%PCUSR ;IF JOB IN EXEC MODE, CAN'T SWAP OUT PAGE, SO JUST LEAVE AGED. + JRST CFHAH6 + MOVE T,MEMFR + SUB T,NCBCOM ;IF LOTS OF FREE MEM, DON'T SWAP OUT. + SUB T,SILNG + CAML T,CFHAHS + JRST CFHAH6 + PUSHJ P,UCPRL ;GET CORE PAGE NUMBER IN T. + 100000,,.+2 + BUG + SUB P,[4,,4] + HLRZ A,MMSWP(T) + JUMPN A,CFHAH6 ;POINTED TO BY AN EXEC PAGE, E.G. 340, CAN'T SWAP OUT. + PUSH P,E + PUSH P,D + PUSH P,W + MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT + HRRZ C,W ;DON'T PCLSR ME + SETOM CIRPSW ;SWPOPG WILL WANT TO RE-LOCK CIRPSW. + PUSHJ P,SWPOPG ;SWAP OUT + JRST CFHAH5 ;CAN'T SWAP OUT => LEAVE JUST AGED. + AOS NPGBHD ;COUNT PAGES SWAPPED OUT BY PAGE-BEHIND. +CFHAH5: POP P,W + POP P,D + POP P,E + POP P,U + POP P,CFHUVP + AOS CIRPSW ;SWPOPG UNLOCKS; RE-LOCK. + POPJ P, ;CAN'T GET LOCKED BY SOMEONE ELSE, WE ARE AT CLOCK LEVEL + +;HERE FOR PAGE-BEHIND PAGE WHICH WE CAN'T OR DON'T WANT TO SWAP OUT. +CFHAH6: MOVSI T,MMPPGB ;IT HAS ALREADY BEEN AGED. MARK IT FOR METERING PURPOSES. + IORM T,(E) ;E POINTS TO MMP ENTRY. +CFHAH4: POP P,U + POP P,CFHUVP + POPJ P, + +;SKIP IF PAGE NUMBER IN E IS IN RANGE FOR PAGE-AHEAD OR PAGE-BEHIND. +;ASSUMES USER INDEX IN W. CLOBBERS T. +CFHRNG: CAIL E,400 + POPJ P, + HLRZ T,PAGRAN(W) + CAIGE E,(T) + POPJ P, + HRRZ T,PAGRAN(W) + CAIL E,(T) + POPJ P, + JRST POPJ1 + +EBLK + +CFHAHS: 20 ;IF LESS THAN THIS MUCH FREE MEM, PAGE-BEHIND SHOULD SWAP OUT. + +NPGAHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED IN FOR PAGE-AHEAD. +NPGAH1: 0 ;NUMBER OF TIMES WE WERE UNABLE TO PAGE AHEAD. +NPGBHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED OUT FOR PAGE-BEHIND. +NPGBHA: 0 ;NUMBER OF PAGES WE DID PAGE-BEHIND. +NPGAHR: 0 ;NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED. +NPGBHR: 0 ;NUMBER OF PAGES AGED FOR PAGE BEHIND AND USED AGAIN. + +BBLK + +;REFERENCE TO SWAPPED OUT PAGE, MMP ADDRESS IN C. SWAP IN THE PAGE. +;W HAS THE USER INDEX AND FLAGS. +CFHPO: PUSHJ P,CFHPOA + JRST [ SETZ A, ;FAILED. RETURN CODE FOR FAILURE, IF THIS IS FOR DEVICE (W<0). + JRST CFHX] + TLNN W,100000 ;IF THIS IS A PAGE-AHEAD REQUEST, + JRST CFHPOB + MOVSI A,MMPPGA ;MARK THE MMP ENTRY SO, + IORM A,(C) + AOS NPGAHD ;AND COUNT IT AS A SUCCESSFUL ATTEMPT TO PAGE AHEAD. +CFHPOB: TLNN W,200000 + JUMPL W,CFHPO2 + PUSHJ P,CFHAHC ;ORDINARY PG FAULT => MAYBE PAGE AHEAD. + MOVSI D,%SWBEM +IFN SWPWSP,[ ;SWAPPING IN A PAGE FOR THIS GUY + ANDCAM D,USWST(W) ;SO CLEAR BEST EFFORT MADE TO SWAP OUT BIT +];SWPWSP +IFE SWPWSP,[ + TDNN D,USWST(W) ;IF JOB IS BRINGING IN FIRST PAGE + JRST CFHPO2 ; SINCE BEING SWAPPED OUT, + ANDCAM D,USWST(W) ;CLEAR BEST EFFOR MADE TO SWAP OUT BIT + EXCH U,W ;AND MAKE SWAP HISTORY TABLE ENTRY + MOVSI T,0 ;FOR "BEGIN LOADING" + PUSHJ P,SWPKHT + EXCH U,W +];SWPWSP +CFHPCI: +CFHPGO: +CFHPO2: MOVNI A,1 ;SIGNAL "SUCCESS" + TLNN W,200000 + JUMPL W,CFHX + MOVSI D,MMPTMP ;BIT ON IF PAGE "IN TRANSIT" + SKIPN FLSINS(W) + MOVEM D,EPDL2(W) ;HANG USER UNTIL PAGE GETS WHERE IT'S GOING + HRLI C,(TDNE T,) ;COMBINE WITH ADDRESS OF MMP + AOS NLPPAG + JRST CFHX + +;SWAP IN PAGE. W HAS USER INDEX AND FLAGS. C HAS MMP ADDRESS. +;SKIPS IF SUCCESSFUL. OTHERWISE RETURNS FLSINS IN C. +;SIGN BIT IN W IS SET FOR SWAP IN FOR DEVICE OR FOR PAGE-AHEAD +;(THAT IS, NOT ONE WHICH A JOB MUST WAIT FOR) +;SO DON'T INCREMENT SOME COUNTERS AND DON'T BOTHER WITH FLSINS IN C. +CFHPOA: +IFE SWPWSP,[ + SKIPGE USWSCD(W) ;IF SWAP BLOCKED, EITHER UNBLOCK OR GIVE UP. + JRST CFBO1 +CFBO2: +];SWPWSP +IFN SWPWSP,[ + MOVE E,USWST(W) ;IF SWAPPED OUT, WE ARE EITHER GOING TO ENTER + TLNE E,%SWOUT ;THE LOADING STATE OR THE SWAP BLOCKED STATE + JRST CFSB +CFSB1: +];SWPWSP + MOVSI E,MMPISW + AND E,(C) + CONO PI,UTCOFF-1 + JUMPN E,CFHPO5 ;INITIAL SWAPIN; GIVE UP AND WAIT NOW IF TUT IS LOCKED. +CFHPO7: PUSHJ P,HMRQC ;GET PHYS MEM BLOCK, NUMBER IN A. + JRST CFHPO1 ;MEM NOT AVAILABLE + MOVEI B,1 + DPB B,[410200,,(C)] ;INDICATE COMING IN + HRRZ B,(C) ;OLD CP OF MMP + MOVEM B,MEMPNT(A) ;BECOMES LINK OUT OF CORE BLOCK + HLRZ B,1(C) ;B := DISK ADDRESS + LDB I,[$MMPUN,,(C)] ;I := DISK NUMBER + CAIL I,NQS + BUG + HRLM B,MEMPNT(A) ;SET DISK ADDRESS CORE BLOCK COMING FROM +IFN SWPWSP,[ + MOVE D,USWST(W) + TLNN D,%SWLOD + AOSA NPLBNL + AOS NPLBLJ +];SWPWSP + SKIPE E ;IF INITIAL SWAP IN PAGE, SOS THE TUT NOW + PUSHJ P,CFHPO8 ;SINCE WE ARE DISSOCIATING THE PAGE FROM THE DISK BLOCK. + CAIGE A,TSYSM + CAIGE A,SYSB + BUG ;SHOULDN'T HAVE TO SWAP IN THE SYSTEM + CONO PI,UTCON-1 ;LEAVE CLKCHN OFF. + SOS NPGSWO + AOS SWIPRQ ;TOTAL SWAP IN REQUESTS +;; MARK THE PHYSICAL MEMORY BLOCK AS BEING SWAPPED INTO BY THIS PAGE. + MOVEI B,MUSWPG + DPB B,[MUR,,MEMBLT(A)] + MOVEI B,600000(A) + HRRM B,(C) ;MAKE CP OF MMP POINT TO MEMPNT + MOVE TT,C + SUB TT,MMPEAD + DPB TT,[MMMPX,,MEMBLT(A)] ;STORE MMP INDEX IN MEMBLT + MOVEI TT,.BM MLO + ANDCAM TT,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK +;; PUT THE TRANSFER ON THE SWAP IN LIST. + CONO PI,UTCOFF-1 + HLRZ TT,SINLST(I) ;GET PREV BLOCK + SKIPE TT + DPB A,[MLO,,MEMBLT(TT)] ;CHAIN TO PREV BLOCK + SKIPN TT + MOVEM A,SINLST(I) ;OR TO HEADER IF FIRST + HRLM A,SINLST(I) ;AND SET NEW LAST BLOCK + AOS SILNG ;AOS NUMBER OF PENDING SWAP IN RQS. + PUSHJ P,QSTRT1 ;WAKE UP DISK INTERRUPT LEVEL. + CONO PI,UTCON-1 +;; UPDATE SWAP HISTORY TABLE. + HRLZ TT,W + IDIVI TT,LUBLK ;TT 3.1-3.8 GETS USER NUMBER, BASHES I +IFN SWPWSP,[ + MOVSI T,%SWLOD + TDNE T,USWST(W) + TLO TT,(SETZ) +];SWPWSP + MOVE T,CFHUVP + DPB T,[321000,,TT] + HRR TT,TIME + MOVEM TT,@PGIHTP + AOS T,PGIHTP + MOVE TT,UTRNTM(W) + MOVEM TT,PGIHTL-1(T) + MOVEI TT,PGIHTB + CAIL T,PGIHTB+PGIHTL + MOVEM TT,PGIHTP + TLNN W,200000 + JUMPL W,POPJ1 + AOS USIPRQ(W) + JRST POPJ1 ;HANG USER UNTIL PAGE IN + +;IF SWAPPNG IN "INITIAL SWAP IN" PAGE, CHECK TO SEE WHETHER TUT IS AVAILABLE. +;WE CAN'T SWAP THE PAGE IN IF NOT. +CFHPO5: LDB I,[$MMPUN,,(C)] ;GET DSK # + CAIL I,NQS + BUG + SKIPL QTUTO(I) + JRST CFHPO7 ;DISK TUT AVAIL + CONO PI,UTCON-1 + TLNN W,200000 + JUMPL W,CPOPJ ;NO COUNTER AOS IF SWAPIN FOR DEVICE OR PAGE AHEAD. + MOVE C,[SKIPGE QTUTO] ;ALSO MUSTN'T SMASH C + ADD C,I + AOS NLPPGT + POPJ P, + +;LATER ON, COME HERE TO SOS THE TUT, AFTER GETTING THE MEM, WHEN WE CAN NO LONGER BLOCK. +CFHPO8: ANDCAM E,(C) ;CLEAR INITIAL SWAPIN BIT + MOVE D,B ;GET TRK # + PUSHJ P,TUTPNT + CAIGE B,TUTMNY + SOJL B,[JRST 4,.] + DPB B,D + HRRZS 1(C) ;CLEAR ASSIGNED TRACK NUMBER SO NEW SPACE ASSIGNED ON SWAPOUT + POPJ P, + +;HERE IF NO MEMORY TO SWAP PAGE INTO. +CFHPO1: CONO PI,UTCON-1 + TLNN W,200000 + JUMPL W,CPOPJ + SKIPGE MEMFRZ ;IF BECAUSE MEMFRZ LOCKED, MAKE JOB WAIT FOR MEMFRZ. + JRST CFHPO4 + MOVE C,[SKIPL MEMFRZ] + AOS NLPPGM + POPJ P, + +CFHPO4: MOVE C,[PUSHJ P,CFHPO3] + MOVN D,SOLNG + SUB D,SWPOPR ;- # PGS GOING OUT + ADDI D,10. ;MAKE SURE AT LEAST 10. GOING OUT + JUMPLE D,.+2 + ADDM D,SWPOPR + MOVEI D,1 + SKIPN FLSINS(W) + MOVEM D,EPDL2(W) + AOS NLPPG3 + POPJ P, + +CFHPO3: PUSH P,A ;FLSINS ROUTINE (NEEDED MEM) + MOVE A,MEMFR + SUB A,NCBCOM + CAIL A,5(T) + JRST POPAJ1 ;NEEDED MEM AVAILABLE + ADD A,SOLNG + ADD A,SWPOPR + SUBI A,10.(T) + JUMPGE A,POPAJ ;WILL EVENTUALLY WIN + MOVNS A + ADDM A,SWPOPR ;LOSING - SWAP SOME MORE STUFF OUT + JRST POPAJ + +IFE SWPWSP,[ +;HERE IF TRYING TO SWAP IN A PAGE BUT SWAP BLOCKED +CFBO1: MOVE E,MEMFR ;GUY SWAPPED BLOCKED + SUB E,NCBCOM + SUB E,AUSOPG + SUB E,SILNG + ADD E,SOLNG + JUMPGE E,CFBO3 ;SEEMS TO BE ROOM SO LET IT COME IN + TLNN W,200000 + JUMPL W,CPOPJ ;HANG GUY UNTIL SWAP BLOCK GOES AWAY + MOVE C,[SKIPGE USWSCD] + ADDI C,(W) + AOS NTSBUB + AOS NLPPGB + POPJ P, + +CFBO3: AOS NTSBUP + JRST CFBO2 +];SWPWSP + +OVHMTR WS ;WORKING-SET COMPUTATIONS + +IFN SWPWSP,[ +;HERE WHEN A SWAPPED OUT OR SWAP BLOCKED JOB TRIES TO SWAP IN A PAGE. +;JOB IN W, C -> MMP, USWST(W) IN E. RETURN TO CFSB1. +;WE DECIDE WHETHER ENOUGH CORE CAN BE GARNERED TO LET HIM IN, AND PUT +;HIM INTO THE LOADING STATE, OR ELSE PUT HIM INTO THE SWAP BLOCKED STATE. + +CFSB: PUSH P,C + TLNN E,%SWSB ;ALREADY SWAP BLOCKED? + PUSHJ P,WSRCM ;NO, RECOMPUTE WORKING SET + POP P,C + MOVE B,USWPRI(W) ;FIND SUM OF WS'S OF SWAPPED IN GUY'S WITH BIGGER USWPRI + PUSHJ P,WSAVL + MOVE D,USVWRK(W) ;COMPUTE AMT OF WS NOT ALREADY IN CORE + SUB D,UWRKST(W) +IFL TSYSM-356.,[ + CAML D,[TSYSM-100.,,] + JRST .+3 ;WS > PHYSICAL MEM, ALLOW IN ANYWAY, FOO! +];TSYSM + CAMGE A,D ;WILL IT FIT IN AVAILABLE MEM? + JRST CFSB2 ;NO, SWAP BLOCK + PUSHJ P,CFELD ;YES, ENTER 'LOADING' STATE + JRST CFSB1 ;AND GO AHEAD AND BRING IN THE PAGE + +CFSB2: TLNN W,200000 ;IF PAGE-AHEAD, JUST RETURN. + JUMPL W,CPOPJ + MOVE T,TIME + MOVSI A,%SWSB ;ALREADY SWAP BLOCKED? + TDNE A,USWST(W) + JRST CFSB3 + IORM A,USWST(W) ;NO, ENTER SWAP BLOCKED STATE + AOS NUSWB + MOVEM T,USWTIM(W) +CFSB3: MOVE U,W + MOVSI T,3_16. ;MAKE SWAP HISTORY TABLE ENTRY FOR SWP BLK + PUSHJ P,SWPKHT + MOVE T,TIME + SUB T,USWTIM(W) ;HOW LONG SWAP BLOCKED + CAIGE T,20.*30. ;IF LESS THAN 20 SECONDS, + SKIPA T,[15.] ; SLEEP FOR 1/2 SECOND, + MOVEI T,5*30. ; OTHERWISE SLEEP FOR 5 SECONDS + ADD T,TIME + SKIPN FLSINS(W) + MOVEM T,EPDL2(W) + MOVEI A,0 ;WILL THEN TAKE FAULT AGAIN AND + MOVE C,[CAMLE T,TIME] ;CHECK AVAILABLE MEMORY AGAIN + AOS NLPPGB + POPJ P, + +;ROUTINE TO FIND MEMORY AVAILABLE TO A JOB WHOSE USWPRI IS IN B +;RETURNS IN LH(A) SUITABLE FOR COMPARING TO UWRKST. SMASHES T,TT,J + +WSAVL: MOVEI J,2*LUBLK ;DON'T LOOK AT SYS NOR CORE JOB + MOVSI T,%SWOUT+%SWLOD ;IF THESE BITS CLEAR, JOB IS SWAPPED IN + MOVE A,MEMFR ;FREE CORE + SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS + SUB A,SILNG ;.. + ADD A,SOLNG ;.. + ADD A,NLOOSP ;LOOSE PAGES ARE EVICTABLE + SUB A,SWPOPR ;DON'T COUNT PAGES ALREADY COMMITTED TO EVICT + HRLZI A,-4(A) ;ALIGN AS UWRKST AND ALLOW 4 PAGES OF SLOP + SKIPA TT,TIME ;TO SEE IF PROTECTED AGAINST MEMORY PREEMPTION +WSAVL1: ADDI J,LUBLK + CAML J,USRHI + POPJ P, + SKIPE UNAME(J) + TDNE T,USWST(J) + JRST WSAVL1 ;DOESN'T EXIST, OR NOT SWAPPED IN, OR LOADING + CAMGE B,USWPRI(J) + CAMGE TT,USWTIM(J) + JRST WSAVL1 ;HIGHER PRIORITY OR PROTECTED + ADD A,UWRKST(J) ;THIS GUY'S WORKING SET IS PREEMPTABLE + JRST WSAVL1 + +;Routine to re-compute working set, also re sets up map +;to point to any pages which are swapped in but not mapped in. +;This is necessary in order to get the proper estimate of +;how much core is going to have to be swapped out to make +;this job fit. Called when a job leaves the swapped-out state, +;to enter either Loading or Swap-blocked. +;Job is in W, smashes A,B,C,D,E,T,TT,H,I,U. +;Call with CIRPSW locked and clk in progress. +WSRCM: SETZM UWRKST(W) + MOVEI E,UPGMP(W) ;SET UP SCAN OF USER'S MAP + HRLI E,442200 + MOVEI C,UPGCP(W) ;AND OF CIRCULAR POINTERS + HRLI C,442200 + LDB D,[121100,,HUSRAD(W)] ;# OF USER PAGES +WSRCM1: ILDB A,E ;GET PAGE MAP ENTRY + ILDB B,C ;AND CIRCULAR POINTER + JUMPE A,WSRCM2 ;JUMP IF PAGE DOESN'T EXIST + CAIN B,-1 + JRST WSRCM2 ;ABS PAGE, DON'T COUNT + TRNN A,600000 ;ALREADY SWAPPED IN? + JRST WSRCM3 ;NO, GO PONDER + ANDI A,PMRCM ;GET PAGE MAPPED TO + HRRZ B,MMSWP(A) ;GET # SHARERS + MOVSI A,1 ;COMPUTE WS ADJUSTMENT + IDIV A,B + ADDM A,UWRKST(W) +WSRCM2: SOJG D,WSRCM1 ;LOOP + POPJ P, + +WSRCM3: PUSH P,C ;PAGE NOT MAPPED, SEE IF IT'S IN + PUSHJ P,UCPRL + 100000,,WSRCM4 ;RETURN WITH 4 PUSHES IF MEMORY IN LOOP + POP P,C ;NO MEMORY, LEAVE ALONE + SOJG D,WSRCM1 + POPJ P, + +WSRCM4: SUB P,[4,,4] ;FOUND MEMORY, IN T + TRNE A,2 + MOVEI A,2 ;USE READ/WRITE/FIRST RATHER THAN READ/WRITE + LSH A,20 + IORI A,PMCSHM(T) ;SET UP MAP + DPB A,E + AOS C,MMSWP(T) ;ONE MORE USER POINTING TO PAGE + MOVSI A,1 + MOVEI B,-1(C) + IDIVM A,B ;ADJUST WS AS IF WAS ALREADY POINTING TO PAGE + ADDM B,UWRKST(W) ;ADDM DOES NOTHING IF THERE WAS DIVIDE BY ZERO + IMULI C,-1(C) ;COMPUTE WS DECREASE DUE TO ADDITIONAL SHARING + MOVNI C,(C) + IDIV A,C ;IF DIVIDE BY ZERO, A GETS RIGHT THING! + MOVE C,(P) ;ADJUST ALL SHARER'S WS'S + PUSHJ P,UCPRL + SETZ WSRCM5 + POP P,C + SOJG D,WSRCM1 + POPJ P, + +WSRCM5: ADDM A,UWRKST(U) + POPJ P, + +;LEAVE LOADING STATE IF IN IT. JOB IN U, SMASH C,TT,T,I +LVLOAD: MOVE C,USWST(U) + TLZN C,%SWLOD + POPJ P, ;NOT IN LOADING STATE +LVLOA0: MOVEM C,USWST(U) ;TURN OFF LOADING STATE + MOVE T,TIME + SUB T,USWTIM(U) ;TIME IT TOOK TO LOAD + IMUL T,LODFCT ;COMPUTE PROTECT TIME + HLRZS T + ADD T,TIME + MOVEM T,USWTIM(U) + MOVSI T,1_16. ;MAKE SWAP HISTORY TABLE ENTRY + JRST SWPKHT + +;PUT JOB IN W INTO THE 'LOADING' STATE. CALL WITH D CONTAINING USVWRK-UWRKST. +;WSRCM MUST HAVE BEEN CALLED ALREADY ON THIS JOB. SMASHES A,D,T,TT,I + +CFELD: MOVE T,USWST(W) + TLNE T,%SWSB + SOS NUSWB ;CEASES TO BE SWAP-BLOCKED + TLZ T,%SWOUT+%SWSB+%SWDSO+%SWBEM + TLO T,%SWLOD + MOVEM T,USWST(W) + MOVE T,TIME ;SAVE TIME STARTED TO LOAD + MOVEM T,USWTIM(W) + MOVE U,W + MOVSI T,0 ;MAKE SWAP HISTORY TABLE ENTRY + PUSHJ P,SWPKHT + JUMPLE D,CPOPJ + HLRZ D,D ;NUMBER OF PAGES GOING TO NEED, PROBABLY + MOVE A,MEMFR ;FREE CORE + SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS + SUB A,SILNG ;.. + ADD A,SOLNG + SUB D,A ;NUMBER OF PAGES GOING TO HAVE TO SWAP OUT + SKIPLE D + ADDM D,SWPOPR ;START THEM GOING OUT NOW + POPJ P, +];SWPWSP + +OVHMTR FLT ;MISC FAULTS + +CFH4: TLNE W,100000 ;PAGE-AHEAD OF NON-EX PAGE: DO NOTHING. + POPJ P, + JUMPL W,SWIILM ;IF FROM DMA DEVICE, GIVE ERROR +;HERE FOR FAULTS WHICH ABORT THE INSTRUCTION. +PFA7: MOVE T,OPTION(U) ;IF USER WANTS IT, + TLNN T,%OPOPC ;GIVE HIM THE OPC RATHER THAN + AOSA T,CLKBRK ;THE INCREMENTD PC. +PFA7A: MOVE T,CLKBRK ;HERE FOR KL10 MAR BREAK AND KS10 NXI + ;ERROR, ALWAYS GIVE ORIGINAL PC, INST + ;ABORTED + TLNE T,%PCUSR + JRST CLKB1J + MOVEI C,IOADCR ;FROM EXEC MODE SO RESET PC TO IOADCR + EXCH C,CLKBRK + HRRM C,LEXFDR(U) ;AND SAVE FAULT EXEC ADR FOR DEBUGGING + CLEARM DLSRCH ;IN CASE IT WAS SET + CLEARM UMAPS(U) ;RESTORE NORMAL MAP IN CASE RANDOM ONE WAS + ;IN USE + +CLKB1J: HRLM D,LEXFDR(U) ;SAVE PF BITS FOR DEBUGGING PURPOSES + +IFN KS10P,[ TRNE D,%PFNXI ;Non-existent IO register in KS10 Unibus. + TLO A,(%PINXI) +] ;KS10P + +IFN KS10P, TRNN D,%PFNXI\%PF2.9\%PF2.8 +IFN KA10P, TLZE D,210 ;NO ACCESS OR DBL +IFN KL10P, CAIN D,%PFPNA + TRO A,%PIMPV ;ILM + +IFE KS10P,[ +IFN KA10P, TLZE D,20 ;PURE +IFN KL10P, CAIN D,%PFPRO + TLO A,(%PIFET) +] ;IFE KS10P + +IFN KS10P, CAIN D,%PFWRT\%PF2.8 +IFN KA10P, TLZE D,100 ;W IN RD ONLY +IFN KL10P, CAIN D,%PFILW + TLO A,(%PIWRO) + + TDNE A,[%PIMPV\%PIWRO\%PINXI] + PUSHJ P,MPVMAS ;SAVE FAULT PAGE # FOR DEBUGGING + +;;; NO ABORT-TYPE FAULTS, CHECK OTHERS: + +IFE KS10P,[ +IFN KL10P, CAIN D,%PFMAR +IFN KA10P, TLZE D,2 + PUSHJ P,PCMARB +] ;IFE KS10P + +IFN KA10P,[ TLZE D,2000 + PUSHJ P,CPROC1 ;ONE PROCEED + ANDCA D,UPQUAN(U) ;GET BITS FLUSHED BY TLZE'S +] ;KA10P + +CFH6: +IFN KA10P,[ + ANDCMI D,-1 ;DON'T CLOBBER USER'S RUNTIME. + TLZ D,4 ;DON'T CLOBBER EXEC PAGING FLAG. + TLO D,1 ;IGNORE QUANTUM-TIMEOUT INT. + ANDCAM D,UPQUAN(U) +] ;KA10P +CLKB1K: LPMR UPGML(U) +CLKB1G: IFN KA10P, CONO 470000+APRCHN ;RESET +CLB1X: MOVE T,CLKBRK ;PUT USER'S PC WHERE IT BELONGS + MOVEM T,UPC(U) + MOVE B,[BADBTS] + IOR B,MSKST(U) ;GET OR OF ENABLED AND BAD BITS + AND B,A ;GET AND WITH BITS ACTUALLY ON + JUMPE B,CLB1XA ;NOT BAD OR ENABLED, FORGET ABOUT IT + IORM B,PIRQC(U) ;GIVE INTERRUPT + CAIN T,IOADCR ;READY TO BE INTERRUPTED? + JRST CLKB5 ;NOT QUITE, RUN MOMENTARILY AND WILL UFLS +IFN SCHBLN,SETZM SCHMNY ;DO FULL SCHEDULE TO DELIVER THE INTERRUPT + JRST SCHED2 + +CLB1XA: MOVSI T,%SWINT .SEE INTPFL ;IF PAGE FAULT DUE TO USER TRYING TO + TDNN T,USWST(U) ;INTERRUPT, BETTER SCHED SO HE GETS THE INT. + SKIPE FLSINS(U) ;ELSE PROCEED THE USER IF HE HAS GOT WHAT HE WANTED. + JRST SCHED2 ;OR IF HE'S WAITING, GO SCHEDULE. + JRST CLKB5 + +IFN KA10P,[ ;NULL JOB LOST +CNLJL: CONSZ 230220 ;SKIP ON JUST "ADDR BREAK" (QUANTUM OVERFLOW) + BUG PAUSE,[KA: APR ERROR IN NULL JOB] + CONO 470000+APRCHN + JRST SCHED + +CFHFPF: BUG PAUSE,[PAGE FAULT IN SYSTEM, PC=],OCT,CLKBRK,[PAGE=],OCT,E + MOVSI D,1770 ;FALSE PAGE FAULT + MOVEI A,0 + JRST CFH6 +] ;KA10P + +EBLK +RINT: 0 +BBLK + CONI RINTAP ;SAVE STATUS IN CASE SOMEONE DUMPS IT + CONI PI,RINTPI + BUG AWFUL,[RANDOM INTERRUPT, APR ],OCT,RINTAP,[PI ],OCT,RINTPI + JRST 12,@RINT ;YOU CAN TRY PROCEEDING + +EBLK +RINTAP: 0 ;APR STATUS AT RINT +RINTPI: 0 ;PI STATUS AT RINT + +IFN KS10P,[ ; On KS, all random interrupts are created equal. +BBLK +RINT1==:RINT +] ;IFN KS10P + +IFE KS10P,[ +R1NTAC: BLOCK 20 +RINT1: 0 +BBLK + MOVEM 17,R1NTAC+17 + MOVEI 17,R1NTAC + BLT 17,R1NTAC+16 + MOVEI J,1 + JSP E,SPUR + MOVSI 17,R1NTAC + BLT 17,17 + JRST 12,@RINT1 +] ;IFE KS10P + +IFE KS10P,[ ;KS10 HAS NO MAR + +PCMARB: +IFN KA10P,[ + HLLZ B,UPOPC(U) ;FLAGS + LSH B,5 + HRR B,UPOPC(U) ;PC + MOVE T,B + XOR T,CLKBRK ;DID PC CHANGE FROM START OF INST TO PLACE TRAPPED? + TDNE T,[#<%PCFPD,,>] + TLO B,(@) ;YES, INSTRUCTION COMPLETED, FLAG FOR USER +] ;KA10P ;LOSES FOR JSR .-1 WITH MAR AT .-1, BUT OTHERWISE OK +IFN KL10P,[ + MOVE B,CLKBRK ;PC OF FAULTING INST IF USER, OR IOADCR IF EXEC +; MOVEM B,UPOPC(U) ;SOLELY FOR .OPC USER VAR +;NOTE- ON KL10 THE INSTRUCTION IS NEVER COMPLETED, DON'T SET 3.5 +] ;KL10P + TLNE B,%PCUSR + JRST PCMAR1 ;USR MODE, USE PC FROM PAGER + MOVE B,UUOH ;EXEC MODE, USE USER PC (UUO) + HRRI B,-1(B) +IFN KL10P,[ ;ON KL10 AVOID DOING AOS UUOH AT IOADCR + MOVEM U,AC0S+U(U) + MOVEI T,UUOER2 + MOVEM T,CLKBRK +];KL10P +PCMAR1: MOVEM B,UMARPC(U) + TRO A,%PIMAR + MOVEI B,0 +IFN KA10P, DPB B,[220300,,UPMAR(U)] ;DISABLE MAR +IFN KL10P, DPB B,[270400,,UPMAR(U)] ;DISABLE MAR + POPJ P, + +] ;IFE KS10P + +IFN KA10P,[ +CPROC1: MOVE T,CLKBRK + TLNN T,%PCUSR ;SKIP IF FROM USER MODE + JRST CPRUUO + TRO A,%PI1PR ;GIVE USER INTERRUPT + POPJ P, + +CPRUUO: MOVE T,[JRST ONEPROC] ;ONE PROCEED INT. FROM EXEC. MODE + MOVEM T,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION + POPJ P, + +AROV: TLZE T,400000 + TLNN T,%PCUSR + JRST AROV2 ;NOT REALLY SET OR SET BY SYS + MOVEM T,CLKBRK + SKIPE PICLR(U) ;SKIP IF INTERRUPTS TO USER NOT ENABLED + TRO A,%PIARO ;GIVE USER INTERRUPT + POPJ P, + +AROV2: MOVEM T,CLKBRK + POPJ P, + +ARFOV: TLZE T,40000 + TLNN T,%PCUSR + JRST AROV2 + MOVEM T,CLKBRK + SKIPE PICLR(U) + TLO A,(%PIFOV) + POPJ P, +] ;KA10P + +;;; HANDLE PARITY ERRORS. + +CLKB1E: SETZM PARDIE ;AT FIRST ASSUME THE PAR ERR ISN'T FATAL. + CONO PI,PIOFF ;TURN OFF WORLD +IFN KA10P, CONO PI,240000 ;RESET +IFN KL10P,[ ;CLEAR THE CACHE + SWPUA + CONSZ 200000 + JRST .-1 +] ;KL10P +IFN KS10P,[ + CLRCSH ;Clear the cache +] ;KS10P + MOVSI B,SCLPAR + TDNE B,SUPCOR ;IF PREV ERROR NOT PRINTED, PRINT IT NOW AND PAUSE + BUG PAUSE,[TOO MANY PARITY ERRORS. PREV STATUS=],DEC,PARCNT,OCT,PARAAN,OCT,PARAOR,OCT,PARAND,OCT,PARIOR + IORM B,SUPCOR ;TELL SYS JOB TO PRINT OUR DATA WHEN WE FINISH. + AOS PARERR ;COUNT # OF PAR ERRS SINCE SYSTEM STARTED. + SETOM PARAND ;INIT LOGAND AND LOGOR OF ALL BAD DATA WORDS + SETZM PARIOR + SETOM PARAAN ;AND SIMILAR FOR ADDRESSES OF PAR ERRS. + SETZM PARAOR + MOVE T,CLKBRK + MOVEM T,PARPC + MOVE T,USER + MOVEM T,PARUSR ;REMEMBER WHICH JOB GOT THE PAR ERR. + JUMPL T,PARSCJ ;PAR ERR IN NULL JOB? OR WHAT? +IFN KL10P,[ + SKIPE PARRSN ;PAR ERR IN WORD NOT REFERENCED + JRST PARSCJ ; SHOULDN'T SCREW THE RUNNING JOB +] ;KL10P + CAIG T,LUBLK + SETOM PARDIE ;PAR ERR IN A SUPERVISOR-MODE JOB IS HOPELESS. + MOVSI TT,(%PIPAR) + IORM TT,PIRQC(T) ;GIVE RUNNING USER A PARITY ERROR (CLASS 1 INT) +PARSCJ: SPM PARPG +IFN KL10P,[ + PUSH P,PFNPC ;MAKE SURE THE PAR ERRS WE DETECT WHILE SCANNING DON'T + MOVEI D,PARFX4 ;CALL US RECURSIVELY (ON KA, THAT'S DONE BY HAVING + MOVEM D,PFNPC ;CLKCHN OFF) +] ;KL10P +IFN KS10P,[ + PUSH P,EPTP7N ;Same hack for the KS except page fails trap + MOVEI D,PARFX4 ;as a function of current PI level. + MOVEM D,EPTP7N +] ;KS10P + MOVEI D,0 ;POINTER TO ERROR BUFFER + MOVSI TT,-TSYSM + PUSHJ P,PARSCN ;SCAN MAIN MEM BLOCKS +IFN PDP6P,[ + MOVE TT,[-LPDP6M,,PDP6BM_-10.] ;SCAN PDP6 MEM FOR PARITY ERRORS + SKIPGE PDP6UP ;BUT NOT IF PDP6 IS DOWN. + PUSHJ P,PARSCN +] +IFN KL10P,[ + POP P,PFNPC + CONO 024400+APRCHN ;CLEAR PAR ERR FLAGS. +] ;KL10P +IFN KS10P,[ + POP P,EPTP7N + CONO 020200+APRCHN ;CLEAR FLAG + MOVSI A,%KEHLD+%KEREF ;CLEAR STATUS AND ERROR ADDR + IOWR A,[KSECCS] +] ;KS10P + MOVEI A,0 + DPB A,[.PAREP+EXEUMP] + LPMR PARPG ;SET UP MAP WITH PARPG SET TO MPV. + MOVEM D,PARCNT ;SAVE AWAY COUNT OF ERRORS IN BUFFER + SKIPE PARDIE + BUG HALT,[PARITY ERROR IN SYSTEM MEMORY. CNT=],DEC,PARCNT,[ADR AND ],OCT,PARAAN,CR,0,[ ADR IOR ],OCT,PARAOR,[DATA AND ],OCT,PARAND,[DATA IOR ],OCT,PARIOR + ;FATAL ERROR (DONT ALLOW CONTINUE SINCE ERR IS + ;KNOWN TO BE A LOSER) + CONO PI,PION ;TURN WORLD BACK ON + JRST SCHED + +PARSCN: +PARFX3: HRRZ T,TT ;SCAN AOBJN POINTER IN TT + CAIL T,TSYSM + JRST PARFX7 + LDB T,[MUR,,MEMBLT(TT)] + CAIN T,MUHOLE + JRST PARFX8 ;HOLE THERE +PARFX7: MOVEI T,600000(TT) ;NOTE THAT WE ARE NOT ENABLING THE CACHE. + DPB T,[.PAREP+EXEUMP] ;ON KL10 THIS WILL CAUSE A 1-WORD READ. + LPMR PARPG ;SET UP TO CHECK PAGE # IN TT + MOVEI B,0 ;ADDRESS WITHIN PAGE +PARFX1: +IFN KA10P, CONO PI,200000 ;CLEAR PAR ERR +PARFX5: MOVE C,400000+PAREP*2000(B) ;REFERENCE EVERY MEMORY LOCATION +IFN KA10P,[ + ;;ON KA, MUST CHECK EXPLICITLY. + ;;ON KL AND KS, PAR ERR WILL TRAP RIGHT TO PARFX4. + CONSZ PI,200000 ;PARITY ERR? + JRST PARFX4 ;YES. +] ;KA10P + CAIGE B,1777 ;SKIP ON FINISHED WITH BLOCK + AOJA B,PARFX5 +PARFX8: AOBJN TT,PARFX3 ;CHECK NEXT PAGE + POPJ P, ;DONE + +PARFX4: ;HERE WHEN THE SCAN FINDS A WORD WITH BAD PARITY +IFN KL10P, HRRZ T,PFOPC +IFN KS10P, HRRZ T,EPTP7O +IFE KA10P,[ + ;;DID THIS TRAP COME FROM SCAN LOOP WHERE WE EXPECT THEM? + CAIE T,PARFX5 + JRST 4,. + AC7CTX + UMOVE C,0 ;GET CONTENTS OF LOCATION WITH BAD PARITY + SYSCTX +] ;IFE KA10P + SETO T, ;MAKE SURE T ISN'T ACCIDENTALLY 0 AT PARFX6. + HRRZ E,TT + LSH E,10. + IOR E,B ;MAKE MEM ADR + CAIGE E,20 ;PAR ERR IN SHADOW ACS ISN'T SERIOUS. + JRST PARFX6 + ANDM E,PARAAN ;UPDATE ANDS AND ORS OF DATA AND ADRS + IORM E,PARAOR + ANDM C,PARAND + IORM C,PARIOR + MOVE A,USRHI + CAIGE E,USRSTG(A) + SETOM PARDIE ;PARITY ERROR IN EXEC CORE + HRRZ T,TT + CAIL T,TSYSM + JRST PARFX6 + LDB T,[MUR,,MEMBLT(TT)] + CAIE T,MUFR + CAIN T,MUINP + JRST PARFX6 + CAIE T,MUDISB + CAIN T,MUFRT + JRST PARFX6 + CAIN T,MUDDT + JRST PARFX6 + SOJE T,PARFX6 ;USER + SETOM PARDIE ;ERR IN CRITICAL MEMORY (DISK DIR, ETC) +PARFX6: MOVEM C,400000+PAREP*2000(B) ;FIX UP MEMORY AS BEST WE CAN + MOVEM C,PARCON(D) ;SAVE LOSING CONTENTS + MOVEM E,PARADR(D) ;SAVE LOSING ADDRESS + CAIL D,MXPARS-1 ;OVERFLOWING BUFFER? + SOS D ;JUST DON'T CLOBBER STUFF. AT LEAST PARAND, ETC. WILL BE VALID. + JUMPN T,PARFX9 + PUSH P,D ;PAR. ERR IN USER MEMORY, + HRRZ D,TT + CAIL D,TSYSM + JRST PARFXA + PUSHJ P,UCPRL4 ;HAS ANY JOB WRITTEN IN THIS PAGE? + 400000,,PARFU1 + JUMPL D,PARFXB ;SOMEONE HAS; JUST GIVE EVERYONE AN INTERRUPT. + PUSHJ P,UCPRL4 ;DOES MMP SAY PAGE WAS WRITTEN? IF SO, SET SIGN(D); + 200000,,PARFU2 ;OTHERWISE, SET MMPBAD, CAUSING PAGE TO BE RELOADED FROM DISK. + JUMPGE D,PARFXA +PARFXB: PUSHJ P,UCPRL4 ;PAGE HAS BEEN WRITTEN SINCE LAST ON DISK, SO WE CAN'T ESCAPE + 400000,,PARFU3 ;GIVING EVERY JOB AN INTERRUPT. +PARFXA: POP P,D +PARFX9: AOS B ;INCREMENT B HERE SO YOU DON'T HACK THE SAME + ; WORD AGAIN. IF THAT WORD WAS SOLIDLY BAD, + ; THIS CODE WOULD LOOP + CAIG B,1777 ;MIGHT BE DONE WITH PAGE + AOJA D,PARFX1 + AOJA D,PARFX8 + +PARFU1: CAIG U,LUBLK + SETOM PARDIE ;SYS JOB OR CORE JOB HAS PAGE + PUSH P,Q + MOVE A,I ;FIND PAGE-MAP HALFWORD FOR THIS PAGE + PUSHJ P,UPLC + POP P,Q + LDB A,T + LSH A,-20 + CAIE A,1 ;MAP SET UP TO A PAGE, AND IN READ-ONLY MODE? + JRST PARFU5 + DPB A,T ;YES, UNMAP IT SO THAT NEXT ACCESS WILL TRAP AND GO TO CFHPB + SOS MMSWP(D) ; IN CASE WE WILL SET MMPBAD. + ;NOTE, THIS MAY CRASH THE SYSTEM IF THE JOB WAS RUNNING IN A UUO, + ;HAD CHECKED ACCESS TO THE PAGE, AND WAS ASSUMING IT COULD ACCESS + ;IT AGAIN SAFELY. USUALLY THIS ONLY HAPPENS WHEN WRITING, HOWEVER. +IFN SWPWSP, ;DON'T BOTHER ADJUSTING WORKING SET. WILL BE FIXED ON NEXT SWAPIN. +PARFU5: CAIL A,3 +PARFU4: TLO D,400000 ;IF THIS JOB HAS WRITTEN THE PAGE, SET SIGN (D) + POPJ P, ;TO SIGNAL THAT SETTING MMPBAD IS NO USE. + +PARFU2: MOVE T,(C) ;C HAS ADDR OF MMP ENTRY; HAS PAGE BEEN WRITTEN BY A JOB + TLNN T,MMPWRT ;THAT NO LONGER HAS IT IN MAP? + TLNN T,MMPWOD ;OR HAS IT NEVER BEEN ON DISK? + JRST PARFU4 ;IF SO, AVOID SETTING MMPBAD, AND INTERRUPT EVERYONE. + HLRZ T,1(C) + JUMPE T,PARFU4 ;DITTO IF THERE IS NO DISK SPACE ASSIGNED. + MOVSI T,MMPBAD + IORM T,(C) + POPJ P, + +PARFU3: MOVSI T,(%PIPAR) + IORM T,PIRQC(U) + POPJ P, + +MEMHNG: +IFN PDP6P,[ + LDB B,[221100,,UPJPC(U)] ;FAULT ADDR + TRZN B,400 ;SKIP IF REFERENCE WAS VIA USER MAP + JRST MEMHN1 + MOVEI C,UPGMP(U) + ROT B,-1 + ADDI C,(B) + HRLI C,PMLCAD ;POINTER TO CORE ADR FIELD OF LH PAGE IN MAP WD + SKIPGE B + HRLI C,PMRCAD ;RH MAP WD + LDB C,B ;C GETS PAGE # + CAIGE C,+LPDP6M + CAIGE C,PDP6BM_-10. + JRST MEMHN1 + MOVE B,CLKBRK + TLNE B,%PCUSR + JRST MEMHN3 ;USER MODE PDP6 NXM + MOVEI B,IOCER3 ;PDP6 MEM + HRRM B,CLKBRK + JRST MEMHN2 +] + +MEMHN1: ;NXM + ; JRST 4,.+1 ;COMMENTED OUT SINCE NXM STOP SHOULD ALWAYS BE SET. +MEMHN2: +IFN KA10P,CONO 10000+APRCHN ;CLEAR NON EX MEM AFTER HALT TO RESET MEMORY +IFN KL10P,CONO 22000+APRCHN +IFN KS10P,[ + CONO 20400+APRCHN ;Clear APR flag + MOVSI B,%KEHLD+%KEREF ;Clear saved error address + IOWR B,[KSECCS] +] ;KS10P + MOVSI B,SCLNXM + TDNE B,SUPCOR ;Haven't printed previous error? + BUG PAUSE,[TOO MANY NXM ERRORS.] + IORM B,SUPCOR + MOVE T,CLKBRK + MOVEM T,NXMPC + MOVE T,USER + MOVEM T,NXMUSR + AOS NXMERR + POPJ P, + +IFN PDP6P,[ +MEMHN3: MOVSI B,%PIMPV ;PDP6 NXM GIVE MPV INTERRUPT + IORM B,PIRQC(U) + JRST MEMHN2 +] + SUBTTL SLOW CLOCK SERVICE ROUTINE + +OVHMTR SLW ;SLOW CLOCK + +SSLCK: SKIPGE SHUTDN ;SYSTEM "DEAD" => + PUSHJ P,COFFIN ;GO TO DDT AFTER RIGOR MORTIS SETS IN. + SETCMB A,SCKPHS ;CHECK SYSTEM CHECKSUMS EVERY OTHER SLOW CLOCK TICK + MOVE T,SUPCOP ;WHICH IS ONCE PER SECOND. + SKIPE A + IORM T,SUPCOR +IFN KS10P,[ + CONSO 100 ; Check for memory ECC corrected errors + JRST SSLCK0 + IORD A,[KSECCS] ; A: status and error addr + MOVEM A,ECCERA ; Remember most recent one + AOS ECCERR ; Also count 'em + CONO 20100+APRCHN ; Clear memory ECC APR flag + MOVSI T,%KEHLD+%KEREF ; Clear status and error addr + IOWR T,[KSECCS] + MOVE T,A + AND A,ECCAND ; A: AND of previous errors + IOR T,ECCIOR ; T: IOR of previous errors + CAMN A,ECCAND ; If either changes, this is news. + CAME T,ECCIOR + BUG INFO,[MEMORY: ECC CORRECTED ERROR],OCT,ECCERA + MOVEM A,ECCAND + MOVEM T,ECCIOR +SSLCK0: ] ;IFN KS10P +IFN NETP,PUSHJ P,NETCLK ; Run 1/2 sec clock routines for various net stuff +IFN NETYS, SETOM DTECHK ;TELL 11 WE'RE ALIVE +IFN DPKPP,[ + CONSO DPK,7 + CONO DPK,TTYCHN ;CROCK - IF DPK LOSES ITS PIA, GIVE IT BACK. +] + MOVE A,UTTBF + CAIGE A,30 + JRST SSLCK2 + SETOM UTBFLF ;SIGNAL CORE JOB TO FLUSH UTAPE BUFFERS + AOS NCORRQ +SSLCK2: SKIPE UTTYCT ;SKIP IF NO NEW USERS + SKIPL TREESW ;SKIP UNLESS SOMEBODY'S MUNGING THE TREE STRUCTURE. + CAIA + PUSHJ P,USTART ;NEW USER TO START +IFN 340P,[ + SKIPL T,DWDS + MOVEI T,0 + ADDI T,MDISWD + MOVEM T,DWDS ;RESET DISPLAY RATE COUNTER +] + CONO PI,UTCOFF ;UTC OFF WHILE HACKING UTAPE, MTAPE, DISK, ETC. +IFN RH10P+RH11P,[ + SKIPLE USFHLT + SOS USFHLT +];RH10P+RH11P +IFN NUNITS,[ +IFE NEWDTP,[ + MOVE T,TIME + AOSN UIDLE ;SKIP IF DEC TAPE NOT IDLE + JRST [MOVEM T,LUTOTM ? JRST SSLCK1] ;DEC TAPE IDLE + SUB T,LUTOTM ;SUBTRACT LAST UTC OPERATION TIME + CONSO UTC,4000 + CAIGE T,MXOPT*SCLKI ;SKIP IF DEC TAPE HUNG TOO LONG ON ONE OPERATION + JRST SSLCK3 ;OK + SETOM UTHERR ;SET UTC HUNG ERR FLAG +SSLCK1: CONO UTC,CUINT ;CAUSE DEC TAPE INTERRUPT ROUTINE TO RUN +SSLCK3: +] +IFN NEWDTP,[ + MOVE T,TIME + AOSN UIDLE + JRST [MOVEM T,LUTOTM ? JRST SSLCK1] + SUB T,LUTOTM + CAIGE T,MXOPT*SCLKI + JRST SSLCK3 + SETOM UTHERR +SSLCK1: SETOM CUINT + CONO PI,UTCRQ +SSLCK3: +]] ;END IFN NUNITS + SKIPL QSDU ;IF DISK TRANSFER IN PROGRESS + JRST [ MOVE T,LQTM ;SEE IF IT'S TAKING UNREASONABLY LONG TIME + ADDI T,5*30. + CAMGE T,TIME + PUSHJ P,QHUNG ;YES, UNHANG THE DISK + JRST .+1 ] +IFN T300P,[ + SKIPL QSDU1 ;IF TRANSFER IN PROGRESS ON OTHER CONTROLLER + JRST [ MOVE T,LQTM1 ;SEE IF IT'S TAKING UNREASONABLY LONG TIME + ADDI T,5*30. + CAMGE T,TIME + PUSHJ P,QHUNG1 ;YES, UNHANG THE DISK + JRST .+1 ] +];T300P +IFN DC10P, PUSHJ P,QRCTMO ;RECALIBRATE TIMEOUT + CONO PI,UTCON + PUSHJ P,QSTRTR ;WAKE UP DISK ROUTINES +IFN NMTCS, PUSHJ P,MSTRTR ;WAKE UP MAG TAPE ROUTINES (MUST BE SEPARATE INTR) +;DROPS THROUGH + +;DROPS IN +IFG NMTYS,[ ;TRY TO UNHANG MORTON TTY CARDS + MOVE I,[-NMTYS,,NFMTY] + MOVE T,TIME + SUBI T,60. ;IF HAVEN'T TYPED FOR 2 SECONDS +SSLCM1: SKIPL TTYOAC(I) ;YET SUPPOSED TO BE TYPING + CAMGE T,TTLTM(I) + JRST SSLCM2 + CONO PI,TTYOFF-1 + CONO MTY,@TTYLT(I) ;SELECT THE LINE + DATAO MTY,[0] ;AND BANG ON IT + CONO PI,TTYON-1 ;MAYBE IF WE'RE LUCKY ITS DONE FLAG WILL COME ON +SSLCM2: AOBJN I,SSLCM1 +] ;END IFG NMTYS +IFN IMPP,[ +IFN KAIMP, CONI IMP,IMPCNI ;KEEPS HOST READY ON +IFE KSIMP\SSIMP,[ + ;KS doesn't drop interrupts, I hope + PUSHJ P,IMPOST ;START UP OUTPUT +] +IFN NCPP,[ + SKIPLE IMNCS + PUSHJ P,IMPCCL ;CLOSE NETWORK CHANNELS + SKIPLE IMNAS + PUSHJ P,IMPAAA ;WAKE UP STYS THAT NEED IT +];NCPP + SKIPGE IMPTCU ;IF IMP IS TRYING TO COME UP + AOSE IMPUCT ;AND UP-COMING TIMEOUT EXHAUSTED + JRST SSLCK8 + BUG INFO,[NET: TIMED OUT TRYING TO COME UP] + MOVEI A,1 ;THEN MAKE IT STAY DOWN + MOVEM A,IMPUP ;IF THIS IS ML-KA THE IMP CABLE PROBABLY BROKE AGAIN +SSLCK8: +];IMPP +IFN PDP6P,[ + SKIPL PDPISR + CONO DSDEV,DSDCHN ;ENABLE INTERRUPTS FROM 6 +];PDP6P +IFN NETYS,[ + SKIPE DTEBBY + SOSL DTEBBT + JRST .+3 + BUG CHECK,[TTY: TIMEOUT ON OUTPUT XFER TO DTE, DTEBBY],OCT,DTEBBY + SETZM DTEBBY +];NETYS +IFN N11TYS,[ +;SEE IF THE TV PDP11 WANTS TO GO DOWN. + SKIPN TEN11F ;PROVIDED THE PDP11 IS THERE, + SKIPN TT11P ;AND WE'RE TRYING TO USE IT, + JRST SSLCK5 + LDB A,[061600,,TT11HA] ;DOES 11 WANT WHO LINES UPDATED? + CAIL A,2000*NTTPG ;RANGE CHECK SO CLOBBERED 11 MEMORY DOESN'T CAUSE ILL MEM REF + BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY] + SKIPGE 1+400000+TTPG0*2000(A) + JRST [ MOVEI T,SCRWHO ;YES + IORM T,SUPCOR + CLEARM 1+400000+TTPG0*2000(A) + JRST .+1] + SKIPE TT11DN ;IF IT IS REQUESTING TO GO DOWN, + JRST SSLCK5 + SETZM TT11P ;DON'T USE IT & WAIT FOR IT TO RE-INIT, + MOVSI T,1 + MOVEM T,TT11DN ;GIVE IT OUR PERMISSION TO GO DOWN. + MOVEI T,SCR11D ;CAUSE "11 DOWN" MESSAGE + IORM T,SUPCOR +SSLCK5: SKIPN TEN11F + SKIPG TT11P ;WAITING FOR 11 TO BE UP? + JRST SSLCK6 + SKIPN TT11UP ;SKIP ON 11 UP + JRST SSLCK6 + MOVEI T,SCR11U + IORM T,SUPCOR ;INIT THE TTYS +SSLCK6: +] + SKIPLE T,AGERTE ;IF IT'S ENABLED, AGE SOME PAGES + PUSHJ P,AGE +;DROPS THROUGH + +;DROPS IN +IFN DL10P,[ + SKIPN DL10F + JRST SSLCKA + SETOM DL10UP ;COULD ALSO CHECK WHETHER PDP11 IS INCREMENTING THIS. + DATAI DLC,A + TRNE A,20 ;SEE IF PDP11 HALTED. + JRST SSLCKA + BUG INFO,[I/O PDP11 WENT DOWN] + SETZM DL10F + MOVEI T,%TYDL + MOVSI A,-NCT + TDNE T,TTYTYP(A) + SETOM TTYOAC(A) + AOBJN A,.-2 +SSLCKA: ] + AOS QACTTM ;Bump this for benefit of QSK dir writers. + SKIPN SWPOPR ;If there is a request to swap out pages + SKIPE SOLNG ; or if there are pages now going out + JRST SSKQ2 ; do not bother with LMEMFR, warnings. + MOVN A,LMEMFR ;See how many free low-memory pages. + ADD A,MINCOR + JUMPLE A,SSRCK ;Okay + AOS NCORRQ ;Wake up core job to do some shuffling + SUB A,MEMFR + ADD A,LMEMFR ;Core wanted minus high free + SKIPLE A + ADDM A,SWPOPR ;Swap out to make room. +;Check to see if we are running out of various resources. +;RSWTIM is a timestamp of last warning, initialized by DATIM6 and PDDCHK. +SSRCK: MOVE A,RSWTIM ;Get time we last checked. + ADDI A,2*30. + CAML A,TIMOFF ;If we checked less then 30 secs ago + JRST SSKQ2 ; don't deluge the console. + MOVE A,TIMOFF ;Else remember that we are cheking now. + MOVEM A,RSWTIM + MOVEI A,5 ;There should be at least 5 free low pages. + CAMLE A,LMEMFR ;If there are not, print warning. + BUG INFO,[Warning: Just ],DEC,LMEMFR,[ free pages in low core.] + SKIPN QFCHN ;Check disk channels. + BUG INFO,[Warning: No free qsk channels.] + MOVN A,USRHI ;Check job slots. + IDIVI A,LUBLK + ADDI A,MAXJ + SKIPN A + BUG INFO,[Warning: System full - no job slots.] +SSKQ2: +IFN 340P,[ + SKIPL DISUSR + PUSHJ P,DISCHK ;CHECK FOR 340 DEATH +] + PUSHJ P,PDCCHK ;CHECK ON REAL-TIME HACKS +IFN PTRP,[ + PUSHJ P,PTRCHK ;CHECK ON PAPER TAPE READER + PUSHJ P,PTPCHK ;CHECK ON PAPER TAPE PUNCH +] ;PTRP +IFE KS10P,[ ; Silly KS10 doesn't have devices... + SKIPN CCSDEV + JRST SCDCK3 + SETZM CCSDEV + MOVSI I,-128. +SCDCK1: SKIPGE A,DCHNTC(I) + TLNE A,300000 + JRST SCDCK2 + AOS CCSDEV + SUB A,[1,,] + TLNN A,777 + TLZ A,400000 + MOVEM A,DCHNTC(I) +SCDCK2: AOBJN I,SCDCK1 +SCDCK3:; JSP E,CHECK ;CHECK FOR CLOBBERED DEVICES +] ;IFE KS10P +IFN NLPTP,[ + CONO PI,LPTOFF + MOVE A,NLPTBR ;IF LPT OUTPUT BUFFER NOT EMPTY + CAIN A,LPTBSZ + JRST [ CONSZ NLPT,100 ;AND LPT IS READY + CONSZ NLPT,7 ;BUT HAS NO PIA + JRST .+1 + CONO NLPT,LPTCHN ;THEN IT LOST AGAIN + AOS NTNLPL ;COUNT NUMBER OF TIMES NEW LPT LOST + JRST .+1 ] + CONO PI,LPTON +] +IFN ECCMEM,[ +;THIS ASSUMES THAT THE PDP-10/XBUS ADDRESS OFFSET IS ZERO +ECCLOG: MOVE B,400000+ECCPG*2000+1760 + LSH B,-32. + CAMN B,ECCIDX ;DID ECC HISTORY POINTER ADVANCE? + JRST ECCLG9 + AOS A,ECCIDX ;YES, GET NEXT WORD FROM ECC HISTORY + MOVE B,400000+ECCPG*2000+1760-1(A) + ANDI A,17 ;ADVANCE OUR COPY OF POINTER + MOVEM A,ECCIDX + LDB A,[240700,,B] ;SYNDROME BITS + TLZ B,777774 ;REDUCE B TO ADDRESS BITS + BUG INFO,[MEM: ECC ERROR, ADDRESS ],OCT,B,[SYNDROME],OCT,A + JRST ECCLOG ;LOOK FOR MORE HISTORY + +ECCLG9: +];ECCMEM + PUSHJ P,GPDTIM ;WHAT CALENDAR TIME IS IT? + SETOB A,LPDTIM + EXCH A,LPDTIM ;REMEMBER IT FOR NEXT CLOCK TICK. + JUMPL A,ALCR0 ;TIME NOT KNOWN THIS AND/OR LAST TICK => DO NOTHING + SUB A,LPDTIM ;ELSE HOW LONG HAS IT BEEN SINCE PREVIOUS TICK? + CAML A,[-5*PDUPS] ;MORE THAN 5 SECONDS? SHOULD ONLY BE 1/60 + JRST ALCR0 ;ONLY EXPLANATION IS ITS WAS STOPPED AND CONTINUED. + SKIPL SYSDBG ;SO UNLESS THAT'S NORMALLY EXPECTED + PUSHJ P,DEATHM ;TELL THE WORLD "ITS REVIVED" + MOVE T,TIME ;REMEMBER WHEN THIS LAST HAPPENED + MOVEM T,RVVTIM + +;DROPS THROUGH + +;DROPS IN +;DECAY VARIOUS EXPONENTIAL AVERAGES. ON KA10, RUN IN ACS SINCE IT'S FASTER. +;ON KL10, DON'T, SINCE IT'S SLOWER. ON KS10, DON'T, BECAUSE IT IS +;JUST AS FAST TO RUN IN THE ACS BUT IT WASTES TIME TO MOVE THE CODE +;INTO THEM. +ALCR0: MOVSI U,-NCT + SETZM SLOADU +IFN KA10P,[ + MOVE I,[ALCR1,,A] + BLT I,I + JRST A +] ;KA10P + +ALCR1: MOVN T,USRRCE(U) ;A ;DECAY USRRCE AVERAGES + ASH T,-4 ;B + ADDB T,USRRCE(U) ;C + CAMLE T,SLOADU ;D ;AND SET SLOADU TO HIGHEST USRRCE + MOVEM T,SLOADU ;E +IFN KA10P,[ + AOBJN U,A ;TT + JRST .+1 ;I +] ;KA10P +IFE KA10P, AOBJN U,ALCR1 + + MOVN T,USRRCE+NCT + ASH T,-4-2 ;DISOWNED JOBS (DECAY SLOWER) + ADDB T,USRRCE+NCT + IMULI T,1999. ;MAKE COMMENSURATE WITH REGULAR USRRCE'S + ASH T,-13. ; (You might think that you could just + ; divide by 4, but in fact the ratio + ; between the two decay rates is + ; ln(64/63)/ln(16/15) = .24401474) + ADDM T,SLOADU ;DISOWNED TIME COULD HAVE BEEN USED BY REAL + ; USERS + MOVN T,USRRCE+NCT+1 + ASH T,-4+1 ;SYS, CORE, AND SOME DAEMON JOBS (DECAY FASTER) + ADDM T,USRRCE+NCT+1 + IRPS RCE,,LOSRCE IDLRCE + MOVN T,RCE ;LOST TIME AND IDLE TIME + ASH T,-4 + ADDB T,RCE + TERMIN + ADDM T,SLOADU ;IDLE TIME COULD HAVE BEEN USED BY USERS + +IFE KS10P, MOVE A,[193682794.] ; = 100. * 250000. * .5 / ln(16/15) + ; (100% of 250000. four usec ticks per second, + ; decaying by 16/15 every .5 second.) +IFN KS10P, MOVE A,[198524864.] ; = 100. * 256250. * .5 / ln(16/15) + ; (256250. 3.9 usec ticks per second.) +; Used to be: +; MOVE A,[100.*15.*125000.] ;100% DIVIDED BY MAXIMUM SINGLE TREE % + ADD A,LOSRCE ;WITH FUDGE FACTOR FOR LOST TIME + IDIVM A,SLOADU ;GIVES EFFECTIVE # OF COMPETITORS FOR MACHINE. +; It is possible for SLOADU to drop below 100. (giving a fair share greater +; than 100%). This happens because the decay rate for disowned jobs is +; less than the decay rate for consoles. If the load switches abruptly +; from the disowned jobs to some console, the resource word for the console +; fills up quicker than the disowned resource word decays, causing their +; sum to briefly exceed the maximum. This would be hard to fix without +; introducing additional resource words just for better maintaining SLOADU. +; +; An additional odd effect: If only disowned jobs are running, and a +; network server starts up, the fair share drops almost to zero. This is +; because when such jobs are created, their resource word is zeroed to +; given them an initial priority boost. + + MOVEI T,0 +IFN KA10P,[ + MOVE W,[ALCR4,,A] + BLT W,W + JRST A +] ;KA10P + +ALCR4: MOVN H,JTMU(T) ;A + ASH H,-4 + ADDM H,JTMU(T) + MOVE H,MSKST(T) + ANDI H,%PICLK ;E + SKIPE UNAME(T) ;TT + IORM H,PIRQC(T);I + ADDI T,LUBLK ;Q + CAMGE T,USRHI ;J +IFN KA10P,[ + JRST A ;R + JRST .+1 ;W +] ;KA10P +IFE KA10P, JRST ALCR4 +;DROPS THROUGH + ;DROPS IN +IFN SWPWSP,[ + MOVE U,USRHI + SUBI U,LUBLK ;ACCOUNT FOR I/O WAIT TIME IN USWPRI + MOVSI T,%SWOUT+%SWPGW +IFN KA10P,[ + MOVE J,[ALCR5,,A] + BLT J,J + JRST A +] ;KA10P +ALCR5: SKIPE UNAME(U) ;A ;IGNORE JOBS WHICH DON'T EXIST OR + TDNE T,USWST(U) ;B ;ARE SWAPPED-OUT OR IN PAGE-WAIT +IFN KA10P, JRST I ;C +IFE KA10P, JRST ALCR6 + SKIPN USTP(U) ;D ;CHARGE JOBS WHICH ARE STOPPED + SKIPE FLSINS(U) ;E ;OR BLOCKED + JRST ALCR7 ;TT +ALCR6: SUBI U,LUBLK ;I ;NEXT JOB +IFN KA10P,[ + JUMPG U,A ;Q + JRST .+1 ;J +] ;KA10P +IFE KA10P, JUMPG U,ALCR5 +];SWPWSP + SKIPGE 37 ;CHECK FOR PLANNED SYSTEM DEATH + PUSHJ P,DEATH ;ABOUT TO START DYING + JFCL + IRPS 4US,,[IDLTM1 LOSTM1 USRTM1 NULTM1]SEC,,[IDLTIM LOSTIM USRTIM NULTM3] + MOVE A,4US ;KEEP SYSTEM WIDE USAGES AS TWO WORDS + IDIVI A,250000. ;ONE IN 4.069 USEC UNITS + ADDM A,SEC ;AND ONE IN SECONDS + MOVEM B,4US ;SO NO OVERFLOW + TERMIN + IMULI A,60. ;CONVERT TO 60THS + ADDM A,NULTIM ;ADD TO 60THS USED (OBSOLETE) + MOVEI T,SCLKI + MOVEI C,SSLCKB + JRST CLQREE ;RE-ENTER RQ FOR SLOW CLOCK BREAK + +IFN SWPWSP,[ ;JOB IN U NEEDS TO BE CHARGED FOR MEMORY USED WHILE BLOCKED OR STOPPED +ALCR7: HLLO W,UWRKST(U) + JFFO W,.+1 ;H GETS 19 - LOG(WORKING SET SIZE + 1/2) + SUBI H,19. + IMUL H,[-125000.] ;CHARGE FOR 1/2 SECOND OF MEMORY USAGE + ADDM H,USWPRI(U) +IFN KA10P, JRST I +IFE KA10P, JRST ALCR6 +];SWPWSP + +;SYSTEM IN FINAL THROES OF COMING DOWN, SEE IF IT'S OVER YET + +COFFIN: MOVE T,NLOOSP ;MUST SWAP OUT ALL LOOSE PAGES + ADDB T,SWPOPR + JUMPN T,CPOPJ ;SWAPPAGE OUT STILL GOING ON + MOVEI T,NQCHN+1+NQS-1 + SKIPGE QSGL(T) + SOJG T,.-1 + SKIPL QSGL(T) ;NOT OVER IF ANY DISK CHANNELS ARE ACTIVE + POPJ P, + MOVSI T,040000 + MOVE TT,QACTB ;SEE IF DISK STUFF NOT OUT YET + TDNE TT,QMDRO + POPJ P, ;MFD NOT OUT + MOVSI A,-NQS +COFFI8: TDNE T,QTUTO(A) + JRST COFFI9 ;TUT NEVER CAME IN + TDNE TT,QTUTO(A) + POPJ P, ;TUT NOT OUT +COFFI9: AOBJN A,COFFI8 + MOVSI A,-QNUD +COFFI1: SKIPN QSNUD(A) + JRST COFFI2 + TDNE TT,QSNLCN(A) + POPJ P, ;UFD NOT WRITTEN +COFFI2: AOBJN A,COFFI1 + +IFN NUNITS,[ + MOVSI A,-NUNITS + SKIPGE UFLAPF(A) + POPJ P, ;TAPE STILL FLAPPING + AOBJN A,.-2 +] + MOVE A,DTHTIM + ADDI A,15.*30. ;DON'T WAIT FOR CONSOLES MORE THAN 15 SECONDS + CAMGE A,TIME ;BECAUSE %TCHNG ISN'T NECESSARILY SET + JRST COFFI3 + MOVEI A,NFSTTY-1 ;CHECK FOR REAL CONSOLES STILL TYPING OUT + MOVSI T,%TCHNG ;AND NOT HUNG (NEVER GOING TO FINISH TYPING OUT) + TDNN T,TTYCOM(A) + SKIPGE TTYOAC(A) + SOJGE A,.-2 + JUMPGE A,CPOPJ ;A CONSOLE IS STILL TYPING, DON'T GO DOWN YET +COFFI3: SKIPL A,SYSCN + SKIPGE TTYOAC(A) + CAIA + POPJ P, ;SYSTEM CONSOLE HAS A LOT OF TYPING TO DO + MOVEI A,2*LUBLK +COFFI7: CAML A,USRHI + JRST COFFI4 + SKIPE UNAME(A) + POPJ P, ;JOBS STILL EXIST + ADDI A,LUBLK + JRST COFFI7 + +;SYSTEM FULLY DOWN; GO TO DDT. +COFFI4: BUG DDT,[SHUTDOWN COMPLETE] + SETZM SHUTDN ;IF USER PROCEEDS, BRING SYSTEM BACK UP + SETZM DEDTIM ;ARRANGE TO RELOAD ATSIGN DRAGON + SETZM FLSINS ;BY RESTARTING SYS JOB WHERE IT DOES THAT + MOVEI A,ISYS + MOVEM A,UPC + POPJ P, + +;ROUTINE TO AGE SOME PAGES. THIS ROUTINE SLOWLY CIRCULATES THROUGH +;CORE. IF IT TOUCHES A PAGE TWICE, AND NO USER HAS TOUCHED IT, +;THE PAGE GETS SWAPPED OUT. ALSO FLUSHES PAGES NOT IN ANY USER'S MAP. +;ENTER WITH VALUE OF AGERTE IN T. + +AGE: MOVE TT,MEMFR + CAIL TT,100 + POPJ P, ;NO MEMORY COMPETITION, DON'T BOTHER + ADD T,AGEREQ ;INCREASE NUMBER OF PAGES NEEDING TO BE AGED + CAIGE T,100 ; BUT DON'T LET IT GET INFINITELY HUGE + MOVEM T,AGEREQ ; IF CIRPSW IS LOCKED FOR A LONG TIME + SKIPN DLSRCH ;IF MUSTN'T PCLSR ANYONE, OR + SKIPL CIRPSW ; IF CIRPSW LOCKED, HAVE TO WAIT UNTIL NEXT SLOW CLOCK + POPJ P, + LDB W,[121000,,HUSRAD] ;DON'T AGE SYSTEM JOB (CIRC PNTRS NOT CONNECTED) + MOVE A,AGEPOS ;CONTINUE AGEING FROM WHERE LEFT OFF LAST TIME + SKIPGE U,USER ;CHECK FOR NULJOB + JRST AGE0 + MOVE T,CLKBRK ;PC FOR USER WHO MAY GET PCLSR'D + MOVEM T,UPC(U) .SEE SWOP2 + LPMR UPGML(U) ;DON'T LEAVE SWAPPED OUT PAGES IN ASSOC MEM +AGE0: CAIGE A,TSYSM + CAMGE A,W + MOVE A,W + SOSGE AGEREQ + JRST [ MOVEM A,AGEPOS ? SETZM AGEREQ ? POPJ P, ] + AOS NAGES + LDB T,[MUR,,MEMBLT(A)] + CAIE T,MURUSR + AOJA A,AGE0 + MOVE D,A + PUSHJ P,UCPRL4 + SETZ AGE1 + MOVNI C,1 ;NO USERS ACTIVELY USING THIS PAGE, SWAP IT OUT + PUSHJ P,SWPOPG + JFCL + AOJA A,AGE0 + +AGE1: MOVEI C,UPGMP(U) + MOVE T,I ;DON'T CLOBBER I + ROT T,-1 + ADD C,T + HRLI C,222200 + SKIPGE T + HRLI C,2200 + LDB T,C ;GET PAGE MAP WORD + TRNN T,600000 + POPJ P, ;USER NOT CONNECTED TO THIS PAGE + TROE T,PMAGEM + POPJ P, ;HASN'T TOUCHED THIS PAGE SINCE AGE BITS LAST SET + DPB T,C ;HAS TOUCHED PAGE, TURN AGE BITS BACK ON + SUB P,[4,,4] ;AND BACK OUT OF UCPRL + AOJA A,AGE0 + +IFN 340P,[ + +DISCHK: SKIPGE DISOFF + POPJ P, + AOSLE DISDIE + SKIPGE CDISOFF + POPJ P, + MOVEI T,1 + MOVEM T,DTIME +DISZAP: MOVE T,[JSR DBLKPB] + MOVEM T,40+2*DISCHN + MOVEI T,DIS300-1 ;CAUSE 340 TO STOP AND INTERRUPT SOON + MOVEM T,DBLKOP + CLEARM DISOFF + CONO DIS,5100+SDCHN_3+DISCHN + POPJ P, +] + +DEATH: SKIPL SHUTLK + POPJ P, + SETZM 37 ;CLEAR START DYING FLAG + MOVEI T,60.*5.*60. ;5 MIN + MOVEM T,DEDTIM + LSH T,-1 + ADD T,TIME + MOVEM T,SHUTDN + PUSHJ P,CLQDEL + DEDBLK +DEATHX: SKIPN T,DEDTIM + POPJ P, + AOS (P) + MOVEI TT,0 + CAIGE T,40.*60. + JRST DEATHY + MOVE TT,T + LSH TT,-2 +DEATHY: MOVEM TT,DEDTIM + SUB T,TT + PUSHJ P,CLQADD + DEDBLK +DEATHM: MOVEI A,%PIDWN + PUSHJ P,INTALL ;TELL THE WORLD + MOVSI T,SCLSHD ;CAUSE TYPE OUT ON UNLOGGED-IN CONSOLES +SUPSET: IORM T,SUPCOR + POPJ P, + +VSSLCK: MOVSI T,SCLVSK + IORM T,SUPCOR ;CAUSE VERY SLOW CLOCK TO RUN + MOVEI T,VSCLKI + MOVEI C,VSLCKB + JRST CLQREE + +IFN CCLKP,[ +RCCLK: DATAI 374,T ;HACK CHESS CLOCK + TRNE T,4000 + AOSA CCLK1 + AOS CCLK2 + MOVEI T,6 + MOVEI C,CCLKB + JRST CLQREE +] + +IFN N11TYS,[ +WHOSET: MOVEI T,SCRWHO ;CAUSE SYS TO UPDATE WHO LINES + IORM T,SUPCOR + MOVEI T,5.*60.-5 ;5 SECONDS MINUS A LITTLE SO DOESN'T SYNC WITH OTHER CLOCKS + MOVEI C,WHOCLB + JRST CLQREE +] + +SUBTTL SWAP SCHEDULER + +OVHMTR SWS ;SWAP SCHEDULER + +;15 SECOND CLOCK +15SCLK: +IFN IMPP, PUSHJ P,IMRSTO ;RESET CONTROL LINK RFNM WAIT FOR LOSING IMP. + +;RECOMPUTE SWAP BLOCK DATA. +;DECAY SWAP PRIORITIES (USWPRI AND SWRCE) +;RESET BEST-EFFORT-HAS-BEEN-MADE TO SWAP OUT BITS + + MOVSI B,%SWBEM ;SET UP TO CLEAR "BEST EFFORT TO SWAP OUT BIT" + SETOM SBEFLG ;NOT YET DESPERATE ENOUGH TO TRY USERS WHOSE BEST EFFORT BITS ARE SET +IFE SWPWSP,[ + CLEARB T,NUSWB ;# USERS LOCKED OUT + SETOM BUSR ;SMALLEST SWAPPED BLOCKED USER + MOVE D,[37777,,777777] + MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER. + CLEARM ASBUM ;REAL MEM OCC BY ACTIVE SWAPPED BLOCKED LOSERS + MOVSI D,400000 ;TO CLEAR SWAPPED BLOCKED BIT +];SWPWSP +.ELSE MOVEI T,LUBLK*2 +15S1: CAML T,USRHI + JRST 15S2 + SKIPN UNAME(T) + JRST 15S3 + MOVN C,USWPRI(T) + ASH C,-2 + ADDM C,USWPRI(T) ;DECAY JOB SWAP PRI'S + MOVE C,NMPGS(T) +IFE SWPWSP,[ + SKIPE ENPZRO + SUBI C,1 ;COMPENSATE FOR PAGE ZERO ALWAYS IN +];SWPWSP + CAMLE C,NSWPGS(T) ;SKIP ON NOT COMPLETELY OUT + ANDCAM B,USWST(T) .SEE %SWBEM +IFE SWPWSP,[ + SKIPGE USWSCD(T) + JRST 15S4 ;CLEAR SWAPPED BLOCK BIT AND MAYBE ADD TO AUSOPG AND TRUMM (IF HE WAS HUNG ON IT) +];SWPWSP +15S3: ADDI T,LUBLK + JRST 15S1 + +15S2: +IFE SWPWSP,[ + SKIPE ENSWSC + PUSHJ P,SWSCD ;SWAP BLOCK LOSERS IF NECESSARY +];SWPWSP + MOVSI T,-NCT-2 +15S5: MOVN C,SWRCE(T) ;DECAY TREE SWAP PRI'S + ASH C,-2 + ADDM C,SWRCE(T) + AOBJN T,15S5 + MOVEI T,15.*60. + MOVEI C,15SCLB + JRST CLQREE + +IFE SWPWSP,[ +15S4: ANDCAM D,USWSCD(T) ;CLEAR SWAP BLOCK BIT + SKIPN TT,FLSINS(T) ;WAS HE HUNG TESTING IT + JRST 15S3 + SUBI TT,(T) + CAME TT,[SKIPGE USWSCD] + JRST 15S3 ;HE WASN'T HUNG ON THIS + CLEARM FLSINS(T) ;HE WAS SO NOW HES ACTIVE + MOVE TT,USWST(T) + TLZE TT,%SWPGW + SOS NPGWTU ;FLSINS WAS SET BY PAGE FAULT, SO CONSIDERED + TLZ TT,%SWBEM ;TO BE WAITING FOR A PAGE + MOVEM TT,USWST(T) + MOVE TT,NMPGS(T) + ADDM TT,TRUMM ;GUY IS NOW RUNNABLE + SUB TT,NSWPGS(T) ;ANY PAGES HE MAY HAVE IN MEM NO LONGER BELONG TO A BLOCKED USER + MOVNS TT + ADDB TT,BUMPGS + SKIPGE TT + CLEARB TT,BUMPGS + MOVE TT,NSWPGS(T) ;ANY SWAPPED OUT PAGES BELONG TO AN ACTIVE USER + ADDM TT,AUSOPG + JRST 15S3 +];SWPWSP + +IFE SWPWSP,[ + +PRVCLK: SKIPN ENPVCL + JRST PRVCK4 + MOVSI B,%SWPRV + SKIPL U,PRVUSR + ANDCAM B,USWST(U) + SETOM PRVUSR ;TURN OFF CURRENT PRIVILEDGED USER + MOVEI J,2*LUBLK +PRVCK1: CAML J,USRHI + JRST PRVCK2 + SKIPN UNAME(J) + JRST PRVCK3 + MOVE B,UTRNTM(J) ;GET USER RUN TIME + SUB B,LTRNTM(J) + MOVE A,USIPRQ(J) + SUB A,LSIPRQ(J) + IMUL A,[NPVSEC*125000.] ;1/2 NUMBER OF 4 MICROSECOND INTERVALS IN THE PRIV INTERVAL + SKIPE B + IDIV A,B + MOVE B,UPGSEC(J) + LSH B,-1 ;DIVIDE LAST VALUE BY TWO + ADD A,B + MOVEM A,UPGSEC(J) ; LAST/2 + CURRENT + MOVE A,UTRNTM(J) + MOVEM A,LTRNTM(J) + MOVE A,USIPRQ(J) + MOVEM A,LSIPRQ(J) ;SAVE OLD VARIABLES +PRVCK3: ADDI J,LUBLK + JRST PRVCK1 + +PRVCK2: PUSHJ P,NPRVUS ;GET NEXT PRIV USR +PRVCK4: MOVEI T,NPVSEC*60. + MOVEI C,PRVCLB + JRST CLQREE + +NPRVUS: MOVEI J,2*LUBLK + SETOM U + MOVNI T,30.*2 ;DON'T LET A BLOCKED OR STOPPED PERSON BE PRIVILEDGED + ADD T,TIME + MOVE B,PRVCUT + HRLOI E,377777 +NPVUS1: CAML J,USRHI + JRST NPVUS2 + CAMGE T,LUBTM(J) ;BLOCKED TOO LONG? + SKIPN UNAME(J) + JRST NPVUS3 + CAMG B,UPGSEC(J) + CAMG E,LPRVTM(J) + JRST NPVUS3 + MOVE U,J + MOVE E,LPRVTM(J) +NPVUS3: ADDI J,LUBLK + JRST NPVUS1 + +NPVUS2: MOVEM U,PRVUSR + SKIPG U + POPJ P, + MOVSI B,%SWPRV + IORM B,USWST(U) + MOVE T,TIME + MOVEM T,LPRVTM(U) + POPJ P, +];SWPWSP + +IFE SWPWSP,[ +IFNDEF MEMSYS,MEMSYS==50 ;GUESS AT AMOUNT OF MEM SYSTEM NEEDS +IFNDEF MEMSY1,MEMSY1==50 ;AMOUNT OF MEM ANY ONE USER MUST LEAVE TO "FIT". + +SWSCD: MOVE E,TRUMM ;SEE IF NECESSARY TO SWAP BLOCK SOMEONE + CAIGE E,TSYSM-SYSB-MEMSYS + POPJ P, ;NO SHOULD FIT + MOVE E,MEMFR + SUB E,NCBCOM + ADD E,SOLNG + SUB E,SILNG + SUB E,AUSOPG + ADD E,BUMPGS ;WILL SWAP OUT BLOCKED USERS FIRST + ADD E,ASBUM + SUBI E,20 ;SLOP + JUMPGE E,CPOPJ ;SHOULD HAVE ROOM FOR EVERYBODY + MOVMM E,SWSCT1 ;SAVE # PGS REQ + MOVNI E,1 ;NEED TO GRONK USER (MAYBE) + CLEARB T,TT ;TT SWP PRI OF PROCESS + MOVEI R,0 ;R SWP PRI OF TREE +SWSCP1: CAML T,USRHI + JRST SWSCP2 + SKIPE UNAME(T) + SKIPE USTP(T) + JRST SWSCP7 + SKIPGE USWSCD(T) + JRST SWSCP7 ;GUY ALREADY LOCKED OUT + SKIPE FLSINS(T) + JRST SWSCP4 ;SEE IF REALLY BLOCKED OR JUST PAGE WAIT +SWSCP5: MOVE B,UTMPTR(T) + CAML R,SWRCE-USRRCE(B) + CAMG TT,USWPRI(T) + JRST SWSCP6 ;THIS GUY A BIGGER LOSER THAT PREV BIGGEST +SWSCP7: ADDI T,LUBLK + JRST SWSCP1 + +SWSCP6: MOVE E,T + MOVE R,SWRCE-USRRCE(B) + MOVE TT,USWPRI(T) + JRST SWSCP7 ;GUY REALLY BLOCKED + +SWSCP4: MOVE B,USWST(T) + TLNE B,%SWPGW + JRST SWSCP5 + JRST SWSCP7 + + +SWSCP2: JUMPL E,CPOPJ ;NO VICTIM + MOVE B,NMPGS(E) + CAIGE B,TSYSM-SYSB-MEMSY1 + JRST SWSCP9 ;"SMALL LOSER" + SUB B,NSWPGS(E) + CAMLE B,SWSCT1 ;SKIP ON WILL STILL NEED TO BLOCK MORE LOSERS + POPJ P, +SWSCP9: MOVSI B,400000 + IORM B,USWSCD(E) ;SWAP BLOCK LOSER + AOS NUSWB + AOS NTUSB + MOVE TT,NMPGS(E) + CAMLE TT,BUSIZ + JRST SWSCP8 + MOVEM TT,BUSIZ + MOVEM E,BUSR +SWSCP8: SUB TT,NSWPGS(E) + SOSGE TT + MOVEI TT,0 + ADDM TT,ASBUM ;THIS GUY SWAPPED BLOCKED + MOVN TT,NMPGS(E) + ADDM TT,TRUMM ;DOESNT COUNT ANY MORE + SKIPGE TRUMM + CLEARM TRUMM + MOVN TT,NSWPGS(E) + ADDM TT,AUSOPG ;NOT REALLY ACTIVE ANY MORE + JRST SWSCD ;SEE IF THATS ENUF +];SWPWSP + +OVHMTR PPI ;PPIUM + +;PUT PAGE INTO USERS' MAPS (OF ALL USERS THAT ARE CONNECTED VIA CIRCULAR POINTERS) +;ALSO UPDATES THE WORKING SETS. +;CALL WITH PAGE NUMBER IN A, STARTING BYTE POINTER IN C, AND TDNE T,MMP IN D. +;SMASHES T,H,I,U,E,TT,C +PPIUM: AOS NPPIUM +IFN SWPWSP,[ + MOVEI E,0 ;COUNT USERS OF THE PAGE + PUSHJ P,UCPRL + 400000,,[AOJA E,CPOPJ] + HRRM E,MMSWP(A) ;ALL THESE SHARERS WILL BE CONNECTED TO THE PAGE + MOVSI T,1 ;COMPUTE WORKING SET ADJUSTMENT + IDIVM T,E ;I.E. 1 OVER NUMBER OF SHARERS +];SWPWSP + PUSHJ P,UCPRL ;GIVE PAGE TO ALL USERS WAITING FOR IT + 400000,,PPIUM1 + POPJ P, + +;SET UP MAP TO MEMBLT INDEX IN A +PPIUM1: AOS NPPIU1 + CAIG U,LUBLK + BUG ;SYS JOB OR CORE JOB + PUSH P,I + MOVEI C,UPGMP(U) + ROT I,-1 + ADDI C,(I) + HRLI C,222200 + SKIPGE I + HRLI C,2200 + LDB I,C + JUMPE I,[JRST 4,.] ;DOESN'T REALLY EXIST? + MOVSI T,MMPPGA ;DON'T REALLY PUT IN MAP IF PAGE-AHEAD PAGE. + TDNE T,(D) ;JUST PRE-EMPT. + JRST QSWI2A + TRNE I,600000 ;DO NOTHING IF ALREADY IN MAP. +IFE E.SP,[ + JRST QSWI2 ;ALREADY IN MAP, POSSIBLE AS A RESULT OF RIDICULOUS TIMING ERROR +] +IFN E.SP,[ + JRST E.SPGJ ; CHECK E&S WANTS READ/WRITE FIRST FIX +] + SOS NSWPGS(U) ; NUMBER OF SWAPPED-OUT PAGES + SOS SNSWPG ;DECR CNT OF SWAPPED OUT FOR SYS + SKIPN (P) ;DON'T SET UP PG 0 AS R-W-F. + JRST QSWI3 + TRNE I,2 + MOVEI I,2 ;SET READ/WRITE TO READ/WRITE/FIRST +QSWI3: LSH I,16. + IORI I,PMCSHM(A);BRING IN ADDRESS AND CACHE BITS + DPB I,C +QSWI2: +IFE SWPWSP,[ + AOS MMSWP(A) ;INCREMENT COUNT OF USERS IN RING +];SWPWSP +IFN SWPWSP,[ + ADDM E,UWRKST(U) ;ADJUST WORKING SET +];SWPWSP +QSWI2A: +IFN PAGPRE,[ +;IF THIS USER IS WAITING FOR THIS PAGE, MAKE HIM RUNNABLE BY PUTTING +;HIM ON THE SCHMNY LIST, AND PRE-EMPT THE CURRENTLY-RUNNING USER. +;THE IDEAS ARE TO START THIS USER'S NEXT PAGE READ AS SOON AS POSSIBLE, +;AND TO ELIMINATE THE SCHEDULING THAT WOULD OTHERWISE BE NECESSARY TO RUN THIS GUY. + AOS NPREE1 + CONSZ PI,200_-APRCHN ;CAN'T PREEMPT IF CLKOFF + CONSZ PI,100000_-APRCHN ;OR IN PROGRESS, BECAUSE + JRST POPIJ ;MIGHT ZERO FLSINS WHILE SCHEDULER + ;IS EXECUTING IT & SIMILAR NASTIES + AOS NPREE2 + CAME D,FLSINS(U) ;IF JOB THAT JUST GOT PAGE IS WAITING FOR IT + JRST POPIJ + AOS NPREE3 + SETZM FLSINS(U) ;THEN THAT JOB PREEMPTS CURRENT ONE + MOVSI T,%SWPGW + TDNE T,USWST(U) + SOS NPGWTU ;FLSINS WAS DUE TO PAGE FAULT (MIGHT BE IN .CALL CORBLK) + ANDCAM T,USWST(U) + HRRZ I,U + PUSHJ P,SCHSB + SETOM PREEMP + CONO PI,CLKRQ ;REQUEST INT TO SCHEDULER +];PAGPRE +IFE PAGPRE,[ + SKIPE ENPREE + CAME D,FLSINS(U) + JRST POPIJ + MOVE TT,PRVCUT + CAME U,PRVUSR + CAMLE TT,UPGSEC(U) + SETZM SCHFLG +];PAGPRE +POPIJ: POP P,I + POPJ P, + +IFN E.SP,[ +E.SPGJ: SKIPE E.SPGH ; FLAG FROM E.SPGI + CAME U,DISUSR + JRST QSWI2 ; LEAVE AS IS + TRNN I,400000 + JRST QSWI2 + MOVEI I,3 + JRST QSWI3 ; GO MAKE READ/WRITE + ; DON'T SOS NSWPGS, SINCE PAGE IS ALREADY HERE +];E.SP + +SUBTTL USER SCHEDULER + +OVHMTR SC1 ;SCHEDULER 1 - ENTRY + +IFN KL10P, IFNDEF SCCOST, SCCOST==250. ;CHARGE 1 MILLISEC FOR SCHEDULING +IFN KA10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING +IFN KS10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING + +SCHED: SKIPGE U,USER + JRST SCHED9 + MOVE T,CLKBRK +IFN KS10P,[ + ;; If user is swapped out while running in the page fail code, then + ;; EPTPFO is used as the PC. Either he is on his way in, in which + ;; case he will come back when restarted, or he is on his way out, + ;; in which case this just pushes him on his way. + TLNE T,%PSUSR + JRST SCHED0 + HRRZ T,T + CAIL T,PFAIL ; First instruction inclusive + CAILE T,PFAILE ; Last instruction inclusive + SKIPA T,CLKBRK + MOVE T,EPTPFO +SCHED0: ] ;IFN KS10P + MOVEM T,UPC(U) +IFN SCHBLN,SETZM SCHMNY ;ENTERED FROM QUANTUM RUNOUT, TIME TO CHECK ALL USERS +SCHED2: ;ENTERED FROM UFLS OR PAGE FAULT, CHECK FOR AUXIL PERSON TO RUN + ;IF SCHMNY IS STILL -1 + AOS NSKED + MOVSI T,UEXIT ;GET HERE FROM CLUFLS + HRRI T,UUO(U) + BLT T,SUEXND-1(U) +IFN KL10P,[ + AC7CTX + XCTR XR,[HRRZ A,13] ;GCSTBR + XCTR XR,[HRL A,14] ;STBR + SYSCTX + MOVEM A,ULSPBR(U) + SKIPL MTRUSR ;SKIP IF PERF COUNTER AVAILABLE + JRST [ DMOVE A,MBOXCT(U) ;COMPUTE EQV CPU TIME FROM MBOX+EBOX ACCT + DSUB A,STMBOX ;AS INCREMENTAL RUNTIME + DMUL A,KLMBCC + DADD B,EBOXCT(U) + DSUB B,STEBOX + DMUL B,KLEBCC + MOVE A,D + JRST SCHD2A ] + RPERFC A + DSUB A,STPERF ;USER RUN TIME IN 80 NS UNITS LEFT 12 + DIVI A,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS IN A +SCHD2A: +] ;KL10P +IFN KS10P, LDB A,[044000,,UPQUAN(U)] ;GET TIME USED IN 3.9 USEC UNITS +IFN KA10P, LDB A,[022100,,UPQUAN(U)] ;GET TIME USED IN 4.069 USEC UNITS + ADDM A,USRTM1 ;SYSTEM TOTAL USER RUN TIME + ADDM A,UTRNTM(U) ;INCREASE RUN TIME + ADDM A,JTMU(U) ;DECREASE PROCEDURE PRIORITY + MOVEI B,SCCOST(A) ;ACCOUNT FOR OVERHEAD IN STARTING UP + ADDM B,@UTMPTR(U) ;DECREASE PROCEDURE TREE PRIORITY +IFE SWPWSP,[ + MOVE T,NMPGS(U) ;USWPRI IS PAGES IN CORE X CPU TIME + SUB T,NSWPGS(U) +];SWPWSP +IFN SWPWSP,[ + HLLO B,UWRKST(U) ;USWPRI IS LOG(WORKING SET SIZE) X (CPU TIME + IO WAIT TIME) + JFFO B,.+1 ;C GETS 19 - LOG(WORKING SET SIZE + 1/2) + MOVEI T,19. + SUB T,C +];SWPWSP + IMUL T,A + MOVE Q,UTMPTR(U) + ADDM T,USWPRI(U) ;CHARGE AGAINST SWAPPINNG PRI + ADDM T,SWRCE-USRRCE(Q) ;AND FOR TREE + MOVE B,A + LSH B,-7 ;GET RUNTIME IN 512 USEC UNITS + CAILE B,777 + MOVEI B,777 ;TO FIT IN SCHEDULER HISTORY TBL + MOVE C,USWST(U) + SKIPE FLSINS(U) + TLNN C,%SWPGW + JRST SCHED8 + TRO B,1000 ;BLOCKAGE DUE TO PAGE FAULT +IFN SWPWSP,[ + CAML A,LODQNT ;CHECK FOR LEAVING LOADING STATE +SCHED8: TLZN C,%SWLOD ;DUE TO RUNNING FOR MORE THAN LODQNT BETWEEN PAGE FAULTS + JRST .+2 ;OR DUE TO BLOCKAGE FOR REASON OTHER THAN A PAGE FAULT + PUSHJ P,LVLOA0 ;LEAVE LOADING STATE +];SWPWSP +.ELSE SCHED8: + DPB B,[311200,,@SCHHP] ;COMPLETE SCHEDULER HISTORY TBL ENTRY + SKIPL Q,RTIMER(U) ;SKIP UNLESS RUNTIME INT ACTIVE + JRST SEARRT +SCHED3: SKIPGE DLSRCH + JRST SEAREP ;DELETE SEARCH, EXIT +IFN PAGPRE,[ + SKIPE PREEMP ;PRE-EMPT? + JRST SCHEDP ;YES, AVOID DOING FULL SCHEDULE +];PAGPRE +IFN SCHBLN,[ + SKIPN SCHMNY ;IF NOT YET TIME TO DO A FULL SCHEDULE, + JRST SEARL0 +SCHED4: HLRZ U,UREALT ;THEN CHECK LIST OF JOBS SCHEDULED BEFORE + JUMPE U,SEARL0 ;ALWAYS SCHEDULE IF HIGH PRIORITY REAL TIME USER ACTIVE + PUSHJ P,SCHGB ;POP NEXT JOB OFF LIST + JUMPL U,SEARL0 ;EMPTY + PUSHJ P,SCHACK + JRST SCHED4 ;JOB CEASED TO BE RUNNABLE + AOS NSSKED ;OK, RUN THIS ONE + JRST SCHED6 +];SCHBLN + +SEARRT: SUB Q,A + MOVEM Q,RTIMER(U) + JUMPGE Q,SCHED3 + MOVSI T,(%PIRUN) ;GIVE RUNTIME INTERRUPT + IORM T,PIRQC(U) + JRST SCHED3 + ; +; HERE TO DO A FULL SCHEDULE (LOOK AT ALL JOBS) +; + +OVHMTR SC2 ;SCHEDULER 2 - SEARCH + +SEARL0: AOS NRSKED ;1 MORE REAL SCHED (ACTUALLY SEARCHES JOBS) + CLEARM TRUMM ;TOTAL RUNNABLE USER MEM + CLEARM AUSOPG ;ACTIVE USER SWAPPED OUT PAGES + CLEARM BUMPGS ;PAGES IN REAL CORE BELONGING TO BLOCKED USERS +IFE SWPWSP, CLEARM ASBUM ;PGS IN REAL MEM OCC BY SWAPPED BLOCKED LOSERS + SKIPN SWPOPB + SKIPE SWPOPR + PUSHJ P,SWPON ;SWAP OUT STUFF +IFN NSWPV,[ + SKIPGE CIRPSW + PUSHJ P,SWPPIN ;SERVICE SWAPPING REQUESTS FROM OTHER PROCESSORS (DISPLAY) +] + SETZB U,J ;JOB BEING SCHEDULED + SETZM RNABLU ;NUM RUNABLE USERS +IFN SCHBLN,[ + SETZM SCHBNJ ;GOT NO RUNNABLE JOBS YET + SETOM SCHMNY ;ALLOW ALL THE RUNNABLES WE FIND TO RUN +];SCHBLN +.ELSE SETOM I ;BEST USER SO FAR + MOVNI T,7 + MOVEM T,SCHFLG ;DONT SCHED AGAIN FOR 1/7.5 SEC + JRST SEARL1 + +;HERE IF NULL JOB HAD BEEN RUNNING + +SCHED9: AOS NNSKED ;1 MORE TIME NULL JOB WAS RUN +IFN KA10P, LDB C,[022100,,UPQUAN] ;GET TIME NULL JOB RAN IN 4.069 USEC UNITS +IFN KS10P, LDB C,[044000,,UPQUAN] ;GET TIME NULL JOB RAN IN 3.9 USEC UNITS +IFN KL10P,[ + CAMN U,MTRJOB ;IF METERING ONLY NULL JOB, STOP METERS NOW + WRPAE PAEOFF + CAMN U,MTRJOB + CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1 + REBOXC A ;COMPUTE NULL JOB'S EQUIVALENT RUNTIME IN 4 USEC UNITS + DSUB A,NULEBC + RMBOXC C + DSUB C,NULMBC + DMUL C,KLMBCC ;CONVERT MBOX COUNT TO EBOX COUNTER UNITS, + DADD A,D ;ADD TO EBOX COUNT + DMUL A,KLEBCC ;CONVERT TO 4 USEC UNITS. + SKIPGE MTRUSR + JRST [ RPERFC C ;PERFORMANCE METER AVAILABLE, USE IT INSTEAD + DSUB C,NULPRF + DIVI C,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS + JRST .+1 ] +];KL10P + ADDM C,NULTM1 ;ACCUMULATE TOTAL NULL TIME IN 4 USEC UNITS + SKIPE NPGWTU ;IF SOMEONE WOULD HAVE BEEN RUNNING IF THEY + ADDM C,LOSTM1 ; WEREN'T WAITING FOR A PAGE, THIS WAS LOST TIME + SKIPN NPGWTU ;BUT OTHERWISE + ADDM C,IDLTM1 ;IT WAS COMPLETE IDLE TIME + SKIPE NPGWTU ;NOW COMPUTE % TIME IDLE AND LOST + ADDM C,LOSRCE + SKIPN NPGWTU + ADDM C,IDLRCE +IFN PAGPRE,SKIPN PREEMP ;CHECK FOR PRE-EMPT + JRST SEARL0 ;NOW GO DO A FULL SCHEDULE +IFN PAGPRE,[ +SCHEDP: SETZM PREEMP + AOS NPREEL + PUSHJ P,SCHGB ;U GETS USER TO PRE-EMPT THIS ONE (LAST INTO SCHMNY LIST) + JUMPL U,SCHDP1 ;NO ONE TO PRE-EMPT, RUN SAME USER AGAIN + PUSHJ P,SCHACK ;MAKE SURE PRE-EMPTING JOB IS RUNNABLE + JRST SCHEDP ;AFRAID NOT + AOS NPREEM ;OK, RUN THIS ONE + SKIPL I,USER + PUSHJ P,SCHSB ;PRE-EMPTED JOB IS STILL A CANDIDATE FOR RUNNING + JRST SCHED6 + +SCHDP1: SKIPGE U,USER ;TRY TO RUN SAME USER AGAIN + JRST SCHED1 ;RUN NULL JOB AGAIN + PUSHJ P,SCHACK ;MAKE SURE THIS JOB IS STILL RUNNABLE (COULD HAVE UFLSED) + JRST SEARL0 ;FOO, BETTER DO A FULL SCHEDULE + JRST SCHED6 ;OK, RUN THIS GUY +];PAGPRE + +;MAIN SEARCH LOOP, RETURN HERE TO EXAMINE NEXT PROCEDURE +SEARL: MOVEI U,LUBLK ;LENGTH OF USER VAR BLOCK + ADDB U,J ;STEP TO NEXT USER + CAML U,USRHI ;SKIP IF EXISTS + JRST SEAREN ;ALL PROCEDURES HAVE BEEN EXAMINED +SEARL1: SKIPE T,USTP(U) + JRST SEARS1 ;EMPTY OR STOPPED JOB SLOT + SKIPE A,PIRQC(U) + JRST SEAR2A ;FIRST WORD INTERRUPT PENDING +SEARL2: SKIPE B,IFPIR(U) + JRST INTWD2 ;SECOND WORD INTERRUPT PENDING +SEARL3: SKIPN FLSINS(U) + JRST SEARC ;NOT BLOCKED +SEARL4: MOVE T,EPDL2(U) + XCT FLSINS(U) ;TEST BLOCKING CONDITION (MAY SKIP ONCE OR TWICE) + JRST SEARLB ;UNRUNABLE + JRST SEARC ;LOW PRIORITY UNBLOCK + SKIPA Q,[-1] ;HIGH PRIORITY UNBLOCK + MOVEI Q,3 ;EXTRA LOW PRIORITY + JRST SEARC2 + +SEARC: SETZM Q ;SET TO NORMAL PRIORITY + PUSHJ P,UPRIVL ;COMPUTE PRIVELEGE LEVEL (MAY SKIP ONCE OR TWICE) + SOJA Q,SEARC2 ;HIGH-PRIORITY + JRST SEARC2 + SKIPGE APRC(U) + ADDI Q,2 ;DISOWNED JOB IN USER MODE +SEARC2: AOS RNABLU ;ANOTHER RUNABLE USER + MOVE T,TIME + MOVEM T,LUBTM(U) ;RECORD LAST TIME UNBLOCKED +IFE SWPWSP,[ + SKIPGE USWSCD(U) + JRST SEARC7 ;HE'S SWAPPED BLOCKED SO HE DOESNT COUNT +];SWPWSP + JUMPE U,SEARC4 ;DON'T FIGURE SYSTEM JOB. + MOVSI T,%SWDSO + ANDCAM T,USWST(U) ;RUNNABLE SO NOT DESIRED OUT + MOVE T,NMPGS(U) + ADDM T,TRUMM ;TOTAL RUNNABLE USER MEM + MOVE T,NSWPGS(U) + ADDM T,AUSOPG ;TOTAL PAGES OF RUNNABLE USERS SWAPPED OUT +SEARC4: CAMN U,UREALT ;IF THIS IS REAL TIME USER IN HIGH PRIORITY + JRST [ MOVEI A,0 ; PHASE, SCHEDULE WITH INFINITE PRIORITY + JRST SEARP2 ] + SKIPLE T,URTIME(U) ;NON SKIP IF POSSIBLE REAL TIME BLOCK + TLNN T,1 ;SKIP IF REAL TIME BLOCK UNLESS PI IN PROGRESS + JRST SEARC6 + SKIPGE PICLR(U) ;SKIP IF PI IN PROGRESS + JRST SEARL ;REAL TIME BLOCKED +SEARC6: MOVE A,@UTMPTR(U) ;GET AMOUNT OF MACHINE TIME USED RECENTLY BY TREE PROCEDURE IS IN + LSH A,3 ;COMBINE WITH TIME FOR JUST THIS PROCEDURE + ADD A,JTMU(U) ;TO GET PRIORITY FIGURE (SMALLER NUMBER IS HIGHER PRI) + LSH A,(Q) ;ADJUST PRIORITY BY MULTIPLICATIVE FACTOR IN Q +;THE EFFECT OF THIS PRIORITY COMPUTATION IS THAT JOBS IN THE SAME TREE +;ARE COMPARED BY JTMU, WHILE JOBS IN DIFFERENT TREES ARE COMPARED MAINLY +;BY USRRCE, ALTHOUGH A MUCH SMALLER JTMU CAN OVERRIDE A SOMEWHAT LARGER +;USRRCE. THIS IS SOMEWHAT DIFFERENT THAN THE COMPUTATION THAT WAS HERE +;BEFORE MAY 1980, BUT THAT COMPUTATION'S RESULTS EVEN DEPENDED ON THE +;ORDER THAT JOBS HAPPENED TO BE INSPECTED, AND ALLOWED A TREE WITH +;A LARGE NUMBER OF RUNNING JOBS TO GET AN UNFAIR SHARE OF THE MACHINE. +SEARP2: +IFN SCHBLN, PUSHJ P,SCHSJB ;INSERT JOB INTO PRIORITY-SORTED LIST +.ELSE [ JUMPL I,SEARP5 + CAML A,U0P ;SKIP IF IS BETTER THAN BEST SO FAR + JRST SEARL +SEARP5: MOVEM U,I ;I GETS NEW BEST USER SO FAR + MOVEM A,U0P ;U0P GETS PRIORITY OF THAT USER +];SCHBLN + JRST SEARL ;TRY NEXT + +IFE SWPWSP,[ +SEARC7: MOVE T,NMPGS(U) ;RUNNABLE AND SWAPPED BLOCKED + SUB T,NSWPGS(U) + SOSL T + ADDM T,ASBUM + JRST SEARC4 +];SWPWSP + +;JOB IS NOT RUNNABLE +SEARLB: JUMPE U,SEARL ;DON'T FIGURE SYSTEM JOB + MOVE T,USWST(U) +IFE SWPWSP, SKIPL USWSCD(U) ;IF LOCKED OUT, DONT COUNT +IFN SWPWSP, TLNN T,%SWSB + TLNN T,%SWPGW + JRST SEARB1 ;NOT WAITING FOR PAGE + MOVE T,NMPGS(U) ;USER IS WAITING FOR PAGE SO COUNT FOR ACTIVE + ADDM T,TRUMM + MOVE T,NSWPGS(U) + ADDM T,AUSOPG + JRST SEARL + +SEARB1: TLNE T,%SWBEM + JRST SEARL ;HAVE MADE BEST SWAPOUT EFFORT + MOVE T,NMPGS(U) + SUB T,NSWPGS(U) + SOSL T + ADDM T,BUMPGS ;REAL MEM PGS BELONGING TO BLOCKED USERS + JRST SEARL + +SEARS1: SKIPN UNAME(U) + JRST SEARL + MOVE T,USWST(U) ;GUY STOPPED, DOES HE HAVE PAGES IN REAL MEM? + TLNE T,%SWBEM + JRST SEARL ;HAVE TRIED BEST EFFORT TO SWAP OUT + MOVE T,NMPGS(U) + SUB T,NSWPGS(U) + ADDM T,BUMPGS + JRST SEARL + +IFN SCHBLN,[ +;TEST ALL THINGS THAT MAKE A PERSON UNRUNNABLE, OR AT LEAST +;REQUIRE THE ATTENTION OF THE SCHEDULER +;SKIP-RETURN IF JOB IS RUNNABLE, BASHES T, A +SCHACK: CAMGE U,USRHI ;NON-EXISTENT + SKIPE USTP(U) ;STOPPED + POPJ P, + SKIPE T,PIRQC(U) + JRST [ TDNE T,[BADBTS] + JRST SCHACI ;NON-DEFERRABLE + SKIPN PICLR(U) + JRST .+3 ;ALL INTERRUPTS DEFERRED + ANDCM T,IDF1(U) + TDNE T,MSKST(U) + JRST SCHACI + JRST .+1 ] + SKIPE T,IFPIR(U) + JRST [ SKIPN PICLR(U) + JRST .+1 ;ALL INTERRUPTS DEFERRED + ANDCM T,IDF2(U) + TDNE T,MSKST2(U) + JRST SCHACI + JRST .+1 ] + SKIPE FLSINS(U) ;FLUSH INSTRUCTION NOT SATISFIED + JRST [ MOVE T,EPDL2(U) + XCT FLSINS(U) ;IT MAY BE SATISFIED BUT NOT CLEARED YET + POPJ P, ;STILL BLOCKED + JRST .+1 ;CAN SKIP VARIOUS RANDOM NUMBERS OF TIMES + JRST .+1 + JRST .+1 ] +SCHAC1: SKIPLE T,URTIME(U) ;REAL-TIME BLOCKED + TLNN T,1 + SKIPA + SKIPLE PICLR(U) + AOS (P) + POPJ P, + +SCHACI: MOVE T,UPC(U) ;TRYING TO INTERRUPT, NEEDS SCHEDULER + TLNN T,%PCUSR ;ATTENTION UNLESS RUNNING IN EXEC MODE + SKIPE FLSINS(U) ;IN WHICH CASE NEED TO LET IT FINISH + POPJ P, ;SO IT CAN BE PCLSRED + JRST SCHAC1 + +;PUT JOB IN U, PRIORITY IN A, INTO STACK IN PRIORITY ORDER. BASH T,TT,B. +SCHSJB: SKIPG T,SCHBNJ ;FIRST SEARCH FOR SLOT IN WHICH TO INSERT + JRST SCHSJ1 ;BUFFER NOW EMPTY, SKIP SEARCH + MOVE TT,T + CAML A,SCHBPR-1(T) + SOJG T,.-1 ;LOOP TERMINATES WITH T SLOT WHERE IT BELONGS + CAIL TT,SCHBLN + SOJA T,SCHSJ3 ;BUFFER FULL, WORK DIFFERENTLY +SCHSJ0: MOVE B,SCHBTB-1(TT) ;MOVE STUFF UP TO ADD ANOTHER ENTRY + MOVEM B,SCHBTB(TT) + MOVE B,SCHBPR-1(TT) + MOVEM B,SCHBPR(TT) + CAILE TT,1(T) + SOJA TT,SCHSJ0 +SCHSJ1: AOS SCHBNJ +SCHSJ5: MOVEM U,SCHBTB(T) + MOVEM A,SCHBPR(T) + POPJ P, + +SCHSJ3: AOS NSCHOV ;BUFFER NOT BIG ENOUGH FOR ALL RUNNABLE JOBS + JUMPL T,CPOPJ ;THIS JOB IS LOWEST PRIORITY, FORGET IT + JUMPE T,SCHSJ5 ;THIS JOB IS SECOND-LOWEST PRIORITY, FORGET LOWEST + MOVE TT,[SCHBTB+1,,SCHBTB] + BLT TT,SCHBTB-1(T) ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST + MOVE TT,[SCHBPR+1,,SCHBPR] + BLT TT,SCHBPR-1(T) + JRST SCHSJ5 + +;PUSH JOB IN I ONTO STACK OF RUNNABLE JOBS +SCHSB: AOS T,SCHBNJ + CAILE T,SCHBLN + JRST [ SOS SCHBNJ ;BUFFER OVERFLOW + AOS NSCHOV ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST + MOVE T,[SCHBTB+1,,SCHBTB] + BLT T,SCHBTB+SCHBLN-2 + MOVEM I,SCHBTB+SCHBLN-1 + POPJ P, ] + MOVEM I,SCHBTB-1(T) + POPJ P, + +;POP STACK OF RUNNABLE JOBS INTO U (RETURNS -1 IF STACK EMPTY) +SCHGB: SOSL U,SCHBNJ + SKIPA U,SCHBTB(U) + SETZM SCHBNJ ;BUFFER EMPTY, U HAS -1 + POPJ P, +];SCHBLN + +.ALSKF==0 +DEFINE ALTSKP A +IFE .ALSKF,[ + DEFINE .ALSKS +A TERMIN +] +IFN .ALSKF,[ + CAME U,.ALSKS + CAMN U,A + POPJ P, +] +.ALSKF==.ALSKF#1 +TERMIN + +;DETERMINES USER PRIVILEGE LEVEL FOR SCHEDULING AND SWAPPING +UPRIVL: SKIPN RPCL(U) ;BEING RPCLSR'ED? + CAMN U,UMASTER ;MASTER? + POPJ P, ;HIGHLY PRIVILEGED + AOS (P) ;SKIP AT LEAST ONCE +IFN 340P\E.SP, ALTSKP DISUSR +IFN VIDP, ALTSKP NVDUSR +IFN TABP, ALTSKP TABUSR +IFN ARMP, ALTSKP ARMUSR +IFN LPTP, ALTSKP LPTUSR +IFG LPTP-1, ALTSKP OLPUSR +IFN PLTP, ALTSKP PLTUSR +IFN .ALSKF,[ + CAMN U,.ALSKS + POPJ P, ;DON'T FIGURE DISOWNED IF USING ABOVE DEVICES +] + MOVE T,UPC(U) + TLNE T,%PCUSR + AOS (P) ;SKIP TWICE + POPJ P, + +OVHMTR SC3 ;SCHEDULER 3 - EXIT + +;SEARCH END (EXIT) +SEAREN: +IFE SWPWSP,[ + SKIPE NUSWB + PUSHJ P,SSWC1 ;SEE IF ENUF CORE TO UNBLOCK A SWAPPED BLOCKED LOSER +];SWPWSP +IFE SCHBLN,[ + SKIPGE U,I ;SKIP IF NON-NULL JOB BEST + JRST SCHED1 + AOS NSCHDU +];SCHBLN +IFN SCHBLN,[ + MOVE T,SCHBNJ + ADDM T,NSCHDU + PUSHJ P,SCHGB ;GET HIGHEST-PRIORITY JOB + JUMPL U,SCHED1 ;NONE, RUN NULL JOB +];SCHBLN +SCHED6: SKIPE FLSINS(U) + JRST SCHED5 +SCHED1: EXCH U,USER + JUMPL U,SCHDN ;JUMP IF SWITCHING FROM NULL JOB + CAMN U,USER ;SKIP UNLESS RUNNING SAME JOB AGAIN + JRST SEAREP ;JUMP ON SAME JOB +IFN KL10P,[ + CAMN U,MTRJOB ;IF LEAVING JOB BEING METERED, STOP METER AND + WRPAE PAEOFF + CAMN U,MTRJOB + CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1 +] +;SWAP OUT THE OLD JOB'S CONSOLE REGISTER, AND CLEAR ITS BLINKER. +IFN N11TYS,[ + SKIPGE TT11P + SKIPE TEN11F + JRST SSTVR1 ;DONT HACK 11 + SKIPL TVCREG(U) ;DO WE WANT TO SAVE TV CONSOLE REG FOR THIS GUY? + SKIPN T,400000+TTR10*2000 ;0 IS NOT A (VERY) LEGITIMATE CONSOLE REG FCN + JRST SSTVR2 ;SO ASSUME 11 STOPPED, DONT CLOBBER PREV THING + MOVEM T,TVCREG(U) +SSTVR2: SKIPGE T,TVVBN(U) ;DID WE SET RUNNING BLINKER FOR THIS GUY? + JRST SSTVR1 ;NO + MOVEM T,400000+TTR10*2000 ;SET TO VIDEO BUFFER WE SET IT IN + MOVE A,TVBLAD ;ADDR IN VIDEO BUFFER WE FLASHED + CLEARM 400000+TTR0*2000(A) ;CLEAR IT +SSTVR1:] +IFN KA10P,[ + MOVE T,40 + MOVEM T,SV40(U) ;SAVE LAST UUO EXECUTED FOR THIS USER + MOVE T,UPC(U) ;IF USER HAS JUST TRAPPED TO 60, + TLNE T,%PCUSR + JRST SCHDN + ANDI T,-1 + CAIL T,60H0 + CAILE T,60HE + JRST SCHDN + MOVNI T,60H0-UUOH0 + ADDM T,UPC(U) ;THEN MOVE HIM INTO UUOH INSTEAD + MOVE T,60 ;AND MOVE 60H'S VARIABLES INTO UUOH'S VARS + MOVEM T,SV40(U) ;(THAT'S ALL 60H DOES ANYWAY). + MOVE T,60H + MOVEM T,SUUOH(U) +] ;KA10P +;DROPS THROUGH. + ;DROPS IN +;COME HERE TO SET UP A JOB THAT WASN'T ALREADY RUNNING. + +SCHDN: MOVE A,U + SKIPGE U,USER + JRST SCHDN2 ;JUMP IF SWITCHING TO NULL JOB +IFN KA10P,[ + MOVE T,SV40(U) ;LOAD NEW KRUFT + MOVEM T,40 +] ;KA10P +IFN N11TYS,[ + SKIPGE TT11P ;DONT HACK 11 IF ITS DOWN (MOSTLY IN CASE ITS BEING HACKED + ;HARDWARILY + SKIPE TEN11F + JRST SLTVR1 ;DONT HACK 11 + SKIPGE T,TVVBN(U) ;BLINK RUNNING FROB? + JRST SLTVR2 + MOVEM T,400000+TTR10*2000 + MOVE A,TVBLAD + MOVNI T,20 + MOVEM T,400000+TTR0*2000(A) + SKIPA T,TVVBN(U) +SLTVR2: MOVSI T,12_<8+4+16.-18.> ;ALU NOP + SKIPL TVCREG(U) + MOVE T,TVCREG(U) + MOVEM T,400000+TTR10*2000 +SLTVR1:] +IFN KL10P,[ + CAMN U,MTRJOB ;IF THIS JOB'S BEING METERED, TURN ON METER AND TIME BASE. + WRPAE PAEON + CAMN U,MTRJOB + CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1 +];KL10P + SOS NRESKED ;COMPENSATE FOR EXTRA AOS ON NEXT PAGE + +;DROPS THROUGH + ;DROPS IN +;COME HERE TO START UP A JOB EVEN IF IT WAS ALREADY RUNNING BEFORE THIS SCHEDULE. + +SEAREP: AOS NRESKED +IFN KA10P,[ + HRLOI T,1 + ANDCAM T,UPQUAN(U) ;RESET QUANTUM TIMER +] ;KA10P +IFN KL10P,[ + RPERFC STPERF ;SAVE PERF METERS FOR LATER USE + DMOVE A,EBOXCT(U) ;COMPUTING RUN TIME EFFECTIVELY RESETS + DMOVEM A,STEBOX ;QUANTUM TIMER + DMOVE A,MBOXCT(U) + DMOVEM A,STMBOX +] ;KL10P +IFN KS10P, SETZM UPQUAN(U) ;RESET QUANTUM TIMER + PUSHJ P,PGLDU + MOVN A,U + IDIVI A,LUBLK + SKIPE B + BUG +IFE KS10P,[ ; KS has no lights. + MOVSI B,400000 + LSH B,(A) + SKIPN MIPGDS + DATAO LIGHTS,B ;LIGHTS HAVE ONE BIT, SHOWING WHICH JOB IS RUNNING. +] ;IFE KS10P + MOVN B,A ;GET JOB'S NUMBER IN B + MOVE T,UPC(U) ;USER'S PC WORD + MOVEM T,CLKBRK + AOS A,SCHHP ;SET UP SCHEDULER HISTORY TBL + CAIL A,SCHHB+SSCHDB + MOVEI A,SCHHB + MOVEM A,SCHHP + HRRM T,(A) ;STORE PC + TLNN T,%PCUSR + TRO B,400000 + HRLM B,(A) ;STORE USER INDEX AND USER BIT + MOVSI T,UUO(U) + HRRI T,UEXIT + BLT T,UEXND-1 ;BLT IN UEXIT BLOCK +IFN KL10P,[ + MOVE T,ULSPBR(U) + AC7CTX + XCTR XW,[HRRZM T,13] ;GCSTBR + XCTR XW,[HLRZM T,14] ;STBR +] ;KL10P ;CONTEXT WILL BE RESTORED AT CLKB5 BELOW +IFN KA10P, CONO @APRC(U) + +; +; THIS IS THE ONE PLACE WHERE CLOCK LEVEL RETURNS TO THE USER JOB +; +CLKB5: +IFE KA10P, DATAO PAG,@CLCXSV ;RESTORE CONTEXT + MOVE U,USER + MOVSI U,AC0S(U) ;RESTORE AC BLOCK 0 + BLT U,U + JRST 12,@CLKBRK ;RESTORE PC, FLAGS, AND PI + +;HERE WHEN STARTING A USER WHO HAD BEEN FLSING + +SCHED5: MOVE T,USWST(U) +IFN SWPWSP,[ + TLNN T,%SWPGW ;PAGE WAITS DON'T COUNT AS BLOCKING + TLNN T,%SWOUT ;IF SWAPPED-OUT, UNBLOCKING BUMPS SWAP-IN PRIORITY + JRST SCHD5A + MOVE TT,USWPRI(U) ; (A SOMEWHAT QUESTIONABLE FEATURE) + LSH TT,-1 + MOVEM TT,USWPRI(U) +SCHD5A: +];SWPWSP + TLNE T,%SWPCL + JRST SCHED7 ;JUMP IF PAGES SWAPPED OUT WHILE BLOCKED IN EXEC MODE + TLNE T,%SWPGW + SOS NPGWTU ;NOT WAITING FOR A PAGE ANY MORE + MOVSI T,%SWPGW+%SWRUN+%SWINT ;NOT WAITING FOR PAGE,NOT UNBLOCKED SWAPOUT, + ANDCAM T,USWST(U) ;NOT WAITING FOR INTERRUPT PAGE + SETZM FLSINS(U) ;NOT WAITING FOR ANYTHING + JRST SCHED1 + +SCHED7: PUSHJ P,PCLSR ;PAGES WERE SWAPPED OUT WHILE BLOCKED IN EXEC MODE + BUG ;SO PCLSR JOB SINCE IT MIGHT BE COUNTING ON THOSE PAGES + JRST SCHED1 ;PCLSR MUST SUCCEED. JOB WAS BLOCKED WITH EMPTY LSWPR. + + +;COME HERE TO RUN THE NULL JOB. + +SCHDN2: SKIPL A ;WERE RUNNING IT ALREADY? + AOS NNULBK ;NO, INCREMENT # CONSECUTIVE BLOCKS OF NULLTIME. + MOVSI T,(JFCL) + MOVEM T,CLUSAV ;AVOID LOSSAGE AT CLKBRK+1 NEXT CLOCK INT +IFE KA10P, MOVEM T,CLCXSV +IFE KS10P,[ ; KS has no lights. + SKIPN MIPGDS + DATAO LIGHTS,[0] ;LOAD LIGHTS WITH JOB RUNNING (NONE) +] ;IFE KS10P +IFN KA10P,[ + HRLOI T,1 + ANDCAM T,UPQUAN +] ;KA10P +IFN KL10P,[ + CAMN U,MTRJOB + WRPAE PAEON + CAMN U,MTRJOB + CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1 + REBOXC NULEBC + RMBOXC NULMBC + RPERFC NULPRF +] ;KL10P +IFN KS10P, SETZM UPQUAN + CLEARM SCHFLG ;RESCHEDULE ON NEXT CLK INT + LPMR UPGML + JRST 12,@[%PSPCU,,NULJOB] ;DISMISS INT AND GO TO NULL JOB + +NULJOB: MOVSI (JRST 4,) + MOVEI 17,1 ;SET ACS 0 TO 16 TO JRST 4,0 +IFN ,[ + ; If a KLH10 emulator, try going into a true sleep. This CANNOT be + ; used on a real processor -- the IOWRI will cause an IO page fault! + ; Emulator must be configured so HOST device is at 777000. + ; Take advantage of fact that desired arg of 1 is already set up. + IOWRI 17,777000 ; 1 = Sleep until next interrupt +] ; + BLT 17,16 ;TO CATCH SPURIOUS TRANFERS TO ACS + MOVE 17,[AOJA 17] ;RUNS IN ACS TO FREE MEMORY FOR OTHER PROCESSORS + JRST 2,@[%PCUSR,,17] ;RUNS IN USER MODE FOR SAKE OF RANDOMNESS + +IFE SWPWSP,[ +OVHMTR SC4 ;SCHEDULER 4 - UNSWAPBLOCKER + +;SEE IF THERE IS ENOUGH CORE TO UNBLOCK A SWAP-BLOCKED JOB. +SSWC1: SKIPGE U,BUSR + POPJ P, + MOVN T,NSWPGS(U) + ADD T,MEMFR + SUB T,NCBCOM + ADD T,SOLNG + SUB T,SILNG + SUB T,AUSOPG + ADD T,ASBUM + ADD T,BUMPGS + CAIGE T,20 + POPJ P, ;THERE ISN'T ENOUGH ROOM. + MOVSI T,400000 + ANDCAM T,USWSCD(U) ;CLEAR SWAP BLOCKED + SETOM BUSR + MOVE T,[-1_-1] + MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER. + AOS NTSBUU + SOSN NUSWB + JRST SSWSC3 + MOVEI U,0 + MOVNI R,1 + MOVSI T,200000 +SSWSC4: CAML U,USRHI + JRST SSWSC6 + SKIPGE USWSCD(U) + SKIPN UNAME(U) + JRST SSWSC5 + CAMGE T,NMPGS(U) + JRST SSWSC5 + MOVE R,U + MOVE T,NMPGS(U) +SSWSC5: ADDI U,LUBLK + JRST SSWSC4 + +SSWSC6: MOVEM R,BUSR ;STORE NEW SMALLEST SWAPPED BLOCKED LOSER + SKIPGE R + MOVEI T,0 + MOVEM T,BUSIZ +SSWSC3: JUMPL I,SEARL0 ;MAYBE CAN RUN THIS GUY NOW + POPJ P, +];SWPWSP + +OVHMTR SWU ;SWAP USER + +;SWAP OUT N PAGES (N IS IN SWPOPR) +SWPON: MOVE C,SOLNG + SKIPGE CIRPSW ;CAN'T DO ANYTHING WITHOUT CIRPSW + CAILE C,2*NQS + POPJ P, ;ALREADY STUFF ON WAY OUT + SKIPL U,PSWOUS ;SEE IF CONTINUING TO SWAP OUT A USER + CAML U,USRHI + JRST SWPON1 + MOVE C,PSWCLS + SKIPE LSWPR(U) ;PREFER NOT TO SWAP OUT + JRST SWPON1 ;USER WHO HAS SWITCHES LOCKED + SKIPE UNAME(U) ;SKIP ON USER KILLED + SKIPL USWST(U) .SEE %SWDSO ;OR NOT DESIRED OUT ANY MORE +SWPON1: PUSHJ P,SWPON2 ;FIND NEW USER TO FLUSH + JUMPL U,SWUP8 +SWPON6: MOVSI A,%SWDSO ;THIS USER NOW DESIRED OUT + IORM A,USWST(U) + MOVEM C,PSWCLS + MOVEM U,PSWOUS + MOVE T,UPC(U) + TLNE T,%PCUSR + JRST SWPU1 ;OK TO SWAP USER + SKIPN LSWPR(U) ;PCLSR IF HAS LOCKS, OR AT JBFLS, + SKIPN FLSINS(U) ;OR IF NOT BLOCKED + JRST SWPON8 + MOVSI T,%SWPCL ;OTHERWISE, DON'T PCLSR NOW, BUT + IORM T,USWST(U) ;WHEN IT UNBLOCKS + JRST SWPU1 ;AND START SWAPPING OUT ITS PAGES + +SWPON8: PUSHJ P,PCLSR ;GET OUT OF SYS BEFORE SWAPPING OUT + POPJ P, + JRST SWPU1 + +;FOUND NO USER TO SWAP OUT +SWUP8: SKIPE NLOOSP + JRST SWOL1 ;SWAP OUT SOME LOOSE PAGES + AOSE SBEFLG ;HAVE WE COME HERE TWICE? + JRST SWUP6 ;YES, GIVE UP + MOVSI B,%SWBEM ;NO, TURN OFF EVERYONE'S BEST EFFORT BIT + MOVEI J,2*LUBLK ;AND LOOK AT EVERYONE AGAIN SINCE WE'RE DESPERATE +SWUP9: CAML J,USRHI ;TO FIND A PAGE TO SWAP OUT + JRST SWUP7 + ANDCAM B,USWST(J) + ADDI J,LUBLK + JRST SWUP9 + +SWUP7: PUSHJ P,SWPON2 ;HAVING TURNED OFF %SWBEM, FIND A USER TO SWAP OUT + JUMPG U,SWPON6 ;GO SOMEONE, GO DO +SWUP6: SETZM SWPOPR ;CAN'T FIND ANYONE TO SWAP OUT, GIVE UP + SETOM PSWOUS + POPJ P, + +SWOL1: SKIPN A,FLOOSP ;SWAP OUT SOME LOOSE PAGES + BUG ;NLOOSP WAS TOO HIGH? + MOVNI C,1 + PUSHJ P,SWPOPG + BUG ;CIRPSW, EXEC PAGE COUNT ALREADY CHECKED + SETOM SBEFLG ;WE FOUND A PAGE TO SWAP OUT, NOT DESPERATE + MOVE C,SOLNG + SOSLE SWPOPR ;ENOUGH + CAIL C,20. ;ENOUGH FOR NOW + POPJ P, + SKIPE NLOOSP ;SWAP OUT MORE PAGES + JRST SWOL1 + JRST SWPON + ;START SWAPPING OUT THIS USER'S PAGES +SWPU1: AOS NSOUSR + MOVSI A,%SWRUN + CAILE C,1 ;CLASS + IORM A,USWST(U) ;INDICATE USER WAS RUNNABLE AT TIME OF SWAP OUT +IFE SWPWSP,[ + SETZM SWUPC + SKIPN ENUPC + JRST SWPU1B + MOVE T,UPC(U) ;CALCULATE WHAT PAGE HIS PC IS ON + LDB C,[121000,,UPC(U)] + ROT C,-1 + ADDI C,UPGMP(U) + MOVE A,[222200,,(C)] + SKIPGE C + IBP A + LDB A,A + TRNN A,600000 + SETZM A + ANDI A,PMRCM ;MASK TO REAL CORE ADR BITS + SKIPN USTP(U) ;ONLY IF RUNNING + TLNN T,%PCUSR ;AND IN USR MODE + CAIA + MOVEM A,SWUPC ;THEN DON'T ALLOW UPC PAGE TO BE SWAPPED OUT +SWPU1B: +];SWPWSP + MOVE B,PSWLC + AOSE PSWSFL + JRST SWPU3A ;PICK UP FROM WHERE LEFT OFF +IFE SWPWSP,[ + SKIPE ENPZRO + SETOM SWPP0F +];SWPWSP + MOVEI C,UPGMP(U) ;ADDRESS OF PAGE MAP (START FROM PG 0) + MOVEI J,UPGCP(U) + HRLI C,442200 ;CNVRT TO BYTE PNTR TO MAP + HRLI J,442200 + MOVEM C,SWPMBP + MOVEM J,SWPCBP + LDB B,[121100,,HUSRAD(U)] ;DO ALL PAGES THAT MIGHT EXIST +SWPU2: ILDB D,SWPCBP ;CIRC PNTR ENTRY + ILDB A,SWPMBP ;PAGE MAP ENTRY + AOS NSOPGS + JUMPE D,SWPU3A ;DOESN'T HAVE PAGE +IFE SWPWSP,[ + AOSN SWPP0F + SKIPE USTP(U) ;DON'T SWAP OUT PAGE 0 IF NOT STOPPED + CAIN D,-1 ;PAGE IS ABSOLUTE + JRST SWPU3A + TRNN A,600000 ;NO ACCESS + JRST SWPU3A + SKIPN ENAGE + JRST SWPU2A + TRON A,PMAGEM ;HAS PAGE BEEN REFERENCED? (AGE MASK) + JRST [ DPB A,SWPMBP + AOS NAGEAB + JRST SWPU3A ] +SWPU2A: ANDI A,PMRCM ;MASK TO REAL CORE PAGE # + CAMN A,SWUPC ;DON'T SWAP OUT PAGE WHERE PC IS IF RUNNING + JRST SWPU3A +];SWPWSP +IFN SWPWSP,[ ;I DOUBT THAT MOST OF THAT NONSENSE DOES ANYTHING + TRNE A,600000 ;NO ACCESS + CAIN D,-1 ;OR PAGE IS ABSOLUTE + JRST SWPU3A ;MEANS DON'T SWAP OUT + ANDI A,PMRCM ;MASK TO REAL CORE PAGE # +];SWPWSP + HRRZ D,MMSWP(A) ;NUMBER OF USERS WHO HAVE THIS PAGE MAPPED + SOJN D,SWPU4 ;PAGE IS SHARED +SWPU6: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT + MOVE C,PSWOUS + PUSHJ P,SWPOPG ;SWAP OUT THIS PAGE + JRST SWPU3 + SETOM SBEFLG ;FOUND A PAGE TO SWAP OUT, NOT DESPERATE + MOVE C,SOLNG + SOSLE SWPOPR ;ENOUGH + CAIL C,20. ;ENOUGH FOR NOW + POPJ P, +SWPU3: MOVE B,PSWLC + MOVE U,PSWOUS +SWPU3A: SOJG B,SWPU2 + SETOM PSWOUS + MOVSI B,%SWBEM + IORM B,USWST(U) ;SET BEST EFFORT BIT +IFN SWPWSP,[ + SKIPL APRC(U) ;IF DISOWNED, + JRST SWPON + MOVE B,USWPRI(U) ;DECREASE PRIORITY TO COME BACK IN + LSH B,2 + MOVEM B,USWPRI(U) +];SWPWSP + JRST SWPON + ;TRYING TO SWAP OUT A SHARED PAGE +SWPU4: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT + AOSE CIRPSW + BUG ;CIRPSW LOCKED IN SWAP OUT CODE + MOVE C,[2200,,MEMPNT(A)] + MOVEM A,SWOBK + PUSHJ P,UCPRL + 400000,,SWPU5 ;CONSULT THE OTHER USERS OF THE PAGE + SETOM CIRPSW + MOVE A,SWOBK + JRST SWPU6 ;OK TO SWAP IT OUT + +SWPU5: SKIPGE TT,USWST(U) .SEE %SWDSO + POPJ P, ;USER DESIRED OUT, CAN'T HOLD PAGE IN +IFN SWPWSP, TLNN TT,%SWLOD ;IF USER IS LOADING, HOLDS PAGE IN + SKIPN AGERTE + JRST SWPU5A + MOVE TT,I + LSH TT,-1 + ADDI TT,UPGMP(U) + HRLI TT,2200 + TRNN I,1 + HRLI TT,222200 + LDB TT,TT + TRNE TT,600000 ;SKIP IF NO ACCESS, IGNORE AGE + TRNE TT,PMAGEM ;HAS SHE USED THIS PAGE? + POPJ P, ;NO, CAN'T HOLD PAGE IN +SWPU5A: SUB P,[4,,4] + SETOM CIRPSW ;SHARED W/USER WHO IS WANTED IN CORE + AOS NSHRAB ;SO DON'T SWAP IT OUT + JRST SWPU3 + +;COME HERE WITH BEST USER TO SWAP OUT IN U, CLASS IN C +SWPONX: JUMPL U,CPOPJ ;NO SWAP OUTTABLE LOSER +IFN SWPWSP,[ + CAILE C,1 + SKIPN NLOOSP + JRST SWPNX2 + SETO U, ;WOULD RATHER SWAP OUT LOOSE PAGES + POPJ P, + +SWPNX2: MOVSI T,%SWOUT ;MAKE USER SWAPPED OUT + TDNE T,USWST(U) + JRST SWPNX3 ;ALREADY IS? + IORM T,USWST(U) + MOVE T,UWRKST(U) + MOVEM T,USVWRK(U) + MOVE T,TIME + MOVEM T,USWTIM(U) ;DROPS INTO SWPNX3 +];SWPWSP +IFE SWPWSP,[ + CAILE C,1 + SKIPN NLOOSP + SKIPA B,USWST(U) + JRST [ SETO U, ? POPJ P, ] ;WOULD RATHER SWAP OUT LOOSE PAGES + SKIPGE USWSCD(U) + JRST SWPNX3 ;HE'S ALREADY SWAP BLOCKED + TLNN B,%SWPGW ;IS HE RUNNABLE? + SKIPN FLSINS(U) + SKIPE USTP(U) + JRST SWPNX3 + MOVE B,NMPGS(U) ;HE'S RUNNABLE + CAIGE B,TSYSM-SYSB-MEMSY1 + JRST SWPNX1 ;SMALL, NO THRASH + SUB B,NSWPGS(U) + ADD B,MEMFR + SUB B,NCBCOM + ADD B,SOLNG + SUB B,SILNG + SUB B,AUSOPG + JUMPG B,SWPNX3 ;LET THIS GUY THRASH +SWPNX1: SKIPN ENSWBK + JRST SWPNX3 + MOVSI B,(SETZ) ;SWAP BLOCK THIS LOSER + IORM B,USWSCD(U) + AOS NTUSB + AOS NUSWB + MOVE B,NMPGS(U) ;SMALLEST SWAP BLOCKED LOSER? + CAML B,BUSIZ + JRST SWPNX3 + MOVEM U,BUSR ;YES + MOVEM B,BUSIZ ;DROP INTO SWPNX3 +];SWPWSP +;HAVING DECIDED TO SWAP OUT JOB IN U, MAKE SWAP HISTORY TABLE ENTRY +SWPNX3: MOVSI T,2_16. +;GENERAL SWAP HISTORY TABLE KEEPER. ENTER WITH JOB IN U, EVENT IN T, BASHES TT,I,T +SWPKHT: HRLZ TT,U + IDIVI TT,LUBLK ;TT 3.1-3.8 GETS JOB NUMBER, BASHES I + IOR TT,T + HRR TT,TIME +IFN SWPWSP, HLRZ T,UWRKST(U) +IFE SWPWSP,[ + MOVE T,NMPGS(U) + SUB T,NSWPGS(U) +];SWPWSP + SOSL T + DPB T,[321000,,TT] + MOVEM TT,@SWPHTP + AOS T,SWPHTP + MOVE TT,UTRNTM(U) + MOVEM TT,SWPHTL-1(T) + MOVEI TT,SWPHTB + CAIL T,SWPHTB+SWPHTL + MOVEM TT,SWPHTP + POPJ P, + +OVHMTR SWF ;SWAP FIND USER + +;FIND A USER TO SWAP OUT, RETURN IN U, -1 IF NONE +SWPON2: SETOM PSWSFL ;START FROM BEG OF USER +IFE SWPWSP,[ + SKIPL U,PRVUSR + PUSHJ P,CKPRUS ;MAKE SURE PRIV USER EXISTS AND HAS NOT BEEN BLOCKED FOR A LONG TIME +];SWPWSP + MOVNI T,30.*60. + ADD T,TIME ;A MINUTE AGO + MOVNI U,1 + MOVEI J,2*LUBLK + MOVEI C,NSSCDC ;# SWAP OUT CLASSES +SWPON4: CAML J,USRHI ;C HAS INDEX OF MAX CLASS INTERESTED IN + JRST SWPONX ;LOOKED AT ALL USERS, GO PONDER RESULTS + SKIPE UNAME(J) ;SEE IF FOR REAL + SKIPN NMPGS(J) ;DON'T BOTHER IF HAS NO MEMORY + JRST SWPON3 +IFN SWPWSP,[ + MOVE B,USWST(J) + TLNE B,%SWBEM+%SWLOD ;DON'T SWAP OUT IF BEST EFFORT ALREADY MADE, + JRST SWPON3 ; OR STILL LOADING IN + MOVEI I,7 + MOVE TT,USWTIM(J) + CAMLE TT,TIME ;IF PROTECT TIME HASN'T ELAPSED YET, GETS HIGHER PRIORITY + JRST SWPTK ;TO PREVENT THRASHING +];SWPWSP +IFE SWPWSP,[ + MOVE B,USWST(J) + TLNE B,%SWBEM + JRST SWPON3 ;BEST EFFORT ALREADY MADE +];SWPWSP + SKIPE LSWPR(J) + JRST SWPON7 ;PREFER NOT TO SWAP OUT LOSER WITH SWITCHES LOCKED + MOVEI I,1 + TLNE B,%SWPGW + JRST SWPON5 ;FLSINS IS WAITING FOR A PAGE (NOT REALLY BLOCKED) + CAML T,LUBTM(J) + SOJA I,SWPTK ;BLOCKED FOR A LONG TIME (CLASS 0) + SKIPN FLSINS(J) +SWPON5: SKIPE USTP(J) + JRST SWPTK ;CLASS 1 (BLOCKED) +IFE SWPWSP,[ + TLNE B,%SWPRV + JRST [ MOVEI I,7 ;CLASS 7 (PRIV USER) + JRST SWPTK ] +];SWPWSP + JUMPL B,[AOJA I,SWPTK] .SEE %SWDSO ;DESIRED OUT (CLASS 2) + MOVEI I,4 + SKIPGE APRC(J) + SOJA I,SWPTK ;DISOWNED (CLASS 3) +IFE SWPWSP,[ + SKIPGE USWSCD(J) + JRST SWPTK ;SWAP BLOCKED (CLASS 4) +];SWPWSP + SKIPGE TTYTBL(J) + AOJA I,SWPTK ;DOESNT HAVE TTY (CLASS 5) +SWPON7: MOVEI I,6 ;OTHERWISE.... + +SWPTK: CAMGE C,I + JRST SWPON3 ;THIS GUY IN MORE WINNING CLASS +IFE SWPWSP,[ + MOVE A,NMPGS(J) + SUB A,NSWPGS(J) +];SWPWSP +.ELSE MOVE A,UWRKST(J) + CAME C,I + JRST SWPTK2 + XCT SWPTT(C) ;IN SAME CLASS, COMPARE CLASS-DEPENDENT PRIORITY MEASURES + JRST SWPON3 +SWPTK2: MOVE E,@SWPTT(I) ;MAKE THIS GUY BEST VICTIM + MOVE C,I + MOVE U,J +SWPON3: ADDI J,LUBLK + JRST SWPON4 + +;SKIP IF THIS GUY (J) IS BETTER LOSER TO FLUSH THAN PREV BEST (IN E) +SWPTT: CAMG E,LUBTM(J) ;BLOCKED FOR A LONG TIME (0) - LATER LUBTM WINS + CAMG E,LUBTM(J) ;BLOCKED (1) - LATER LUBTM WINS + CAML E,A ;DESIRED OUT (2) - SMALLER WORKING SET WINS + CAML E,A ;DISOWNED (3) - SMALLER WORKING SET WINS + CAML E,A ;RUNNABLE, SWAP BLOCK SET (4) - SMALLER WORKING SET WINS + CAML E,USWPRI(J) ;RUNNABLE, W/O TTY (5) - GO BY PRIORITY + CAML E,USWPRI(J) ;OTHERWISE (6) - GO BY PRIORITY +IFE SWPWSP, BUG ;PRIVELEGED USER (7) - SHOULD ONLY BE ONE +IFN SWPWSP, CAMG E,USWTIM(J);PROTECTED (7) - LATER UNPROTECT TIME WINS +NSSCDC==.-SWPTT + +IFE SWPWSP,[ +CKPRUS: MOVSI B,%SWPRV + CAMGE U,USRHI + ANDCAM B,USWST(U) ;TURN OFF PRIV USER BIT + MOVNI TT,30.*2 + ADD TT,TIME ;TWO SECONDS AGO + SKIPE UNAME(U) + CAML TT,LUBTM(U) + PUSHJ P,NPRVUSR + SKIPG U,PRVUSR + POPJ P, + MOVSI B,%SWPRV + IORM B,USWST(U) + POPJ P, +];SWPWSP + +OVHMTR UUO ;RANDOM UUOS + +;AC: A.9 =>1 SWAP OUT USER +;4.8 => 1 ALL PAGES +;4.7=1 => LOOP FOR A WHILE +;3.9-3.1 USER # SELF IF 0 +;RH => USER VIRTUAL PG # +;OR 4.9=0, 4.8=0, 4.7=0 SWAP OUT RH # OF PAGES +;IF 4.9=0, 4.8=1 AND 4.7=0, HACK PCLSR TEST FEATURE ON CURRENT USER +;RH =0 LEAVE PCLSR TEST MODE =1 ENTER IN ADVANCE MODE =-1 ENTER IN HOLD MODE +; =2 ENTER IN ADVANCE BUT DON'T ^Z + +ASWAP: SKIPN SYSDBG + JRST ILUUO + UMOVE A,(J) + TLNE A,100000 + JRST ASWAP3 + JUMPL A,ASWAP1 + TLNE A,200000 + JRST ASWPCL ;PC LSR TEST MODE. + HRRZM A,SWPOPR ;CLOBBER CLOBBER + POPJ P, + +ASWAP1: HLRZ B,A + ANDI B,777 .SEE MAXJ ;FIELD SHOULD BE BIG ENOUGH + IMULI B,LUBLK + SKIPE B + MOVE U,B + TLNN A,200000 + JRST ASWAP2 + MOVE D,NMPGS(U) + SUB D,NSWPGS(U) + JUMPL D,[JRST 4,.] + JUMPE D,CPOPJ + CONO PI,CLKOFF + MOVEM U,PSWOUS + SETOM PSWSFL + ADDM D,SWPOPR + MOVSI D,%SWDSO + IORM D,USWST(U) + CONO PI,CLKON + POPJ P, + +ASWAP2: PUSHJ P,CWAIT ;RETURNS WITH CLKOFF AND CIRPSW AVAILABLE + SKIPL CIRPSW + HRRZS A ;A HAS VIRTUAL PAGE # + PUSHJ P,UPLC ;RETURN POINTERS IN T AND Q + LDB A,T ;GET MAP ENTRY + LDB C,Q ;GET CIRC PNTR + CAIE C,-1 ;DON'T SWAP OUT ABS PAGE + TRNN A,600000 + POPJ P, ;ALREADY OUT OR DOESN'T HAVE PAGE + ANDI A,PMRCM ;MASK TO REAL CORE PAGE # + MOVNI C,1 + PUSHJ P,SWPOPG + JFCL + JRST CLKONJ + +ASWAP3: MOVE B,[1250000.] + SOJG B,. + UMOVE A,2000 + JRST ASWAP3 + +ASWPCL: MOVEM U,PCLUSR + CLEARM PCLL + CLEARM PCLHSH + SETOM PCLNXT + HRRES A + MOVEM A,PCLDBM + POPJ P, + +;.CALL PGWRIT +; ARG 1 - A +; ARG 2 - PAGE NUMBER IN 'S ADDRESS SPACE +;IF ONLY ONE ARGUMENT IS GIVEN, IT IS ARG 2, AND ARG 1 DEFAULTS TO CURRENT USER + +;THE PAGE IS SWAPPED OUT. THE CALL DOESN'T RETURN UNTIL THE SWAP IS COMPLETED. +; THIS ALLOWS USER TO BE SURE THAT THE COPY ON DISK IS UP TO DATE. +;CONTROL BIT 1.1 => RETURN IMMEDIATELY, NO WAITING. TO WAIT LATER, JUST DO +; ANOTHER PGWRIT WITHOUT SETTING 1.1. +;CONTROL BIT 1.2 => UNLOCK PAGE. IF YOU CALL THIS ON A LOCKED PAGE, +; WITHOUT SETTING BIT 1.2, THE PAGE WILL BE SWAPPED OUT, BUT THE NEXT +; TIME IT IS SWAPPED IN IT WILL BE LOCKED AGAIN. THIS IS USEFUL FOR +; CONTROLLING EXACTLY WHEN A DATA BASE PAGE GETS WRITTEN TO DISK. + +NPGWRT: CAIGE W,2 + JRST [ MOVE J,U ? JRST NPGWR1 ] + MOVE J,A + JSP T,NCORUI ;DECODE THE JOB SPEC + JRST NPGWR0 + JSP T,NCORWR ;WHICH MUST BE WRITABLE + JRST OPNL31 +NPGWR0: +IFN PDP6P,[ + CAIN J,-1 + JRST OPNL34 ;CAN'T HACK PDP6 +];PDP6P + MOVE A,B ;NOTE: SWPOPG TAKES CARE OF THE PCLSR'ING + PUSHJ P,NPGWR1 ;CALL MAIN ROUTINE + POPJ P, ;LOST, OPNL CLEARED LSWPR + JRST LSWPJ1 ;WON, UNLOCK DIELOK + +;USER INDEX IN J, PAGE NUMBER IN A +NPGWR1: TDNE A,[-1,,-400] + JRST OPNL32 ;PAGE NUMBER NOT VALID + PUSHJ P,CWAIT ;DON'T ALLOW PAGE MAPS TO CHANGE, AND TURN CLK OFF + SKIPL CIRPSW ;DON'T NEED UTCOFF BECAUSE UTC LEVEL CAN ONLY PUT PAGES INTO MAPS + EXCH U,J + PUSHJ P,UPLC + EXCH U,J + LDB D,Q ;D GETS CIRC PNTR + JUMPE D,OPNL32 ;NO PAGE THERE + CAIN D,-1 + JRST OPNL12 ;ABSOLUTE PAGE + PUSH P,U + MOVE C,Q ;STARTING FROM UPGCP, FIND MMP + PUSHJ P,UCPRL + 200000,,.+2 + BUG ;IF NONE FOUND + SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT + MOVSI T,MMPTMP ;IF PAGE IS IN TRANSIT + TDNE T,(C) + JRST [ POP P,U + TDNE T,(C) ;AWAIT COMPLETION + PUSHJ P,UFLS + JRST NPGWR1 ] ;THEN TRY AGAIN + MOVE E,C ;SAVE ADDRESS OF MMP ENTRY + PUSHJ P,UCPRL ;SEE IF PAGE IS IN MEMORY + 100000,,NPGWR3 + POP P,U ;NOT SWAPPED IN, BYPASS SWAP-OUT CODE + JRST NPGWR2 + +NPGWR3: SUB P,[4,,4] ;IT'S SWAPPED-IN TO CORE PAGE IN T + POP P,U + HLRZ D,MMSWP(T) + JUMPN D,OPNL12 ;POINTED TO BY AN EXEC PAGE, E.G. 340, SHOULDN'T MESS. + PUSH P,A ;SAVE USER'S VIRTUAL PAGE # + PUSH P,J ;SAVE WHAT JOB THAT IS + PUSH P,E ;SAVE ADDRESS OF MMP ENTRY + MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT + MOVE C,USER ;DON'T PCLSR ME + PUSHJ P,SWPOPL ;SWAP OUT, EVEN IF LOCKED + JRST NPGWR4 ;NO DISK SPACE, OR SOME JOB NOT PCLSRABLE + POP P,E + POP P,J + POP P,A +NPGWR2: MOVE T,CTLBTS(U) + MOVSI D,MMPLOK + TRNE T,2 ;CONTROL BIT 1.2 UNLOCKS + ANDCAM D,(E) + TRNE T,1 ;CONTROL BIT 1.1 INHIBITS WAITING FOR SWAP TO FINISH. + JRST CLKOJ1 + MOVSI T,MMPTMP ;PAGE IN TRANSIT BIT + TDNE T,(E) ;WAIT FOR BIT TO TURN OFF + PUSHJ P,UFLS + JRST CLKOJ1 + +;COULDN'T SWAP OUT, WAIT A WHILE AND TRY AGAIN +NPGWR4: PUSHJ P,UDELAY ;UDELAY TURNS CLKON + POP P,E + POP P,J + POP P,A + JRST NPGWR1 + +EBLK + +;SWAP IN RQ BLOCKS +SWIRQB: +IFN 340P\E.SP, DISSWI: -1 ;USER +IFN VIDP, VIDSWI: -1 +IFN IMXP, POTSWI: -1 +IFN NSWPV-.+SWIRQB,.ERR NSWPV ERR + +SWIVPN: +IFN 340P\E.SP, DISSPG: 0 ;VIRTUAL PAGE NUMBER +IFN VIDP, VIDSPG: 0 +IFN IMXP, POTSPG: 0 + +SWPNTB: ;SIGNAL BITS IN LH OF W TO CFHSW1 +IFN 340P\E.SP, 400000 ;DISPLAY +IFN VIDP, 400000 ;VID +IFN IMXP, 400000 ;POTS + +SWILMT: ;PIRQC BIT TO SET ON ILM +IFN 340P\E.SP, %PIDIS +IFN VIDP, %PIMPV +IFN IMXP, %PIMPV + +PSWOUS: -1 ;INDEX OF PARTIALLY SWAPPED OUT USER +PSWCLS: 0 ;CLASS OF PARTIALLY SWAPPED OUT USER +PSWSFL: 0 ;-1 START FROM BEG OF USER, ELSE PICK UP WHERE LEFT OFF +SWPMBP: 0 ;PNTR TO MAP +SWPCBP: 0 ;PNTR TO CIRC DESC SPACE +PSWLC: 0 ;LOOP COUNT +SBEFLG: -1 ;0 => ALREADY ONCE WANTED TO CLEAR ALL "BEST EFFORT" BITS. +SWPOPR: 0 ;NUMBER OF PAGES DESIRED TO BE SWAPPED OUT +SWPOPB: 0 ;SWAP OUT REQUEST BUT ONLY SWAP OUT NON-RUNNING USERS TO MEET (UNUSED?) +SILNG: 0 ;TOTAL LENGTH OF SWAP IN LISTS +SOLNG: 0 ;TOTAL LENGTH OF SWAP OUT LISTS + ;SINLST AND SOUTLS ARE IN DISK CODE. VARIATION ON QBFP. +SWODSK: NQS-1 ;UNIT TO SWAP OUT ON NEXT +SWOBK: 0 ;MEMBLT BEING SWAPPED OUT +SWOMMP: 0 ;MMP ADDRESS (NOT INDEX) +SPGNMF: 0 ;-1 => PAGE NOT MODIFIED +CFHAS: 0 ;TEMP FOR A AT CFH +SWPIQS: 0 ;SAVE Q AT SWPPIN +CFHUVP: 0 ;USER'S VIRTUAL PAGE NUMBER TOOK FAULT ON +LUMPS: 0 ;UMAPS USED FOR CURRENT USER, MAY DIFFER FROM + ;UMAPS(U) IF TOOK FAULT TRYING TO CAUSE INTERRUPT +TRUMM: 0 ;TOTAL USER MEM ACTIVE USERS +NPGSWO: 0 ;NUMBER OF CURRENTLY SWAPPED OUT PAGES +AUSOPG: 0 ;ACTIVE USER SWAPPED OUT PAGES +BUMPGS: 0 ;REAL CORE PAGES OCC BY BLOCKED + STOPPED LOSERS +NUSWB: 0 ;# LOSERS SWAP BLOCKED +SWPOPU: 0 ;USER PG "BELONGS" TO (IE NOT NECC TO PCLSR THIS GUY, + ;BUT PCLSR ANYONE ELSE LINKED TO PG.) +AGEREQ: 0 ;NUMBER OF PAGES BEING AGED AT SLOW CLOCK +AGEPOS: 0 ;LAST PAGE # AGED + +IFE SWPWSP,[ +PRVUSR: -1 ;PRIV USR +PRVCUT: 1500 ;CUT OFF FOR PRIV USR +SWUPC: 0 ;ABSOLUTE PAGE NUMBER OF USER MODE PC DURNING SWAP OUT +SWPP0F: -1 ;-1 IF CONSIDERING PAGE 0 +ASBUM: 0 ;REAL MEM OCC BY ACTIVE "SWAPPED BLOCKED" LOSERS +SWSCT1: 0 ;TEM AT SWSCD +BUSR: 0 ;INDEX OF SMALLEST SWAP BLOCKED LOSER +BUSIZ: 0 ;SIZE OF BUSR +];SWPWSP + +IFN PAGPRE,[ +PREEMP: 0 ;IF NON-ZERO, A PRE-EMPT IS IN PROGRESS (WHEN WE NEXT GET TO CLK LVL) +NPREEL: 0 ;NUMBER OF LOOPS AT SCHEDP (ATTEMPTED PREEMPTS) +NPREEM: 0 ;NUMBER OF SUCCESSFULL PREEMPTS +NPREE1: 0 ;NUMBER OF TIMES A PAGE CAME IN AND WE STARTED TO THINK ABOUT PREEMPTION +NPREE2: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE OF CLKOFF OR IN PROGRESS +NPREE3: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE FLSINS WAS WRONG +];PAGPRE + +;COUNTS OF REASONS FOR ENTRY TO SCHED +;THESE METERS MAY BE TEMPORARY - SOME OF THEM ARE REDUNDANT +;REASONS NOT COUNTED - VARIOUS PARITY, NXM, AND OTHER ERROR CASES +NLPPRE: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PREEMPT +NLPCLK: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO CLOCK +NLPUFL: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO UFLS +NLPPAG: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE-IN +NLPPGT: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND TUT LOCKED +NLPPGC: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CIRPSW LOCKED +NLPPGM: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND MEMFRZ LOCKED +NLPPG3: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CALLED CFHPO3 (NO MEM) +NLPPGB: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND SWAP-BLOCKED +NPPIUM: 0 ;NUMBER OF TIMES PAGE PUT INTO BUNCHA USERS' MAPS +NPPIU1: 0 ;NUMBER OF USERS PAGES PUT INTO MAPS OF (RATIO OF THESE 2 IS SHARING) + +IFN SWPWSP,[ +LODQNT: ;RUN TIME IN 4-USEC UNITS BETWEEN PG FAULTS TO LEAVE + ;LOADING STATE + IFN KL10P, 3000. ;12 MS + IFN KA10P, 9000. ;36 MS + IFN KS10P, 3000. .ERR Guessed LODQNT on KS10? +LODFCT: 3,,0 ;MULTIPLY LOADING TIME BY THIS TO GET PROTECT TIME (INT,,FRAC) +NUPTAW: 0 .SEE SWOP6 ;NUMBER OF USERS PAGE TAKEN AWAY FROM + +;METERS + +NPLBLJ: 0 ;NUMBER OF PAGE LOADS BY LOADING JOBS +NPLBNL: 0 ;NUMBER OF PAGE LOADS BY NON-LOADING JOBS + +;Still to be done +; 1-, 5-, 15- minute average population of each state, +; also avg of NPGWTU and RNABLU (for load avg) +; avg of core occupied by jobs in each state, +; i.e. UWRKST for load, pro, sw in. +; Relationship of sum of UWRKST's of loading and swapped in +; versus total core occupied by user pages. +; Average time spent in each state before moving on, +; versus size of job. Maybe cpu time as well as +; real time? + +];SWPWSP +BBLK + + +OVHMTR SWP ;SWAP PAGE + +;SWAP OUT PAGE WHOSE MEMBLT INDEX IS IN A +;SKIP IF SUCCESSFUL +;C IS USER WHO DOESN'T NEED TO BE PCLSRED BEFORE HIS PAGES CAN BE SWAPPED. +SWPOPL: TDZA B,B ;THIS ENTRY IGNORES LOCK BIT +SWPOPG: MOVSI B,MMPLOK ;THIS ENTRY RESPECTS LOCK BIT + MOVEM C,SWPOPU + MOVEM A,SWOBK + CAIGE A,TSYSM + CAIGE A,SYSB + BUG ;DON'T SWAP OUT PART OF SYSTEM + AOSE CIRPSW + POPJ P, + LDB C,[MMMPX,,MEMBLT(A)] + ADDI C,MMP + HRRZM C,SWOMMP ;STORE ADDRESS OF FIRST WORD OF MMP ENTRY + TDNE B,(C) .SEE MMPLOK ;LOCKED IN CORE? + JRST [ CAIGE A,256. ;IF SO, DON'T SWAP OUT UNLESS IN "LOW" MEMORY + CAIGE A,LIOBLK ;IN WHICH CASE MUST GO OUT TO AVOID SYSTEM DEADLOCK + JRST SCRPSJ ;SEE CODE AT CIMEMR + CAIGE A,128. + JRST .+1 + CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES + SKIPN USEMDM + JRST SCRPSJ + JRST .+1 ] + SOS CIRPSW ;RELEASE SWITCH + HLRZ B,1(C) + JUMPN B,SWOP1 ;JUMP IF DISK SPACE ALREADY ASSIGNED +SWODF3: MOVSI B,-NQS +SWODF6: AOS I,SWODSK + CAIL I,NQS + SUBI I,NQS ;WRAP AROUND + MOVEM I,SWODSK ;CURRENT SWAPPING DSK + CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL. + SKIPGE QTUTO(I) ;TUT LOCKED + JRST SWODF7 + SKIPL QACT(I) + SKIPG QSFTS(I) ;DSK FULL IN SWAPPING AREA + JRST SWODF7 + MOVSI A,(SETZ) + IORM A,QTUTO(I) + CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL. + MOVEI A,NQCHN+1(I) ;QMFTP(A) CONTAINS TRACK TO START FROM + PUSHJ P,QGTK4 ; RETURNS TRACK IN D + SOS QSFTS(I) +SWODF5: MOVSI A,(SETZ) + ANDCAM A,QTUTO(I) + MOVE A,SWOMMP + HRLM D,1(A) ;STORE DISK ADDRESS IN MMP ENTRY + DPB I,[$MMPUN,,(A)] + JRST SWOP1 + +SWODF7: AOBJN B,SWODF6 ;TRY NEXT DSK FOR SWAPPING AREA + CONO PI,UTCON-1 ;NON FOUND FIND FILE SPACE + MOVNI D,1 + MOVNI I,1 + MOVSI E,-NQS +SWODF2: SKIPL QTUTO(E) ;FIND WHICH DISK HAS MOST FREE SPACE + SKIPGE QACT(E) + JRST SWODF4 + CAMGE D,QSFT(E) + HRRZ I,E + CAMGE D,QSFT(E) + MOVE D,QSFT(E) +SWODF4: AOBJN E,SWODF2 + JUMPL I,CPOPJ ;NO DSK SPACE AVAIL + HRRZM I,SWODSK ;LAST DSK HACKED + JUMPLE D,CPOPJ ; NO ROOM ANYWHERE + CONO PI,UTCOFF-1 + SKIPGE QTUTO(I) + JRST UTCNJ ;TUT LOCKED + MOVSI A,(SETZ) + IORM A,QTUTO(I) + CONO PI,UTCON-1 + MOVEI D,NBLKS/2 ;STARTING POINT + MOVEI A,NQCHN+1(I) ;DISK CHANNEL + MOVEM D,QMFTP(A) + PUSHJ P,QGTK4 ;RETURNS TRACK IN D + MOVEI E,NUDSL + MOVEM E,QMFTP(A);DON'T LEAVE SWAPPING CHNL POINTING INTO FILE SPACE + SOS QSFT(I) + JRST SWODF5 + +SCRPSJ: SETOM CIRPSW + POPJ P, + +SWOP1: AOSE CIRPSW + POPJ P, + AOS NPGSO + +;COME HERE FROM SWPOPG AND MMPRTN TO SWAP OUT A PAGE. +;CLOCK OFF OR IN PROGRESS AND ARGUMENTS IN SWOBK AND SWOMMP. +;PUTS BLOCK ON SWAPOUT LIST IF DISK COPY NEEDS TO BE UPDATED, ELSE +;JUST DELETES MEMORY. IF NO USERS ARE USING THE PAGE, +;RETURNS THE MMP ENTRY OR ARRANGES FOR THE DISK ROUTINES TO. + +SWOP1A: CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL. + MOVE A,SWOBK ;CORE BLOCK # CONTAINING PAGE TO BE SWAPPED OUT + HLRZ C,MMSWP(A) ;NUMBER OF EXEC PAGES POINTING TO THIS PAGE + JUMPN C,SWOP5 ;POINTED TO BY EXEC PAGE, CAN'T SWAP OUT +IFN 340P,[ + MOVSI C,-N340PB-2 +SWOPT2: LDB I,DPEP(C) + TRZN I,600000 + JRST SWOPT1 + ANDI I,PMRCM ;MASK TO REAL CORE PAGE # + CAIN I,(A) + BUG ;DISPLAY STILL SET UP TO PAGE BEING SWAPPED OUT +SWOPT1: AOBJN C,SWOPT2 +] + MOVSI C,MMPPGA + ANDCAM C,@SWOMMP + MOVSI C,(SETZ) + IORM C,MEMBLT(A) ;PREVENT NEW EXEC PAGES FROM BEING SET UP POINTING HERE + CONO PI,UTCON-1 + MOVE C,[2200,,MEMPNT] + ADD C,SWOBK + SETOB B,SPGNMF ;INITIALIZE PAGE NOT MODIFIED FLAG, AND COUNT USERS IN B +IFN SWPWSP,[ + LDB I,C + PUSH P,I + SETZM NUPTAW + MOVSI D,-1 ;COMPUTE WORKING SET CONTRIBUTION TO BE TAKEN AWAY + IDIV D,MMSWP(A) ;LH(MMSWP) KNOWN TO BE ZERO! + PUSHJ P,UCPRL ;CHECK ALL USERS, TAKE PAGE AWAY FROM SOME + 400000,,SWOP6 ;ALSO COUNTS USERS IN B + POP P,I + AOJE B,SWOP7 ;JUMP IF NO USERS USING PAGE, RETURN MMP ENTRY + CAMN B,NUPTAW ;ANY USERS STILL MAPPED TO PAGE? + JRST SWOP8 ;NO, GO SWAP IT OUT + MOVSI D,1 ;YES, COMPUTE WORKING SET ADJUSTMENT + IDIV D,MMSWP(A) ;TO BE ADDED BACK IN TO THEM + PUSHJ P,UCPRL ;GO BACK AND FIX WORKING SETS + 400000,,SWOP6B + JRST SWOP6E ;ABORT SWAP OUT +];SWPWSP +IFE SWPWSP,[ + LDB I,C + PUSH P,I ;NOTE: CAN BACK OUT OF THIS PUSH AT SWOP2B + PUSHJ P,UCPRL + 400000,,SWOP2 ;RETURN ON USERS (CAN BACK OUT AT SWOP2B) + POP P,I + JUMPGE B,SWOP8 +];SWPWSP +SWOP7: MOVSI B,MMPGON ;NO USERS USING PAGE, SO MMP ENTRY WILL BE RETURNED + IORM B,@SWOMMP ;FLAG THAT MMP ENTRY WILL SOON GO AWAY + MOVEI A,0 ;REMOVE FROM LOOSE PAGE LIST + MOVE T,FLOOSP +SWOP7A: MOVE B,A ;B PREDECESSOR + SKIPN A,T ;T SUCCESSOR + BUG ;NOT IN LIST? + LDB T,[MLO,,MEMBLT(A)] + CAME A,SWOBK + JRST SWOP7A + SKIPE B ;FOUND, PATCH OUT OF LIST + DPB T,[MLO,,MEMBLT(B)] + SKIPN B + MOVEM T,FLOOSP + SKIPN T + MOVEM B,LLOOSP + SOSL NLOOSP + JRST SWOP8 + BUG ;NLOOSP TOO LOW. + +IFN SWPWSP,[ + +;THIS UCPRL ROUTINE SCANS ALL USERS, COUNTS THEM IN B, +;USES D TO ADJUST WORKING SETS OF USERS WHICH ARE MAPPED TO +;THE PAGE, AND TAKES THE PAGE AWAY FROM ANY USERS IT CAN, +;COUNTING THEM IN NUPTAW. +SWOP6: AOS B ;COUNT USERS OF THIS PAGE + CAIG U,LUBLK + BUG ;SYS JOB OR CORE JOB? + PUSH P,I + MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW) + ROT I,-1 + ADDI C,(I) + HRLI C,222200 + SKIPGE I + HRLI C,2200 + LDB I,C + SKIPN I + BUG ;NO ACCESS? + TRNE I,600000 + ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET + CAMN U,SWPOPU + JRST SWOP6A ;DON'T CONSIDER PCLSRING SWPOPU + MOVE T,UPC(U) + TLNE T,%PCUSR + JRST SWOP6A + SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED + SKIPN FLSINS(U) + JRST SWOP6D + MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS + IORM T,USWST(U) + JRST SWOP6A + +SWOP6D: PUSH P,D + PUSH P,C + PUSH P,I + PUSHJ P,PCLSR ;BETTER NOT CLOBBER U OR H OR A + JRST [ SUB P,[2,,2] + POP P,D + JRST SWOP6C ] + POP P,I + POP P,C + POP P,D +;WHEN WE GET HERE, THIS JOB CAN'T HOLD THIS PAGE IN +SWOP6A: TRNN I,600000 + JRST SWOP6C ;NOT SET UP SINCE PREV SWAPPED OUT + AOS NUPTAW ;TAKE IT AWAY + LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS + CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST + CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED + CAIN I,2 ;FLUSH R.W.F. + MOVEI I,3 + DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY + AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER + AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS + SOS MMSWP(A) ;DECR COUNT OF PAGE SHARERS +IFN E.SP,[ + CAMN U,DISUSR ;IF USER OF E&S + PUSHJ P,E.SLPM ;LOAD ITS MAP +] +SWOP6C: POP P,I + POPJ P, + +SWOP6F: CAMN U,-4(P) ;DON'T LOOK AT USER TAKING PAGE AWAY FROM + POPJ P, ;ELSE DROP INTO SWOP6B +;THIS UCPRL ROUTINE ADJUSTS WORKING SETS OF JOBS THAT +;ARE MAPPED TO THE PAGE USING D. +SWOP6B: PUSH P,I + MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW) + ROT I,-1 + ADDI C,(I) + HRLI C,222200 + SKIPGE I + HRLI C,2200 + LDB I,C + SKIPN I + BUG ;NO ACCESS? + TRNE I,600000 + ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET + POP P,I + POPJ P, +];SWPWSP + +IFE SWPWSP,[ +;COME HERE VIA UCPRL FOR ALL USERS OF PAGE BEING SWAPPED OUT + +SWOP2: AOS B ;COUNT USERS OF THIS PAGE + CAIG U,LUBLK + BUG ;SYS JOB OR CORE JOB? + PUSH P,I + CAMN U,SWPOPU + JRST SWOP2A + MOVE T,UPC(U) + TLNE T,%PCUSR + JRST SWOP2A + SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED + SKIPN FLSINS(U) + JRST SWOP2D + MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS + IORM T,USWST(U) + JRST SWOP2A + +SWOP2D: PUSHJ P,PCLSR + JRST SWOP2B +SWOP2A: MOVEI C,UPGMP(U) + ROT I,-1 + ADDI C,(I) + HRLI C,222200 + SKIPGE I + HRLI C,2200 + LDB I,C + SKIPN I + BUG ;NO ACCESS? + TRNN I,600000 + JRST SWOP2C ;NOT SET UP SINCE PREV SWAPPED OUT + LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS + CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST + CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED + CAIN I,2 ;FLUSH R.W.F. + MOVEI I,3 + DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY + AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER + AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS + MOVE I,SWOBK + SOS MMSWP(I) ;KEEP ACCURATE COUNT OF UPGMP'S POINTING AT THIS PAGE +IFN E.SP,[ + CAMN U,DISUSR ;IF USER OF E&S + PUSHJ P,E.SLPM ;LOAD ITS MAP +] +SWOP2C: POP P,I + POPJ P, + +SWOP2B: SUB P,[6,,6] ;2 PUSHES OF I AND 4 FOR UCPRL +];SWPWSP +SWOP6E: MOVE A,SWOBK ;ABORT SWAP-OUT + MOVSI I,(SETZ) + ANDCAM I,MEMBLT(A) + SOS CIRPSW + POPJ P, + +SWOP8: DPB I,C ;DELINK MEMPNT + MOVEI I,3 .SEE MMPOUT .SEE MMPTMP + DPB I,[410200,,@SWOMMP] ;INDICATE ON THE WAY OUT + MOVSI I,MMPBAD + ANDCAM I,@SWOMMP + MOVE A,SWOBK + MOVSI B,(SETZ) + CONO PI,UTCOFF-1 + ANDCAM B,MEMBLT(A) + MOVE C,@SWOMMP + TLNN C,MMPGON ;UNLESS PAGE WILL BE FORGOTTEN AFTER SWAP OUT, + AOS NPGSWO ; KEEP COUNT OF PAGES CURRENTLY SWAPPED OUT + TLNE C,MMPWRT ;IF WAS WRITTEN BY USER WHO LATER DELETED IT, + JRST SWOP3 + SKIPGE SPGNMF ;OR IF PAGE MODIFIED, + TLNN C,MMPWOD + JRST SWOP3 ;OR IF HASN'T BEEN WRITTEN TO DISK, MUST WRITE OUT. + MOVEI I,2 ;NO NEED TO WRITE OUT. INDICATE OUT. + DPB I,[410200,,@SWOMMP] + PUSHJ P,IMEMR ;RETURN THE MEMORY + MOVE A,SWOMMP + TLNE C,MMPGON + PUSHJ P,RETMMP ;ALSO RETURN THE MMP ENTRY IF NECESSARY + JRST SWOP4 + +SWOP5: SOS CIRPSW +UTCNJ: CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL + POPJ P, + +SWOP3: CAIGE A,TSYSM ;HAVE TO WRITE THIS PAGE OUT + CAIGE A,SYSB + BUG + HRRZ B,SWOMMP + LDB I,[$MMPUN,,(B)] + CAIL I,NQS + BUG ;DISK NUMBER NOT LEGITIMATE + MOVEI C,.BM MLO + ANDCAM C,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK + HLRZ C,SOUTLS(I) ;GET PREV BLOCK + SKIPE C + DPB A,[MLO,,MEMBLT(C)] ;CHAIN TO PREV BLOCK + SKIPN C + MOVEM A,SOUTLS(I) ;OR TO HEADER IF FIRST + HRLM A,SOUTLS(I) ;AND SET NEW LAST BLOCK + AOS SOLNG + HLRZ C,1(B) + HRLM C,MEMPNT(A) ;STORE DISK ADDRESS + MOVEI B,MUSWPG + DPB B,[MUR,,MEMBLT(A)] + PUSHJ P,QSTRT1 +SWOP4: SOS CIRPSW +UTCNJ1: CONO PI,UTCON-1 + JRST POPJ1 + +IFN NSWPV,[ +SWPPIN: MOVSI Q,-NSWPV ;# OF DEVICES THAT CAN SWAP IN PAGES +SWPPI4: SKIPGE W,SWIRQB(Q) ;USER INDEX + JRST SWPPI6 + MOVE E,SWIVPN(Q) ;VIRTUAL PAGE NUMBER + HRL W,SWPNTB(Q) + CLEARB TT,D + MOVEM Q,SWPIQS + PUSHJ P,CFHSW1 + MOVE Q,SWPIQS + SETOM SWIRQB(Q) +SWPPI6: AOBJN Q,SWPPI4 + POPJ P, +] + +SWIILM: +IFN E.SP,[ + TRNN Q,-1 ; IS DEVICE DIS? (E&S IS INDEX 0 IN SWIRQB) + SETZM E.SPGW ; IF SO, CLEAR PAGE WAIT. +] + SKIPGE E,SWILMT(Q) + BUG + IORM E,PIRQC(W) + MOVEI A,0 + POPJ P, + +SUBTTL LOAD USER PAGE MAP + +OVHMTR UUO ;RANDOM UUOS (WELL, SOME MINOR SCHED STUFF, TOO) + +;SET PAGE MAP AT M.P. LEVEL, ASSUMING UMAPS HAS BEEN ALTERED. +;UMAPS EXISTS SO SCHEDULER CAN RESTORE THE MAP AFTER OTHER JOBS RUN. +;FORMAT OF A MAP SPECIFICATION IS: +%UM==1,,525252 +%UMMPL==200000 ;1 => MAP LOWER HALF TO SPEC'D JOB'S; 0 => USE LOWER OF JOB IN U. +%UMMPU==100000 ;1 => MAP UPPER HALF TO SPEC'D JOB'S; 0 => USE UPPER OF JOB IN U. +%UMALL==300000 ;SET => SELECT WHOLE MAP OF SPEC'D JOB. +%UMUTL==40000 ;IGNORED IF %UMMPU=0. IF %UMMPU=1, MEANS USE SPEC'D JOB'S LOWER + ;INSTEAD OF ITS UPPER, AS OUR UPPER HALF. READ "%UM UPPER-TO-LOWER". +%UMLTU==20000 ;"%UM-LOWER-TO-UPPER". WITH %UMMPL, MAKES LOWER -> SPEC'D JOB'S UPPER. +%UMSOA==4000 ;1 => USE AC0S AS THE USER'S ACS, INSTEAD OF UUOACS. + ;NOTE IF %UMLTU=1, OR IF LOWER -> PDP6, THE GARBAGS ACS ARE USED. + ;ELSE, THE ACS COME FROM THE JOB WHICH OUR LOWER HALF COMES FROM. +;RH ;JOB INDEX OF THE "SPECIFIED JOB". -1 => PDP6. + ;NOT NEEDED IF %UMMPL=%UMMPU=0. + +PGLDU: MOVE R,UMAPS(U) +;SET PAGE MAP AT INT. LEVEL, NOT CLOBBERING JOB'S UMAPS. ARG IN R. +PGLD: MOVEM R,LUMPS ;LAST UMAPS ACTUALLY USED + AOS NPGLD ;COUNT # CALLS TO PGLD + PUSH P,A ;R HAS UMAPS CODE + PUSH P,B + PUSH P,C + HRRZ C,U +IFN KA10P, MOVSI B,NUVPG/2 ;SET UP NORMAL DBL, MIGHT BE CHANGED IF PDP6 +IFE KA10P, MOVSI B,0 ;ONLY KA10 HAS DBL + TLNN R,%UMMPL + JRST PGLD3A ;USE NORMAL LOW SEG +IFN PDP6P,[ + TRNE R,400000 + JRST PGLD3B ;USE PNTR TO PDP6 +] + HRRZ C,R + TLNE R,%UMLTU ;SKIP ON USE HIS LOWER + JRST PGLD3D ;USE HIS UPPER +PGLD3A: HRRI B,UDBR1A(C) + TLNE R,%UMSOA + JRST PGLD3G ;MAKE AC'S POINT AT SWAP OUT AC'S + MOVEI A,UUOACS(C) +PGLD3F: MOVEM B,UPDBR1(U) +IFN KA10P, DPB A,[2300,,UPACP(U)] ;STORE AC PNTR +IFE KA10P,[ + CAMN A,AC1PTR ;IF CHANGING AC BLOCK 1 + JRST PGLD3H + EXCH A,AC1PTR ;STORE OLD BLOCK 1 + MOVE B,A + XCTR XBR,[BLT B,17(A)] + MOVS A,AC1PTR ;AND LOAD NEW BLOCK 1 + XCTR XBW,[BLT A,17] +PGLD3H: ] ;IFE KA10P +IFN KA10P, MOVSI B,NUVPG/2 ;SET UP DBL FOR DBR2 +IFE KA10P, MOVSI B,0 + HRRI B,UDBR2A(U) + TLNN R,%UMMPU + JRST PGLD6 ;USE NORMAL UPPER SEG + HRRI B,UDBR2A(R) + TLNE R,%UMUTL + HRRI B,UDBR1A(R) +IFN PDP6P,[ + TRNE R,400000 + MOVE B,PDP6MP +] +PGLD6: MOVEM B,UPDBR2(U) +PGLDR1: LPMR UPGML(U) + POP P,C + POP P,B + POP P,A + POPJ P, + +IFN PDP6P, PGLD3B: SKIPA B,PDP6MP +PGLD3D: HRRI B,UDBR2A(R) + MOVEI A,GACS + JRST PGLD3F + +PGLD3G: MOVEI A,AC0S(C) + JRST PGLD3F + +GACS: BLOCK 20 ;GARBAGE AC'S POINTED TO BY ACPNTR WHEN ITS REALLY POINTING + ;AT UPPER PAGES OR PDP6 SHOULD HOPEFULLY NEVER GET REFERENCED + +;MAIN PROGRAM MAP-SETTING ROUTINES. +IFN PDP6P,[ +MP6LD: SKIPA J,[%UMMPU,,-1] ;LOAD UPPER DBR TO PNT TO 6 +];PDP6P +MPLDZ: MOVEI J,0 ;SET NORMAL MAP - OUR OWN CORE. +MPLD1: CAMN J,UMAPS(U) ;SET UMAPS AS SPEC'D + JRST CLKONJ + MOVEM J,UMAPS(U) +MPLD: CONO PI,CLKOFF + PUSHJ P,PLD + JRST CLKONJ + +;SET MAP TO JOB # IN J; MIGHT OR MIGHT NOT BE THE CURRENT JOB. SAVES RH(J) +MPLDJ: CAME J,USER + TLOA J,%UMSOA+%UMALL ;OTHER JOB'S ACS ARE IN ITS AC0S. + TLO J,%UMALL ;THIS JOB => WANT UUOACS. + JRST MPLD1 + +;SIMILAR ROUTINES, BUT FOR USE WHEN CLKCHN IS OFF AND SHOULD STAY OFF. +IFN PDP6P,[ +PLD6: SKIPA J,[%UMMPU,,-1] ;MAKE UPPER DBR POINT TO PDP6. +];PDP6P +PLDZ: MOVEI J,0 ;NORMAL MAP +PLD1: MOVEM J,UMAPS(U) +PLD: SPM UPGML(U) ;IF ANY INHIBITED FAULT PRESENT, CAUSE IT TO GET STORED AWAY + PUSH P,R + PUSHJ P,PGLDU ;CAUSE ACTUAL PG LOAD TO HAPPEN + POP P,R + POPJ P, + +SUBTTL GIVING THE USER INTERRUPTS + +SEAR2E: MOVE A,PIRQC(U) + +;ROUTINE TO HANDLE FIRST WORD (PIRQC) INTS +SEAR2A: JUMPL A,SEAR2B ;REQUEST TO PCLSR + SKIPN PICLR(U) + JRST SEAR2C ;PI IN PROG, ONLY LOOK FOR FATAL INTS. + SETCM Q,IDF1(U) + AND Q,MSKST(U) ;ENABLED UNDEFERRED INTS. + TDNN A,Q ;ANY OF THOSE PENDING, + TDNE A,[BADBTS] ;OR ANY CLASS 1 OR 2 => INTERRUPT. + CAIA + JRST SEARL2 + ANDCA Q,A ;GET DISABLED OR DEFERRED PENDING INTS. + TDNN Q,[BADBTS] ;ANY CLASS 1 OR 2 DISABLED OR DEFERRED + JRST INTWD1 ;NO, INT. THIS JOB. + JRST SEAR2D ;YES, INT. SUPERIOR. + +SEAR2C: TDNN A,[BADBTS] ;PI IN PROG: ANY CLASS 1 OR 2 ? + JRST SEARL2 ;NO, NOTHING TO DO. +SEAR2D: PUSHJ P,PCLSR ;INT. THE SUPERIOR: PCLSR FIRST. + JRST SEARC ;CAN'T STOP THIS JOB IN EXEC MODE. + SETZ B, ;OK, HANDLE FATAL 1ST WORD INTS IN A, AND NO 2ND WORD INTS. + +;HANDLE A FATAL INTERRUPT BY INTERRUPTING THE SUPERIOR. +;FATAL 1ST WORD INTERRUPTS IN A, FATAL 2ND WORD INTS IN B. +INTSUP: MOVEM A,SRN4(U) ;.FTL1 + MOVEM B,SRN5(U) ;.FTL2 ;PUT THE FATAL INTERRUPTS WHERE SUPERIOR CAN READ THEM. + MOVSI T,BUSRC + IORM T,USTP(U) ;STOP INFERIOR +IFN SWPWSP, PUSHJ P,LVLOAD + MOVSI T,BULGOS ;IF LOST TRYING TO LOG OUT, ABORT LOGOUT + ANDCAM T,APRC(U) + MOVE Q,U ;SAVE USER INTERRUPTING + SKIPGE U,SUPPRO(U) ;SKIP UNLESS TOP LEVEL + JRST INTTOP ;REALLY TOP LEVEL + HLLZ T,U ;GET INT BIT + IORM T,IFPIR(U) ;TURN ON INTERRUPT BIT IN SUPERIOR + HRRZS U ;CLEAR LEFT HALF OF U + CAIL J,(U) ;SKIP IF SUPERIOR HAS NOT YET BEEN SCHEDULED + JRST SEARL1 ;RESCHEDULE SUPERIOR + JRST SEARL ;HAVEN'T GOT TO HIM YET SO CONTINUE + +INTTOP: MOVEI T,SCRDET + SKIPL APRC(Q) ;IF JOB ISN'T ALREADY DISOWNED + IORM T,SUPCOR ;SAY SOMEONE WANTS TO BE DETACHED. + JRST SEARL ;LEAVE STOPPED, SYS JOB WILL DETACH SOMEDAY. + +SEAR2B: PUSHJ P,PCLSR ;PCLSR THE JOB, E.G. SO IT CAN GET AN IOC ERROR + JRST SEARC ;RUNNING IN EXEC MODE, GO RUN IT + MOVSI A,(SETZ) ;CLEAR REQUEST + ANDCAM A,PIRQC(U) + JRST SEARL1 ;INSPECT THIS JOB AGAIN + +;IFPIR IS NONZERO BUT PIRQC IS ZERO. +INTWD2: SKIPN PICLR(U) + JRST SEARL3 ;IGNORE 2ND WD INTS IF PI IN PROG. + AND B,MSKST2(U) + ANDCM B,IDF2(U) ;GET ENABLED UNDEFERRED INTS. + JUMPE B,SEARL3 ;ALL DISABLED OR DEFERRED. + JSP T,INTPAG ;MAKE SURE NOT WAITING FOR PAGE NEEDED FOR INT. + PUSHJ P,PCLSR ;DON'T INT. EXCEPT IN USER MODE. + JRST SEARC + SETZ A, ;1ST WD INTS TO GIVE = 0. + JRST INTSRC ;2ND WD INTS TO GIVE ALREADY IN B. + +;PIRQC WAS NONZERO BUT NO FATAL INTS. +INTWD1: JSP T,INTPAG ;IF TRIED BEFORE & WENT TO INTPFL, WAIT FOR PAGE. + PUSHJ P,PCLSR ;CAN INT. ONLY IN USER MODE. + JRST SEARC + MOVE B,IFPIR(U) + AND B,MSKST2(U) ;GET PENDING ENABLED UNDEFERRED 2ND WD INTS IN B. + ANDCM B,IDF2(U) + AND A,MSKST(U) + ANDCM A,IDF1(U) ;PENDING ENABLED UNDEFERRED 1ST WD INTS IN A. +INTSRC: AOS NAUINT ;ELSE 1 MORE ATTEMPT TO INTERRUPT. + MOVSI R,%UMSOA ;LOAD ORDINARY MAP FOR THIS USER. + PUSHJ P,PGLD ;BUT ACS -> SWAP OUT ACS. + HRRZ T,40ADDR(U) ;GET ADDR OF USER'S LOCATION "40" + XCTRI XR,[MOVE T,2(T)] ;TRY TO GET CONTENTS OF "42" (..I SO STOP ON EXEC PG FAULT DOESNT) + SKIPA R,T + JRST INTPFL ;PAGE FAULT IN XCTR, GIVE UP & WAIT FOR PAGE. + ANDI R,-1 + JUMPE R,INTBAD ;42 POINTS TO 0 => BADPI ERROR. + MOVE TT,OPTION(U) + TLNN TT,%OPINT ;NEW STYLE INTERRUPTS? + JRST INTOLD ;NO, OLD STYLE. + XCTRI XR,[MOVE R,(R)] ;GET ADDR OF HIS INT PDL PTR. + CAIA + JRST INTPFL + JUMPGE T,INTBAD + CAMGE T,[-72.*5-1,,] + JRST INTBAD + XCTRI XR,[MOVE H,(R)] ;GET CONTENTS OF INT PDL PTR. + JRST INTSR2 ;ADVANCE T PAST INT PDL PTR ADDR. + JRST INTPFL + +INTSR0: XCTRI XR,[MOVE C,(T)] ;GET THE INTS NEXT INT TABLE ENTRY + SKIPA D,B + JRST INTPFL ;APPLIES TO. + XCTRI XR,[AND D,1(T)] + CAIA + JRST INTPFL + AND C,A ;WHICH OF THEM ARE WE TRYING TO GIVE? + JUMPN C,.+2 + JUMPE D,INTSR1 ;NOT GIVING ANY OF THEM, TRY NEXT ENTRY. + MOVE Q,IDF1(U) ;GET CURRENT SETTINGS OF DEFER WORDS. + XCTRI XW,[MOVEM Q,3(H)] + SKIPA Q,IDF2(U) ;AND PUT INTO NEXT INT PDL FRAME. + JRST INTPFL + XCTRI XW,[MOVEM Q,4(H)] + SKIPA Q,UPC(U) ;ALSO PUT CURRENT PC IN FRAME. + JRST INTPFL + XCTRI XW,[MOVEM Q,5(H)] + CAIA + JRST INTPFL + XCTRI XR,[MOVE E,2(T)] ;NOW SEE WHICH DEFER BITS TO TURN ON NOW. + CAIA + JRST INTPFL + XCTRI XR,[MOVE TT,3(T)] + CAIA + JRST INTPFL + XCTRI XR,[MOVE Q,4(T)] ;AND THE NEW PC. + TLOA Q,%PCUSR + JRST INTPFL + TLZ Q,BADPC + SKIPGE IOTLSR(U) + TLO Q,%PCUIO ;DON'T CHANGE HIS IOTLSR STATUS. + XCTRI XW,[MOVEM C,1(H)] + CAIA ;PUT INTS BEING GIVEN IN + JRST INTPFL ;INT. PDL FRAME. + XCTRI XW,[MOVEM D,2(H)] + TDZA B,D + JRST INTPFL + MOVE W,H ;REMEMBER PDL PTR BEFORE INCREMENT, FOR PDL OV TESTING + ADD H,[5,,5] + LDB J,[220500,,R] ;HOW MANY ACS SHOULD WE SAVE? + JUMPE J,INTSR5 ;NONE? + HRLS J + ADD H,J ;ADVANCE THE PDL PTR OVER WHERE THEY'LL GO. + SUBM H,J ;GET BACK THE OLD UN-ADVANCED PDL PTR IN J. + ROT R,14 + HRLI J,(R) ;PUT 3.7-4.1 OF R INTO LH(J) CIRCUITOUSLY + TLZ J,777760 + ROT R,-14 + AOS J ;MAKE J POINT AT 1ST UNUSED PDL WORD. + XCTRI XBRW,[BLT J,(H)] + CAIA + JRST INTPFL +INTSR5: JUMPGE R,INTSR4 ;SAVE DEBUGGING INFO ON INT PDL IF USER WISHES + HRRZ J,UPJPC(U) + XCTRI XW,[MOVEM J,1(H)] + SKIPA J,SUUOH(U) + JRST INTPFL + XCTRI XW,[MOVEM J,2(H)] + SKIPA J,LSPCL(U) + JRST INTPFL + XCTRI XW,[MOVEM J,3(H)] + CAIA + JRST INTPFL + ADD H,[3,,3] +INTSR4: MOVE J,U ;MAYBE? SCHED LOOP WANTS USER IDX IN J? + XCTRI XW,[MOVEM H,(R)] ;STORE BACK THE PDL POINTER, THUS FINALIZING ALL + TDZA A,C ;INTS HAVE BEEN GIVEN; NOW WE CAN CHANGE THE USER VARS. + JRST INTPFL + ANDCAM C,PIRQC(U) + ANDCAM D,IFPIR(U) + IORM E,IDF1(U) ;SET THE DEFER BITS SPEC'D IN TABLE ENTRY. + IORM TT,IDF2(U) + MOVEM Q,UPC(U) ;START USER AT INT HANDLER. + JUMPL H,INTSR3 ;NOW CHECK FOR INT PDL OVFLO. + JUMPGE W,INTSR3 + MOVEI TT,%PIPDL ;THERE WAS OVFLO, SET PDL OV INT + TDNN TT,MSKST(U) ;IF ENABLED. + JRST INTSR3 + IORM TT,PIRQC(U) + JRST SEAR2E ;RE-TRY THE INTERRUPT. + +INTSR3: JUMPN A,SEAR2E ;MORE INTS TO GIVE => RETRY. + JUMPN B,SEAR2E +INTSRX: AOS NUINT ;1 MORE INT GIVEN SUCESSFULLY. + SPM UPGML(U) + JRST SEARC ;SCHEDULE. + +INTSR1: ADD T,[4,,4] ;NO INTS GIVEN, TRY NEXT ENTRY. +INTSR2: AOBJN T,INTSR0 + JRST INTSUP ;ENABLED INTS BUT NO ENTRIES FOR THEM. + +;GIVE INTS THE OLD WAY. +INTOLD: SKIPN C,A ;GIVE INTS OF 1 WD AT A TIME. + SKIPA C,B ;(NO 1ST WD, GIVE ALL 2ND WD) + TDZA B,B ;(SOME 1ST WD INTS, GIVE NO 2ND WD INTS) + TLO C,4^5 ;(GIVING 2ND WD, SET SIGN TO SAY SO) + XCTRI XW,[MOVEM C,(T)] + SKIPA Q,UPC(U) ;STORE INTS BEING GIVEN, + JRST INTPFL + MOVEI T,2(T) ;ADVANCE -> PLACE TO START USER. + XCTRI XW,[MOVEM Q,-1(T)] + TLOA T,%PCUSR ;OLD PC STORED, SET UP NEW. + JRST INTPFL + ANDCAM A,PIRQC(U) ;SAY THESE INTS NOW GIVEN. + ANDCAM B,IFPIR(U) + SKIPGE IOTLSR(U) + TLO T,%PCUIO + MOVEM T,UPC(U) ;SET HIS PC -> TSINT+2 + SETZM PICLR(U) + JRST INTSRX + +;IF WE ARE WAITING FOR A PAGE NEEDED FOR TAKING AN INTERRUPT, +;GIVE UP ON TRYING TO TAKE TE INT. UNLESS PAGE HAS COME IN SINCE LAST TRY. +INTPAG: MOVSI E,%SWPGW + SKIPE FLSINS(U) + TDNN E,USWST(U) + JRST (T) ;JOB NOT WAITING FOR PAGE + MOVSI E,%SWINT + TDNN E,USWST(U) + JRST (T) ;NOT WAITING FOR INTERRUPT PAGE + MOVE E,T + MOVE T,EPDL2(U) + XCT FLSINS(U) + JRST SEARL ;PAGE NOT IN + MOVSI T,%SWPGW+%SWINT ;PAGE IN + ANDCAM T,USWST(U) + SETZM FLSINS(U) + SOS NPGWTU + JRST (E) + +;COME HERE WHEN AN XCTRI TAKES FAULT WHILE TRYING TO STORE AN INTERRUPT. +INTPFL: MOVE J,U ;MAYBE? SCHED MAIN LOOP WANTS USR IDX IN J. + SPM UPGML(U) ;STORE MAP IN INTERRUPTING STATE +IFN KA10P, LDB T,[221000,,UPJPC(U)] ;FAULT ADDRESS +IFN KL10P, LDB T,[$PFPNO,,UPFW(U)] +IFN KS10P, LDB T,[$PFPNO,,EPTP7W] ; Fault happened at PI level 7. + ROT T,-1 + ADDI T,UPGCP(U) + SKIPL T + TLOA T,222200 + HRLI T,2200 + LDB E,T + JUMPE E,INTBAD ;DON'T HAVE PAGE +IFN KA10P,[ + HLLZ T,UPQUAN(U) + TLNE T,100 + JRST INTBAB ;WRITE IN RD ONLY +INTBAC: HLLZ T,UPC(U) ;SIMULATE SETUP OF OPC + LSH T,-5 + HRR T,UPC(U) + MOVEM T,UPOPC(U) ;FAULT STATUS + MOVSI T,1000 + IORM T,UPQUAN(U) ;BIT NOT SET BY XCTRI + MOVSI T,%SWINT + IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATT + LPMRI UPGML(U) ;SET MPV FLAG, WILL CAUSE INT. LATER LPMR'S WON'T + ; CLEAR IT. + JRST SCHED6 ;"RUN" USER, TAKING PAGE FAULT IMMEDIATELY + +INTBAB: TLNE T,50 ;NO ACCESS OR W IN RWF + JRST INTBAC ;PAGING BOX BUG? IGNORE RD ONLY + JRST INTBAD ;REALLY IS READ-ONLY. +] ;KA10P +IFN KL10P,[ + SUBI T,UPGCP-UPGMP + LDB E,T + TRNE E,600000 + LSH E,-20 + CAIN E,2 ;RWF + JRST INTBAB + MOVS T,UPFW(U) + ANDI T,%PFCOD + CAIE T,%PFPNA + JRST INTBAD ;REAL VIOLATION +;DROPS THROUGH + ;DROPS IN +;KL10P ;PF OR RWF, TAKE THE FAULT, READ IN THE PAGE, THEN TRY TO INTERRUPT AGAIN + +INTBAB: MOVSI T,%SWINT + IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATTEMPT + SETOM DLSRCH ;DON'T INTERRUPT AT INTBA1, SCHEDULE, TRY TO PCLSR + ; WITH WRONG PC + MOVEI T,INTBA1 + EXCH T,UPC(U) ;HACK USER'S PC + MOVEM T,EPDL3(U) + JRST SCHED6 ;RUN USER, RETURNING IMMEDIATELY TO INTBA1 + +INTBA1: CONO PI,PIOFF + SETZM DLSRCH + MOVEM U,PFAILU ;SIMULATE A PAGE FAULT ON THE INTERRUPT WORD + MOVE U,USER + MOVE U,EPDL3(U) + MOVEM U,PFOPC1 ;RESTORE USER'S PC + MOVNI U,2 + MOVEM U,PFAILF ;FLAG FAULT FROM INTPFL + MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT + CONO PI,CLKRQ ;TURN PI SYSTEM ON AND CAUSE CLOCK BREAK + JRST . ;TAKES A WHILE TO GO OFF +] ;KL10P +IFN KS10P,[ + MOVE T,EPTP7W + TLNE T,%PF2.8 ; Write in read only? + JRST INTBAD ; Yes: %PIB42 + MOVEM T,UPFW(U) ; No: Set up for a simulated fault + MOVSI T,%SWINT + IORM T,USWST(U) ; Signal fault as result of interrupt attempt + SETOM PFAILF ; Cause CLK level to go to PFLU2 at + ; first opportunity. + MOVEI T,CCLKRQ ; Make sure that happens real fast + EXCH T,UPC(U) ; by setting his PC thusly. + MOVEM T,EPTPFO ; Save old PC as location of fault. + JRST SCHED6 ; Go run this user. +] ;KS10P + +INTBAD: MOVEI A,%PIB42 ;TURN ON BAD PI LOC INT BIT + IORB A,PIRQC(U) ;GIVE USER INTERRUPT(MUST IORM TO AVOID TIMING ERR) + JRST SEAR2A ;RE-PERFORM ACTIONS FOR NON-ZERO PIRQC + ;WILL CAUSE AN INTERRUPT TO SUPERIOR + +;INTERRUPT ALL USERS THAT WANT IT +; C(A) IS BIT IN PIRQC TO TURN ON +DBGINT: MOVSI A,(%PIDBG) ;"SYS BEING DEBUGGED" INT +INTALL: MOVEI U,0 ;ENTRY INITIALIZE +INTA2: ADDI U,LUBLK ;ADVANCE TO NEXT BLOCK OF USER VARIABLES + CAML U,USRHI ;SKIP UNLESS AT END + POPJ P, ;THROUGH, RETURN + SKIPN UNAME(U) ;SKIP IF BLOCK IN USE + JRST INTA2 ;IDLE, IGNORE + LDB T,[410100,,USTP(U)] ;GET BUCSTP OF USERS STOP WORD + JUMPN T,INTA2 ;IF USER CONTROL STOPPED, JUMP TO IGNORE + MOVE B,MSKST(U) ;PICK UP INTERRUPT MASK + AND B,A ;MASK C(B) TO APPROPRIATE BIT + IORM B,PIRQC(U) ;GIVE INT TO USER + JRST INTA2 ;LOOP + +SUBTTL PCLSR ROUTINES + +; PUT PC OF USER WHOSE INDEX IS IN U IN USER MODE +; (CALL ONLY WITH CLOCK OFF OR CLOCK BREAK IN PROGRESS) +;SKIPS IF SUCCESSFUL, FAILS IF USER RUNNING IN EXEC CODE OR HAS TO BE FINALIZED +; +PCLSR: AOS NPCLSR + CAIG U,L + BUG ;PCLSR'ING NULL, SYS OR CORE JOB? + MOVEI T,L + IDIVM U,T + IMULI T,L + CAMN T,U ;IS U REALLY A MULTIPLE OF LUBLK? + SKIPN UNAME(U) ;SHOULD NOT HAPPEN TO NONEXTANT JOB + BUG + SKIPE USTP(U) + JRST POPJ1 ;USER STOPPED (MUST ALREADY BE IN USER MODE) + AOS NEPCLS + SKIPLE T,RPCL(U) + JRST PCLSR2 ;LOSER IS RPCLSR'ING SOMEONE +PCLSR3: MOVE T,SUEXIT(U) +IFE KA10P,SUB T,U + CAME T,[JRST 2,@XUUOH] + JRST PCLSR5 ;EXIT ALREADY CLOBBERED + MOVE T,UPC(U) ;PICK UP PROGRAM COUNTER (FLAGS IN L.H.) + TLNN T,%PCUSR ;SKIP IF USER MODE ON + JRST PCLSR8 ;JOB CURRENTLY IN EXEC MODE + SOS NEPCLS ;WAS WRONGLY AOS'ED + CLEARM FLSINS(U) ;IN CASE HE WAS WAITING FOR A PAGE OR CIRPSW + MOVE T,USWST(U) + TLNE T,%SWPGW + SOS NPGWTU + MOVSI T,%SWPGW+%SWRUN+%SWINT + ANDCAM T,USWST(U) + AOS (P) + POPJ P, + +PCLSR8: SKIPE FLSINS(U) ;SKIP IF UNBLOCKED + JRST PCLSR1 ;HUNG, TRY TO BACK UP TO UUO +PCLSR4: MOVE T,[JRST ONEFLS] + MOVEM T,SUEXIT(U) ;MUNG EXIT OF UUO, COME BACK LATER +PCLSRF: AOS NFPCLS + POPJ P, + +PCLSR2: SETZM RPCL(U) ;CLEAR OUT POINTERS IN BOTH DIRECTIONS + SETZM RPCL(T) + JRST PCLSR3 + +PCLSR5: SKIPN FLSINS(U) + JRST PCLSRF ;NOT HUNG, LET RUN TO COMPLETION +IFN KA10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO + CAME T,[JRST ONEPROC] ;SKIP IF ONE PROCEEDING A SYS CALL + JRST PCLSR6 + MOVSI T,%PC1PR + IORM T,SUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED +PCLSR6:] ;KA10P +IFN KS10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO + CAME T,[JRST ONEPR4] ;SKIP IF ONE PROCEEDING A SYS CALL + JRST PCLSR6 + MOVSI T,OIPBIT + IORM T,XUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED +PCLSR6:] ;KS10P + MOVE T,UPC(U) + TLNE T,%PCUSR + BUG +IFN KA10P, MOVE T,[JRST 2,@UUOH] +IFE KA10P,[ + MOVSI T,(JRST 2,@) + HRRI T,UUOH +] ;IFE KA10P + MOVEM T,SUEXIT(U) ;UNCLOBBER EXIT +PCLSR1: HLRZ T,LSPCL(U) ;SAVE LAST TWO DISTINCT LOCS PCLSR'ED FROM + CAIN T,@UPC(U) + JRST PCLSR9 + HRL T,UPC(U) + MOVEM T,LSPCL(U) +PCLSR9: SOS T,SUUOH(U) ;GET USER LOCATION OF HIS CURRENT UUO +UFL5: +IFN KL10P,[ + TLC T,%PS1PR-%PSINH + TLCN T,%PS1PR-%PSINH + TLO T,%PSINH ;ONE PROCEEDING AND INSTR NOT COMPLETE +] ;KL10P + MOVEM T,UPC(U) ;SET USERS PROGRAM COUNTER +IFE KA10P,[ + MOVSI T,701100 ;RESTORE PAGE-CONTEXT TO USER MODE + HLLM T,CLCX(U) +] ;IFE KA10P + CLEARM UMAPS(U) ;RESTORE TO NORMAL MAP + SETZM FLSINS(U) ;CLEAR OUT ANY BLOCKING CONDITION + MOVE T,USWST(U) + TLNE T,%SWPGW + SOS NPGWTU + MOVSI T,%SWPGW+%SWRUN+%SWPCL+%SWINT ;NOT BLOCKED ON PAGE, NOT UNBLOCKED SWAPOUT, + ANDCAM T,USWST(U) ; NOT INTERRUPT PAGE, NOT SWAPPED OUT WHILE BLOCKED + SKIPE T,LSWPR(U) + JRST LSWZAP ;REQUIRED TO UNLOCK SWITCHES +PCLSR7: +IFE KA10P,[ + MOVEI T,UUOACS(U) ;IF JOB U'S ACS ARE IN HARDWARE AC BLOCK 1, + CAMN T,AC1PTR ;COPY THEM INTO UUOACS WHERE THEY BELONG. + XCTR XBR,[BLT T,UUOACS+17(U)] +] ;IFE KA10P + MOVEI T,AC0S(U) + HRLI T,UUOACS(U) + BLT T,AC17S(U) + JRST POPJ1 ;EXIT AFTER BACKING UP TO UUO + ; +; AOS USTP OF USER IN A +; +NJRPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB +RPCLSR: CAMN A,USER ;NORMAL ENTRY + POPJ P, ;TRYING TO RPCLSR SELF OR NULL JOB + PCLT + PUSH P,U ;SAVE U + MOVE U,A ;GET INDEX OF RPCLSRED JOB IN U + MOVE A,USER ;GET RPCLSRING USER INDEX IN A + CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS + PUSHJ P,PCLSR ;PUT USER IN USER MODE + JRST RPCLOS ;JUMP IF CAN'T DO IT RIGHT NOW + AOS USTP(U) ;WIN,STOP USER + CONO PI,CLKON ;RE-ENABLE CLOCK BREAKS +RPCLS1: MOVE A,U ;RESTORE A + POP P,U ;RESTORE U + POPJ P, +; +RPCLOS: SKIPE RPCL(U) ;SKIP IF ZERO RPCL FOR USER BEING RPCLSRED + JRST RPCLS2 ;SOMEONE GOT THERE FIRST + SKIPE RPCL(A) ;SKIP IF ZERO RPCL FOR RPCSRING USER + JRST UDELAY ;YOU ARE BEING RPCLSR'ED, SURRENDER + HRROM A,RPCL(U) ;SET UP RPCL IN VARS OF RPCLSRED USER + HRRM U,RPCL(A) ;" OF RPCLSRING USER + PCLT + SKIPE RPCL(A) ;WILL NOT SKIP AT FIRST + PUSHJ P,UFLS ;WAIT FOR PERSON BEING RPCLSRED TO GET TO ONEFL2 + JRST RPCLS1 +; +RPCLS2: MOVE A,U ;RESTORE A AND U + POP P,U + PCLT + SKIPE RPCL(A) ;WAIT FOR OTHER GUY TO WIN + PUSHJ P,UFLS + JRST RPCLSR ;THEN TRY AGAIN + +; +; UNDO AN RPCLSR +; +NJUPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB +UPCLSR: CAMN A,USER ;REGULAR ENTRY + POPJ P, ;TRYING TO UPCLSR SELF OR NULL JOB + SOSGE USTP(A) + BUG + POPJ P, + +IFN KA10P,[ +; +; RETURN FROM SYSTEM CALL IN ONE PROCEED MODE +; +ONEPROC:CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS + MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT + MOVEI T,%PI1PR + IORM T,PIRQC(U) ;GIVE USER INTERRUPT + JRST ONEPR2 +] + +SUBTTL KS-10 ONE-PROCEED + +IFN KS10P,[ +ONEPRO: SYSCTX ;SWITCH TO SYSTEM AC BLOCK + SKIPGE U,USER + BUG AWFUL,[ONE-PROCEED IN NULL JOB] + MOVE T,1PROPC(U) ;PC OF NEXT INSTRUCTION TO EXECUTE + TLNE T,%PSUSR ;NORMALLY USER MODE IS EXPECTED + JRST ONEPR3 + HRRZ T,T ;SEE IF IT'S FIRST INSTRUCTION OF EXEC ENTRY + CAIE T,UUOH0 + CAIN T,MUUOTR + SKIPA TT,[JRST ONEPR4] + BUG AWFUL,[ONE-PROCEED IN EXEC MODE],OCT,1PROPC(U) + MOVEM TT,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION + CAIE T,UUOH0 ;AND RESUME PROCESSING UUO + JRST [ USRCTX + JRST MUUOTR ] + USRCTX + JRST UUOH0 + +ONEPR3: MOVEM T,UUOH ;PUT USER PC WHERE ONEFLS WANTS IT +ONEPR4: SYSCTX ;COME HERE WHEN ONE-PROC'D UUO FINISHES + MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT + MOVEI T,%PI1PR + IORM T,PIRQC(U) ;GIVE USER INTERRUPT + JRST ONEFLS +];KS10P + +SUBTTL USER START ROUTINES +; +; CALLED EVERY SLOW CLOCK TICK WHEN TTY WANTING TOP PROCEDURE LOADED +; +USTART: PUSH P,U +USTRT1: SKIPL T,@UTTYO ;GET TTY TO BE STARTED + JRST [ MOVE U,MMPFR ;WHEN STARTING A HACTRN, MAKE SURE CORE IS AVAILABLE + CAIGE U,100 + JRST USTRTL ;IT'S NOT, SAY SYSTEM FULL + JRST .+2 ] ;T HAS INITIAL TTYTBL + MOVSI T,%TBNOT+%TBDTY+%TBNVR ;NOT A REAL TTY, INITIALIZE TTYTBL TO NO TTY + PUSHJ P,USTRA ;CREATE NEW USER SLOT ENTRY + JRST USTSC1 ;LOSE, HAVE TO WAIT + SKIPGE T,@UTTYO ;SKIP IF REALLY A TTY + JRST USTRTS ;DONT LOAD A HACTRN + MOVE T,[SIXBIT /HACTRN/] ;LOAD HACKTRN +USTRT2: MOVEM T,JNAME(U) ;SET JOB NAME + MOVEM T,XJNAME(U) + HRLZI T,%PCUSR + HRRI T,1 + MOVEM T,UPC(U) + MOVEI T,AC0S(U) + HRLI T,NUSTCD + BLT T,AC17S(U) + MOVE T,JNAME(U) + MOVEM T,AC0S+11(U) + SETZM @UTMPTR(U) ;GIVE TEMPORARY HIGH PRIORITY + SETZM USTP(U) ;START UP +USTSC2: AOS T,UTTYO ;AOS RING BUFF + CAIL T,UTTYS+MXCZS + MOVEI T,UTTYS + MOVEM T,UTTYO + SOSE UTTYCT + JRST USTRT1 ;MORE JOBS TO SET UP + JRST POPUJ + +USTRTS: MOVEM U,1(T) ;STORE USER'S INDEX IN SECOND WORD + MOVE T,(T) ;GET JNAME FROM FIRST WORD (POINTED TO BY RH OF @UTTYO) +IFN DEMON,[ + CAME T,[SIXBIT /LDRDEM/] + CAMN T,[SIXBIT /UNSPOO/] + AOS UTMPTR(U) ;LOADER, UNSPOOLER -> SYSTEM TREE +] + JRST USTRT2 + +USTSC1: MOVE U,USRHI ;IF A USER IS ^Z'ING AND THERE IS NO POSSIBILITY + SKIPL T,@UTTYO ;OF GETTING MORE JOB SLOTS, + CAIGE U,LUBLK*MAXJ + JRST POPUJ +USTRTL: MOVSI U,%TANJS ;THEN MARK THE TTY AS IN NEED OF A "SYSTEM FULL" MESSAGE + IORM U,TTYSTA(T) + MOVEI U,SCRCFM ;AND WAKE UP THE SYS JOB. + IORM U,SUPCOR + JRST USTSC2 ;REMOVE THIS TTY FROM LIST OF THOSE NEEDING A ^Z. + +;GOBBLE NEW USER SLOT, RESET VARIABLES (SKIPS IF IT WINS) +;RETURNS INDEX IN U. IF FAILS, CLOBBERS U! +USTRA: MOVEI U,0 +USTR3: CAML U,USRHI + JRST USTR1 ;ASSIGN MORE CORE TO USER STORAGE + SKIPN UNAME(U) + JRST USTR2 ;HAVE FOUND FREE USER SLOT (IN U) + ADDI U,LUBLK + JRST USTR3 + +USTR1: SKIPGE SJCFF + POPJ P, ;SYSTEM JOB FLUSHING CORE, WAIT UNTIL IT STABILIZES + MOVEI U,LUBLK ;MOVE UP USRHI IF SYS HAS ENOUGH CORE + ADD U,USRHI + PUSH P,T + MOVE T,HUSRAD ;LENGTH OF SYS + CAIGE T,USRSTG(U) + JRST MORCOR ;SYS NEEDS MORE CORE FOR USER VARIABLES + POP P,T +USSINI: SETOM USTP-LUBLK(U) ;SYS INITIALIZATION ENTRY + EXCH U,USRHI +USTR2: PUSHJ P,USTR4 ;RESET USER VARIABLES + MOVEI T,SIOCHN-1(U) + MOVEM T,SIOCP(U) + CLEARM IOCHNM(U) + HRLI T,IOCHNM(U) + HRRI T,IOCHNM+1(U) + BLT T,IOCHNM+17(U) ;CLEAR ALL I/O CHANNELS +USRST4: HRLI T,AC0S(U) + HRRI T,AC0S+1(U) + SETZM AC0S(U) + BLT T,AC17S(U) ;CLEAR AC'S & RETURN HAPPY + JRST POPJ1 + +MORCOR: SUB P,[1,,1] + MOVSI T,SCLDEC + ANDCAM T,SUPCOR ;CLEAR ANY SYS CORE DECREASE REQ + MOVSI T,SCLEX + JRST SUPSET ;REQUEST MORE CORE FROM SYS JOB + ; +; INITIALIZE A SET OF USER VARIABLES +; T HAS INITIAL TTYTBL, POSITIVE IT IS TTY # ELSE NO TTY +USTR4: MOVEM T,TTYTBL(U) + JUMPL T,USTR4B + PUSH P,U + HRRM U,TTYSTS(T) ;TELL TTY IT NOW BELONGS TO NEW JOB, + MOVSI U,%TSCNS ;AND IS NOW A CONSOLE. + IORM U,TTYSTS(T) + MOVSI U,%TSFRE + ANDCAM U,TTYSTS(T) ;AND IS NO LONGER FREE + MOVSI U,%TACFM+%TACTZ + ANDCAM U,TTYSTA(T) ;AND WILL NEED CONSOLE FREE MESSAGE + POP P,U + ADDI T,USRRCE +USTR4A: MOVEM T,UTMPTR(U) + HRROI T,'000 + MOVEM T,UNAME(U) + PUSH P,U + MOVE T,U + IDIVI T,LUBLK + POP P,U + DPB T,[000300,,UNAME(U)] + LSH T,-3 + DPB T,[060300,,UNAME(U)] + LSH T,-3 + DPB T,[140300,,UNAME(U)] + MOVE T,UNAME(U) + MOVEM T,XUNAME(U) + MOVEM T,HSNAME(U) + MOVE T,JNAME(U) + MOVEM T,XJNAME(U) + MOVEI T,(U) + HRLI T,%TSCNS + MOVEM T,TTSTSV+2(U) + SETZM USWST(U) +IFN SWPWSP,[ + SETZM UWRKST(U) + SETZM USVWRK(U) + MOVE T,TIME + ADDI T,2*30. ;PROTECT FROM SWAPOUT FOR 2 SECONDS (RANDOMLY) + MOVEM T,USWTIM(U) +];SWPWSP + SETZM NSWPGS(U) + SETZM NMPGS(U) + SETOM JBI(U) ;NOT JOB DEVICE HANDLER (NOT YET, ANYWAY) + SETZM OPTION(U) + SETZM STTYOP(U) + SETOM TRNLST(U) ;INIT TRANSL LISTS TO NIL + SETOM TRNLS1(U) + SETZM HUSRAD(U) + JUMPE U,.+5 ;SYSTEM JOB DOESN'T HAVE A MAP + CLEARM UPGMP(U) + MOVSI T,UPGMP(U) + HRRI T,UPGMP+1(U) + BLT T,UPGCP+NUVPG/2-1(U) + MOVSI T,(MOVEM U,) + HRRI T,AC17S(U) + MOVEM T,SCLUSV(U) +IFE KA10P,[ + MOVSI T,(DATAI PAG,) + HRRI T,CLCX(U) + MOVEM T,SCLCXS(U) + MOVEI T,USRSTG(U) +IFN KL10P, LSH T,-9 + HRLI T,701100 + MOVEM T,CLCX(U) + MOVSI T,(JRST 2,@) + HRRI T,XUUOH(U) + MOVEM T,SUEXIT(U) + MOVSI T,(CAI) ;INITIALLY IGNORE TRAPS 1 AND 2 + MOVEM T,TR1INS(U) + MOVEM T,TR2INS(U) +IFE KS10P,MOVEI T,%PI1PR ;TRAP 3 IS IGNORED TOO ON KS + MOVEM T,TR3INS(U) ;TRAP 3 GIVES ONE-PROCEED INTERRUPT ON KL +] ;IFE KA10P +IFN KL10P,[ + SETZM ULSPBR(U) + MOVSI T,MUUOKN ;UUO NEW PC'S ARE SAME AS SYS JOB'S, + HRRI T,MUUOKN(U) ; EXCEPT THAT UUO IN EXEC MODE IS AN ERROR + BLT T,MUUOPT(U) + MOVEI T,MUUOEX + HRRM T,MUUOKN(U) +] ;KL10P +IFN KS10P,[ + MOVE T,[%PSPCU,,MUUOEX] + MOVEM T,MUUOKN(U) ; UUO in Exec mode is an error + MOVEM T,MUUOKT(U) ; (either case) + HRRI T,UUOH0 + MOVEM T,MUUOCN(U) ; Normal UUO + HRRI T,MUUOTR + MOVEM T,MUUOCT(U) ; UUO as trap instruction + HRRI T,ONEPRO + MOVEM T,1PRNPC(U) ; One-proceed jumps to ONEPRO +] ;KS10P +IFN KA10P,[ + MOVE T,[JRST 2,@UUOH] + MOVEM T,SUEXIT(U) +] ;KA10P + MOVSI T,BUSRC + MOVEM T,USTP(U) + SETOM SUPPRO(U) + SETZM UCLBLK(U) + SETOM UCLBLK+1(U) + MOVE T,[JRST UREALB] + MOVEM T,UCLBLK+2(U) + CLEARM UPGML(U) ;CLEAR USER PG MAP VARIABS + MOVEI T,UPGML+1(U) + HRLI T,-1(T) + BLT T,UPGMLE(U) +IFN KA10P,[ + MOVSI T,1+EXPGNG ;DONT ENABLE QUAN COUNTER FOR NOW (BUT SET + ; EXEC PAGING) + MOVEM T,UPQUAN(U) + MOVE T,EXECMP + MOVEM T,UPDBR3(U) ;SET UP EXEC DBR + MOVSI T,IFN MCOND DM,[1040] .ELSE [0] ;ON DM, B+C MEMORIES DON'T WORK + MOVEM T,UPACP(U) ;SET UP B+C MEMORY PTRS +] ;KA10P +IFN KS10P, SETZM UPQUAN(U) ; Clear quantum counter. + +;DROPS THROUGH + +;DROPS THROUGH, AND .RESET OF USR DEVICE COMES HERE. +USRST2: MOVE T,UNAME(U) + MOVEM T,USYSNM(U) ;CLOCK MUST BE OFF OR PI IN PROG ON 7 + MOVE T,TIME ;DON'T SWAP JOB OUT RIGHT AWAY + MOVEM T,LUBTM(U) + PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,E + MOVEI C,UCLBLK(U) + SKIPL 1(C) + JSP E,CLQCLR + SETOM SERVER(U) + SETZM PAGAHD(U) + SETZM PAGRAN(U) + SETZM UWHO1(U) + SETZM UWHO2(U) + SETZM UWHO3(U) +IFN N11TYS,[ + SETZM NVDBA(U) ;0 VIDEO BUFFERS ASSIGNED BY JOB. + SETOM TVCREG(U) + SKIPL T,TTYTBL(U) + PUSHJ P,USTTV0 + SETOM TVVBN(U) +USTTV1: ];N11TYS + POP P,E + POP P,C + POP P,B + POP P,A + SETZM URTIME(U) + SETZM UTIME(U) + SETOM RTIMER(U) + MOVSI T,%PCUSR + MOVEM T,UPC(U) + HRLI T,-LUPDL + HRRI T,UPDL-1(U) + MOVEM T,USRPDL(U) + SETZM MSKST(U) + SETZM MSKST2(U) + MOVE T,[20,,40] + MOVEM T,40ADDR(U) + MOVEI T,APRCHN+440 + MOVEM T,APRC(U) + SETZM USTYN(U) + SETZM PIRQC(U) + SETZM IFPIR(U) + SETZM IDF1(U) + SETZM IDF2(U) + SETOM PICLR(U) + SETZM FLSINS(U) + SETZM UTRNTM(U) +IFN KL10P,[ + SETZM EBOXCT(U) + SETZM EBOXCT+1(U) + SETZM MBOXCT(U) + SETZM MBOXCT+1(U) +] + SETZM USIPRQ(U) + SETZM TRUNTM(U) + SETZM TSIPRQ(U) +IFE SWPWSP,[ + SETZM LTRNTM(U) + SETZM LSIPRQ(U) + SETZM UPGSEC(U) +];SWPWSP + SETZM IOTLSR(U) + MOVSI T,%OPOJB ;USR RESET DOESN'T CLEAR OJB OPTION BIT + ANDM T,OPTION(U) + SETOM CORRQ(U) + POPJ P, + +USTR4B: MOVEI T,USRRCE+NCT + JRST USTR4A + +IFN N11TYS,[ +;SET UP THE BLINKER FOR THE JOB IN U. +USTTV0: SKIPN TEN11F + SKIPL TT11P + POPJ P, + HRL T,TTYTYP(T) + TLNN T,%TY11T + POPJ P, ;NOT A TV + MOVE A,TT11HD ;11 HEADER ADR + ADDI A,-NF11TY(T) + LDB B,[141000,,1(A)] ;VIDEO BUFFER # + TRO B,17_8 ;CSET ALU FCTN + LSH B,4+16. ;INTO POSITION FOR MOVEMING INTO CONSOLE REG + MOVEM B,TVVBN(U) + JRST POPJ1 +] ;END IFN N11TYS + +; USER START CODE + +NUSTCD: JFCL ;0 + .OPEN 1,7 + .LOGOUT ;2 + .CALL 12 + .LOGOUT + .IOT 1,2 + JRST (2) + .UII,,(SIXBIT/SYS/) ;7 + SIXBIT /ATSIGN/ + SIXBIT /HACTRN/ + SETZ ;12 + SIXBIT /LOAD/ + 16 + SETZ 17 + -1 ;16 + 1 ;17 + +USTCDR: SYSCTX ;GOT HERE FROM ULEAVE WHICH SELECTED THE USER ACS, + MOVE U,USER ; SELECT SYSTEM ACS INSTEAD. + MOVEI A,USTCDR+1 ;COME BACK HERE IN CASE OF PCLSR + MOVEM A,UUOH + MOVE P,USRPDL(U) + PUSHJ P,UBLAM + MOVE U,USER + MOVSI T,NUSTCD + XCTR XBW,[BLT T,17] + MOVE T,JNAME(U) + UMOVEM T,11 + MOVE T,[%PCUSR,,1] + MOVEM T,UUOH + JRST URET + +SUBTTL USER KILL ROUTINES + +; +; CLOSE ALL DEVICES AND INFERIOR PROCEDURES OF A JOB (INDEX IN U) +; +IODCL: MOVNI I,1 ;SET TO STOP + PUSHJ P,IODCL3 ;STOP ALL INFERIOR JOBS (RECURSIVE) + MOVEI I,0 ;THEN KILL. +IODCLA: PUSH P,I + MOVE A,OPTION(U) + TLNE A,%OPLOK ;IF USER HAS ENABLED THE SWITCH-UNLOCK FEATURE, + PUSHJ P,IODCSW ;UNLOCK HIS LOCKED SWITCHES. +IFN 340P\E.SP, PUSHJ P,ADCLOSE ;FLUSH DISPLAY +IFN IMXP, PUSHJ P,POTCLS ;DISCONNECT HIS POTS +IFN VIDP,[ + CAMN U,SCNUSR + PUSHJ P,SCNSTP ;KILL SCANNER IF HIS +] +IFN ARMP, PUSHJ P,AARMOFF ;FLUSH ARM +IFN DEMON, PUSHJ P,DEMOUT ;FLUSH EXISTANCE (CURRENT OR FORMER) AS DAEMON. +IFN N11TYS,[ + SKIPE NVDBA(U) + PUSHJ P,VBDFLS ;DEASSIGN ALL VIDEO BUFFERS. +] +IFN KL10P,[ + CAMN U,MTRUSR ;DEASSIGN THE PERFORMANCE COUNTER + PUSHJ P,PRFOFF +];KL10P + PUSHJ P,CLQDEL ;RELEASE AND STOP CLOCK QUEUE BLOCK + UCLBLK(U) + HRRZ A,UREALT + CAMN A,U + SETOM UREALT ;UN REAL TIME + CAMN U,UMASTER ;UNMASTER + SETOM UMASTER + PUSHJ P,AIOPDL ;POP UP ALL OF IO PDL (CLOSING CHNLS POPPED INTO) + MOVEI R,IOCHNM(U) +IODCL1: PUSHJ P,CCLOSE ;CLOSE ALL CHANNELS + CAIGE R,IOCHNM+NIOCHN-1(U) + AOJA R,IODCL1 + PUSH P,U + SKIPGE T,JBI(U) ;IF THIS JOB IS A JOB-DEVICE, + JRST IODCL2 + HRROS JBCJUI(T) ;TELL THE JOB CHANNEL THAT THE HANDLER IS GONE. + CONO PI,CLKOFF + SKIPGE JBCG(T) ;IF OUR CREATOR STILL HAS A JOB CHANNEL, + JRST IODCL6 + MOVE A,JBCUI(T) ;FLUSH THE CREATOR'S JOB CHANNELS, + CONO PI,CLKON + PUSHJ P,RPCLSR ;STOPPING THE CREATOR IN CASE HE'S USING THEM NOW. + MOVE T,JBI(U) ;RPCLSR CLOBBERS T. + MOVSI C,%CLSJ + PUSHJ P,CHSCAA + PUSHJ P,[HRRZ B,(R) + TDNN C,CLSTB(B) + POPJ P, + HLRZ B,(R) + CAMN B,T + SETZM (R) + POPJ P,] + PUSHJ P,UPCLSR ;ALLOW THE CREATOR TO CONTINUE AND GET IOC ERROR OR RETRY OPEN +IODCL6: CONO PI,CLKON + SETOM JBCUI(T) ;FLUSH THE JOB-DEVICE SLOT. + SETOM JBI(U) ;SAY THIS JOB NO LONGER A JOB-DEVICE. + JRST IODCL2 + +IODCL3: PUSH P,I ;I=0 KILL I=-1 STOP I=1 JUST CLOSE CHANNELS. + PUSH P,U +IODCL2: MOVEI A,0 +IODCL4: HRRZ E,SUPPRO(A) + SKIPE UNAME(A) ;SKIP IF VARIABLES BLOCK IDLE + CAIE E,(U) ;SKIP ONLY IF IT IS A DIRECT INF. + JRST IODCL5 ;TRY NEXT SET OF VARS + PUSH P,A + MOVE U,A + PUSHJ P,1USTOP ;STOP (WITH BUSRC BIT) + MOVE R,P + MOVE P,USRPDL(U) + PUSH P,R + SKIPGE I,-2(R) + JRST IODCL8 ;STOP + PUSHJ P,IODCLA ;KILL OR CLOSE CHNLS, RECURSE +IODCL9: MOVE P,(P) + SKIPE -2(P) ;KILLING? + JRST IODCL7 ;JUST CLOSING CHNLS. + MOVE A,U ;KILLING; WAIT TILL NO OTHER JOB + PUSHJ P,AUCL3 ;IS LOOKING AT THE ONE THAT WE'RE KILLING. + PUSHJ P,UBLST2 ;FLUSH CORE + SETZ R, + PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES + CONO PI,CLKON +IODCL7: POP P,A + HRRZ U,(P) +IODCL5: ADDI A,LUBLK + CAMGE A,USRHI + JRST IODCL4 ;LOOP FOR ALL SETS OF USER VARIABLES + POP P,U + SUB P,[1,,1] + POPJ P, + +IODCL8: PUSHJ P,IODCL3 + JRST IODCL9 + +;SYSTEM CALL UNLOCK. 1 ARG, A JOB SPEC. +;THAT JOB'S LOCKS ARE ALL UNLOCKED. +NUNLOCK: + MOVE J,A + JSP T,NCORUI ;DECODE THE JOB SPEC. + JRST NUNLO1 ;WE'RE CERTAINLY ALLOWED TO WRITE THIS JOB. + JUMPE U,NUNLO1 ;SYSTEM JOB CAN DO IT TO ANYBODY + JSP T,NCORWR ;NOT SURE, SO CHECK. + JRST OPNL31 ;NO, NOT ALLOWED. +NUNLO1: +IFN PDP6P,[ + CAIN J,-1 + JRST OPNL34 +];PDP6P + ;THE CALL IS ALLOWED, SO UNLOCK THAT JOB'S LOCKS + CAMN J,USER + JRST NUNLO2 + MOVE A,J ; If not self, + PUSHJ P,RPCLSR ; assure a User mode PC + PUSHJ P,SOSSET + USTP(A) + JRST NUNLO3 + +NUNLO2: MOVE A,UUOH ; If we are asked to unlock + SUBI A,1 ; our own locks, put our PC in + MOVEM A,SRN3(U) ; SRN3 where IODCSW will look for it +NUNLO3: MOVE U,J + MOVE A,OPTION(U) + TLNE A,%OPLOK ; Provided it is using locks at all... + PUSHJ P,IODCSW + CAME U,USER + PUSHJ P,LSWPOP ; USTP + JRST LSWPJ1 ; DIELOK + ; Returns with U clobbered, which seems to be OK for .CALL's? + + +;CALL HERE TO UNLOCK THE SWITCHES A JOB HAS LOCKED (USER IDX IN U). +;LOCATION 43 (ACTUALLY, 3+C(40ADDR)) HAS THE LIST POINTER. 0 IS NIL. +;ANYTHING ELSE POINTS TO 2-WORD BLOCK; THE 1ST WORD IS THE SWITCH OR THE +;ADDRESS OF THE SWITCH. THE RH OF THE SECOND IS THE CDR OF THE LIST. +;THE LH OF THE SECOND IS THE UNLOCK INTRUCTION. THE INDEX FIELD IS IGNORED, +;ONE LEVEL OF INDIRECTION IS PERMITTED, AND THE INSN MUST BE EITHER +;AOS OR SOS WITH 0 IN AC FLD, A LOGICAL INSTRUCTION (TOP 3 BITS = 4), +;A HALFWORD INSTRUCTION, OR A MOVE,MOVN,MOVS,MOVN,ADD OR SUB SERIES INSN, +;OR 0 WHICH MEANS SETOM. ONLY INSNS THAT MODIFY MEMORY ARE USEFUL. +;44 IS AN AOBJN POINTER TO THE CRITICAL RTNS TABLE, OF 2-WORDS ENTRIES. +;THE 1ST WORD EACH IS ,,+1. +;THE SECOND IS THE UNLOCK INSTRUCTION, WITH THE ADDRESS OF THE SWITCH +;IN THE RH (AGAIN, 1 LEVEL OF INDIRECTION IS PERMITTED). +;IF THE PC IS IN THAT RANGE, THE UNLOCK INSN IS EXECUTED. +;43 AND 44 ARE UPDATED DURING PROCESSING TO PREVENT PCLSR LOSSAGE. +;SEE .INFO.;ITS LOCKS + + +;MACRO TO DO XCTR, OR POPJ IF THAT WOULD CAUSE INTERRUPT. +DEFINE XCTRIJ + JSP TT,IODCXC + XCTR!TERMIN + +; IODCSW: Unlock locks for user in U +; User should be stopped so that he is in user mode. +; The only exception is if we are unlocking the locks of the running job, +; in which case the contents of SRN3 will be used as our PC. +; Clobbers just about everything except U. +IODCSW: PUSH P,U + PUSHJ P,IODCS0 ; Do actual work, if any... + MOVE U,USER ; But be sure to always + PUSHJ P,MPLDZ ; restore normal page map of running user. + JRST POPUJ ; And U + +IODCS0: HRRZ J,U + MOVE U,USER ;SET UP MAP TO USER BEING HACKED (IDX IN J). + PUSHJ P,MPLDJ ;LH(J) CLOBBERED, RH SAVED. + HRRZ U,J ;U HAS WHAT IT HAD AT CALL (USR BEING HACKED). + MOVEI C,1000 ;COUNT LENGTH OF LIST SO CIRCULAR LISTS DON'T HANG US UP. + HRRZ E,40ADDR(U) + XCTRIJ XRW,[MOVES B,3(E)] ;GET HIS "43" (AND MAKE SURE IT'S WRITABLE) +IODCS1: JUMPE B,IODCS2 ;REACHED END OF LOCKED SWITCH LIST, MAYBE? + XCTRIJ XR,[HLL B,1(B)] ;MERGE LOCK INSN WITH ADDR OF SWITCH. + PUSHJ P,IODCDO ;EXECUTE THE UNLOCK INSN + POPJ P, ;IODCDO DETECTED MPV OR PUR INTERRUPT. + XCTR XR,[HRRZ B,1(B)] ;REPLACE LIST BY ITS CDR. + UMOVEM B,3(E) + SOJG C,IODCS1 + +IODCS2: XCTRIJ XRW,[MOVES E,4(E)] ;GET JOB'S "44", AND MAKE SURE IT'S WRITEABLE. + HRRZ C,UPC(U) ;GET ITS PC, FOR COMPARISON. + CAMN U,USER ; Except if this is us, + HRRZ C,SRN3(U) ; then unlock PC is in SRN3 + JUMPGE E,CPOPJ ;THERE ARE NO PROTECTED RANGES => DONE. +IODCS3: XCTRIJ XR,[MOVS B,(E)] ;GET BOUNDS OF NEXT PROTECTED RANGE. + CAIGE C,(B) ;IS PC ABOVE LOWER BOUND? + JRST IODCS4 + MOVSS B + CAIL C,(B) ;IS IT BELOW UPPER? + JRST IODCS4 + XCTRIJ XR,[MOVE B,1(E)] ;PC IS IN THIS RANGE; GET UNLOCK INSN + PUSHJ P,IODCDO ;EXECUTE IT + POPJ P, ;NO SKIP => MPV OR PUR INTERRUPT DETECTED. +IODCS4: ADD E,[2,,2] ;CHECK ALL ENTRIES IN CRITICAL RTN TABLE, 1 BY 1. + HRRZ B,40ADDR(U) ;UPDATE 44 SO ENTRIES ALREADY PROCESSED ARE + UMOVEM E,4(B) ;ACTUALLY IN THE TABLE. THIS IS IN CASE PCLSR. + JUMPL E,IODCS3 + POPJ P, + +;PRECEDE AN XCTR WITH JSP TT,IODCXC TO POPJ IF THE XCTR WOULD +;CAUSE AN INTERRUPT (MPV OR PUR). CLOBBERS A,T,Q. +IODCXC: MOVEI A,@(TT) ;GET EFFECTIVE ADDR OF XCTR. + MOVEI A,@(A) ;GET EFFECTIVE ADDR OF XCTR'ED INSN. + LSH A,-10. ;GET PAGE # BEING REFERENCED. + PUSHJ P,UPLC ;SET T = B.P. TO PAGE MAP HALFWORD. CLOBBERS Q. + LDB T,T + TRNE T,600000 ;IF PAGE IS SWAPPED IN, PUT ACCESS BITS IN + LSH T,-20 ;SAME PLACE THEY ARE WHEN SWAPPED OUT (LOW 2 BITS). +;FOLLOWING CODE COMMENTED OUT BECAUSE IT DOESN'T WORK ON THE KL10 XCTR +; TRNE T,2 ;CHANGE CODE 2 (READ-WRITE, NOT WRITTEN) TO 3 (READ-WRITE). +; IORI T,1 +; LSH T,27 ;PUT ACCESS CODE IN AC FIELD, AND TEST +; ANDCA T,(TT) ;AGAINST WHAT THE XCTR WILL TRY TO DO. +; TLNN T,(0 3,) ;ALL DESIRED ACCESS AVAILABLE => +; JRST (TT) ;WE WIN. +; POPJ P, ;ELSE QUIT OUT OF CALLING ROUTINE. +; +;FOLLOWING CODE INSERTED INSTEAD. THIS RELIES ON THE FACT +;THAT ONLY THE FOLLOWING INSTRUCTIONS ARE XCTRIJ'ED: +; BOOLE,HWT,MOVXX,ADDX,SUBX,AOSX,SOSX + MOVE A,@(TT) ;GET INSTRUCTION XCTR'ED + TLC A,300000 + TLCE A,300000 ;SKIP IF AOS OR SOS + TLNE A,002000 ;SKIP IF DOESN'T WRITE IN MEMORY + TRNE T,2 ;INSTRUCTION WRITES, SKIP IF RW OR RWF ACCESS NOT PRESENT + TRNN T,3 ;INSTRUCTION READS, SKIP IF ANY ACCESS PRESENT + POPJ P, ;INSUFFICIENT ACCESS, QUIT OUT OF CALLING ROUTINE + JRST (TT) ;WINNING, GO DO THE XCTR + +;PUSHJ P,IODCDO WITH INSN IN B TO XCTRIJ IT, CHECKING FOR LEGALITY +;AND PERFORMING ONE LEVEL OF INDIRECTION IF THE @ BIT IS SET. +;(WE CAN'T AFFORD AN INFINITE LOOP WHILE KILLING A JOB EVEN IF IT IS +;INTERRUPTABLE) +;INDEX FIELD IS IGNORED. IF THE OPCODE IS 0, SETOM IS USED INSTEAD. +;SKIPS IF INSN IS LEGAL AND DOESN'T CAUSE MPV OR PUR INTERRUPT. +;CLOBBERS A,D,J,T,TT,Q +IODCDO: MOVE J,B ;B IS NOT CLOBBERED. + TLZN J,(@) + JRST IODCD1 + XCTRIJ XR,[HRR J,(J)] ;INDIRECTION IS WANTED; DO IT. +IODCD1: TLNN J,-1 ;IF LH IS 0, REPLACE BY (SETOM) + HRLI J,(SETOM) + LDB A,[271500,,J] + CAIE A,AOS_-27 ;AOS AND SOS ARE LEGAL WITH 0 IN AC FIELD. + CAIN A,SOS_-27 + JRST IODCD2 + LDB A,[410300,,J] + CAIE A,4 ;ALL INSNS WITH 4 IN TOP 3 BITS (LOGICAL INSNS) ARE OK. + CAIN A,5 ;HALFWORD INSTRUCTIONS ALSO OK. + JRST IODCD3 + LDB A,[360600,,J] + CAIE A,MOVE_-36 ;ALL FORMS OF MOVE, MOVS, MOVN AND MOVM OK + CAIN A,MOVN_-36 + JRST IODCD3 + CAIE A,ADD_-36 ;ADD & SUB OK. (OF COURSE, ONLY TO-MEMORY INSNS MAKE SENSE) + POPJ P, +IODCD3: LDB A,[270400,,J] ;AC FIELD NEED NOT BE 0, SO GET CONTENTS OF SPEC'D AC, + UMOVE D,(A) + MOVEI A,D + DPB A,[270400,,J] ;AND MAKE THE INSN USE AC D, WHERE THE VALUE IS. +IODCD2: TLZ J,17 + XCTRIJ XRW,J ;EXECUTE INSN, CHECKING FOR INTERRUPTS. + AOS (P) + POPJ P, + +; FLUSH LAST VESTIGES OF USER +; ELIMINATES ALL POINTERS TO USER & FREES USER VARIABLES (CLOBBERS U TO "USER") +; R, IF NON-ZERO, IS ADDRESS OF CHANNEL NOT TO BE CLOSED UNTIL LAST MINUTE +; (IN CASE PCLSR OUT OF .UCLOSE) + +ZUSER: MOVEI A,(U) ;CLEAR BOTH TRANSLATION LISTS + HRLI A,300000 ;FOR THIS JOB. + PUSHJ P,NTRNC + JFCL + MOVEI A,0 ;AND GET RID OF EXISTING FOREIGN-USER CHANNELS. +ZUSER2: SKIPE UNAME(A) + PUSHJ P,ZUSES ;SEE IF THIS USER HAS ANY POINTERS TO BE FLUSHED + CAMN U,SERVER(A) ; If we were a server for this guy, + SETOM SERVER(A) ; clear it out. + ADDI A,LUBLK + CAMGE A,USRHI + JRST ZUSER2 ;LOOP FOR ALL SETS OF USER VARIABLES + SKIPE R + SETZM (R) + CONO PI,CLKOFF + SKIPE NMPGS(U) ;USER SHOULD HAVE NO MEMORY BY NOW + BUG + SETZM UNAME(U) ;ONLY PLACE THAT UNAME IS ZEROED + SETOM USTP(U) ;SET USTP TO SPEED SEARCH + MOVE A,U ;USER FLUSHED + MOVE U,USER + MOVSI T,SCLDEC + IORM T,SUPCOR ;CAUSE USER VARIABLE BLOCKS DECREASE PROGRAM TO RUN + POPJ P, ;RETURN WITH CLOCK OFF + + +;CALLED BY ADISOWN, NATTACH, NDETACH, ETC. +ZUSES: MOVEI D,%CLSU\%CLSFU\%CLSJI\%CLSJO ;CLSTB BITS FOR CHANNELS TO CLOSE +ZUSES1: PUSH P,B + PUSH P,R + PUSH P,C + MOVE C,R + SETZM B ;CLEAR STOPPED PROC FLAG + PUSHJ P,CHSCAA ;EXECUTE FOLLOWING INST FOR EACH CHANNEL AND I/O PDL SLOT + PUSHJ P,ZACHEK + POP P,C + POP P,R + SKIPE B ;SKIP UNLESSS YOU STOPPED THE PROC + PUSHJ P,UPCLSR ;RESTART USER + JRST POPBJ + +ZACHEK: HLRZ T,(R) ;CHECK FOR CHANNEL TO ZAP + CAME T,U + POPJ P, +ZACHK4: HRRZ T,(R) + HLRZ T,CLSTB(T) + TRNN T,(D) + POPJ P, ;IS IT EITHER TYPE OF USER CHANNEL? OR JOB CHNL? + TRON B,-1 ;SET FLAG + PUSHJ P,RPCLSR ;STOP USER + HRRZ T,(R) + HLRZ T,CLSTB(T) + TRNN T,%CLSFU ;IS IT A FOREIGN USR CHNL? + JRST ZACHK2 ;NO, SUPERIOR OR JOB CHNL. + JUMPG R,ZACHK1 ;IOPDL CHANNEL + MOVEI T,LUBLK ;SEE IF A HAS BEEN CLOBBERED + IDIVM A,T ;(AT LEAST MAKE SURE IT'S A VALID USER INDEX) + IMULI T,LUBLK + CAMN T,A + CAML A,USRHI + BUG + HRRZ T,R ;NORMAL CHANNEL, INTERRUPT ON IT. + SUBI T,IOCHNM(A) + MOVE T,CHNBIT(T) + AND T,MSKST2(A) + IORM T,IFPIR(A) +ZACHK2: CAIE C,(R) ;UNLESS THE ONE NOT TO BE CLOSED UNTIL LAST MINUTE, + SETZM (R) ;FOR ANY KIND OF CHANNEL, CLEAR IT OUT. + POPJ P, + +ZACHK1: MOVEI T,IIOPOP ;FOREIGN USR IN IOPDL SLOT: INTERRUPT WHEN IOPOPPED. + MOVEM T,(R) + POPJ P, + +ZUSLOG: PUSH P,[ZUSER] ;DO LOGUSE THEN ZUSER + +;LOG RUNTIME AND SWAPIN REQUESTS USED BY JOB IN U +;JOB CALLED FOR SHOULD NOT BE CURRENT OR ABLE TO RUN DURING CALL +;JOB SHOULD NOT BE TOP LEVEL EXCEPT WHEN DMNPLO CALLS +; HERE JUST BEFORE SENDING THE USAGE TO THE DEMON +;CLOBBERS T,TT,I + +LOGUSE: MOVN TT,UTRNTM(U) + MOVN T,USIPRQ(U) + EXCH TT,TRUNTM(U) ;AVOID CHARGING FOR THIS USAGE TWICE + EXCH T,TSIPRQ(U) + SUB TT,TRUNTM(U) ;COMPUTE TOTAL USAGE NOT YET CHARGED + SUB T,TSIPRQ(U) + SKIPGE I,SUPPRO(U) ;FIND HIGHEST JOB IN TREE + POPJ P, ;BUT IF TOP LEVEL RETURN WITH USAGE IN TT, T +;THIS IS TO FIND A BUG. -- CStacy, 4/30/82 + CAME I,U ;IS THIS JOB ITS OWN SUPERIOR? + JRST LOGUS1 + BUG PAUSE,[SOME JOB IS ITS OWN SUPERIOR, U AND I=],OCT,U +LOGUS1: SKIPL SUPPRO(I) + JRST [ MOVE I,SUPPRO(I) ? JRST .-1 ] + ADDM TT,TRUNTM(I) ;ADD CHARGES TO TREE'S ACCOUNT + ADDM T,TSIPRQ(I) + POPJ P, + +;DO LOGOUT FOR TREE HEADED BY JOB IN U +;CALLER SHOULD THEN PUSHJ P,DMNPLI TO LOG JOB BACK IN +;THIS IS USED TO KEEP ACCOUNTING STRAIGHT WHEN DETACH, CHUNAME, RELOAD (SIGH) +;IF JOB IS CURRENTLY RUNNING, TIME USED IN CURRENT QUANTUM +;WON'T GET CHARGED THIS TIME AROUND. TOO BAD. +;CLOBBERS T,TT,I,J,D. CALL WITH CLKOFF OR IN PROGRESS. + +LOGUPD: PUSH P,U + MOVE J,UTMPTR(U) + MOVEI U,LUBLK +LOGUP1: ADDI U,LUBLK + CAML U,USRHI + JRST LOGUP2 + CAMN J,UTMPTR(U) ;SKIP JOBS IN OTHER TREES (FOR SPEED) + SKIPGE SUPPRO(U) ;AND SKIP TOP LEVEL JOBS + JRST LOGUP1 + SKIPE UNAME(U) ;DON'T GET CONFUSED BY EMPTY SLOTS + PUSHJ P,LOGUSE ;PROBABLY AN INFERIOR IN TREE LOGGING OUT, UPDATE ACCT + JRST LOGUP1 + +LOGUP2: POP P,U + JRST DMNPLO ;TELL DEMON ABOUT TREE'S USAGE + +SUBTTL USER UUO WAIT (HANG UP) ROUTINE +; DOES NOT WORK FOR XCT T OR FOR X (T) +; THE INSTRUCTION BEFORE THE PUSHJ P,UFLS GETS EXECUTED WITH AN +; ARGUMENT PASSED IN T AND ITS USER INDEX IN U. I BELIEVE IT +; IS ONLY ALLOWED TO BASH T AND A. +; +UFLS: CONSZ PI,77400 + BUG HALT,[UFLS WITH PI IN PROGRESS] + CONO PI,CLKOFF ;DOES NOT ALLOW CLOCK INTS + XCT CLUSAV + SKIPGE U,USER ;GET INDEX OF USER BEING BLOCKED + JRST 4,. ;NULL JOB SHOULD NOT GET BLOCKED + MOVEM T,EPDL2(U) ;SAVE C(T) FOR FLSINS AT PCLSR + MOVEM T,AC16S(U) ;SAVE IN SWAP OUT AC ALSO + POP P,UPC(U) ;WORK FOR INST INDEX OF P + MOVEI T,AC0S(U) + BLT T,AC15S(U) ;STORE REST OF ACS + MOVE T,UPC(U) ;GET PC AT CALL (=CALL+1 ; =SKIP +2) + SKIPA T,-2(T) ;GET POINTER TO SKIP +UFL3: MOVE T,(T) ;GET CONTENTS OF E (WAS AN XCT) + MOVE U,AC17S(U) ;WIN FOR INSNS INDEX OF U. + HRRI T,@T ;CALCULATE E + TLZ T,37 ;CLEAR OUT @ AND INDEX BITS + MOVE U,USER + MOVEM T,FLSINS(U) ;STORE AS BLOCKING CONDITION + TLC T,(XCT) + TLNN T,777740 + JRST UFL3 ;JUMP IF INSTRUCTION WAS XCT + CONO PI,UTCON-1 ;TURN ON ALL PIS EXCEPT CLOCK + MOVSI T,%SWPGW+%SWINT + ANDCAM T,USWST(U) ;CLEAR WAITING FOR PAGE TYPE FLSINS + SKIPGE RPCL(U) ;SKIP IF NOT BEING RPCLSRED + JRST UFL1 ;LOSER IS BEING RPCLSRED +UFL6: MOVE U,AC17S(U) ;FOR CLUSAV TO STORE + SETOM UFLSF + CONO PI,CLKRQ ;CAUSE INTERRUPT TRANSFERING TO CLOCK ROUTINE PI IN + ; PROGRESS +IFE KA10P, JRST . ;ON KL AND KS SEEMS TO TAKE A WHILE TO GO OFF ("I + ; CAN WAIT FOREVER, YOU KNOW") +IFN KA10P, JRST 4,. ;ON KA SHOULD GO OFF RIGHT AWAY + +UFL1: MOVE P,CPDLP ;MUST NOT USE USR PDL SINCE THAT CAN + ;GET CLOBBERED BY LSWDIS VIA UFL5 + ;CLOCK IS OFF, SO CPDLP IS OK +IFN KA10P,[ + MOVE T,UEXIT ;PICK UP EXIT INSTR + CAME T,[JRST ONEPROC] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO + ; THAT HUNG + JRST UFL1A ;NOT ONE PROCEEDING + MOVSI T,%PC1PR ;GET ONE PROCEED BIT + IORM T,UUOH ;TURN IT ON IN PC +UFL1A:] ;KA10P +IFN KS10P,[ + MOVE T,UEXIT ;PICK UP EXIT INSTR + CAME T,[JRST ONEPR4] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO + ; THAT HUNG + JRST UFL1A ;NOT ONE PROCEEDING + MOVSI T,OIPBIT ;GET ONE PROCEED BIT + IORM T,UUOH ;TURN IT ON IN PC +UFL1A:] ;KS10P + SOS T,UUOH ;UUOH HAS REAL PC IF UFL5 SKIPS. WILL GET SET BY ONEPR1 + PUSHJ P,UFL5 ;BACK UP TO UUO + JRST UFL6 ;FINALIZATION REQUIRED + MOVE T,RPCL(U) + JRST ONEFL2 ;WIN + +SUBTTL VARIOUS WAIT & LOCK-SWITCH ROUTINES +; +;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH UTCCHN OFF +; +LWAIT1: CONO PI,UTCON ;TURN INTERRUPTS ON +LWAIT: PCLT + XCT @(P) ;ENTRY, EXECUTE INSTRUCTION + PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS + CONO PI,UTCOFF ;TURN INTERRUPTS OFF + XCT @(P) ;TRY AGAIN + JRST LWAIT1 ;LOSE + JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG +; +;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE -1 AND SEIZE IT +; +SWTL: PCLT + MOVEI T,(@) ;ENTRY + HRLM T,(P) ;MAKE PC STORED ON PDL INDIRECT + SKIPGE @(P) ;SKIP IF ALREADY LOCKED + JRST SWTL1 ;NOT LOCKED SO TRY TO GRAB IT + MOVEI T,@(P) ;ADDRESS OF SWITCH + HLRZ T,1(T) ;USER THAT HAS SWITCH + ANDI T,777 + IMULI T,LUBLK + CAMN T,USER ;SKIP IF THIS USER DOESN'T HAVE IT + BUG ;THIS USER ALREADY HAS THAT SWITCH +SWTL1: SKIPL @(P) ;(DO NOT CHANGE TO AOSE) + PUSHJ P,UFLS ;HANG TILL NEGATIVE + CONO PI,CLKOFF + AOSE @(P) + JRST SWTL1 +SWTL2: MOVEI T,@(P) +SWTL3: PUSH P,U + PUSH P,T + MOVE T,USER + IDIVI T,LUBLK + ADDI T,600000 + MOVE U,USER + HRL T,LSWPR(U) + POP P,U + MOVSM T,1(U) + MOVE T,USER + HRRZM U,LSWPR(T) + POP P,U + JRST CLKOJ1 +; +;IF LOCK ALREADY SEIZED, JUST SET UP POINTERS +SWTLZ: MOVEI T,(@) + HRLM T,(P) + JRST SWTL2 + +SWTAD: PCLT ;TRY TO LOCK SWITCH (@NEXT LOCN). IF SUCEED, SKIP EXTRA TIME. + MOVE T,@(P) ;IF FAIL, DO N LSWPOPS (AS SPEC IN 4.6-4.1 OF NEXT WORD) + SKIPGE (T) ;AND WAIT FOR SWITCH TO SEEM TO BE AVAILABLE. + JRST SWTAD1 ;THEN RETURN (NOTE: NOT LOCKING IT). +SWTAD2: TLNN T,77000 + JRST SWTAD3 + PUSH P,T + PUSHJ P,LSWPOP + POP P,T + SUB T,[1000,,] + JRST SWTAD2 + +SWTAD3: SKIPL (T) + PUSHJ P,UFLS + JRST POPJ1 + +SWTAD1: CONO PI,CLKOFF + AOSE (T) + JRST [ CONO PI,CLKON + JRST SWTAD2 ] + AOS (P) ;SKIP OVER FAILURE RETURN + JRST SWTL3 + +; +;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH CLKCHN OFF +CWAIT1: CONO PI,CLKON ;TURN CLOCK ON +CWAIT: PCLT + XCT @(P) ;ENTRY, EXECUTE INSTRUCTION + PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS + CONO PI,CLKOFF ;TURN CLOCK OFF + XCT @(P) ;TRY AGAIN + JRST CWAIT1 ;LOSE + JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG + +; +;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE NON-NEGATIVE AND SEIZE IT +LSWTL: PCLT + MOVEI T,(@) ;IF 4.9 OF NEXT LOCN =1, RETURN WITH UTCOFF + HRLM T,(P) + MOVSI T,400000 + PUSHJ P,LWAIT + SKIPGE @-1(P) + IORM T,@(P) + MOVE T,(P) + SKIPL (T) + CONO PI,UTCON + MOVEI T,@(P) +LSWTL2: PUSH P,TT + MOVEI TT,601000 + PUSHJ P,LSWSET + POP P,TT + JRST POPJ1 + +;SWITCH LIST LOCK, DOES NOT WORK FOR SWITCHES POINTED TO INDEX OF A, B, OR D +;FOLLOW BY LIST OF SWITCHES +;4.9-4.4=0 4.3-4.1 0 AOSE SWITCH 1 SIGN SWITCH +SLUGH: PCLT + PUSH P,A + PUSH P,B + PUSH P,D + MOVEI T,AC0S(U) + BLT T,AC0S+17(U) ;FOR SLWAIT FIRST TIME +SLUGH1: HRRZ T,-3(P) ;POINTER TO SWITCH LIST + PUSHJ P,SLWAIT + PUSHJ P,UFLS + HRRZ T,-3(P) +SLUGH2: MOVE A,(T) ;TRY TO LOCK LIST + TLNE A,770000 + JRST SLUWIN ;REACHED END OF LIST + LDB B,[220400,,A] ;INDEX + LDB D,[330300,,A] + SKIPE B + ADD A,(B) + HRRZS A + CAIL D,2 + BUG + XCT SLLOCK(D) + JRST SLULOS + AOBJP T,SLUGH2 ;LH COUNTS SWITCHES SUCCESSFULLY SEIZED + ;SHOULD NVERE FALL THROUGH +SLWAIT: MOVE A,(T) + TLNE A,770000 + JRST POPJ1 ;WIN + LDB B,[220400,,A] ;INDEX + LDB D,[330300,,A] ;TYPE CODE + JUMPE B,SLWT1 + ADD B,U + ADD A,AC0S(B) +SLWT1: CAIL D,2 + BUG + XCT SLWATT(D) + POPJ P, ;LOSE + AOJA T,SLWAIT ;THAT SWITCH OK, TRY OTHERS + +SLWATT: SKIPL (A) ;WAIT FOR NEG (AOSE SW) + SKIPGE (A) ;WAIT FOR POS (SIGN SW) + +SLUWIN: POP P,D + POP P,B + POP P,A + SUB P,[1,,1] ;"RETURN" BUT NOT INCREMENTED + JRST (T) + +SLLOCK: PUSHJ P,SWTLX + PUSHJ P,LSWTLX + +SLULOS: HLRZ A,T +SLULO2: JUMPE A,SLUGH1 ;NONE SEIZED TRY AGAIN + PUSHJ P,LSWPOP ;RELEASE THOSE SEIZED + SOJA A,SLULO2 + +SWTLX: CONO PI,CLKOFF ;DON'T GO OFF HALF-LOCKED + AOSE (A) + JRST CLKONJ + EXCH A,T + PUSHJ P,SWTL3 + BUG +SWTLX1: EXCH A,T + JRST POPJ1 + +LSWTLX: CONO PI,UTCOFF + SKIPGE (A) + JRST UTCONJ + MOVSI B,400000 + IORM B,(A) + CONO PI,UTCON + EXCH A,T + PUSH P,TT + MOVEI TT,601000 + PUSHJ P,LSWSET + POP P,TT + JRST SWTLX1 + +;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING SWITCH +STMSET: PUSH P,TT + MOVEI TT,606000 + JRST COMSET + +IFN 0,[ +;SET UP ROUTINE TO BE CALLED ON PCLSR'ING OUT +FINSET: MOVE T,@(P) + HRLI T,-1(P) + PUSH P,TT + MOVEI TT,402000 + PUSHJ P,LSWSET + POP P,TT + JRST POPJ1 +] + +;SET UP ROUTINE TO AOS VARIABLE UPON UNLOCKING SWITCH +AOSSET: PUSH P,TT + MOVEI TT,605000 + JRST COMSET + +;SET UP ROUTINE TO SOS VARIABLE UPON UNLOCKING SWITCH +SOSSET: PUSH P,TT + MOVEI TT,603000 + JRST COMSET + +;SET UP ROUTINE TO SOS LH UPON UNLOCKING SWITCH +;HALT IF SWITCH'S LH EVER BECOMES NEGATIVE +SOLSET: PUSH P,TT + MOVEI TT,607000 + JRST COMSET + +;SET UP ROUTINE TO BE CALLED UPON UNLOCKING SWITCH +;THAT ROUTINE MAY ONLY CLOBBER A AND T!! IT GETS CALLED +;WITH USER IN U, AND THE JOB'S ACS IN AC0S(U)-AC17S(U) +LOSSET: MOVE T,@(P) + HRLI T,-1(P) + PUSH P,TT + MOVEI TT,602000 + PUSHJ P,LSWSET + POP P,TT + JRST POPJ1 + +;SET UP ROUTINE TO CLEAR SIGN BIT OF VARIABLE UPON UNLOCKING SWITCH +SGNSET: PUSH P,TT + MOVEI TT,601000 + JRST COMSET + +;SET UP ROUTINE TO DO NOTHING UPON UNLOCKING SWITCH +NULSET: PUSH P,TT + MOVEI TT,0 + PUSHJ P,LSWSET + POP P,TT + POPJ P, + +;ROUTINE TO ADD THIS PROCEDURE TO A LIST POINTED TO +;BY THE WORD AFTER THE CALL. UNLOCKING REMOVES IT FROM THE LIST +LSTSET: PUSH P,TT ;LEAVES CLKON + MOVEI TT,604000 + PUSHJ P,LSTST3 + POP P,TT + JRST POPJ1 + +LSTST3: PUSH P,U + PUSH P,Q + MOVEI Q,LSWB0(U) +REPEAT NULBLK,[ +IFN .RPCNT,ADDI Q,2 + SKIPN 1(Q) + JRST LSTST2 +] + BUG ;NOT ENOUGH BLOCKS +LSTST2: MOVE T,@-4(P) ;ADDRESS OF HEAD OF LIST + CONO PI,CLKOFF + PUSH P,(T) ;PUSH HEAD OF LIST + POP P,(Q) ;POP INTO LSWB BLOCK + MOVEM Q,(T) + HRLM T,(Q) + MOVE T,(Q) + TRNE T,-1 + HRLM Q,(T) + CONO PI,CLKON + JRST LSWSE3 + +IFN 0,[ +;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING OF SWITCH +;BY OTHER THAN PCLSRING OUT +STMNPS: PUSH P,TT + MOVEI TT,206000 + JRST COMSET + +;SET UP ROUTINE TO BE CALLED UPON UNLOCKING OF SWITCH +;BY OTHER THAN PCLSRING OUT +LNPSET: PUSH P,TT + MOVEI TT,202000 + JRST COMSET +];END IFN 0 + +COMSET: EXCH TT,(P) + MOVE T,@-1(P) + MOVEI T,@T + EXCH TT,(P) + PUSHJ P,LSWSET + POP P,TT + JRST POPJ1 + +;SET USER LOCK SWITCH BLOCK, WD1 IN T, MODE IN TT +LSWSET: PUSH P,U + MOVE U,USER + PUSH P,Q + MOVEI Q,LSWB0(U) +REPEAT NULBLK,[IFN .RPCNT,ADDI Q,2 + SKIPN 1(Q) + JRST LSWSE2 +] + BUG ;NOT ENOUGH BLOCKS + +LSWSE2: MOVEM T,(Q) +LSWSE3: MOVE T,U + IDIVI T,LUBLK + MOVE U,USER + HRL T,LSWPR(U) + IOR T,TT ;GET TYPE + MOVSM T,1(Q) + HRRZM Q,LSWPR(U) + JRST POPQUJ + +LSWCJ1: AOS (P) ;EXIT TO DO LSWCLR AND SKIP-RETURN. + +;UNLOCK ALL SWITCHES, CALLED BY OPENL, ADISOWN, IOADCR +LSWCLR: PUSH P,T +LSWCL1: +;TEMPORARY CODE ADDED 1/22/80 TO SEE IF THERE ARE ANY MORE OF +;THIS CLASS OF BUGS + CAME U,USER + BUG +;END TEMPORARY CODE + SKIPN T,LSWPR(U) ;MUST HAVE USER IN U + JRST POPTJ + PUSHJ P,LSWPOP + JRST LSWCL1 + +LSWPJ1: AOS (P) +LSWPOP: PUSH P,U + MOVE U,USER + TLO U,400000 ;SIGNAL NOT PCLSR + SKIPN T,LSWPR(U) + BUG + PUSHJ P,LSWPPP + JRST POPUJ + +LSWPPP: PUSH P,A + PUSH P,T + MOVE A,1(T) + HRRZM A,LSWPR(U) + CAIL T,USRSTG + SETZM 1(T) + PUSHJ P,LSWDIS + POP P,T + POP P,A + POPJ P, + +LSWZAP: PUSH P,U ;FROM PCLSR + PUSH P,A +LSWZP1: PUSH P,T + MOVE A,1(T) + HRRZM A,LSWPR(U) + CAIL T,USRSTG + SETZM 1(T) + PUSHJ P,LSWDIS + POP P,T + HRR U,-1(P) + SKIPE T,LSWPR(U) + JRST LSWZP1 + POP P,A + SUB P,[1,,1] + TLZN U,200000 ;HAS PC BEEN CLOBBERED? ;THIS IS ONLY FOR FINSET R.I.P. + JRST PCLSR7 ;NO + SKIPLE PCLDBM + SETZM LSUUO(U) ;INDICATE OCCURRENCE OF FINSET (WILL MEAN WE HAVEN'T MISSED MARK) + JRST PCLSR4 ;REQUIRED TO START UP ROUTINE + +;-1(P) HAS POINTER TO SWITCH BLOCK TO UNDO. +;A HAS SECOND WORD OF THAT BLOCK. +; 4.9=1 => PERFORM FUNCTION ON PCLSR +; 4.8=1 => PERFORM FUNCTION ON ANY LSWPOP OTHER THAN PCLSR +; 4.1-4.3 => FUNCTION +; 3.1-3.9 USER # LAST LOCKED BY +; 1.1-2.9 LSWPR THREAD + +LSWDIS: LDB T,[330300,,A] ;FUNCTION + TLNE A,400000 ;SKIP IF NOT FOR PCLSR + JUMPGE U,LSWDS1 ;PCLSRED AND 4.9=1 + TLNN A,200000 ;NOT FOR PCLSR OR FOR PCLSR BUT NOT PCLSRED + POPJ P, ;NOT FOR EITHER LSWPOP + JUMPGE U,CPOPJ ;FOR OTHER LSWPOP BUT PCLSRED +LSWDS1: JRST LSWTAB(T) + +LSWTAB: JRST UNSWTL ;0 (AOSE) ALSO USED FOR QUSR + JRST UNLSWT ;1 (SIGN) + JRST ULROUT ;2 (GO TO ROUTINE) + JRST ULAOS ;3 (AOS, SOS) + JRST UNLST ;4 (UNLOCK FROM LIST) + JRST ULSOS ;5 (SOS, AOS) + JRST ULSTM ;6 (SETOM) + JRST ULAOSL ;7 (AOS,SOS LEFT HALF) + +UNSWTL: MOVE T,-1(P) + SETOM (T) + POPJ P, + +ULSTM: MOVE T,@-1(P) + SETOM (T) + POPJ P, + +UNLSWT: MOVE T,@-1(P) + MOVSI A,400000 + ANDCAM A,(T) + POPJ P, + +ULAOSL: MOVE T,@-1(P) + MOVSI A,-1 + ADDB A,(T) + JUMPGE A,CPOPJ + BUG ;OVER-SOS'ED + +ULAOS: MOVE T,@-1(P) + SOS (T) + POPJ P, + +UNLST: SETOM DLSRCH + MOVS T,@-1(P) + HLRM T,(T) + MOVSS T + TRNE T,-1 + HLLM T,(T) + SETZM DLSRCH + POPJ P, + +ULSOS: MOVE T,@-1(P) + AOS (T) + POPJ P, + +ULROUT: MOVE T,@-1(P) + TLNE A,200000 + JRST ULROU1 ;A LOSSET - MAY CLOBBER A OR T; USR INDEX IN U + HRRZM T,UPC(U) ;IT'S A FINSET, EXPECTS THE OLD METHOD OF CALL. + TLNE T,-1 + HLRM T,AC15S(U) +IFE KA10P,[ + MOVSI T,%PSPCU ;IT MIGHT TRY AN XCTR + HLLM T,UPC(U) +] ;IFE KA10P + TLOE U,200000 ;SIGNAL PC CLOBBERED + BUG ;PC TRIED TO BE CLOBBERED TWICE + POPJ P, + +ULROU1: JUMPGE U,(T) ;IF LOSSET, AND LSWPOPPING, + MOVE A,[B,,AC0S+B] + ADDI A,(U) ;PUT THE ACS IN THE AC0S, SINCE + BLT A,AC0S+H(U) ;THAT'S WHERE THEY'LL BE IF CALL LOSSET ROUTINE WHILE PCLSRING. + JRST (T) + +;FIND SWITCH POINTED TO BY WORD AFTER +;PUSHJ P,LSWREM AND UNLOCK IT +LSWREM: PUSH P,T + PUSH P,U + PUSH P,Q + MOVE U,USER + SKIPN U,LSWPR(U) + BUG + HRRZ Q,@-3(P) + MOVEI T,1 +LSWRM1: CAMN U,Q + JRST LSWRM2 + HRRZ U,1(U) + SKIPN U + BUG + AOJA T,LSWRM1 +LSWRM2: POP P,Q + POP P,U + PUSHJ P,LSWPON + AOS -1(P) + JRST POPTJ + +LSWDEL: PUSH P,U ;REMOVE SWITCH FROM HEAD OF LIST + MOVE U,USER ;DO NOT ATTEMPT TO UNLOCK IT + PUSH P,T + SKIPN T,LSWPR(U) + BUG + PUSHJ P,LSWDDD + JRST POPTUJ + +LSWDDD: PUSH P,Q + HRRZ Q,1(T) + HRRZM Q,LSWPR(U) + CAILE T,USRSTG + SETZM 1(T) + POP P,Q + POPJ P, + +;POP C(T)'TH FROB BACK +LSWPON: PUSHJ P,LSWBAK + PUSHJ P,LSWPPP + POPJ P, + +;DELETE C(T)'TH FROB BACK +LSWDLN: PUSHJ P,LSWBAK + PUSHJ P,LSWDDD + POPJ P, + +LSWBAK: PUSH P,U + MOVE U,USER + TLO U,400000 ;SIGNAL NOT PCLSR IN CASE OF LSWPPP + PUSH P,Q + MOVE Q,T + MOVEI T,LSWPR-1(U) + SOJE Q,LSWBA3 ;UNLOCKING FIRST FROB + MOVE T,1(T) + SOJG Q,.-1 +LSWBA2: MOVE Q,T + HRRZ T,1(T) + PUSH P,LSWPR(U) ;DON'T WORRY, YOU CAN'T GET PCLSR'ED JUST BELOW + XCT @-3(P) + HRRZ T,LSWPR(U) + HRRM T,1(Q) + POP P,LSWPR(U) + JRST POPQU1 + +LSWBA3: MOVE T,LSWPR(U) + XCT @-2(P) + JRST POPQU1 + +SUBTTL VARIOUS RETURNS + +PPBAJ1: POP P,B +POPAJ1: AOSA -1(P) +POPBAJ: POP P,B +POPAJ: POP P,A +CPOPJ: POPJ P, + +POPQJ: POP P,Q + POPJ P, + +POPBJ1: AOSA -1(P) +POPCBJ: POP P,C +POPBJ: POP P,B + POPJ P, + +POPJ3: AOS (P) +POPJ2: AOSA (P) +POPCJ1: POP P,C +POPJ1: AOSA (P) +POPCJ: POP P,C + POPJ P, + +POPJJ1: AOS -1(P) +POPJJ: POP P,J + POPJ P, + +POPUJ1: AOSA -1(P) +POPTUJ: POP P,T +POPUJ: POP P,U + POPJ P, + +POPTJ: POP P,T + POPJ P, + +POPTTJ: POP P,TT + POPJ P, + +POPWJ2: AOS -1(P) +POPWJ1: AOS -1(P) +POPWJ: POP P,W + POPJ P, + +PIONJ: CONO PI,PION + POPJ P, + +CKOCJ1: CONO PI,CLKON + JRST POPCJ1 + +CLKOJ1: AOS (P) +CLKONJ: CONO PI,CLKON + POPJ P, + +CKOPJ1: AOS (P) +CLKOPJ: CONO PI,CLKON + JRST LSWPOP + +IFN OMXP,[ +OMXONJ: CONO PI,OMXON + POPJ P, +] + +TTYOJ1: AOS (P) +TTYONJ: CONO PI,TTYON + POPJ P, + +IFN PTRP, PTRONJ:: PTPONJ:: +LPTONJ: CONO PI,LPTON + POPJ P, + +IFN NETP,NETOJ1: +UTCOJ1: AOSA (P) +UTCOAJ: POP P,A +IFN NETP,NETONJ: +UTCONJ: CONO PI,UTCON + POPJ P, + +POPQU1: AOS -2(P) +POPQUJ: POP P,Q + POP P,U + POPJ P, + +POP1J1: AOS -1(P) +POP1J: SUB P,[1,,1] + POPJ P, + +POP2J: SUB P,[2,,2] + POPJ P, + +POP3J1: AOS -3(P) +POP3J: SUB P,[3,,3] + POPJ P, + +POP4J: SUB P,[4,,4] + POPJ P, + +POP7J: SUB P,[2,,2] +POP5J: SUB P,[5,,5] + POPJ P, + +SUBTTL UUO PROCESSOR + +.IOT=UUOMIN +.OPEN=UUOMIN+1_27. +.OPER=UUOMIN+2_27. +.CALL=UUOMIN+3_27. +.USET=UUOMIN+4_27. +.BREAK=UUOMIN+5_27. +.STATUS=UUOMIN+6_27. +.ACCESS=UUOMIN+7_27. + +DEFINE GLOSYM X + IRP Y,,[X] + SQUOZE 4,.!Y + .!Y + TERMIN + TERMIN + +;REPEAT OVER USET NAMES FROM 0 TO 77. + DEFINE USTIRP A + IRPS X,,[UPC VAL TTY FLS UNAME JNAME MASK USTP +PIRQC INTB MEMT SV40 IPIRQ APIRQ SNAME PICLR +MARA MARPC UUOH UIND RUNT MSK2 IFPIR APRC +CNSL UTRP IIFPI AIFPI IMASK AMASK IMSK2 AMSK2 +JPC OPC RTMR HSNAME BCHN MPVA IDF1 ADF1 +IDF2 ADF2 DF1 DF2 OPTION 40ADDR TVCREG +TTST TTS1 TTS2 WHO1 WHO2 WHO3 SUPPRO TR1INS +TR2INS MBOX MBO1 EBOX EBO1 XUNAME XJNAME FTL1 FTL2] +A +TERMIN +TERMIN + +;REPEAT OVER USET NAMES 600 AND UP. + DEFINE USTIR1 A + IRPS X,,[PAGRAN PAGAHD SERVER] + A + TERMIN TERMIN + +;NOTE: OPER'S BELOW ARE 8 PER LINE +; USE UP ILUUO'S BEFORE ADDING TO END +; THE FOLLOWING SHOULD GO AWAY EVENTUALLY +; ITYI (=ITYIC) +; SETMSK (=SUSET) +; WSNAME (=SUSET) +; UPISET (=SUSET) +; RDSW (=DATAI) +; EOFC (OBSOLETE) +DEFINE OPRIRP A + IRPS X,,[ITYI LISTEN SLEEP SETMSK SETM2 DEMON CLOSE +UCLOSE ATTY DTTY IOPUSH IOPOP DCLOSE DSTOP RDTIME +RDSW GUN UDISMT GETSYS IPDP GETLOC SETLOC DISOWN +DWORD DSTEP GENSYM LOGOUT REALT WSNAME UPISET RESET +ARMOVE DCONTIN CBLK ASSIGN DESIGN RTIME RDATE HANG +EOFC IOTLSR RSYSI SUPSET PDTIME ARMRS UBLAT IOPDL +ITYIC MASTER VSTST NETAC NETS REVIVE DIETIM SHUTDN +ARMOFF NDIS FEED EVAL REDEF IFSET UTNAM UINIT +RYEAR RLPDTM RDATIM RCHST RBTC DMPCH SWAP MTAPE +GENNUM NETINT] + A +TERMIN +TERMIN + +DEFINE CALIRP A +IRPS X,,[DISMIS LOSE TRANAD VALUE UTRAN CORE TRAND +DSTART FDELE DSTRTL SUSET LTPEN VSCAN POTSET] +A TERMIN TERMIN + +;THESE ARE THE SYMBOLS USED BY MIDAS AND DDT. THEY ALSO +;EXIST IN SYS:ITS DEFS. +;SYMBOLS SHOULD BE LEFT IN CURRENT ORDER OR DDT WILL LOSE +SYSYMB: USTIRP [SQUOZE 44,.R!X + .IRPCNT] + SQUOZE 44,.RIOC + 100 + SQUOZE 44,.RIOS + 120 + SQUOZE 44,.RIOP + 140 + SQUOZE 44,.RPMAP + 200 + USTIR1 [SQUOZE 44,.R!X + 600+.IRPCNT] + USTIRP [SQUOZE 44,.S!X + 400000+.IRPCNT] + USTIR1 [SQUOZE 44,.S!X + 400600+.IRPCNT] + + GLOSYM [IOT,OPEN,OPER] + +DEFINE DEFSYM X/ +IRPS Z,,[X] +SQUOZE 44,Z +Z +.ISTOP +TERMIN TERMIN + +.INSRT BITS > + +EXPUNG DEFSYM + + ZZ=1 + OPRIRP [IFSN X,ILUUO,[.!X=.OPER ZZ + SQUOZE 4,.!X + .!X] + ZZ==ZZ+1] + +MXOPR==ZZ + + SQUOZE 4,.CALL + .CALL + +CALIRP [ +IFSN X,UNUSD,[ + .!X=.CALL .IRPCNT+1, + SQUOZE 4,.!X + .!X +]] + + GLOSYM [USET,BREAK,STATUS,ACCESS] +SYSYME==.-1 + +;THESE SYMBOLS ARE USED BY DDT, SO THE USER CAN OPEN .PIRQC, ETC. + ;BEGINNING FOR .GETSYS (USYMS) +SYSUSB: +USTIRP [ + SQUOZE 4,.!X + .IRPCNT +] + SQUOZE 4,.IOC + 100 + SQUOZE 4,.IOS + 120 + SQUOZE 4,.IOP + 140 + SQUOZE 4,.PMAP + 200 +USTIR1 [ + SQUOZE 4,.!X + 600+.IRPCNT +] +SYSUSE==.-1 ;END FOR .GETSYS (USYMS) + +;SIXBIT NAME TABLES FOR WHO LINE GENERATION. +;ALSO USED BY PEEK FOR PRINTING OUT JOBS' STATUS. + +OPRSXB: SIXBIT/OPER/ +OPRIRP [ +.1STWD SIXBIT/X/ +] + +CALSXB: SIXBIT/CALL/ +CALIRP [ +.1STWD SIXBIT/X/ +] + SIXBIT/UNUSD/ + +UUOSXB: +IRPS X,,IOT OPEN OPER CALL USET BREAK STATUS ACCESS +.1STWD SIXBIT/X/ +TERMIN +NUUOSX==.-UUOSXB + +;MACRO TO SAVE ACS AS APPROPRIATE FOR OUR CPU, LOAD UP U, +;CHECK VARIOUS ERROR CONDITIONS. + +DEFINE UUOSAV + CONSZ PI,77400 + BUG AWFUL,[UUO WITH PI IN PROGRESS] +IFN KA10P,[ + UMOVEM U,17 ;SAVE 17 + SKIPGE U,USER ;LOAD CURRENT USERS INDEX, + BUG AWFUL,[UUO IN NULL JOB] + UMOVEM T,16 ;SAVE LOC 16 FOR USER + MOVEI T,0 ;HA HA + XCTR XBW,[BLT T,15] ;SAVE REST OF ACS IN USERS SHADOW 0-15 +] ;KA10P +IFE KA10P,[ + SYSCTX + SKIPGE U,USER + BUG AWFUL,[UUO IN NULL JOB] + LDB T,[330300,,MUUOCX(U)] + CAIE T,1 + BUG AWFUL,[UUO WHILE IN AC BLK ],DEC,T +] ;IFE KA10P +TERMIN + +; UUO AND ILLOP TRAP HANDLER +; +;EITHER DISPATCHES TO APPROPRIATE UUO ROUTINE, +; RETURNS CONTROL TO USERS UUO ROUTINE, GOES TO ILLOP, USRTRP, OR USRIOT. +;CODE ON THIS PAGE IS INTERRUPTABLE AT ANY POINT + +;COME HERE TO RETURN A UUO TO THE USER. RESTORES USER ACS W THROUGH U ONLY. +USRUUO: CAIG U,LUBLK + BUG AWFUL,[RETURNABLE UUO FROM SYS OR CORE JOB,PC=],OCT,UUOH + MOVE W,UUOH + TLNN W,%PCUSR + BUG AWFUL,[RETURNABLE UUO FROM EXEC MODE,PC=],OCT,UUOH + HRRZ W,40ADDR(U) + MOVE P,USRPDL(U) ;IN CASE AN XCTR FAULTS. + XCTR XR,[HLRZ H,1(W)] + CAIE H,(JSR) ;ELSE OK ONLY IF OPCODE IN 41 IS 0 OR JSR. + JUMPN H,ILUUO ;THIS IS IN CASE USER IS HANDLING USER-UUO'S WITH PUSHJ + ;AND HIS UUOH ISN'T ABLE TO BE JSR'D TO. + XCTR XR,[HRRZ H,1(W)] + JUMPE H,ILUUO ;0 ISN'T ACCEPTABLE AS UUOH ADDRESS. + MOVE T,FORTY + UMOVEM T,(W) ;ALL IS LEGAL; PLANT UUO INTO USERS "40". + MOVE T,UUOH ;SIMULATE A JSR AT USER'S "41" + UMOVEM T,(H) + AOS H + HRRM H,UUOH ;SET TO RETURN TO USER AT FIRST INSTRUCTION OF UUO HANDLER +IFN KA10P,[ + MOVE U,[W,,W] + XCTR XBR,[BLT U,U] +] ;KA10P +ULEAVE: USRCTX ;SELECT USER MODE AC BLOCK IF NEC. + +EBLK + +;THE FOLLOWING BLOCK OF LOCATIONS IS SWITCHED WITH SOME USER VARS + +UEXIT: JRST 2,@XUUOH ;EXIT FROM UUO (FOR KL-10, POINTS TO APPROPRIATE + ;UPT LOC) + +CLUSAV: MOVEM U,AC17S ;CLOCK SAVE OF U + +IFE KA10P,[ +CLCXSV: DATAI PAG,CLCX ;CLOCK LEVEL CONTEXT SAVE +] ;IFE KA10P + +IFN KA10P,[ +XUUOH: 0 ;UUO AND ILLOP TRAP GETS HERE - UUOH0 MUST BE . + 1. +] ;KA10P + +UEXND:: ;END OF SWAPPED UEXIT BLOCK. + +BBLK + +UUOH0: UUOSAV +MUUOT1: SKIPGE UTRAPM(U) ;IF SUPERIOR WANTS TO CATCH UUOS, THIS IS FATAL INT. + JRST USRTRP + SKIPGE T,FORTY ;PICK UP THE UUO OR ILLOP + JRST USRIOT + CAML T,[UUOMIN] + CAML T,[UUOMAX] + JRST USRUUO ;NOT A SYSTEM CALL, GIVE TO USER +;DROPS THROUGH + ;DROPS IN +;HERE WITH UUO TO BE HANDLED BY SYSTEM IN T +ILLOP1: JUMPN U,UUOH1 + MOVEI Q,0 ;SAVE SYS JOB EXEC MODE LSWPR PNTR + EXCH Q,LSWPR + MOVEM Q,SLSWPR +UUOH1: SKIPE LSWPR(U) + JRST 4,. + MOVEM T,LSUUO(U) ;SAVE UUO FOR DEBUGGING PURPOSES + LSH T,-27. ;RIGHT JUSTIFY OP CODE + SKIPL UUODSP-UUOMIN_-27.(T) + JRST UUOTR3 + MOVE H,OPTION(U) + TLNE H,%OPDEC + JRST USRUUO +UUOTR3: SETZM SYSCVL(U) ;DIDN'T GET INTO SYSTEM VIA .CALL + MOVE P,USRPDL(U) ;SET UP USER PDL + HRRZ C,FORTY ;PICK UP EFFECTIVE ADDRESS OF UUO + LDB R,[270400,,FORTY] ;PICK UP AC FIELD OF UUO + MOVEM R,UUAC(U) ;SAVE AC FLD + PUSHJ P,@UUODSP-UUOMIN_-27.(T) ;DISPATCH ON UUO TYPE + JRST URET ;NORMAL RETURN (NON SKIP) +URETJ1: +IFE KA10P, MOVE U,USER ;(SINCE UUOH IS IN THE USER VARIABLES) + AOS UUOH ;UUO ROUTINE SKIPPED, AOS USER RETURN POINT +URET: MOVE U,USER + MOVE A,PIRQC(U) ;CHECK FOR RETURNING TO USER WITH PCLSR'ING FATAL + ; INT SET. + TDNE A,[BADBTS&#<%PIC.Z\%PIDIS>] ;A FEW BITS ARE FATAL BUT SET + ; ASYNCHRONOUSLY. + JRST [ HRRZ A,UEXIT ;INT SET, MAKE SURE UEXIT IS CLOBBERED + IFN KA10P, CAIE A,ONEPRO ;TO A LOCATION WHICH WILL CHECK PIRQC. + IFN KS10P, CAIE A,ONEPR4 + CAIE A,ONEFLS + BUG + JRST .+1] + SKIPE UMAPS(U) + PUSHJ P,MPLDZ + CAMN U,PCLUSR + SKIPG PCLDBM + JRST URET2 + SKIPL PCLNXT + JRST URPCL1 +URET2: SKIPE LSWPR(U) + BUG + JUMPN U,URETC + MOVEI T,0 ;RESTORE SYS JOB EXEC LSWPR + EXCH T,SLSWPR + MOVEM T,LSWPR +URET1: CONSO PI,1 + BUG ;RETURNING TO USER MODE WITH CLOCK OFF +IFN KA10P,[ + MOVEI U,0 + XCTR XBR,[BLT U,U] ;RESTORE USERS ACS FROM USERS SHADOW 0-17 +] ;KA10P + JRST ULEAVE + +URETC: REPEAT NULBLK/2,[ + SKIPN CONC LSWB,\<2*.RPCNT>,+1(U) + SKIPE CONC LSWB,\<2*.RPCNT+1>,+1(U) + BUG +] + REPEAT NULBLK&1,[ + SKIPE CONC LSWB,\,+1(U) + BUG +] + JRST URET1 + +URPCL1: SKIPN LSUUO(U) + JRST URET2 ;DIDN'T REALLY MISS MARK (DUE TO FINSET) + SETOM PCLNXT ;MISSED MARK, REINITIALIZE + SETZM PCLL + SETZM PCLHSH + JRST URET2 + +UUOTRO: MOVE T,FORTY + JRST UUOH1 + +USRIOT: MOVSI T,(UIOT) ;I/O INST TURNS INTO PSEUDO UUO TO DISPATCH ON + JRST ILLOP1 + +IFE KA10P,[ + +;HANDLE UUOS EXECUTED FOR TRAPS (PDL OV, ARITH OV, ONE PROCEED). +;MOST ARE AS USUAL, BUT OPCODE 0 IORM'S ADDRESS INTO PIRQC. +;NOTE: LOSER IS NOT PERMITTED TO USE OPCODE 0 - SEE USTR1I, ETC. + +MUUOTR: UUOSAV + MOVE T,FORTY + TLNE T,-1 + JRST MUUOT1 ;IF OPCODE ISN'T 0, TREAT UUO NORMALLY (STARTING A + ; ONE PROCEED) + MOVSI A,%PSTR1+%PSTR2 + ANDCAB A,UUOH ;TURN OFF TRAP FLAGS, GET PC + TRNN T,%PIARO + JRST MUUOT2 + TLNE A,%PCFOV ;DISTINGUISH FIXED AND FLOATING OVERFLOW. + TLO T,(%PIFOV) +MUUOT2: MOVE A,MSKST(U) + IOR A,[BADBTS] + AND T,A ;INTS SETTING WHICH AREN'T DISABLED + IORM T,PIRQC(U) + SKIPN PICLR(U) + TDZA A,A + SETCM A,IDF1(U) + IOR A,[BADBTS] ;MASK FOR INTS WHICH AREN'T DEFERRED + TDNE T,A + JRST ONEPR1 ;TAKE INT + JRST URET ;IGNORE INT + +MUUOEX: BUG AWFUL,[MUUO IN EXEC MODE, PC=],OCT,EPT+425 + ;UUO IN EXEC MODE NOT IN SYS JOB + +LUUOEX: 0 + BUG AWFUL,[LUUO IN EXEC MODE,PC=],OCT,LUUOEX + +ILLTRP: 0 + BUG AWFUL,[TRAP IN EXEC MODE,PC=],OCT,ILLTRP +] ;IFE KA10P + +IFN KA10P,[ +EBLK +60H: 0 ;TRAPS FROM 60 +BBLK +60H0: UUOSAV ;IF WE LOSE PROCESSOR HERE, 60 GETS COPIED INTO 40, + ; 60H IS COPIED INTO UUOH, AND UPC GETS MOVED INTO + ; UUOH0. +60HE: CONO PI,CLKOFF + MOVE T,60H + MOVEM T,UUOH + MOVE T,60 + MOVEM T,FORTY + CONO PI,CLKON + JRST MUUOT1 +] ;KA10P + +;COME HERE FROM UEXIT WHEN USER IS BEING PCLSR'ED +; KA10 - ALL USER ACS ARE IN MACHINE ACS AND IN UUOACS +; KL10 & KS10 - ALL USERS ACS ARE IN AC BLOCK 1 + +ONEFLS: CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS + SYSCTX + MOVE U,USER ;GET INDEX OF CURRENT USER +ONEPR2: SKIPE T,RPCL(U) ;SKIP IF NO RPCLSRING OCCURING + JRST ONEFL2 ;RPCLSRING GOING ON +ONEPR1: MOVE U,USER ;GET INDEX OF CURRENT USER + CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS + SKIPE LSWPR(U) + JRST 4,. + MOVEI T,AC0S(U) ;PUT USER ACS INTO SWAP OUT ACS + XCTR XBR,[BLT T,AC17S(U)] + MOVE T,UUOH + MOVEM T,UPC(U) ;SIMULATE JRST 2,@UUOH +IFN KA10P, MOVE T,[JRST 2,@UUOH] +IFE KA10P,[ + MOVSI T,(JRST 2,@) + HRRI T,UUOH +] ;IFE KA10P + MOVEM T,UEXIT ;RESTORE UEXIT + USRCTX + MOVE U,USER ;AS IF HAD RETURNED TO USER THEN CLKBRK + ;EXCEPT THAT AC'S ARE ALREADY STORED IN AC0S + JRST UFL6 ;RESCHEDULE, ETC + +ONEFL2: JUMPG T,[JRST 4,.] ;LOSEY LOSEY (SHOULD NOT TRY TO EXIT WHILE TRYING TO RPCLSR SOMEONE) + MOVE A,FLSINS(T) ;GET FLSINS OF USER SUPPOSEDLY RPCLSRING YOU + SUBI A,RPCL(T) ;HIS FLSINS SHOULD BE A SKIPE OF HIS RPCL + CAME A,[SKIPE] ;SKIP IF HE HAS THE RIGHT FLSINS + JRST 4,. ;LOSEY LOSEY + CLEARM FLSINS(T) ;ASSURE NO INTERRUPT + SETZM RPCL(U) ;ACS IN UUO ACS CLOCK OFF + AOS USTP(U) ;STOP SELF + SETZM RPCL(T) ;UNHANG LOSER RPCLSR'ING YOU + JRST ONEPR1 + +;ROUTINES TO GIVE THE RUNNING JOB AN INTERRUPT AND ABORT THE CURRENT INSTRUCTION + +TTYLOS: SKIPA T,[%PITTY] ;JOB WHOSE %TBINT IS SET TRIED TO USE ITS TTY WHEN DIDN'T OWN IT +IOADC: MOVEI T,%PIMPV ;I/O UUO MEMORY PROTECT VIOLATION + JRST UUOERR + +ABREAK: MOVEI T,%PIBRK ;.BREAK - INTERRUPT TO SUPERIOR +ILLOP4: IORM T,PIRQC(U) + JRST ONEPR1 + + RADIX 10. +IOCERF: ;ADDRESS OF FIRST IO CHANNEL ERROR +ZZ==NIOTER +IFG ZZ-9,ZZ==9 +REPEAT ZZ,CONC IOCER,\.RPCNT+MIOTER,: JSP T,IOCERX +IFG NIOTER-9,[REPEAT NIOTER-9,CONC IOCR,\.RPCNT+MIOTER+9,: JSP T,IOCERX +] +IFN 0, IOCER1: IOCER2: IOCER3: IOCER4: IOCER5: IOCER6: IOCER7: ;FOR @ +.ALSO IOCER8: IOCER9: IOCR10: IOCR11: IOCR12: IOCR13: IOCR14: + + RADIX 8 +IOCERX: CONSZ PI,77400 + JRST 4,. ;ERR WITH PI IN PROGRESS + SUBI T,IOCER9-9+1 + MOVE U,USER + HRRZ TT,UUAC(U) + DPB TT,[BCHPTR] ;STORE LAST CHNL IN ERROR + ADD TT,U + DPB T,[330600,,IOCHST(TT)] +IOCERR: MOVEI T,%PIIOC + JRST UUOERR + +AILUUO:: +ILUUO: SKIPA T,[%PIILO] ;ILLEGAL SYSTEM UUO +TRPDEV: ;ATTEMPTED USE OF TRAP DEVICE +USRTRP: MOVSI T,(%PITRP) ;SYSTEM UUO IN TRAP MODE + +UUOERR: MOVE U,USER + IORM T,PIRQC(U) ;GIVE USER INT BIT +IOADCR: MOVE U,USER + MOVE T,OPTION(U);PC CLOBBERED TO HERE IF MPV IN EXEC MODE - INTR OUT OF UUO + TLNN T,%OPOPC ;UNLESS USER HAS SAID NOT TO, + AOS UUOH ;UNDO SOS THAT PCLSR'ING WILL DO; PC SHOULD END UP -> AFTER UUO. +UUOER2: CONO PI,CLKON ;THERE HAD BETTER BE A CLASS 1 OR 2 INT. PENDING. + MOVE P,USRPDL(U) + SETZM SCHMNY ;CAUSE FULL SCHEDULE SO INTERRUPT WILL BE SEEN + JFCL ; (IT'S A CROCK TO HAVE TO DO THIS, BUT HARD TO FIX) + PUSHJ P,UFLS ;LET THE INTERRUPT PCLSR US. + JRST 4,. + +UUOER1: MOVE U,USER ;UUOERR ASSUMING %OPOPC + IORM T,PIRQC(U) + JRST UUOER2 + +IFN KA10P,[ +ILEXPF: CONO PI,CLKOFF ;GET HERE AFTER EXEC PAGE FAULT TAKEN ON XCTRI + SPM UPGML(U) + MOVSI A,1770 ;CLEAR FAULT REASON BITS + ANDCAM A,UPQUAN(U) + LPMR UPGML(U) + JRST ILUUO +] ;KA10P +IFE KA10P, ILEXPF==ILUUO ;NO CLEANUP NECESSARY + +;UUO DISPATCH + +;AT DISPATCH TIME, P HAS UPDL, C HAS RH OF 40 +;R HAS AC FIELD OF UUO, U HAS USER INDEX + +UUODSP: SETZ AIOT ;SETZ FLAGS UUO'S TO REFLECT TO USER WHEN %OPDEC OPTIONS + SETZ AOPEN ;IN EFFECT. THEY ARE THE UUOS WHICH OVERLAP DEC + AOPER + ACALL + AUSET + ABREAK + ASTATUS + SETZ AACCESS + SETZ AUIOT +IF2,IFN _-27.+UUODSP-.+1,.ERR LOSE AT UUODSP + +;.CALL IOT +NIOT: CAIL W,3 ;SET IOTBTS TO USER'S 3RD ARG, OR TO 0. + SETZ C, + MOVEM C,IOTBTS(U) + HRRZ C,B ;ADDRESS OF 2ND ARG + SKIPGE SYSCVL(U) + SKIPA C,[SETZ] ;USING OUTPUT ARG INSTEAD OF INPUT, FOR UNIT INPUT MODE + CAIL W,2 + AOSA (P) ;GOING TO SUCCEED NOW + JRST OPNL30 ;NOT ENOUGH ARGS + JRST AIOT1 + +;.IOT +AIOT: SETZM CTLBTS(U) + SETZM IOTBTS(U) + ADDI R,IOCHNM(U) ;GET IOCHNM WD ADDR IN R. +AIOT1: MOVE A,U + IDIVI A,LUBLK + SKIPE B + BUG + HLRZ A,(R) ;PICK UP LEFT HALF (DEVICE DEPENDENT) + HRRZ B,(R) ;PICK UP RIGHT HALF (INDEX INTO IOTTB, ETC.) + MOVE D,IOTTB(B) ;GO TO ROUTINE FOR PARTICULAR DEV AND MODE + TLNE D,%IOTOT+%IOTBK+%IOTSP ;BUT FOR "NORMAL" UNIT MODE INPUT, SPECIAL: + JRST (D) + XCTR XRW,[MOVES (C)] ;MAKE SURE XCTR XW, BELOW WON'T PCLSR. + PUSH P,C + PUSHJ P,(D) ;CALL IOT ROUTINE, EXPECTING VALUE IN W. +AIOT3: JRST AIOT2 ;NOTE AIOT3 MAY BE CHECKED FOR ON PDL. + JRST AIOT2 + +AIOT2: POP P,C + SKIPGE C + SKIPA A,W ;RETURNING IN NEW SYSTEM-CALL STYLE + UMOVEM W,(C) + POPJ P, + +;RANDOM ACCESS + +AACCES: HRRZ A,UUAC(U) + UMOVE B,(C) + MOVE T,['ACCESS] + MOVEM T,LSCALL(U) ;IN CASE PASSED TO JOB DEVICE + MOVEI W,2 + PUSHJ P,NACCES + JRST IOCER8 ;FOR .ACCESS, SIGNAL FAILURE WITH IOC ERROR. + POPJ P, ;ONLY POSSIBLE FAILURE IS CHANNEL NOT OPEN. + +NACCES: MOVEI T,AIOCAL ;GET ,, IN R + MOVSI J,NACCE1 + JRST CHNDCD + +NACCE1: TLNN R,%CLSQ\%CLSU\%CLSFU + JRST OPNL34 + HRRM B,IOCHST-IOCHNM(R) ;STORE USR .ACCESS POINTER + TLNN R,%CLSQ + JRST POPJ1 ;NOT DISK + HLRZ I,(R) + MOVEM B,QRADAD(I) ;STORE ACCESS POINTER FOR DSK + MOVSI D,%QAACC + IORM D,QSRAC(I) ;SET ADR HAS BEEN HACKED FLAG + JRST POPJ1 + +;SIOT SYMBOLIC SYSTEM CALL - IOT A STRING. +; 1ST ARG CHANNEL NUMBER. +; 2ND ARG BYTE POINTER +; 3RD ARG STRING LENGTH +; 4TH (OPTIONAL) ARG DEVICE-INDEPENDENT CONTROL BITS +; CTLBTS DEVICE DEPENDENT CONTROL BITS + +NSIOT: TLNN B,1000 ;OBJECT IF B.P. OR COUNT IS IMMEDIATE. + TLNE C,1000 + JRST OPNL33 + CAIGE W,4 + SETZ D, + MOVEM D,IOTBTS(U) + MOVE D,IOTTB(H) + TLNE D,%IOTBK+%IOTSP ;SIOT ALLOWED ONLY ON UNIT MODE CHANNELS. + JRST OPNL12 ;"MODE NOT AVAILABLE". + XCTR XRW,[MOVES A,(B)] ;ENSURE BYTE POINTER WRITABLE + TLNE A,(@) ;CAN'T HACK BYTE POINTER WITH INDIRECT ADDRESSING + JRST OPNL33 ;MEANINGLESS ARGS + TLNE A,17 + PUSHJ P,NSIOT9 ;HACK INDEXING + XCTR XRW,[MOVES A,(C)] ;ENSURE BYTE COUNT WRITABLE + JUMPLE A,POPAJ1 ;0 BYTES TO BE XFERED => SUCCEED IMMEDIATELY. + HLRZ A,(R) + MOVE TT,B ;IN CASE SPECIAL ROUTINE WANTS TO CALL SIOKT + TLNE D,%IOTBP ;IF THERE'S A SPECIAL DEVICE ROUTINE FOR SIOT, + JRST -1(D) ;GO TO IT. +;THIS CALL IS LEGAL AND ORDINARY. LOOP, CALLING THE UNIT MODE ROUTINE. +NSIOT1: PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,D ;PUT ALL IMPORTANT INFO ON STACK FOR MAIN LOOP + HRRZS (P) ;TO LOOK AT. + PUSH P,R + TLNN D,%IOTOT + JRST NSIOIL ;INPUT AND OUTPUT PART HERE +NSIOOL: UMOVE A,@-3(P) + IBP A ;THIS HAIR IS TO AVOID INCREMENTING THE USER'S COPY + UMOVE D,(A) ;OF THE BYTE POINTER BEFORE THE BYTE HAS BEEN + HRRI A,D ;FINALLY TAKEN WITH NO POSSIBILITY OF PCLSR'ING OUT. + LDB D,A ;CAN'T USE XCTR XR,[LDB D,A] BECAUSE ON THE KA10 + MOVE C,[SETZ D] ;THAT WOULD USE THE LOSER'S AC A. + MOVE R,(P) + MOVE A,-4(P) ;SET UP ARGS FOR IOT ROUTINE; C HAS ADDR OF VALUE. + PUSHJ P,@-1(P) ;CALL THE IOT ROUTINE. + XCTR XRW,[IBP @-3(P)] ;NOW STEP THE B.P. AND COUNT. + XCTR XRW,[SOS A,@-2(P)] + JUMPG A,NSIOOL + JRST NSIOTX + +NSIOIL: UMOVE A,@-3(P) + IBP A ;MAKE SURE NO FAULT IDPB'ING THE BYTE + XCTR XRW,[MOVES (A)] + MOVE R,(P) ;NOW GET THE ARGS FOR THE IOT ROUTINE, + MOVE A,-4(P) + PUSHJ P,@-1(P) ;AND CALL IT, WITH VALUE COMING IN W. + JRST NSIOI3 ;NO SKIP => WE WIN. + JRST NSIOTX ;1 SKIP => THERE'S NO INPUT; RETURN WITHOUT STEPPING B.P. + ;2 SKIPS => THIS BYTE IS THE LAST ONE AVAILABLE. + XCTR XBYTE,[IDPB W,@-3(P)] + XCTR XRW,[SOS @-2(P)] + JRST NSIOTX + +NSIOI3: XCTR XBYTE,[IDPB W,@-3(P)] + XCTR XRW,[SOS A,@-2(P)] + JUMPG A,NSIOIL +NSIOTX: SUB P,[5,,5] + JRST POPJ1 + +NSIOT9: EXCH A,R ;INDEXED BYTE POINTER, EVAL INDEX ONCE AND WRITE BACK + PUSHJ P,ASCIND + EXCH A,R + UMOVEM A,(B) + POPJ P, + ; +; ROUTINES TO SIMULATE SOME I/O INSTRUCTIONS WHEN EXECUTED BY USER + +IFE KS10P,[ ; KS10 will never have any devices so we might as well punt + ; this sham right from the start. + +AUIOT: MOVE I,FORTY ;GET I/O INST + ANDI R,7 ;GET IOT TYPE FIELD + LDB J,[320700,,FORTY] + LDB D,[420200,,IOTTYP(R)] + JRST @IOTTYP(R) ;DISPATCH ON TYPE + +IOTTYP: 000000,,IOTTY3 ;BLKI + 000000,,IOTTY2 ;DATAI + 200000,,IOTTY3 ;BLKO + 200000,,IOTTY2 ;DATAO + 600000,,IOTTY2 ;CONO + 400000,,IOTTY2 ;CONI + 400000,,IOTTY1 ;CONSZ + 400000,,IOTTY1 ;CONSO + +IOTTY1: CAIN J,177 ;IF EQ INST WAS 7777XX,,XXXXXX + JRST ILUUO ;USER HAS EXECUTED A SMALL NEGATIVE NUMBER + JRST IOTTY2 + +IOTTY3: +IFN KL10P,[ + MOVE C,DCHNTB(J) + TRNE C,10000 + JRST IOTTY2 ;SPECIAL BLKI THAT IS TREATED LIKE DATAI +] + TLO I,40 ;BLOCK TYPE, TURN ON BIT TO CONVERT TO UNIT + UMOVE C,(I) ;GET BLOCK POINTER + ADD C,[1,,1] ;ADVANCE + TLNE C,-1 ;SKIP IF OVERFLOW + AOS (P) ;CAUSE RETURN TO SKIP + UMOVEM C,(I) ;STORE BACK + HRR I,C ;MODIFY INST ADR TO RH OF BLOCK POINTER +IOTTY2: SKIPL C,DCHNTB(J) + JRST IOTTYA + LSH C,19.(D) + SKIPL C + JRST ILUUO +IOTTYB: XCTR XRW,I ;DO IOT + POPJ P, ;NORMAL RETURN + JRST POPJ1 ;IOT SKIPPED RETURN + +IOTTYA: SKIPGE DCHNTC(J) + JRST ILUUO ;SUSPICIOUS DEVICE + JRST IOTTYB + +] ;IFE KS10P + +IFN KS10P, AUIOT==:ILUUO ; For now. + +IFN 0,[ ; Simple IO instruction simulating for the KS should look + ; like this. Unfortunately XCTR XRW,[APRID 100] clobbers + ; exec location 100. Further investigation is needed + ; before figuring out how to deal with this. + +AUIOT: LDB R,[271500,,FORTY] ; Get opcode and AC. + CAIE R,APRID_-27 ; For now this is the only instruction we + ; simulate on the KS + JRST ILUUO + XCTR XRW,FORTY ; Do it + POPJ P, ; Return normally + JRST POPJ1 ; It skipped (well APRID can't, but perhaps + ; someday something else will) +] ;IFN 0 + +SUBTTL .SUSET, .USET, .CALL USRVAR + +;COMMON CODE FOR USRVAR, TTYVAR, ETC. SYMBOLIC SYSTEM CALLS +;PUSHJ P,VARCAL WITH FIRST ARG DECODED INTO H,I,J,R; B,C,W,U SET UP AS IN .CALL +;NOTE B IS A POINTER TO THE SECOND ARG (IN BLOCK MODE IS WRITTEN BACK) +;POPJS (OR PUSHJS IN THE CASE OF BLOCK MODE) BACK WITH E CONTAINING +;VARIABLE SPEC, D INPUT DATA, W INSTRUCTION TO HACK IT (0 TO READ INTO A, +;OTHERWISE OP D, WITH RH CLEAR WHERE OP IS MOVEM, ANDCAM, ADDM, ETC.) + +VARCAL: HRRZ E,B ;USE 2ND ARG AND NUM OF ARGS TO DETERMINE TYPE OF OPERATION + TLNE B,1000 + JRST VARCA1 ;IMMEDIATE 2ND ARG + UMOVE E,(B) ;GET VALUE OF 2ND ARG + TLC E,777000 + TLCN E,777000 + JRST VARCBL ;BLOCK MODE (2ND ARG LOOKS LIKE AOBJN POINTER) +VARCA1: EXCH D,C ;D GETS 3RD ARG, INPUT DATA + CAIL W,4 + JRST VARCA2 ;JUMP IF IMMEDIATE INSTRUCTION MODE + CAIGE W,3 ;SKIP IF WRITING + TDZA W,W ;W 0 FOR READING + MOVSI W,(MOVEM D,) ;SIMPLE CASE OF WRITING (SEE VARCBL FOR HAIR) + POPJ P, ;CALLER WILL DO OPERATION AND POPJ1 OR OPEN-LOSS + +VARCA2: ADD P,[2,,2] ;IMMEDIATE INSTRUCTION MODE. MAKE STACK SAME AS AT VARCAL. + TLNN C,-1 ;E HAS VARIABLE SPEC + MOVSS C ;C GETS INSTRUCTION + PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION + JRST POP3J1 ;TAKE GOOD RETURN FROM THE CALL + +VARCBL: PUSH P,J ;BLOCK MODE. SAVE J WHICH SOME SUSETS CLOBBER + PUSH P,B ;SAVE POINTER TO AOBJN POINTER TO SPEC,INSN PAIR LIST + XCTR XRW,[MOVES B,@(P)] ;GET AOBJN POINTER, TEST WRITEABILITY +VARCB1: UMOVE E,(B) ;GET VARIABLE SPEC + UMOVE C,1(B) ;GET "INSTRUCTION" + MOVE J,-1(P) ;GET DECODED FIRST ARG OR WHATEVER (SOME USRVAR ROUTINES CLOBBER J) + PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION + MOVE B,[2,,2] + XCTR XRW,[ADDB B,@(P)] ;ADVANCE AOBJN POINTER + JUMPL B,VARCB1 ;MORE STUFF TO DO + JRST POP3J1 ;POINTER COUNTED OUT, POP B, J, PUSHJ TO VARCAL + +VARCA3: EXCH C,R ;HERE TO PERFORM INSTRUCTION IN C + TLNE R,37 + PUSHJ P,ASCIND ;EVALUATE INSTRUCTION'S EFFECTIVE ADDRESS + EXCH C,R + LDB B,[410300,,C] ;GET MAJOR PDP10 OPCODE CLASS + JRST @.+1(B) + VARCBE ;0 UUO ILLEGAL + VARCBE ;1 FP/BYTE ILLEGAL + VARCB2 ;2 MOVE/ADD/SUB + VARCBE ;3 CAM ETC. RESERVED FOR .HANGING IN THE FUTURE + VARCB4 ;4 BOOLE + VARCBE ;5 HWT ILLEGAL + VARCB6 ;6 TEST + VARCBE ;7 IOT ILLEGAL + +VARCBE: SUB P,[4,,4] ;POP PUSHJ TO VARCA3, B, J, PUSHJ TO VARCAL + JRST OPNL33 ;BAD ARG + +VARCB6: TLNE C,006000 ;TEST INSTRUCTION - SKIP IF NO SKIP + JRST VARCBE ;SKIPPING TESTS RESERVED FOR FUTURE .HANGS + TLNE C,010000 ;SKIP IF IMMEDIATE + XCTR XR,[SKIPA D,(C)] + HRRZ D,C + TLNE C,001000 ;SKIP IF TDX OR TRX + MOVSS D ;TSX OR TLX + LDB C,[370200,,C] ;GET MODIFICATION TYPE + XCT (C)[JRST VARCBE ;NO MODIFICATION OBVIOUSLY AN ERROR + MOVSI W,(ANDCAM D,) ;TXZ + MOVSI W,(XORM D,) ;TXC + MOVSI W,(IORM D,)] ;TXO + JRST VARCBA + +VARCB4: TLNE C,002000 ;BOOLEAN INSTRUCTION - OK IF RESULT TO AC + JRST VARCBE + TLNN C,001000 ;SKIP IF IMMEDIATE + XCTR XR,[SKIPA D,(C)] + HRRZ D,C + HLLZ W,C ;SET UP OPCODE TO HAVE A+M EXCHANGED + TLZ W,003777 ;AND RESULT TO BE SENT TO MEMORY + TLCE W,030000 + TLCE W,030000 + TLC W,030000 + TLO W,(<002000,,> D,) + JRST VARCBA + +VARCB2: SETZB W,D ;MOVE/ADD/SUB GROUP + HLRZ B,C + CAIN B,(MOVEM) + JRST VARCBB ;SIMPLY READING + TLNE C,002000 + JRST VARCBE ;RESULT MUST BE TO AC + TLZ C,(0 17,) ;CHANGE AC FIELD TO D + TLO C,(0 D,) + TLNE C,060000 ;SKIP IF MOVE GROUP + JRST VARCB5 + XCTR XR,C ;FETCH OPERAND, DO MODIFICATION IF CALLED FOR (MOVN) + MOVSI W,(MOVEM D,) ;OPERATION WILL BE SIMPLE STORE + JRST VARCBA + +VARCB5: TLC C,070000 + TLCE C,070000 + JRST VARCBE ;NOT ADD/SUB + XCTR XR,C ;ADD TO/SUBTRACT FROM ZERO IN D + MOVSI W,(ADDM D,) ;DROP INTO VARCBA + +;HERE WITH E, W, D ALL SET UP FOR WRITING. +VARCBA: PUSHJ P,@-3(P) ;CALL BACK TO CALLER OF VARCAL + JRST POP4J ;LOST, POP PUSHJ TO VARCA3, B, J, VARCAL, TAKE ERR RETURN + POPJ P, ;WON, RETURN FROM VARCA3 + +;HERE WITH E AND W SET UP FOR READING. +VARCBB: PUSH P,C ;SAVE ADDRESS TO BE READ INTO + XCTR XRW,[MOVES (C)] ;NO FAULT. INSURANCE OF WRITEABILITY. + PUSHJ P,@-4(P) ;GET VALUE OF VARIABLE INTO A + JRST POP5J ;LOST POP C, VARCA3, B, J, VARCAL, TAKE ERR RETURN TO USER + POP P,C ;WON, STORE RESULT INTO USER + UMOVEM A,(C) + POPJ P, ;AND RETURN FROM VARCA3 + +USETBT: 420200,,USETL(E) ;BYTE POINTER TO UENTRY FIELD A + 400200,,USETL(E) ; " B + 200200,,USETL(E) ; " C + 160200,,USETL(E) ; " D + +USETRL: 221600,,USETL(E) ;BYTE POINTER TO UENTRY FIELD E + 001600,,USETL(E) ; " F + +;IN EACH UENTRY ENTRY: A IS THE METHOD FOR USET READ +; B IS THE METHOD FOR SUSET READ +; C IS THE METHOD FOR USET SET +; D IS THE METHOD FOR SUSET SET +; E & F ARE USED BY THE METHODS AS LISTED BELOW +;METHOD 0 = ILLEGAL MODE +;METHOD 1 = USE F AS RELATIVE LOC OF VAR +;METHOD 2 = USE E AS ROUTINE TO TRANSFER TO +;METHOD 3 = USE F AS ROUTINE TO TRANSFER TO + +DEFINE UENTRY A,B,C,D,E,F + ZZ==.SUCCESS + A_20+B_16+E,,C_20+D_16+F + IF2 [ + IFN 777774&,[PRINTX /UENTRY A,B,C,D TOO BIG +/] IFN 740000&,[PRINTX /UENTRY E,F TOO BIG +/] IFSE [E!F],[PRINTX /UENTRY E,F NULL +/] ] + .SUCCESS==ZZ + TERMIN + +USETL: UENTRY 1,1,2,0,UPCSET,UPC-USRSTG ;.UPC + UENTRY 1,1,1,1,,VALUE-USRSTG ;.VAL + UENTRY 3,3,2,2,USTTY,URTTY ;.TTY + UENTRY 1,1,0,0,,FLSINS-USRSTG ;.FLS + UENTRY 1,1,0,2,UUNAME,UNAME-USRSTG ;.UNAME + UENTRY 1,1,2,2,UJNAME,JNAME-USRSTG ;.JNAME + UENTRY 1,1,2,2,USMASK,MSKST-USRSTG ;.MASK + UENTRY 1,1,2,0,USTOP,USTP-USRSTG ;.USTP + + UENTRY 1,1,2,2,USPIRQ,PIRQC-USRSTG ;.PIRQC + UENTRY 2,2,0,0,UGSUPR, ;.INTB + UENTRY 1,1,2,2,USMEMT,HUSRAD-USRSTG ;.MEMT + UENTRY 1,1,0,0,,SV40-USRSTG ;.SV40 +REPEAT 2,UENTRY 1,1,2,2,IAPIRQ,PIRQC-USRSTG ;.IPIRQ/.APIRQ + UENTRY 1,1,2,2,USYNST,USYSNM-USRSTG ;.SNAME + UENTRY 1,1,2,2,UPISET,PICLR-USRSTG ;.PICLR + + UENTRY 2,2,3,3,URMAR,USMAR ;.MARA + UENTRY 1,1,1,1,,UMARPC-USRSTG ;.MARPC + UENTRY 1,1,0,0,,SUUOH-USRSTG ;.UUOH + UENTRY 2,2,0,0,UINDEX, ;.UIND + UENTRY 1,2,0,0,UTRNTR,UTRNTM-USRSTG ;.RUNT + UENTRY 1,1,2,2,USMSK2,MSKST2-USRSTG ;.MSK2 + UENTRY 1,1,2,2,USIFPI,IFPIR-USRSTG ;.IFPIR + UENTRY 1,1,0,0,,APRC-USRSTG ;.APRC + + UENTRY 3,3,0,0,,URCNSL ;.CNSL + UENTRY 2,0,3,0,RUTRAP,SUTRAP ;.UTRP +REPEAT 2,UENTRY 1,1,2,2,IAIFPI,IFPIR-USRSTG ;.IIFPI/.AIFPI +REPEAT 2,UENTRY 1,1,2,2,IAMASK,MSKST-USRSTG ;.IMASK/.AMASK +REPEAT 2,UENTRY 1,1,2,2,IAMSK2,MSKST2-USRSTG ;.IMSK2/.AMSK2 + + UENTRY 3,3,2,2,UJPCS,UJPCR, ;.JPC + UENTRY 2,2,0,0,UROPC, ;.OPC + UENTRY 1,1,1,1,,RTIMER-USRSTG ;.RTMR + UENTRY 1,1,1,1,,HSNAME-USRSTG ;.HSNAME +;IFN KL10P,UENTRY 1,1,1,1,,ULSPBR-USRSTG ;.LSPBR +;.ELSE UENTRY 1,1,1,1,,SRN3-USRSTG + UENTRY 2,2,3,3,RUBCHN,SUBCHN, ;.BCHN + UENTRY 2,2,0,0,MPVARD ;.MPVA +REPEAT 2,UENTRY 1,1,2,2,IADF1,IDF1-USRSTG ;.IDF1, .ADF1 + +REPEAT 2,UENTRY 1,1,2,2,IADF2,IDF2-USRSTG ;.IDF2, .ADF2 + UENTRY 1,1,2,2,USDF1,IDF1-USRSTG ;.DF1 + UENTRY 1,1,2,2,USDF2,IDF2-USRSTG ;.DF2 + UENTRY 1,1,1,1,,OPTION-USRSTG ;.OPTION + UENTRY 1,1,1,1,,40ADDR-USRSTG ;.40ADDR +IFE N11TYS, UENTRY 1,1,1,1,,SRN3-USRSTG ;.TVCREG - JOB'S CONSOLE REGISTER CONTENTS +IFN N11TYS, UENTRY 1,1,1,2,STVCRG,TVCREG-USRSTG + UENTRY 1,1,1,1,,TTSTSV+2-USRSTG ;.TTST + + UENTRY 1,1,1,1,,TTSTSV-USRSTG ;.TTS1 + UENTRY 1,1,1,1,,TTSTSV+1-USRSTG ;.TTS2 + UENTRY 1,1,1,1,,UWHO1-USRSTG ;.WHO1 + UENTRY 1,1,1,1,,UWHO2-USRSTG ;.WHO2 + UENTRY 1,1,1,1,,UWHO3-USRSTG ;.WHO3 + UENTRY 3,3,0,0,,RUSUPP ;.SUPPRO +IFN KA10P, UENTRY 2,2,0,0,URTR1I ;.TR1INS +IFE KA10P, UENTRY 1,1,1,1,,TR1INS-USRSTG +IFN KA10P, UENTRY 2,2,0,0,URTR2I ;.TR2INS +IFE KA10P, UENTRY 1,1,1,1,,TR2INS-USRSTG + +IFE KL10P,[ +REPEAT 4,UENTRY 1,1,0,0,,SRN3-USRSTG +] ;IFE KL10P +IFN KL10P,[ + UENTRY 1,0,0,0,,MBOXCT-USRSTG ;.MBOX + UENTRY 1,0,0,0,,MBOXCT+1-USRSTG ;.MBO1 + UENTRY 1,0,0,0,,EBOXCT-USRSTG ;.EBOX + UENTRY 1,0,0,0,,EBOXCT+1-USRSTG ;.EBO1 +] ;KL10P + UENTRY 1,1,1,1,,XUNAME-USRSTG ;.XUNAME (USER'S REAL NAME) + UENTRY 1,1,1,1,,XJNAME-USRSTG ;.XJNAME + UENTRY 1,1,1,1,,SRN4-USRSTG ;.FTL1 + UENTRY 1,1,1,1,,SRN5-USRSTG ;.FTL2 + UENTRY 1,1,1,1,,PAGRAN-USRSTG ;.PAGRANGE + UENTRY 1,1,1,1,,PAGAHD-USRSTG ;.PAGAHEAD + UENTRY 2,2,3,3,URSERV,USSERV ;.SERVER +MXVAL==.-USETL +EXPUNGE UENTRY ;NO MORE UENTRY'S + +MXVAL2==.RADIX 2,CONC [.LENGTH/]\MXVAL-1,/ ;BASE 2 LOG OF TABLE SIZE + +;SIXBIT TABLE OF USER VARIABLE NAMES. MUST BE IN CORRECT ORDER, +;SAME AS SYSCTB. + +USETTB: SIXBIT/ADF1/ + SIXBIT/ADF2/ + SIXBIT/AIFPIR/ + SIXBIT/AMASK/ + SIXBIT/AMSK2/ + SIXBIT/APIRQC/ + SIXBIT/APRC/ + SIXBIT/BCHN/ + SIXBIT/CNSL/ + SIXBIT/DF1/ + SIXBIT/DF2/ + SIXBIT/EBO1/ + SIXBIT/EBOX/ + SIXBIT/FLS/ + SIXBIT/FTL1/ + SIXBIT/FTL2/ + SIXBIT/HSNAME/ + SIXBIT/IDF1/ + SIXBIT/IDF2/ + SIXBIT/IFPIR/ + SIXBIT/IIFPIR/ + SIXBIT/IMASK/ + SIXBIT/IMSK2/ + SIXBIT/INTB/ + SIXBIT/IPIRQC/ + SIXBIT/JNAME/ + SIXBIT/JPC/ + SIXBIT/MARA/ + SIXBIT/MARPC/ + SIXBIT/MASK/ + SIXBIT/MBO1/ + SIXBIT/MBOX/ + SIXBIT/MEMT/ + SIXBIT/MPVA/ + SIXBIT/MSK2/ + SIXBIT/OPC/ + SIXBIT/OPTION/ + SIXBIT/PAGAHE/ + SIXBIT/PAGRAN/ + SIXBIT/PICLR/ + SIXBIT/PIRQC/ + SIXBIT/RTMR/ + SIXBIT/RUNT/ + SIXBIT/SERVER/ + SIXBIT/SNAME/ + SIXBIT/SUPPRO/ + SIXBIT/SV40/ + SIXBIT/TR1INS/ + SIXBIT/TR2INS/ + SIXBIT/TTS1/ + SIXBIT/TTS2/ + SIXBIT/TTST/ + SIXBIT/TTY/ + SIXBIT/TVCREG/ + SIXBIT/UIND/ + SIXBIT/UNAME/ + SIXBIT/UPC/ + SIXBIT/USTP/ + SIXBIT/UTRP/ + SIXBIT/UUOH/ + SIXBIT/VAL/ + SIXBIT/WHO1/ + SIXBIT/WHO2/ + SIXBIT/WHO3/ + SIXBIT/XJNAME/ + SIXBIT/XUNAME/ + SIXBIT/40ADDR/ +IFN .-USETTB-MXVAL, .ERR USETTB INCONSISTENT WITH USETL +REPEAT 1_--1, -1 ;PAD TO POWER OF 2 WITH PLUS INFINITY + +;THE FOLLOWING TABLE IS PARALLEL TO USETTB AND GIVES THE NUMERIC USET CODE +;WHICH SHOULD BE IN THE RANGE 0 - 77 OR 600 AND UP. +USETBN: 47 ;.ADF1 + 51 ;.ADF2 + 33 ;.AIFPI + 35 ;.AMASK + 37 ;.AMSK2 + 15 ;.APIRQ + 27 ;.APRC + 44 ;.BCHN + 30 ;.CNSL + 52 ;.DF1 + 53 ;.DF2 + 73 ;.EBO1 + 72 ;.EBOX + 3 ;.FLS + 76 ;.FTL1 + 77 ;.FTL2 + 43 ;.HSNAME + 46 ;.IDF1 + 50 ;.IDF2 + 26 ;.IFPIR + 32 ;.IIFPI + 34 ;.IMASK + 36 ;.IMSK2 + 11 ;.INTB + 14 ;.IPIRQ + 5 ;.JNAME + 40 ;.JPC + 20 ;.MARA + 21 ;.MARPC + 6 ;.MASK + 71 ;.MBO1 + 70 ;.MBOX + 12 ;.MEMT + 45 ;.MPVA + 25 ;.MSK2 + 41 ;.OPC + 54 ;.OPTION + 601 ;.PAGAHE + 600 ;.PAGRAN + 17 ;.PICLR + 10 ;.PIRQC + 42 ;.RTMR + 24 ;.RUNT + 602 ;.SERVER + 16 ;.SNAME + 65 ;.SUPPRO + 13 ;.SV40 + 66 ;.TR1INS + 67 ;.TR2INS + 60 ;.TTS1 + 61 ;.TTS2 + 57 ;.TTST + 2 ;.TTY + 56 ;.TVCREG + 23 ;.UIND + 4 ;.UNAME + 0 ;.UPC + 7 ;.USTP + 31 ;.UTRP + 22 ;.UUOH + 1 ;.VAL + 62 ;.WHO1 + 63 ;.WHO2 + 64 ;.WHO3 + 75 ;.XJNAME + 74 ;.XUNAME + 55 ;.40ADDR +IFN .-USETBN-MXVAL, .ERR USETBN INCONSISTENT WITH USETL + +;.CALL USRVAR HACK USER VARIABLES. +;ARG 1 - SPEC +;ARG 2 - AOBJN PNTR FOR BLOCK MODE OR 0,,USER-VAR-NUMBER OR SIXBIT/USER-VAR-NAME/ +;ARG 3 - DATA IF WRITING AND NOT IN BLOCK MODE. (OPTIONAL) +;ARG 4 - IMMEDIATE INSTRUCTION, OVERRIDES ARG 3. (OPTIONAL) +;VAL 1 - DATA IF READING AND NOT IN BLOCK MODE + +NUSRVA: MOVE J,A ;DECODE FIRST ARG + JSP T,NCORUI ;GET JOB AND LOCK ITS DIELOK + JRST NUSRV0 ;DEFINITELY WRITEABLE + JSP T,NCORWR ;NOT SURE, CHECK FURTHER + TLO J,(SETZ) ;SET WRITE PROTECT BIT +NUSRV0: +IFN PDP6P,[ + TRNE J,400000 + PUSHJ P,NULSET +] + PUSHJ P,NUSRV5 ;DO IT + POPJ P, ;LOST + JRST LSWPJ1 ;WON, UNLOCK DIELOK AND TAKE SUCCESS RETURN + +NUSRV5: PUSHJ P,VARCAL ;DECODE ARGS, HACK BLOCK MODE, SET E, W, D. +NUSRV3: SETZB B,I ;ENTER HERE FROM .USET AND .SUSET + TLNN E,-1 ;NOW DECODE USER VARIABLE SPEC + JRST NUSRV1 ;JUMP IF OLD STYLE NUMERIC SPEC +REPEAT MXVAL2,[ ;SIXBIT SPEC LOOK UP IN TABLE + CAML E,USETTB+1_(B) + ADDI B,1_ +] + CAMN E,USETTB(B) + CAIL B,MXVAL + JRST OPNL11 ;ILLEGAL USER VARIABLE NAME + MOVE E,USETBN(B) ;TRANSLATE TO NUMERIC SPEC +NUSRV1: JUMPE W,NUSRV2 ;READING + JUMPL J,OPNL31 ;WRITING AND WRITE PROTECTED + MOVEI I,2 ;MAGIC INDEX 1.2=R/W 1.1=OTHER/SELF +NUSRV2: CAIN U,(J) + IORI I,1 +IFN PDP6P,[ + HRRE B,J + AOJE B,PDPPMT ;USER IS PDP6 +] + CAIL E,600 + JRST [ SUBI E,500 + JRST NUSRV4] + CAIL E,100 + JRST AUSET2 ;100 TO 577 ARE .IOC, .IOS, .IOP, .PMAP VARS. +NUSRV4: CAIL E,MXVAL ;DETECT USET CODE BEYOND 6XX MAXIMUM. + JRST OPNL11 + LDB B,USETBT(I) ;GET METHOD BITS + SOJL B,OPNL12 ;VARIABLE NOT AVAILABLE THIS MODE (WRITE PROTECT?) + SOJL B,AUSVAR ;SIMPLE VARIABLE + LDB B,USETRL(B) ;GET ADDRESS OF ROUTINE TO CALL + HRRZ A,J ;SOME ROUTINES WANT USER INDEX IN A + JUMPE W,(B) + CAMN W,[MOVEM D,] + JRST (B) + PUSH P,D ;READ/ALTER/REWRITE + PUSH P,E + PUSH P,I + PUSH P,W + PUSH P,J + TRZ I,2 ;FIRST READ IT + MOVEI W,0 + PUSHJ P,NUSRV4 + JRST POP5J ;READ LOST + POP P,J + POP P,W + POP P,I + POP P,E + POP P,D + HRRI W,A + XCT W ;MODIFY THE VALUE IN A + MOVE D,A + MOVSI W,(MOVEM D,) + JRST NUSRV4 ;THEN WRITE IT BACK + +; +; .SUSET [N,,LOC] ;SAME AS .USET (SEE BELOW) BUT REFERS TO SELF +; +ASUSET: HRRZ J,U ;JOB TO BE HACKED IS SELF + SETZM UUAC(U) ;IF ERROR, RETURN LOSS IN .IOS+0 + JRST AUSET0 + +; ;IF N&200000=1, BLOCK MODE +; .USET CH,[N,,LOC] ;IF N&400000=0, READS USER VAR SPECIFIED BY REST OF N + ; FOR INFERIOR OR FOREIGN USER OPEN ON CHANNEL CH + ; INTO USER LOCATION LOC + ;IF N&400000.NE.0, SETS USER VAR SPECIFIED BY REST OF N + ; FOR DIRECTLY INFERIOR USER OPEN ON CHANNEL CH + ; FROM USER LOCATION LOC +AUSET: MOVE J,R ;DECODE AC FIELD AS CHANNEL NUMBER + PUSHJ P,AUSETJ + JRST IOCER7 ;USR OP CHNL DOES NOT HAVE USR OPEN +AUSET0: XCTR XR,[HRRZ B,(C)] ;GET ADDRESS READING INTO OR WRITING FROM + XCTR XR,[HLRZ E,(C)] ;GET VARIABLE AND DIRECTION + TRNE E,200000 + JRST ABUSET ;BLOCK MODE + TRZN E,400000 + JRST AUSET1 ;JUMP IF READING + JUMPL J,IOCER7 ;WRITE PROTECT VIOLATION + MOVSI W,(MOVEM D,) ;FLAG WRITING + UMOVE D,(B) ;GET DATA TO WRITE + PUSHJ P,NUSRV3 ;DO THE WRITE + JRST ILUUO ;LOST + POPJ P, + +;BLOCK-MODE .USET +ABUSET: TRNE E,400000 + TLOE J,(MOVE) ;SET BLOCK BIT + JRST ILUUO ;BLOCK IN BLOCK LOSES + UMOVE Q,(C) ;GET AOBJN PTR AGAIN +ABUST2: UMOVEM Q,(C) ;STORE AWAY UPDATED POINTER + PUSH P,C + PUSH P,J + MOVE C,Q + PUSHJ P,AUSET0 + POP P,J + POP P,C + UMOVE Q,(C) + AOBJN Q,ABUST2 + POPJ P, + +AUSET1: MOVEI W,0 ;FLAG READING + XCTR XRW,[MOVES (B)] ;ENSURE WRITEABILITY + PUSH P,B + PUSHJ P,NUSRV3 ;GET VALUE OF VARIABLE INTO A + JRST ILUUO ;LOST + POP P,J +APTUAJ: UMOVEM A,(J) + POPJ P, + +;DECODE ARG FOR USET +AUSETJ: JSP T,NCRUI2 + JRST POPJ1 + JSP T,NCORWR + TLO J,(SETZ) + JRST POPJ1 + +AUSVAR: LDB C,USETRL+1 ;GET ADDRESS OF VARIABLE + ADDI C,USRSTG(J) + JUMPE W,[MOVE A,(C) + JRST POPJ1] + HRR W,C + XCT W + JRST POPJ1 + +IFN PDP6P,[ +PDPPMT: MOVEI A,%JSSIX#%JSNUM ;PDP6 HAS ONLY A FEW VARIABLES, WHICH ARE READ-ONLY + CAIN E,.RUIND + JRST POPJ1 + MOVEI A,LPDP6M*2000 ;FIXED MEM BOUND FOR PDP-6 + CAIN E,.RMEMT + JRST POPJ1 + JRST POPJ1 ;IGNORE OTHER VARIABLES +] + +;VARIABLES 100 - 577 (.IOC, .IOS, .IOP, .PMAP) +AUSET2: JUMPN W,OPNL31 ;JUMP IF TRYING TO WRITE + SUBI E,100 + CAIL E,40 + JRST AUSET4 ;>140=>.RIOP+M + TRZE E,20 + JRST AUSET3 ;117.RIOS+M + ADDI E,IOCHNM(J) ;77.RIOC+M +AUSETX: MOVE A,(E) ;GET VAR + JRST POPJ1 + +AUSET3: MOVE R,J ;INFERIOR USER INDEX + ADDI R,IOCHNM(E) ;GET CHANNEL POINTER + MOVE H,(R) + JRST NSTATUS ;DO A .CALL STATUS + +AUSET4: CAIL E,40+LUIOP ;COMPARE AGAINST LAST IO PDL LOC + JRST AUSET5 ;READ MAP ENTRY + ADDI E,SIOCHN-40(J) ;MAKE UP POINTER TO VAR + JRST AUSETX + +;USET VARIABLE 200+N -- READ MAP VARIABLE FOR PAGE N. +; (0 <= N < 400) E CONTAINS N+100. + +;VALUE OF MAP WORD READ: + +;4.9 - PAGE WRITEABLE. +;4.8 - PAGE EXISTS (IF THIS OFF, WHOLE WORD IS 0) +;4.7 - PAGE IS IN CORE. +;4.6 - PAGE IS PUBLIC (ANYONE CAN WRITE IT) + +;3.1 - 3.9 - # TIMES PAGE SHARED (LIKE CORTYP'S 4TH VALUE'S RH) +;2.1 - 2.9 - ABS PAGE # OR PAGE # IN NEXT SHARER +; (LIKE CORTYP'S 3RD VALUE) +;1.1 - 1.9 - 0 => ABS PAGE (OR NO PAGE, OF COURSE) +; -1 => UNSHARED PAGE, +; ELSE USR NUM. OF NEXT SHARER. + +AUSET5: CAIGE E,100 + JRST OPNL11 + PUSHJ P,SWTL + CIRPSW ;DON'T LET PAGE TABLES CHANGE. + MOVEI A,-100(E) ;PAGE NUMBER IN JOB. + PUSH P,J + PUSHJ P,NCORT0 ;PUT CORTYP'S VALUES IN A THRU D. + POP P,J + PUSHJ P,LSWPOP ;FREE CIRPSW. + ANDI B,777 ;CORTYP'S 2ND VALUE IN 1.1 - 1.9 + DPB C,[111100,,B] ;3RD VALUE IN 2.1 - 2.9 + TLO B,(D) ;4TH VALUE RH INTO 3.1-3.9 + LSH D,-20. + TLO B,(D) ;4TH VAL BITS 4.8-4.9 INTO 4.6-4.7 + IOR A,B ;TOGETHER WITH 1ST VALUE'S 4.8, 4.9. + JRST POPJ1 + +USTOP: AOS (P) ;GOING TO WIN + JUMPN D,1USTOP ;NONZERO VALUE => STOP THE JOB. + MOVE B,APRC(A) ;ZERO => START. + TLNE B,BULGOS ;BUT DON'T EVER START A JOB THAT'S BEING KILLED. + POPJ P, + JRST 1USTRT + +1USTOP: MOVNI D,1 ;SET TO STOP +1USTRT: PUSHJ P,RPCLSR ;STOP USER IN A + DPB D,[.BP BUSRC_22,USTP(A)] ;BUSRC +IFN SWPWSP,[ + EXCH U,A + PUSHJ P,LVLOAD + EXCH U,A +];SWPWSP + JRST UPCLSR + +;SET INFERIOR'S PC +UPCSET: PUSHJ P,RPCLSR ;STOP USER IN USER MODE + TLO D,%PCUSR ;BE SURE USER MODE IS ON IN NEW PC + TLZ D,BADPC ;BE SURE PRIVILEGED BITS ARE OFF + SKIPGE IOTLSR(A) ;SKIP UNLESS USER IS SUPPOSED TO BE IN IOT-USER MODE + TLO D,%PCUIO ;TURN ON IOT-USER MODE + MOVEM D,UPC(A) ;SET PC + PUSHJ P,UPCLSR ;RESTART + JRST POPJ1 + +UJPCS: CAIN U,(A) ;SET .JPC, WITH CARE IF SETTING OWN + SPM UPGML(U) + HRRM D,UPJPC(A) + CAIN U,(A) + LPMR UPGML(U) + JRST POPJ1 + +UJPCR: CAIN U,(A) ;READ .JPC: + SPM UPGML(U) ;IF READING ONE'S OWN, MAKE SURE IT'S UP TO DATE. + HRRZ A,UPJPC(A) + JRST POPJ1 + +IFN KA10P,[ +UROPC: HLLZ A,UPOPC(J) + LSH A,5 + HRR A,UPOPC(J) + JRST POPJ1 +] ;KA10P +IFE KA10P, UROPC: JRST OPNL12 ;.OPC NOT SUPPORTED ON KL AND KS ((CAN'T + ; USE == DUE TO FWD REF)) + +IFN N11TYS,[ ;SET OWN TV CONSOLE REGISTER +STVCRG: MOVEM D,TVCREG(U) ;ENABLE TVCREG TO BE SWAPPED IN AND OUT OF HARDWARE + JUMPL D,POPJ1 ;IF TURNING ON; OR, IF TURNING OFF, ALL DONE + SKIPGE TT11P ;ALLOWED TO TOUCH HARDWARE? + SKIPE TEN11F + CAIA + MOVEM D,400000+TTR10*2000 ;UPDATE REG IN HARDWARE + MOVEM D,TVCREG(U) ;AND UPDATE AGAIN IN SOFTWARE IN CASE CLOBBERED AT SSTVR2 + JRST POPJ1 +] + +IFE KS10P,[ ; KS10 doesn't have a MAR and it never will... + +;READ MAR +URMAR: MOVE A,UPMAR(J) +IFN KA10P, TLZ A,777770 +IFN KL10P, LDB B,[270400,,A] +IFN KL10P, HRL A,MARPTB(B) + JRST POPJ1 + +;SET MAR +USMAR: CONO PI,CLKOFF ;TURN OFF CLOCK INTERRUPTS + CAMN J,USER + SPM UPGML(J) ;STORE PG VARIABLES IF HACKING CURRENT USER +IFN KA10P,[ + TLZ D,777770 + TLO D,4 ;SET USER MODE +] ;KA10P +IFN KL10P,[ + LDB B,[220400,,D] + HLL D,MARPTB(B) +] ;KL10P + MOVEM D,UPMAR(J) + CAMN J,USER + LPMR UPGML(J) ;USE LPMR BECAUSE KL10 DOESN'T HAVE VANILLA LPM + JRST CLKOJ1 + +IFN KL10P,[ ;MAR PERMUTATION TABLE. MAYBE CAN DO BETTER???? ***** + +MARPTB: 0 1, 0 ;OFF ;NONE (EXEC) + 0 11, 0 ;FETCH ;NONE (USER) + 0 3, 2 ;WRITE ;WRITE(EXEC) + 0 17, 6 ;ANY ;WRITE (USER) + 0 1, 10 ;OFF ;READ (EXEC) + 0 11, 14 ;FETCH ;READ (USER) + 0 3, 12 ;WRITE ;NOT FETCH (EXEC) + 0 17, 16 ;ANY ;NOT FETCH (USER) + 0 5, 1 ;READ ;FETCH (EXEC) + 0 15, 5 ;READ+FETCH ;FETCH (USER) + 0 7, 13 ;NOT FETCH ;NOT READ (EXEC) + 0 13, 17 ;NOT READ ;NOT READ (USER) + 0 5, 11 ;READ ;READ+FETCH (EXEC) + 0 15, 15 ;READ+FETCH ;READ+FETCH (USER) + 0 7, 3 ;NOT FETCH ;ANY (EXEC) + 0 13, 7 ;NOT READ ;ANY (USER) +] ;KL10P +] ;IFE KS10P + +IFN KS10P,[ +URMAR: +USMAR: JRST OPNL12 +] ;KS10P + +RUSUPP: HRRE A,SUPPRO(J) ;READ SUPERIOR'S USER INDEX + JUMPL A,POPJ1 ;-1 => TOP LEVEL +UINDEX: IDIVI A,LUBLK ;GET INDEX NUMBER + JRST POPJ1 ;GIVE TO USER + +;READ OWN RUN TIME +UTRNTR: CONO PI,CLKOFF +IFN KA10P,[ + SPM UPGML(U) + LDB A,[2300,,UPQUAN(U)] + LSH A,-2 ;SIMULATE 4.069 USEC CLOCK +] ;KA10P +IFN KL10P,[ + SKIPL MTRUSR ;SKIP IF PERFORMANCE METER AVAILABLE + JRST [ RMBOXC A ;REQUIRES AC ORDER - A,B,C,D,E + DSUB A,STMBOX + DMUL A,KLMBCC ;BECAUSE DMUL PRODUCES FOUR WORD RESULT + REBOXC D + DSUB D,STEBOX + DADD B,D + DMUL B,KLEBCC + MOVE A,D + JRST UTRNT1 ] + RPERFC A + DSUB A,STPERF + DIVI A,50.*4096. +UTRNT1: +] ;KL10P +IFN KS10P,[ + SPM UPGML(U) + LDB A,[044000,,UPQUAN(U)] ; 3.9 USEC CLOCK +] ;KS10P + ADD A,UTRNTM(U) + JRST CLKOJ1 + +;SET JOB'S TTYTBL (.TTY VARIABLE). +USTTY: CONO PI,CLKOFF ;PREVENT TIMING ERROR. + HLLZ E,TTYTBL(J) ;GET CURRENT VALUE + XOR E,D ;GET WHICH BITS USER WANTS TO CHANGE + AND E,[%TBNVR+%TBINT+%TBWAT+%TBOUT+%TBINF+%TBIIN+%TBOIG,,] ;GET BITS USER IS ALLOWED TO CHANGE + TRNE I,1 + TLZ E,%TBWAT ;THESE BITS CAN BE ALTERED ONLY BY THE SUPERIOR + XORM E,TTYTBL(J) ;ALTER THE USER-CONTROLLED BITS WITHOUT WRITING THE OTHERS. + JRST CLKOJ1 + +;READ JOB'S TTYTBL (.TTY) VARIABLE +URTTY: CONO PI,CLKOFF + HRRZ A,TTYTBL(J) + SKIPGE TTYTBL(J) + IDIVI A,LUBLK + HLL A,TTYTBL(J) + JRST CLKOJ1 + +;READ JOB'S .CNSL VARIABLE - TTY# OF TREE'S CONSOLE +URCNSL: MOVE A,UTMPTR(J) + SUBI A,USRRCE + CAIL A,NCT + SUBI A,NCT+2 ;DISOWNED -1 SYS -2 + JRST POPJ1 + +UJNAME: JUMPE D,OPNL33 ;SET INFERIOR'S JNAME + CAME D,[SIXBIT/PDP6/] + CAMN D,[SIXBIT/PDP10/] + JRST OPNL33 ;CHANGING TO ILLEGAL NAME + CAIN I,3 ;.SUSET? + JRST UJNAMS ;YES... + PUSHJ P,RPCLSR + PUSHJ P,UJNAMU ;IS NEW JNAME UNIQUE? + JRST UJNAMG ;NO + MOVEM D,JNAME(A) ;YES + CONO PI,CLKON + PUSHJ P,UPCLSR + JRST POPJ1 + +UJNAMU: MOVE B,UNAME(A) + MOVEI E,0 + CONO PI,CLKOFF +UJNAM1: CAME B,UNAME(E) + JRST UJNAMF + CAMN D,JNAME(E) + POPJ P, +UJNAMF: ADDI E,LUBLK + CAMGE E,USRHI + JRST UJNAM1 + JRST POPJ1 + +UJNAMG: PUSHJ P,UPCLSR + CAME A,E + JRST OPNL13 ;DUPLICATE NAME + JRST CLKOJ1 ;WASN'T REALLY CHANGING THE NAME + +UUNAME: HLRE I,D ;SET OWN UNAME + AOJE I,OPNL33 ;CHECK FOR ILLEGAL ___nnn UNAME + SKIPA I,U +UJNAMS: SETO I, ;SET OWN JNAME + JUMPE D,OPNL33 ;CHECK FOR EVIL NAMES + CAME A,U ;SELF? + BUG ;SOMETHING SCREWED + SKIPL SUPPRO(U) + JRST OPNL40 ;MUST BE TOP LEVEL + CONO PI,CLKOFF ;TURN CLOCK OFF NOW SO WE DON'T GET REOWNED OR SOMETHING + SKIPL I + SKIPA C,JNAME(U) ;CHANGING UNAME, KEEPING JNAME + SKIPA C,UNAME(U) ;VICE VERSA + EXCH D,C ;NOW C=UNAME, D=JNAME + MOVEI E,0 ;CHECK FOR DUPLICATE NAMES +UUNAM0: SKIPE UNAME(E) + CAMN E,U ;ALLOW SETTING TO SAME NAME AS BEFORE + JRST UUNAM1 + HRRZ A,SUPPRO(E) + CAMN C,UNAME(E) + CAME D,JNAME(E) + CAMN A,I ;JOB CAN'T HAVE INFERIORS IF SETTING UNAME + JRST OPNL13 ;OR DUPLICATE U-JNAME IF SETTING EITHER +UUNAM1: ADDI E,LUBLK + CAMGE E,USRHI + JRST UUNAM0 + CAMN C,UNAME(U) + CAME D,JNAME(U) + SKIPA A,D ;D GETS CLOBBERED + JRST CLKOJ1 ;THE NAMES WEREN'T ACTUALLY CHANGED! (SYNCOM DOES IT). + CAME C,UNAME(U) ;IF NOT LOGGED IN, AND CHANGING UNAME, + SKIPGE TTYTBL(U) ; AND CONSOLE-CONTROLLED, + JRST UUNAM3 + HLLO J,UNAME(U) + AOJN J,UUNAM2 + AOS SUSRS ;DISGUST! SHOULD BE USING LOGIN +UUNAM2: HRRZ T,TTYTBL(U) + HRLI T,[ASCIZ / CHUNAM /] + PUSHJ P,SGWAIT ;REQUEST SYSTEM JOB TO PRINT OUR MSG + MOVEM C,SLGIV+2 ;INCLUDE NEW UNAME AS SECOND NAME +UUNAM3: PUSHJ P,LOGUPD ;CHARGE OLD NAME FOR USAGE SO FAR + MOVEM C,UNAME(U) ;THEN SWITCH NAMES + MOVEM A,JNAME(U) + PUSHJ P,DMNPLI ;LOG BACK IN UNDER NEW NAMES + JRST CLKOJ1 + +;WAIT FOR SLGIV VARIABLES TO BECOME FREE, AND REQUEST THE +;SYSTEM JOB TO PROCESS THEM. TAKES STRING,,TTY IN T, AND +;PLACES UNAME(U) IN SLGIV, AND T INTO SLGIV+1. THE CALLER +;IS RESPONSIBLE FOR FILLING IN SLGIV+2 + +SGWAIT: PUSH P,T + MOVSI T,SCLLGI ;SOMEBODY ELSE IS USING THOSE VARIABLES + PUSHJ P,CWAIT ;WAIT FOR THE SYSTEM JOB TO FINISH WITH + TDNE T,SUPCOR ;THEM. + IORM T,SUPCOR ;REQUEST THE SYSTEM JOB TO PRINT OUR MSG + POP P,SLGIV+1 ;STRING,,TTY # + MOVE T,UNAME(U) ;STORE AWAY THE UNAME + MOVEM T,SLGIV + POPJ P, + +RUTRAP: LDB A,[430100,,UTRAPM(J)] ;GET SPECIAL TRAP MODE INDICATOR + JRST POPJ1 + +SUTRAP: DPB D,[430100,,UTRAPM(J)] ;SET " " " " + JRST POPJ1 + +IFN KA10P,[ +URTR1I: SKIPA A,[0,,%PIARO] ;READ "TRAP 1 INSTRUCTION" FOR KA-10 +URTR2I: MOVEI A,%PIPDL ;TRAP 2 + JRST POPJ1 +] ;KA10P + +;SET MEMORY BOUND +USMEMT: CAMN U,A + JRST USMEM2 + PUSHJ P,RPCLSR + MOVSI B,BSSTP + IORM B,USTP(A) + PUSHJ P,UPCLSR +USMEM2: ADDI D,1777 + LSH D,-10. + MOVE B,D + MOVEM A,SRN5(U) ;ARGUMENT TO NCORFS + PUSHJ P,LOSSET + NCORFS ;CLEARS BSSTP IN USTP(A). + EXCH U,A + PUSHJ P,ACORE + JRST OPNL33 ;LOST + EXCH U,A + JRST LSWPJ1 + +;SET SYSTEM NAME (ZERO IGNORED) +USYNST: SKIPE D + MOVEM D,USYSNM(J) + JRST POPJ1 + +;SET INFERIOR'S INTERRUPT MASK +USMASK: SKIPA E,[2] ;MOVEM +IAMASK: ANDI E,1 ;ANDCAM OR IORM + ANDCM D,[VBDBTS] ;BITS FOR CLASS 1 INTS CAN'T BE CHANGED. + XCT (E)[ IORB D,MSKST(A) + ANDCAB D,MSKST(A) + MOVEM D,MSKST(A)] +IFN KA10P,[ + MOVEI B,440+APRCHN ;NOW UPDATE JOB'S APRC VARIABLE. + TRNE D,%PIARO + TRC B,60 + TLNE D,(%PIFOV) + TRC B,600 + HRRM B,APRC(A) + TRNE I,1 + CONO @APRC(A) +] ;KA10P +IFE KA10P, PUSHJ P,TRINST + JRST UPISE1 + +IFE KA10P,[ +;SET THE AROV AND PDLOV TRAP INSNS ACCORDING TO WHETHER THE +;INTERRUPTS ARE ENABLED; BUT DON'T OVERRIDE AN EXPLICIT SPECIFICATION +;BY THE USER, WHICH IS ANYTHING OTHER THAN 0 OR (CAI) IN THE LH. + +TRINST: MOVE D,MSKST(A) + MOVSI B,(CAI) ;CAI IS FASTER THAN JFCL - NO AC DECODE + TDNE D,[%PIFOV+%PIARO] ;AND OVERFLOW GOES OFF A LOT + MOVEI B,%PIARO + HLRZ C,TR1INS(A) + SKIPE C + CAIN C,(CAI) + MOVEM B,TR1INS(A) +; MOVSI B,(CAI) ;THESE LINES COMMENTED OUT TO MAKE +; TRNE D,%PIPDL ; PDL OVERFLOW CLASS 2 INSTEAD OF CLASS 3 + MOVEI B,%PIPDL + HLRZ C,TR2INS(A) + SKIPE C + CAIN C,(CAI) + MOVEM B,TR2INS(A) + POPJ P, +] ;IFE KA10P + +;SET INFERIOR'S PI IN PROGRESS FLAG +UPISET: ASH D,-35. ;SHIFT SIGN BIT TO BOTTOM BIT + MOVEM D,PICLR(A) ;SET VARIABLE +;COME HERE WHEN ANY INTERRUPT VARIABLE'S VALUE IS CHANGED +;BY A .USET OR .SUSET; TAKE ANY INTS THAT ARE NOW PENDING. +UPISE1: HRRZ A,J ;IAMASK, ETC. MODIFY A. RESTORE IT. + AOS (P) ;GOING TO WIN + TRNN I,1 ;SKIP IF A SUSET + JRST APISE6 + JRST APISE1 ;SEE IF SHOULD REINTERRUPT + +IAMSK2: ADDI A,MSKST2-IDF1 +IADF1: ADDI A,IDF1-IDF2 +IADF2: ADDI A,IDF2-PIRQC ;IORM OR ANDCAM INTO IDF2. +IAPIRQ: ADDI A,PIRQC-IFPIR +IAIFPI: ANDI E,1 ;GET USET PARITY (0=IORM, 1=ANDCAM) + XCT IAINS(E) ;DO APPRO OP + JRST UPISE1 + +IAINS: IORB D,IFPIR(A) ;SET BITS + ANDCAB D,IFPIR(A) ;FLUSH BITS + +USMSK2: ADDI A,MSKST2-IDF1 ;SET .MSK2, ETC. +USDF1: ADDI A,IDF1-IDF2 +USDF2: ADDI A,IDF2-PIRQC +USPIRQ: ADDI A,PIRQC-IFPIR +USIFPI: MOVEM D,IFPIR(A) + JRST UPISE1 + +;.RBCHN, .SBCHN READ/SET NUMBER OF LAST CHANNEL ON WHICH ERROR OCCURRED +RUBCHN: LDB A,[BCHPTR#(A#U)] + JRST POPJ1 + +SUBCHN: DPB D,[BCHPTR#(A#U)] + JRST POPJ1 + +;GET INT BIT +UGSUPR: HLLZ A,SUPPRO(J) + JRST POPJ1 + +;SAVE AWAY MA (HIGH BITS) ON LAST MPV OR WIRO +;CALLED FROM CLKBRK, DONT CLOBBER A OR D + +MPVMAS: +IFN KA10P,[ + HLRZ T,UPJPC(U) + LSH T,10. ;HIGH BITS ONLY ON KA +] ;KA10P +IFE KA10P, HRRZ T,UPFW(U) + HRRM T,IOTLSR(U) + POPJ P, + +;.RMPVA READ VIRTURAL PAGE # (8 BITS) OF LAST MPV OR WIRO + +MPVARD: HRRZ A,IOTLSR(J) + JRST POPJ1 + +;.RSERVER Read server user number, or -1 if none. +URSERV: SKIPL A,SERVER(J) + IDIVI A,LUBLK + JRST POPJ1 + +;.SSERVER Set server user number, or clear if negative. +; (To prevent timing screws, you should really use the SSERVE call to set +; this variable, but for debugging convenience...) +USSERV: IMULI D,LUBLK + SKIPGE D + SETOI D, + MOVEM D,SERVER(J) + JRST POPJ1 + +SUBTTL USER INSTRUCTION HANG ROUTINE (.HANG) + +; .HANG was rewritten by Alan Feb 87: +; +; The general theory is that .HANG should behave -exactly- like JRST .-1 as +; much as possible. Thus, it is considered to make sense to put any +; skipping or jumping instruction before a .HANG. We are always careful to +; return from the .HANG by jumping to the previous instruction, so any side +; effects (such as clearing bits or incrementing accumulators or memory) are +; always performed, and jumps will be correctly taken. +; +; There are two ways to leave a .HANG, either the job can get PCLSR'ed, or +; the awaited condition can become true. We arrange for -both- cases to +; return the job to the previous instruction by SOSing UUOH -once- before +; calling UFLS, and once more if UFLS returns. +; +; As an additional feature, .HANG with a non-zero accumulator behaves like +; the disjunction of ordinary .HANG and .SLEEP, allowing the user to do a +; timeout. The accumulator should initially contain an argument, as for +; .SLEEP, that indicates when .HANG should timeout. In that case only, +; .HANG returns to the following instruction and the designated accumulator +; will contain zero. If such a .HANG is interrupted, or if it returns +; because the awaited condition is now true, that accumulator will contain +; the correct negative number indicating the absolute time it would have +; timed out. +; +; Accepted instructions are: +; Any CAI, CAM, JUMP, SKIP, AOJ, AOS, SOJ, or SOS class instruction. +; Any test instruction. +; JFFO. +; JFCL with 0 in the AC field. +; Or an XCT that eventually fetches one of the above. +; +; As special cases SKIPA 0, and CAIA 0, are taken to request a schedule, +; and JFCL 0, and SKIP 0, set %SWDSO. +; +; As before, it is a limitation that changes to memory referenced by .HANG +; when computing effective addresses and fetching XCT'ed instructions will +; not cause the job to wake up. But how could it be otherwise? Changes to +; the accumulators will of course cause the job to be PCLSR'ed. + +AHANG: MOVE R,UUOH + UMOVE R,-2(R) ; Get user's flush instruction + HRLOI A,377777 ; A: most positive fixnum + JUMPE J,AHANG2 ; No AC => timeout when hell freezes over + XCTR XR,[MOVN A,(J)] ; A: argument as for .SLEEP + JUMPG A,AHANG2 ; 'twas already neg., so wait 'til then + SUB A,TIME ; else compute time + UMOVEM A,(J) ; store back negative for PCLSRing + MOVN A,A ; A: time to wait for +AHANG2: PUSHJ P,ASCIND ; Compute E for instruction + HLRZ C,R ; C: Opcode and AC + CAIE C,(JFCL) + CAIN C,(SKIP) + JRST AHANGI ; User might be waiting for a while + CAIE C,(SKIPA) + CAIN C,(CAIA) + JRST AHANGF ; User is just trying to cause a schedule + LSH C,-9 ; C: 9-bit opcode + CAIN C,XCT_-33 + JRST AHANG1 ; XCT - Go loop + CAIN C,JFFO_-33 + JRST AHANGO ; JFFO is like JUMPN + LSH C,-6 ; C: First 3 bits of opcode + CAIN C,CAI_-41 + JRST AHANGC ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS + CAIN C,TRN_-41 + JRST AHANGT ; Txxx +IFN KS10P, JRST ILUUO +IFE KS10P,[ +;CODE TO ALLOW CONSO, CONSZ AS .HANG INSTRUCTIONS + HLRZ C,R ;CHECK FOR CONSO, CONSZ + TRZ C,077477 + LDB B,[320700,,R] ;GET DEVICE CODE/4 + SKIPGE T,DCHNTB(B) + TRNE T,40000 + CAIE C,(CONSZ\CONSO) + JRST ILUUO ;UNRECOGNIZED INSTRUCTION, OR USER CONI NOT + ; ALLOWED + MOVEM R,EPDL(U) + MOVE T,A + SOS UUOH + PUSHJ P,AHANG9 + PUSHJ P,UFLS + JRST AHANGX + +AHANG9: XCT EPDL(U) + CAMGE T,TIME + AOS (P) + POPJ P, + +] ;IFE KS10P + +; XCT ? .HANG +AHANG1: PUSHJ P,OPBRK ; Don't let "XCT ." hang you up + UMOVE R,(R) ; Get new instruction + JRST AHANG2 ; And start over + +; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS ? .HANG +AHANGC: TLNN R,040000 + JRST AHANG3 ; CAI, CAM, JUMP, SKIP + TLNN R,010000 + JRST AHANGJ ; AOJ, SOJ + TLNN R,020000 + SKIPA T,[-1] ; AOS: Compare with -1 + MOVEI T,1 ; SOS: Compare with 1 + TLZ R,770777 ; Clear all but last 3 bits of opcode + TLO R,(CAM T,) ; Build a CAM instruction + TLNE R,001000 ; With the opposite sense + TLC R,006000 + JRST AHANGM + +AHANG3: TLNN R,020000 + JRST AHANG4 ; CAI, CAM + TLNN R,010000 + JRST AHANGJ ; JUMP + TLZ R,(0 17,) ; SKIP + JRST AHANGM + +; JFFO ? .HANG +AHANGO: TLC R,(JFFO#JUMPN) +AHANGJ: HRRI R,AHANGX + JRST AHANGA + +; SKIPA ? .HANG -- just flush once (ignores timeout) +AHANGF: SOSA UUOH + SKIPA + PUSHJ P,UFLS + JRST AHANGX + +; JFCL ? .HANG -- hang infinitely (or until timeout) +AHANGI: MOVE B,TIME + ADDI B,60.*30. ; If sleeping for more than a minute + MOVSI C,%SWDSO ; Desire swap out + CAML A,B ; (just like .SLEEP) + IORM C,USWST(U) + SOS UUOH +AHANG5: MOVE T,A + CAML T,TIME + PUSHJ P,UFLS + JRST AHANGX + +; Txxx ? .HANG +AHANGT: TLZ R,060000 ; Make opcode be TRN or TDN series + TLNE R,010000 ; If TRN, only AC matters + JRST AHANGB ; TDN: Both AC and memory matter +; Wait for something that only references the user's accumulators. +; (Instruction in R might be some kind of jump to AHANGX.) +AHANGA: PUSHJ P,AHANGG ; Get contents of user's AC into T + SOS UUOH + XCT R ; Must try it once to prevent timing screw + JRST AHANG5 ; OK, wait forever for PCLSR + JRST AHANGX + +AHANG4: TLNN R,010000 ; If CAM, both AC and memory matter + JRST AHANGA ; CAI: Only AC matters +; Wait for something that references memory. +; (Instruction in R better not be a jump!) +AHANGB: PUSHJ P,AHANGG ; Get contents of user's AC into T +AHANGM: MOVEM R,EPDL(U) + SOS UUOH + TRNE R,-20 ; Memory reference really only AC? + JRST AHANG6 ; No, real memory, go wait + XCTR XRW,R ; Must try it once to prevent timing screw + JRST AHANG5 ; OK, wait forever for PCLSR + JRST AHANGX + + PUSHJ P,UHANG +AHANG6: PUSHJ P,UFLS +AHANGX: ;; Everyone exits here after SOSing UUOH once (before hanging). + ;; Thus we always exit to the previous instruction (just like being + ;; PCLSRed), unless we timeout instead. + CAMGE A,TIME ; Timeout? + JRST AHANGY ; Yes + SOS UUOH + POPJ P, + +AHANGY: XCTR XW,[SETZM (J)] ; Let user know we timed out + AOS UUOH ; And fall through instead of backing out + POPJ P, + +;.HANG flush instruction routine, called with PUSHJ only on clock level +UHANG: +IFE KS10P,[ + MOVEI TT,0 ; Save MAR word + EXCH TT,UPMAR(U) ; so will not MAR + LPMR UPGML(U) + MOVEM TT,UPMAR(U) ; Restore MAR +] ;IFE KS10P +IFN KS10P, LPMR UPGML(U) + MOVE TT,AC0S+A(U) + XCTRI XRW,EPDL(U) + CAMGE TT,TIME + AOS (P) ; Might be because location swapped out or + POPJ P, ; missing, but that's OK because we always + ; exit to the previous instruction! + +; Kind of like ASCIND for the accumulators... +AHANGG: LDB T,[270400,,R] + UMOVE T,(T) ; Get contents of AC from user + TLZ R,(0 17,) ; Clear out AC field in instruction + TLO R,(0 T,) ; Replace AC field with T + POPJ P, + +; Allow interrupt if being PCLSRed +OPBRK: PUSH P,T + MOVE T,UEXIT + CAMN T,[JRST ONEFLS] + PUSHJ P,UDELAY + POP P,T + POPJ P, + +SUBTTL .OPEN AND FRIENDS + +; +;.FDELE FILBLK ;DELETE OR RENAME FILE SPECIFIED AT FILBLK +; +AFDELE: SETZM UUAC(U) + UMOVE A,(C) ;GET DEVICE + MOVEI W,4 + DPB W,[OPNCOM,,A] ;SET OP TO SPECIFY AN .FDELE + JRST AFDEL1 +; +;OPEN SET UP AND DISPATCH +;3.1=0 => INPUT =1 OUTPUT +;3.2=0 => UNITS =1 BLOCK +;3.3=0 => ASCII =1 IMAGE +;4.9-4.7 OPERATION FIELD +; 0=> NORMAL READ OR WRITE +; 1=> WRITE OVER MODE +; 2=> MAKE LINK +; 4=> DELETE OR RENAME (INTERNAL) +; +;.OPEN CH,FILBLK ;OPEN FILE SPECIFIED AT FILBLK ON LOGICAL CHANNEL CH +; +AOPEN: ;C HAS EFF ADR OF UUO AND R ITS AC FIELD + ADDI R,IOCHNM(U) ;MAKE R POINT TO SPECIFIED I/O CHANNEL WORD + PUSH P,C + PUSHJ P,ACLOSE ;CLOSE PREV + POP P,C + UMOVE A,(C) ;GET DEV AND MODE BITS + LDB W,[OPNCOM,,A] + CAIN W,4 + JRST OPNL23 ;BARF IF TRY TO DELETE WITH .OPEN +AFDEL1: MOVEI TT,SRN3(U) ;MOVE 4TH-6HT ARGS + HRLI TT,3(C) ;TO SRN3 THRU SRN5 + MOVEI Q,3(TT) + XCTR XBR,[BLT TT,-1(Q)] + UMOVE B,1(C) ;GET 2ND, 3RG ARGS (FILENAMES) + UMOVE C,2(C) + MOVE D,USYSNM(U) ;USE DEFAULT SNAME. + HLRZ E,A ;GET MODE BITS. + HRLZI A,(A) ;LEFT-JUSTIFY DEVICE NAME. + SETZM EPDL(U) + SETZM EPDL3(U) +NOPNE: CAIN W,4 ;SKIP ON NOT .FDELE (ENTRY FOR NCALL TYPE OPEN, ETC COMMANDS) + SKIPN SRN3(U) ;SKIP ON RENAME + JRST AOPEN3 ;JUMP IF A .OPEN OR DELETING .FDELE + JUMPN B,AOPEN3 ;JUMP UNLESS RENAME WHILE OPEN. + MOVE TT,C ;GET CH ON WHICH FILE IS SUPPOSIDLY OPEN + TDNE TT,[-NIOCHN] ;SKIP IF CH LOGICALLY LESS THAN 20 + JRST OPNL14 ;BAD CHANNEL NUM + ADDI TT,IOCHNM(U) ;RELOCATE TO POINT TO CH WORD FOR USER + MOVE Q,(TT) ;GET CH WORD + JUMPE Q,OPNL44 ;CHNL NOT OPEN + HLRZ Q,CLSTB(Q) ;GET LEFT HALF OF CLOSE TABLE ENTRY FOR INDEX IN I/O CH WORD + TRNE Q,%CLSJI\%CLSJO + JRST JFDEL4 ;JOB DEVICE CHNL + TRNN Q,%CLSDO\%CLSQ ;SKIP IF A DIRECTORY DEVICE + JRST POPJ1 ;JUMP IF NOT DIRECTORY DEVICE + HLRZ J,(TT) ;PICK UP DEV CHNL NO + EXCH A,B ;PUT FN1, FN2 IN A, B. + EXCH B,C +IFN NUNITS,[ + TRNN Q,%CLSDO ;SKIP IF DEC TAPE + JRST NOPNE1 + MOVSI C,'UT0 ;GET DUMMY UT DEV NAME. + HRRZ I,UTTNO(J) ;GET POSSIBLE (?) TAPE NUM + TLO C,(I) ;STORE IN DEV NAME + MOVE TT,DVAUT ;WILL EXIT TO UTAPE OPEN RTN. + JRST OPEN2B +NOPNE1: +] + MOVSI C,'DSK ;NOT UT, MUST BE DSK. + MOVE TT,DVAQSK ;NOBODY ELSE HANDLES RENAME WHILE OPEN. + JRST OPEN2B + +AOPEN3: PUSHJ P,TRAN ;PERFORM I/O TRANSLATIONS + JRST OPNL3 ;TOO MANY TRANSLATIONS. + MOVEM D,USYSN1(U);SAVE TRAN'D SNAME FOR OPEN RTN. + PUSH P,A ;PUT NAMES ON STACK. + PUSH P,B + PUSH P,C + MOVSI B,-NDEVS ;LOAD LENGTH OF FIRST DEV NAME TABLE + CAME A,DEVTAB(B);SEARCH FIRST DEV NAME TABLE + AOBJN B,.-1 ;LOOP TILL FOUND OR COUNTED OUT + JUMPG B,OPEN1 ;JUMP IF NOT FOUND +OPEN2: MOVE TT,DEVADR(B) ;LOAD BITS,,OPEN-ROUTINE-ADDRESS +OPEN21: POP P,B ;UNSAVE SECOND FILE NAME + POP P,A ;UNSAVE FIRST FILE NAME + POP P,C ;UNSAVE DEVICE NAME + CAIN W,4 + JRST [ TLNN TT,%DVDEL + JRST OPNL34 ;DEVICE DOES NOT ALLOW DELETE + JRST OPEN2B ] + CAIN W,2 + JRST [ TLNN TT,%DVLNK + JRST OPNL34 ;DEVICE DOES NOT ALLOW LINK + JRST OPEN2B ] +OPEN2B: HRRZ D,E ;MODE BITS + EXCH E,C ;SAVE DEVICE IN E + HLL C,E ;SET UP OLD-STYLE C: MODE,,DEV + MOVSS C +; +;AT THIS POINT: A & B HAVE FILE NAMES, C HAS MAPPED DEV AND MODE BITS, D HAS MODE BITS, +;W HAS OPEN COMMAND, E HAS DEVICE NAME, TT HAS DEVADR WORD (BITS,,ROUTINE) +; + ROT D,-1 ;ROTATE IN/OUT BIT TO SIGN + CAIN W,4 ;SKIP IF NOT A .FDELE + TDZ D,[400000,,7] ;A .FDELE, MAKE LOOK LIKE OPEN FOR READ + PUSHJ P,FLDRCK + JRST OPEN2D ;NORMAL OPEN + JUMPL D,OPNL2 ;WRITING DIRECTORY? + JUMPN W,OPNL12 ;DELETING, RENAMING, LINKING, WRITING OVER DIRECTORY? + TLNE TT,%DVDIR + JRST (TT) ;OPEN DEVICE FOR DIRECTORY +;ASKING FOR DIR OF DEVICE SYSTEM DOESN'T HAVE DIR ROUTINE FOR. +;PASS IT OFF TO THE UNKNOWN-DEVICE HANDLER. + PUSH P,E ;PUSH DEVICE NAME + PUSH P,A ;PUSH FN1 + PUSH P,B ;PUSH FN2 + HLRZ E,C ;GET MODE BITS + JRST OPEN22 ;PASS TO UNKNOWN DEVICE JOB + +OPEN2D: TLNE TT,%DVIN + JUMPGE D,(TT) ;OPENING FOR INPUT AND DEVICE CAN DO INPUT + TLNE TT,%DVOUT + JUMPL D,(TT) ;OPENING FOR OUTPUT AND DEVICE CAN DO OUTPUT + JRST OPNL2 ;DEVICE DOESN'T GO THAT DIRECTION + +;CHECK FOR NUMBERED DEV +OPEN1: MOVE B,[-NDV1,,DVT1-DEVTAB] ;LOAD AOBJN POINTER WITH COUNT FOR 2ND DEV TABLE +OPEN1A: MOVEI I,0 ;INITIALIZE NUMBERED DEV NUM TO ZERO + MOVE D,[440600,,-2(P)] ;GET BYTE POINTER INTO DEV REQUESTED + MOVE C,[440600,,DEVTAB(B)] ;GET BYTE POINTER INTO CURRENT TABLE ENTRY +OPENA1: ILDB A,C ;GET CHAR FROM TABLE + ILDB J,D ;GET CHAR FROM DEV + JUMPE A,OPEN1B ;JUMP ON SPACE IN TABLE, "MATCHES" DIGIT IN DEV + CAIN A,(J) ;SKIP IF CHAR DIFFER + JRST OPEN1C ;SAME, TRY FOR NEXT CHAR +OPENZ1: AOBJN B,OPEN1A ;LOOP TO NEXT TABLE ENTRY OR COUNT OUT +;CHECK FOR NAMED SECONDARY PACK +;FIND THE ONE WITH THIS NAME AND THE BIGGEST QSFT. +;ASSUME THAT BY THE TIME WE GET HERE TUTS HAVE BEEN READ IN AND SO FORTH + SKIPE A,-2(P) ;GET DEVICE NAME AGAIN + CAMN A,[-1] ;0 OR -1 ARE NOT LEGAL PACK NAMES + JRST OPEN22 + MOVEI C,NQS-1 ;SEARCH NAMES OF SECONDARY PACKS + SETOB TT,I ;I BEST DRIVE SO FAR, TT BEST QSFT SO FAR +OPENZ2: CAMN A,QRESRV(C) + JRST [ CAML TT,QSFT(C) + JRST .+1 + MOVE TT,QSFT(C) + MOVE I,C + JRST .+1 ] + SOJGE C,OPENZ2 + MOVE TT,[%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,,QSKOB] + JUMPGE I,OPEN21 +; +;"UNKNOWN DEVICE" HANDLER. FOO DEVICE IS LOADED BY +;SYS;ATSIGN DEVICE FROM FILE DEVICE;JOBDEV FOO +; +OPEN22: POP P,EPDLT2(U) ;WHEN WE USE SYS:ATSIGN DEVICE AS A JOB DEVICE, + POP P,EPDLT1(U) ;SET UP THE "NAMES BEFORE LAST TRANSLATION" TO BE + POP P,EPDLT4(U) ;THE NAMES BEING USED, INCLUDING "FOO" AS THE DEVICE. + MOVE A,USYSN1(U) + MOVEM A,EPDLT3(U) + MOVSI C,'JOB + MOVE TT,DVAJOB ;DEVADR ENTRY FOR JOB: + MOVSI A,'SYS + MOVEM A,USYSN1(U) + MOVE A,['ATSIGN] + MOVE B,['DEVICE] + JRST OPEN2B + +OPEN1B: JUMPE J,OPEN1C ;JUMP IF DEV ARG EXHAUSTED + SUBI J,'0 ;CONVERT SIXBIT DIGIT TO NUMBER + JUMPL J,OPENZ1 ;JUMP IF TOO SMALL, NOT A DIGIT + CAILE J,9 ;SKIP IF LESS THAN 10. + JRST OPENZ1 ;LOSE, TRY NEXT + ASH I,3 ;MULTIPLY NUM SO FAR BY 8 + ADD I,J ;ADD NEW DIGIT +OPEN1C: TLNE C,770000 ;SKIP IF ALL SIX CHAR POSITIONS COMPARED + JRST OPENA1 ;GO TO NEXT POSITION + JRST OPEN2 + +NSOPEN: HRRZ R,A ;Args: 1 mode (LH) chnl (RH), 2 BP or aobjn -> block of BPs. + CAIL R,NIOCHN + JRST OPNL14 + ADDI R,IOCHNM(U) + PUSH P,A ;Save channel number. + PUSH P,B ;Save BP or BP block ptr. + PUSHJ P,CCLOSE + POP P,R ;Get back the BP or aobjn pointer. + MOVEM R,EPDL(U) ;Save where job device can get it. + PUSHJ P,FNPRS ;Parse into DEV, FN1, FN2, SNM in A, B, C, D. + MOVEM D,SRN3(U) ;Make symbolic open of network win using 5th arg as foreign host. + POP P,R ;Pop back channel number argument. + MOVE E,CTLBTS(U) + TSC E,E + TRZ E,-1 + XOR R,E + LDB E,[OPNCOM,,R] + CAIE E,2 + CAIN E,4 + JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL + HLRZ E,R + JRST NDEL1 + +;Given in R a BP into user memory, or an aobjn -> of BPs block in user memory, +;parse filenames into A, B, C, D. Clobbers Q, T, R, H, I. +FNPRS: SETZ Q, ;Guess that it is a BP, not a block of them. + SETZ A, ;Clear out the old-fashioned filename words. + SETZ B, + SETZ C, + SETZ D, + SETCM T,R ;Is our "BP" realy an aobjn pointer to fewer than 64 things? + TLNE R,-1 ;If LH is 0, treat as BP and replace with 440700 later. + TLNE T,777700 + JRST FNPRS8 + MOVE Q,R ;Put the aobjn pointer in Q and get the first BP in R. + UMOVE R,(Q) +FNPRS8: PUSHJ P,ASCIND +FNPRS7: PUSHJ P,FNPRS4 ; Read a sixbit word + JUMPL I,FNPRS9 ; Nothing there at all! + CAIN H,"; ; Directory? + JRST FNPRS0 ; Go do special hack + MOVEI I,B ; assume FN1 + SKIPE B ; unless we already have a FN1 + MOVEI I,C ; in which case assume FN2 + CAIN H,": + MOVEI I,A ; unless it was a device + SKIPN (I) ;Put it there, unless already something there. + MOVEM T,(I) + JUMPN H,FNPRS7 ;H=0 means end of last arg string. +FNPRS9: ;; Supply default values for all components except FN1. + SKIPN A + MOVSI A,(SIXBIT /DSK/) + SKIPN D + MOVE D,USYSNM(U) + SKIPN C + MOVSI C,(SIXBIT />/) + POPJ P, + +FNPRS0: SKIPN I,D + JRST FNPRS2 + LSH T,-6 + TLO T,(SIXBIT /./) +FNPRS1: LSH T,-6 + LSH I,6 + JUMPN I,FNPRS1 +FNPRS2: IOR D,T + JRST FNPRS7 + +;;; Extract in T the next SIXBIT word from user memory off bp in R, +;;; clobbering I (test 4.9 to see if there was no word read at all). +;;; Terminating character returned in H (0 means we got to the end of the +;;; string). Q should be an aobjn pointer to a block in user memory of +;;; additional BPs. +FNPRS4: SETZ T, + MOVE I,[440600,,T] +FNPRS6: PUSHJ P,FNPRS3 + JUMPE H,CPOPJ ; that was the end of the string + CAIE H,": + CAIN H,"; + JRST FNPRS5 ; done? + CAIN H,40 + JRST FNPRS5 ; done? + CAIN H,^Q + PUSHJ P,FNPRS3 + CAIL H,140 + SUBI H,40 + SUBI H,40 + TLNE I,770000 + IDPB H,I + JRST FNPRS6 + +FNPRS5: JUMPL I,FNPRS6 ; keep looking if we haven't seen anything yet. + POPJ P, + +;Extract in H the next character from user memory off the byte pointer in R. +;Q should be an aobjn pointer to a block of further BPs +;(in user memory) to use after this one is exhausted. +FNPRS3: TLNN R,-1 + HRLI R,440700 + IBP R + UMOVE H,(R) ;Fetch the word the BP points to. + PUSH P,R + HRRI R,H ;Change the BP to point to H. + LDB H,R ;Extract the desired byte. + POP P,R + JUMPN H,CPOPJ + AOBJP Q,CPOPJ ;When one BP is exhausted, go to the next (if any). + UMOVE R,(Q) + PUSHJ P,ASCIND + JRST FNPRS3 + +NOPEN: HRRZ R,A ;ARGS 1 MODE (LH) CHNL (RH) 2-5 LIKE NOPEN1 1-4 + CAIL R,NIOCHN + JRST OPNL14 + ADDI R,IOCHNM(U) + PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,D + PUSH P,E + PUSH P,W + PUSHJ P,CCLOSE + POP P,W + SOS W ;STRIP OF FIRST ARG + POP P,D ;B-E POPPED INTO A-D + POP P,C + POP P,B + POP P,A + POP P,R ;A POPPED INTO R + TLC R,@CTLBTS(U) + LDB E,[OPNCOM,,R] + CAIE E,2 + CAIN E,4 + JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL + JSP T,NOPEN1 + MOVEM D,SRN3(U) ;MAKE SYMBOLIC OPEN OF NETWORK WIN USING 5TH ARG AS FOREIGN HOST. +NDEL1: CLEARM SRN4(U) +NRN2: CLEARM SRN5(U) +NOPENX: TRNE R,-NIOCHN + BUG ;BAD CHANNEL # + HRRZM R,UUAC(U) ;CHNL # (MAYBE ONLY FOR ERRS) IN R + ADDI R,IOCHNM(U) + LDB W,[OPNCOM,,R] + JRST NOPNE + +;DEFAULT THE ARGS FOR .CALL OPEN, ETC,; PUT MODE IN E. +NOPEN1: SETZM EPDL(U) + SETZM EPDL3(U) + CAIGE W,2 + MOVSI B,(SIXBIT /@/) + CAIGE W,3 + MOVSI C,(SIXBIT /@/) + CAIGE W,4 + MOVE D,USYSNM(U) ;SYSTEM NAME + HLRZ E,R ;GET MODE BITS FOR TRAN. + JRST (T) + +;MAKE LINK 1-4 AS NOPEN1, 5 SNAME 2 6,7 FN1,2(2) +NMLINK: MOVSI R,200000 + CAIN W,2 ;Only 2 args are BPs. + JRST [ PUSHJ P,2FNPRS + JRST NOPENX] + CAIGE W,7 ;Otherwise, must be seven word of sixbit. + JRST OPNL33 + MOVEM E,SRN3(U) + MOVEM TT,SRN4(U) + MOVEM I,SRN5(U) + JSP T,NOPEN1 + JRST NOPENX + +NDEL: SETZM SRN3(U) + CAIN W,2 + JRST OPNL33 + CAIN W,1 ;If it's just a BP (or block of them), + JRST [ MOVE R,A ;Parse it into filenames in A-D. + MOVEM R,EPDL(U) + PUSHJ P,FNPRS + JRST .+2] + JSP T,NOPEN1 + MOVSI R,400000 ;DELETE, ARGS AS NOPEN1 + SETZ E, + JRST NDEL1 + +NRNAM: MOVSI R,400000 + CAIN W,2 ;Only 2 args are BPs. + JRST [ PUSHJ P,2FNPRS + JRST NRN2] + CAIGE W,6 ;Otherwise, must be six word of sixbit. + JRST OPNL33 + MOVEM E,SRN3(U) + MOVEM TT,SRN4(U) + MOVSI R,400000 ;RENAME 1-4 AS NOPEN1 5,6 NEW FN1,2 + JSP T,NOPEN1 + JRST NRN2 + +;Parse two BPs (or aobjn pointers to blocks of BPs) into user memory +;into filenames. The second bunch go in SRN3 - SRN5; the first in A - D. +;The two args are saved in EPDL and EPDL3. Clears E, preserves R. +2FNPRS: PUSH P,R + MOVEM A,EPDL(U) ;Save two BPs for job device. + MOVEM B,EPDL3(U) + PUSH P,A ;Decode the second BP first, to get the new names. + MOVE R,B + PUSHJ P,FNPRS + MOVEM B,SRN3(U) ;Stick them where RENAME looks. + MOVEM C,SRN4(U) + MOVEM D,SRN5(U) + POP P,R ;Parse the first BP, to get the old file filenames. + PUSHJ P,FNPRS + SETZ E, + POP P,R + POPJ P, + +;Takes either channel, FN1 (sixbit) and FN2 (sixbit) +;or channel and BP (or aobjn -> block of BPs). +NRNWO: SETZM EPDL(U) + SETZM EPDL3(U) + PUSH P,A + CAIN W,2 + PUSHJ P,[MOVE R,B ;If channel and BP, parse the BP into filenames. + MOVEM R,EPDL3(U) ;But also save it for job device. + JRST FNPRS] + MOVEM B,SRN3(U) ;PUT AWAY NEW NAMES. + MOVEM C,SRN4(U) + POP P,C + ANDI C,-1 ;We call "RENAME" with old fn2 = channel number. + SETZB A,B + MOVEI D,0 + MOVSI R,400000 ;OPNCOM IS .FDELE . + MOVEI E,400000 + JRST NRN2 + +SUBTTL HACKS FOR OPENS THAT LOSE + + +IFN 0,[ ;THESE "DEFNS" EXIST ONLY SO @ WILL CREF THEM + OPNL1: OPNL2: OPNL3: OPNL4: OPNL5: OPNL6: OPNL7: +OPNL10: OPNL11: OPNL12: OPNL13: OPNL14: OPNL15: OPNL16: OPNL17: +OPNL20: OPNL21: OPNL22: OPNL23: OPNL24: OPNL25: OPNL26: OPNL27: +OPNL30: OPNL31: OPNL32: OPNL33: OPNL34: OPNL35: OPNL36: OPNL37: +OPNL40: OPNL41: OPNL42: OPNL43: OPNL44: OPNL45: OPNL46: OPNL47: +OPNL50: OPNL51: OPNL52: OPNL53: OPNL54: OPNL55: OPNL56: OPNL57: +OPNL60: OPNL61: OPNL62: OPNL63: OPNL64: OPNL65: OPNL66: OPNL67: +OPNL70: OPNL71: OPNL72: OPNL73: OPNL74: OPNL75: OPNL76: OPNL77: +] ;END OF IFN 0 + +;HERE ARE THE REAL DEFNS +REPEAT NOPNLS,CONC OPNL,\.RPCNT+1,: JSP D,OPENL +; +OPENL: CONSZ PI,77400 + BUG ;ERROR WITH PI IN PROGRESS + MOVE U,USER ;BE SURE U=CURRENT USER'S INDEX + MOVEI D,-OPNL1(D) ;GET LOSSAGE NUMBER + MOVE R,SYSCVL(U);POSSIBLY RETURN IN ERROR-CODE ARG TO .CALL + TLNE R,%SCVER + UMOVEM D,(R) + HRRZ R,UUAC(U) ;GET CH NUM + CAILE R,NIOCHN-1 + BUG ;UUAC BAD + PUSHJ P,LSWCLR ;UNLOCK SWITCHES + DPB R,[BCHPTR] ;SAVE AS MOST RECENT CHANNEL IN ERR + ADD R,U ;RELOCATE TO POINT TO USER VARS + DPB D,[220600,,IOCHST(R)] ;STORE IN STATUS WORD + JRST CLKONJ + +SUBTTL RCHST, STATUS, RFNAME, RFPNTR, WHYINT CALLS + +;.CALL RFNAME +;1ST ARG IS A , WHOSE CHANNEL IS TO BE LOOKED AT. +;2ND ARG IS A CHANNEL NUMBER. +;3RD ARG IS BP TO STORE ASCIZ FILENAME STRING THROUGH. +;4TH ARG IS MAXIMUM NUMBER OF CHARACTERS TO STORE (DEFAULTS TO 1,,0). +;ONLY 1 ARG => IT IS CHANNEL #, AND JOB IS "SELF". +;FIRST 4 VALUES ARE THE DEVICE, FN1, FN2 AND SNAME +; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS. +;FIFTH VALUE IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN + +NRFNAM: MOVE J,A ;FIRST ARG IS JOB SPEC + CAIL W,2 + SKIPA A,B ;GET CHANNEL # INTO A IN EITHER CASE + MOVEI J,%JSELF ;IF ONLY ONE ARG, JOB SPEC IS SELF + MOVE Q,C ;SAVE BP FOR STORING ASCIZ FILENAME STRING - IF ANY. + CAIGE W,3 + SETZ Q, + CAIGE W,4 + MOVSI D,1 + JSP T,NCORUI ;DECODE JOB SPEC + JFCL +IFN PDP6P,[ + CAIN J,-1 + JRST OPNL34 ;PDP6 DOESN'T HAVE CHANNELS +] + PUSH P,D + PUSH P,Q + MOVE W,D + MOVE U,J ;LOOK IN THAT JOB'S CHANNELS + PUSHJ P,NRFNM1 ;GET THE CRUFT + JRST POP2J + PUSHJ P,LSWPOP ;UNSOS DIELOK. + MOVE T,Q + POP P,Q + POP P,I ;I GETS 4TH ARG: MAX NUMBER OF CHARS TO STORE IN STRING. + JUMPE T,POPJ1 ;IF DEVICE ROUTINE HAS CLEARED Q, IT HAS STORED THE STRING. + ;NOTE NETRCH PUTS AN EXTRA VALUE FOR .RCHST (GARBAGE, TO US) IN Q! + JUMPE Q,POPJ1 ;IF BP ARG WAS 0, CALLER DOESN'T WANT A STRING. + MOVE R,Q + PUSHJ P,ASCIND + MOVE Q,R + MOVE J,A ;IF SO, STORE ALL 4 FILENAMES DOWN IT, ONE BY ONE. + MOVEI T,": + PUSHJ P,NRFNS1 + MOVE J,D + MOVEI T,"; + PUSHJ P,NRFNS1 + MOVE J,B + MOVEI T,40 + PUSHJ P,NRFNS1 + MOVE J,C + MOVEI T,0 + PUSHJ P,NRFNS1 + JRST POPJ1 + +;STORE THE SIXBIT WORD IN J FOLLOWED BY THE ASCII CHAR IN T +;INTO USER ADDRESS SPACE DOWN THE BP IN Q. +NRFNS1: JUMPE J,CPOPJ ;OUTPUT NOTHING AT ALL IF THE SIXBIT WORD IS EMPTY. + CAIGE I,4 ;GIVE UP NOW IF TOO CLOSE TO END OF ALLOCATED SPACE. + POPJ P, + SETZ R, + ROTC J,6 ;ELSE GET NEXT CHAR IN R, AND CONVERT TO ASCII AND STORE. + ADDI R,40 + SETZ TT, + CAIE R,": ;PRECEDE ANY SPECIAL CHARACTERS WITH ^Q. + CAIN R,"; + MOVEI TT,^Q + CAIN R,40 + MOVEI TT,^Q + JUMPE TT,NRFNS2 + SOS I + PUSHJ P,NRFNSB +NRFNS2: SOS I + MOVE TT,R + PUSHJ P,NRFNSB + JUMPN J,NRFNS1 + SOS I + MOVE TT,T + PUSHJ P,NRFNSB ;IF NAME FINISHED BUT NOT EMPTY, FOLLOW BY TERMINATOR. + JUMPE T,CPOPJ + CAIN T,40 + POPJ P, + MOVEI TT,40 + PUSHJ P,NRFNSB ;IF TERMINATOR IS : OR ;, FOLLOW IT WITH A SPACE. + SOJA I,CPOPJ + +;STORE A BYTE IN TT DOWN BP IN Q TO USER SPACE, INCREMENTING FIRST. +;XCTR XBYTE LOSES BECUSE IT GETS THE BP FROM USER SPACE. +NRFNSB: IBP Q + PUSH P,T + PUSH P,Q + UMOVE T,(Q) + HRRI Q,T + DPB TT,Q + POP P,Q + UMOVEM T,(Q) + POP P,T + POPJ P, + +;GET THE FILENAMES FOR THE CHANNEL IN A OF JOB IN U INTO A THRU D. +;IF Q IS NONZERO, IT IS A BP TO STORE AN ASCIZ STRING, AND W IS THE +;MAX NUMBER OF CHARACTERS TO STORE. +;THE DEVICE DEPENDENT ROUTINE CAN STORE THE STRING ITSELF +;AND SET Q TO ZERO SO THAT IT WILL NOT BE STORED THE STANDARD WAY. +NRFNM1: MOVE T,[4,,NRFNM2] + JRST CHNDCD ;R GETS ADDR OF IOCHNM WD, H GETS CONTENTS. +NRFNM2: HLRZ A,H ;PUT LH(IOCHNM WD) WHERE DEVICE RTN LOOKS + HLLZ J,DCHSTB(H) + JUMPG J,[ ;IF 6-LETTER DEVICE NAME, LH IS POSITIVE ADDRESS + HLRZS J ;OF FULL NAME. NOTE THERE BETTER BE NO + MOVE J,(J) ;3-CHAR DEVICES WHOSE NAME DOES NOT START + JRST .+1 ] ;WITH A LETTER. + PUSH P,J ;SAVE THE PROBABLE VALUE OF DEVICE NAME + LDB J,[1400,,DCHSTB(H)] + HLRZ J,DRFNTB(J) ;GET RFNAME ROUTINE POINTER + SETZB B,C ;FN1, FN2 ARE 0 FOR NON-DIR-DEV + SETZ D, ;SNAME IS 0 FOR NON-MULTI-DIR-DEV + LDB E,[.BP (%IOTOM),IOTTB(H)] ;PROBABLE VALUE OF MODE + PUSHJ P,(J) ;CALL DEVICE-SPECIFIC ROUTINE + SKIPA A,(P) ;NO SKIP => USE DEVICE NAME FROM DCHSTB + MOVE A,J ;SKIP => USE DEVICE NAME RETURNED IN J + JRST POP1J1 + +;.CALL RFPNTR +;ARG 1 - CHANNEL NUMBER +;VAL 1 - ACCESS POINTER OF CHANNEL +;VAL 2 - BYTE SIZE OF CHANNEL. +;FAILS IF NOT A RANDOM-ACCESS DEVICE + +NRFPNT: HLRZ A,H ;CHANNEL ALREADY DECODED, SET UP LH(IOCHNM) FOR DEV RTN + LDB J,[1400,,DCHSTB(H)] + HRRZ J,DRFNTB(J) ;GET RFPNTR ROUTINE POINTER + JRST (J) ;IT SHOULD PUT POINTER IN A AND POPJ1, OR OPNL34 + +;SYMBOLIC CALL "RCHST" +;1ST ARG IS A CHANNEL NUMBER. +;6 OR MORE VALUES. THE FIRST 4 ARE THE DEVICE, FN1, FN2 AND SNAME +; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS. +;THE 5TH IS THE ACCESS POINTER, OR -1 IF NOT RANDOM ACCESS. +;THE 6TH IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN. +;MORE VALUES ARE RETURNED ONLY FOR NET:, AT THE MOMENT. +;THE DEV SUBROUTINE MAY PUT EXTRA RESULTS IN TT, I, AND Q, AND PUT # RESULTS INTO W + +NRCHST: SETO I, ;DEFAULT POSSIBLE EXTRA RESULTS + SETO TT, ;DEFAULT ACCESS POINTER TO -1 + MOVEI W,6 ;NORMAL NUMBER OF RESULTS IS 6 + SETZ Q, + PUSHJ P,NRFNM1 ;GET RESULTS 1 THROUGH 4 AND 6, AND SET UP R AND H + POPJ P, ;CHANNEL NUMBER MUST HAVE BEEN BAD + PUSH P,A + PUSH P,B ;SAVE THE AC THAT RFPNTR CLOBBERS. + HLRZ A,H ;GET ROUTINE TO GET ACCESS POINTER + LDB J,[1400,,DCHSTB(H)] + HRRZ J,DRFNTB(J) ;ROUTINE BETTER PRESERVE B,C,D,E,TT,I,Q + CAIL J,OPENL ;KLUDGILY SKIP IF WOULD OPEN-LOSS + PUSHJ P,(J) ;GET ACCESS POINTER IN A, ALWAYS SKIPS + MOVE A,TT ;NOT RANDOM ACESS, USE DEFAULT VALUE + MOVE TT,E ;OPEN MODE IS 6TH RESULT + MOVE E,A ;ACCESS POINTER IS 5TH RESULT + JRST PPBAJ1 + +;.RCHST AC, WITH AC/ CH,,ADDR +;RETURNS, IN THE 5 OR MORE WORDS STARTING AT ADDR, +;THE RESULTS OF A SYMBOLIC RCHST ON CHANNEL CH. +;EXCEPTION - THE DEVICE NAME IS RETURNED IN THE RH +;OF THE FIRST WORD , SO IT IS TRUNCATED TO 18 BITS. +;EXCEPTION - THE OPEN MODE VALUE IS NOT RETURNED. LATER VALUES +;ARE SHIFTED DOWN ONE WORD. +;NEVER SKIPS. + +ARCHST: UMOVE J,(J) ;GET CONTENTS OF AC + HLRZ A,J + CAIL A,NIOCHN + JRST ILUUO ;BAD CHANNEL NUMBER + PUSH P,J + PUSHJ P,NRCHST ;DO THE REAL WORK. + BUG ;ONLY ERROR RETURN SHOULD BE BAD CHANNEL NUMBER + HLRZS A ;PUT DEV NAME IN RH FOR HISTORY'S SAKE + POP P,J ;RH(J) HAS PLACE TO STORE DATA + MOVE TT,I + MOVE I,Q ;SHIFT DOWN LAST 2 VALS OVER THE OPEN MODE. + HRLI J,A + ADDI W,-2(J) ;W HAD 1+ # VALS, NOW HAS PLACE TO PUT LAST ONE + XCTR XBW,[BLT J,(W)] + POPJ P, + +;.STATUS CH,LOC ;STORE IN LOC THE STATUS OF CHANNEL CH + ;AND OF THE DEV OPEN ON IT IF ANY +;1.1-1.6 SYS PERIPHERAL DEVICE CODE +;1.7-2.9 DEVICE DEPENDENT +;3.1-4.9 LH(IOCHST) + +ASTATUS:ADDI R,IOCHNM(U) ;SET UP AC'S LIKE CHNDCD +ASTAT1: MOVE H,(R) ;ENTER HERE FROM .USET [.RIOS,,] + HLL R,CLSTB(H) + PUSHJ P,NSTATUS ;CALL NEW SYSTEM CALL VERSION + BUG + UMOVEM A,(C) ;GIVE TO USER + POPJ P, + +;.CALL STATUS +;ARG 1 - CHANNEL NUMBER +;VAL 1 - SAME AS .STATUS + +NSTATUS:HLRZ A,H ;SET UP LH(IOCHNM) + LDB D,[140600,,DCHSTB(H)] ;GET SYS PERIPHERAL DEVICE CODE + LDB J,[340300,,IOTTB(H)] ;GET I/O CHANNEL MODE FROM 4.5-4.2 + DPB J,[060300,,D] ;RETURN IN BITS 1.9-1.7 + LDB J,[1400,,DCHSTB(H)] + HLRZ J,DSTSTB(J) ;GET STATUS ROUTINE POINTER + PUSHJ P,(J) ;ROUTINE FILLS OUT STATUS WORD IN D + HLL D,IOCHST-IOCHNM(R) ;FILL IN LEFT HALF FROM IOCHST + TLZ D,740000 ;CLEAR BITS USED FOR CHANNEL NUM ON IO PDL + MOVE A,D ;RETURN VALUE IN A + JRST POPJ1 ;THIS CALL ALWAYS SUCCEEDS + +;.CALL WHYINT +;ARG 1 - CHANNEL NUMBER +;VAL 1 - %WY CODE FOR TYPE OF DEVICE +;ADDITIONAL VALUES DEVICE-DEPENDENT +;THIS IS THE USUAL CALL TO GIVE IN RESPONSE TO A SECOND WORD INTERRUPT + +NWHYINT:HLRZ A,H ;SET UP LH(IOCHNM) + LDB J,[1400,,DCHSTB(H)] + HRRZ J,DSTSTB(J) ;GET WHYINT ROUTINE POINTER + JRST (J) + +;DEVICE-SPECIFIC RFNAME/RCHST ROUTINES +;CALLED WITH STANDARD CHNDCD STUFF IN H AND R, LH(IOCHNM) IN A +;MUST PRESERVE H AND R; CAN CLOBBER W TO INDICATE EXTRA STUFF FOR RCHST + +RCHUSR: MOVE B,UNAME(A) ;GET UNAME + MOVE C,JNAME(A) ;GET JNAME + POPJ P, + +IFN NUNITS,[ ;UTAPE .RCHST +RCHUTP: HRRZ C,UTTNO(A) + MOVSI J,'UT0(C) ;GET REAL DEV NAME "UTN" IN J + AOS (P) ;SKIP TO RETURN CHANGED DEV NAME + MOVE D,UTASS(C) ;THE "SNAME" IS THE USER TAPE IS ASSIGNED TO. + CAIGE A,NUTIC + JRST RCHUTI ;INPUT + MOVE B,UTN1(A) ;OUTPUT, GET FN1 + MOVE C,UTN2(A) ;NOW FN2 + POPJ P, + + ;UTAPE INPUT .RCHST +RCHUTI: LDB T,[220500,,UTDBC(A)] ;GET FILE NUMBER + SUBI T,1 + LSH T,1 ;TURN INTO INDEX INTO DIRECTORY + CONO PI,CLKOFF + ADD T,UDIRO(C) ;GET POINTER TO FILE NAMES + MOVE B,(T) ;GET FN1 + MOVE C,(T) ;GET FN2 + JRST CLKONJ +] + +;RCHST ROUTINE FOR TTY +RCHTTY: MOVE J,A + ANDI J,#%TICNS#(.BM $TIIDX) + IOR E,J ;MERGE TTY OPEN MODE BITS WITH THE GENERAL ONES. + TRNE A,%TICNS + POPJ P, + ANDI A,7 + MOVEI J,'T00(A) + HLRZ A,(R) +RCHST1: ANDI A,70 + LSH A,3 + ADD J,A + HRLZS J ;J NOW HAS SIXBIT/TNM/, NM = TTY #. + JRST POPJ1 ;SKIP TO SAY DEV NAME IS IN J. + +;RCHST ROUTINE FOR STY +RCHSTY: MOVE J,TTYOPT(A) + TLNE J,%TOHDX + IORI E,4 ;STY BIT 1.3 => TTY IS HALF-DUPLEX. + MOVE J,STYSTS-NFSTTY(A) + TLNE J,%SSORS + IORI E,20 ;BIT 1.5 => WANT TO RECEIVE %TDORS ON .RESET OF TYOC, + TRNN E,1 ;FIND THE DON'T-HANG-BIT FOR THIS DIRECTION. + TLZA J,#%SSOHG ;AND FLUSH THE ONE FOR THE OTHER DIRECTION. + TLZ J,#%SSHNG + TLNE J,-1 ;THEN TESTING BOTH TESTS ONLY THE RELEVANT ONE. + IORI E,10 + SUBI A,NFSTTY + ANDI A,7 + MOVEI J,'S00(A) + HLRZ A,(R) + SUBI A,NFSTTY + JRST RCHST1 + +RCHDRH: HRRZ A,IOCHST-IOCHNM(R) ;TRACK NUMBER + IMULI A,LMNBLK ;DIRHNG DEVICE RFNAME + ADDI A,2000-LMNBLK*NUDSL + ADD A,QMDRO + MOVE D,MNUNAM(A) + POPJ P, + +;RCHST ROUTINE FOR DIRECTORY CHANNELS AND THE ERR DEVICE. +RCHDIR: MOVE T,DSKLST(A) ;GET THE TYPE OF DIRECTORY CODE. + SKIPE J,UDUSR(A) ;IF DEVICE # IS NONZERO, ADD IT TO DEV NAME + HRLZS J ;(ONLY HAPPENS FOR UTAPE) + ADD J,RCHDRD-1(T) ;DETERMINE DEV NAME FROM DIRECTORY TYPE + MOVE B,RCHDR1-1(T) ;SAME FOR FN1 + SKIPN C,RCHDR2-1(T) ;AND FN2, EXCEPT 0 FOR ERR DEVICES + MOVE C,UUDPP(A) ; SO WE WILL GET THE STATUS WORD BEING DECODED. + CAIN T,3 + MOVE D,UDSYSN(A) ;FOR DISK UFD'S, GET THE SNAME + JRST POPJ1 ;RETURN, SAYING WE HAVE SPEC'D THE DEVICE NAME. + +.SEE UDT ;THESE TABLES ARE IN PARALLEL WITH UDT +RCHDRD: 'UT0,, ? 'CLU,, ? 'DSK,, ? 'DSK,, + 'ERR,, ? 'TTY,, ? 'COR,, +IF2 IFN .-UDTLN-RCHDRD,.ERR RCHDRD WRONG LENGTH + +RCHDR1: '.FILE. ? '.FILE. ? '.FILE. ? 'M.F.D. + 3 ? '.FILE. ? '.FILE. +IF2 IFN .-UDTLN-RCHDR1,.ERR RCHDR1 WRONG LENGTH + +RCHDR2: SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(FILE)/ + 0 ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ +IF2 IFN .-UDTLN-RCHDR2,.ERR RCHDR2 WRONG LENGTH + + + +;CORE LINK .RCHST ROUTINE + +RCHCLO: CONO PI,CLKOFF + MOVE B,CLN1(A) ;GET FN1 + MOVE C,CLN2(A) ;GET FN2 + MOVE D,CLSYN(A) ;GET SYSTEM NAME + JRST CLKONJ + +;RFNAME ROUTINE FOR DSK + +RCHQSK: MOVE H,QUDPR(A) ;FILE STATUS FOR DISK PICKUP USER DIR POINTER + PUSHJ P,QUDLK ;LOCK DIRECTORY + MOVE C,QSNLCN(H) ;LOCATION OF DIRECTORY + MOVE D,UDNAME(C) + ADD C,QUDFPR(A) ;ADD LOCN OF FILE WITHIN DIRECTORY + MOVE B,(C) ;GET FIRST FILE NAME + MOVE C,1(C) ;GET SECOND FILE NAME + PUSHJ P,QUDULK + MOVE H,QSRAC(A) + TLNE H,%QALNK + TRO E,20 ;LINK MODE + MOVE H,(R) ;PRESERVE H + POPJ P, + +;RFNAME ROUTINE FOR BOJ: + +RCHBOJ: CONO PI,CLKOFF ;BOJ DEVICE .RCHST ROUTINE + MOVE T,JBCUI(A) ;RETURNS CREATOR'S NAME + MOVE B,UNAME(T) + MOVE C,JNAME(T) + SKIPGE JBCG(A) + SETZB B,C ;CREATOR GONE, RETURN BLANK NAMES + JRST CLKONJ + +;RFNAME ROUTINE FOR JOB: + +RFNJOB: SKIPE Q + PUSHJ P,RFNJ1 + CONO PI,CLKOFF + MOVE B,JBFN1(A) + MOVE C,JBFN2(A) + MOVE D,JBSYS(A) + MOVE E,JBOPNM(A) + MOVE J,JBDEV(A) + JRST CLKOJ1 + +;COPY THE BOJ JOB'S ASCIZ FILENAME STRING INTO OUR CALLER'S STRING. +;THE CALLER'S BP IS IN Q, AND HIS MAX CHARS TO STORE IS IN W. +RFNJ1: SKIPN B,JBFNP(A) + POPJ P, + PUSH P,TT + PUSH P,T + MOVE J,JBCJUI(A) + AOS DIELOK(J) ;PREVENT THE JOB FROM DIEING. + PUSHJ P,SOSSET + DIELOK(J) + TLZ B,37 + MOVE D,B + PUSHJ P,RFNJ3 + MOVEI TT,1 +;D HAS BP TO FETCH WITH, POINTING INTO C, WHICH CONTAINS WORD FETCHED FROM BOJ JOB. +;RH(B) HAS ADDR OF NEXT WORD TO FETCH FROM THE BOJ JOB. +;TT CONTAINS THE PREVIOUS CHARACTER TRANSFERRED, OR 1 +;IF THE PREVIOUS CHARACTER WAS QUOTED WITH A ^Q. +RFNJ2: ILDB E,D + TRNN D,#C ;IF THE BP IN D ADVANCES PAST C, + JRST RFNJ4 + PUSHJ P,RFNJ3 ;FETCH ANOTHER WORD INTO C, MAKE D POINT THERE AGAIN, + LDB E,D ;AND FETCH THE SAME BYTE OVER AGAIN. +RFNJ4: SOJL W,RFNJ5 + EXCH TT,E + PUSHJ P,NRFNSB ;STORE BYTE INTO CALLER, UNLESS HIS STRING IS FULL. + EXCH TT,E + CAIN TT,^Q ;A QUOTED CHAR DOES NOT TERMINATE AND DOES NOT QUOTE. + MOVEI E,1 + MOVE TT,E + JUMPN E,RFNJ2 ;STOP STORING AFTER A NULL WHICH ISN'T QUOTED. +RFNJ5: SETZ Q, + POP P,T + POP P,TT + JRST LSWPOP + +;READ THE NEXT WORD (ADDR IN B) FROM THE BOJ JOB. +RFNJ3: SETZ C, + PUSH P,U + PUSH P,A + PUSH P,Q + MOVE U,JBCJUI(A) + LDB A,[121000,,B] + PUSHJ P,UPLC ;LOOK UP THE BOJ JOB'S PAGE. + POP P,Q + POP P,A + POP P,U + LDB J,T ;IF IT DOESN'T EXIST, LOAD A ZERO, + JUMPE J,RFNJ6 ;AVOID GETTING MPV. + MOVE J,JBCJUI(A) + PUSHJ P,MPLDJ + UMOVE C,(B) +RFNJ6: HRRI D,C + AOJA B,MPLDZ + +;RFPNTR FOR USR: + +RFPUSR: HRRZ A,IOCHST-IOCHNM(R) ;GET THE ACCESS PTR + MOVEI B,36. ;BYTE SIZE IS ALWAYS FULL WORD. + JRST POPJ1 + +;RFPNTR FOR DISK + +RFPQSK: LDB B,[QSBSIZ(A)] ;GET FILE BYTE SIZE + MOVSI T,%QAACC + TDNN T,QSRAC(A) ;IF .ACCESS WAS DONE AND NOT HANDLED, + JRST RFPQS1 + MOVE A,QRADAD(A) ;GET WHAT THE .ACCESS SPECIFIED. + JRST POPJ1 + +RFPQS1: MOVE J,QFBLNO(A) ;GET BYTE # OF STRAT OF CURRENT BLOCK. + SKIPGE QSMDN(A) ;SKIP ON A BUFFER ACTIVE + JRST RFPQS2 ;NONE ACTIVE => QFBLNO POINTS TO NEXT BLOCK TO BE READ. + ADD J,QMPBSZ(A) ;ELSE CORRECT FOR THE NUMBER OF BYTES WE'VE PROCESSED + SUB J,QSMPRC(A) ;IN THE ACTIVE BLOCK (QFBLNO -> 1ST WD OF BLOCK). +RFPQS2: MOVE A,J + JRST POPJ1 + +SUBTTL RESET,IOPUSH,IOPOP,IOPDL,FORCE,FLUSH .CALLS + +;.RESET CH, ;RESET BUFFERED INFO ON CHANNEL CH + ;NOT IMPLEMENTED FOR MANY DEVICES + ;HAS SPECIAL EFFECTS ON "USR" DEVICE +;.CALL RESET +;ARG 1 - CHANNEL NUMBER + +NRESET: HRRZ A,H + AOSA (P) +ARESET: HRRZ A,(R) ;PICK UP INDEX FROM I/O CH WORD + SKIPA T,[HRRZ T,RSTB1(A)] ;.RESET USES RH OF TABLE +AIOPP1: MOVE T,[HLRZ T,RSTB1(A)] ;.IOPUSH, .IOPOP USE LH OF TABLE + IDIVI A,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE + ADD A,[440500,,RSTB] + IBP A + SOJGE B,.-1 + LDB A,A ;GET BYTE FROM TABLE + XCT T ;GET REAL TABLE ENTRY IN T + JRST (T) ;DISPATCH + +;IO CHANNEL PUSH DOWN LIST ROUTINES +;C(I) =0 AT DSP => IOPUSH =1 => IOPOP + +NIOPUS: AOS (P) +AIOPUSH:MOVE T,SIOCP(U) ;PICK UP PDL POINTER + CAML T,[LUIOP-1,,0] ;LUIOP-2,, is OK, leaves room for 1 more. + JRST IOCER6 ;OVER PUSH ERROR + PUSH T,(R) ;PUSH CURRENT IOCHNM + PUSH T,IOCHST-IOCHNM(R) ;&IOCHST + HRRZ A,(R) + HRRZ J,UUAC(U) + DPB J,[400400,,(T)] ;STORE CHANNEL NUM FOR POSSIBLE USE BY AIOPDL + MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER + MOVEI I,0 ;INDICATE IOPUSH + PUSH P,R + PUSHJ P,AIOPP1 ;CALL DEVICE'S IOPDL HANDLER. SHOULD NOT HANG + POP P,R + SETZM (R) ;CLEAR OUT IOCHNM + SETZM IOCHST-IOCHNM(R) ;&IOCHST + POPJ P, + +NIOPOP: AOS (P) +AIOPOP: PUSHJ P,ACLOSE ;CLOSE WHATEVER MAY BE OPEN ON CHANNEL POPPING INTO + MOVE T,SIOCP(U) ;PICK UP PDL POINTER + TLNN T,-1 + JRST IOCER5 ;OVER POP ERROR + POP T,IOCHST-IOCHNM(R) ;POP BACK IOCHST + POP T,(R) ;&IOCHNM + HRRZ A,(R) + SETZM 1(T) ;CLEAR OUT PDL WORD TO AVOID CONFUSION IN + ;ROUTINES THAT GROVEL OVER I/O PDL + MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER + MOVEI I,1 ;INDICATE IOPOP + JRST AIOPP1 ;CALL DEVICE'S IOPDL HANDLER + +AIOPDL: MOVE T,SIOCP(U) ;PICK UP PDL POINTER + TLNN T,-1 ;SKIP UNLESS IO PDL EMPTY + POPJ P, + LDB R,[400400,,(T)] ;FIND OUT WHAT CHNL TOP ENTRY WAS PUSHED FROM + ADDI R,IOCHNM(U) + PUSHJ P,AIOPOP ;POP BACK INTO CHNL PUSHED FROM + JRST AIOPDL + +IIOPPR: JUMPE I,[JRST 4,CPOPJ] ;IOPUSH + SETZM (R) ;CLOSE CHANNEL + SUBI R,IOCHNM(U) ;GET CHANNEL NUMBER + MOVE R,CHNBIT(R) ;SECOND WORD INTERRUPT BIT + IORM R,IFPIR(U) ;GIVE TO USER + POPJ P, + +;.CALL FORCE +;ARG 1 - CHANNEL NUMBER +;IF ANY OUTPUT IS BUFFERED UP, CAUSES IT TO BE SENT TO THE DEVICE +;(IF FORCE WAS NOT DONE, IT MIGHT NOT BE SENT UNTIL A COMPLETE +;BUFFERFULL HAD BEEN OUTPUT BY THE USER.) + +NFORCE: SKIPA T,[HLRZ T,DFRCTB(D)] ;FORCE USES LH OF TABLE +NFINI1: MOVE T,[HRRZ T,DFRCTB(D)] ;FINISH USES RH OF TABLE + HLRZ A,(R) ;PASS LH(IOCHNM) TO DEVICE ROUTINES + HRRZ D,(R) ;USE RH(IOCHNM) AS BYTE INDEX INTO RSTB + IDIVI D,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE + ADD D,[440500,,RSTB] + IBP D + SOJGE E,.-1 + LDB D,D ;GET BYTE FROM TABLE + XCT T ;GET REAL TABLE ENTRY IN T + JRST (T) ;DISPATCH + +;.CALL FINISH +;ARG 1 - CHANNEL NUMBER +;FIRST DOES A FORCE, THEN WAITS FOR ALL OUTPUT TO GET TO THE DEVICE + +NFINIS: PUSHJ P,NFORCE ;CALL DEV ROUTINE FOR FORCING + POPJ P, + JRST NFINI1 ;THEN CALL DEV ROUTINE FOR WAITING + +;.NETS CH, - UUO VERSION OF .CALL FORCE. +ANETS: PUSHJ P,NFORCE + JRST IOCER1 ;ILLEGAL HARDWARE OPERATION + POPJ P, + +SUBTTL I/O DEVICE DISPATCH TABLES + +COMMENT | + This page tries to document the ITS I/O device dispatch tables and +dispatch environment. It is not completed yet. + +The tables use several different indices, which are: + opnidx - result of device name lookup in DEVTAB + ioidx - result of OPEN; has symbolic values. This is the index + stored in RH of IOCHNM (per-job channel table) + sidx - secondary index from DCHSTB(ioidx) + ridx - secondary index from RSTB(ioidx) + +The following system calls are dispatched through these tables. +There are 11 dispatch routines that each device must specify. +The format is "CALL [table name(index-used) -> device-routine]" + +OPEN [DEVADR(opnidx) -> devO] + "opnidx" is looked up from DEVTAB which holds the device names. + The device's OPEN routine is in the RH of DEVADR. + It must set up the user's IOCHNM word for the channel, + by setting the RH to the right "ioidx" and the LH to whatever + the device wants. + + Context: + +CLOSE [CLSTB(ioidx) -> devCLS] + The device's CLOSE routine is in the RH of CLSTB. + It must zero the user's IOCHNM word for the channel. + + Context: + +IOT, SIOT [IOTTB(ioidx) -> devVarious] + These routines do I/O transfers. The main reason "ioidx" + has so many possible values (causing IOTTB to be large) is + because lots of devices specify different ioidx's for different + modes - input/output, block/unit, image/ascii, etc - in order + to speed up actual I/O transfers, which are probably the most + common device-related system calls. + + Context: + +STATUS [LH(DTSTB(sidx)) -> devSTA] + +WHYINT [RH(DTSTB(sidx)) -> devWHY] + +RCHST, RFNAME [LH(DRFNTB(sidx)) -> devRCH] + +RFPNTR [RH(DRFNTB(sidx)) -> devRFP] + +IOPUSH, IOPOP [LH(RSTBI(ridx)) -> devIOP] + +RESET [RH(RSTBI(ridx)) -> devRST] + +FORCE [LH(DFRCTB(ridx)) -> devFRC] + +FINISH [RH(DFRCTB(ridx)) -> devFIN] + +| + +;DISPATCH TABLE FOR .CLOSE UUO +;TRANSFERED THROUGH USING RIGHT HALF OF IOCHNM WORD AS AN INDEX +;R HAS THE ADDRESS OF THE IOCHNM WORD. +; +;VARIOUS ROUTINES USE THE BITS IN THE L.H. TO DECIDE WHETHER +;A CHANNEL IS ACCEPTABLE FOR SOME OPERATION. +%CLS==1,,525252 +%CLSU==400000 ;USR DEVICE (INFERIOR) +%CLSDO==200000 ;DECTAPE OUTPUT +%CLSJI==100000 ;JOB INPUT +%CLSDI==40000 ;DECTAPE INPUT +%CLSTI==20000 ;TTY INPUT +%CLSCL==10000 ;CORE-LINK DEVICE +%CLSBJ==4000 ;BOJ DEVICE +%CLSQO==2000 ;DISK OUTPUT +%CLSFU==1000 ;NON-INFERIOR USR +%CLSNRM==400 ;STANDARD CLOSE ROUTINE USED FOR THIS DEVICE. + ;RH SHOULD POINT, NOT AT THEROUTINE, BUT AT THE USR-USE PAIR +%CLSQ==200 ;DISK +%CLS6==100 ;PDP6 +%CLSJO==40 ;JOB OUTPUT +%CLSST==20 ;STY DEVICE +%CLST==10 ;TRAP DEVICE + +%CLSJ==%CLSJI\%CLSJO ;EITHER DIRECTION OF JOB DEVICE +%CL1QO==%CLSQO\%CLSQ ;BOTH BITS FOR DISK OUTPUT + +CLSTB: CPOPJ + OFFSET -CLSTB +TYIDN:: REPEAT 2, %CLSTI,,TYICLS ;TYI +TYODN:: REPEAT 2, TYOCLS ;TYO +NLIDN:: REPEAT 4, CPOPJ ;NULL +UWIDN:: REPEAT 4, %CLSU ,,CPOPJ ;USER +FUWIDN:: REPEAT 2, %CLSFU,,CPOPJ ;FOREIGN USER +DNDIRH:: DIRHCL ;DIRHNG +DNTRAP:: %CLST,,CPOPJ ;TRAP +DNLCK:: LCKCL ;LOCK +IFN KS10P,DNUBI:: UBICL ;UNIBUS INTERRUPT +IFN CHAOSP,CHAIDN:: REPEAT 2, CHACLS ;CHAOS NET +IFN NUNITS,[ +DNUACII:: REPEAT 3,[ + %CLSDI,,UTICL ;UTAPE. + %CLSDO,,UTOCL +]] +IFN OLPTP,LPTDN:: REPEAT 2, LPTCLS ;LPT +IFN NLPTP,[ +NLPTDN:: NLPDCL + NLPTCL +] +IFN GLPTP,GLPTDN:: REPEAT 2, GLPCLS +DIRCHN:: REPEAT 4, UTDCLS ;DIRECTORY DEVICE +IFN VIDP,NVIDOP:: REPEAT 2, NVDCLS ;NVIDI +IFN PLTP,PLTDN:: REPEAT 2, %CLSNR,,PLTUSR ;PLOTTER +IFN PTRP,[ +PTPI:: REPEAT 5, %CLSNR,,PTPUSR ;PAPER TAPE PUNCH +] +IFN IMXP,IMPXDN:: REPEAT 4, IMPXCL ;IMX +IFN OMXP,OMPXDN:: REPEAT 4, OMPXCL ;OMX +DCLUAI:: %CLSCL,,CLCLRA ;CORE LINK + %CLSCL,,CLCLWU + REPEAT 2,[ + %CLSCL,,CLCLRB + %CLSCL,,CLCLWB + ] +IFN PTRP,[ +REDUAI:: REPEAT 5, PTRCLS ;PAPER TAPE READER +] +IFN 340P,[ +DN340B:: REPEAT 4, ADCL1 ;340 +; ADCL1 ;IDS +] +IFN CODP,[ +CODDN:: REPEAT 2, CODCLS ;CODE DEV +] +DQUAI:: %CLSQ ,,QICL ;DISK + %CL1QO,,QOCLR + %CLSQ ,,QICL + %CL1QO,,QOCL + %CLSQ ,,QICL + %CL1QO,,QOCL +IFN VIDP,DNVDIU:: REPEAT 4, TVCCLS ;TVC +IFN PDP6P,PDPUIO:: REPEAT 4, %CLS6 ,,PDPCLS ;USR IN PDP10 MODE +IFN TABP,DTABUI:: REPEAT 2, %CLSNR,,TABUSR ;TABLET +IFN NMTCS,[ +MTUAIX:: REPEAT 3, MTICL ;MAG TAPE + REPEAT 3, MTOCL + ] +JDUAI:: REPEAT 3,[ + %CLSJI,,JOBCLS ;JOB DEVICE + %CLSJO,,JOBCLS + ] +BDUAI:: REPEAT 6, %CLSBJ,,CPOPJ ;BOJ +IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE +ISPY:: CPOPJ ;SPY +STYDUI:: REPEAT 2,[ ;PSEUDO TTY + %CLSST,,STYICL + %CLSST,,STYOCL + ] +IFN NCPP,NETDUI:: REPEAT 4, NETCLS ; Arpanet NCP +IFN TCPP,TCPDUI:: REPEAT 4, TCPCLS ; Internet TCP +IFN INETP,IPQDN:: IPQCLS ; Internet Queue +IFN MSPP,MSPIO:: MSCLOS ;MESS SWITCHER (DM) +IFN STKP,STKDP:: STKCLS ;STANFORD KEYBOARD +IFN NTYP,NTYIT:: REPEAT 4, NTYCLS ;A KLUDGE ON THE NTY + OFFSET 0 +IF2,IFN .-CLSTB-LIOTTB,.ERR BARF AT CLSTB + +;DISPATCH TABLE FOR .IOT UUO +;TRANSFERED THROUGH USING RIGHT HALF OF I/O CHANNEL WORD AS AN INDEX +%IOT==1,,525252 +%IOTBK==400000 ;4.9 = 1 => BLOCK = 0 => UNIT +%IOTOT==200000 ;4.8 = 1 => OUTPUT = 0 => INPUT " +%IOTBP==100000 ;4.7 = 1 => THERE IS A SPECIAL ROUTINE FOR SIOT, + ;AND ITS ADDRESS IS -1 + RH(IOTTB WORD). +%IOTSP==40000 ;4.6 => THIS DEVICE IS FUNNY. SIOT ISN'T ALLOWED, + ;AND IOT LETS THE DEVICE RTN DO ALL THE WORK. + ;PRESENT ONLY FOR UNIT INPUT MODES. +%IOT10==20000 ;4.5 => THIS CHANNEL WAS OPENED WITH BIT 1.4 SET IN MODE +%IOTIM==10000 ;4.4 => THIS CHANNEL WAS OPENED WITH BIT 1.3 (IMAGE MODE) SET IN MODE +; 4000 ;4.3 COPIES %IOTBK. THUS, BITS 4.5-4.2 REFLECT THE BOTTOM 4 BITS +; 2000 ;4.2 COPIES %IOTOT. OF THE OPEN-MODE. +%IOTOM==36000 ;BITS 4.5 - 4.2 + +%IOTBO==606000 ;BLOCK OUTPUT. +%IOTBI==404000 ;BLOCK INPUT. +%IOTUO==202000 ;UNIT OUTPUT. +%IOTUI==000000 ;UNIT INPUT. + +IOTTB: IOCER8 + OFFSET -IOTTB +TYIDN:: %IOTUI,,TYI ;TTY ENTRIES MUST BE COMPACT +TYIBN:: %IOTBI,,TTYBI +TYODN:: %IOTUO,,TYO (%IOTBP) +TYOBN:: %IOTBO,,TTYBO ;LAST TTY DEVICE +NLIDN:: %IOTUI,,NULI +NLBIDN:: %IOTBI,,NULBI +NLODN:: %IOTUO,,CPOPJ +NLBDN:: %IOTBO,,NULBOD +UWIDN:: %IOTUI,,UWI (%IOTIM) +UBIDN:: %IOTBI,,UBI +UWODN:: %IOTUO,,UWO (%IOTIM) +UBODN:: %IOTBO,,UBO +FUWIDN:: %IOTUI,,UWI (%IOT10) +FUBIDN:: %IOTBI,,UBI (%IOT10) +DNDIRH:: %IOTUI,,IOCR10 +DNTRAP:: TRPDEV +DNLCK:: %IOTUO,,IOCR10 +IFN KS10P,[ +DNUBI:: %IOTUI,,IOCR10 +];KS10P +IFN CHAOSP,[ +CHAIDN:: %IOTUI+%IOTBP,,CHAUI +CHAODN:: %IOTUO+%IOTBP,,CHAUO +];CHAOSP +IFN NUNITS,[ +DNUACII:: %IOTUI,,UASCII +DNUACCO:: %IOTUO,,UASCCO +DNUBKI:: %IOTBI,,UBLKI +DNUBKO:: %IOTBO,,UBLKO +DNUDTI:: %IOTUI,,UDATAI (%IOTIM) +DNUDTO:: %IOTUO,,UDATAO (%IOTIM) +] +IFN OLPTP,[ +LPTDN:: %IOTUO,,PILPT1 +LPTBN:: %IOTBO,,BLPTO +] +IFN NLPTP,[ +NLPTDN:: %IOTUO,,NLPT1 +NLPTBN:: %IOTBO,,BNLPTO +] +IFN GLPTP,[ +GLPTDN:: %IOTUO,,GLPTDO (%IOTBP) +GLPTBN:: %IOTBO,,GLPTBO +] +DIRCHN:: %IOTUI,,DIRCH +DIRBN:: %IOTBI,,DIRB +NDATAI:: %IOTUI,,DDATAI (%IOTIM+%IOTBP) +NBLKI:: %IOTBI,,DBLKI (%IOTIM) +IFN VIDP,[ +NVIDOP:: %IOTUI,,NVIDIT (%IOTSP) +BNVIDO:: %IOTBI,,BNVIDI +] +IFN PLTP,[ +PLTDN:: %IOTUO,,PLOT +PLTBN:: %IOTBO,,BPLOT +] +IFN PTRP,[ +PTPI:: %IOTUO,,PIPUN (%IOT10) +PTPA:: %IOTUO,,APIPUN +PTPB:: %IOTBO,,BPIPUN +PTPWA:: %IOTUO,,WAPIPN (%IOTIM) +PTPWB:: %IOTBO,,WBPIPN (%IOTIM) +] +IFN IMXP,[ +IMPXDN:: %IOTUI,,IMPXS (%IOTSP) +IMXDN:: %IOTUI,,IMPXS1 (%IOTSP) +BIMXDN:: %IOTBI,,BIMXS1 (%IOTSP) +BIMPXD:: %IOTBI,,BIMPXS (%IOTSP) +] +IFN OMXP,[ +OMPXDN:: %IOTUO,,OMPXS (%IOTSP) +OMXDN:: %IOTUO,,OMXDS (%IOTSP) +BOMXDN:: %IOTBO,,BOMXDS (%IOTSP) +BOMPXD:: %IOTBO,,BOMPXS (%IOTSP) +] +DCLUAI:: %IOTUI,,CLUAI +DCLUAO:: %IOTUO,,CLUAO +DCLBI:: %IOTBI,,CLBI +DCLBO:: %IOTBO,,CLBO +DCLUBI:: %IOTUI,,CLUBI (%IOTIM) +DCLUBO:: %IOTUO,,CLUBO (%IOTIM) +IFN PTRP,[ +REDUAI:: %IOTUI,,PTRUAI +REDBAI:: %IOTBI,,PTRBAI +REDUII:: %IOTUI,,PTRUII (%IOTIM) +REDBII:: %IOTBI,,PTRBII (%IOTIM) +REDUTI:: %IOTUI,,PTRUTI (%IOT10) +] +IFN 340P,[ +DN340B:: %IOTBO,,340B ;340 ENTRIES MUST BE COMPACT; BLOCK FIRST, THEN UNIT +DN340W:: %IOTUO,,340W (%IOTSP) +DN340C:: %IOTUO,,340C (%IOTSP) +DN340H:: %IOTUO,,340H (%IOTSP) +;DN340I:: %IOTUO,,340I (%IOTSP) +DN340L:: ;LAST 340 DEVICE ENTRY +] +IFN CODP,[ +CODDN:: %IOTUO,,SEND +CODBN:: %IOTBO,,BSEND +] +DQUAI:: %IOTUI,,QUAI (%IOTBP) +DQUAO:: %IOTUO,,QUAO (%IOTBP) +DQBI:: %IOTBI,,QBI +DQBO:: %IOTBO,,QBO +DQUII:: %IOTUI,,QUII (%IOTIM %IOTBP) +DQUIO:: %IOTUO,,QUIO (%IOTIM %IOTBP) +IFN VIDP,[ +DNVDIU:: %IOTUI,,RNVDIU (%IOTSP) +DNVDIB:: %IOTBI,,RNVDIB (%IOTSP) +DNVDOU:: %IOTUO,,RNVDOU (%IOTSP) +DNVDOB:: %IOTBO,,RNVDOB (%IOTSP) +] +IFN PDP6P,[ +PDPUIO:: %IOTUO,,UWO ;BUT JOB WILL BE -1 TO INDICATE PDP6 +PDPBIO:: %IOTBO,,UBO +PDPUII:: %IOTUI,,UWI +PDPBII:: %IOTBI,,UBI +] +IFN TABP,[ +DTABUI:: %IOTUI,,UTABI +DTABBI:: %IOTBI,,BTABI +] +IFN NMTCS,[ +MTUAIX:: %IOTUI,,MTUAI (%IOTBP) ;MAGTAPE +MTUIIX:: %IOTUI,,MTUII (%IOTIM %IOTBP) +MTBIX:: %IOTBI,,MTBI +MTUAOX:: %IOTUO,,MTUAO (%IOTBP) +MTUIOX:: %IOTUO,,MTUIO (%IOTIM %IOTBP) +MTBOX:: %IOTBO,,MTBO +] +JDUAI:: %IOTUI,,JBUI(%IOTBP) +JDUAO:: %IOTUO,,JBUI(%IOTBP) +JDBI:: %IOTBI,,JBBI +JDBO:: %IOTBO,,JBBI +JDUII:: %IOTUI,,JBUI (%IOTBP %IOTIM) +JDUIO:: %IOTUO,,JBUI (%IOTBP %IOTIM) +BDUAI:: %IOTUI,,BJUI +BDUAO:: %IOTUO,,BJUO +BDBI:: %IOTBI,,BJBI +BDBO:: %IOTBO,,BJBO +BDUII:: %IOTUI,,BJUI (%IOTIM) +BDUIO:: %IOTUO,,BJUO (%IOTIM) +IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE +ISPY:: %IOTUI,,SPYI +STYDUI:: %IOTUI,,STTYI ;PSEUDO TTY +STYDUO:: %IOTUO,,STTYW +STYDBI:: %IOTBI,,STTBI +STYDBO:: %IOTBO,,STTBO +IFN NCPP,[ +NETDUI:: %IOTUI,,NETI +NETDUO:: %IOTUO,,NETW (%IOTBP) +NETDBI:: %IOTBI,,NETBI +NETDBO:: %IOTBO,,NETBO +] +IFN TCPP,[ +TCPDUI:: %IOTUI,,TCPI (%IOTBP) +TCPDUO:: %IOTUO,,TCPW (%IOTBP) +TCPDBI:: %IOTBI,,TCPBI +TCPDBO:: %IOTBO,,TCPBO +] +IFN INETP,[ +IPQDN:: IPQIO ; No I/O calls used on this dev! +] +IFN MSPP,[ +MSPIO:: IOCR10 +] +IFN STKP,[ +STKDP:: STKI +] +IFN NTYP,[ +NTYIT:: %IOTUI,,NTYTI ;KLUDGE FOR FAST, LARGE BUFFER ON NTY +NTYOT:: %IOTUO,,NTYTO +NTYBIT:: %IOTBI,,NTYBI +NTYBOT:: %IOTBO,,NTYBO +] + OFFSET 0 +LIOTTB==.-IOTTB + +;TABLES FOR VARIOUS CHANNEL STATUS CALLS + +;DCHSTB - INDEXED BY IOTTB INDEX (RH OF IOCHNM) +;LH SIXBIT MAIN DEVICE NAME +;1.1-2.3 INDEX INTO THE NEXT TWO TABLES +;2.4-2.9 SYSTEM PERIPHERAL DEVICE CODE (FOR .STATUS) +.SEE DCHSTB ;ASSEMBLED SECOND TO GET VALUES OF THE TEMPORARY %%dev SYMBOLS. + +;DSTSTB - INDEX FROM DCHSTB +;LH STATUS ROUTINE, RH WHYINT ROUTINE (OPNL34 IF DEVICE DOESN'T GIVE 2ND WD INTS) + +DSTSTB: CPOPJ,,OPNL44 ;0 CHANNEL NOT OPEN + STDSTA,,OPNL34 ;1 RANDOM DEVICE + CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE + STATYI,,TYIWHY ;3 TTY INPUT + STATYO,,TYOWHY ;4 TTY OUTPUT + CPOPJ,,OPNL34 ;5 USR DEVICE + CPOPJ,,OPNL34 ;6 DIR "DEVICE" + CLISTA,,OPNL34 ;7 CORE LINK INPUT + STDSTA,,OPNL34 ;10 CORE LINK OUTPUT + CPOPJ,,OPNL34 ;11 DISK + JBSTAT,,OPNL22 ;12 JOB DEVICES (WHYINT SHOULDN'T GET HERE) + CPOPJ,,OPNL34 ;13 BOJ DEVICE + STASTI,,STIWHY ;14 STY INPUT + STASTO,,STOWHY ;15 STY OUTPUT + CPOPJ,,TRPDEV ;16 TRAP DEVICE + CPOPJ,,OPNL34 ;17 DIRHNG DEVICE + CPOPJ,,OPNL34 ;20 SPY DEVICE + CPOPJ,,OPNL34 ;21 LOCK DEVICE +OFFSET -DSTSTB ;BEGIN OPTIONAL DEVICES +IFN KS10P, %%UBI:: CPOPJ,,UBIWHY +IFN NMTCS, %%MT:: STAMTC,,OPNL34 +IFN NUNITS,%%UTP:: CPOPJ,,OPNL34 +IFN OLPTP, %%OLP:: STALPT,,OPNL34 +IFN NCPP, %%NET:: STANET,,NETWHY +IFN TCPP, %%TCP:: TCPSTA,,TCPWHY +IFN INETP, %%IPQ:: IPQSTA,,IPQWHY +IFN CHAOSP,%%CHA:: CPOPJ,,CHAWHY +OFFSET 0 + +;DRFNTB - INDEX FROM DCHSTB +;LH RFNAME ROUTINE, RH RFPNTR ROUTINE OR OPNL34 IF NOT RANDOM ACCESS + +DRFNTB: CPOPJ,,OPNL44 ;0 CHNL NOT OPEN + CPOPJ,,OPNL34 ;1 RANDOM DEVICE + CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE + RCHTTY,,OPNL34 ;3 TTY INPUT + RCHTTY,,OPNL34 ;4 TTY OUTPUT + RCHUSR,,RFPUSR ;5 USR DEVICE + RCHDIR,,OPNL34 ;6 DIR "DEVICE" + RCHCLO,,OPNL34 ;7 CORE LINK INPUT + RCHCLO,,OPNL34 ;10 CORE LINK OUTPUT + RCHQSK,,RFPQSK ;11 DISK + RFNJOB,,RFPJOB ;12 JOB DEVICES + RCHBOJ,,OPNL34 ;13 BOJ DEVICE + RCHSTY,,OPNL34 ;14 STY INPUT + RCHSTY,,OPNL34 ;15 STY OUTPUT + CPOPJ,,CPOPJ ;16 TRAP DEVICE + RCHDRH,,OPNL34 ;17 DIRHNG DEVICE + SPYRCH,,OPNL34 ;20 SPY DEVICE + LCKRCH,,OPNL34 ;21 LOCK DEVICE +OFFSET -DRFNTB ;BEGIN OPTIONAL DEVICES +IFN KS10P, %%UBI:: UBIRCH,,OPNL34 +IFN NMTCS, %%MT:: RCHMGT,,OPNL34 +IFN NUNITS,%%UTP:: RCHUTP,,OPNL34 +IFN OLPTP, %%OLP:: CPOPJ,,OPNL34 +IFN NCPP, %%NET:: NETRCH,,OPNL34 +IFN TCPP, %%TCP:: TCPRCH,,TCPRFP +IFN INETP, %%IPQ:: IPQRCH,,IPQRFP +IFN CHAOSP,%%CHA:: CHARCH,,OPNL34 +OFFSET 0 +IFN <.-DRFNTB>-, .ERR DRFNTB & DSTSTB NOT SAME LENGTH + +DEFINE XX NTIMES,DEVNAM,DN,SNXXX,IDX +IFNB DN, DN==:.-DCHSTB ;CHECK THAT DCHSTB IS IN SAME ORDER AS IOTTB +IFG SIXBIT/DEVNAM/, ZZ==[SIXBIT/DEVNAM/] ;DECIDE WHETHER FITS IN LH +.ELSE [ +IFE SIXBIT/DEVNAM/&777777, ZZ==(SIXBIT/DEVNAM/) +.ELSE ZZ==[SIXBIT/DEVNAM/] +] +REPEAT NTIMES, ZZ,,SNXXX_14+IDX +TERMIN + +DCHSTB: XX 1,,,,0 ;CHNL NOT OPEN + XX 2,TTY,TYIDN,,3 ;TTY INPUT + XX 2,TTY,TYODN,,4 ;TTY OUTPUT + XX 4,NUL,NLIDN,SNNUL,1 ;NUL DEVICE + XX 4,USR,UWIDN,SNUSR,5 ;USR DEVICE + XX 2,USR,FUWIDN,SNFUSR,5 ;FOREIGN USR + XX 1,DIRHNG,DNDIRH,SNDIRH,17 ;DIRHNG + XX 1,TRAP,DNTRAP,SNTRAP,16 ;TRAP + XX 1,LOCK,DNLCK,SNLCK,21 ;LOCK +IFN KS10P, XX 1,UBI,DNUBI,SNUBI,%%UBI ;UBIBUS INTERRUPT +IFN CHAOSP, XX 2,CHAOS,CHAIDN,SNCHA,%%CHA ;CHAOS NET +IFN NUNITS, XX 6,UT,DNUACII,SNUTC,%%UTP ;MICRO TAPE +IFG LPTP-1, XX 2,OLP,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT IN 2-LPT SYSTEM +.ELSE IFN OLPTP, XX 2,LPT,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT +IFN NLPTP, XX 2,LPT,NLPTDN,SNLPV,1 ;"VOGUE" LPT (ACTUALLY ODEC) +IFN GLPTP, XX 2,LPT,GLPTDN,SNLPV,1 ;GOULD LPT + XX 4,DIR,DIRCHN,SNDIR,6 ;DIR "DEVICE" +IFN VIDP, XX 2,NVD,NVIDOP,SNBAT,2 ;VIDISSECTOR +IFN PLTP, XX 2,PLT,PLTDN,SNPLT,1 ;PLOTTER +IFN PTRP, XX 5,PTP,PTPI,SNPTP,1 ;PAPER TAPE PUNCH +IFN IMXP, XX 4,IMX,IMPXDN,SNIMPX,1 ;INPUT A/D MULTIPLEXOR +IFN OMXP, XX 4,OMX,OMPXDN,SNOMPX,1 ;OUTPUT A/D MULTIPLEXOR + XX 3,CLO,DCLUAI,SNCLK,7 ;CORE LINK INPUT + XX 3,CLO,DCLBO,SNCLK,10 ;CORE LINK OUTPUT +IFN PTRP, XX 5,PTR,REDUAI,SNPTR,1 ;PAPER TAPE READER +IFN 340P, XX 4,DIS,DN340B,SN340,2 ;340 DISPLAY +;IFN 340P, XX 1,IDS,DN340I,SN340I,2 ;340 INTERPRETIVE DISPLAY +IFN CODP, XX 2,COD,CODDN,SNCOD,1 ;CODE + XX 6,DSK,DQUAI,SN2311,11 ;DISK +IFN VIDP, XX 4,TVC,DNVDIU,SNBAT,2 ;TV CAMERA +IFN PDP6P, XX 4,PDP,PDPUIO,SNPDP,5 ;PDP-6 DEVICE +IFN TABP, XX 2,TAB,DTABUI,SNTAB,2 ;TABLET +IFN NMTCS, XX 6,MT0,MTUAIX,SNMTC,%%MT ;MAGTAPE + XX 6,JOB,JDUAI,SNJOB,12 ;JOB DEVICES + XX 6,BOJ,BDUAI,SNBOJ,13 ;BOJ DEVICE + XX 1,IIP,IIOPOP,0,2 ;INTERRUPT-ON-IOPOP DEVICE + XX 1,SPY,ISPY,SNSPY,20 ;SPY +REPEAT 2,[ + XX 1,STY,,SNSTY,14 ;STY INPUT + XX 1,STY,,SNSTY,15 ;STY OUTPUT +] +IFN NCPP, XX 4,NET,NETDUI,SNNET,%%NET ; Arpanet NCP +IFN TCPP, XX 4,TCP,TCPDUI,SNTCP,%%TCP ; Internet TCP +IFN INETP, XX 1,IPQ,IPQDN,SNIPQ,%%IPQ ; Internet Queue +IFN MSPP, XX 1,MSP,MSPIO,SNMSP,2 ;MS SWITCH HACK +IFN STKP, XX 1,STK,STKDP,SNSTK,2 ;STANFORD KEYBOARD +IFN NTYP, XX 4,NTY,NTYIT,SNNUL,2 ;NTY 11 KLUDGE + +IFN .-DCHSTB-LIOTTB,.ERR BARF AT DCHSTB +EXPUNGE XX,%%UBI,%%MT,%%UTP,%%OLP,%%NET,%%TCP,%%CHA,%%IPQ + +DCHSTE==.-1 ;END FOR GETSYS (CHDEVS) + +;RSTB - INDEXED BY IOTTB INDEX FROM RH(IOCHNM) +;THIS TABLE IS IN 5-BIT BYTES; THE VALUES ARE THE INDICES +;INTO THE RSTB1 AND DFRCTB TABLES. +.SEE RSTB ;ASSEMBLED SECOND TO GET VALUES OF TEMPORARY %%dev SYMBOLS. + +;RSTB1 - INDEX FROM RSTB (BELOW) +;LH IOPUSH/POP ROUTINE, RH RESET ROUTINE +RSTB1: CPOPJ,,CPOPJ ;0 RANDOM DEVICE + TYIIOP,,TYIRS ;1 TTY INPUT + TYOIOP,,TYORS ;2 TTY OUTPUT + CPOPJ,,USRST ;3 USR DEVICE + CPOPJ,,JBIRS ;4 JOB INPUT + CPOPJ,,JBORS ;5 JOB OUTPUT + IIOPPR,,[JRST 4,CPOPJ] ;6 INTERRUPT ON IOPOP DEVICE + STYIIP,,STYIRS ;7 STY INPUT + STYOIP,,STYORS ;10 STY OUTPUT + CPOPJ,,CPOPJ ;11 DISK OUTPUT + DIRHIP,,CPOPJ ;12 DIRHNG + CPOPJ,,TRPDEV ;13 TRAP + OFFSET -RSTB1 ;OPTIONAL DEVICES BEGIN HERE +IFN KS10P, %%UBI:: UBIIOP,,CPOPJ +IFN OLPTP, %%LPT:: CPOPJ,,LPTRS +IFN NLPTP, %%NLP:: CPOPJ,,NLPTRS +IFN PLTP, %%PLT:: CPOPJ,,PLTRS +IFN PTRP, %%PTR:: CPOPJ,,PTRRS +IFN PTRP, %%PTP:: CPOPJ,,PUNCLR +IFN IMXP, %%IMX:: CPOPJ,,IMPXRS +IFN 340P, %%340:: CPOPJ,,DSIZAP +IFN CODP, %%COD:: CODIOP,,CODRS +IFN PDP6P, %%PDP:: PDPIOP,,PDPRST +IFN TABP, %%TAB:: CPOPJ,,TABCLR +IFN NCPP, %%NET:: NETIOP,,NETRS +IFN TCPP, %%TCP:: TCPIOP,,TCPRST +IFN INETP, %%IPQ:: IPQIOP,,IPQRST +IFN STKP, %%STK:: CPOPJ,,STKRS +IFN CHAOSP,%%CHA:: CHAIOP,,CPOPJ + OFFSET 0 + +;DFRCTB - INDEX FROM RSTB (BELOW) +;LH FORCE ROUTINE, RH FINISH ROUTINE +DFRCTB: OPNL34,,OPNL34 ;0 RANDOM DEVICE + OPNL2,,OPNL2 ;1 TTY INPUT (ILLEGAL) + POPJ1,,TTYFIN ;2 TTY OUTPUT + OPNL34,,OPNL34 ;3 USR + OPNL2,,OPNL2 ;4 JOB (SHOULDN'T GET HERE?) + OPNL22,,OPNL22 ;5 JOB (SHOULDN'T GET HERE?) + OPNL22,,OPNL22 ;6 IIP (SHOULDN'T GET HERE) + OPNL2,,OPNL2 ;7 STY INPUT (ILLEGAL) + POPJ1,,STYFIN ;10 STY OUTPUT + QSKFRC,,QSKFIN ;11 DISK OUTPUT + OPNL34,,OPNL34 ;12 DIRHNG + TRPDEV,,TRPDEV ;13 TRAP + OFFSET -DFRCTB ;OPTIONAL DEVICES BEGIN HERE +IFN KS10P, %%UBI:: OPNL34,,OPNL34 +IFN OLPTP, %%LPT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE +IFN NLPTP, %%NLP:: POPJ1,,POPJ1 ;NEED TO WRITE THESE +IFN PLTP, %%PLT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE +IFN PTRP, %%PTR:: OPNL34,,OPNL34 +IFN PTRP, %%PTP:: POPJ1,,PUNFIN +IFN IMXP, %%IMX:: OPNL34,,OPNL34 +IFN 340P, %%340:: OPNL34,,OPNL34 +IFN CODP, %%COD:: POPJ1,,CODFIN +IFN PDP6P, %%PDP:: OPNL34,,OPNL34 +IFN TABP, %%TAB:: OPNL34,,OPNL34 +IFN NCPP, %%NET:: NETFRC,,NETFIN +IFN TCPP, %%TCP:: TCPFRC,,TCPFIN +IFN INETP, %%IPQ:: IPQFRC,,IPQFIN +IFN STKP, %%STK:: OPNL34,,OPNL34 +IFN CHAOSP,%%CHA:: CHAFRC,,CHAFIN + OFFSET 0 + +;TABLE OF INDICES INTO THE RSTB1, DFRCTB TABLES ON THE PRECEDING PAGE +;THESE INDICES ARE UNRELATED TO THE INDICES IN DCHSTB A COUPLE PAGES BACK. +;NOTE THAT THE %% SYMBOLS ARE PURELY TEMPORARY AND EXPUNGED AT THE BOTTOM OF THIS PAGE. + +RSTB: .BYTE 5 + + 0 ;CHNL NOT OPEN + REPEAT 2,1 ;TTY INPUT + REPEAT 2,2 ;TTY OUTPUT + REPEAT 4,0 ;NUL DEVICE + REPEAT 4,3 ;USR DEVICE + REPEAT 2,0 ;FOREIGN USR + 12 ;DIRHNG + 13 ;TRAP + 0 ;LOCK +IFN KS10P, %%UBI ;UNIBUS INTERRUPT +IFN CHAOSP, REPEAT 2,%%CHA +IFN NUNITS, REPEAT 6,0 ;DEC TAPE +IFN OLPTP, REPEAT 2,%%LPT +IFN NLPTP, REPEAT 2,%%NLP +IFN GLPTP, REPEAT 2,0 + REPEAT 4,0 ;DIR "DEVICE" +IFN VIDP, REPEAT 2,0 +IFN PLTP, REPEAT 2,%%PLT +IFN PTRP, REPEAT 5,%%PTP +IFN IMXP, REPEAT 4,%%IMX +IFN OMXP, REPEAT 4,0 + REPEAT 6,0 ;CORE LINK. +IFN PTRP, REPEAT 5,%%PTR +IFN 340P, REPEAT 4,%%340 +;IFN 340P, 0 +IFN CODP, REPEAT 2,%%COD ;CODE + REPEAT 3, 0 ? 11 ;DISK IN, DISK OUT +IFN VIDP, REPEAT 4,0 +IFN PDP6P, REPEAT 4,%%PDP ;PDP-6 DEVICE +IFN TABP, REPEAT 2,%%TAB +IFN NMTCS, REPEAT 6,0 ;MAGTAPE + REPEAT 3,[4 + 5 + ] ;JOB + REPEAT 3,[0 ;BOJ INPUT + 0 ;BOJ OUTPUT + ] ;BOJ + 6 ;INTERRUPT ON IOPOP DEVICE + 0 ;SPY + 7 ? 10 ? 7 ? 10 ;PSEUDO-TTY +IFN NCPP, REPEAT 4,%%NET ;NET RESET INR/INS +IFN TCPP, REPEAT 4,%%TCP ; TCP RESET +IFN INETP, %%IPQ ; Internet Queue +IFN MSPP, 0 ;MS SWITCH HACK +IFN STKP, %%STK ;STANFORD KEYBOARD +IFN NTYP, REPEAT 4,0 ;NTY 11 KLUDGE + +IFN LIOTTB-.BYTC,.ERR BARF AT RSTB + .BYTE +EXPUNGE %%UBI,%%LPT,%%NLP,%%PLT,%%PTR,%%PTP,%%IMX,%%340,%%COD,%%PDP,%%TAB,%%NET,%%TCP,%%STK,%%CHA,%%IPQ + +DEFINE DVHR X,Y +X!Y!TERMIN + +DEFINE DV NAME,OPNRTE,BITS,TAG + SIXBIT/NAME/ +DVHR [DEFINE DVHR X,Y +X!][TAG BITS,,OPNRTE +Y!TERMIN] +TERMIN + +;DEVICE TABLES FOR AOPEN +; +;DEVTAB SIXBIT NAME +;DEVADR + %DVIN==400000 ;4.9 DEVICE CAN DO INPUT + %DVOUT==200000 ;4.8 DEVICE CAN DO OUTPUT + %DVDIR==100000 ;4.7 DEVICE CAN GIVE DIRECTORY + %DVDEL==40000 ;4.6 ALLOW DELETE/RENAME + %DVLNK==20000 ;4.5 ALLOW MLINK + ;RIGHT HALF, OPEN ROUTINE ADDRESS +%DV==1,,520000 ;BIT TYPEOUT MASK + +DEVTAB: +IFN NLPTP, DV LPT,NLPTO,%DVOUT +IFG OLPTP-NLPTP,DV LPT,LPTO,%DVOUT +IFG LPTP-1, DV OLP,LPTO,%DVOUT +IFN GLPTP, DV LPT,GLPTO,%DVOUT +IFN TTLPTP, DV LPT,LPTO,%DVOUT + + DV DSK,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAQSK: + DV COM,COMO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK + MNAME [ DV ],QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;"AI:" ON + ; AI, ETC. + DV SYS,SYSO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK + DV DNRF,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE + DV DNR,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE + DV DIRHNG,DIRHO,%DVIN + DV TRAP,TRPDEV,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK + DV LOCK,LCKO,%DVOUT + DV UBI,UBIO,%DVIN + DV TTY,TTYO1,%DVIN+%DVOUT+%DVDIR + DV NUL,NULO,%DVIN+%DVOUT + DV USR,USRO,%DVIN+%DVOUT +IFN VIDP, DV NVD,NVIDI,%DVIN+%DVOUT +IFN CHAOSP, DV CHAOS,CHASO,%DVIN+%DVOUT +IFN NCPP, DV NET,NETO,%DVIN+%DVOUT +IFN TCPP, DV TCP,TCPO,%DVIN+%DVOUT +IFN INETP, DV IPQ,IPQO,%DVIN+%DVOUT +IFN MSPP, DV IPC,IPCO,%DVIN+%DVOUT + DV STY,STTYO,%DVIN+%DVOUT + DV JOB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAJOB: + DV BOJ,BOJO,%DVIN+%DVOUT + DV OJB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK +IFN STKP, DV STK,STKO,%DVIN +IFN PLTP, DV PLT,PLOTO,%DVOUT +IFN PLTP, DV IPL,IPLO,%DVOUT ;INTERPRETED PLOTTER +IFN XGP, DV XPL,XPLO,%DVOUT +IFN IMXP, DV IMX,IMPXO,%DVIN +IFN OMXP, DV OMX,OMPXO,%DVOUT +IFN PTRP, DV PTR,PTRO,%DVIN +IFN PTPP, DV PTP,PTPO,%DVOUT +IFN 340P, DV DIS,DISO,%DVOUT ;340 AS OUTPUT DEVICE +;IFN 340P, DV IDS,IDISO,%DVOUT ;340 AS INTERPRETED DISPLAY + DV CLU,CLUO,%DVIN+%DVOUT+%DVDIR+%DVDEL + DV CLO,CLOO,%DVIN+%DVOUT+%DVDIR+%DVDEL + DV CLI,CLIO,%DVOUT+%DVDIR+%DVDEL + DV CLA,CLAO,%DVIN+%DVDIR+%DVDEL +IFN CODP, DV COD,CODO,%DVOUT +IFN VIDP, DV TVC,TVCO,%DVIN+%DVOUT + DV ERR,ERRO,%DVIN +IFN TPLP+TTLPTP&DEMON, DV TPL,TPLO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK +IFN TABP, DV TAB,TABO,%DVIN + DV SPY,SPYO,%DVIN + DV COR,CORO,%DVDIR ;DIR=LAST LINE OF TTY^F +IFN NTYP, DV NTY,NTYOPN,%DVIN+%DVOUT ;NTY 11 KLUDGE + +NDEVS==.-DEVTAB + +DVT1: DV TTY,TTYO,%DVIN+%DVOUT+%DVDIR + DV TY,TTYO,%DVIN+%DVOUT+%DVDIR + DV T,TTYO,%DVIN+%DVOUT+%DVDIR +IFN NUNITS, DV UT,UTO,%DVIN+%DVOUT+%DVDIR+%DVDEL,DVAUT: + DV STY,STTYOA,%DVIN+%DVOUT + DV ST,STTYOA,%DVIN+%DVOUT + DV S,STTYOA,%DVIN+%DVOUT + DV DSK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT + DV DK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT + DV PK,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK + DV P,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK +IFN NMTCS, DV MT,MAGTO,%DVIN+%DVOUT ;MAGTAPE + +NDV1==.-DVT1 +EDEVS==.-1 ;END FOR GETSYS (DEVS) + +DEVADR: DVHR +IFN .-DEVADR-NDEVS-NDV1,.ERR DVHR LOST + +SUBTTL .OPER, .CALL DISPATCH + +AOPER: MOVE J,R ;AC FIELD OF UUO + ADDI R,IOCHNM(U) ;SET UP IO CHANNEL REFERENCE POINTER + CAIL C,MXOPR ;SKIP IF UUO E FIELD IS LESS THAN MAX OPR + JRST ILUUO ;ILLEGAL OPER + JRST @OPRDSP(C) ;LEGAL OPER-- DISPATCH ON E FIELD OF UUO + +OPRDSP: ILUUO + OPRIRP A!X ;AITYI,ALISTEN,ASLEEP,ETC. + +; +;CALL DISPATCH +; +ACALL: MOVE B,C ;SET UP COPY OF ERR ADR NOT TO BE RELOCATED + JRST @CALDIS(R) ;DISPATCH INDEX OF UUO'S AC FIELD + +CALDIS: ASYSC + ADISMIS + ALOSE + ATRANAD + AVALRET ;4 + AUTRAN + UACORE + ATRNDL + ADSTART ;10 + AFDELE + ADSTL + ASUSET + ALTPEN ;14 + AVSCAN + APOTSET +REPEAT 20-.+CALDIS,ILUUO + +SUBTTL MISCELLANEOUS UUO'S + +;SHUT DOWN SYSTEM + +ASHUTD: UMOVE C,(J) ;Arg is time to down in thirtieths. + JUMPL C,AREVIV ;Negative time means REVIVE. + CAMG C,[43200.*30.*60.] ;If time is longer than thirty days + CAIGE C,5*60.*30. ; or less than five minutes + POPJ P, ; Fail (prevent clock delta-T from losing). + ADD C,TIME ;Interval+now is when we will die. + PUSHJ P,SWTL ;Seize shutdown lock. + SHUTLK + SKIPGE SHUTDN ;Already down? + JRST LSWPOP ; Yes. + PUSHJ P,CLQDEL ;Flush obsolete clock queue entry, if any. + DEDBLK + MOVEM C,SHUTDN ;Remember time we will die. + SUB C,TIME ;Interval until death. + LSH C,1 ;Time till death after next clock-queue int. + MOVEM C,DEDTIM ;Remember time until death. + PUSHJ P,DEATHX ;Make DEATH entry on clock queue. + BUG ; DEDTIM says time to die already? + JRST LSWPJ1 ;Unlock shutdowns. + +;READ TIME TILL SYSTEM DOWN + +ADIETI: XCTR XW,[SETOM (J)] ;READ -1 IF NOT GOING DOWN + SKIPG A,SHUTDN + POPJ P, ;NOT DYING + SUB A,TIME + JRST APTUAJ ;GIVE TO USER + +;REVIVE SYS + +AREVIV: PUSHJ P,SWTL + SHUTLK + SKIPN SHUTDN + JRST LSWPOP ;NOT DYING + PUSHJ P,CLQDEL + DEDBLK + SETZM SHUTDN + SETZM DEDTIM + PUSHJ P,DEATHM + JRST LSWPOP + +;FROM CLOCK QUEUE BLOCK + +DEATHZ: PUSHJ P,DEATHX + SKIPA + JRST CLQRET + MOVSI T,SCLOUT + PUSHJ P,SUPSET ;DIE + SETOM DEDTIM + JRST CLQRET + +;GET VARIOUS SYS STATUS + +ASSTAT: CONO PI,CLKOFF + SKIPLE A,SHUTDN + SUB A,TIME + SKIPG SHUTDN + SUBI A,1 ;TIME TILL DOWN IF > 0, -1 IF UP, -2 IF DOWN + CONO PI,CLKON + MOVE B,SYSDBG + MOVE C,SUSRS + MOVE D,PARERR + ADD D,NXMERR + MOVE E,TIME + MOVE TT,[ITSMCH] ;SIXBIT NAME OF THIS MACHINE. + MOVE I,[ITSVRS] + MOVN Q,USRHI ;Q GETS NUMBER OF FREE JOB SLOTS + IDIVI Q,LUBLK + ADDI Q,MAXJ + MOVE J,USRHI +ASSTT1: SUBI J,LUBLK + SKIPN UNAME(J) + ADDI Q,1 + JUMPG J,ASSTT1 + JRST POPJ1 + +SUBTTL SYMBOLIC SYSTEM CALL HANDLER + +;IN ORDER @A...Z[\]^_ !".../0...9:;,=.? (THAT IS IN NUMERICAL ORDER) + +SYSCTB: SIXBIT /ACCESS/ ;IOCHNL, ADR + SIXBIT /ATTACH/ + SIXBIT /ATTY/ + SIXBIT /CALL/ ;SIXBIT // +IFN CHAOSP,[ + SIXBIT /CHAOSO/ + SIXBIT /CHAOSQ/ +];CHAOSP + SIXBIT /CLOSE/ ;IOCHNL + SIXBIT /CNSGET/ ;GET SEMIPERMANENT TTY INFO + SIXBIT /CNSSET/ ;SET SEMIPERMANENT INFO (TCMXH, TCTYP, TTYOPT, TTYCOM, ETC) + SIXBIT /CORBLK/ ;HACK PAGE MAP + SIXBIT /CORTYP/ ;READ STATUS OF PAGE. + SIXBIT /DELETE/ ;FILE DELETE + SIXBIT /DELEWO/ ;DELETE FILE OPEN ON SPEC'D CHANNEL +IFN DEMON,SIXBIT /DEMSIG/ ;SIGNAL DAEMON + SIXBIT /DETACH/ ;DISOWN ENTIRE TREE + SIXBIT /DIRSIZ/ + SIXBIT /DISMIS/ + SIXBIT /DISOWN/ ;DISOWN AN INFERIOR JOB +IFN DL10P, SIXBIT /DL10MP/ + SIXBIT /DSKUPD/ ;SIMULATE REFERENCE OF FILE + SIXBIT /ECHOIN/ ;ECHO-NEGOTIATE + SIXBIT /FILBLK/ ; READ NAME AREA OF FILE + SIXBIT /FILLEN/ ;READ FILE LENGTH + SIXBIT /FINISH/ + SIXBIT /FLAP/ ;TAPE # + SIXBIT /FLUSH/ ;OLD NAME FOR FINISH, EVENTUALLY " + SIXBIT /FORCE/ + SIXBIT /IOPOP/ + SIXBIT /IOPUSH/ + SIXBIT /IOT/ ;IOCHNL, QUAN OR BLK POINTER +IFN INETP,SIXBIT /IPKIOT/ + SIXBIT /ITYIC/ + SIXBIT /JOBCAL/ ;GENERAL JOBGET + SIXBIT /JOBGET/ ;JOB CHNL + SIXBIT /JOBINT/ ;JOB CHNL + SIXBIT /JOBIOC/ + SIXBIT /JOBRET/ ;JOB CHNL + SIXBIT /JOBREU/ + SIXBIT /JOBSTS/ ;SET JOB CHNL STATUS +IFN KL10P,SIXBIT /KLPERF/ ;ACTIVATE & CONTROL PERFORMANCE METER + SIXBIT /LISTEN/ ;IOCHNL, ADR + SIXBIT /LNKEDP/ ;DISK CH. RETURNS NONZERO IF LINKS WERE TRACED TO OPEN IT. + SIXBIT /LOAD/ ;USER CH, I/O CH, VARBLK + SIXBIT /LOGIN/ ;SIXBIT // + SIXBIT /LOGOUT/ ;. . . + SIXBIT /LOSE/ + SIXBIT /MLINK/ ;MAKE LINK +IFN NCPP, SIXBIT /NETAC/ + SIXBIT /NETBLK/ ;HANG ON NCP STATE +IFN IMPP,[ + SIXBIT /NETHST/ ;GETS STATUS OF HOST + SIXBIT /NETIMP/ ;GETS STATUS OF IMP +];IMPP +IFN NCPP, SIXBIT /NETINT/ +IFN INETP,[ ; A temporary cond, should become permanent. + SIXBIT /NETRFC/ ; Get pending request for connection +] + SIXBIT /OPEN/ ;FILE OPEN + SIXBIT /PDUMP/ ;USER CH, I/O CH, VARBLK + SIXBIT /PGDUMP/ ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE + SIXBIT /PGWRIT/ ;DUMP PAGE OUT OF CORE +IFN CHAOSP, SIXBIT /PKTIOT/ +IFN QAUTHP, SIXBIT /RAUTH/ ;READ AUTHOR OF FILE + SIXBIT /RCHST/ ;READ OPENED FILENAMES & ACCESS POINTER + SIXBIT /RCPOS/ ;READ CURSOR POS +IFN DEMON,SIXBIT /RDDMST/ ;READ DEAMON STATUS + SIXBIT /RDMPBT/ ;READ FILE DUMPED BIT IOCHN, ADR + SIXBIT /RELOAD/ + SIXBIT /RENAME/ ;FILE RENAME + SIXBIT /RENMWO/ ;RENAME WHILE OPEN + SIXBIT /REOWN/ + SIXBIT /RESET/ + SIXBIT /RESRDT/ ;RESTORE REFERENCE DATE + SIXBIT /RFDATE/ ;READ TIME OF CREATION OF FILE IOCHN, ADR + SIXBIT /RFNAME/ ;READ FILE NAME AND MODE CHANNEL OPEN TO + SIXBIT /RFPNTR/ ;READ ACCESS POINTER + SIXBIT /RQDATE/ ;READ DSK DATE + SIXBIT /RSSIZE/ ;READ SCREEN SIZE +IFN QAUTHP, SIXBIT /SAUTH/ ;SET AUTHOR OF FILE + SIXBIT /SCML/ ;SET # COMMAND LINES + SIXBIT /SCPOS/ ;SET TTY CURSOR POSITION + SIXBIT /SDMPBT/ ;SET FILE DUMPED BIT IOCHN, ADR + SIXBIT /SETIOC/ ;CAUSE IO CHANNEL ERROR IN JOB/BOJ CHANNEL + SIXBIT /SFDATE/ ;SET TIME OF CREATION OF FILE IOCHN, ADR + SIXBIT /SIOT/ ;IOT A STRING GIVEN B.P. AND LENGTH + SIXBIT /SOPEN/ ;OPEN, TAKING MODE,,CHNL AND BP. + SIXBIT /SRDATE/ ;SET REFERENCE DATE + SIXBIT /SREAPB/ ;SET THE DO NOT REAP BIT + SIXBIT /SSERVE/ ;Set .SERVER without timing errors + SIXBIT /SSTATU/ ;READS VARIOUS SYSTEM STATUS + SIXBIT /STATUS/ +IFN DEMON,SIXBIT /STDMST/ ;SET DEAMON STATUS + SIXBIT /STLGET/ ;GET INFO ON SERVER TELNET CONTROLLING A STY + SIXBIT /STYGET/ ;GET INFO ABOUT SPECIFIED STY +IFN NETP,SIXBIT /STYNET/ ;CONNECT STY TO NETWORK SOCKETS, FOR TELNET SERVERS. + SIXBIT /T11MP/ ;TEMP ? TEN11 HACKER +IFN TCPP,SIXBIT /TCPOPN/ ; Open TCP Internet connection + SIXBIT /TRANAD/ ;CREATE TRANSLATION ENTRY + SIXBIT /TRANCL/ ;CLEAR TRANSL. LIST(S) FOR A JOB. + SIXBIT /TRANDL/ ;DELETE A TRANSL. ENTRY. + SIXBIT /TRANEX/ ;READ A JOB'S TRANSL. LIST. + SIXBIT /TRANS/ ;TRANSLATE A FILENAME. + SIXBIT /TRPOPN/ ;OPEN TRAP DEVICE FOR AN INFERIOR + SIXBIT /TTYESC/ ;SIMULATE TYPING OF ^_ + SIXBIT /TTYFLS/ ;FLUSH ITYIC'ED INPUT + SIXBIT /TTYGET/ ;SUPPLY TTY CH, RETURNS THREE WORDS OF TTY STATUS + SIXBIT /TTYSET/ ;SUPPLY TTY CH AND THREE WORDS OF TTY STATUS + SIXBIT /TTYVAR/ ;HACK TTY VARIABLES + SIXBIT /TVWHER/ + SIXBIT /UNLOCK/ ;UNLOCK A SPEC'D JOBS LOCKS. + SIXBIT /USRMEM/ ;READ OR WRITE A JOB'S MEMORY. + SIXBIT /USRVAR/ ;HACK USER VARIABLES + SIXBIT /VIDBUF/ ;ASSIGN/DEASSIGN VIDEO BUFFER. + SIXBIT /VIDSW/ ;SET VIDEO SWITCH. + SIXBIT /WHOLIN/ ;GET OR SET WHO-LINE MODE AND JOB. + SIXBIT /WHYINT/ ;FIND OUT WHY AN I/O CHANNEL INTERRUPTED + SIXBIT /XGPIM/ ;OUTPUT TO XGP IN IMAGE MODE +LSYSCT==:.-SYSCTB + +ZZ==.-SYSCTB-1 +RADIX 2 +ZZ2==CONC [.LENGTH /]\ZZ,/ +RADIX 8 +REPEAT 1_-ZZ-1,377777,,-1 +;4.X BIT IMPLIES SUPPLY ROUTINE WITH POINTER TO X'TH ARG, NOT ARG ITSELF +;3.9-3.7 = MINIMUM NUMBER OF ARGS +;3.1 => DECODE 1ST ARG AS IO CHNL, LEAVING IOCHNM WD ADDR IN RH(R), +; IOCHNM WD CONTENTS IN H, CLSTB ENTRY'S LH IN LH(R). +;3.2 => NEVER PASS TO SPECIAL CHECKER FOR JOB CHNL +;3.3 => DON'T BARF IF CHNL NOT OPEN, CALLED ROUTINE WILL HANDLE IT + +;# ARGS ACTUALLY SUPPLIED IN W WHEN DISPATCHING THRU SYSCTD, ARGS IN A...J +SYSCTD: 200,,NACCES + 100,,NATTAC + 100,,NATTY + 100,,NCALL +IFN CHAOSP,[ + 200,,CHAOSO + 100,,CHAOSQ +];CHAOSP + 100,,NCLOSE(7) + 100,,NCNSGET + 100,,NCNSSET + 24300,,NCORBL + 100,,NCORTY + 100,,NDEL + 100,,DELEWO(1) +IFN DEMON,100,,ADEMSIG + NDETAC + 100,,NDIRSIZ(1) + 1100,,NDISMIS + 100,,NDISOWN +IFN DL10P, 100,,DL10MP + 100,,ADSKUP(1) + 6500,,NECHOIN(1) + 100,,NFILBLK(1) + 100,,NFILLEN(1) + 100,,NFINIS(1) +IFN NUNITS, 100,,NFLAP +IFE NUNITS, 100,,OPNL1 + 100,,NFINIS(1) ;OLD NAME FOR FINISH, EVENTUALLY FLUSH + 100,,NFORCE(1) + 100,,NIOPOP(7) + 100,,NIOPUS(7) + 2100,,NIOT(7) ;(7) FOR CHNL NOT OPEN TO BE IOC ERROR, (3) TO BE OPEN LOSS +IFN INETP, 100,,IPKIOT(1) ; Requires at least 1 arg + 100,,NITYIC + 100,,NJBCL(1) + 100,,NJBGT(1) + 100,,NJBINT(1) + 100,,NSTIOC(1) + 100,,NJBRT(1) + 20500,,NJBREU + 100,,NJBSTS(1) +IFN KL10P,KLPERF + 100,,NLISTE + 100,,NLNKEDP(1) + 200,,NLOAD + 200,,NLOGIN + ALOGOU + 100,,NLOSE + 200,,NMLINK +IFN NCPP, 100,,ANETAC(1) +IFE INETP,[ +IFE CHAOSP, 4200,,ANETBLK(1) +IFN CHAOSP, 4200,,CHANBK(1) +] +IFN INETP, 4200,,NETBLK(1) ; Block (.hang) on net I/O channel +IFN IMPP,[ + 100,,ANETHST + ANETIMP +];IMPP +IFN NCPP, 100,,NNETINT(1) +IFN INETP, 100,,NETRFC + 200,,NOPEN + 4300,,PDUMP + 100,,NPGWRT ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE + 100,,NPGWRT +IFN CHAOSP, 200,,PKTIOT(1) +IFN QAUTHP, 100,,ARAUTH(1) + 100,,NRCHST + 100,,ARCPOS +IFN DEMON,100,,ARDDMST + 100,,NRDMPBT(1) + 000,,NRELOAD + 200,,NRNAM + 200,,NRNWO + 100,,NREOWN(3) + 100,,NRESET(7) + 100,,NRESRDT(1) + 100,,NRFDATE(1) + 100,,NRFNAM + 100,,NRFPNT(3) + ARQDAT + 100,,ARSSIZ +IFN QAUTHP, 200,,ASAUTH(1) + 200,,ASCML + 100,,NSCPOS + 200,,NSDMPBT(1) + 200,,NSTIOC(1) + 200,,NSFDATE(1) + 6300,,NSIOT(7) ;(7) FOR IOC ERROR IF CHNL NOT OPEN, (3) FOR OPEN LOSS + 200,,NSOPEN + 200,,NSRDATE(1) + 100,,ASREAP(1) + 100,,NSSERV + ASSTAT + 100,,NSTATUS(7) +IFN DEMON,100,,ASTDMST + 100,,NSTLGT + 100,,NSTYGT +IFN NETP,200,,NSTYNT(3) + 200,,NT11M +IFN TCPP,500,,TCPOPN + 300,,NTRNAD + 100,,NTRNCL + 200,,NTRNDL + 200,,NTRNEX + 100,,NTRNS + 200,,TRPOPN + 100,,NTTYESC + 100,,NTTYFLS + 100,,ATTYGT + 300,,ATTYST + 2200,,NTTYVA + 100,,NTVWHERE + 100,,NUNLOCK + 2200,,NUSRME + 2200,,NUSRVA + 100,,NVDBF + 200,,NVIDSW + 100,,NWHOLI + 100,,NWHYINT(1) + 1100,,NXGPIM + +IFN .-SYSCTD-1-ZZ,.ERR NEW SYS CALL DISPATCH LOSES!!! + +REPEAT 1_-ZZ-1,ILUUO + +;.CALL ADR1 SKIPS UNLESS SOMETHING WRONG +;ADR1: SETZ +; SIXBIT // +; REPEAT #ARGS,BITS,,
+; BITS= 4.9 => LAST ARG +; 4.3 - 4.1 0 = NORMAL ARG +; 1 = IMMEDIATE +; 2 = OUTPUT ARG +; 3 = RETURN THE FAILURE CODE IF FAIL +; 4 = WORD OF CONTROL BITS +; 5 = IMMEDIATE CONTROL BITS + +ASYSC: PUSHJ P,ASCGRG ;B HAS E OF UUO + JRST OPNL43 ;CALL NAME UNKNOWN. + JRST OPNL15 ;MORE THAN 8 ARGS + JRST OPNL30 ;TOO FEW ARGS + PUSHJ P,ASYSC1 ;DISPATCH TO ROUTINE. + POPJ P, ;NO SKIP - OPENL HAS ALREADY BEEN CALLED. + AOS (P) ;SKIP - PROPAGATE THE SKIP UP THE PDL + MOVE U,USER ;!! + MOVE R,SYSCVL(U);SUCCESS RETURN, ZERO ERROR CODE ARG IF ANY + TLNE R,%SCVER + XCTR XW,[SETZM (R)] + JUMPGE R,CPOPJ ;JUMP IF NO OUTPUT VALUES WANTED +SYSCPT: HRRZ W,FORTY ;VALUES WANTED, PUT INTO USER MEMORY FROM ACS + ADDI W,2 + MOVSI T,-8 +SYSCP2: UMOVE R,(W) + TLNN R,1000 + TLNN R,2000 + JRST SYSCP3 + PUSHJ P,ASCIND + MOVE J,1(T) + UMOVEM J,(R) + AOBJP T,CPOPJ +SYSCP3: JUMPL R,CPOPJ + AOJA W,SYSCP2 + +ASYSC1: MOVE T,SYSCTD(H) + TLNN T,1 ;DECODE 1ST ARG AS IO CHNL? + JRST (T) ;NO, DISPATCH TO CALL. + TLNE T,2 ;OK TO GIVE TO JOB CHNL CHECKER? + JRST CHNDCD ;NO - GO DECODE CHANNEL + HRL J,T ;SAVE DISPATCH ADDR + HRRI T,AIOCAL ;MAKE DECODER RETURN TO CHECK FOR JOB DEVICE + JRST CHNDCD + +NCALL: MOVE T,A + MOVE R,[B,,A] + BLT R,A+6 + SETZM A+7 ;MAX 8 ARGS, 1 USED FOR NAME + SOS W + PUSHJ P,ASCRCH + JRST OPNL43 + MOVEI J,ASYSC+2 ;LOOK LIKE PUSHJ'ED FROM ASYSC + MOVEM J,(P) + LDB J,[331000,,SYSCTD(H)] + JUMPE J,NCALL2 + AOS B,FORTY + JRST NCALL3 ;HE WANTS POINTERS, WE HAVE JUST VALUES. + ;MUST GET ARGS AGAIN + +ASCRCH: MOVEI H,0 + REPEAT ZZ2,[CAML T,SYSCTB+1_(H) + ADDI H,1_ + ] + CAMN T,SYSCTB(H) + AOS (P) + POPJ P, + +;JSP T,HERE TO DECODE IO CHNL IN A, MODIFIERS IN 3.1-3.3 OF T. +;IF RH(T) = AIOCAL, LH(J) IS REAL RETURN ADDRESS. +;RETURNS IOCHNM ADDR IN RH(R), IOCHNM WD CONTENTS IN H, CLSTB BITS IN LH(R) +;CAN POPJ OUT FOR INVALID CHANNEL. + +CHNDCD: TRNE A,-NIOCHN ;IS 1ST ARG A LEGAL CHNL NUM? + JRST OPNL14 + CAMN U,USER + HRROM A,UUAC(U);REMEMBER CHNL # FOR IOC ERRORS, ETC. + MOVEI R,(A) + ADDI R,IOCHNM(U) ;YES, COMPUTE IOCHNM WD ADDR + MOVE H,(R) ;RETURN CONTENTS IN H. + HLL R,CLSTB(H) ;RETURN CLSTB BITS IN LH(R). + TLNE R,%CLST + JRST [ CAME U,USER ;TRAP DEVICE + JRST .+1 ;IF CHANNEL BELONGS TO THIS USER, TRAP + JRST TRPDEV ] ;OTHERWISE, IS PROBABLY RFNAME, LET IT THROUGH + TRNN H,-1 ;IF CHNL NOT OPEN + TLNE T,4 ;AND NOT SPECIALLY OK FOR THIS SYSTEM CALL + JRST (T) + JRST OPNL44 ;THEN BARF + +;JOB DEVICE CHECKER - PUT AIOCAL IN RH(T), JRST CHNDCD + +AIOCAL: HLRZ T,J ;GET DISPATCH ADR BACK + TLNN R,%CLSJ ;IS CHANNEL JOB DEVICE? + JRST (T) ;NO - DISPATCH + HLRZS H ;ISOLATE JOB DEVICE INDEX + DPB W,[230400,,JBSTS(H)] ;SAVE ARG COUNT + MOVNS W + HRLZS W + HRRI W,1 ;NOW HAVE AOBJN PNTR TO DATA + MOVE T,(W) ;COPY ARGS TO JOB AC TABLES + MOVEM T,@JBACTB-1(W) + AOBJN W,.-2 + MOVEI W,10 ;SET NON-STANDARD OP-CODE + HRRM W,JBSTS(H) + MOVE E,H ;PUT JOB INDEX IN E FOR JBWT + CONO PI,CLKOFF +AIOCA1: PUSHJ P,JBWT ;WAIT FOR JOB TO ANSWER + MOVE H,E ;GET JOB INDEX BACK IN H (FOR JBACTB) + MOVE W,[-8,,1] ;LOAD ANSWERS INTO ACS + MOVE T,@JBACTB-1(W) + MOVEM T,(W) + AOBJN W,.-2 + LDB T,[350400,,JBSTS(H)] ;GET SKIP COUNT + JUMPN T,POPJ1 ;SKIP COUNT NOT ZERO - SKIP + LDB C,[270600,,JBSTS(H)] ;GET OPEN LOSS CODE + SKIPE C ;MAKE SURE IN BOUNDS + CAILE C,NOPNLS + MOVEI C,22 + JRST OPNL1-1(C) ;GO REPORT LOSSAGE AND DON'T SKIP + +;SYSTEM CALL GET ARGS +ASCGRG: UMOVE T,(B) + CAME T,[SETZ] + JRST ILUUO + UMOVE T,1(B) + MOVEM T,LSCALL(U) + PUSHJ P,ASCRCH + POPJ P, ;CALL NAME UNRECOGNIZED. + AOS (P) + LDB J,[331000,,SYSCTD(H)] ;GET BITS CORRESP TO ARGS WHICH SAY SUPPLY PNTR TO NTH ONE +NCALL3: MOVEI W,2(B) + MOVE T,[-9,,A] + SETZM CTLBTS(U) +ASYSC2: UMOVE R,(W) + TLNE R,37 + PUSHJ P,ASCIND ;CALC EFFECTIVE ADDRESS + TLNE R,2000 + JRST ASYSC3 ;OUTPUT OR ERRORCODE ARG + TLNE R,4000 + JRST ASYSC5 ;CONTROL BITS + AOBJP T,CPOPJ + ROT J,-1 + JUMPL J,ASYSC7 ;J IF WANT ADDRESS, NOT VALUE + TLNE R,1000 + TLZA R,-1 ;IMMEDIATE, GET 0,,ADR + UMOVE R,(R) ;ELSE GET WORD POINTED TO +ASYSC7: MOVEM R,-1(T) ;PUT INTO AC + JRST ASYSC4 + +ASYSC5: TLNE R,1000 ;CTL BITS + TLZA R,-1 ;IMMEDIATE, GET 0,,ADR + XCTR XR,[HRRZ R,(R)] ;ELSE WORD ADDRESS + XORM R,CTLBTS(U) ;XOR ALL THESE ARGS TOGETHER +ASYSC4: XCTR XR,[SKIPL (W)] ;SKIP IF TERMINATE BIT ON + AOJA W,ASYSC2 + HLRE W,T + ADDI W,9 ;COMPUTE NUMBER OF ARGUMENTS SUPPLIED +NCALL2: LDB T,[300300,,SYSCTD(H)] + SUB T,W + JUMPG T,POPJ1 ;NOT ENOUGH ARGS + JRST POPJ2 ;OK + +ASYSC3: TLNE R,1000 + JRST ASYSC8 ;ERROR CODE ARG + XCTR XRW,[MOVES (R)] ;OUTPUT ARG, JUST MAKE SURE IT'S THERE + MOVSI R,%SCVOT ;AND FLAG PRESENCE +ASYSC9: IORM R,SYSCVL(U) + JRST ASYSC4 + +ASYSC8: HRLI R,%SCVER ;ERROR-CODE ARG + TDNE R,SYSCVL(U);CAN'T HAVE MORE THAN ONE ERRORCODE ARG + JRST CPOPJ ;SAY "TOO MANY ARGS" + XCTR XRW,[MOVES (R)] ;MAKE SURE IT'S THERE; MUSTN'T PCLSR OUT OF OPENL + JRST ASYSC9 + +;PERFORM INDEXING AND INDIRECTION ON ADDRESS WORD IN R. +;DON'T CLOBBER BITS 3.6 - 4.9. SET BITS 3.1 - 3.5 TO ZERO +;PUT ADDR IN RH. +ASCIND: TLNN R,37 + POPJ P, +ASCIN1: PUSH P,R + LDB R,[220400,,R] + CAIE R,0 + XCTR XR,[HRRZ R,(R)] + ADD R,(P) + HLL R,(P) ;GET ORIG @, MAY HAVE BEEN CARRIED INTO BY -1(17) + TLZ R,17 + TLZE R,(@) + UMOVE R,(R) + DPB R,[2700,,(P)] + POP P,R + TLNN R,37 + POPJ P, + PUSHJ P,OPBRK ;ALLOW PCLSR + JRST ASCIN1 + +TPFLT: CONO PI,CLKOFF ;PREVENT INTERRUPT AFTER IORM SPM ING BACK + ; ON TOP OF 1000 BIT +IFN KA10P,[ + SPM UPGML(U) + PUSH P,B + MOVSI B,1000 + IORM B,UPQUAN(U) + POP P,B + LPMRI UPGML(U) ;TAKE TRAP, MAYBE DONT COME BACK + JRST CLKONJ +] ;KA10P +IFN KL10P,[ + POP P,PFOPC1 ;IF RESTART FAULT, RETURN FROM TPFLT + JRST TPFLT1 ;JOIN REGULAR PAGE FAIL CODE +] ;KL10P +IFN KS10P,[ + POP P,EPTPFO ; If fault returns, just return from TPFLT + JRST TPFLT1 +] ;KS10P + +SUBTTL PURE DUMP + +;`PDUMP' SYMBOLIC SYSTEM CALL +; ARG 1 - JOB SPEC FOR JOB TO BE DUMPED +; ARG 2 - DISK CHANNEL TO DUMP ONTO +; ARG 3 - STATE WORD (MODIFIED) INITIALLY 0, THEN 4.9 + PAGE # ABOUT TO DUMP + +PDUMP: MOVE J,A + JSP T,NCRUI2 ;DECODE JOB SPEC (1ST ARG) + JFCL + MOVE A,J + JUMPL J,OPNL31 ;CAN'T PDUMP THE PDP6. + MOVE D,B + JSP T,PDUMDC ;DECODE 2ND ARG, B-> IOCHNM WORD. + TLNN J,%CLSQO + JRST OPNL34 ;NOT DISK WRITE CHANNEL. + HRRZM D,UUAC(U) ;SO SET IN CASE OF ERROR + HLRZ D,(B) + MOVEM D,SRN3(U) ;REMEMBER DISK CHANNEL NUMBER FOR LATER. + PCLT + XCTR XRW,[MOVES D,(C)] + MOVEM C,SRN4(U) ;REMEMBER STATE WORD ADDRESS FOR LATER + MOVEM A,EPDL(U) ;USER INDEX +PDUMA: CAIN A,(U) ;IF PDUMP'ING SELF, MUSTN'T PCLSR, + PUSHJ P,NULSET ;SO DO A NULSET INSTEAD OF THE SOSSET + CAIN A,(U) + JRST PDUMP9 ;SO THAT A LSWPOP CAN BE DEON AT THE END IN EITHER CASE. + PUSHJ P,RPCLSR ;HACKING ANOTHER JOB: STOP IT. + PUSHJ P,SOSSET + USTP(A) +PDUMP9: MOVE A,SRN3(U) ;GET DISK CHANNEL NUMBER + MOVE C,SRN4(U) + UMOVE D,(C) ;PICK UP STATE WORD + JUMPN D,PDUMP5 ;JUMP IF ALREADY WROTE MAP PAGE + PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK FOR MAP PAGE + SETZM (E) ;CLEAR FIRST WORD OF MAP + ;AND DROP INTO PDUMP4 +;HANDLE THE NEXT PAGE. +PDUMP4: PUSHJ P,PUPLC ;GET BYTE POINTERS + LDB W,Q ;CIRC POINTER ENTRY + LDB R,T ;PAGE MAP ENTRY + ANDCMI R,PMAGEM ;CLEAR AGE BITS + CAIN W,-1 + TLO R,(SETZ) ;ABS PAGE + SKIPN W + MOVEI R,0 ;PAGE NON-EXISTANT + TRNN R,600000 + LSH R,16. ;SWAPPED OUT + MOVE W,D ;VIRTUAL PAGE NUMBER + ADDI W,1(E) ;ADDRESS OF ENTRY IN BLOCK + MOVEM R,(W) ;STORE ENTRY + CAIGE D,377 + AOJA D,PDUMP4 + HRLI W,1(W) + SETZM 1(W) + HRRI W,2(W) + BLT W,1777(E) + MOVE D,EPDL(U) + MOVEI W,1000(E) ;1000-1017 ACS + CAMN D,U + JRST [ XCTR XBR,.+2 + JRST .+3] + HRLI W,AC0S(D) + BLT W,1017(E) + PUSHJ P,QSBWW + SETZM QSMPRC(A) ;SO NEXT IOT GETS A NEW BUFFER + MOVSI D,(SETZ) ;SET STATE WORD TO `DUMPING PAGE 0' +;DROPS THROUGH + ;DROPS IN +;DUMP NEXT PAGE +PDUMP5: MOVE C,SRN4(U) ;STORE BACK STATE WORD + UMOVEM D,(C) +PDUMP8: PUSHJ P,PUPLC + LDB W,Q + CAIE W,-1 + SKIPN W + AOJA D,PDUMP6 ;PAGE ABSOLUTE OR NONEXISTANT +PDUMP3: PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK TO DUMP THIS PAGE INTO + MOVE J,EPDL(U) ;SET UP MAP TO POINT TO USER BEING DUMPED + PUSHJ P,MPLDJ + HRLZ J,D ;GET VIRTUAL ADDRESS OF PAGE BEING DUMPED + LSH J,10. + HRR J,E ;BLT POINTER TO COPY THE PAGE + XCTR XBR,[BLT J,1777(E)] ;COPY PAGE INTO DISK BUFFER + PUSHJ P,MPLDZ ;RESTORE TO NORMAL MAP + PUSH P,D + PUSHJ P,QSBWW ;WRITE OUT THE COPIED PAGE + SETZM QSMPRC(A) ;SO NEXT IOT GETS NEW BUFFER + POP P,D + AOS D ;DONE WITH THIS PAGE +PDUMP6: TRNN D,400 ;SKIP IF FINISHED WHOLE ADDRESS SPACE + JRST PDUMP5 + JRST LSWPJ1 ;UNSTOP USER AND POPJ1 + +;ROUTINE TO GET DISK BUFFER AND COMMIT TRACK (FOR PDUMP) +;RETURNS BUFFER ADDRESS IN E. PRESERVES D. + +PDBWG: SKIPL E,QSMDN(A) ;GET CORE BLOCK # OF DISK BUFFER + JRST [ LSH E,10. ;CONVERT TO ADDRESS + POPJ P, ] + MOVE E,[444400,,1] ;NO BUFFER, GET ONE + MOVEI B,QBOV + PUSHJ P,QSBWG + PUSHJ P,UDELAY ;CAN'T GET MEMORY, WAIT A WHILE + JRST PDBWG + +;ROUTINE TO LOOK UP PAGE (FOR PDUMP AND PURE LOAD) +;PAGE# IN RH(D), USER# IN EPDL(U). RESULTS FROM UPLC IN Q AND T. + +PUPLC: PUSH P,A + PUSH P,U + MOVE U,EPDL(U) + MOVE A,D + ANDI A,377 + PUSHJ P,UPLC + POP P,U + JRST POPAJ + +;DECODE 2ND ARG TO PDUMP & LOAD. +;B GETS IOCHNM WORD ADDR, LH OF J GETS LH OF CLSTB ENTRY, RH GETS LH(IOCHNM). + +PDUMDC: TRNE B,-NIOCHN + JRST OPNL14 + ADDI B,IOCHNM(U) + HRRZ J,(B) + HLLZ J,CLSTB(J) + HLR J,(B) + JRST (T) + +SUBTTL PURE AND SBLK LOAD + +;`LOAD' SYMBOLIC SYSTEM CALL +; ARG 1 - JOB SPEC FOR JOB TO BE LOADED +; ARG 2 - DISK CHANNEL TO LOAD FROM +; ARG 3 - (OPTIONAL) FIRST ADDR,,LAST ADDR TO BE LOADED +; OR ZERO => LOAD ONLY PURE PAGES +; WHEN LOADING A PDUMPED FILE, FIRST,,LAST ROUNDED OFF TO PAGES +; DEFAULT 3RD ARG IS 0,,-1 NORMALLY, 20,,-1 LOADING SELF, 20,,37777 LOADING PDP6 + +;PAGE WORD +;4.9=1 ABSOLUTE, 1.1-2.9 = PTW +;4.8=1 SHARED WITH OTHER PAGES AT LEAST ONE OF WHICH IS WRITE +;4.7=1 LINK WITH VIRT PG IN RH 1.8-1.1 +;2.9-2.8 0 NXM, 1 RD ONLY, 2 OR 3 READ/WRITE +;2.7=1 WORD ALREADY PROCESSED + +NLOAD: MOVE J,A + JSP T,NCORUI ;DECODE THE JOB SPEC. + JRST NLOAD6 ;JOB GUARANTEED WRITEABLE. + JSP T,NCORWR ;ELSE CHECK IF WRITEABLE. + CAIN J,-1 ;BUT CAN WRITE PDP6. + CAIA + JRST OPNL31 ;NOT WRITEABLE. +NLOAD6: HRREI A,(J) ;MAKE SURE EXTEND SIGN IF PDP6. + JSP T,PDUMDC ;DECODE 2ND ARG. + TLNN J,%CLSQO + TLNN J,%CLSQ + JRST OPNL34 ;NOT DISK READ CHANNEL. + LDB J,[QSBSIZ(J)] + CAIE J,36. + JRST OPNL12 ;"MODE NOT AVAILABLE" IF CHANNEL NOT 36-BIT BYTES. + MOVE R,B ;IOCHNM ADDRESS IN CASE WE GET TO QICL + JUMPL A,NLOADE ;DONT STOP THE 6 + CAMN A,U + JRST NLOADA ;DONT STOP IF LOADING INTO SELF + PUSHJ P,RPCLSR + PUSHJ P,LSWPOP ;SOS JOB'S DIELOK - IT CAN'T DIE WHILE STOPPED. + MOVSI T,BSSTP ;STOPPING WITH BSSTP INSTEAD OF RH OF USTP + IORM T,USTP(A) ;AVOIDS DEADLY EMBRACE WITH CORE JOB (SEE CUSTOP) + SOS USTP(A) + PUSHJ P,LOSSET ;ARRANGE TO CLEAR BSSTP ON PCLSR. + NLUPCL + CAIGE W,3 + HRLOI C,0 ;DEFAULT 3RD ARG + JRST NLOADE + +NLOADA: PUSHJ P,LSWPOP ;DIELOK + CAIGE W,3 + HRLOI C,20 ;DEFAULT 3RD ARG +NLOADE: MOVEM A,SRN3(U) ;SAVE USER INDEX (-1 => PDP6) +IFN PDP6P,[ + JUMPL A,[HLRZ A,C ;PDP6, ENSURE LIMITS SMALL ENOUGH + CAIGE A,20 + HRLI C,20 ;ACS NOT ACCESSIBLE + MOVEI A,LPDP6M*2000-1 + CAIGE A,(C) + HRR C,A ;HAS ONLY 16K MEMORY + JRST .+1] +] + HLRZ A,(B) + MOVEM A,SRN4(U) ;SAVE # OF DISK CHANNEL + SETZM SRN5(U) ;START LOADING AT VIR PG #0 + MOVEM C,EPDLT1(U) ;SAVE LOAD LIMITS + HLRZ D,C + CAILE D,(C) + JRST OPNL33 ;FIRST > LAST + HLRZ C,QPCLSR(A) + JUMPE C,NLOADD + HRRZ Q,SRN3(U) + CAIN C,(Q) + JRST NLDSBB ;(COMING BACK AFTER PCLSR) + SETZM QPCLSR(A) +;DROPS THROUGH + ;DROPS IN +;GET FIRST BLOCK OF FILE BEING LOADED +NLOADD: CAMN U,PCLUSR + SETZM PCLIDX + SKIPL TT,QSMDN(A) + JRST NLOADB + PCLT + SKIPG QSBFS(A) + PUSHJ P,UFLS ;HANG UNTIL A BLOCK IS READ IN + MOVE Q,QSRAC(A) + TLNE Q,%QAACC+%QAMPU+%QAPAR + JRST OPNL7 ;LOST ONE WAY OR ANOTHER + MOVE E,[444400,,1] + MOVEI B,QBIV + PUSHJ P,QSBGB ;SET UP CHNL AREA. TT ADDR OF FIRST WORD OF BLOCK + BUG + JRST NLOADC ;QSBGB SKIPS FOR NORMAL RETURN + JRST OPNL46 ;SKIPPED TWICE => EOF + +NLOADB: MOVE J,QMPBSZ(A) + LSH TT,10. +NLOADC: SKIPE (TT) ;SKIP IF PURE DUMPED FILE + JRST NLDSB ;SBLK + SKIPGE SRN3(U) + JRST OPNL34 ;TRYING TO PURE LOAD PDP6 + MOVSI Q,%QAACC ;WILL GO RANDOM ACCESSING THROUGH FILE + IORM Q,QSRAC(A) ;THIS ALSO INHIBITS ACTIVATION AT PI LEVEL + HLRZ H,EPDLT1(U);LOW LOAD BOUNDARY + SKIPE EPDLT1(U) + CAIL H,20 + JRST NLOADH ;ACS NOT BE LOADED + MOVSI Q,1000(TT);ADDRESS OF DUMPED ACS + HRLS H + ADD Q,H + HRRZ H,EPDLT1(U);HIGH LOAD BOUNDARY + CAILE H,17 + MOVEI H,17 + HRRZ J,SRN3(U) ;JOB TO BE LOADED + PUSHJ P,MPLDJ + XCTR XBW,[BLT Q,(H)] ;LOAD UP HIS ACS + PUSHJ P,MPLDZ +NLOADH: MOVEI R,1(TT) ;ADDRESS OF FIRST WORD OF DUMPED MAP + MOVEM R,EPDL3(U) ;SAVE + MOVEI Q,2000 + PUSHJ P,QFNTR ;FIND DISK ADDRESS OF SECOND BLOCK + JRST OPNL46 ;OFF END OF FILE + SOS QSBI(A) ;UNDO QFNTR HACK + AOS QSLGL(A) + PUSHJ P,QUDULK ;UNLOCK USER DIRECTORY + PUSHJ P,SWTL ;LOCK CIRPSW + CIRPSW +;DROPS THROUGH + ;DROPS IN +;HERE TO DO NEXT PAGE (WHEN LOADING PDUMPED FILE) +NLOAD0: PUSHJ P,OPBRK + MOVE A,@EPDL3(U) + TRNE A,600000 ;SKIP IF NO ACCESS (IGNORE) + TRNE A,100000 + JRST NLD14 ;THIS PAGE ALREADY DONE OR NO ACCESS + MOVE Q,EPDLT1(U) + TRNE A,400000 ;SKIP IF READ ONLY + JUMPE Q,NLD14 ;IMPURE NOT BE LOADED + MOVE A,SRN5(U) ;VIRTUAL PAGE NUMBER + JUMPE Q,NLD16 + AND Q,[-2000,,-2000] + LSH Q,-10. ;FIRST PAGE,,LAST PAGE + HLRZ T,Q + CAIL A,(T) + CAILE A,(Q) + JRST NLD14 ;PAGE OUTSIDE OF RANGE TO BE LOADED +NLD16: MOVE U,SRN3(U) ;USER INDEX + PUSHJ P,UPLC + LDB R,Q ;LOOK IN CIRCULAR POINTER ENTRY FOR THIS PAGE + JUMPE R,NLOAD1 ;DOESN'T ALREADY HAVE THIS VIRTUAL PAGE + PUSH P,T ;SAVE BYTE POINTER TO PAGE MAP FOR THIS VIRTUAL PAGE + PUSH P,Q ;SAVE BYTE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE + PUSHJ P,PAGERT ;FLUSH THE ALREADY EXISTING VIRTUAL PAGE + POP P,Q + POP P,T +NLOAD1: MOVE U,USER + MOVE R,@EPDL3(U) ;PICK UP DUMPED PAGE MAP WORD + ANDCMI R,PMAGEM ;CLEAR AGE BITS (WOULD LOSE AT NLOAD4+4) + JUMPGE R,NLOAD3 ;NOT ABSOLUTE PAGE + ANDI R,PMRCM ;ABS PG # + CAIL R,TSYSM +IFE PDP6P, JRST OPNL32 +.ELSE [ + JRST [ CAIGE R, + CAIGE R, + JRST OPNL32 + HRRZ R,@EPDL3(U) ;ALLOW USER TO LOAD WRITABLE PDP6 PAGES. + ANDCMI R,PMAGEM\PMUNSD ;GIVE HIM WHATEVER ACCESS HE RQ'S. + JRST NLOAD5]] +;IFN TEN11P,[ ;NOT NECESSARY SINCE 10-11 PAGES ABOVE TSYSM NOW +; TRNN R,400 +; JRST .+3 +; MOVE E,T11MP-400(R) +; AOJN E,NLOAD2 ;DONT ALLOW PAGE TO POINT TO TEN11 +;] + + LDB E,[MUR,,MEMBLT(R)] + CAIN E,MUHOLE + TDZA R,R ;IF PAGE NXM TODAY, DON'T ACTUALLY GIVE ACCESS + +NLOAD5: TRO R,200000 ;RD ONLY + DPB R,T ;STORE ENTRY IN PAGE MAP + MOVEI R,-1 + DPB R,Q ;STORE -1 IN CIRCULAR POINTER +NLOAD2: MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER + MOVE U,SRN3(U) ;USER INDEX LOADING INTO + PUSHJ P,GHUSRA ;RECOMPUTE HUSRAD +NLD14: MOVE U,USER + MOVEI R,100000 + IORB R,@EPDL3(U) ;MARK DUMPED PAGE WORD AS ALREADY DONE + MOVE A,SRN4(U) ;DISK CHANNEL + TLNN R,500000 ;SKIP IF NO CORRESPONDING BLOCK IN FILE + TRNN R,600000 ;SKIP IF MUST ADVANCE ONE BLOCK + JRST .+3 ;DON'T ADVANCE FILE POINTER + PUSHJ P,QFNTN ;ADVANCE TO NEXT DISK ADDRESS + JRST OPNL46 ;PREMATURE EOF + AOS R,SRN5(U) ;NEXT VIRTUAL PAGE + CAMN U,PCLUSR + MOVEM R,PCLIDX + AOS EPDL3(U) ;NEXT MAP WORD + CAIGE R,400 + JRST NLOAD0 ;LOOP + PUSHJ P,LSWPOP ;RELEASE CIRPSW + MOVE B,SRN3(U) ;USER INDEX LOADING INTO + CAME B,U ;SKIP IF LOADING INTO SELF + PUSHJ P,LSWPOP ;UNSTOP USER + MOVE B,QFBLNO(A) + SETZM QFBLNO(A) + MOVEM B,QRADAD(A) + JRST POPJ1 + +NLOAD3: TLNN R,100000 ;SKIP IF LINK WITH PAGE IN RH OF R + JRST NLOAD4 + PUSH P,T ;SAVE BYTE POINTER TO MAP ENTRY FOR THIS VIRTUAL PAGE + PUSH P,Q ;SAVE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE + LDB A,[1700,,R] ;VIRTUAL PAGE NUMBER BEING LINKED TO + CAIL A,400 + JRST NLOAD8 ;BAD VIRT PAGE # + MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER OF PAGE BEING LINKED + MOVE U,SRN3(U) ;USER INDEX LOADING INTO + PUSHJ P,UPLC + LDB W,Q ;CIRCULAR POINTER OF OTHER ENTRY + JUMPE W,NLOAD8 ;DIDN'T EXIST + CAIN W,-1 + JRST NLOAD8 ;POINTS TO AN ABSOLUTE PAGE + MOVE C,U + IDIVI C,LUBLK + SKIPE D + BUG ;L DOESN'T DIVIDE U + LSH C,10 ;USER NUMBER _ 8 + TRZE C,400000 + BUG ;USER INDEX WAS TOO LARGE + IOR C,E ;NEW CIRCULAR POINTER + POP P,D ;NEW CIRCULAR POINTER BYTE POINTER + DPB W,D ;STORE OTHER ENTRY AS NEW CIRCULAR POINTER ENTRY + DPB C,Q ;MAKE OTHER CIRCULAR POINTER ENTRY POINT TO NEW ONE + LDB E,T ;OTHER MAP ENTRY + POP P,T ;POINTER TO NEW MAP ENTRY + ANDI R,600000 ;PROTECTION BITS + TRZN E,600000 + JRST NLD11 + IOR E,R + JRST NLD10 +NLD11: LSH R,-20 + DPB R,T +NLOAD9: AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS + AOSA NSWPGS(U) ;USER LOADING INTO HAS ONE MORE SWAPPED OUT PAGE +NLD10: DPB E,T +NLD13: AOS NMPGS(U) ;USER HAS ONE MORE PAGE + AOS SNMPGS ;SYSTEM HAS 1 MORE PAGE +NLD15: MOVE U,USER + JRST NLOAD2 ;RECOMPUTE HUSRAD AND LOOP + +NLOAD4: MOVE A,SRN4(U) ;DISK CHANNEL + MOVEI TT,(R) ;PUT DESIRED ACCESS IN RH(TT), + ANDI TT,600000 + TDNE R,[200000,,400000] + IORI TT,%CBCPY ;ALONG WITH INITIAL-SWAPIN BIT IF NEC. + PUSHJ P,NCORQ7 ;FIND OR CREATE MMP ENTRY. + JRST OPNL37 ;MMP FULL + MOVE E,SRN5(U) ;GET PAGE # IN JOB BEING LOADED + MOVE U,SRN3(U) ;TARGET USER. + PUSHJ P,NCORR1 ;INSERT THE PAGE. + JRST NLD15 + +NLOAD8: SUB P,[2,,2] + JRST OPNL46 + +NLOADZ: PUSHJ P,LSWPOP ;FREE CIRPSW + MOVEI T,3 + CAMLE T,LMEMFR + PUSHJ P,UFLS + PUSHJ P,SWTL + CIRPSW +POPSM2: SOS (P) ;RETURN TO LOCN BEFORE PUSHJ + SOS (P) + POPJ P, + +;QTAOS: PUSHJ P,QTLOCK ;LOCK TUT +QTAOS1: MOVE D,QSLGL(A) ;DISK TRACK + PUSHJ P,TUTPNT + SKIPG B + BUG ;NOT PART OF ANY FILE + CAIGE B,TUTMNY + AOS B + DPB B,D ;ADD ONE TO TUT ENTRY FOR THIS TRACK + JRST QTULK + +NLUPCL: MOVSI T,BSSTP ;THIS IS THE LOSSET ROUTINE TO CLEAR BSSTP. + SKIPGE A,SRN3(U) + BUG + ANDCAM T,USTP(A) + POPJ P, + +NLDSBB: HRRZ J,SRN3(U) ; (COMING BACK AFTER PCLSRING OUT) A HAS DSK CHNL #) + PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS) + SKIPL C,SRN3(U) + CAIN U,(C) + JRST NLDSBH + PUSHJ P,LSWPOP + PUSHJ P,LOSSET + NLUPCL + MOVSI B,BSSTP + IORM B,USTP(C) +NLDSBH: HRRZ B,QPCLSR(A) + JRST (B) + +NLDSB: SKIPN EPDLT1(U) + JRST OPNL12 ;LOAD ONLY PURE FROM SBLK FILE LOSES + HRLZ B,SRN3(U) + HRRI B,NLDSBD + MOVEM B,QPCLSR(A) ;RESTART POINT IN CASE OF PCLSR + MOVEM J,QSMPRC(A) + MOVEM TT,QSMPRP(A) + HRRZ J,SRN3(U) + PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS) + +;DROPS THROUGH + +;DROPS IN +NLDSB1: HRROI I,EPDL3(U) + MOVEM I,SRN4(U) ;SET UP AOBJN PTR TO READ INTO EPDL3 +NLDSBD: MOVEI C,SRN4(U) ;SET C UP TO POINT TO AOBJN PTR + HRLI C,(TRN) ;INDICATE EXEC MODE ADR + PUSHJ P,QBI + SKIPGE SRN4(U) + JRST NLDSB9 ;PREMATURE EOF + MOVE I,EPDL3(U) + CAME I,[JRST 1] + JRST NLDSB1 ;IGNORE INITIAL STUFF UNTIL JRST 1 +NLDSBK: MOVEI B,NLDSBE + HRRM B,QPCLSR(A) +NLDSBE: HRROI I,QLDPTR(A) + MOVEM I,SRN4(U) + MOVEI C,SRN4(U) + HRLI C,(TRN) + PUSHJ P,QBI ;GET AN AOBJN POINTER + SKIPGE SRN4(U) + JRST NLDSB9 ;PREMATURE EOF + SKIPL B,QLDPTR(A) + JRST NLDSB6 ;NOT AN AOBJN POINTER + HLRZ C,EPDLT1(U);FIRST ADDRESS TO BE LOADED + SUBI C,(B) + JUMPLE C,NLDSB3 + HLROS B ;SKIP # WDS IN C + ADD B,C ;-# WDS REMAINING IN BLOCK + SKIPLE B + SUB C,B ;FLUSH WHOLE BLOCK + LDB D,[1200,,QSMPRP(A)] + SKIPGE QSMDN(A) + MOVEI D,0 + ADD D,QFBLNO(A) + ADD D,C ;ADVANCE ACC PTR TO SKIP PART OR ALL OF BLOCK + MOVEM D,QRADAD(A) + MOVSI D,%QAACC + IORM D,QSRAC(A) + JUMPGE B,[AOS QRADAD(A) ;SKIPPING WHOLE BLOCK, ALSO SKIP CHECKSUM + JRST NLDSBK] ;AND GO READ NEXT BLOCK + HRLS C + ADDM C,QLDPTR(A) ;UPDATE AOBJN POINTER +NLDSB3: MOVEI B,NLDSBF ;MAYBE FLUSH EXISTING MEMORY AND GET NEW + HRRM B,QPCLSR(A) +NLDSBF: HRRZ E,QLDPTR(A) ;START ADR OF BLOCK + HLRE C,QLDPTR(A) ;-LENGTH OF BLOCK + SUB E,C ;DON'T COMBINE THIS INSN WITH NEXT, MIGHT BE MOBY BLOCK + SUBI E,1 ;GET END ADR OF BLOCK + HRRZ T,EPDLT1(U);HIGH LOAD LIMIT + SUBM E,T ;NUMBER OF WORDS OF EXCESS IN BLOCK + MOVEM T,EPDLT2(U) ;SAVE FOR LATER USE + JUMPLE T,NLDSB7 ;JUMP IF BLOCK HAS NO EXCESS + SUB E,T ;ADJUST END ADDRESS + HRLZS T + ADDM T,QLDPTR(A);DECREASE COUNT IN AOBJN POINTER +NLDSB7: LSH E,-10. ;LAST PAGE NEEDED + PUSH P,A + PUSH P,R ;R HAS IOCHNM WD, NEEDED IF REACH QICL VIA QBI. + PUSH P,E ;PAGE NO. OF LAST PAGE NEEDED +NLDSB4: MOVE E,(P) + CAMGE E,SRN5(U) + JRST NLDSB5 ;ALREADY HAVE NEEDED PAGES + MOVE A,SRN5(U) + PUSH P,U + MOVE U,SRN3(U) ;LOOK UP THIS PAGE IN MAP OF USER WE'RE HACKING. + PUSHJ P,UPLC ;IF THERES A WRITABLE PAGE + POP P,U + LDB A,T ;IN THE SLOT ALREADY, KEEP IT. + TRNN A,600000 + TRNN A,2 + TRNE A,400000 + JRST NLDSBM + CAME U,SRN3(U) ;IF NOT HACKING SELF, NCORLL WILL LSWPOP + PUSHJ P,NULSET ;WHAT IT THINKS IS A LOSSET LIKE NLUPCL + PUSHJ P,SWTL + CIRPSW + MOVEI R,%JSNEW ;GET FRESH PAGE + MOVE TT,SRN3(U) ;INTO THE JOB WE'RE HACKING. + MOVE C,SRN5(U) ;PAGE # TO GIVE IT. + MOVSI A,%CBRED+%CBWRT+%CBNDW ;WANT WRITE ACCESS. + PUSHJ P,NCORL ;UNDOES NULSET AND SWTL. + JRST NLSBPL ;COULDNT GET PAGE (CALLED LSWCLR) +NLDSBM: AOS SRN5(U) + JRST NLDSB4 ;CHECK WHETHER WE NEED MORE PAGES. + +NLDSB5: SUB P,[1,,1] ;NOW WE HAVE ALL PAGES NEEDED TO LOAD THIS BLOCK. + POP P,R + POP P,A +NLDSBQ: MOVEI B,NLDSBC + HRRM B,QPCLSR(A) +NLDSBC: HRRZI C,QLDPTR(A) + HRLI C,(SETZ) + PUSHJ P,QBI ;DO A BLOCK IOT, USING THAT AOBJN POINTER. + AOSG B,EPDLT2(U);SKIP RESIDUE OF BLOCK AND CHECKSUM + MOVEI B,1 ;NO RESIDUE, JUST SKIP CHECKSUM + LDB D,[1200,,QSMPRP(A)] + SKIPGE QSMDN(A) + MOVEI D,0 + ADD D,QFBLNO(A) + ADD D,B + MOVEM D,QRADAD(A) + MOVSI D,%QAACC + IORM D,QSRAC(A) + JRST NLDSBK + +NLDSB6: LDB D,[1200,,QSMPRP(A)] + SKIPGE QSMDN(A) + MOVEI D,0 + ADD D,QFBLNO(A) + SUBI D,1 + MOVEM D,QRADAD(A) + MOVSI D,%QAACC + IORM D,QSRAC(A) +NLDSB8: CAME U,SRN3(U) ;UNLESS HACKING SELF OR PDP6, WE HAVE A SOSSET OF USTP TO POP. + SKIPGE SRN3(U) + CAIA + PUSHJ P,LSWPOP + AOSA (P) +NLDSB9: PUSHJ P,OPNL46 ;LOAD FILE NOT IN VALID SBLK FORMAT +NLSBP1: PUSHJ P,MPLDZ + SETZM QPCLSR(A) + POPJ P, + +NLSBPL: SUB P,[2,,2] ;FLUSH PUSHES OF E AND R. + POP P,A + JRST NLSBP1 + +SUBTTL .GUN, .LOGOUT + +;DESTROY PROCEDURE TREE WHOSE TOP INDEX SUPPLIED BY USER +AGUN: XCTR XR,[SKIPG A,(J)] + POPJ P, ;LOSE, NEG OR SYSTEM JOB + IMULI A,LUBLK + CONO PI,CLKOFF + CAMGE A,USRHI ;USER INDEX UNREASONABLE => LOSE. + CAIG A,LUBLK + JRST CLKONJ + JRST ALOGO6 + +ALOGOU: SKIPL SUPPRO(U) + JUMPN J,ABREAK ;.LOGOUT N, TURNS INTO .BREAK N,33 IF NOT TOP LEVEL + MOVE A,U ;.LOGOUT, AND STY CLOSE. + CONO PI,CLKOFF +;A HAS JOB BEING LOGGED OUT; U HAS JOB THAT'S DOING IT. +;.GUN AND .LOGOUT ACT BY PUTTING THE JOB IN SUCH A STATE THAT +;IT CAN DO NOTHING BUT TRY TO DISAPPEAR. IF THE JOB IS ALREADY +;IN THAT STATE, THIS ROUTINE DOES NOTHING. THAT PREVENTS +;RECURSION LOOPS WHEN KILLING CYCLIC STRUCTURES INVOLVING STY'S. +;EXCEPTION: IF THE JOB TO BE LOGGED OUT IS THE RUNNING JOB, +;WE DO THE REAL WORK BY GOING TO ALOGO1. +ALOGO6: SKIPE UNAME(A) ;JOB TO BE LOGGED OUT IS GONE. + SKIPL SUPPRO(A) ;CAN'T LOG OUT UNLESS TOP LEVEL. + JRST CLKONJ + CAME A,U + AOS (P) ;IF .GUN GETS THIS FAR, IT HAS "SUCCEEDED". + MOVSI T,BULGOS+BULGO + TDNE T,APRC(A) ;IF JOB IS ALREADY LOGGING OUT, + JRST ALOGO7 ; SEE IF IT IS THE RUNNING JOB + MOVSI B,%PCUSR + CAMN A,USER + AOJA B,ALOGO5 + PUSH P,U + MOVE U,USER + MOVEM A,SRN3(U) ;AUCL4 FINDS USR IDX TO HACK HERE. + PUSHJ P,LOSSET + AUCL4 ;CLEAR BULGOS IF AUCL3 PCLSR'S + PUSHJ P,AUCL3 ;SET BULGOS AND WAIT FOR DIELOK TO CLEAR. + POP P,U + CONO PI,CLKOFF + PUSHJ P,LSWDEL + EXCH B,UPC(A) ;SET HIM UP TO LOG OUT. +ALOGO4: MOVEM B,SRN3(A) ; Remember old PC for unlocking locks. + MOVE B,[.LOGOUT] ;PUT THE FOLLOWING ROUTINE IN JOB'S AC'S: + MOVEM B,AC0S(A) ; 0/ .LOGOUT + CAMN A,USER ; 1/ .VALUE + UMOVEM B,0 ; 2/ JRST 0 + MOVSI B,(.VALUE) + MOVEM B,AC0S+1(A) + CAMN A,USER + UMOVEM B,1 + MOVSI B,(JRST) + MOVEM B,AC0S+2(A) + CAMN A,USER + UMOVEM B,2 + MOVSI B,BULGOS + IORM B,APRC(A) ;SAY HE'S DIEING SO NO-ONE WILL HACK HIM. + MOVEM U,EPDL(A) ;RECORD WHO IS KILLING HIM. + MOVE B,UNAME(U) + MOVEM B,SRN4(A) + MOVE B,JNAME(U) + MOVEM B,SRN5(A) + SETZM PICLR(A) ;PREVENT INTERRUPTS. + SETZM MSKST(A) + SETZM PIRQC(A) + MOVSI B,BUSRC + ANDCAM B,USTP(A) ;MAKE SURE HE CAN RUN - ELSE HE WOULDN'T LOG OUT. +ALOGO7: CONO PI,CLKON + CAME A,USER + POPJ P, + JRST ALOGO1 ;IF JOB IS RUNNING JOB, MUST HACK AROUND + +ALOGO5: EXCH B,UUOH ;LOGGING OUT SELF - MAKE OUR PC LOOK + SOJA B,ALOGO4 ; AS IF WE HAD EXECUTED THE .LOGOUT IN AC 0 + +;COME HERE IF LOGGING OUT ONESELF (A=USER). +ALOGO1: MOVE U,A + PUSHJ P,AUCL3 ;WAIT TILL NO-ONE IS LOOKING AT ME, + PUSHJ P,UBLAM ;CLOSE MY CHANNELS AND KILL MY INFERIORS AND CORE. + MOVE A,USER + CONO PI,CLKOFF ;DON'T SCHEDULE WHILE GOING AWAY + MOVSI T,BULGO + IORM T,APRC(A) ;SYS JOB KILLS ANY TREES WITH BULGO SET. + MOVSI T,SCLGUN + IORM T,SUPCOR ;TELL SYS JOB TO LOOK AROUND FOR TREES TO KILL. + MOVSI T,BUSRC ;SUICIDE: MAKE SURE WE DON'T RUN ANY MORE. + IORM T,USTP(A) + JRST UDELAY ;CAUSE A SCHEDULE + +;COME WITH JOB INDEX IN A. INDICATE THAT JOB IS ABOUT TO DIE, +;THEN WAIT TILL IT'S SAFE TO KILL IT. +;TURNS CLOCK ON. +AUCL3: MOVSI T,BULGOS + IORM T,APRC(A) ;SAY THIS JOB STARTING TO GO AWAY. + CONO PI,CLKON ;NOONE CAN START HACKING US NOW; SAFE. + CAME A,USER ;IF NOT LOGGING OUT RUNNING USER, + PUSHJ P,1USTOP ;STOP THE JOB BEING KILLED. + SKIPE DIELOK(A) ;WAIT TILL NO-ONE IS LOOKING AT THAT JOB. + PUSHJ P,UFLS + HRLOI T,#BUSRC ;AND NO-ONE ELSE HAS HIM PCLSR'ED. + TDNE T,USTP(A) + PUSHJ P,UFLS + POPJ P, ;WE SUCCEEDED, BUT CALLER HAS WORK TO DO. + +SUBTTL REAL TIME USER FEATURE +; +;.REALT AC, SKIPS ONLY IF REAL TIME FACILITY REQUESTED AND SEIZED +;AC= 4.9=>TURN OFF OLD CLOCK RATE, FLUSHING REAL TIME FACILITY AND +; REMAINDER OF CURRENT TICK AND ZEROING TICK COUNT +; 4.8=>TURN ON NEW CLOCK RATE +; 4.7=>TRY TO SEIZE REAL TIME USER FACILITY +; 4.6=>DON'T SETTLE FOR PSEUDO-REAL TIME STATUS +; 4.5 =>ONLY WANT PSEUDO +; 4.4=>PROGRAM TO BE BLOCKED EXCEPT FOR HIGH PRIORITY PHASE OR INT. LEVEL +; 4.3=>READ INTO WD3+4 AS DESCRIBED BELOW (BEFORE ANY OTHER BITS INTERPRETED) +; 3.1-4.2=RESERVED FOR EXPANSION, SHOULD BE ZERO +; 1.1-2.9=RH=POINTER TO 4 WORD BLOCK +; WD1=FRAME TIME IN 60'THS (MUST BE <2**18.) +; WD2=PRIORITY TIME IN 60'THS (MUST BE <7 AND .CALL [SETZ ? SIXBIT/LOSE/ ? 401000,,X ] + +;.CALL LOSE +; USED TO REPORT LOSSAGE TO SUPERIOR PROCEDURE +;ARG 1 - LOSING INSTRUCTION ADDR,,LOSSAGE CODE (CODES DEFINED BY DDT) +;ARG 2 - NEW PC (DEFAULT = PC-2 SO CAN USE AS A NON-SKIP-RETURN HANDLER) +;CTL 1.1 - DEFAULT ARG 2 TO PC INSTEAD OF PC-2 +;CTL 1.2 - SETZM @.40ADDR +;CTL 1.3 - DON'T USE THE NEW PC AS THE LOSING INSTRUCTION ADDR + +ALOSE: HRRZ A,FORTY ;ARG 1 = EFF ADDR OF UUO + MOVEI W,1 + TDZA T,T +NLOSE: MOVE T,CTLBTS(U) + MOVE D,40ADDR(U) + TRNE T,2 + XCTR XRW,[MOVES (D)] + TLZ B,BADPC ;COMPUTE NEW PC FROM ARG 2 OR UUOH + SKIPGE IOTLSR(U) + TLO B,%PCUIO + TLO B,%PCUSR + MOVE C,UUOH + TRNN T,1 + HRRI C,-2(C) + CAIGE W,2 + MOVE B,C + TRNN T,4 + HRL A,B + HRRI B,1(B) ;PCLSR'ING WILL SOS + MOVEM A,VALUE(U) ;PASS TO SUPERIOR + MOVEM B,UUOH + TRNE T,2 + XCTR XW,[SETZM (D)] + MOVSI T,%PJLOS + JRST UUOERR + +AUCLOSE: +IFN PDP6P,[ + MOVE A,(R) ;OPER 10 + MOVE A,CLSTB(A) + TLNE A,%CLS6 + JRST PDPUCL +] + PUSHJ P,AUCL2 + POPJ P, + PUSHJ P,1USTOP + MOVEM A,SRN3(U) + PUSHJ P,LOSSET + AUCL4 + PUSHJ P,AUCL3 ;STOP JOB, AND WAIT TILL SAFE TO KILL IT + ;(TURNS CLOCK ON) + EXCH U,A + PUSH P,A + HLLZ T,SUPPRO(U) + PUSH P,T + PUSH P,R + PUSHJ P,UBLAST + POP P,R + PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES + CONO PI,CLKON + POP P,T + POP P,U + ANDCAM T,IFPIR(U) + JRST LSWDEL + +AUCL4: HRRZ A,SRN3(U) + MOVSI T,BULGOS + ANDCAM T,APRC(A) + POPJ P, + +AUCL2: HLRZ A,(R) ;GUY BEING CLOSED + HRRZ B,(R) + LDB TT,[.BP (%CLSFU),CLSTB(B)] + JUMPN TT,OPNL31 ;FOREIGN JOB => .UCLOSE ISCAN'T MODIFY JOB + SKIPL CLSTB(B) .SEE %CLSU + JRST OPNL34 ;NOT A JOB AT ALL? + CONO PI,CLKOFF + MOVE TT,TTYTBL(U) + JUMPGE TT,AUCL1 ;HAVE TTY NOW + TLNN TT,%TBDTY ;NOT GIVING IT AWAY. + CAIE A,(TT) ;SKIP IF GAVE IT TO GUY WE'RE KILLING + JRST AUCL1 + PUSHJ P,SDTTY ;TAKE IT BACK FROM HIM. + JFCL +AUCL1: HLRZ A,(R) + JRST POPJ1 + +;DISMIS SYSTEM CALL. 1ST ARG INT PDL PTR (WILL BE DECREMENTED +;IF NOT AN IMMEDIATE ARG) +;2ND ARG OPTIONAL PC TO DISMIS TO (OVERRIDES THAT IN INT PDL) +;3RD ARG OPTIONAL NEW .DF1 VALUE " " " " +;4TH ARG OPTIONAL NEW .DF2 VALUE ... +;5TH ARG OPTIONAL ERROR CODE AS IN LOSE. IF PRESENT WILL LOSE RIGHT AFTER DISMISSING. +;IF 4 ARGS GIVEN, 1ST IGNORED EXCEPT FOR POSSIBLY DECREMENTING, OR POPPING OF ACS. +;CTL BITS (SAME FORMAT AS LH OF 1ST WORD OF INTERRUPT DISPATCH TABLE) +;SPECIFY POPPING OF SAME EXTRA INFO THAT INTERRUPTS CAN PUSH. + +NDISMIS:CAIL W,5 + MOVEM E,VALUE(U) + MOVE E,A ;GET IN E THE INT PDL PTR. + TLNN E,1000 ;IF 1ST ARG IMMEDIATE, IT IS PTR, + UMOVE E,(A) ;ELSE IT PTS TO PTR. + MOVE H,E ;SAVE UNPOPPED PDL POINTER FOR PDL OV CHECKING. + TLNE A,1000 ;IF PDL PTR ISN'T IMMEDIATE, POP IT ACC. TO CTL BITS. + JRST NDISM2 + MOVE T,CTLBTS(U) + TRNE T,400000 + SUB E,[3,,3] ;POP OFF DEBUGGING INFO IF IT WAS PUSHED. + LDB TT,[000500,,T] + JUMPE TT,NDISM2 ;IF ACS WERE PUSHED, POP THEM TOO. + HRLS TT + SUB E,TT ;DECREMENT THE PDL POINTER ENOUGH + LDB I,[060500,,T] + HRLI I,1(E) ;AND COPY FROM THE PDL TO THE ACS. + ADDI TT,-1(I) + XCTR XBRW,[BLT I,(TT)] +NDISM2: CAIGE W,2 ;IF NO 2ND ARG, GET PC FROM INT PDL + UMOVE B,(E) + CAIGE W,3 ;IF NO 3RD ARG, GET .DF1 FROM INT PDL + UMOVE C,-2(E) + CAIGE W,4 ;IF NO 4TH ARG GET .DF2 FROM INT PDL + UMOVE D,-1(E) + TLNE A,1000 ;IF 1ST ARG NOT IMMED, DECREMENT IT + JRST NDISM3 + SUB E,[5,,5] + UMOVEM E,(A) + JUMPGE E,NDISM3 ;AND CHECK FOR PDL OVFLO. + SKIPL H + PUSHJ P,NDISMP ;PDL OVFLO, SET INT BIT IF INT ENABLED. +NDISM3: MOVEM C,IDF1(U) ;RESTORE THE PC, .DF1, .DF2 + MOVEM D,IDF2(U) + MOVSI T,%PJLOS + CAIL W,5 + IORM T,PIRQC(U) + JRST NDISM1 + +NDISMP: MOVEI TT,%PIPDL ;PDL OV INT BIT. + TDNE TT,MSKST(U) + IORM TT,PIRQC(U) + POPJ P, + +;OLD-STYLE DISMISS JOINS HERE +ADISMIS:UMOVE B,(B) ;CALL 1, +NDISM1: TLO B,%PCUSR + TLZ B,BADPC + SKIPGE IOTLSR(U) + TLO B,%PCUIO +IFN KL10P,[ + SETCM A,UUOH ;IF ONE-PROCEEDING THE .DISMISS + TLNN A,%PS1PR-%PSINH + TLO B,%PS1PR-%PSINH ;TRAP IMMEDIATELY AT THE NEW PC +] + MOVEM B,UUOH + SETOM PICLR(U) + +;CHECK FOR PENDING INTERRUPTS AND TAKE THEM RIGHT AWAY +APISE1: +IFN PDP6P,[ + CAMN U,PDPISR + CONO DSDEV,DSDCHN ;ENABLE INTERRUPT FROM 6 +] + MOVE A,U + PUSHJ P,APISE6 ;SEE IF ANY DEVICES WANT TO RE-INTERRUPT. + MOVEI C,%PIARO + ANDCAB C,PIRQC(U) + SETCM D,MSKST(U) + IOR D,IDF1(U) ;FIND ALL DISABLED OR DEFERRED + SKIPN PICLR(U) ;(ALL ARE DEFERRED WHEN PI IS OFF). + SETO D, + AND D,[BADBTS] ;BAD + TDNE C,D ;PENDING INTERRUPTS + JRST ADISM7 ;IF THERE ARE ANY, LET THEM HAPPEN. + AND C,MSKST(U) + ANDCM C,IDF1(U) + JUMPN C,ADISM7 ;1ST WD INT. PENDING. + MOVE C,IFPIR(U) + AND C,MSKST2(U) + ANDCM C,IDF2(U) + JUMPE C,CPOPJ ;JUMP IF NO 2ND WORD INT PENDING. +ADISM7: MOVE C,[JRST ONEFLS] + MOVEM C,UEXIT + POPJ P, + +APISE6: MOVE D,MSKST(A) ;IF INTERRUPT FROM CONSOLE ENDBLED, + TRNN D,%PITYI + JRST APISE7 + SKIPL T,TTYTBL(A) ;IF THIS JOB HAS ITS CONSOLE + SKIPN TINTC(T) ;AND THE CONSOLE HAS INT. CHARS, + JRST APISE7 + MOVEI D,%PITYI ;GENERATE AN INTERRUPT. + IORM D,PIRQC(A) +APISE7: MOVE D,MSKST2(A) ;LOOK AT HIS ENABLED IO CHANNELS. + ANDI D,177777 +APISE0: JFFO D,APISE9 ;CHECK EACH ONE. + JRST APISE8 ;ALL CHECKED. + +APISE9: MOVNS E ;CHECK ONE IO CHNL THAT'S ENABLED TO INT. + ANDCM D,CHNBIT+35.(E) ;MARK THIS CHNL AS HANDLED. + ADDI E,35.+IOCHNM(A) ;GET ADDR OF IOCHNM WD FOR CHANNEL. + HRRZ T,(E) ;IS IT A TTY INPUT CHANNEL? + CAIL T,TYIDN + CAILE T,TYIBN + JRST APISE2 + LDB T,[$TIIDX,,(E)] ;YES, GET THE TTY NUMBER. + HRRZ C,TTYSTS(T) + CAIE T,%TINON ;IF IT ISN'T A DISOWNED TY CHANNEL, + CAIE C,(A) ;AND THE TTY BELONGS TO THIS JOB, + JRST APISE0 + SKIPN TINTC(T) ;AND IT HAS AN INT. CHAR WAITING, + JRST APISE0 + MOVE C,TYIMSK(T) +APISE4: AND C,MSKST2(A) ;GIVE AN INT. ON ONE OF THE CHANNELS IT'S OPEN ON. + MOVN T,C + AND C,T + IORM C,IFPIR(A) + JRST APISE0 + +APISE2: CAIN T,STYDUI ;NOT A TTY CHNL. IS IT A STY CHNL? + JRST APISE3 + CAIE T,STYDBI + JRST APISE0 +APISE3: LDB T,[$TIIDX,,(E)] ;YES, GET TTY #. + SKIPL C,STYSTS-NFSTTY(T) ;STY IN USE BY THIS JOB? + CAIE C,(A) + JRST APISE0 + SKIPGE TTYOAC(T) ;TTY OUTPUT PENDING? + JRST APISE0 + MOVE C,STYMSK-NFSTTY(T) ;YES, INT. ON ONE CHANNEL. + JRST APISE4 + +APISE8: +IFN STKP,[ + SKIPL C,STKUSR + CAIE C,(A) + POPJ P, + HRRZ C,STKMSK + AND C,MSKST2(A) + SKIPLE STKBC + IORM C,IFPIR(A) +] + POPJ P, + +;.SLEEP AC, ;IF C(AC) + OR ZERO: ;BECOME DORMANT FOR C(AC) 1/30'THS OF A SEC + ;IF C(AC) -: ;BECOME DORMANT TILL MAGNITUDE OF C(AC) > C(TIME) +ASLEEP: XCTR XR,[MOVN T,(J)] ;PICK UP NEGATIVE OF C(AC) + JUMPGE T,ASLP1 ;JUMP IF C(AC) WAS NEG + SUB T,TIME ;COMPUTE NEG OF TIME SLEEP SHOULD RUN OUT + UMOVEM T,(J) ;STORE BACK SO YOU WILL WIN IF PCLSR'ED OUT +ASLP1: MOVMS A,T ;MAKE POSITIVE + SUBI A,60.*30. ;IF SLEEPING FOR MORE THAN A MINUTE + MOVSI B,%SWDSO + CAMLE A,TIME + IORM B,USWST(U) ;PUT RIP VAN WINKLE ON ICE + PCLT + JRST ASLP2 ;ALWAYS GO TO UFLS AT LEAST ONCE + + CAMLE T,TIME ;HANG TILL C(T) LESS THAN C(TIME) +ASLP2: PUSHJ P,UFLS + XCTR XW,[SETZM (J)] ;CLEAR OUT ARG (FOR COMPATIBILITY WITH WHEN AC WAS COUNTED OUT) + JRST CLKONJ ;MAKE SURE CLKCHN ON IN CASE SLEEP WAS 0 & SKIPPED UFLS ENTIRELY + +;RELOAD CALL - IGNORE ARGS +;MUST BE FROM TOP LEVEL NON-DISOWNED JOB +;RELOADS AND STARTS SYS: ATSIGN WHATEVER + +NRELOAD:SKIPGE SUPPRO(U) + SKIPGE APRC(U) + JRST OPNL40 ;NOT TOP LEVEL + CONO PI,CLKOFF + PUSHJ P,LOGUPD ;LOG OUT + PUSHJ P,DMNPLI ;AND IN AGAIN + PUSHJ P,USRST2 ;RESET USER VARS + CONO PI,CLKON + SETZM @UTMPTR(U) ;TEMPORARY HIGH PRIORITY + JRST USTCDR ;LOAD FILE AND START IT + +AMASTER:UMOVE J,(J) + CONO PI,CLKOFF ;OPER 61 + SKIPL A,UMASTER + JRST AMAST2 + SKIPGE J +AMAST1: HRRZM U,UMASTER + JRST CLKOJ1 + +AMAST2: CAME U,A + JRST AMAST3 + SKIPL J + SETOM UMASTER + JRST CLKOJ1 + +AMAST3: JUMPGE J,CLKOJ1 + SKIPGE TTYTBL(U) + JRST CLKONJ ;LOSEY + PUSHJ P,RPCCK + CAME A,UMASTER + JRST AMASTER + JRST AMAST1 + +;.CALL SSERVE - Set .SERVER variable without timing screw. +; ARG1: , the client whose .SERVER variable is to be munged +; ARG2: , the server to be stored in the variable +; If one arg is given, it is the server and the client defaults to %JSELF +NSSERVER: + MOVE J,A + CAIL W,2 + SKIPA A,B + MOVEI J,%JSELF + JSP T,NCORUI ; Decode client and AOS his DIELOK + JRST NSSRV1 ; OK to write + JSP T,NCORWR ; Check further + JRST OPNL31 ; CAN'T MODIFY JOB +NSSRV1: +IFN PDP6P,[ + CAIN J,-1 ; PDP6? + JRST OPNL34 ; WRONG TYPE DEVICE +];PDP6P + EXCH J,A ; A: client J: server + JSP T,NCORUI ; Decode server and AOS his DIELOK + JFCL ; Don't give a damn about writability +IFN PDP6P,[ + CAIN J,-1 ; PDP6? + JRST OPNL34 ; WRONG TYPE DEVICE +];PDP6P + MOVEM J,SERVER(A) ; Safe to set it now + PUSHJ P,LSWPOP ; Server's DIELOK + JRST LSWPJ1 ; Client's DIELOK + + + SUBTTL LOGIN/ATTACH/DETACH/DISOWN CODE + +;SYMBOLIC CALL LOGIN: LOG A TREE IN. MUST BE GIVEN BY TOP-LEVEL NON-LOGGED-IN JOB +;WITH NO INFERIORS. +;ARG 1 - DESIRED UNAME +;ARG 2 - "TERMINAL NAME", PUT IN TRMNAM USER VARIABLE AND PRINTED AS SIXBIT ON SYSCON. +;ARG 3 - DESIRED XUNAME, FOR DEMON TO KNOW WHO TO ACCOUNT. + +NLOGIN: HLRE T,UNAME(U) + AOJN T,OPNL31 ;JUMP ON ALREADY LOGGED IN + SKIPL SUPPRO(U) + JRST OPNL40 ;CAN'T LOG IN IF NOT TOP LEVEL + JUMPE A,OPNL11 + HLRE T,A + AOJE T,OPNL11 ;BAD NAME + CAIGE W,3 + MOVE C,A ;IF XUNAME (ARG 3) MISSING, DEFAULT TO UNAME. + MOVEI D,0 + CONO PI,CLKOFF +ALOG2: SKIPN UNAME(D) + JRST ALOG4 + MOVE T,JNAME(D) + CAMN T,JNAME(U) + CAME A,UNAME(D) + JRST ALOG3 + JRST OPNL13 ;CONSOLE CONTROLLED TREE ALREADY LOGGED IN THAT NAME + +ALOG3: HRRZ T,SUPPRO(D) + CAMN T,U ;CAN'T LOGIN IF HAVE INFERIOR. RESTRICTION IMPOSED HERE + JRST OPNL12 ;SINCE WE NO CODE HERE TO SET INFERIOR'S UNAME. +ALOG4: ADDI D,LUBLK + CAMGE D,USRHI + JRST ALOG2 ;LOOP FOR ALL SETS OF PROCEDURE VARIABLES + HRRZ T,TTYTBL(U) + HRLI T,[ASCIZ / LOGIN /] + PUSHJ P,SGWAIT ;ASK THE SYSTEM JOB TO PRINT OUT THE RELEVANT INFO + SKIPL TTYTBL(U) ;SKIP IF NOT CONSOLE CONTROLLED + AOS SUSRS ;INCREMENT COUNT OF LOGGED IN CONSOLE CONTROLLED TREES + MOVEM A,UNAME(U) ;SET UNAME TO WHAT LOGGED IN AS + MOVEM A,SLGIV + MOVEM A,USYSNM(U) ;SET SNAME " + MOVEM A,HSNAME(U) ;SET HOME SNAME " + MOVEM C,XUNAME(U) ;SET XUNAME " " (USER MAY MUNG LATER) + MOVEM B,TRMNAM(U) + MOVEM B,SLGIV+2 ;INCLUDE TRMNAM AS SECOND NAME PRINTED + PUSHJ P,DMNPLI ;GIVE INFO TO DEMON + JRST CLKOJ1 ;TURN CLK ON AND SKIP RETURN + +ASETM2: UMOVE A,1(J) ;.OPER 5 + MOVEM A,MSKST2(U) +ASETMSK: UMOVE D,(J) ;OPER 4 + MOVE A,U + MOVEI I,1 + SOS (P) ;WILL SKIP RETURN + JRST USMASK ;ACT LIKE .SUSET. + +ARSYSI: SKIPA A,[ITSVRS] ;OPER 52 +ARDTIME:MOVE A,TIME ;OPER 17 + JRST APTUAJ + +IFE KS10P,[ ; On the KS10 they made DATAI 0, a UUO! +ARDSW: DATAI A ;OPER 20 + JRST APTUAJ +] ;IFE KS10P +IFN KS10P, ARDSW==:ILUUO + +ASUPSET:MOVEI C,003777 ;OPER 53 + XCTR XR,[AND C,(J)] + MOVE D,SUPCOR ;SAVE OLD CONTENTS + XORB C,SUPCOR + UMOVEM C,(J) + HRROI A,SUPCOR + JRST ASPST2 + +; .CALL DET +; ERROR RETURN +; NORMAL RETURN + +;DET: SETZ +; SIXBIT /DETACH/ +; SETZ [] ;SEE NCORUI + +;DISOWN JOB'S ENTIRE TREE AND FREE CONSOLE. IF TREE HAS NO +;CONSOLE, JUST MAKES IT DISOWNED. NO ARG => THIS JOB'S TREE +;ALWAYS SKIPS IF THE JOB SPEC IS REASONABLE. + +;CTL BIT 1.1 => DON'T SET SIGN OF APRC (DON'T MAKE TREE "DISOWNED"). +;CTL BIT 1.2 => USE SYSTEM TREE'S RESOURCE WORD +;CTL BIT 1.4 => KILL TREE AN HOUR FROM NOW IF IT ISN'T REOWNED +;CTL BIT 1.5 => SUPPRESS THE CONSOLE-FREE MESSAGE ON THE TTY + +NDETAC: HLRZ B,A ;XOR LH OF 1ST ARG INTO CTL BITS + XORM B,CTLBTS(U) + PUSHJ P,SWTL ;MAKE SURE NOBODY ELSE IS REARRANGING TREES. + TREESW + MOVEI J,(U) ;DEFAULT TO OUR TREE + JUMPE W,NDETA0 ;JUMP IF NO ARGS SUPPLIED + MOVE J,A ;JOB SPEC + JSP T,NCORUI ;DECODE ARG, GET USER INDEX IN J + JFCL ;IGNORE INFO ON WRITEABILITY + CAIG J,LUBLK ;DONT DETACH SYSJOB OR CORE JOB + JRST OPNL31 +NDETA0: SKIPL T,SUPPRO(J) ;FIND TOP LEVEL JOB OF TREE (IN J) + JRST [ MOVE J,T + JRST NDETA0 ] + HRRZ A,J ;TOP OF TREE + SKIPGE APRC(A) + JRST LSWCJ1 ;TREE IS ALREADY DISOWNED. + MOVEI Q,NDETA8 + PUSHJ P,IFPLUP ;STOP ALL BUT THIS JOB + PUSHJ P,NDETA7 ;DO THE WORK + JRST LSWCJ1 ;UNSTOP THE TREE + +NDETA7: PUSH P,U ;US + PUSH P,A ;TOP LEVEL + MOVEI U,(A) + CONO PI,CLKOFF + PUSHJ P,LOGUPD ;FOR ACCOUNTING PURPOSES, THIS IS LIKE A LOGOUT + CONO PI,CLKON +NDETA1: MOVEI U,(A) ;GET IN U USER INDEX OF OWNER OF TTY + MOVE A,TTYTBL(U) ;GET IN A TTY NUMBER + TLNE A,%TBDTY ;TREE HAS NO TTY => + JRST [ POP P,A ;JUST MAKE IT DISOWNED. + POP P,U + JRST NDETA5 ] + JUMPL A,NDETA1 ;GAVE TTY AWAY + MOVE T,(P) ;TOP-LEVEL JOB OF TREE SAVES USER TTY OPTIONS IN + MOVE B,TTYOPT(A) ;HIS STTYOP VARIABLE + AND B,[%TOUSR,,%TPUSR] + MOVEM B,STTYOP(T) + LDB B,[.BP (%TCRFS+%TCQRY),TTYCOM(A)] + IORI B,4 ;MAKE STTYOP NON-ZERO TO SHOW IT WAS STORED + DPB B,[170300,,STTYOP(T)] ;OVERLAPS PADLF FIELD + HRRZS A + PUSH P,TTYSTS(A) ;SAVE THIS TTY INFO + PUSH P,TTYST1(A) ;WILL PUT INTO TTY OWNER'S USER VARS + PUSH P,TTYST2(A) ;AFTER SUCCEED IN FREEING THE TTY + MOVE B,A + IMULI B,TPLEN*2 + MOVN B,TPVB+TPLEN(B) + ADD B,TCMXV(A) + PUSH P,B + MOVSI B,%TCDET ;IF TREE DETACHED DUE TO TOP LVL INT, + SKIPN USER ;THE CONSOLE FREE MESSAGE SHOULD SAY SO. + IORM B,TTYCOM(A) .SEE SYSCFM + ;THIS ALSO HAPPENS IF DIALUP LINE HUNG UP, OS'ERS BEWARE! +;DROPS THROUGH + ;DROPS IN +IFN N11TYS,[ + CONO PI,CLKOFF + PUSHJ P,TVBNCL ;CLEAR VIDEO BUFFER # + CONO PI,CLKON +];N11TYS + MOVE B,-5(P) ;GET BACK IDX OF RUNNING JOB + MOVE B,CTLBTS(B) + MOVSI T,%TACFM + TRNE B,20 ;CTL BIT 1.5 => MARK THE TTY AS NOT NEEDING CNSL FREE MSG. + IORM T,TTYSTA(A) + PUSHJ P,TTYLO1 ;NOW MAKE CONSOLE FREE. + POP P,B ;CAN'T PCLSR AFTER THIS POINT + DPB B,[$TBECL,,TTYTBL(U)] + POP P,TTSTSV+1(U) ;STORE INTO TTY'S OLD OWNER + POP P,TTSTSV(U) ;OLD TTY VARS FROM BEFORE FREEING IT + POP P,B + MOVEM B,TTSTSV+2(U) + SKIPA A,(P) ;TOP LEVEL JOB +NDETAA: HRRZ A,T + SKIPGE T,TTYTBL(A) ;SKIP IF HE HAS IT + JRST NDETAA ;NOW DO GUY HE GAVE IT TO + CAIE A,(U) + BUG ;BUT. BUT. BUT. + MOVSI B,%TBNOT+%TBDTY ;TAKEN FROM --ME-- AND DOESN'T HAVE IT + IORM B,TTYTBL(A) + HLLZS TTYTBL(A) + POP P,A ;TOP LEVEL + POP P,U ;US + HLRO B,UNAME(A) + AOSE B ;IF DETACHED TREE WAS LOGGED IN + SOS SUSRS ;ONE LESS CONSOLE CONTROLLED TREE +NDETA5: MOVSI B,BUMRTL ;IF REQUESTED, MARK TREE AS DUE TO DIE + MOVE D,CTLBTS(U) ;IN AN HOUR. + ANDCAM B,APRC(A) + TRNE D,10 + IORM B,APRC(A) + CONO PI,CLKOFF ;PERFORM ACCOUNTING FOR THIS USER AS IF HE WERE LOGGING OUT. + EXCH U,A + PUSHJ P,LOGUPD + EXCH U,A + MOVE D,JNAME(A) ;IF TOP LEVEL JOB ... + CAME D,[SIXBIT /HACTRN/] ;IS A HACTRN, + JRST NDETA3 +NDETA2: AOS D ;AOS ITS NAME LEVEL UNTIL ... + PUSHJ P,UJNAMU ;IT IS UNIQUE + JRST NDETA2 ;(UJNAMU TURNS OFF CLOCK) + MOVEM D,JNAME(A) +NDETA3: EXCH U,A + PUSHJ P,DMNPLI ;LOG BACK IN, NAME MAY HAVE CHANGED FROM HACTRN TO HACTRO + EXCH U,A + CONO PI,CLKON + MOVEI Q,NDETA9 ;NOW SAY ALL JOBS IN TREE + JRST IFPLUP ;ARE DISOWNED + +NDETA8: CAIE A,(U) ;IF JOB ISN'T SELF, STOP IT + JRST IFSTOP + POPJ P, + +;"ATTACH" SYSTEM CALL: +;1ST ARG - JOB SPEC -> OUR INFERIOR, OR TOP OF A DISOWNED TREE. +;2ND ARG - TTY SPEC (OF A TTY WHICH MUST BE FREE) + ;2ND ARG ABSENT => USE OUR CONSOLE, AND GUN OUR TREE +;CONTROL BIT 400000 => CHANGE JOB'S NAME TO HACTRN (IF 2 ARGS) +; 4 => START JOB AFTER ATTACHING (JUST LIKE DETACH) + +;CONNECTS THE SPECIFIED JOB TO THE SPECIFIED TTY, AS A CONSOLE CONTROLLED TREE. +;IF THE TTY IS OUR CONSOLE, WE ARE LOGGED OUT. +;IF THE JOB IS OUR INFERIOR, IT IS FIRST DISOWNED. + +NATTAC: PUSHJ P,SWTL + TREESW + SOJE W,NATTAN + EXCH A,B ;2ND ARG => IT IS TTY SPEC, SO DECODE IT. + JSP J,ATTYCI + MOVE A,B + MOVE B,I ;AND PUT IT IN B. + JRST NATTA6 + +NATTAN: SKIPL B,SUPPRO(U) ;NO 2ND ARG => WE MUST BE TOP LEVEL, SINCE WE'LL HAVE + JRST OPNL40 ;TO LOG OUT. B GETS NEGATIVE. +NATTA6: MOVE J,A + JSP T,NCRUI2 ;DECODE 1ST ARG, GET USR IDX IN J. + JFCL + SKIPGE A,SUPPRO(J) + JRST NATTA5 ;JOB SPEC'D MUST BE EITHER + CAIE U,(A) ;OUR INFERIOR, OR + JRST OPNL31 + JRST NATTA7 + +NATTA5: SKIPL APRC(J) ;THE TOP OF A DISOWNED TREE. + JRST OPNL31 +;NOW IF TTY IS OUR CONSOLE, B IS NEGATIVE; OTHERWISE, B HAS TTY #. +NATTA7: PUSH P,CTLBTS(U) + SETZM CTLBTS(U) ;DON'T GET FAKED OUT AT NATTA1, NATTA2, DSWNTY. + PUSH P,J + MOVE A,J + MOVEI Q,NDETA8 ;STOP SPEC'D JOB AND ITS INFERIORS. + PUSHJ P,IFPLUP + JUMPL B,NATTAG +NATTAM: CONO PI,TTYOFF + SKIPL T,TTYSTA(B) ;SEE IF TTY IS FREE + JRST NATTAL + MOVSI T,(SETZ) ;IT IS, GRAB IT + ANDCAM T,TTYSTA(B) .SEE %TACFM + ANDCAM T,TTYSTS(B) .SEE %TSFRE + CONO PI,TTYON + JRST NATTA8 ;SINCE NO PCLSR POSSIBLE, DON'T BOTHER WITH A LOSSET OF THESE + +NATTAL: HRRE Q,TTYSTS(B) + CONO PI,TTYON + SKIPG Q ;IF TTY IS IN USE + TLNE T,%TACTZ ;OR BEING ^Z'ED, DEVICE NOT AVAIL + JRST [ SUB P,[2,,2] ? JRST OPNL10 ] + MOVSI T,%TACFM+%TACTZ ;OTHERWISE JUST WAIT FOR CONSOLE FREE + TDNN T,TTYSTA(B) ;MESSAGE TO FINISH COMING OUT + PUSHJ P,UFLS + JRST NATTAM + +NATTAG: MOVE A,U ;IF HACKING OUR CONSOLE, MUST STOP OUR WHOLE TREE + MOVEI Q,NDETA8 ;(EXCEPT US, OF COURSE - NDETA8 CHECKS THAT). + PUSHJ P,IFPLUP + MOVEI B,(U) +NATTA4: MOVE B,TTYTBL(B) ;FIND THE TTY'S NUMBER. + TLNE B,%TBDTY + JRST NATTAL ;THIS TREE HAS NO TTY? + JUMPL B,NATTA4 .SEE %TBNOT + PUSHJ P,SDTTY ;GET TTY BACK TO TOP OF TREE FOR AGBLT3 LATER. + BUG + HRRO B,TTYTBL(U) +;I BELIEVE THAT NOTHING CAN PCLSR BEYOND THIS POINT. +;RH OF B HAS TTY #; SIGN IS SET IF TTY IS OUR CONSOLE. +NATTA8: AOS TTNTO(B) ;KEEP DSWNTZ FROM HALTING (WILL UNDO THIS LATER) + PUSH P,B ;PUSH ,, + HRRZ A,-1(P) ;LEGALITY OF CALL FULLY CHECKED; CAN START ALTERING. + SKIPGE APRC(A) ;IF SPEC'D JOB IS OUR INFERIOR, DISOWN IT. + JRST NATTA9 + MOVE B,TTYTBL(A) + TLNE B,%TBDTY ;IF THE INFERIOR HAS THE TTY, TAKE IT AWAY. + JRST NATTAF + PUSHJ P,SDTTY + BUG +NATTAF: HRRZ A,-1(P) + MOVEI Q,DSWNTY ;JUST LIKE .DISOWN, BUT KNOW JOBS ARE ALREADY STOPPED. + PUSHJ P,IFPLUP + PUSHJ P,NATTA1 +NATTA9: MOVEI Q,NATTA2 + MOVE A,U + SKIPGE (P) ;IF HACKING OUR CONSOLE, DISOWN OUR TREE SO IT IS FREE. + PUSHJ P,IFPLUP + ;OUR TTY NOW IN INCONSISTENT STATE SINCE WE ARE DISOWNED + ;BUT TTY STILL BELONGS TO US. AGBLT3 FIXES THAT. + MOVE B,(P) + SOSGE TTNTO(B) + BUG + MOVE TT,-1(P) ;NOW "RE-OWN" THE SPEC'D JOB + MOVE A,UNAME(TT);NOT CHANGING ITS UNAME + HRRZ J,B ;TO THE DESIRED TTY, WITH APPRO. RESOURCE WORD. + MOVEI D,USRRCE(B) + TLO D,400000 ;TELLS UFN2A THE TREE SHOULD BECOME UN-DISOWNED. + SETZ B, ;NO INTERRUPT BIT NEEDED. + SETOM DLSRCH ;INHIBIT SCHEDULING (UFN2A UNDOES THIS) + PUSH P,U + PUSHJ P,UFN2A + POP P,U + HRRZ A,-1(P) + SKIPA C,A +NATTAH: MOVE C,D ;FIND THE JOB IN THE TREE BEING ATTACHED + MOVE D,TTYTBL(C) + TLNN D,%TBDTY ;THAT IS SUPPOSED TO GET CONTROL OF THE TTY. + JRST NATTAH + SETOM SUPPRO(A) ;BUT DON'T LEAVE IT THINKING IT IS OUR INFERIOR. + SKIPGE I,(P) + JRST NATTAD + HLRE B,UNAME(A) ;ATTACHING JOB TO FREE TTY: + AOSE B + AOS SUSRS ;THIS MAY MEAN 1 MORE LOGGED IN CONSOLE-CTL'ED TREE. + CONO PI,TTYOFF + PUSHJ P,TTYINI ;INIT TTYOPT, ECHO AREA, TTYCOM, TTYSTA. + MOVSI B,%TSFRE ;NOW MAKE TTY'S TTYSTS HAPPY + ANDCAM B,TTYSTS(I) + MOVSI B,%TSCNS + IORM B,TTYSTS(I) + HRRM A,TTYSTS(I) + CONO PI,TTYON#1 ;TTYCHN ON, BUT NOT CLKCHN. + PUSH P,U + PUSH P,I ;IF THE JOB BEING ATTACHED IS LOGGED IN, + MOVE U,-3(P) ;PERFORM ACCOUNTING FOR IT. + HLRO T,UNAME(U) + AOSE T + PUSHJ P,LOGUPD + POP P,I + POP P,U +;DROPS THROUGH + ;DROPS IN + MOVE D,['HACTRN] + PUSHJ P,UJNAMU + JRST NATTAI + MOVE B,-2(P) ;SAVED CTLBTS(U) AT ENTRY + TRNE B,400000 + MOVEM D,JNAME(A) +NATTAI: MOVE B,-2(P) ;CTLBTS + MOVSI D,%USTSP ;BUSRC + TRNE B,4 + ANDCAM D,USTP(A) ;START JOB BEING ATTACHED, IF REQUESTED TO + PUSH P,U + HRRZ U,C ;GET USR IDX GIVING TTY TO IN U, +IFN N11TYS,[ + HRRZ T,I ;TTY # IN T FOR USTTV0 + PUSHJ P,USTTV0 ;GIVE THE JOB A BLINKER IF IT DESERVES ONE. + JFCL +] + POP P,A ;USR IDX TAKING TTY FROM (BUT NOT REALLY TAKING). I AND U STILL SET. + PUSHJ P,AGBLT4 ;MOVE HIS PER-JOB VARIABLES INTO THE TTY'S VARIABLES, ETC. + JRST NATTAE ;CLOCK IS NOW BACK ON. + +NATTAD: CONO PI,CLKOFF + MOVE J,JNAME(U) ;ATTACHING OUR TTY TO JOB: + MOVEM J,JNAME(A) ;GIVE JOB OUR JNAME ALONG WITH OUR TTY. + MOVE A,U + HRRZ U,C + PUSHJ P,AGBLT6 ;TRANSFER TTY TO HIM, SAVING OUR TTY STATE AND LOADING HIS. +NATTAE: MOVE U,A + POP P,B + EXCH U,(P) ;U := USER INDEX OF TOP OF TREE BEING ATTACHED + MOVSI T,BUMRTL ;SINCE TREE HAS BEEN ATTACHED, IT SHOULDN'T + ANDCAM T,APRC(U) ;DIE AN HOUR AFTER IT WAS DETACHED. + SKIPN STTYOP(U) ;RESTORE SAVED TTY OPTIONS, IF ANY + JRST NATTAP + LDB T,[170200,,STTYOP(U)] + DPB T,[.BP (%TCRFS+%TCQRY),TTYCOM(I)] + MOVE T,[%TOUSR,,%TPUSR] + ANDCAM T,TTYOPT(I) + AND T,STTYOP(U) + IORM T,TTYOPT(I) +NATTAP: HLRE T,UNAME(U) + CONO PI,CLKOFF + AOSE T + PUSHJ P,DMNPLI ;LOG HIM IN + CONO PI,CLKON + POP P,U + SUB P,[1,,1] ;FLUSH SAVED CTLBTS + PUSHJ P,LSWCLR ;UNSTOP THE JOBS AND FREE TREESW + JUMPGE B,POPJ1 ;RETURN IF WE DIDN'T GIVE AWAY OUR CONSOLE. + SETOM TTYTBL(U) ;DON'T WANT ALOGOU TO TYPE LOGOUT MESSAGE. + JRST ALOGOUT ;LOG THIS JOB OUT. + +;.CALL DISOWN +; RH OF ARG IS JOB SPEC, OF OUR INFERIOR. +; LH OF ARG XOR CONTROL BITS: +; 1.1 => RETAIN PRIORITY (DON'T SET APRC) +; 1.2 => USE SYSTEM RESOURCE +; 1.3 => CLEAR .USTP AFTER DISOWNING (THUS AVOIDING TIMING ERROR) +; 1.4 => SET BUMRTL SO THAT JOB WILL BE GUNNED IF IT IS STOPPED FOR A WHOLE HOUR +; AND NOT REOWNED OR ATTACHED. + +NDISOWN:HLRZ J,A + XORM J,CTLBTS(U) ;XOR LH OF 1ST ARG INTO CTL BITS. + HRRZ J,A + JSP T,NCRUI2 ;DECODE JOB SPEC; DON'T SET DIELOK. + JFCL + CAIN J,-1 + JRST OPNL31 ;PDP6 NO GOOD. + MOVEI R,IOCHNM(U) + ADD R,A ; R GETS ADDR OF IOCHNM WORD IF ARG WAS CHANNEL #, + TRNE A,400000 ;GET S0 IF ARG WAS OTHER SORT OF JOB SPEC. + SETZ R, + HRRZ A,J + HRRZ J,SUPPRO(A) + CAME J,U + JRST OPNL31 ;NO GOOD IF NOT OUR INFERIOR. + JRST NDISO1 ;JOIN OLD-STYLE DISOWN + +;.DISOWN CH, ;MAKES DIRECTLY INFERIOR PROCEDURE OPEN ON CHANNEL CH + ;THE TOP LEVEL JOB OF A DISOWNED JOB + +ADISOWN:HRRZ B,(R) ;PICK UP CH TYPE INDEX + SKIPL CLSTB(B) .SEE %CLSU ;SKIP IF AN INF. USER CHANNEL + JRST IOCER7 ;OTHER TYPE, GIVE IOC ERROR + HLRZ A,(R) ;PICK UP INF.'S INDEX + SETZM CTLBTS(U) +NDISO1: PUSHJ P,SWTL + TREESW + SETZM STTYOP(A) + MOVE B,TTYTBL(A) + TLNE B,%TBDTY ;SKIP IF TTY TAKEN AWAY + JRST ADISO1 + PUSH P,R + PUSH P,A ;JOB TO BE DISOWNED HAS THE TTY: TAKE IT AWAY. + PUSHJ P,SDTTY + BUG + POP P,A + POP P,R +ADISO1: MOVEI Q,DSWNTY + PUSHJ P,IFPHAK ;HACK INFERIORS + CAME U,USER + BUG + PUSHJ P,NATTA1 ;FLUSH OUR POINTERS TO INFERIOR, AND SET FLAGS + CAME U,USER + BUG + JRST LSWCJ1 ;UNSTOP HIS TREE AND FREE TREESW + +;FLUSH INFERIOR-JOB CHANNELS FROM JOB IN U TO JOB IN A +;CANNOT PCLSR BECAUSE JOB IS CURRENT OR STOPPED ALREADY +NATTA1: MOVEI R,0 ;NO PROTECTED CHANNEL + MOVEI D,%CLSU + EXCH U,A + PUSHJ P,ZUSES1 ;FLUSH POINTERS TO INFERIOR + EXCH U,A + SETOM SUPPRO(A) ;MARK AS TOP LEVEL + MOVE W,CTLBTS(U) + MOVSI TT,BUSRC ;CLEAR .USTP IF REQUESTED + TRNE W,4 + ANDCAM TT,USTP(A) + MOVSI TT,BUMRTL + TRNE W,10 + IORM TT,APRC(A) + POPJ P, + +DSWNTY: SKIPL TTYTBL(A) + BUG ;CHECKED AT HIGHER LEVEL, DATA INCONSISTENT +NATTA2: TDZA T,T ;DO SOS TTNTO OF CONSOLE TTY. +NDETA9: SETO T, ;DON'T. + PUSHJ P,CHSCAA ;LOOK AT ALL CNHLS + PUSHJ P,DSWNTZ ;BLESSING CONSOLE TTY CHNLS + MOVEI TT,SYSRCE ;SET RESOURCE POINTER TO SYSTEM OR DISOWNED + MOVE W,CTLBTS(U);DEPENDING ON CTLBTS + TRNN W,2 + MOVEI TT,USRRCE+NCT + MOVEM TT,UTMPTR(A) + MOVSI T,400000 + TRNN W,1 + IORM T,APRC(A) ;MARK AS DISOWNED + POPJ P, + +;BLESS CONSOLE TTY CHANNELS. IF T NONZERO, DON'T SOS TTNTO. +DSWNTZ: HLRZ B,(R) ;GET LH OF IOCHNM WORD + HRRZ J,(R) ;GET DEV TYPE INDEX + CAIL J,TYIDN ;SKIP IF LESS THAN LEAST TTY INDEX + CAILE J,TYOBN ;SKIP UNLESS .LTEQ. HIGHEST + POPJ P, ;NOT A TTY CHANNEL + TRZ B,#%TICNS#(.BM $TIIDX) + TRZE B,%TICNS ;SKIP IF NOT A CONSOLE TTY + CAIN B,%TINON ;DO NOTHING TO "DISOWNED" TTY CHNLS + POPJ P, + MOVEI J,%TINON ;CHANGE OTHER TTY CHNLS TO DISOWNED + DPB J,[$TIIDX,,(R)] ;CHNLS. + JUMPN T,CPOPJ ;IN NDETAC, TTNTO ALREADY SETZM'D. + SOSLE TTNTO(B) ;DECREMENT OPEN COUNT + POPJ P, + BUG ;SHOULD BE OPEN AT HIGHER LEVELS + +;ROUTINE TO SCAN ALL I/O CHANNEL AND I/O PDL SLOTS OF A PROCEDURE +;R 4.9=1 => REGULAR CHANNEL 4.9=0 => IOPUSHED CHANNEL +CHSCAA: MOVEI R,IOCHNM(A) +CHSCAN: HRLI R,-20 +CHSCA2: XCT @(P) + AOBJN R,CHSCA2 + HRLI R,-+400000 +CHSCA4: XCT @(P) + ADD R,[1,,2] + JUMPG R,CHSCA4 + JRST POPJ1 + ; +;IFPHAK AND IFPLUP TAKE A USER INDEX IN A AND THE ADDRESS OF A ROUTINE +; IN Q. THEY CALL THE ROUTINE FOR THE PROCEDURE AND ALL OF ITS +; INFERIORS BUT IFPHAK ALSO STOPS THE SPECIFIED PROCEDURE AND +; ALL ITS INFERIORS STRINGING THEIR USTP'S INTO THE CURRENT USER'S +; LSWPR. +; +IFPHAK: PUSH P,U + PUSH P,Q + MOVE U,USER ;MADE SURE YOU USE THE RIGHT LSWPR + MOVEI Q,IFSTOP ;SET UP TO STOP + PUSHJ P,IFPLUP + POP P,Q + POP P,U +IFPLUP: PUSH P,E ;SAVE E + PUSH P,H ; " H + SKIPA H,A +IFPLU5: MOVE A,E ;RECURSE + PUSH P,H + PUSH P,Q + PUSHJ P,(Q) ;CALL ROUTINE + POP P,Q + POP P,H + MOVEI E,LUBLK*2 ;INITIALIZE TO INDEX OF JOB AFTER CORE JOB +IFPLU2: SKIPN UNAME(E) + JRST IFPLU3 + HRRZ T,SUPPRO(E) + CAIN T,(A) + JRST IFPLU5 +IFPLU3: ADDI E,LUBLK ;STEP TO NEXT VAR BLOCK + CAMGE E,USRHI ;SKIP IF ALL EXAMINED + JRST IFPLU2 ;NOT ALL, CONTINUE + CAME H,A ;ALL, SKIP IF BACK TO TOP LEVEL + JRST IFPLU4 ;NOT AT TOP LEVEL, POP UP + POP P,H ;RESTORE H + POP P,E ; " E + POPJ P, ;RETURN FROM CALL TO IFPLUP + +IFPLU4: MOVE E,A ;POP + HRRZ A,SUPPRO(A) ;UP + JRST IFPLU3 ;AND CONTINE + +IFSTOP: PUSHJ P,RPCLSR ;STOP ROUTINE WHOSE INDEX IS IN A + HRRZ T,USTP(A) + SOJE T,IFSTP1 + SKIPE LSWB0+1(A) + JRST UPCLSR ;HAVE ALREADY HACKED THIS GUY +IFSTP1: MOVEI T,USTP(A) ;GET LOC OF USTP (WAS AOSED BY RPCLSR) + MOVEI H,LSWB0(A) ;GET LOC OF A LOCKED SWITCH BLOCK OF PROC STOPPED + MOVEM T,(H) ;SET WD1 + PUSH P,U + HRRZ T,U + IDIVI T,LUBLK + POP P,U + HRL T,LSWPR(U) + IORI T,603000 ;SOS WHEN UNLOCKED + MOVSM T,1(H) + MOVEM H,LSWPR(U) ;ADD TO LOCKED SWITCH LIST OF USER + POPJ P, + +UBLAM: SKIPL APRC(U) ;SKIP IF DISOWNED + PUSHJ P,SDTTY ;GET TTY UP TO THIS LEVEL + JFCL +UBLAST: PUSHJ P,IODCL ;CLOSE IO DEVICES ETC +UBLST2: SETZ B, + PUSH P,U ;DO NOT USE THIS ROUTINE FOR CORING UP. + HRRZ Q,U +IFE SWPWSP,[ + CAME Q,BUSR + JRST UBLST4 + SETOM BUSR ;SWAP-BLOCKED NO MORE + SOS NUSWB + MOVSI TT,(SETZ) + ANDCAM TT,USWSCD(U) +];SWPWSP +UBLST4: MOVE U,USER + PUSHJ P,ACRF1 ;CORE DOWN TO NUM OF BLOCKS IN B + BUG + MOVE U,USER ;;CHECK FOR ALLEGED BUG SOMEPLACE IN ACRF1 + SKIPL CORRQ(U) ; + BUG ;;NOT SUPPOSED TO RETURN UNTIL CORE REQUEST SATISFIED + POP P,U + SKIPE NMPGS(U) ; + BUG ;;THUS GUY'S CORE SHOULD BE GONE BY NOW + POPJ P, + + +AEOFC: UMOVE B,(J) + LDB B,[400,,B] ;OPER 50 + ADDI B,IOCHNM(U) + MOVE A,(B) + MOVE A,CLSTB(A) + HLR A,(B) +IFN NUNITS, TLNE A,%CLSDI +.ALSO SKIPA A,UTEOF(A) + MOVEI A,EOFCH + JRST APTUAJ + +;OPER TO REQUEST OR FLUSH RUNNING IN IOT USER MODE +AIOTLS: MOVSI A,400000 + MOVSI B,%PCUIO + XCTR XR,[SKIPGE (J)] + JRST AIOTL1 ;JUMP IF WANT TO ENTER IOTLSR MODE + ANDCAM A,IOTLSR(U) + ANDCAM B,UUOH + POPJ P, + +AIOTL1: SKIPGE IOTLSR(U) + JRST AIOTL2 ;ALREADY IN IOTLSR, JUST TURN THE BIT ON AGAIN FOR HIM + BUG INFO,SIXBIT,UNAME(U),SIXBIT,JNAME(U),[IOTLSR] + MOVEI T,SCRMSG ;WAIT FOR IT TO BE PRINTED (HA HA WHAT ABOUT BUFFERING?) + TDNE T,SUPCOR + PUSHJ P,UFLS + IORM A,IOTLSR(U) +AIOTL2: IORM B,UUOH + JRST CLKONJ + +SUBTTL FILENAME TRANSLATION + +;ROUTINE TO TRANSLATE A FILENAME. +;WANTS DEV, FN1, FN2, SNAME IN A, B, C, D RESP. LEFT-JUST. +;WANTS MODE IN RH OF E. +;RETURNS TRANSLATED NAMES IN SAME PLACE. +TRAN: SKIPN D ;MAYBE DEFAULT THE SNAME. +TRAN6: MOVE D,USYSNM(U) + MOVEM B,EPDLT1(U) + MOVEM C,EPDLT2(U) + MOVEM D,EPDLT3(U) + MOVEM A,EPDLT4(U) + SKIPN TRNCNT ;IF NO TRANSL. ENTRIES IN USE, + JRST POPJ1 ;SHORT CUT. + PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS. + LDB I,[100,,E] ;GET INPUT/OUTPUT BIT. + MOVEI H,10 ;MAX. NUM. TRANSLS ALLOWED. +TRAN0: HRROI Q,(U) ;1ST TRY THIS JOB'S TRNLST. + MOVE J,TRNLST(U) + JRST TRAN5 +TRAN1: SKIPGE Q,SUPPRO(Q) ;MOVE UP TREE TO TRNLS1. + SETZ Q, ;AFTER TOP OF TREE, USE SYS. +TRAN2: MOVE J,TRNLS1(Q) ;USE THIS GUY'S TRNLS1. + MOVEI Q,(Q) ;INDICATE THAT FACT IN SIGN. + JRST TRAN5 +TRAN3: CAME B,TRANI1(J) ;ENTRY'S FN1 MATCHES + SKIPN TRANI1(J) ;OR IS NULL? + SKIPA TT,TRANI2(J) ;YES, GET FN2. + JRST TRAN4 ;NO, TRY NEXT ENTRY. + CAME TT,C ;FN2 MTCHES OR NULL. + JUMPN TT,TRAN4 + CAME D,TRANIS(J) ;SNAME ? + SKIPN TRANIS(J) + SKIPA TT,TRANID(J) ;YES, GET DEV. + JRST TRAN4 + CAME A,TT + JUMPN TT,TRAN4 ;TEST DEV. + HLRZ TT,TRANLK(J) ;GET ENTRY'S MODE BITS. + TRNN TT,1(I) ;TRANSLATE OUR MODE? + JRST TRAN4 ;NO. + MOVEM B,EPDLT1(U) + MOVEM C,EPDLT2(U) + MOVEM D,EPDLT3(U) + MOVEM A,EPDLT4(U) +IRPS X,,OD O1 O2 OS + SKIPE TRAN!X(J) + MOVE A+.IRPCN,TRAN!X(J) +TERMIN ;REPLACE NAMES FROM ENTRY. + TRNE TT,400000 ;ATOMIC? + JRST TRANX3 ;YES, EXIT. + SOJG H,TRAN0 ;ELSE RETRANSL. + JRST TRANX2 ;IF TOO MANY TRANSL., DON'T SKIP. + +TRAN4: HRRE J,TRANLK(J) ;CDR DOWN LIST. +TRAN5: JUMPGE J,TRAN3 ;TRY NEXT UNLESS AT END. + JUMPL Q,TRAN2 ;IF DID TRNLST, DO SAME JOB'S TRNLS1. + JUMPN Q,TRAN1 ;ELSE DO SUPPRO'S TRNLS1. +TRANX3: AOS (P) ;EXIT IF DID SYS. +TRANX2: SOS TRNREF ;NO LONGER USING TRANSL. LISTS. + POPJ P, + +TRANRF: AOS TRNREF ;SAY USING TRANSL. LISTS. + SKIPGE TRANSW + POPJ P, ;OK IF NOT BEING CHANGED. + SOS TRNREF ;NOT REFERENCING AFTER ALL. + SKIPL TRANSW ;WAIT TILL FREE. + PUSHJ P,UFLS + JRST TRANRF ;TRY AGAIN. + ;TRANS SYSTEM CALL. +NTRNS: JSP T,DEFARG ;DEFAULT 5 ARGS TO 0. + 5 + XOR E,CTLBTS(U) ;XOR CTL BITS WITH ARG S + PUSHJ P,TRAN ;TRANSLATE NAME. + JRST OPNL3 ;FAIL IF TOO MANY TRANSL. + JRST POPJ1 ;ELSE GIVE BACK TRANSL'D NAMES. + + +DEFARG: CAML W,(T) ;IF NOT ALL SPEC'D, + JRST 1(T) + SETZM A(W) ;DEFAULT ONE AND RETRY. + AOJA W,DEFARG + +;LOCK TRANSW, AND SET UP 1ST ARG FOR NTRNAD, NTRNDL, NTRNCL. +;RH OF A HAS JOB SPEC; CONTROL BIT ARGS XOR'D INTO LH. +;THE 4.8 BIT, IF SET, INDICATES TRNLS1 RATHER THAN TRNLST. +;OTHER LH BITS IGNORED,, NOT CHANGED BY NTRNUI. +;ON RETURN, A'S LH IS UNCHANGED, RH IS SUCH THAT +; TRANLK(A) IS THE ADDR OF THE SPECIFIED TRNLS VAR. +NTRNUI: PUSHJ P,SWTL + TRANSW + TSC A,CTLBTS(U) + MOVEI J,(A) + JSP T,NCRUI2 ;DECODE THE JOB-SPEC. + JRST NTRNU1 ;JOB GUARANTEED WRITEABLE. + JUMPE J,NTRNU1 ;ALLOW JOBS TO MUNG THE SYSTEM TRANSLATION LIST. + JSP T,NCORWR ;ELSE CHECK. + JRST OPNL31 ;NOT WRITEABLE. +NTRNU1: CAIN J,-1 + JRST OPNL34 ;PDP6?? + HRRI A,TRNLST-TRANLK(J) + TLNE A,200000 ;4.8 BIT SAYS WHICH TRNLS TO USE. + ADDI A,TRNLS1-TRNLST + JRST (Q) + +;GET UP TO 4 ARGS INTO D ... D+3, FROM AOBJN PTR IN B. +NTRNGA: MOVSI H,-4 ;UP TO 4 ARGS. + JUMPGE B,NTRNG3 +NTRNG0: UMOVE J,(B) + JUMPGE W,NTRNG2 ;W IS -1 FOR .TRANA, .TRAND; + TRNN H,-1 ;IN THAT CASE LEFT-JUST. DEV. (1ST ARG) + HRLZI J,(J) +NTRNG2: CAMN J,[SIXBIT/*/] + MOVEI J,0 ;REPLACE * BY BLANK. + MOVEM J,D(H) ;STORE AWAY. + AOBJP H,CPOPJ ;DONE AFTER 4TH ARG. + AOBJN B,NTRNG0 ;ELSE GET NEXT. +NTRNG3: SETZM D(H) ;ZERO REMAINING ARGS. + AOBJN H,NTRNG3 + POPJ P, + ;TRANEX CALL -- READ IN A JOB'S TRANSL LIST. +;1ST ARG RH - JOB SPEC. BIT 4.8 - IF SET, TRNLS1 NOT TRNLST. +;2ND ARG AOBJN -> PLACE TO STORE LIST INTO. +;UPDATED AOBJN PTR IS OUTPUT ARG. +;SKIPS IF ENTIRE LIST FIT IN BUFFER. +;EACH ENTRY TAKES 9 WDS OF SPACE: MODE,, IN 1ST, +;INPUT DEV, FN1, FN2, SNAME; THEN OUTPUT DEV, FN1, FN2, SNAME. +NTRNEX: PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS. + PUSHJ P,SOSSET ;RELINQUISH IF BLOCKED. + TRNREF + TSC A,CTLBTS(U) + MOVEI J,(A) + JSP T,NCRUI2 ;DECODE THE JOB SPEC. + JFCL ;NOT TRYING TO WRITE. + HRRI A,TRNLST-TRANLK(J) + TLNE A,200000 ;MAKE TRANLK(A) BE TRNLS VAR. + ADDI A,TRNLS1-TRNLST + SUB B,[1,,1] ;SINCE WE AOBJ BEFORE ACTING. +NTRNE1: HRRE T,TRANLK(A) ;AT END -> RETURN SKIPPING. + JUMPL T,NTRNE8 + HLLZ D,TRANLK(T) ;RETURN LH ONLY OF 1ST WD. + TLOA T,-9 +NTRNE2: MOVE D,TRANLK(T) ;ALL OF OTHER 8 WDS. + AOBJP B,[ PUSHJ P,OPNL37 + JRST NTRNE9] + ;FAIL IF NO ROOM. + UMOVEM D,(B) + ADDI T,SIOMT-1 + AOBJN T,NTRNE2 ;STORE ALL 9. + MOVEI A,-9*SIOMT(T) ;GO TO NEXT. + JRST NTRNE1 + +NTRNE8: AOS (P) + AOBJP B,.+1 ;COMPENSATE FOR SUB . + PUSHJ P,LSWPOP ;RELEASE READ ACCESS. +NTRNE9: MOVE A,B + JRST SYSCPT ;RETURN AOBJN PTR. + ;TRANDL CALL -- DELETE ENTRY FROM TRANSL LIST. +;1ST ARG RH JOB SPEC. OF JOB WHICH IS OK TO MODIFY. +;1ST ARG LH MODE BITS AS FOR .TRANAD, ALSO 4.8 BIT SAYS TRNLS1 +; (SPEC'D JOB AND INFS, RATHER THAN JUST SPEC'D JOB) +;2ND ARG AOBJN -> INPUT DEV, FN1, FN2, SNAME. (ONLY DEV NEC.). +;SKIPS IF SOMETHING WAS DELETED. +NTRNDL: JSP Q,NTRNUI ;PROCESS 1ST ARG., LOCK TRANSW. +NTRND: PUSHJ P,NTRNDA ;ACTUALLY DELETE. + JRST OPNL4 ;NOTHING TO DELETE => FILE NOT FOUND + JRST LSWPJ1 ;SKIP IF NTRNDA DID. + +NTRNDA: TLZ A,-1#400003 + PUSHJ P,NTRNGA ;ELSE GET INPUT NAMES. + SKIPGE TRANLK(A) + POPJ P, + HRRZS (P) ;CLEAR SKIP FLAG. + SKIPA T,A +NTRND2: MOVEI T,(H) ;CDR DOWN BOTH PTRS. +NTRND0: HRRE H,TRANLK(T) ;LOOK AT NEXT ENTRY. + JUMPL H,NTRNDX ;EXIT IF END. + CAMN D,TRANID(H) ;ALL 4 INPUT NAMES MUST MATCH. + CAME E,TRANI1(H) + JRST NTRND2 ;ELSE NOT TO BE DELETED. + CAMN TT,TRANI2(H) + CAME I,TRANIS(H) + JRST NTRND2 + HLLZ R,A ;GET MODE FROM ARG. + TLZ R,400000 ;DONT CLOBBER ATOM BIT + ANDCA R,TRANLK(H) ;TURN OFF IN MODE FROM ENTRY. + CAME R,TRANLK(H) ;IF DELETED ONE, CALL WILL SKIP. + HRROS (P) + MOVEM R,TRANLK(H) + TLNE R,3 ;IF NEITHER DIRECTION LEFT, SPLICE OUT. + JRST NTRND2 + SKIPE TRNREF ;WAIT TILL NOONE READING TRANSL LISTS. + PUSHJ P,UFLS + SOS TRNCNT ;ONE LESS ENTRY IN USE. + HRRZ R,TRANFL ;MAKE LINK -> CURRENT FREE LIST. + EXCH R,TRANLK(H) + HRRM R,TRANLK(T) ;REST OF TRNLS INTO PREDECESSOR'S LINK. + HRRZM H,TRANFL ;ADD THIS ONE TO FREE LIST. + JRST NTRND0 + +NTRNDX: HRRES TRANLK(A) ;IN CASE DELETED 1ST ENTRY. + SKIPGE (P) + AOS (P) ;SKIP IF SET FLAG. + POPJ P, + ;TRANAD CALL. -- ADD AN ENTRY TO A TRANSL LIST. +;1ST 2 ARGS AS FOR TRANDL. +;3RD ARG LIKE 2ND BUT GIVES OUTPUT NAMES. +;SKIPS UNLESS ALL ENTRIES WERE IN USE. +NTRNAD: JSP Q,NTRNUI +NTRNA: TLNN A,3 ;IF RELLY NOTHING WOULD BE TRANSL'D, + JRST LSWPJ1 ;DON'T BOTHER ADDING.. + PUSHJ P,NTRNDA ;DELETE ANY EXISTING TRANSL. FOR THESE INPUT NAMES. + JFCL ;IF WERE NONE. + SKIPGE T,TRANFL + JRST OPNL5 ;NO FREE ENTRIES - DIRECTORY FULL. + AOS TRNCNT ;1 MORE ENTRY IN USE. +IRPS X,,ID I1 I2 IS + MOVEM D+.IRPCN,TRAN!X(T) +TERMIN ;PUT INPUT NAMES INTO ENTRY. + MOVE B,C + PUSHJ P,NTRNGA ;GET OUTPUT NAMES. +IRPS X,,OD O1 O2 OS + MOVEM D+.IRPCN,TRAN!X(T) +TERMIN ;STORE OUTPUT NAMES. + MOVE H,TRANLK(A) ;PUT CURRENT TRNLS INTO LINK. + EXCH H,TRANLK(T) + HRREM H,TRANFL ;STORE BACK REST OF FREE LIST. + MOVEM T,TRANLK(A) ;TRNLS NOW STARTS WITH THSI ONE. + HLLM A,TRANLK(T) ;STORE MODE BITS. + JRST LSWPJ1 + ;TRANCL CALL -- RESET A ONE OR BOTH TRANSL LISTS FOR A JOB. +;1ST ARG RH HAS JOB SPEC OF MODIFYABLE JOB. +; BIT 4.8 CLEAR TRNLS1 VAR. (TRANSL FOR THIS JOB & INFS). +; BIT 4.7 CLEAR TRNLST VAR. (TRANSL FOR THIS JOB ONLY). +; ALWAYS SKIPS IF VALID. +NTRNCL: JSP Q,NTRNUI ;RH(A) -> TRNLST OR TRNLS1 VAR. + TLNE A,200000 + SUBI A,TRNLS1-TRNLST ;MAKE -> TRNLST VAR. + SUBI A,TRNLST-TRANLK + JRST NTRNC4 + +NTRNCA: SUBI A,TRNLST-TRANLK ;MAKE HOLD USR IDX. +NTRNC: PUSHJ P,SWTL ;GET WRITE ACCESS. + TRANSW +NTRNC4: AOS (P) + SKIPE TRNREF ;WAIT FOR READ REFS TO FINISH. + PUSHJ P,UFLS + TLNN A,100000 ;IF 4.7, HANDLE TRNLST. + JRST NTRNC0 + HRRE T,TRNLST(A) + SETOM TRNLST(A) ;SET LIST TO NIL. + JUMPGE T,NTRNC1 ;IF WASN'T NIL, FREE ENTRIES ON IT. +NTRNC0: TLZN A,200000 ;MAYBE HANDLE TRNLS1. + JRST LSWPOP + HRRE T,TRNLS1(A) + SETOM TRNLS1(A) + JUMPL T,LSWPOP ;NOTHING TO DO IF ALREADY NIL. +NTRNC1: MOVEI C,(T) ;SAVE START OF LIST. +NTRNC2: SOS TRNCNT ;UPDATE NUM ENTRIES IN USE. + HRRES H,TRANLK(T) + JUMPL H,NTRNC3 ;AT END, SPLICE INTO FREELIST. + MOVEI T,(H) ;ELSE CDR DOWN. + JRST NTRNC2 +NTRNC3: EXCH C,TRANFL + HRRZM C,TRANLK(T) + JRST NTRNC0 ;MAYBE CONSIDER THE OTHER LIST. + ;.TRANA, .TRAND CALLS. +ATRANA: UMOVE E,(B) + JSP T,ATRNDT ;SET UP ARGS FOR NTRNA . + PUSHJ P,SWTL ;GET WRITE ACCESS. + TRANSW + JRST NTRNA + +ATRNDL: +ATRAND: XCTR XR,[SKIPN E,(B)] + JRST ATRND0 ;ZERO UNAME -> TRANCL . + JSP T,ATRNDT ;SET UP ARGS. + PUSHJ P,SWTL ;GET WRITE ACCESS. + TRANSW + JRST NTRND + +ATRND0: JSP T,ATRNDT + TLO A,300000 ;SAY CLEAR BOTH LISTS. + CAMN D,[SIXBIT/*/] + SUBI A,TRNLS1-TRNLST ;NAKE SURE -> TRNLST VAR. + JRST NTRNCA + +ATRNDT: MOVE C,JNAME(U) + MOVEM C,ATRNJN ;WHO THE HELL'S USING THESE? + CAME E,UNAME(U) ;UNAME MUST BE 0 OR THSI JOB'S. + JUMPN E,CPOPJ ;ELSE MAKE UUO FAIL. + MOVNI W,1 ;SIGNAL TO NTRNGA. + MOVEI C,5(B) ;SET UP 2 AOBJN PTRS + MOVEI B,2(B) + HRLI C,-3 ;-> INPUT NAMES (B), OUTPUT NAMES (C). + HRLI B,-3 + XCTR XR,[HLL A,(B)] ;GET MODE BITS. + UMOVE D,-1(B) + JUMPE D,CPOPJ ;JNAME MUSTN'T BE 0. + CAME D,[SIXBIT/*/] ;IF *, USE THIS JOB'S TRNLS1. + JRST ATRND2 + HRRI A,TRNLS1-TRANLK(U) + JRST (T) + +ATRND2: MOVEI H,0 ;ELSE FIND JOB WITH THAT JNAME. + MOVE E,UNAME(U) ;THIS JOB'S UNAME. +ATRND1: CAMN E,UNAME(H) + CAME D,JNAME(H) + JRST ATRND3 ;NOT THE ONE WE'RE LOOKING FOR. + HRRE E,SUPPRO(H) + CAIE U,(E) ;IS THIS OUR INF. + CAIN U,(H) ;IS IT THE CURRENT JOB? + CAIA + POPJ P, ;NO, CAN'T SET ITS TRANSL LIST. + HRRI A,TRNLST-TRANLK(H) + JRST (T) ;OK, SET ITS TRNLST VAR. +ATRND3: ADDI H,LUBLK + CAMGE H,USRHI ;LOOK AT ALL JOBS. + JRST ATRND1 + POPJ P, ;CAN'D TRANAD NON EX JOB. + +SUBTTL JOB, BOJ DEVICE ROUTINES + +EBLK +JBMN==10 ;MAXIMUM NUMBER OF JOBS ON JOB DEVICE + +JBCUI: REPEAT JBMN,-1 ;-1 => CHNL FREE, ELSE (IF JBCG POSITIVE) CREATOR'S USR IDX. +JBCG: BLOCK JBMN ;-1 IF CREATOR GONE AWAY +JBWST: REPEAT JBMN,SNJOB ;CREATED JOB'S WAIT STATUS (CREATED JOB=HANDLER JOB) +%JB==1,,525252 +%JBWIN==400000 ;4.9 => CREATED JOB HAS DONE A SUCCESSFUL JOBRET +%JBREU==200000 ;4.8 => JOB CLOSED AND MADE ITSELF AVAILABLE FOR REUSE +%JBVAL==020000 ;4.5 => VALID BIT (CREATOR CAME IN, NO JOBRET YET) +%JBSTR==010000 ;4.4 => STORED BIT (CREATOR CAME IN, NO JOBGET YET) +%JBUNH==004000 ;4.3 => BOJ BLK UNHANG BIT +%JBSIO==001000 ;4.1 => IF DOING AN IOT, THIS BITS SAYS ITS REALLY A SIOT +%JBLOS==000400 ;3.9 => CREATED JOB WAS CLOSED AND KNOWS IT, SO DON'T REUSE + ;1.1-2.9 => LAST STATUS SET BY BOJ + +JBDEV: BLOCK JBMN ;DEVICE NAME, USER-SETTABLE (MOSTLY FOR PEEK AND WHO LINES) +JBFN1: BLOCK JBMN ;FN1 +JBFN2: BLOCK JBMN ;FN2 +JBSYS: BLOCK JBMN ;SYSNAME +JBOPNM: BLOCK JBMN ;OPEN MODE +JBFNP: BLOCK JBMN ;BP TO ASCIZ FILENAME STRING IN USER ADDRESS SPACE (OR 0 IF NONE). +JBCJUI: BLOCK JBMN ;RH = CREATED JOB'S USER INDEX. + ;LH = -1 IFF CREATED JOB GOING AWAY. JOB MUST EXIST + ;SINCE WHEN IT DIES IT FLUSHES THE JOB CHANNEL + ;AND ITS CREATOR'S CHANNELS. +JBSTS: BLOCK JBMN ;STATUS OF JOB-BOJ INTERACTIONS +;4.9=1 => IMAGE =0 => ASCII +;4.8=1 => BLOCK =0 => UNIT +;4.7=1 => WRITE =0 => READ +;4.6-4.3 => NUMBER OF TIMES TO SKIP +;4.2-3.6 => OPEN LOSS +;3.5-3.2 => # OF ARGS ON LAST .CALL +;1.4 => SYSTEM CALL OTHER THAN THOSE BELOW. +;1.3-1.1 => SYSTEM CALL + ;0 OPEN + ;1 IOT OR SIOT + ;2 MLINK + ;3 RESET + ;4 RCHST + ;5 ACCESS + ;6 FDELE (DELETE OR RENAME) + ;7 FDELE (RENAME WHILE OPEN) + +JBST2: BLOCK JBMN ;SECOND WORD OF JOBGET INFO + ;FOR UNIT IOT, 1 + ;FOR SIOT, THE BYTE COUNT + ;FOR BLOCK IOT, THE BLOCK POINTER + ;NEW FN1 FOR RENAME, MLINK. +JBOFN1: BLOCK JBMN ;FN1 BEFORE LAST TRANS +JBOFN2: BLOCK JBMN ;FN2 "" "" +JBOSYN: BLOCK JBMN ;SYSNAM "" +JBODEV: BLOCK JBMN ;DEV " " +JBNFN2: BLOCK JBMN ;NEW FN2 FOR FDELE. +JBAC7: BLOCK JBMN ;7TH ARG TO .CALL, NEW SNAME FOR MLINK. +JBAC10: BLOCK JBMN ;TABLE FOR .CALL ARG 10, FIRST BP ARG TO SOPEN/RENAME/MLINK/DELETE. +JBAC11: BLOCK JBMN ;TABLE FOR .CALL ARG 11, SECOND BP ARG TO RENAME, MLINK OR RENMWO. + +JBACTB: JBST2(H) ;TABLE OF POINTERS TO .CALL ARG TABLES + JBOFN1(H) + JBOFN2(H) + JBOSYN(H) + JBODEV(H) + JBNFN2(H) + JBAC7(H) + JBAC10(H) + JBAC11(H) + +JBIOCJ: BLOCK JBMN ;IO CHNL ERROR WORD. 4.9 => IOCER ON NEXT JOB IOT + ;RH = IOCER TYPE + +JBSW: -1 ;LOCK ON ASSIGNMENT OF INDEX IN ABOVE TABLES + 0 +BBLK + +;OPEN ON BOJ: DEVICE + +;3.5 = 1 => UNHANG ON BLK IOT AFTER EACH XFER OF MAXIMAL SIZE +BOJO: JUMPN W,OPNL12 ;NO SUCH MODE + SKIPGE E,JBI(U) ;JOB CHANNEL INDEX + JRST [ MOVE E,OPTION(U) ;IF THIS JOB ISN'T A JOB DEVICE, + TLNN E,%OPOJB ;IF IT'S EXPECTING TO BE AN OJB DEVICE, OK. + JRST OPNL10 ;OTHERWISE IT CAN'T WIN. + SKIPGE JBI(U) ;IF IT CAN WIN, WAIT TILL IT HAS. + PUSHJ P,UFLS + JRST BOJO] ;THEN TRY AGAIN. + CAIL E,JBMN + BUG ;JOB CHANNEL INDEX TOO BIG + CAME U,JBCJUI(E) + BUG + HRLZ A,E + HLRZS C + MOVSI TT,%JBUNH + TRNE C,20 + IORM TT,JBWST(E) + JSP Q,OPSLC7 + BDUAI,,BDUAO + BDBI,,BDBO + BDUII,,BDUIO + BDBI,,BDBO + +;OPEN ON JOB: DEVICE +;MODE BITS: +;3.1-3.3 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT +;A,B HAVE FILENAMES, RH(C) HAS DEVICE (JOB OR OJB) +;RH(D) AND LH(C) BOTH HAVE OPEN-MODE. + +JOBO: PUSHJ P,FLDRCK + JRST JOBO3 + JRST OPNL11 ;ILLEGAL FILE NAME +JOBO3: CAMN A,[SIXBIT /M.F.D./] + CAME B,[SIXBIT /(FILE)/] + JRST JOBO2 + JRST OPNL11 ;ILLEGAL FILE NAME +JOBO2: MOVEI J,0 ;SET J TO JOBGET "COMMAND" NUMBER + CAIN W,2 + MOVEI J,2 ;MLINK, MOSTLY JUST LIKE FDELE, BUT SEE JOBOF3 + CAIN W,4 + MOVEI J,6 ;FDELE + MOVNI E,1 + MOVSI Q,-JBMN + PUSHJ P,SWTL ;LOCK JOB CHNL ASSIGN SWITCH + JBSW +JOBO5: SKIPGE TT,JBCUI(Q) ;SKIP IF NOT FREE + JRST JOBO4 + MOVE T,UUOH + TLNN T,%PCFPD + JRST JOBORU ;JUMP IF THIS IS FIRST ATTEMPT TO OPEN + HRRZ H,C + CAIN H,'OJB + JRST JOBO6 + SKIPGE JBCG(Q) ;LOOK FOR CHANNEL ON WHICH THIS USER + CAIE TT,(U) ;PREVIOUSLY ATTEMPTED TO OPEN, BUT PCLSRED + JRST JOBO6 + MOVE T,EPDLT1(U) + MOVE TT,EPDLT2(U) + CAMN T,JBFN1(Q) + CAME TT,JBFN2(Q) + JRST JOBO6 ;NOT OPENING SAME FILE + MOVE TT,EPDLT4(U) + MOVE T,EPDLT3(U) + CAMN TT,JBDEV(Q) + CAME T,JBSYS(Q) + JRST JOBO6 ;NOT FOR SAME FILE + CONO PI,CLKOFF + HLRZ H,C + HRRZ T,JBSTS(Q) + CAIN T,(J) + CAME H,JBOPNM(Q) + JRST JOBO6 ;NOT FOR SAME OPEN TYPE AND MODE + MOVE TT,JBWST(Q) + TLNE TT,%JBLOS+%JBWIN+%JBREU + JRST JOBO6 ;HANDLER JOB NOT IN CORRECT STATE + HRRZ E,Q ;REUSE SAME HANDLER JOB AS IN PREVIOUS ATTEMPT TO OPEN + SETZM JBCG(E) ;I'M BACK + PUSHJ P,LSWPOP ;FREE JBSW + TLO TT,%JBVAL + MOVEM TT,JBWST(E) ;RE-GIVE OPEN COMMAND STILL SITTING IN JBSTS ETC. + HRLI E,400000 ;OPEN-TYPE WAIT + PUSHJ P,JBWT2 ;WAIT FOR HANDLER JOB TO PROCESS IT + JRST JOBO8 ;FINISH OFF THEN OPEN + +;FIRST ATTEMPT TO OPEN, CHECK FOR REUSEABLE HANDLER JOBS BEFORE CREATING NEW +JOBORU: CONO PI,CLKOFF + MOVE TT,JBWST(Q) + SKIPGE JBCG(Q) + TLZN TT,%JBREU + JRST JOBO6 ;IN USE ALREADY OR NOT WILLING TO BE REUSED + MOVE T,EPDLT4(U) + CAMN T,JBODEV(Q) + JRST JOBOR1 ;IF SAME SIMULATED DEVICE, OK TO SIEZE + CAMN A,JBOFN1(Q) + CAME B,JBOFN2(Q) + JRST JOBO6 ;DIFFERENT HANDLER NAME + MOVE T,USYSN1(U) + CAME T,JBOSYN(Q) + JRST JOBO6 ;DIFFERENT HANDLER NAME +JOBOR1: MOVEM TT,JBWST(Q) ;THIS ONE OK, SIEZE IT + HRRZ E,Q + MOVEM U,JBCUI(E) + HLRZM C,JBOPNM(E) + SETZM JBCG(E) + SETZM JBIOCJ(E) + PUSHJ P,LSWPOP ;FREE JBSW + JRST JOBO7 + +JOBO4: HRRZ E,Q ;REMEMBER FREE JOB CHNL IN CASE NEEDED +JOBO6: CONO PI,CLKON + AOBJN Q,JOBO5 ;SCAN REST OF JOB CHANNELS + JUMPL E,OPNL6 ;DEVICE FULL + MOVEM U,JBCUI(E);STORE CREATOR'S USER INDEX + PUSHJ P,LSWPOP ;FREE JOBSW + PUSHJ P,STMSET ;SETOM JBCUI(E) ON LOSSAGE + JBCUI(E) + SETZM JBDEV(E) + SETZM JBFNP(E) + HLRZM C,JBOPNM(E) + SETZM JBCG(E) + SETZM JBIOCJ(E) + MOVEI T,SNJOB ;INITIALIZE STATUS + MOVEM T,JBWST(E) + PUSH P,R + PUSH P,U + PUSH P,J + PUSH P,D + PUSH P,E + PUSH P,A + PUSH P,B + ANDI C,-1 ;FOR OJB DEVICE, LOOK FOR EXISTING JOB. + CAIN C,'OJB + JRST JOBO6B + MOVE A,UNAME(U) ;FOR JOB DEVICE, CREATE NEW JOB. + IDIVI E,10. + MOVEI B,'0(E) + LSH B,6 + ADDI B,'0(TT) + ADD B,[SIXBIT /JOB./] ;CREATE JNAME = 'JOB.MN' + MOVE C,[7,,(SIXBIT /USR/)] + MOVE D,[SETZ 3] + PUSHJ P,USROJ ;GENERATE USER(CAN ONLY PCLSR BEFORE CREATING INFERIOR) + JRST POP7J ;USER OPEN FAILED, MUST HAVE GONE TO OPNL ALREADY + CONO PI,CLKOFF + POP P,B + POP P,A + POP P,E + SETOM SUPPRO(TT) + MOVE T,[JBSTCD,,AC0S] + ADDI T,(TT) + BLT T,AC17S(TT) + HRLZI T,%PCUSR + MOVEM T,UPC(TT) + MOVEM A,AC0S+10(TT) + MOVEM B,AC0S+11(TT) + MOVE T,USYSN1(U) + MOVEM T,USYSNM(TT) ;SET CREATED JOB'S SYS NAME TO OURS + SETZM USTP(TT) ;START JOB AS SOON AS CLK BACK ON + JRST JOBO6C + +;OJB: DEVICE, LOOK FOR JOB WHOSE NAMES ARE THE FILENAMES SPECIFIED IN THE OJB OPEN. +JOBO6B: MOVE C,[7+UBPFJ,,'USR] ;DON'T EVER CREATE JOB FOR OJB. + MOVE D,[SETZ 3+UBPFJ_<-1>] + PUSHJ P,USROOJ + JRST POP7J + SUB P,[2,,2] + POP P,E +;TT HAS USER IDX OF JOB TO BE USED; CAN'T PCLSR AFTER THIS POINT. +JOBO6C: PUSHJ P,LSWDEL ;SETOM JBCUI(E) + POP P,D + POP P,J + POP P,U + POP P,R + HRRZM TT,JBCJUI(E) + MOVEM E,JBI(TT) +JOBO7: CONO PI,CLKOFF + MOVE TT,EPDLT1(U) + MOVEM TT,JBOFN1(E) + MOVEM TT,JBFN1(E) + MOVE TT,EPDLT2(U) + MOVEM TT,JBOFN2(E) + MOVEM TT,JBFN2(E) + MOVE TT,EPDLT3(U) + MOVEM TT,JBOSYN(E) + MOVEM TT,JBSYS(E) + MOVE TT,EPDLT4(U) + MOVEM TT,JBODEV(E) + MOVEM TT,JBDEV(E) + MOVE TT,EPDL(U) + MOVEM TT,JBAC10(E) + MOVE TT,EPDL3(U) + MOVEM TT,JBAC11(E) + JUMPN J,[PUSHJ P,JFDEL5 ;DELETE/RENAME/MLINK + JRST JOBO9] + LDB TT,[000300,,JBOPNM(E)] + ROT TT,-3 + MOVEM TT,JBSTS(E) + HRRZ C,JBOPNM(E) ;GET ALL OF OPEN MODE + MOVEM C,JBNFN2(E) ;GIVE IT +JOBO9: PUSHJ P,JBWT1 ;STORE STUFF AND HANG +JOBO8: LDB TT,[350400,,JBSTS(E)] + JUMPE TT,JOBOPL ;OPEN LOST + LDB C,[000400,,JBSTS(E)] + JUMPN C,[ SETOM JBCG(E) ;DELETE/RENAME/MLINK + JRST POPJ1 ] + MOVE C,JBOPNM(E) + SETZM IOCHST-IOCHNM(R) + HRLZ A,E + JSP Q,OPSLC7 + JDUAI,,JDUAO + JDBI,,JDBO + JDUII,,JDUIO + JDBI,,JDBO + +JOBOPL: LDB C,[270600,,JBSTS(E)] + SETOM JBCG(E) + SKIPE C + CAILE C,NOPNLS + MOVEI C,22 + JRST OPNL1-1(C) + +;RENAME WHILE OPEN ON JOB CHNL +JFDEL4: HLRZ E,(TT) ;JOB CHNL INDEX + MOVEI J,7 + PUSHJ P,JFDEL5 ;DO "FDELE" + MOVE TT,EPDL3(U) ;PASS ALONG THE BP ARG IF THERE WAS ONE. + MOVEM TT,JBAC11(E) + SETZM JBAC10(E) + JRST AIOCA1 ;GET RESULTS + +;FDELE/RENMWO/MLINK ON JOB CHANNEL +JFDEL5: MOVEM J,JBSTS(E) + MOVE TT,SRN3(U) ;REMEMBER NAMES TO RENAME AS + MOVEM TT,JBST2(E) ;FOR JOBGET TO RETURN. + MOVE TT,SRN4(U) + MOVEM TT,JBNFN2(E) + MOVE TT,SRN5(U) ;IN CASE THIS IS MLINK, MAKE SURE THE "TO" SNAME + MOVEM TT,JBAC7(E) ;IS GIVEN TO JOBGET. + CONO PI,CLKOFF + POPJ P, + +;GIVE AN INTERRUPT TO THE JOB DEVICE HANDLER. +;JOB CHNL INDEX IN E, CLOBBERS TT,J,Q,H +;CALL WITH CLKOFF + +JBINT: HRRZ TT,JBCJUI(E) + MOVEI J,IOCHNM(TT) + HRLI J,-20 + MOVSI H,%CLSBJ +JBINT1: MOVE Q,(J) + TDNN H,CLSTB(Q) ;SKIP IF BOJ +JBINT2: AOBJN J,JBINT1 + JUMPGE J,CPOPJ + SUBI J,IOCHNM(TT) + MOVE Q,CHNBIT(J) + IORM Q,IFPIR(TT) + ADDI J,IOCHNM(TT) + JRST JBINT2 + +;THIS IS THE CODE PUT IN THE ACS TO LOAD IN THE JOB DEVICE HANDLER + +JBSTCD: .OPEN 1,7 ;0 + .LOGOUT + .CALL 12 + .LOGOUT + .IOT 1,2 + .CLOSE 1, + JRST (2) + 4,,(SIXBIT /DSK/) ;7 + 0 ;10 FN1 + 0 ;11 FN2 + SETZ ;12 + SIXBIT /LOAD/ + 16 + SETZ 17 + -1 ;16 (LOAD INTO SELF) + 1 ;17 + +;HAND THE JOB DEVICE HANDLER A SYSTEM CALL AND WAIT FOR IT TO BE HANDLED. +;CALL WITH CLOCK OFF, JOB CHNL IN E +JBWT1: TLOA E,400000 ;OPEN/FDELE/MLINK, CLOSE CHANNEL IF PCLSR +JBWT: TLZ E,400000 ;NORMAL ENTRY POINT, DON'T CLOSE IF PCLSR + TLZA E,200000 +JBWTI: HRLI E,200000 ;ENTER HERE TO INHIBIT SETTING %PCFPD IF PCLSR + MOVSI TT,%JBVAL+%JBSTR + IORM TT,JBWST(E) ;TURN ON VALID AND STORED +JBWT2: PUSHJ P,JBINT ;GIVE INT + PUSHJ P,LOSSET + JBPCL ;CLEAR VALID AND STORED IF PCLSR + MOVE T,E ;CAUSES EPDL2 TO HAVE JOB INDEX + PCLT +JBFLS: SKIP JBFLS + PUSHJ P,UFLS ;AWAIT RESULTS FROM HANDLER JOB + MOVSI TT,%PCFPD + ANDCAM TT,UUOH ;NOW WE KNOW WE'LL RETURN TO USER WITHOUT PCLSRING FIRST + JRST LSWDEL + +JBPCL: MOVE A,AC0S+E(U) ;HERE IF PCLSR OUT + SKIPL JBCJUI(A) ;UNLESS HANDLER GOING AWAY + TLNE A,200000 ;OR THIS SYSTEM CALL DOESN'T WANT IT, + JRST JBPCL1 + MOVSI T,%PCFPD ;SET FIRST PART DONE FLAG + IORM T,UPC(U) ;NOTE PCLSR HAS ALREADY MOVED UUOH INTO UPC +JBPCL1: MOVSI T,%JBVAL+%JBSTR ;NOT VALID, NOT STORED + ANDCAM T,JBWST(A) + JUMPGE A,CPOPJ + SETOM JBCG(A) ;SAY THE CREATOR HAS CLOSED IT +IRPS X,,E TT J Q H + PUSH P,X +TERMIN + MOVE E,A ;AND GIVE THE HANDLER AN INTERRUPT + PUSHJ P,JBINT +IRPS X,,H Q J TT E + POP P,X +TERMIN + POPJ P, + +;JOB DEVICE BLOCK MODE IOT EITHER DIRECTION +JBBI: XCTR XRW,[MOVES D,(C)] ;REFERENCE POINTER + LDB B,[410300,,D] + CAIGE B,3 + POPJ P, + MOVEM D,JBST2(A) + MOVE B,C + HRRZ T,D ;-> FIRST WORD TO TRANSFER + HLROS D ;MINUS WORD COUNT + IORI D,700000 ;FLUSH CHAR COUNT + SUBM T,D ;D -> LAST WORD + 1 TO TRANSFER + JRST JBIPG ;SWAP IN BUFFER THEN DO IOT + +;JOB DEVICE UNIT MODE IOT EITHER DIRECTION + JRST JBSI ;SIOT +JBUI: MOVSI T,%JBSIOT + ANDCAM T,JBWST(A) + MOVEI T,1 + MOVEM T,JBST2(A) + UMOVE W,(C) ;FOR UNIT OUTPUT +JBIOT1: HRRZ TT,JBOPNM(A) + ROT TT,-3 ;MODE + HRRI TT,1 ;IOT CMD + HRRZ E,A ;JOB CHNL INDEX + MOVEM TT,JBSTS(E) + MOVEM C,SRN3(U) ;MAY BE ADDRESS OF BLOCK IOT POINTER + CONO PI,CLKOFF + SKIPL TT,JBIOCJ(E) + JRST JBWTI ;GO SIGNAL HANDLER JOB + SETZM JBIOCJ(E) ;TAKE IOC ERROR INSTEAD + JRST IOCERF-MIOTER(TT) + +;JOB DEVICE SIOT EITHER DIRECTION +JBSI: AOS (P) ;SIOT SHOULD SKIP RETURN + MOVSI T,%JBSIOT + IORM T,JBWST(A) + XCTR XRW,[MOVES T,(B)] ;BYTE PNTR ARG + LDB E,[300600,,T] ;BYTE SIZE + MOVEI D,36. + IDIVM D,E ;E := # BYTES PER WORD + XCTR XRW,[MOVES D,(C)] ;BYTE COUNT ARG + MOVEM D,JBST2(A) + IDIV D,E ;D := WORD COUNT, E := EXCESS BYTES + IBP T ;-> FIRST WORD TO TRANSFER + ADD D,T + SOJLE E,JBIPG +JBSI1: IBP D + SOJG E,JBSI1 +JBIPG: HRRZS D ;-> LAST WORD TO TRANSFER + 1 + ANDI T,-2000 ;-> FIRST PAGE INVOLVED IN TRANSFER + LDB E,[.BP .UII#.UIO,JBOPNM(A)] ;0 INPUT 1 OUTPUT +JBIPG1: SKIPE E ;SWAP IN THE NECESSARY PAGES + XCTR XR,[SKIPA 20(T)] + XCTR XRW,[MOVES 20(T)] + ADDI T,2000 + CAMGE T,D + JRST JBIPG1 + JRST JBIOT1 + +;FLSINS ROUTINE TO WAIT FOR CREATOR TO BE HUNG AT JBFLS +;4.9 OF SRN3 = 1 => WAIT FOR WRITE 0 => READ +;1.1-1.4 => CODE OF UUO TO WAIT FOR + +BJWAIT: SKIPE B,FLSINS(T) + CAME B,JBFLS + POPJ P, ;NOT HUNG AT JBFLS + HRRZ B,EPDL2(T) ;JOB INDEX THAT CREATOR IS HACKING + HLRZ E,T ;JOB INDEX OF BOJ USER + CAME B,E + POPJ P, ;CREATOR HACKING JOB DEVICE ON SOME OTHER CHANNEL + MOVE TT,JBSTS(B) + LSH TT,2 ;4.9 => READ/WRITE BIT NOW + EQV TT,SRN3(U) ;4.9 OF SRN3 => WHAT TO LOOK FOR + JUMPGE TT,CPOPJ ;DOESN'T MATCH + MOVE TT,JBSTS(B) ;INSN CREATOR IS DOING + XOR TT,SRN3(U) ;INSN LOOKING FOR + TRNN TT,17 + AOS (P) ;THEY MATCH, AWAKEN BOJ JOB + POPJ P, + +;BOJ DEVICE UNIT MODE OUTPUT +BJUO: SKIPGE C + SKIPA H,(C) + UMOVE H,(C) + MOVEI B,1 ;WAIT FOR INPUT IOT + MOVEM B,SRN3(U) + HRLZ T,A ;JOB INDEX + HRR T,JBCUI(A) ;CREATOR'S USER INDEX + PUSHJ P,CWAIT ;WAIT FOR CREATOR TO BE IN IOT, RETURN WITH CLK OFF + PUSHJ P,BJWAIT + PUSHJ P,BJUO1 + JRST CLKONJ + +BJUO1: MOVE TT,JBSTS(A) + TLNE TT,200000 + JRST BJUOB ;BLOCK MODE CREATOR IOT + LDB D,[.BP (%JBSIOT),JBWST(A)] + JUMPN D,BJUOS ;CREATOR SIOT + MOVEM H,AC0S+W(T) +BJIUNH: MOVSI D,%JBWIN + IORM D,JBWST(A) ;SET SUCCESSFUL JOBRET BIT + MOVSI D,%JBVAL+%JBSTR + ANDCAM D,JBWST(A) + MOVEI D,0 + DPB D,[350400,,JBSTS(A)] ;DON'T SKIP + EXCH D,FLSINS(T) ;RESTART CREATOR + CONSO PI,1 + CAME D,JBFLS + BUG ;HE WASNT WHERE HE BELONGED + POPJ P, ;NEED NOT CLKON, CALLER WILL TURN IT ON + +;BOJ UNIT OUTPUT TO JOB SIOT +BJUOS: PUSHJ P,BJBINI + XCTRI XBYTE,[IDPB H,(B)] + SKIPA C,AC0S+C(T) + BUG + XCTR XRW,[SOSG (C)] + JRST BJIUNP + JRST PLDZ + +BJBINI: HRLI T,%UMALL + MOVE J,T + PUSHJ P,PLD1 + MOVE B,AC0S+B(T) + XCTRI XRW,[MOVE D,(B)] + POPJ P, + BUG + +;BOJ UNIT OUTPUT TO JOB BLOCK IOT +BJUOB: PUSHJ P,BJBINI + SKIPL JBSTS(A) + JRST BJUOBA ;ASCII + XCTRI XW,[MOVEM H,(D)] + CAIA + BUG + ADD D,[1,,1] + XCTRI XW,[MOVEM D,(B)] + CAIA + BUG + JUMPGE D,BJIUNP + JRST PLDZ + +;BOJ UNIT OUTPUT TO JOB BLOCK IOT, ASCII MODE +BJUOBA: LDB E,[410300,,D] ;CHAR COUNT + CAIGE E,3 + JRST BJIUNP + XCTRI XR,[MOVE W,(D)] + SKIPA E,BTOCHT-3(E) + BUG + IDPB H,E + XCTRI XW,[MOVEM W,(D)] + CAIA + BUG + ADD D,[700000,,] + TLNN D,500000 + ADD D,[500001,,1] + XCTRI XW,[MOVEM D,(B)] + CAIA + BUG + TLNE D,700000 + JRST PLDZ +BJIUNP: PUSHJ P,BJIUNH ;UNHANG CREATOR + JRST PLDZ + +;BOJ DEVICE BLOCK OUTPUT +BJBO: SKIPGE JBCG(A) + POPJ P, + XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER + LDB E,[410300,,D] + CAIGE E,3 + POPJ P, + HLRO B,D + IORI B,700000 ;FLUSH CHAR CNT + HRRZ T,D + SUB T,B + CAILE T,-1 + JRST IOADC ;DON'T WRAP AROUND (WHY NOT?) + UMOVE H,(D) ;H GETS FIRST WORD + MOVEI B,1 + PUSHJ P,BJBWT ;WAIT FOR JOB INPUT IOT, COME BACK WITH CLK OFF. + JRST CLKONJ ;UNHANG + MOVEI I,1 ;FOR BJBB + MOVE TT,JBSTS(A) + TLNE TT,200000 + JRST BJBB ;CREATOR IOT IS IN BLOCK MODE + JUMPGE TT,BJBOA ;CREATOR IOT IS ASCII + ADD D,[1,,1] +BJBO1: PUSH P,C + PUSH P,D + PUSHJ P,BJUO1 + POP P,D + POP P,C + XCTRI XW,[MOVEM D,(C)] + SKIPA T,IOTTB+BDBO + BUG +BJBEX: TLNN D,700000 + JRST CLKONJ ;BOJ BLOCK POINTER EXHAUSTED + MOVE E,JBWST(A) + CONO PI,CLKON + TLNN E,%JBVAL ;SKIP IF JOB IOT STILL WAITING FOR MORE + TLNN E,%JBUNH + JRST (T) ;TRANSFER MORE + POPJ P, ;UNHANG BOJ IOT PREMATURELY + +;BOJ BLOCK ASCII OUTPUT FETCH CHARACTER +BJBOA: MOVE E,BTOCHT-3(E) + MOVE W,H + ILDB H,E + ADD D,[700000,,] + TLNN D,500000 + ADD D,[500001,,1] + JRST BJBO1 + +;BOJ BLOCK IOT WAIT. AWAITS JOB IOT, UNLESS UNHANGING. +;TURNS CLKOFF. SKIPS UNLESS SUPPOSED TO UNHANG. +BJBWT: MOVEM B,SRN3(U) ;SAVE WHAT JOB UUO TO WAIT FOR + HRLZ T,A ;SET UP ARG FOR BJWAIT FLSINS + HRR T,JBCUI(A) + MOVE TT,JBWST(A) ;CHECK FOR DON'T HANG MODE + TLNE TT,%JBUNH + JRST BJBWT1 + PUSHJ P,CWAIT ;WAIT FOR JOB IOT + PUSHJ P,BJWAIT + JRST POPJ1 + +BJBWT1: CONO PI,CLKOFF ;IF NOT ALREADY IN JOB IOT, DON'T WAIT + JRST BJWAIT ;TEST CREATOR STATUS, POPJ OR POPJ1 + +;BOJ DEVICE UNIT MODE INPUT +BJUI: MOVE B,[SETZ 1] ;WAIT FOR OUTPUT IOT + MOVEM B,SRN3(U) + HRLZ T,A ;JOB INDEX + HRR T,JBCUI(A) ;CREATOR'S USER INDEX + PUSHJ P,CWAIT ;WAIT FOR CREATOR TO IOT, RETURN WITH CLKOFF + PUSHJ P,BJWAIT + PUSHJ P,BJUI1 + JRST CLKONJ + +BJUI1: MOVE TT,JBSTS(A) + TLNE TT,200000 + JRST BJUIB ;BLOCK MODE CREATOR IOT + LDB D,[.BP (%JBSIOT),JBWST(A)] + JUMPN D,BJUIS + MOVE W,AC0S+W(T) + JRST BJIUNH ;SUCCESSFUL + +;BOJ UNIT INPUT FROM JOB SIOT +BJUIS: PUSHJ P,BJBINI + XCTRI XBYTE,[ILDB W,(B)] + SKIPA C,AC0S+C(T) + BUG + XCTR XRW,[SOSG (C)] + JRST BJIUNP + JRST PLDZ + +;BOJ UNIT INPUT FROM JOB BLOCK IOT +BJUIB: PUSHJ P,BJBINI + SKIPL JBSTS(A) + JRST BJUIBA + XCTRI XR,[MOVE W,(D)] + CAIA + BUG + ADD D,[1,,1] + XCTRI XW,[MOVEM D,(B)] + CAIA + BUG + JUMPGE D,BJIUNP + JRST PLDZ + +;BOJ UNIT INPUT FROM JOB BLOCK IOT, ASCII MODE +BJUIBA: LDB E,[410300,,D] ;CHAR COUNT + MOVEI W,0 + CAIGE E,3 + JRST BJIUNP + XCTRI XR,[MOVE W,(B)] + SKIPA E,BTOCHT-3(E) + BUG + ILDB W,E + ADD D,[700000,,] + TLNN D,500000 + ADD D,[500001,,1] + XCTRI XW,[MOVEM D,(B)] + CAIA + BUG + TLNN D,700000 + JRST BJIUNP + JRST PLDZ + +;BOJ DEVICE BLOCK MODE INPUT +BJBI: SKIPGE JBCG(A) + POPJ P, ;EOF + XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER + LDB B,[410300,,D] + CAIGE B,3 + POPJ P, + HLRO E,D + IORI E,700000 ;FLUSH CHAR CNT + HRRZ T,D + SUB T,E + CAILE T,-1 + JRST IOADC ;DON'T WRAP AROUND + MOVE B,[SETZ 1] + PUSHJ P,BJBWT ;WAIT FOR JOB OUTPUT IOT, COME BACK WITH CLK OFF + JRST CLKONJ ;UNHANG + MOVEI I,0 ;FOR BJBB + MOVE TT,JBSTS(A) + TLNE TT,200000 + JRST BJBB ;CREATOR IOT IS IN BLOCK MODE + PUSH P,C + PUSH P,D + PUSHJ P,BJUI1 ;GET DATA OUT OF CREATOR UNIT MODE IOT + POP P,D + POP P,C + MOVE H,W + MOVEI T,BJBI + JUMPGE TT,BJBIA ;ASCII + XCTRI XW,[MOVEM H,(D)] + CAIA + BUG + ADD D,[1,,1] + JRST BJBIX + +;BOJ BLOCK ASCII INPUT STORE CHAR +BJBIA: LDB E,[410300,,D] + CAIGE E,3 + JRST CLKONJ + XCTRI XR,[MOVE W,(D)] + SKIPA E,BTOCHT-3(E) + BUG + IDPB H,E + XCTRI XW,[MOVEM W,(D)] + CAIA + BUG + ADD D,[700000,,] + TLNN D,500000 + ADD D,[500001,,1] +BJBIX: MOVEI T,BJBI + XCTRI XW,[MOVEM D,(C)] + JRST BJBEX + BUG + +BJOV: BJBI + BJBO + +;BOJ BLOCK IOT TO/FROM JOB BLOCK IOT +BJBB: MOVE J,T + HRLI J,%UMALL ;UMAPS FOR PURELY CREATOR IOT + MOVEM J,SRN4(U) +BJBBL: MOVE J,SRN4(U) + PUSHJ P,PLD1 + MOVE E,SRN3(T) + XCTRI XRW,[MOVES H,(E)] + CAIA ;H HAS JOB BLOCK IOT POINTER + BUG + PUSHJ P,PLDZ + XCTRI XRW,[MOVES D,(C)] + CAIA ;D HAS BOJ BLOCK IOT POINTER + BUG + JUMPGE H,[PUSHJ P,BJIUNH + MOVE T,BJOV(I) + JRST BJBEX] + JUMPGE D,CLKONJ + HLRE B,H + CAML D,H + HLRE B,D ;CHOOSE SMALLER OF TWO BLOCK SIZES + MOVNS B ;COUNT TO BE XFERRED + HRLZ E,H ;JOB ADDRESS + HRR E,D ;JOB,,BOJ (FROM,,TO FOR BOJ INPUT) + HLRZ Q,E ;JOB ADDRESS + CAIGE Q,20 + JRST BJBB1 ;JOB ADDR IS AN AC + HRRZ J,T ;SET UP UMAPS (JOB USER INDEX IN RH) + TRZE E,400000 + TLOA J,%UMMPL ;TO HI PG, HACK OUR LO PAGE + TLO J,%UMMPU ;TO LO PG, HACK OUR HI PAGE + TLZE E,400000 + TLOA J,%UMLTU ;TO POINT TO HIS UPPER + TLO J,%UMUTL ;TO POINT TO HIS LOWER + TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER FROM OUR LOWER? + JRST BJBB3 ;YES. MAKE SURE NOT SCREWED BY AC PNTR +BJBB3A: PUSHJ P,PLD1 + TRZ Q,400000 + MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF + ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY + CAMLE B,Q ;AND DIST OF FROM ADR FROM SEG BOUNDARY + HRRZ B,Q + MOVNI Q,(E) ; - BOJ ADDR + ADDI Q,400000 + CAMLE B,Q + HRRZ B,Q + TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED + TLOA E,400000 ;SET JOB ADDR TO HI SEG + TRO E,400000 ;SET BOJ ADDR TO HI SEG + SKIPE I + MOVSS E ;XFER OTHER DIRECTION + MOVE Q,E ;SAVE COPY OF BLT POINTER + ADDI B,(E) ;GET LA + 1 + XCTRI XBRW,[BLT E,-1(B)] ;XFER DATA + HRRZS E,B ;NO FAULT. SIMULATE STORE BACK OF POINTER (CAN BE 1,,0) + PUSH P,J + PUSHJ P,PLDZ + SUBM E,Q +BJBB2: HRLS Q ;NUMBER OF WORDS ACTUALLY XFERRED IN BOTH HALVES + XCTRI XRW,[ADDM Q,(C)] ;UPDATE BOJ BLK PNTR + JRST .+2 + BUG + MOVE J,SRN4(U) + PUSHJ P,PLD1 ;MAP TO CREATOR + POP P,J + MOVE W,SRN3(T) + XCTRI XRW,[ADDM Q,(W)] ;UPDATE JOB BLK PNTR + JRST .+2 + BUG + CAIN B,(E) + JRST BJBBL ;NO FAULT, LOOP BACK + PUSHJ P,PLD1 ;RESTORE TO FROB AT TIME OF FAULT +BJBBF: PUSHJ P,TPFLT ;TAKE FAULT (TURNS CLK ON) + PUSHJ P,MPLDZ ;RESTORE NORMAL MAP + JRST @BJOV(I) ;RESTART THE IOT + +;JOB ADDR IS AN AC +BJBB1: ADDI Q,UUOACS(T) + JUMPN I,BJBB1A + MOVE B,(Q) ;READ JOB WORD +BJBB3C: XCTRI XW,[MOVEM B,(E)] + JRST .+2 + JRST BJBBF +BJBB2A: MOVEI Q,1 ;1 WORD XFERRED + HRRZ B,E ;FAKE OUT FAULT TEST + PUSH P,J + JRST BJBB2 + +BJBB1A: XCTRI XR,[MOVE B,(E)] + JRST .+2 + JRST BJBBF + MOVEM B,(Q) + JRST BJBB2A + +BJBB3: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI + JRST BJBB3A ;NO. OK TO DO BLT + JUMPN I,BJBB3B + HRLI J,%UMALL ;HACK OUR HI TO POINT TO HIS HI + PUSHJ P,PLD1 + XCTRI XR,[MOVE B,(Q)] + JRST .+2 + BUG + PUSHJ P,PLDZ + HRRZ E,D ;TO ADDRESS + JRST BJBB3C + +BJBB3B: XCTRI XR,[MOVE B,(D)] + JRST .+2 + JRST BJBBF + HRLI J,%UMALL + PUSHJ P,PLD1 ;HACK OUR HI TO POINT TO HIS HI + XCTRI XW,[MOVEM B,(Q)] + JRST .+2 + BUG + PUSHJ P,PLDZ + JRST BJBB2A + +;.CALL JOBGET +;ARG 1 - BOJ CHNL +;UP TO SIX WDS RETURNED +;WD1 BITS: +%JG==1,,525252 + ;4.9-4.7 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT + ; 4.9-4.7 SHOULDN'T BE USED, SINCE THE FULL MODE IS IN WD7 ON AN OPEN +%JGCLS==40000 ;4.6 => CLOSE (NOTE 4.5 USED TO BE A CLS BIT ALSO) +%JGSIO==1000 ;4.1 => SIOT (ONLY IF OPCODE = 1) +%JGFPD==200 ;3.8 => THIS CALL WAS PCLSRED AND IS RESTARTING +;1.4-1.1 => TYPE OF OPERATION +%JO==,,-1 +%JOOPN==0 ;OPEN +%JOIOT==1 ;IOT/SIOT +%JOLNK==2 ;MLINK +%JORST==3 ;RESET +%JORCH==4 ;RCHST +%JOACC==5 ;ACCESS +%JORNM==6 ;FDELE (DELETE OR RENAME) +%JORWO==7 ;FDELE (RENAME WHILE OPEN) +%JOCAL==10 ;SYMBOLIC .CALL + +;WD2 SET ONLY FOR BLOCK IOT POINTER, ACCESS POINTER, NEW FN1 FOR FDELE +;WD3 FN1 +;WD4 FN2 +;WD5 SYS NAME +;WD6 LEFT ADJUSTED DEVICE NAME +;WD7 NEW FN2 FOR FDELE. +;IGNORE ALL RETURNED INFO ON AN ERROR RETURN +;IF 4.5 OR 4.6 IS SET THEN ALL ELSE IS MEANINGLESS + +NJBGT: SETZM T ;INDICATE JOBGET, NOT JOBCAL +NJBCL0: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD + TLNN R,%CLSBJ ;NOT A BOJ CHANNEL => WRONG TYPE DEVICE + JRST OPNL34 + CONO PI,CLKOFF + MOVE C,JBWST(E) + TLNN C,%JBVAL + JRST NJBGTE ;FAIL IF VALID NOT SET + TLZ C,%JBSTR + MOVEM C,JBWST(E) ;CLEAR STORED BIT + MOVE B,JBCUI(E) + MOVE B,SUUOH(B) + CONO PI,CLKON + MOVE A,JBSTS(E) + TLZ A,077777 ;FLUSH RANDOM BITS FROM LH + TLNE B,%PCFPD + TLO A,%JGFPD + TLNE C,%JBSIOT + TLO A,%JGSIO + JUMPN T,NJBCL1 ;BRANCH IF JOBCAL +NJBGT0: MOVE B,JBST2(E) + MOVE C,JBOFN1(E) + MOVE D,JBOFN2(E) + MOVE TT,JBODEV(E) + MOVE I,JBNFN2(E) + MOVE E,JBOSYN(E) + CONO PI,CLKON + JRST POPJ1 + +NJBGTE: SKIPL JBCG(E) ;HAS CREATOR GONE AWAY? + JRST OPNL36 ;NO, VALID CLEAR + CONO PI,CLKON ;YES, GIVE CLOSE + MOVSI A,%JBLOS + IORM A,JBWST(E) + MOVSI A,%JGCLS ;GIVE CLOSE BITS + JRST POPJ1 ;DON'T GIVE ANYTHING ELSE WHETHER JOBGET OR JOBCAL + +; .CALL ADR +; ERROR RETURN +; NORMAL RETURN + +;ADR: SETZ +; SIXBIT /JOBCAL/ +; [BOJCHNL] +; [-N,,ADR OF DATA BUFFER] ;OPTIONAL +; SETZM OPCODE +; OPCODE WILL BE THE SAME AS RETURNED IN WD1 BY JOBGET +; IF OPCODE<10 THEN WD2-WD7 OF JOBGET WILL BE WRITTEN INTO DATA BUFFER +; FOLLOWED BY JOB'S EPDL AND EPDL3 (THE BPS FOR BP-STYLE OPENS, ETC). +;IF OPCODE=10 THEN JOB'S LAST .CALL WILL BE DESCRIBED: +; WORD 1 OF DATA BUFFER => SIXBIT OF OPERATION (I.E. THE NAME +; OF THE .CALL) +; WORD 2 OF DATA BUFFER => FLAG BITS OF .CALL +; WORD 3 OF DATA BUFFER => # OF ARGS TO .CALL +; WORDS 4-12 => INPUT ARGS TO .CALL + +NJBCL: CAIL W,2 ;DID CALLER SUPPLY AOBJN POINTER? + SKIPN T,B ;IF SO AND NON-ZERO USE IT + MOVEI T,1 ;OTHERWISE SET T NONZERO + JRST NJBCL0 ;GO JOIN JOBGET CODE FOR ERROR CHECKING + +NJBCL1: JUMPGE T,POPJ1 ;BACK FROM JOBGET - ANY AOBJN PNTR? + MOVEI C,9 ;YES - OPCODE 10? + TRNN A,10 + JRST NJBCL2 ;NO - JUST COPY 9 STANDARD ARGS + HLRE D,T ;GET LENGTH OF USERS DATA BUFFER + MOVE B,JBCUI(E) ;GET JOB'S USER INDEX + MOVE C,LSCALL(B) ;GET NAME OF JOB'S LAST CALL + UMOVEM C,(T) ;PUT INTO CALLERS BUFFER + AOJE D,POPJ1 ;IF NO MORE ROOM - DONE + MOVE C,CTLBTS(B) ;GET USER'S .CALL FLAG BITS + UMOVEM C,1(T) + AOJE D,POPJ1 + LDB C,[230400,,JBSTS(E)] ;GET # OF ARGS + UMOVEM C,2(T) + JUMPE C,POPJ1 ;ANY ARGS TO PASS? + ADD T,[3,,3] ;YES - COPY INTO BUFFER +NJBCL2: JUMPGE T,POPJ1 ;ANY ROOM LEFT? + MOVNS C ;GET SMALLEST WORD COUNT + HLRE B,T + CAMLE C,B + HRL T,C ;MAKE AOBJN PNTR AS SMALL AS POSSIBLE + MOVE H,E ;JOB INDEX IN H FOR USING JBACTB + MOVEI B,JBACTB ;GET PNTR TO ARG TABLES +NJBCL3: MOVE C,@(B) ;GET NEXT ARG + UMOVEM C,(T) ;GIVE TO CALLER + AOS B + AOBJN T,NJBCL3 + JRST POPJ1 ;DONE - GO SKIP + +; .CALL ADR +; ERROR RETURN +; NORMAL RETURN + +;ADR: SETZ +; SIXBIT /JOBRET/ +; [BOJCHNL] +; [OPEN LOSS #(IF RH = 0),,# TIMES FOR CREATING JOB TO SKIP] +; SETZ [-N,,ADR OF DATA BUFFER] + +;RETURN DATA (E.G. RETURN TO RCHST,STATUS OR THE RETURN ARGS TO A .CALL) +;WILL BE COPIED FROM THE CALLER'S DATA BUFFER + +NJBRT: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD + TLNN R,%CLSBJ ;NOT BOJ CHNL => WRONG TYPE DEVICE. + JRST OPNL34 + CAIGE W,3 ;RETURN ARGS PROVIDED? + SETZM C ;NO - ZERO IT + JUMPGE C,NJBRT1 ;DO NOTHING IF NO RETURNS OR NO AOBJN + HLRE D,C ;GET LENGTH OF BUFFER + CAMGE D,[-8.] ;MAKE SURE AREA AT MOST 8 LONG + MOVNI D,8 ;OVER 8 - USE 8 + HRL C,D ;FIX AOBJN PNTR + MOVMS D + ADDI D,-1(C) ;GET ADDRESS OF LAST WORD NEEDED + XCTR XR,[SKIP (C)] ;MAKE SURE PAGES ARE IN + XCTR XR,[SKIP (D)] +NJBRT1: CONO PI,CLKOFF ;NOW OK TO TURN CLOCK OFF + MOVE A,JBWST(E) + TLNE A,%JBVAL + TLNE A,%JBSTR + JRST OPNL36 ;FAIL IF STORED IS SET OR IF VALID IS CLEARED + SKIPGE JBCG(E) + JRST OPNL41 + HRRZ TT,JBCUI(E) + MOVE D,FLSINS(TT) + CAME D,JBFLS + BUG + TLO A,%JBWIN + TLZ A,%JBVAL+%JBSTR + MOVEM A,JBWST(E) ;SET SUCCESSFUL JOBRET BIT, CLEAR VALID AND STORED + DPB B,[350400,,JBSTS(E)] ;NUMBER OF TIMES TO SKIP + MOVSS B + DPB B,[270600,,JBSTS(E)] ;OPEN LOSS + MOVSI B,-6 ;DEFAULT # WDS TO RETURN FOR .RCHST IS 6. + MOVEM B,JBAC11(E) + JUMPGE C,NJBRT3 ;ANY RETURN ARGS? + MOVEM C,JBAC11(E) ;REMEMBER HOW MANY, FOR .RCHST TO RETURN THAT MANY. + MOVE H,E ;YES - COPY THEM + MOVEI D,JBACTB +NJBRT2: XCTRI XR,[MOVE B,(C)] ;GET IT + AOSA D + BUG ;PAGE IS TIED - NO? + MOVEM B,@-1(D) ;PUT INTO ARG TABLE + AOBJN C,NJBRT2 +NJBRT3: SETZM FLSINS(TT) ;RESTART CREATOR + JRST CLKOJ1 + +;JOB DEVICE CLOSE ROUTINE +JOBCLS: SETOM JBCG(A) + MOVE E,A + CONO PI,CLKOFF + PUSHJ P,JBINT ;INTERRUPT POOR BOJ GUY + JRST CLKONJ ;SINCE HE HAS NO CREATOR + +; ROUTINES FOR JOB ACCESS, RFPNTR, RESET, AND STATUS + +RFPJOB: MOVEI J,4 ;USE OLD .RCHST OPERATION, OPCODE 4 + HRRM J,JBSTS(A) + MOVE E,A + CONO PI,CLKOFF + PUSHJ P,JBWT ;SIGNAL JOB, WAIT FOR ANSWER + HLRE TT,JBAC11(E) ;GET # VALUES RETURNED + MOVNS TT + CAIL TT,5 + SKIPA A,JBODEV(E) ;GET ACCESS POINTER RETURNED + SETO A, ;NO ACCESS POINTER RETURNED, USE -1 + CAIL TT,6 ;UP TO TWO MORE EXTRA RCHST RESULTS MIGHT BE RETURNED + MOVE Q,JBNFN2(E) + CAIL TT,7 + MOVE I,JBAC7(E) + CAIL TT,5 + MOVEI W,1(TT) ;# RESULTS FOR RCHST + MOVEI B,36. ;ALWAYS RETURN 36. AS BYTE SIZE UNTIL MORE WINNING + JRST POPJ1 ;CONVENTIONS EXIST. + +JBSTAT: HLRZ A,(R) ;GET JOB INDEX + HRRZ D,JBWST(A) ;GET MOST RECENT STATUS + POPJ P, + +JBORS: +JBIRS: MOVEI D,3 ;RESET IS OPCODE 3 + HLRZ A,(R) + HRRM D,JBSTS(A) + CONO PI,CLKOFF + MOVE E,A + PUSHJ P,JBWT ;WAIT FOR IT TO GET PROCESSED + POPJ P, + +JBACCS: MOVEI D,5 ;ACCESS IS OPCODE 5 + HLRZ A,(R) + HRRM D,JBSTS(A) + MOVEM B,JBST2(A) + CONO PI,CLKOFF + MOVE E,A + PUSHJ P,JBWT + JRST POPJ1 + +;.CALL JOBIOC (OLD NAME SETIOC STILL WORKS) +;ARG1: CHANNEL BOJ DEVICE IS OPEN ON +;ARG2: TYPE OF IOCER TO CAUSE + +;THIS CALL CAUSES THE NEXT IOT EXECUTED BY THE +;PROCEDURE ON THE OTHER END OF THE CHANNEL TO GET +;THE SPECIFIED IO CHANNEL ERROR + +NSTIOC: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD. + CAIL B,MIOTER + CAILE B,NIOTER + JRST OPNL33 ;BAD ARG. (NOT LEGAL IOCER) + TLO B,(SETZ) ;IN CASE IOCER 0 EVER EXISTS + TLNN R,%CLSBJ + JRST OPNL34 ;NOT BOJ CHANNEL + CONO PI,CLKOFF + MOVE A,JBCUI(E) ;PREPARE TO STOP CREATOR. + SKIPGE JBCG(E) + JRST OPNL41 ;CREATOR WENT AWAY + MOVE H,APRC(A) + TLNE H,BULGOS + JRST OPNL41 ;HE'S BEING KILLED NOW. + PUSHJ P,RPCLSR ;STOP + MOVEM B,JBIOCJ(E) + AOS (P) + JRST UPCLSR + + +;.CALL JOBSTS +;ARG1 - CHANNEL BOJ IS OPEN ON - REMAINING ARGS ARE OPTIONAL - +;ARG2 - NEW STATUS (RIGHT HALF OF STATUS WORD ONLY - I.E. DEVICE DEPENDENT STUFF) +;ARG3 - NEW DEVICE NAME FOR PEEK, WHO-LINE STATUS, RFNAME/RCHST +;ARG4 - NEW FN1 FOR .. +;ARG5 - NEW FN2 FOR .. +;ARG6 - NEW SNAME FOR .. +;ARG7 - NEW OPEN MODE FOR .. +;ARG8 - BP TO ASCIZ STRING IN USER ADDRESS SPACE CONTAINING FULL FILENAMES. + +NJBSTS: TLNN R,%CLSBJ + JRST OPNL34 + HLRZ A,(R) ;GET JOB INDEX + CAIGE W,2 ;DID HE SUPPLY STATUS? + MOVEI B,SNJOB ;NO - RESET TO INITIAL + HRRM B,JBWST(A) ;REMEMBER WHAT HE SAYS + MOVEI B,8 + SUB B,W + JUMPGE B,.+1(B) ;STORE WHATEVER ADDITIONAL ARGS WERE GIVEN + JSP B,NJBST2 ;8 + JSP B,NJBST1 ;7 + MOVEM TT,JBSYS(A) ;6 + MOVEM E,JBFN2(A) ;5 + MOVEM D,JBFN1(A) ;4 + MOVEM C,JBDEV(A) ;3 + JRST POPJ1 ;2 + JRST POPJ1 ;1 (DON'T TAKE THIS INSN OUT) + +NJBST1: XOR I,JBOPNM(A) + TRNE I,.BAO#.UAI + JRST OPNL12 ;NOT ALLOWED TO CHANGE BLOCK VS UNIT, IN VS OUT + XORM I,JBOPNM(A) + JRST (B) + +NJBST2: MOVE R,Q ;STORE BP IN Q INTO JBFNP WORD, + PUSHJ P,ASCIND ;AFTER DOING INDEXING AND INDIRECT. + MOVEM R,JBFNP(A) + JRST (B) + +; .CALL ADR ;SKIPS UNLESS JOB END OF CHNL NOT THERE + +;ADR: SETZ +; SIXBIT /JOBINT/ +; 401000,,BOJCH + +;GIVE CREATOR A SECOND WORD INT ON CHANNEL CORRESP TO BOJCH + +NJBINT: TLNN R,%CLSBJ ;ERROR IF NOT BOJ CHNL. + JRST OPNL34 + CONO PI,CLKOFF + HLRZ E,H + SKIPGE JBCG(E) + JRST OPNL41 + MOVE A,JBCUI(E) + MOVSI D,%CLSJ + SETZ C, + PUSHJ P,CHSCAA + PUSHJ P,[HRRZ B,(R) + SKIPGE R ;IOPDL CHNLS DON'T INTERRUPT + TDNN D,CLSTB(B) + POPJ P, + HRRZ B,R + SUBI B,IOCHNM(A) + IOR C,CHNBIT(B) + POPJ P,] + AND C,MSKST2(A) + JUMPE C,OPNL41 ;I CAN'T + MOVN B,C + AND C,B ;INT ONLY ONCE, ON HIGHEST NUMBERED CHANNEL + IORM C,IFPIR(A) + JRST CLKOJ1 + + +;.CALL JOBREU +;ARG 1 - SIMULATED DEVICE NAME +;ARG 2 - FN1 OF .. +;ARG 3 - FN2 OF .. +;ARG 4 - SNAME OF FILE WHICH HANDLER LOADED FROM +;ARG 5 - AMOUNT OF TIME TO SLEEP WAITING FOR SOMEONE TO OPEN + +;THIS CALL, WHEN EXECUTED BY A JOB DEVICE HANDLER JOB, MAKES +;THE HANDLER AVAILABLE FOR RE-USE. TAKES SUCCESS RETURN IF +;SOMEONE REUSES YOU; YOU SHOULD THEN DO THE "INITIAL JOBGET" + +NJBREU: SKIPGE H,JBI(U) + JRST OPNL10 ;NOT A BOJ HANDLER JOB + SKIPL JBCG(H) + PUSHJ P,UFLS ;WAIT FOR CLOSE TO FINISH HAPPENING + MOVEM A,JBODEV(H) + MOVEM B,JBOFN1(H) + MOVEM C,JBOFN2(H) + MOVEM D,JBOSYN(H) + TLNE E,1000 + JRST [ MOVNI E,(E) ;IMMEDIATE TIME, LOSE ON PCLSR + SUB E,TIME ;BUT ACCEPT ANYWAY SINCE NETBLK DOES + JRST NJBRU1 ] + MOVE TT,E + UMOVE E,(TT) ;GET TIME ARGUMENT + JUMPL E,NJBRU1 + MOVNS E + SUB E,TIME + UMOVEM E,(TT) ;POS REL TIME GIVEN, MAKE NEG ABS AND WRITE BACK +NJBRU1: MOVSI TT,%JBREU ;E NOW HAS NEGATIVE TIME TO SLEEP UNTIL + IORM TT,JBWST(H) + PUSHJ P,LOSSET + NJBRUL ;TURN OFF %JBREU WHEN CALL EXITED FOR WHATEVER REASON + SKIPA T,H + PUSHJ P,NJBRUW + PUSHJ P,UFLS + SKIPGE JBCG(H) + JRST OPNL41 ;TIMED OUT + JRST LSWPJ1 + +;FLSINS ROUTINE TO WAIT UNTIL TIMED OUT OR OPENED BY SOMEONE +NJBRUW: MOVN A,AC0S+E(U) + CAML A,TIME + SKIPL JBCG(T) + AOS (P) + POPJ P, + +;LOSSET ROUTINE TO LEAVE AWAITING-REUSE STATE +NJBRUL: MOVSI A,%JBREU + MOVE T,AC0S+H(U) + ANDCAM A,JBWST(T) + POPJ P, + +SUBTTL PERIPHERAL DEVICE ROUTINES IN SEPARATE FILES + +IFN NMTCS,[ + IFN TM10P,[ +$INSRT MTAPE + ] + IFN TM03S,[ +$INSRT NMTAPE +] +] +IFN NUNITS,[ +$INSRT UTAPE +] + +$INSRT DEUNA +$INSRT DISK + +IFN NETP,[ ; General ITS network code, includes specific nets +OVHMTR NET +$INSRT NET +] + +IFN E.SP,[ +$INSRT ITSDIS +] + +IFN MSPP,[ +$INSRT ITSMSP +] + +$INSRT TS3TTY + +$INSRT ITSDEV + +.BYTE 0 ;RECORD THE SYMS .EVAL'ED BY USER PROGRAMS +$INSRT EVSYMS +.BYTE + +SUBTTL DM DAEMON UUO'S + +IFE DEMON,ADEMON==ILUUO + +IFN DEMON,[ +ADEMON: JUMPE J,[AOJA J,.+2] ;IF J = 0 THEN SUBTRACT ONE + UMOVE J,(J) ;GET VALUE HERE + PUSHJ P,LSWTL + 400000,,DEMSW + PUSHJ P,DEMUSR ;FIND CURRENT USER IN DEMON TABLE + JRST UTOLKJ ;FAIL, JUST RETURN, NOT DEMON + HRRE TT,DMTTBL+2(B) + SUB TT,J + HRRM TT,DMTTBL+2(B) ;PUT NEW COUNT IN DEMON TABLE + SKIPLE TT +UTOLJ1: AOS (P) +UTOLKJ: CONO PI,UTCON + JRST LSWPOP + +ADEMSIG:MOVE D,B + CONO PI,CLKOFF ;DON'T LET SYS JOB LOOK TILL WE'RE READY. + MOVSI T,SCLDMN ;TELL IT TO LOOK FOR US, AFTER UFLS TURNS CLOCK ON. + IORM T,SUPCOR + SETZB T,SRN3(U) ;SYS JOB WILL SETOM SRN3 TO RESTART US + SKIPN SRN3(U) ;WITH 0 IN T => FILE EXISTS, OR OPNL CODE. + PUSHJ P,UFLS ;SYS JOB DETECTS US BY PC=ADEMS1. + ;DEMON NAME IS EXPECTED TO BE IN A. +ADEMS1: JUMPN T,OPNL1-1(T) + CAIGE W,2 ;NO SECOND ARG, JST SIGNAL + JRST ADEMS3 + JUMPL D,NUDMTB ;IF 2ND ARG < MERELY CALL NUJBST, NO DEMON ENTRY + TDZA TT,TT ;ZERO OUT TT +ADEMS3: SETOM TT ;SET FLAG + PUSHJ P,LSWTL ;SIEZE SWITCH + DEMSW + PUSHJ P,DEMSIG + JRST LSWPOP ;SIGNAL FAILED + SKIPN TT ;FLAG NOT SET + HRLM D,DMTTBL +2(B) ;SET TIME RQ + JRST CKOPJ1 ;RELEASE SWITCH + +NUDMTB: PCLT + PUSHJ P,DMBLK1 ;WAIT TILL DEMON BLOCK IS CLEARED + PUSHJ P,UFLS + HRROI T,DMBLK + MOVEM A,DMBLK ;SAVE IN BLOCK NOW + PUSHJ P,NUJBST + JRST NUDMTB ;IF FAILURE AFTER WAIT LOOP BACK + JRST POPJ1 ;SUCCESS + +DMBLK1: SKIPGE DMBLK+1 ;FOR DEMON BLOCK TEST + POPJ P, ;RETURN, NOT FINISHED LOADING + MOVE T,UTTYCT + CAIGE T,MXCZS ;ROOM IN RING BUFFER + AOS (P) + POPJ P, ;SKIP IF ROOM + ;UTILITY ROUTINES FOR DEAMONS + +DEMSIG: PUSHJ P,DEMNAM ;LOOK FOR NAME + JRST DEMSG2 ;HAVE TO MAKE NEW ENTRY +DEMSG1: AOS (P) + HLLZ E,DMTTBL+2(B) ;18 BITS 2'S COMPLEMENT + AOS DMTTBL+2(B) + HLLM E,DMTTBL+2(B) ;MUST DO THIS WAY TO FIT ABOVE + SKIPE DMTTBL+1(B) ;DOWN, WANT SYS JOB TO LOOK AT + POPJ P, + MOVSI E,SCLDMN + IORM E,SUPCOR + AOS REQCNT ;ONLY SIGNAL IF NECESSARY + POPJ P, + +DEMSG2: SOSGE DEMCNT ;IF NO ROOM FLUSH + POPJ P, + PUSH P,A + MOVEI A,DMTLL ;BUMP POINTER + ADDB A,DMTPTR + IDIVI A,DMLNG ;TRUNCATE TO LENGNTH OF TABLE + SKIPE DMTTBL(B) + JRST .-4 ;SEARCH FOR NEW ENTRY + POP P,DMTTBL(B) ;SET NAME IN TABLE + JRST DEMSG1 + +;ROUTINES TO FIND ENTRY IN TABLE. +;DEMNAM TAKES NAME IN A, DEMUSR TAKES USER INDEX IN U +;THEY SKIP RETURN IF SUCCESSFUL, RETURN OTHERWISE +;IF SUCCESSFUL DEMON TABLE INDEX IS IN B + +DEMUSR: JUMPL U,CPOPJ + MOVSI B,-DMLNG + CAMN U,DMTTBL+1(B) + JRST POPJ1 + ADD B,[DMTLL,,DMTLL] + JUMPL B,.-3 + POPJ P, + +DEMNAM: MOVSI B,-DMLNG ;SEARCH BY NAME + CAMN A,DMTTBL(B) + JRST POPJ1 + ADD B,[DMTLL,,DMTLL] + JUMPL B,.-3 + POPJ P, + +DEMOUT: PUSHJ P,LSWTL ;CALLED BY KILLING JOB (IN CASE OWNED) + 400000,,DEMSW + PUSHJ P,DEMUSR + JRST UTOLKJ + SETZM DMTTBL+1(B) ;MARK AS DOWN,SYSTEM JOB DECIDES WHAT TO DO + AOS REQCNT + MOVSI B,SCLDMN + IORM B,SUPCOR + JRST UTOLKJ + +DEMMRV: SETZM DMTTBL+2(B) ;CALL WITH UTCOFF (SYS JOB) REMOVES ENTRY FROM TBL + SETZM DMTTBL+3(B) ;WITH INDEX OF DEMON IN B + SETZM DMTTBL(B) + MOVEI B,1 + AOSGE DEMCNT + MOVEM B,DEMCNT + JRST UTCONJ + + +;DEAMON READ AND SET STATUS ROUTINES + +ARDDMST: PUSHJ P,LSWTL ;READ DEAMON STATUS + DEMSW + PUSHJ P,DEMNAM + JRST RDDMS1 ;LOST TRY USER INDEX + MOVE A,DMTTBL+1(B) + MOVEI C,L + IDIVM C,A ;DIVIDE BY L, DON'T CLOBBER B +RDDMS2: MOVE C,DMTTBL+3(B) + MOVE B,DMTTBL+2(B) + PUSHJ P,LSWPOP + JRST POPJ1 + +RDDMS1: PUSH P,U + MOVE U,A + PUSHJ P,DEMUSR ;BAD USER + JRST LKUPOP + POP P,U + MOVE A,DMTTBL(B) + JRST RDDMS2 +LKUPOP: POP P,U + JRST LSWPOP + +ASTDMST: PUSHJ P,LSWTL ;SET DEAMON STATUS + 400000,,DEMSW + MOVE D,B + PUSHJ P,DEMNAM + JRST STDMS1 +STDMS2: JUMPL D,STDMS4 +STDMS3: SOSLE W + MOVEM D,DMTTBL+2(B) + SOSLE W + MOVEM C,DMTTBL+3(B) + JRST UTOLJ1 +STDMS1: PUSH P,U + MOVE U,A + PUSHJ P,DEMUSR + JRST UTULKP + POP P,U + JUMPGE D,STDMS2 +STDMS4: SKIPGE DMTTBL+1(B) ;REMOVE FROM TABLE IF POSSIBLE + JRST UTOLKJ ;CAN'T DELETE, LOADING + SETZM DMTTBL+1(B) ;DOWN + SETZM DMTTBL+2(B) ;REMOVE REQUESTS + AOS REQCNT ;SIGNAL SYS JOB + MOVSI B,SCLDMN + IORM B,SUPCOR + JRST UTOLJ1 +UTULKP: POP P,U + JRST UTOLKJ +] + + +SUBTTL .GETSYS UUO + +;.GETSYS AC, ;TRANSFERS SYSTEM AREA SPECIFIED BY C(AC+1) + ;TO USER AREA STARTING AT R.H. C(AC) OF LENGTH MINUS L.H. C(AC) + +AGETSYS: +; Alan 4/2/86: Took this out because people don't use .GETSYS this way +; anymore: +; PUSHJ P,UDELAY ;CAUSE A SCHEDULE TO STOP GETSYSER FROM +; ; MONOPOLIZING SYSTEM + MOVSI A,-LGSNAM ;NEGATIVE OF TABLE LENGTH + UMOVE B,1(J) ;LOOK AT USERS AC+1, THE 6BIT NAME + CAME B,GSNAME(A) ;CYCLE THROUGH TABLE + AOBJN A,.-1 ;OF NAMES, POINTER IN RIGHT HALF OF A + JUMPGE A,AGETSL ;JUMP IF NOT IN TABLE + UMOVE B,(J) ;GET POINTER TO USERS RECEPTACLE BLOCK +AGETS1: HLRZ C,GSYS1(A) ;GET LOW END OF BLOCK + HRRZS A ;CLEAR COUNT IN L.H. OF A + CAIGE A,NUTCFN ;SKIP IF UTC OFF NOT REQUIRD + CONO PI,UTCOFF ;TURN OFF ALL CHANNELS BUT CH 1 + skipn c ; If LH contains 0, RH is routine to call. + jrst @gsys1(a) ; (JUMPE C,@GSYS1(A) generates spurious + ; page faults, so don't "fix" this.) + HRRZ D,GSYS1(A) ;GET HIGH END OF BLOCK +;AT THIS POINT: ;B USER'S POINTER (UNRELOCATED) + ;C BEGINNING OF AREA IN SYS + ;D END OF AREA +agets2: SUBI D,-1(C) ;BLOCK LENGTH TO BE SENT + HLRZ E,B ;GET NEG BLK LENGTH FROM USERS PNTR + ADDI E,-1(D) ;-1 CAUSES CARRY BIT IF .GT. + TLNE E,-1 ;CARRY INDICATES LOSS + JRST AGETS5 ;MORE THAN USER WANTS + HRLS D ;BLOCK LENGTH IN BOTH HALVES + HRRZ E,B ;FIRST WORD (UNRELOCATED) + HRL E,C ;SOURCE ADDRESS FOR BLT + HRRZ C,E ;DESTINATION INTO C + ADD C,D ;FINAL ADDRESS +1 +AGETS7: XCTRI XBW,[BLT E,-1(C)] ;BLT IT TO HIM + AOSA (P) ;INCREMENT RETURN, INDICATE SUCCESS + JRST AGETS6 + CONO PI,UTCON + ADD B,D + UMOVEM B,(J) ;TELL USER HOW MUCH HE GOT +AGETS4: POPJ P, + +AGETSL: XCTR XW,[SETZM 1(J)] ;INDICATE BAD SIXBIT + POPJ P, + +AGETS5: MOVNS D ;TELL USER HOW MUCH HE NEEDS + CONO PI,UTCON ;NEGATIVE OF RIGHT BLOCK LENGTH + XCTR XRW,[HRLM D,(J)] ;SET UP PROPER BLOCK LENGTH IN HIS AC + JRST AGETS4 + +AGETS6: CONO PI,UTCON ;ONE PAGE WASN'T THERE + XCTR XRW,[MOVES (E)] ;SO TOUCH IT (TAKE MPV INTERRUPT IF REAL MPV) + JRST AGETS1 ;AND TRY AGAIN (BLT WILL GET FARTHER THIS TIME) + ;HAD TO RETRY FROM BEGINNING SINCE THIS MAY BE + ;ONE THAT HAS TO BE TRANSFERRED INTACT WITH UTCOFF + +GSNAME: SIXBIT /MEMORY/ +IFN NUNITS,SIXBIT /UTAPE/ +IFN NCPP,[SIXBIT /NCPSM/ + SIXBIT /NCPPQ/ + SIXBIT /NCPHT/ +] +NUTCFN==.-GSNAME ;NUMBER TO GET WITH UTCOFF (same as NETOFF) + SIXBIT /USERS/ + SIXBIT /USER/ + SIXBIT /GETS/ + SIXBIT /DEVS/ + SIXBIT /CALLS/ +IFN IMXP, SIXBIT /IMPX/ + SIXBIT /CLINK/ + SIXBIT /DSYMS/ + SIXBIT /USYMS/ ;.UPC, .VAL, .TTY, ETC. + SIXBIT /CHDEVS/ + SIXBIT /NCALLS/ + SIXBIT /TTYVAR/ + SIXBIT /USRVAR/ + SIXBIT /ITSNMS/ +LGSNAM==:.-GSNAME + +;ENTRIES ARE: BOTTOM,,TOP OF AREA TO BE TRANSMITTED OR INST TO EXECUTE +GSYS1: IOBFTL,,EMEMTL ;lh zero => jrst to THIS ENTRY +IFN NUNITS, UTCHNT,,UTCHE ;UTAPE +IFN NCPP,[IMSOKB,,IMSOKE ;NCP SOCKET MAP + IMPBPQ-1,,IMPEPQ ;NCP PENDING RFC QUEUE + IMPHTB,,IMPHTB+255. ;NCP HOST TABLE +] + 0,,USRSV ;USERS + 0,,USR1V ;USER + GSNAME,,GSNAME+LGSNAM-1 ;GETS + DEVTAB,,EDEVS ;DEVS + SYSYMB,,SYSYME ;CALLS +IFN IMXP, IMXTBB,,IMXTBE ;IMPX + CLVBEG,,CLVEND ;CLINK + 0,,DSYMS ;DSYMS + SYSUSB,,SYSUSE ;USYMS + DCHSTB,,DCHSTE ;CHDEVS + SYSCTB,,SYSCTB+LSYSCT-1 ;NCALLS + TYVTAB,,TYVTAB+LTYVTA-1 ;TTYVAR + USETTB,,USETTB+MXVAL-1 ;USRVAR + ITSNMS,,ITSNMS+LITSNM-1 ;ITSNMS +IFN LGSNAM-<.-GSYS1>, .ERR GSNAME and GSYS1 don't match. + +ITSNMS: ITSIRP [ + SIXBIT /ITS/ + ] +LITSNM==:.-ITSNMS + 0 + 0 ; Make it easy to add more. + +USRSV: MOVEI C,USRSTG + MOVE D,USRHI + ADDI D,USRSTG-1 + JRST agets2 + +USR1V: UMOVE C,2(J) + IMULI C,LUBLK + CAML C,USRHI + JRST USR1VL + ADDI C,USRSTG + MOVE D,C + ADDI D,LUBLK-1 + JRST agets2 + +USR1VL: XCTR XW,[SETOM 2(J)] + JRST AGETS4 + +DSYMS: HRRZ C,DDT-2 + HLRE D,DDT-2 + SETCMM D ;OFFSET BY ONE + ADD D,C + JRST agets2 + +SUBTTL .GETLOC, .EVAL, ETC. + +;GET AN ABSOLUTE LOCATION ;.GETLOC AC, ;C(A)=FROM(ABS),,TO(RELATIVE) +; +AGETLOC:UMOVE A,(J) ;GET TO ADDRESS + HLRZ B,A ;GET FROM ADDRESS + XCTRI [MOVE C,(B)] + JRST .+2 + JRST ILEXPF ;ILLEGAL EXEC PAGE FAULT + UMOVEM C,(A) ;GIVE TO USER + POPJ P, + +;SET AN ABSOLUTE LOCATION ;.SETLOC AC, ;C(AC)=FROM(RELATIVE),,TO(ABS) +; +ASETLOC:TDZA D,D ;CLEAR COND FLAG, SKIP + +;SET AN ABSOLUTE LOCATION ONLY IF C(ABS)=C(TEST) & SKIP IF SUCCESSFUL +;.IFSET AC, ;C(AC)=,,TO ADR(ABS) +;WORD 1=TEST ;WORD 2=NEW C(ABS) + +AIFSET: MOVNI D,1 ;SET COND FLAG + XCTR XR,[HRRZ A,(J)] ;GET TO ADDRESS (ABSOLUTE) + XCTR XR,[HLRZ B,(J)] + UMOVE C,(B) ;GET WORD + XCTRI [MOVES (A)] + JRST .+2 + JRST ILEXPF + JUMPE D,ASPST1 ;NORMAL SETLOC + UMOVE D,1(B) ;GET NEW VALUE + CONO PI,CLKOFF ;PREVENT INTERRUPTS + CAME C,(A) ;CHECK WORD AGAINST TEST WORD + JRST CLKONJ ;NOT EQUAL => IGNORE + MOVE C,D + AOS (P) ;CAUSE RETURN TO SKIP + CAIG A,SYSB_10. ;CHECK IF IN SYS + JRST ASPST1 ;YES SO DO REG SETLOC + EXCH D,(A) ;NO SO DO NOW BEFORE SHUFFLE & GET OLD +ASPST2: MOVE C,D + HRROS A ;LET SYS JOB KNOW ALREADY DONE +ASPST1: CAMN C,(A) ;SKIP IF DIFFERENT FROM C(TO ADR) + JRST CLKONJ ;SAME + MOVE D,SYSITM ;IF SYSTEM JOB HAS BEEN HUNG OR LOOPING FOR 30 SEC, + ADDI D,30.*30. + CAMGE D,TIME + JUMPGE A,ASPST3 ;GO DO THE WORK OURSELVES (BUT DON'T DO IT TWICE). +ASPST4: MOVE D,UNAME(U) ;GET UNAME OF SETLOCER + MOVSI T,SCLSET + PUSHJ P,CWAIT ;WAIT TILL VARIABLES TO COMMUNICATE WITH SYS JOB ARE FREE + TDNE T,SUPCOR ;ARG TO CALL IN .-1 + MOVEM A,SETSLC ;REMEMBER ABS LOCATION + MOVEM C,SETSLQ ; " NEW CONTENTS (OR OLD IF LH(SETSLC)=-1) + MOVEM D,SETSU ; " USER +CSPST: IORM T,SUPCOR ;TELL SYS JOB TO DO IT + JRST CLKONJ + +ASPST3: HRRZ D,UPC ;SYS JOB HAS BEEN HANGING FOR 30 SEC. + CAIN D,SCOR1 ;WHY? JUST SLEEPING? + JRST ASPST4 ;YES => SIGNAL IT TO DO THE WORK + MOVEM C,(A) ;ELSE GIVE UP ON IT AND DO IT NOW + JRST CLKONJ + +;LOOK UP ITS SYMBOL ;.EVAL AC, ;C(AC)=SQUOZE SYMBOL +;REPLACES SYMBOL BY VALUE & SKIPS IF SUCCESSFUL +;IF YOU WANT TO .EVAL A SYMBOL IN A PROGRAM HABITUALLY AND IMPLICITLY, +;AND WANT IT TO CONTINUE TO WORK, YOU HAD BETTER ADD AN ENTRY TO THE FILE +;AI:SYSTEM;EVSYMS > SAYING WHAT PROGRAM AND WHAT SYMBOL. THEN, ITS HACKERS +;CAN AVOID SCREWING YOU WITHOUT WARNING. + +AEVAL: PUSHJ P,SWTL + ARDFSW + UMOVE B,(J) ;GET SYM + PUSHJ P,SYMLK ;LOOK UP + JRST LSWPOP ;NOT FOUND + MOVE A,(C) ;GET VALUE + PUSHJ P,LSWPOP + AOS (P) ;CAUSE UUO TO SKIP + JRST APTUAJ ;RETURN VALUE + +;REDEFINE ITS SYMBOL ;.REDEF AC, ;C(AC)=POINTER TO 2 WORD BLOCK +;WORD 1 = SYMBOL ;WORD 2 = VALUE +;DELETE SYM IF ALL 4 FLAG BITS SET +; OTHERWISE SET SYMBOL FLAGS TO THOSE SPECIFIED, EXCEPT REJECT ANY ATTEMPT TO +; ADD A PROGRAM NAME +;ADD SYM IF NOT FOUND ;FAIL ONLY IF NOT ENOUGH ROOM +;SKIPS IF SUCCESSFUL + +AREDEF: PUSHJ P,SWTL + ARDFSW + XCTR XR,[HRRZ D,(J)] ;GET POINTER FROM AC + UMOVE B,(D) ;GET SYMBOL + PUSHJ P,SYMLK ;LOOK UP + JRST ARDF2 ;NOT FOUND, CREATE + XCTR XR,[SETCM A,(D)] ;GET SYM (COMPLEMENTED) + TLNN A,740000 ;SKIP IF ANY FLAGS NOT SET + JRST ARDF3 ;ALL SET => DELETE + SETCA A, + TLNN A,740000 + JRST LSWPOP + MOVEM A,-1(C) + UMOVE A,1(D) ;GET VALUE + MOVEM A,(C) ;STORE IN SYMTAB + JRST ARDF4 ;SORT AND SKIP-RETURN. + +ARDF2: MOVE C,DDT-2 ;GET POINTER + SUB C,[2,,2] ;DECREMENT FOR NEW ENTRY + MOVEI A,-1(C) ;FUDGE FOR BLOCK CALC + LSH A,-10. ;CONVERT TO # OF BLOCKS UP TO SYMTAB -1 + UMOVE B,(D) ;GET SYM + MOVE T,FDDTPG + LSH T,10. + TLNE B,740000 ;LOSE IF PROG NAME + CAMLE A,T ;CHECK FOR LOSSAGE + JRST LSWPOP ;DON'T OVERWRITE ITS + EXCH B,2(C) ;STORE OVER GLOBAL BLOCK HEADER, + MOVEM B,(C) ;MOVE THAT HEADER DOWN 2 WDS. + UMOVE A,1(D) ;GET VALUE + EXCH A,3(C) + ADD A,[-2,,] ;1 MORE SYM IN GLOBAL BLOCK. + MOVEM A,1(C) ;STORE + MOVEM C,DDT-2 ;UPDATE POINTER + JRST ARDF4 ;GO SORT AND SKIP-RETURN. + +ARDF3: MOVE B,DDT-2 ;GET POINTER + MOVE A,(B) ;MOVE THE GLOBAL HEADER + EXCH A,2(B) ;UP OVER 1ST SYM + MOVEM A,-1(C) ;WHICH GOES INTO FREE SLOT. + MOVE A,1(B) + ADD A,[2,,] ;GLOBAL BLOCK 1 SYM SHORTER. + EXCH A,3(B) + MOVEM A,(C) + MOVE A,[2,,2] + ADDM A,DDT-2 ;UPDATE POINTER +ARDF4: MOVSI E,(SETZ) ;TELL DDT ITS SYMTAB WAS ALTERED. + IORM E,DDT-1 + PUSHJ P,SBUBL ;DO 1 BUBBLE-SORT UP AND 1 DOWN. + JRST LSWPJ1 ;FREE ARDFSW AND EXIT. + +;DO ONE BUBBLE SORT PASS UP, ONE DOWN; LEAVE J <0 IFF DID AN EXCHANGE. +;CLOBBER A-E. +SBUBL: MOVE E,DDT-2 + HLL E,1(E) + ADD E,[2,,2] ;AOBJN -> SYMS IN GLOBAL BLOCK. +SBUBL0: SETZ J, + MOVE B,[2,,2] ;INCREMENT FOR UPWARD PASS. + MOVE C,[JUMPL A,SBUBL1] + SUBI E,2 ;(WILL INCREMENT BEFORE ACTING) + MOVE A,E + PUSHJ P,SBUBL2 + MOVNS B ;DECREMENT FOR DOWNWARD PASS. + MOVE C,[CAMN A,E] + JRST SBUBL2 + +SBUBL1: MOVE D,1(A) ;CHECK NEXT PAIR OF ENTRIES. + CAMG D,3(A) + JRST SBUBL2 ;IN CORRECT ORDER. + EXCH D,3(A) + MOVEM D,1(A) ;WRONG ORDER, EXCHANGE. + MOVE D,(A) + EXCH D,2(A) + MOVEM D,(A) + SETO J, ;SAY DID AN EXCHANGE. +SBUBL2: ADD A,B ;MOVE TO NEXT ENTRY. + XCT C ;TEST IF FINISHED. + POPJ P, + JRST SBUBL1 ;(NOT FINISHED) + +;LOOK UP SYMBOL IN B IN ITS SYMBOL TABLE (CLOBBERS A,B,C) +;RETURN WITH POINTER TO VALUE WORD IN C +;SKIPS IF SUCCESSFUL + +SYMLK: TLZ B,740000 ;FLUSH FLAGS + MOVE C,774000-2 ;PICK UP AOBJN POINTER TO SYMTAB FROM EXEC DDT +SYMLK2: MOVE A,(C) ;GET SYM + AOBJP C,[JRST 4,.+1] ;INCREMENT POINTER + TLNE C,376 ;GO THROUGH HAIR EVERY 200 SYMS + JRST SYMLK3 ;NOT THIS TIME + PUSHJ P,OPBRK +SYMLK3: TLNN A,200000 ;SKIP IF DELETE INPUT (FLAG PREVENTS MATCH) + TLZE A,740000 ;FLUSH FLAGS & CAUSE LOSS IF ALL 0 (PROG NAME) + CAME A,B ;COMPARE + AOBJN C,SYMLK2 ;LOSS, TRY ANOTHER + JUMPL C,POPJ1 ;SKIP RETURN IF FOUND + POPJ P, ;NOT SO IF LOSS + +AWSNAME:XCTR XR,[SKIPE B,(J)] ;OPER 35 + MOVEM B,USYSNM(U) + POPJ P, + +AUPISET:UMOVE B,(J) ;OPER 36 + ASH B,-35. + EXCH B,PICLR(U) + UMOVEM B,(J) + SKIPN PICLR(U) + POPJ P, + JRST APISE1 + +;GENERATE A UNIQUE SYM ;.GENSYM AC, ;LOADS AC WITH SYM +; +AGENSYM:PUSHJ P,SWTL ;WAIT TILL INTERLOCK FREE THEN SEIZE IT + GENSSW + MOVEI TT,IGNSYM + PUSHJ P,SIXAOS ;INCREMENT SYM + MOVE A,IGNSYM ;GET SYM + PUSHJ P,LSWPOP ;UNLOCK FOR NEXT USER + JRST APTUAJ ;GIVE USER GENERATED SYMBOL + +;GENERATE A UNIQUE NUM ;.GENNUM AC, ;LOADS AC WITH NUMBER +; +AGENNUM:AOS A,IGNNUM ;INCREMENT NUMBER + JRST APTUAJ ;AND GIVE IT TO USER + +EBLK + +GENSSW: -1 + 0 +IGNSYM: SIXBIT /SYS/ + +IGNNUM: 0 + +BBLK + +SIXAOS: PUSH P,I + PUSH P,J + AOS (TT) ;INCREMENT SYM + MOVE I,[440600,,(TT)] ;GET POINTER TO FIRST CHAR +SIXAS2: ILDB J,I ;GET FIRST (NEXT) CHAR + SKIPN J ;SKIP IF NOT ZERO + MOVEI J,1 ;REPLACE EMBEDDED SPACE WITH "!" + DPB J,I ;PUT BACK + CAME I,[60600,,(TT)] ;SKIP IF FIRST FIVE CHARS HAVE BEEN EXAMINED + JRST SIXAS2 ;GO TO NEXT CHAR + POP P,J + POP P,I + POPJ P, + +IFN KL10P,[ + +SUBTTL KL10 PERFORMANCE COUNTER + +;KLPERF SYMBOLIC SYSTEM CALL +;ARG 1: TO MEASURE PERFORMANCE DURING; + ;-3 => NULL JOB, -4 => ALL JOBS +;ARG 2: P.A. ENABLES WORD (SEE NON-EXISTENT KL10 SYS REF MAN) + ;0 => FREE THE FACILITY, ELSE TRIES TO GRAB IT +;NO ARGS => JUST READS THE VALUES WITHOUT CHANGING THE ENABLING CONDITIONS. + ;IN THAT CASE, IT IS OK IF FACILITY IS OWNED BY SOMEONE ELSE +;VAL 1: PREVIOUS SETTING +;VAL 2: PREVIOUS P.A. ENABLE WORD +;VAL 3: TIME BASE HIGH WORD +;VAL 4: TIME BASE LOW WORD +;VAL 5: PERF CTR HIGH WORD +;VAL 6: PERF CTR LOW WORD + +KLPERF: CONO PI,CLKOFF + JUMPN W,KLPER1 +KLPER0: MOVE J,MTRJOB ;NO ARGS => DONT CHANGE SETTINGS, + MOVE B,PAEON ;JUST RETURN CURRENT COUNT. + JRST KLPER3 + +KLPER1: JUMPN B,KLPER2 ;TRYING TO TURN IT ON? + CAME U,MTRUSR + JRST KLPER0 ;FREEING THE FACILITY WHEN DON'T OWN IT? + PUSHJ P,PRFOFF ;NO, TRYING TO FREE IT - DO SO. + MOVEI J,-2 + JRST KLPER3 + +KLPER2: SKIPGE MTRUSR ;IF FACILITY IS FREE, SIEZE IT. + MOVEM U,MTRUSR + CAME U,MTRUSR + JRST OPNL10 ;ALREADY BELONGS TO SOME OTHER JOB. + MOVEI J,2(A) + CAIN J,-2 ;ALL JOBS? + JRST KLPER4 + CAIN J,-1 ;NULL JOB? + JRST KLPER3 + MOVE J,A + JSP T,NCRUI2 ;ELSE DECODE JOB SPEC; OBJECT TO PDP6 + JFCL + CAME J,U + JRST KLPER3 +;TRYING TO TURN ON FOR SELF OR ALL JOBS - IT OUGHT TO BE ON RIGHT NOW! +KLPER4: CONO MTR,2001 ;TURN ON TIME BASE, INTERVAL PIA=1 + WRPAE B ;SET ENABLES +KLPER3: EXCH B,PAEON + SKIPGE A,MTRJOB + TRZA A,2 ;UN CONVERT -1 => -3, -2 => -4 + LSH A,-9 ;IDIVI A,LUBLK +IF2 IFN LUBLK-1000,.ERR NO DIVIDE + HRREM J,MTRJOB + RCCL C ;C,D GET TIME BASE + RPERFC E ;E,TT GET PERFC + JRST CLKOJ1 + +;TURN OFF THE PERFORMANCE COUNTER. PUT BACK IN RUN-TIME MEASURING MODE +PRFOFF: MOVNI A,2 ;NOT ATTACHED TO ANY JOB + MOVEM A,MTRJOB + WRPAE [1576,,1200] ;MEASURE MAIN-PROGRAM TIME IN 80 NS UNITS (MODEL A) + CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1 + RPERFC STPERF ;START-OF-QUANTUM TIME IS NOW + RPERFC NULPRF ;ALSO FOR NULL-JOB + SETOM MTRUSR ;NO LONGER IN USE + POPJ P, +] ;END IFN KL10P + +$INSRT CORE ;CORE JOB AND MEMORY MANAGEMENT ROUTINES + +SUBTTL NULL DEVICE +; IMMEDIATE EOF ON INPUT, HAS NO EFFECT ON OUTPUT +; +NULO: HLRS A,C ;REMEMBER MODE FOR .STATUS + JSP Q,OPSLC3 ;SET UP IOCHNM WORD AND EXIT + NLIDN,,NLODN ;ARG + NLBIDN,,NLBDN ;ARG + +;UNIT NULL DEVICE INPUT +NULI: JRST UNIEOF + +;BLOCK NULL DEVICE INPUT +NULBI: POPJ P, + +;BLOCK NULL DEVICE OUTPUT ENTRY +;ADVANCE BLOCK MODE .IOT POINTER +NULBOD: XCTR XR,[HLRE A,(C)] ;GET NEG LENGTH FROM LEFT HALF + MOVNS A ;GET POSITIVE LENGTH + XCTR XR,[ADD A,(C)] ;ADD STARTING LOC (R.H.) + XCTR XW,[HRRZM A,(C)] ;STORE BACK "COUNTED OUT" POINTER + POPJ P, + +;STANDARD DEVICE .STATUS ROUTINE +STDSTA: DPB A,[60300,,D] ;A HAS LH OF IOC WORD + TRO D,1_9 ;SYS BUF CAP FULL + TRNE D,1_6 ;SKIP IF INPUT + TRC D,3_9 ;TURN OFF SYS BUF CAP FULL, SET EMPTY + POPJ P, + +SUBTTL USER DEVICE + +UBPFJ==10 ;DEMAND FOREIGN JOB (BIT IN LH (DEV) FOR .OPEN (USR)) + +USROJ: TDZA J,J ;ENTRY FROM JOB DEVICE DONT GET CORE. +USRO: MOVNI J,1 ;INDICATE NOT FROM JOB OPEN + CAIA +USROOJ: MOVEI J,1 ;OJB DEVICE; EXISTING JOB OK ONLY IF %OPOJB BIT SET. + PCLT + SKIPL CORRQ(U) + PUSHJ P,UFLS ;PREVENT ATTEMPT TO CORE, PCLSR OUT, AND THINK YOU'VE WON AT SETBF1, ETC + PUSHJ P,SWTL + TREESW + JUMPE B,USRO4 ;JNAME = 0 => UNAME IS JOB SPEC. + SKIPN A ;IF UNAME=0 + MOVE A,UNAME(U) ;MAKE IT THIS JOB'S UNAME + CAME A,UNAME(U) ;SKIP IF FIRST FILE NAME IS UNAME OF OPENER + JRST USROA + CAME B,[SIXBIT /PDP10/] ;SKIP IF SECOND FILE NAME IS "PDP10" + CAMN B,[SIXBIT /PDP6/] ;OR PDP6 +IFN PDP6P,JRST PDPO + .ELSE JRST OPNL1 +USROA: CONO PI,CLKOFF + PUSHJ P,LSWPOP ;TREESW +USROB: SETZ TT, +USRO3: CAME A,UNAME(TT) + JRST AGIN + CAMN B,JNAME(TT) + JRST UFN1 ;FOUND UNAME JNAME PAIR +AGIN: ADDI TT,LUBLK + CAMGE TT,USRHI + JRST USRO3 + TLNE C,UBPFJ ;JOB MUST EXIST TO WIN IF UBPFJ SET + JRST OPNL4 + CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE SAME UNAME + JRST OPNL20 + PUSH P,U +TCORS: MOVSI T,%TBNOT+%TBDTY ;DOESN'T HAVE TTY, ISN'T GIVING IT AWAY + PUSHJ P,USTRA + JRST TCORS1 ;USTRA FAILED - SEE WHY, MAYBE RETRY (U CLOBBERED) + MOVEM A,UNAME(U) + MOVEM B,JNAME(U) + MOVEM A,USYSNM(U) + MOVE TT,U + POP P,U + MOVE A,UTMPTR(U) + MOVEM A,UTMPTR(TT) + MOVE A,HSNAME(U) + MOVEM A,HSNAME(TT) + MOVE A,XUNAME(U) + MOVEM A,XUNAME(TT) + MOVEM B,XJNAME(TT) + PUSHJ P,USRST5 ;SET UP TTY STUFF + MOVSI A,400000 + SKIPGE APRC(U) + IORM A,APRC(TT) ;NEW INFERIOR IS DISOWNED IF CREATOR IS. + JUMPE J,CLKOJ1 ;RETURN HERE FOR JOB DEVICE (INDEX IN TT) + PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR THE JOB. + JRST NOGO1 ;NONE => GO KILL THE JOB AND RETURN FAILURE. + CONO PI,CLKON ;NOW CAN'T FAIL TO CREATE THE JOB FOR GOOD. + HRLZ B,B + HRR B,U + MOVEM B,SUPPRO(TT) + MOVE U,TT + PUSHJ P,UFOUND ;SET UP THE OPENER'S CHANNEL. + JFCL + MOVE Q,TT + MOVEI B,1 + PUSHJ P,ACORE1 ;MAY PCLSR OUT, BUT CORE JOB WILL DO WORK ANYWAY. + SKIPA R,UUAC(U);NO CORE AVAILABLE, KILL THE JOB + JRST POPJ1 ;SUCCESS + ADDI R,IOCHNM(U) + PUSHJ P,AUCLOSE + JRST OPNL37 ;NO CORE AVAILABLE + +ULUP1: CLEARB A,T +ULUP: HRRZ E,SUPPRO(T) + SKIPN UNAME(T) ;SKIP IF VARIABLE BLOCK IN USE + JRST ULUP2 + CAIN E,(U) ;SKIP IF NOT AN INFERIOR + IOR A,SUPPRO(T) ;IOR IN INTERRUPT BIT OF INFERIOR +ULUP2: ADDI T,LUBLK ;ADVANCE TO NEXT BLOCK + CAMGE T,USRHI ;SKIP IF ALL EXAMINED + JRST ULUP ;LOOP +UFIN: MOVEI B,1 ;SELECT INT BIT +UFIN2: TLON A,(B) + JRST POPJ1 + LSH B,1 + CAIGE B,1_ + JRST UFIN2 + POPJ P, + +NOGO1: MOVSI T,BULGO+BULGOS + IORM T,APRC(TT) ;TELL THE SYS JOB TO KILL THE JOB WE JUST GOT + MOVSI T,SCLGUN + IORM T,SUPCOR + JRST OPNL5 ;DIREC FULL (TOO MANY LOSERS) + +NOGO4: SUB P,[1,,1] + JRST OPNL6 + +TCORS1: PCLT ;COME HERE FROM TCORS IF ATTEMPT TO FIND FREE JOB SLOT FAILED. + SKIPGE SJCFF ;IF THIS IS NEGATIVE, USTRA DIDN'T EVEN REQUEST MORE + JRST [ SKIPGE SJCFF + PUSHJ P,UFLS + JRST TCORS2] + MOVE TT,USRHI + CAIL TT,MAXJ*LUBLK + JRST NOGO4 ;USER MEM EXPANDED TO MAX + SKIPGE SUPCOR .SEE SCLEX ;PRESUMABLY USTRA ASKED SYS JOB FOR MORE JOB SLOTS + PUSHJ P,UFLS ;SO WAIT TILL SYS JOB ANSWERS THE REQUEST +TCORS2: CONO PI,CLKOFF ;AND SEE IF THERE ARE NOW ENOUGH SLOTS. + JRST TCORS + +USRO4: EXCH J,A ;USR: OPEN WITH JNAME=0: USE UNAME AS JOB SPEC. + JSP T,NCORUI + JFCL +IFN PDP6P,[ + CAIN J,-1 ;SPEC'D JOB IS PDP6 => OK, + JRST PDPO +] + CONO PI,CLKOFF + PUSHJ P,LSWPOP ;SOS DIELOK(J) + PUSHJ P,LSWPOP ;TREESW + MOVE TT,J + MOVE J,A +;COME HERE WHEN JOB ALREADY EXISTS, WITH CLOCK OFF AND USR IDX IN TT. +;A, B, C STILL HAVE UNAME, JNAME AND OPEN MODE. +UFN1: JUMPE J,[ADDI B,10000 ;OPENING JOB-DEVICE AND JOB EXISTS?? + JRST USROB] ;KEEP CHANGING JNAME UNTIL WE CREATE A JOB. + CAIG TT,LUBLK + JUMPL J,UFNDF ;SKIP SOME CHECKS ON SYS & CORE + JUMPG J,[MOVSI T,%OPOJB ;OJB DEVICE OPEN; IF JOB DOESN'T HAVE %OPOJB SET, + TDNE T,OPTION(TT) ;THEN IT HASN'T GIVEN PERMISSION TO BE HACKED. + SKIPL JBI(TT) ;IF IT'S ALREADY A JOB DEVICE DON'T HACK IT. + JRST [CONO PI,CLKON ;IN EITHER CASE, WAIT TILL ALL'S OK, + SKIPL JBI(TT) + PUSHJ P,UFLS + TDNN T,OPTION(TT) + PUSHJ P,UFLS + JRST USROOJ] ;THEN RE-TRY THE OPEN. + LDB T,[.BP BULGOS_22,APRC(TT)] + JUMPN T,OPNL42 + JRST CLKOJ1] ;RETURN SUCCESS TO JOBO6C. + TLNE C,UBPFJ + JRST UFNDF ;USER WANTS IT AS FOREIGN JOB + HRRZ E,SUPPRO(TT) + CAIN E,(U) + JRST UFN1C ;OPENING UP INFERIOR + SKIPGE T,APRC(TT) + SKIPL SUPPRO(TT) ;UNLESS IT'S A TOP-LEVEL DISOWNED JOB, + JRST UFNDF ;THEN FOREIGN JOB + PUSHJ P,UFN2B ;REOWN DISOWNED TREE + POPJ P, ;CAN'T + JRST UFOUND ;DID + +UFN1C: MOVE U,TT ;OPENING PROCEDURE IMMEDIATE SUPERIOR OF PROCEDURE BEING OPENED + JRST UFOUND + +; +; REOWN A DISOWNED PROCEDURE TREE +; + +NREOWN: TLNN R,%CLSFU ;MUST BE A FOREIGN USER CHANNEL + JRST OPNL34 + CONO PI,CLKOFF + HLRZ TT,H + SKIPGE T,APRC(TT) + SKIPL SUPPRO(TT) + JRST OPNL31 ;TO A TOP-LEVEL DISOWNED JOB + HRLM R,(P) + PUSHJ P,UFN2B ;REOWN THE JOB (TURNS CLOCK ON) + POPJ P, ;FAILED + HLRZ R,(P) ;TURN THE CHANNEL INTO AN INFERIOR CHANNEL. + MOVNI T,FUWIDN-UWIDN + ADDM T,(R) + JRST POPJ1 + +;REOWN JOB TT POINTS TO, ITS APRC IS IN T. SKIPS IF SUCCESSFUL. +;CALL WITH CLKOFF, WILL TURN IT ON. +UFN2B: TLNE T,BULGOS + JRST OPNL42 ;CAN'T REOWN JOB WHICH IS LOGGING OUT. + SKIPGE APRC(U) ;IF REOWNING JOB IS DISOWNED, PROHIBIT SO THAT + JRST OPNL31 ;IT DOESN'T REOWN ITSELF AND SCREW THINGS UP + PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR IT. (IN B) + JRST OPNL5 ;WE HAVE 8 INFERIORS ALREADY. + AOS (P) ;GOING TO WIN + SETOM DLSRCH ;INHIBIT SCHEDULING + CONO PI,CLKON ;TURN CLOCK BACK ON, THIS MAY TAKE A WHILE + MOVSI A,BUMRTL ;DOOMED DETACHED JOBS ARE RESCUED BY REOWNING. + ANDCAM A,APRC(TT) + MOVE A,UNAME(U) ;PICK UP NEW UNAME + SETCM D,APRC(U) + TLZ D,#400000 ;SIGN OF D SET IFF REOWNER ISN'T DISOWNED. + MOVE J,UTMPTR(U) ;PICK UP NEW USER RESOURCE POINTER + HRR D,J + SUBI J,USRRCE ;GET NEW CONSOLE # + CAIL J,NCT ;IF NEW TREE STILL HAS NO TTY, + MOVEI J,%TINON ;"DISOWNED" TTY CHNLS SHOULD REMAIN SUCH +;HERE, A HAS UNAME, D HAS ,,UTMPTR, J HAS CONSOLE # OR %TINON, +;U HAS REOWNER, TT HAS JOB BEING REOWNED. +UFN2A: PUSH P,B ;SAVE INTERRUPT BIT +UFN3: MOVEM A,UNAME(TT) ;SET TO NEW UNAME + HRRZM D,UTMPTR(TT) ;SET TO NEW USER RESOURCE POINTER + MOVEI R,IOCHNM(TT) + PUSHJ P,CHSCAN + PUSHJ P,UFN3ZZ + HLLZ T,D ;LH(D) HAS 0 IF REOWNER DISOWNED, ELSE 400000 + ANDCAM T,APRC(TT) ;MARK AS NOT DISOWNED IF REOWNER ISN'T DISOWNED. +UFNL3: MOVE B,JNAME(TT) ;PICK UP CURRENT JNAME + MOVEI E,0 ;LOOP ON ALL USERS +UFNL1: CAMN A,UNAME(E) ;SKIP ON NOT SAME UNAME + CAME B,JNAME(E) ;SKIP ON SAME UNAME-JNAME + JRST UFNL2 ;NOT SAME NAME AND/OR VAR BLK NOT IN USE + JRST UFN7 ;NAME CONFLICT, RESOLVE +UFNL2: ADDI E,LUBLK + CAMGE E,USRHI + JRST UFNL1 + MOVEI E,0 ;INITIALIZE FOR LOOP TO LOOK FOR INFERIORS AND DUPLICATE NAMES +UFN4: SKIPN UNAME(E) ;SKIP IF VAR BLOCK IN USE + JRST UFN5 ;TRY NEXT + HRRZ I,SUPPRO(E) ;PICK UP SUPERIOR POINTER OF BLOCK BEING EXAMINED + CAIN I,(TT) ;SKIP IF NOT INFERIOR + JRST UFN6 ;INFERIOR, PSEUDO-RECURSE +UFN5: ADDI E,LUBLK ;ADVANCE TO NEXT BLOCK + CAMGE E,USRHI ;SKIP IF ALL EXAMINED + JRST UFN4 ;LOOP + SKIPGE SUPPRO(TT) ;SKIP IF NOT BACK TO TOP + JRST UFNX ;BACK TO TOP LEVEL + MOVE E,TT ;POP BACK UP + HRRZ TT,SUPPRO(E) ;TO PREVIOUS LEVEL + MOVE B,JNAME(TT) ;RESTORE B + JRST UFN5 ;PROCEED AT PREVIOUS LEVEL + +UFNX: POP P,B + HRLM B,SUPPRO(TT) + HRRM U,SUPPRO(TT) ;SET UP SUPERIOR POINTER IN TO LEVEL DISOWNED + SETZM DLSRCH ;RE-ENABLE SCHEDULING + MOVE U,TT + POPJ P, + +UFN6: MOVE TT,E ;PSEUDO-RECURSE + JRST UFN3 ;START UP ON LOWER LEVEL + +UFN7: CAMN E,TT ;SKIP UNLESS FOUND SELF + JRST UFNL2 + ADDI TT,JNAME ;SET UP ARG TO SIXAOS + PUSHJ P,SIXAOS ;INCREMENT JNAME + SUBI TT,JNAME ;RESTORE TT + JRST UFNL3 ;RESTART LOOP + +;RESUSCITATE TTY CHNLS +UFN3ZZ: HRRZ Q,(R) + CAIL Q,TYIDN + CAILE Q,TYOBN + POPJ P, ;NOT A TTY CH + HLRZ Q,(R) + TRNN Q,%TICNS + POPJ P, ;NOT CONSOLE + CAIE J,%TINON + AOS TTNTO(J) + DPB J,[$TIIDX,,(R)] + POPJ P, + +UFOUND: HLRZS C ;U HAS INF PROC + HRL A,U + MOVE U,USER + HRRZ R,UUAC(U) + ADDI R,IOCHNM(U) ;CLOBBERED BY CORE + JSP Q,OPSLC3 + UWIDN,,UWODN + UBIDN,,UBODN + +UFNDF: TLNE C,1 + JRST OPNL12 ;ATTEMPTED OUTPUT + LDB A,[.BP BULGOS_22,APRC(TT)] + JUMPN A,OPNL42 ;USER GOING AWAY + HRL A,TT + JSP Q,OPSLD1 + FUWIDN,,FUBIDN + +USRST: PUSHJ P,AUCL2 ;.RESET SIMULATES CLOSING AND REOPENING + POPJ P, + CONO PI,CLKON + PUSHJ P,1USTOP + EXCH U,A ;BUT WITH LESS OVERHEAD + PUSH P,A + PUSHJ P,IODCL + MOVEI B,BULGOS ;WE'RE NOT REALLY TRYING TO KILL THE INFERIOR, + ANDCAM B,APRC(U) ;SO DON'T LET OTHERS THINK HE'S BEING KILLED. + MOVE Q,U + SETZ B, + EXCH U,(P) + PUSHJ P,ACRF1 ;FLUSH ALL OF CORE + BUG +USRST1: MOVEI B,1 + MOVE Q,(P) + PUSHJ P,ACRF1 ;THEN GET 1 PAGE + JRST [ PUSHJ P,UDELAY + JRST USRST1] + EXCH U,(P) + MOVSI T,%TBNOT+%TBDTY + MOVEM T,TTYTBL(U) + MOVE J,U + EXCH U,(P) + PUSHJ P,MPLDJ + XCTR XW,[CLEARM 0] + MOVEI T,1 + XCTR XBRW,[BLT T,1777] + PUSHJ P,MPLDZ + EXCH U,(P) + PUSHJ P,LOGUSE + CONO PI,CLKOFF + PUSHJ P,USRST2 + CONO PI,CLKON + PUSHJ P,USRST4 ;SHOULD SKIP + BUG + POP P,A + EXCH U,A + MOVE TT,A +USRST5: MOVE A,TTSTSV(U) ;INITIALIZE SAVED TTYSET OF NEW JOB EQUAL TO CREATOR'S. + SKIPL B,TTYTBL(U) ;NOTE THAT THE WHEREABOUTS OF THE CREATOR'S TTYSET + MOVE A,TTYST1(B) ;DEPENDS ON WHETHER HE HAS THE TTY NOW. + MOVEM A,TTSTSV(TT) + MOVE A,TTSTSV+1(U) + SKIPL B + MOVE A,TTYST2(B) + MOVEM A,TTSTSV+1(TT) + MOVEI A,(TT) ;RH OF NEW JOB'S SAVED TTYSTS IS HIS INDEX. + HRLI A,%TSCNS ;NOW CONSTRUCT THE LH. + MOVE B,UTMPTR(TT) ;TO DO THAT, FIND THE TREE'S TTY NUMBER + MOVE B,TTYOPT-USRRCE(B) ;TO FIND THE TTY'S TTYOPT WORD, + TLNE B,%TOROL ;WHICH TELLS HOW TO INIT THE BITS IN THE TTYSTS. + TLO A,%TSROL + TLNN B,%TOMOR + TLO A,%TSMOR + TLNE B,%TOSA1 + TLO A,%TSSAI + MOVEM A,TTSTSV+2(TT) + POPJ P, + +;.CALL USRMEM +; ARG 1 JOB WHOSE MEMORY SHOULD BE READ OR WRITTEN +; ARG 2 ADDRESS TO READ OR WRITE +; ARGS 3,4 LIKE USRVAR, TTYVAR +; VAL 1 PREVIOUS CONTENTS OF LOCATION +; VAL 2 NEW CONTENTS OF LOCATION (SAME AS PREVIOUS IF NOT WRITING). +; (NOT VALID IN BLOCK MODE) + +; BIT 1.1 IF SET, THEN IF PAGE ISN'T READABLE OR WRITEABLE, GIVE AN MPV +; OR PURE INTERRUPT TO THE JOB BEING REFERENCED. +; BIT 2.9 IF SET, ALLOWS US TO WRITE IN ANY JOB. + +NUSRMEM: + MOVE J,A + JSP T,NCORUI + JRST NUSRM1 ;WE CAN SURELY WRITE. + MOVE H,CTLBTS(U) + CAIGE W,3 ;ELSE, IF WE WANT TO WRITE, + TRNE H,1 ;OR WANT TO GIVE THE REFERENCED JOB INTERRUPTS, + TRNE H,400000 ;THEN UNLESS WE ARE FORCING IT, + JRST NUSRM1 + JSP T,NCORWR ;SEE IF IT IS A JOB WE ARE ALLOWED TO WRITE IN. + JRST OPNL31 +NUSRM1: MOVE H,CTLBTS(U) + CAIE J,-1 + CAIG J,LUBLK ;CAN'T GIVE SYS OR CORE JOBS INTERRUPTS, OR PDP6. + TRNN H,1 + CAIA + JRST OPNL31 +IFN PDP6P,[ + CAIN J,-1 + JRST NUSRMS +];PDP6P + CAILE J,LUBLK + CAMN J,U + JRST NUSRMS + MOVE A,J ;IF TARGET JOB ISN'T SELF OR PDP6 + PUSHJ P,RPCLSR ; OR SYS OR CORE, STOP IT. + PUSHJ P,SOSSET + USTP(J) +NUSRMS: PUSHJ P,NUSRM2 ;DO THE WORK + POPJ P, ;LOST, OPNL HAS LSWCLR'ED + JRST LSWCJ1 ;POSSIBLY UNLOCK USTP, DIELOK AND TAKE SUCCESS RETURN + +NUSRM2: PUSHJ P,VARCAL ;E:=ADDR, D:=DATA, W:=INSTRUCTION + HRRZS E + CAIGE E,20 + JRST NUSRM6 ;ACS ALWAYS SWAPPED-IN AND ACCESSIBLE + PUSH P,U + MOVE U,J + LDB A,[121000,,E] ;GET PAGE # IN A AND REF'D JOB IN U. +IFE PDP6P, PUSHJ P,UPLC +IFN PDP6P,[ + PUSHJ P,[ CAIE J,-1 ;SKIP IF PDP6 + JRST UPLC ;DECODE THEM FOR ORDINARY JOB. + CAIL A,LPDP6M + TDZA T,T ;FOR PDP6, MOST PAGES DON'T EXIST, + MOVE T,[002200,,[600000]] ;AND THE REST ARE WRITABLE. + POPJ P,] +];PDP6P + POP P,U + LDB A,T ;GET PAGE ACCESS HALFWORD. + TRNN A,600000 ;IF PAGE SWAPPED OUT, PUT ACCESS BITS IN PLACE THEY WOULD BE + LSH A,16. ; FOR AN IN-CORE PAGE. + JUMPE A,NUSRM9 ;LOSE IF NO PAGE THERE + TRNN A,400000 ;OR IF WE ARE TRYING TO WRITE THE WORD AND PAGE IS READ-ONLY. + JUMPN W,NUSRM8 +NUSRM6: PUSHJ P,MPLDJ ;NOW LOAD MAP OF JOB IN J + HRLI E,(SKIP) ;GET ACCESS TO DATA WORD, SWAP IN PAGE + SKIPE W + HRLI E,(MOVES) +NUSRM4: CONO PI,CLKOFF ;CLK OFF SO ONCE IN CAN'T SWAP OUT AGAIN + XCTRI XRW,E ;NOT GETTING BENEFIT OF USUAL PCLSR BEFORE + JRST NUSRM5 ;SWAP OUT FEATURE SINCE IT'S ANOTHER JOB + PUSHJ P,TPFLT + JRST NUSRM4 + +NUSRM5: UMOVE B,(E) ;NOW THAT PAGE IS IN, GET OLD CONTENTS + MOVE A,B ;IN A AND B + JUMPE W,NUSRM3 + HRRI W,B ;IF WRITING, + XCT W ;EXECUTE USER'S INSN., MODIFYING 2ND VALUE IN B, + TRNN J,-1 ;SYSTEM JOB? + JRST OPNL31 ;******* WRITING SYS, TURN INTO .SETLOC ******* + UMOVEM B,(E) ;AND STORE IT BACK INTO REF'D JOB. +NUSRM3: PUSHJ P,MPLDZ ;RESTORE NORMAL PAGE MAP, TURN CLKON. + JRST POPJ1 ;SUCCESS + +NUSRM8: SKIPA T,[%PIWRO] ;HERE IF TRYING TO WRITE IN READ ONLY PAGE. +NUSRM9: MOVEI T,%PIMPV ;HERE IF ACCESSING NONEXISTENT PAGE. + TRNN H,1 ;SKIP IF TO GIVE INTERRUPT + JRST OPNL32 + CAMN J,USER + JRST UUOERR ;INTERRUPT TO SELF + IORM T,PIRQC(J) ;INTERRUPT OTHER USER + JRST OPNL32 ;CAN'T GET THAT ACCESS TO PAGE. + +;COMMENTS BELOW APPLY TO UBI IN MANY CASES. FOR UBO, TRANSFER GOES THE +;OTHER DIRECTION + +UBO: MOVNI I,1 + JRST UBIL + +UBI: MOVEI I,0 ;SIGNAL UBI + +UBIL: JUMPL C,UBIA + XCTR XRW,[MOVES TT,(C)] ;MAKE SURE WRITE CYCLES WILL WIN +UBIB: TRNE A,200000 ;SKIP UNLESS 6 + MOVNI A,1 ;SO CAILE BELOW WILL SKIP OVER SUSTPR AMONG OTHER REASONS + CAILE A,LUBLK ;SKIP ON SYS JOB, CORE JOB, PDP6 OR JOB ALREADY STOPPED + PUSHJ P,SUSTPR ;RANDOM JOB STOP + JUMPGE TT,UBI4 ;THRU + TLO A,400000 ;INDICATE ALREADY STOPPED SO WONT TRY IT AGAIN + HLRO B,TT + MOVNS B ;COUNT TO BE XFERRED + HRLZ E,IOCHST-IOCHNM(R) ;EXAMINED USER ADDRESS + HRR E,TT ;FROM,,TO (INFERIOR ADR,,SUPERIOR ADR) + HLRZ Q,E + TLNE A,200000 + JRST UBI5A ;PDP6 +UBI5: CAIGE Q,20 ;INF ADR IN Q + JRST UBI3 ;READ AC + HRRZ J,A ;SET UP UMAPS WORD + TRZE E,400000 + TLOA J,%UMMPL ;TO HI PG, HACK OUR LOW PG + TLO J,%UMMPU ;TO LOW PG, HACK OUR HI PG + TLZE E,400000 + TLOA J,%UMLTU ;TO POINT TO HIS UPPER + TLO J,%UMUTL ;TO POINT TO HIS LOWER + TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER WITH OUR LOWER? + JRST UBI3A ;YES MAKE SURE NOT SCREWED BY AC PNTR +UBI3B: PUSHJ P,MPLD1 + TRZ Q,400000 + MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF DESIRED + ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY + CAMLE B,Q + HRRZ B,Q + MOVNI Q,(E) ;AND DIST OF FROM ADR FROM SEQ BOUNDARY + ADDI Q,400000 + CAMLE B,Q + HRRZ B,Q + TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED + TLOA E,400000 ;SET FROM ADR TO HI PG + TRO E,400000 ;SET TO ADR TO HI PG + SKIPE I ;SKIP ON UBI + MOVSS E ;UBO, XFERR OTHER DIRECTION + MOVE Q,E ;SAVE COPY OF BLT PNTR + ADDI B,(E) ;GET LA +1 +UBI3H: XCTRI XBRW,[BLT E,-1(B)] ;XFERR DATA +UBI3K: MOVEI E,(B) ;NO FAULT, SIMULATE STORE BACK OF BLT PNTR AFTER COMP OF BLT (RH ANYWAY) +UBI3L: PUSH P,J + PUSHJ P,MPLDZ ;RETURN TO NORMAL MAP TO STORE BACK USER PNTR + POP P,J ;SAVE PREV MAP FOR EVENTUAL USE + SUBM E,Q ;FIGURE OUT HOW MANY WDS ACTUALLY XFERRED + HRRZS Q +UBI3E: HRLS Q ;# WDS TRANSFERRED,,SAME + JUMPL C,UBIC ;UPDATE USER PNTR + XCTRI XRW,[ADDM Q,(C)] + JRST .+2 + BUG ;SHOULD HAVE ALREADY CHECKED THIS +UBID: ADD Q,IOCHST-IOCHNM(R) ;UPDATE INFERIOR PNTR + HRRM Q,IOCHST-IOCHNM(R) ;WRAPPING AROUND IF PASS 1,,0 + TLZ B,-1 + CAIN B,(E) ;WAS THERE A FAULT? + JRST UBIL ;NO, LOOP + PUSHJ P,UBI4 ;UNSTOP THE JOB. + PUSHJ P,MPLD1 ;RESTORE TO FROB AT TIME OF FAULT +UBI3C: PUSHJ P,TPFLT + PUSHJ P,MPLDZ + JRST UBIL + +UBI4: TLNN A,200000 ;SKIP ON REALLY PDP6 + TLZ A,400000 ;FLUSH RANDOM BIT SO COMPARE WILL WORK + CAILE A,LUBLK + JRST UPCLSR + POPJ P, + +UBMCK1: PUSHJ P,UBI4 + JRST IOADC + +UBIA: TRNE C,777760 + BUG + MOVE TT,(C) + JRST UBIB + +UBIC: TRNE C,777760 + BUG + ADDM Q,(C) + JRST UBID + +UBI5A: CAIL Q,400000 + JRST UBMCK1 + JRST UBI5 + +UWO: SKIPGE C + SKIPA D,(C) + UMOVE D,(C) + TDZA I,I +UWI: SETO I, ;0 FOR OUTPUT, -1 FOR INPUT. + TRNE A,200000 + MOVNI A,1 ;-1 MEANS PDP6. + CAMN A,USER + HRLI A,-1 ;DON'T STOP SELF + CAIG A,LUBLK + JRST UWI1 ;SYS, CORE, SELF, OR PDP6 + PUSHJ P,SUSTPR + PUSHJ P,SOSSET ;MIGHT TAKE PAGE FAULT AND GET PCLSRED + USTP(A) +UWI1: HRRZ E,IOCHST-IOCHNM(R) + HRRZ J,A + PUSHJ P,MPLDJ ;MAP JOB BEING IOT'ED FROM. + XCTR XRW,[ MOVE W,(E) + MOVEM D,(E)]+1(I) + AOS IOCHST-IOCHNM(R) ;ADVANCE ACCESS POINTER + CAILE A,LUBLK + PUSHJ P,LSWPOP + JRST MPLDZ + +UBI3A: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI + JRST UBI3B ;NO OK + JUMPN I,UBO3A ;UBO + PUSHJ P,MPLDJ + XCTRI XR,[MOVE B,(Q)] ;PICK UP WD + JRST .+2 ;OK + JRST UBI3C ;TAKE FAULT + PUSHJ P,MPLDZ ;BACK TO NORMAL MAP + HRRZ E,TT ;TO ADR + JRST UBI3D + +;USR DEV IOT STOP ROUTINE +USUSTP: SOS USTP(A) +SUSTPR: MOVSI T,BCSTOP+BUCSTP + TDNE T,USTP(A) ;WAIT TILL NOT BEING SHUFFLED + PUSHJ P,UFLS + PUSHJ P,RPCLSR ;AOS'ES USTP + MOVSI T,BCSTOP+BUCSTP + TDNE T,USTP(A) + JRST USUSTP + POPJ P, + +UBI3: ADDI Q,AC0S(A) + JUMPN I,UBO3 ;UBO + TLNE A,200000 + TDZA B,B ;READ PDP6 AC + MOVE B,(Q) ;READ NORMAL AC +UBI3D: XCTRI XW,[MOVEM B,(E)] + JRST .+2 + JRST UBI3C ;TAKE FAULT +UBI3G: MOVEI Q,1 ;1 WD XFERRED + HRRZ B,E ;FAKE OUT FAULT TEST + JRST UBI3E + +UBO3: TLNE A,200000 + JRST UBI3G ;TRYING TO WRITE PDP6 AC IGNORE + XCTRI XR,[MOVE B,(E)] + JRST .+2 + JRST UBI3C + MOVEM B,(Q) + JRST UBI3G + + +UBO3A: XCTRI XR,[MOVE B,(TT)] + JRST .+2 + JRST UBI3C ;TAKE FAULT + PUSHJ P,MPLDJ ;MAP HIM. + XCTRI XW,[MOVEM B,(Q)] + JRST .+2 + JRST UBI3C + PUSHJ P,MPLDZ ;BACK TO NORMAL + JRST UBI3G + +SUBTTL CORE LINK DEVICE + +EBLK +CLVBEG: NCLCH +CLSYN: BLOCK NCLCH ;SYSTEM NAME ;0=>VARIABLES FREE +CLN1: BLOCK NCLCH ;FN1 +CLN2: BLOCK NCLCH ;FN2 +CLUSR: REPEAT NCLCH,-1 ;LH=WRITING USER ;RH=READING USER ;-1=>NOT OPEN THAT HALF +CLRAC: BLOCK NCLCH ;4.9=LOCKED BY CORE ALLOCATOR + ;4.8=VERY SLOW CLOCK ROUTINE CONSIDERING FLUSHING THIS BUFFER + %CAFLS==100000 ;4.7=INPUT CLOSED, TURN OUTPUT INTO NUL DEVICE + %CA==1,,500000 ;RH=UT BUFFER NUMBER (IOBFT ADR) + +CLOSW: -1 ;USER LOCK TO STOP MORE THAN ONE PERSON FROM SIMULTANEOUSLY MODIFYING + 0 ;THE CORE LINK VARIABLES +CLVEND==.-1 +BBLK + +;FORMAT OF CORE LINK 200 WORD BUFFER +; +CLBVSP==8 +CLBCHS==100. +CLBEOF==/5 +IFG CLBVSP+CLBCHS+CLBEOF-128.,.ERR CLBXXX LOSSAGE + +; +;0: CHARACTER COUNT +;1&2: READ AND WRITE CHARACTER OR WORD POINTERS +;3&4: READ AND WRITE EOF POINTERS +;CLBVSP TO CLBVSP+CLBCHS-1: CHARACTERS OR WORDS +;CLBVSP+CLBCHS UP: EOF BITS STORED AS SEVEN FIVE BIT BYTES PER WORD, +; EACH BIT CORRESPONDING TO A CHARACTER POSITION. + +CLAO: SKIPA J,[2] ;CLA .OPEN (TO ANSWER A CLI INTERRUPT) +CLIO: MOVNI J,1 ;CLI .OPEN (INTERRUPTS USER SPECIFIED BY FILE NAME) + JRST CLI2 + +CLUO: TDZA J,J ;CLU .OPEN +CLOO: MOVEI J,1 ;CLO .OPEN +CLI2: JUMPL C,CLFDEL ;JUMP IF AN .FDELE + PUSHJ P,FLDRCK + JRST CLO1 ;NOT FILE DIRECTORY + MOVEI J,2 + JRST LISTF7 + +CLFDEL: MOVEI J,3 +CLO1: PUSHJ P,SWTL ;SEIZE SWITCH TO STOP VARIABLES FROM CHANGING UNDER YOU + CLOSW + LDB H,[220100,,C] ;DIRECTION BIT + JUMPL J,CLOO5 +CLOO5B: MOVE Q,USYSN1(U) ;PICK UP SNAME + MOVSI I,-NCLCH + CAIN J,2 ;SKIP UNLESS CLA + JRST CLO1A ;JUMP IF CLA .OPEN + CAIGE J,0 +CLO1A1: MOVE Q,[SIXBIT/_CLI_/] +CLOL: CAMN Q,CLSYN(I) ;LOOK FOR SNAME, FN1, & FN2 + CAME A,CLN1(I) + JRST CLOO1 + CAME B,CLN2(I) + JRST CLOO1 + JUMPL J,OPNL23 ;"FILE LOCKED" IF ALREADY EXISTS, FOR CLI:. + CAIN J,3 ;SKIP UNLESS DELETE + JRST CLO1D ;FOUND FILE TO DELETE +CLO1A6: LDB TT,CLOOT1(H) + CAIE TT,-1 + JRST OPNL23 ;ALREADY OPEN THIS DIRECTION (FILE LOCKED) + HRRZ TT,CLRAC(I) + LDB Q,[IOSA,,IOBFT(TT)] + LSH Q,6 +CLOX: DPB U,CLOOT1(H) ;STORE USER INDEX + MOVSI TT,200000 + ANDCAM TT,CLRAC(I) ;CLEAR VERY SLOW CLOCK BIT + PUSHJ P,LSWPOP ;RELEASE SWITCH + HRL A,I + LDB C,[220300,,C] + SKIPGE J + PUSHJ P,CLOX1 ;FOR CLI:, PUT OUR UNAME AND JNAME INTO BUFFER. + MOVEI TT,44 ;WORD + TRNN C,6 + MOVEI TT,7 ;UNIT ASCII + ADD Q,H ;OFFSET FOR DIRECTION + DPB TT,[300600,,1(Q)] ;SET UP ITEM POINTER + MOVEI TT,5 ;WORD + TRNN C,6 + MOVEI TT,1 ;UNIT ASCII + DPB TT,[300600,,3(Q)] ;SETUP EOF POINTER + JSP Q,OPSLC7 ;SET UP IOCHNM OF USER + DCLUAI,,DCLUAO ;UNIT ASCII INPUT ;UNIT ASCII OUTPUT + DCLBI,,DCLBO ;BLOCK INPUT ;BLOCK OUTPUT + DCLUBI,,DCLUBO ;UNIT BINARY INPUT ;UNIT BINARY OUTPUT + DCLBI,,DCLBO + +CLOX1: MOVEI TT,44 ;CHANGE OUTPUT BYTE SIZE TO 36. + DPB TT,[300600,,2(Q)] + MOVEI TT,5 ;WHICH INVOLVES STORING 5 CHARACTERS OF EOF BITS AT ONCE. + DPB TT,[300600,,4(Q)] + PUSH P,C + HRROI C,TT + MOVE TT,UNAME(U) + PUSHJ P,CLOXO ;NOW WE CAN IOT WORDS OUT, EVEN IF CHANNEL IS ASCII MODE. + SUBI Q,1 + MOVE TT,JNAME(U) + PUSHJ P,CLOXO + SOJA Q,POPCJ ;NOW RETURN, AND SET UP THE CORRECT BYTE SIZES. + +CLOO1: AOBJN I,CLOL ;LOOP FOR ALL SETS OF CORE LINK VARIABLES + CAIE J,1 + JUMPGE J,OPNL4 ;CLA, CLU DELETE LOSE + MOVSI I,-NCLCH +CLOO3: SKIPN CLSYN(I) ;LOOK FOR FREE VARIABLES TO CREATE FILE + JRST CLOO2 + AOBJN I,CLOO3 + JRST OPNL5 ;GIVE DIREC FULL ERROR + +CLOOT1: 2200,,CLUSR(I) ;READING + 222200,,CLUSR(I) ;WRITING + +CLOO2: MOVEM A,CLN1(I) ;SET UP VARIABLES + MOVEM B,CLN2(I) + MOVEI D,SCNCLO(I) ;SYS CHNL NO + PUSHJ P,TCALL ;GET 200 WORD BUFFER + JRST IUTCONS + JRST CLOO4 ;NO MEM AVAIL + MOVEM Q,CLSYN(I) ;DONT SET UP SYS UNTIL MEM AVAIL + HRRM A,CLRAC(I) + LDB Q,[IOSA,,IOBFT(A)] ;SET UP BUFFER + LSH Q,6 + SETZM (Q) ;CHAR COUNT + MOVE TT,Q + ADDI TT,CLBVSP ;SET UP BUF POINTERS + MOVEM TT,1(Q) + MOVEM TT,2(Q) + HRLI TT,440000 + ADDI TT,CLBCHS ;SET UP EOF POINTERS + MOVEM TT,3(Q) + MOVEM TT,4(Q) + JRST CLOX + +;NO MEMORY AVAILABLE FOR 200-WD BUFFERS +CLOO4: AOS SWPOPR ;MAYBE SWAPPING SOMETHING OUT WILL HELP + PUSHJ P,LSWPOP ;UNLOCK CLOSW + PUSHJ P,UDELAY ;WAIT A WHILE + JRST CLO1 ;TRY AGAIN + +CLOO5: CONO PI,CLKOFF ;TURN OFF CLOCK TO STOP U&J NAMES FROM CHANGING + MOVEI Q,2*LUBLK +CLOO5A: CAMN A,UNAME(Q) ;LOOK FOR USER WHOSE NAMES MATCH THE SPECIFIED FILE NAMES + CAME B,JNAME(Q) + JRST CLOO6 + MOVEI T,%PICLI ;IF GET TO HERE, HAVE FOUND USER WITH RIGHT NAMES + TDNN T,MSKST(Q) ;SKIP IF HE HAS CLI INT DISABLED + JRST OPNL11 + IORM T,PIRQC(Q) ;GIVE USER INT + CONO PI,CLKON + JRST CLOO5B + +CLOO6: ADDI Q,LUBLK ;GO TO NEXT USER SLOT + CAMGE Q,USRHI ;SKIP IF ALL EXAMINED + JRST CLOO5A + JRST OPNL11 + +CLO1D: MOVE T,CLUSR(I) + AOJN T,OPNL23 ;FILE LOCKED + AOS (P) + MOVE A,I + PUSHJ P,CLIOTB ;NO TIMING ERROR SINCE CORE JOB WILL PCLSR USR ON + SKIPN B,SRN3(U) ;CORE LINK BEFORE MOVING BUFFER + JRST CLO1D2 + MOVEM B,CLN1(A) + MOVE B,SRN4(U) + MOVEM B,CLN2(A) + JRST LSWPOP ;CLOSW + +CLO1A: MOVE A,UNAME(U) + MOVE B,JNAME(U) + JRST CLO1A1 + +;CORE LINK .IOT SET UP ROUTINE + +CLIOTB: SKIPGE CLRAC(A) ;WAIT IF BUFFER LOCKED BY CORE ALLOCATOR + PUSHJ P,UFLS ;(DO NOT CHANGE ABOVE TO "SKIPGE TT,CLRAC(A)") + HRRZ TT,CLRAC(A) + LDB Q,[IOSA,,IOBFT(TT)] ;GET POINTER TO BUFFER + LSH Q,6 + POPJ P, + + +;CORE LINK .IOT ROUTINE FOR UNIT ASCII INPUT + +CLUAI: PUSHJ P,CLIOTB ;SETUP + MOVSI T,%CAFLS + TDNE T,CLRAC(A) + PUSHJ P,UFLS + SKIPN (Q) ;WAIT TILL CHAR COUNT NON-ZERO + PUSHJ P,UFLS +CLUAI1: MOVE J,3(Q) + ILDB I,J ;GET EOF BIT + JUMPN I,UNIEOF +CLUAIE: ILDB W,1(Q) ;GET CHARACTER + SOS (Q) ;DECREMENT BUF COUNT +CLFAXP: LDB TT,[700,,1(Q)] ;FIX UP POINTERS + CAIN TT,CLBVSP+CLBCHS-1 + PUSHJ P,CLFAX2 ;MAYBE TIME TO RING BUFFER + HLRZ TT,J ;GET BYTE POSITION AND SIZE + CAIN TT,010100 ;IF TO END OF 35-BIT WORD, ADVANCE + IBP J ;TO NEXT WORD (5-BIT BYTES 1 BIT AT A TIME) + MOVEM J,3(Q) + POPJ P, + +UNIEOF: HRROI W,EOFCH + JRST POPJ1 + +CLFAX2: LDB TT,[370500,,1(Q)] ;PICK UP TOP 5 BITS OF BYTE POSITION + JUMPN TT,CPOPJ ;NOT QUITE YET +CLFBX2: MOVEI TT,CLBVSP ;J HAS NEW EOF PNTR + DPB TT,[700,,1(Q)] ;RING CHAR POINTER + MOVEM J,3(Q) + MOVEI J,44 + DPB J,[360600,,1(Q)] + MOVEI TT,CLBVSP+CLBCHS + DPB TT,[700,,3(Q)] ;RING EOF POINTER + DPB J,[360600,,3(Q)] + MOVE J,3(Q) + POPJ P, + +;CORE LINK .IOT ROUTINE FOR UNIT ASCII OUTPUT + +CLUAO: MOVE T,CLRAC(A) + TLNE T,%CAFLS + POPJ P, + PUSHJ P,CLIOTB ;SETUP + MOVEI T,CLBCHS*5-11. + CAMGE T,(Q) ;WAIT TILL THERE IS SPACE IN BUF + PUSHJ P,UFLS + MOVE J,4(Q) + SKIPGE C + SKIPA B,(C) ;GET CHAR FROM EXEC + UMOVE B,(C) ;GET CHAR FROM USER + MOVEI TT,0 + IDPB TT,J ;INDICATE NOT AN EOF + IDPB B,2(Q) ;STORE IN BUF + MOVEI TT,1 ;GET MASK FOR LOW ORDER BIT + ANDCAM TT,@2(Q) ;FLUSH IN CURRENT WORD +CLCWU2: AOS (Q) ;INCREMENT BUF COUNT + MOVEI I,0 ;FAKE OUT EOF TEST + AOJA Q,CLFAXP ;FAKE OUT CLFAXP AND FIX UP POINTERS + + +CLBI: JSP W,WRDBTI ;BLOCK INPUT. + +;CORE LINK .IOT ROUTINE FOR UNIT BINARY INPUT + +CLUBI: PUSHJ P,CLIOTB ;SETUP + MOVSI T,%CAFLS + TDNE T,CLRAC(A) + PUSHJ P,UFLS + MOVEI T,5 + CAMLE T,(Q) ;WAIT TILL A WORD IS AVAILABLE + PUSHJ P,UFLS +CLUBI1: MOVE J,3(Q) + ILDB I,J ;GET EOF BITS + JUMPN I,CLUBIF ;JUMP ON EOF +CLUBIE: ILDB W,1(Q) ;GET WORD +CLCRB2: MOVNI T,5 + ADDB T,(Q) ;DECREMENT COUNT + JUMPGE T,CLFBXP + SETZM (Q) ;CAME FROM CLCLRL WITH PARTIAL WORD IN BUFFER +CLFBXP: JRST CLFAXP + +CLUBIF: TROE I,20 ;SKIP IF EOF NOT ON FIRST CHAR OF WORD + JRST POPJ1 + DPB I,J ;SET EOF ON FIRST CHAR + MOVE J,1(Q) + ILDB W,J ;PICK UP WORD WITH EOF IN MIDDLE + POPJ P, + +;CORE LINK .IOT ROUTINE FOR UNIT BINARY OUTPUT + +CLUBO: MOVE T,CLRAC(A) + TLNE T,%CAFLS + POPJ P, + PUSHJ P,CLIOTB ;SETUP +;CLI: OPEN CALLS HERE TO OUTPUT UNAME AND JNAME. +CLOXO: MOVEI T,CLBCHS*5-11. + CAMGE T,(Q) ;WAIT TILL THERE IS SPACE FOR A WORD + PUSHJ P,UFLS + MOVE J,4(Q) + SKIPGE C + SKIPA B,(C) ;GET WORD FROM EXEC + UMOVE B,(C) ;GET WORD FROM USER + MOVEI TT,0 + IDPB TT,J ;INDICATE NOT AN EOF + IDPB B,2(Q) ;STORE IN BUF +CLCWB2: MOVEI TT,5 + ADDM TT,(Q) ;INCREMENT COUNT + AOJA Q,CLFAXP ;FAKE OUT CLFBXP AND FIX UP POINTERS + + +;CORE LINK .IOT ROUTINE FOR BLOCK OUTPUT + +CLBO: MOVE I,C ;SAVE A POINTER TO USERS BLKO POINTER + XCTR XR,[SKIPL H,(I)] ;PICKUP BLKO POINTER + POPJ P, + SKIPA E,H ;SECOND COPY, ALSO FLAG TO CLBIN +CLBI2: UMOVEM E,(I) ;TO INFORM USER & IN CASE YOU ARE PCLSR'ED + HRRZ C,E + PUSHJ P,CLUBO ;TRANSFER ONE WORD + AOBJN E,CLBI2 ;TRY FOR NEXT +CLBI3: UMOVEM E,(I) ;COUNT EXHAUSTED OR EOF + POPJ P, + +;CORE LINK .CLOSE ROUTINE FOR BINARY OR BLOCK OUTPUT + +CLCLWB: PUSHJ P,CLCWC ;STORE EOF BITS FOR WORD + JRST CLCWU6 ;NO ROOM SO LAST MUST HAVE BEEN EOF HACK SO FLUSH + IBP 2(Q) ;KEEP WORD POINTER IN STEP + PUSHJ P,CLCWB2 ;FIX UP COUNT AND POINTERS +CLCWU6: MOVNI B,1 + DPB B,[222200,,CLUSR(A)] ;OBLITERATE USER INDEX + MOVSI B,%CAFLS + ANDCAM B,CLRAC(A) + JRST LSWPOP ;RELEASE SWITCH + +;CORE LINK .CLOSE ROUTINE FOR UNIT ASCII OUTPUT + +CLCLWU: PUSHJ P,CLCWC ;STORE EOF BIT FOR CHAR + JRST CLCWU6 + MOVEI TT,EOFCH + IDPB TT,2(Q) ;STORE AN EOF CHAR + PUSHJ P,CLCWU2 ;FIX UP COUNT AND POINTERS + SOS Q ;CLCWU2 AOJAS + LDB TT,[360600,,2(Q)] + SOJE TT,CLCWU6 ;JUST FILLED A WHOLE WORD => STOP PADDING. + PUSHJ P,LSWPOP ;ELSE PAD ONCE MORE. + JRST CLCLWU + + +;COMMON SUBROUTINE FOR CORE LINK OUTPUT .CLOSE ROUTINES + +CLCWC: PUSHJ P,SWTL ;LOCK SWITCH (IF SIGN OF CLRAC IS EVER REALLY USED, + CLOSW ;THIS MIGHT CAUSE A DEADLY EMBRACE). + PUSHJ P,CLIOTB ;SETUP + MOVEI T,CLBCHS*5-5. + CAMGE T,(Q) ;WAIT FOR THERE TO BE ROOM + POPJ P, + MOVE J,4(Q) + MOVNI TT,1 + IDPB TT,J ;SET EOF BIT(S) + JRST POPJ1 + +;CORE LINK .CLOSE ROUTINE FOR INPUT + +CLO1D2: SETZM CLSYN(A) ;FREE VARIABLES + HRRZS A,CLRAC(A) ;CORE LINK NO LONGER IN USE + PUSHJ P,BRTN ;RETURN BUFFER TO FREE STATE + JRST LSWPOP + +CLISTA: PUSHJ P,CLIOTB ;CORE LINK INPUT STATUS + SKIPN J,(Q) ;COUNT + TRO D,1_10. ;SYS BUF CAP EMPTY + CAIL J,CLBCHS*5-5 + TRO D,1_9 ;SYS BUF CAP EMPTY + POPJ P, + +CLCLRA: TDZA C,C ;UNIT ASCII +CLCLRB: MOVNI C,1 ;IMAGE OR BLOCK (I.E. WORDS) + PUSHJ P,CLIOTB + PUSHJ P,SWTL + CLOSW +;FLUSH ALL REAL DATA +CLCLRL: SKIPN (Q) ;SKIP IF BUFFER CONTAINS DATA, READ IT UNTIL EOF + JRST CLCLR1 + PUSHJ P,[JUMPE C,CLUAI1 ? JRST CLUBI1] + JRST CLCLRL +CLCLR2: MOVE J,3(Q) ;FOUND AN EOF, FLUSH THE EOF WORD + ILDB I,J + PUSHJ P,[JUMPE C,CLUAIE ? JRST CLUBIE] + MOVE T,1(Q) + TLNE T,760000 + JRST CLCLR2 ;NOT YET TO WORD BOUNDARY + JRST CLCLR3 + +CLCLR1: MOVSI B,%CAFLS + IORM B,CLRAC(A) + PUSH P,A + PUSH P,Q + HLRZ A,CLUSR(A) + PUSHJ P,NJRPCL + PUSHJ P,NJUPCL + POP P,Q + POP P,A +CLCLR3: HLLOS B,CLUSR(A) ;NO LONGER OPEN FOR INPUT + SKIPN (Q) ;IF NO DATA IN BUFFER + AOJE B,CLO1D2 ;AND NOT OPEN FOR OUTPUT, GO FREE THE BUFFER AND VARS + JRST LSWPOP + +SUBTTL LOCK DEVICE + +NLCKCH==:8 ; Should be enough. + +EBLK + +LCKNAM: REPEAT NLCKCH, 0 ; 0 => free lock channel, else contains + ; name of lock held by this channel. +LCKUSR: REPEAT NLCKCH, 0 ; Job that holds the lock. Nothing looks + ; at this currently. +LCKSW: -1 ? 0 ; Prevent more than one user from trying to + ; lock a lock at the same time. +BBLK + +; LCKO is .OPEN routine for LOCK device. First filename is name of lock to +; seize. 0 is illegal. Only opens for output are permitted (some day we +; might allow multiple opens for input). +; +; Bit 1.4 controls what happens if lock is already held: +; 0 => error: %ENAFL +; 1 => Hang until you can seize it +LCKO1: PUSHJ P,LSWPOP ; We lose this time + TLNN C,10 ; 1.4 => HANG MODE + JRST OPNL23 ; FILE LOCKED + MOVE T,A + CAMN T,LCKNAM(I) ; Wait for unlock, then try again + PUSHJ P,UFLS +LCKO: JUMPE A,OPNL11 ; ILLEGAL FILE NAME + PUSHJ P,SWTL ; One potential locker at a time + LCKSW + MOVSI I,-NLCKCH ; Check if it is already locked + CAME A,LCKNAM(I) + AOBJN I,.-1 + JUMPL I,LCKO1 ; Already held + MOVSI I,-NLCKCH ; Search for free lock channel + SKIPE LCKNAM(I) + AOBJN I,.-1 + JUMPGE I,OPNL6 ; DEVICE FULL + HRRZM U,LCKUSR(I) + MOVEM A,LCKNAM(I) + HRLZI T,(I) + HRRI T,DNLCK + MOVEM T,(R) ; Set up channel + JRST LSWPJ1 ; And return + +; .CALL RFNAME returns name of lock: +LCKRCH: MOVE B,LCKNAM(A) + POPJ P, + +; .CLOSE releases the lock: +LCKCL: SETZM LCKNAM(A) + POPJ P, + +SUBTTL COMMON I/O ROUTINES + +;STANDARD DEVICE OPEN + +STDOP1: MOVEI R,R ;ENTRY TO NOT CLOBBER IOCHNM +STDOPN: HLRZ A,(Q) ;LH MASK ON 4.9-3.2 OF LH OPEN WRD + AND D,A ;RH POINTER TO ..USR,..USE PAIR + ROT D,-1 ;FOLLOWING WORDS CONTAIN LIST FOR ALL MASKED STATES + ADDI D,(Q) ;LH MSKED STATE =0, RH =1, IOTTB ENTRY NUMBERS + HRRZ A,1(D) + SKIPL D + HLRZ A,1(D) + JUMPE A,OPNL12 ;MODE NOT AVAIL + HRRZ E,(Q) + CONO PI,CLKOFF + CAME U,(E) + SKIPGE 1(E) + AOSA 1(E) + JRST OPNL10 ;DEVICE NOT AVAIL + MOVEM U,(E) + HLL A,C + JRST OPNSLT + +OPSLD1: ANDI D,1 ;ENTRY TO USE BOTTOM BIT OF AC D +OPSLD3: ANDI D,3 ;ENTRY TO USE BOTTOM TWO BIT OF AC D + MOVE C,D +OPSLC3: ANDI C,3 ;ENTRY TO USE BOTTOM TWO BITS OF AC C +OPSLC7: ANDI C,7 ;ENTRY TO USE BOTTOM THREE BITS OF AC C + ROT C,-1 + ADDI C,(Q) + HRR A,(C) + SKIPL C + HLR A,(C) +OPNSLT: MOVEM A,(R) ;SET USERS IOCHNM + JRST CLKOJ1 + +;BLOCK OUTPUT TO CHARACTER DEVICE +;ADR OF CHR ROUTINE IN E +; THAT ROUTINE MUST NOT CLOBBER C, D, E, OR TT +;C POINTS TO AOBJN POINTER IN USER SPACE +;MUSTN'T CLOBBER J (TTY OUTPUT ASSUMES). + +NBTOCH: XCTR XRW,[MOVES D,(C)] ;CHECK WRITEABILITY OF AOBJN PTR + LDB TT,[410300,,D] ;USE HIGH 3 BITS OF USER PNTR AS CHR CNT + CAIGE TT,3 + POPJ P, ;USER TRYING TO XFER >32K FLUSH + SKIPA TT,BTOCHT-3(TT) ;PICK UP APPROPRIATE BYTE PTR (WORD IN W) +NBTO1: UMOVEM D,(C) ;UPDATE USER'S AOBJN PTR + UMOVE W,(D) ;FETCH CURRENT WORD FROM USER + ILDB A,TT ;FETCH CURRENT CHARACTER + PUSHJ P,(E) ;SEND TO DEVICE + ADD D,[700000,,] ;UPDATE PTR + TLNE D,500000 + JRST NBTO1 ;GO TO NEXT CHR + MOVE TT,BTOCHT+4 + ADD D,[500001,,1] ;INCR TO NEXT WORD + JUMPL D,NBTO1 + UMOVEM D,(C) ;COUNTED OUT, UPDATE FINAL TIME & RETURN + POPJ P, + +BTOCHT: REPEAT 5,<44-<4-.RPCNT>*7>_14+700,,W + +;BLOCK INPUT FROM CHARACTER DEVICE +;E AND C SET UP LIKE NBTOCH +;INTERNALLY LH OF E USED FOR FLAGS: +; 4.9 EOF FLAG (SIGN) +; 4.8 => JUST RETURN WITHOUT ERROR IF AT BEGINNING OF WORD, +; OTHERWISE IGNORE BIT. +; 4.7 => RETURN WITHOUT ERROR EVEN IF NOT AT BEGINNING OF WORD. + +INBTCH: HRRZS E ;CLEAR GARBAGE IN LH + XCTR XRW,[MOVES D,(C)] ;SET UP LIKE NBTOCH + LDB TT,[410300,,D] + CAIGE TT,3 + POPJ P, + SKIPA TT,BTOCHT-3(TT) +INBTO1: UMOVEM D,(C) + XCTR XRW,[MOVES (D)] ;CHECK WRITABILITY OF CURRENT WORD + JUMPL E,INBTO2 ;JUMP IF EOF + PUSH P,C + PUSH P,D + PUSH P,TT + PUSH P,R + HLRZ A,(R) + PUSHJ P,(E) ;RETN CHR IN W + JRST .+3 + TLO E,200000 + TLO E,400000 + MOVE I,W + POP P,R + POP P,TT + POP P,D + POP P,C + LDB W,[410300,,D] + TLNN E,100000 + CAIN W,7 ;SKIP IF NOT AT 1ST CHAR. + TLNN E,300000 + JRST INBTO3 + POPJ P, + +INBTO3: UMOVE W,(D) ;PICK UP CURRENT WORD + IDPB I,TT ;INSERT CHARACTER + UMOVEM W,(D) ;PUT WORD BACK + ADD D,[700000,,] + TLNE D,500000 + JRST INBTO1 ;DO ANOTHER CHR THIS WORD + MOVE TT,BTOCHT+4 + ADD D,[500001,,1] ;INCR TO NEXT WD + SKIPL E ;SKIP IF EOF + JUMPL D,INBTO1 + UMOVEM D,(C) ;DONE, UPDATE POINTER AND RETURN + POPJ P, + +INBTO2: MOVEI I,EOFCH ;EOF, STORE EOF CHARACTER + JRST INBTO3 + +;BLOCK IO TO WORD DEVICE +;C POINTS TO AOBJN POINTER IN USER SPACE +;Q POINTS TO WORD HANDLING ROUTINE (POINTER WILL BE IN C) +;MUST NOT CLOBBER Q OR H (PTR ROUTINES DO POPJ2 SOMETIMES) +;WRDBRT CHECKED FOR ON PDL BY TVC ROUTINES + +WRDBT: MOVE H,C + UMOVE C,(H) ;FETCH USER'S AOBJN POINTER + JUMPGE C,CPOPJ + JRST WRDBT3 + +WRDBT2: PUSHJ P,OPBRK +WRDBT3: ANDI C,-1 + PUSHJ P,(Q) +WRDBRT: JRST WRDBT5 ;NO SKIP - WORD XFERRED + SKIPA C,[1,,1] ;1 SKIP - LAST WORD XFERRED + POPJ P, ;2 SKIPS - EOF, NO WORD XFERRED + XCTR XRW,[ADDM C,(H)] + POPJ P, + +WRDBT5: MOVE C,[1,,1] + XCTR XRW,[ADDB C,(H)] + JUMPL C,WRDBT2 + POPJ P, + +;JSP W,WRDBTI TO DO WRDBT FOR A UNIT MODE INPUT ROUTINE SATISFYING NEW +;CALLING CONVENTION FOR THOSE. +WRDBTI: JSP Q,WRDBT + XCTR XRW,[MOVES (C)] + PUSH P,W + PUSHJ P,(W) + JRST WRDBT4 + JRST POPWJ2 + AOS -1(P) +WRDBT4: UMOVEM W,(C) + MOVEI Q,WRDBTI+1 + POP P,W + POPJ P, + +;CHANGED CONVENTIONS: + ;1) EOF IS NO LONGER CHECKED FOR CHARACTER BY CHARACTER. + ; INSTEAD, THE GET-BUFFER ROUTINE SHOULD SET UP THE BYTE COUNT + ; TO A SMALLER VALUE THAN USUAL. + ; AN ATTEMPT TO GET ANOTHER BUFFER AFTER REACHING EOF + ; SHOULD CAUSE THE GET-BUFFER ROUTINE TO SKIP TWICE. + ;2) THE THE BUFFER POINTER IS NOW A B.P. EVEN IN IMAGE MODE. + ; ALSO, THE L.H. OF THE B.P. IS NOT INITTED HERE. + ; IT MUST BE SET UP BY THE OPEN ROUTINE. ALSO, ACCESS ROUTINES + ; FOR DSK MUST KNOW HOW TO SET IT UP. + ; ALSO, THE BUFFER GET ROUTINE SHOULD SET IT UP, + ; INSTEAD OF RETURNING THE BUFFER ADDRESS IN TT. + ;3) THE BYTE SIZE THE FILE IS OPEN ON IS PASSED AS AN ARGUMENT. + ; THIS ROUTINE WORKS FOR ANY CHANNEL BYTE SIZE WITH ANY + ; SIOT BYTE SIZE. + +;GENERAL BLOCK I/O +;RH OF E HAS # BYTES/WORD OF FILE BYTE SIZE. LH OF E HAS B.P. 44NN00. +;RH(C) = ADDR OF COUNT, IN USER MEMORY +;RH(TT) = ADDR OF USER'S B.P. +; ARGUMENTS B -> +;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT +;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER +;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY +; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B) +; AND BUFFER BYTE POINTER ALREADY SET UP. +; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF. +; WHEN THIS ROUTINE IS CALLED, E CONTAINS THE +; NUMBER OF BYTES/WORD (GOOD FOR DETERMINING CHANNEL MODE). +;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT) +; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO, +; IN WHICH CASE IT SHOULD CONTAIN THE NEW NUMBER OF BYTES. +;4(B) NOT USED +;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O +; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT + +;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I +;SIOKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER. + +SIOKT: PUSH P,E + PUSH P,TT + PUSH P,C + JRST SIOKT1 + +;NEXT BUFFER + +SIOKNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER + SKIPE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME + JRST SIOKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE) + SKIPG 5(B) ;NEED TO WAIT FOR DEVICE? + JRST SIOKF1 ;NO. +SIOKN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER + JRST SIOKW1 ;DEVICE CAN'T WAIT SO UDELAY + XCT 5(B) ;DEVICE WAIT +SIOKF: PUSHJ P,UFLS + +SIOKF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER + JRST SIOKN1 ;HMM, HAVE TO WAIT + JRST SIOKT1 ;BUFFER HAS BEEN GOT. + JRST POP3J1 ;EOF, TRANSFER IS COMPLETE + +SIOKT1: UMOVE TT,@(P) ;GET COUNT OF BYTES TO TRANSFER + JUMPLE TT,POP3J1 ;COUNT DECREMENTED TO 0; TRANSFER DONE. + SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER + JRST SIOKNB ;NEW BUFFER NEEDED + CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER + MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER + UMOVE J,@-1(P) + IBP J + LDB D,[301400,,J] + MOVE C,@(B) + IBP C ;TO TRANSFER WORD-WISE, BOTH B.P.'S MUST + HRL J,C + LDB C,[301400,,C] + CAIE C,(D) ;HAVE SAME BYTE SIZE, + JRST SIOKS1 + LDB D,[060600,,C] + ANDI C,77 + ADDI C,(D) +;DROPS THROUGH + ;DROPS IN + CAIGE TT,@-2(P) ;THERE MUST BE AT LEAST 1 WORD TO TRANSFER, + JRST SIOKS1 + CAIE C,44 ;AND MUST BE ABOUT TO START THE NEXT WORD. + JRST SIOKSL + PUSH P,TT+1 + IDIVI TT,@-3(P) ;GET # WDS TO BLT + POP P,TT+1 + SKIPGE (B) + MOVSS J ;WRITING, SWAP BLT POINTER + MOVE D,J + ADDI TT,(D) ;1+LAST WORD TO BLT INTO + SKIPGE (B) + JRST SIOKN6 ;JUMP IF WRITING + XCTRI XBW,[BLT D,-1(TT)] ;READING +SIOKN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10) +SIOKN8: SUBM D,J + HRRZS J ;# WDS ACTUALLY XFERRED + ADDM J,@(B) ;INCR BUFFER PNTR + XCTR XRW,[ADDM J,@-1(P)] + IMULI J,@-2(P) + MOVNS J + XCTR XRW,[ADDM J,@(P)] + ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER + CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD + PUSHJ P,TPFLT ;TAKE FAULT +SIOKN3: SKIPN @1(B) + PUSHJ P,@3(B) ;BUFFER EXHAUSTED, DISCARD (MAY COME BACK TO LIFE). + JRST SIOKT1 ;TRY AGAIN TO TRANSFER. + +SIOKW1: PUSHJ P,UDELAY + JRST SIOKF1 + +SIOKN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER + JRST SIOKN7 + JRST SIOKN8 + +;COME HERE FOR SLOW (BYTE AT A TIME) SIOT TO BLOCK MODE DEVICE. +;TT HAS NUMBER OF BYTES TO TRANSFER - IT IS KNOWN THAT THE DEVICE +;CAN SUPPLY THAT MANY FROM ITS CURRENT BUFFER. +SIOKSL: SUBM C,D ;D GETS SIZE; C HAS # BITS REMAINING TO BE HANDLED + IDIV C,D ;C GETS # BYTES TO XFER TILL REACH WORD BOUNDARY. + MOVE TT,C ;XFER THAT MANY, THEN TRY AGAIN, SO WILL USE FAST MODE. +SIOKS1: SKIPL (B) + JRST SIOKSI ;INPUT AND OUTPUT PART HERE + LDB D,[300600,,@(B)] ;BYTE SIZE IN THE BUFFER + MOVEI C,36. + IDIV C,D ;D := # EXTRA BITS AT RIGHT END OF WORD + MOVEI J,1 + LSH J,(D) + SOS J ;J := MASK FOR THEM + UMOVE C,@-1(P) ;GET COPY OF USER'S B.P. FOR SWAPPING IN PAGES. +SIOKS3: IBP C ;IF NOT FOR THESE 2 INSNS, ILDB MIGHT GET PAGE FAULT + UMOVE (C) ;WHICH WOULD CAUSE EXTRA INCREMENTING OF B.P. + XCTR XBYTE,[ILDB D,@-1(P)] ;FETCH NEXT BYTE, + IDPB D,@(B) + MOVE D,@(B) + ANDCAM J,(D) ;TURN OFF EXTRA BITS IN THIS WORD OF BUFFER + SOS @1(B) + XCTR XRW,[SOS @(P)] + SOJG TT,SIOKS3 + JRST SIOKN3 + +SIOKSI: UMOVE C,@-1(P) ;GET COPY OF USER'S B.P., FOR WRITEABILITY TESTING. +SIOKS2: IBP C + XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE IN NEXT BYTE. + ILDB D,@(B) ;GET NEXT BYTE FROM DEVICE BUFFER + XCTR XBYTE,[IDPB D,@-1(P)];GIVE IT TO USER. + XCTR XRW,[SOS @(P)] ;UPDATE USER'S COUNT + SOS @1(B) ;AND THE SYSTEM'S COUNT. + SOJG TT,SIOKS2 + JRST SIOKN3 + +;CONVENIENT EXIT ROUTINE FOR BUFFER-GET ROUTINES. +;ASSUMES ADDR OF START OF BUFFER IN TT, +;SIZE (IN WORDS) OF DATA AREA IN J. +;E SHOULD HAVE WHAT IT HAD WHEN SIOKT WAS CALLED. +SIOBGX: IMULI J,(E) +SIOBG1: HLL TT,E +SIOBG2: MOVEM TT,@(B) + MOVEM J,@1(B) + JRST POPJ1 + +;BYTE AT A TIME I/O TO BLOCK MODE DEVICE +;SEE PRECEDING PAGE (SIOKT) FOR COMMENTS ON CALLING SEQUENCE +;EXCEPT: ON INPUT, VALUE RETURNED IN W, AND C,D HAVE NO SIGNIFICANCE; +;ON OUTPUT, RH(C) HAS ADDRESS OF ARG, SIGN(C) SET IFF ADDRESS IS EXEC-MODE, +; AND D HAS NO SIGNIFICANCE. + +CHRKT: SKIPGE (B) + JRST CHRKTO ;WRITING + JRST CHRKTI ;READING + +CHRKTI: SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT + JRST CHRKT1 ;GET NEW BUFFER + ILDB W,@(B) ;READ - GET NEXT CHAR + POPJ P, + +CHRKTO: SKIPGE C ;USED WHEN FILLING OUT BLOCK AT CLOSE, AND ELSEWHERE. + SKIPA J,(C) + UMOVE J,(C) ;GET CHAR. FROM USER + SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT + JRST CHRKT1 ;GET NEW BUFFER + IDPB J,@(B) ;DEPOSIT IN BUFFER + CAIE E,5 ;SKIP IF ASCII + POPJ P, + MOVEI J,1 + MOVE D,@(B) + ANDCAM J,(D) ;CLEAR EXTRA BIT + POPJ P, + +CHRKT1: AOS @1(B) ;COMPENSATE FOR OVER-SOS + PUSHJ P,@3(B) ;GET RID OF THIS BUFFER + SKIPLE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME + JRST CHRKT ;SPRUNG BACK TO LIFE (LAST BLOCK OF FILE WRITE OVER) + SKIPG 5(B) ;NEED TO WAIT FOR DEVICE? + JRST CHRKF1 ;NO. +CHRKN1: SKIPG 5(B) ;HAVE TO WAIT + JRST [ PUSHJ P,UDELAY + JRST CHRKF1 ] + XCT 5(B) ;DEVICE WAIT + PUSHJ P,UFLS + +CHRKF1: PUSHJ P,@2(B) ;GOBBLE NEW BLOCK + JRST CHRKN1 ;NOT READY, WAIT + JRST CHRKT + CAME E,[444400,,1] + JRST UNIEOF ;READING PAST EOF IN ASCII MODE. + JRST IOCER2 ;READING PAST EOF IN IMAGE MODE. + +;GENERAL BLOCK I/O +;E HAS BPLH,,# BYTES/WORD OF FILE BYTE SIZE - MUST BE 444400,,1 +;RH(C) = ADDR OF AOBJN POINTER +; AND 4.9 => AOBJN PTR IS IN EXEC ADDRESS SPACE, +; 4.8 => BLOCK IT POINTS TO IS IN EXEC ADDRESS SPACE. (INPUT ONLY) +; ARGUMENTS B -> +;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT +;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER +;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY +; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B) +; AND BUFFER B.P. IN @(B) ALREADY SET UP. +; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF. +;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT) +; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO. +;4(B) NOT USED +;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O +; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT + +;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I +;BLKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER. + +;CODE IS ON NEXT PAGE + +BLKT: CAME E,[444400,,1] + BUG ;BLKT CALLED ON UNIT ASCII MODE CHANNEL?? + SKIPL C ;SKIP IF POINTER IN USER SPACE + XCTR XRW,[MOVES (C)] ;USER SPACE, MAKE SURE WRITE CYCLE WILL WIN + JRST BLKT1 + +;NEXT BUFFER + +BLKTNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER + SKIPE @1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME + JRST BLKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE) + SKIPG 5(B) ;NEED TO WAIT FOR DEVICE? + JRST BLKTF1 ;NO. +BLKTN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER + JRST BLKTW1 ;DEVICE CAN'T WAIT SO UDELAY + XCT 5(B) ;DEVICE WAIT +BLKTF: PUSHJ P,UFLS + +BLKTF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER + JRST BLKTN1 ;HMM, HAVE TO WAIT + JRST BLKT1 + POPJ P, ;EOF, TRANSFER FINISHED + +BLKT1: SKIPGE C ;SET UP FOR TRANSFER + SKIPA J,(C) ;GET EXEC MODE BLOCK .IOT (AOBJN) POINTER + UMOVE J,(C) ;GET USER MODE AOBJN POINTER + JUMPGE J,CPOPJ ;POINTER COUNTED OUT, TRANSFER DONE + SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER + JRST BLKTNB ;NEW BUFFER NEEDED + HLRE TT,J + MOVNS TT ;DESIRED SIZE OF BLOCK + CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER + MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER + MOVE D,@(B) ;CANONICALIZE THE BUFFER B.P. SO RH => NEXT WORD TO XFER + IBP D + HRL J,D ;MERGE WITH USER'S BLOCK ADDR TO GET BLT AC. + SKIPGE (B) + MOVSS J ;WRITING, SWAP BLT POINTER + MOVE D,J + ADDI TT,(D) ;1+LAST WORD TO BLT INTO + TLNE C,200000 + JRST BLKTN9 ;JUMP IF EXEC AOBJN POINTER + SKIPGE (B) + JRST BLKTN6 ;JUMP IF WRITING + XCTRI XBW,[BLT D,-1(TT)] ;READING +BLKTN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10) +BLKTN8: SUBM D,J + HRRZS J ;# WDS ACTUALLY XFERRED + ADDM J,@(B) ;INCR BUFFER PNTR + HRLS J ;PUT # WDS IN BOTH HALVES + JUMPL C,BLKTN3 ;UPDATE AOBJN PTR IN EXEC SPACE + XCTRI XRW,[ADDM J,(C)] ;UPDATE AOBJN PTR IN USER SPACE + JRST .+2 + BUG ;MUMBLE. THIS WAS SUPPOSED TO BE THERE. + +BLKTN4: MOVNI J,(J) + ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER + CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD + PUSHJ P,TPFLT ;TAKE FAULT IF ANY + SKIPN @1(B) + PUSHJ P,@3(B) ;BUFFER EXHAUSTED, "DISCARD" + JRST BLKT1 ;GO TRANSFER ANOTHER CHUNK + +BLKTN3: ADDM J,(C) ;UPDATE EXEC AOBJN POINTER + JRST BLKTN4 + +BLKTW1: PUSHJ P,UDELAY + JRST BLKTF1 + +BLKTN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER + JRST BLKTN7 + JRST BLKTN8 + +BLKTN9: BLT D,-1(TT) ;READING INTO EXEC SPACE + JRST BLKTN7 + +SUBTTL DIRECTORY AND ERR DEVICES + +QMLSTF: MOVEI J,4 ;ENTRY TO GET MASTER 2314 DIRECTORY + JRST LISTF7 + +QLISTF: MOVEI J,3 ;ENTRY FOR 2314 USER DIRECTORY +LISTF7: MOVEI I,0 +LISTFE: PUSHJ P,SWTL ;ENTER HERE FOR ALL KINDS OF DIRECTORIES. + UDCSW + MOVSI TT,-NUDCH +UD1: SKIPGE UDUSR(TT) + JRST UD2 + AOBJN TT,UD1 + PUSHJ P,LSWPOP + PUSHJ P,UDELAY ;DIRECTORY NOT AVAILABLE NOW, WAIT + JRST LISTFE + +UD2: MOVEM J,DSKLST(TT) + MOVEM I,UDUSR(TT) + MOVEM U,UDUIND(TT) + PUSHJ P,LSWPOP + MOVE Q,USYSN1(U) + MOVEM Q,UDSYSN(TT) + JUMPG J,UDIF ;JUMP IF NOT UTAPE DIR. +IFE NUNITS, BUG ;HOW DID UTAPE GET HERE? +IFN NUNITS,[ + CONO PI,CLKOFF + MOVE Q,UDIRO(I) + MOVEM Q,DIRPT(TT) + CONO PI,CLKON + MOVEI J,200 + TRNE D,2 + JRST UDBIN ;IMAGE MODE UTAPE DIR + MOVEI Q,LISTF ;ASCII MODE UTAPE DIR +] +UDIF1: MOVEM Q,DIRPC(TT) + HRL A,TT + JSP Q,OPSLD1 + DIRCHN,,DIRBN + +UDIF: HLRZ Q,UDT-1(J) ;INITIAL COROUTINE PC + HRRZ T,UDT-1(J) ;PLACE TO FINISH OPENING - USUALLY UDIF1. + JRST (T) + +UQL1: HRRZM H,UUDPP(TT) ;2314 MFD (FROM UDIF) + MOVEI J,2000 + TRNE D,2 + JRST QUDBIN + JRST UDIF1 + +UQL1A: PUSHJ P,STMSET ;DISK UFD (FROM UDIF). WE CAN STILL PCLSR, + UDUSR(TT) ;ARRANGE TO GIVE BACK THE DIRECTORY CHANNEL. +UQL1B: PUSH P,TT + PUSHJ P,QUDLK + PUSHJ P,TCALL ;GET A LOW-HALF PAGE TO COPY UFD INTO. + JRST IOMQ ;GET LOW HALF PAGE + JRST UQL1W ;NOT AVAIL NOW + MOVEI T,MU23LS + DPB T,[MUR,,MEMBLT(A)] ;MARK THE PAGE AS A UFD COPY. + LSH A,10. + MOVEM A,DIRPT(TT) + MOVEM A,UUDPP(TT) + HRL A,QSNLCN(H) + HRRI T,2000(A) + BLT A,-1(T) ;COPY UFD + PUSHJ P,QUDULK + PUSHJ P,LSWDEL ;STMSET OF UDUSR. + SKIPG QSNNR(H) + BUG ;WE ALWAYS GET OUR MAN + PUSHJ P,LSWPOP ;SOS QSNNR + POP P,TT + MOVEI J,2000 + TRNE D,2 + JRST UDBIN + JRST UDIF1 + +UQL1W: PUSHJ P,QUDULK + POP P,TT + PUSHJ P,UDELAY + JRST UQL1B + +;LH INITIAL PC RH DISP ADR AT OPEN TIME +UDT: NDLF,,UDIF1 ;NON DIR DEVICE + UCL1,,UDIF1 ;CORE LINK + UQL2,,UQL1A ;2314 UFD + QMLS1,,UQL1 ;2314 MFD + ERR1,,ERR2 ;ERR DEVICE + TTYFLD,,UDIF1 ;TTY DIR + TTYF99,,UDIF1 ;COR DIR (LAST LINE OF TTY DIR) +UDTLN==.-UDT + +QUDBIN: HRRZ T,QMDRO + MOVEM T,DIRPT(TT) +UDBIN: MOVEM J,NUM(TT) ;DOESN'T USE DIRPC THIS PC + MOVEM J,ENDT(TT) + MOVEI J,444400 + HRLM J,DIRPT(TT) + HRL A,TT + JSP Q,OPSLD1 + NDATAI,,NBLKI + +UTDCLS: MOVE B,DSKLST(A) + CAIN B,3 + JRST UTDCL1 +UTDCLX: SETOM UDUSR(A) + POPJ P, + +UTDCL1: PUSH P,A + MOVE A,UUDPP(A) + LSH A,-10. + PUSHJ P,MEMR + POP P,A + JRST UTDCLX + +;UNIT MODE IOT ON DIR DEVICE COMES HERE (RETURN CHAR IN W) +DIRCH: SETOM SRN3(U) ;SAY WE WANT ONLY 1 CHARACTER. + PUSHJ P,DIRCHR + HRRZ W,I + CAIN W,^C + JRST UNIEOF + POPJ P, + +;BLOCK MODE IOT ON DIR DEVICE. +DIRB: JSP Q,WRDBT ;PUSHJ'S TO .+1 FOR EACH WORD. +DIRB1: XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE. + PUSH P,C + PUSH P,H + SETZM SRN3(U) ;SAY WE WANT A WHOLE WORD OF CHARS. + PUSHJ P,DIRCHR + POP P,H + POP P,C + LDB Q,[350700,,SRN3(U)] + CAIN Q,^C ;IF THE WORD STARTS WITH ^C, + JRST POPJ2 ;IT IS EOF; DON'T RETURN IT, UNHANG IOT. + MOVE Q,SRN3(U) + UMOVEM Q,(C) + MOVEI Q,DIRB1 ;FASTER THAN PUSHING AND POPPING Q. + POPJ P, ;RETURN INTO WRDBT + + SKIPA T,[SIOKT] +DDATAI: MOVEI T,CHRKTI ;UNIT IMAGE INPUT FROM DIRECTORY. + CAIA +DBLKI: MOVEI T,BLKT ;BLOCK IMAGE INPUT FROM DIRECTORY + MOVE E,[444400,,1] + JSP B,(T) ;TO BLKT, SIOKT, OR CHRKTI + DIRPT(A) + NUM(A) + POPJ2 ;EOF IF TRY TO GET ANOTHER BUFFER + CPOPJ ;BUFFER DISCARD ROUTINE + BUG + SKIPA + +;ERR DEVICE AND ERROR MESSAGE TABLES +; ERR DEVICE WORKS MUCH LIKE DIR DEVICE + +ERRO: MOVEI J,5 + JRST LISTF7 + +ERR2: SOJE A,ERR21 ;LAST ERRONEOUS CHANNEL + SOJE A,ERR22 ;CHANNEL SPECIFIED IN B + SOJE A,ERR23 ;STATUS WORD IN B + SOJE A,ERR24 ;.CALL ERROR ARG IN B + SETOM UDUSR(TT) + JRST OPNL11 + +ERR21: LDB B,[BCHPTR] +ERR22: ANDI B,17 + ADDI B,IOCHST(U) + SKIPA B,(B) +ERR24: MOVSS B +ERR23: MOVEM B,UUDPP(TT) + JRST UDIF1 + +CORO: PUSHJ P,FLDRCK + JRST OPNL11 + MOVEI J,7 + JRST LISTF7 + +ERR1: SKIPN I,UUDPP(A) + JRST ERR3 + LDB B,[220600,,UUDPP(A)] ;OPEN LOSS FIELD + JUMPE B,ERR1B + CAIL B,NERMES+1 + MOVEI B,NERMES+1 + MOVE TT,ERMST1-1(B) + JSP B,MESPNT +ERR1B: LDB B,[300300,,UUDPP(A)] ;IDS ERROR FIELD + JUMPE B,ERR1C + MOVE TT,ERMST2-1(B) + JSP B,MESPNT +ERR1C: LDB B,[330400,,UUDPP(A)] ;IOCERR FIELD + JUMPE B,UCL7 + CAIL B,MIOTER + CAIL B,NERM1+MIOTER + MOVEI B,NERM1+MIOTER + MOVE TT,ERMST3-MIOTER(B) + JSP B,MESPNT + JRST UCL7 + +ERR3: MOVEI TT,[ASCIZ /ISE0 +/] + JSP B,MESPNT + JRST UCL7 + +;LISP ASSUMES THAT NO "ERR" DEVICE MESSAGE WILL EVER CONTAIN +; !, #, ^, OR LOWER CASE LETTERS. PLEASE MAINTAIN THIS STATE +; GLS (GUY STEELE) + +ERMST1: [ASCIZ /NO SUCH DEVICE +/] + [ASCIZ /WRONG DIRECTION +/] + [ASCIZ /TOO MANY TRANSLATIONS +/] + [ASCIZ /FILE NOT FOUND +/] + [ASCIZ /DIRECTORY FULL +/] + [ASCIZ /DEVICE FULL +/] + [ASCIZ /DEVICE NOT READY +/] + [ASCIZ /DEVICE NOT AVAILABLE +/] + [ASCIZ /ILLEGAL FILE NAME +/] + [ASCIZ /MODE NOT AVAILABLE +/] + [ASCIZ /FILE ALREADY EXISTS +/] + [ASCIZ /BAD CHANNEL NUMBER +/] + [ASCIZ /TOO MANY ARGUMENTS (CALL) +/] + [ASCIZ /PACK NOT MOUNTED +/] + [ASCIZ /DIRECTORY NOT AVAIL +/] + [ASCIZ /NON-EXISTENT DIRECTORY +/] + [ASCIZ /LOCAL DEVICE ONLY +/] + [ASCIZ /SELF-CONTRADICTORY OPEN +/] + [ASCIZ /FILE LOCKED +/] + [ASCIZ /M.F.D. FULL +/] + [ASCIZ /DEVICE NOT ASSIGNABLE TO THIS PROCESSOR +/] + [ASCIZ /DEVICE WRITE-LOCKED +/] + [ASCIZ /LINK DEPTH EXCEEDED +/] + [ASCIZ /TOO FEW ARGUMENTS (CALL) +/] + [ASCIZ /CAN'T MODIFY JOB +/] + [ASCIZ /CAN'T GET THAT ACCESS TO PAGE +/] + [ASCIZ /MEANINGLESS ARGS +/] + [ASCIZ /WRONG TYPE DEVICE +/] + [ASCIZ /NO SUCH JOB +/] + [ASCIZ /VALID CLEAR OR STORED SET +/] + [ASCIZ /NO CORE AVAILABLE +/] + [ASCIZ /NOT TOP LEVEL +/] + [ASCIZ /OTHER END OF PIPELINE GONE OR NOT OPEN +/] + [ASCIZ /JOB GONE OR GOING AWAY +/] + [ASCIZ /ILLEGAL SYSTEM CALL NAME +/] + [ASCIZ /CHANNEL NOT OPEN +/] + [ASCIZ /INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL +/] + [ASCIZ /UNRECOGNIZABLE FILE +/] + [ASCIZ /LINK TO NON-EXISTENT FILE +/] +IFN .-ERMST1-NOPNLS,.ERR WRONG TABLE LENGTH +;ADD NEW MESSAGES HERE + +IFN 0,[ A CLASSIFICATION OF OPEN-LOSS MESSAGES + +FULL - NO CORE (MMP FULL) + DIR NOT AVAIL (DIR CHNL TABLE FULL) + DEVICE FULL + DIR FULL + MFD FULL + INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL + +NO SUCH - DEVICE, FILE, JOB, DIRECTORY, PAGE (CAN'T GET ACCESS) + ILLEGAL SYSTEM CALL NAME + +ALREADY ONE SUCH - FILE (FILE ALREADY EXISTS - RENAME) + +WRITING - CAN'T MODIFY JOB + DEVICE WRITE-LOCKED + WRONG DIRECTION + MODE NOT AVAILABLE + CAN'T GET ACCESS TO PAGE + +ARGS (THE PARAMETERS ARE RIDICULOUS) - + SELF-CONTRADICTORY OPEN COMMAND + ILLEGAL FILE NAME + BAD CHANNEL NUMBER + TOO FEW ARGS + TOO MANY ARGS + MEANINGLESS ARGS + CHANNEL NOT OPEN + +NOT AVAILABLE (IT EXISTS BUT YOU CAN'T USE IT) - + DEVICE NOT READY + DEVICE NOT AVAILABLE + NOT ASSIGNABLE TO THIS PROCESSOR + LOCAL DEVICE + PACK NOT MOUNTED + FILE LOCKED + OTHER END OF PIPELINE GONE + JOB GONE OR GOING AWAY + +DEPTH - LINK DEPTH EXCEEDED + TOO MANY TRANSLATIONS + +OTHER - NOT TOP LEVEL + VALID CLEAR OR STORED SET +] + +NERMES==.-ERMST1 + [ASCIZ /OPEN TYPE NOT DETERMINED +/] + +ERMST2: [ASCIZ /IDS ILLEGAL SCOPE MODE +/] + [ASCIZ /IDS SCOPE HUNG +/] + [ASCIZ /MORE THAN 1K SCOPE BUFFER +/] + [ASCIZ /IDS MEM PROTECT +/] + [ASCIZ /IDS ILLEGAL SCOPE OP +/] + [ASCIZ /IDS MEM PROTECT ON PDL PNTR +/] + [ASCIZ /IDS ILLEGAL PARAMETER SET +/] + +ERMST3: [ASCIZ /DEVICE HUNG OR REPORTING NON-DATA ERROR +/] + [ASCIZ /END OF FILE +/] + [ASCIZ /NON-RECOVERABLE DATA ERROR +/] + [ASCIZ /NON-EXISTENT SUB DEVICE +/] + [ASCIZ /OVER IOPOP +/] + [ASCIZ /OVER IOPUSH +/] + [ASCIZ /USR OP CHNL DOES NOT HAVE USR OPEN +/] + [ASCIZ /CHNL NOT OPEN +/] + [ASCIZ /DEVICE FULL +/] + [ASCIZ /CHNL IN ILLEGAL MODE ON IOT +/] + [ASCIZ /ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY +/] + [ASCIZ /DIRECTORY FULL +/] + [ASCIZ /DIRECTORY'S ALLOCATION EXHAUSTED +/] +;INSERT NEW MESSAGES HERE +NERM1==.-ERMST3 + [ASCIZ /IOT OR OPR TYPE NOT DETERMINED +/] + +;DIRECTORY LISTING ROUTINES + +UQL3C: SKIPA I,["*] +UQL3: MOVEI I,"- + PUSHJ P,OUTC + JRST UQL3A + +UQL2: MOVEI TT,[MNAME ASCIZ /, /] ;GENERATE USER DIRECTORY + JSP B,MESPNT + MOVE I,UUDPP(A) + MOVEI J,UDNAME(I) + JSP B,SIXTYC ;SEND DIRECTORY NAME + MOVEI TT,[ASCIZ / +FREE BLOCKS /] + JSP B,MESPNT + MOVSI E,-NQS +UQL2A: SKIPGE QACT(E) + JRST UQL3 ;UNIT NOT ENGAGED + MOVE J,QTUTO(E) + TLNE J,40000 + JRST UQL3C ;TUT FOR UNIT NOT IN + MOVEI I,"# + PUSHJ P,OUTC + MOVE TT,QPKID(E) + JSP B,GDPT ;AND # + MOVEI I,"= + PUSHJ P,OUTC + MOVE TT,QSFT(E) + JSP B,GDPT ;AND # FREE TRACKS +UQL3A: PUSHJ P,OUTCS + AOBJN E,UQL2A + JSP B,MESPCR + MOVE I,UUDPP(A) + MOVEM I,DIRPT(A) + MOVE Q,UDNAMP(I) +UQL4: CAIL Q,2000 + JRST UCL7 + HRLI I,440600+Q + HLLM I,DIRPT(A) + +UQLP: ADDI Q,2 ;MOVE PNTR TO 3RD WRD OF FILE DESC + MOVE I,@DIRPT(A) + MOVEI TT,[ASCIZ /* /] ;DELETED OR BEING WITTEN + TLNN I,UNIGFL + MOVEI TT,[ASCIZ / /] + JSP B,MESPNT + MOVE I,@DIRPT(A) + TLNE I,UNLINK + JRST UQLL1 ;LINK + LDB TT,[UNPKN+@DIRPT(A)] + JSP B,GDPT ;PRINT PACK # + LDB TT,[UNPKN+@DIRPT(A)] + CAIG TT,9 +UQLL2: PUSHJ P,OUTCS + PUSHJ P,OUTCS + SUBI Q,2 ;BACK TO FIRST WD + JSP B,SIXTYA ;SEND FIRST FILE NAME + JSP B,SIXTYB ;AND SECOND (AOSES Q) + PUSHJ P,OUTCS + AOS Q ;SET Q TO POINT TO FILE DESC PNTR + LDB E,[UNDSCP+@DIRPT(A)] ;PICK UP FILE DESC PNTR + IDIVI E,UFDBPW + ADDI E,UDDESC ;COMPUTE WORD ADDRESS + MOVE I,@DIRPT(A) ;SAVE STATUS WORD + EXCH E,Q ;MOVE INTO PNTR + MOVE TT,QBTBLI(TT) + TLO TT,Q + HLLM TT,DIRPT(A) ;SET UP DIRPT TO POINT TO FILE DESC + TLNE I,UNLINK + JRST QLL1 ;LINK + MOVEI TT,0 +UQL5: JSP B,UQL5R ;CHECK IF ABOUT TO INCREMENT OFF WORD + ILDB I,DIRPT(A) + JUMPE I,UQL5A ;STOP + CAILE I,UDTKMX + JRST UQL5B + ADD TT,I + JRST UQL5 + +UQLL1: MOVEI I,"L + PUSHJ P,OUTC + JRST UQLL2 + +QLL1: CLEARM ENDT(A) ;CNTS TO 3 FOR USER NAME AND 2 FILE NAMES +QLL3: CLEARM NUM(A) ;CHR CNTR +QLLIST: JSP B,UQL5R + ILDB I,DIRPT(A) + JUMPE I,QLL4 + CAIN I,'; + JRST QLL2 + CAIN I,': + JRST QLL5 +QLL5A: ADDI I,40 + PUSHJ P,OUTC + AOS I,NUM(A) + CAIGE I,6 + JRST QLLIST +QLL2: PUSHJ P,OUTCS + AOS I,ENDT(A) + CAIGE I,3 + JRST QLL3 +QLL4: JSP B,MESPCR + MOVEI Q,3(E) ;ADVANCE Q + JRST UQL4 + +QLL5: JSP B,UQL5R + ILDB I,DIRPT(A) + JRST QLL5A + +UQL5R: MOVE I,DIRPT(A) ;CHECK IF ABOUT TO ILDB OFF WORD + TLNE I,770000 + JRST (B) ;NO + MOVEI I,440600+Q ;YES INCREMENT Q INSTEAD + HRLM I,DIRPT(A) + AOJA Q,(B) + +UQL5B: CAIGE I,UDWPH ;PLACE HOLDER + AOJA TT,UQL5 ;SKIP AND TAKE + CAIN I,UDWPH + JRST UQL5 ;NULL + REPEAT NXLBYT,[JSP B,UQL5R + IBP DIRPT(A) +] + AOJA TT,UQL5 ;SPACE OVER 2ND HALF OF LOAD ADDRESS + +UQL5A: JSP B,GDPT ;TYPE OUT # BLOCKS + PUSHJ P,OUTCS + MOVE Q,E ;FILE POINTER + MOVEI I,"! + SKIPGE B,@DIRPT(A) ;SKIP ON NOT DUMPED + MOVEI I,40 + PUSHJ P,OUTC ;HAS NOT BEEN BACKED UP + MOVEI I,"$ + TLNN B,UNREAP ;SKIP ON DON'T-REAP + MOVEI I,40 + PUSHJ P,OUTC + MOVEI Q,1(E) + LDB E,[1200,,DIRPT(A)] + JUMPN E,[JRST 4,.] + MOVE TT,@DIRPT(A) + AOJE TT,UQL5C ;DATE NOT KNOWN + LDB TT,[UNMON+@DIRPT(A)] + JSP B,GDPT ;TYPE MONTH + MOVEI I,"/ + PUSHJ P,OUTC + LDB TT,[UNDAY+@DIRPT(A)] + JSP B,GDPT ;TYPE DAY + MOVEI I,"/ + PUSHJ P,OUTC + LDB TT,[UNYRB+@DIRPT(A)] + ADDI TT,1900. + JSP B,GDPT ;TYPE YEAR + PUSHJ P,OUTCS + HRRZ TT,@DIRPT(A) + IDIVI TT,60.*60.*2 + MOVE E,I + JSP B,G2DPT + MOVEI I,": + PUSHJ P,OUTC + MOVE TT,E + IDIVI TT,60.*2 + MOVE E,I + JSP B,G2DPT + MOVEI I,": + PUSHJ P,OUTC + MOVE TT,E + LSH TT,-1 + JSP B,G2DPT +UQL5D: JSP B,MESPCR + ADDI Q,2 ;ADVANCE Q + JRST UQL4 + +UQL5C: MOVEI I,"- + PUSHJ P,OUTC + JRST UQL5D + +;GENERATE MFD LISTING +QMLS1: CONO PI,CLKOFF + MOVE Q,QMDRO + HRLI Q,440600+Q + MOVEM Q,DIRPT(A) + MOVE Q,MDNAMP(Q) + CONO PI,CLKON +QMLS2: CAIL Q,1777 + JRST UCL7 + SKIPN @DIRPT(A) + JRST QMLS3 + JSP B,SIXTYA + JSP B,MESPCR +QMLS3: ADDI Q,LMNBLK + JRST QMLS2 + +;DIRECTORY LISTING ROUTINES FOR UTAPE + +IFN NUNITS,[ +LISTF: MOVEI Q,220600+Q + HRLM Q,DIRPT(A) + MOVEI Q,177 + MOVE TT,@DIRPT(A) + AOJE TT,LISTF1 + JSP B,SIXTYP +LISTF1: MOVEI TT,[ASCIZ / +FREE FILES /] + JSP B,MESPNT + MOVSI Q,-23. + MOVEI TT,0 +LISTF4: SKIPE @DIRPT(A) + AOJA Q,LISTF8 + AOS Q + SKIPN @DIRPT(A) + AOS TT +LISTF8: AOBJN Q,LISTF4 + JSP B,GDPT + MOVEI TT,[ASCIZ / FREE BLOCKS /] + JSP B,MESPNT + SETZB J,TT + JSP B,BLKPNT +LISTD2: JSP B,MESPCR + MOVSI Q,-23. +LISTF2: MOVEI I,440600+Q + HRLM I,DIRPT(A) + MOVE I,@DIRPT(A) + JUMPE I,LISTF5 +LISTF6: PUSHJ P,OUTCS + JSP B,SIXTYA + JSP B,SIXTYB + PUSHJ P,OUTCS + MOVEI J,1(Q) + JSP B,BLKPNN +LISTD4: JSP B,MESPCR +LISTF3: AOBJN Q,LISTF2 +];END IFN NUNITS + +UCL7: MOVEI I,14 ;END DIR WITH FORMFEED AND EOF CHARS + PUSHJ P,OUTC + HRROI I,EOFCH + JRST .-2 + +IFN NUNITS, LISTF5: AOJA Q,LISTF3 + +; DIRECTORY LISTING ROUTINES FOR MISC. DEVICES + CORE LINK + +NDLF: MOVEI TT,[ASCIZ / +NON-DIRECTORY DEVICE/] + JSP B,MESPNT + JRST UCL7 + +;DIRECTORY OF CORE LINK DEVICE +UCL1: MOVSI Q,-NCLCH +UCL6: SKIPN CLSYN(Q) + JRST UCL5A + MOVEI J,CLSYN(Q) + JSP B,SIXTYC + MOVEI J,CLN1(Q) + JSP B,SIXTYC + MOVEI J,CLN2(Q) + JSP B,SIXTYC + HLRE B,CLUSR(Q) + AOJE B,UCL2 + MOVEI J,UNAME-1(B) + MOVEM B,NUM(A) + JSP B,SIXTYC + MOVE B,NUM(A) + MOVEI J,JNAME-1(B) + JSP B,SIXTYC +UCL3: MOVEI TT,[ASCIZ /->/] + JSP B,MESPNT + HRRE B,CLUSR(Q) + AOJE B,UCL4 + MOVEI J,UNAME-1(B) + MOVEM B,NUM(A) + JSP B,SIXTYC + MOVE B,NUM(A) + MOVEI J,JNAME-1(B) + JSP B,SIXTYC +UCL5: JSP B,MESPCR +UCL5A: AOBJN Q,UCL6 + JRST UCL7 + +UCL4: MOVEI B,UCL5 + JRST .+2 +UCL2: MOVEI B,UCL3 + MOVEI J,[SIXBIT /CLOSED/] +SIXTYC: HRLI J,440600 + MOVEM J,DIRPT(A) + PUSHJ P,OUTCS + JRST SIXTYP + +; DIRECTORY LISTING ROUTINES FOR TTY + +TTYFLD: MOVEI TT,[ASCIZ / +TTY UNAME JNAME CORE TOTAL IDX +/] + JSP B,MESPNT + MOVSI Q,-NCT +TTYF1: HRRE E,TTYSTS(Q) + AOJE E,TTYF5 ;JUMP IF NOT IN USE + MOVE E,TTYSTS(Q) + MOVEI I,"T ;TTY + TLNN E,%TSCNS + MOVEI I,"D ;"DEVICE" + PUSHJ P,OUTC + HRRZ TT,Q + JSP B,G2OPT + HRRZS E +TTYF11: MOVEI J,UNAME(E) + JSP B,SIXTYC + MOVEI J,JNAME(E) + JSP B,SIXTYC + PUSHJ P,OUTCS + MOVE TT,NMPGS(E) + JSP B,G4SDPT + PUSHJ P,OUTCS + PUSHJ P,OUTCS + MOVEM E,DIRPT(A) + MOVE E,UTMPTR(E) + SETZB B,TT +TTYF3: SKIPE UNAME(B) + CAME E,UTMPTR(B) + JRST TTYF4 + ADD TT,NMPGS(B) +TTYF4: ADDI B,LUBLK + CAMGE B,USRHI + JRST TTYF3 + JSP B,G4SDPT + PUSHJ P,OUTCS + PUSHJ P,OUTCS + HRRZ TT,DIRPT(A) + SKIPL SUPPRO(TT) + JRST [ HRRZ TT,SUPPRO(TT) ? JRST .-1 ] + IDIVI TT,LUBLK + JSP B,GOPT + JSP B,MESPCR +TTYF5: AOBJN Q,TTYF1 +TTYF99: MOVEI TT,[ASCIZ /FREE CORE /] + JSP B,MESPNT + MOVE TT,MEMFR + SUB TT,NCBCOM + JSP B,GDPT + MOVEI TT,[ASCIZ / OUT /] + JSP B,MESPNT + MOVE TT,NPGSWO + JSP B,GDPT + JSP B,MESPCR + JRST UCL7 + +SIXTYB: AOS Q +SIXTYA: PUSHJ P,OUTCS + MOVEI I,440600+Q + HRLM I,DIRPT(A) + +SIXTYP: ILDB I,DIRPT(A) + ADDI I,40 + PUSHJ P,OUTC + MOVE I,DIRPT(A) + TLNE I,770000 + JRST SIXTYP + JRST (B) + +MESP3S: SKIPA TT,[[ASCIZ / /]] +MESPCR: MOVEI TT,[ASCIZ / +/] +MESPNT: HRLI TT,440700 + MOVEM TT,NUM(A) + ILDB I,NUM(A) + JUMPE I,(B) + PUSHJ P,OUTC + JRST .-3 + +OUTCS: MOVEI I,40 +OUTC: SKIPL TT,SRN3(U) ;IF WANT 1 CHAR, RETURN WITH IT, SAVING ACS. + JRST OUTC1 ;IF WANT WHOLE WORD, SEE IF WORD IS FULL. +OUTC2: MOVEM E,SAVE(A) + MOVEM Q,SAVQ(A) + MOVEM B,SAVB(A) + POP P,DIRPC(A) + POPJ P, + +OUTC1: LSH TT,6 + ADDI TT,(I) ;MERGE THIS CHAR (IN I) INTO WORD BEING ACCUMULATED. + LSH TT,1 + MOVEM TT,SRN3(U) + TLNE TT,774000 ;IF THE WORD IS FULL, RETURN TO DIRB. + JRST OUTC2 + POPJ P, ;ELSE POPJ FROM OUTC, TO GET MORE CHARS. + +;NUMERIC PRINTOUT ROUTINES FOR FILE DIRECTORIES. +;ALL CALLED WITH JSP B,. ALL TAKE ARG IN TT. + +;PRINT NUMBER IN TT IN DECIMAL, RIGHT-ADJUSTED IN FOUR COLUMNS. +G4SDPT: CAIL TT,1000. + JRST GDPT ;IF IT NEEDS 4 DIGITS, JUST PRINT IT. + MOVEM TT,NUM(A) + CAIL TT,100. ;ELSE FIGURE OUT HOW MANY LEADING SPACES ARE NEEDED + JRST G4SDP1 + CAIL TT,10. + JRST G4SDP2 + PUSHJ P,OUTCS ;AND PRINT THAT MANY. +G4SDP2: PUSHJ P,OUTCS +G4SDP1: PUSHJ P,OUTCS + MOVE TT,NUM(A) + JRST GDPT + +;PRINT CONTENTS OF TT AS TWO OCTAL DIGITS. +G2OPT: IDIVI TT,8 + JRST G2DPT2 + +;PRINT CONTENTS OF TT AS THREE DECIMAL DIGITS. +G3DPT: IDIVI TT,100. + MOVEM I,NUM(A) + MOVEI I,"0(TT) + PUSHJ P,OUTC + MOVE TT,NUM(A) +G2DPT: IDIVI TT,10. +G2DPT2: MOVEM I,NUM(A) + MOVEI I,"0(TT) + PUSHJ P,OUTC + MOVE I,NUM(A) + ADDI I,"0 + PUSHJ P,OUTC + JRST (B) + +;PRINT ARG IN TT IN DECIMAL USING AS MANY DIGITS AS IT NEEDS. +GDPT: HRLI B,10. + JRST GDPT0 + +;PRINT ARG IN TT IN OCTAL USING AS MANY DIGITS AS NECESSARY. +GOPT: HRLI B,8 +GDPT0: MOVSS B + SETZM ENDT(A) + MOVEM TT,NUM(A) +GDPT1: PUSH P,Q + MOVE Q,TT + IDIVI TT,(B) + CAME TT,ENDT(A) + JRST .-3 + MOVEM Q,ENDT(A) + POP P,Q + ADDI I,"0 + PUSHJ P,OUTC + MOVE TT,NUM(A) + CAME TT,ENDT(A) + JRST GDPT1 + MOVSS B + JRST (B) + +;ROUTINE TO CALL A DIRECTORY COROUTINE +DIRCHR: MOVE E,SAVE(A) + MOVE B,SAVB(A) + MOVE Q,SAVQ(A) + JRST @DIRPC(A) + +IFN NUNITS,[ +BLKPNA: MOVEI J,1(I) + LSH J,-1 + JRST BLKPNT+1 + +BLKPNN: LSH J,-1 +BLKPNT: MOVEI TT,0 + MOVEI I,56 +BLKPN2: MOVEI E,440500+I + HRLM E,DIRPT(A) +BLKPN1: ILDB E,DIRPT(A) + CAIN E,37 + JRST BLKPN3 + CAMN E,J + AOS TT + HLRZ E,DIRPT(A) + TRNE E,760000 + JRST BLKPN1 + AOJA I,BLKPN2 +BLKPN3: JUMPE J,GDPT + MOVSI I,-23. +BLKPN4: MOVE E,@DIRPT(A) + AOS I + CAMN J,@DIRPT(A) + JUMPE E,BLKPNA + AOBJN I,BLKPN4 + JRST GDPT +];NUNITS +EBLK + +UDUSR: REPEAT NUDCH,-1 ;-1 => FREE, ELSE UTAPE # IF UTAPE DIR, ELSE 0. +UDUIND: BLOCK NUDCH ;IF DIR CHANNEL IN USE, HOLDS JOB # OF JOB USING IT. + +IRPS X,,DIRPC:DIRPT:NUM:ENDT:SAVB:SAVQ:UDSYSN:UUDPP:SAVE: +X: REPEAT NUDCH,-1 + TERMIN +UDCSW: -1 + 0 + +DSKLST: BLOCK NUDCH ;0 LISTING UTAPE 1 NON-DIR DEVICE + ;2 CORE LINK 3 2311 +;NO BBLK SINCE VARIABLES ON NEXT PAGE + +SUBTTL UTC LEVEL INTERRUPT + +;NO EBLK SINCE VARIABLES ON PREVIOUS PAGE + +UTCPDP: -LUTCP,,UTCP-1 ;UTC-LEVEL PDL +UTCP: BLOCK LUTCP +UTACS: BLOCK 20 ;UTC-LEVEL AC SAVE + +IFE KS10P,[ ; On the KS10 we can take advantage of the Unibus interrupt + ; vectoring scheme to dispatch quicker, so this code was + ; reorganized somewhat. +UTCBRK: 0 +BBLK +IFN KL10P,[ + CONSO PI,1_<7-UTCCHN> + JRST 4,. ;HARDWARE BUG ALLEGEDLY FIXED +] + MOVEM U,UTACS+U + MOVEI U,UTACS + BLT U,UTACS+U-1 + MOVE P,UTCPDP +IFN NUNITS,[ +IFE NEWDTP,[ + CONSZ DC,6 + JRST PIPOS ;HAS CHNL >1 +PIPX: +] +IFN NEWDTP,[ + SKIPGE CUINT + JRST UTCB0 +] +];IFN NUNITS +IFN IMPP,[ ; See if it's an IMP interface interrupt +IFN KAIMP,[ + CONI IMP,TT + LDB A,[000300,,TT] + CAIE A,NETCHN + JRST UTCB2 + TRNE TT,IMPLW+IMPHER+IMPERR+IMPOD+IMPID +] +IFN DMIMP,[ + CONI FI,TT + TRNN TT,70 ;CHECK PIA + JRST UTCB2 ;DO NOT PROCESS IF NO PIA + TRNE TT,FILW+FIDOWN+FIWASD+FIOD+FIID +] + JRST IMPINT +UTCB2:] ;IFN IMPP + +IFN DC10P,[ + CONI DC0,TT + TRNE TT,DPIRQC + JRST QINT +] +IFE KA10P, CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS +IFN T300P,[ + SKIPE DSCDON + JRST T3INT +];T300P +IFN RP10P,[ + CONI DPC,TT + TRNE TT,7 + TRNN TT,10 ;IF BIT IS ON IT IS INTERRUPTING - LET QINT HAVE IT + SKIPGE QGTBZY + JRST QINT +] +IFN RH10P,[ + CONI DSK,TT + TRNN TT,%HIDON+%HIATN ;INTERRUPTING HARDWARILY + SKIPGE QGTBZY ;INTERRUPTING SOFTWARILY + JRST QINT +] +IFN TM10P,[ + CONI MTC,A + CONI MTS,C + LDB TT,[030300,,A] + CAIE TT,MTCCHN + JRST UTCBK2 + TRNN C,100 ;IF NOT JOB DONE + TRZ C,30000 ; THEN DON'T BELIEVE PAR ERR OF EOF + TRNN A,400 ;IF NEXT UNIT NOT ENABLED + TRZ C,2 ;THEN TURN OFF NEXT UNIT FLAG + TRNE C,440302 ; UNIT HUNG, ILLEGAL, BAD TAPE (UGH), LOAD NEXT UNIT, JOB DONE + JRST MGHBRK +UTCBK2: SKIPN MGTBZY ; SOFT WARE CALL + JRST MGSBRK +] +IFN NUNITS, JRST UTCB0 + +POPRET: +IFN NUNITS,[ + MOVE A,TIME + MOVEM A,LUTOTM +] +DSKEX: +IMPEX: +MGEX: MOVSI U,UTACS + BLT U,U + JRST 12,@UTCBRK + +] ;IFE KS10P + +IFN KS10P,[ + +UTCBRK: 0 ; Still EBLK'ed from previous page... +BBLK + MOVEM U,UTACS+U + MOVEI U,UTACS + BLT U,UTACS+U-1 + MOVE P,UTCPDP + CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS +IFN KSIMP\SSIMP,[ + AOSN IMPBZY ;-1 if IMP wants a jump-start + PUSHJ P,IMPINT +] +IFN RH11P,[ + SKIPGE QGTBZY + JRST QINT +] ;RH11P +IFN TM03S,[ + SKIPN MGTBZY + JRST MGSBRK +] +DEEX: +IMPEX: +MGEX: +DSKEX: MOVSI U,UTACS + BLT U,U + JRST 12,@UTCBRK + +;;; Interrupt routines that are directly dispatched to by the KS10/Unibus +;;; interrupt kludge should do JSR UTCSAV as their very first instruction. +;;; The word before the JSR is expected to contain the interrupted PC. +;;; They should then exit through DSKEX just like everybody else. + +EBLK +UTCSAV: 0 +BBLK + MOVEM U,UTACS+U + MOVEI U,UTACS + BLT U,UTACS+U-1 + MOVE P,UTCPDP + MOVE U,UTCSAV + MOVE TT,-2(U) + MOVEM TT,UTCBRK + JRST (U) + +] ;KS10P + +$INSRT SYSJOB ;SYSTEM JOB AND RELATED STUFF + + +SUBTTL DCHNTB AND DCHNTC + +EBLK +CHSPUR: BLOCK 8 ;NUM OF SPURIOUS INTS PER CH (ZERO = DCHK) +BBLK + +IFE KS10P,[ ; KS10 doesn't even pretend to have devices. + +;***** DCHNTB ***** +;4.9 = KNOWN DEVICE +;4.8 = HAS PIA 2 +;4.7-4.4 PIA 2 SHIFT +;4.3-4.1 PIA 2 ACTIVE VALUE +;3.9 = PIA 2 MAY BE ZERO +;3.8 = HAS PIA 1 +;3.7-3.4 PIA 1 SHIFT +;3.3-3.1 PIA 1 ACTIVE VALUE +;2.9 = PIA 1 MAY BE ZERO +;2.8 = ALLOW USER DATAI, BLKI +;2.7 DATAO, BLKO +;2.6 CONI, CONSO, CONSZ +;2.5 CONO +;2.4 SPECIAL KL10 DEVICE, BLKI/BLKO ARE DATAI/DATAO TO A SECOND DEVICE REGISTER +;1.6-1.1=N, IF NON ZERO: IGNORE DEV UNLESS CONI BIT N-1 IS ON + ;(IF DSDEV PRESENT) + +;***** DCHNTC ***** +;4.9 = SUSPICIOUS DEVICE +;4.8 = FOUND CLOBBERED +;4.7 = SUSPECTED OF CAUSING SPURIOUS INTS +;4.6-4.4 = CHANNEL CAUSING INTS ON +;3.9-3.1 = SUSPICION COUNT +;2.9-1.1 = CONI + +DCHNTB: +IFE KL10P,[ + 400200+APRCHN,,240000 ;0 APR + SETZ ;4 PI +] +IFN KL10P,[ + 400200+APRCHN,,250000 ;0 APR (ALLOW DATAI, "BLKI", CONI) + SETZ 010000 ;4 PI (ALLOW NOTHING) +] + +DEFINE DCHENT D,W +LOC DCHNTB+D_-2 + W + TERMIN + +IFN KL10P,[ + DCHENT PAG,SETZ 240000 ;ALLOW DATAI, CONI, BUT NOT "BLKI" + DCHENT CCA,SETZ ;ALLOW NOTHING +;XCTR of some of the instructions for these devices fails to relocate +;the address to user space, due to bugs in the hardware. Flush 'em. +; DCHENT TIM,SETZ 250000 ;ALLOW DATAI, "BLKI", CONI +; DCHENT MTR,[400201,,250000] ;INTERVAL TIMER PIA=1. ALLOW DI,BI,CI + DCHENT TIM,SETZ ;20 ALLOW NOTHING + DCHENT MTR,SETZ ;24 ALLOW NOTHING + DCHENT 30,SETZ ;30 RESERVED +] +IFN DSDP, DCHENT DSDEV,[REPEAT 2,400200+DSDCHN,,440000] ;20,24 +IFN DL10P,[ DCHENT DLB,SETZ 240000 ;60 DL10 + DCHENT DLC,[400200+TTYCHN,,240000] ;64 DL10 +] +IFN STKP, DCHENT STK,[400200+LPTCHN,,440000] ;70 STK +IFN PTRP, DCHENT PTP,[400200+PCHCHN,,440000] ;100 PTP +IFN PTRP, DCHENT PTR,[400200+PTRCHN,,440000] ;104 PTR +IFN NOTYS, DCHENT TTY,[400200+TTYCHN,,40000] ;120 TTY +IFN OLPTP, DCHENT OLPT,[400200+LPTCHN,,440000] ;124 OLPT +IFN 340P, DCHENT DIS,[630600+DISCHN+SDCHN_9,,440001] ;130 DIS +IFN E.SP, DCHENT DIS,[400200+DISCHN,,440000] ;130 E&S +IFN KL10P, DCHENT DTE,[400200+IFE PDCLKP,[APRCHN].ELSE [TTYCHN],,240000] ;200 DTE20 +IFN RP10P, DCHENT DPC,[400200+DSKCHN,,440000] ;250 DPC +IFN RH10P, DCHENT DSK,[400200+DSKCHN,,040000] ;270 RH10 +IFN NUNITS,[ +IFE NEWDTP,[ + DCHENT DC,[400000,,440000] ;200 DC + DCHENT UTC,[400200+UTCCHN,,440000] ;210 UTC + DCHENT UTS,[SETZ 40000] ;214 UTS +] +IFN NEWDTP,[ + DCHENT DTC,[630600+UTCCHN+DCCHN_9.,,440000] ;320 + DCHENT DTS,[SETZ 40000] ;324 +] +] ;END OF IFN NUNITS +IFN TM10P,[ + DCHENT MTC,[400230+MTCCHN,,440001] ;340 MTC + DCHENT MTS,[SETZ 40001] ;344 MTS +] +IFN MTYP, DCHENT MTY,[400200+TTYCHN,,40000] ;400 MORTON BOX + ;420 SPACEWAR CONSOLES +IFN DMIMP, DCHENT FI,[400230+NETCHN,,400000] ;424 DM IMP HARDWARE +IFN NDAP, DCHENT 454,[400200,,760000] ;454 D/A +IFN KAIMP, DCHENT IMP,[400000,,400001] ;460 AI-KA/ML-KA/MC-KL IMP + ; HARDWARE THIS SAYS IMP + ; HAS NO PIA BECAUSE IT + ; CHANGES +IFN NLPTP, DCHENT NLPT,[400200+LPTCHN,,440000] ;464 NEW LPT +IFN CH10P, DCHENT CHX,[400200+CHXCHN,,040000] ;470 CHAOSNET +IFE KL10P, DCHENT 500,[400000,,240000] ;500 ML-KA, DM CALENDAR; AI-KA R CLK +IFN KL10P&PDCLKP,DCHENT 500,[400200+APRCHN,,240000] ;500 MC-KL F CLK +IFN ARMP, DCHENT TIPDEV,[400200+TIPBCH,,440000] ;504 ARM TIP BREAK +IFE MCOND AIKA, DCHENT 510,[400000,,360000] ;510 ANOTHER D/A?? + ;DOES ANYONE KNOW WHAT DEVICE 510 IS?? +IFN RBTCP, DCHENT RBTCON,[400200+TABCHN,,440001] ;514 ROBOT CONSOLE +IFN ARMP, DCHENT 564,[400200,,440000] ;564 ARM TACTILE SENSE +IFN OMXP, DCHENT OMPX,[400200+OMPCHN,,440001] ;570 OMX +IFN IMXP, DCHENT MPX,[SETZ 40001] ;574 IMX +;Comment this out since the AI-KA one is no longer on the bus +;IFN TK10P, DCHENT NTY,[400200+TTYCHN,,40000] ;600 NTY +IFN NTYP, DCHENT NTY,[400200+NTYCHN,,40000] ; NTY FOR 11 KLUDGE +IFN DPKPP, DCHENT DPK,[400200+TTYCHN,,40000] ;604 DATAPOINT KLUDGE +IFN DC10P,[ + DCHENT DC0,[400200+DSKCHN,,40000] ;610 DC0 + DCHENT DC1,[400000,,] ;614 DC1 +] +IFN VIDP, DCHENT NVDX,[REPEAT 4,400200+NVDCHN,,440001] ;620-634 BAT +IFN PLTP, DCHENT PLT,[400200+PLTCHN,,440000] ;654 PLT + DCHENT 704,[400000,,440000] ;704 ??? +IFN HCLKP,[ + DCHENT CLK1,[400200,,240000] ;710 CLK1 + DCHENT CLK2,[SETZ 40000] ;714 CLK2 +] +LOC DCHNTB+127. +EBLK +DCHNTC: BLOCK 128. +DCACS: BLOCK 20 ;SAVE ACS +CCSDEV: 0 ;+ => SOME SUSPICIOUS DEVICES +BBLK + +DCHK: 0 ;TO CALL FROM DDT + MOVEM 17,DCACS+17 + MOVEI 17,DCACS + BLT 17,DCACS+16 + MOVEI J,0 + JSP E,SPUR + SKIPN W + AOS DCHK + MOVEI 17,DCACS + BLT 17,17 + JRST @DCHK + +;CHECK FOR CLOBBERED DEVS, CALL WITH JSP E, +CHECK: JSP H,DCSTUP +CHECK1: SKIPL TT,DCHNTB(I) + JRST CHECK4 ;UNKNOWN DEVICE +IFN DSDP,[ + TRNN TT,77 + JRST CHECK2 + ANDI TT,77 + JSP H,DCCONI + LSH B,-1(TT) + JUMPGE B,CHECK4 + MOVE TT,DCHNTB(I) +] +CHECK2: JSP H,DCCONI + TLNN TT,200 ;SKIP IF PI TO TEST + JRST CHECK4 + LDB T,[250400,,TT] ;GET SKIP + MOVEI Q,7 + LSH Q,(T) + AND B,Q + LDB Q,[220300,,TT] ;GET CHANNEL + LSH Q,(T) + CAME B,Q + JRST CHECK5 +CHECK3: LSH TT,-9 ;SHIFT TO PIA2 + JRST CHECK2 + +CHECK5: JUMPN B,CHECKL ;JUMP IF NONZERO AND WRONG + TRNE TT,400000 ;SKIP IF CAN NOT BE ZERO + JRST CHECK3 ;ZERO OK + JRST CHECKL + +CHECK4: ADD A,[400,,] ;INCREMENT DEVICE CODE + AOBJN I,CHECK1 +SPURCX: SKIPE C + BUG PAUSE,[BITS ],OCT,C,[MAY BE STUCK ON IN I/O BUS] + MOVSI T,SCLCK5 + SKIPE W ;SKIP IF NO TROUBLE DETECTED + IORM T,SUPCOR + JRST (E) + +DCSTUP: MOVE A,[CONI B] ;SET UP + MOVEI W,0 + MOVNI C,1 + MOVSI I,-128. + JRST (H) + +DCCONI: XCT A + AND C,B + SKIPL DCHNTC(I) ;SKIP IF DEVICE ALREADY SUSPICIOUS,SAVES FIRST SUSPICIOUS + HRRM B,DCHNTC(I) ;STORE AWAY CONI + JRST (H) + +CHECKL: JSP H,DCSAOS + MOVSI T,600000 ;CLOB + IORM T,DCHNTC(I) + JRST CHECK3 + +DCSAOS: MOVE D,A ;MAKE A CONO + TDZ D,[40,,-1] + SKIPL T,DCHNTB(I) ;SKIP IF KNOWN DEV + JRST DCSAS2 ;JUST RESET UNKNOWN TO ZERO + TLNE T,200000 ;SKIP IF NO PIA2 + TLNE T,400 ;SKIP IF PIA2 CAN NOT BE ZERO + JRST DCSAS1 + LDB TT,[330300,,T] ;GET PIA2 + LDB T,[360400,,T] ;GET PIA2 SHIFT + LSH TT,(T) + IOR D,TT ;ADD CORRECT CANNEL TO CONO + MOVE T,DCHNTB(I) ;SKIP IF NO PIA1 +DCSAS1: TLNE T,200 ;SKIP IF PIA1 CANNOT BE ZERO + TRNE T,400000 + JRST DCSAS2 + LDB TT,[220300,,T] ;GET P1A 1 + LDB T,[250400,,T] ;GET PIA 1 SHIFT + LSH TT,(T) ;OR IN PIA 1 + IOR D,TT ;ZAP +DCSAS2: XCT D + HLRZ T,DCHNTC(I) + TLNN T,300000 + AOS W ;THIS MAY BE THE CAUSE OF OUR TROUBLES + ANDI T,777 + AOS T + AOS CCSDEV + CAILE T,777 + SOJA T,[JRST 4,.+1] ;LOSEY LOSEY + DPB T,[221100,,DCHNTC(I)] + JRST (H) + +;CHANNEL IN J SPURIOUS INTERRUPT ON, CALL WITH JSP E, +SPUR: SKIPL J + CAIL J,10 + JRST 4,SPUR1 + AOS U,CHSPUR(J) +SPUR1: MOVE U,E + JSP E,CHECK + MOVE E,U + JSP H,DCSTUP +SPUR2: SKIPGE TT,DCHNTB(I) + JRST SPUR4 + JSP H,DCCONI + JUMPGE B,SPUR4 + JSP H,DCSAOS + MOVSI T,500000 + IORM T,DCHNTC(I) + DPB J,[360300,,DCHNTC(I)] +SPUR4: ADD A,[400,,] + AOBJN I,SPUR2 + JRST SPURCX + +] ;IFE KS10P + +IFN KS10P,[ + +SUBTTL KS10 UNIBUS + +DEFINE UBINT VEC,-REST +.VEC.== +IFN .VEC.&3, .ERR Bogus interrupt vector: VEC +.VEC.==.VEC./4 +IFL .VEC.-.MIN., .MIN.==.VEC. +IFG .VEC.-.MAX., .MAX.==.VEC. +IF2,[ +LOC .BAS.+.VEC. + REST +];IF2 +TERMIN + +NUBIDV==0 + +DEFINE UBIDV VEC +.VEC.== +CONC [UB]\NUBIDV,NM==:<.UBA.,,.VEC.> +CONC [UBINT .VEC., JSR UB]\NUBIDV,BK +NUBIDV==NUBIDV+1 +TERMIN + +;;; +;;; Interrupt table for Unibus Q. +;;; +UBAQIT: +.UBA.==UBAQ +.MIN.==777777 +.MAX.==0 +IF2, .BAS.==UBAQIB + +UBINT PHVEC, JSR DSKBRK ; RH11 FOR DISK + +UBAQIB==:UBAQIT-.MIN. +LOC UBAQIB+.MAX.+1 + +;;; +;;; Interrupt table for Unibus I. +;;; +UBAIIT: +.UBA.==UBAI +.MIN.==777777 +.MAX.==0 +IF2, .BAS.==UBAIIB + +UBINT 120, JSR DEBRK ; DEUNA/DELUA +IFE TM03S, UBIDV 224 ; Tape +UBIDV 300 ; NI1010 In +UBIDV 304 ; NI1010 Out +IFL DZ11NB-4,[ +REPEAT 4-DZ11NB,[ +UBIDV 340+<10*> ; DZ In +UBIDV 344+<10*> ; DZ Out +]] + +IFN TM03S,[ +UBINT %TMVEC, JSR MGHBRK ;RH11 FOR TAPE +] + +REPEAT DZ11NB,[ +UBINT 340+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,RB ; DZ receive +UBINT 344+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,XB ; DZ transmit +];REPEAT DZ11NB + +IFN KSIMP\SSIMP,[ +UBINT %LHVEC, JSR IMPIBK ;IMP Input side break +UBINT %LHVEC+4, JSR IMPOBK ;IMP output side break +] + +IFN CH11P,[ +UBINT 270, JSR CHXBKH ; Usual Chaosnet vector +UBINT 230, JSR CHXBKH ; Except some interrupt here instead +];CH11P + +UBAIIB==:UBAIIT-.MIN. +LOC UBAIIB+.MAX.+1 + +;;; Assignment of pages in Unibus pager for DMA devices. +;;; All of the Q UBA is statically assigned. The lower half of the I +;;; UBA is statically assigned, while slots in the upper half of the I UBA +;;; are assigned dynamically by the UBAASL routine and freed by the +;;; UBAFSL routine below. +;;; +;;; Note that static pages are 2000 PDP-10 words long (ITS sized) rather +;;; than 1000 (DEC sized). Each page here thus occupies -two- locations in +;;; the Unibus pager. There are 32. such pages on the Q Unibus and 16. +;;; such pages on the I unibus. +;;; +;;; Slots handed out by UBAASL are good for mapping 1000 PDP-10 words +;;; (one DEC page, and coincidentally the size of a network buffer). +;;; The number obtained from UBAASL is a direct index into the UBA +;;; paging RAM, and will range from 32. to 63. +;;; +;;; This two different page size thing is all a mess and I should fix it +;;; sometime. +;;; +;;; Unibus Q: +QUBPG==:5 ; Chosen at random. + +;;; Unibus I: + +;;; Static pages +IFN TM03S,[ +IUTPG==:5 ;Magtape IO page. well, 5 worked last time +] + +IFN KSIMP\SSIMP,[ +IUIMPG==:6 ;IMP Data transfer page +] + +;;; Dynamic pages + +EBLK +UBAIFS: 777777777760 ;Slot map, bit on if free +BBLK + +; Allocate a UBA I slot +; Return +1, A/ slot index + +UBAASL: PUSH P,B + CONO PI,PIOFF + MOVE A,UBAIFS + JFFO A,UBASL1 + CONO PI,PION + POP P,B ;Clean up for no good reason + BUG HALT,[Out of UBA slots] + +UBASL1: MOVNS B + MOVSI A,400000 + LSH A,B ;A/ bit to snarf + ANDCAM A,UBAIFS + CONO PI,PION + MOVN A,B + ADDI A,32. ;First dynamic slot + POP P,B + POPJ P, + +; Deallocate the UBA slot in A +; A/ UBA index to free. Bashes A,TT +UBAFSL: CAIL A,32. + CAIL A,64. + BUG HALT,[Bad UBA index],OCT,A ;Paranoid for now + MOVEI A,-32.(A) + MOVNS A + MOVSI TT,400000 + LSH TT,A + IORM TT,UBAIFS + POPJ P, + +SUBTTL UBI DEVICE + +UBIDVS:: +REPEAT NUBIDV,[ +EBLK + 0 ; Bit in -7(I) + -1 ; User or -1 in -6(I) + 0 ; Count in -5(I) + 0 ; Saved I in -4(I) +CONC UB,\.RPCNT,BK: + 0 +BBLK + MOVEM I,.-2 + JSP I,UBIBRK +CONC UB,\.RPCNT,DV: + JRST 12,@ + CONC UB,\.RPCNT,NM ; Name in 1(I) +IFE .RPCNT, LUBIDV==:.-UBIDVS +];REPEAT NUBIDV + +UBINAM==:1 +UBISVI==:-4 +UBICNT==:-5 +UBIUSR==:-6 +UBIBIT==:-7 + +UBIBRK: AOS UBICNT(I) + EXCH U,UBIUSR(I) + JUMPL U,UBIBK9 + EXCH T,UBIBIT(I) + TDNE T,MSKST2(U) + IORM T,IFPIR(U) + EXCH T,UBIBIT(I) +UBIBK9: EXCH U,UBIUSR(I) + HRLI I,UBISVI(I) + JRA I,(I) + +EBLK +UBISW: -1 ? 0 +BBLK + +; .OPEN +UBIO: MOVEI T,NUBIDV + SKIPA I,[UB0DV] +UBIO1: MOVEI I,LUBIDV(I) + CAME A,UBINAM(I) + SOJG T,UBIO1 + JUMPLE T,OPNL4 ; FILE NOT FOUND + PUSHJ P,SWTL + UBISW + SKIPL UBIUSR(I) + JRST OPNL23 ; FILE LOCKED + MOVEI T,(R) + SUBI T,IOCHNM(U) + MOVE T,CHNBIT(T) + MOVEM T,UBIBIT(I) + HRRZM U,UBIUSR(I) + HRLZI T,(I) + HRRI T,DNUBI + MOVEM T,(R) + JRST LSWPJ1 + +; .IOPUSH/.IOPOP +UBIIOP: HLRZ A,(R) + JUMPE I,UBIOP7 + SUBI R,IOCHNM(U) + SKIPA R,CHNBIT(R) +UBIOP7: SETZI R, + MOVEM R,UBIBIT(A) + POPJ P, + +; .CALL WHYINT +UBIWHY: MOVE B,UBICNT(A) + MOVEI A,%WYUBI + JRST POPJ1 + +; .CALL RFNAME +UBIRCH: MOVE B,UBINAM(A) + POPJ P, + +; .CLOSE +UBICL: SETOM UBIUSR(A) + POPJ P, + +] ;KS10P + +SUBTTL OVERHEAD METERING ROUTINE + +IFN KL10P,[ + +EBLK +;TABLE OF OVERHEAD REGIONS. ENTRY IS SIXBITNAME,,PC ? COUNT + 0 ;COUNTS STUFF BEFORE FIRST OVHMTR MACRO +OVHTBL: OVHTAB + 'USR,,-1 + 0 ;COUNTS USER-MODE PC'S +LOVHTB==.-OVHTBL + +;COME HERE ON PI CHANNEL 1 EVERY 39 MILLISECONDS +OVHSVA: 0 +OVHSVB: 0 +OVHBRK: 0 +BBLK + CONO TIM,060000+3900. ;CLEAR DONE + EXCH T,OVHBRK ;GET PC INTERRUPTED OUT OF + TLNE T,%PSUSR ;ONLY METER IF EXEC MODE + JRST OVHBRX + MOVEM A,OVHSVA + MOVEM B,OVHSVB + MOVSI A,-LOVHTB +OVHBR1: HRRZ B,OVHTBL(A) + AOBJN A,.+1 ;2-WORD ENTRIES + CAIG B,(T) ;SKIP IF PC LIES IN PREVIOUS REGION + AOBJN A,OVHBR1 + SKIPGE A ;IN CASE T = 777777 + AOS OVHTBL-2(A) ;AOS PREVIOUS REGION'S COUNT + MOVE B,OVHSVB + SKIPA A,OVHSVA +OVHBRX: AOS OVHTBL+LOVHTB-1 ;AOS COUNT OF USER-MODE PC's + EXCH T,OVHBRK + JRST 12,@OVHBRK +];KL10P + +IFN KS10P,[ +RDPCST=DATAI 14, ;INSTRUCTIONS FOR PC SAMPLING TABLE +WRPCST=DATAO 14, + +;TABLE OF OVERHEAD REGIONS. ENTRY IS PC,,SIXBITNAME +OVHTB1: 0,,'LOW ;LOWER FENCE + OVHTAB + 377777,,'USR ;UPPER FENCE +LOVHTB==.-OVHTB1 +REPEAT <1_<36.-<.LZ >>>-LOVHTB, 377777,,-1 ;PAD TO POWER OF TWO SIZE + +EBLK + +OVHTB2: BLOCK LOVHTB ;CORRESPONDING COUNTS (LAST IS FOR USER MODE) + +OVHCNT: 28. ;COUNTER TO SLOW THINGS DOWN TO CUT OVERHEAD + +LOVHPC==100 ;64 SAMPLES SHOULD BE ENOUGH +OVHPCS: BLOCK LOVHPC + +BBLK + +;CALCULATE OVERHEAD USING PC SAMPLE TABLE +;CLOBBERS A,B,C +OVHCLK: SOSL OVHCNT ;TIME TO DO IT YET? + JRST OVHCL9 ;NO, IGNORE THESE SAMPLES + MOVEI A,28. ;SEE ONLY ONE SAMPLE OUT OF EVERY 29 ON AVERAGE + MOVEM A,OVHCNT ;SO TIME SPENT IN THIS ROUTINE IS NOT EXCESSIVE + RDPCST C ;SEE HOW FULL THE PC SAMPLING TABLE IS + HRLOI C,-OVHPCS-1(C) + EQVI C,OVHPCS ;AOBJN POINTER TO SAMPLES ACTUALLY TAKEN + JUMPGE C,OVHCL9 ;NONE + CAMGE C,[-LOVHPC,,OVHPCS] + JRST OVHCL9 ;BOGUS AOBJN POINTER, MAYBE PCST NOT TURNED ON +OVHCL1: MOVE A,(C) ;NEXT SAMPLED PC + TLNE A,%PSUSR ;ONLY SEARCH TABLE IF EXEC MODE + JRST OVHCL8 ;ALL USER MODE PC'S ARE COUNTED IN LAST BUCKET + HRLO A,A ;-1 IN RH IS GREATER THAN ANY SIXBIT + MOVEI B,1_<35.-<.LZ >> ;HALF THE SIZE OF THE TABLE +REPEAT <36.-<.LZ >>,[ ;LOG SEARCH + CAMG A,OVHTB1(B) ;NOT CAMGE BECAUSE OF PADDING AT END + SUBI B,1_<35.-.RPCNT-<.LZ >> + ADDI B,1_<34.-.RPCNT-<.LZ >> +] + LOC .-1 ;OPTIMIZE OUT ADDI B,0 + AOSA OVHTB2(B) +OVHCL8: AOS OVHTB2+LOVHTB-1 + AOBJN C,OVHCL1 +OVHCL9: WRPCST [-LOVHPC,,OVHPCS] ;TURN ON / RESTART PC SAMPLING + POPJ P, +];KS10P + +;HERE IS A TABLE OF REGISTERED 3-LETTER OVERHEAD REGION CODES + +;ALC - ALLOCATE CORE PAGE FRAME +;CHx - CHAOSNET STUFF (VARIOUS VALUES OF x) +;FLT - MISCELLANEOUS FAULTS +;IMP - ARPANET INTERRUPT (NOT STYNET) +;LOW - LOW CORE, BEFORE FIRST OVHMTR MACRO & PCS IN UPPER HALF OF EXEC SPACE +;NET - ALL NETWORKS, ALL PI LEVELS, NOT OTHERWISE ACCOUNTED FOR +;PGF - PAGE FAULT +;PPI - PPIUM +;QIN - DISK INTERRUPT LOW LEVEL +;QSC - DISK INTERRUPT HIGH LEVEL, DISK SCHEDULER +;SC1 - SCHEDULER 1 - ENTRY +;SC2 - SCHEDULER 2 - SEARCH +;SC3 - SCHEDULER 3 - EXIT +;SC4 - SCHEDULER 4 - UNSWAPBLOCK +;SLW - SLOW CLOCK +;SWF - SWAP FIND NEW USER (SWAPOUT SCHEDULER) +;SWP - SWAP PAGE +;SWS - SWAP SCHEDULER +;SWU - SWAP USER +;TTI - TTY INPUT INTERRUPT LEVEL +;TTO - TTY OUTPUT INTERRUPT LEVEL +;TTY - MISC TTY CODE +;USR - USER MODE +;UUO - UUO LEVEL, MISCELLANEOUS ROUTINES, AND TOTAL MISCELLANY +;WS - WORKING SET & SWAP-BLOCK ENTRY CODE + +SUBTTL PC LSR TEST FEATURE + +;CALLED BY PCLT MACRO +;WHICH ASSEMBLES +;SKIPE PCLDBM +;PUSHJ P,PCLTST + +PCLTST: PUSH P,U + MOVE U,PCLIDX + MOVEM U,PCLHT + MOVE U,USER + CAME U,PCLUSR + JRST POPUJ +PCLX: CAIA ;PATCH IN OTHER CHECKS (SHOULD JRST POPUJ TO IGNORE) + MOVE U,USER ;PATCH ROUTINE MAY CLOBBER U + AOSN PCLNXT + JRST PCLT1 ;FOUND PLACE, CAUSE PCLSR + HRRZ U,-1(P) + CAME U,PCLL + JRST POPUJ ;NOT MARK (NOT AT RIGHT LOCN) + HRRO U,USER ;4.9 U FLAG +PCLT1: PUSH P,A ;COMPUTE HASH ADR OF RETURNS ON PDL + PUSH P,B + PUSH P,C + HRREI A,-USRSTG(P) + JUMPL A,PCLT1A ;SYS JOB'S PDL? + IDIVI A,LUBLK + IMULI A,LUBLK + MOVEI A,USRPDL(A) ;GET START OF USERS PDL IN A +PCLT3: HRRZ B,(A) + JUMPE B,PCLT2 + CAIL B,HSYSCD + JRST PCLT2 + HLRZ C,-1(B) + TRZ C,37 + CAIE C,(PUSHJ P,) + JRST PCLT2 + XOR B,PCLHT + ROT B,1 + MOVEM B,PCLHT +PCLT2: CAIGE A,-2-3(P) + AOJA A,PCLT3 + MOVE A,PCLHT ;COMPUTED HASH + JUMPGE U,PCLT4 ;GOING TO PCLSR HERE, STORE HASH AS MARK FOR NEXT TIME + CAME A,PCLHSH + JRST PCLT5 + SKIPGE PCLDBM + JRST PCLT6 ;IN HOLD MODE, PCLSR HERE + SETOM PCLNXT ;FOUND MARK, PCLSR NEXT TIME +PCLT5: POP P,C + POP P,B + POP P,A + JRST POPUJ + +PCLT4: MOVEM A,PCLHSH ;STORE HASH FOR NEXT TIME + HRRZ A,-3-1(P) + MOVEM A,PCLL +PCLT6: CONO PI,CLKOFF + MOVE B,PCLDBM + MOVEI A,%PIC.Z + CAIN B,1 ;DON'T ^Z. + IORM A,PIRQC(U) + POP P,C + POP P,B + POP P,A + POP P,U + JRST PCLME + + PUSHJ P,PCLME1 +PCLME: PUSHJ P,UFLS + JRST 4,. + +PCLME1: PUSHJ P,PCLSR + JFCL + JRST POPJ1 + +PCLT1A: TRNE U,-1 + JRST 4,. + JRST 4,. ;TEMP MODIFY END CHECK IF WANT TO WIN FOR SYS JOB + +SUBTTL ILLUO NON-RELEVANT SYSTEM CALLS +IFE E.SP,[ + ADSTEP==URET + ADCONT==URET + ADWORD==URET +] +IFE 340P\E.SP,[ + ADSTAR==URET + ADCLOS==URET + ADSTOP==URET + ADSTL==URET +] +IFE 340P,[ + ALTPEN==URET + ANDIS==URET +] +IFE VIDP,[ + AVSCAN==ILUUO + AVSTST==ILUUO +] +IFE IMXP,[ + APOTSET==ILUUO +] +IFE PDP6P,[ + AIPDP==ILUUO +] +IFE NMTCS,[ + AMTAPE==ILUUO +] + +IFE ARMP,[ + AARMOV==ILUUO + AARMRS==ILUUO + AARMOF==ILUUO +] +IFE PTRP,[ + AFEED==CPOPJ +] +IFE RBTCP,[ + ARBTC==ILUUO +] +IFE NETP,[ + ANETIM==OPNL1 ;NO SUCH DEVICE ERROR FOR SYMBOLIC SYSTEM CALLS. + ANETBL==OPNL1 + ANETHS==OPNL1 +];NETP +IFE NCPP,[ + ANETAC==CPOPJ ;MAKE OLD UUOS FAIL + ANETIN==CPOPJ +];NCPP + +IFE NUNITS,[ + AUBLAT==URET + AUTNAM==URET + AUINIT==URET + AUDISM==URET + AASSIGN==URET + ADESIGN==URET +] + +;Here generate the table for the BUG macro. Note that entries for +;bugs in the initialization code will appear here also! That's +;why we have the kludgey add 10 +BUGTAB: BLOCK LBUGTB+10 +LBUGT2==.-BUGTAB + 0 ;Marks end of table + +CONSTANTS +HSYSCD:: ;HIGHEST SYSTEM CODE + +SUBTTL RANDOM STORAGE +EBLK + +SCHHP: SCHHB ;PNTR TO SCHED HIST BUFFER +SCHHB: BLOCK SSCHDB ;SCHED HIST BUFFER + ;4.9 =1 EXEC + ;4.8 =1 QUANT TERMINATED BY PG FAULT + ;4.7-3.8 LENGTH OF RUN TIME IN 512 USEC UNITS + ; MUST ACCOMODATE 150 MILLISECOND QUANTA + ;3.7-3.1 USER ("NUMERIC INDEX) + ;RH PC QUANT STARTED AT +SWPHTP: SWPHTB +SWPHTL==200 +SWPHTB: BLOCK SWPHTL ;SWAPPING HISTORY TABLE + ;4.9-4.8 EVENT: 0=START LOADING, 1=FINISH LOADING, + ; 2=SWAP OUT, 3=SWAP BLOCK + ;4.7-3.9 WORKING SET SIZE MINUS ONE (0=0) + ;3.8-3.1 USER NUMBER + ;2.9-1.1 RH(TIME) + BLOCK SWPHTL ;CORRESPONDING UTRNTM + +PGIHTP: PGIHTB +PGIHTL==200 +PGIHTB: BLOCK PGIHTL ;PAGE-IN HISTORY TABLE + ;4.9 1 IF JOB WAS LOADING + ;4.7-3.9 USER VIRTUAL PAGE NUMBER + ;3.8-3.1 USER NUMBER + ;2.9-1.1 RH(TIME) + BLOCK PGIHTL ;CORRESPONDING UTRNTM + +IFN SCHBLN,[ +SCHMNY: 0 ;0 DO FULL SCHEDULE, -1 NEXT "SCHEDULE" SHOULD LOOK IN SCHBTB +SCHBNJ: 0 ;NUMBER OF VALID ENTRIES IN SCHBTB +SCHBTB: BLOCK SCHBLN ;RUNNABLE JOB BUFFER +SCHBPR: BLOCK SCHBLN ;PRIORITIES OF THOSE +NSCHOV: 0 ;COUNT OF BUFFER OVERFLOWS +] +;TRANSLATION ENTRY _ T +;TRANLK(T) IS MODE,,NEXT ENTRY +;MODE IS 0 IF ENTRY ON FREE LIST, ELSE NOT 0, AND + ;BITS 3.1 => INPUT, 3.2 => OUTPUT, 4.9 => ATOMIC TRANSLATION (DON'T RETRANSLATE) +;NEXT-ENTRY IS -1 FOR NIL, ELSE IDX REL TRAN!X +;TRANID(T) THRU TRANIS(T) - FROM-NAMES +;TRANOD(T) THRU TRANOS(T) - TO-NAMES + +TRANLK: REPEAT SIOMT,,,.RPCNT-1 ;GENERATE 1ST WDS, LINKED TOGETHER. +TRANID: BLOCK SIOMT +TRANI1: BLOCK SIOMT +TRANI2: BLOCK SIOMT +TRANIS: BLOCK SIOMT +TRANOD: BLOCK SIOMT +TRANO1: BLOCK SIOMT +TRANO2: BLOCK SIOMT +TRANOS: BLOCK SIOMT + +TRANFL: SIOMT-1 ;TRANSL ENTRY FREE LIST. +TRNCNT: 0 ;NUM ENTRIES IN USE. +TRNREF: 0 ;NUM. READ-ONLY ACCESSES TO TRANSL LISTS. +TRANSW: -1 ;SWITCH FOR WRITE REF. + 0 + +IFE SCHBLN, U0P: 0 ;PRIORITY OF BEST USER SO FAR + +USER: -1 ;USER # OF CURRENT LOSER +SYSL: SYSB*2000 +LITM: 0 ;LAST TIME SYS INCREASED CORE + +SLGIV: BLOCK 3 ;LOGIN + +SETSLC: 0 ;SETLOC VARIABLES +SETSLQ: 0 +SETSU: -1 + +SWUNAM: 0 ;SYS WRITE VARIABLES +SWJNAM: 0 +SWFN1: 0 +SWFN2: 0 +SWFN3: 0 +SWMOD: 0 + +DMON: SIXBIT /DRAGON/ + -1 ;USER INDEX OF DEMON JOB + +NQMFWR: 0 ;COUNT OF FILES WRITTEN ON .MAIL. - FOR MAILER DEMON TO HANG ON. +IFN XGP,[ +NXGPFW: 0 ;COUNT OF FILES WRITTEN ON .XGPR. - FOR XGPSPL +] + +;DEAMON VARIABLES +;VARIABLES FOR DEAMON CODE HACK +IFN DEMON,[ + +IFN TTLPTP,TPLFLG: 1 ;FLAG FOR TPL + +DMTLL==4 ;LEGNTH OF DEAMON TABLE SLOT +NODEAM==20. ;NUMBER OF SLOTS +DMLNG==NODEAM*DMTLL + +DEMSW: 0 + 0 ;MAIN PROG SWITCH FOR DEMON +REQCNT: 1 ;COUNT OF REQUEST'S FOR SYS JOB +DMTPTR: 0 ;POINTER FOR DEMSIG TO DEM TBL, AN INDEX INTO IT, TAKEN MODULO DMLNG +DMLSEX: -DMLNG,,0 ;POINTER TO DEAMON TABLE AOBJN +DEMCNT: ;AMOUNT OF SLOTS REMAINING IN THE TABLE + +DMBLK: 0 + 0 ;SLOT FOR NON DEAMON LOAD VIA NUJBST + +DMOBLK: SIXBIT / SYS/ + SIXBIT /ATSIGN/ + 0 ;BLOCK USED BY SYSTEM JOB TO CHECK OPEN + +;DEAMON TABLE--CONSISTS OF SLOTS OF FOUR WORDS FOR EACH DEMON +;WORD 1 CONTAINS ITS SIXIT NAME +;WORD 2 CONTAINS THE USER INDEX,-1 IF LOADING, 0 IF DOWN +;WORD 3 2 QUANTITIES IN 18 BIT 2'S COMPLEMENT-- +;LH ALWAYS > = 0, IF 0 ONLY TAKES EXPLICIT REQUESTS IN > 0 A REQUEST +;RH CONTAINS THE NUMBER OF REQUESTS PENDING FOR THE DEAMON +;FOR THE DEAMON WILL BE GENERATED EVERY 2 MINUTES +;WORD 4 CONTAINS THE TIME TILL THE NEXT IMPLICIT REQUEST WILL BE GENERATED. + + +DMTTBL: SIXBIT /DEMSTR/ + 0 + 1 ;STARTUP DEAMON + 0 + +BLOCK *DMTLL +] +TIMOFF: -1 ;TIME SINCE MIDNIGHT IN HALF SECONDS ("TIME IN DSK FORMAT"). +QDATE: -1 ;DISK FORMAT DATE: -1 => SYSTEM DOESN'T KNOW DATE, ELSE + ;BITS 3.1-3.5 HAVE DAY OF MONTH, 3.6-3.9 HAVE MONTH OF YEAR, + ;4.1-4.7 HAVE YEAR MOD 100. . +QDATEI: -1 ;-1 => SYSTEM DOESN'T KNOW DATE, ELSE + ;DATE AND TIME THE DATE AND TIME WERE FIRST DETERMINED, IN DSK FORMAT. +PDYTIM: -1 ;TIME SINCE BEGINNING OF YEAR IN HALF-SECONDS (BACKUP TO PDCLK) +FYEAR: 0 ;YEAR (E.G. 1969.) +PDTIME: 0 ;NON-ZERO => OFFSET FOR PDCLK + ;WHEN SUBTRACTED FROM PDCLK DATAI GIVES # PD-UNITS SINCE + ; BEGINNING OF YEAR + ;ONE SECOND = 60. PD-UNITS + ; Also contains similar offset for KS-10 clock in 60ths. +LPDTIM: -1 ;LAST PD CLK TIME, -1 IF PD CLK NOT RUNNING OR JUST PDSET'ED + +SUPCOR: 0 ;CONTROLS SYS JOB, SEE SYSDTB, SCOR, ETC + ;EACH BIT REQUESTS ONE FUNCTION IF SET. +SUPCOP: SCLDAT+IFN DEMON,[SCLDMN],,SCRCKS + ;THIS WORD OR'D INTO SUPCOR EVERY SECOND. +SCKPHS: 0 ;USED FOR COUNTING EVERY SECOND 1/2 SECOND CLOCK + ;TO SET SUPCOP BITS EVERY SECOND +SYSITM: 0 ;TIME SYS JOB LAST STARTED WAITING ON SUPCOR +LNETIM: 0 ;TIME AT WHICH NETWORK WAS LAST BROUGHT UP +RSWTIM: 1 ;Time (in DSK format) when last checked system resources. + +MXPARS==10. ;MAX # PAR ERRS TO PRINT OUT +PARPG: BLOCK 8 ;STORAGE OF PAGE MAP WHILE HACKING PARITY ERROR CHECK +PARCNT: 0 ;# OF PAR ERROR ENTRIES IN TABLE +PARCON: BLOCK MXPARS ;CONTENTS OF BAD PARITY LOCATIONS +PARADR: BLOCK MXPARS ;ADDRESSES OF BAD PARITY LOCATIONS +PARAND: -1 ;QND OF ALL BAD WORDS +PARIOR: 0 ;IOR OF ALL BAD WORDS +PARAAN: -1 ;AND F ALL BAD ADDRS +PARAOR: 0 ;IOR OF ALL BAD ADDRS +IFE KA10P,[ +PARPFW: 0 ;PAGE FAIL WORD +PARERA: 0 ;ADDRESS OF PAR ERR +PARWRD: 0 ;BAD DATA +] ;IFE KA10P +IFN KL10P,[ +PARRSN: 0 ;0 => PAR ERR PAGE FAULT IN PROG + ;-1 => PAR ERR INTERRUPT; NEEDN'T STOP + ;THE RUNNING JOB. +] ;KL10P +PARDIE: 0 ;-1 => FATAL PARITY ERROR +TPLSWP: 0 ;-1 => USE OLP FOR TPL +IFN PDP6P,[ +PDP6UP: 0 ;0 => PDP6 IS DOWN. (AS USUAL) +] +IFN ECCMEM,[ +IFE MCOND AIKA,[ +ECCADR: 1,,777760 ;ECC HISTORY STARTS HERE +ECCLEN==16. ;16 LOCATIONS OF ECC HISTORY +ECCIDX: 0 ;LAST LOCATION ACCESSED +]] +IFN TEN11P,[ +TEN11F: 0 ;0 -> NORMAL + ;-1 -> COMPLETELY IGNORE 10-11 INTERFACE + ; 1 -> RESET 10-11 INTERFACE, OTHERWISE IGNORE +T11ERC: 0 ;COUNT OF CONTROL PAGE RAM ERRORS +T11CCN: 0 ;CORRECT CONTENTS +T11WCN: 0 ;WRONG CONTENTS +T11PG: 0 ;PAGE # INVOLVED +] +IFN N11TYS,[ +TVBLAD: 17742 ;VIDEO BUFFER TO FLASH WHEN JOB RUNNING (PDP10 VIDEO BUFFER ADDR) +] +IFN DL10P,[ +DL10F: -1 ;-1 NORMAL, 0 => 11 DOWN +DL10HC: 0 .SEE TTDLBRK ;NUMBER OF LOOPS WHEN HUNG UP WAITING FOR 11 TO GOBBLE BUFFER +] + +DLSRCH: 0 ;-1 => DON'T RUN ANY USER BUT THE ONE ALREADY RUNNING + ;(UNLESS WE TAKE A PAGE FAULT). +CPDLP: -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER +LCPDL: BLOCK CPDLL ;CLOCK INT LEVEL PDL + +CLKBSW: 0 ;READ SWITCHES INTO HERE TO DECIDE WHETHER TO GO TO DDT. + +CLROOT: SSLCKB ;CLOCK QUEUE ROOT + +SSLCKB: SCLKI ;SLOW CLOCK RQ BLOCK + .+2 .SEE CHA5CK ;OR 15SCLB + JRST SSLCK + +IFN CHAOSP,[ +CHA5CK: 5*60.-SCLKI ;5-SECOND CLOCK FOR CHAOS NET + 15SCLB ;NOTE INITIAL TRIGGERING OF CLOCKS BELOW DELAYED AN EXTRA 5 SECONDS + JRST CHA5CL +];CHAOSP + +15SCLB: 15.*60.-SCLKI + .+2 .SEE PRVCLB ;OR VSLCKB + JRST 15SCLK + +IFE SWPWSP,[ +PRVCLB: NPVSEC*60.-15.*60.-SCLKI ;PRIVILEDGED USER VARIABLE CHECK + VSLCKB + JRST PRVCLK +];SWPWSP + +VSLCKB: 0 ;VERY SLOW CLOCK BLOCK + CLINFB ;CAUSE SLOW CLOCK TICK SOON AFTER SYS COMES UP + JRST VSSLCK + +CLINFB: 377777,,-1 ;ABOUT 15 YEARS + 0 + BUG ;? + +IFN CCLKP,[ +CCLKB: 0 ;FOR CHESS CLOCK HACK + -1 + JRST RCCLK +CCLK1: 0 +CCLK2: 0 +] + +IINTIC==60. ;# TWO-MINUTE TICKS PER VERY VERY SLOW CLOCK TICK (2 HOURS) +IINCNT: 0 ;# TWO-MINUTE TICKS REMAINING UNTIL NEXT VERY VERY SLOW CLOCK TICK +.SEE VSCLK + +IFN N11TYS,[ +WHOCLB: 0 ;WHO LINE TIMER + -1 + JRST WHOSET +] + +UTTYS: BLOCK MXCZS ;RING BUFFER FOR JOBS TO BE STARTED +UTTYI: UTTYS +UTTYO: UTTYS +UTTYCT: 0 + +PCLDBM: 0 ;.NE. 0 ACTIVATE PC LSR DEBUG MODE + ;1 => ADVANCE PLACE WHERE PCLSR + ;2 => ADVANCE BUT DON'T ^Z. + ;- HOLD +PCLUSR: -1 ;USER PCLSR MODE ACTIVE FOR +PCLL: 0 ;PLACE WHERE LAST PCLSR TESTED +PCLHSH: 0 ;HASH OF RETURNS ON PDL AT LAST PLACE TRAPPED OUT OF +PCLNXT: -1 ;-1 => FROB NEXT TIME IN ADVANCE MODE +PCLHT: 0 ;TEMP +PCLIDX: 0 ;INITIALIZE PCLT TO THIS (SET TO LOOP COUNT IF NECESSARY) + +CORRNR: 0 ;LAST USER TO RUN CORE +SJSPG: 0 ;-1 => LAST FREE PG RESERVED FOR SYS JOB; DON'T GIVE IT TO ANYONE ELSE. +UTBFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH I/O BLOCKS +UFDFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH 2311 UFDS +CORCNT: 0 +UFLSF: 0 ;FLAG FROM UFLS TO CLKBRK +CLKFL1: 0 ;FLAG COUNTER TO CONTROL CLOCK LEVEL +SCHFLG: 0 ;SCHEDULE TIMER (DIVIDES 60 CPS) +27FCLK: 0 ;-1 IF FAST CLOCK SHOULD CALL TYP27S +SCITM: 0 ;SEE SYSEX, SYSDEC +LCLK1: 0 +SYSCKP: -LTSTB,,TSTB ;SYSTEM CHECKSUMS CHECKER POINTER +SYSPDP: -LSYSP,,SYSPDL-1 ;PDL POINTER FOR SYSTEM JOB +SYSPDL: BLOCK LSYSP ;PDL FOR SYS JOB +IFN TPLP,TPLBUF: BLOCK TPLBSZ ;PSEUDO LPT BUFFER - MUST BE ABOVE SUACS +IFN TPLP\DEMON,TPLFNO: SIXBIT /!/ ;UNIQUE TPL FIRST FILE NAME +SJCFF: 0 ;-1 WHEN SYS JOB IN PROCESS OF FLUSHING CORE + ;AVOIDS TIMING ERROR DUE TO HUSRAD NOT REALLY REFLECTING WHAT ITS GOING TO BE +SLSWPR: 0 ;STORE SYS JOB'S LSWPR WHILE HACKING UUOS + +BBLK + +IFN TPLP, TPLFN: 2,,(SIXBIT /TPL/) +IFN KL10P,[ +KLEBCC: 0 ? <1_23.>/<4*25./2> ;EBOX COUNTER CONVERSION TO 4 USEC CONSTANT (FOR 25 MHZ) + ;RESULT IS IN AC+2 AFTER DMUL AC,KLEBCC +KLMBCC:; 1 ? 110000,, ;FOR CONVERTING AN MBOX COUNT TO THE TIME (IN EBOX UNITS) + ;IT SUPPOSEDLY AMOUNTS TO. + ;WE ASSUME 102.5 NANOSEC OD WAITING TIME PER MBOX CYCLE + ;THIS NUMBER IS 102.5/80. + ;DMUL AC,KLMBCC PUTS ANSWER IN AC+1, AC+2 + ;WITH BINARY POINT BETWEEN THE WORDS. + 0 ? 0 ;M8538 MODIFIED SO EBOX COUNTER CONTINUES TO COUNT + ;DURING MBOX WAIT TIME, SO SET KLMBCC = ZERO. +EBLK + +MTRUSR: -1 ;USER TO WHOM PERF CTR IS ASSIGNED +MTRJOB: -2 ;USER BEING MEASURED BY PERF CTR, + ;OR -1 => NULL JOB, OR -2 => ALL JOBS. + +PAEON: 0 ;SELECTED PERF CTR ENABLE WORD +PAEOFF: 0 ;DISABLE THE PERF CTR (WHEN WRONG JOB IS RUNNING) +STPERF: 0 ? 0 ;VALUE OF PERF COUNTER AT START OF QUANTUM +STEBOX: 0 ? 0 ;VALUE OF EBOX COUNTER AT START OF QUANTUM +STMBOX: 0 ? 0 ;VALUE OF MBOX COUNTER AT START OF QUANTUM +] ;KL10P +IFE KL10P, EBLK +IFN TPLP,[ +TPLFN1: 0 +TPLFN2: 0 +TPLFN3: 0 +] +IFN NLPTP, NTNLPL: 0 ;NUMBER OF TIMES NLPT LOST PIA +VARIABLES + + +TSTB: REPEAT CKNUM,CONC CK,\.RPCNT, +LTSTB==.-TSTB + +CKSUMS: BLOCK CKNUM +CKXORS: BLOCK 36. ;XOR OF ALL ADRS IN PURE AREAS IN SYS WITH CORRESP + ;BIT SET (RH) +TCKXOR: BLOCK 36. ;TEST XORS + +SSYSCL==SSYS +SYSCLB==SSYSCL_-10.+IFN 1777&SSYSCL,1 + +IFE KA10P,[ +AC1PTR: UUOACS ;-> WHERE AC BLOCK 1 IS CURRENTLY LOADED FROM +] ;IFE KA10P + +USRHI: 0 ;HIGHEST LOC USED FOR USER STORAGE + +SUBTTL LOCATIONS TO PATCH WHEN DEBUGGING + +SYSDBG: 0 ;0 NORMAL TIMESHARING + ;+ GIVE "ITS BEING DEBUGGED" MESSAGE + ;-N ALSO ALLOW ONLY CONSOLE #N AND T00 TO CTRL/Z. + ;-512.*N => ALLOW ONLY HOST N TO TELNET IN. + ;-512.*N+M => ALLOW HOST N AND TTY M. +DMLLDF: -1 ;-1 => START DAEMONS AUTOMATICALLY, 0 DON'T. +IFN DEMON,DMNFLG: 1 ;1 => START DM-STYLE DAEMONS, 0 DON'T. + +IFN NETP,NETUSW: 0 ;-1 => DON'T START UP A JOB IN ANSWER TO A CONNECT REQUEST + ;FROM A HOST OTHER THAN OURSELVES + +SYSCN: SYSCON ;NUMBER OF TTY TO RECEIVE SYSTEM CONSOLE OUTPUT. + ;-1 TO THROW IT AWAY. YOU CAN CHANGE THIS ANY TIME. + +SUPPLG: 0 ;-1 => SUPPRESS LOGIN/LOGOUT MESSAGES ON SYSTEM CONSOLE. + +IFE KS10P,[ ; KS has no lights. +MIPGDS: 0 ;-1 => DON'T LIGHT LIGHTS (KA HAS HARDWARE SWITCH, KL NEEDS + ; THIS) +] ;IFE KS10P + +IFN RH10P+RH11P,[ +USFHLT: 0 ;-1 => HALT ON DISK UNSAFES AND OTHER BAD ERRORS + ;0 => RETRY. NOTE SET POSITIVE FOR 1/2 SECOND AFTER + ; A RETRY TO AVOID LOOPING, DETECT SOLID ERRORS. +] ;RH10P+RH11P + +.SEE USEHM ;NONZERO => USE HIGH MOBY, ELSE ONLY 256K + +.SEE USEMDM ;NONZERO => USE MEDIUM MEMORY AS ADDITIONAL "LOW HALF" PAGES + +IFN N11TYS,[ +TT11P: 1 ;0 => PDP11-TTYS ARE NOT IN USE + ;1 => SYSTEM SHOULD INITIALIZE THEM + ;-1 => INITIALIZED AND IN USE + ;TO BRING THE TV'S DOWN, ZEROING TT11P ISN'T ENOUGH + ;EITHER DO WHAT TT11LS DOES, OR JUST SET SCR11D IN SUPCOR + ;(THE LATTER MAY NOT TAKE EFFECT INSTANTLY, HOWEVER) + ;TO BRING THE TV'S UP, JUST SET TT11P TO 1 AND WAIT 2 SECONDS +] + +.SEE IMPUP ;0 UP, -1 DOWN, 1 DOWN AND DON'T TRY TO BRING BACK UP + +.SEE TEN11F ;0 UP, -1 TOTALLY DOWN, 1 RESET PLEASE + +.SEE DL10F ;0 PDP11 DOWN, -1 UP + +.SEE PDP6UP ;0 PDP6 DOWN, -1 UP + +.SEE LASTGC ;NAME OF LAST DISK DIRECTORY GARBAGE COLLECTED + + +SUBTTL SWAPPING ALGORITHM CONTROL SWITCHES + +IFE SWPWSP,[ ;THESE AREN'T LOOKED AT IN SWPWSP SYSTEM +ENSWSC: SWBLK ;ENABLE CALLING OF SWSCD FROM 15 SEC CLOCK +ENUPC: 1-SWBLK ;ENABLE USER-PC PAGE OF RUNNING USER NOT BE SWAPPED OUT +ENPZRO: SWBLK ;ENABLE PAGE-ZERO OF RUNNING USER NOT BE SWAPPED OUT +ENSWBK: SWBLK ;ENABLE SWPNX1 TO SWAP BLOCK A USER +ENPVCL: 1-SWBLK ;ENABLE PRVCLK ROUTINE +ENPREE: 1-SWBLK ;ENABLE PREEMPTION ON PAGE SWAP IN (SEE QSWI1) +ENAGE: 1-SWBLK ;ENABLE AGE BITS TO ABORT SWAP OUT IF PAGE IS USED +];SWPWSP +AGERTE: 8 ;NUMBER OF PAGES TO AGE EACH 1/2 SECOND. + ;IN A 512K SYSTEM, LAP TIME IS ABOUT 200/AGERTE SECONDS. + +SUBTTL SYSTEM LOCKS + +CIRPSW: -1 ;CIRCULAR POINTER SWITCH + 0 + +MEMFRZ: -1 ;MEMORY FROZE + 0 + +CASW: -1 ;CORE ALLOCATE INTERLOCK SWITCH (REQUESTS TO CORE JOB) + 0 + +SHUTLK: -1 ;LOCK VAR FOR SHUTDN + 0 ;USED TO TELL WHO CAUSED SYS DOWN + +TREESW: -1 ;LOCK MANIPULATION OF JOB TREE STRUCTURE + 0 ;ATTACH, DETACH, DISOWN, REOWN ALL LOCK. + +CUSER: -1 ;CORE ALLOCATOR USER + 0 ;DUMMY CORE ALOC USE VAR + +ARDFSW: -1 ;LOCK VAR FOR .REDEF + 0 + +IFN 340P\E.SP,[ +DISUSR: -1 ;340 USER + 0 ;DUMMY 340 USE VAR +] + +IFN CODP,[ +CODUSR: -1 ;CODE SENDER +CODUSE: -1 +] + +IFN PLTP,[ +PLTUSR: -1 ;PLOTTER USER +PLTUSE: -1 +] + +IFN LPTP\TTLPTP,[ +LPTUSR: -1 ;LINE PRINTER USER +LPTUSE: -1 +] +IFG LPTP-1,[ +OLPUSR: -1 +OLPUSE: -1 +] +IFN LPTP,[ + IFE LPTP-1,[ + IFN NLPTP,[ + NLUSR==LPTUSR + NLUSE==LPTUSE + ] + IFN OLPTP,[ + OLUSR==LPTUSR + OLUSE==LPTUSE + ] + ] + IFG LPTP-1,[ + OLUSR==OLPUSR + OLUSE==OLPUSE + NLUSR==LPTUSR + NLUSE==LPTUSE + ] +] + +IFN PTRP,[ +PTPUSR: -1 +PTPUSE: -1 + +PTRUSR: -1 +PTRUSE: -1 +] + +IFN VIDP,[ +NVDUSR: -1 +NVDUSE: -1 +] + +IFN PDP6P,[ +PDPUSR: -1 ;PDP-6 USER +PDPUSE: -1 +PDPISR: -1 ;PDP6 AS INFERIOR (INTS ON IO CHANNEL) +PDPISE: -1 ;PDP6 USE VAR +] + +IFN TABP,[ +TABUSR: -1 ;TABLET USER +TABUSE: -1 +] + +IFN STKP,[ + STKUSR: -1 + STKUSE: -1 +] + +TIME: 0 ;TIME SINCE SYSTEM START IN 1/30'THS +SUSRS: 0 ;NUMBER USERS ON SYS +RVVTIM: 0 ;VALUE OF TIME WHEN SYSTEM WAS LAST REVIVED FROM A CRASH +USRRCE: BLOCK NCT+1 ;USER RESOURCE +1 FOR DISOWNED JOBS +SYSRCE: 0 ;SYS JOB RESOURCE +SLOADU: 0 ;100. * , IN FIXED POINT. +RNABLU: 0 ;RUNNABLE USERS +NPGWTU: 0 ;NUMBER OF JOBS CURRENTLY WAITING FOR A PAGE +LOUTIM: 0 ;TOTAL TIME USED BY LOGGED OUT USERS +UMASTER: -1 ;INDEX OF MASTER USER +SWRCE: BLOCK NCT+2 ;SWAP SCHED RESOURCE +SWIPRQ: 0 ;TOTAL # SWAP IN REQUESTS +SHUTDN: 0 ;"TIME" SYS WILL DIE, 0 IF NOT DYING, -1 IF DEAD +DEDTIM: 0 ;TIME TILL DEATH AFTER NEXT CLK QUEUE INT + ; < 0 => SYSTEM ACTUALLY DOWN (CHECKED BY ^Z, NUJBST, %OPLIV JOBS) +DTHTIM: 0 ;TIME SYSTEM DIED +DEDBLK: 0 + -1 + JRST DEATHZ + +ATRNJN: 0 ;JNAME OF LAST JOB TO DO A .TRANAD OR .TRANDL + ;(SO I CAN SEE IF THEY'RE USED AT ALL). + +IFN DZ11P,[ +DZXSPR: 0 ;Count of spurious DZ-11 transmitter interrupts. +DZRSPR: 0 ;Count of spurious DZ-11 receiver interrupts. +];DZ11P + +NCORRQ: 0 ;NUMBER CORE RQS HERE SO TRANSFERRED TO PEEK +NCBCOM: 0 ;NUMBER CORE BLOCKS COMMITTED TO CORGP + +NQDE: BLOCK NQS ;NUMBER OF 2314 DATA ERRORS +NQHE: BLOCK NQS ;NUMBER OF 2314 HARDWARE ERRORS + BLOCK 1 ;NQSE-1 COUNTS SPUR INTS WHILE NO XFER (QSDU -1) +NQSE: BLOCK NQS ;NUMBER OF SPURIOUS 2314 ERROR INTERRUPTS +NQCMPE: BLOCK NQS ;NUMBER OF 2314 READ/COMPARE ERRORS +NQWDE: BLOCK NQS ;# DATA ERRS ON WRITE +NQRDE: BLOCK NQS ;# DATA ERRS ON READS +NIRSWE: 0 ;# IRRCV ERRS ON SWAPPING XFERS +QIRRCV: 0 ;IRRECOVERABLE DISK ERRORS +QIRCBK: 0 ;BLOCK # W/ IRRCV ERROR +QIRUNT: 0 ;UNIT OF ABOVE +NQWRE: 0 ;# WRITE ERRS RCC OK +NQWIRE: 0 ;# WRITE ERRS RCC LOST +NWXFR: 0 ;NUMBER WRITE TRANSFERS (FILE, DIR, ETC.) +NRXFR: 0 ;NUMBER READ +NSWXFR: 0 ;NUMBER WRITE SWAPS +NSRXFR: 0 ;NUMBER READ SWAPS + +;DON'T CHANGE ORDER .SEE MEMTYP +PARERR: 0 ;COUNT OF CORE PARITY ERRORS +NXMERR: 0 ;COUNT OF NXMS +IFE KA10P, BPFERR: 0 ;COUNT OF BAD PAGE FAILS +PARPC: 0 ;PC ON CORE PARITY INTERRUPT +NXMPC: 0 ;PC ON NXM +IFE KA10P, BPFPC: 0 ;PC ON BAD PAGE FAIL +PARUSR: -1 ;USER ON PAR ERR +NXMUSR: -1 ;USER ON NXM +IFE KA10P, BPFUSR: -1 ;USER ON BAD PAGE FAIL +IFE KA10P, BPFPFW: 0 ;PFW ON BAD PAGE FAIL + +IFN KS10P,[ +ECCERR: 0 ;COUNT OF ECC CORRECTED ERRORS LOGGED +ECCERA: 0 ;MEMORY STATUS AND ADDRESS OF MOST RECENT +ECCAND: -1 ;AND OF ALL ERRORS +ECCIOR: 0 ;IOR OF ALL ERRORS +] ;IFN KS10P + +IFN DPKPP, NDPKPE: 0 ;# PARITY ERRS FROM DATAPOINT KLUDGE + +SNMPGS: 0 ;SYSTEM, NUMBER OF VIRTUAL USER PAGES +SNSWPG: 0 ;SYS, NUM OF SWAPPED OUT VIR. PGS + +USRTM1: 0 ;4USEC TICKS USED BY USERS SINCE LAST (1/2 SEC) UPDATE TO USRTIM +USRTIM: 0 ;TIME USED BY ALL USERS 1 SEC UNITS +NULTM1: 0 ;4USEC TICKS USED BY NULJOB SINCE LAST (1/2 SEC) UPDATE TO NULTM3 +NULTM3: 0 ;NUMBER OF SECONDS USED BY NULJOB +NULTIM: 0 ;TIME USED BY NULL JOB (60'THS) - OBSOLETE BUT STILL MAINTAINED +IFN KL10P,[ +NULEBC: 0 ? 0 ;EBOX COUNT WHEN NULL JOB ENTERED +NULMBC: 0 ? 0 ;MBOX COUNT WHEN NULL JOB ENTERED +NULPRF: 0 ? 0 ;PERF COUNT WHEN NULL JOB ENTERED +] ;KL10P +IFE KA10P,[ +PFAILF: 0 ; KL: -1 => ENTRY TO CLOCK LEVEL WAS VIA PFAIL + ; -2 => VIA INTPFL + ; KS: -1 => BOTH CASES +] ;IFE KA10P +LOSTM1: 0 ;4USEC TICKS LOST SINCE LAST (1/2 SEC) UPDATE TO LOSTIM +LOSTIM: 0 ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES) +IDLTM1: 0 ;4 USEC TICKS IDLE SINCE LAST (1/2 SEC) UPDATE TO IDLTIM +IDLTIM: 0 ;SECONDS OF IDLE TIME (NO JOBS WANT TO RUN) +LOSRCE: 0 ;USRRCE WORD FOR LOST TIME +IDLRCE: 0 ;USRRCE WORD FOR IDLE TIME + +UREALT: -1 ;RH=INDEX OF THE REAL TIME USER + ;LH=0=> THIS USER HAS HIGHEST PRIORITY + ;LH>0=> USER NOT IN HIGH PRIORITY PHASE + ;LH<0=> FACILITY IDLE +INFORM [HIGHEST USED]\<.-1> + SUBTTL USER VARIABLES + +;ONE COPY FOR EACH PROCEDURE +;FOR KL AND KS, THIS IS THE UPT + +IFN KL10P,[ +DEFINE KLUPT N,NAME/ ;CHECKS "HARD-WIRED" UPT LOCATIONS +IFN .-USRSTG-,[ +.ERR "NAME" LOST IN UPT +LOC USRSTG+ +] +TERMIN +] ;KL10P + +IFE KL10P,[ +DEFINE KLUPT N,NAME/ +TERMIN +] ;IFE KL10P + +IFN KL10P, LOC <.+777>&-1000 ;KL UPT MUST START AT HARDWARE PAGE BOUNDARY + +IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW) + +USRSTG:: KLUPT 0,;USER PAGE MAP + +UPGMP: BLOCK NUVPG/2 ;PAGE MAP STORAGE (PROGRAMS UP TO NUVPG LONG) +; 2.9-2.8 ACCESS RIGHTS +; 00 NO ACCESS (BY SOFTWARE CONVENTION, 1.2-1.1 +; HAVE THE "REAL" ACCESS BITS, WHICH MAY BE 00, +; BUT MAY NOT, E.G. FOR A SWAPPED OUT PAGE). +; 01 READ ONLY +; 10 READ/WRITE/FIRST +; 11 READ/WRITE +.SEE PMCSHM ;CACHE BIT +.SEE PMAGEM ;AGE BITS +.SEE PMRCM ;LOW N BITS ARE PHYSICAL CORE PAGE NUMBER (IN 1K PAGES) +UPGCP: BLOCK NUVPG/2 ;CIRCULAR POINTERS (CORRESPONDS 1-1 WITH UPGMP) +; IF -1, ABSOLUTE PAGE, NOT LINKED. OTHERWISE: +; 2.9 IF 0: +; 2.8-1.9 USER INDEX +; 1.8-1.1 PAGE NUMBER IN THAT USER'S UPGCP +; IF 1: +; 2.8 IF 0: +; 2.7-1.1 LINK TO MMP TABLE +; IF 1: +; 2.7-1.1 LINK TO MEM PNT TABLE +UMAPS: 0 ;USER MAP STATUS + .SEE %UM +UDBR1A==UPGMP ;ADDRESS TO PUT IN DBR1 +UDBR2A==UPGMP+ ;ADDR FOR DBR2 +UPGCPH==UPGCP+ ;ADDR OF HIGH HALF OF CIRC PNTRS + +TTYTBL: 0 ;TTY ASSIGNED THIS USER OR INDICATION THAT THERE IS NONE +%TBNOT==400000 ;4.9 DOES NOT HAVE TTY NOW +%TBNVR==200000 ;4.8 IF JOB DOESN'T HAVE TTY, OPENS SHOULD FAIL. +%TBINT==100000 ;4.7 IF JOB DOESN'T HAVE TTY, ATTEMPT TO USE TTY SHOULD INTERRUPT. + ;JOB CAN SET BITS 4.8 AND 4.7. +%TBWAT==40000 ;4.6 IF 1, %TBINT AND %TBNVR ARE OVERRIDDEN AND TTY USE ATTEMPTS + ; ALWAYS HANG. SET BY DDT FOR $P, CLEARED BY ^P. ONLY SUPERIOR CAN SET. +%TBDTY==010000 ;4.4 TTY TAKEN FROM --ME--. WHEN GIVEN BACK, + ;DON'T PASS IT ON TO MY INFERIOR. +%TBOUT==004000 ;4.3 ALLOW THIS JOB TO OUTPUT WHETHER OWNS TTY OR NOT +%TBINF==002000 ;4.2 ALLOW MY INFERIORS TO OUTPUT IF THEY HAVE %TBOUT. +%TBOIG==001000 ;4.1 IGNORE MY OUTPUT +%TBIIN==000400 ;3.9 INTERRUPT IF I TRY TO DO INPUT +$TBECL==220600 ;3-6-3.1 # ECHO LINES IF I DONT HAVE DISPLAY + ;RH USER NUM GAVE TTY AWAY TO OR TTY NUM IF HAS IT +%TBCLR==410077 ;CLEAR THESE BITS IN TTYTBL OF A JOB RECEIVING THE TTY + +TTSTSV: BLOCK 3 ;JOB'S SAVED TTYST1,TTYST2,TTYSTS, WHEN JOB DOESN'T HAVE THE TTY. + +NMPGS: 0 ;NUMBER OF NON-ABSOLUTE PAGES (INCLUDES PURE) +NSWPGS: 0 ;NUMBER SWAPPED OUT PAGES (AOSED FOR EACH USER OF SHARED PAGE SWAPPED OUT) +HUSRAD: 0 ;MEM ADR OF PAGE ABOVE HIGHEST THAT EXISTS (MAX 1,,0) +UPC: 0 ;USER PC STORAGE +LUBTM: 0 ;TIME LAST UNBLOCKED (FOR IDENTIFYING INACTIVE JOBS) +JBI: -1 ;JOB DEVICE INDEX. IF NOT -1, THIS JOB IS A JOB-DEVICE, + ;AND JBI HAS INDEX INTO JOB DEVICE TABLES. + +UPGML: ;USER PAGE MAP LOAD (EIGHT WORDS FOR LPM AND SPM INSTRUCTIONS) +IFE KS10P,[ ; KS10 version given below. + UPJPC: 0 ;JPC. KA HAS FAULT ADDRESS IN LH. +IFE KL10P, UPOPC: 0 ;OLD PC FLAGS,,OPC (UNUSED ON KL-10) + UPMAR: 0,,0 ;MAR ADDRESS AND CONDITION + ;FOR KA-10: + ; 3.3 0=EXEC, 1=USER + ; 3.2-3.1 MAR CONDITION: + ; 0 NEVER + ; 1 INSTR FETCH + ; 2 WRITE + ; 3 ALWAYS + ; 2.9-1.1 VIRTUAL ADDRESS + ;FOR KL-10: + ; 3.9-3.7 ADDRESS BREAK CONDITIONS: + ; 3.9 FETCH + ; 3.8 READ + ; 3.7 WRITE + ; 3.6 0=EXEC, 1=USER + ; 3.5-1.1 VIRTUAL ADDRESS +IFE KL10P, UPQUAN: EXPGNG+1,,0 ;F.S. QUAN AND FAULT BITS +IFN KL10P, UPFW: 0 ;PAGE FAIL WORD +IFE KL10P,DBL==100_1 +IFN KL10P,DBL==0 + UPDBR1: DBL,,UPGMP ;DBR1 + UPDBR2: DBL,,UPGMP+100 ;DBR2 +IFE KL10P, UPDBR3: DBL,,EXEUMP ;DBR3 +IFE KL10P, UPACP: 1040,,UUOACS ;B KEY,C KEY,,AC POINTER +] ;IFE KS10P + +IFN KS10P,[ +UPDBR1: UPGMP ; DBR1 +UPDBR2: UPGMP+100 ; DBR2 +UPQUAN: 0 ; Runtime counter +UPJPC: 0 ; User mode JPC if microcode supports +UPEJPC: 0 ; Exec mode JPC if microcode supports +] ;KS10P + +UPGMLE:: ;END OF PAGE MAP (+1) + +IFN KL10P,[ + KLUPT 420, ;RESERVED UPT 420 +UPT420: 0 + KLUPT 421, ;TRAP 1 INSN ;ARITHMETIC OVERFLOW +TR1INS: JSR ILLTRP ;FOR ITS-STYLE INTERRUPT, CONTAINS 0,,%PIARO + KLUPT 422, ;TRAP 2 INSN ;PDL OVERFLOW +TR2INS: JSR ILLTRP ;SYS JOB SHOULDN'T OVERFLOW ;FOR ITS-STYLE, 0,,%PIPDL + KLUPT 423, ;TRAP 3 INSN ;USED FOR ONE-PROCEED +TR3INS: JSR ILLTRP ;SYS JOB SHOULDN'T ONE-PROCEED ;FOR ITS-STYLE, 0,,%PI1PR + KLUPT 424, ;MUUO DEPOSIT LOCATION +SV40:: +MUUODP: 0 .SEE FORTY + KLUPT 425, ;MUUO OLD PC STORAGE +SUUOH:: +XUUOH: 0 + KLUPT 426, ;MUUO PAGING AND CONTEXT WORD +MUUOCX: 0 + KLUPT 427, ;RESERVED UPT 427 +UPT427: 0 + KLUPT 430, ;MUUO NEW PC WORDS +MUUOKN: %PSPCU,,UUOH0 ;FOR OTHER JOBS, MUUOEX (A JRST 4,). +MUUOKT: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER TRAP IN EXEC MODE. +MUUOSN: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER RUN IN SUPERV. STATE. +MUUOST: %PSPCU,,MUUOEX ;.. +MUUOCN: %PSPCU,,UUOH0 ;NORMAL UUOS +MUUOCT: %PSPCU,,MUUOTR ;UUOS AS TRAP INSN +MUUOPN: %PSPCU,,UUOH0 ;PUBLIC MODE IDENTICAL TO CONCEALED MODE, +MUUOPT: %PSPCU,,MUUOTR ; ALTHOUGH IT'S A SCREW FOR A LOSER TO BECOME PUBLIC +] ;END OF IFN KL10P + +IFN KS10P,[ +DEFINE KSUPT UPTNAM +IFN .-USRSTG-,[ +.ERR UPTNAM lost in UPT +LOC USRSTG+ +] +TERMIN + +UPFW: 0 ; Saved page fail word from last fault. Copied from EPTPFW + ; at time of fault usually. + +KSUPT UPTTR1 +TR1INS: JSR ILLTRP + +KSUPT UPTTR2 +TR2INS: JSR ILLTRP + +KSUPT UPTTR3 +TR3INS: JSR ILLTRP + +KSUPT UPTUUO +SV40:: +MUUODP: 0 + +KSUPT UPTUPC +SUUOH:: +XUUOH: 0 + +KSUPT UPTUCX +MUUOCX: 0 + +KSUPT 427 +UPT427: 0 + +KSUPT UPTUEN +MUUOKN: %PSPCU,,UUOH0 ;UUO in Exec mode new PC + ;For other jobs: %PSPCU,,MUUOEX +KSUPT UPTUET +MUUOKT: %PSPCU,,MUUOEX ;UUO as trap instruction in Exec mode new PC + +KSUPT UPT1PO ;PC saved here after one-proceed +1PROPC: 0 + +KSUPT UPT1PN ;One-proceed sets PC to this +1PRNPC: %PSPCU,,ONEPRO + +KSUPT UPTUUN +MUUOCN: %PSPCU,,UUOH0 ;Normal UUO new PC + +KSUPT UPTUUT +MUUOCT: %PSPCU,,MUUOTR ;UUO as trap instruction new PC + +EXPUNGE KSUPT + +] ;KS10P + +UUOACS: BLOCK 20 +AC0S: BLOCK 15 ;SWAP OUT AC S +AC15S: 0 +AC16S: 0 +AC17S: 0 + +IFN KL10P,[ +;KLUPT 500, ;PAGE FAIL WORD STORAGE ;MICROCODE MOD PUTS +;KLUPT 501, ;PAGE FAIL OLD PC STORAGE ; THESE LOCATIONS IN +;KLUPT 502, ;PAGE FAIL NEW PC ; THE EPT FOR ITS +] ;END OF IFN KL10P + +UUO:: ;THE FOLLOWING LOCATIONS (UP TO SUEXND) ARE SWAPPED IN & OUT OF + ;UEXIT ETC. WITH THE USER +SUEXIT: JRST 2,@XUUOH ;USER UUO EXIT INS +SCLUSV: MOVEM U,AC17S ;CLOCK U SAVE + +IFN KA10P,[ +SUUOH: 0 ;C(@41) (ABSOLUTE) +SUEXND:: + +SV40: 0 ;C(40) WHEN USER OUT (SEE SWITCH) +] ;KA10P + +IFE KA10P,[ +SCLCXS: DATAI PAG,CLCX ;CLOCK SAVE OF CONTEXT +SUEXND:: +] ;IFE KA10P + +IFN -, .ERR SUEXIT BLOCK LOST + +IFE KA10P,[ +CLCX: 0 ;SAVED CONTEXT (DATAI PAG,) AT CLKBRK AND PFAIL +] ;IFE KA10P + +IFN KL10P,[ +KLUPT 504, ;EBOX COUNT +EBOXCT: 0 ? 0 ;NUMBER OF EBOX TICKS (25 MHZ) OVER 2 LEFT 12. THAT EBOX + ;RAN FOR THIS USER +KLUPT 506, ;CACHE COUNT +MBOXCT: 0 ? 0 ;NUMBER OF MBOX CYCLES REQUESTED BY EBOX FOR THIS USER LEFT 12. + +EXPUNGE KLUPT +] ;KL10P + +UTIME: 0 ;RH=CLOCK INTERVAL IN 60'THS, LH=COUNT OF TICKS SINCE READ +UTRNTM: 0 ;TOTAL RUN TIME IN 4 MICROSEC UNITS +USIPRQ: 0 ;# SWAPIN REQUESTS + +USWST: 0 ;SWAPPING STATUS BITS. +%SW==525252(1) ;IN THE LEFT HALF +%SWDSO==400000 ;4.9 => DESIRED TO BE SWAPPED OUT (MUST BE SIGN BIT). +%SWPGW==200000 ;4.8 => FLSINS IS WAITING FOR A PAGE +%SWBEM==100000 ;4.7 => BEST EFFORT MADE TO SWAP OUT, DON'T LOOK AT JOB AGAIN +%SWRUN==040000 ;4.6 => SWAPPED OUT WHILE RUNNABLE, SO CONSIDER MEM STATUS BEFORE REACTIVATION + ; THIS BIT IS NEVER LOOKED AT. +%SWPCL==020000 ;4.5 => PAGE SWAPPED OUT WHILE BLOCKED IN EXEC MODE + ; SO WHEN FLSINS SKIPS DON'T CLEAR IT BUT PCLSR INSTEAD. +%SWINT==010000 ;4.4 => IF WAITING FOR PAGE, NEED IT TO INTERRUPT +%SWPRV==004000 ;4.3 => "PRIVELEGED USER" +IFN SWPWSP,[ +EXPUNGE %SWPRV +%SWOUT==000400 ;3.9 => JOB IS SWAPPED OUT OR SWAP BLOCKED +%SWSB== 000200 ;3.8 => JOB IS SWAP BLOCKED +%SWLOD==000100 ;3.7 => JOB IS LOADING + ;VALID STATES OF ABOVE 3 BITS: 0=SWAPPED IN, 1=LOADING, 4=SWAPPED OUT, 6=SWAP BLOCKED + +UWRKST: 0 ;WORKING SET. 2**18 TIMES SUM(ALL THIS JOB'S PAGES) 1 OVER # SHARERS + ;INCREMENTALLY MAINTAINED WHILE JOB IS LOADING OR SWAPPED IN. + ;NOTE # SHARERS IS IN RH(MMSWP) +USVWRK: 0 ;SAVES UWRKST AS OF LAST TIME SWAPPED IN +USWTIM: 0 ;TIME ENTERED LOADING, SWAPPED OUT, OR SWAP BLOCKED STATE. + ;WHILE SWAPPED IN, HAS THE TIME AT WHICH IT CEASES TO BE PROTECTED + ;AGAINST MEMORY PREEMPTION. +];SWPWSP +USWPRI: 0 ;JOB SWAP PRIORITY. LOWER NUMBER MEANS MORE LIKELY TO STAY IN + ; AND MORE LIKELY TO COME IN. SEE ALSO SWRCE, WHICH IS SIMILAR. +IFE SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE PRODUCT + ;OF THE WORKING SET TIMES THE FRACTION OF CPU USED + ;WHICH IS A MEASURE OF MEMORY USE WITH INTERACTIVE JOBS GIVEN AN ADVANTAGE. +IFN SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE "ADJUSTED + ;MEMORY USAGE", WHICH IS THE (LOGARITHM OF THE WORKING SET SIZE) + ;MULTIPLIED BY THE SUM OF CPU TIME AND I/O WAIT TIME. ALSO, WHEN + ;A DISOWNED JOB IS SWAPPED OUT, USWPRI IS MULTIPLIED BY 4 TO PREVENT + ;IT FROM COMING BACK IN FOR A WHILE UNLESS THERE IS REALLY NO + ;COMPETITION FOR MEMORY. ALSO, WHEN A SWAPPED-OUT JOB WAKES UP FROM + ;AN I/O WAIT, USWPRI IS DIVIDED BY 2 TO GIVE INTERACTIVE JOBS AN + ;ADVANTAGE. THE SWPWSP SYSTEM DOES NOT CURRENTLY LOOK AT SWRCE. +IFE SWPWSP,[ +USWSCD: 0 ;SWAP SCHEDULING WORD 4.9=1 SWAPIN INHIBITED THIS JOB (SWAP BLOCKED) +LTRNTM: 0 ;SAVED RUN TIME FOR PRIV USR +LSIPRQ: 0 ;SAVED SWAP IN REQ FOR PRIV USER +UPGSEC: 0 ;NUMBER OF PAGE FAULTS PER RUN TIME SECONDS +LPRVTM: 0 ;LAST TIME PRIV USER +];SWPWSP +PAGRAN: 0 ;.PAGRANGE. 1ST PG #,,LAST PG # INCLUSIVE RANGE OF PAGES TO BE PAGED AHEAD. +PAGAHD: 0 ;.PAGAHEAD. 0, OR PAGE-AHEAD-DISTANCE,,PAGE-BEHIND-DISTANCE + +TRUNTM: 0 ;IF NOT TOP LEVEL, MINUS RUNTIME (4.069 US) ALREADY SENT TO SUPERIOR + ;IF TOP LEVEL, RUNTIME USED BY SUBTREE MINUS TIME SENT TO DEMON ALREADY +TSIPRQ: 0 ;DITTO FOR SWAPIN REQUESTS +UTMPTR: SYSRCE ;POINTER TO RESOURCE WORD FOR THIS LOSER (JTMU FOR TREE) +JTMU: 0 ;REDUCED BY 1/16 EVERY 1/2 SEC + ;INCREMENTED BY TIME RUN IN 4 USEC + ;MAX EQV VAL 1000000/8-1/16X=0 + ;EQV VAL=2X10^6 + ;AMONG JOBS WITH EQUAL RESOURSE + ;LOWEST JTMU HAS HIGHEST PRIORITY + +IOCHNM: REPEAT NIOCHN,0 ;IO CHANNEL ASSIGNMENT + ;RH INDEX INTO IOTTB AND CLSTB + ;LH DEV CHNL AND/OR OTHER +SIOCHN: BLOCK LUIOP ;MUST FOLLOW IOCHNM + ;I/O CHANNEL PDL +SIOCP: SIOCHN-1 ;POINTER INTO I/O CHANNEL PDL +IOCHST: BLOCK NIOCHN ;I/O CHANNEL STATUS FOR CH'S AT IOCHNM + ;3.1-4.9 IO STATUS + ;1.1-2.9 .ACCESS POINTER + +CORRQ: -1 ;RQ TO CORE JOB + ;4.9=1=>NO REQUEST + ;4.8=0 OLD TYPE RQ,1.1-1.9 # BLKS,3.1-3.8=USR NUMBER RQ'ED FOR + ;4.8=1 NEW TYPE + ;4.3 ADD FRESH BLOCK (IGNORE 4.2,4.1) + ;4.1=1=> ADDING ABSOLUTE BLOCK + ;3.9=1=>REQUEST WRITE ABILITY + ;2.9=1 INSERT, =0 DELETE ONLY IGNORE 4.1-4.3 + ;2.1-2.8 VIRTUAL PAGE AFFECTED + ;1.1-1.9 USER RQ IS FOR + +APRC: APRCHN ;R.H. CONO TO APR WHEN USER STARTS (HAS AR OV ENABLE, ETC.) + ;4.9=1=> PROCEDURE IS IN A DISOWNED TREE +BUMRTL==100000 ;4.7 => GUN TREE IF HASN'T RUN FOR AN HOUR + ;(MEANINGFUL ONLY IN TOP LEVEL JOB). + ;CLEARED BY REOWNING OR ATTACHING. +BUSRCR==40000 ;4.6 CORE RQ PENDING ON THIS JOB +BULGO==20000 .SEE SYSGUN ;USER IS DISABLED, WAITING TO BE FLUSHED BY SYS JOB. +BCHPTR==330400,,APRC(U) ;4.1-4.4 LAST CH ON WHICH AN ERR OCCURED (SEE ERR DEV) +BULGOS==400 ;AN ATTEMPT IS BEING MADE TO DELETE OR LOG OUT THIS JOB + ;SO NO-ONE ELSE SHOULD START TO. THIS BIT ALSO LOCKS OUT + ;MOST WAYS OF HACKING THE JOB (INCL. THOSE THAT SET DIELOK). + ;3.1-3.5 MUST BE ZERO + +DIELOK: 0 ;NUMBER OF JOBS LOOKING AT OR HACKING THIS JOB. + ;BEFORE KILLING A JOB, WAIT FOR ITS DIELOK TO BECOME 0. + +USTP: 0 ;0 RUNNABLE, (IS SET NON ZERO FOR IDLE SETS OF VARS TO SPEED SEARCH) +%UST==1,,537777 +%USTCM==400000 ;CORE BEING SHUFFLED (SHOULD ACTUALLY BE OBSOLETE). +%USTCJ==200000 ;CORE BEING GIVEN BY CORE JOB. +%USTSP==100000 ;STOPPED BY SUPERIOR +%USTCG==40000 ;STOPPED BY SUPERIOR TO GIVE IT CORE (CORBLK, OR .USET OF .MEMT). + +BCSTOP==400000 ;BIT IN USTP FOR CORE MOVAGE +BUCSTP==200000 ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER +BUSRC==100000 ;USER CONTROL BIT, SET & CLEARED BY SUPERIOR PROCEDURE +BSSTP==40000 ;SET BY SUPERIOR WHEN HACKING MEM BOUND AT URMEMT OR UMEMEX +;1.1-2.9 ;USED BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR + ;MUST BE MODIFIED WITH CLKOFF MUST NOT BE SET IF CSTOP IS SET + ;IS A COUNTER OF TRANSIENT REASONS FOR PROCEDURE BEING STOPPED + +PIRQC: 0 ;INT REQ AWAITING SERVICE (SOFTWARE INTS EFFECTED BY SEARCH) +MSKST: 0 ;INT MASK REGISTER FOR BITS IN PIRQC +IFPIR: 0 ;SECOND WORD OF INTERRUPT REQUESTS + ;3.8-3.1 INF PROC INT + ;2.7-1.1 IO CHANNEL INT + ;1.1= CHANNEL 0 +MSKST2: 0 ;INT MASK FOR IFPIR +IDF1: 0 ;DEFER BITS FOR 1ST WD INTERRUPTS. +IDF2: 0 ;FOR 2ND WORD INTERRUPTS. + ;IF AN INTERRUPT IS DEFERRED, IT IS TREATED AS + ;IF THE JOB'S PICLR VAR HELD 0. +PICLR: 0 ;INT IN PROGRESS FLAG, -1=>ENABLED, 0=>IN PROGRESS + +SUPPRO: 0 ;-1 => TOP LEVEL PROCEDURE + ;OTHERWISE: INT BIT,,PNTR TO SUPERIOR PROCEDURE + +FLSINS: 0 ;USER BLOCKING INSTRUCTION; STATE: + ; 0 => RUNABLE (UNLESS USTP .NE. 0) + ; OTHERWISE HUNG, IF NO SKIP SAFE TO RESTART AT UUO (UNLESS UFINAL .NE. 0) +RPCL: 0 ;0,,N RPCLSR'ING N + ;-1,,N BEING RPCLSR'ED BY N + +UNAME: 0 ;USER NAME + ;THIS WORD FOR EACH PROCEDURE IS COPIED FROM THE UNAME OF THE PROCEDURE + ;THAT CREATES IT (SEE USR DEV). FOR AN INITIAL TOP LEVEL PROCEDURE IT + ;IS INITIALLY -1 BUT IS MODIFIED BY ALOGIN. IT IS THE SAME FOR ALL + ;PROCEDURES IN A TREE. +JNAME: 0 ;JOB NAME + ;EACH LOGGED IN PROCEDURE HAS A UNIQUE UNAME, JNAME PAIR. THE JNAME + ;OF AN INITIAL TOP LEVEL JOB IS "HACTRN". FOR OTHER JOBS IT IS THE SECOND + ;FILE NAME SPECIFIED IN THE .OPEN ON THE USR DEVICE THAT CREATES THEM. +USYSNM: 0 ;USER SYSTEM NAME + ;THIS VARIABLE IS INITIALLY SET TO THE SAME VALUE AS UNAME FOR + ;A PROCEDURE. IT CAN BE READ OR WRITTEN BY THE PROCEDURE (ASUSET) + ;OR BY ITS SUPERIOR (AUSET). ITS ONLY USE IS AS THE DEFAULT THIRD FILE NAME ON + ;USER SHARED DEVICES (2311'S (SEE QSKO), AND CORE + ;LINK (SEE CLOO)). +USYSN1: 0 ;3RD NAME FOR QSKO, CLOO (AFTER DEFAULTING AND TRANSLATION) +HSNAME: 0 ;HOME SNAME + +IOTLSR: 0 ;4.9 IOT USER MOD (=1 ENABLES USER TO DO DIRECT I/O + ; INSTRUCTIONS) + ;RH VIRTUAL PAGE # OF LAST MPV, WIRO OR NXI (SHIFTED TO + ; ADDRESS SIZE) +UMARPC: 0 ;PC AT MAR INTERRUPT +LSWPR: 0 ;LOCKED SWITCH POINTER +UCLBLK: 0 ;CLOCK QUEUE BLOCK + -1 + JRST UREALB +URTIME: 0 ;LH=0=>LOW PRIORITY PHASE 1=> LOW PRIORITY WITH BLOCKING + ;LH=-1=>HIGH PRIORITY PHASE 2=> HIGH PRIORITY WITH BLOCKING + ;RH=LENGTH OF HIGH PRIOITY IN 60'THS +RTIMER: -1 ;POSITIVE => MICROSEC RUNTIME TILL RUNTIME INT + +LSPCL: 0 ;UPC AT LAST PCLSR,,DIFFERENT UPC AT PREVIOUS PCLSR +LEXFDR: 0 ;DEBUGGING INFO FOR PAGE FAULTS WHICH SIGNAL AN INTERRUPT + ; TO THE LOSER + ;LH FAULT BITS OF LAST SUCH FAULT + ;RH PC OF LAST SUCH FAULT THAT WAS FROM EXEC MODE (WENT TO + ; IOADCR) + ;PAGE FAULTS WHICH JUST SWAP IN A PAGE DON'T SET THIS. +LSUUO: 0 ;LAST SYS UUO (FOR DEBUGGING PURPOSE) +LSCALL: 0 ;SIXBIT NAME OF LAST .CALL 0, (FOR PEEK) +CTLBTS: 0 ;CTL BITS TO .CALL 0, XORED TOGETHER IN HERE (RIGHT HALF) +SYSCVL: 0 ;CONTROLS OUTPUT ARGS FROM SYSTEM .CALL + %SCV==1,,525252 + %SCVOT==400000 ;4.9 CALL HAS OUTPUT ARGS FLAG (TO SAVE TIME) + %SCVER==200000 ;4.8 CALL HAS ERROR CODE ARG FLAG + ;3.6-4.7 UNUSED 3.1-3.5 MUST BE ZERO + ;1.1-2.9 ADDRESS OF ERROR CODE ARG +IOTBTS: 0 ;DEVICE-INDEPENDENT IOT CONTROL BITS GO HERE, IN IOT AND SIOT +USTYN: 0 ;TTY NO OF THE STY WHICH THIS JOB KNOWS AS "STY:" (WITHOUT + ; NUMBER). +UUAC: 0 ;AC FLD OF LAST UUO OR DESIRED CHANNEL IN CASE OF NOPEN ETC + ;SELECTS CHNL FOR ALL IOTS, OPENS ETC + ;LH -1 IF STORED BY CHNDCD, ELSE ZERO (SEE WHO LINE ROUTINES) +TRMNAM: 0 ;TERMINAL IDENTIFICATION +TRNLST: 0 ;TRANSL LIST FOR THIS JOB. -1 => NIL, OR IDX INTO TRAN!X +TRNLS1: 0 ;TRANSL LIST FOR THIS JOB & INFERS. +UTRAPM:: ;SIGN BIT OF OPTIONS IS UUO-TRAP-TO-SUPERIOR MODE +OPTION: 0 ;OPTIONS WORD, SETTABLE BY USER + ;EACH BIT CONTROLS SOME SYSTEM ACTION FOR THIS JOB + .SEE %OP +XUNAME: 0 ;"WHO I REALLY AM" AS OPPOSED TO "WHO I AM LOGGED IN AS" +XJNAME: 0 ;JOB NAME USER SPEC'ED AS OPPOSED TO UNIQUIZED VERSION + +40ADDR: 20,,40 ;RH=ADDRESS OF USER'S 6-WORD BLOCK FOR UUO'S, INTS, SWITCHES, LOCKING. + ;LH=ADDRESS OF USER'S 20-WORD BLOCK FOR SUPERIOR'S USE. 0=20. +IFN N11TYS,[ +TVCREG: -1 ;TV CONSOLE REG FOR THIS USER OF -1 NONE +TVVBN: -1 ;-1 OR CONSOLE REG FOR RUN BLINKING +NVDBA: 0 ;# VIDEO BUFFERS ASSIGNED (WITH NVDBA SYSTEM CALL). +];N11TYS +UWHO1: 0 ;WHOLINE FLAGS +UWHO2: 0 ;TWO HALFWORDS, PRINTING CONTROLLED BY UWHO1 4.9-3.3 +UWHO3: 0 ;TWO MORE HALF WORDS, CONTROLLED BY UWHO1 3.2-1.5 +IFN KL10P,[ +ULSPBR: 0 ;STBR,,GCSTBR FOR SPECIAL LISP INSTRUCTIONS +] +SERVER: -1 ;User index of server job who is allowed write access to + ; this job to implement some oddball protocol. -1 if none. +;INSERT NEW USER VARIABLES HERE^ + +USRPDL: -LUPDL,,UPDL-1 ;USER PDL +UPDL: BLOCK LUPDL-1 +EPDL2: 0 ;SAVES C(T) FOR FLSINS +QLD: 0 ;LINK DEPTH +VALUE:: ;PROCEDURE "VALUE" RETURN +SRN3: 0 ;SAVED N3, N4 FOR RENAMES AT AOPEN ALSO USER INDEX AT NLOAD + ;SRN3, SRN4 USED BY CORBLK .CALL +.SEE IODCS2 ;SRN3 contains saved user mode PC for unlocking own locks. +.SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE SRN4 OR SRN5 +SRN4: 0 ;ALSO DEVICE CHNL IOCHNM POINTER AT NLOAD +SRN5: 0 ;SAVED N5 FOR LINK ALSO VIRTUAL PAGE NUMBER AT NLOAD +EPDL3: 0 ;USED BY 2311 ROUTINES (QFNG) ALSO QSMDN ADDR AT NLOAD ALSO BY TYOW2 +.SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE EPDL + ;FOR BP-STYLE RENAME, RENMWO AND MLINK, + ;HOLDS BP (OR BP BLK PTR) TO NAMES TO RENAME OR LINK TO. +EPDL: 0 ;USED BY 2311 ROUTINES. + ;FOR SOPEN AND BP-STYLE RENAME, DELETE, HOLDS BP OR BP BLOCK PTR. +EPDLT1: 0 ;FN1 BEFORE LAST TRANSLATION, USED BY NLOAD +EPDLT2: 0 ;FN2 " " " , USED BY NLOAD +EPDLT3: 0 ;SYS NAME " " " +EPDLT4: 0 ;LEFT ADJ DEVICE NAME " " " + +STTYOP: 0 ;IN THE TOP OF A DETACHED TREE, THIS CONTAINS THE SAVED USER TTY + ; OPTIONS. 2.9=1 IF IT IS VALID, 2.7-2.8 ARE QUERY AND REFUSE MODE, + ; THE REST ARE TTYOPT BITS. + +IFN 0,[ ;FAKE OUT @ +LSWB0: +] +REPEAT NULBLK,[ +CONC LSWB,\.RPCNT,: BLOCK 2 +] ;SWITCH BLOCK FORMAT + ;WD1 ASSOCIATED ADDRESS OR QUANTITY + ;3.6-3.1 USER NUMBER OF SWITCH HOLDER + ;2.9-1.1 PNTR TO NEXT SWITCH ON LIST OR 0 IF NONE + ;FOR REMAINDER OF FORMAT SEE LSWDIS + +IFN KL10P,[ +IFGE USRSTG+1000-., INFORM SPACE LEFT IN UPT,\1000-<.-USRSTG> +IFL USRSTG+1000-., .ERR USER VARS TOO BIG FOR UPT! +.ELSE LOC USRSTG+1000 +] ;IFN KL10P + +IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW) + +LUBLK==.-USRSTG +L==LUBLK +INFORM [STORAGE PER LOSER]\LUBLK + BLOCK LUBLK ;USER VARIABLES FOR CORE JOB +SYSB==<1777+.>_-10. +MXC==SYSUSB-SYSB ;AVAIL BLOCKS AFTER SYS+DDT + + SUBTTL TSS INITIALIZATION +;NEXT LINE COMMENTED OUT BECAUSE IT CAUSES MORE TROUBLE THAN IT SAVES +;.HKALL==1 ;(THE FOLLOWING CODE IS WIPED OUT AT ICLR) +EXEUMP=UPGMP+100 ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S PAGE TABLE + ;SYMBOL IS DEFINED HERE SINCE UPGMP WAS JUST DEFINED 6 PGS AGO + +BEG: SKIPN SALV ;SEE IF LOSER FORGOT TO LOAD SALV WHEN BUILDING SYSTEM, + ;OR SALV MEM IS NXM. EVIL! EVIL! + BUG AWFUL,[HEY! WHERE'S THE SALVAGER?] + JSR SALV+1 ;CALL NO-QUESTIONS-ASKED SALVAGER +GO: JFCL 17,.+1 + JRST .+1 + JFCL 1,[JRST 4,.] ;SYSTEM WONT RUN ON 6 +IFN KL10P,[ + CONSO PAG,600000 + SWPIA ;IF CACHE OFF, FLUSH CRUFT THAT MAY BE IN IT + CONSZ PAG,600000 + SWPUA ;IF CACHE ON, UPDATE CORE SO DDT IS GOOD + CONSZ 200000 + JRST .-1 + SPCCTX 0,1,USRSTG,DISABLE ;SET UP UPT ADDR, BUT NO ACCTING TILL + MOVEI T,0 ;MORE INIT IS DONE. + XCTR XBW,[BLT T,17] ;CLEAR BLK 1 TO AVOID RANDOM PARITY + ; ERRORS +] ;KL10P +IFN KS10P,[ + CONO 20700+APRCHN ; Clear memory related APR flags + ; (ECC, Bad, NXM) + MOVSI TT,%KEHLD+%KEREF+%KEPWR + IOWR TT,[KSECCS] ; Reset memory status register. + MOVEI TT,%UBTIM+%UBBAD+%UBPAR+%UBNXD+%UBINI + IOWRQ TT,UBASTA ; Reset both Unibus's and both adaptors. + IOWRI TT,UBASTA + MOVEI TT,DSKCHN_3 ; Set PI level for RH11. (No, you can't do + IOWRQ TT,UBASTA ; this at the same time you reset the Unibus.) + MOVEI TT,MTCCHN_3+TTYCHN ; PI for Tape, for Chaos and TTYs. + IOWRI TT,UBASTA + WRHSB [HSB] ; Set halt status block location. + CLRCSH ; Reset cache once for good measure. + SPCCTX 0,1,USRSTG ; Set up UPT and AC blocks. +] ;KS10P +IFN TEN11P,[ + MOVEI TT,600000+ + SKIPGE TEN11F + MOVEI TT,0 + DPB TT,[.T11CP+EXEUMP] + SETOM T11MP+_-10. ;DONT USE MAP PAGE AS 10-11 PAGE +;IFN PDP6P,[ ;THESE ARE IN SEPARATE MOBIES NOW +; MOVE TT,[-LPDP6M,,_-10.] +; SETOM T11MP(TT) ;CONFLICTS WITH PDP-6 MEM +; AOBJN TT,.-1 +;] +;IFG TSYSM-256.,[ +; MOVSI TT,-TSYSM+256. +; SETOM T11MP(TT) ;CONFLICT PAGES +; AOBJN TT,.-1 +;] +] + MOVE P,SYSPDP + +;INIT THE EXEC PAGE MAP'S DDT PAGES. + HRRZ A,DDT-2 ;LOWEST ADDR IN SYMBOL TABLE + SUBI A,100 ;LEAVE ROOM FOR EXTRA SYMS, 340 ROUTINES' LOSSAGE, ETC. + LSH A,-10. ;GET PAGE SYMTAB STARTS IN + MOVEM A,FDDTPG + MOVEI Q,NQS-1 ;PUT THE TUTS JUST BELOW THE DDT PAGES +BEGTT1: SKIPE QACT(Q) + JRST BEGTT3 ;UNIT NOT IN USE + MOVE T,NTBL(Q) ;NUMBER OF PAGES IN THIS TUT +BEGTT2: SUBI A,1 + MOVE B,[MU23TT_<.TZ .BM >] + MOVEM B,MEMBLT(A) + DPB Q,[MNUMB,,MEMBLT(A)] + SOJG T,BEGTT2 + MOVE B,A + LSH B,10. + HRLI B,640000 + MOVEM B,QTUTO(Q) +BEGTT3: SOJGE Q,BEGTT1 + MOVEM A,FTUTPG + ;NOW MAKE SURE ALL THOSE PAGES ARE MAPPED + MOVEI B,-200(A) ;ASSUMING TSYSM AT LEAST 128K + LSH B,-1 ;GET A B.P. TO IDPB MAP HWD OF 1ST DDT PAGE + ADD B,[442200,,EXEUMP] + TRNE A,1 + IBP B + MOVEI C,600000+PMCSHM(A) ;COMPUTE CONTENTS OF THAT MAP WORD. + MOVE D,[MUDDT_<.TZ .BM >] +BEG3: CAML A,FDDTPG + MOVEM D,MEMBLT(A) +IFG TSYSM-128., IDPB C,B + AOS C +IFG TSYSM-400, CAIE A,400 +.ELSE CAIE A,TSYSM ;STORE THAT MAP WORD AND ALL REST THERE ARE. + AOJA A,BEG3 + +;INITIALIZE REST OF EXEC PAGE MAP +IFN DIRMAP,[ + MOVE Q,[222200,,EXEUMP] + SETZB A,B + SKIPE USEMDM ;MAKE MEDIUM MEM NXM IF DIRMAP NOT TURNED ON + MOVEI B,600200+PMCSHM ;THIS MAY BE USEFUL FOR DEBUGGING + MOVE T,FTUTPG + SUBI T,201 ;STOP AT 1ST TUT PAGE. +BEG2: CAIL A,NEXPGS + DPB B,Q + IBP Q + ADDI B,1 + CAMGE A,T + AOJA A,BEG2 +];END IFN DIRMAP +;DROPS THROUGH + ;DROPS IN + +;SET UP EXEC LOWER MAP (EVEN ON KA, WILL BE LOOKED AT BY .CALL CORBLK) + MOVE A,[600000,,600001+PMCSHM] ;PAGE 0 IS NOT CACHED + MOVSI B,-100 + MOVEM A,EXELMP(B) + TLO A,PMCSHM + ADD A,[2,,2] + AOBJN B,.-3 + +;SET UP SYS JOB'S CIRCULAR POINTERS SO ALL THE PAGES IT HAS ARE ABSOLUTE + + MOVE A,[442200,,UPGMP] + MOVE B,[442200,,UPGCP] + MOVEI D,0 +BEG6: ILDB T,A + MOVEI E,-1 + JUMPN T,BEG7 + CAIL D,200+MMP0 ;ALLOW USERS TO COPY MMP EXEC PGS + CAILE D,200+NEXPGS + MOVEI E,0 ;PG IT DOESN'T HAVE, AND NOT COPYABLE EXEC PG +BEG7: IDPB E,B + CAIGE D,377 + AOJA D,BEG6 + +;EXEC MAP PREPARED, NOW TURN ON PAGING + +IFN KA10P,[ + LPMR UPGML + CONO 633550 +] ;KA10P +IFN KS10P,[ + CONO 67760 ; Disable and Clear all flags + CONO 127660 ; Enable and Clear all flags except memory ECC + APRID A + TLNN A,%UCITS + BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE] + LDBR3 EXEUMP ; Load exec DBRs. + LDBR4 EXELMP + LPMR UPGML + SPCCTX 1,1,USRSTG ; Select AC blocks and set UBR. + WREBR 020000+ ; Paging on and set EBR. +] ;KS10P +IFN KL10P,[ + CONO 327740 ;ENABLE AND CLEAR ALL FLAGS EXCEPT SWEEP DONE + APRID A + TLNN A,%UCITS + BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE] + SPCCTX 6,6 ;LOAD MICROCODE CONSTANTS NEEDED BY PAGEING INTO + ; BLOCK 6. + MOVEI 3,EXEUMP ;DBR3 + MOVEI 4,EXELMP ;DBR4 + MOVSI 5,PMAGEM ;LH.AGE + MOVEI 6,PMAGEM ;RH.AGE + MOVEI 7,1000 ;CN1000 + MOVEI 10,100 ;CN100 + CONO PAG,660000+ ;CACHE ON, ITS PAGER, TRAP ENB, EPT ADDR + SPCCTX 1,1,USRSTG,DISABLE + LPMR UPGML +] ;END IFN KL10P + MOVE P,SYSPDP + +;INITIALIZE FREE LISTS IN MEMBLT + + MOVEI A,1 ;A PG NO - NOTE: DON'T DO PAGE ZERO +BEGF0: CAML A,FTUTPG ;IF THIS ISN'T A DDT OR TUT PAGE, THEN + CAIL A,400 + PUSHJ P,CIMEMR ;PUT THIS PAGE ON THE RIGHT FREE LIST + CAIGE A,TSYSM-1 + AOJA A,BEGF0 +IFN TEN11P,[ + SKIPGE TEN11F + JRST BEG4 + MOVSI A,-256. ;CLEAR THE INTERFACE'S "VALID" BITS. + SETZM 400000+T11CP*2000(A) + AOBJN A,.-1 +BEG4:] +IFN XGP,[ + SKIPE TEN11F + JRST BEGX1 + MOVE A,[600000+,,1777] + PUSHJ P,T11AD + BUG ;NO 10-11 PAGES AVAILABLE? + MOVEI TT,600000+<_8>(B) ;GET CORRESP EXEC MAP PG SETUP + DPB TT,[.XGPC+EXEUMP] + MOVEI TT,600000+<_8>+XGPTP + DPB TT,[.XGPB+EXEUMP] ;SETUP PAGE FOR PDP-11 BUFFER +BEGX1:] + +;CHECK AVAIL MEM FOR EXISTANCE + +IFN ECCMEM,[ + LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON + IORI TT,200000 ;GRANT READ ACCESS + DPB TT,[.ECCPG+EXEUMP] + LPMR UPGML + MOVE A,400000+ECCPG*2000+1760 ;GET CURRENT HISTORY POINTER + LSH A,-32. + MOVEM A,ECCIDX +];ECCMEM + MOVEI A,TSYSM-1 +CKML: MOVEI TT,600000(A) + DPB TT,[.PAREP+EXEUMP] + LPMR UPGML +IFN ECCMEM,[ + LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON + CAMN A,TT ;THIS PAGE? + JRST CKML1A ;YES, TREAT AS IF OFFLINE, THOUGH WILL ACCESS IT + ; DIRECTLY FROM TIME TO TIME +] + MOVE TT,A + LSH TT,10. + MOVSI T,-8 + CAML TT,MEMLZL(T) + CAML TT,MEMLZH(T) + AOBJN T,.-2 + JUMPL T,CKML1A ;THIS BLOCK KNOWN TO BE LOSING + SKIPL USEHM + CAIGE A,256. + JRST .+2 + JRST CKML1A ;HIGH MOBY NOT TO BE USED +IFN KL10P,[ + MOVEI TT,CKML1 ;KL10 CAN GET PARITY FAULT ON REFERENCE TO NXM + MOVEM TT,PFNPC + HRRM TT,MUUOKN ;IT CAN ALSO GET A UUO +] ;KL10P +IFN KS10P,[ + MOVEI TT,CKML1 + MOVEM TT,EPTPFN +] ;KS10P + CAIL A,256. ;IF NOT IN BOTTOM 256K, DON'T ASSUME GOOD DATA + SETZM 400000+PAREP*2000+20 ;STORE ZERO SO DON'T GET PARITY ERROR + MOVE 0,400000+PAREP*2000+20 ;IF THIS NXMS, MEM THE SYS THINKS + ; IT HAS IS NON EXISTANT +IFN KA10P,[ + CONSZ 10000 + JRST CKML1 ;THAT MEM NXM +] ;KA10P +IFN KL10P,[ + MOVEI TT,PFAIL + MOVEM TT,PFNPC + MOVEI TT,UUOH0 + HRRM TT,MUUOKN + CONSZ 2000 + JRST CKML1 ;THAT MEM NXM +] ;KL10P +IFN KS10P,[ + MOVEI TT,PFAIL + MOVEM TT,EPTPFN + CONSZ 400 + JRST 4,. ; This can't happen, right? (If we got a NXM, we + ; would have trapped to CKML1 already.) +] ;KS10P + SKIPL CKMBLK ;WINS + JRST CKML6 ;THUS ENDING BLOCK OF LOSERS +CKML2: SOJGE A,CKML + AOSN CKMFLG ;ANY MEM OFF UNEXPECTEDLY? + JRST CKML5 ;NO + MOVEI TT,[ASCIZ/ +IS THIS OK? /] ;YES, MAKE SURE SOMEBODY KNOWS ABOUT IT. MAY BE SERIOUS SCREW. + PUSHJ P,T00ASZ + PUSHJ P,T00TYI + ANDI A,137 + CAIE A,"Y + JRST DDT + MOVEI TT,[ASCIZ/ +/] + PUSHJ P,T00ASZ ;CRLF +CKML5: +IFN KL10P,[ + CONO 26400 ;CLEAR ANY NXM AND PARITY INTERRUPTS + CONI MTS,TT + TLNN TT,400 + BUG PAUSE,[TAPE DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH] + CONI DSK,TT + TLNN TT,4000 + BUG PAUSE,[DISK DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH] +] ;KL10P +IFN KS10P, CONO 20400 ; Clear NXM flag +;DROPS THROUGH + ;DROPS IN + +IFN RP10P,[ + DATAI DPC,A + TLNN A,NOWRIH ;CHECK FOR FORMAT SWITCH ON RP10 + BUG PAUSE,[RP-10 WRITE HEADERS ENABLED, PLEASE FLIP THE SWITCH] +];RP10P + +IFE &,[ ;CHECK FOR LOSING SWITCHES ON MEMORY ON ML-KA AND DM + + MOVSI D,(DWRITC) ;MAKE COMMAND FOR VERY LAST BLOCK ON DISK + MOVEI A,NCYLS+XCYLS-1 + DATAO DPC,[DNOOPC] ;DETERMINE TYPE OF DRIVE 0 + DATAI DPC,B + TRNE B,RP03BT + MOVEI A,MCYLS+XCYLS-1 ;RP03 + DPB A,[DCYL D] + LSH A,-8 + DPB A,[DCYLXB D] + MOVEI A,NHEDS-1 + DPB A,[DSURF D] + ADDI D,QICWA + MOVEM D,CKMSWC + SUB D,[DWRITC-DREADC] + MOVEM D,CKMSRC + SUB D,[DREADC-DSEEKC] + MOVEM D,CKMSSC + MOVEI A,0 +CKMS1: LDB TT,[MUR,,MEMBLT(A)] ;MEM EXIST? + CAIE TT,MUFR ;AND NOT DDT? + JRST CKMS2 + MOVEI B,600000(A) + DPB B,[.PAREP+EXEUMP] + LPMR UPGML + CAIGE A,CKMSZZ ;MEM LOADED? + JRST CKMS3 ;YES + MOVSI B,'FOO ;NO, LOAD IT + MOVEM B,CKMSBF + MOVE B,[CKMSBF,,CKMSBF+1] + BLT B,CKMSBF+177 + MOVEI B,'BAR + HRRM B,CKMSBF+69. + HRRM A,CKMSBF+6 ;MAKE DIFF FROM OTHER SUCH PAGES + MOVEI C,1 + MOVE B,A + LSH B,-4 ;16K BLOCK # IN B + LSH C,(B) ;GET UNIQUE BIT SO PARITY ERR IF TWO AT SAME ADDR + MOVEM C,CKMSBF+35 + MOVE B,[CKMSBF,,400000+PAREP*2000] + BLT B,400000+PAREP*2000+177 +CKMS3: MOVE B,A ;MAKE IOWD + LSH B,10. + SOS B + HRLI B,-200 + LDB C,[100300,,A] ;MA 15-17 + TRC C,7 + DPB C,[410300,,B] + MOVEM B,QICWA + SETZM QICWA+1 + CONO DPC,175700 + DATAO DPC,CKMSSC ;POSITION HEADS + CONSO DPC,10 + JRST .-1 + DATAO DPC,CKMSWC ;WRITE OUT SECTOR + CONSZ DPC,20 + JRST .-1 + CONI DPC,B + TLNE B,17 + JRST CKMS4 ;CHANNEL ERROR MEM LOSING + TRNE B,177700 + JRST CKMS2 ;FOO, DISK LOSING + MOVE B,[-200,,CKMSBF-1] ;READ IT BACK + MOVEM B,QICWA + SETZM QICWA+1 + SETZM CKMSBF+69. + CONO DPC,175700 + DATAO DPC,CKMSRC + CONSZ DPC,20 + JRST .-1 + CONI DPC,B + TLNE B,17 + JRST CKMS2 ;MEM LOSS IN CKMSBF? + TRNE B,177700 + JRST CKMS2 ;FOO, DISK LOSING + MOVSI B,-200 ;COMPARE + MOVE C,CKMSBF(B) + CAME C,400000+PAREP*2000(B) + JRST CKMS4 ;NOT SAME SWITCHES LOSING + AOBJN B,.-3 +CKMS2: +IFE MCOND DM, ADDI A,16. ;MA10'S !! +IFE MCOND MLKA, ADDI A,32. ;ML-KA MEM IS IN 32K MODULES + CAIGE A,TSYSM + JRST CKMS1 + CONO DPC,175700 ;RESET THE DISK CONTROL + DATAO DPC,[DEASEC+776] ;AT EASE! + CONO PI,20000 ;TURN OFF IOB PI REQ LIGHT + JRST CKMSX ;DONE WITH THIS, CONTINUE INITIALIZATION + +CKMSBF: BLOCK 200 + +CKMS4: MOVEI TT,[ASCIZ/MEM ADDR SWITCHES DISAGREE CPU VS DSK AT LOC /] + PUSHJ P,T00ASZ + PUSHJ P,T00BKO + MOVEI TT,[ASCIZ/0000/] + PUSHJ P,T00ASZ + JRST DDT + +CKMSZZ==./2000+2 ;ABOVE HIGHEST CODE + +CKMSX: +] ;END IFE MCOND MLKA & DM + ;DROPS IN + MOVEI TT,0 + DPB TT,[.PAREP+EXEUMP] + LPMR UPGML +IFN KA10P, CONO PI,240000+11577+IFN C1MXP,20000 +IFE KA10P, CONO PI,11577 +IFN NOTYS, CONO TTY,TTYCHN +IFN NETYS,[ + SETOM DTEODN ;CAN GET SET ON WHILE LOADING, BUT INTR GETS LOST +IFE PDCLKP, CONO DTE,1170+APRCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL +IFN PDCLKP, CONO DTE,1170+TTYCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL +] ;END OF IFN NETYS +IFN E.SP,[ + CONO DIS,515330 ;RESET E&S + MOVEI TT,E.SPM + MOVEM TT,34 ;SET PAGER LOC (USED BY DSKDUMP) +] +IFN TM10B,[ + MOVEI TT,MIOWD + MOVEM TT,MICWA ;SETUP LOC FOR MEM CHAN TAPE +] +IFN RP10P+RH10P,[ + MOVEI TT,QIOWD + MOVEM TT,QICWA ;SETUP FOR DEC DISK CHANNEL +] +IFN ARMP, DATAO 760,[0] ;RESET LITE ON ARM +IFN DSDP, CONO DSDEV,10 ;RESET INT RQ FROM PDP10 +IFN RBTCP, CONO RBTCON,0 ;RESET TABLET + + MOVE A,DDT-2 ;PUT GLOBAL BLOCK HEADER AT BEGINNING + MOVE B,[SQUOZE 0,GLOBAL] + CAME B,(A) ;SEARCH FOR GLOBAL BLOCKS + AOBJN A,[ AOBJN A,.-1 + JRST BEGS1] + MOVE C,DDT-2 + MOVEI D,(C) + SUBI D,(A) ;GET ,,-#WDS BEFORE GLOBAL BLOCK + MOVSI D,(D) + ADDM D,1(A) ;GLOBAL BLOCK NOW LARGER + EXCH B,(C) ;EXCHANGE IT WITH FIRST SYM + MOVEM B,(A) + MOVE B,1(A) + EXCH B,1(C) + MOVEM B,1(A) +BEGS1: PUSHJ P,SBUBL + JUMPL J,BEGS1 ;KEEP SORTING UNTIL SYMS IN ORDER + MOVSI A,400000 + IORM A,DDT-1 + +; SORT THE UUO/SUSET/BIT SYMBOL TABLE BY VALUE + + MOVE E,[SYSYMB-SYSYME-1,,SYSYMB] + PUSHJ P,SBUBL0 + JUMPL J,.-2 + + MOVE A,[-LTSTB,,TSTB] +BEG1: MOVE B,(A) + MOVEI C,(B) + EQV C,(B) + AOBJN B,.-1 + MOVEM C,CKSUMS-TSTB(A) + MOVE B,(A) +CKXC2: MOVE C,(B) +REPEAT 36.,[ + IFL .RPCNT-18., TLNE C,400000_<-.RPCNT> + .ELSE TRNE C,400000_<18.-.RPCNT> + XORM B,CKXORS+.RPCNT +] + AOBJN B,CKXC2 + AOBJN A,BEG1 + HRRZS 37 ;MAKE SURE SYS DOESNT IMMEDIATELY COME DOWN +;DROPS THROUGH + ;DROPS IN + MOVEI A,0 + CLEARM QACTB +QSETUP: MOVE B,DCHBT(A) + SKIPN QACT(A) + IORM B,QACTB + CAIGE A,NQS-1 + AOJA A,QSETUP +IFN DC10P, CONO DC0,DCCSET+DCDENB+DSKCHN ;RESET 2314 AND SET DATA ERROR ENABL +IFN 340P, CONO DIS,100 +IFN TK10P, CONO NTY,TTYCHN +IFN MTYP, CONO MTY,TTYCHN + CLEARM USRHI + CLEARB U,USER + MOVE P,SYSPDP +IFN DPKPP,[ + CONO DPK,400070+TTYCHN ;INITIALIZE DP KLUDGE + DATAO DPK,[4,,DPKBAS] + MOVE T,[-NDPTYS,,NFDPTY] + MOVEI B,0 ;LINE # +DPIL: LDB A,[$TTOSP,,TTYTYP(T)] ;OUTPUT SPEED + MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE + DPB B,[140400,,A] ;LINE # + CONO DPK,500+TTYCHN(A) ;LOAD OUT SPEED + LDB A,[$TTISP,,TTYTYP(T)] ;INPUT SPEED + MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE + DPB B,[140400,,A] + CONO DPK,700+TTYCHN(A) ;LOAD IN SPEED + AOS B + AOBJN T,DPIL +] +IFN DZ11P,[ + PUSHJ P,DZINIT +];DZ11P +IFN N11TYS,[ + SKIPE TEN11F + JRST BEG5 + MOVSI R,-NTTPG-NTVBP+1 + MOVE T,[.TTPG0+EXEUMP] +BEG9: MOVEI A,(R) ;SET UP 1 MORE TEN-11 MAP ENTRY + LSH A,20. + IORI A,1777 ;A FULL PAGE + TLO A,600000+TT11NM*400 + PUSHJ P,T11AD + BUG + ADDI B,600000+<_8> ;READ-WRITE, IN HIGH MOBY. + DPB B,T + IBP T + AOBJN R,BEG9 + MOVE A,[(600000+TT11NM*400)TT11CR_8] ;POINTER TO CONSOLE REG + PUSHJ P,T11AD + BUG + ADDI B,600000+<_8> + DPB B,T + LPMR UPGML + SKIPE TT11P ;IF WE'RE SUPPOSED TO USE THE TV 11, + SETZM TT11UP ;REQUEST IT TO RE-INIT. + ;IF TT11UP BECOMES NONZERO, THE 11 IS UP. +BEG5: ];END IFN N11TYS +IFN CH11P,[ + XCTRI [IORDI A,CAIMYN] + CAIA + BUG HALT,[CHAOSNET INTERFACE NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS)] +] ;CH11P +IFN CHAOSP,[ IFN T11CHP,[ + SKIPE TEN11F ;SET UP TEN-11 CHAOS NET INTERFACE PAGE + JRST BEG8 + MOVE A,[(600000+CH11NM*400)1004_8+1777] + PUSHJ P,T11AD + BUG + ADDI B,600000+<_8> + DPB B,[.CHSPG+EXEUMP] +BEG8: ]] ;CHAOSP, T11CHP +IFN DL10P,[ ;INITIALIZE DL10 + CONO DLC,400000 ;MR CLR + CONO DLB,1 ;TURN OFF EXCESS LIGHTS + CONO DLB,2 ;.. + CONO DLB,3 ;.. + CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR + DATAO DLC,[200001,,] ;KA INTERRUPT MODE + SKIPE DL10F + CONO DLC,100020+TTYCHN ;ENB PDP11 PORT #0 AND ENB INTR + MOVSI T,1 + SKIPN DL10UP + SOJG T,.-1 + SKIPGE T ;IF THE 11 DIDN'T SAY IT WAS UP, + SETZM DL10F ;MARK IT NON-FUNCTIONAL. +] +IFN KL10P,[ + CONO TIM,460000+3900. ;SET INTERVAL TIMER TO 39 MILLISECONDS FOR OVHMTR + CONO MTR,433001 ;TIME BASE ON, ACCOUNT FOR USER + EXEC NO PI, INTERVAL PIA=1 + PUSHJ P,PRFOFF ;INIT PERFORMANCE COUNTER +] ;KL10P + +;DROPS IN + MOVSI T,%TBNOT+%TBDTY+%TBNVR ;SYS JOB HAS NO CONSOLE ALL TO ITSELF + MOVEI U,LUBLK + PUSHJ P,USSINI ;INITIALIZE SYS JOB VARIABLES BLOCK + JRST .-1 + AOS NMPGS +IFE KA10P,[ + MOVEI T,UUOH0 ;CLOBBERED BY USSINI + HRRM T,MUUOKN +] ;IFE KA10P + MOVSI T,600000 + HLLM T,UPGMP ;GIVE PG 0 TO SYS JOB + MOVSI T,-1 + HLLM T,UPGCP + MOVEI T,2000 + MOVEM T,HUSRAD + MOVEI T,SYSRCE ;SET SYS JOB RESOURCE POINTER + MOVEM T,UTMPTR + MOVSI A,(SIXBIT /SYS/) ;""" NAMES + MOVEM A,USYSNM(U) + MOVEM A,UNAME(U) + MOVEM A,XUNAME(U) + MOVEM A,JNAME(U) + MOVEM A,XJNAME(U) + SETZM USTP(U) + MOVSI T,%TBNOT+%TBDTY+%TBNVR ;CORE JOB HAS NO CONSOLE + MOVEI U,2*LUBLK + PUSHJ P,USSINI ;SET UP CORE JOB VARIABLES BLOCK + JRST .-1 + MOVE A,[SIXBIT /CORE/] + MOVEM A,USYSNM(U) + MOVEM A,UNAME(U) + MOVEM A,XUNAME(U) + MOVSI A,(SIXBIT /JOB/) + MOVEM A,JNAME(U) + MOVEM A,XJNAME(U) + MOVEI T,SYSRCE + MOVEM T,UTMPTR+LUBLK + SETZM USTP(U) + MOVEI A,CORJI +IFE KA10P, HRLI A,%PSPCU ;DOES CORE JOB XCTR? + MOVEM A,UPC(U) +IFE KA10P,[ + MOVE T,[JSR ILLTRP] ;SYS AND CORE JOBS SHOULDN'T TRAP + MOVEM T,TR1INS ;THESE WON'T BE USED ANYWAY UNLESS + MOVEM T,TR2INS ;SOMEDAY THEY SHOULD RUN IN USED MODE + MOVEM T,TR3INS + MOVEM T,TR1INS+L + MOVEM T,TR2INS+L + MOVEM T,TR3INS+L +] ;IFE KA10P + MOVEI A,SYSB+2 ;GIVE SYSTEM CORE TO SYS JOB, WITH A COUPLE + MOVEM A,CORRQ ; SPARE JOB SLOTS + AOS NCORRQ + SOS A + ADDM A,NCBCOM +; DATAI CLK1,LCLK1 + CONO PI,100+UTCON-1 ;ALL EXCEPT 7 +IFN KA10P, CONO 3000+APRCHN +IFN KL10P,[ +IFN PDCLKP, CONO CLK,APRCHN +.ELSE [ MOVEI A,%DTCLN ;TURN ON 60-CYCLE CLOCK + MOVEM A,DTECMD + SETZM DTEFLG + CONO DTE,%DBL11 + SKIPN DTEFLG + JRST .-1 +] + CONO APRCHN ;ENABLE APR FAULT INTERRUPTS + SWPUA ;UPDATE MEMORY AGAIN TO MAKE SURE DDT + SYMBOL + ; TABLE OUT OF CACHE + CONSZ 200000 + JRST .-1 +] ;KL10P +IFN KS10P,[ + WRINT [KSFREQ] ; 60 cycle clock. + CONO APRCHN ; Enable APR faults and clock ints. + CLRCSH ; Is this necessary? What the heck... +] ;KS10P +IFN CH10P,[ + CONI CHX,T ;CHECK CHAOS ADDRESS SWITCHES + LDB T,[$CHXAD,,T] + CAIE T,MYCHAD + JRST [ MOVEI TT,[ASCIZ/CHAOSNET ADDRESS SWITCHES ARE SET WRONG/] + PUSHJ P,T00ASZ + JRST DDT ] + CONO CHX,@CHXCNO ;ENABLE INTERRUPTS +];CH10P + JRST ICLR + +CKML1: ;MEM NON-EXISTANT PATCH OUT +IFN KA10P, CONO 10000 ;TURN OFF NXM FLAG +IFN KL10P,[ + CONO 22000 + MOVEI TT,PFAIL + MOVEM TT,PFNPC + MOVEI TT,UUOH0 + HRRM TT,MUUOKN +] ;KL10P +IFN KS10P,[ + CONO 20400 + MOVEI TT,PFAIL + MOVEM TT,EPTPFN +] ;KS10P + SKIPGE CKMBLK + MOVEM A,CKMBLK ;HIGHEST IN BLOCK OF LOSERS +CKML1A: LDB TT,[MUR,,MEMBLT(A)] + CAIE TT,MUFR + BUG ;? + CAIG A,SYSB+1 + JRST 4,. ;SYS MEM NON EX? (BUG PROBABLY WON'T WORK) + PUSHJ P,MPOUT2 ;FLUSH THAT BLOCK + MOVEI TT,MUHOLE + DPB TT,[MUR,,MEMBLT(A)] + CAIL A,400 ;IF NXM IN LOW MOBY + JRST CKML2 + MOVEI U,0 + PUSHJ P,UPLC + LDB TT,T + ANDI TT,PMRCM + CAIE TT,(A) + JRST CKML2 + DPB U,T ;PATCH THIS BLOCK OUT OF EXEC MAP + DPB U,Q + JRST CKML2 + +; REPORT A BLOCK OF LOSING MEMORY + +CKML6: PUSH P,A + MOVEI TT,[ASCIZ/MEM OFF /] + AOSN CKMFLG + PUSHJ P,T00ASZ + ADDI A,1 ;LOWEST LOSER = HIGHEST WINNER + 1 PAGE + PUSHJ P,T00BKO + MOVEI A,"- + PUSHJ P,T00TYO + MOVE A,CKMBLK + PUSHJ P,T00BKO + MOVEI A,40 + PUSHJ P,T00TYO + SETOM CKMBLK + POP P,A + JRST CKML2 + +USEHM: -1 ;-1 => USE MEM IN HIGH MOBY (IF PRESET) + +CKMBLK: -1 ;IF + HIGHEST LOSING BLOCK IN CONTIG RANGE +CKMFLG: -1 ;IF + PRINTED MESSAGE ALREADY +CKMSWC: 0 ;WRITE CMD +CKMSRC: 0 ;READ CMD. +CKMSSC: 0 ;SEEK CMD. +;UP TO 8 RANGES OF ADDRESSES THAT SHOULD NOT BE USED BECAUSE THEY +;DON'T WORK BUT AREN'T NXM. +MEMLZL: BLOCK 8 ;LOWEST LOC +MEMLZH: BLOCK 8 ;HIGHEST LOC+1 +FTUTPG: 0 ;FIRST PAGE USED FOR TUTS + +;INPUT CHAR FROM CONSOLE TTY AND ECHO + +T00TYI: +IFN KA10P,[ + CONSO TTY,40 + JRST .-1 + DATAI TTY,A + ANDI A,177 +] ;KA10P +IFN KL10P,[ + SETZM DTEFLG + MOVEI A,%DTTYI + MOVEM A,DTECMD + CONO DTE,%DBL11 + SKIPN DTEFLG + JRST .-1 + SKIPN A,DTEF11 + JRST T00TYI +] ;KL10P +IFN KS10P,[ + SKIPN A,8CTYIN + JRST .-1 + ANDI A,177 +] ;KS10P + +; TYPE CHAR IN A ON CONSOLE TTY + +T00TYO: +IFN KA10P,[ + CONSZ TTY,20 + JRST .-1 + DATAO TTY,A +] ;KA10P +IFN KL10P,[ + SETZM DTEFLG + MOVEM A,DTECMD + CONO DTE,%DBL11 + SKIPN DTEFLG + JRST .-1 +] ;KL10P +IFN KS10P,[ + PUSH P,A + ANDI A,177 + IORI A,400 + MOVEM A,8CTYOT + CONI A + IORI A,80INT + CONO (A) + SKIPE 8CTYOT + JRST .-1 + POP P,A +] ;KS10P + POPJ P, + +; TYPE BLOCK NO IN A AS HIGH 3 OCTAL DIGITS OF ADDR +; (ALL MEMORIES MULTIPLE OF 4K. MAX MEMORY 2M WORDS.) + +T00BKO: PUSH P,A + PUSH P,B + LSHC A,-8 +REPEAT 3,[ + ADDI A,"0 + PUSHJ P,T00TYO + MOVEI A,0 + LSHC A,3 +] + JRST POPBAJ + +; TYPE ASCIZ IN TT ON T00 + +T00ASZ: PUSH P,A + HRLI TT,440700 +T00AZ1: ILDB A,TT + JUMPE A,POPAJ + PUSHJ P,T00TYO + JRST T00AZ1 + +IFN DPKPP,[ ;MAP SYSTEM SPEED CODES TO DATAPOINT KLUDGE CODES +DPSP: 0_9 ;134 + 1_9 ;600 + 2_9 ;110 + 3_9 ;150 + 4_9 ;300 + 5_9 ;1200 + 5_9 ;1800 * + 6_9 ;2400 + 7_9 ;4800 +REPEAT 20-<.-DPSP>, 7_9 ;FAST * +];DPKPP + +CONSTANTS +VARIABLES + +IEND: +.HKALL==0 + +; Define location known as start of SALV disk salvager. If system overruns +; this address, must either reduce system size or increase the SALV start +; address. If SALV is changed, the SALV program must also be changed to +; start at the right place. There is a limit to how high it can go, +; however. +IFN KL10P, SALV==:105*2000 ; MC-KL is getting huge +.ELSE SALV==:100*2000 +IFG IEND-SALV,.FATAL System overruns SALV start addr! + +IFGE TSYSM-256.,DDT=774000 +.ELSE DDT=TSYSM*2000-4000 +DSKDMP==DDT+3700 + +IFG LBUGTB-LBUGT2,[ +.ERR MAKE THE BUGTAB BIGGER +INFORM LBUGTB-LBUGT2,\LBUGTB-LBUGT2 +.FATAL FATAL ERROR, RUNNING THIS WOULD CAUSE TOTALLY WEIRD BUGS +] + +IF2 EXPUNGE FOO,ZZZQ,FNM,ZCHR,ZZ,ZZZ,BUGB,BUGF,BUGN,BUGNN + +END BEG ;START AT BEG TO SALVAGE AND RUN ITS, START AT GO TO JUST ITS