Google
 

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

PGMNAM:	ASCIZ/
DECSYSTEM10 KI10 RANDOM NUMBER INSTRUCTION TEST (DBKDB)
/
;*SIMULATOR -DDT- INITIALIZATION SEQUENCE

SIMDDT:	JRST	SENTRY		;GO TO SIMULATOR

;*PROGRAM INITIALIZATION

SFSRT1:	SETZM	ERRTLS
	SETZM	TICKS
	SETZM	TSTIMR#
	JRST	BEGIN

START:	PGMINT			;INITIALIZE SUBROUTINES
	JSR	MGNCLR
	SWITCH
	SKIPN	USER		;IF USER, USE TIME OF DAY IN JIFFIES
	JRST	.+3
	CALL	1,[SIXBIT/TIMER/]
	MOVEM	1,RANDBS	;INIT RANDOM NUMBER GENERATOR
	TRNN	RANBAS		;SPECIFY RANDOM NUMBER BASE ?
	JRST	STARTA		;NO
	MOVEI	[ASCIZ/
SPECIFY BASE RANDOM NUMBER - /]
	PNTALF
	TTIOCT			;INPUT OCTAL NUMBER
	JRST	.-3		;ERROR
	MOVEM	0,RANDBS	;INIT RANDOM NUMBER GENERATOR
STARTA:	SETOM	SIMFLG#		;SETUP CONTROL FLAGS
	SETOM	NEWFLG#
	SETZM	PNTSPC
	SWITCH
	TRNE	INHNEW		;INHIBIT NEW INST'S ?
	SETZM	NEWFLG		;YES
	TRNE	INHSIM		;INHIBIT SIMULATION ?
	SETZM	SIMFLG		;YES
	MOVEI	1,^D10
	TRNE	SNGFL		;SINGLE FAST LOOP ?
	MOVEI	1,1		;YES
	MOVEM	1,FLCNT#
	TRNE	ENTDDT		;ENTER DDT SWITCH SET ?
	JRST	DDTSRT		;YES
	SKIPE	USER		;USER MODE ?
	JRST	BEG		;YES

STARTB:	TRNE	INHCLK		;EXEC, INHIBIT CLOCK INTERRUPTS ?
	JRST	STARTC		;YES
	MOVE	1,[JSR ITRCLK]	;SETUP INTERRUPT ROUTINE
	MOVEM	1,$ITRHL	;TO ALLOW FOR CLOCK
	MOVEI	1,^D60		;50 OR 60 HZ. ?
	SKIPE	CYCL60
	MOVEI	1,^D50		;50 HZ.
	MOVEM	1,HERTZ#
	MOVE	[JSR ITRCH1]	;SETUP FOR ALL CHANNELS
	MOVEM	44
	MOVEM	46
	MOVEM	50
	MOVEM	52
	MOVEM	54
	MOVEM	56
	CONO	APR,CLKENB!CLKCLR!IAPRE1!IAPRC1	;TURN ON CLOCK
	CONO	PI,PARENB!CHNON!PION!PICHNA
	JRST	BEG

STARTC:	CONO	PI,PICLR!CHNOFF!PIOFF	;CLEAR INTERRUPTS
	CONO	APR,IAPRE1	;TURN ON ERROR CHANNEL 1
	CONO	PI,CHNON!PION!PICHN1
	JRST	BEG
SUBTTL	DIAGNOSTIC SECTION

BEG:	SETZM	ERRCNT#		;ERROR COUNT
	SETZM	PASCNT#
CONTNU:	MOVE	RANDBS
	MOVEM	K1#
	MOVE	10,FLCNT
	MOVEM	10,K2#		;ITR COUNT
	SETZM	PRNT#		;PRINT FLAG
	SETZ	12,0
	MOVS	10,K1		;RESTART TO CONTINUE RANDOM NUMBERS
	MULI	10,6065		
	DIV	10,[XWD 377777,777741]
	MOVEM	11,K1
	MOVEM	11,0(12)
	AOS	12,12
	CAIE	12,10
	JRST	CONTNU+6
	HRRI	12,RAND		;STOR NUM IN RAND TO RAND+7 AND AC 0-7
	HRLI	12,0
	BLT	12,RAND+7
