	.TITLE	DMADG2


;	FUNCTIONALLY TESTS PI-11B DIRECT MEMORY ACCESS CARD
;	IN CONJUNCTION WITH ID-2000 SERIES IMAGE DISPLAY SYSTEM
;	WITH 1024-BYTE INTENSITY TRANSFORMATION TABLE.

;	TESTS ARE DIVIDED INTO FIVE GROUPS:

;		I. READ/WRITE REGISTER TESTS

;			A. WORD COUNT
;			B. BUS ADDRESS
;			C. COMMAND STATUS

;		II. INTERRUPT FUNCTION TEST

;		III. DMA TRANSFER TESTS (ASCENDING LENGTH BLOCKS)

;			A. ASCENDING BIT PATTERNS
;				1. WORDS
;				2. LOWER BYTES
;				3. UPPER BYTES

;			B. DESCENDING BIT PATTERNS
;				1. WORDS
;				2. LOWER BYTES
;				3. UPPER BYTES

;		IV. SHIFTER TESTS

;			A. INITIAL SHIFT
;			B. MULTIPLE TRANSFERS
;			C. MULTIPLE TRANSFERS WITH SHIFT

;			(CONTINUED ON NEXT PAGE)
	.PAGE
;		V. SPECIFIC BLOCK LENGTH DMA TRANSFER TEST

;			REQUIRES THE DESIRED BLOCK LENGTH AS KEYBOARD INPUT

;	TESTS MAY BE EXECUTED SERIALLY BY SPECIFICATION OF ZERO
;	FOR THE SELECTED TEST OR REPEATEDLY RUN INDIVIDUALLY BY SUPPLYING
;	THE DESIRED TEST NUMBER.

;	A CARRIAGE RETURN WILL TERMINATE EXECUTION OF A REPEATING TEST
;	OR SEQUENCE, THEREBY PERMITTING NEW TEST SELECTION.

;	SELECTION OF A TEST NUMBER > 16(8) CAUSES THE AVAILABLE TESTS TO BE 
;	LISTED ON THE CONSOLE TERMINAL.

;	ALL NEW CODE: 22 SEPTEMBER 77
;	MODIFICATIONS TO: 18 OCTOBER 78

;	PROGRAMMER: KEN DINWIDDIE
	.PAGE
	.SBTTL	EQUATES


;	PDP-11 REGISTER DEFINITIONS:

	R0	=%0
	R1	=%1
	R2	=%2
	R3	=%3
	R4	=%4
	R5	=%5
	R6	=%6
	R7	=%7
	SP	=%6
	PC	=%7

;	CONSOLE TERMINAL REGISTER DEFINITIONS:

	KEYCSR	=177560
	KEYDAT	=177562
	PRCSR	=177564
	PRDAT	=177566

;	ID-2000 SERIES REGISTER DEFINITIONS (DMA SYSTEMS):

	XREG	=166020
	YREG	=166022
	BPMR	=166024
	CSR	=166026
	DREG	=166030

;	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 / TWO LINE FEEDS
	.BYTE	15,12,12
	.ENDM
	.PAGE
	.SBTTL	INTERRUPT VECTOR INITIALIZATION


	.ASECT
	.	=234
	.WORD	VECTOR,340	; INITIALIZE INTERRUPT VECTOR LOCATIONS

	.CSECT
START:	CLR	@#KEYCSR
	CLR	@#PRCSR
	CLR	@#DACS		; SET DMA TO I/O MODE
	CLR	@#DASC		; INITIALIZE FOR NO SHIFTING
.IIF DF TTY	BR	TSTSEL	; BYPASS TEST LIST IF TELETYPE
	.PAGE
	.SBTTL	CONSOLE KEYBOARD TEST SELECTION


LSTINS:	MOV	#TSTDSC,R5
	JSR	R7,SHOTXT	; LIST INSTRUCTIONS FOR DIAGNOSTICS
TSTSEL:	MOV	#62702,NXTPAS	; CONFIRM ADD INSTRUCTION IN DAXWTS
	MOV	@#KEYDAT,R0	; RESET KEYBOARD READY
	MOV	#TSTREQ,R5
	JSR	R7,SHOTXT	; ISSUE TEST REQUEST PROMPT
	CLR	REPEAT		; RESET REPEAT FLAG
	JSR	PC,GETNUM	; GO GET A NUMBER FROM THE KEYBOARD IN R1
	TST	R1		; ZERO ?
	BEQ	WCTEST		; START THROUGHT THE WHOLE SEQUENCE IF SO
	CMP	#16,R1
	BMI	LSTINS		; LIST INSTRUCTIONS IF > 16(8)
	DEC	REPEAT		; SET REPEAT FLAG FOR INDIVIDUAL TEST
	ROL	R1		; CREATE TABLE OFFSET
	BIC	#177741,R1	; DELETE INVALID BITS
	JMP	@TSTTBL(R1)	; GO EXECUTE SELECTED TEST

REPEAT:	.BLKW	1		; FLAG TO REPEAT SPECIFIED TEST

TSTTBL:	.WORD	0,WCTEST,BATEST,CSTEST,INTEST,ASWDTS,ASLBTS,ASUBTS
	.WORD	DSWDTS,DSLBTS,DSUBTS,ISHFTS,MULTST,MSHTST,SBLDTS
	.PAGE
	.SBTTL	REGISTER READ-WRITE TESTS


WCTEST:	MOV	#WCTXT,R5
	JSR	PC,SHOTXT	; IDENTIFY WORD COUNT REGISTER TEST
	MOV	#DAWC,R0	; WORD COUNT REGISTER
	MOV	#-1,R1		; READ/WRITE MASK (ALL BITS)
	JSR	PC,REGTST	; TEST THE WORD COUNT REGISTER
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	WCTEST		; REPEAT THE TEST IF DESIRED

BATEST:	MOV	#BATXT,R5
	JSR	PC,SHOTXT	; IDENTIFY THE BUS ADDRESS REGISTER TEST
	MOV	#DABA,R0	; BUS ADDRES REGISTER
	MOV	#-2,R1		; READ/WRITE MASK (ALL BITS EXCEPT 0)
	JSR	PC,REGTST	; TEST THE BUS ADDRESS REGISTER
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	BATEST		; REPEAT THE TEST IF DESIRED

