	.TITLE	CRJOYD


;********************************************************
;							*
;  FUNCTIONALLY TESTS THE ID-2000 CURSOR AND JOYSTICK	*
;  OPTIONS. SEE INDIVIDUAL TEST FOR A MORE DETAILED	*
;  EXPLANATION:						*
;							*
;	1. HARDWARE CURSOR				*
;	   						*
;	   A. TESTS ALL X&Y COORDINATE VALUES 		*
;	   B. TESTS ALL CURSOR FORMS			*
;          C. DISPLAYS EXPECTED & RECEIVED RESULTS      *
;             WHEN AN ERROR IS DETECTED.	        *
;							*
;	2. JOYSTICK INTERFACE TEST			*
;							*
;	   A. DISPLAYS JOYSTICK COORDINATES		*
;             DYNAMICALLY FOR VISUAL INSPECTION         *
;	   B. LEFT TO RIGHT ON SCREEN:			*
;	      STATUS REG,AREG,BREG,XREG & YREG (8)      *
;							*
;	3. JOYSTICK POSITION TEST			*
;							*
;	   TRANSCRIBES JOYSTICK POSITION COORDINATES	*
;	   DIRECTLY TO CURSOR #1.			*
;							*
;	4. JOYSTICK INTERRUPT TEST			*
;							*
;	   A. TESTS MANUAL(ENTER) AND AUTOMATIC		*
;             (TRACK) INTERRUPTS FROM JOYSTICK BOX 	*
;	   B. ERROR MESSAGES DISPLAYED			*
;							*
;							*
;	RUN PARAMETERS:					*
;							*
;	     1. TESTS MAY BE EXECUTED IN SEQUENCE BY	*
;	        SPECIFICATION OF ZERO FOR THE SELECTED	*
;	        TEST OR REPEATEDLY BY SUPPLYING THE	*
;	        DESIRED TEST #.				*
;							*
;	     2. A CARRIAGE RETURN WILL TERMINATE THE    *
;	        EXECUTION OF A REPEATING TEST OR        *
;	        SEQUENCE,THEREBY PERMITTING NEW TEST    *
;	        SELECTION.				*
;	     						*
;	     3. SELECTION OF A TEST NUMBER > 4		*
;	        CAUSES THE AVAILABLE TESTS TO BE LISTED *
;	        ON THE CONSOLE TERMINAL.		*
;							*
;							*
;	PROGRAMMER: JOHN FRANZ				*
;	MODIFICATIONS BY: KEN DINWIDDIE			*
;							*
;	MODIFICATIONS FOR DMA ADDRESSES: NOVEMBER, 1978	*
;							*
;							*
;********************************************************


.PAGE
	.SBTTL	EQUATES

;	CONSOLE TERMINAL REGISTER DEFINITIONS:

	KEYCSR	=177560		;CONSOLE KEYBOARD CONTROL/STATUS REGISTER
	KEYDAT	=177562		;CONSOLE KEYBOARD DATA REGISTER
	PRCSR	=177564		;CONSOLE PRINTER CONTROL/STATUS/REGISTER
	PRDAT	=177566		;CONSOLE PRINTER DATA REGISTER

;	ID-2000 SERIES REGISTER DEFINITIONS (DMA):

	XREG	=166020		;X REGISTER
	YREG	=166022		;Y REGISTER
	BPMR	=166024		;BIT PLANE MASK
	CSR	=166026		;CONTROL/STATUS
	DATREG	=166030		;DATA REGISTER

;	CURSOR REGISTER DEFINITIONS (DMA):

	X1	=166032		;CURSOR ONE X1
	Y1	=166033		;CURSOR ONE Y1
	X2	=166034		;CURSOR TWO X2
	Y2	=166035		;CURSOR TWO Y2
	CSRCTL	=166036		;CURSOR CONTROL/STATUS
	JOYCTL	=166037		; JOYSTICK CONTROL/STATUS/COORDINATES

;       CSRCTL BIT & FIELD ASSIGNMENTS  

	FORM0	=0		; BOX
	FORM1	=1		; DASHED BOX
	FORM2	=2		; TWO FULL SCREEN CROSSHAIRS
	FORM3	=3		; TWO SINGLE ELEMENTS
	FORM4	=4		; CROSSHAIR & ALPHA-NUMERIC
	FORM5	=5		; TWO DASHED CROSSHAIRS
	FORM6	=6		; TWO SOLID CROSSHAIRS
	FORM7	=7		; SOLID CROSSHAIR & DASHED CROSSHAIR
	RATE	=10		; BLINK RATE
	ENABL1	=20		; ENABLE CURSOR 1
	ENABL2	=40		; ENABLE CURSOR 2
	BLINK1	=100		; BLINK CURSOR 1
	BLINK2	=200		; BLINK CURSOR 2

