571 lines
16 KiB
Text
571 lines
16 KiB
Text
;MAINDEC-10-DFKCA
|
|
|
|
DECVER=002
|
|
MCNVER=000
|
|
|
|
XLIST
|
|
DEFINE NAME (MCNVER,DECVER),<
|
|
|
|
TITLE DFKCA KL10 ADVANCED INSTRUCTION DIAGNOSTIC #1, VERSION MCNVER,DECVER >
|
|
LIST
|
|
LALL
|
|
|
|
NAME \MCNVER,\DECVER
|
|
|
|
XALL
|
|
|
|
;COPYRIGHT 1975
|
|
;DIGITAL EQUIPMENT CORPORATION
|
|
;MARLBORO, MASS. 01752
|
|
|
|
;JOHN R. KIRCHOFF
|
|
|
|
LOC 137
|
|
MCNVER,,DECVER
|
|
NOSYM
|
|
SUBTTL DIAGNOSTIC PARAMETERS
|
|
|
|
;OPERATOR DEFINITIONS
|
|
|
|
OPDEF ER1 [1B8]
|
|
OPDEF ER2 [2B8]
|
|
OPDEF ER3 [3B8]
|
|
OPDEF ER4 [4B8]
|
|
OPDEF ER5 [5B8]
|
|
OPDEF ER6 [6B8]
|
|
OPDEF ER7 [7B8]
|
|
OPDEF ER10 [10B8]
|
|
OPDEF ER11 [11B8]
|
|
OPDEF ER12 [12B8]
|
|
OPDEF ER13 [13B8]
|
|
|
|
LUUO1==ERRMES
|
|
LUUO2==ERRMES
|
|
LUUO3==ERRMES
|
|
LUUO4==ERRMES
|
|
LUUO5==ERRMES
|
|
LUUO6==ERRMES
|
|
LUUO7==ERRMES
|
|
LUUO10==ERRMES
|
|
LUUO11==ERRMES
|
|
LUUO12==ERRMES
|
|
LUUO13==ERRMES
|
|
|
|
;SUBROUTINE ASSEMBLY DEFINITIONS
|
|
|
|
DEBUG=100
|
|
EXCASB=1
|
|
USRASB=1
|
|
KI10=1
|
|
KL10=1
|
|
KL10P0=1
|
|
PGMEND=1
|
|
ERDIAG=1
|
|
KLOLD=1
|
|
MODDVU=BEGIN
|
|
MODDVL=BEGIN
|
|
;MACROS
|
|
|
|
DEFINE SAVEAC (A,B)<
|
|
MOVEI AC+2,.
|
|
MOVEM AC+2,TESTPC ;SETUP SUBTEST PC
|
|
MOVEI AC+2,<AC+2>&17 ;INFORM ERROR ROUTINE WHICH
|
|
MOVEM AC+2,ERRLOP# ;AC IS USED FOR ITERATION>
|
|
|
|
;BEGIN ASSEMBLY PARAMETERS
|
|
|
|
SADR1=BEGIN
|
|
SADR2=RESRT1
|
|
SADR3=RENTR1
|
|
SADR4=BEGIN
|
|
SADR5=BEGIN
|
|
SADR6=BEGIN
|
|
SADR7=HALT BEGIN
|
|
SADR8=HALT BEGIN
|
|
SADR9=HALT BEGIN
|
|
SADR10=HALT BEGIN
|
|
SADR11=HALT BEGIN
|
|
|
|
PAREA1=0
|
|
PAREA2=0
|
|
PAREA3=SIXBIT/DFKCA/
|
|
PAREA4=SIXBIT/LPT/
|
|
PAREA5=0
|
|
PAREA6=0
|
|
|
|
ITERAT=1000
|
|
DEFINE DMVE (L,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVE INSTRUCTION
|
|
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
|
|
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
|
|
;FROM MEMORY TO AC, AC+1 VIA THE DMOVE INSTRUCTION.
|
|
;C(AC) AND C(AC+1) ARE THEN COMPARED WITH THE TEST WORDS
|
|
;[XWD A,B] AND [XWD C,D], RESPECTIVELY. THE TEST PASSES IF THESE
|
|
;COMPARISONS AGREE.
|
|
|
|
Q'L'0: MOVE AC+5,[XWD A,B] ;INITIALIZE TEST WORDS
|
|
MOVE AC+6,[XWD C,D] ;FOR COMPARISON
|
|
MOVE AC,[XWD 707070,707070]
|
|
MOVE AC+1,[XWD 070707,070707] ;INITIALIZE AC,AC+1
|
|
DMOVE AC,[XWD A,B ;*MOVE DOUBLE WORD A,B ; C,D
|
|
XWD C,D] ;FROM MEMORY TO AC, AC+1
|
|
CAME AC,<AC+5>&17 ;WAS AC LOADED CORRECTLY?
|
|
ER3 AC,L'1 ;FAIL IF CONTENTS(AC) NOT = A,B
|
|
CAME AC+1,<AC+6>&17 ;WAS AC+1 LOADED CORRECTLY?
|
|
ER4 AC+1,L'2 ;FAIL IF CONTENTS(AC+1) NOT = C,D
|
|
JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH>
|
|
|
|
|
|
DEFINE DMVE17 (L,T,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVE INSTRUCTION
|
|
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
|
|
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
|
|
;FROM MEMORY TO AC, AC+1 VIA THE DMOVE INSTRUCTION.
|
|
;C(AC) AND C(AC+1) ARE THEN COMPARED WITH THE TEST
|
|
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
|
|
;THE TEST PASSES IF THESE COMPARISONS AGREE.
|
|
|
|
Q'T'0: MOVEM AC,%SV17# ;SAVE AC17
|
|
Q'L'0: MOVE AC+5,[XWD A,B] ;INITIALIZE TEST WORDS
|
|
MOVE AC+6,[XWD C,D] ;FOR COMPARISON
|
|
MOVE AC,[XWD 707070,707070]
|
|
MOVE AC+1,[XWD 070707,070707] ;INITIALIZE AC,AC+1
|
|
DMOVE AC,[XWD A,B ;*MOVE DOUBLE WORD A,B ; C,D
|
|
XWD C,D] ;FROM MEMORY TO AC, AC+1
|
|
Q'T'3: CAMN AC,<AC+5>&17 ;WAS AC LOADED CORRECTLY?
|
|
JRST .+4 ;HERE IF NO ERROR
|
|
MOVEM AC,AC-1 ;STORE INCORRECT RESLUTS
|
|
MOVE AC,%SV17 ;RESTORE P
|
|
ER3 AC-1,L'1 ;FAIL IF CONTENTS(AC) NOT = A,B
|
|
CAMN AC+1,<AC+6>&17 ;WAS AC+1 LOADED CORRECTLY?
|
|
JRST .+4 ;HERE IF NO ERROR
|
|
MOVEM AC+1,AC-1 ;STORE INCORRECT WORD
|
|
MOVE AC,%SV17 ;RESTORE P
|
|
ER4 AC-1,L'2
|
|
MOVE AC,%SV17 ;RESTORE AC UNCONDITIONALLY
|
|
JUMPL SAC,Q'T'0 ;LOOP ON ERROR SWITCH>
|
|
DEFINE DMVN (L,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVN INSTRUCTION
|
|
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
|
|
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
|
|
;[XWD A,B] AND [XWD C,D] IS MOVED FROM MEMORY TO AC, AC+1 VIA
|
|
;THE DMOVN INSTRUCTION. C(AC) AND C(AC+1) ARE THEN COMPARED
|
|
;WITH THE NEGATIVE (TWOS COMPLEMENT) OF THE TEST
|
|
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
|
|
;THE TEST PASSES IF THESE COMPARISONS AGREE.
|
|
|
|
Q'L'0: DMOVE AC,[XWD 707070,707070
|
|
XWD 070707,070707] ;INITIALIZE AC,AC+1
|
|
SETCM AC+5,[XWD A,B] ;INITIALIZE TEST WORDS FOR COMPARISON
|
|
IFIDN <C,D><0,0>,<
|
|
SETZ AC+6,
|
|
ADDI AC+5,1 >
|
|
IFIDN <C,D><400000,0>,<
|
|
SETZ AC+6,
|
|
ADDI AC+5,1 >
|
|
IFDIF <C,D><0,0>,<
|
|
IFDIF <C,D><400000,0>,<
|
|
MOVN AC+6,[XWD C,D]
|
|
TLZ AC+6,1B18 ;CLEAR SIGN BIT OF LOW ORDER WORD >>
|
|
DMOVN AC,[XWD A,B ;*MOVE NEGATIVE OF DOUBLE WORD A,B ;
|
|
XWD C,D] ;C,D FROM MEMORY TO AC, AC+1
|
|
CAME AC,<AC+5>&17 ;WAS AC LOADED CORRECTLY?
|
|
ER3 AC,L'1 ;FAIL IF CONTENTS(AC) NOT = COMPLEMENT OF A,B
|
|
CAME AC+1,<AC+6>&17 ;WAS AC+1 LOADED CORRECTLY?
|
|
ER4 AC+1,L'2 ;FAIL IF CONTENTS(AC+1) NOT = MINUS C,D
|
|
JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH>
|
|
DEFINE DMVN17 (L,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVN INSTRUCTION
|
|
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
|
|
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
|
|
;[XWD A,B] AND [XWD C,D] IS MOVED FROM MEMORY TO AC, AC+1 VIA
|
|
;THE DMOVN INSTRUCTION. C(AC) AND C(AC+1) ARE THEN COMPARED
|
|
;WITH THE NEGATIVE (TWOS COMPLEMENT) OF THE TEST
|
|
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
|
|
;THE TEST PASSES IF THESE COMPARISONS AGREE.
|
|
|
|
Q'L'0: MOVEM AC,%SV17 ;SAVE P
|
|
DMOVE AC,[XWD 707070,707070
|
|
XWD 070707,070707] ;INITIALIZE AC,AC+1
|
|
SETCM AC+5,[XWD A,B] ;INITIALIZE TEST WORDS FOR COMPARISON
|
|
IFIDN <C,D><0,0>,<
|
|
SETZ AC+6,
|
|
ADDI AC+5,1 >
|
|
IFIDN <C,D><400000,0>,<
|
|
SETZ AC+6,
|
|
ADDI AC+5,1 >
|
|
IFDIF <C,D><0,0>,<
|
|
IFDIF <C,D><400000,0>,<
|
|
MOVN AC+6,[XWD C,D]
|
|
TLZ AC+6,1B18 ;CLEAR SIGN BIT OF LOW ORDER WORD >>
|
|
DMOVN AC,[XWD A,B ;*MOVE NEGATIVE OF DOUBLE WORD A,B ;
|
|
XWD C,D] ;C,D FROM MEMORY TO AC, AC+1
|
|
CAMN AC,<AC+5>&17 ;WAS AC LOADED CORRECTLY?
|
|
JRST .+4 ;HERE IF TESTS OK
|
|
MOVEM AC,AC-1 ;SAVE BAD WORD
|
|
MOVE AC,%SV17 ;RESTORE P
|
|
ER3 AC-1,L'1 ;FAIL IF CONTENTS(AC) NOT = COMPLEMENT OF A,B
|
|
CAMN AC+1,<AC+6>&17 ;WAS AC+1 LOADED CORRECTLY?
|
|
JRST .+4 ;HERE IF TESTS OK
|
|
MOVEM AC,AC-1
|
|
MOVE AC,%SV17 ;RESTORE P
|
|
ER4 AC+1,L'2 ;FAIL IF CONTENTS(AC+1) NOT = MINUS C,D
|
|
MOVE AC,%SV17 ;RESTORE P UNCODITIONALLY
|
|
JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH>
|
|
DEFINE DMVNF (L,A,B,C,D,KIEF,KIUF,KLEF,KLUF) <
|
|
;**KI10**
|
|
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES NOT SET OVERFLOW
|
|
;OR CARRY FLAGS ON THE KI10. FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
|
|
;THEN,DMOVN IS EXECUTED. NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
|
|
;IF ANY OF THESE FLAGS ARE SET, THE TEST FAILS.
|
|
|
|
;**KL10**
|
|
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES SET OVERFLOW
|
|
;OR CARRY FLAGS ON THE KL10. FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
|
|
;THEN,DMOVN IS EXECUTED. NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
|
|
;IF THE PROPER FLAGS ARE NOT SET, THE TEST FAILS.
|
|
|
|
Q'L'0: JFCL 17,.+1 ;CLEAR OVFL AND CRY0,1 FLAGS
|
|
DMOVN AC+1,[XWD A,B ;*DMOVN TEST
|
|
XWD C,D]
|
|
JSP AC,.+1 ;READ FLAGS
|
|
Q'L'1: TLZ AC,027777 ;CLEAR EXTRA JUNK
|
|
TLNE AC,USERF ;IN USER MODE ?
|
|
JRST Q'L'4 ;YES
|
|
SKIPE KLFLG ;KL10 ?
|
|
JRST Q'L'3 ;YES
|
|
;KI10 EXEC MODE
|
|
CAME AC,[KIEF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF OVFL OR CRY0,1 FLG SET
|
|
Q'L'2: JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH
|
|
JRST Q'L'6
|
|
;KL10 EXEC MODE
|
|
Q'L'3: CAME AC,[KLEF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF FLAGS NOT SET
|
|
JRST Q'L'2
|
|
;KL10/KI10 USER MODE
|
|
Q'L'4: SKIPE KLFLG ;KL10 ?
|
|
JRST Q'L'5 ;YES
|
|
;KI10 USER MODE
|
|
CAME AC,[KIUF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF ANY FLAGS SET
|
|
JRST Q'L'2
|
|
;KL10 USER MODE
|
|
Q'L'5: CAME AC,[KLUF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF FLAGS NOT SET
|
|
JRST Q'L'2
|
|
|
|
Q'L'6: JRST .+1>
|
|
DEFINE DMVM (L,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVEM INSTRUCTION
|
|
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
|
|
;TEST WORDS AND AC,AC+1 ARE LOADED WITH THE TEST WORDS.
|
|
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
|
|
;FROM AC, AC+1 TO MEMORY (TSTWD, TSTWD+1) VIA
|
|
;THE DMOVEM INSTRUCTION. C(TSTWD) AND C(TSTWD+1) ARE THEN
|
|
;COMPARED WITH THE TEST WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
|
|
;THE TEST PASSES IF THESE COMPARISONS AGREE.
|
|
|
|
Q'L'0: DMOVE AC,[XWD 707070,707070
|
|
XWD 070707,070707] ;INITIALIZE TEST WORDS
|
|
MOVEM AC,TSTWD ;TSTWD, TSTWD+1 ARE IN MEMORY JUST
|
|
MOVEM AC+1,TSTWD+1 ;AFTER THE FINAL TEST OF THIS PROGRAM
|
|
DMOVE AC,[XWD A,B
|
|
XWD C,D] ;INITIALIZE AC,AC+1
|
|
DMOVEM AC,TSTWD ;*MOVE DOUBLE WORD FROM AC, AC+1
|
|
;TO MEMORY (TSTWD, TSTWD+1)
|
|
DMOVE AC,TSTWD ;PUT RESULTS OF TEST IN AC,AC+1 FOR COMPARISON
|
|
CAME AC,[XWD A,B] ;WAS TSTWD LOADED CORRECTLY?
|
|
ER5 AC,L'1 ;FAIL IF CONTENTS(TSTWD) NOT = A,B
|
|
CAME AC+1,[XWD C,D] ;WAS TSTWD+1 LOADED CORRECTLY?
|
|
ER6 AC+1,L'2 ;FAIL IF CONTENTS(TSTWD+1) NOT = C,D
|
|
JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE DMVNM (L,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVNM INSTRUCTION
|
|
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
|
|
;TEST WORDS AND AC, AC+1 ARE LOADED WITH THE TEST WORDS.
|
|
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
|
|
;[XWD A,B] AND [XWD C,D] IS MOVED FROM AC, AC+1 TO MEMORY
|
|
;(TSTWD, TSTWD+1) VIA THE DMOVNM INSTRUCTION.
|
|
;C(TSTWD) AND C(TSTWD+1) ARE THEN COMPARED WITH THE
|
|
;NEGATIVE (TWOS COMPLEMENT) OF THE TEST
|
|
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
|
|
;THE TEST PASSES IF THESE COMPARISONS AGREE.
|
|
|
|
Q'L'0: DMOVE AC,[XWD 707070,707070
|
|
XWD 070707,070707]
|
|
DMOVEM AC,TSTWD ;INITIALIZE TEST WORDS
|
|
DMOVE AC,[XWD A,B
|
|
XWD C,D] ;INITIALIZE AC,AC+1
|
|
DMOVN AC+5,[XWD A,B
|
|
XWD C,D] ;SET-UP TO CHECK RESULTS
|
|
DMOVNM AC,TSTWD ;*MOVE NEGATIVE OF DOUBLE WORD FROM AC, AC+1
|
|
;TO MEMORY (TSTWD, TSTWD+1)
|
|
DMOVE AC,TSTWD ;PUT TEST RESULTS IN AC,AC+1
|
|
CAME AC,<AC+5>&17 ;WAS TSTWD LOADED CORRECTLY?
|
|
ER5 AC,L'1 ;FAIL IF CONTENTS(TSTWD) NOT = COMPLEMENT OF A,B
|
|
CAME AC+1,<AC+6>&17 ;WAS TSTWD+1 LOADED CORRECTLY?
|
|
ER6 AC+1,L'2 ;FAIL IF CONTENTS(TSTWD) NOT = MINUS C,D
|
|
JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH>
|
|
DEFINE DMVM17 (L,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVEM INSTRUCTION
|
|
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
|
|
;TEST WORDS AND AC,AC+1 ARE LOADED WITH THE TEST WORDS.
|
|
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
|
|
;FROM AC, AC+1 TO MEMORY (TSTWD, TSTWD+1) VIA THE DMOVEM INSTRUCTION.
|
|
;C(TSTWD) AND C(TSTWD+1) ARE THEN COMPARED WITH THE TEST
|
|
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
|
|
;THE TEST PASSES IF THESE COMPARISONS AGREE.
|
|
|
|
Q'L'0: MOVEM AC,%SV17 ;SAVE AC17 CAUSE IT HAS PDP
|
|
DMOVE AC,[XWD 707070,707070
|
|
XWD 070707,070707] ;INITIALIZE TEST WORDS
|
|
MOVEM AC,TSTWD ;TSTWD, TSTWD+1 ARE IN MEMORY JUST
|
|
MOVEM AC+1,TSTWD+1 ;AFTER THE FINAL TEST OF THIS PROGRAM
|
|
DMOVE AC,[XWD A,B
|
|
XWD C,D] ;INITIALIZE AC,AC+1
|
|
DMOVEM AC,TSTWD ;*MOVE DOUBLE WORD FROM AC, AC+1
|
|
;TO MEMORY (TSTWD, TSTWD+1)
|
|
DMOVE AC,TSTWD ;PUT RESULTS OF TEST IN AC,AC+1 FOR COMPARISON
|
|
CAMN AC,[XWD A,B] ;WAS TSTWD LOADED CORRECTLY?
|
|
JRST .+4 ;HERE IF TESTS OK
|
|
MOVEM AC,AC-1 ;SAVE BAD WORD
|
|
MOVE AC,%SV17 ;RESTORE P
|
|
ER5 AC-1,L'1 ;FAIL IF CONTENTS(TSTWD) NOT = A,B
|
|
CAMN AC+1,[XWD C,D] ;WAS TSTWD+1 LOADED CORRECTLY?
|
|
JRST .+4 ;HERE IF TESTS OK
|
|
MOVEM AC,AC-1 ;SAVE BAD WORD
|
|
MOVE AC,%SV17 ;RESTORE P
|
|
ER6 AC+1,L'2 ;FAIL IF CONTENTS(TSTWD+1) NOT = C,D
|
|
MOVE AC,%SV17 ;RESTORE AC UNCONDITIONALLY
|
|
JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH>
|
|
DEFINE DMVNM17 (L,A,B,C,D) <
|
|
;THIS MACRO TESTS THE DMOVNM INSTRUCTION
|
|
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
|
|
;TEST WORDS AND AC, AC+1 ARE LOADED WITH THE TEST WORDS.
|
|
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
|
|
;[XWD A,B] AND [XWD C,D] IS MOVED FROM AC, AC+1 TO MEMORY
|
|
;(TSTWD, TSTWD+1) VIA THE DMOVNM INSTRUCTION.
|
|
;C(TSTWD) AND C(TSTWD+1) ARE THEN COMPARED WITH THE
|
|
;NEGATIVE (TWOS COMPLEMENT) OF THE TEST
|
|
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
|
|
;THE TEST PASSES IF THESE COMPARISONS AGREE.
|
|
|
|
Q'L'0: DMOVE AC,[XWD 707070,707070
|
|
XWD 070707,070707]
|
|
DMOVEM AC,TSTWD ;INITIALIZE TEST WORDS
|
|
DMOVE AC,[XWD A,B
|
|
XWD C,D] ;INITIALIZE AC,AC+1
|
|
DMOVN AC+5,[XWD A,B
|
|
XWD C,D] ;SET-UP TO CHECK RESULTS
|
|
DMOVNM AC,TSTWD ;*MOVE NEGATIVE OF DOUBLE WORD FROM AC, AC+1
|
|
;TO MEMORY (TSTWD, TSTWD+1)
|
|
|
|
DMOVE AC,TSTWD ;PUT TEST RESULTS IN AC,AC+1
|
|
CAMN AC,<AC+5>&17 ;WAS TSTWD LOADED CORRECTLY?
|
|
JRST .+4
|
|
MOVEM AC,AC-1 ;SAVE BAD WORD
|
|
MOVE AC,%SV17 ;RESTORE P
|
|
ER5 AC-1,L'1 ;FAIL IF CONTENTS(TSTWD) NOT = COMPLEMENT OF A,B
|
|
CAMN AC+1,<AC+6>&17 ;WAS TSTWD+1 LOADED CORRECTLY?
|
|
JRST .+4 ;HERE IF TESTS OK
|
|
MOVEM AC,AC-1 ;SAVE BAD WORD
|
|
MOVE AC,%SV17
|
|
ER6 AC+1,L'2 ;FAIL IF CONTENTS(TSTWD) NOT = MINUS C,D
|
|
MOVE AC,%SV17
|
|
JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH>
|
|
DEFINE DMVNMF (L,A,B,C,D,KIEF,KIUF,KLEF,KLUF) <
|
|
;**KI10**
|
|
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES NOT SET OVERFLOW
|
|
;OR CARRY FLAGS ON THE KI10. FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
|
|
;THEN,DMOVN IS EXECUTED. NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
|
|
;IF ANY OF THESE FLAGS ARE SET, THE TEST FAILS.
|
|
|
|
;**KL10**
|
|
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES SET OVERFLOW
|
|
;OR CARRY FLAGS ON THE KL10. FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
|
|
;THEN,DMOVN IS EXECUTED. NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
|
|
;IF THE PROPER FLAGS ARE NOT SET, THE TEST FAILS.
|
|
|
|
Q'L'0: JFCL 17,.+1 ;CLEAR OVFL AND CRY0,1 FLAGS
|
|
DMOVE AC,[XWD A,B
|
|
XWD C,D] ;SETUP INITIAL
|
|
DMOVNM AC,TSTWD ;*DMOVNM TEST
|
|
JSP AC,.+1 ;READ FLAGS
|
|
Q'L'1: TLZ AC,027777 ;CLEAR EXTRA JUNK
|
|
TLNE AC,USERF ;IN USER MODE ?
|
|
JRST Q'L'4 ;YES
|
|
SKIPE KLFLG ;KL10 ?
|
|
JRST Q'L'3 ;YES
|
|
;KI10 EXEC MODE
|
|
CAME AC,[KIEF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF OVFL OR CRY0,1 FLG SET
|
|
Q'L'2: JUMPL SAC,Q'L'0 ;LOOP ON ERROR SWITCH
|
|
JRST Q'L'6
|
|
;KL10 EXEC MODE
|
|
Q'L'3: CAME AC,[KLEF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF FLAGS NOT SET
|
|
JRST Q'L'2
|
|
;KL10/KI10 USER MODE
|
|
Q'L'4: SKIPE KLFLG ;KL10 ?
|
|
JRST Q'L'5 ;YES
|
|
;KI10 USER MODE
|
|
CAME AC,[KIUF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF ANY FLAGS SET
|
|
JRST Q'L'2
|
|
;KL10 USER MODE
|
|
Q'L'5: CAME AC,[KLUF,,Q'L'1]
|
|
ER13 AC,L'1 ;FAIL IF FLAGS NOT SET
|
|
JRST Q'L'2
|
|
|
|
Q'L'6: JRST .+1>
|
|
DEFINE DFA (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
R'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFAD AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,R'T'00 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE DFS (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
R'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFSB AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,R'T'00 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE DFM (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
R'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFMP AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,R'T'00 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE DFD (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
R'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFDV AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,R'T'00 ;LOOP ON ERROR SWITCH>
|
|
DEFINE DFARP (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFAD AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T
|
|
JUMPL AC+4,.-^D6 ;LOOP ON ERROR SWITCH>
|
|
DEFINE SDFA (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
S'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFAD AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,S'T'00 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE SDFS (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
S'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFSB AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,S'T'00 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE SDFM (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
S'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFMP AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,S'T'00 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE SDFMKL (T,A,B,C,D,E,F,G,H,I,M,K,L,KL1,KL2,KL3,KL4) <
|
|
S'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFMP AC,[E,,F
|
|
G,,H]
|
|
SKIPE KLFLG
|
|
JRST S'T'05
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
S'T'06: JUMPL AC+4,S'T'00 ;LOOP ON ERROR SWITCH
|
|
JRST S'T'07
|
|
|
|
S'T'05: CAME AC,[KL1,,KL2]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[KL3,,KL4]
|
|
ER4 AC+1,T'01
|
|
JRST S'T'06
|
|
|
|
S'T'07: JRST .+1 >
|
|
DEFINE SDFD (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
S'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFDV AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
JUMPL AC+4,S'T'00 ;LOOP ON ERROR SWITCH>
|
|
|
|
DEFINE SDFDKL (T,A,B,C,D,E,F,G,H,I,M,K,L,KL1,KL2,KL3,KL4) <
|
|
S'T'00: DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFDV AC,[E,,F
|
|
G,,H]
|
|
SKIPE KLFLG
|
|
JRST S'T'05
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T'01
|
|
S'T'06: JUMPL AC+4,S'T'00 ;LOOP ON ERROR SWITCH
|
|
JRST S'T'07
|
|
|
|
S'T'05: CAME AC,[KL1,,KL2]
|
|
ER3 AC,T'01
|
|
CAME AC+1,[KL3,,KL4]
|
|
ER4 AC+1,T'01
|
|
JRST S'T'06
|
|
|
|
S'T'07: JRST .+1 >
|
|
DEFINE SDFARP (T,A,B,C,D,E,F,G,H,I,M,K,L) <
|
|
DMOVE AC,[A,,B
|
|
C,,D]
|
|
DFAD AC,[E,,F
|
|
G,,H]
|
|
CAME AC,[I,,M]
|
|
ER3 AC,T
|
|
CAME AC+1,[K,,L]
|
|
ER4 AC+1,T
|
|
JUMPL AC+4,.-^D6 ;LOOP ON ERROR SWITCH>
|