Updated the PDP-10 DAKAK diagnostic page, and verified the ability to assemble (but not run) all the original DAKAK source files, after making further improvements to the built-in MACRO-10 Mini-Assembler

This commit is contained in:
Jeff 2017-03-31 16:32:37 -07:00 committed by Jeff Parsons
commit afd621dc79
15 changed files with 2007 additions and 16361 deletions

View file

@ -1,572 +0,0 @@
;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>

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,53 @@ PDP-10 KLAD Diagnostics
-----------------------
PCjs has archived selected files from
[PDP-10 KLAD Diagnostics Sources](http://pdp-10.trailing-edge.com/klad_sources/index.html), including:
[PDP-10 KLAD Diagnostics Sources](http://pdp-10.trailing-edge.com/klad_sources/index.html) and turned them into
stand-alone PDP-10 diagnostics, using the new PCjs [MACRO-10 Mini-Assembler](/modules/pdp10/lib/macro10.js). A complete
list is provided [below](#list-of-ka10-diagnostics).
I experimented with assembling an entire diagnostic (**DAKAK**) from all its original pieces, by going to the
[DAKAK Diagnostic](dakak/) page and typing the following command:
a 'dakakt.mac;../param.klm;../fixed.klm;dakakm.mac;../uuoerr.klm;../stor.klm'
and while the MACRO-10 assembly process works:
loading dakakt.mac
loading param.klm
loading fixed.klm
loading dakakm.mac
loading uuoerr.klm
loading stor.klm
6301 words loaded at 000137-044630, start address 030000
00=000000000000 01=000000000000 02=000000000000 03=000000000000
04=000000000000 05=000000000000 06=000000000000 07=000000000000
10=000000000000 11=000000000000 12=000000000000 13=000000000000
14=000000000000 15=000000000000 16=000000000000 17=000000000000
PC=030000 RA=00000000 EA=000000 PS=000000 OV=0 C0=0 C1=0 ND=0 PD=0
030000: 254020 027776 JRST @27776
there are additional modules that must be loaded into the machine as well, which are not yet supported. So it's best
to assemble the modified files that I've placed inside each diagnostic's folder. For the [DAKAK Diagnostic](dakak/),
that's **DAKAK.MAC**:
>> a dakak.mac
loading dakak.mac
5849 words loaded at 000137-044133, start address 030621
00=000000000000 01=000000000000 02=000000000000 03=000000000000
04=000000000000 05=000000000000 06=000000000000 07=000000000000
10=000000000000 11=000000000000 12=000000000000 13=000000000000
14=000000000000 15=000000000000 16=000000000000 17=000000000000
PC=030621 RA=00000000 EA=000000 PS=000000 OV=0 C0=0 C1=0 ND=0 PD=0
030621: 254000 030622 JRST 30622
If the machine is able to run to the end of the diagnostic (which can be located by looking at the diagnostic's original
MACRO-10 listing file) without stopping on an UUO opcode, then you can assume it passed.
List of KA10 Diagnostics
------------------------
The following list of KA10 Diagnostics is not comprehensive. It's simply a list of thosr diagnostics we have archived and
tested with PDPjs so far.
- [KA10 Basic Instruction Diagnostic #1 (MAINDEC-10-DAKAA)](dakaa/)
- TEST OF JUMP, JUMPA AND SKIPX INSTRUCTIONS

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,171 @@
SUBTTL *SPCCPU* SPECIAL BASIC CPU PROCESSOR CONTROL, 26-FEB-76
;NEW DEFINITIONS USED BY THE KL10 SUBROUTINE PACKAGE
AC0= 0
DIAGNOS=30000 ;PDP-10 DIAGNOSTIC START ADDRESS
DDT= 10000 ;PDP-10 DDT START ADDRESS
DIAMON= 20000 ;PDP-10 DIAMON LOADER START ADDRESS
DONG11= 1B22 ;11 DOORBELL (FROM THE 10)
;DTE20 DEVICE CODES
DTE== 200 ;DTE0
DTE0== 204
DTE1== 204
DTE2== 210
DTE3== 214
;KL10 EPT COMMUNICATION AREA
$STD= 440 ;PDP-10 DIAGNOSTIC START ADDRESS
$DDT= 441 ;PDP-10 DDT START ADDRESS
$STL= 442 ;PDP-10 LOADER START ADDRESS
$STM= 443 ;PDP-10 MONITOR START ADDRESS
$DTFLG= 444 ;DTE20 OPERATION COMPLETE FLAG
$DTCLK= 445 ;DTE20 CLOCK INTERRUPT FLAG
$DTCI= 446 ;DTE20 CLOCK INTERRUPT INSTRUCTION
$DTT11= 447 ;DTE20 10 TO 11 ARGUMENT
$DTF11= 450 ;DTE20 11 TO 10 ARGUMENT
$DTCMD= 451 ;DTE20 TO 11 COMMAND WORD
$DTSEQ= 452 ;DTE20 OPERATION SEQUENCE NUMBER
$DTOPR= 453 ;DTE20 OPERATIONAL DTE #
$DTCHR= 454 ;DTE20 LAST TYPED CHARACTER
$DTMTD= 455 ;DTE20 MONITOR TTY OUTPUT COMPLETE FLAG
$DTMTI= 456 ;DTE20 MONITOR TTY INPUT FLAG
$DTSWR= 457 ;DTE20 CONSOLE SWITCH REGISTER
;SPECIAL "FIXED" REASSIGNMENTS
$$LOC=. ;SAVE CURRENT LOCATION
LOC 30000
$$BEGIN:JRST $$START ;SETUP SPECIAL START
JRST $$START ;"DIAMON" CHAIN START ADDRESS
LOC 440
$STD: JRST BEGIN ;SETUP FOR "STD"
LOC 443
$STM: JRST $SPEC ;SIMPLE RUN CONTROL
LOC 30057
$BEGEND:JRST $SPBEND ;SETUP SPECIAL "BEGEND"
;SPECIAL MUUO, TRAP & PAGE FAIL SETUP
LOC 420
$$420: HALT . ;KI10 PAGE FAIL
$$421: JFCL ;OVERFLOW
$$422: HALT . ;PUSHDOWN OVERFLOW
$$423: HALT . ;TRAP 3
$$424: 0 ;MMUO
$$425: 0 ;MMUO PC
$$426: 0 ;KI10-PAGE FAIL, KL10-PROCESS CONTEXT
$$427: HALT .
$$430: 427 ;MMUO NEW PC'S
$$431: 427
$$432: 427
$$433: 427
$$434: 427
$$435: 427
$$436: 427
$$437: 427
LOC 500
$$500: 0 ;KL10 PAGE FAIL WORD
$$501: 0 ;KL10 PAGE FAIL PC
$$502: 503 ;KL10 PAGE FAIL NEW PC
$$503: HALT .
LOC $$LOC ;RESET CURRENT LOCATION
;SPECIAL STARTUP SEQUENCE
$$START:SETZM USER
JSP 0,.+1 ;IN USER MODE ?
TLNE 0,USERF
SETOM USER ;YES, SET CONTROL WORD
SKIPN MONFLG ;SPECIAL USER MODE ?
SETZM USER ;YES, RUN AS EXEC
SKIPE USER
JRST START ;USER MODE, DON'T NEED CPU TYPE
$STKIL: SKIPN MONTEN ;LOADED BY "DIAMON" ?
SETOM ITRCNT ;NO, RUN FOREVER
SETZM KLTYP
SETZM KLFLG ;ASSUME KI10
MOVE 1,[1,,1]
BLT 1,1 ;HOPE THIS WORKS
CAMN 1,[1,,1] ;IF AC NE 1,,1 AFTER BLT, KL10
JRST START ;KI10, NO ADDITIONAL SETUP
$STKL: CONO APR,10040 ;SET BBD NOT BIT
CONI APR,0
CONO APR,20040 ;CLEAR BBD NOT BIT
TRNN 0,40 ;IF SET, KL10
AOS KLTYP ;IF NOT, BBD
SETZM $DTFLG
SETZM $DTCLK
MOVE $DTOPR ;GET DTE #
ORM $$DTE0 ;INSERT IN DTE I/O INSTS
ORM $$DTE1
ORM $$DTE2
ORM $$DTE3
SETOM KLFLG ;SET KL10 CONTROL FLAG
JRST START
$SPEC: MOVE [JRST STARTA] ;SIMPLE RUN CONTROL
MOVEM $SPB1
JRST START
;SPECIAL "BEGEND" ROUTINE
$SPBEND:AOS PASCNT ;INCREMENT PASS COUNT
SOS ITRCNT ;DECREMENT ITERATION COUNT
$SPB1: SKIPN USER
JRST $SPBEX ;EXEC MODE
$SPBUS: SKIPE ITRCNT ;USER MODE, COMPLETED ?
JRST STARTA ;NO, KEEP RUNNING
SKIPN MONTEN ;DONE, LOADED BY "DIAMON" ?
EXIT ;NO, RETURN TO MONITOR
JRST @RETURN ;YES, RETURN TO "DIAMON"
$SPBEX: SKIPE KLFLG
JRST $SPBKL ;KL10 & EXEC
DATAO PI,ITRCNT ;KI10 & EXEC, DISPLAY ITER COUNT
SKIPE ITRCNT
JRST STARTA ;NOT COMPLETED YET
JRST @RETURN ;DONE
$SPBKL: SKIPN ITRCNT
JRST $SPKLD ;KL10, EXEC & COMPLETED
SKIPGE MONCTL
JRST STARTA ;"DIAMON" CONTROL
MOVEI 0,404 ;NOTIFY PDP-11 OF END OF PASS
MOVEM 0,$DTCMD
SETZM $DTFLG
SKIPN KLTYP
$$DTE0: CONO DTE,DONG11
SKIPE KLTYP
$$DTE1: CONO DTE,10000
SKIPN $DTFLG ;WAIT TILL 11 RESPONDS
JRST .-1
JRST STARTA ;KEEP RUNNING
;SPECIAL KL10 COMPLETED ROUTINE
$SPKLD: SKIPE MONTEN
JRST @RETURN ;LOADED BY "DIAMON"
MOVEI 0,403 ;NOTIFY PDP-11 OF COMPLETION
MOVEM 0,$DTCMD
SETZM $DTFLG
SKIPN KLTYP
$$DTE2: CONO DTE,DONG11
SKIPE KLTYP
$$DTE3: CONO DTE,10000
SKIPN $DTFLG ;SHOULD NEVER HAPPEN
JRST .-1 ;11 NEVER RETURNS ON END OF PROGRAM
HALT BEGIN ;IF IT DOES, HALT.

View file

@ -0,0 +1,21 @@
SUBTTL *STOR* RESERVED STORAGE, JULY 19,1977
;PROGRAM LITERALS
XLIST
IFNDEF $LPAPER,<LIST>
LIT
LIST
ENDSLD: 0
IFDEF DEBUG,<
PATCH: BLOCK DEBUG ;PATCHING AREA
>
;PROGRAM VARIABLES
VAR
IFDEF PGMEND,<
END: 0
END BEGIN >

View file

@ -7,7 +7,7 @@ machines:
type: pdp10
config: /devices/pdp10/machine/ka10/test/debugger/machine.xml
debugger: true
commands: a &apos;dakakt.mac;../param.klm;../fixed.klm;dakakm.mac;../uuoerr.klm&apos;
commands: a dakak.mac
---
PDP-10 KA10 Basic Instruction Diagnostic #11
@ -18,7 +18,9 @@ The *PDP-10 KA10 Basic Instruction Diagnostic #11* (MAINDEC-10-DAKAK) test code
[DAKAKT.MAC](DAKAKT.MAC.txt) [[original](http://pdp-10.trailing-edge.com/klad_sources/01/klad.sources/dakakt.mac.html)]
for use with the [PDP-10 Test Machine with Debugger](/devices/pdp10/machine/ka10/test/debugger/) below.
Resources for this test include:
This diagnostic "TESTS THE MULTIPLY INSTRUCTION AND THE MULTIPLY ALGORITHM."
Resources for this diagnostic include:
- [Instructions](#dakaktxt)
- [History](#dakakhst)
@ -38,6 +40,23 @@ This command:
will automatically read the [DAKAK.MAC](DAKAK.MAC.txt) source file (a slightly modified copy of [DAKAKM.MAC](DAKAKM.MAC.txt)),
assemble it, and then load the binary image at the location specified in the file.
To assemble the diagnostic using the original DEC source files:
a 'dakakt.mac;../param.klm;../fixed.klm;dakakm.mac;../uuoerr.klm;../stor.klm'
The quotes (either single or double) are required to prevent the PDPjs Debugger from interpreting the filenames as
separate commands, because a semicolon is the Debugger's normal command separator.
If you want a machine to automatically assemble and load those files on startup, you can add the following machine configuration
setting in the page's Front Matter:
commands: a &apos;dakakt.mac;../param.klm;../fixed.klm;dakakm.mac;../uuoerr.klm;../stor.klm&apos;
However, in this case, you *must* use `&apos;` as the quoting sequence, because of the way these settings are encoded into
JavaScript parameters; e.g.:
embedPDP10(...,'{commands:"a &apos;dakakt.mac;../param.klm;../fixed.klm;dakakm.mac;../uuoerr.klm;../stor.klm&apos;"}');
---
DAKAK.TXT