VIT:	SETZ	12,0		;TEST FOR VALID INST
	MOVE	11,@12
	AND	11,[XWD 770000,0]
	ROT	11,6
	CAIGE	11,11		;LESS THAN 110
	JRST	XCONVT		;YES, MAKE NEW INST
	CAIGE	11,13		;LESS THAN 130
	JRST	NWINST		;YES, MAKE NEW KI INSTRUCTIONS
	CAIGE	11,14		;LESS THAN 140
	JRST	BYTTST		;YES GO CHECK FOR POSSIBLE BYTE OR FSC
	CAIN	11,26		;CHECK FOR PUSH,POP
	JRST	XIMUL		;GO MAKE NEW INST (IMUL)
	CAIN	11,25		;CHECK FOR JMP INST
	JRST	ECHTST		;GO CHECK FOR POSSIBLE EXCH
	LSH	11,-3
	CAIN	11,3		;CHECK FOR SKIPS & JMPS
	JRST	XFSBR		;GO MAKE NEW INST(FSBR)
	CAIN	11,6		;CHECK FOR TST INST
	JRST	TSTTST		;GO CHECK FOR LAST INST IN GROUP
	CAIN	11,7		;CHECK FOR IOT
	JRST	XFMPR		;GO MAKE NEW INST(FMPR)
	CAIE	11,2		;CHECK FOR JFFO
	JRST	MASKX		;NO
	JSR	ARANGE		;YES, POSSIBLE
	CAIN	13,243
	JRST	XIMUL		;GO MAKE NEW INST (IMUL)
	CAIN	13,247		;MAP INSTRUCTION
	JRST	XIMUL		;MAKE IMUL
	JRST	MASKX		;GO MASKX OUT UNWANTED BITS
ARANGE: 0			;GET OPERATION CODE OF OPERAND
	MOVE	13,@12
	AND	13,[XWD 777000,0]
	ROT	13,9
	JRST	@ARANGE

BYTTST:	JSR	ARANGE
	CAILE	13,132		;CHECK FOR FSC OR BYTE
	JRST	XASHC		;NO,MAKE NEW INST (ASHC)
	JRST	MASKX		;YES,GO MASKX OUT UNWANTED BITS

ECHTST:	JSR	ARANGE		;GO GET OP CODE
	CAIE	13,250		;POSSIBLE EXCHANGE INST
	JRST	XIMUL		;NO,MAKE NEW INST (IMUL)
	JRST	MASKX		;YES,GO MASKX OUT UNWANTED BITS

TSTTST:	CAILE	12,4		;POSSIBLE TST INST IF NOT LAST IN GROUP
	JRST	XFDVR		;NO,GO MAKE NEW INST (FDVR)
	JRST	MASKX		;YES,GO MASKX OUT UNWANTED BITS

VITEXT:	AOS	12
	MOVEM	11,INSBLK-1(12)	;STOR VALID INST IN INSBLK TO INS BLK+7
	CAIN	12,7
	JRST	SLO		;GO SET UP SLOW LOOP
	JRST	VIT+1		;GO TEST MORE

MMASKX:	0			;MAKE NEW INST
	MOVE	11,@12
	TLZ	11,777000
	XCT	@MMASKX
	JRST	MASKX+1

XROTC:	JSR	MMASKX
	ADD	11,[XWD 245000,0]	;MAKE IT A ROTC

XIMUL:	JSR	MMASKX
	ADD	11,[XWD 220000,0]	;MAKE IT A IMUL

XFDVR:	JSR	MMASKX		;MAKE IT A FDVR
	ADD	11,[XWD 174000,0]
