Google
 

Trailing-Edge - PDP-10 Archives - decus_20tap2_198111 - decus/20-0049/ardmac.mac
There are 2 other files named ardmac.mac in the archive. Click here to see a list.
	TITLE	ARDMAC
	INTERNAL CRTOFF,CRTON,CRTLTR,CRTSTR,CRTSCP,CRTWIP
	INTERNAL CRTXYZ,CRTHLT
MSTKNT:	0
;THE MONITOR MUST NOT INSERT CHARACTERS INTO THE STRING
;WHICH IS OUTPUT BY THIS PROGRAM.  UNFORTUNATELY, STANDARD
;DEC MONITORS INSERT A CARRIAGE RETURN IF ONE HAS NOT BEEN
;OUTPUT IN LAST 72 CHARACTERS (FOR TTY). THIS PROGRAM CAN
;INSERT CARRIAGE RETURNS WHERE NECESSARY IF MSTKNT IS
;GIVEN THE VALUE 1.  NO SUCH INSERTION IS DONE IF MSTKNT
;IS GIVEN THE VALUE 0.  THE LATTER OPTION MUST NOT BE
;USED UNLESS THE MONITOR RECOGNIZES GRAPHIC OUTPUT (HERE
;DESIGNATED BY THE INIT FOLLOWING ADDRESS 'GRAFIC' BELOW)
;AS NOT REQUIRING CARRIAGE RETURN INSERTION.  THE COUNTER
;CALLED KOUNT IS USED TO CHECK THE NUMBER OF CHARACTERS
;WHICH CAN STILL BE GIVEN BEFORE THE PROGRAM MUST SEND
;A CARRIAGE RETURN.  AFTER GIVING A CARRIAGE RETURN, THIS
;COUNT IS RESET TO 68 (OCTAL 104, 4 LESS THAN THE 72
;CHARACTER LIMIT OF THE TELETYPE).  THE VALUE 104 CAN BE
;CHANGED TO MATCH THE WIDTHS OF OTHER STANDARD OUTPUTS.
;THIS LIMIT MUST BE 4 LESS THAN THE MAXIMUM IN ORDER TO
;ALLOW A TEST FOR THE COUNT BEING POSITIVE TO BE SUFFICIENT
;TO DETERMINE IF 5 CHARACTERS CAN STILL BE GIVEN (THE
;MAXIMUM NECESSARY FOR A SINGLE COORDINATE STRING).
;
;FORTRAN CALLABLE ROUTINES FOR ARDS TERMINAL GRAPHICS
;
;FOLLOWING SECTION INSTRUCTS MONITOR THAT ARDS
;TERMINAL IS A GRAPHIC DEVICE (INPUT IS NOT BE BE ECHOED,
;NO TRANSLATION IS TO BE DONE ON OUTPUT).
GRAFIC:	0
	MOVNI	0,	1
	TTCALL	6,	0
	TLO	0,	20
	TTCALL	7,	0
	INIT	17,	1700
	SIXBIT		/TTY/
	0
	HALT
	SETOM		ARDTYP	;SET SWITCH TO SHOW TYPE
	JRA	16,	(16)
ARDTYP:	0
;
;FOLLOWING SECTION INSTRUCTS MONITOR THAT ARDS TERMINAL
;IS TO BE TREATED AS A TELETYPE (INPUT IS TO BE ECHOED,
;LOWER CASE OUTPUT CHARACTERS ARE TO BE TRANSLATED TO UPPER).
TTY:	0
	MOVNI	0,	1
	TTCALL	6,	0
	TLZ	0,	20
	TTCALL	7,	0
	INIT	17,	0
	SIXBIT		/TTY/
	0
	HALT
	SETZM		ARDTYP	;SET SWITCH TO SHOW TYPE
	JRA	16,	(16)
;
;ENTRY CRTOFF(NEWX,NEWY)
;POSITIONS BEAM FOR START OF A LINE
;DOES NOT CAUSE PLOTTING
;NEWX   = HORIZONTAL COORDINATE
;NEWY   = VERITCAL COORDINATE
;(DIMENSION SYSTEM IS 1 TO 1023)
;POINT 0,0 IS LOWER LEFT CORNER
CRTOFF:	0
	MOVEM	0,	SAVE0	;SAVE AC 0
	MOVE	0,	@(16)	;TEST IF BEAM ALREADY AT POINT
	CAME	0,	LASTX
	JRST		GOON	;IF NOT, PROCESS NEW POINT
	MOVE	0,	@1(16)
	CAME	0,	LASTY
	JRST		GOON	;IF NOT, PROCESS NEW POINT
	MOVE	0,	SAVE0	;OTHERWISE, RESTORE AC 0 AND RETURN
	JRA	16,	2(16)
