Google
 

Trailing-Edge - PDP-10 Archives - klad_sources - klad.sources/dskda1.mac
There are no other files named dskda1.mac in the archive.
SUBTTL	MEMORY RELIABILITY TEST

; **********************************************************************
;*BEGMEM - SETUP SECTION
; **********************************************************************

BEGMEM:	SUBTST
	SKIPE	USER
	JRST	TSTEND

	CLRAPR
	CLRPI+CHNON

	SWITCH
	TRNE	INHMEM		;INHIBIT MEMORY TESTING ?
	JRST	TSTEND		;YES

	JSR	TSTIME

	SETOM	MAPNEW		;DO 1024K MAPPING
	MAPMEM

	MOVE	[JRST	PARERR]	;SETUP SPECIAL PARITY ROUTINE
	MOVEM	$PARER

	SETOM	MERFST#		;SET FIRST ERROR FLAG
	SETOM	PARFST#		;SET PARITY FIRST ERROR FLAG
	SETZM	WASERR#		;CLEAR ERROR FLAG

	CONO	APR,LDPAER+LAPRP1
	MEMZRO			;CLEAR MEMORY
	CLRAPR
	CLRPI+CHNON

; **********************************************************************

MEMT0:	JRST	PHYTST		;PERFORM PHYSICAL ADDRESS 
MEMT1:	JRST	PATTST		;PERFORM DATA PATTERNS 

; **********************************************************************

	JRST	TSTEND
SUBTTL	MEMORY RELIABILITY - PHYSICAL ADDRESS TEST

; **********************************************************************
;*PHYTST - TEST EXECUTION CONTROL SEQUENCE
;*	1ST PASS, BOTTOM TO TOP, PHYSICAL ADDRESSES
;*	2ND PASS, TOP TO BOTTOM, COMPLEMENT PHYSICAL ADDRESSES
;*	RELIABILITY - REPEATS CHECK OF PHY ADDRESS 10 TIMES
;*	FAST CYCLE - CHECKS ONCE
; **********************************************************************

PHYTST:	SUBTST

	MOVEI	0
	MOVEM	TSTN#

	JSR	TSTIME

	SETOM	ADRFST#		;SET FIRST PASS FLAG
	MOVEI	PATIX,6		;PATTERN IS PHYSICAL ADDRESS

PHYTS1:	MOVEM	PATIX,PATXSV

	MOVE	TAC,CONSW
	TLNN	TAC,RELIAB
	SKIPA	TAC1,[^D1]
	MOVEI	TAC1,^D10

	SETZM	ADRSCM
	SETOM	GCFST		;SET FIRST TIME FLAG

	GO	PHYFIL		;FILL MEMORY WITH PHYSICAL ADDRESSES
	SETOM	GCFST
	GO	PHYCHK		;CHECK
	GO	ERLPCK		;ERROR LOOP CHECK
	JRST	.-5

	SOJG	TAC1,.-4

	SETCMM	ADRFST		;SET FOR SECOND PASS
	AOS	PATIX

PHYDWN:	SUBTST

	SKIPN	ADRFST		;DONE ?
	JRST	PHYTS1		;NO, DO SECOND PASS

	JRST	MEMT1		;YES
SUBTTL	DATA PATTERNS TEST

; **********************************************************************
;*PATTST - TEST EXECUTION CONTROL SEQUENCE
;*	FILL MEMORY
;*	READ/RESTORE EXERCISE MEMORY
;*	BLOCK TRANSFER EXERCISE MEMORY
;*	FAST RATE ADDRESSING RD-COMP-WT EXERCISE MEMORY
; **********************************************************************

PATTST:	SUBTST

	MOVEI	1
	MOVEM	TSTN

	GO	MABIT		;SELECT FAST RATE ADDRESSING BIT

	GO	PATSEL		;SELECT DATA PATTERN

	GO	SEGINI

PATTS2:	SETOM	GCFST#		;SET FIRST TIME FLAG
	SETZB	PATIX,PATXSV#	;CLEAR PATTERN INDEX

PATTS1:	SETZM	SEGIX		;CLEAR SEGMENT INDEX
	SETZM	ADRSCM#		;SET ADDRESS SCHEME TO SEQ
	SETZM	FLTFLG#		;CLEAR FLOATING DATA FLAG
	SETZM	PRANF#		;CLEAR PARITY RANDOM FLAG
	JSR	TSTIME

	XCT	@DPATN(PATIX)	;GENERATE DATA PATTERN
	GO	GETADR		;GET ADDRESS CONTROL WORD
	GO	FILMEM		;FILL MEMORY WITH PATTERN
	GO	GETADR
	GO	MRDRST		;READ/RESTORE MEMORY
	GO	GETADR
	GO	MCHECK		;TEST MEMORY
	GO	ERLPCK		;ERROR LOOP CHECK
	JRST	.-5		;LOOP
PATBLT:	SUBTST
	SETOM	ADRSCM		;SET ADDRESS SCHEME TO BLT
	GO	GETADR
	GO	BLTEX		;BLOCK TRANSFER EXERCISE
	GO	GETADR
	GO	MCHECK		;TEST MEMORY
	GO	ERLPCK		;ERROR LOOP CHECK
	JRST	.-5		;LOOP

