1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-05-05 07:44:10 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/mon/rttrp.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

802 lines
29 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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