.TITLE IOSRSX -- CODE FOR RSX-11 I/O PAGE SCANNER .IDENT /V04.00/ ;+ ; Copyright (c) 2012, 2014 Oleg Safiullin ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;- IOBASE = 160000 ;I/O PAGE BASE ADDRESS LUN.TI = 1 ;LUN FOR TI: I/O EFN.TI = 1 ;EFN FOT TI: I/O .MCALL DIR$,EXIT$S,EXST$,QIOW$ ;SYSTEM MACRO CALLS .IF DF IO$VEC .MCALL GIN$S ; .ENDC .MCALL TCBDF$ ;EXECUTIVE MACRO CALLS TCBDF$ ;DEFINE TCB OFFSETS .PSECT CODE,GBL,I,RO .PSECT RODATA,GBL,D,RO .PSECT DATA,GBL,D,RW .PSECT CODE $START:: .IF DF IO$VEC GIN$S #GI.VEC,#EXEVEC,#EXEVCL ;TRANSLATE EXECUTIVE VECTOR BCC 10$ ;IF CC OK MOV #EVECT,R0 ;SET ERROR MESSAGE BR 100$ ;PRINT IT AND EXIT .IFTF 10$: CALL $SWSTK,70$ ;SWITCH TO SYSTEM STATE .IFF MOV $TKTCB,R0 ;;GET OUR TCB BIT #1,R0 ;;ODD ADDRESS? BNE 20$ ;;YES, ERROR CMP #120000,R0 ;;APR5 OR ABOVE? BLOS 20$ ;;YES CMP R1,T.NAM(R0) ;;REALLY OUR TCB? BNE 20$ ;;NO CMP R2,T.NAM+2(R0) ;; BEQ 40$ ;;YES 20$: CLR 4(SP) ;;CLEAR USER'S R1 BR 55$ ;;RETURN TO USER STATE 40$: MOV $ACTHD,R0 ;;GET FIRST TCB FROM ACTIVE TASK LIST .IFT MOV @ACTHD,R0 ;;GET FIRST TCB FROM ACTIVE TASK LIST .ENDC 50$: TSTB T.IOC(R0) ;;TASK HAS OUTSTANDING I/O? BEQ 60$ ;;NO MOV T.NAM(R0),4(SP) ;;SAVE TASK NAME INTO R1-R2 MOV T.NAM+2(R0),6(SP) ;; 55$: BIS #1,20(SP) ;;SET USER'S CARRY RETURN ;;RETURN 60$: MOV T.ACTL(R0),R0 ;;GET NEXT TCB ADDRESS TST T.TCBL(R0) ;;NULL TCB? BNE 50$ ;;NO, CHECK IT .IF DF IO$VEC CALL @SGFIN ;;;INTERCEPT FOR TRAPS THRU 4 .IFF CALL $SGFIN ;;;INTERCEPT FOR TRAPS THRU 4 .ENDC MOV #PR7,-(SP) ;;RAISE CPU PRIORITY MOV #65$,-(SP) ;; RTI ;; 65$: BIC #1,20(SP) ;;;CLEAR USER'S CARRY CALLR $ISCAN ;;;SCAN I/O PAGE ;;;AND RETURN TO USER STATE 70$: BCC 120$ ;IF CC, OK .IF NDF IO$VEC TST R1 ;TASK HAS OUTSTANDING I/O? BEQ 90$ ;NO .IFTF MOV #ETASK,R0 ;CONVERT TASK NAME TO ASCII MOV R2,-(SP) ; CALL $C5TA ; MOV (SP)+,R1 ; CALL $C5TA ; 80$: CMPB #<' >,-(R0) ;REMOVE TRAILING SPACES BEQ 80$ ; CLRB 1(R0) ;MAKE STRING ASCIZ MOV #ETKIO,R0 ;PRINT ERROR MESSAGE .IFT BR 100$ ; 90$: MOV #EWSTB,R0 ;PRINT ERROR MESSAGE .ENDC 100$: CALL $PRINT ; MOV #EX$ERR,EXST+E.XSTS ;SET EXIT STATUS 110$: DIR$ #EXST ;EXIT WITH STATUS EXIT$S ;EXIT IF EXST FAILED 120$: CLR R3 ;INITIALIZE ADDRESS RANGE CLR R4 ; CALL $IPRNT ;PRINT I/O PAGE BR 110$ ;EXIT ;+ ;$PRINT -- PRINT ASCIZ STRING ; ;INPUT: ; R0 - STRING ADDRESS ; ;OUTPUT: ; NONE ;- $PRINT:: MOV R0,QIOW+Q.IOPL ;SET BUFFER ADDRESS MOV R0,-(SP) ;CALCULATE LENGTH 10$: TSTB (R0)+ ; BNE 10$ ; DEC R0 ; SUB (SP)+,R0 ; MOV R0,QIOW+Q.IOPL+2 ;SET LENGTH DIR$ #QIOW ;QUEUI I/O AND WAIT RETURN ;RETURN .PSECT RODATA .IF DF IO$VEC EVECT:: .ASCIZ /IOSCAN -- Unable to translate executive vector/ .IFF EWSTB:: .ASCIZ /IOSCAN -- Task built with wrong STB file/ .ENDC .PSECT DATA .IF DF IO$VEC EXEVEC:: .WORD 0 ;EXECUTIVE VECTOR ACTHD:: .WORD $ACTHD ;ACTIVE TASK LIST HEAD SGFIN:: .WORD $SGFIN ;INTERCEPT FOR TRAP TO 4 ROUTINE EXEVCL = <.-EXEVEC>/2 ;EXECUTIVE VECTOR LENGTH .ENDC QIOW:: QIOW$ IO.WVB,LUN.TI,EFN.TI,,,,<,,40> ;QUEUE I/O DPB EXST:: EXST$ EX$SUC ;EXIT WITH STATUS DPB RANGE:: .BLKW 14. ;ADDRESS RANGE STRING BUFFER IOMAP:: .BLKW -IOBASE/<16.*2> ;I/O PAGE BITMAP ETKIO:: .ASCII "IOSCAN -- Task has outstanding I/O - " ETASK: .ASCIZ /XXXXXX/ .END $START ;THE END