.TITLE SCROLL INTERACTIVE SCOPE SCROLLER FOR TECO "WATCH" .NLIST TTM .LIST TOC,MEB,BEX .DSABL REG,GBL,LC .SBTTL INTERACTIVE SCOPE SCROLLER FOR TECO "WATCH" ; LAST EDIT ON 02-JUN-83 BY MARK BRAMHALL .IDENT /V39.00/ .SBTTL GENERAL PDP-11 DEFINITIONS ; GENERAL REGISTER DEFINITIONS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 .SBTTL ASCII CHARACTER DEFINITIONS SPACE = 040 ;ASCII SPACE .SBTTL SCOPE "WATCH" ROUTINE MODIFIED FOR SCROLLING ;+ ; SCREEN - SCOPE "WATCH" ROUTINE MODIFIED FOR SCROLLING. ; ; IF NFLG(R5) >= 0 THEN "W" COMMAND ; ; R0 = N OF "NW" IF "NW" ; NWATCH(R5) IF "W" ; ; JSR PC,SCREEN ; ; IF NFLG(R5) < 0 THEN ":W" COMMAND ; ; R0 = N OF "N:W" OR "M,N:W" ; ; IF CFLG(R5) <> -1 THEN "N:W" COMMAND ; ; IF CFLG(R5) = -1 THEN "M,N:W" COMMAND ; ; M(R5) = M OF "M,N:W" ; ; JSR PC,SCREEN ; ; R0 = RETURNED VALUE ;- .PSECT SCREEN,RO,I,GBL,REL,OVR .ENABL LSB SCREEN: BIT #ET$IAS,ETYPE(R5) ;IS THE SCOPE AVAILABLE? BEQ 20$ ;NOPE, QUICKLY EXIT... TST NFLG(R5) ;WHAT KIND OF CALL IS THIS? BPL 10$ ;"W" COMMAND, GO PROCESS IT MOV #DOPARM,-(SP) ;":W" COMMAND, GO OFF TO PARAMETER HANDLING BR 50$ ; AFTER LOADING THE DUMB OVERLAY... .GLOBL ET$IAS, ETYPE, NFLG .SBTTL HANDLE W COMMANDS (SCOPE UPDATE) MODIFIED FOR SCROLLING ;+ ; HANDLE W COMMANDS (SCOPE UPDATE) MODIFIED FOR SCROLLING. ; ; W UPDATE SCOPE SCREEN LESS SCROLLED LINES IF SCROLLING; ELSE NOP ; 0W SET DEFAULT CURSOR LINE; FORGET EVERYTHING ; +NW SET CURSOR LINE TO N; FORGET EVERYTHING ; -1W UPDATE SCOPE SCREEN LESS SCROLLED LINES IF SCROLLING ; -NW FORGET TOP N-1 LINES OF SCREEN ; -1000W FORGET THAT OUTPUT WAS DONE ;- 10$: TST R0 ;CHECK OUT THE ARGUMENT'S SIGN BMI 30$ ;ARG <0, GO PROCESS A REAL CALL CMP R0,NWATCH(R5) ;ARG >=0, IS IT THE DEFAULT VALUE? BEQ 60$ ;IT'S THE DEFAULT, CALL SCROLLER IF ACTIVE TST R0 ;NOT THE DEFAULT, IS ARG=0? BNE FORGET ;NON-ZERO, NON-DEFAULT => FORGET EVERYTHING JSR PC,70$ ;ZERO, NON-DEFAULT => CALL SCROLLER IF ACTIVE FORGET: CLR INITFL+RWSIZE(R5) ;FORGET THE ENTIRE SCREEN CLR MRKFLG+RWSIZE(R5) ;CLEAR ANY SET "MARK" CLR TOPDOT+RWSIZE(R5) ;CLEAR LAST STARTING POSITION MOV #SPACE,SEEALL+RWSIZE(R5) ;RESET "SEEING ALL" FLAG CLR HLDFLG+RWSIZE(R5) ;RESET "HOLD SCREEN" FLAG 20$: RTS PC ;EXIT 30$: CMP R0,#-1 ;IS THIS A NORMAL SCOPE UPDATE CALL? BNE 40$ ;NOPE, A "FORGET" TYPE CALL JSR PC,70$ ;YEP, CHECK FOR CALLING THE SCROLLER 40$: MOV #SCRUPD,-(SP) ;SET TO PROCESS A REAL CALL 50$: JMP SCRLOD ;GO LOAD THE DUMB OVERLAY... 60$: MOV #20$,-(SP) ;JUST EXIT IF THE SCROLLER'S NOT ACTIVE 70$: TST SCROLN+RWSIZE(R5) ;IS THE SCROLLER ACTIVE? BEQ 20$ ;NOPE, JUST EXIT MOV #DOSCRL,(SP) ;YEP, CLOBBER EXIT WITH SCROLLER CALL BR 50$ ; AFTER LOADING THE DUMB OVERLAY... .DSABL LSB .GLOBL NWATCH, INITFL, RWSIZE, MRKFLG, TOPDOT .GLOBL SEEALL, HLDFLG, SCRUPD, SCRLOD, SCROLN .SBTTL START PROCESSING A SCROLLING CALL .PSECT SCRSUB,RO,I,GBL,REL,CON DOSCRL: CMP R0,NWATCH(R5) ;IS THE ARGUMENT THE DEFAULT? BEQ 10$ ;YES, DO A SCROLLING STYLE SCREEN UPDATE TST R0 ;NO, IS THIS A TRAPPED "-1W" CALL? BPL 20$ ;NOT THAT, MUST BE EXPLICIT "0W" 10$: JSR PC,30$ ;GO DO THE INITIAL SET UP JSR PC,DOUPDT ;GO DO A SCOPE UPDATE, FIX CURSOR, ETC. MOV NWATCH(R5),R0OFF+6(SP) ;RESTORE ORIGINAL CALLING ARGUMENT MOV #RESCUR,R3 ;SET SEQUENCE TO RESTORE CURSOR JMP DOTYPE ; AND GO DO IT & EXIT 20$: MOV #7,R0 ;SET SCROLLED REGION PARAMETER ACTION (+7) MOV #-1,CFLG(R5) ;SAY WE'RE CHANGING THE SCROLLED REGION CLR M(R5) ; AND IT WILL BECOME ZERO (I.E., TURNED OFF) JSR PC,DOPARM ;GO DO THE PARAMETER ALTERATIONS ;CLR R0 ;(RE-)SET THE CALLING ARGUMENT JMP FORGET ; THEN FORGET EVERYTHING & EXIT 30$: JSR PC,SCRINI ;SET THE SCOPE UP, ETC. MOV #SAVCUR,R3 ;SET SEQUENCE TO SAVE THE CURSOR JSR PC,DOTYPE ; AND GO DO IT SETNON: MOV VTSIZE+RWSIZE(R5),R2 ;GET NON-SCROLLED SCREEN SIZE CLR R1 ; AND START IT AT THE TOP JMP SETSCR ;GO SET THE SCROLLING REGION & EXIT .GLOBL NWATCH, R0OFF, RESCUR, DOTYPE, CFLG .GLOBL M, SAVCUR, VTSIZE, RWSIZE, SETSCR .SBTTL PROCESS A PARAMETER READ/WRITE CALL DOPARM: TST CFLG(R5) ;IS THIS CALL TO ALTER ANYTHING? BPL 20$ ;NO, JUST READING, IT'S ALWAYS O.K. CMP R0,#7 ;IS CALL FOR SCROLLING REGION (+7)? BNE 20$ ;NOPE MOV M(R5),-(SP) ;SAVE NEW SCROLLED REGION SIZE CMP (SP),SCROLN+RWSIZE(R5) ;IS THIS CALL REALLY CHANGING ANYTHING? BEQ 10$ ;NOPE, JUST GO READ THE OLD VALUE... CMP (SP),#1 ;IS THE NEW SIZE ONE? BEQ 10$ ;YEP, THAT'S AN ERROR MOV CRTYPE(R5),R0 ;GET THE SCOPE TYPE CMPB @CONSEQ(R0),#200 ;DOES THE FEATURE EXIST? BEQ 10$ ;NOPE, WE CAN'T DO IT MOV VTSIZE+RWSIZE(R5),R0 ;GET CURRENT SCREEN HEIGHT ADD SCROLN+RWSIZE(R5),R0 ; AND FORM REAL TOTAL SCREEN HEIGHT SUB (SP),R0 ;FIND NEW NON-SCROLLED SIZE MOV R0,M(R5) ;SET NEW SIZE FOR NON-SCROLLED AREA MOV #2,R0 ;THE CALLING ARGUMENT IS 2 FOR HEIGHT CHANGE JSR PC,SCRPRM ;NOW GO CHANGE THE SCREEN'S HEIGHT CMP R0,M(R5) ;DID WE GET WHAT WE ASKED FOR? BNE 10$ ;NOPE MOV (SP),SCROLN+RWSIZE(R5) ;YEP, SO SET THE NEW SCROLLED SIZE JSR PC,30$ ;GO SET UP THE SCREEN TST (SP) ;IS THE SCROLLED REGION NOW OFF? BEQ 10$ ;YEP, WE'RE DONE... JSR PC,40$ ;NOPE, DO A SCREEN UPDATE 10$: TST (SP)+ ;POP SAVED NEW SCROLLING REGION SIZE MOV #7,R0 ;RESTORE CALLING ARGUMENT CLR CFLG(R5) ; AND INDICATE A READ PARAMETER CALL 20$: JMP SCRPRM ;GO OFF TO REAL PARAMETER HANDLING 30$: JSR PC,SCRINI ;SET THE SCOPE UP, ETC. JSR PC,SETNON ;GO SET NON-SCROLLED AREA TST SCROLN+RWSIZE(R5) ;DID WE REALLY TURN OFF THE SCROLLER? BEQ SCREOS ;IT'S NOW OFF, POSITION TO SCREEN'S BOTTOM RTS PC ;IT'S NOW ON, JUST EXIT 40$: JSR PC,DOUPDT ;GO DO A SCOPE UPDATE, FIX CURSOR, ETC. SCREOS::MOV VTSIZ1+RWSIZE(R5),R0 ;WE WANT THE LAST LINE (ROW) OF SCREEN ADD SCROLN+RWSIZE(R5),R0 ; WHICH IS BOTH SIZES ADDED TOGETHER CLR R2 ;WE ALSO WANT THE LEFT HAND MARGIN MOV #-1000.,PRELIN+RWSIZE(R5) ;ENSURE USE OF MOV #-1000.,PRECOL+RWSIZE(R5) ; DIRECT CURSOR ADDRESSING JMP DIRECT ;MOVE THE CURSOR TO THERE & EXIT .GLOBL CFLG, CRTYPE, CONSEQ, VTSIZE, RWSIZE, SCROLN .GLOBL M, SCRPRM, VTSIZ1, PRELIN, PRECOL, DIRECT .SBTTL INITIALIZE THE SCOPE ;+ ; SCRINI - INITIALIZE THE SCOPE. ; ; JSR PC,SCRINI ; ; R0 = UNDEFINED ; R1 = UNDEFINED ; R2 = UNDEFINED ; R3 = UNDEFINED ; R4 = UNDEFINED ; SP -> FORCE I/O, CLEAN UP, SAVED "ET", 'SAVREG' SAVED REGISTERS... ; W/ SAVED R0 UNDEFINED ;- SCRINI: MOV (SP)+,R0 ;MOVE THE REAL RETURN ADDRESS TO R0 JSR R0,SCRSAV ;SAVE REGISTERS, SET CLEAN UP, ETC. MOV #SCRDNE,-(SP) ; THEN SET RETURN TO FORCE OUT I/O JSR PC,NOCTLO ;CANCEL ANY CONTROL/O EFFECT TST INITFL+RWSIZE(R5) ;KNOWN SCREEN STATE? BMI 10$ ;YEP MOV #FIXSEQ,R3 ;NOPE, SET SEQUENCE TO FIX UP TERMINAL JSR PC,DOTYPE ; AND GO DO IT MOV #-2,INITFL+RWSIZE(R5) ;STILL UNKNOWN, BUT ALL FIXED NOW 10$: JMP @R0OFF+6(SP) ;TAKE AN EXIT... .GLOBL SCRSAV, SCRDNE, NOCTLO, INITFL, RWSIZE, FIXSEQ, DOTYPE, R0OFF .SBTTL DO A SCREEN UPDATE, FIX UP CURSOR CHARACTER AND SCROLLED REGION ;+ ; DOUPDT - DO A SCREEN UPDATE, FIX UP CURSOR CHARACTER AND SCROLLED REGION. ; ; JSR PC,DOUPDT ; ; R0 = UNDEFINED ; R1 = UNDEFINED ; R2 = UNDEFINED ; R3 = UNDEFINED ; R4 = UNDEFINED ; SP -> FORCE I/O, CLEAN UP, SAVED "ET", 'SAVREG' SAVED REGISTERS... ; W/ SAVED R0 UNDEFINED ;- DOUPDT: MOV #-1,R0 ;SET ARGUMENT TO DO A SCOPE UPDATE JSR PC,SCRUPD ; AND GO DO IT MOV (SP)+,R0 ;MOVE THE REAL RETURN ADDRESS TO R0 JSR R0,SCRSAV ;SAVE REGISTERS, SET CLEAN UP, ETC. MOV #SCRDNE,-(SP) ; THEN SET RETURN TO FORCE OUT I/O TST TFLG(R5) ;DID THE "STOP SOON" (CONTROL/C) FLAG COME ON? BPL 10$ ;NOPE CLR INITFL+RWSIZE(R5) ;YEP, FORGET WHAT'S ON THE SCREEN... 10$: JSR PC,NOCTLO ;ENSURE CONTROL/O IS TURNED OFF MOV CURABS+RWSIZE(R5),R1 ;DID WE FIND THE CURSOR? BEQ 40$ ;NOPE MOV #CONSEQ,R3 ;SET SEQUENCE FOR CURSOR DISPLAY ON JSR PC,DOTYPE ; AND GO DO IT MOVB (R1),R0 ;GET CHARACTER UNDER THE CURSOR BPL 20$ ;NOT WITHIN THE MARK'D REGION BIC #^C<177>,R0 ;WITHIN MARK'D REGION, TRIM OFF THE INDICATION MOV #MONSEQ,R3 ;SET SEQUENCE FOR MARK ON JSR PC,DOTYPE ; AND GO DO IT 20$: CMP R0,#SPACE ;IS CURSOR CHARACTER A SPECIAL GRAPHIC SYMBOL? BHIS 30$ ;NOPE MOV CRTYPE(R5),R3 ;YEP, GET THE SCOPE TYPE ADD GRPTBL(R3),R0 ;FIND INDEX INTO CORRECT SYMBOL TABLE MOVB -(R0),R0 ;GET CORRECT GRAPHICS CHARACTER MOV #GONSEQ,R3 ;SET SEQUENCE FOR GRAPHICS ON JSR PC,DOTYPE ; AND GO DO IT 30$: JSR PC,TYPEBF ;NOW (RE-)OUTPUT THE CURSOR CHARACTER MOV #COFSEQ,R3 ;SET SEQUENCE FOR CURSOR DISPLAY OFF JSR PC,DOTYPE ; AND GO DO IT BIC #1,R1 ;MAKE THE SCREEN MAP POINTER EVEN MOV (PC)+,(R1) ; AND "FORGET" CHARACTER(S) UNDER CURSOR .BYTE 200,200 40$: MOV SCROLN+RWSIZE(R5),R2 ;SET SCROLLED REGION SIZE MOV VTSIZE+RWSIZE(R5),R1 ; AND START IT AFTER NON-SCROLLED AREA JSR PC,SETSCR ;GO SET THE SCROLLING REGION JMP @R0OFF+6(SP) ;TAKE AN EXIT... .GLOBL SCRUPD, SCRSAV, SCRDNE, TFLG, INITFL, RWSIZE, NOCTLO .GLOBL CURABS, CONSEQ, DOTYPE, MONSEQ, CRTYPE, GRPTBL, GONSEQ .GLOBL TYPEBF, COFSEQ, SCROLN, VTSIZE, SETSCR, R0OFF .END