.TITLE VTVTXT ;VT01 TEXT DRAWING ROUTINES .IDENT 'V001A' AC0=%0 ; ; THIS VERSION IS INTENDED FOR USE WITH PLXY11 AND HP PLOTTER ; ; DEFINITIONS: ; BS = 10 ;ASCII "BS" CHARACTER (BACKSPACE) FS = 34 ;ASCII "FS" CHARACTER (SET GRID SIZE) RS = 36 ;ASCII "RS" CHARACTER (SET TEXT ORIGIN) DEFSZ = 4 ;DEFAULT CHARACTER GRID SIZE ; .PSECT VTPKRO,RO ; ; SUBROUTINE CRTEXT -- DRAW TEXT STRING ON VT01 SCOPE ; CALLING SEQUENCE: ; CALL CRTEXT(IX,IY,NBUF,NCHAR,NSIZE) ; IX, IY: INTEGER*2, X AND Y COORDINATES OF FIRST CHARACTER OF STRING ; NBUF: LOGICAL*1 ARRAY, CHARACTER STRING TO BE DRAWN ; NCHAR: INTEGER*2, NO. OF CHARACTERS TO DRAW ; NSIZE: INTEGER*2, SIZE OF GRID TO BE USED FOR CHARACTERS (ZERO IMPLIES ; USE DEFAULT SIZE) ; CRTEXT::TST (R5)+ ;SKIP NO. OF ARGUMENTS MOV @(R5)+,R2 ;GET X COORDINATE MOV @(R5)+,R3 ;GET Y COORDINATE MOV (R5)+,R1 ;GET ADDRESS OF STRING MOVB @(R5)+,-(SP) ;GET NO. OF CHARACTERS MOVB @(R5)+,1(SP) ;GET CHARACTER SIZE INTO HIGH BYTE MOV (SP)+,R0 ;PUT INTO R0 JSR PC,VTVTXT ;CALL TEXT OUTPUT ROUTINE RTS PC ;DONE ; ; SUBROUTINE VTVTXT -- DRAW TEXT STRING ; ENTERED WITH R0=NO. OF CHARACTERS (LOW BYTE) AND CHARACTER SIZE (HIGH) ; R1=ADDRESS OF CHARACTERS TO DRAW ; R2=X COORDINATE OF FIRST CHARACTER ; R3=Y COORDINATE OF FIRST CHARACTER ; VTVTXT::TSTB R0 ;NO. OF CHARACTERS ZERO? BEQ 2$ ;YES, DONE MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R4,-(SP) MOV R5,-(SP) JSR R5,RSAV JSR PC,VTVSET ;SET UP ORIGIN AND SIZE JSR R5,RRES BIC #177400,R0 ;NO. OF CHARACTERS .IF NDF,XHP JSR R5,RSAV JSR PC,HPTXT ;PLOT TEXT ON HP PLOTTER JSR R5,RRES .ENDC CMP R0,#VTWID ;MORE THAN FIT ON LINE? BLE 1$ ;NO, OK MOV #VTWID,R0 ;YES, ONLY DO WHAT WILL FIT 1$: MOV R0,NCHRS ;STORE # CHARS TO DRAW CLRB NCHRS+1 ;BE SURE LEGAL MOV R1,CHRS ;STORE STRING ADDRESS LDCIF R2,AC0 MULF VPLTFC,AC0 ;SCALE TO PLOT UNITS STF AC0,XORG LDCIF R3,AC0 MULF VPLTFC,AC0 ;SCALE TO PLOT UNITS STF AC0,YORG MOV #3,III ;SET REF LOC TO CURRENT ONE (FOR ANGLE INFO) JSR R5,RSAV .IF NDF,XHP JSR PC,HPTST ;USING HP PLOTTER? BCS 44$ ;IF SO DON'T CALL PLXY11 .ENDC MOV #A2,R5 JSR PC,PLOT MOV #ARGS,R5 TST NCHRS ;ANYTHING TO DO? BLE 44$ ;IF LE NO SO SKIP CALL CMPB @R1,#40 ;IS 1ST CHAR A CONTROL? BLO 44$ ;IF SO ALSO SKIP JSR PC,SYMBOL ;PLOT THE TEXT 44$: JSR R5,RRES MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R1 MOV (SP)+,R0 2$: RTS PC ;DONE A2: .WORD 3,XORG,YORG,III III: .WORD -3 ARGS: .WORD 6,XORG,YORG,SIZ CHRS: .WORD 0 ;ADDR OF STRING .WORD CNGL .WORD NCH CNGL: .FLT2 0. NCH: NCHRS: .WORD 0 XORG: .FLT2 0. YORG: .FLT2 0. SIZ: .FLT2 0. ; RSAV: MOV R4,-(SP) MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV 12(SP),-(SP) ;SET UP RTS R5 TO RESTORE R5 RTS R5 .GLOBL RSAV,RRES RRES: TST (SP)+ ;JUNK CALL R5 MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ;BACK TO WHOEVER ; SUBROUTINE VTVSYM -- DRAW SINGLE CHARACTER (SYMBOL) ; ENTERED WITH R0=ASCII SYMBOL TO DRAW (LOW BYTE) AND GRID SIZE (HIGH) ; R2=X COORDINATE OF CHARACTER ; R3=Y COORDINATE OF CHARACTER ; STRG: .WORD 0 VTVSYM::MOV R4,-(SP) ;SAVE R4 MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) JSR R5,RSAV JSR PC,VTVSET ;SET UP SIZE AND ORIGIN JSR R5,RRES MOVB R0,STRG CMPB R0,#40 ;LEGAL CHARACTER? BLO 44$ ;IF NOT, SKIP CALL MOV #STRG,R1 ;SET VTVTXT CALL BIC #377,R0 INC R0 ;1 BYTE OUT MOV R5,-(SP) JSR PC,VTVTXT MOV (SP)+,R5 44$: MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 ;RESTORE R4 RTS PC ;DONE ; ; SUBROUTINE VTVNBR -- DRAW DECIMAL NUMBER AND SYMBOL ; ENTERED WITH R0=ASCII SYMBOL TO DRAW (LOW BYTE) AND GRID SIZE (HIGH) ; R1=NUMBER TO BE CONVERTED TO DECIMAL AND DRAWN ; R2=X COORDINATE OF SYMBOL (NUMBER APPEARS TO LEFT!!) ; R3=Y COORDINATE OF SYMBOL (AND NUMBER) NSGG: .WORD 0,0,0,0,0,0,0,0 NSGGE: OSTRG: .WORD 0,0,0,0,0,0,0,0 ; VSFLG: .WORD 0 VTVNBR:: CLR VSFLG ;NO VALID SYMBOL YET JSR R5,RSAV MOV R0,-(SP) ;SAVE REGISTERS MOV R4,-(SP) CLR -(SP) ;CLEAR NEGATIVE FLAG MOV R1,-(SP) ;SAVE NUMBER BGE 1$ ;NOT NEGATIVE INC 2(SP) ;SET NEGATIVE FLAG NEG R1 ;MAKE ABSOLUTE VALUE 1$: JSR R5,RSAV JSR PC,VTVSET ;SET UP SIZE AND ORIGIN JSR R5,RRES MOV #NSGGE,R4 CMPB R0,#40 ;VALID SYMBOL? BHI 44$ ;IF HIS YES MOVB #40,R0 ;ELSE PUT SPACE IN MOV #1,VSFLG ;FLAG INVALID SYMBOL THERE 44$: MOVB R0,-(R4) ;STASH SYMBOL ON RIGHT 2$: CLR R0 ;HIGH ORDER ZERO DIV #10.,R0 ;DIVIDE NO. BY 10 ADD #'0,R1 ;CONVERT REMAINDER TO ASCII MOVB R1,-(R4) ;STASH IT MOV R0,R1 ;GET QUOTIENT AS NEW NUMBER BNE 2$ ;IF ZERO, DONE MOV (SP)+,R1 ;RESTORE NUMBER TST (SP)+ ;WAS IT NEGATIVE? BEQ 3$ ;NO MOVB #'-,-(R4) ;PUT IN MINUS SIGN 3$: MOV R4,-(SP) SUB #NSGGE,R4 ;LOW - HIGH NEG R4 ;HIGH - LOW NOW ;R4 = COUNT OF CHARACTERS NOW AS ACTUALLY USED MOV (SP)+,R1 ;ADDRESS OF CHARACTERS MOV TSZZ,R0 ;SIZE OF GRID SWAB R0 BIC #377,R0 BISB R4,R0 ;SIZE OF STRING JSR R5,RSAV MOV #OSTRG,R5 ;OUT STRING TO USE 31$: MOVB (R1)+,(R5)+ ;COPY TO START AT EVEN ADDRESS DEC R4 BGT 31$ CLRB (R5)+ ;NULL TERMINATE THE STRING JSR R5,RRES MOV #OSTRG,R1 ;USE STRING STARTING ON EVEN BDY. MOV R3,-(SP) MOV R4,R3 ;LENGTH SUB VSFLG,R3 ;(ADJUSTED IF NO VALID SYMBOL WAS PUT OUT) MUL TSZ,R3 ; * SCALE SUB R3,R2 ;GIVES NEW START X MOV (SP)+,R3 ;GET Y BACK NOW JSR R5,RSAV JSR PC,VTVTXT ;PLOT THE STUFF JSR R5,RRES MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R0 JSR R5,RRES RTS PC ;RETURN ; ; INTERNAL SUBROUTINES: ; ; SUBROUTINE VTVSET -- SET UP VT01 HANDLER TEXT ORIGIN AND SIZE ; ENTERED WITH HIGH BYTE OF R0=CHARACTER SIZE (LOW BYTE IGNORED) ; R2=X COORDINATE OF TEXT ; R3=Y COORDINATE OF TEXT ; RETURNS WITH R4=ADDRESS OF OUTPUT LINE BUFFER ; VTVSET: MOV R5,-(SP) ;SAVE R5 MOV R0,R5 ;GET CHARACTER SIZE... SWAB R5 ;...INTO LOW BYTE BIC #177400,R5 TST R5 BNE 1$ ;NON-ZERO, USE IT MOVB #DEFSZ,R5 ;ZERO, USE DEFAULT 1$: SETF SETI MOV R5,TSZZ MUL #7.,R5 ;MAKE THE SIZE FOR FULL CHARACTER LDCIF R5,AC0 MOV R5,TSZ ;SAVE TEXT SIZE LOCALLY TOO MULF VPLTFC,AC0 ;SCALE TO PLOT UNITS STF AC0,SIZ ;SET UP SIZE OF TEXT MOV (SP)+,R5 ;RESTORE R5 RTS PC ;RETURN TSZ: .WORD 0 TSZZ: .WORD 0 ;UNSCALED SIZE ; .END