GOON:	MOVEM	1,	SAVE1	;SAVE AC 1
	JRST		.+2
CHECK:	0
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	SKIPLE	0,	KOUNT	;DOES MONITOR WANT LINE FEED
	JRST		GOOD	;IF NOT,  PROCESS DIRECTLY
	JRST		.+2
PATCH:	0
	TTCALL	1,	[15]	;SUPPLY LINE FEED
	SETZM	0,	MODE	;ASSURE COMMAND OUTPUT BEFORE COORDS
	MOVEI	0,	104	;RESET COUNT TO 4 LESS THAN LIMIT
	MOVEM	0,	KOUNT
GOOD:	MOVEI	1,	35	;AC 1 CONTAINS COMMAND MODE WHICH NEED
				;NOT BE REPEATED IF SAME AS LAST MODE
	SKIPN		ARDTYP	;TEST IS ARDS IS IN GRAPHIC MODE,
	JSA	16,	GRAFIC	;IF NOT, HAVE IT SET
	MOVE	0,	@(16)	;GET ABSOLUTE X COORDINATE
	MOVEM	0,	LASTX	;STORE THIS IN LASTX
	JSA	16,	ARDCRD	;SEND COORDINATE TO TERMINAL
	MOVE	0,	@1(16)
	MOVEM	0,	LASTY
	JSA	16,	ARDCRD
	MOVE	0,	SAVE0
	MOVE	1,	SAVE1
	JRA	16,	2(16)
				;CHARACTERS TO BE TRANSMITTED.
KOUNT:	0			;INITIALIZE KOUNT AT 0 SO
				;OVERLAY WILL SEND CARRIAGE
				;RETURN, RATHER THAN LET TOO
				;MANY CHARACTERS THROUGH
SAVE0:	0
SAVE1:	0
LASTX:	777777777777
LASTY:	777777777777
MODE:	0
;
;ENTRY CRTON (NEWX,NEWY)
;PLOTS LINE FROM OLD BEAM POSITION TO NEW
;NEWX  = HORIZONTAL COORDINATE
;NEWY  = VERTICAL COORDINATE
;(DIMENSION SYSTEM IS 1 TO 1023 WITH 0, 0
;IN LOWER LEFT CORNER)
CRTON:	0
	MOVEM	0,	SAVE0	;SAVE AC 0
	MOVEM	1,	SAVE1	;SAVE AC 1
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	SKIPLE	0,	KOUNT	;TEST IF MONITOR WANTS LINE FEED
	JRST		SOSO
	JSA	16,	PATCH	;IF DOES, GIVE IT, RESET POSITION
	ARG	0,	LASTX
	ARG	0,	LASTY
SOSO:	MOVE	0,	@(16)	;GET X COORDINATE
	SUB	0,	LASTX	;CONVERT TO RELATIVE VECTOR
	CAMG	0,	[37]	;TEST IF X MOTION IS SHORT
	CAMGE	0,	[-37]
	JRST		LONG	;IF NOT, PROCESS AS LONG VECTOR
	MOVE	1,	@1(16)	;OTHERWISE, GET Y COORDINATE
	SUB	1,	LASTY	;CONVERT TO RELATIVE VECTOR
	CAMG	1,	[37]	;TEST IF Y MOTION IS ALSO SHORT
	CAMGE	1,	[-37]
	JUMPA	1,	LONG	;IF NOT, PROCESS AS LONG VECTOR
	MOVEI	1,	37	;OTHERWISE, USE SHORT VECTOR MODE
	JRST		.+2
LONG:	MOVEI	1,	36	;SET SWITCH FOR LONG VECTOR MODE
	JSA	16,	ARDVCT	;SEND X COMPONENT OF VECTOR
	MOVE	0,	@(16)	;GET X COORD AND STORE IN LASTX
	MOVEM	0,	LASTX
	MOVE	0,	@1(16)	;GET Y COORDINATE
	SUB	0,	LASTY	;CONVERT TO RELATIVE VECTOR
	JSA	16,	ARDVCT
	MOVE	0,	@1(16)
	MOVEM	0,	LASTY
	MOVE	0,	SAVE0
	MOVE	1,	SAVE1
	JRA	16,	2(16)
;
;INTERNAL ENTRY ARDCRD
;ROUTINE TO TRANSMIT COORDINATES FOR ARDS SCOPE PLOTTING
;COORDINATE ARGUMENT IS INPUT IN AC 0
;MODE ARGUMET IS INPUT IN AC 1
ARDCRD:	0
	SUBI	0,	1000
	JRST		.+2