;	DMA REGISTER DEFINITIONS

	DAWC	=166040		;WORD COUNT
	DABA	=166042		;BUS ADDRESS
	DACS	=166044		;COMMAND/STATUS
	DASC	=166050		;SHIFTER CONTROL
.PAGE
	.SBTTL	MACRO DEFINITIONS


	.MACRO	CRLF		;ASCII CARRIAGE RETURN/LINE FEED
	.BYTE	15,12
	.ENDM

	.MACRO	CRLFLF		;ASCII CARRIAGE RETURN/2 LINE FEEDS
	.BYTE	15,12,12
	.ENDM

	.MCALL	.REGDEF

	.REGDEF
.PAGE
	.SBTTL	INTERRUPT VECTOR INITIALIZATION


	.ASECT

	.	=234
	.WORD	VECTOR,340	;INITIALIZE INTERRUPT VECTOR LOCATIONS
	.CSECT
START:	CLR	@#KEYCSR
	CLR	@#PRCSR		; DISABLE CONSOLE INTERRUPTS
.IIF DF TTY	BR	TSTSEL	; SKIP TEST LIST FOR TELETYPE
.PAGE
	.SBTTL	CONSOLE KEYBOARD TEST SELECTION

LSTINS:	MOV	#TSTDSC,R5
	JSR	PC,SHOTXT	; LIST INSTRUCTIONS FOR DIAGNOSTICS
TSTSEL:	MOV	@#KEYDAT,R0	; RESET KEYBOARD READY
	MOV	#TSTREQ,R5
	JSR	PC,SHOTXT	; ISSUE TEST REQUEST PROMP
	CLR	REPEAT		; RESET REPEAT FLAG
	CLR	R1		; INITIALIZE TEST NUMBER SYNTHESIS REGISTER
GETCHR:	JSR	PC,TTYIN	; GET A CHARACTER (0-7 OR CR)
	BCS	DOIT		; PROCESS THE SELECTED TEST IF CR
	CLC
	.REPT	3
	ROL	R1		; ROTATE ONE OCTAL DIGIT
	.ENDR
	BIC	#177770,R0	; STRIP TO LS 3 BITS
	BIS	R0,R1		; OR WITH PREVIOUS DIGIT
	BR	GETCHR		; AND GO FOR THE NEXT DIGIT
DOIT:	TST	R1		; ZERO?
	BEQ	CSRTST		; START THROUGH THE WHOLE SEQUENCE IF SO
	CMP	#4,R1
	BMI	LSTINS		; LIST INSTRUCTIONS IF > 4
	DEC	REPEAT		; SET REPEAT FLAG FOR INDIVIDUAL TEST
	ROL	R1		; CREATE TABLE OFFSET
	BIC	#177761,R1	; DELETE INVALID BITS
	JMP	@TSTTBL(R1)	;GO EXECUTE SELECTED TEST

REPEAT:	.BLKW	1		; FLAG TO REPEAT SPECIFIED TEST

TSTTBL:	.WORD	0
	.WORD	CSRTST		; START OF CURSOR TEST
	.WORD	JOYTST		; START OF JOYSTICK INTERFACE TEST
	.WORD	JOYPOS		; START OF JOYSTICK POSITION TEST
	.WORD	JOYIRP		; START OF JOYSTICK INTERRUPT TEST
	.WORD	TSTSEL,TSTSEL,TSTSEL	; TRY AGAIN FOR NON-EXISTANT TESTS
.PAGE
	.SBTTL 	HARDWARE CURSOR GENERATOR TEST

;*******************************************************
;                                                      *
;  THE PURPOSE OF THIS TEST IS TO TEST ALL THE CURSOR  *
;  FORMS & CONTROL IN THE FOLLOWING ORDER:             *
;     1. START X1=0, Y1=255., X2=255., Y2=0 & BOX      *
;	 IN PERIMETER OF SCREEN TO VIEW.               *
;     2. START X1=0, Y1=128., X2=255., Y2=128. &       *
;        ROTATE CURSOR 1 & 2, X & Y COORDINATES        *
;        CLOCKWISE TILL ORIG VALUE REACHED.            *
;        (DO FOR ALL CURSOR FORMS)                     *
;     3. REPEAT STEP 2 WITH CURSOR 1 BLINKING,         *
;        CURSOR 2 BLINKING, BOTH BLINKING & BLINK      *
;        RATE ENABLED. CURSOR FORM 7 ONLY.             *
;     4. A COMPARE IS MADE AFTER EACH X & Y            *
;        COORDINATE IS CHANGED & THE EXPECTED &        *
;        RECEIVED COORDINATES PRINTED OUT IF THEY DO   *
;	 NOT COMPARE.                                  *
;                                                      *
;*******************************************************