CSTEST:	MOV	#CSTXT,R5
	JSR	PC,SHOTXT	; IDENTIFY THE COMMAND/STATUS REGISTER TEST
	MOV	#DACS,R0	; COMMAND/STATUS REGISTER
	MOV	#566,R1		; READ/WRITE MASK
	JSR	PC,REGTST	; TEST THE COMMAND/STATUS REGISTER
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	CSTEST		; REPEAT THE TEST IF DESIRED
	.PAGE
	.SBTTL	INTERRUPT FUNCTION TEST


INTEST:	MOV	#INTXT,R5
	JSR	PC,SHOTXT	; IDENTIFY THE INTERRUPT FUNCTION TEST
	CLR	R4		; CLEAR THE ERROR FLAG
	CLR	INTFLG		; CLEAR THE INTERRUPT FLAG
	CLR	@#XREG		; POINT TO START OF ID-2000 BUFFER MEMORY
	MOV	#1,@#DAWC	; SET WORD COUNT = 1
	MOV	#400,@#DACS	; PRIME THE BUS
	MOV	#OUTBUF,@#DABA	; SUPPLY BUFFER ADDRESS
	MOV	#503,@#DACS	; INITIATE DMA WRITE OF ONE WORD
	.REPT	20
	NOP			; ALLOW TIME FOR TRANSFER
	.ENDR
	TST	INTFLG		; INTERRUPT PROCESSED ?
	BNE	INTES2		; CARRY ON IF SO
INTES1:	MOV	#INTERR,R5
	JSR	PC,SHOTXT	; SHOW INTERRUPT ERROR
	INC	R4		; FLAG ERROR
INTES2:	CLR	@#DACS		; RESTORE I/O MODE OPERATION
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	INTEST		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	DMA TRANSFER TEST - ASCENDING WORDS


ASWDTS:	MOV	#ASWDTX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING WORDS TEST
	JSR	PC,BLDASW	; GO FILL THE OUTPUT BUFFER
	JSR	PC,DAXWTS	; GO TEST DMA FOR ASCENDING WORDS
	TST	R4		; ERROR ?
	BEQ	ASWDT1		; CARRY ON IF NOT
	MOV	#ASWETX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING WORDS ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR I. D.
ASWDT1:	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	ASWDTS		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	DMA TRANSFER TEST - ASCENDING LOWER BYTES


ASLBTS:	MOV	#ASLBTX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING LOWER BYTES TEST
	JSR	PC,BLDASW	; FILL OUTPUT BUFFER
	JSR	PC,DAXLBT	; GO TEST DMA FOR ASCENDING LOWER BYTES
	TST	R4		; ERROR ?
	BEQ	ASLBT1		; CARRY ON IF NOT
	MOV	#ASLETX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING LOWER BYTES ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR
ASLBT1:	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	ASLBTS		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	DMA TRANSFER TEST - ASCENDING UPPER BYTES


ASUBTS:	MOV	#ASUBTX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING UPPER BYTES TEST
	JSR	PC,BLDASW	; FILL OUTPUT BUFFER
	JSR	PC,SWAP		; GO SWAP BYTES THEREIN
	JSR	PC,DAXUBT	; GO TEST DMA FOR ASCENDING UPPER BYTES
	TST	R4		; ERROR ?
	BEQ	ASUBT1		; CARRY ON IF NOT
	MOV	#ASUETX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING UPPER BYTES ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR
ASUBT1:	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	ASUBTS		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	DMA TRANSFER TEST - DESCENDING WORDS


DSWDTS:	MOV	#DSWDTX,R5
	JSR	PC,SHOTXT	; IDENTIFY DESCENDING WORDS TEST
	JSR	PC,BLDDSW	; FILL OUTPUT BUFFER
	JSR	PC,DAXWTS	; GO TEST DMA FOR DESCENDING WORDS
	TST	R4		; ERROR ?
	BEQ	DSWDT1		; CARRY ON IF NOT
	MOV	#DSWETX,R5
	JSR	PC,SHOTXT	; IDENTIFY DESCENDING WORDS ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR
DSWDT1:	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	DSWDTS		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	DMA TRANSFER TEST - DESCENDING LOWER BYTES


DSLBTS:	MOV	#DSLBTX,R5
	JSR	PC,SHOTXT	; IDENTIFY DESCENDING LOWER BYTES TEST
	JSR	PC,BLDDSW	; FILL OUTPUT BUFFER WITH DESCENDING PATTERN
	JSR	PC,DAXLBT	; GO TEST DMA LOWER BYTE TRANSFERS
	TST	R4		; ERROR ?
	BEQ	DSLBT1		; CARRY ON IF NOT
	MOV	#DSLETX,R5
	JSR	PC,SHOTXT	; IDENTIFY DESCENDING LOWER BYTES ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR
DSLBT1:	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	DSLBTS		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	DMA TRANSFER TEST - DESCENDING UPPER BYTES


DSUBTS:	MOV	#DSUBTX,R5
	JSR	PC,SHOTXT	; IDENTIFY DESCENDING UPPER BYTES TEST
	JSR	PC,BLDDSW	; FILL OUTPUT BUFFER WITH DESCENDING PATTERN
	JSR	PC,SWAP		; GO INTERCHANGE LOW AND HIGH BYTES
	JSR	PC,DAXUBT	; GO TEST DMA UPPER BYTE TRANSFERS
	TST	R4		; ERROR ?
	BEQ	DSUBT1		; CARRY ON IF NOT
	MOV	#DSUETX,R5
	JSR	PC,SHOTXT	; IDENTIFY DESCENDING UPPER BYTES ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR
DSUBT1:	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	DSUBTS		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	SHIFTER TEST - INITIAL SHIFT


ISHFTS:	MOV	#ISHFTX,R5
	JSR	PC,SHOTXT	; IDENTIFY INITIAL SHIFT TEST
	JSR	PC,BLDASW	; FILL OUTPUT BUFFER WITH ASCENDING WORDS
	MOV	#OUTBUF,R0
	MOV	#CMPBUF,R1