XFMPR:	JSR	MMASKX
	ADD	11,[XWD 164000,0]	;MAKE IT A FMPR

XFSBR:	JSR	MMASKX
	ADD	11,[XWD 154000,0]	;MAKE IT A FSBR

XASHC:	JSR	MMASKX
	ADD	11,[XWD 244000,0]	;MAKE IT A ASHC

XDFAD:	JSR	MMASKX
	ADD	11,[XWD	110000,0]	;MAKE DFAD

XDFSB:	JSR	MMASKX
	ADD	11,[XWD 111000,0]	;MAKE DFSB

XDFMP:	JSR	MMASKX
	ADD	11,[XWD 112000,0]	;MAKE DFMP

XDFDV:	JSR	MMASKX
	ADD	11,[XWD 113000,0]	;MAKE DFDV

MASKX:	MOVE	11,@12		;MASK OUT INDEX REG & HIGH ORDER E FIELD
	AND	11,[XWD 777340,7]
	JRST	VITEXT

XCONVT:	SKIPN	NEWFLG		;MAKE NEW INST'S
	JRST	XROTC		;NO
	CAIGE	11,02
	JRST	XDFAD		;0-17 MAKE DFAD
	CAIGE	11,04
	JRST	XDFSB		;20-37 MAKE DFSB
	CAIGE	11,06
	JRST	XDFMP		;40-57 MAKE DFMP
	CAIGE	11,10
	JRST	XDFDV		;60-77 MAKE DFDV
	JRST	XROTC		;100-107 MAKE ROTC
NWINST:	SKIPN	NEWFLG		;MAKE NEW INST'S
	JRST	XROTC		;NO
	JSR	ARANGE
	CAIG	13,113
	JRST	MASKX		;DOUBLE FP
	CAIGE	13,120
	JRST	XDFDV		;MAKE NEW INST (DFDV)
	CAIG	13,122
	JRST	MASKX		;DOUBLE MOVES
	CAIN	13,123
	JRST	XDFDV		;MAKE NEW INST (DFDV)
	JRST	MASKX		;DBL MOVES MEM, FIX, FLT

SLO:	MOVE	10,INSBLK	;GO STORE INSTRUCTIONS
	MOVEM	10,CORIN1	;IN CORE LOOP
	MOVE	10,INSBLK+1
	MOVEM	10,CORIN2
	MOVE	10,INSBLK+2
	MOVEM	10,CORIN3
	MOVE	10,INSBLK+3
	MOVEM	10,CORIN4
	MOVE	10,INSBLK+4
	MOVEM	10,CORIN5
	MOVE	10,INSBLK+5
	MOVEM	10,CORIN6
	SETZM	SVINPC#		;CLEAR SVINPC FOR ERROR
SLO1:	MOVEM	0,SAC0
	TTALTM			;ALTMODE CHECK
	SKIPA			;NONE
	JRST	DDTEX+1		;YES, GO TO DDT
	MOVE	0,SAC0
	SETZM	COREXF		;CLEAR FLAG FOR SIMULATION
	MOVSI	10,RAND
	BLT	10,7		;SETUP AC OPERANDS
	MOVE	10,[RAND,,ACS]
	BLT	10,ACS+7	;SETUP SIMULATOR OPERANDS
	SETZB	10,ACS+10	;AC10 IS 0 IN BOTH
	JRSTF	@.+1		;CLEAR FLAGS
		.+1
	SKIPN	MGNFLG		;MARGIN ALL ?
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,MARGIN	;NO, SET MARGINS FOR SLOW LOOP
CORLOP:	SETZM	NOSKPF		;CLEAR NO SKIP FLAG
CORIN1:	0			;1ST INSTRUCTION
	SETOM	NOSKPF		;NO SKIP
	JSR	COREX		;GO TO SIMULATION
CORIN2:	0			;2ND INST
	SETOM	NOSKPF
	JSR	COREX
CORIN3:	0			;3RD INST
	SETOM	NOSKPF
	JSR	COREX