;*****  THIS ROUTINE TESTS PERIMETER ALIGNMENT OF THE CURSORS  *****


CSRTST:	MOV	#60,@#CSRCTL	; ENABLE CURSORS 1&2 AND SELECT FORM=0=BOX
	MOV	#177400,@#X1SAV	; X1SAV=0, Y1SAV=255.
	MOV	#177400,@#X1	; X1=0,Y1=255.
	MOV	#377,@#X2SAV	; X2SAV=255, Y2SAV=0
	MOV	#377,@#X2	; X2=255., Y2=0
	JSR	PC,CMPXY	; GO TEST FOR VALID X & Y COORDINATES
	MOV	#177777,@#COUNT	;INITIAL WAIT COUNT
	JSR	PC,TIME		;DELAY 2 SECONDS
	JSR	PC,TIME
	JSR	PC,TIME
	BICB	#ENABL2,@#CSRCTL	;TURN OFF CURSOR 2
	JSR	PC,TIME		;DELAY 2 SECONDS
	JSR	PC,TIME
	JSR	PC,TIME
	BICB	#ENABL1,@#CSRCTL	;TURN OFF CURSOR 1
	JSR	PC,TIME		;DELAY 2 SECONDS
	JSR	PC,TIME
	JSR	PC,TIME
	BISB	#ENABL1,@#CSRCTL	;TURN ON CURSOR 1
	JSR	PC,TIME		;DELAY 2 SECONDS
	JSR	PC,TIME
	JSR	PC,TIME
	BISB	#ENABL2,@#CSRCTL	;TURN ON CURSOR 2
	JSR	PC,TIME		;DELAY 2 SECONDS
	JSR	PC,TIME
	JSR	PC,TIME
	MOV	#6250.,@#COUNT	;SET DELAY = 62.5 MS.

;*****  THIS ROUTINE TESTS ALL THE CURSOR FORMS & CONTROL  *****

CSRB:	MOV	#100000,@#X1SAV	; INIT X1SAV=0, Y1SAV=128.
	MOV	#100000,@#X1	; INIT X1=0,Y1=128.
	MOV	#100377,@#X2SAV	; INIT X2SAV=255., Y2SAV=128.
	MOV	#100377,@#X2	; INIT X2=255., Y2=128.
CSR1:	JSR	PC,CMPXY	; GO TEST FOR VALID X & Y COORDINATES
	JSR	PC,TIME		; DELAY 250. MS.
	CMPB	#128.,@#X1SAV	; QUARTER POINT REACHED?
	BEQ	CSR2		; YES, BRANCH
	INCB	@#X1SAV		; INCREMENT X1 & Y1 SAVE AREA
	INCB	@#Y1SAV
	MOV	@#X1SAV,@#X1	;UPDATE X1 & Y1 COORDINATES BY 1
	DECB	@#X2SAV		; DECREMENT X2 & Y2 SAVE AREA
	DECB	@#Y2SAV
	MOV	@#X2SAV,@#X2	;UPDATE X2 & Y2 COORDINATES BY 1
	BR	CSR1		; LOOP TILL QUARTER POINT REACHED
;
CSR2:	INCB	@#X1SAV		; INCREMENT X1 SAVE AREA
	DECB	@#Y1SAV		; DECREMENT Y1 SAVE AREA
	MOV	@#X1SAV,@#X1	;UPDATE X1 & Y1 COORDINATES BY 1
	DECB	@#X2SAV		; DECREMENT X2 SAVE AREA
	INCB	@#Y2SAV		; INCREMENT Y2 SAVE AREA
	MOV	@#X2SAV,@#X2	;UPDATE X2 & Y2 COORDINATES BY 1
	JSR	PC,CMPXY	; GO TEST FOR VALID X & Y COORDINATES
	JSR	PC,TIME		; DELAY 250. MS.
	CMPB	#255.,@#X1SAV	; HALF POINT REACHED?
	BNE	CSR2		; NO, LOOP