MOVDAT:	MOV	(R0)+,(R1)+	; MOVE OUTPUT BUFFER TO COMPARISON BUFFER
	CMP	#OUTBUF+1024.,R0
	BNE	MOVDAT
	MOV	#401,R3		; INITIAL SHIFT CODE (START WITH ONE)
ISHFT1:	MOV	#CMPBUF,R0	; POINT TO START OF COMPARISON BUFFER
SOFSHF:	CLC
	ROL	(R0)		; SHIFT LEFT ONE, MS BIT TO CARRY
	BCC	SOFSH1		; LEAVE BIT 0 ZERO IF OLD MS BIT ZERO
	BIS	#1,(R0)		; SET BIT 0 IF OLD MS BIT ONE
SOFSH1:	ADD	#2,R0		; ADVANCE COMPARISON BUFFER POINTER
	CMP	#CMPBUF+1024.,R0
	BNE	SOFSHF		; CONTINUE SOFTWARE SHIFT UNTIL DONE
	MOV	#512.,R2	; SET WORD COUNT
	MOV	R2,RDCNT	; AND SAVE FOR READBACK COUNT
	JSR	PC,DAXSHF	; GO TEST INITIAL SHIFTED DMA TRANSFER
	TST	R4		; ERROR ?
	BEQ	ISHFT2		; CARRY ON IF NONE
	MOV	#ISHETX,R5
	JSR	PC,SHOTXT	; IDENTIFY INITIAL SHIFT ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE ON ERROR
ISHFT2:	INC	R3		; ADVANCE INITIAL SHIFT CODE BY ONE
	CMP	#420,R3		; LAST PASS ?
	BNE	ISHFT1		; CARRY ON IF NOT
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	ISHFTS		; REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	SHIFTER TEST - MULTIPLE TRANSFERS


MULTST:	MOV	#MULTXT,R5
	JSR	PC,SHOTXT	; IDENTIFY MULTIPLE TRANSFER TEST
	JSR	PC,BLDASW	; BUILD ASCENDING WORDS IN OUTPUT BUFFER
	MOV	#400,R3		; START WITH ONE TRANSFER
MULCBF:	MOV	#CMPBUF,R2	; POINT TO START OF COMPARISON BUFFER
	MOV	#OUTBUF,R1	; POINT TO START OF OUTPUT BUFFER
MULCB1:	MOV	R3,R0		; INITIALIZE TRANSFER COUNT
MULCB2:	MOV	(R1),(R2)+	; BUILD COMPARISON BUFFER
	CMP	#CMPBUF+1024.,R2
	BEQ	MULTS1		; STOP IF FULL
	SUB	#400,R0		; DECREMENT MULTIPLE TRANSFER COUNT
	BNE	MULCB2		; REPEAT COMPARISON WORD IF REQUIRED
	ADD	#2,R1		; ADVANCE INPUT BUFFER POINTER IF NOT
	BR	MULCB1		; AND CONTINUE BUILDING COMPARISON BUFFER
MULTS1:	MOV	#512.,R1	; COMPARISON BUFFER SIZE
	MOV	R3,R0
	SWAB	R0		; "DIVIDE BY 256"
	MOV	#-1,R2		; INITIALIZE QUOTIENT
MULTS2:	INC	R2
	SUB	R0,R1
	BGT	MULTS2		; DIVIDE BUFFER LENGTH BY TRANSFER COUNT
	CLR	RDCNT		; INITIALIZE PRODUCT
MULTS3:	ADD	R2,RDCNT
	DEC	R0
	BNE	MULTS3		; CALCULATE NUMBER OF WORDS TO READ
	JSR	PC,DAXSHF	; GO TEST MULTIPLE TRANSFERS
	TST	R4		; ERROR ?
	BEQ	MULTS4		; CARRY ON IF NONE
	MOV	#MULETX,R5
	JSR	PC,SHOTXT	; IDENTIFY MULTIPLE TRANSFERS ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE
MULTS4:	ADD	#400,R3		; INCREASE NUMBER OF TRANSFERS PER WORD
	CMP	#10000,R3
	BNE	MULCBF		; TRY MORE TRANSFERS PER WORD THRU 15
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	MULTST		; GO REPEAT TEST IF DESIRED
	.PAGE
	.SBTTL	SHIFTER TEST - MULTIPLE SHIFTED TRANSFERS


MSHTST:	MOV	#MSHTXT,R5
	JSR	PC,SHOTXT	; IDENTIFY MULTIPLE SHIFTED TRANSFERS TEST
	JSR	PC,BLDASW	; BUILD ASCENDING WORDS IN OUTPUT BUFFER
	MOV	#7420,R3	; START WITH 15 TRANSFERS, 1 SHIFT
MSHCBF:	MOV	#CMPBUF,R2	; POINT TO START OF COMPARISON BUFFER
	MOV	#OUTBUF,R1	; POINT TO START OF OUTPUT BUFFER
MSHCB1:	MOV	R3,R0
	BIC	#377,R0		; STRIP TO NUMBER OF TRANSFERS*256 ONLY
	SWAB	R0		; "DIVIDE BY 256"
	MOV	R0,NXFERS	; SAVE FOR FUTURE REFERENCE
MSHCB2:	MOV	(R1)+,R4	; PICK UP WORD FROM COMPARISON BUFFER
MSHCB3:	MOV	R4,(R2)+	; BUILD COMPARISON BUFFER
	CMP	#CMPBUF+1024.,R2
	BEQ	MSHTS1		; STOP IF FULL
	MOV	#20,R5
	SUB	NXFERS,R5	; NUMBER OF SHIFTS BETWEEN WORDS
SHIFTS:	CLC
	ROL	R4		; SHIFT ONE LEFT, MS BIT TO CARRY
	BCC	SHIFT1		; LEAVE BIT 0 ZERO IF NO CARRY
	BIS	#1,R4		; SET BIT 0 IF CARRY SET
SHIFT1:	DEC	R5		; DECREMENT SHIFT COUNTER
	BNE	SHIFTS		; CONTINUE UNTIL THIS WORD PROPERLY SHIFTED
	DEC	R0		; DECREMENT TRANSFER COUNTER
	BNE	MSHCB3		; AND PROCESS THIS WORD UNTIL DONE
	MOV	NXFERS,R0	; RESTORE TRANSFER COUNT
	BR	MSHCB2		; AND GO GET THE NEXT WORD