PATFR:	SUBTST
	SKIPGE	SVMA
	JRST	PATTS1		;IF SVMA NEG, DON'T DO FAST RATE
	SETOM	FRFST#		;SET FAST RATE FIRST TIME FLAG
	GO	FASTR		;SETUP FAST RATE ADDRESSING
	JRST	.+10		;FAST RATE COMPLETED
	GO	GETADR
	GO	FRRCW		;RD-COMP-WRT, FAST RATE
	GO	GETADR
	GO	MCHECK		;TEST MEMORY
	GO	ERLPCK		;ERROR LOOP CHECK
	JRST	.-5		;LOOP
	JRST	.-10		;REPEAT FR FOR ALL ADR BITS

	JRST	PATTS1		;REPEAT SEQUENCE FOR NEXT PATTERN
SUBTTL	MEMORY RELIABILITY - SUBROUTINES

; **********************************************************************
;*COMPSZ - CREATE ADDRESS CONTROL POINTERS
; **********************************************************************

COMPSZ:	HRRZ	MAXMEM#
	AOS			;COMPUTE NEG WORD COUNT
	SUBI	400000		;START VIRTUAL ADR IS 400000
	MOVNS
	HRLI	400000
	MOVSM	ADRLST		;SAVE FOR ADRCON POINTERS
	SETZM	ADRLST+1
	RTN

; **********************************************************************
;*SEGSET - SEGMENT SETUP FOR TESTING SEQUENCE
; **********************************************************************

SEGSET:	SKIPE	TSTSEG#		;SINGLE SEGMENT SELECTED ?
	JRST	XPOPJ1		;YES, RETURN +2
	AOS	SEGNBR#		;INC SEGMENT NUMBER
	MOVE	SEGNBR
	CAILE	7		;COMPLETED ALL SEGMENTS ?
	JRST	XPOPJ1		;YES, RETURN +2
	MEMSEG
	FATAL
	JUMPE	.-6		;NO MEMORY IN THIS SEGMENT
	TLZ	400000		;DON'T CARE IF COMBINED MEMORY
	MOVEM	MAXMEM		;SAVE MAXIMUM VIRTUAL ADDRESS
	GO	COMPSZ		;CREATE ADDRESS POINTERS
	RTN

SEGINI:	SETOM	SEGNBR		;INITIALIZE FOR SEGMENT 0
	GO	SEGSET
	RTN
	RTN
; **********************************************************************
;*PHYFIL - PHYSICAL ADDRESS FILL ALL OF MEMORY
;*	1ST - PHYSICAL ADDRESS IN PHYSICAL ADDRESS
;*	2ND - COMPLEMENT PHY ADR IN PHY ADR DOWNWARD
;*	BASIC PART OF ROUTINE OPERATES IN THE FAST AC'S
; **********************************************************************

PHYFIL:	MOVE	TSTAC,[MOVEM	PATRN,(ADRCON)]	;SETUP AC'S
	MOVE	TSTAC+1,[ADDI	PATRN,1]
	MOVE	TSTAC+2,[ADDI	ADRCON,1]
	MOVE	TSTAC+3,[AOJN	CNT,TSTAC]
	MOVE	TSTAC+4,[JRST	PF1]

	SKIPN	ADRFST
	MOVE	TSTAC+2,[SUBI	ADRCON,1]

PF1:	JSR	TSTIME

	MOVE	PSEG#		;GET PHY SEGMENT ADR
	SKIPN	ADRFST
	JRST	PF2		;2ND PASS

	SKIPE	GCFST
	MOVE	MEMLOW		;INITIAL START AT BREAK ABOVE JOBFF
	SKIPN	GCFST
	ADDI	1000		;STEP UP A PAGE
	CAML	[3,,-1]		;COMPLETED ALL 1024K ?
	RTN			;YES

PF3:	MOVEM	PSEG
	SETZM	GCFST
	MEMSEG			;SETUP PHY MEMORY SEGMENT
	FATAL
	JUMPE	0,PF1		;NO MEMORY
	MOVEI	400000		;1ST, START FROM 400000 VIRTUAL
	SKIPN	ADRFST
	TRO	777		;2ND, DOWN FROM 400777 VIRTUAL
	MOVE	ADRCON,0
	MAPADR			;GET ACTUAL PHY ADR
	FATAL
	SKIPN	ADRFST		;1ST, USE PHY ADR
	SETCA			;2ND, USE COMPLEMENT OF PHY ADR
	MOVE	PATRN,0
	HRROI	CNT,-1000
	JRST	TSTAC		;PERFORM ROUTINE IN AC'S
PF2:	SKIPE	GCFST		;2ND PASS, COMP PHY ADR DOWN
	MOVSI	4		;INITIAL START AT 1024K-1
	SUBI	1000
	CAML	MEMLOW		;COMPLETED ?
	JRST	PF3		;NO
	RTN

; **********************************************************************
;*PHYCHK - PHYSICAL ADDRESS CHECK MEMORY
;*	FAST AC ROUTINE ONLY DIFFERENCE FROM "PHYFIL"
;*	ERROR DETECTED GOES TO MEMER0
; **********************************************************************

PHYCHK:	SETZM	MERCNT#
	SETZM	PARCNT#

	MOVE	TSTAC,[CAME	PATRN,(ADRCON)]
	MOVE	TSTAC+1,[GO	MEMER0]
	MOVE	TSTAC+2,[ADDI	PATRN,1]
	MOVE	TSTAC+3,[ADDI	ADRCON,1]
	MOVE	TSTAC+4,[AOJN	CNT,TSTAC]
	MOVE	TSTAC+5,[JRST	PF1]

	SKIPN	ADRFST
	MOVE	TSTAC+3,[SUBI	ADRCON,1]

	JRST	PF1
; **********************************************************************
;*DATA GENERATION ROUTINES
;*	ENTERED VIA XCT, NORMAL RETURN + 1
;*	DATA PATTERN COMPLETED, RETURN AND REPEAT
;*	DATA WORD PUT IN PATRN
; **********************************************************************