;
CSR3:	DECB	@#X1SAV		;YES,DECREMENT X1 SAVE AREA
	DECB	@#Y1SAV		; DECREMENT Y1 SAVE AREA
	MOV	@#X1SAV,@#X1	;UPDATE X1 & Y1 COORDINATES BY 1
	INCB	@#X2SAV		; INCREMENT X2 SAVE AREA
	INCB	@#Y2SAV		; INCREMENT Y2 SAVE AREA
	MOV	@#X2SAV,@#X2	;UPDATE X2 & Y2 COORDINATES BY 1
	JSR	PC,CMPXY	; GO TEST FOR VALID X & Y COORDINATES
	JSR	PC,TIME		; DELAY 250. MS.
	CMPB	#128.,@#X1SAV	; THREE QUARTER POINT REACHED?
	BNE	CSR3		; NO, LOOP
;
CSR4:	DECB	@#X1SAV		; YES, DECREMENT X1 SAVE AREA
	INCB	@#Y1SAV		; INCREMENT Y1 SAVE AREA
	MOV	@#X1SAV,@#X1	;UPDATE X1 &Y1 COORDINATES BY 1
	INCB	@#X2SAV		; INCREMENT X2 SAVE AREA
	DECB	@#Y2SAV		; DECREMENT Y2 SAVE AREA
	MOV	@#X2SAV,@#X2	;UPDATE X2 & Y2 COORDINATES BY 1
	JSR	PC,CMPXY	;GO TEST FOR VALID X&Y COORDINATES
	JSR	PC,TIME		;DELAY 250. MS
	TSTB	@#X1SAV		; BACK TO STARTING POINT?
	BNE	CSR4		; NO, LOOP
;
	MOVB	@#CSRCTL,R0	; YES, GET CURSOR CONTROL BYTE
	BIC	#177770,R0		; INSOLATE CURSOR FORM INTO REG 0
	CMP	#7,R0		; FORM=7?
	BEQ	CSR5		; YES, BRANCH
	JSR	PC,CHKEY		;GO CHECK FOR TERMINATING KEYSTROKE
	JMP	CSR10			;THIS INST. NEEDED TO RETURN PROPERLY
CSR10:  INCB	@#CSRCTL		; NO, GET NEXT CURSOR FORM
	JMP	CSRB		;LOOP TEST WITH NEW FORM
CSR5:   BITB	#10,@#CSRCTL	; BLINK RATE ON?
	BNE	CSR9		;YES,BRANCH
	BITB	#300,@#CSRCTL	;  YES,ARE BLINK CURSORS 1/2 ON?
	BNE	CSR6		; YES, BRANCH
	BISB	#BLINK1,@#CSRCTL	; NO, SET BLINK CURSOR 1
	JMP	CSRB		;LOOP TEST WITH CURSOR 1 BLINKING
CSR6:	BITB	#BLINK1,@#CSRCTL	; BLINK CURSOR 1 ON?
	BNE	CSR7		; YES, BRANCH
	BISB	#BLINK1,@#CSRCTL	; NO, SET BLINK CURSOR 1 ALSO
	JMP	CSRB		; LOOP TEST WITH BOTH CURSORS BLINKING
CSR7:	BITB	#BLINK2,@#CSRCTL	; BLINK CURSOR 2 ON?
	BNE	CSR8		; YES, BRANCH
	BICB	#BLINK1,@#CSRCTL	; NO, CLEAR CURSOR 1
	BISB	#BLINK2,@#CSRCTL	; SET BLINK CURSOR 2
	JMP	CSRB		; LOOP TEST WITH CURSOR 2 BLINKING
CSR8:   BISB	#RATE,@#CSRCTL	; SET BLINK RATE
	JMP	CSRB		; LOOP TEST WITH BLINK RATE ENABLED
CSR9:	JSR	PC,CHKEY	;GO CHECK FOR TEMINATING KEY STROKE
	JMP	CSRTST		;GO START TEST OVER
.PAGE
	.SBTTL	JOYSTICK INTERFACE TEST

;*********************************************
;					     *
;  THE PURPOSE OF THIS TEST IS TO            *
;  TEST THE JOYSTICK INTERFACE & DISPLAY     *
;  THE COORDINATES ON THE CONSOLE DEVICE     *
;  IN OCTAL AS FOLLOWS:                      *
;    DISPLAYS 5 OCTAL GROUPS OF NUMBERS      *
;    TO RIGHT-STATUS REG,REGA,REGB,REGX      *
;    AND REGY                                *
;                                            *
;*********************************************


;*****  JOYSTICK INTERFACE TEST  *****


JOYTST:	MOVB	#3,@#JOYSEL	; SET-SELECT JOYSTICK REGISTER MASK
	CLC			;CLEAR CARRY
	BISB	#10,@#CSRCTL+1	; INITIALIZE INTERFACE & JOYSTICK
	CLRB	@#CSRCTL+1	;CLEAR JOYSTICK CONTROL
