.TITLE VTINIT ;VT01 INITIALIZATION & STATUS ROUTINES .IDENT 'V001A' ; ; THIS VERSION IS FOR PLXY-11 AND HP PLOTTER USE ; ; DEFINITIONS: ; VTWID == 132. ;MAXIMUM VT01 LINE WIDTH (CHARACTERS) SO = 16 ;ASCII "SO" CHARACTER (NON-STORAGE MODE) SI = 17 ;ASCII "SI" CHARACTER (STORAGE MODE) CAN = 30 ;ASCII "CAN" CHARACTER (ERASE) ERASE = 2 ;ERASE BIT IN VT01 CSR STORE = 4 ;STORAGE MODE BIT IN VT01 CSR DEFALT = 4 ;DEFAULT VT01 CSR VALUE ILLEG = 0 ;(NO ILLEGAL BITS) ;ILLEG = 100173 ;ILLEGAL BITS IN VT01 CSR ; BITS 70 ENCODE COLOR FOR HP PLOTTER (0-7 FOR COLOR 1-8) ; .PSECT VTPKRO,RO ; ; SUBROUTINE VTINIT -- INITIALIZE VT01 SOFTWARE, ERASE SCREEN ; CALLING SEQUENCE: ; CALL VTINIT(IMODE) ; IMODE: INTEGER*2, INITIAL VT01 CSR VALUE (ZERO IMPLIES DEFAULT) ; VTINIT::CLR NGXPOS ;CLEAR X COORDINATE CLR NGYPOS ;ALSO Y JSR R5,RSAV MOV #ERASE,R1 ;ERASE FLAG BR VTMD ;USE VTMODE CODE ; ; SUBROUTINE VTMODE -- SET NEW CSR VALUE; IF ERASE BIT ON, ERASE SCREEN ; CALLING SEQUENCE: ; CALL VTMODE(IMODE) ; IMODE: INTEGER*2, NEW VT01 CSR VALUE (ZERO IMPLIES DEFAULT AND ERASE) ; VTMODE:: JSR R5,RSAV CLR R1 ;DON'T FORCE ERASURE VTMD: MOV @2(R5),R0 ;GET IMODE VALUE BNE 1$ ;SUPPLIED, USE IT MOV #DEFALT!ERASE,R0;ASSUME DEFAULT & ERASE 1$: BIS R0,R1 ;ADD IN ERASE FLAG BIC #ILLEG,R0 ;CLEAR ILLEGAL BITS MOV R0,IGCSR ;SET VT01 CSR VALUE MOV VTARG+2,R4 ;LINE BUFFER ADDRESS BIT #ERASE,R1 ;ERASE ON FOR ANY REASON? BEQ 4$ ;NO JSR PC,VTERAS ;YES, ERASE SCREEN 4$: TST GOING ;ALREADY HAVE AN OPEN OUTPUT? BNE 7$ ;IF SO (NE) THEN SKIP INIT CALL HERE MOV #PLSTX,R5 ;SET UP PLXY11 ARGS .IF NDF,XHP JSR PC,HPTST ;PLOTTER OR LP? BCC 67$ JSR PC,HPINIT ;HPINIT IGNORES ARGS BR 68$ 67$: .ENDC JSR PC,PLOTST ;IF NOT, INIT OUTPUT VECTOR FILE. .IF NDF,XHP 68$: .ENDC INC GOING ;ALSO FLAG SET UP. 7$: JSR R5,RRES RTS PC ;DONE PLSTX: .WORD 3 ;3 ARGS .WORD ZRO,UNIT,ZRO ;ARG LIST FOR INIT CALL ZRO: .WORD 0 UNIT: .ASCII /IN/ ;PLOT IN INCHES GOING: .WORD 0 ;PLOT OUTPUT IN PROGRESS IF NONZRO FCLS: .WORD 1,FCTR VPLTFC:: FCTR: .FLT4 .006445 ;FCTR IS SCALE FACTOR SUCH THAT 2048 CORRESPONDS TO 13.2 INCHES ;WHEN MULTIPLIED BY FACTOR. ; ; SUBROUTINE VTERAS -- ERASE VT01 SCREEN ; CALLING SEQUENCE: ; CALL VTERAS ; ; N.B. - CALL VTERAS AT END OF A SET OF PLOTS TO ; FORCE OUT THE LAST ONE. ; VTERAS::MOV R4,-(SP) ;SAVE R4 MOV VTARG+2,R4 ;LINE BUFFER ADDRESS TST GOING BEQ 1$ JSR R5,RSAV .IF NDF,XHP JSR PC,HPTST BCC 6$ JSR PC,HPOFF BR 7$ 6$: .ENDC JSR PC,PLOTND ;END PLXY11 .IIF NDF,XHP, 7$: JSR R5,RRES CLR GOING 1$: MOV (SP)+,R4 ;RESTORE R4 RTS PC ;RETURN ; ; SUBROUTINE VTSTAT -- GET CURRENT VT01 STATUS ; CALLING SEQUENCE: ; CALL VTSTAT(ISTAT,ICSR) ; ISTAT: INTEGER*2, ON RETURN CONTAINS VT01 STATUS (UNUSED AT PRESENT) ; ICSR: INTEGER*2, ON RETURN CONTAINS CURRENT VT01 CSR VALUE ; VTSTAT::MOV IGSTAT,@2(R5) ;STORE STATUS VALUE MOV IGCSR,@4(R5) ;STORE CSR VALUE RTS PC ;RETURN ; ; SUBROUTINE VTPPOS -- GET CURRENT VT01 GRAPHICS COORDINATES ; CALLING SEQUENCE: ; CALL VTPPOS(IX,IY) ; IX: INTEGER*2, ON RETURN CONTAINS CURRENT X COORDINATE ; IY: INTEGER*2, ON RETURN CONTAINS CURRENT Y COORDINATE ; VTPPOS::MOV NGXPOS,@2(R5) ;STORE X POSITION MOV NGYPOS,@4(R5) ;STORE Y POSITION RTS PC ;RETURN .IF EQ 1 ; ; THE FOLLOWING SUBROUTINES ARE USED INTERNALLY BY THE VT01 PACKAGE: ; ; SUBROUTINE OUT2 -- CONVERT 11 BIT SCOPE COORDINATE TO TWO CHARACTERS ; TO BE OUTPUT TO THE VT01 HANDLER ; ENTERED WITH R4=ADDR. OF OUTPUT LINE BUFFER (PLACE TO STORE CHARACTERS) ; R5=COORDINATE TO BE CONVERTED ; RETURNS WITH R4=NEXT AVAILABLE ADDRESS IN OUTPUT BUFFER (OLD R4 PLUS 2) ; OUT2:: MOV R5,-(SP) ;SAVE COORDINATE ASH #-6,R5 ;GET HIGH 5 BITS OF 11 BIC #177740,R5 ;MASK OFF REST OF JUNK BIS #100,R5 ;SET BIT 6 SO IT'S NOT CTRL CHAR MOVB R5,(R4)+ ;STORE IT IN BUFFER MOV (SP),R5 ;GET COORDINATE AGAIN BIC #177700,R5 ;GET LOW 6 BITS OF 11 BIS #100,R5 ;FIX UP FOR VT HANDLER MOVB R5,(R4)+ ;STASH IT, TOO MOV (SP)+,R5 ;RESTORE COORDINATE RTS PC ;RETURN ; ; SUBROUTINE VTSEND -- SEND CONTENTS OF VT01 PACKAGE LINE BUFFER TO VT: ; THIS ROUTINE CALLS A USER-SUPPLIED SUBROUTINE VTOUT BY THE FOLLOWING ; INSTRUCTION: ; CALL VTOUT(BUFFER,NUMBER) ; WHERE "BUFFER" IS A LOGICAL*1 ARRAY CONTAINING THE CHARACTERS TO BE ; OUTPUT AND "NUMBER" (INTEGER*2) IS THE NUMBER OF CHARACTERS TO OUTPUT ; (MAXIMUM 72). "VTOUT" SHOULD OUTPUT THE CONTENTS OF BUFFER(1) TO ; BUFFER(NUMBER) VIA UNFORMATTED I/O TO THE VT HANDLER (OR TO A FILE ; WHICH WILL LATER BE COPIED TO THE VT HANDLER). ; ; ENTERED WITH R4=ADDRESS OF LAST CHARACTER TO BE OUTPUT PLUS ONE ; RETURNS WITH R4=ADDRESS OF START OF VT01 BUFFER ; VTSEND::MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R5,-(SP) MOV #VTARG,R5 ;ARGUMENT LIST FOR VTOUT SUBROUTINE SUB 2(R5),R4 ;FINAL MINUS INITIAL ADDRESS... MOV R4,VTNUM ;...IS NO. OF CHARACTERS TO OUTPUT JSR PC,VTOUT ;CALL USER-SUPPLIED OUTPUT ROUTINE MOV VTARG+2,R4 ;LINE BUFFER ADDRESS MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R3 ;(VTOUT CAN BASH THEM ALL!) MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ;RETURN .ENDC ;EQ,1 ; ; INTERNAL DATA AREAS FOR VT01 PACKAGE: ; .PSECT VTPKRD,RO,D ; VTARG:: .WORD 2 ;TWO ARGUMENTS .WORD VTBUF ;BUFFER .WORD VTNUM ;NUMBER OF CHARACTERS ; .PSECT VTPKRW,D ; VTNUM: .WORD 0 ;NO. OF CHARACTERS TO WRITE VTBUF: .BLKB VTWID ;OUTPUT LINE BUFFER ; ; COMMON DATA AREA FOR VT01 PACKAGE: ; .PSECT VTDATA,D,GBL,OVR ; IGSTAT: .WORD 0 ;VT01 STATUS (UNUSED AT PRESENT) IGCSR: .WORD 4 ;VT01 CSR (CONTROL & STATUS REGISTER) NGXPOS: .WORD 0 ;CURRENT GRAPHICS X POSITION NGYPOS: .WORD 0 ;CURRENT GRAPHICS Y POSITION ; .END