ONES:	GO	.+1		;ALL ONES
	SETOM	PATRN
	SKIPN	GCFST		;FIRST TIME
	JRST	GEXT1		;NO, EXIT
	SETZM	GCFST		;CLEAR FIRST TIME FLAG
	RTN

ZEROS:	GO	.+1		;ALL ZEROS
	SETZM	PATRN
	JRST	ONES+2

ALTB:	GO	.+1		;ALTERNATE BITS
	SKIPN	GCFST		;FIRST TIME
	JUMPL	PATRN,GEXT1	;NO, DATA COMPLETE
	SKIPE	GCFST
	MOVE	PATRN,[525252525252]
	JRST	JEX

PRAND:	GO	.+1		;PSEUDO RANDOM, PARITY BIT CHECK
	SETOM	PRANF
	SKIPE	GCFST
	JRST	.+3
	CAMN	PATRN,[123456,,701234]
	JRST	GEXT1		;DATA COMPLETED
	SKIPE	GCFST
	MOVE	PATRN,[123456,,701234]
	ROT	PATRN,3
	JRST	JEX+1

FLZRO:	GO	.+1		;FLOATING ZERO
	SETOM	FLTFLG
	SKIPN	GCFST
	JUMPG	PATRN,GEXT1	;DATA COMPLETED
	SKIPE	GCFST
	SKIPA	PATRN,[735673567356]
JEX:	ROT	PATRN,1		;ROTATE PATTERN WORD
	SETZM	GCFST
	RTN
FLONE:	GO	.+1		;FLOATING ONE
	SETOM	FLTFLG
	SKIPN	GCFST
	JUMPL	PATRN,GEXT1	;DATA COMPLETED
	SKIPE	GCFST
	SKIPA	PATRN,[042104210421]
	JRST	JEX
	JRST	JEX+1

SKPPAT:	GO	.+1		;THIS PATTERN SKIPPED

GEXT1:	SETOM	GCFST		;SET FIRST TIME FLAG
	SETZM	FLTFLG		;CLEAR FLOATING DATA FLAG
	SETZM	PRANF		;CLEAR PARITY RANDOM FLAG
	AOS	PATIX		;INCREMENT PATTERN INDEX
	MOVEM	PATIX,PATXSV
	SOS	(P)		;DECREMENT RETURN
	RTN			;RETURN TO XCT

DONE:	JRST	.+1
	GO	SEGSET
	JRST	PATTS2
	JRST	MEMT1+1

; **********************************************************************
;*PATSEL - DATA PATTERN SELECTION
; **********************************************************************

PATSEL:	MOVEI	SKPPAT		;INITIALIZE PATTERNS TABLE
	MOVEM	DPATN
	MOVEM	DPATN+1
	MOVEM	DPATN+2
	MOVEM	DPATN+3
	MOVEM	DPATN+4
	MOVEM	DPATN+5
	HLRZ	AC12,RANDBS
	ANDI	AC12,7		;GET RANDOM SELECTION DIGIT
	GO	@SETPAT(AC12)	;SETUP PATTERNS TO DO
	RTN
; **********************************************************************
;*GETADR - GET ADDRESS CONTROL WORD FROM LIST
;*	PUT IT IN ADRCON
;*	IF WORD = 0, RETURN +2
;*	OTHERWISE, INCREMENT INDEX, RETURN +1
; **********************************************************************

GETADR:	MOVE	ADRCON,ADRLST(SEGIX)	;GET ADR CONTROL WORD
	JUMPE	ADRCON,.+3	;IS IT 0
	AOS	SEGIX		;NO, INC INDEX
	RTN			;EXIT
	SETZM	SEGIX		;YES, CLEAR INDEX
	AOS	(P)
	RTN			;RETURN +2

; **********************************************************************
;*FILMEM - FILL MEMORY SEGMENT
;*	DATA IN PATRN
;*	ADDRESS CONTROL WORD IN ARDCON
;*	WHEN COMPLETED RETURN -1
;*	ROUTINE OPERATES IN FAST AC'S
; **********************************************************************

FILMEM:	JSR	TSTIME
	SKIPE	FLTFLG		;FLOATING DATA WORD
	JRST	FMFLT		;YES
	SKIPE	PRANF		;PARITY RANDOM
	JRST	FMPRN		;YES
	MOVE	TSTAC,[MOVEM PATRN,(ADRCON)]	;SETUP AC'S
	MOVE	TSTAC+1,[AOBJN ADRCON,TSTAC]
	MOVE	TSTAC+2,[JRST XPOPM1]
	JRST	TSTAC		;PERFORM FILL MEMORY
FMFLT:	MOVE	AC11,PATRN	;DON'T CHANGE PATRN
	MOVE	TSTAC,[MOVEM	AC11,(ADRCON)]	;DATA ROTATES WD TO WD
	MOVE	TSTAC+1,[ROT	AC11,1]
	MOVE	TSTAC+2,[AOBJN	ADRCON,TSTAC]
	MOVE	TSTAC+3,[JRST	XPOPM1]
	JRST	TSTAC
FMPRN:	MOVE	AC12,PATRN
	MOVE	TSTAC,[MOVEM	AC12,(ADRCON)]
	MOVE	TSTAC+1,[MOVNS	AC12]
	MOVE	TSTAC+2,[ROT	AC12,1]
	MOVE	TSTAC+3,[AOBJN	ADRCON,TSTAC]
	MOVE	TSTAC+4,[JRST	XPOPM1]
	JRST	TSTAC