JOYT2:	MOVB	@#JOYSEL,@#CSRCTL+1	; SELECT A JOYSTICK REGISTER
	MOVB	@#CSRCTL+1,R4	; READ JOYSTICK COORDINATE
	SWAB	R4		; MOVE COORDINATE TO HIGH BYTE
	JSR	PC,SHONUM	; GO DISPLAY COORDINATE IN OCTAL
	INCB	@#JOYSEL	; GET NEXT REGISTER SELECTION
	CMPB	#10,@#JOYSEL	; LAST COORDINATE?
	BEQ	.+4		; YES, LOOP TILL ALL COORDINATES PROCESSED
	BR	JOYT2		; PROCESS NEXT COORDINATE
	MOV	#15,@#PRDAT	; CARRIAGE RETURN
	JSR	PC,PREADY	; WAIT FOR PRINTER READY
	MOV	#12,@#PRDAT	; LINE FEED
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	JMP	JOYTST		; LOOP TEST
.PAGE
	.SBTTL	JOYSTICK POSITION TEST


;	ENABLES BLINKING DASHED CROSSHAIR FOR CURSOR #1, THEN
;	REPEATEDLY ACQUIRES JOYSTICK COORDINATES AND CONVEYS THEM DIRECTLY
;	TO CURSOR #1.


JOYPOS:	MOV	#JPTEXT,R5
	JSR	PC,SHOTXT	; IDENTIFY JOYSTICK POSITION TEST
	MOVB	#125,@#CSRCTL	; ENABLE CURSOR #1 BLINKING DASHED CROSSHAIR
JOYPS1:	MOVB	#6,@#JOYCTL	; SELECT JOYSTICK X COORDINATE
	MOVB	@#JOYCTL,@#X1	; PASS TO CURSOR #1 X
	MOVB	#7,@#JOYCTL	; SELECT JOYSTICK Y COORDINATE
	MOVB	@#JOYCTL,@#Y1	; PASS TO CURSOR #1 Y
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	JMP	JOYPS1		; CARRY ON UNTIL SAME
	.PAGE
	.SBTTL	JOYSTICK INTERRUPT TEST


;****************************************************
;					            *
;  THE PURPOSE OF THIS TEST IS TO TEST THE          *
;  JOY STICK INTERRUPT FOR ENTER BOTH MANUAL AND    *
;  AUTOMATIC(TRACK).                                *
;  ERROR MESSAGES ARE DISPLAYED FOR UNWANTED        *
;  OR UNDETECTED INTERRUPTS.                        *
;                                                   *
;****************************************************


;*****  JOY STICK INTERRUPT TEST  *****


JOYIRP:	MOV	#JINTXT,R5
	JSR	PC,SHOTXT	; IDENTIFY JOYSTICK INTERRUPT TEST
	MOV	#67,@#CSRCTL	;ENABLE CURSORS 1 & 2 & SEL. FORM=7
	MOV	#100100,@#X1	;X1=64. & Y=128.
	MOV	#100300,@#X2	;X2=192. & Y2=128.
JOY:	MOVB	#10,@#JOYCTL	;INIT. INTERFACE & JOYSTICK
	CLRB	@#JOYCTL	;CLEAR CNTL BYTE
	MOVB	#20,@#JOYCTL	;ENABLE JOYSTICK INTERRUPT
	BIS	#100,@#DACS	;ENABLE INTERRUPTS (DMA)
	CLR	IFLAG		;CLEAR INTERRUPT FLAG
JOY1:	TST	IFLAG		;WAS THERE AN INTERRUPT?
	BEQ	KEYCHK		;NO,WAIT FOR INTERRUPT
	BMI	JOY3		;YES,BRANCH IF IN TRACK MODE(AUTO ENTRY)
	CMP	#1,IFLAG	;MANUAL INTERRUPT?
	BEQ	JOY2		;YES,BRANCH
	CMP	#2,IFLAG	;UNEXPECTED INTERRUPT?
	BNE	JOY2		;NO,BRANCH
	MOV	#EMSG1,R5	;POST ERROR MSG ADDRESS
	JSR	PC,SHOTXT	;GO DISPLAY ERROR MSG
	BR	JOY		;LOOP
JOY2:	MOV	@#X1,TEMP	; PICK UP CURSOR ONE COORDINATES
	COMB	TEMP+1		; COMPLEMENT Y COORDINATE
	MOV	TEMP,@#X2	; AND PASS TO CURSOR TWO
	BR	JOY		;LOOP
