.TITLE HCSIZE .ENABL LC ; ; CALL HCSIZE(STRING,NCHRS,W,HA,HB) -- This routine returns the expected ; size of the generated character string by SUBROUTINE HCGEN. The ; arguments are defined below. ; ; CALL HCGEN(X,Y,STRING,NCHRS[,JUSTFY]) -- This routine generates the character ; string justified at (X,Y) using the Hershey character sets. Note: If ; NCHRS = 0, the previously defined string is used (i.e. from a call ; to SUBROUTINE HCSIZE). ; ; STRING ASCII character string. ; NCHRS Number of characters. ; W Width of string in scale inches. ; HA Height of string from baseline to top of superscript in ; scale inches. ; HB Height of string from baseline to bottom of lowest subscript ; in scale inches. Note: This number will be negative. ; X,Y Location of start of string in scale inches. ; JUSTFY String justification. ; JUSTFY = 'L', Left (Default) ; 'C', Center ; 'R', Right ; ; Note: Character size and orientation are set by SUBROUTINE SIZEUP. ; ; CALL HCUSE(KSET) -- This subroutine controls the use of the ; Hershey character sets. ; ; KSET 1,2,...,n Character set KSET ; 0 Deactivate character sets ; ; Note: If called with no arguments or an invalid argument, character ; set 3 is used. ; ; CALL HCWADJ( WIDRAT ) -- This subroutine controls the width of the ; character spacing, WIDRAT = 1. for normal spacing. To get a line of ; text HAVE inches in length to be WANT inches in length, ; CALL HCWADJ( WANT/HAVE ). ; .PSECT HCSIZE .MCALL ASTX$S, CLEF$C, SDAT$S, SETF$C, SRDA$C .MCALL RCVD$C, RQST$S, WTSE$C ; HCUSE:: TST ILun ;VALID PLOTTING TERMINAL? BNE 1$ ;BRANCH IF TRUE RTS PC ;ELSE RETURN 1$: MOV #3,KSetNo ;SET DEFAULT CHARACTER SET TST (R5) ;ANY ARGUMENTS? BEQ 2$ ;BRANCH IF NONE MOV @2(R5),KSetNo ;GET ARGUMENT 2$: TST IFancy ;ACTIVE? BPL 3$ ;BRANCH IF NOT RTS PC ;RETURN ; 3$: CLEF$C 43.,HCSIZE ;CLEAR EVENT FLAG CMP #3,IDev ;IS DEVICE A TEKTRONIX 4662? BEQ 4$ ;BRANCH IF TRUE CMP #12,IsTerm ;dialups must go to slow hcs BEQ 4$ CMP #15,isTerm BEQ 4$ MOV #^R...,TOTASK ;SET TASK NAME TO ...HCS MOV #^RHCS,TOTASK+2 ; CONT. BR 5$ ;BRANCH TO REQUEST TASK. 4$: MOV #^RHCS,TOTASK ;SET TASK NAME TO HCSLOW MOV #^RLOW,TOTASK+2 ; CONT. 5$: RQST$S #TOTASK ;REQUEST PROPER TASK. TST $DSW ;SUCCESSFUL (TASK NOT YET ACTIVE)? BLT B1 ;BRANCH IS ALREADY ACTIVE WTSE$C 43.,HCSIZE ;WAIT UNTIL TASK ACTIVE B1: SRDA$C GOTIT,HCSIZE ;SPECIFY RECEIVE DATA AST BIS #100000,IFancy ;SET ACTIVE FLAG MOV R5,-(SP) ;SAVE R5 MOV #LOGIN,R5 ;SET DUMMY LOGIN JSR PC,HCSIZE ;GET SIZE OF STRING AS LOGIN REQUEST MOV (SP)+,R5 ;RESTORE R5 RTS PC ;RETURN ; TOTASK: .RAD50 /TOTASK/ ;LOCATION OF PROPER TASK NAME. LOGIN: .WORD 5,HELLO,LOGIN,JUNK,JUNK,JUNK ;ARGUMENT LIST FOR LOGIN HELLO: .ASCII /Hello/ ;SAY HELLO TO ...HCS .EVEN JUNK: .WORD 0,0 ;STORAGE AREA FOR W, U AND D. ; GOTIT: RCVD$C ,IDAT,HCSIZE ;GET DATA SETF$C 1,HCSIZE ;SET FLAG ASTX$S ;RETURN FROM AST ; HCWADJ::TST (R5) ;ANY ARGUMENTS? BEQ 1$ ;BRANCH IF NOT MOV 2(R5),R0 ;GET ADDRESS OF WIDRAT MOV (R0)+,WidAdj ;SET NEW WIDTH ADJUSTMENT MOV (R0),WidAdj+2 ; CONT. 1$: RTS PC ;RETURN ; F0=%0 F1=%1 ; HCSIZE::MOV #-1,DIMEN ;ENTRY IS FOR DIMENSIONING BR A ;BRANCH OVER ALTERNATE ENTRY POINT HCGEN:: CMP #5,(R5) ;FIVE ARGUMENTS? BNE 3$ ;BRANCH IF NOT MOVB @12(R5),DIMEN ;GET JUSTFY CLRB DIMEN+1 ;CLEAR OFF TOP CMP DIMEN,#140 ;LOWER CASE? BLE 1$ ;BRANCH IF NOT SUB #40,DIMEN ;MAKE INTO UPPER CASE. 1$: CMP #'C,DIMEN ;CENTER? BNE 2$ ;BRANCH IF NOT MOV #2,DIMEN ;SET DIMEN TO CENTER BR 4$ ;BRANCH TO CONTINUE 2$: CMP #'R,DIMEN ;RIGHT? BNE 3$ ;BRANCH IF NOT MOV #3,DIMEN ;SET DIMEN TO RIGHT BR 4$ ;BRANCH TO CONTINUE 3$: CLR DIMEN ;SET DIMEN TO LEFT 4$: JSR PC,CLRALL ;CLEAR OFF DEFINITIONS ; A: TST ILun ;VALID PLOTTING TERMINAL? BNE 10$ ;BRANCH IF TRUE RTS PC ;ELSE RETURN ; 10$: MOVB DIMEN,DI ;SET DIMENSIONING FLAG CLEF$C 1,HCSIZE ;CLEAR FLAG STF F0,-(SP) ;SAVE F0 STF F1,-(SP) ;SAVE F1 STFPS -(SP) ;SAVE FPP STATUS SETI ;SET INTEGER MODE SETF ;SET FLOATING POINT MODE ; TST DIMEN ;DIMENSIONING? BGE B ;BRANCH IF NOT ; TST @4(R5) ;NCHRS > 0? BGT 1$ ;BRANCH IF TRUE CLRF @6(R5) ;ZERO W CLRF @10(R5) ;ZERO HA CLRF @12(R5) ;ZERO HB JMP L ;ELSE RETURN ; 1$: TST KSetNo ;CHARACTER GENERATOR? BEQ 15$ ;BRANCH IF FALSE JMP D ;JUMP IF TRUE ; 15$: MOV 2(R5),LIST1+4 ;SAVE ADDRESS OF STRING MOV @4(R5),NCHRS ;SAVE NCHRS CMP NCHRS,#130. ;AUTO-COUNT BLE 4$ ;BRANCH IF NOT ; MOV 2(R5),R0 ;GET STARTING ADDRESS OF STRING 2$: TSTB (R0)+ ;END OF STRING? BEQ 3$ ;BRANCH IF TRUE CMPB #'$,(R0) ;CONTROL CHARACTER? BNE 2$ ;BRANCH IF NOT CMPB #'\,1(R0) ;NEXT CHARACTER A "\"? BNE 2$ ;BRANCH IF NOT 3$: SUB 2(R5),R0 ;SUBTRACT STARTING ADDRESS DEC R0 ;REMOVE END BYTE (ZERO) MOV R0,NCHRS ;STORE AS NCHRS ; 4$: LDCIF NCHRS,F0 ;SET FLOAT( NCHRS ) LDF DeltaH,F1 ;SET DELTAH MULF F1,F0 ;DELTAH*FLOAT( NCHRS ) STF F0,@6(R5) ;STORE ABOVE AS W LDF CSize,F0 ;SET CSIZE STF F0,@10(R5) ;STORE ABOVE AS HA CLRF @12(R5) ;ZERO HB JMP L ;JUMP TO RETURN ; B: LDF @2(R5),F0 ;SET X LDF CnvMag,F1 ;SET CNVMAG MULF F1,F0 ;CNVMAG*X STCFI F0,IX ;STORE IFIX OF ABOVE AS IX ADD IX0,IX ;MAKE AN ABSOLUTE ADDRESS LDF @4(R5),F0 ;SET Y MULF F1,F0 ;CNVMAG*Y STCFI F0,IY ;STORE IFIX OF ABOVE AS IY ADD IY0,IY ;MAKE AN ABSOLUTE ADDRESS ; TST KSetNo ;CHARACTER GENERATOR? BNE D ;BRANCH IF TRUE ; TST @10(R5) ;NCHRS > 0 BLE C ;BRANCH IF NOT MOV 6(R5),LIST1+4 ;SAVE ADDRRSS OF STRING MOV @10(R5),NCHRS ;SAVE NCHRS CMP NCHRS,#130. ;AUTO-COUNT? BLE C ;BRANCH IF FALSE ; MOV 6(R5),R0 ;GET STARTING ADDRESS OF STRING 1$: TSTB (R0)+ ;END OF STRING? BEQ 2$ ;BRANCH IF TRUE CMPB #'$,(R0) ;CONTROL CHARACTER? BNE 1$ ;BRANCH IF NOT CMPB #'\,1(R0) ;NEXT CHARACTER A "\"? BNE 1$ ;BRANCH IF NOT 2$: SUB 6(R5),R0 ;SUBTRACT STARTING ADDRESS DEC R0 ;REMOVE END BYTE (ZERO) MOV R0,NCHRS ;STORE AS NCHRS ; C: LDCIF NCHRS,F0 ;LOAD NCHRS TST DIMEN ;ZER0? BEQ 1$ ;BRANCH IF SO DEC DIMEN ;DECREMENT DIMENSION 1$: LDCIF DIMEN,F1 ;LOAD DIMEN MULF F1,F0 ;MULTIPLY LDCIF #2,F1 ;LOAD 2. DIVF F1,F0 ;DIVIDE LDF DELTAH,F1 ;LOAD DELTAH MULF F1,F0 ;MULTIPLY LDF CNVMAG,F1 ;LOAD CNVMAG MULF F1,F0 ;MULTIPLY STF F0,-(SP) ;SAVE COPY LDF COSUP,F1 ;LOAD COSUP MULF F1,F0 ;MULIPLY STCFI F0,R0 ;INTEGERIZE SUB R0,IX ;SUBTRACT FROM IX LDF (SP)+,F0 ;RELOAD WIDTH LDF SINUP,F1 ;LOAD SINUP MULF F1,F0 ;MULTIPLY STCFI F0,R0 ;INTEGERIZE SUB R0,IY ;SUBTRACT FROM IY MOV R5,-(SP) ;SAVE R5 MOV #LIST0,R5 ;SET ARGUMENT LIST JSR PC,ABSPLT MOV #LIST1,R5 ;SET ARGUMENT LIST JSR PC,HLABEL ;OUTPUT STRING MOV (SP)+,R5 ;RESTORE R5 JMP L ;JUMP TO RETURN ; D: MOVB IsTerm,IS ;SET TERMINAL NUMBER MOVB KSetNo,KS ;SET CHARACTER SET NUMBER BGT 1$ ;BRANCH IF POSITIVE NEGB KS ;ELSE SET POSITIVE 1$: LDF CSize,F0 ;SET CSIZE LDF CMag,F1 ;SET CMAG MULF F1,F0 ;CMAG*CSIZE STF F0,CS ;STORE ABOVE AS CS LDF Upsiln,F0 ;LOAD UP STF F0,UP ;STORE UP LDF WidAdj,F0 ;LOAD WI STF F0,WI ;STORE WI ; TST DIMEN ;DIMENSIONING? BGE E ;BRANCH IF NOT MOV @4(R5),NCHRS ;SAVE NCHRS MOV 2(R5),R0 ;SAVE ADDRESS OF STRING BR F ;BRANCH OVER ALTERNATE CODE E: MOV @10(R5),NCHRS ;SAVE NCHRS MOV 6(R5),R0 ;SAVE ADDRESS OF STRING ; F: CLR R3 ;CLEAR COUNTER MOVB NCHRS,NC ;SET NUMBER OF CHARACTERS BEQ H ;BRANCH IF ZERO CMP NCHRS,#130. ;AUTO-COUNT? BLE 3$ ;BRANCH IF FALSE ; MOV R0,R1 ;GET STARTING ADDRESS OF STRING 1$: TSTB (R1)+ ;END OF STRING BEQ 2$ ;BRANCH IF TRUE CMPB #'$,(R1) ;CONTROL CHARACTER BNE 1$ ;BRANCH IF NOT CMPB #'\,1(R1) ;NEXT CHARACTER A "\"? BNE 1$ ;BRANCH IF NOT 2$: SUB R0,R1 ;SUBTRACT STARTING ADDRESS OF STRING DEC R1 ;REMOVE END BYTE (ZERO) MOV R1,NCHRS ;STORE AS NCHRS ; 3$: MOV #6,R1 ;SET MAXIMUM OF 6 CHARACTERS MOV #IY+2,R2 ;SET ADDRESS MOV NCHRS,R3 ;SET TOTAL NUMBER OF CHARACTERS MOVB NCHRS,NC ;SET TOTAL NUMBER OF CHARACTERS IN BUFFER(S) 4$: MOVB (R0)+,(R2)+ ;TRANSFER BYTE DEC R3 ;DECREMENT COUNTER BLE H ;BRANCH IF DONE SOB R1,4$ ;BRANCH IF PBUF NOT FULL BR H ;BRANCH TO OUTPUT FIRST BUFFER ; G: MOVB #1,DI ;SET CONTINUATION FLAG MOV #24.,R1 ;SET MAXIMUM OF 22. CHARACTERS MOV #ST,R2 ;SET ST ADDRESS 1$: MOVB (R0)+,(R2)+ ;TRANSFER BYTE DEC R3 ;DECREMENT COUNTER BLE H ;BRANCH IF DONE SOB R1,1$ ;BRANCH IF FBUF NOT FULL ; H: SDAT$S #TOTASK,#IDAT,#3 ;SEND DATA BUFFER TO TASK. TST $DSW ;SUCCESSFUL? BLE H ;TRY AGAIN IF NOT TST R3 ;DONE BGT G ;BRANCH IF NEED TO SEND MORE ; WTSE$C 1,HCSIZE ;STOP UNTIL DATA COMES BACK ; J: TST DIMEN ;DIMENSIONING? BGE L ;BRANCH IF NOT ; LDF CMag,F0 ;SET CMAG LDF W,F1 ;SET W DIVF F0,F1 ;W/CMAG STF F1,@6(R5) ;STORE ABOVE AS W LDF HA,F1 ;SET HA (TRUE INCHES) DIVF F0,F1 ;HA/CMAG STF F1,@10(R5) ;STORE ABOVE AS HA LDF HB,F1 ;SET HB (TRUE INCHES) DIVF F0,F1 ;HB/CMAG STF F1,@12(R5) ;STORE ABOVE AS ARGUMENT HB ; L: TST DIMEN ;DIMENSIONING? BLT 1$ ;BRANCH IF TRUE MOV IB,IBfDv3 ;SET NUMBER OF BYTES AVAILABLE NOW 1$: LDFPS (SP)+ ;RESTORE FPP STATUS LDF (SP)+,F1 ;RESTORE F1 LDF (SP)+,F0 ;RESTORE F0 RTS PC ;RETURN ; ENTRY: .WORD ;ENTRY POINT FLAG LIST0: .WORD 3,IX,IY,LIST0 ;ARGUMENT LIST FOR ABSPLT LIST1: .WORD 2,NCHRS,0 ;ARGUMENT LIST FOR HLABEL NCHRS: .WORD 0 ;NUMBER OF CHARACTERS DIMEN: .WORD 0 ;DIMENSIONING FLAG, LOGICAL ; IDAT: ;DEFINE OFFSETS AND ALLOCATE DATA AREA IS: .BYTE 0 ;PLOTTER TERMINAL NUMBER DI: .BYTE 0 ;DIMENSIONING FLAG, LOGICAL KS:ST: .BYTE 0 ;CHARACTER SET NUMBER ; STRING NC: .BYTE 0 ;NUMBER OF CHARACTERS CS:W: .FLT2 0. ;CHARACTER SIZE; WIDTH UP:HA: .FLT2 0. ;CHARACTER ANGLE; HEIGHT ABOVE WI:HB: .FLT2 0. ;WIDTH ADJUSTMENT; HEIGHT BELOW IX:IB: .WORD 0 ;X SCREEN COORDINATE; # OF 4662 BUFFER BYTES IY: .WORD 0 ;Y SCREEN COORDINATE .BLKW 3 ;STRING STORAGE .BLKW 2 ;BUFFER BUFFER (FOR RCVD)