.TITLE BREAK .ENABL LC ; ; CALL BREAK( IBROKE ) -- This subroutine sets up an AST to TI0: ; and sets IBROKE to .FALSE.. On subsequent calls, IBROKE will ; continue to be .FALSE. until any character is typed at which ; time the AST is dettached and IBROKE is set to .TRUE. The AST ; may also be dettached by calling BREAK with no arguments. ; Breaking character is returned in lower byte of IBROKE. ; .PSECT BREAK .MCALL QIOW$S, ASTX$S ; BREAK:: TST (R5) ;HOW MANY ARGUMENTS? BGT USE ;BRANCH IF ONE ; TST USING ;AST IN USE? BEQ A ;BRANCH IF NOT CLR USING ;CLEAR USE FLAG QIOW$S #IO.DET,.MOLUN,#1 ;DETACH TERMINAL A: RTS PC ;RETURN ; USE: TST USING ;AST ALREADY SET UP? BNE SETF ;BRANCH IF TRUE ; CLR IBROKE ;CLEAR BREAK FLAG QIOW$S #IO.ATA,.MOLUN,#1,,,,<#BRKAST> ;SET AST MOV #-1,USING ;SET USING FLAG ; SETF: TST IBROKE ;BROKEN? BEQ 1$ ;BRANCH IF TRUE CLR USING ;CLEAR USE FLAG 1$: MOV IBROKE,@2(R5) ;SET BREAK STATUS RTS PC ;RETURN ; BRKAST: MOV (SP)+,IBROKE ;GET BREAKING CHARACTER MOVB #-1,IBROKE+1 ;SET BREAK FLAG QIOW$S #IO.DET,.MOLUN,#1 ;DETTACH FROM AST ASTX$S ;RETURN FROM AST ; USING: .WORD 0 ;FLAG SIGNIFYING USE OF AST IBROKE: .WORD 0 ;FLAG SIGNIFYING TERMINAL BREAK .END