Trailing-Edge
-
PDP-10 Archives
-
tops10_704_monitoranf_bb-x140c-sb
-
10,7/mon/rttrp.mac
There are 11 other files named rttrp.mac in the archive. Click here to see a list.
TITLE RTTRP - REAL TIME TRAPPING ROUTINES - V150
SUBTTL P. HURLEY/PFC/JE/TS/JAD 19-APR-88
SEARCH F,S
$RELOC
$HIGH
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1973,1988>
XP VRTTRP,150
; PETER M HURLEY MAY 13, 1970
;RTTRP IS A COMPLETELY REENTRANT UUO CALLABLE
;FROM ALL PI LEVELS TO CHAIN AND UNCHAIN DEVICES
;ONTO THE MONITOR DEVICE CHAINS.
;IT ALSO PROVIDES THE CAPABILITY OF ALLOWING AN
;INTERRUPT FROM ANY DEVICE TO TRANSFER PROGRAM
;CONTROL TO A USER PROGRAM AT INTERRUPT LEVEL
;IN RESPONSE TO THAT INTERRUPT.
;RTTRP TAKES CARE OF ALL CONTEXT SWITCHING WHICH
;IS NECESSARY AND CHANGING THE RELOCATION AND
;PROTECTION REGISTER, THUS PERMITTING MORE THAN
;ONE JOB AT A TIME TO BE CONTROLING DEVICES ON THE
;INTERRUPT LEVELS WITHOUT STOPPING TIME SHARING.
ENTRY RTTRP
; RIGHT HALF OF S - ERROR BIT DEFINITIONS
E35==1B35 ;PI CHANNEL NOT AVAILABLE, USED BY MONITOR FOR BLKI/O
E34==1B34 ;PI CHANNEL NOT CURRENTLY AVAILABLE FOR BLKI/O
E33==1B33 ;TRAP ADDRESS OUT OF BOUNDS
E32==1B32 ;ERROR ADDRESS OUT OF BOUNDS
E31==1B31 ;BLKADR OR POINTER WORD OUT OF BOUNDS
E30==1B30 ;SYNTAX ERROR IN FORMAT, NO CONSO OR BLKI/O INSTRUCTION
E29==1B29 ;NO MORE RT BLOCKS LEFT
E28==1B28 ;JOB NOT LOCKED IN CORE
E27==1B27 ;ILLEGAL AC USED AT INTERRUPT LEVEL CALL
E26==1B26 ;DEVICE ALREADY IN USE BY ANOTHER JOB
E25==1B25 ;JOB SET TO RUN ON CPU1 ONLY - TEMPORARILY NOT SUPPORTED
E24==1B24 ;JOB DOES NOT HAVE PRIVILEGES
E23==1B23 ;NON-EXISTANT CPU SPECIFIED
;LEFT HALF OF S BIT DEFINITIONS
INDBIT==1 ;INDIRECT BIT SET IN CONSO INSTRUCTION
CNSO==2 ;CONSO INSTRUCTION
RTINT==4 ;UUO ENTERED FROM INTERRUPT LEVEL
BLKIO==10 ;BLKI/O TO GO ON CHANNEL
NOREM==20 ;DO NOT REMOVE DEVICES FROM CHAINS BEFORE LINKING
; ANOTHER DEVICE ONTO THE CHAIN
NOSAV==40 ;EXEC MODE TRAPPING, DON'T DO CONTEXT SWITCH
VECTOR==100 ;DEVICE INTERRUPTS BY EXECUTING AN INTERRUPT VECTOR
EPTREL==200 ;INTERRUPT INSTRUCTION IS TO BE STORED RELATIVE TO THE EPT
;.CPRCT LEFT HALF BIT DEFINITIONS
BLKENB==1 ;BLKI/O INSTRUCTIONS ALLOWED ON THIS CHANNEL
BINUSE==2 ;BLKI/O INSTRUCTION IN USE PRESENTLY ON THIS CHANNEL
BLKSAV==4 ;BLKI/O INSTRUCTION BEING REPLACED BY ANOTHER BLKI/O
BLKAVL==400000 ;CHANNEL CAN CURRENTLY BE USED FOR BLKI/O
;*** MUST BE SIGN BIT
REPEAT 0,<
;AC DEFINITIONS - *** CHANGED TO STANDARD ON JUNE 1, 1971
IWD=U ;BLKI/O IOWD
BLK=F ;BLKI/O INSTRUCTION
RTB=T4 ;RT BLOCK BASE ADDRESS
PIAC=P1 ;PI CHANNEL NUMBER
TRP=P2 ;TRAP ADDRESS
INS=W ;CONSO INSTRUCTION
ENB=M ;ENABLE BITS
RTUUO=17 ;THESE TWO AC'S CANNOT BE USED IN CALLS FROM INTERRUPT LEVEL
RTUUO1=16 ;RTUUO CONTAINS USER PC, AND RTUUO1 IS A SCRATCH
>
;OTHER DEFINITIONS
RTUUON==57 ;UUO CALLI NUMBER
RTUSE==1000 ;REAL TIME BLOCK IS BEING USED
VECUSE==2000 ;RTBLK IN USE BY A VECTOR INTERRUPT DEVICE
; NOT ON THE CONSO CHAIN
WAKUUO==73 ;WAKE UUO CALLI NUMBER
JSRMOD==1 ;DO JSR TO TRPADR WITH NO CONTEXT SWITCH
VTRMOD==2 ;IF DEVICE DOES VECTORED INTERRUPTS
EPTMOD==4 ;IF THE INTERRUPT JSR INSTRUCTION IS TO BE STORED RELATIVE
; TO THE EPT
;REAL TIME BLOCK DEFINITIONS AND FORMAT
$PHASE (0) ;OFFSETS IN REAL TIME BLOCK
BLOCK 3 ;FOR XPCW
RTCNSO:!BLOCK 1 ;CONSO DEV,BITS ;CHAIN INSTRUCTION
RTJRST:!BLOCK 1 ;JRST NXTDEV ;CONTINUE ON IN CHAIN
RTBLKO:!BLOCK 1 ;BLKO DEV,POINTR ;IF NO BLKI/O THEN JRST .+3
RJRST1:!BLOCK 1 ;JRST .+2 ;BLKI/O COUNTED OUT
RTJEN:! BLOCK 1 ;JEN @CHN ;DISMISS INTERRUPT
RTJSR:! BLOCK 1 ;JSR SAV'PI ;SAVE THE AC'S
RTJSP:! BLOCK 1 ;JSP J,TRPGO ;SAVE THE STATE OF THE MACHINE
TABST:!
ENBTAB:!BLOCK 1 ;APR CONO BITS
RELTAB:!BLOCK 1 ;RELOCATION-PROTECTION TABLE
UENBTB:!BLOCK 1 ;USER APR INTERRUPT ENABLE BITS
TRPTAB:!BLOCK 1 ;USER TRAP ADDRESS
JADRTB:!BLOCK 1 ;JBTADR VALUE FOR THIS JOB
APRTAB:!BLOCK 1 ;XWD R, APRTRP
JOBTB:! BLOCK 1 ;XWD DEV CODE, JOB #
PITAB:! BLOCK 1 ;XWD 0,PI CHANNEL
DISMTB:!BLOCK 1 ;JRST CHAND'PI
RTBSIZ::! ;REAL TIME BLOCK SIZE
$DEPHASE
ENBTB1==:ENBTAB-TABST
RELTB1==:RELTAB-TABST
UENBT1==:UENBTB-TABST
TRPTB1==:TRPTAB-TABST
JADRT1==:JADRTB-TABST
APRTB1==:APRTAB-TABST
JOBTB1==:JOBTB-TABST
PITB1==:PITAB-TABST
DISMT1==:DISMTB-TABST
IFN ENBTB1,<PRINTX ENBTAB MUST BE THE FIRST ENTRY IN TABLE>
MRELTB==:-RELTAB
;DESCRIPTION OF TABLES USED BY RTTRP
;JBTRDT = COUNT OF REAL TIME DEVICES ON INTERRUPT SYSTEM FOR EACH JOB
;JBTRTD IS INDEXED BY JOB NUMBER
;.CPRCU = COUNT OF REAL TIME DEVICES ON EACH PI CHANNEL
;.CPRCU IS INDEXED BY PI NUMBER MINUS 1
;.CPRCT = XWD STATUS,CH'PI
;STATUS DESCRIBES STATE OF CHANNEL IE BEING USED BY BLKI INSTRUCTION
;CH'PI IS THE ADDRESS OF THE CHANNEL ROUTINE FOR THAT LEVEL
;.CPRCT IS INDEXED BY PI NUMBER MINUS 1
;.CPRDT = XWD JSRADR,DISMIS ADR
;JSR ADR = ADDRESS OF CHANNEL ROUTINE TO SAVE THE AC'S
;DISMIS ADR IS THE ADDRESS OF CHANNEL DISMISS ROUTINE
;.CPRDT IS INDEXED BY PI NUMBER MINUS 1
;.CPRIT = C(CH'PI+1)
;THIS IS USED TO RESTORE THE PI CHAINS TO ORIGINAL
;STATE DURING A 140 OR A 143 RESTART
;.CPRIT IS INDEXED BY PI NUMBER MINUS 1
;RTTRP IS THE ENTRY POINT FROM UUOCON DURING A CALL
;FROM A USER ON LEVEL 8 (I.E. NORMAL TIME SHARING).
;RTTRP1 IS THE ENTRY POINT FROM A UUO GIVEN FROM
;A PROGRAM RUNNING AT PRIORITY INTERRUPT LEVEL
;J = JOB #
;R = JBTADR(J)
;T1 = CONTENTS OF UUO AC
;RTUUO= RETURN ADDRESS IF ENTERED FROM INTERRUPT LEVEL
RTTRP:: PUSHJ P,SAVE3## ;SAVE P1-P3
PUSH P,M ;SAVE THE UUO AC
SETZ S, ;INITIALIZE FLAG REGISTER
MOVE T2,JBTPRV##(J) ;GET USER PRIVILEGE BITS
TLNN T2,PVRTT ;DOES THE USER HAVE THE PROPER PRIVILEGES
TRO S,E24 ;NO, SET THE ERROR BIT
IFN FTLOCK,< ;LOCK UUO FEATURE?
PUSHJ P,LOKCHK## ;JOB LOCKED IN CORE?
SKIPA ;YES, OK FOR THE MOMENT (CHECK EVM LATER)
>
TRO S,E28 ;NO, SET ERROR BIT
PUSHJ P,GETTAC## ;SET UP T1 AGAIN
;HERE AT INTERRUPT LEVEL TO DO RTTRP UUO
RTTRP1: HRRZS P2,T1 ;ADDRESS OF ARG LIST & ZERO IDX & INDIRECT BITS
MOVS U,R ;GET LENGTH OF USER LOW SEGMENT
CAILE P2,JOBPFI## ;IS ADR ABOVE PROTECTED AREA
CAILE P2,(U) ;YES, IS ADR BELOW TOP OF USER AREA
JRST [CAIL P2,(P1) ;VALID AC?
JRST ERR30 ;NO
JRST .+1] ;YES
EXCTUX <HLRE P1,@T1> ;PICK UP PI CHANNEL #
LDB W,[POINT 3,P1,26];CPU NUMBER
JUMPGE P1,[TLO W,(1B0) ;IS THIS A REGULAR RTTRP CALL
JRST RTTRP2]
TRNN P1,(17B5) ;NEGATIVE PI LEVEL (OLD-STYLE CALL)?
TRZA P1,(577B8) ;NO, CLEAR CPU NUMBER FIELD/SIGN BIT AND SKIP
TLOA W,(1B0) ;REMEMBER THIS IS AN OLD-STYLE CALL AND SKIP
TRZE P1,(1B1) ;"NO REMOVE" FLAG OR -VE PI LEVEL?
TLO S,NOREM ;NOTE THAT NO DEVICES ARE TO BE REMOVED
TRNE P1,(17B5) ;NEGATIVE PI LEVEL?
MOVMS P1 ;NO, GET POSITIVE PI LEVEL
HRRZS P1
TLNE S,NOREM
JUMPE P1,ERR30
RTTRP2: CAIG W,M.CPU##-1 ;LEGAL CPU OR OLD STYLE CALL?
JRST RTTRP3 ;YES
TRO S,E23 ;NO, INDICATE NON-EXISTANT CPU
JRST ERROR ;AND DON'T TRY TO RESCHEDULE ONTO THAT CPU
RTTRP3:
IFN FTMP,<
PUSH P,T1 ;SAVE ADDRESS OF ARG BLOCK
JUMPGE W,RTTR3A ;OK IF CPU SPECIFIED
PUSHJ P,CHKCPU## ;FOR OLD CALLS, USE ONLY 1 CPU
TRO S,E25 ;NOT "ONLY" ON A CPU
MOVE W,T1 ;REMEMBER CPU WE ARE LOCKED ON
RTTR3A: MOVE T1,W ;CPU NUMBER WHERE DEVICE IS
TLNN S,RTINT ;AT INTERRUPT LEVEL?
PUSHJ P,ONCPUN## ;NO, GET ON THE PROPER CPU
POP P,T1 ;RESTORE ARG POINTER
CAMN W,.CPCPN## ;ON THE PROPER CPU?
JRST RTTRP4 ;YES
TRO S,E25 ;NO, INDICATE ERROR IN CPU SPEC
JRST ERROR ;AND DON'T CONTINUE
RTTRP4:
>
JUMPE P1,REMOVE ;IF NO PI CHANNEL THEN REMOVE DEVICE
CAIGE P1,7 ;IS PI OUT OF BOUNDS
SKIPN .CPRCT##-1(P1) ;IS CHANNEL LEGAL FOR RTTRP USE
TRO S,E35 ;NO, SET ERROR BIT
EXCTUX <HRRZ P2,@T1> ;GET TRAP ADDRESS
CAILE P2,JOBPFI## ;IS THIS ABOVE THE PROTECTED AREA?
CAILE P2,(U) ;IS THIS LESS THAN TOP OF CORE AREA?
TRO S,E33 ;NO, SET PROPER ERROR BIT
HRRI T1,1(T1) ;MAKE T1 POINT TO NEXT ARGUMENT
EXCTUX <HRRZ M,@T1> ;GET APR TRAP ADDRESS
CAILE M,JOBPFI## ;IS IT ABOVE PROTECTED AREA
CAILE M,(U) ;AND BELOW TOP OF CORE AREA?
TRO S,E32 ;NO, SET ERROR BIT
EXCTUX <HLL M,@T1> ;GET LEFT HALF OF SECOND WORD
TLNE M,JSRMOD ;IS THIS AN EXEC MODE TRAPPING REQUEST
TLO S,NOSAV ;YES, REMEMBER IT
TLNE M,VTRMOD ;WAS VECTORED INTERRUPT MODE SPECIFIED?
TLO S,VECTOR ;YES, REMEMBER THAT
TLNE M,EPTMOD ;INTERRUPT INSTRUCTION TO BE STORED RELATIVE TO THEE EPT?
TLO S,EPTREL ;YES, REMEMBER THAT
HRRI T1,1(T1) ;T1 NOW POINTS TO THIRD ARGUMENT
EXCTUX <HLRZ T2,@T1> ;PICK UP INTERRUPT INSTRUCTION
TRZ T2,77400 ;ZERO OUT DEVICE CODE
TRZE T2,17 ;INDEX FIELD SHOULD ALSO BE ZERO
TRO S,E30 ;IT ISN'T, SET ERROR BIT
TRZE T2,20 ;IS THE INDIRECT BIT ON
TLO S,INDBIT ;YES, NOTE THAT FACT
CAIE T2,(CONSO) ;IS THIS A CONSO INSTRUCTION?
JRST BLKINS ;NO, TRY FOR BLKI/O INSTRUCTION
;FALL THROUGH TO NEXT PAGE
TLO S,CNSO ;MARK THAT THIS IS A CONSO INSTRUCTION
TLNN S,INDBIT ;IS THIS AN INDIRECTION CALL
JRST RTTRP5 ;NO
EXCTUX <HRRZ T2,@T1> ;YES, PICK UP INSTRUCTION
CAILE T2,JOBPFI## ;CHECK IF IT IS IN BOUNDS
CAILE T2,(U) ;ABOVE LOWER LIMIT AND BELOW UPPER LIMIT?
TRO S,E30 ;NO, SET ERROR BIT
RTTRP5: EXCTUX <MOVE P3,@T1> ;PICK UP INSTRUCTION AGAIN
TLNE S,INDBIT ;IS THE INDIRECT BIT SET
ADDI P3,(R) ;YES, RELOCATE ONCE
HRRI T1,1(T1) ;MAKE T1 POINT TO NEXT ARGUMENT
EXCTUX <HLRZ T2,@T1> ;GET INSTRUCTION PART OF ARG
JUMPE T2,BLKRET ;IF IT IS ZERO THEN FORGET IT
TRZ T2,77400 ;ZERO OUT DEVICE CODE
TRZE T2,37 ;INDEX OR INDIRECT BITS ON
TRO S,E30 ;YES, ERROR
JRST BLKRET ;ONWARD
;BLKI/O INSTRUCTION, CHECK BOUNDRY CONDITIONS
BLKINS: TRZ T2,100 ;COMMON BIT TO BLKI AND BLKO
TLNN S,INDBIT ;INDIRECT BIT SET
CAIE T2,(BLKI) ;BLKI OR BLKO
JRST VECINS ;NO, MAYBE VECTORED INTERRUPT
EXCTUX <HRRZ T2,@T1> ;GET BLKADR
CAILE T2,JOBPFI## ;CHECK BOUNDRY CONDITIONS
CAILE T2,(U) ;ABOVE LOWER BOUND AND BELOW UPPER BOUND?
JRST ERR31 ;NO, GO SET ERROR BIT
EXCTUX <MOVE T3,@T2> ;PICK UP BLOCK ADDRESS AND WORD COUNT
HLRO T4,T3 ;GET NEGATIVE WORD COUNT
MOVNS T4 ;MAKE IT POSITIVE
ADDI T4,(T3) ;CALCULATE END OF BLOCK
CAILE T4,JOBPFI## ;CHECK BOUNDS
CAILE T4,(U) ;UPPER AND LOWER BOUNDS OK?
JRST ERR31 ;NO, GO SET ERROR BIT
MOVEI T4,1(T3) ;GET START OF BLOCK
CAILE T4,JOBPFI## ;IS IT IN BOUNDS
CAILE T4,(U) ;UPPER AND LOWER BOUNDS OK?
JRST ERR31 ;NO,GO SET ERROR BIT
EXCTUX <MOVE F,@T1> ;SAVE BLKI/O INSTRUCTION FOR LATER
ADDI F,(R) ;RELOCATE BLKI/O INSTRUCTION
EXCTUX <HRRZ T2,@T1> ;GET ADDRESS OF WORD COUNT, START ADR
ADDI T2,(R) ;RELOCATE IT
MOVE U,(T2) ;LOAD U WITH THE IOWD FOR BLKI/O
ADDI U,(R) ;RELOCATE IT
MOVEM U,(T2) ;SET UP RELOCATED IOWD IN USER AREA
TLO S,BLKIO ;NOTE THAT A BLKI/O IS TO BE DONE
JRST BLKRET ;GO GET RT BLOCK
ERR31: TROA S,E31 ;SET ERROR BIT 31
ERR30: TRO S,E30 ;SET ERROR BIT 30
JRST ERROR ; GO RETURN TO USER
VECINS: TLNN S,INDBIT ;INDIRECT BIT SPECIFIED?
TLNN S,VECTOR ;AND WAS VECTOR TYPE INTERRUPT REQUESTED?
JRST ERR30 ;ERROR
EXCTUX <MOVE F,@T1> ;EXEC VIRTUAL ADDRESS OF THE INTERRUPT VECTOR
TLNN S,EPTREL ;IS ADDRESS RELATIVE TO THE EPT?
JRST BLKRET ;NO, USER SPECIFIED THE EVA OF IRP VECTOR
TRNE F,-PAGSIZ ;MUST BE LESS THAN PAGSIZ
JRST ERR31 ;NOT, THE EPT IS ONLY A PAGE LONG
ADD F,.CPEPT## ;RELOCATE BY ADDRESS OF THE EPT
;FALL INTO BLKRET
;ARRIVE HERE AFTER PROCESSING ARGUMENT LIST.
;IF THERE ARE ANY ERRORS SO FAR, DON'T GO ON.
;AT THIS POINT THERE ARE FOUR AC'S SET UP:
;F=INTERRUPT INSTRUCTION(CONSO OR BLKI/O),
;M=APR INFO (XWD ENABLE,APRTRP),
;P1=PI CHANNEL NUMBER, AND P2=TRAP ADDRESS
BLKRET: TLNN S,INDBIT!NOSAV ;INDIRECT OR FAST MODE?
JRST BLKRT1 ;NO, NO NEED TO TEST FOR EVM
IFN FTLOCK,<
PUSHJ P,LOKEVC## ;IF NON-PXCT REF TO USER, MUST BE LOCKED IN EVM
>; END IFN FTLOCK
TRO S,E28 ;GIVE ERROR
BLKRT1: TLZ S,INDBIT ;THIS CAN BE CLEARED NOW
TRNE S,-1 ;ANY ERRORS YET?
JRST ERROR ;YES, DONT GO ANY FURTHER
;AT THIS POINT THE ARGUMENT LIST HAS BEEN VERIFIED, NOW
;TRY TO OBTAIN A FREE REAL TIME BLOCK.
SYSPIF ;LOCK OUT HIGHER PRIORITY INTERRUPTS
SKIPE T4,RTLINK ;IS THE FREE LIST EMPTY?
MOVE T4,@RTLINK ;NO, GET FIRST FREE BLOCK
EXCH T4,RTLINK ;STORE NEW POINTER IN RTLINK
SYSPIN
JUMPE T4,NORTBL ;ANY BLOCKS?
;FALL THROUGH TO NEXT SECTION
;THE RT BLOCK HAS BEEN OBTAINED.
;NOW AN INTERRLOCK IS SET ( JOBTB(RTBLK) = XWD DEV-CODE,0)
;TO PREVENT THE SAME DEVICE FROM BEING PUT ON OR TAKEN OFF
;OTHER CHANNELS DURING THE TIME IT TAKES TO COMPLETE THE
;CHAINING OF THIS RT BLOCK.
TLNN S,CNSO ;IS THERE A CONSO INSTRUCTION
MOVE P3,F ;NO, SET P3 UP PROPERLY
LDB T3,[POINT 7,P3,9] ; GET DEV CODE
IORI T3,RTUSE ; MARK THAT RTBLOCK IS BEING USED
HRLZM T3,JOBTB(T4) ;STORE DEV CODE IN RT BLOCK FOR INTERLOCK
IFN FTMP,<
DPB W,[POINT 3,JOBTB(T4),2] ;STORE CPU NUMBER
>
MOVE T2,[XWD -M.RTD##,RTBLK##] ;SET UP COUNTER AC
;CHKDEV MAKES SURE THAT THERE ARE NO OTHER OCCURENCES OF THIS DEVICE
;ON ANY OTHER CHANNELS EXCEPT WHEN OWNED BY THIS JOB
CHKDEV: LDB T1,[POINT 10,JOBTB(T2),17] ;DEVICE CODE + USE BIT
CAMN T1,T3 ;IS THIS THE SAME AS CURRENT DEVICE
JRST CHKDV2 ;YES, GO SEE IF LEGAL
CHKDV1: HRRI T2,RTBSIZ-1(T2) ;LOOK AT NEXT BLOCK
AOBJN T2,CHKDEV ;LOOP BACK FOR REST OF CHECKS
TLNE S,VECTOR ;VECTOR INTERRUPT DEVICE?
JRST CHKDV4 ;YES
TLNN S,CNSO ;CONSO INSTRUCTION?
JRST NOCNSO ;NO, GO SET UP BLKI/O INSTRUCTION
CHKDV4: SYSPIF ;POSSIBLE RACE CONDITIONS HERE
SKIPG T1,.CPRCT##-1(P1) ;ENABLED FOR BLKI/O
TLZA T1,BLKAVL ;YES, CLEAR BLKI/O BIT
TLNN T1,BINUSE ;IS THERE A BLKI/O OPERATION IN USE
AOSA .CPRCU##-1(P1) ;NO, COUNT UP CONSO IN USE TABLE
JRST ERR35 ;CHANNEL BEING USED, GIVE BACK RT F
MOVEM T1,.CPRCT##-1(P1);RESTORE NEW CHANNEL STATUS WORD
SYSPIN ;TURN PI SYSTEM BACK ON
;FALL THROUGH TO LOADRB
;THE RT BLOCK HAS BEEN OBTAINED, AND THE CHANNEL HAS BEEN SECURED
;NOW THE RT BLOCK CAN BE SET UP
;T4 CONTAINS THE START ADDRESS OF THE RT BLOCK
;P1 CONTAINS PI#
LOADRB: TLZ M,-1
MOVEM M,APRTAB(T4) ;STORE IN APRTRP TABLE
MOVEM R,JADRTB(T4) ;STORE JBTADR VALUE IN TABLE
MOVEM P1,PITAB(T4) ;SAVE PI NUMBER
SKIPN T1,.CPRTT## ;ARE WE AT INTERRUPT LEVEL
SKIPA T2,.CPCN1## ;NO, GET USER ENABLE BITS
SKIPA T2,UENBT1(T1) ;YES, GET USER ENABLE BITS FROM T4
SKIPA T1,.CPHRP## ;NO, USE KT10A VALUE
MOVE T1,RELTB1(T1) ;YES, USE CURRENT INTERRUPT LEVEL VALUE
MOVEM T1,RELTAB(T4) ;STORE FOR INTERRUPT LEVEL USE
IFN FTKL10,<TRO T2,LP.NXM!LP.IOF>;KL10 BITS FOR NXM AND PAGE FAIL
IFN FTKS10,<TRO T2,SP.NXM> ;KS10 BITS FOR NXM
HRRZM T2,UENBTB(T4) ;STORE FOR LATER USE
MOVSI T1,(JRST) ;SET UP JRST CHAND'PI
HRR T1,.CPRDT##-1(P1) ;FOR INTERRUPT LEVEL USE
MOVEM T1,DISMTB(T4) ;STORE IT IN TABLE
HLRZ T1,.CPRDT##-1(P1) ;GET JSR ADDRESS
HRLI T1,(JSR) ;SET UP INSTRUCTION PART
MOVEM T1,RTJSR(T4) ;STORE IN RTBLK
MOVE T1,[JSP J,TRPGO##]
MOVEM T1,RTJSP(T4) ;SET UP JSP INSTRUCTION IN RT BLOCK
HRLI P2,(XC.USR!XC.UIO) ;TURN ON USER MODE AND USER I/O MODE BITS
MOVEM P2,TRPTAB(T4) ;STORE TRAP ADDRESS
HRRZ T1,.CPRCT##-1(P1) ;GET CHANNEL ADDRESS
ADDI T1,4 ;T1 = CHANX+4
HRLI T4,(JRST) ;SET UP JRST T4
LDB T2,[POINT 7,P3,9] ;GET DEVICE CODE
TLNN S,NOREM ;SHOULD WE REMOVE ANY DEVICES?
PUSHJ P,REMDEV ;GO REMOVE ALL DEVICES WITH THIS CODE FOR THIS JOB
AOS JBTRTD##(J) ;COUNT UP REAL TIME DEVICE COUNT
MOVSI T3,(JSR) ;SET UP JSR TO TRPADR
HRR T3,TRPTAB(T4) ;GET USER TRAP ADDRESS
ADDI T3,(R) ;RELOCATE IT
TLNE S,VECTOR ;VECTORED MODE TRAPPING?
JRST VECST1 ;YES, SETUP RTBLK FOR THAT STYLE OF RTTRP
MOVEM T3,RJRST1(T4) ;STORE IT IN RT BLOCK
MOVSI T3,(XJEN) ;SET UP XJEN CHN
HRR T3,.CPRCT##-1(P1) ;GET CHANNEL RETURN ADDRESS
MOVEM T3,RTJEN(T4) ;STORE IN JEN ADDRESS
TLNN S,CNSO ;CONSO OR BLKI/O
JRST BLKSET ;BLKI/O, GO SET UP PI LOCATIONS
MOVEM P3,RTCNSO(T4) ;STORE THE CONSO INSTRUCTION
MOVSI T2,(JRST) ;SET UP JRST INSTRUCTION
HRRI T2,RTJSR(T4) ;GET ADDRESS OF JSR SAVCHN
TLNE S,NOSAV ;EXEC MODE TRAPPING
HRRI T2,RJRST1(T4) ;YES, GET ADR OF JSR TRPADR
MOVEM T2,RTBLKO(T4) ;STORE IT IN RT BLOCK
TLNE S,BLKIO ;IS THERE A BLKI/O TO GO ON
JRST BLKST1 ;YES, GO DO IT
RTRET1: SYSPIF ;PI MUST BE OFF NOW
MOVE T2,(T1) ;PICK UP FIRST JRST OF CHAIN
MOVEM T4,(T1) ;CHANGE IT TO JRST RTBLK
MOVEM T2,RTJRST(T4) ;SET UP JRST NXTDEV INSTRUCTION
MOVEI T2,3 ;OFFSET
ADDM T2,(T1) ;SKIP SPACE RESURVED FOR XPCW
RTRET2: HRRM J,JOBTB(T4) ;COMPLETE RT BLOCK SET UP
PUSHJ P,ONIFO ;INTERLOCK REMOVED
RTRET: TLNE S,RTINT ;ARE WE AT INTERRUPT LEVEL
AOSA P4 ;YES, ADD ONE TO RETURN
AOSA -1(P) ;NO, ADD ONE TO RETURN
JRSTF @P4 ;RETURN
MOVSI T2,(XC.UIO) ;SET USER I/O BIT
IORM T2,.JDAT+JOBPD1## ;IN USER RETURN ADDRESS
HLRZ F,JOBTB(T4) ;CPU AND DEVICE CODE
HRRZ U,PITAB(T4) ;PI CHANNEL
MOVE T1,[.SWERT,,.ERSWE] ;RTTRP EVENT,,SW EVENT
PUSHJ P,DAERPT## ;TELL DAEMON
SETZ F, ;AVOID IME
JRST MPOPJ## ;RESTORE M AND RETURN
;ODD PEICES AND ROUTINES
NOCNSO: SYSPIF ;ROUTINE TO MARK A BLKI/O IN PROGRESS
SKIPL T1,.CPRCT##-1(P1);ARE BLKI/O INSTRUCTIONS ALLOWED
JRST NCNSO1 ;NO, SEE IF ONLY RESETTING BLKI/O POINTR
TLC T1,BLKAVL!BINUSE ;MARK THAT BLKI/O IS IN USE
MOVEM T1,.CPRCT##-1(P1);STORE NEW CHANNEL STATUS WORD
SYSPIN
JRST LOADRB ;GO SET UP RT BLOCK
NCNSO1: TLNN T1,BINUSE ;IS THERE ALREADY A BLOCK IN OR OUT GOING
JRST ERR34 ;NO, THEN THIS IS AN ERROR
TLO T1,BLKSAV ;YES, THEN WE ARE ONLY CHANGING POINTER'S
MOVEM T1,.CPRCT##-1(P1) ;STORE NEW VALUE
SYSPIN ;TURN ON PI SYSTEM
JRST LOADRB ;GO SET UP RT BLOCK
BLKST1: MOVEM F,RTBLKO(T4) ;STORE BLKI/O INSTRUCTION
TLNN S,NOSAV ;EXEC MODE TRAPPING?
MOVEM T2,RJRST1(T4) ;STORE JRST RTJSR
JRST RTRET1 ;GO SET UP CONSO CHAIN
VECST1: MOVSI T1,VECUSE ;INDICATE VECTORED INTERRUPT DEVICE
IORM T1,JOBTB(T4) ; THEREFORE NO CONSO INSTRUCTION ON THE SKIP CHAIN
SETZM RTCNSO-1(T4) ;INTERRUPT FLAGS
MOVEI T1,RTCNSO+1(T4) ;INTERRUPT NEW PC
MOVEM T1,RTCNSO(T4) ;FOR XPCW
MOVSI T1,(EXCH T1,) ;"EXCH T1,RTCNSO-3", FLAGS STORED BY XPCW
HRRI T1,RTCNSO-3(T4) ; ..
MOVEM T1,RTJRST(T4) ;STORE THAT IN RTBLK
ADD T1,[1,1] ;"EXCH T2,RTCNSO-2", PC STORED BY XPCW
MOVEM T1,RTBLKO(T4) ;STORE THAT IN RTBLK
MOVSI T1,(DMOVEM T1,) ;"DMOVEM T1,CHN", SO CAN USE CHANNEL SAVE ROUTINES
HRR T1,.CPRCT##-1(P1) ; ..
MOVEM T1,RJRST1(T4) ;STORE THAT
MOVSI T1,(DMOVE T1,) ;"DMOVE T1,RTCNSO-3", TO RESTORE ACS
HRRI T1,RTCNSO-3(T4) ; ..
MOVEM T1,RTJEN(T4) ;STORE THAT IN RTBLK
TLNN S,NOSAV ;EXEC MODE TRAPING?
JRST VECST2 ;NO, REST OF THE BLOCK IS SETUP
MOVEM T3,RTJEN(T4) ;STORE "JSR TRPADR"
MOVSI T1,(XJEN) ;"XJEN CHN"
HRR T1,.CPRCT##-1(P1) ; ..
MOVEM T1,RTJSR(T4) ;STORE THAT IN RTBLK
VECST2: MOVSI T1,(XPCW) ;"XPCW RTCNSO-3"
HRRI T1,RTCNSO-3(T4) ; ..
MOVEM T1,(F) ;STORE THAT AT THE VECTOR ADDRESS
JRST RTRET2 ;COMPLETE RTBLK AND RETURN TO THE USER
CHKDV2: CAIN T4,(T2) ;IS THIS DEVICE CODE OK?
JRST CHKDV1 ;YES, GO BACK AND LOOK AT THE REST
HRRZ T1,JOBTB(T2) ;CHECK TO SEE IF THIS IS OUR JOB
CAIN J,(T1) ;IS IT US?
JRST CHKDV1 ;YES, THEN IT IS OK.
TRO S,E26 ;NO, SET ERROR BIT
CHKDV3: SETZM JOBTB(T4) ;ZERO OUT DEVICE CODE
MOVEI T1,(T4) ;GET BLOCK START ADDRESS
SYSPIF ;PUT IT BACK ON FREE LIST
EXCH T1,RTLINK ;GET NEXT ENTRY ON LIST
MOVEM T1,(T4) ;PUT IT IN FIRST WORD OF CURRENT BLOCK
SYSPIN ;LET INTERRUPTS COME AGAIN
ERROR: TLNN S,RTINT ;ARE WE AT INTERRUPT LEVEL
JRST ERROR1 ;NO, GO DISMISS PROPERLY
ADDI R,-1(P4) ;GET ADDR OF UUO IN USER AREA
LDB T1,[POINT 4,(R),12] ;GET USER AC NUMBER
HRRZM S,(T1) ;STORE THE ERROR BITS IN USER AC
JRSTF @P4 ;RETURN
ERROR1: POP P,M ;RESTORE UUO AC
MOVE T1,S ;PUT ERROR CODE IN T1
JRST STOTAC## ;GO STORE T1 IN USER AC
ERR34: TROA S,E34 ;SET ERROR BIT 34
ERR35: TRO S,E35 ;SET ERROR BIT 35
SYSPIN ;TURN PI SYSTEM BACK ON
JRST CHKDV3 ;GO CLEAN UP AND RETURN
NORTBL: TRO S,E29 ;SET THE ERROR BIT
JRST ERROR ;GO GIVE ERROR RETURN
BLKSET: MOVSI T1,(XPCW)
HRR T1,.CPRCT##-1(P1) ;GET CH'PI ADDRESS
HRRZ T2,P1 ;GET CHANNEL NUMBER
LSH T2,1 ;MULTIPLY IT BY 2
ADD T2,.CPEPT##
MOVEM T1,41(T2) ;STORE JSR INSTRUCTION IN TRAP LOCATION
MOVSI T3,(JRST) ;SET UP JRST TO RT BLOCK
HRRI T3,RTJSR(T4) ;GET START OF RT BLOCK CODE
TLNE S,NOSAV ;EXEC MODE TRAPING
HRRI T3,RJRST1(T4) ;YES, GET ADR OF "JSR TRPADR" INSTRUCTION
MOVEM T3,4(T1) ;STORE INSTRUCTION IN CH'PI + 4
SYSPIF
MOVEM F,40(T2) ;STORE BLKI/O INSTRUCTION IN TRAP LOC
HRRM J,JOBTB(T4) ;REMOVE INTERLOCK
SYSPIN
JRST RTRET ;GO RETURN TO USER
;ENTERED BY INTERRUPT LEVEL UUO FROM LOC 41 WITH JSP RTUUO,UUOHND
;DECODE UUO, AND IF IT IS LEGAL GO EXECUTE IT
;OTHERWISE DISMIS THE INTERRUPT
;THE FASTEST METHOD OF DISMISSING IS TO EXECUTE AN INSTRUCTION
;WHICH TRAPS TO LOC 60 (IE OPCODE 100). THIS BYPASSES THE UUO DECODING.
;*** ACS 16 AND 17 SHOULD NOT BE SYMBOLIC IN THIS ROUTINE
;***SINCE THEY ARE DOCUMENTED AS 16 AND CANNOT IF SYMBOLIC
;***NAMES ARE CHANGED
IFE <J-16>*<J-17>*<T1-16>*<T1-17>*<P-16>*<P-17>,<PRINTX ?UUOHND AC ASSIGNMENTS WRONG>
UUOHND::LDB 16,RTMUAC## ;PICK UP UUO AC
CAIE 16,16 ;IS THIS AN ILLEGAL USER AC?
CAIN 16,17
JRST UUOHD3 ;YES, GO GIVE IMMMEDIATE ERROR RETURN
SKIPL J,.CPRTT## ;GET RT BLOCK INDEX REGISTER
JRST .CPDMI## ;IF RT BLOCK RELEASED GO DISMISS
LDB T1,RTMUOC## ;GET UUO OPCODE
CAIE T1,47 ;CALLI UUO?
JRST .CPDMI## ;NO,DISMIS
XCT @.CPDMI## ;SET UP P (MOVE P,C'PI'RTP)
PUSH P,17 ;SAVE MUUO FLAGS,,PC
MOVE T1,(16) ;LOAD T1 WITH USER'S AC
MOVE R,JADRT1(J) ;LOAD PROTECTION-RELOCATION
HRRZ J,JOBTB1(J) ;LOAD J WITH JOB NUMBER
HRRZ T2,RTMCAN## ;PICK UP CALLI #
CAIE T2,RTUUON ;IS IT A RTTRP UUO?
JRST UUOHD2 ;TRY OTHER LEGAL UUOS
MOVSI S,RTINT ;SET INTERRUPT LEVEL UUO BIT
POP P,P4 ;RTRET AND ERROR EXPECT TO RETURN THRU P4
JRST RTTRP1 ;GO EXECUTE UUO
UUOHD3: MOVE T1,17 ;SAVE CONTENTS OF RETURN AC
MOVEI 17,E27 ;SET ERROR BIT IN AC RTUUO
MOVEM 17,(16) ;STORE ERROR CODE IN USER'S AC
JRSTF @T1 ;GIVE ERROR RETURN
UUOHD2: CAIE T2,WAKUUO ;IS THIS A WAKE UUO ?
JRST .CPDMI## ;NO,DISMIS(OR CHECK FOR OTHER LEGAL UUOS)
MOVEI T2,WAKEUP## ;SET UP FOR UUO DISPATCH
UUODPT: PUSHJ P,(T2) ;DISPATCH TO UUO
SKIPA ;ERROR RETURN
AOS (P) ;NORMAL SKIP RETURN
POP P,17 ;GET RETURN PC
JRSTF @17 ;RETURN TO CALLER
REMOVE: TRNE S,E24+E25 ;ANY ERRORS SO FAR?
JRST ERROR ;YES, DON'T CONTINUE
HRRI T1,2(T1) ;MAKE T1 POINT TO INSTRUCTION ARG
EXCTUX <LDB T2,[POINT 7,@T1,9]> ;PICK UP DEVICE CODE
PUSHJ P,REMDEV ;GO REMOVE ALL DEVICES WITH THIS CODE
JRST RTRET ;GO RETURN TO USER
;SUBROUTINE TO TURN ON PI IF OFF
;PRESERVES ALL ACS
ONIFO: CONSZ PI,CLKBIT## ;CHANNEL 7 DISABLED
CONSO PI,PI.ON ;OR PI TURNED OFF
SYSPIN ;RELEASE INTERLOCK
POPJ P, ;RETURN
;REMDEV REMOVES ALL INSTANCES OF A DEVICE WITH THE CORRECT
;JOB NUMBER FROM THE CHAINS
;CALLING SEQUENCE:
; MOVE T2,DEVCODE
; PUSHJ P,REMDEV
;AC'S T1, W, U, AND T4 ARE PRESERVED
REMDEV: MOVE P2,[XWD -M.RTD##,RTBLK##] ;SET UP COUNTER AC
SYSPIF ;PREVENT RACES
REMDV1: LDB M,[POINT 7,JOBTB(P2),17] ;GET DEVICE CODE
IFN FTMP,<
LDB T3,[POINT 3,JOBTB(P2),2] ;CPU NUMBER
CAMN T3,.CPCPN## ;DEVICE ON THIS CPU?
>
CAME M,T2 ;IS IT A MATCH
SKIPA ;NO
JRST REMDV3 ;YES, GO REMOVE IT FROM CHAIN
REMDV2: HRRI P2,RTBSIZ-1(P2) ;GO ON TO NEXT BLOCK
AOBJN P2,REMDV1 ;LOOP BACK FOR REST OF BLOCKS
JRST ONPOPJ## ;NO DEVICES, TURN INTS BACK ON AND RETURN
REMDV3: MOVE M,JOBTB(P2) ;GET JOB NUMBER
CAIE J,(M) ;IS THIS OUR JOB?
JRST REMDV2 ;KEEP LOOKING
PUSH P,P1 ;SAVE CHANNEL NUMBER
PUSH P,T2 ;SAVE DEVICE CODE
HRRZS JOBTB(P2) ;SET INTERLOCK
TLNE M,VECUSE ;VECTORED INTERRUPT DEVICE?
JRST CHFND0 ;YES, NO CONSO'S ON THE SKIP CHAIN
SYSPIN ;FINISHED STICKY AREA
HRRZ P1,PITAB(P2) ;GET PI CHANNEL NUMBER
MOVE T2,.CPRCT##-1(P1);GET CHANNEL STATUS WORD
TLNE T2,BINUSE ;IS THIS A BLKI/O CASE
JRST BLKREM ;YES, GO REMOVE THAT
CHLPB: MOVSI T2,(JRST) ;SET UP CHAIN INSTRUCTION TO LOOK FOR
HRRI T2,3(P2) ;GET ADDRESS OF BLOCK
HRRZ M,.CPRCT##-1(P1) ;GET CHANNEL ADDRESS
ADDI M,3 ;SKIP XPCW BLOCK
SYSPIF ;PREVENT RACES
CHLOOP: CAMN T2,1(M) ;IS THIS THE RIGHT CHAIN ENTRY?
JRST CHFND ;YES, GO REMOVE IT
HRRZ M,1(M) ;POINT TO NEXT CONSO ELEMENT
JRST CHLOOP ;GO BACK FOR MORE
;ENTERED AFTER FINDING THIS DEVICE
CHFND: MOVE T2,4(P2) ;GET NEXT CHAIN LINK
MOVEM T2,1(M) ;CUT THIS RT BLOCK OUT OF CHAIN
CHFND0: SYSPIN ;ALLOW INTERRUPTS PENDING TO GO
SYSPIF
SOSE .CPRCU##-1(P1) ;DECREMENT COUNT OF CONSO'S
JRST CHFND1 ;STILL MORE CONSO'S ON CHAIN
MOVE T2,.CPRCT##-1(P1);GET CHANNEL STATUS WORD
TLNE T2,BLKENB ;BLKI/O ALLOWED
TLO T2,BLKAVL ;YES, MARK THAT THIS CHANNEL IS FREE
MOVEM T2,.CPRCT##-1(P1);STORE NEW STATUS WORD
CHFND1: SYSPIN ;TURN ON PI SYSTEM AGAIN
CLRRTB: HRRZ T2,.CPRTT## ;GET RT BLOCK POINTER ADDRESS
CAIE T2,RTJSP+1(P2) ;IS THIS THE BLOCK THAT IS BEING REMOVED?
JRST CLRRT1 ;NO
HRRZ M,.CPRDT##-1(P1) ;GET ADDRESS OF DISMISS ROUTINE
HRRZI M,RTOFST##(M) ;ADD IN RELTAB OFSET
MOVE T2,RELTAB(P2) ;GET RELOC/PROTECTION
MOVEM T2,RELTB1(M) ;STORE IN PI LEVEL AREA
MOVE T2,UENBTB(P2) ;GET ENABLE BITS
MOVEM T2,UENBT1(M) ;STORE IN PI LEVEL AREA
MOVEM M,.CPRTT## ;STORE NEW .CPRTT WORD
CLRRT1: MOVEI T2,(P2) ;PICK UP RT BLOCK ADDRESS
SYSPIF
SETZM JOBTB(P2) ;CLEAR OUT DEV CODE
EXCH T2,RTLINK ;PUT THIS BLOCK BACK ON LIST
MOVEM T2,(P2) ;SET UP REST OF LINKS
SYSPIN
SOS JBTRTD##(J) ;COUNT DOWN RT DEVICE COUNT
POP P,T2 ;RESTORE DEVICE CODE
POP P,P1 ;RESTORE CHANNEL NUMBER
SYSPIF ;ENTER REMDV2 WITH PIS OFF
JRST REMDV2 ;ALL FINISHED
;ENTER HERE TO REMOVE A BLKI/O FROM A PI LOCATION
BLKREM: TLNE T2,BLKSAV ;ARE WE JUST RESETTING POINTER WORD
JRST BLKRM1 ;YES, DON'T REMOVE BLKI/O
MOVE T2,.CPEPT## ;GET PROPER PI LOCATION
ADDI T2,40(P1)
ADD T2,P1 ;40 + 2*N
HRLI M,(XPCW) ;SET UP XPCW CHAN
HRR M,.CPRCT##-1(P1) ;GET CHAN ADDRESS
MOVEM M,(T2) ;STORE IN 40+2*N
HRLI M,(XJEN)
MOVEM M,4(M) ;T4+4 = JEN @ T4
SYSPIF ;TURN OFF PI
MOVE M,.CPRCT##-1(P1) ;GET STATUS WORD
TLC M,BLKAVL!BINUSE ;SET THAT CHANNEL IS FREE
MOVEM M,.CPRCT##-1(P1);STORE NEW STATUS WORD
SYSPIN
JRST CLRRTB ;GO CLEAN UP RT BLOCK
BLKRM1: MOVSI T2,BLKSAV ;CLEAR OUT BIT
ANDCAM T2,.CPRCT##-1(P1)
JRST CLRRTB ;GO CLEAN UP
;RTREL IS CALLED BY RESET TO REMOVE ALL DEVICES FROM
;THE PI CHANNELS.
;BEFORE REMOVING ANY DEVICE A CONO DEV,0 IS EXECUTED
RTREL:: MOVEI T1,777 ;ARE THERE ANY DEVICES ON PI LEVELS
TDNN T1,JBTRTD##(J) ;CHECK RIGHT HALF ONLY
POPJ P, ;NO, RETURN
MOVEI T1,M.RTD## ;SET UP COUNTER
MOVEI T2,RTBLK## ;SET UP TO LOOK FOR DEVICES
RTREL1: SKIPE T3,JOBTB(T2) ;ANY JOB USING THIS BLOCK
JRST RTREL3 ;YES, GO SEE IF IT IS THIS JOB
RTREL2: MOVEI T2,RTBSIZ(T2) ;GET NEXT ENTRY
SOJG T1,RTREL1 ;GO LOOK AT OTHER ENTRIES
JRST RTREL ;GO RETURN
RTREL3: CAIE J,(T3) ;IS THIS US?
JRST RTREL2 ;NO, GO LOOK AT REST OF BLOCKS
IFN FTMP,<
LDB T1,[POINT 3,T3,2] ;CPU NUMBER
PUSHJ P,ONCPUN## ;GET TO THE CPU THAT OWNS THE DEVICE
>
HLRZ T2,T3 ;GET DEVICE NUMBER
ANDI T2,177 ;CLEAR RTUSE BIT
MOVSI T3,(CONO) ;SET UP TO DO A CONO DEV,0
DPB T2,[POINT 7,T3,9]
IFN FTKL10,<
CAIN T2,<TIM>_-2 ;IF KL10 INTERVAL TIMER
TRO T3,TO.CIT!TO.CTD ;CLEAR TIMER AND THE DONE FLAG
>
CAILE T2,1 ;DON'T CONO 0 TO PI OR APR
XCT T3 ;CONO DEV,0
PUSHJ P,REMDEV ;REMOVE THE DEVICE FROM THE CHAIN
JRST RTREL ;GO LOOK AT REST OF BLOCKS
SUBTTL REAL TIME TRAPPING INITIALIZATION
$INIT
;RTINI IS THE INITIALIZATION ROUTINE TO SET UP THE REAL TIME BLOCKS
RTINI:: MOVEI T1,.C0CDB## ;POINT AT FIRST CDB
RTINI1: HRLI T1,-6 ;NUMBER OF RT DEVICE SLOTS
RTINI2: SKIPE T2,.CPRCT##-.CPCDB##(T1) ;ANY DEVICES?
MOVE T2,1(T2) ;YES, GET COUNT
MOVEM T2,.CPRIT##-.CPCDB##(T1) ;RESET IT
AOBJN T1,RTINI2 ;LOOP FOR ALL SLOTS
HLRZ T1,.CPCDB##-.CPCDB##-6(T1) ;GET LINK TO NEXT CDB
JUMPN T1,RTINI1 ;LOOP IF MORE CPUS
RTINI3: MOVEI T1,.C0CDB## ;ADDRESS OF FIRST CDB
RTINI4: HRLI T1,-6 ;NUMBER OF RT DEVICE SLOTS
RTINI5: MOVE T2,.CPRIT##-.CPCDB##(T1) ;GET TABLE ADDRESS
SKIPE T3,.CPRCT##-.CPCDB##(T1) ;ANY DEVICES?
MOVEM T2,1(T3) ;YES, SAVE COUNT IN TABLE
AOBJN T1,RTINI5 ;LOOP FOR ALL SLOTS IN CDB
HLRZ T1,.CPCDB##-.CPCDB##-6(T1) ;GET LINK TO NEXT CDB
JUMPN T1,RTINI4 ;LOOP IF ANY MORE
SETZM RTBLK## ;SET UP TO ZERO RTBLOCK AREA
MOVE T1,[XWD RTBLK##,RTBLK+1]
MOVEI T2,RTBSIZ*M.RTD## ;CALCULATE LENGTH OF RT BLOCK AREA
BLT T1,RTBLK##-1(T2) ;ZERO THE AREA
MOVEI T1,RTBLK## ;NOW LINK THE BLOCKS TOGETHER
MOVEI T2,M.RTD## ;GET NUMBER OF BLOCKS AVAILABLE
MOVEM T1,RTLINK ;SET UP FIRST ENTRY
RTINI6: MOVEI T3,RTBSIZ(T1) ;GET ADDRESS OF NEXT BLOCK
MOVEM T3,(T1) ;STORE IN CURRENT BLOCK
EXCH T3,T1 ;GET NEXT BLOCKADR IN T1
SOJG T2,RTINI6 ;GO FINISH LOOP
SETZM (T3) ;MAKE THE LAST BLOCK IN LIST HAVE 0 POINTER
MOVEI T1,.C0CDB## ;START WITH FIRST CDB
RTINI7: SETZM .CPRTT##-.CPCDB##(T1) ;CLEAR COUNT
HRLI T1,-6 ;NUMBER OF RT DEVICE SLOTS
RTINI8: SKIPE T2,.CPRCT##-.CPCDB##(T1) ;ANY DEVICES?
TLNN T2,BLKENB ;YES, ENABLED?
JRST RTINI9 ;NO
HRLI T2,BLKENB+400000 ;YES, FLAG IT
MOVEM T2,.CPRCT##-.CPCDB##(T1) ;STORE FLAGS
RTINI9: AOBJN T1,RTINI8 ;LOOP FOR ALL SLOTS
HLRZ T1,.CPCDB##-.CPCDB##-6(T1) ;GET LINK TO NEXT CDB
JUMPN T1,RTINI7 ;LOOP IF MORE CPUS
MOVSI T1,MJOBN## ;GET NEGATIVE JOB NUMBER
SETZM JBTRTD##(T1) ;CLEAR OUT TABLE
AOBJN T1,.-1 ;DO REST OF TABLE
POPJ P, ;RETURN
$HIGH
;VARIABLE STORAGE ALLOCATION
$LOW
RTLINK::Z ;POINTER TO FIRST FREE BLOCK ON LIST
$LIT
END