	.title AC-E664G-MC_CXCPAG0-Processor-test_Sep78
;
; original code OCRed from
; http://www.bitsavers.org/pdf/dec/pdp11/xxdp/listings/AC-E664G-MC_CXCPAG0-Processor-test_Sep78.pdf
;
; Changed to run standalone without monitor
; JH

	.LIST	BIN
	.ENABLE AMA		; relocatable addresses as absolute

;**********************************************************************
	.asect

	SPSIZ=040		; stack size

; is called on every error
	.MACRO	HRDER$
	HALT			; just halt on error
	HALT			; force3 word size, like in original
	HALT
	.ENDM

;MODNAM: .ASCII  /CPAG / ;MODULE NAME
;**********************************************************************
INIT:	START			;MODULE START ADDRE.
SPOINT: MODSP			;MODULE STACK POINTER.
PASCNT: 0			;PASS COUNTER.


      .=220			; generate same addresses as in original



START:
	 MOV	SPOINT,SP	; load stack pointer


;**********************************************************************
;CHECK BRANCH INSTRUCTIONS
RESTRT: CCC
	BCS	CC0
	BVS	CC0
	BEQ	CC0
	BMI	CC0
	BLT	CC0
	BLE	CC0
	BLOS	CC0
	BHI	CON1
CC0:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

;CONTINUE
CON1:	SEV			;CC'S=1010
	SEN
	BVC	CC2
	BLT	CC2
	BLE	CC2
	BGE	CON3
CC2:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************
;CONTINUE
CON3:	SEZ			;CC'S=1111
	SEC
	BNE	CC4
	BGT	CC4
	BHI	CC4
	BLE	YT15:
CC4:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************




;CHECK UNARY WORD OPS USING ADDRESS MODES 3 AND 5
YT15:	BR  1$
	.WORD	0
	.WORD	0
1$:	MOV	PC,R3
	SUB	#4,R3
	CLR	(R3)
	MOV	R3,R0
	TST	-(R3)
	MOV	R0,(R3)
	MOV	R3,R4
	CCC
	TST	@(R3)+		;(R0)=000000,CC=0100
	BEQ	2$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

2$:	SEC
	ROR	@-(R3)		;(R0)=100000,CC=0101
	BCS	ROR5
	BVC	ROR5
	BMI	RD
ROR5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD:	CCC
	ASR	@(R4)+		;(R0)=140000,CC=1010
	BVC	ASR3
	BMI	RD1
ASR3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD1:	CLN
	ASL	@(R3)+		;(R0)=100000,CC=1001
	BCC	ASL3
	BVS	ASL3
	BMI	RD2
ASL3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD2:	SCC
	DEC	@-(R4)		;(R0)=077777,CC=0010
	BCC	DEC5
	BVC	DEC5
	BEQ	DEC5
	BPL	RD3
DEC5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD3:	NEG	@-(R3)		;(R0)=100001, C=1001
	BCC	NEG5
	BVS	NEG5
	BMI	RD4
NEG5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD4:	SEV
	COM	@(R4)+		;(R0)=077776, C=0001
	BCC	COM3
	BVC	RD5
COM3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD5:	INC	@(R3)+		;(R0)=077777, C=0001
	BCC	INC3
	BPL	RD6
INC3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD6:	ADC	@-(R4)		;(R0)=100000, C=1010
	BCS	ADC5
	BVC	ADC5
	BMI	RD7
ADC5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD7:	CCC
	ROL	@(R4)+		;(R0)=000000, C=0111
	BCC	ROL3
	BVC	ROL3
	BEQ	RD8
ROL3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

RD8:	INC	@-(R3)		;(R0)=000001, C=0001
	SBC	@-(R4)		;(R0)=000000, C=0100
	BCS	SBC5
	BEQ	RD9
SBC5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

;CHECK UNARY BYTE OPS USING ADDRESS MODES 3 AND 4
RD9:	BR   1$ 		; RESERVE 3 WORDS
	.WORD	0		;1 FOR EVEN BYTE ADDRESS
	.WORD	0		;1 FOR ODD BYTE ADDRESS
	.WORD	0		;AND 1 FOR DATA
1$:	MOV	PC,R2
	TST	-(R2)		;BACK R2 UP TO
	TST	-(R2)		;DATA WORD
	MOV	R2,R0		;R0 POINTS TO THE DATA WORD
	CLR	(R0)		;PRESET DATA
	TST	-(R2)		;BACK R2 UP TO
	TST	-(R2)		;EVEN BYTE ADDRESS WORD
	MOV	R0,(R2)+	;LOAD ADDRESS
	INC	R0		;ODD BYTE ADDRESS
	MOV	R0,(R2)+	;LOAD ODD BYTE ADDRESS
	MOV	R2,R0		;RESET R0
	MOV	R2,R5

	COMB	@-(R2)		;(R0)=177400, CC=1001
	BCC	COMB5
	BMI	TE