CORIN4:	0			;4TH INST
	SETOM	NOSKPF
	JSR	COREX
CORIN5:	0			;5TH INST
	SETOM	NOSKPF
	JSR	COREX
CORIN6:	0			;6TH INST
	SETOM	NOSKPF
	JSR	COREX
	JRST	.+3
COREXF:	0			;SIMULATION FLAG
NOSKPF:	0			;NO SKIP FLAG
	SKIPN	MGNFLG		;MARGIN ALL ?
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,[IMGNOF,,ISPDOF] ;NO, CLEAR MARGINS
	SKIPGE	K2		;PREVIOUS FAILURE, BUT NONE THIS TIME ?
	JRST	CORER1		;YES
	MOVEI	10,ANSBLK
	BLT	10,ANSBLK+7	;SAVE ANSWERS
	MOVE	10,FLCNT
	MOVEM	10,K2		;SETUP FAST LOOP COUNT
	SETZM	COREXF		;CLEAR SIMULATION FLAG

FAST:	MOVEM	0,SAC0
	TTALTM			;ALTMODE CHECK
	SKIPA			;NONE
	JRST	DDTEX+1		;YES, GO TO DDT
	MOVE	SAC0
	MOVE	10,[INSBLK,,11]
	BLT	10,17		;LOAD FAST LOOP INSTRUCTIONS
	MOVSI	10,RAND
	BLT	10,7		;LOAD OPERANDS
	SETZM	10
;*EXECUTE FAST LOOP

EXFAST:	MOVE	17,[JRST CHEC]	;SETUP EXIT INST
	JRSTF	@.+1		;CLEAR FLAGS
		.+1
	SKIPN	MGNFLG		;MARGIN ALL ?
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,MARGIN	;NO, SET MARGINS FOR FAST LOOP
	JRST	11		;GO TO FAST LOOP

CHEC:	MOVEM	0,ANSSV0#
	MOVE	P,PLIST
	MOVEI	$PSHER
	PUT	0
	MOVE	0,ANSSV0
	SKIPN	MGNFLG		;MARGIN ALL ?
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,[IMGNOF,,ISPDOF] ;NO, CLEAR MARGINS
	CAME	0,ANSBLK	;CHECK FAST LOOP AND SLOW LOOP ANS
	JSR	ERRX
	CAME	1,ANSBLK+1
	JSR	ERRX
	CAME	2,ANSBLK+2
	JSR	ERRX
	CAME	3,ANSBLK+3
	JSR	ERRX
	CAME	4,ANSBLK+4
	JSR	ERRX
	CAME	5,ANSBLK+5
	JSR	ERRX
	CAME	6,ANSBLK+6
	JSR	ERRX
	CAME	7,ANSBLK+7
	JSR	ERRX
CHEC1:	SKIPGE	K2		;FAILURE ?
	JRST	FSTER1		;YES
	SOSE	K2		;REPEAT FAST LOOP ?
	JRST	FAST		;YES

CHEC2:	MOVE	K1
	MOVEM	RANDBS		;UPDATE RANDOM BASE
	SWITCH
	TLNE	RSTART!TOTALS
	JSR	PNTTOT		;GO PRINT TOTALS
	AOS	16,PASCNT
	TLNE	RELIAB
	JRST	.+4
	TRNE	16,3
	JRST	CONTNU
	JRST	BEGEND
	TRNE	16,37
	JRST	CONTNU
	JRST	BEGEND

FSTER1:	SWITCH
	TLNN	LOOPER		;STAY IN ERROR LOOP
	JRST	CHEC2		;NO
	JRST	FAST		;YES, REPEAT FAILING LOOP
