.TITLE INTRT .IDENT /X01/ .NLIST BEX .ENABL LC ; ; INTERRUPT INTERCEPTION. ; ; DAVID G. CONROY 01-APR-78 ; .GLOBL $INTRT .MCALL CALL .MCALL CALLR .MCALL RETURN .MCALL EXIT$S .MCALL TCBDF$ TCBDF$ ; ; EQUIVALENCES. ; VEC = 300 ;VECTOR ADDRESS DEV = 167770 ;DEVICE ADDRESS EF = 2 ;EVENT FLAG TO SET ;+ ; ** $INTRT -- INTERRUPT INTERCEPTION. ; ; THIS TASK PROVIDES A SOMEWHAT KLUDGY INTERFACE TO THE HARDWARE ; INTERRUPT SYSTEM. ; ; WHEN RUN, IT ATTACHES ITSELF TO THE INTERRUPT VECTOR SPECIFIED ; BY THE 'VEC' EQUIVALENCE. WHENEVER THE DEVICE INTERRUPTS INTRT ; DISMISSES THE INTERRUPT AND SETS EVENT FLAG 'EF' IN THE LOCAL ; EVENT FLAGS OF THE SPECIFIED TASK. ;- $INTRT: CALL $SWSTK,30$ ;ENTER SYSTEM STATE MOV #IHANDE-IHAND,R1;GET SIZE TO ALLOCATE CALL $ALOCB ;ALLOCATE CORE BLOCK BCS 20$ ;BR IF NO CORE BLOCK CLR DEV ;JUST TO BE SAFE. MOV R0,VEC ;POINT VECTOR AT CORE BLOCK MOV #340,VEC+2 ;SET PRIO 7 MOV #IHAND,R1 ;COPY CODE INTO CORE BLOCK 10$: MOV (R1)+,(R0)+ ; CMP R1,#IHANDE ; BLO 10$ ; BIS #100,DEV ;SET DEVICE INTERRUPTS 20$: RETURN ;TO USER STATE 30$: EXIT$S ;DONE ;+ ; ** IHAND -- INTERRUPT HANDLER ; ; THIS ROUTINE RECEIVES CONTROL FROM THE DR-11 VECTORS. IT DISMISSES ; THE INTERRUPT, THEN DOES THE SETTING OF THE VECTORS. ; THIS CODE IS ACTUALLY EXECUTED OUT OF THE DYNAMIC STORAGE POOL TO ; INSURE THAT IT IS IN THE KERNEL ADDRESS SPACE AT THE INSTANT THE ; INTERRUPT HITS. ;- IHAND: JSR R5,@#$INTSV ;;;SAVE STATE .WORD 0 ;;;RUN AT PRIORITY 7 MOV R0,-(SP) ;;;SAVE REGISTERS MOV R1,-(SP) ;;; MOV R2,-(SP) ;;; MOV R3,-(SP) ;;; MOV R4,-(SP) ;;; MOV R5,-(SP) ;;; TST @#DEV+4 ;;;DISMISS INTERRUPT MOV @#$ACTHD,R5 ;;;POINT AT ATL. 10$: CMP T.NAM(R5),(PC)+ ;;;LOOK FOR TASK '...MUS' .RAD50 /.../ ;;; BNE 20$ ;;; CMP T.NAM+2(R5),(PC)+ ;;; .RAD50 /MUS/ ;;; BEQ 30$ ;;;FOUND IT 20$: TST T.ACTL(R5) ;;;NULL TASK BEQ 50$ ;;;YES, JUST LEAVE MOV T.ACTL(R5),R5 ;;;POINT AT NEXT TASK BR 10$ ;;; ; ; FOUND THE TASK. ; 30$: MOV #EF,R0 ;;;CONVERT EVENT FLAG STUFF CALL @#$CEFI ;;; BCS 40$ ;;;ERROR? BIS R0,(R1) ;;;SET EVENT FLAG 40$: MOV R5,R0 ;;;FORCE RESCHEDULING. CALL @#$SETRQ ;;; 50$: MOV (SP)+,R5 ;;;RETURN MOV (SP)+,R4 ;;; MOV (SP)+,R3 ;;; MOV (SP)+,R2 ;;; MOV (SP)+,R1 ;;; MOV (SP)+,R0 ;;; RETURN ;;; IHANDE: .BLKW 0 ;;;END OF THE CODE .END $INTRT