SUBTTL ARD driver -- PPDATA macro expansion PRINTX %PLTARD not fully implemented PPDATA (ARD) ARDNAM: DEC 2 ;Data for subroutine WHERE ASCII /ARDS/ DEC 611 ;Model 611 SUBTTL ARD driver -- ARDS graphics terminal ; The ARDS is an Advanced Remote Display Station with a ; Tektronix 611 Storage Display Unit. It uses one 5-byte command to ; set graphics mode at a particular coordinate, then uses 2-byte ; commands thereafter for delta movement. ; ; The one CSM has is no longer functional. COMMENT & ^B STX Enables FROM COMPUTER section ^C ETX Disables FROM COMPUTER section ^E ENQ Triggers answerback option ^G BEL Rings bell ^H BS Back up one character position ^I TAB Move to next tab stop (optional) ^J LF Move down one line ^L FF Erase screen (X=-525, Y=+690) (Cursor at top left of screen) ^M CR Move to left margin (X=-525) ^R DC2 Turn off local copy ^T DC4 Turn on local copy ^] GS Set point mode ^^ RS Long Vector ^_ US Short vector All plotting data has the MSB on, Alphabetic characters 100 to 177 Any Control character other than GS, RS, or US will turn off Plot Mode. SET POINT MODE - Four characters to set absolute position. Two characters for the X position, the last 2 for the Y position. Each pair has the LSB of the first char as the sign bit. The next 5 bits for the low order position. The second char has the 5 high order bits of the position, the next-to-MSB ignored. LONG VECTOR MODE - Four characters to specify relative movement This uses the same format as SET POINT Mode, but the next-to-MSB has meaning. In the second character, (hi order X), this bit turns on the beam if it is a 1. In the last char, (hi order Y), this bit being on will make the beam dotted. SHORT VECTOR MODE - Two characters to specify relative movement. The first char is the low order X, the second is the low order Y. The LSB is the sign bit. & ;End of COMMENT SUBTTL ARD driver -- ARDMOV ARDNAM: DEC 2 ;Data for PLOTS - IPLT=2 for subroutine WHERE ASCII /ARDS/ ARDLEN==.-ARDNAM PPDATA (ARD) ;Expand data area ; Subroutine ARDMOV - move the pen with the pen up (down), uses T1 ; Calling sequence: ; DMOVE X,(the delta X of the movement) ; PUSHJ P,ARDMOV ;For up (or PUSHJ P,ARDDWN ;For down) ; *return* ARDMOV: TDZA T1,T1 ;Set up for an invisible beam 1RDDWN: MOVEI T1,40 ;Set up for a visible beam TRC T1,40 ;40 is beam off, 0 is beam on HRRM T1,VISIBL ;Store for later (self modifying code) MOVM T2,X ;Get the absolute value of X MOVM T3,Y ;Get the absolute value of Y CAIG T2,^D1023 ;Skip if extra long mode should be used CAILE T3,^D1023 ;Skip if long mode will work JRST ARDELN ;Go do the extra long mode plot CAIE T1,0 ;Skip if the line is to be visible PJRST ARDLNG ;Go do the long mode plot ARDSHT: CAIG T2,^D31 ;Skip if to big for long mode CAILE T3,^D31 ;Skip if small enough for short mode PJRST ARDLNG ;Go plot the line in long mode CAIN T2,0 ;Skip if X doesn't equal zero JUMPE T3,ARDPNT ;Jump if Y equals zero, go plot a point TXZE P4,P4.LON ;Skip if in short mode already OUTCHR [SHTMOD] ;Tell the ARDS we are in short mode PJRST XYOUT ;Go plot the segment and return ARDPNT: TXZN P4,P4.LON ;Skip if in long mode already OUTCHR [LNGMOD] ;Tell the ARDS we are in long mode OUTSTR [BYTE (7)100,140,103,100,SHTMOD,100,102,0] ;Up 1 dot, down 1 POPJ P, ;Return ARDLNG: TXON P4,P4.LON ;Skip if we are in long mode OUTCHR [LNGMOD] ;Tell the ARDS we are in long mode PJRST XYOUT ;Go plot the segment and return ;** Still in the FTARD conditional ** SUBTTL ARD driver -- XYOUT ARDELN: TXON P4,P4.LON ;Skip we are in long mode OUTCHR [LNGMOD] ;Tell the ARDS we are in long mode MOVE T1,X ;Get X ASH T1,-1 ;Divide X by 2 MOVEM T1,X.NEWP ;Save for later SUB X,T1 ;Get half of X in X MOVE T1,Y ;Get Y ASH T1,-1 ;Divide Y by 2 MOVEM T1,Y.NEWP ;Save for later SUB Y,T1 ;Get half of Y in Y PUSHJ P,XYOUT ;Go plot the segment DMOVE X,X.NEWP ;Get the second half to the line ; Subroutine XYOUT - this routine plots the line ; Calling sequence: ; DMOVE X,[the delta X of the movement] ; PUSHJ P,XYOUT ; *return* XYOUT: SETZ T3, ;Set up to send DX to the ARDS PUSHJ P,XYOUT0 ;Send DX to the ARDS MOVEI T3,1 ;Set up to send DY to the ARDS, then ; fall into XYOUT0 and return XYOUT0: MOVM T1,X(T3) ;Get the X or Y value to use IDIVI T1,^D32 ;Divide into two 5-bit quanties ASH T2,1 ;Set up for the ARDS ADDI T1,ARDOFF ; ... ADDI T2,ARDOFF ; ... SKIPGE X(T3) ;Skip if the input value was positive ORI T2,1 ;Inform the ARDS the number was negative JUMPN T3,XYOUT1 ;Jump if outputting DY VISIBL: ORI T1,MODIFY ;Inform the ARDS if the line is visible ; (0 - visible, 40 - not visible) (self modifying code) XYOUT1: OUTCHR T2 ;Output the low order bits TXNE P4,P4.LON ;Skip if in short vector mode OUTCHR T1 ;Output the high order bits POPJ P, ;Return CLRSCN: BYTE (7)FF,0 ;Formfeed ORIGIN: BYTE (7)LNGMOD,100,140,175,125,100,140,175,125,0 ;At sign, left accent, left brace, cap U BEEP: BYTE (7)7,0 ;Control-G LITARD: LIT ;End of PLTARD.MAC