; **********************************************************************
;*MRDRST - READ/RESTORE MEMORY
;*	PERFORMS READ/RESTORE CYCLE 20 TIMES
;*	ADDRESS CONTROL WORD IN ADRCON, USED IN TAC
;*	ITERATION COUNT IN TAC1
;*	ROUTINE OPERATES IN THE FAST AC'S
; **********************************************************************

MRDRST:	JSR	TSTIME
	MOVE	CONSW
	TLNN	RELIAB		;RELIABILITY ?
	SKIPA	TAC1,[^D1]	;NO, PERFORM R/R ONCE
	MOVEI	TAC1,^D20	;YES, PERFORM R/R 20 TIMES
	MOVE	TAC,ADRCON
	MOVE	TSTAC,[MOVE	ADRCON,TAC]	;SETUP AC'S
	MOVE	TSTAC+1,[CAM	(ADRCON)]
	MOVE	TSTAC+2,[AOBJN	ADRCON,TSTAC+1]
	MOVE	TSTAC+3,[SOJN	TAC1,TSTAC]
	MOVE	TSTAC+4,[JRST RDRTN]
	JRST	TSTAC		;PERFORM READ/RESTORE
RDRTN:	JRST	XPOPM1		;RETURN -1

; **********************************************************************
;*BLTEX - BLOCK TRANSFER MEMORY EXERCISE
;*	PERFORM 1 OR 20 TIMES
;*	DOES BLT OF DATA FROM/TO SAME LOCATIONS
;*	ROUTINE OPERATES IN THE FAST AC'S
; **********************************************************************

BLTEX:	JSR	TSTIME
	MOVE	CONSW
	TLNN	RELIAB		;RELIABILITY ?
	SKIPA	TAC1,[^D1]	;NO, PERFORM BLT ONCE
	MOVEI	TAC1,^D20	;YES, PERFORM BLT 20 TIMES
	HRRZ	TAC,ADRCON
	HLRE	AC14,ADRCON
	MOVMS	AC14
	ADD	AC14,TAC	;SETUP AC14 = 0,LAST ADR
	HRLS	TAC		;SETUP TAC = FIRST ADR,FIRST ADR
	MOVE	TSTAC,[MOVE	AC13,TAC]
	MOVE	TSTAC+1,[BLT	AC13,-1(AC14)]
	MOVE	TSTAC+2,[SOJN	TAC1,TSTAC]
	MOVE	TSTAC+3,[JRST	BLTRTN]
	JRST	TSTAC		;PERFORM BLT ROUTINE
BLTRTN:	JRST	XPOPM1		;RETURN -1
; **********************************************************************
;*MCHECK - CHECK MEMORY SEGMENT
;*	ADDRESS CONTROL WORD IN ADRCON
;*	COMPARE DATA IN PATRN
;*	ERROR DETECTED, GOES TO MEMER0
;*	ROUTINE OPERATES IN THE FAST AC'S
; **********************************************************************

MCHECK:	SETZM	MERCNT
	SETZM	PARCNT
	JSR	TSTIME

	SKIPE	FLTFLG		;FLOATING DATA WORD
	JRST	CKFLT		;YES

	SKIPE	PRANF		;PARITY RANDOM
	JRST	CKPRN		;YES

	MOVE	TSTAC,[CAME PATRN,(ADRCON)]	;SETUP AC'S
	MOVE	TSTAC+1,[GO MEMER0]
	MOVE	TSTAC+2,[AOBJN ADRCON,TSTAC]
	MOVE	TSTAC+3,[JRST CKRTN]
	CONO	APR,LDPAER+LAPRP1	;DISABLE PARITY INTERRUPTS
	JRST	TSTAC		;PERFORM ERROR CHECK

CKFLT:	MOVE	AC12,PATRN	;DON'T CHANGE PATRN
	MOVE	TSTAC,[CAME	AC12,(ADRCON)]	;DATA ROTATES WD TO WD
	MOVE	TSTAC+1,[GO	MEMER1]
	MOVE	TSTAC+2,[ROT	AC12,1]
	MOVE	TSTAC+3,[AOBJN	ADRCON,TSTAC]
	MOVE	TSTAC+4,[JRST	CKRTN]
	CONO	APR,LDPAER+LAPRP1	;DISABLE PARITY INTERRUPTS
	JRST	TSTAC

CKPRN:	MOVE	AC13,PATRN	;DON'T CHANGE PATRN
	MOVE	TSTAC,[CAME	AC13,(ADRCON)]
	MOVE	TSTAC+1,[JRST	ERPRN]
	MOVE	TSTAC+2,[MOVNS	AC13]
	MOVE	TSTAC+3,[ROT	AC13,1]
	MOVE	TSTAC+4,[AOBJN	ADRCON,TSTAC]
	MOVE	TSTAC+5,[JRST	CKRTN]
	JRST	CKFLT-3

ERPRN:	MOVEM	AC13,GDWORD
	GO	MEMER2
	JRST	TSTAC+2

CKRTN:	CLRAPR
	CLRPI+CHNON
	JRST	XPOPM1
; **********************************************************************
;*FASTR - FAST RATE ADDRESSING SETUP
;*	SETS UP FAST RATE BIT WHICH IS ADDED
;*	TO THE ADDRESS WORD, STARTS WITH 1B35
;*	GOES TO 1B18
;*	FAST RATE WORD IN FRBIT
;*	NORMAL-RETURN +2, COMPLETED - RETURN +1
; **********************************************************************