ARDVCT:	0
	CAMN	1,	MODE
	JRST		NONEED
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	SOS	0,	KOUNT
	TTCALL	1,	1
	MOVEM	1,	MODE
NONEED:	JUMPGE	0,	POS
	MOVMM	0,	SAVE
	MOVE	0,	SAVE
	LSH	0,	1
	AOJA	0,	ALL
POS:	MOVEM	0,	SAVE
	LSH	0,	1
ALL:	IORI	0,	100
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	SOS	0,	KOUNT
	TTCALL	1,	0
	CAIN	1,	37
	JRA	16,	(16)
	MOVE	0,	SAVE
	LSH	0,	-5
	IORI	0,	100
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	SOS	0,	KOUNT
	TTCALL	1,	0
	JRA	16,	(16)
SAVE:	0
;
;ENTRY CRTSCP(KONTRL)
;ROUTINE TO SELECT WHETHER OUTPUT IS STORED ON SCOPE.
;KONTRL = 0, ENABLE WRITE-THROUGH (MOMENTARY DISPLAY ONLY)
;       = 1, CAUSE ALL OUTPUT TO BE STORED ON TUBE
CRTSTR:	0
	MOVEM	0,	SAVE0
	MOVE	0,	@(16)
	ANDI	0,	1
	LSH	0,	5
	XORI	0,	140
	MOVEM	0,	RITHRU
	JRST	0,	SETSCP
;
;ENTRY CRTSCP(KONTRL)
;KONTRL IS BIT CODED MASK SELECTING SCOPES TO SHOW OUTPUT.
;KONTRL = 1 SELECTS SCOPE 1.
;KONTRL = 2 SELECTS SCOPE 2.
;KONTRL = 3 SELECTS BOTH SCOPES 1 AND 2.
CRTSCP:	0
	MOVEM	0,	SAVE0	;SAVE AC 0
	MOVE	0,	@(16)	;GET SCOPE DESIGNATION
	ANDI	0,	37	;CHOP OFF ANY EXTRA BITS
	XORI	0,	37	;REVERSE BITS TO FIT ARDS
	MOVEM	0,	SCOPES	;NOTATION AND STORE
SETSCP:	SKIPN		ARDTYP	;TEST IS ARDS IS IN GRAPHIC MODE,
	JSA	16,	GRAFIC	;IF NOT, HAVE IT SET
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	SKIPLE	0,	KOUNT
	JRST		GIVEIT
	TTCALL	1,	[15]
	SETZM	0,	MODE
	MOVEI	0,	104
	MOVEM	0,	KOUNT
GIVEIT:	MOVE	0,	MODE
	CAIN	0,	35
	JRST		GIVES
	TTCALL	1,	[35]
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	SOS	0,	KOUNT
GIVES:	SETZM	0,	MODE
	TTCALL	1,	[46]
	MOVE	0,	SCOPES
	IOR	0,	RITHRU
	TTCALL	1,	0
	MOVE	0,	SAVE0
	SKIPN		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	JRA	16,	1(16)
	SOS		KOUNT
	SOS		KOUNT
	JRA	16,	1(16)
SCOPES:	0
RITHRU:	100
;SUBROUTINE CRTLTR(STRING,IFIRST,IFINAL,IX,IY)
;STRING = ASCII CHARACTER STRING
;IFIRST = COUNT OF FIRST LETTER TO PLOT
;IFINAL = COUNT OF FINAL LETTER TO PLOT
;IX     = HORIZONTAL COORDINATE OF LETTERING
;IY     = VERTICAL COORDINATE OF LETTERING
CRTLTR:	0
	MOVEM	0,	SAVE0	;SAVE AC 0
	MOVEM	1,	SAVE1	;SAVE AC 1
	MOVE	0,	@2(16)	;GET UPPER CHARACTER COUNT
	SUB	0,	@1(16)	;SUBTRACT LOWER CHARACTER COUNT
	JUMPGE	0,	.+2	;TEST IF UPPER COUNT LESS THAN LOWER
	JRA	16,	5(16)	;RETURN IF NO CHARACTERS
	ADDI	0,	2	;ALLOW END AND CONTROL CHARACTERS
	MOVEM	0,	LTRCNT	;SAVE THE CHARACTER COUNT
	SKIPN		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	JRST		LNOKNT	;IF NOT, DON'T CHANGE COUNT
	CAIL	0,	104	;TEST IF TOO MANY CHARACTERS FOR LINE
	JRA	16,	5(16)	;RETURN IF TOO MANY CHARACTERS
	SUB	0,	KOUNT	;ADJUST THE OUTPUT COUNT FOR THIS LINE
	MOVNM	0,	KOUNT