MSHTS1:	MOV	NXFERS,R0	; RESTORE THE TRANSFER COUNT
	MOV	#512.,R1	; COMPARISON BUFFER SIZE
	MOV	#-1,R2		; INITIALIZE QUOTIENT
MSHTS2:	INC	R2
	SUB	R0,R1
	BGT	MSHTS2		; DIVIDE BUFFER LENGTH BY TRANSFER COUNT
	CLR	RDCNT		; INITIALIZE PRODUCT
MSHTS3:	ADD	R2,RDCNT
	DEC	R0
	BNE	MSHTS3		; CALCULATE NUMBER OF WORDS TO READ BACK
	JSR	PC,DAXSHF	; GO TEST MULTIPLE SHIFTED TRANSFERS
	TST	R4		; ERROR ?
	BEQ	MSHTS4		; CARRY ON IF NONE
	MOV	#MSHETX,R5
	JSR	PC,SHOTXT	; IDENTIFY MULTIPLE SHIFTED TRANSFER ERROR
	JSR	PC,WAIT		; GO AWAIT KEYSTROKE ON ERROR
MSHTS4:	ADD	#20,R3		; ADVANCE NUMBER OF SHIFTS
	SUB	#400,R3		; REDUCE NUMBER OF TRANSFERS
	CMP	#400,R3		; LAST PASS ?
	BNE	MSHCBF		; CARRY ON IF NOT
	JSR	PC,CHKEY	; GO CHECK FOR TERMINATING KEYSTROKE
	BR	MSHTST		; REPEAT TEST IF DESIRED
	JMP	WCTEST		; RECYCLE THROUGH TESTS

NXFERS:	.BLKW	1		; NUMBER OF TRANSFERS STORAGE LOCATION
	.PAGE
	.SBTTL	SPECIFIC BLOCK LENGTH DMA TRANSFER TEST


SBLDTS:	MOV	#SBLDTX,R5
	JSR	PC,SHOTXT	; IDENTIFY SPECIFIC BLOCK LENGTH TEST
	JSR	PC,GETNUM	; ACQUIRE BLOCK LENGTH FROM KEYBOARD
	TST	R1
	BEQ	SBLDTS		; FORBID BLOCK LENGTH OF ZERO
	CMP	#512.,R1
	BMI	SBLDTS		; OR ONE > 512 WORDS
	MOV	R1,BLNGTH	; SAVE DESIRED BLOCK LENGTH
SBLDT1:	MOV	BLNGTH,R2	; PREPARE FOR DESIRED BLOCK LENGTH
	MOV	#207,NXTPAS	; FORCE RETURN FROM DAXWTS
	JSR	PC,BLDASW	; BUILD ASCENDING WORDS IN OUTPUT BUFFER
	CLR	R3		; PREPARE TO CLEAR SHIFT CONTROL REGISTER
	JSR	PC,DAXWT1	; GO TEST SPECIFIED BLOCK LENGTH TRANSFER
	TST	R4		; ERROR(S) ?
	BEQ	SBLDT2		; CARRY ON IF NOT
	MOV	#ASWETX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING WORDS ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE ON ERROR
SBLDT2:	MOV	#62702,NXTPAS	; RESTORE ADD INSTRUCTION IN DAXWTS
	JSR	PC,CHKEY	; TERMINATING KEYSTROKE ?
	BR	SBLDT1		; REPEAT TEST IF INDICATED
	JMP	TSTSEL		; ALLOW TEST SELECTION IF NOT

BLNGTH:	.BLKW	1		; BLOCK LENGTH STORAGE LOCATION
	.PAGE
	.SBTTL	SUBROUTINES


BLDASW:	CLR	R0
	MOV	#OUTBUF,R1	; POINT TO START OF OUTPUT BUFFER
BLDAS1:	MOV	R0,(R1)+	; BUILD ASCENDING WORDS IN OUTPUT BUFFER
	INC	R0		; ADVANCE PATTERN
	CMP	#512.,R0
	BNE	BLDAS1		; CONTINUE UNTIL FULL
	RTS	PC

BLDDSW:	MOV	#-1,R0		; START PATTERN WITH ALL BITS SET
	MOV	#OUTBUF,R1	; POINT TO START OF OUTPUT BUFFER
BLDDS1:	MOV	R0,(R1)+	; BUILD DESCENDING WORDS IN OUTPUT BUFFER
	DEC	R0
	CMP	#-513.,R0
	BNE	BLDDS1		; CONTINUE UNTIL FULL
	RTS	PC

CHKEY:	TSTB	@#KEYCSR	; KEYSTROKE ?
	BPL	CHKEY1
	TST	(SP)+		; BUMP STACK POINTER
	JMP	TSTSEL		; ALLOW NEW TEST IF SO
CHKEY1:	TST	REPEAT		; REPEAT FLAG SET ?
	BNE	CHKEY2		; GO REPEAT TEST IF SO
	ADD	#2,(SP)		; POINT TO NEXT TEST IN SEQUENCE
CHKEY2:	RTS	PC

CMPLBS:	MOV	#OUTBUF,R0	; POINT TO START OF OUTPUT BUFFER
CMPLB0:	MOV	#INBUF,R1	; POINT TO START OF INPUT BUFFER
	CLR	R4		; RESET ERROR FLAG
CMPLB1:	CMPB	(R0),(R1)	; COMPARE BUFFERS BYTE-BY-BYTE
	BNE	LBERR		; GO IDENTIFY ERRORS IF ANY
CMPLB2:	ADD	#2,R0
	ADD	#1,R1		; ADVANCE POINTERS
	DEC	R3		; REDUCE WORD COUNT
	BNE	CMPLB1		; CARRY ON IF INDICATED
	RTS	PC
LBERR:	JSR	PC,SHOBER	; IDENTIFY ERROR
	INC	R4		; ADVANCE ERROR COUNT
	BR	CMPLB2		; AND PROCEED WITH TEST

CMPUBS:	MOV	#OUTBUF+1,R0	; POINT TO FIRST UPPER BYTE OF OUTPUT BUFFER
	BR	CMPLB0

CMPWDS:	MOV	#INBUF,R1	; POINT TO START OF INPUT BUFFER
	CLR	R4		; RESET ERROR FLAG