COREX:	0
	MOVEM	10,SAC10#
	MOVE	10,COREX	;GET CALL PC
	SUBI	10,3		;-3, POINTS TO INST
	MOVEM	10,INPC		;SAVE AS SIM PC
	ADDI	10,3
	SKIPN	NOSKPF		;DID INST SKIP ?
	ADDI	10,3		;YES, SET RETURN TO SKIP NEXT INST
	MOVEM	10,COREX
	SETZM	NOSKPF
	MOVE	10,SAC10
	SKIPN	SIMFLG		;SIMULATE INSTRUCTION ?
	JRST	@COREX		;NO

COREX1:	SKIPN	MGNFLG		;MARGIN ALL ?
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,[IMGNOF,,ISPDOF] ;NO, CLEAR MARGINS
	SETOM	COREXF
	MOVE	10,[ACS,,SIMBLK]
	BLT	10,SIMBLK+10	;SAVE ORIG SIM AC'S FOR ERROR
	SETOM	MASK
	JSR	SIMNST		;SIMULATE INSTRUCTION
	CAME	0,ACS+0		;COMPARE AC RESULTS & SIM RESULTS
	JSR	ERRX		;ERROR
	CAME	1,ACS+1
	JSR	ERRX
	CAME	2,ACS+2
	JSR	ERRX
	CAME	3,ACS+3
	JSR	ERRX
	CAME	4,ACS+4
	JSR	ERRX
	CAME	5,ACS+5
	JSR	ERRX
	CAME	6,ACS+6
	JSR	ERRX
	CAME	7,ACS+7
	JSR	ERRX
	MOVE	10,SAC10
	SKIPN	MGNFLG		;MARGIN ALL ?
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,MARGIN	;NO, RESET MARGINS
	JRST	@COREX		;EXIT

CORER1:	SWITCH
	TLNN	LOOPER		;LOOP ON ERROR ?
	JRST	CHEC2		;NO
	JRST	SLO1		;YES, STAY IN SLOW LOOP
;*ERROR ROUTINES

ERRX:	0
	SKIPE	USER
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,[IMGNOF,,ISPDOF] ;CLEAR MARGINS
	MOVEM	0,SAV0#
	SWITCH
	MOVEM	0,10
	MOVE	0,SAV0
	SKIPE	PRNT		;FIRST OUTPUT
	TLNE	10,PALERS	;PRINT ALL ERRORS ?
	JSR	OUT		;GO OUTPUT

ERRX1:	AOS	ERRCNT
	AOS	ERRTLS
	SWITCH
	TLNE	ERSTOP		;HALT ON ERROR ?
	JSR	GOING		;YES
	TLNE	0,LOOPER	;LOOP ON ERROR ?
	SETOM	K2		;YES, MAKES LOOP EFF FOREVER
	SKIPN	USER
	DATAO	PI,ERRCNT	;DISPLAY
	TLNN	DING		;RING TTY BELL ?
	JRST	.+3		;NO
	MOVEI	BELL		;YES
	PNTAF
	SKIPE	USER		;USER MODE ?
	JRST	ERRX2		;YES
	SKIPE	MGNFLG		;EXEC - MARGIN ALL ?
	JRST	.+3
	SKIPE	MARGIN
	DATAO	APR,MARGIN	;YES
ERRX2:	SKIPE	COREXF		;IN SIMULATION ?
	JRST	CORER1		;YES
	JRST	FSTER1		;NO
;*ERROR STOP

GOING:	0
	CONI	APR,$SVAPR
	CONI	PI,$SVPI
	CONO	PI,PIOFF
	HALT	@GOING

;*PRINT INSTRUCTION FAILURE

OUT:	0
	SETZM	EXIT1#		;CLEAR EXIT FLAG
	MOVEI	10,FSTANS	;SAVE FAST LOOP ANSWERS
	BLT	10,FSTANS+7
	MOVEI	0,7		;INIT INST CNT,
	MOVEM	0,INTCNT#
	MOVEM	0,ACCNT#	;AND AC CNT
	PNTNM
	MOVEI	[ASCIZ/
**********/]
	PNTAL
	SKIPE	USER
	JRST	OUTX
	MOVE	0,CONSW
	TRNE	INHCLK
	JRST	OUTX
	MOVE	0,TICKS
	CAIL	^D<60*60*10>	;BEEN RUNNING TEN MINUTES ?
	JSR	RUNTIM		;YES, PRINT RUN TIME