LNOKNT:	MOVE	0,	@3(16)	;GET HORIZONTAL COORDINATE
	MOVEM	0,	LASTX
	MOVE	0,	@4(16)	;GET VERTICAL COORDINATE
	ADDI	0,	14	;OFFSET TO LOWER LEFT CORNER
	MOVEM	0,	LASTY
	JSA	16,	CHECK	;POSITION THE BEAM
	ARG	0,	LASTX
	ARG	0,	LASTY
	SKIPN		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	JRST		NOADD	;IF NOT, SKIP THIS SECTION
	MOVEI	0,	104-5	;TEST IF A LINE FEED WAS GIVEN
	CAMLE	0,	KOUNT
	JRST		NOADD	;IF NOT, JUMP TO NOADD
	SUB	0,	LTRCNT	;IF GIVEN, RESET CHARACTER COUNT
	MOVEM	0,	KOUNT
NOADD:	TTCALL	1,	[34]	;PUT SCOPE INTO CHARACTER MODE
	MOVE	0,	@1(16)	;PREPARE INITIAL BYTE POINTER
	SOJ	0,
	IDIVI	0,	5
	ADD	0,	(16)
	HRRZM	0,	WHERE
	IMULI	1,	7
	SUBI	1,	35
	MOVMS	1,	1
	LSH	1,	36
	IOR	1,	[000700000000]
	IORM	1,	WHERE
	MOVE	1,	@2(16)
	SUB	1,	@1(16)
	LDB	0,	WHERE	;GET INITIAL BYTE
	JRST		.+2	;AND GO TO LOOP END TEST
LOOP:	ILDB	0,	WHERE
	TTCALL	1,	0	;OUTPUT THE CHARACTER
	SOJGE	1,	LOOP	;DECREMENT COUNT AND LOOP IF NOT DONE
	SETZM	0,	MODE
	SETOM	0,	LASTX
	SETOM	0,	LASTY
	MOVE	0,	SAVE0
	MOVE	1,	SAVE1
	JRA	16,	5(16)
WHERE:	0
LTRCNT:	0
;
;ENTRY CRTWIP(NO ARGUMENT)
;CLEARS CURRENTLY SELECTED SCOPE SCREEN, EMPTIES INPUT
;BUFFER (TO GET RID OF CHARACTERS TRAILING STYLUS COORDS)
;AND RETURNS THE ARDS TERMINAL TO NORMAL TELETYPE MODE.
CRTWIP:	0
	SETOM	0,	LASTX
	SETOM	0,	LASTY
	MOVEM	0,	SAVE0	;SAVE VALUE OF AC 0
	TTCALL	1,	[14]	;GIVE FORM FEED TO ERASE ARDS
	MOVEI	0,	50	;SET AC 0 TO BLANKS COUNTER
PAUSE:	TTCALL	1,	[40]	;GIVE BLANKS UNTIL ARDS HAS
	SOSE	0,	0	;RECOVERED FROM ERASURE FORCED BY
	JRST	0,	PAUSE	;GIVING A FORM FEED.
	TTCALL	1,	[15]	;GIVE A CARRIAGE RETURN
	SETZM	0,	MODE	;FORCE NEW MODE SPECIFICATION
	MOVEI	0,	104	;RESET KOUNT TO ITS MAXIMUM VALUE
	SKIPE		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	MOVEM	0,	KOUNT
	TTCALL	11,		;CLEAR BUFFER OF CHARACTERS
				;TRAILING SYLUS POSITION.
	JSA	16,	TTY	;PUT ARDS INTO TTY MODE
	MOVE	0,	SAVE0	;RESTORE AC 0
	JRA	16,	(16)	;RETURN TO CALLING PROGRAM
;
;ENTRY XYZPOS(NEWX,NEWY,NEWZ)
;QUERIES ARDS ABOUT POSITION OF STYLUS AND THEN RETURNS
;POSITION INFORMATION.
;IF STYLUS MOTION IS TO BE REPRESENTED ON ARDS TERMINAL
;AT 1 TO 1 MAGNIFICATION, NEWX AND NEWY SHOULD BE USED
;AS RETURNED, TAKING THE RANGE AS 0 TO 1023 FOR EACH
;(ACTUALY THESE CAN BE NEGATIVE OR GREATER THAN 1023
;BUT SUCH VALUES SHOULD BE REJECTED).
;NEWZ IS ZERO IF STYLUS IS DEPRESSED, POSITIVE (4 OR 6)
;IF STYLUS IS WITHIN 3/8TH INCH OF TABLET, AND NEGATIVE
;(-1) IF STYLUS IS BEYOND ABOUT 3/8TH INCH OF TABLET.
CRTXYZ:	0
	MOVEM	0,	SAVE0	;SAVE AC 0
	MOVEM	1,	SAVE1	;SAVE AC 1
	SKIPN		ARDTYP	;TEST IS ARDS IS IN GRAPHIC MODE,
	JSA	16,	GRAFIC	;IF NOT, HAVE IT SET