FASTR:	SKIPN	SVMA		;ALL MA BITS ?
	JRST	FASTR1		;YES

	MOVE	FRBIT,SVMA
	SKIPE	FRFST		;FIRST TIME ?
	JRST	FASTR2		;YES
	RTN			;NO, DONE, EXIT

FASTR1:	SKIPE	FRFST		;FIRST TIME
	SKIPA	FRBIT,[1]	;YES, START WITH 1B35
	ROT	FRBIT,1		;ROTATE ONE LEFT
	TLNE	FRBIT,1		;ALL BITS DONE
	RTN			;YES, EXIT

FASTR2:	MOVEM	FRBIT,ADRSCM	;SET ADDRESS SCHEME TO FAST RATE
	SETZM	FRFST		;CLEAR FIRST TIME FLAG
	JRST	XPOPJ1		;RETURN +2

; **********************************************************************
;*MABIT - FAST RATE MA BIT SELECTION
; **********************************************************************

MABIT:	MOVE	RANDBS		;GET RANDOM BASE NUMBER
	ANDI	37		;MAKE INTO RANGE 8. TO 39.
	ADDI	10
	CAIL	^D18		;IF 18. TO 35. USE AS FAST RATE BIT
	CAILE	^D35
	JRST	MABIT1		;OTHERWISE, DO ALL FAST RATE MA BITS
	MOVNM	TAC		;SETUP MA BIT IN PROPER POSITION
	MOVSI	400000
	LSH	(TAC)
	MOVEM	SVMA#		;SAVE FOR FAST RATE
	RTN

MABIT1:	SETZM	SVMA
	CAIGE	^D18		;IF 0. TO 17., DON'T DO FAST RATE
	SETOM	SVMA		;IF 36. TO 39. DO ALL FAST RATE BITS
	RTN
; **********************************************************************
;*FRRCW - FAST RATE ADDRESS
;*	READ-COMPLEMENT-WRITE
;*	ADDRESS CONTROL WORD IN ADRCON
;*	USED IN MFIRST, MLAST, ADR, ADRCON
;*	FAST RATE ADDRESS BIT IN FRBIT
;*	ROUTINE OPERATES IN THE FAST AC'S
; **********************************************************************

FRRCW:	JSR	TSTIME
	MOVEM	PATRN,ACEE1#
	MOVEM	PATIX,ACEE2#	;SAVE THREE AC'S
	MOVEM	SEGIX,ACEE3#
	MOVE	AC14,CONSW	;GET SWITCHES
	TLNN	AC14,RELIAB	;FAST MODE
	SKIPA	1,[^D2]		;YES, PERFORM TWICE
	MOVEI	1,^D20		;NO, PERFORM 20 TIMES
	HRRZ	MFIRST,ADRCON	;SETUP MFIRST = 0, FIRST ADR
	HLRE	MLAST,ADRCON
	MOVMS	MLAST
	ADD	MLAST,MFIRST	;SETUP MLAST = 0,LAST ADR
	HLLZ	CNT,ADRCON	;SETUP COUNT = COUNT,0
	CAML	FRBIT,MLAST	;ADDRESS BIT GREATER THAN SEG
	JRST	FREXT		;YES, EXIT
	MOVEM	MFIRST,SVFRST#	;SAVE CONTROL WORDS
	MOVEM	CNT,SVCNT#

	MOVE	TSTAC,[MOVE ADRCON,MFIRST]
	MOVE	TSTAC+1,[SETCMM	(ADRCON)]
	MOVE	TSTAC+2,[AOBJN	CNT,TSTAC+4]
	MOVE	TSTAC+3,[JRST	FRRTN]
	MOVE	TSTAC+4,[ADD	ADRCON,FRBIT]
	MOVE	TSTAC+5,[CAMGE	ADRCON,MLAST]
	MOVE	TSTAC+6,[JRST	TSTAC+1]
	MOVE	TSTAC+7,[AOJA	MFIRST,TSTAC]
	JRST	TSTAC		;PERFORM ROUTINE

FRRTN:	SOJE	1,FREXT		;COMPLETED ITERATIONS ?
	MOVE	MFIRST,SVFRST	;NO, RESET CONTROL WORDS
	MOVE	CNT,SVCNT
	JSR	TSTIME
	JRST	TSTAC		;REPEAT SEQUENCE

FREXT:	MOVE	PATRN,ACEE1
	MOVE	PATIX,ACEE2	;RESTORE AC'S
	MOVE	SEGIX,ACEE3
	JRST	XPOPM1		;EXIT-1
; **********************************************************************
;*DPATN - DATA PATTERNS TEST
;*	PATTERN EXECUTE LIST
; **********************************************************************

DPATN:	ONES			;ALL ONES
	ZEROS			;ALL ZEROS
	ALTB			;ALTERNATE ONES AND ZEROS
	FLONE			;FLOATING ONE
	FLZRO			;FLOATING ZERO
	PRAND			;PSEUDO RANDOM, PARITY BIT CHECK
	DONE			;TEST EXIT

; **********************************************************************
;*DPATPT - PATTERN MNEMONICS LIST
; **********************************************************************

DPATPT:	ASCII	/ONES /
	ASCII	/ZEROS/
	ASCII	/ALTB /
	ASCII	/FLONE/
	ASCII	/FLZRO/
	ASCII	/PRAND/

	ASCII	/PADR /
	ASCII	/CPADR/

; **********************************************************************
;*ERLPCK - LOOP ON ERROR CHECK
; **********************************************************************