CMPWD1:	CMP	(R0)+,(R1)+	; COMPARE BUFFER CONTENTS
	BNE	WDERR		; GO IDENTIFY ERROR IF ANY
CMPWD2:	DEC	R3		; DECREMENT WORD COUNT
	BNE	CMPWD1		; CARRY ON UNTIL DONE
	RTS	PC
WDERR:	TST	-(R0)
	TST	-(R1)		; POINT TO ERRONEOUS WORD PAIR
	JSR	PC,SHOERR	; IDENTIFY ERROR
	TST	(R0)+
	TST	(R1)+		; RESTORE DATA POINTERS
	INC	R4		; ADVANCE ERROR COUNT
	BR	CMPWD2		; AND PROCEED WITH TEST

DAXLBT:	MOV	#1,R2		; INITIALIZE FOR ONE WORD TRANSFER
DAXLB1:	MOV	#515,R1		; SET UP TO DMA WRITE LOWER BYTES
	MOV	#OUTBUF,R0	; POINT TO OUTPUT BUFFER
	JSR	PC,DMAXFR	; PERFORM DMA LOWER BYTES WRITE
	MOV	R2,R3
	JSR	PC,GETWDS	; GO I/O READ LOWER BYTES
	MOV	R2,R3
	JSR	PC,CMPLBS	; GO COMPARE THE READ VS. WRITTEN DATA
	TST	R4		; ERROR ?
	BEQ	DAXLB2		; CARRY ON IF NONE
	MOV	#CRLLS,R5
	JSR	PC,SHOTXT	; CR, 2 LF'S & INDENT 10 SPACES
	JSR	PC,SHONUM	; GO SHOW NUMBER OF ERRORS
	MOV	#DAWLER,R5
	JSR	PC,SHOTXT	; IDENTIFY LOWER BYTE ERROR(S)
DAXLB2:	ADD	#11,R2		; ADVANCE TRANSFER COUNT BY 9
	CMP	#1002,R2
	BNE	DAXLB1		; CONTINUE UNTIL LAST PASS
	RTS	PC

DAXSHF:	MOV	R3,-(SP)	; SAVE R3 ON THE STACK
	MOV	#507,R1		; SET UP FOR SHIFTED DMA TRANSFERS
	MOV	#OUTBUF,R0	; POINT TO OUTPUT BUFFER
	JSR	PC,DMAXFR	; PERFORM SHIFTED DMA WRITE
	MOV	RDCNT,R3
	JSR	PC,GETWDS	; I/O READ THE DATA
	MOV	RDCNT,R3
	MOV	#CMPBUF,R0
	JSR	PC,CMPWDS	; COMPARE THE READ VS. WRITTEN DATA
	TST	R4		; ERROR ?
	BEQ	DAXSH1		; CARRY ON IF NONE
	MOV	#CRLLS,R5
	JSR	PC,SHOTXT	; CR, 2 LF'S & INDENT 10 SPACES
	JSR	PC,SHONUM	; IDENTIFY NUMBER OF ERRORS
	MOV	#DAXSER,R5
	JSR	PC,SHOTXT	; IDENTIFY SHIFTED DMA ERROR
	JSR	PC,WAIT		; WAIT FOR KEYSTROKE AFTER ERROR
DAXSH1:	MOV	(SP)+,R3	; RESTORE R3
	RTS	PC

RDCNT:	.BLKW	1		; STORAGE LOCATION FOR READBACK COUNTER

DAXUBT:	MOV	#1,R2		; INITIALIZE FOR ONE WORD TRANSFER
DAXUB1:	MOV	#513,R1		; SET FOR DMA WRITE UPPER BYTES
	MOV	#OUTBUF,R0	; POINT TO OUTPUT BUFFER
	JSR	PC,DMAXFR	; GO PERFORM DMA UPPER BYTES WRITE
	MOV	R2,R3
	JSR	PC,GETWDS	; I/O READ THE WRITTEN DATA
	MOV	R2,R3
	JSR	PC,CMPUBS	; GO COMPARE THE READ VS. WRITTEN DATA
	TST	R4		; ERROR ?
	BEQ	DAXUB2		; CARRY ON IF NONE
	MOV	#CRLLS,R5
	JSR	PC,SHOTXT	; CR, 2 LF'S & INDENT 10 SPACES
	JSR	PC,SHONUM	; IDENTIFY NUMBER OF ERRORS
	MOV	#DAWUER,R5
	JSR	PC,SHOTXT	; IDENTIFY UPPER BYTE WRITE ERROR
DAXUB2:	ADD	#11,R2		; ADVANCE TRANSFER COUNT BY 9
	CMP	#1002,R2
	BNE	DAXUB1		; CARRY ON UNTIL FULL BUFFER USED
	RTS	PC

DAXWTS:	CLR	R3		; CLEAR SHIFT CONTROL
	MOV	#1,R2		; INITIALIZE WORD COUNT FOR ONE WORD
DAXWT1:	MOV	#503,R1		; SET UP FOR DMA WRITE
	MOV	#OUTBUF,R0	; POINT TO OUTPUT BUFFER
	JSR	PC,DMAXFR	; PERFORM DMA WRITE TO ID-2000 ITT
	MOV	R2,R3
	JSR	PC,GETWDS	; I/O READ THE ITT
	MOV	R2,R3
	MOV	#OUTBUF,R0	; POINT TO OUPUT BUFFER
	JSR	PC,CMPWDS	; COMPARE THE DMA TRANSFER WITH SOURCE
	TST	R4		; ERROR ?
	BEQ	DARDWT		; PROCEED IF OK
	MOV	#CRLLS,R5
	JSR	PC,SHOTXT	; CR, 2 LF'S & INDENT 10 SPACES
	JSR	PC,SHONUM	; GO SHOW NUMBER OF ERRORS
	MOV	#DAWWER,R5
	JSR	PC,SHOTXT	; IDENTIFY DMA WORD WRITE ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR
DARDWT:	MOV	#10000,@#XREG	; POINT TO START OF ITT
	MOV	#OUTBUF,R0	; AND TO START OF INPUT BUFFER
	CLR	R1		; ZERO TRANSFER COUNT
