10 ! ----- CTRL_C_Y_TRAP.FUN ----- ! ! ----- ENABLES CTRL/C AND CTRL/Y AST-TRAPPING ROUTINE ----- ! ! ----- Last Change 05/01/89 by Brian Lomasky ----- ! ! ----- Teradyne, Inc., 179 Lincoln Street, Boston, MA 02111 ----- ! ----- (617) 482-2706, x3259 ----- ! ! ----- Neither Brian Lomasky nor Teradyne, Inc. implicitly or ----- ! ----- explicitly implies this program is usable in any way. ----- ! ----- This program is released to the public domain in an ----- ! ----- "AS-IS" condition. ----- ! ! ----- Restrictions: ----- ! ----- 1) Requires VAX BASIC V2.4 or later. ----- ! ----- 2) The calling routine must include the ASTMAP map so ----- ! ----- that the EXIT_PROGRAM_FLAG variable is available. ----- ! ----- 3) AST_ROUTINE.FUN must be compiled and linked into ----- ! ----- the calling program. ----- ! SUB CTRL_C_Y_TRAP OPTION TYPE = EXPLICIT ! ENSURE ALL VARIABLES DECLARED DECLARE LONG CONSTANT TRUE = (1% = 1%) DECLARE LONG CONSTANT FALSE = NOT TRUE ! ----- SYSTEM SERVICE ERROR CODES AND FUNCTION VALUES ----- EXTERNAL LONG CONSTANT IO$_SETMODE ! QIOW VALUE FOR MODE SETTING EXTERNAL LONG CONSTANT IO$M_OUTBAND ! QIOW VALUE FOR OUT-OF-BAND AST RECORD CHARACTER_MASK ! OUT-OF-BAND AST CHARACTER MASK LONG MUST_BE_ZERO LONG OUT_OF_BAND_CHAR END RECORD CHARACTER_MASK DECLARE WORD QIO_CHNL ! CHANNEL NUMBER FOR QIOW DECLARE LONG QIO_FUNC ! QIOW FUNCTION VALUE DIM WORD QIO_IOSB(3%) ! QIOW STATUS BLOCK DECLARE CHARACTER_MASK QIO_MASK ! OUT-OF-BAND AST CHARACTER MASK DECLARE LONG SYS_STATUS ! SYSTEM SERVICE EXIT STATUS EXTERNAL LONG AST_ROUTINE ! OUT-OF-BAND AST HANDLER EXTERNAL LONG FUNCTION LIB$STOP(LONG BY & VALUE) ! STOP PROGRAM EXTERNAL LONG FUNCTION SYS$ASSIGN ! ASSIGN I/O CHANNEL EXTERNAL LONG FUNCTION SYS$QIOW ! QUEUE I/O REQUEST AND WAIT ! ----- MAPPED VARIABLE FOR AST_ROUTINE FUNCTION ----- ! ----- (MUST ALSO BE DEFINED IN THE CALLING PROGRAM) ----- MAP (ASTMAP) WORD EXIT_PROGRAM_FLAG ! TRUE TO EXIT PROGRAM EXIT_PROGRAM_FLAG = FALSE ! INIT FLAG FOR END PROGRAM ! ----- ENABLE OUT-OF-BAND ASYNCHRONOUS SYSTEM TRAP (AST) TO ----- ! ----- ESTABLISH AN AST ROUTINE THAT RESPONDS TO CONTROL/C ----- ! ----- AND CONTROL/Y ----- SYS_STATUS = SYS$ASSIGN("TT",QIO_CHNL,,)! ASSIGN A CHANNEL TO TERMINAL SYS_STATUS = LIB$STOP(SYS_STATUS) IF (SYS_STATUS AND 1%) = 0% QIO_FUNC = IO$_SETMODE OR IO$M_OUTBAND ! INITIALIZE QIOW FUNCTION CODE QIO_MASK::MUST_BE_ZERO = 0% ! INIT MASK QIO_MASK::OUT_OF_BAND_CHAR = 2% ** 3% OR & 2% ** 25% ! INIT MASK TO ENABLE CTRL/C AND ! CTRL/Y (BIT NUMBER = BINARY ! VALUE OF THE CONTROL ! CHARACTER) ! ----- CALL THE QIOW SERVICE TO ENABLE THE OUT-OF-BAND AST. ----- ! ----- NOTE THAT OUT-OF-BAND ASTS ARE REPEATING ASTS; THEY ----- ! ----- CONTINUE TO BE DELIVERED UNTIL SPECIFICALLY DISABLED. ----- SYS_STATUS = SYS$QIOW(, QIO_CHNL BY VALUE, & QIO_FUNC BY VALUE, & QIO_IOSB() BY REF, , , & AST_ROUTINE BY REF, & QIO_MASK BY REF, , , ,) SYS_STATUS = QIO_IOSB(0%) IF (SYS_STATUS AND 1%) = 1% SYS_STATUS = LIB$STOP(SYS_STATUS) IF (SYS_STATUS AND 1%) = 0% ! ----- NOW, WHENEVER A CTRL/C OR CTRL/Y KEY IS PRESSED, ----- ! ----- INSTEAD OF THE PROGRAM BEING INTERRUPTED, THE VALUE OF ----- ! ----- EXIT_PROGRAM_FLAG WILL BE CHANGED FROM FALSE TO TRUE. ----- ! ----- THE CALLING PROGRAM CAN THEN TEST ITS VALUE WHENEVER IT ----- ! ----- NEEDS TO DO SO. ----- END SUB