JOY3:	BIT	#1,IFLAG
	BEQ	JOY		; IGNORE IF NOT POSITION MODE
	MOVB	#6,@#JOYCTL	; SELECT JOYSTICK X
	MOVB	@#JOYCTL,TEMP	; PICK UP JOYSTICK X COORDINATE
	MOVB	#7,@#JOYCTL	; SELECT JOYSTICK Y COORDINATE
	MOVB	@#JOYCTL,TEMP+1	; COMBINE WITH X
	MOV	TEMP,@#X1	; SUPPLY TO CURSOR #1
	MOV	TEMP,@#X2	; AND CURSOR #2
	BR	JOY		;LOOP
KEYCHK:	JSR	PC,CHKEY	;GO CHECK FOR TERMINATING KEYSTROKE
	JMP	JOY1		;RETURN TO WAITING FOR INTERRUPT
.PAGE
	.SBTTL	SUBROUTINES

;***** SUBROUTINE TO COMPARE CURSOR X&Y & PRINT EXPECTED & *****
;      RECEIVED RESULTS ON CONSOLE SCREEN 


CMPXY:	MOV	@#X1,@#XYWRK	;GET X1 & Y1 RECEIVED
	COMB	@#XYWRK+1	;COMPLEMENT Y1
	CMP	@#X1SAV,@#XYWRK	;X2 & Y2 EXPECTED = RECEIVED?
	BNE	SHOERR		;NO,GO HANDLE ERROR
	MOV	@#X2,@#XYWRK	;GET X2 & Y2 RECEIVED
	COMB	@#XYWRK+1	;COMPLEMENT Y2
	CMP	@#X2SAV,@#XYWRK	;X2 & Y2 EXPECTED = RECEIVED?
	BNE	SHOERR		;NO,GO HANDLE ERROR
CMPRET:	RTS	PC		;YES,RETURN

;*****	DISPLAY EXPECTED COORDINATES FOR CURSOR TEST  *****

SHOERR:	MOV	#XYEXP+6,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#X1SAV,R4	; POST X1 EXPECTED COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYEXP+17.,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#Y1SAV,R4	;POST Y1 EXPECTED COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYEXP+28.,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#X2SAV,R4	;POST X2 EXPECTED COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYEXP+39.,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#Y2SAV,R4	;POST Y2 EXPECTED COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYEXP,R5	; POST PRINT BUFFER ADDRESS FOR X&Y EXPECTED DISPLAY
	JSR	PC,SHOTXT	; DISPLAY X&Y EXPECTED COORDINATES ON SCREEN
	MOV	#15,@#PRDAT	;CARRIAGE RETURN
	JSR	PC,PREADY	;WAIT FOR PRINTER READY
	MOV	#12,@#PRDAT	;LINE FEED

;*****  DISPLAY RECEIVED COORDINATES FOR CURSOR TEST  *****


	MOV	#XYREC+6,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#X1,R4		;POST X1 RECEIVED COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYREC+17.,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#Y1,R4		; POST Y1 RECEIVED COORDINATE
	COMB	R4		;ONE'S COMPEMENT Y1 COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYREC+28.,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#X2,R4		; POST X2 RECEIVED COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYREC+39.,R2	; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO
	MOVB	@#Y2,R4		; POST Y2 RECEIVED COORDINATE
	COMB	R4		;ONE'S COMPLEMENT Y2 COORDINATE
	JSR	PC,MOVNUM	; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE
	MOV	#XYREC,R5	; POST PRINT BUFFER ADDRESS FOR X&Y RECEIVED DISPLAY
	JSR	PC,SHOTXT	; GO DISPLAY X&Y RECEIVED COORDINATES ON SCREEN
	MOV	#15,@#PRDAT	;CARRIAGE RETURN
	JSR	PC,PREADY	;WAIT FOR PRINTER READY
	MOV	#12,@#PRDAT	;LINE FEED
	BR	CMPRET		; GO CLEAN UP & RETURN


;*****  SUBROUTINE TO MOVE OCTAL NUMBERS INTO A PRINT IMAGE  *****



;		ON ENTRY: R2 = ADDRESS IN PRINT IMAGE TO MOVE OCTAL NUMBERS
;		AFTER ENTRY: R4 = UPPER BYTE = BYTE TO BE CONVERTED & MOVED.


MOVNUM:	SWAB	R4		; MOV COORDINATE TO HIGH BYTE
	CLC			; CLEAR CARRY BIT
	MOV	#3,R3		;INIT. OCTAL DIGIT COUNTER