COMB5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE:	TSTB	@-(R2)		;(R0)=177400, CC=0100
	BEQ	1$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

1$:	SEV
	ASRB	@-(R5)		;(R0)=177400, CC=1001
	BCC	ASRB5
	BVS	ASRB5
	BMI	TE1
ASRB5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE1:	INCB	@(R2)+		;(R0)=177401, CC=000
	BCC	INCB3
	BPL	TE2
INCB3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE2:	CLC
	RORB	@-(R5)		;(R0)=177400, CC=0111
	BCC	RORB5
	BVC	RORB5
	BNE	RORB5
	BPL	TE3
RORB5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE3:	ASLB	@(R2)+		;(R0)=177000, CC=1001
	BCC	ASLB3
	BVS	ASLB3
	BMI	TE4
ASLB3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE4:	ADCB	@-(R2)		;(R0)=177400, CC=1000
	BCS	ADCB5
	BMI	TE5:
ADCB5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE5:	SCC
	ROLB	@(R5)+		;(R0)=177401, CC=0000
	BLOS	ROLB3		;BRANCH IF C OR Z IS SET
	BVS	ROLB3
	BPL	TE6
ROLB3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE6:	SWAB	@-(R2)		;(R0)=000777, C=1000
	BMI	1$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

1$:	SEC
	SBCB	@(R5)+		;(R0)=000377, CC=0100
	BCS	SBCB3
	BEQ	TE7
SBCB3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

TE7:	NEGB	@(R2)+		;(R0)=000001
	DECB	@-(R2)		;(R0)=000000, CC=0101
	BCC	DECB5
	BEQ	B1
DECB5:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

;CHECK BINARY WORD OPS USING ADDRESS MODES 3 & b5.
B1:	BR	1$		; RESERVE SPACE FOR DATA AND ADDRESSES
	.WORD	0		;CONTAINS ADDRESS OF SOURCE DATA
	.WORD	0		;CONTAINS ADDRESS OF DEST DATA
	.WORD	0		;CONTAINS SOURCE DATA
	.WORD	0		;CONTAINS  DEST DATA
1$:	MOV	PC,R1
	MOV	R1,R0		;SET SCOPE PTR
	CMP	-(R0),-(R0)	;ADJUST R0
	MOV	R0,R5		;R5 POINTS TO DEST DATA
	CMP	-(R5),-(R5)	;SUB 4	FROM R5
	MOV	R0,(R5) 	;R5 POINTS TO ADDRESS OF DEST DATA
	MOV	R5,R2
	MOV	R0,R4		;R4 POINTS TO DEST DATA
	TST	-(R0)
	MOV	R0,R3		;R3 POINTS TO SOURCE DATA
	MOV	R0,-(R2)	;R2 POINTS TO ADDRESS OF SOURCE DATA
	CLR	(R3)		;PRESET SOURCE DATA
	CLR	(R4)		;PRESET DEST DATA

	SCC
	CLZ
	SUB	@(R2)+,@(R5)+	;(R3)=000000,(R4)=000000, CC=0100
	BCS	SUB3
	BVS	SUB3
	BEQ H3
SUB3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

H3:	BIS	#100000,@-(R2)	;(R3)=100000
	ADD	#1,@-(R5)	;(R4)=000001
	SUB	@(R2)+,@(R5)+	;(R3)=100000,(R4)=10001, CC=1011
	BCC	SUB3A
	BVC	SUB3A
	BMI	H4
SUB3A:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

H4:	NEG	(R4)		;(R4)=077777
	BIT	@-(R2),@-(R5)	;(R3)=100000,(R4)=077777
	BEQ	1$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

1$:	CMP	@(R2)+,@(R5)+
	BVS	2$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

2$:	COM	@-(R2)
	CCC
	ADD	@(R2)+,@-(R5)
	BVC	ADD3
	BMI	H41
ADD3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

H41:	SEC
	BIC	@-(R2),@(R5)+	;(R3)=077777,(R4)=100000
	BCC	BIC3
	BMI	H5
BIC3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

H5:	COM	@-(R5)		;(R4)=077777
	CMP	@(R2)+,@(R5)+	;(R3)=077777,(R4)=077777
	BEQ	H6
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

	;CHECK BINARY BYTE OPS USING ADDRESS MODES 3 & 5
