.TITLE VT100 Screen Clear $DVIDEF ;Device Information Item Definitions $TT2DEF ;Terminal Characteristics N_LINES = 64 ;Number of ports to scan MSG_LEN = 12 ;Length of MSG in bytes MSG: .ASCII '<' ;Clear sequence SND_DLY: .ASCID '0 00:00:00.50' ;QIO delay time SND_BIN: .BLKQ 1 LOOP_DLY: .ASCID '0 00:00:01.00' ;Loop delay time LOOP_BIN: .BLKQ 1 TT_NUM: .LONG 0 ;Number of current port TT_PORT: .ASCID 'TTA0' ;Logical name for port TT_CHAN: .BLKL 1 TT_IOSB: .BLKL 2 TT_ITMLST:.WORD 4,DVI$_DEVDEPEND2 ;Item list for $GETDVI .ADDRESS TT_CHAR,0 .WORD 0,0 TT_CHAR: .BLKL 1 MBX_NAME: .ASCID 'VT100_CLEAR' MBX_CHAN: .BLKL 1 MBX_IOSB: .BLKL 2 BUFLEN = 128 HOLD_DLY: .LONG 0,HOLD_DLY+8 ;Descriptor for delay MBX_BUFF: .BLKB BUFLEN HOLD_BIN: .BLKQ 1 ;*** Start of main program *** .ENTRY VT100_CLEAR,^M $BINTIM_S TIMBUF=SND_DLY,TIMADR=SND_BIN CMPL R0,#SS$_NORMAL BEQL 10$ $EXIT_S R0 10$: $BINTIM_S TIMBUF=LOOP_DLY,TIMADR=LOOP_BIN CMPL R0,#SS$_NORMAL BEQL 20$ $EXIT_S R0 20$: $CREMBX_S PRMFLG=#0,CHAN=MBX_CHAN,- ;Set up mailbox for delays MAXMSG=#128,BUFQUO=#4096,- PROMSK=#^X0FFF0,LOGNAM=MBX_NAME CMPL R0,#SS$_NORMAL BEQL 30$ $EXIT_S R0 30$: $QIO_S CHAN=MBX_CHAN,- ;Arm AST on mailbox FUNC=#IO$_SETMODE!IO$M_WRTATTN,- P1=MBX_AST,P2=#0 CMPL R0,#SS$_NORMAL BEQL LOOP $EXIT_S R0 ;Main Loop LOOP: ADDL3 #2,TT_PORT+4,R3 ;Get descriptor pointer BICL3 #^X7,TT_NUM,R2 ;Compute controller letter ASHL #-3,R2,R2 ADDL3 #^A'A',R2,(R3) ; ... and store it BICL3 #^XFFFFFFF8,TT_NUM,R2 ;Compute unit number ADDL3 #^A'0',R2,1(R3) ; ... and store it $ASSIGN_S DEVNAM=TT_PORT,CHAN=TT_CHAN;Try to get channel CMPL R0,#SS$_NORMAL BEQL 10$ BRW NEXT_TT ;Failed, try next port 10$: $GETDVI_S EFN=#1,CHAN=TT_CHAN,- IOSB=TT_IOSB,ITMLST=TT_ITMLST $WAITFR_S EFN=#1 CMPW TT_IOSB,#SS$_NORMAL BEQL 20$ $EXIT_S R0 20$: BBS #TT2$V_DECCRT,TT_CHAR,30$ BRW DEASGN ;Not a VT100 30$: $QIO_S CHAN=TT_CHAN,- ;Clear screen FUNC=#IO$_WRITEVBLK,- P1=MSG,P2=#MSG_LEN CMPL R0,#SS$_NORMAL BEQL 40$ $EXIT_S R0 40$: $SETIMR_S EFN=#1,DAYTIM=SND_BIN ;Wait SND_DLY CMPL R0,#SS$_NORMAL BEQL 50$ $EXIT_S R0 50$: $WAITFR_S EFN=#1 CMPL R0,#SS$_NORMAL BEQL 60$ $EXIT_S R0 60$: $CANCEL_S CHAN=TT_CHAN ;Cancel outstanding I/O CMPL R0,#SS$_NORMAL BEQL DEASGN $EXIT_S R0 DEASGN: $DASSGN_S CHAN=TT_CHAN ;Release channel CMPL R0,#SS$_NORMAL BEQL NEXT_TT $EXIT_S R0 NEXT_TT: INCL TT_NUM ;Go to next port CMPL TT_NUM,#N_LINES BNEQ WAIT CLRL TT_NUM WAIT: $SETIMR_S EFN=#1,DAYTIM=LOOP_BIN ;Wait LOOP_DLY CMPL R0,#SS$_NORMAL BEQL 10$ $EXIT_S R0 10$: $WAITFR_S EFN=#1 CMPL R0,#SS$_NORMAL BEQL 20$ $EXIT_S R0 20$: CMPL HOLD_BIN,#0 ;Is there a hold delay? BEQL 50$ $SETIMR_S EFN=#1,DAYTIM=HOLD_BIN ;Yes, wait CMPL R0,#SS$_NORMAL BEQL 30$ $EXIT_S R0 30$: $WAITFR_S EFN=#1 CMPL R0,#SS$_NORMAL BEQL 40$ $EXIT_S R0 40$: CLRL HOLD_BIN ;Clear hold delay 50$: BRW LOOP .ENTRY MBX_AST,^M<> $QIO_S CHAN=MBX_CHAN,- ;Get delay time from mailbox FUNC=#IO$_READVBLK!IO$M_NOW,- IOSB=MBX_IOSB,P1=MBX_BUFF,P2=#BUFLEN CMPL R0,#SS$_NORMAL BEQL 10$ $EXIT_S R0 10$: MOVW MBX_IOSB+2,HOLD_DLY $BINTIM_S TIMBUF=HOLD_DLY,TIMADR=HOLD_BIN CMPL R0,#SS$_NORMAL BEQL 20$ CLRL HOLD_BIN ;Bad time in mailbox 20$: $QIO_S CHAN=MBX_CHAN,- ;Arm AST on mailbox FUNC=#IO$_SETMODE!IO$M_WRTATTN,- P1=MBX_AST,P2=#0 CMPL R0,#SS$_NORMAL BEQL 30$ $EXIT_S R0 30$: RET .END VT100_CLEAR