.NLIST TTM,BEX ;====================================================================== ; .TITLE KBCHEK .IDENT /101480/ ; ; AUTHOR: T V ATKINSON ; DEPARTMENT OF CHEMISTRY ; MICHIGAN STATE UNIVERSITY ; EAST LANSING, MI 48824 ; ; DATE: 14-OCT-80 ; ;---------------------------------------------------------------------- ; ; THIS IS A FAMILY OF ROUTINES FOR MONITORING TI: DURING ; FORTRAN OPERATIONS WITHOUT HAVING TO USE THE MORE ; CONSTRAINING FORTRAN I/O. ; WHEN ENABLED, THE AST ROUTINE ASYNCHRONOUSLY MONITORS UNSOLICITED ; INPUT FROM TI:. AS A CHARACTER IS INPUT, THE ROUTINE ; SEARCHES TWO LISTS OF CHARACTERS FOR THE NEWLY INPUT CHARACTER. ; IF A MATCH IS FOUND, THE CORRESPONDING FLAG IS SET OR CLEARED ; DEPENDING ON WHICH LIST CONTAINS THE MATCH. ALL FLAGS ARE ; CONSIDERED FOR EACH CHARACTER INPUT, SO THAT THE ; SAME CHARACTER CAN CONTROL SEVERAL FLAGS. ; THE SUBROUTINE KBCKON ENABLES KBCHEK AND MUST BE ; CALLED BEFORE TENDING OF THE KEYBOARD BEGINS. KBCKOF DISABLES ; THE AST. ; ;---------------------------------------------------------------------- ; ; CALLING SEQUENCES: ; ; ; SUBROUTINE KBCKON (NFLAG,ICHART,ICHARF,LFLAG) ; ; ARGUMENT LIST: ; ; NFLAG ; NUMBER OF FLAGS TO BE TENDED ; ICHART ; BYTE ARRAY OF CHARACTERS TO SET FLAGS ; ICHARF ; BYTE ARRAY OF CHARACTERS TO CLEAR FLAGS ; LFLAG ; LOGICAL*1 ARRAY OF FLAGS ; ; ; ; SUBROUTINE KBCKOF ; ; ARGUMENT LIST (NONE) ; ;========================================================================= .PAGE .GLOBL KBCHEK,KBCKON,KBCKOF .PSECT KBCHEK .MCALL DIR$,QIOW$,ASTX$S ;---------------------------------------------------------------------- ; ; SUBROUTINE KBCKON ; ;---------------------------------------------------------------------- ; KBCKON: MOV R0,-(SP) MOV R5,R0 ; MOVE ARGUMENT LIST TST (R0)+ ; BUMP PAST ARGUMENT COUNT MOV @(R0)+,NFLAG MOV (R0)+,ICHART MOV (R0)+,ICHARF MOV (R0)+,LFLAG DIR$ #SETAST MOV (SP)+,R0 RTS PC ; RETURN ; ; QIO DIRECTIVE ; SETAST::QIOW$ IO.ATA!TF.XCC,5,1,,,, ; ;---------------------------------------------------------------------- ; ; RSX-11M ASYNCHRONOUS SYSTEM TRAP (AST) SERVICE ROUTINE ; ;---------------------------------------------------------------------- ; KBCHEK: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV NFLAG,R0 ; R0 <<<< NUMBER OF FLAGS MOV ICHART,R1 ; R1 <<<< ADDRESS OF SET ARRAY MOV ICHARF,R2 ; R2 <<<< ADDRESS OF CLR ARRAY MOV LFLAG,R3 ; R3 <<<< ADDRESS OF FLAG ARRAY MOV 12(SP),R4 ; R4 <<<< ASYNCHRONOUS CHARACTER ; LOOP: CMPB (R1)+,R4 ; SET THIS FLAG? BEQ TRUE ; YES, BRANCH CMPB (R2)+,R4 ; CLEAR THIS FLAG? BEQ FALSE ; YES, BRANCH BR EOLOOP TRUE: MOVB #-1,(R3) ; SET FLAG BR EOLOOP FALSE: CLRB (R3) ; CLEAR FLAG EOLOOP: INC R3 ; INCREMENT FLAG COUNTER SOB R0,LOOP ; CONTINUE UNTIL DONE ; ; AST EXIT ; MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 TST (SP)+ ; BUMP CHARACTER RETURNED ASTX$S ; RETURN .PAGE ; ;---------------------------------------------------------------------- ; ; SUBROUTINE KBCKOF ; ;---------------------------------------------------------------------- ; KBCKOF: DIR$ #CLRAST ;TURN KBCHEK OFF RTS PC ; CLRAST::QIOW$ IO.DET,5,,,,, ; ;---------------------------------------------------------------------- ; ; STORAGE ; ;---------------------------------------------------------------------- ; NFLAG: .WORD 0 ; NUMBER OF FLAGS TENDED ICHART: .WORD 0 ; ADDRESS OF FLAG SET ARRAY ICHARF: .WORD 0 ; ADDRESS OF FLAG CLEAR ARRAY LFLAG: .WORD 0 ; ADDRESS OF FLAG ARRAY .END