pcjs/apps/pdp11/diags/cpu/XCPA.mac
2016-10-22 21:57:45 -07:00

527 lines
13 KiB
Text

.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