ERLPCK:	JSR	TSTIME

	SWITCH
	TLNN	0,LOOPER	;LOOP ON ERROR ?
	JRST	.+3		;NO
	SKIPE	WASERR		;YES, WAS THERE AN ERROR ?
	RTN			;YES, LOOP ON EXERCISE/CHECK
	SETZM	WASERR		;NO LOOP, CLEAR ERROR INDICATOR
	JRST	XPOPJ1		;RETURN +2
; **********************************************************************
;*SETPAT - DATA PATTERNS SETUP LIST
; **********************************************************************

SETPAT:	ALLPAT			;ALL DATA PATTERNS
	SET1S			;ONES
	SET0S			;ZEROS
	SETALT			;ALT BITS
	SETFL1			;FLOATING ONES
	SETFL0			;FLOATING ZEROS
	STFL10			;FLOATING ONES/FLOATING ZEROS
	SETPRN			;PSEUDO RANDOM, PARITY BIT CHECK

ALLPAT:	GO	SET1S
	GO	SET0S
	GO	SETALT
	GO	SETFL1
	GO	SETFL0
	GO	SETPRN
	RTN

SET1S:	MOVEI	ONES
	MOVEM	DPATN
	RTN

SET0S:	MOVEI	ZEROS
	MOVEM	DPATN+1
	RTN

SETALT:	MOVEI	ALTB
	MOVEM	DPATN+2
	RTN

SETFL1:	MOVEI	FLONE
	MOVEM	DPATN+3
	RTN

SETFL0:	MOVEI	FLZRO
	MOVEM	DPATN+4
	RTN

STFL10:	GO	SETFL1
	GO	SETFL0
	RTN

SETPRN:	MOVEI	PRAND
	MOVEM	DPATN+5
	RTN
SUBTTL	MEMORY RELIABILITY, ERROR ROUTINES

; **********************************************************************
;*MEMER0 - ERROR TYPEOUT ROUTINE
;*	PRINTS ERRORS AS THEY OCCUR
;*	TOTALIZES ERRORS FOR TOTALS PRINTOUT
; **********************************************************************

MEMER0:	MOVEM	PATRN,GDWORD#	;SAVE GOOD WORD
	CAIA

MEMER1:	MOVEM	AC12,GDWORD

MEMER2:	MOVEM	0,ACEEE0#	;SAVE AC0

	HRRZ	ADRCON
	MOVEM	ERRPC		;SAVE ERROR PC

	MOVE	0,(ADRCON)	;GET ERROR WORD
	MOVEM	0,BADWRD#	;SAVE

	MOVEM	10,ACE10#	;SAVE AC'S
	MOVEM	11,ACE11#
	MOVEM	12,ACE12#
	MOVEM	13,ACE13#

	MOVE	10,GDWORD	;FIND FAILING BITS
	XOR	10,BADWRD
	MOVEM	10,FAIL#	;SAVE FAILED BITS

	HRRZ	ADRCON		;CONVERT VIRTUAL ADDRESS TO PHYSICAL ADDRESS
	MAPADR
	ERRHLT
	MOVEM	PHYADR#

	SETOM	WASERR		;SET ERROR FLAG
MEMER3:	SKIPN	MERFST		;FIRST ERROR
	JRST	MEMER4		;NO

	JSR	TTLPNT

	PNTMSG	[ASCIZ/
MEMORY DATA ERROR
TN  AS  PAT  ADDRESS      CORRECT         ERROR       FAILED BITS PAR
/]

MEMER4:	SWITCH
	TLNE	PALERS		;PRINT ALL ERRORS ?
	JRST	MEMER5		;YES
	MOVE	MERCNT
	CAIL	^D10		;PRINTED ALLOWED ?
	JRST	MEMER7		;YES

MEMER5:	MOVE	TSTN		;PRINT TEST NUMBER
	PNT1
	PSP

	SKIPLE	ADRSCM		;SEQUENTIAL ADDRESSING ?
	JRST	FRPNT		;NO

	MOVEI	[ASCII/SEQ/]	;YES, PRINT 'SEQ'
	SKIPE	ADRSCM
	MOVEI	[ASCII/BLT/]
	PNTA

MEMER6:	PSP
	MOVEI	DPATPT(PATIX)
	PNTA			;PRINT DATA PATTERN
	PSP

	MOVE	PHYADR
	PNTADR			;PRINT ADDRESS
	PSP
	PSP
	MOVE	GDWORD
	PNTHW			;PRINT CORRECT
	PSP

	MOVE	BADWRD
	PNTHW			;PRINT ERROR
	PSP

	MOVE	FAIL
	PNTHW			;PRINT FAILED BITS

	GO	PARCK		;CHECK PARITY
	PNTCI	"P"		;YES, PRINT 'P'
	PCRL

MEMER7:	SETZM	MERFST		;CLEAR FIRST ERROR FLAG
	SETOM	PARFST		;SET FIRST PARITY FLAG
	AOS	ERRTLS

	SWITCH
	TLNE	0,DING		;RING BELL ON ERROR
	PBELL

	GO	PARCK		;CHECK PARITY
	AOS	TOTPAR		;YES, INCREMENT PARITY TOTAL

	MOVE	10,TSTN		;INCREMENT TEST ERROR TOTAL
	AOS	TOTPAT-1(10)

	MOVE	10,GDWORD	;DETERMINE BITS PICKED UP
	MOVE	11,BADWRD
	ANDCA	10,11
	MOVEM	10,PICKED#	;SAVE
	SETZ	13,
	GO	ERRADD

	MOVE	10,GDWORD	;DETERMINE BITS DROPPED
	MOVE	11,BADWRD
	ANDCM	10,11
	MOVEM	10,DROPED#	;SAVE
	AOS	13
	GO	ERRADD
	SKIPN	PICKED		;ANY DATA PICKUP FAILURES
	JRST	MEMER8		;NO

	MOVE	10,PHYADR	;DETERMINE ADR BITS WITH PICKUP
	LSH	10,^D14
	AOS	13
	GO	ERRADD