H6:	BR	1$		;RESERVE SPACE FOR ADDRESSES & DATA
	.WORD	0		;CONTAINS ADDRESS OF SOURCE DATA (EVEN BYTE)
	.WORD	0		;CONTAINS ADDRESS OF SOURCE DATA (ODD BYTE)
	.WORD	0		;CONTAINS ADDRESS OF DEST DATA (EVEN BYTE)
	.WORD	0		;CONTAINS ADDRESS OF DEST DATA (ODD BYTE)
	.WORD	0		;CONTAINS SOURCE DATA
	.WORD	0		;CONTAINS DEST DATA
1$:	MOV	PC,R0
	CMP	-(R0),-(R0)	;R0=ADDRESS OF DEST DATA
	MOV	R0,R3		;R3    "       "
	MOV	R3,R5		;R3    "       "
	TST	-(R3)		; SUB2 FROm R3
	MOV	R0,-(R3)	;R3 POINTS TO ADDRESS OF DEST DATA
	INC	(R3)		;ODD BYTE
	MOV	R0,-(R3)	;EVEN BYTE
	MOV	R3,R4
	TST	-(R0)		;R0=ADDRESS OF SOURCE DATA
	MOV	R0,-(R4)	;R4 POINTS TO ADDRESS OF SOURCE DATA
	INC	(R4)		;ODD BYTE
	MOV	R0,-(R4)	;EVEN BYTE

	SEC			;SET CARRY
	MOV	#177001,@(R4)+
	MOVB	#200,@(R4)+	;SOURCE DATA=100001
	MOVB	@-(R4),@(R3)+	;
	MOVB	@-(R4),@(R3)+	;DEST DATA=000600
	BCS	2$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

2$:	CMP	#600,(R5)	;CHECK DEST DATA
	BEQ	3$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

3$:	CMP	-(R3),-(R3)	;POINT R4 BACK TO EVEN BYTE
	BISB	@(R4)+,@(R3)+
	BISB	@(R4)+,@(R3)+	;DEST DATA=100601
	CMP	#100601,(R5)	;CHECK RESULT
	BEQ	4$
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

4$:	BICB	@-(R4),@-(R3)
	BICB	@-(R4),@-(R3)
	BITB	@(R4)+,@(R3)+
	BNE	BITB3
	BITB	@-(R4),@(R3)+
	BNE	H7
BITB3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

H7:	CMPB	@(R4)+,@-(R3)
	BNE	CMPB3
	CMPB	@(R4)+,@-(R3)
	BEQ	JP1
CMPB3:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

	;CHECK JUMP  INSTRUCTIONS
JP1:	MOV	PC,R0
	ADD	#12,R0		;SET ADDRESS FOR JUMP INST
	SCC
	JMP	(R0)
2$:	BR	3$
	CLN			;JMP INST JUMPS HERE
	BR	2$

3$:	BCC	JMP1
	BVC	JMP1
	BNE	JMP1
	BPL	K2
JMP1:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

K2:	CLR	R2		;SET INDICATOR
	MOV	PC,R4		;SET UP JUMP REGISTER
	MOV	R4,R0		;SET UP CHECK REGISTER
	BR	1$
	COM	R2		;COMPLEMENT INDICATOR
	BR	2$
1$:	CMP	(R4)+,(R4)+
	TST	(R4)+		;R4=JMP ADDRESS
	JMP	-(R4)		;USE R4 AS ADDRESS
2$:	INC	R2		;CHECK INDICATOR
	BNE	JMP4
	CMP	(R0)+,(R0)+
	CMP	R0,R4		;CHECK AUTO-DEC R4
	BEQ	JSRTST
JMP4:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

	;CHECK JSR INSTRUCTIONS
JSRTST: MOV	#3$,R2		;FORM DEST ADRS
	SCC			;PRESET CC'S
	CLV
	JSR	R5,(R2) 	;GO TO 3$ VIA R2
1$:	TST	R2		;CHECK INDICATOR
	BNE	JSR1		;R2 SHOULD=0
	BR	EX
2$:	RTS	R5		;RETURN FROM SUB ROUTINE
3$:	BCC	JSR1		;CHECK THAT JSR DID NOT
	BVS	JSR1
	BNE	JSR1		;AFFECT CC'S
	BPL	JSR1
	CLR	R2		;CLEAR INDICATOR
	MOV	#1$,R4		;GET RETURN ADDRESS
	BR	2$
JSR1:
	;**************************************************************
	HRDER$,BEGIN,NULL	;
	;**************************************************************

EX:
;	 ENDIT$,BEGIN		 ;SIGNAL END OF ITERATION
				;MONITOR SHALL TEst END OF PASS
	HALT
ST:	JMP	RESTRT


; stack area has to be beyond 000400
	.REPT	SPSIZ		;MODULE STACK STARTS HERE
	.NLIST
	.WORD 0
	.LIST
	.ENDR
MODSP:				; module stack base


	.END