OUTX:	PNTMGN			;PRINT MARGINS
	MOVEI	0,[ASCIZ/
RANDOM INSTRUCTION FAILURE
    INST GROUP        OPERANDS           /]
	PNTAL
	MOVEI	[ASCIZ/SLOW ANS          SIM ANS/]
	SKIPN	COREXF
	MOVEI	[ASCIZ/FAST ANS          SLOW ANS/]
	PNTAL			;PRINT HEADER
	SETZM	PNTSPC
OUT1:	MOVE	10,INTCNT
	SOJE	10,LOOP		;MONITOR CNT
	MOVEM	10,INTCNT
	SETCA	10,0
	ANDI	10,7
	MOVEI	CRLF
	PNTA
	SETZM	PNTSPC
	MOVEI	0,1		;PRINT FIRST DIGIT
	PNT1			;OF INST GROUP AND,
	MOVE	0,10
	PNT1			;2ND DIGIT
	JSR	SLSHSP		;PRINT / SPACE 
	MOVE	0,INSBLK-1(10)
	PNTHW			;PRINT INST

OUT2:	JSR	ACPNT1		;PRINT AC
	MOVE	0,RAND(10)
	PNTHW			;PRINT OPERANDS
	JSR	ACPNT1		;PRINT AC
	MOVE	0,FSTANS(10)	;PRINT FAST ANS/SIM - SLOW ANS
	PNTHW			;PRINT AC
	JSR	ACPNT1		;PRINT AC NUMBER
	MOVE	0,ACS(10)
	SKIPN	COREXF
	MOVE	0,ANSBLK(10)
	PNTHW			;PRINT SLOW ANS/SIM - SIM ANS
	SOSLE	ACCNT
	JRST	OUT1

OUT3:	SKIPE	EXIT1
	JRST	OUT4
	MOVEI	0,[ASCIZ /
                  / ]		;PRINT MARGIN
	PNTAL
	SETOM	EXIT1
	JRST	OUT2
OUT4:	SETOM	PRNT
	MOVEI	CRLF
	PNTA
	MOVEI	[ASCIZ/
BASE RANDOM NUMBER = /]
	PNTAL
	MOVE	0,RANDBS
	PNTHW			;PRINT RANDOM BASE
	MOVEI	CRLF
	PNTA