MEMER8:	SKIPN	DROPED		;ANY DATA DROPPED FAILURES
	JRST	MEMER9		;NO

	MOVE	10,PHYADR	;DETERMINE ADR BITS WITH DROPOUT
	LSH	10,^D14
	MOVE	13,[3]
	GO	ERRADD

MEMER9:	MOVE	10,ACE10	;RESTORE AC'S
	MOVE	11,ACE11
	MOVE	12,ACE12
	MOVE	13,ACE13

	MOVE	0,GDWORD	;FIX ERROR
	MOVEM	0,(ADRCON)

	GO	ERCHK		;CHK FOR ERROR LIMIT

	MOVE	0,ACEEE0	;RESTORE AC0
	CLRAPR
	CLRPI+CHNON
	RTN			;RETURN TO CHECK
; **********************************************************************
;*ERRADD - ERROR TOTALIZING ADDITION SUBROUTINE
; **********************************************************************

ERRADD:	JFFO	10,.+2		;COMPUTE BIT POSITION
	RTN			;NO ERRORS
	XCT	ADDTOT(13)	;INCREMENT ERROR TOTAL
	MOVNS	11
	HRLZI	12,400000	;CLEAR THIS BIT POSITION
	LSH	12,(11)
	TDZ	10,12
	JRST	.-7		;GET NEXT POSITION WITH FAILURE

ADDTOT:	AOS	PCKDB(11)	;ADD 1 TO DATA PICKUP TOTAL
	AOS	DRPDB(11)	;ADD 1 TO DATA DROPOUT TOTAL
	AOS	PCKAB(11)	;ADD 1 TO ADR BIT WITH DATA PICKUP
	AOS	DRPAB(11)	;ADD 1 TO ADR BIT WITH DATA DROPOUT

FRPNT:	PNTCI	"F"		;FAST RATE ADDRESSING

	MOVE	10,ADRSCM	;GET FAST RATE BIT
	JFFO	10,.+1		;COMPUTE BIT POSITION
	MOVE	11
	PNTDEC			;PRINT IT
	JRST	MEMER6		;CONTINUE PRINTOUT

ERCHK:	SKIPL	MONCTL		;DON'T CHK IF STAND-ALONE
	RTN
	GO	ERRTOT		;ADD ERROR TOTALS
	CAIG	0,^D25		;25 ALLOWABLE ERRORS
	RTN			;OK
	JRST	@RETURN		;EXCEEDED LIMIT
; **********************************************************************
;*TOTAL - TOTAL ERRORS TYPEOUT ROUTINE
; **********************************************************************

TOTAL:	SKIPE	USER		;TEST NOT DONE IN USER MODE
	RTN

	PNTMSG	[ASCIZ/
* MEMORY TOTALS *
DATA ERROR TOTALS = /]
	MOVE	TOTPAT
	PNTDEC	

	PNTMSG	[ASCIZ/
PARITY ERROR TOTALS = /]
	MOVE	TOTPAR
	PNTDEC			;PRINT PARITY TOTALS

	GO	ERRTOT		;ADD ERROR TOTALS
	JUMPE	0,TOTRTN	;NO ERRORS

	PNTMSG	[ASCIZ/

DATA BIT FAILURES
BIT	    PICKUP   DROPOUT
/]

	SETZ	1,
TOTAL1:	MOVE	PCKDB(1)	;ANY ERRORS, THIS BIT
	ADD	DRPDB(1)
	JUMPE	TOTAL2		;NO
	MOVE	1		;YES, PRINT DATA BIT NUMBER
	PNTDEC
	PSP

	MOVE	PCKDB(1)
	PNTDS			;PRINT PICKUP TOTAL

	MOVE	DRPDB(1)
	PNTDS			;PRINT DROPOUT TOTAL

	PCRL
TOTAL2:	AOS	1		;INCREMENT INDEX
	CAIG	1,^D35		;DONE
	JRST	TOTAL1		;NO, REPEAT FOR NEXT BIT

	PNTMSG	[ASCIZ/

ADDRESS BITS WITH DATA FAILURES
BIT         PICKUP   DROPOUT
/]

	SETZ	1,
TOTAL3:	MOVEI	^D14(1)		;PRINT ADR BIT NUMBER
	PNTDEC

	MOVE	PCKAB(1)	;ANY ERRORS, THIS ADR BIT
	ADD	DRPAB(1)
	JUMPE	TOTAL4-1	;NO

	PTAB
	MOVE	PCKAB(1)
	PNTDS			;PRINT PICKUP TOTAL

	MOVE	DRPAB(1)
	PNTDS			;PRINT DROPOUT TOTAL

	PCRL
TOTAL4:	AOS	1		;INCREMENT INDEX
	CAIG	1,^D21		;DONE
	JRST	TOTAL3		;NO, REPEAT FOR NEXT BIT

TOTRTN:	PCRL
	SETOM	MERFST		;SET FIRST ERROR FLAG
	SETOM	PARFST		;SET PARITY FIRST ERROR FLAG
	RTN
; **********************************************************************
;*CLRERR - CLEAR ERROR TOTALS
; **********************************************************************

CLRERR:	SETZM	TOTPHY
	MOVE	[TOTPHY,,TOTPHY+1]
	BLT	DRPAB+^D21
	RTN