SOFWRT:	MOV	(R0)+,@#DREG	; WRITE PATTERN TO ITT
	INC	R1		; BUMP TRANSFER COUNTER
	CMP	R1,R2
	BNE	SOFWRT		; AND CONTINUE UNTIL DESIRED WORDS WRITTEN
	MOV	#505,R1		; SET UP FOR DMA READ
	MOV	#INBUF,R0	; POINT TO INPUT BUFFER
	JSR	PC,DMAXFR	; DMA READ THE DATA
	MOV	R2,R3
	MOV	#OUTBUF,R0	; POINT TO THE OUTPUT BUFFER
	JSR	PC,CMPWDS	; COMPARE DMA READ WITH SOURCE
	TST	R4		; ERROR ?
	BEQ	NXTPAS		; PROCEED IF NONE
	MOV	#CRLLS,R5
	JSR	PC,SHOTXT	; CR, 2 LF'S & INDENT 10 SPACES
	JSR	PC,SHONUM	; SHOW NUMBER OF ERRORS
	MOV	#DARDER,R5
	JSR	PC,SHOTXT	; IDENTIFY DMA READ ERROR
	JSR	PC,WAIT		; GO WAIT FOR KEYSTROKE AFTER ERROR
NXTPAS:	ADD	#11,R2		; ADVANCE WORD COUNT BY 9

;	!!! INSTRUCTION ABOVE MODIFIED TO RTS	PC BY SBLDTS !!!

	CMP	#1002,R2	; LAST PASS ?
	BNE	DAXWT1		; CARRY ON IF NOT
	RTS	PC

DMAXFR:	MOV	#10000,@#XREG	; POINT TO ITT START
	MOV	R0,@#DABA	; LOAD BUS ADDRESS REGISTER
	MOV	R2,@#DAWC	; LOAD WORD COUNT REGISTER
	MOV	R3,@#DASC	; LOAD SHIFT CONTROL REGISTER
	MOV	#400,@#DACS	; PRIME THE BUS
	CLR	INTFLG		; INITIALIZE THE INTERRUPT FLAG
	MOV	R1,@#DACS	; INITIATE THE DMA TRANSFER
PAUSE:	TST	INTFLG
	BEQ	PAUSE		; AWAIT THE INTERRUPT
	CLR	@#DACS		; RESTORE I/O MODE
	RTS	PC
 
GETNUM:	CLR	R1		; INITIALIZE NUMBER SYNTHESIS REGISTER
GETCHR:	JSR	R7,TTYIN	; GET A CHARACTER (0-7 OR CR)
	BCS	DOIT		; GO RETURN 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:	RTS	PC

GETWDS: MOV	#INBUF, R0	; POINT TO START OF INPUT BUFFER
	MOV	#10000,@#XREG	; POINT TO START OF ITT
GETWD1:	MOV	@#DREG,(R0)+	; FILL INPUT BUFFER
	DEC	R3
	BNE	GETWD1
	RTS	PC

PREADY:	BIT	#200,@#PRCSR
	BEQ	PREADY		; AWAIT CONSOLE OUTPUT READY
	RTS	PC

REGTST:	MOV	#1,R2		; SET BIT 0 ONLY
	COM	R1		; COMPLEMENT MASK
	MOV	R2,R3		; SAVE TEST BIT
REGTS1:	BIC	R1,R2		; TEST THIS BIT?
	BEQ	REGTS2		; SKIP TEST IF NOT
	MOV	R2,(R0)		; WRITE BIT TO REGISTER
	MOV	(R0),R4		; READ REGISTER
	BIC	R1,R4		; MASK OFF UNWANTED BITS
	CMP	R2,R4
	BNE	MOVBER		; GO SHOW MOVING BIT ERROR
REGTS2:	CLC
	ROL	R3		; ADVANCE TEST BIT
	MOV	R3,R2		; PREPARE FOR NEXT TEST
	BCC	REGTS1		; AND PERFORM IT IF INDICATED
	MOV	#-2,R2		; SET ALL BITS EXCEPT 0
	MOV	R2,R3		; SAVE TEST PATTERN
REGTS3:	BIC	R1,R2		; MASK COMPARISON PATTERN
	MOV	R2,(R0)		; WRITE PATTERN TO REGISTER
	MOV	(R0),R4		; READ REGISTER
	BIC	R1,R4		; MASK READ DATA
	CMP	R2,R4
	BNE	MOVZER		; GO SHOW MOVING ZERO ERROR
REGTS4:	SEC
	ROL	R3		; ADVANCE TEST ZERO
	MOV	R3,R2		; PREPARE FOR NEXT TEST
	BCS	REGTS3		; AND PERFORM IF INDICATED
	CMP	#DACS,R0	; CONTROL/STATUS ?
	BEQ	REGTS9		; SKIP ASCENDING/DESCENDING PATTERNS IF SO
	CLR	R3		; INITIALIZE TEST WORD
REGTS5:	MOV	R3,(R0)		; WRITE TO REGISTER
	MOV	(R0),R4		; READ FROM REGISTER
	BIC	R1,R4		; MASK SUPERFLUOUS BITS READ
	MOV	R3,R2
	BIC	R1,R2		; MASK SUPERFLUOUS COMPARISON BITS
	CMP	R2,R4
	BNE	ASRGER		; GO SHOW ERROR IF ANY
REGTS6:	INC	R3		; ADVANCE PATTERN
	BNE	REGTS5		; AND PROCEED FOR ALL PERMUTATIONS
	DEC	R3		; ALL BITS SET
REGTS7:	MOV	R3,(R0)		; WRITE TO REGISTER
	MOV	(R0),R4		; READ FROM REGISTER
	BIC	R1,R4		; MASK SUPERFLUOUS BITS READ
	MOV	R3,R2
	BIC	R1,R2		; MASK SUPERFLUOUS COMPARISON BITS
	CMP	R2,R4
	BNE	DSRGER		; GO SHOW ERROR IF ANY
REGTS8:	DEC	R3		; REDUCE PATTERN
	BNE	REGTS7		; AND PROCEED FOR ALL PERMUTATIONS
REGTS9:	RTS	PC

