.TITLE CLEAR .NLIST BEX .MCALL EXIT$S,DIR$,QIOW$,QIOW$C,QIO$C ; DEFINITIONS .MACRO PRINT A,B ;MACRO TO PRINT LENGTH B FROM ADDRESS A MOV A,OUTDPB+Q.IOPL ;ADDRESS MOV B,OUTDPB+Q.IOPL+2 ;LENGTH DIR$ #OUTDPB ;EXECUTE THE QIO .ENDM .MACRO IOFNCT FUNC ;MACRO TO DO A PARTICULAR I/O FUNCTION MOV OUTDPB+Q.IOFN,-(SP) ;PUSH CURRENT I/O FUNCTION CODE TO STK MOV #FUNC,OUTDPB+Q.IOFN ;PLACE FUNCTION CODE IN FUNCTION WORD DIR$ #OUTDPB ;DO THE FUNCTION MOV (SP)+,OUTDPB+Q.IOFN ;RESTORE PREVIOUS CODE .ENDM XPOS = OUTDPB+Q.IOPL+4 ;POINTER TO VERT. CURSOR CONTROL .PAGE ; CONTROL AREA. EVERYTHING ELSE COMES FROM HERE. CLEAR: DIR$ #SMCDPB ;DECLARE TERMINAL CAPABLE OF ;GENERATING ESCAPE SEQUENCES IOFNCT IO.ATT!TF.ESQ ;ATTACH THE TERMINAL ; ;ASK TERMINAL TO IDENTIFY TYPE & READ QIOW$C IO.RPR,5,2,,,, ;THE ESCAPE SEQUENCE ; IOFNCT IO.DET ;DETACH THE TERMINAL CLRB TCBUF+1 ;PREPARE TO DISABLE ESCAPE SEQUENCES DIR$ #SMCDPB ;DISABLE RECOGNITION OF ESC. SEQUENCES MOVB #TC.TTP,TCBUF ;PREPARE TO SET TERM. TYPE CMPB IOBUF+1,#'[ ;CHECK SECOND CHARACTER OF SEQUENCE BEQ VT1XX ;IF A BRACKET, IT'S A VT1XX CMPB IOBUF+1,#'/ ;CHECK AGAIN BEQ VT52 ;IF A SLASH, A VT5X UNDTRM: PRINT #TERROR,#TERRL ;OTHERWISE, NOT A DEFINED TERMINAL BR DONE ;Exit from the program from one point VT1XX: MOVB #T.V100,TCBUF+1 ;PREPARE TO SET TERM TO VT1XX IN SW BR DSPINI ;PROCEED WITH DISPLAY VT52: CMPB IOBUF+2,#'E ;CHECK THIRD CHARACTER OF SEQUENCE BLT UNDTRM ;IF K OR HIGHER, A VT52; OTHERWISE NO MOVB #T.VT52,TCBUF+1 ;PREPARE TO SET TERM. TO VT52 IN SW DSPINI: DIR$ #SMCDPB ;SET TERM. PROPERLY IN SOFTWARE ; EXIT ROUTINE (THIS IS A TOUGHIE) MOV #100401,XPOS ;BIT PATTERN FOR POS. 1,1 AND ERASURE PRINT #NULL,#1 ;POSITION CURSOR AT HOME AND ERASE SCREEN DONE: NOP EXIT$S .PAGE ; USEFUL PRINT STRINGS ERS1XX: .BYTE 33,133,112 ;VT1XX ERASE-TO-END-OF-SCREEN ERS52: .BYTE 33,112,0 ;VT52 ERASE-TO-END-OF-SCREEN NULL: .BYTE 0 ;NULL CHARACTER FOR CURSOR POSITIONING WHORU: .BYTE 33,132 ;ESC Z QUERIES TERMINAL IDENTITY .ENABL LC TERROR: .ASCII /You can only clear the screen of a VT5x or VT1xx. Sorry.../ TERRL =.-TERROR .ASCII / aaa / LSTCHR: .DSABL LC .EVEN ; IMPURE AREA (NOT TOO IMPURE, I HOPE!) OUTDPB: QIOW$ IO.WLB,5,1,,,,<0,0,40> ;DPB FOR OUTPUT OPERATION SMCDPB: QIOW$ SF.SMC,5,2,,IOSB,, ;DPB FOR SET MULT. ;CHARACTERISTICS OPERATION IOSB: .BLKW 2 ;I/O STATUS BUFFER TCBUF: .BYTE TC.ESQ,1 ;BUFFER TO SET/CLEAR ESCAPE SEQ. REC. TYPBUF: .BYTE TC.TTP,0 ;BUFFER TO GET TERM. CHARACTERISTICS IOBUF: .BLKB 16. ;PRINT BUFFER (AND CLI COMMAND ; LINE INPUT BUFFER) .END CLEAR