OUT5:	SKIPN	SIMFLG		;SIMULATION INHIBITED ?
	JRST	@OUT		;YES
	SKIPN	COREXF		;SLOW LOOP FAILURE ?
	JRST	SIMFST		;NO
	MOVEI	[ASCIZ/

INSTRUCTION SIMULATION - CORE LOOP INST # /]
	PNTAL
	HRRZ	INPC		;COMPUTE INST NUMBER
	SUBI	CORIN1
	IDIVI	3
	ADDI	1
	PNT1			;PRINT
	MOVEI	[ASCIZ/
----------
/]
	PNTAL
	MOVS	10,[ACS,,SIMBLK]
	BLT	10,ACS+10	;RESTORE SIM OPERANDS
	JRST	SIMMT		;SIM & PRINT INSTRUCTION
SLSHSP:	0			;PRINT / SPACE  
	MOVEI	0,[ASCIZ X/ X]
	PNTAL
	JRST	@SLSHSP

ACPNT1:	0			;PRINT SPACE
	MOVEI	0,SPACE
	PNTA
	MOVE	10,ACCNT	;GET AC NUMBER
	SETCA	10,0
	ANDI	10,7
	MOVE	0,10
	SETZM	PNTSPC
	PNT1			;PRINT IT
	JSR	SLSHSP
	JRST	@ACPNT1

LOOP:	MOVEI	CRLF
	PNTA
	MOVEI	0,17		;PRINT 17
	SETZM	PNTSPC
	PNT2
	JSR	SLSHSP
	MOVEI	0,[ASCIZ/   EXIT       /]		;PRINT EXIT
	PNTAL
	JRST	OUT2

;*SETUP MARGINS FOR ALL OR JUST FAST & SLOW LOOP

MGNCLR:	0
	SETZM	MGNFLG#		;CLEAR CONTROL FLAG
	SKIPE	USER		;USER MODE ?
	JRST	@MGNCLR		;YES
	MOVE	0,CONSW		;GET SWITCHES
	TRNN	MGNTST		;MARGIN SLOW & FAST ONLY ?
	JRST	@MGNCLR		;NO, MARGIN ALL
	SETOM	MGNFLG		;YES, SET CONTROL FLAG
	SKIPE	MARGIN
	DATAO	APR,[IMGNOF,,ISPDOF] ;CLEAR MARGINS
	JRST	@MGNCLR
RUNTIM:	0
	CONO	APR,CLKDIS!IAPRE1	;DISABLE CLOCK
	JSR	TSTIMA		;PRINT RUN TIME
	CONO	APR,CLKENB!CLKCLR!IAPRE1!IAPRC1	;ENABLE CLOCK
	JRST	@RUNTIM

;*CLOCK SERVICE ROUTINE

ITRCLK:	0
	CONSO	APR,CLK
	JRSTF	@ITRCLK		;NOT CLOCK
	AOS	TICKS		;INC CLOCK COUNTER
	MOVEM	0,CLKAC0#	;SAVE AC'S
	MOVEM	1,CLKAC1#
	JSR	TSTIME		;CHECK AND PRINT TIME
	MOVE	1,K1		;GET RANDOM NUMBER
	ANDI	1,7
	SKIPN	1		;IF 0, MAKE 1
	AOS	1		;SETUP CLOCK ON RANDOM CHANNEL
	CONO	APR,CLKENB!CLKCLR!IAPRE1(1)
	MOVE	0,CLKAC0
	MOVE	1,CLKAC1
	JEN	@ITRCH1		;RETURN

PNTTOT:	0
	SKIPE	USER		;NO TIME IF USER
	JRST	.+4
	TRNE	INHCLK		;NO TIME IF CLOCK INHIBITED
	JRST	.+2
	JSR	RUNTIM		;PRINT RUN TIME
	MOVEI	[ASCIZ/
TOTAL ERRORS = /]
	PNTAL
	MOVE	ERRTLS
	PNTDEC			;PRINT TOTAL ERRORS
	MOVEI	[ASCIZ/
BASE RANDOM NUMBER = /]
	PNTAL
	MOVE	0,RANDBS
	PNTHW			;PRINT RANDOM BASE
	MOVEI	CRLF2
	PNTA
	SWITCH
	TLNN	RSTART		;RESTART PROGRAM ?
	JRST	@PNTTOT		;NO, CONTINUE
	JRST	SFSTRT		;YES, RESTART AS STAND-ALONE
;*TEST RUN TIME SUBROUTINE
;*PRINTS TIME AT HALF HOUR INTERVALS OR WHEN REQUESTED

TSTIME:	0
	MOVE	TICKS		;HAS HALF HOUR PASSED ?
	SUB	TSTIMR
	MOVE	1,HERTZ
	CAIE	1,^D60		;60 HZ. ?
	JRST	TSTIMB		;NO, 50
	CAIGE	^D<60*60*30>
	JRST	@TSTIME		;NOT HALF HOUR YET
TSTIMC:	SETOM	TIMFRC
	JSR	TSTIMA
	JRST	@TSTIME

TSTIMA:	0
	SKIPE	PNTFLG		;INTERRUPTED OUT OF PRINT ROUTINE
	JRST	@TSTIMA		;YES, DO NEXT CLOCK
	MOVEI	[ASCIZ/
RUN TIME = /]
	PNTALF
	MOVE	TICKS		;GET TIME
	SKIPE	TIMFRC#		;REQUESTED TIME, IF SO DON'T
	MOVEM	TSTIMR		;UPDATE HALF HOUR COMPARE
	IDIV	HERTZ		;CONVERT TO SECONDS
	IDIVI	^D<60*60>	;CONVERT TO HOURS
	MOVEM	1,TIMAC1#	;SAVE MIN:SEC
	PNTDCF			;PRINT HOURS
	MOVEI	[ASCIZ/:/]
	PNTAF
	MOVE	0,TIMAC1	;RETURN MIN:SEC
	IDIVI	^D60		;CONVERT TO MINUTES
	MOVEM	1,TIMAC1	;SAVE :SEC
	PNTDCF			;PRINT MINUTES
	MOVEI	[ASCIZ/:/]
	PNTAF
	MOVE	0,TIMAC1	;RETURN :SEC
	PNTDCF			;PRINT SECONDS
	MOVEI	CRLF
	PNTAF
	SETZM	TIMFRC
	JRST	@TSTIMA

TSTIMB:	CAIGE	^D<60*60*25>	;50 HZ HALF HOUR
	JRST	@TSTIME		;NO
	JRST	TSTIMC
;*SIMULATE INSTRUCTION

SIMNST:	0
	MOVEM	0,SAVAC
	MOVE	[1,,SAVAC+1]
	BLT	SAVAC+17	;SAVE AC'S
	SETZM	INSTR
	SETZM	CNTLPC
	SETOM	SNGLIN		;SET SINGLE INSTRUCTION CONTROL
	SETZM	SNGL2		;SET FOR FIRST INST
	MOVE	P,PLIST
	MOVEI	$PSHER
	PUSH	P,0
	GO	SENTRY		;GO TO SIMULATOR

	MOVS	[1,,SAVAC+1]
	BLT	17		;RESTORE AC'S
	MOVE	0,SAVAC
	JRST	@SIMNST

;*SIMULATE INSTRUCTION, PRINT

SIMMT:	SETZM	MASK		;ALLOW PRINTOUT
	JSR	SIMNST		;GO SIMULATE
	MOVEI	CRLF
	PNTA
	JRST	@OUT

RAND:	BLOCK	10
INSBLK:	BLOCK	10
ANSBLK:	BLOCK	10
FSTANS:	BLOCK	10
SAVAC:	BLOCK	20
SIMBLK:	BLOCK	^D10
VMEM:	ENDSLD
;*SIMULATE AND PRINT ALL INSTRUCTIONS
;*FAST LOOP RELIABILITY/SPEED FAILURE

SIMFST:	MOVEI	[ASCIZ/

INSTRUCTION SIMULATION - FAST LOOP FAILURE
----------
/]
	PNTAL
	SETZM	MASK
	MOVE	[1,,SAVAC+1]
	BLT	SAVAC+17	;SAVE AC'S
	MOVE	[INSBLK,,ACS+11]
	BLT	ACS+17		;SETUP INSTRUCTIONS
	MOVE	[RAND,,ACS]
	BLT	ACS+7
	SETZM	ACS+10		;SETUP OPEARANDS
	MOVEI	11
SIMFS1:	MOVEM	INPC		;SET INPC TO FIRST INSTRUCTION
	SETZM	INSTR
	SETZM	CNTLPC
	SETOM	SNGLIN		;SET SINGLE INSTRUCTION CONTROL
	SETZM	SNGL2		;SET FOR FIRST INST
	MOVE	P,PLIST
	MOVEI	$PSHER
	PUSH	P,0
	GO	SENTRY		;GO TO SIMULATOR

	HRRZ	PC
	CAIE	17		;COMPLETED SIM ?
	JRST	SIMFS1		;NO
	MOVS	[1,,SAVAC+1]
	BLT	17		;RESTORE AC'S
	MOVEI	CRLF
	PNTA
	JRST	@OUT