MOVBER:	MOV	#MVBETX,R5
	JSR	PC,SHOTXT	; IDENTIFY MOVING BIT ERROR
	MOV	#REGTS2,-(SP)	; SAVE RETURN ADDRESS
	BR	REGERR		; GO DEFINE ERROR
MOVZER:	MOV	#MVZETX,R5
	JSR	PC,SHOTXT	; IDENTIFY MOVING ZERO ERROR
	MOV	#REGTS4,-(SP)	; SAVE RETURN ADDRESS
	BR	REGERR		; GO DEFINE ERROR
ASRGER:	MOV	#ASRGTX,R5
	JSR	PC,SHOTXT	; IDENTIFY ASCENDING ERROR
	MOV	#REGTS6,-(SP)	; SAVE RETURN ADDRESS
	BR	REGERR		; GO DEFINE ERROR
DSRGER:	MOV	#DSRGTX,R5
	JSR	PC,SHOTXT	; IDENTIFY DESCENDING ERROR
	MOV	#REGTS8,-(SP)	; SAVE RETURN ADDRESS
REGERR:	JSR	PC,SHONUM	; SHOW READ VALUE
	MOV	#SHBETX,R5
	JSR	PC,SHOTXT	; SHOW "SHOULD BE"
	MOV	R2,R4
	JSR	PC,SHONUM	; SHOW PROPER VALUE
	RTS	PC		; GO RESUME TESTING

SHOBER:	MOV	R4,-(SP)	; SAVE R4
	MOV	#ELEMTX,R5
	JSR	PC,SHOTXT	; SHOW "ELEMENT"
	MOV	R0,R4
	BIC	#1,R4		; GUARANTEE IT EVEN
	SUB	#OUTBUF,R4
	JSR	PC,SHONUM	; SHOW ELEMENT NUMBER
	MOV	#ISTEXT,R5
	JSR	PC,SHOTXT	; SHOW "IS"
	MOVB	(R1),R4
	SWAB	R4
	MOV	#3,CHRCNT
	CLC
	JSR	PC,SHONU2	; SHOW READ VALUE
	MOV	#SHBETX,R5
	JSR	PC,SHOTXT	; SHOW "SHOULD BE"
	MOVB	(R0),R4
	SWAB	R4
	MOV	#3,CHRCNT
	CLC
	JSR	PC,SHONU2	; SHOW CORRECT VALUE
	MOV	(SP)+,R4	; RESTORE R4
	RTS	PC

SHOERR:	MOV	R4,-(SP)	; SAVE R4
	MOV	#ELEMTX,R5
	JSR	PC,SHOTXT	; SHOW "ELEMENT"
	MOV	R0,R4
	SUB	#OUTBUF,R4
	JSR	PC,SHONUM	; SHOW ELEMENT NUMBER
	MOV	#ISTEXT,R5
	JSR	PC,SHOTXT	; SHOW "IS"
	MOV	(R1),R4
	JSR	PC,SHONUM	; SHOW READ VALUE
	MOV	#SHBETX,R5
	JSR	PC,SHOTXT	; SHOW "SHOULD BE"
	MOV	(R0),R4
	JSR	PC,SHONUM	; SHOW PROPER VALUE
	MOV	(SP)+,R4	; RESTORE R4
	RTS	PC

SHONUM:	MOV	#60,R5		; ASCII ZERO
	TST	R4		; BIT 15 SET?
	BPL	SHONU1		; SKIP INCREMENTATION IF NOT
	INC	R5		; MAKE IT ASCII ONE
SHONU1:	JSR	PC,PREADY	; WAIT FOR CONSOLE OUTPUT READ
	MOV	R5,@#PRDAT	; SHOW ONE OR ZERO
	ROL	R4
	ROL	R4		; BIT 15 THRU CARRY TO BIT 0
	MOV	#5,CHRCNT	; INITIALIZE CHARACTER COUNT
SHONU2:	ROL	R4
	ROL	R4
	ROL	R4		; MS OCTAL DIGIT TO 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
	MOV	R5,@#PRDAT	; SHOW DIGIT
	DEC	CHRCNT
	BNE	SHONU2
	TSTB	@#KEYCSR	; KEYSTROKE ?
	BPL	SHONU3		; NO, CARRY ON
	TST	(SP)+		; YES, BUMP STACK POINTER
	JMP	TSTSEL		; AND ALLOW NEW TEST SELECTION
SHONU3:	RTS	PC

CHRCNT:	.BLKW	1		; CHARACTER COUNTER

;	SUBROUTINE TO DISPLAY TEXT ON A/N TERMINAL CONSOLE


SHOTXT:	MOV	R0,-(SP)	; SAVE R0
SHOTX1:	MOVB	(R5)+,R0	; PICK UP CHARACTER
	BEQ	SHOTX2
	JSR	R7,TTYOUT	; TRANSFER NON-ZERO BYTE TO CONSOLE TERMINAL
	BR	SHOTX1
SHOTX2:	MOV	(SP)+,R0	; RESTORE R0
	RTS	R7		; RETURN ON ALL-ZERO BYTE

;	SUBROUTINE TO SWAP BYTES IN OUTPUT BUFFER


SWAP:	MOV	#OUTBUF,R0	; POINT TO START OF OUTPUT BUFFER
SWAP1:	SWAB	(R0)+		; PUT PATTERN IN UPPER BYTE
	CMP	#OUTBUF+1024.,R0
	BNE	SWAP1
	RTS	PC

;	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	R7,PREADY	; WAIT FOR OUTPUT READY
	MOV	R0,@#PRDAT	; ECHO CHARACTER
	JSR	R7,PREADY
	CLC			; SHOW VALID DIGIT
	RTS	R7

CRFND:	JSR	R7,PREADY
	MOV	R0,@#PRDAT
	JSR	R7,PREADY
	MOV	#12,@#PRDAT	; LINE FEED FOR FREE
	JSR	R7,PREADY
	SEC		; FLAG TERMINATOR
	RTS	R7

QUIT:	EMT	350		; RETURN TO RT-11 MONITOR

WAIT:	TST	REPEAT		; REPEAT FLAG SET?
	BEQ	WAIT1		; GO AWAIT KEYSTROKE IF NOT
	RTS	PC		; RETURN IMMEDIATELY IF SO