MOVNU1:	ROL	R4		; * SHIFT OCTAL
	ROL	R4		; ** DIGIT TO
	ROL	R4		; *** BITS 2-0
	MOV	R4,R5
	BIC	#177770,R5	; MASK OFF ALL BUT BITS 2-0
	BIS	#60,R5		; MAKE ASCII 0-7
	MOVB	R5,(R2)+	; MOVE OCTAL NUMBER TO PRINT IMAGE
	DEC	R3		; LAST OCTAL NUMBER
	BNE	MOVNU1		; NO, LOOP
	RTS	PC		; YES RETURN


;*****  SUBROUTINE TO HANDLE CONSOLE TEST SELECTION  *****

CHKEY:	TSTB	@#KEYCSR	; KEYSTROKE?
	BPL	CHKEY1
	JMP	TSTSEL		; ALLOW NEW TEST IF SO
CHKEY1:	TST	REPEAT		; REPEAT FLAG SET?
	BNE	CHKEY2		; GO REPEAT TEST IF SO
	ADD	#4,(SP)		; POINT TO NEXT TEST IN SEQUENCE
CHKEY2:	RTS	PC

;*****	SUBROUTINE TO DISPLAY TEXT ON A/N TERMINAL CONSOLE.  *****
;		UPON ENTRY:R5=MESSAGE ADDRESS

SHOTXT:	MOVB	(R5)+,R0	;PICK UP CHARACTER
	BEQ	SHOTX1
	JSR	PC,TTYOUT	;TRANSFER NON-ZERO BYTE TO CONSOLE TERMINAL
	BR	SHOTXT
SHOTX1:	RTS	PC		;RETURN ON ALL-ZERO BYTE

;*****	SUBROUTINE TO FETCH VALID OCTAL DIGITS & CARRIAGE RETURN  *****

TTYIN:	TSTB	@#KEYCSR
	BPL	TTYIN		;WAIT FOR KEYSTROKE
	MOV	@#KEYDAT,R0	;PICK UP CHARACTER
	BIC	#200,R0		; STRIP PARITY BIT
	CMP	#3,R0		;CONTROL C ?
	BEQ	QUIT		;GO EXIT IF SO
	CMP	#15,R0		;CARRIAGE RETURN ?
	BEQ	CRFND		;TERMINATE IF SO 
	CMP	#57,R0
	BPL	TTYIN		;IGNORE IF < 60
	CMP	#67,R0
	BMI	TTYIN		;LIKEWISE IF > 67
TTYOUT:	JSR	PC,PREADY	;WAIT FOR OUTPUT READY
	MOV	R0,@#PRDAT	;ECHO CHARACTER
	JSR	PC,PREADY
	CLC			;SHOW VALID DIGIT
	RTS	PC
CRFND:	JSR	PC,PREADY
	MOV	R0,@#PRDAT
	JSR	PC,PREADY
	MOV	#12,@#PRDAT	;LINE FEED FOR FREE
	JSR	PC,PREADY
	SEC			;FLAG TERMINATOR
	RTS	PC


QUIT:   EMT	350		;RETURN TO RT-11 MONITOR


PREADY:	BIT	#200,@#PRCSR
	BEQ	PREADY		;WAIT FOR PRINTER READY
	RTS	PC


;*****	SUBROUTINE TO WAIT 250 MILLISECONDS  *****



TIME:	MOV	R0,-(SP)	;SAVE R0
	MOV	R1,-(SP)	;SAVE R1
	MOV	@#COUNT,R0	;LOAD UP WAIT COUNT
TIME1:	DEC	R0		;DECREMENT COUNT
	BNE	TIME1
TIME2:	MOV	(SP)+,R1	;RESTORE R1
	MOV	(SP)+,R0	;RESTORE R0
	RTS	PC		;RETURN
.PAGE

;	*****  SUBROUTINE TO DISPLAY OCTAL NUMBERS ON CONSOLE DEVICE *****
;               ON ENTRY:R4 UPPER BYTE = BYTE TO BE PRINTED IN OCTAL

SHONUM:	MOV	#3,R3		; INITIALIZE CHARACTER COUNTER
	CLC			; CLEAR CARRY BIT
SHONU1:	ROL	R4		; * SHIFT OCTAL
	ROL	R4		; ** DIGIT TO
	ROL	R4		; *** BITS 2-0
	MOV	R4,R5	
	BIC	#177770,R5	; MASK OFF ALL BUT BITS 2-0
	BIS	#60,R5		; MAKE ASCII 0-7
	JSR	PC,PREADY	; WAIT FOR CONSOLE OUTPUT READ
	MOV	R5,@#PRDAT	; SHOW DIGIT
	DEC	R3		; LAST OCTAL CHARACTER?
	BNE	SHONU1		; NO, LOOP
	MOV	#2,R3		; YES, SET NULL CHARACTER COUNTER