NEXT:	SKIPN		MSTKNT	;TEST IF CHARACTER COUNT NECESSARY
	JRST		NEEXT	;IF NOT, JUMP AROUND THIS SECION
	SKIPLE	0,	KOUNT	;TEST IF CARRIAGE RETURN IS NEEDED
	JRST		NEXXT	;IF NOT, DONT DO THIS PART
	TTCALL	1,	[15]	;GIVE CARRIAGE RETURN
	MOVEI	0,	104	;RESET KOUNT TO ITS MAXIMUM VALUE
	MOVEM	0,	KOUNT
NEXXT:	SOS		KOUNT	;DECREMENT THE CHARACTER COUNT
NEEXT:	TTCALL	1,	[5]	;GIVE ENQUIRE CHARACTER
LOOK:	TTCALL	0,	0	;GET 1ST X CHARACTER
	CAIGE	0,	100	;REJECT IT IF LESS THAN 100
	JRST		LOOK
	TTCALL	0,	1	;GET 2ND X CHARACTER
	CAIGE	1,	100	;LIKEWISE REJECT IF LESS THAN 100
	JRST		NEXT
	ANDI	0,	77	;CLEAR EXTRA BITS OF 1ST CHARACTER
	ANDI	1,	77	;CLEAR EXTRA BITS OF 2ND CHARACTER
	LSH	1,	6	;SHIFT 2ND CHARACTER 6 BITS LEFT
	IOR	0,	1	;AND COMBINE THE 2 CHARACTERS
	XORI	0,	7777	;REVERSE BITS (WAS 1'S COMPLEMENT)
	LSH	0,	-1	;CONVERT GRID FROM 4096X4096
	SUBI	0,	1000	;TO 2048X2048 WHICH MATCHES SCOPE
	MOVEM	0,	@(16)	;RETURN THE X ARGUMENT
	TTCALL	0,	0	;GET 1ST Y COORDINATE CHARACTER
	CAIGE	0,	100	;REJECT IT IF LESS THAN 100
	JRST		NEXT
	TTCALL	0,	1	;GET 2ND Y CHARACTER
	CAIGE	1,	100	;LIKEWISE REJECT IF LESS THAN 100
	JRST		NEXT
	ANDI	0,	77	;CLEAR EXTRA BITS OF 1ST CHARACTER
	ANDI	1,	77	;CLEAR EXTRA BITS OF 2ND CHARACTER
	LSH	1,	6	;SHIFT 2ND CHARACTER 6 BITS LEFT
	IOR	0,	1	;AND COMBINE THE 2 CHARACTERS
	XORI	0,	7777	;REVERSE BITS (WAS 1'S COMPLEMENT)
	LSH	0,	-1	;CONVERT GRID FROM 4096X4096
	SUBI	0,	400	;TO 2048X2048 WHICH MATCHES SCOPE
	MOVEM	0,	@1(16)	;RETURN THE Y ARGUMENT
	TTCALL	0,	0	;GET SINGLE Z CHARACTER
	ANDI	0,	7	;CLEAR EXTRA BITS OF 7 CHARACTER
	CAIL	0,	7	;IF Z COORDINATE IS 7, CONVERT
	MOVNI	0,	1	;IT TO -1.
	MOVEM	0,	@2(16)	;RETURN THE Z ARGUMENT
	SETZM	0,	MODE	;FORCE NEW MODE SPECIFICATION
	MOVE	0,	SAVE0	;RESTORE AC 0
	MOVE	1,	SAVE1	;RESTORE AC 1
	JRA	16,	3(16)	;RETURN TO CALLING PROGRAM
;
;ENTRY CRTHLT(NO ARGUMENT)
;PUTS PROGRAM TO SLEEP FOR 1 SECOND
;(USED TO PAUSE WHEN STYLUS IS LIFTED)
CRTHLT:	0
	MOVEM	1,	SAVE1	;SAVE AC 1
	MOVEI	1,	1	;PUT SLEEP TIME (IN SECONDS) IN AC 1
	SLEEP	1,		;PUT PRORAM TO SLEEP
	MOVE	1,	SAVE1	;RESTORE AC 1
	JRA	16,	(16)	;RETURN TO CALLING PROGRAM
	END