WAIT1:	CLR	@#KEYCSR	; INITIALIZE KEYBOARD
WAIT2:	TSTB	@#KEYCSR
	BPL	WAIT2		; AWAIT KEYSTROKE
	RTS	PC

VECTOR:	INC	INTFLG		; FLAG INTERRUPT
	RTI

INTFLG:	.BLKW	1		; INTERRUPT FLAG
	.PAGE
	.SBTTL	ASCII STRINGS

	.NLIST	BIN		; DON'T BOTHER WITH EXPANSIONS
TSTDSC:	CRLFLF
	.ASCII	/ * * * ID-2000 DMA DIAGNOSTIC * * * /
	CRLFLF
	.ASCII	/ TESTS AVAILABLE:/
	CRLFLF
	.ASCII	/ 1 = WORD COUNT REGISTER /
	CRLF
	.ASCII	/ 2 = BUS ADDRESS REGISTER /
	CRLF
	.ASCII	/ 3 = COMMAND - STATUS REGISTER /
	CRLF
	.ASCII 	/ 4 = INTERRUPT FUNCTION /
	CRLF
	.ASCII	/ 5 = DMA TRANSFER - ASCENDING WORDS /
	CRLF
	.ASCII	/ 6 = DMA TRANSFER - ASCENDING LOWER BYTES /
	CRLF
	.ASCII	/ 7 = DMA TRANSFER - ASCENDING UPPER BYTES /
	CRLF
	.ASCII	/10 = DMA TRANSFER - DESCENDING WORDS /
	CRLF
	.ASCII	/11 = DMA TRANSFER - DESCENDING LOWER BYTES /
	CRLF
	.ASCII	/12 = DMA TRANSFER - DESCENDING UPPER BYTES /
	CRLF
	.ASCII	/13 = INITIAL SHIFT /
	CRLF
	.ASCII	/14 = MULTIPLE TRANSFERS /
	CRLF
	.ASCII	/15 = MULTIPLE SHIFTED TRANSFERS/
	CRLF
	.ASCII	/16 = SPECIFIC BLOCK LENGTH DMA TRANSFER/
	CRLFLF
	.ASCII	/ 0 => EXECUTE ALL TESTS SEQUENTIALLY, /
	.ASCIZ	/>15 => LIST AVAILABLE TESTS./

TSTREQ:	CRLFLF
	.ASCIZ	/TEST #: /

CRLLS:	CRLFLF
	.ASCIZ	/          /

WCTXT:	CRLF
	.ASCIZ	/ WORD COUNT REGISTER TEST /

BATXT:	CRLF
	.ASCIZ	/ BUS ADDRESS REGISTER TEST /

CSTXT:	CRLF
	.ASCIZ	/COMMAND - STATUS REGISTER TEST /

INTXT:	CRLF
	.ASCIZ	/INTERRUPT FUNCTION TEST /

INTERR:	CRLFLF
	.ASCIZ	/ NO INTERRUPT AFTER 16 NO-OPS./

ASWDTX:	CRLF
	.ASCIZ	/ ASCENDING WORDS TEST /

ASWETX:	.ASCIZ	/ ^ WORDS. /

ASLBTX:	CRLF
	.ASCIZ	/ ASCENDING LOWER BYTES TEST /

ASLETX:	.ASCIZ	/ ^ LOWER BYTES./

ASUBTX:	CRLF
	.ASCIZ	/ ASCENDING UPPER BYTES TEST /

ASUETX:	.ASCIZ	/ ^ UPPER BYTES. /

DSWDTX:	CRLF
	.ASCIZ	/ DESCENDING WORDS TEST /

DSWETX:	.ASCIZ	/ V WORDS. /

DSLBTX:	CRLF
	.ASCIZ	/ DESCENDING LOWER BYTES TEST /

DSLETX:	.ASCIZ	/ V LOWER BYTES. /

DSUBTX:	CRLF
	.ASCIZ	/ DESCENDING UPPER BYTES TEST /

DSUETX:	.ASCIZ	/ V UPPER BYTES. /

ISHFTX:	CRLF
	.ASCIZ	/ INITIAL SHIFT TEST /

ISHETX:	.ASCIZ	/ INITIAL SHIFT. /

MULTXT:	CRLF
	.ASCIZ	/ MULTIPLE TRANSFERS TEST /

SBLDTX:	CRLF
	.ASCII	/ SPECIFIC BLOCK LENGTH DMA TRANSFER TEST/
	CRLFLF
	.ASCIZ	/     SUPPLY BLOCK LENGTH (WORDS): /

MULETX:	.ASCIZ	/ MULTIPLE TRANSFERS. /

MSHTXT:	CRLF
	.ASCIZ	/ MULTIPLE SHIFTED TRANSFERS TEST /

MSHETX:	.ASCIZ	/ MULTIPLE SHIFTS. /

DAWWER:	.ASCIZ	/ DMA WORD WRITE ERRORS. /

DARDER:	.ASCIZ	/ DMA WORD READ ERRORS. /

DAWLER:	.ASCIZ	/ DMA LOWER BYTE WRITE ERRORS. /

DAWUER:	.ASCIZ	/ DMA UPPER BYTE WRITE ERRORS. /

DAXSER:	.ASCIZ	/ DMA SHIFTED WRITE ERRORS. /

MVBETX:	CRLF
	.ASCIZ	/ MOVING BIT ERROR - /

MVZETX:	CRLF
	.ASCIZ	/ MOVING ZERO ERROR - /

ASRGTX:	CRLF
	.ASCIZ	/ ASCENDING PATTERN ERROR - /

DSRGTX:	CRLF
	.ASCIZ	/ DESCENDING PATTERN ERROR - /

SHBETX:	.ASCIZ	/ SHOULD BE /

ELEMTX:	CRLF
	.ASCIZ	/ ELEMENT /

ISTEXT:	.ASCIZ	/ IS /
	.LIST	BIN
	.PAGE
	.SBTTL	DATA BUFFERS


	.EVEN
OUTBUF:	.BLKW	512.		; DMA OUTPUT BUFFER 
INBUF:	.BLKW	512.		; DMA INPUT BUFFER

CMPBUF:	.BLKW	512.		; SHIFTED DMA COMPARISON BUFFER
	.END	START
                                                                                                                                                                                                                                                                                                                                                                                     