SHONU2:	JSR	PC,PREADY	; WAIT FOR CONSOLE OUTPUT READ
	MOV	#40,@#PRDAT	; SHOW NULL (SPACE)
	DEC	R3		; LAST NULL CHARACTER?
	BNE	SHONU2		; NO, LOOP
	JSR	PC,PREADY	; WAIT FOR PRINTER READY
	RTS	PC		; YES, RETURN
.PAGE
	.SBTTL	JOYSTICK INTERRUPT HANDLER


VECTOR:	MOV	R0,-(SP)	; SAVE REGISTER 0
	BIT	#4000,@#DACS	; JOYSTICK INTERRRUPT ?
	BNE	V1		;YES,BRANCH
	MOV	#2,IFLAG	;NO,POST RETURN CODE=2=UNEXPECTED INTERRUPT
	BR	V4		; AND GO RETURN
V1:	MOVB	#13,@#JOYCTL	; SELECT JOYSTICK STATUS, DISABLING INTERRUPT
	MOVB	@#JOYCTL,R0	; AND RETRIEVE IT
	BIT	#20,R0		;AUTO ENTER?
	BNE	V2		;YES,BRANCH
	MOV	#1,IFLAG	;NO,POST RETURN CODE=1=MANUAL INTERRUPT
	BR	V4
V2:	BIT	#4,R0		;POSITION MODE?
	BEQ	V3		;NO,BRANCH(RETURN CODE=-2=IGNORE INTERRUPT
	MOV	#-1,IFLAG	;YES,POST RETURN CODE = -1=AUTO ENTER(TRACK)
	BR	V4
V3:	MOV	#-2,IFLAG	; POST RETURN CODE = -2 = IGNORE INTERRUPT
V4:	MOV	(SP)+,R0	; RESTORE REGISTER 0
	RTI			;RETURN FROM INTERRUPT
.PAGE
	.SBTTL	PROGRAM CONSTANTS, VARIABLES, STORAGE 
;
X1SAV:	.BYTE	0		; SAVE X1 FOR COMPARE
Y1SAV:	.BYTE	0		; SAVE Y1 FOR COMPARE
X2SAV:	.BYTE	0		; SAVE X2 FOR COMPARE
Y2SAV:	.BYTE	0		; SAVE Y2 FOR COMPARE
XYWRK:	.WORD	0		;X & Y RECEIVED WORKING REGISTER
COUNT:	.WORD	0		;DELAY COUNT FOR WAIT SUBROUTINE
JOYSEL:	.WORD	0		; MASK TO SELECT JOYSTICK REGISTER
IFLAG:	.WORD	0		;INTERRUPT FLAG
TEMP:	.BLKW	1		; STORAGE FOR CURSOR COORDINATES
.PAGE
	.SBTTL	ASCII STRINGS
	.EVEN
	.NLIST	BIN		;DON'T BOTHER WITH EXPANSIONS
XYEXP:	.ASCIZ/X1EXP=     Y1EXP=     X2EXP=     Y2EXP=   /
	.EVEN

XYREC:	.ASCIZ/X1REC=     Y1REC=     X2REC=     Y2REC=   /
	.EVEN
TSTDSC:	CRLFLF
	.ASCII	/ * * * ID-2000 CURSOR/
	.BYTE	'/
	.ASCII	/JOYSTICK DIAGNOSTICS * * */
	CRLFLF
	.ASCII	/ TESTS AVAILABLE:/
	CRLF
	.ASCII	/ 1 = CURSOR /
	CRLF
	.ASCII	/ 2 = JOYSTICK INTERFACE /
	CRLF
	.ASCII	/ 3 = JOYSTICK POSITION /
	CRLF
	.ASCII	/ 4 = JOYSTICK INTERRUPT /
	CRLFLF
	.ASCII	/ 0 => EXECUTE ALL TESTS SEQUENTIALLY /
	CRLF
	.ASCIZ	/   >4 => LIST AVAILABLE TESTS /

TSTREQ: CRLF
	.ASCIZ  /TEST #: /

JPTEXT:	CRLF
	.ASCIZ	/ENABLE CURSOR #1 IN POSITION MODE:/

JINTXT:	CRLF
	.ASCII	/ENABLE CURSOR #1 IN RATE MODE TO CHECK ENTER;/
	CRLF
	.ASCIZ	/SELECT POSITION AND TRACK TO CHECK AUTO ENTER:/

EMSG1:	.ASCII	/ INTERRUPT NOT JOYSTICK! /
	CRLF
	.BYTE	0
	.LIST	BIN

	.END	START

                                                                                                                                                                                                      