XPOPJ1:	AOS	(P)		;RETURN +2
	RTN

XPOPM1:	SOS	(P)		;RETURN-1
	SOS	(P)
	RTN

; **********************************************************************
;*PARCK - CHECK FOR PARITY ERROR
; **********************************************************************

PARCK:	CONSZ	APR,LPARER	;KL10
	RTN
	JRST	XPOPJ1

; **********************************************************************
;*ERRTOT - TOTALIZE MEMORY ERRORS
; **********************************************************************

ERRTOT:	MOVE	0,TOTPAT	;ADD ERROR TOTALS
	ADD	0,TOTPHY
	RTN
SUBTTL	MEMORY RELIABILITY, SPECIAL PARITY INTERRUPT ROUTINE

; **********************************************************************
;*PARERR - PARITY ERROR ROUTINE
; **********************************************************************

PARERR:	MOVEM	10,ACE10	;SAVE AC'S
	MOVEM	11,ACE11
	MOVEM	12,ACE12
	MOVEM	13,ACE13

	SKIPN	PARFST		;FIRST ERROR
	JRST	PARER1		;NO

	JSR	TTLPNT

	PNTMSG	[ASCIZ/
MEMORY PARITY ERROR
TN    PROG     PC    AS    PAT    ADDRESS        DATA       PARITY
/]

PARER1:	SWITCH
	TLNE	PALERS		;PRINT ALL ERRORS ?
	JRST	PARER2		;YES

	MOVE	PARCNT
	CAIL	^D10		;PRINTED ALLOWED ERRORS ?
	JRST	PARER4		;YES

PARER2:	MOVE	TSTN		;PRINT TEST NUMBER
	PNT1
	PSP
	PSP

	HRLZ	0,(P)		;PRINT LAST PUSHJ ENTRY
	HRR	0,ITRCH1	;AND PC OF INTERRUPTED
	SUB	0,[1,,1]	;LOCATION
	PNTHW
	PSP
	PSP
	SKIPLE	ADRSCM		;SEQUENTIAL ADDRESSING ?
	JRST	PFRPNT		;NO

	MOVEI	[ASCIZ/SEQ/]
	SKIPE	ADRSCM
	MOVEI	[ASCIZ/BLT/]
	PNTA

PARER3:	PSP
	PSP
	PSP

	MOVE	AC10,PATXSV	;GET SAVED PATTERN INDEX
	MOVEI	DPATPT(AC10)
	PNTA			;PRINT DATA PATTERN
	PSP
	PSP

	HRRZ	ADRCON
	MAPADR
	ERRHLT
	PNTADR			;PRINT PHYSICAL ADDRESS
	PSP
	PSP

	CAML	ADRCON,MAXMEM	;DOES CURRENT TEST ADR POINT TO MEMORY
	JRST	PARER4-1	;NO, OUTSIDE MEMORY
	MOVE	0,(ADRCON)	;GET CURRENT TEST ADR DATA
	PNTHW
	PSP
	PSP

	GO	PARCK		;CHECK PARITY
	PNTCI	"P"		;YES, PRINT 'P'
	PCRL
PARER4:	MOVE	10,CONSW
	TLNE	10,DING
	PBELL

	AOS	PARCNT		;INCREMENT PARITY COUNT
	AOS	TOTPAR		;INCREMENT PARITY TOTAL
	SETOM	MERFST		;SET FIRST ERROR FLAG
	SETZM	PARFST		;CLEAR FIRST PARITY FLAG

	HRRZ	0,ITRCH1	;GET INTERRUPT PC
	CAIG	0,17		;PARITY ERROR IN PROGRAM AREA
	JRST	PARER5		;NO

	HRRZ	(P)		;YES
	CAIG	0,17		;WAS PROGRAM IN AC'S ?
	JRST	PARER5		;YES

	PNTMSG	[ASCIZ/
**********
PARITY ERROR IN PROGRAM
PROGRAM OPERATION QUESTIONABLE FROM THIS POINT
**********
/]
	SETOM	PARFST		;SET FIRST PARITY FLAG

PARER5:	MOVE	AC10,ACE10	;RESTORE AC'S
	MOVE	AC11,ACE11
	MOVE	AC12,ACE12
	MOVE	AC13,ACE13

	GO	ERCHK		;CHK FOR ERROR LIMIT

	MOVE	0,$ACC0
	CONO	APR,LCPAER+LAPRP1
	JRST	10,@ITRCH1	;CONTINUE TEST
; **********************************************************************
;*PFRPNT - PARITY FAST RATE ADDRESSING PRINT
; **********************************************************************

PFRPNT:	PNTCI	"F"

	MOVE	AC10,ADRSCM	;GET FAST RATE BIT
	JFFO	AC10,.+1	;COMPUTE BIT POSITION
	MOVE	AC11
	PNTDEC			;PRINT IT
	JRST	PARER3

; **********************************************************************
;*ERROR TOTALS TABLE
; **********************************************************************

ADRLST:	BLOCK	2		;ADDRESS LIST

TOTPHY:	0			;PHYSICAL ADDRESS TEST TOTAL
TOTPAT:	0			;DATA PATERNS TEST TOTAL
TOTPAR:	0			;PARITY ERROR TOTAL

PCKDB:	BLOCK	^D36		;DATA BIT PICKUP TOTAL
DRPDB:	BLOCK	^D36		;DATA BIT DROPOUT TOTAL
PCKAB:	BLOCK	^D22		;ADDRESS BIT, DATA PICKUP, TOTAL
DRPAB:	BLOCK	^D22		;ADDRESS BIT, DATA DROPOUT, TOTAL