Trailing-Edge
-
PDP-10 Archives
-
klad_sources
-
klad.sources/smbc2d.mac
There are no other files named smbc2d.mac in the archive.
SUBTTL TEST OF AC HARDWARE AND INDEX REGISTERS
;NOTE: AN "*" IN THE COMMENT FIELD OF AN INSTRUCTION INDICATES THAT
; IT IS THE TESTED INSTRUCTION.
;**********
;THIS TEST VERIFIES THAT AC1 IS ACCESSABLE
;IN THIS CASE, AC1 IS PRELOADED WITH 1.
;C(AC1) IS THEN CHECKED FOR A1. THIS TEST PASSES IF C(AC1)=1.
;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY
C100: SETZ ;CLEAR AC0
MOVEI 1,1 ;PRELOAD AC1 UMTH 1
CAIE 1,1 ;PASS IF C(AC1)=1
STOP
;**********
;THIS TEST VERIFIES THAT AC2 IS ACCESSABLE.
;IN THIS CASE, AC2 IS PRELOADED WITH 2.
;C(AC2) IS THEN CHECKED FOR 2. THIS TEST PASSES IF C(AC2)=2.
;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY
C200: MOVEI 2,2 ;PRELOAD AC2 WITH 2
CAIE 2,2 ;PASS IF C(AC2)=2
STOP
;**********
;THIS TEST VERIFIES THAT AC4 IS ACCESSABLE.
;IN THIS CASE, AC4 IS PRELOADED WITH 4.
;C(AC4) IS THEN CHECKED FOR 4. THIS TEST PASSES IF C(AC4)=4.
;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY
C300: MOVEI 4,4 ;PRELOAD AC4 WITH 4
CAIE 4,4 ;PASS IF C(AC4)=4
STOP
;**********
;THIS TEST VERIFIES THAT AC10 IS ACCESSABLE.
;IN THIS CASE, AC10 IS PRELOADED WITH 10.
;C(AC10) IS THEN CHECKED FOR 10. THIS TEST PASSES IF C(AC10)=10.
;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY
C400: MOVEI 10,10 ;PRELOAD AC10 WITH 10
CAIE 10,10 ;PASS IF C(AC10)=10
STOP
;**********
SN=500
ZZ=-1
;THIS TEST VERIFIES THAT ALL ACS EXIST
;FIRST, EACH AC IS PRELOADED WITH ITS OWN ADDRESS;
;THEN, THE CONTENTS OF EACH AC IS CHECKED FOR ITS ADDRESS.
;IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS
C500: REPEAT ^D16,
< ZZ=ZZ+1
MOVEI ZZ,ZZ ;PRELOAD EACH AC WITH ITS ADDR>
PAGE
ZZ=20
REPEAT ^D16,<
;THIS TEST VERIFIES THAT ALL ACS EXIST.
;FIRST, EACH AC IS PRELOADED WITH ITS OWN ADDRESS;
;THEN, THE CONTENTS OF EACH AC IS CHECKED FOR ITS ADDRESS.
;IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS
SN=SN+1
ZZ=ZZ-1
CAIE ZZ,ZZ ;CHECK THAT EACH AC CONTAINS ITS OWN ADDRESS
STOP
;IN CASE OF FAILURE, LOOP TO C500 ADDRESS
;**********
>
SN=600
ZZ=0
;THIS TEST VERIFIES THAT AN ADDRESS WITHIN THE AC RANGE MAY BE ACCESSED AS
;EITHER AN AC OR A MEMORY LOCATION AND THAT EITHER REFERENCE REFERS TO THE
;SAME HARDWARE. EACH AC IS PRELOADED WITH ITS ADDRESS; THEN THE CONTENTS OF EACH
;AC IS CHECKED FOR ITS ADDRESS. IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS.
C600: REPEAT ^D15,
< ZZ=ZZ+1
MOVEI ZZ ;PRELOAD EACH AC WITH ITS ADDRESS
MOVEM ZZ ;BY REFERENCING EACH AC AS MEMORY.>
ZZ=20
REPEAT ^D15,<
;THIS TEST VERIFIES THAT AN ADDRESS WITHIN THE AC RANGE MAY BE ACCESSED AS
;EITHER AN AC OR A MEMORY LOCATION AND THAT EITHER REFERENCE REFERS TO THE
;SAME HARDWARE. EACH AC IS PRELOADED WITH ITS ADDRESS
;THEN THE CONTENTS OF EACH AC IS CHECKED FOR ITS ADDRESS.
;IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS.
SN=SN+1
ZZ=ZZ-1
CAIE ZZ,ZZ ;CHECK THAT EACH AC CONTAINS ITS OWN ADDRESS
STOP
;IN CASE OF FAILURE, LOOP TO C600 ADDRESS
;**********
>
SN=700
ZZ=0
C700: REPEAT ^D15,<
;THIS TEST VERIFIES THAT THE INDEX REGISTERS ARE ACCESSABLE.
;FIRST, AN INDEX REGISTER IS PRELOADED WITH ITS ADDRESS; THEN,
;IT IS REFERENCED AS AN INDEX REGISTER. IF IT CONTAINS ITS ADDRESS, THIS TEST PASSES.
;THIS TEST IS REPEATED 15 TIMES IN ORDER TO TEST EACH INDEX REGISTER.
SN=SN+1
ZZ=ZZ+1
MOVEI ZZ,ZZ ;PRELOAD INDEX REGISTER WITH ITS ADDRESS
CAIE ZZ,(ZZ) ;PASS IF INDEX REGISTER CONTAINS ITS ADDRESS
STOP
;**********
>
SN=1000
ZZ=0
C1000: REPEAT ^D15,<
;THIS TEST VERIFIES THAT ALL INDEX REGISTERS INDEX CORRECTLY.
;FIRST, BOTH HALVES OF THE INDEX REGISTER ARE PRELOADED WITH ITS ADDRESS.
;THEN, THE INDEX REGISTER IS REFERENCED. IT IS THEN CHECKED FOR ITS ADDRESS IN BOTH HALVES.
;IF IT CONTAINS ITS ADDRESS IN BOTH HALVES THIS TEST PASSES.
;THIS TEST IS REPEATED 15 TIMES IN ORDER TO TEST EACH INDEX REGISTER
SN=SN+1
ZZ=ZZ+1
MOVEI ZZ,ZZ ;PRELOAD BOTH HALVES OF INDEX REG WITH ITS ADDRESS
HRLI ZZ,ZZ ;PASS IF INDEX REGISTER CONTAINS ITS ADDRESS
CAME ZZ,(ZZ) ;IN BOTH HALVES
STOP
;**********
>
SUBTTL TEST OF INDEX REGISTER ADDRESSING
;**********
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION
;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3.
;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A 0,
;THE FINAL RESULT IN AC3 SHOULD BE 0. IF C(AC3)=0, THIS TEST PASSES.
C1100: SETOM 3 ;PRELOAD AC3 WITH -1,,1
SETZM 1 ;PRELOAD AC1 WITH 0
MOVEI 2,1 ;SETUP INDEX REGISTER 2 WITH 1
MOVE 3,(2) ;*FWT FROM INDEXED LOCATION
SKIPE 3 ;TEST INDEXING
STOP
;**********
SN=1200
ZZ=0
C1200: REPEAT ^D18,<
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION
;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3.
;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A
;FLOATING 1. THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 1.
;IF C(AC3)=A FLOATING 1, THIS TEST PASSES.
SN=SN+1
ZZ=ZZ+ZZ
IFE ZZ,<ZZ=1>
SETOM 3 ;PRELOAD AC3 WITH -1,,-1
MOVEI 1,ZZ ;PRELOAD AC1 WITH FLOATING 1
MOVEI 2,1 ;SETUP INDEX REGISTER
MOVE 3,(2) ;*FWT FROM INDEXED LOCATION
CAIE 3,ZZ ;TEST INDEXING
STOP
;**********
>
SN=1300
ZZ=0
C1300: REPEAT ^D18,<
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION
;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3.
;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A
;FLOATING 1, THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 1.
;IF C(AC3)=A FLOATING 1, THIS TEST PASSES.
SN=SN+1
ZZ=ZZ+ZZ
IFE ZZ,<ZZ=1>
SETOM 3 ;PRELOAD AC3 WITH -1,,-1
MOVSI 1,ZZ ;PRELOAD AC1 WITH FLOATING 1
MOVEI 2,1 ;SETUP INDEX REGISTER
MOVE 3,(2) ;*FWT FROM INDEXED LOCATION
CAME 3,[ZZ,,0] ;TEST INDEXING
STOP
;**********
>
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION
;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3.
;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH -1,,-1,
;THE FINAL RESULT IN AC3 SHOULD BE -1,,-1. IF C(AC3)=-1,,-1, THIS TEST PASSES.
C1400: SETZM 3 ;PRELOAD AC3 WITH 0
SETOM 1 ;PRELOAD AC1 WITH -1,,-1
MOVEI 2,1 ;SETUP INDEX REGISTER
MOVE 3,(2) ;*FWT FROM INDEXED LOCATION
CAME 3,[-1,,-1] ;TEST INDEXING
STOP
;**********
SN=1500
ZZ=0
C1500: REPEAT ^D18,<
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION
;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3.
;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A
;FLOATING 0, THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 0.
;IF C(AC3)=A FLOATING 0, THIS TEST PASSES.
SN=SN+1
ZZ=<ZZ+ZZ+1>&777777
IFE <ZZ-1>,<ZZ=777776>
SETZM 3 ;PRELOAD AC3 WITH 0
HRROI 1,ZZ ;PRELOAD AC1 WITH FLOATING 0
MOVEI 2,1 ;SETUP INDEX REGISTER
MOVE 3,(2) ;*FWT FROM INDEXED LOCATION
CAME 3,[-1,,ZZ] ;TEST INDEXING
STOP
;**********
>
SN=1600
ZZ=0
C1600: REPEAT ^D18,<
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION
;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3.
;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A
;FLOATING 0, THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 0.
;IF C(AC3)=A FLOATING 0, THIS TEST PASSES.
SN=SN+1
ZZ=<ZZ+ZZ+1>&777777
IFE <ZZ-1>,<ZZ=777776>
SETZM 3 ;PRELOAD AC3 WITH 0
HRLOI 1,ZZ ;PRELOAD AC1 WITH FLOATING 0
MOVEI 2,1 ;SETUP INDEX REGISTER
MOVE 3,(2) ;*FWT FROM INDEXED LOCATION
CAME 3,[ZZ,,-1] ;TEST INDEXING
STOP
;**********
>
;VERIFY INDEXING WHERE 'E' IS NON-ZERO
SN=1700
ZZ=-1
XX=-10
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, THE INDEX REG IS SET-UP WITH MOVEI ZZ+1,ZZ-XX,
;WHERE ZZ+1 IS THE INDEX REG. THE AC IS PRELOADED WITH ITS OWN ADDRESS, 0,,ZZ.
;CAIE IS USED TO TEST THE INDEXING OPERATION.
;IF THE RESULT IN C(AC)=XX+C(ZZ+1 - RIGHT), THIS TEST PASSES.
;XX+C(ZZ+1 - RIGHT) SHOULD = ZZ.
C1700: REPEAT ^D15,
<SN=SN+1
ZZ=ZZ+1
XX=XX+3
MOVEI ZZ+1,ZZ-XX ;SETUP INDEX REGISTER
MOVEI ZZ,ZZ ;PRELOAD AC WITH 0,,ZZ
CAIE ZZ,XX(ZZ+1) ;*TEST INDEXING
STOP
;**********
>
PAGE
SN=2000
ZZ=-1
XX=-20
;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY.
;IN THIS TEST, THE INDEX REG IS SET-UP WITH MOVEI ZZ+1,ZZ-XX,
;WHERE ZZ+1 IS THE INDEX REG. INDEXING IS TESTED BY LOADING
;THE AC VIA MOVEI ZZ,XX(ZZ+1), WHERE XX+C(ZZ+1)=ZZ.
;IF THE RESULT IN THE AC EQUALS 0,,ZZ, THIS TEST PASSES.
C2000: REPEAT ^D15,
<SN=SN+1
ZZ=ZZ+1
XX=XX+5
MOVEI ZZ+1,ZZ-XX ;SETUP INDEX REGISTER
MOVEI ZZ,XX(ZZ+1) ;*TEST INDEXING
CAIE ZZ,ZZ ;PASS IF C(AC)=0,,ADDRESS OF AC
STOP
;**********
>
SUBTTL TEST OF EXCH INSTRUCTION
;**********
;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND
;MOVES C(AC) INTO E.
;IN THIS CASE, AC=E=0 AND C(AC)=C(E). HENCE, THE FINAL RESULT
;IN AC0 SHOULD BE 0. IF C(AC)=0, THE TEST PASSES.
C2100: SETZ ;PRELOAD AC,E WITH 0
EXCH ;*EXCH SHOULD PLACE 0 INTO AC0
SKIPE ;PASS IF C(AC0)=0
STOP
;**********
;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND
;MOVES C(AC) INTO E.
;IN THIS CASE, AC=E=-1,,-1 AND C(AC)=C(E). HENCE, THE FINAL RESULT
;IN AC0 SHOULD BE -1,,-1. IF C(AC)=-1,,-1, THE TEST PASSES.
C2200: SETO ;PRELOAD AC,E WITH -1,,-1
EXCH ;*EXCH SHOULD PLACE -1,,-1 INTO AC0
CAME [-1] ;PASS IF C(AC0)=-1,,-1
STOP
;**********
;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND
;MOVES C(AC) INTO E.
;IN THIS CASE, C(AC)=-1,,0 AND C(E)=0,,-1. HENCE, THE FINAL RESULT
;IN THE AC SHOULD BE 0,,-1 AND THE RESULT IN E SHOULD BE -1,,0,
;IF THESE RESULTS OCCUR, THE TEST PASSES.
C2400: MOVSI -1 ;PRELOAD AC WITH -1,,0
MOVEI 1,-1 ;PRELOAD E WITH 0,,-1
EXCH 1 ;*EXCH SHOULD PLACE 0,,-1 INTO THE AC AND -1,,0 INTO E
CAME 1,[-1,,0] ;PASS IF C(E)=-1,,0
STOP
C2410: CAME 0,[0,,-1] ;PASS IF C(AC)=0,,-1
STOP
;**********
;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND
;MOVES C(AC) INTO E.
;IN THIS CASE, C(AC)=0,,-1 AND C(E)=-1,,0. HENCE, THE FINAL RESULT
;IN THE AC SHOULD BE -1,,0 AND THE RESULT IN E SHOULD BE 0,,-1.
;IF THESE RESULTS OCCUR, THE TEST PASSES.
C2700: MOVEI -1 ;PRELOAD AC WITH 0,,-1
MOVSI 1,-1 ;PRELOAD E WITH -1,,0
EXCH 1 ;*EXCH SHOULD PLACE -1,,0 INTO THE AC AND 0,,-1 INTO E
CAIE 1,-1 ;PASS IF C(E)=0,,-1
STOP
C2710: CAME ,[XWD -1,0] ;PASS IF C(AC)=-1,,0
STOP
;**********
;THIS TEST IS A RELIABILITY CHECK OF EXCH.
;FIRST, AC, E ARE PRELOADED WITH 252525,,252525. THERE, EXCH IS
;EXECUTED 7 TIMES. THE AC IS THEN CHECKED FOR 252525,,252525.
;IF C(AC)=C(E)=252525,,252525, THIS TEST PASSES.
;IN THIS TEST AC=E=AC0
C3000: MOVE [252525252525] ;PRELOAD AC,E WITH 252525,,252525
REPEAT 7,
< EXCH ;*EXCH SHOULD PLACE 252525,,252525 INTO AC0>
CAME [252525252525] ;PASS IF C(AC0)=252525,,252525
STOP
;**********
PAGE
;THIS TEST VERIFIES THAT EXCH MOVES C(AC) INTO E AND C(E) INTO THE AC.
;IN THIS CASE, C(AC)=0 AND C(E)=-1,,-1. EXCH IS EXECUTED 7 TIMES; THEN,
;THE AC IS CHECKED FOR -1,,-1 AND E IS CHECKED FOR 0. IF EITHER OF THESE
;RESULTS ARE NOT FOUND, THIS TEST FAILS.
C3100: SETZ ;PRELOAD AC WITH 0
SETO 1,0 ;PRELOAD E WITH -1,,-1
REPEAT 7,
< EXCH 1 ;*EXCH SHOULD EXCHANGE C(AC) AND C(E)>
CAME [-1] ;PASS IF C(AC)=-1,,-1
STOP
C3110: CAME 1,[0] ;PASS IF C(E)=0
STOP
;**********
SUBTTL TEST OF MOVEM INSTRUCTION
;THIS TEST VERIFIES THAT MOVEM PLACES C(AC) INTO E AND DOES NOT MODIFY C(AC)
;IN THIS CASE, C(AC)=-1,,-1 AND C(E)=0. HENCE, THE RESULT IN AC AND E SHOULD
;BE -1,,-1. IF C(AC) AND C(E)=-1,,-1, THIS TEST PASSES
C3200: SETO ;PRELOAD AC WITH -1,,-1
SETZ 1,0 ;PRELOAD E WITH 0
MOVEM 1 ;*MOVEM SHOULD PLACE -1,,-1 INTO E
CAME 1,[-1] ;PASS IF C(E)=-1,,-1
STOP
C3210: CAME 0,[-1] ;PASS IF C(AC)=-1,,-1
STOP
;**********
SUBTTL TEST OF JFCL INSTRUCTION AND ARITHMETIC FLAGS
;**********
;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS RETURNS TO THE NEXT SEQUENTIAL INSTRUCTION
;IF JFCL SKIPS THE NEXT INSTRUCTION, THIS TEST FAILS
C3300: MOVE [HALT .+3] ;THIS INSTRUCTION SHOULD NOT AFFECT THE TEST
JFCL 17,.+1 ;*JFCL SHOULD RETURN TO NEXT SEQUENTIAL INSTRUCTION
CAIA ;SKIP HALT INSTRUCTION IF JFCL PASSES
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE CRY0 FLAG.
;ADDI IS USED TO SET CRY0. THEN, JFCL 17,.+1 IS EXECUTED TO CLEAR CRY0.
;JFCL 4,.+2 IS EXECUTED TO DETERMINE WHETHER CRY0 WAS RESET BY THE PREVIOUS JFCL.
;THIS TEST FAILS IF JFCL 17,.+1 DID NOT CLEAR CRY0
C3400: MOVE [-1] ;PRELOAD AC WITH -1,,-1
ADDI 1 ;SET CRY0 FLAG
JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS
JFCL 4,.+2 ;PASS IF CRY0 WAS RESET BY PREVIOUS INSTRUCTION
SKIPA ;SKIP HALT IF CRY0 WAS CLEARED
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE CRY1 FLAG.
;ADDI IS USED TO SET CRY1. THEN, JFCL 17,.+1 IS EXECUTED TO CLEAR CRY1.
;JFCL 4,.+2 IS EXECUTED TO DETERMINE WHETHER CRY1 WAS RESET BY THE PREVIOUS JFCL.
;THIS TEST FAILS IF JFCL 17,.+1 DID NOT CLEAR CRY1
C3500: MOVE [-1] ;PRELOAD AC WITH -1,,-1
ADDI 1 ;SET CRY1 FLAG
JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS
JFCL 2,.+2 ;PASS IF CRY1 WAS RESET BY PREVIOUS INSTRUCTION
SKIPA ;SKIP HALT IF CRY1 WAS CLEARED
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE AROV FLAG.
;ADDI IS USED TO SET AROV. THEN, JFCL 17,.+1 IS EXECUTED TO CLEAR AROV.
;JFCL 4,.+2 IS EXECUTED TO DETERMINE WHETHER AROV WAS RESET BY THE PREVIOUS JFCL.
;THIS TEST FAILS IF JFCL 17,.+1 DID NOT CLEAR AROV
C3600: MOVSI 400000 ;PRELOAD AC WITH -1,,-1
ADD [XWD 400000,0] ;SET AROV FLAG
JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS
JFCL 10,.+2 ;PASS IF AROV WAS RESET BY PREVIOUS INSTRUCTION
SKIPA ;SKIP HALT IF AROV WAS CLEARED
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 0, IS A NO-OP.
;IN THIS TEST, ADD IS USED TO SET CRY0. THEN JFCL 0,.+2 IS EXECUTED.
;IF JFCL 0,.+2 DOES NOT SKIP THE NEXT INSTRUCTION, THIS TEST PASSES
C3700: MOVSI 400000 ;PRELOAD AC WITH MOST NEGATIVE NUMBER
ADD [-1] ;SET CRY0 FLAG
JFCL .+2 ;*JFCL SHOULD RETURN TO NEXT SEQUENTIAL INSTRUCTION
SKIPA ;PASS IF JFCL DID NOT SKIP
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 0, IS A NO-OP.
;IN THIS TEST, ADD IS USED TO SET CRY1. THEN JFCL 0,.+2 IS EXECUTED.
;IF JFCL 0,.+2 DOES NOT SKIP THE NEXT INSTRUCTION, THIS TEST PASSES
C4000: MOVSI 200000 ;PRELOAD AC WITH MOST NEGATIVE NUMBER
ADD [XWD 200000,0] ;SET CRY1 FLAG
JFCL .+2 ;*JFCL SHOULD RETURN TO NEXT SEQUENTIAL INSTRUCTION
SKIPA ;PASS IF JFCL DID NOT SKIP
STOP
;**********
;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND
;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET.
;IN THIS TEST, ADDI SHOULD SET CRY0 AND CRY1. THEN, JFCL SHOULD SKIP
;BECAUSE A FLAG WAS SET BY ADDI
;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR
;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET
C4100: MOVE [-1] ;PRELOAD AC WITH ALL ONES
ADDI 1 ;*ADDI SHOULD SET CRY0/1 FLAGS
JFCL 17,.+2 ;*JFCL SHOULD JUMP BECAUSE FLAGS ARE SET
STOP
;**********
;THIS TEST VERIFIES THAT CAI DOES NOT CLEAR ANY ARITHMETIC FLAGS.
;FIRST, CRY0 AND CRY1 ARE SET BY ADDI; THEN CAI IS EXECUTED.
;JFCL SHOULD JUMP BECAUSE FLAGS ARE SET. IF JFCL DOES NOT JUMP,
;THE FLAGS WERE CLEARED BY CAI. HENCE, CAI FAILED
C4200: MOVE [-1] ;PRELOAD AC WITH -1,,-1
ADDI 1 ;SET CYR0/1 FLAGS
CAI 17,17 ;*CAI SHOULD NOT CLEAR FLAGS
JFCL 17,.+2 ;PASS IF CAI CLEARED FLAGS
STOP
;**********
;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND
;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET.
;IN THIS TEST, ADDI SHOULD SET CRY0 AND CRY1. THEN JFCL SHOULD SKIP
;BECAUSE A FLAG WAS SET BY ADDI
;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR
;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET
C4300: MOVE [-1] ;PRELOAD AC WITH ALL ONES
ADDI 1 ;*ADDI SHOULD SET CRY1 FLAGS
JFCL 2,.+2 ;*JFCL SHOULD JUMP BECAUSE CRY1 FLAG IS SET
STOP
;**********
;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND
;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET.
;IN THIS TEST, ADDI SHOULD SET CRY0 AND CRY1. THEN, JFCL SHOULD SKIP
;BECAUSE A FLAG WAS SET BY ADDI
;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR
;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET
C4400: MOVE [-1] ;PRELOAD AC WITH ALL ONES
ADDI 1 ;*ADDI SHOULD SET CRY0 FLAG
JFCL 4,.+2 ;*JFCL SHOULD JUMP BECAUSE CRY0 FLAG IS SET
STOP
;**********
;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND
;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET.
;BECAUSE A FLAG WAS SET BY ADD
;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR
;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET
C4500: MOVSI 400000 ;PRELOAD AC WITH ALL ONES
ADD [XWD 400000,0] ;*ADD SHOULD SET AROV FLAG
JFCL 10,.+2 ;*JFCL SHOULD JUMP BECAUSE AROV FLAG IS SET
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE FLOATING OVERFLOW FLAG (FOV).
;FIRST JFCL 17,.+1 IS EXECUTED TO CLEAR FOV. THEN, JFCL 1,.+2 IS EXECUTED TO DETERMINE
;WHETHER FOV WAS CLEARED. IF FOV WAS CLEAR, THIS TEST PASSES
C4600: JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS
JFCL 1,.+2 ;PASS IF FOV WAS CLEARED
SKIPA ;SKIP HALT IF TEST PASSED
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 13, DOES NOT RESET CRY0.
;FIRST CRY0 AND CRY1 ARE SET BY ADDI; THEN, JFCL 13,.+2 IS EXECUTED
;TO CLEAR ALL ARITHMETIC FLAGS EXCEPT CRY0.
;THIS TEST PASSES IF JFCL 13,.+1 DID NOT RESET CRY0.
C4700: MOVE [-1] ;RELOAD AC WITH -1,,-1
ADDI 1 ;SET CRY0/1
JFCL 13,.+1 ;*JFCL 13, SHOULD NOT RESET CRY0
JFCL 4,.+2 ;FAIL IF CRY 0 WAS RESET
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 15, DOES NOT RESET CRY1.
;FIRST CRY0 AND CRY1 ARE SET BY ADDI; THEN, JFCL15,.+2 IS EXECUTED
;TO CLEAR ALL ARITHMETIC FLAGS EXCEPT CRY1.
;THIS TEST PASSES IF JFCL 15,.+1 DID NOT RESET CRY1.
C5000: MOVE [-1] ;PRELOAD AC WITH -1,,-1
ADDI 1 ;SET CRY0/1
JFCL 15,.+1 ;*JFCL15, SHOULD NOT RESET CRY0
JFCL 2,.+2 ;FAIL IF CRY1 WAS RESET
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 17, DOES NOT RESET AROV.
;FIRST AROV IS SET BY ADD; THEN, JFCL 17,.+2 IS EXECUTED
;TO CLEAR ALL ARITHMETIC FLAGS EXCEPT AROV.
;THIS TEST PASSES IF JFCL 17,.+1 DID NOT RESET AROV.
C5100: MOVSI 400000 ;PRELOAD AC WITH -1,,-1
ADD [XWD 400000,0] ;SET AROV
JFCL 7,.+1 ;*JFCL 17, SHOULD NOT RESET AROV
JFCL 10,.+2 ;FAIL IF AROV WAS RESET
STOP
;**********
;THIS TEST VERIFIES THAT ADD OF 0 TO 0 WILL NOT SET AROV.
;FIRST, ALL FLAGS ARE RESET, THEN 0 IS ADDED TO 0 VIA ADD.
;AROV IS THEN CHECKED. IF AROV IS SET, THIS TEST FAILS.
C5200: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS
SETZ ;PRELOAD AC,E WITH 0
ADD ;*ADD SHOULD NOT SET AROV
JFCL 10,.+2 ;PASS IF AROV WAS RESET
SKIPA ;SKIP HALT IF ADD PASSED
STOP
;**********
;THIS TEST VERIFIES THAT ADD OF 0 TO 0 WILL NOT SET CRY0.
;FIRST, ALL FLAGS ARE RESET, THEN 0 IS ADDED TO 0 VIA ADD.
;CRY0 IS THEN CHECKED. IF CRY0 IS SET, THIS TEST FAILS.
C5300: SETZ ;RESET ARITHMETIC FLAGS
JFCL 17,.+1 ;PRELOAD AC,E WITH 0
ADD ;*ADD SHOULD NOT SET CRY0
JFCL 4,.+2 ;PASS IF CRY0 WAS RESET
SKIPA ;SKIP HALT IF ADD PASSED
STOP
;**********
;THIS TEST VERIFIES THAT ADD OF 0 TO 0 WILL NOT SET CRY1.
;FIRST, ALL FLAGS ARE RESET, THEN 0 IS ADDED TO 0 VIA ADD.
;CRY1 IS THEN CHECKED. IF CRY1 IS SET, THIS TEST FAILS.
C5400: SETZ ;RESET ARITHMETIC FLAGS
JFCL 17,.+1 ;PRELOAD AC,E WITH 0
ADD ;*ADD SHOULD NOT SET CRY1
JFCL 2,.+2 ;PASS IF CRY1 WAS RESET
SKIPA ;SKIP HALT IF ADD PASSED
STOP
;**********
;THIS TEST VERIFIES THAT THE 30X AND THE 31X INSTRUCTION GROUPS DO NOT AFFECT
;THE ARITHMETIC FLAGS. FIRST, THE FLAGS ARE CLEARED AND AC0 IS CLEARED; THEN, CAI
;AND CAM ARE EXECUTED. THE FLAGS ARE THEN CHECKED. IF ANY OF THE FLAGS ARE SET,
;THIS TEST FAILS AND CAI OR CAM IS CONSIDERED TO HAVE ERRONEOUSLY SET THE FLAGS
C5500: JFCL 17,.+1 ;CLEAR ALL FLAGS
SETZ ;CLEAR AC,0
CAI ;*CAI SHOULD NOT SET ANY ARITHMETIC FLAG
CAM [-1] ;*CAM SHOULD NOT SET ANY ARITHMETIC FLAG
JFCL 17,.+2 ;FAIL IF ANY FLAG WAS SET
SKIPA ;SKIP HALT IF TEST PASSED
STOP
;**********
;THIS TEST VERIFIES THAT THE BOOLEAN INSTRUCTION GROUPS DO NOT AFFECT
;THE ARITHMETIC FLAGS. FIRST THE FLAGS ARE CLEARED AND AC0 IS CLEARED; THEN, XOR [0]
;AND XOR [-1] ARE EXECUTED. THE FLAGS ARE THEN CHECKED. IF ANY OF THE FLAGS ARE SET,
;THIS TEST FAILS AND XOR IS CONSIDERED TO HAVE ERRONEOUSLY SET THE FLAGS
C5600: JFCL 17,.+1 ;CLEAR ALL FLAGS
SETO ;CLEAR AC,0
XOR [0] ;*XOR SHOULD NOT SET ANY ARITHMETIC FLAG
XOR [-1] ;*XOR SHOULD NOT SET ANY ARITHMETIC FLAG
JFCL 17,.+2 ;FAIL IF ANY FLAG WAS SET
SKIPA ;SKIP HALT IF TEST PASSED
STOP
;**********
;THIS TEST VERIFIES THAT THE AOBJX INSTRUCTION GROUP DOES DO NOT AFFECT
;THE ARITHMETIC FLAGS. FIRST THE FLAGS ARE CLEARED AND AC0 IS CLEARED; THEN, AOBJN
;AND AOBJP ARE EXECUTED. THE FLAGS ARE THEN CHECKED. IF ANY OF THE FLAGS ARE SET,
;THIS TEST FAILS AND AOBJN OR AOBJP IS CONSIDERED TO HAVE ERRONEOUSLY SET THE FLAGS
C5700: SETO ;CLEAR ALL FLAGS
JFCL 17,.+1 ;CLEAR AC,0
AOBJN .+1 ;*AOBJN SHOULD NOT SET ANY ARITHMETIC ARITHMETIC
AOBJP .+1 ;*AOBJP SHOULD NOT SET ANY ARITHMETIC FLAG
JFCL 17,.+2 ;FAIL IF ANY FLAG WAS SET
SKIPA ;SKIP HALT IF TST PASSED
STOP
;**********
;THIS TEST VERIFIES THAT SKIP DOES NOT AFFECT THE FLAGS.
;FIRST, THE ARITHMETIC FLAGS ARE CLEARED; THEN, SKIP IS EXECUTED.
;IF SKIP SETS AROV, CRYO, CRY1 OR FOV, THIS TEST FAILS.
C5701: JFCL 17,.+1 ;CLEAR ALL FLAGS
SKIP 0,[-1] ;*SKIP SHOULD NOT SET ANY FLAGS
JFCL 17,.+2 ;FAIL IF ANY FLAG IS SET
SKIPA ;PASS IF NO FLAG IS SET
STOP
;**********
;THIS TEST VERIFIES THAT JUMP DOES NOT AFFECT THE FLAGS.
;FIRST, THE ARITHMETIC FLAGS ARE CLEARED; THEN, JUMP IS EXECUTED.
;IF JUMP SETS AROV, CRYO, CRY1 OR FOV, THIS TEST FAILS.
C5702: JFCL 17,.+1 ;CLEAR ALL FLAGS
JUMP 0,[-1] ;*JUMP SHOULD NOT SET ANY FLAGS
JFCL 17,.+2 ;FAIL IF ANY FLAG IS SET
SKIPA ;PASS IF NO FLAG IS SET
STOP
;**********
SUBTTL TEST OF JRST INSTRUCTION AND ARITHMETIC FLAGS
;**********
;THIS TEST VERIFIES THAT 'JRST, 0' DOES NOT SET ANY FLAGS.
;FIRST THE ARITHMETIC FLAGS ARE RESET; THEN, 'JRST 0,.+1' IS EXECUTED
;THE AROV,CRY0 AND CRY1 FLAGS ARE THEN CHECKED. IF ANY
;OF THESE FLAGS ARE SET, THIS TEST FAILS
C6000: JFCL 17,.+1 ;RESET ALL FLAGS
JRST .+1 ;*JRST SHOULD NOT SET ANY FLAGS
JFCL 16,.+2 ;PASS IF NO FLAGS ARE SET
SKIPA ;SKIP HALT IF JRST PASSES
STOP
;**********
;THIS TEST VERIFIES THAT 'MOVE 2,2' DOES NOT SET ANY FLAGS.
;FIRST, THE ARITHMETIC FLAGS ARE RESET; THEN, 'MOVE 2,2' IS EXECUTED.
;THE FOV,AROV,CRY0 AND CRY1 FLAGS ARE THEN CHECKED. IF ANY
;OF THESE FLAGS ARE SET, THIS TEST FAILS
C6100: JFCL 17,.+1 ;RESET ALL FLAGS
MOVE 2,2 ;*MOVE SHOULD NOT SET ANY FLAGS
JFCL 17,.+2 ;PASS IF NO FLAGS ARE SET
SKIPA ;SKIP HALT IF MOVE PASSED
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE CRY0 FLAG.
;FIRST, ALL FLAGS ARE RESET; THEN AC1 IS SET TO SPECIFY CRY0.
;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET CRY0. CRY0 IS THEN CHECKED. IF
;CRY0 IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C6200: JFCL 17,.+1 ;CLEAR ALL FLAGS
SFLAG CRY0 ;SET CRY0 FLAG
JFCL 4,.+2 ;PASS IF CRY0 IS SET
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAIN 0. HENCE, JRST 2,.+1(1)
;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE CRY0/1, FLAGS ARE SET BY ADDI;
;THEN THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1. IF CRY1 WAS CLEARED, THE
;TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C6300: MOVE [-1] ;PRELOAD AC0 WITH -1,,-1
ADDI 1 ;SET CRY0/1 FLAGS
SFLAG 0 ;RESET ALL ARITHMETIC FLAGS
JFCL 2,.+2 ;PASS IF CRY1 IS RESET
SKIPA ;SKIP HALT INSTRUCTION IF TEST PASSED
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAIN 0. HENCE, JRST 2,.+1(1)
;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE CRY0/1, FLAGS ARE SET BY ADD
;THEN THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1. IF AROV WAS CLEARED, THE
;TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C6400: MOVSI 400000 ;PRELOAD AC0 WITH -1,,-1
ADD [-1] ;SET CRY0 AND AROV FLAGS
SFLAG 0 ;RESET ALL ARITHMETIC FLAGS
JFCL 10,.+2 ;PASS IF AROV IS RESET
SKIPA ;SKIP HALT INSTRUCTION IF TEST PASSED
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE AROV FLAG.
;FIRST, ALL FLAGS ARE RESET; THEN AC1 SET TO SPECIFY AROV.
;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET AROV. AROV IS THEN CHECKED. IF
;AROV IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C6500: SFLAG AROV ;SET AROV FLAG
JFCL 10,.+2 ;PASS IF AROV WAS SET
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE CRY1 FLAG.
;FIRST, ALL FLAGS ARE RESET; THEN AC1 SET TO SPECIFY CRY1.
;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET CRY1. CRY1 IS THEN CHECKED. IF
;CRY1 IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C6600: SFLAG CRY1 ;SET CRY1 FLAG
JFCL 2,.+2 ;PASS IF CRY1 WAS SET
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE FOV FLAG.
;FIRST, ALL FLAGS ARE RESET; THEN AC1 SET TO SPECIFY FOV.
;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET FOV. FOV IS THEN CHECKED. IF
;FOV IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C6700: SFLAG FOV ;SET FOV FLAG
JFCL 1,.+2 ;PASS IF FOV WAS SET
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 0, SHOULD NEVER JUMP.
;FIRST, FOV IS SET VIA JRST2, ;THEN JFCL 0,
;IS EXECUTED. IF JFCL 0, DOES NOT SKIP, THIS TEST PASSES
C7000: SFLAG FOV ;SET FOV FLAG
JFCL ,.+2 ;*JFCL SHOULD NOT JUMP
SKIPA ;PASS IF JFCL DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAINS 0. HENCE, JRST 2,.+1(1)
;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE CRY0, FLAG IS SET BY JRST 2,.+1(1)
;WITH C(AC1)=CRY0. THEN, THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1 WITH C(AC1)=0.
;IF CRY0 WAS CLEARED, THE TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C7100: SFLAG CRY0 ;SET CRY0 FLAGS
SETZ 1, ;SETUP MASK TO CLEAR ARITHMETIC FLAGS
JRST 2,.+1(1) ;*RESET ARITHMETIC FLAGS
JFCL 4,.+2 ;PASS IF CRY0 FLAG WAS RESET
SKIPA ;SKIP HALT INSTRUCTION IF TEST PSSED
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAINS 0. HENCE, JRST 2,.+1(1)
;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE FOV, FLAG IS SET BY JRST 2,.+1(1)
;WITH C(AC1)=FOV. THEN, THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1 WITH C(AC1)=0.
;IF FOV WAS CLEARED, THE TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C7200: SFLAG FOV ;SET FOV FLAG
SETZ 1, ;SETUP MASK TO CLEAR ARITHMETIC FLAGS,
JRST 2,.+1(1) ;*RESET ARITHMETIC FLAGS
JFCL 1,.+2 ;PASS IF FOV FLAG WAS RESET
SKIPA ;SKIP HALT INSTRUCTION IF TEST PSSED
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG
;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAINS 0. HENCE, JRST 2,.+1(1)
;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE ARITHMETIC FLAGS ARE RESET BY
;JFCL 17,.+1. THEN, THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1.
;IF ALL THE ARITHMETIC FLAGS WERE CLEARED,
;THE TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY
C7300: JFCL 17,.+1 ;CLEAR FLAGS
SETZ 1, ;SETUP MASK TO CLEAR ARITMETIC FLAGS
JRST 2,.+1(1) ;*RESET ARITHMETIC FLAGS
JFCL 17,.+2 ;PASS IF ALL FLAGS ARE RESET
SKIPA ;SKIP HALT INSTRUCTION IF TEST PASSED
STOP
;**********
SUBTTL TEST OF JSP INSTRUCTION
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS AND PC IN THE AC.
;IN THIS CASE, THE FLAGS ARE RESET; THEN, JSP IS EXECUTED. THE AC IS THEN
;CHECKED FOR ITS CONTENTS NON-ZERO. IF C(AC)=0, IT INDICATES
;THAT NEITHER THE FLAGS NOR THE PC WAS SAVED. HENCE, THIS TEST FAILS.
C7400: SETZB 1 ;CLEAR AC AND SETUP MASK TO RESET FLAGS
JRST 2,.+1(1) ;RESET FLAGS
JSP .+1 ;*JSP SHOULD STORE FLAGS AND PC IN THE AC
SKIPN ;PASS IF C(AC) IS NON-ZERO
STOP ;IT DID NOT STORE ANY FLAGS OR PC
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE PC IN THE RIGHT HALF OF THE AC.
;IN THIS CASE, THE AC IS CLEARED, THEN, JSP IS EXECUTED. THE RIGHT HALF OF
;THE AC IS THEN CHECKED FOR ITS CONTENTS NON-ZERO. IF C(AC RIGHT HALF)
;IS NON-ZERO, IT INDICATED THAT THE PC WAS SAVED; AND THIS TEST PASSES.
C7500: SETZ ;CLEAN AC
JSP .+1 ;*JSP SHOULD STORE THE PC IN THE AC
TRNN -1 ;PASS IF C(AC) IN NON-ZERO
STOP
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC.
;FIST, THE AC IS CLEARED; THEN, SOME FLAGS ARE SET AND JSP IS EXECUTED.
;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE
;WHETHER THE FLAGS WERE SAVED. IF C(AC-LEFT) IS NON-ZERO, THIS TEST PASSES
C7600: SETZM 0 ;CLEAR AC
MOVSI 1,740000 ;SET UP MASK TO SET FLAGS
JRST 2,.+1(1) ;SET SOME ARITHMETIC FLAGS
JSP .+1 ;*JSP SHOULD STORE FLAGS IN THE AC
TLNN -1 ;PASS IF C(AC) IS NON-ZERO
STOP
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC.
;FIRST, THE AC IS CLEARED; THEN, THE AROV FLAG IS SET AND JSP IS EXECUTED.
;THEN, THE AROV FLAG BIT OF
;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE
;WHETHER THE AROV FLAG WAS SAVED. IF THE AROV FLAG BIT OF THE AC IS SET, THIS TEST PASSES
C7700: SETZM 0 ;CLEAR THE AC
SFLAG AROV ;SET AROV FLAG
JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT
TLNN AROV ;PASS IF AROV WAS SAVED
STOP
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC.
;FIRST, THE AC IS CLEARED; THEN, THE CRY0 FLAG IS SET AND JSP IS EXECUTED.
;THEN, THE CRY0 FLAG BIT OF
;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE
;WHETHER THE CRY0 FLAG WAS SAVED. IF THE CRY0 FLAG BIT OF THE AC IS SET, THIS TEST PASSES
C10000: SETZM 0 ;CLEAR THE AC
SFLAG CRY0 ;SET CRY0 FLAG
JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT
TLNN CRY0 ;PASS IF CRY0 WAS SAVED
STOP
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC.
;FIRST, THE AC IS CLEARED; THEN, THE CRY1 FLAG IS SET AND JSP IS EXECUTED.
;THEN, THE CRY1 FLAG BIT OF
;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE
;WHETHER THE FLAG WAS SAVED. IF THE CRY1 FLAG BIT OF THE AC IS SET, THIS TEST PASSES
C10100: SETZ ;CLEAR AC
SFLAG CRY1 ;SET CRY1 FLAG
JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT
TLNN CRY1 ;PASS IF AROV WAS SAVED
STOP
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC.
;FRIST, THE AC IS CLEARED; THEN, THE FOV FLAG IS SET AND JSP IS EXECUTED.
;THEN, THE FOV FLAG BIT OF THE LEFT HALF OF THE AC IS CHECKED FOR
;ITS CONTENTS NON-ZERO TO DETERMINE WHETHER THE FOV FLAG WAS SAVED.
;IF THE FOV FLAG BIT OF THE AC IS SET, THIS TEST PASSES
C10200: SETZ ;CLEAR THE AC
SFLAG FOV ;SET FOV FLAG
JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT
TLNN FOV ;PASS IF FOV WAS SAVED
STOP
;**********
;THIS TEST VERIFIES THAT JSP WILL STORE ONLY FLAGS THAT EXIST.
;I.E. RESET FLAGS WILL NOT BE SET IN THE AC. ONLY FLAGS THAT ARE
;CLEARABLE BY JRSTF WILL BE CHECKED HERE. FIRST ALL CLEARABLE
;FLAGS ARE RESET BY JRSTF; THEN JSP IS EXECUTED. THE AC IS THEN CHECKED.
;IF ANY CLEARABLE FLAGS ARE SET IN THE AC, THIS TEST FAILS.
C10300: SFLAG 0 ;CLEAR ALL CLEARABLE FLAGS
JSP .+1 ;*JSP SHOULD NOT STORE CLEARABLE FALGS
TLNE 761777 ;FAIL IF ANY CLEARABLE FLAG IS SET
STOP
;**********
;THIS TEST VERIFIES THAT JSP ALWAYS JUMPS.
;IN THIS TEST, JSP .+2 IS EXECUTED. IF JSP JUMPS, THE TEST PASSES;
;OTHERWISE, THIS TEST HALTS
C10400: JSP .+2 ;*JSP SHOULD ALWAYS JUMP
STOP
;**********
SUBTTL TEST JRST INSTRUCTION
;**********
;THIS TEST VERIFIES THAT JRST ALWAYS JUMPS.
;IN THIS TEST, JRST .+2 IS EXECUTED. IF JRST JUMPS, THE TEST PASSES;
;OTHERWISE, THIS TEST HALTS
C10500: JRST .+2 ;*JRST 0, SHOULD ALWAYS JUMP
STOP
;**********
SUBTTL TEST OF AOBJX INSTRUCTIONS
;**********
;THIS TEST VERIFIES THAT AOBJN ALWAYS ADDS 1 TO BOTH HALVES OF THE AC.
;FIRST, THE AC IS CLEARED; THEN, AOBJN IS EXECUTED AND THE AC IS CHECKED
;FOR 1,,1. IF C(AC)=1,,1, THIS TEST PASSES.
C11200: SETZ ;CLEAR THE AC
AOBJN .+1 ;*AOBJN SHOULD ADD 1 TO BOTH HALVES OF THE AC
CAME [XWD 1,1] ;PASS IF C(AC)=1,,1
STOP
;**********
;THIS TEST VERIFIES THAT AOBJP ALWAYS ADDS 1 TO BOTH HALVES OF THE AC.
;FIRST, THE AC IS CLEARED; THEN AOBJP IS EXECUTED AND THE AC IS CHECKED
;FOR 1,,1. IF C(AC)=1,,1, THIS TEST PASSES.
C11300: MOVE [XWD 377777,377777] ;PRELOAD AC WITH 377777,,377777
AOBJP .+1 ;*AOBJP SHOULD ADD, TO BOTH HALVES OF THE AC
CAME [XWD 400000,400000] ;PASS IF C(AC)=400000,400000
STOP
;**********
;THIS TEST VERIFIES THAT AOBJN WILL NOT JUMP WHEN C(AC) IS POSITIVE
;FIRST, THE AC IS CLEARED; AND AOBJN IS EXECUTED. AOBJN SHOULD NOT JUMP
;BECAUSE C(AC) IS POSITIVE. IF AOBJN JUMPS, THIS TEST FAILS
C11400: SETZ ;CLEAR THE AC
AOBJN .+2 ;*AOBJN SHOULD NOT JUMP WHEN C(AC) IS POSITIVE
SKIPA ;PASS IF AOBJN DOES NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT AOBJP WILL JUMP WHEN C(AC) IS POSITIVE
;FIRST, THE AC IS CLEARED; AND AOBJP IS EXECUTED. AOBJP SHOULD JUMP
;BECAUSE C(AC) IS POSITIVE. IF AOBJP DOES NOT JUMP, THIS TEST FAILS
C11500: SETZ ;CLEAR THE AC
AOBJP .+2 ;*AOBJP SHOULD JUMP BECAUSE C(AC) IS POSITIVE
STOP
;**********
;THIS TEST VERIFIES THAT AOBJN WILL JUMP WHEN C(AC) IS NEGATIVE
;FIRST, THE AC IS PRELOADED WITH 400000,,0; AND AOBJN IS EXECUTED. AOBJN SHOULD JUMP
;BECAUSE C(AC) IS NEGATIVE. IF AOBJN DOES NOT JUMP, THIS TEST FAILS
C11600: MOVE [XWD 400000,400000] ;PRELOAD AC WITH 400000,,400000
AOBJN .+2 ;*AOBJN SHOULD JUMP BECAUSE C(AC) IS NEGATIVE
STOP
;**********
;THIS TEST VERIFIES THAT AOBJP WILL NOT JUMP WHEN C(AC) IS NEGATIVE. FIRST,
;THE AC IS PRELOADED WITH 400000,,0; AND AOBJP IS EXECUTED. AOBJP SHOULD NOT JUMP
;BECAUSE C(AC) IS NEGATIVE. IF AOBJP JUMPS, THIS TEST FAILS
C11700: MOVE [XWD 400000,400000] ;PRELOAD AC WITH 400000,,400000
AOBJP .+2 ;*AOBJP SHOULD NOT JUMP BECAUSE C(AC) IS NEGATIVE
SKIPA ;PASS IF AOBJP DOES NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT THERE IS NO CARRY FROM BIT 18 TO BIT 17 OF THE AC ON AOBJN.
;THE AC IS PRELOADED WITH -1,,-1; THEN AOBJN IS EXECUTED. AOBJN SHOULD ADD ONE
;TO BOTH HALVES OF THE AC WITHOUT GENERATING A CARRY FROM BIT 18 TO BIT 17. IF NO
;CARRY WAS GENERATED, THIS TEST PASSES
C12000: SETO ;PRELOAD AC WITH -1,, -1
AOBJN .+1 ;*AOBJN SHOULD NOT GENERATE A CARRY FROM BIT 18 TO 17
SKIPE ;PASS IF C(AC)=0 (NO CARRY WAS GENERATED)
STOP
;**********
SUBTTL TEST SETTING OF ARITHMETIC FLAGS VIA MOVNX AND MOVMX
;THIS TEST VERIFIES THAT MOVNI SETS CRY0 AND CRY1 FLAGS ONLY WHEN THE DATA IS 0.
;FIRST, THE ARITHMETIC FLAGS ARE RESET; THEN, MOVNI IS EXECUTED WITH DATA OF ZEROS.
;THE ARITHMETIC FLAGS ARE CHECKED.
; CRY0/1 ARE SET AND AROV AND FOV RESET, THIS TEST PASSES.
C12100: JFCL 17,.+1 ;CLEAR FLAGS
MOVNI 0 ;* MOVNI 0 SHOULD SET CRY0/1
JCRY0 .+2 ;PASS IF CRY0 IS SET
STOP
JCRY1 .+2 ;PASS IF CRY1 IS SET
STOP
JOV .+2 ;PASS IF AROV RESET
SKIPA
STOP
JFOV .+2 ;PASS IF FOV RESET
SKIPA
STOP
;**********
;THIS TEST VERIFIES THAT MOVN WILL NOT SET ARITHMETIC FLAGS WHEN THE DATA IS -1,,-1.
;FIRST, THE FLAGS ARE RESET; THEN, MOVN [-1,,-1] IS EXECUTED.
;THE ARITHMETIC FLAGS ARE CHECKED.
;IF ANY ARITHMETIC FLAG IS SET, THIS TEST FAILS.
C12200: JFCL 17,.+1 ;CLEAR FLAGS
MOVN [-1] ;*MOVN [-1,,-1] SHOULD SET ARITHMETIC FLAGS
JFCL 17,.+2 ;FAIL IF AN ARITHMETIC FLAG IS SET
SKIPA ;SKIP HALT INSTRUCTION IF MOVN PASSED.
STOP
;**********
;THIS TEST VERIFIES THAT MOVN WILL SET THE AROV AND
;CRY1 FLAGS ONLY WHEN THE DATA IS 400000,,0
;FIRST, THE FLAGS ARE RESET; THEN, MOVN [400000,,0] IS EXECUTED.
;THE ARITHMETIC FLAGS ARE CHECKED.
;IF AROV AND CRY1 ARE SET AND CRY0 AND FOV ARE RESET, THIS TEST PASSES.
C12300: JFCL 17,.+1 ;CLEAR ARITHMETIC FLAGS
MOVN [XWD 400000,0] ;*MOVN [400000,,0] SHOULD SET AROV AND CRY1 ONLY
JOV .+2 ;PASS IF AROV IS SET
STOP
JCRY1 .+2 ;PASS IF CRY0 IS SET
STOP
JCRY0 .+2 ;PASS IF CRY0 IS RESET
SKIPA
STOP
JFOV .+2 ;PASS IF FOV IS RESET
SKIPA
STOP
;**********
;THIS TEST VERIFIES THAT MOVM WILL SET THE AROV AND
;CRY1 FLAGS ONLY WHEN THE DATA IS 400000,,0
;FIRST, THE FLAGS ARE RESET; THEN, MOVM [400000,,0] IS EXECUTED.
;THE ARITHMETIC FLAGS ARE CHECKED.
;IF AROV AND CRY1 ARE SET AND CRY0 AND FOV ARE RESET, THIS TEST PASSES.
C12301: JFCL 17,.+1 ;CLEAR ARITHMETIC FLAGS
MOVM [XWD 400000,0] ;*MOVM [400000,,0] SHOULD SET AROV AND CRY1 ONLY
JOV .+2 ;PASS IF AROV IS SET
STOP
JCRY1 .+2 ;PASS IF CRY0 IS SET
STOP
JCRY0 .+2 ;PASS IF CRY0 IS RESET
SKIPA
STOP
JFOV .+2 ;PASS IF FOV IS RESET
SKIPA
STOP
;**********
SUBTTL TEST OF AOS AND SOS INSTRUCTIONS
;**********
;THIS TEST VERIFIES THAT AOS ADDS 1 TO MEMORY AND DOES NOT SKIP.
;FIRST, E IS CLEARED; THEN, AOS IS EXECUTED. NEXT E IS CHECKED FOR 1.
;IF C(E) IS NOT 1 OR AOS SKIPPED, THIS TEST FAILS
C12600: SETZ ;CLEAR E
AOS ;*AOS SHOULD ADD 1 TO C(E) AND NOT SKIP
CAIE 1 ;PASS IF C(E)=0,,1 ANDAOS DID NOT SKIP
STOP
;**********
;THIS TEST VERIFIES THAT AOS ADDS 1 TO MEMORY AND DOES NOT SKIP.
;FIRST, E IS PRELOADED WITH -1,,-1; THEN, AOS IS EXECUTED. NEXT E IS CHECKED FOR 0.
;IF C(E) IS NOT 0 OR AOS SKIPPED, THIS TEST FAILS
C12700: SETO ;PRELOAD E WITH -1,,-1
AOS ;*AOS SHOULD ADD 1 TO C(E) AND NOT SKIP
CAIE ;PASS IF C(E)=0,,0 AND AOS DID NOT SKIP
STOP
;**********
;THIS TEST VERIFIES THAT SOS SUBTRACTS 1 FROM MEMORY AND DOES NOT SKIP.
;FIRST, E IS CLEARED; THEN, SOS IS EXECUTED. NEXT E IS CHECKED FOR -1,,-1.
;IF C(E) IS NOT -1,,-1 OR SOS SKIPPED, THIS TEST FAILS
C13100: SETZ ;CLEAR E
SOS ;*SOS SHOULD SUBTRACT 1 FROM C(E) AND NOT SKIP
CAME [-1] ;PASS IF C(E)=-1,,-1 AND SOS DID NOT SKIP
STOP
;**********
;THIS TEST VERIFIES THAT SOS SUBTRACTS 1 FROM MEMORY AND DOES NOT SKIP.
;FIRST, E IS PRELOADED WITH A; THEN, SOS IS EXECUTED. NEXT E IS CHECKED FOR 0.
;IF C(E) IS NOT 0 OR SOS SKIPPED, THIS TEST FAILS
C13200: MOVEI 1 ;PRELOAD E WITH 1
SOS ;*SOS SHOULD SUBTRACT 1 FROM C(E) AND DID NOT SKIP
CAIE 0 ;PASS IF C(E)=0 AND SOS DID NOT SKIP
STOP
;**********
;THIS TEST VERIFIES THAT SOS SETS CRY0/1 FLAGS IF C(E) IS A NON-ZERO NUMBER OTHER
;THAN 400000,,0. IN THIS CASE, C(E)=1. FIRST THE FLAGS ARE RESET; THEN
;SOS IS EXECUTED. THE FLAGS ARE CHECKED. IF CRY0 AND CRY1 ARE SET
;AND AROV AND FOV ARE RESET, THIS TEST PASSES.
C13300: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS
MOVEI 1 ;PRELOAD E WITH 1
SOS ;*SOS SHOULD SET CRY0/1
JCRY0 .+2 ;PASS IF CRY0 IS SET
STOP
JCRY1 .+2 ;PASS IF CRY1 IS SET
STOP
JOV .+2 ;PASS IF AROV IS RESET
SKIPA
STOP
JFOV .+2 ;PASS IF FOV IS RESET
SKIPA
STOP
;**********
;THIS TEST VERIFIES THAT AOS SETS CRY0 AND CRY1 FLAG IF C(E) IS -1,,-1
;FIRST THE FLAGS ARE RESET; THEN
;AOS IS EXECUTED. THE FLAGS ARE CHECKED.
;IF CRY0 AND CRY1 ARE SET AND AROV AND FOV ARE RESET, THIS TEST PASSES.
C13400: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS
SETO ;PRELOAD E WITH 1
AOS ;*AOS SHOULD SET CRY0 AND CRY1
JCRY0 .+2 ;PASS IF CRY0 IS SET
STOP
JCRY1 .+2 ;PASS IF CRY1 IS SET
STOP
JOV .+2 ;PASS IF AROV IS RESET
SKIPA
STOP
JFOV .+2 ;PASS IF FOV IS RESET
SKIPA
STOP
;**********
SUBTTL TEST OF INTERACTION OF JFCL, JRST, AND JSP WITH ARITHMETIC FLAGS
;**********
;THIS TEST VERIFIES THAT JFCL 1, WILL ALWAYS CLEAR FOV FLAG.
;FIRST, FOV IS SET VIA JRST 2, ;THEN JFCL 1,.+1 IS EXECUTED TO CLEAR FOV.
;IF FOV WAS CLEARED, THIS TEST PASSES.
C13600: SFLAG FOV ;SET FOV FLAG
JFCL 1,.+1 ;*JFCL SHOULD RESET FOV
JFCL 1,.+2 ;PASS IF FOV IS RESET
SKIPA ;SKIP HALT IF JFCL 1,.+1 PASSED
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2, CAN SET FXU AND JSP CAN SAVE FXU IN THE AC.
;FIRST, FXU IS SET VIA JRST 2, ;THEN, JSP IS EXECUTED. THE AC IS CHECKED
;FOR FXU. IF FXU IS SET, THIS TEST PASSES; OTHERWISE, EITHER JRST 2, OR JSP FAILED.
C13700: SFLAG FXU ;*SET FXU FLAG
JSP .+1 ;*STORE FXU FLAG IN AC
TLNN FXU ;PASS IF FXU IS SET IN THE AC
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2, CAN RESET FXU AND JSP CAN SAVE FXU IN THE AC.
;FIRST, FXU IS SET; THEN, FXU IS RESET VIA JRST 2,. NEXT, JSP IS EXECUTED; AND
;THE AC IS CHECKED FOR FXU RESET. IF FXU IS RESET IN THE AC, THIS TEST PASSES;
;OTHERWISE, JRST 2, FAILED TO CLEAR FXU OR JSP STORED FXU INCORECTLY.
C14000: SFLAG FXU ;SET FXU FLAG
SFLAG ;*RESET FXU FLAG
JSP .+1 ;*STORE FXU FLAG IN THE AC
TLNE FXU ;PASS IF FXU IS RESET IN THE AC
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2, CAN SET DCK AND JSP CAN SAVE DCK IN THE AC.
;FIRST, DCK IS SET VIA JRST 2, ;THEN JSP IS EXECUTED. THE AC IS CHECKED
;FOR DCK. IF DCK IS SET, THIS TEST PASSES, OTHERWISE JRST 2, OR JSP FAILED.
C14100: SFLAG DCK ;*SET DCK FLAG
JSP .+1 ;*STORE FXU FLAG IN AC
TLNN DCK ;PASS IF FXU IS SET IN THE AC
STOP
;**********
;THIS TEST VERIFIES THAT JRST 2, CAN RESET DCK AND JSP CAN SAVE DCK IN THE AC.
;FIRST, FXU IS SET; THEN, DCK IS RESET VIA JRST 2,. NEXT, JSP IS EXPECTED; AND
;THE AC IS CHECKED FOR DCK RESET. IF DCK IS RESET IN THE AC, THIS TEST PASSES;
;OTHERWISE, JRST 2, FAILED TO CLEAR DCK OR JSP STORED DCK INCORRECTLY.
C14200: SFLAG DCK ;SET DCK FLAG
SFLAG ;*RESET DCK FLAG
JSP .+1 ;*STORE DCK FLAG IN THE AC
TLNE DCK ;PASS IF DCK IS RESET IN THE AC
STOP
;**********
SUBTTL TEST OF JUMPX INSTRUCTIONS
;**********
;THIS TEST VERIFIES THAT JUMPL IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC) IS NEGATIVE. IN THIS TEST, THE AC CONTAINS -1,,-1. HENCE,
;JUMPL SHOULD JUMP. IF JUMPL JUMPS, THIS TEST PASSES.
C14500: SETO ;PRELOAD AC WITH -1,,-1
JUMPL .+2 ;*JUMPL SHOULD JUMP BECAUSE C(AC) IS NEGATIVE
STOP
;**********
;THIS TEST VERIFIES THAT JUMPL IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC) IS NEGATIVE. IN THIS TEST, THE AC CONTAINS 0. HENCE,
;JUMPL SHOULD NOT JUMP. IF JUMPL DOES NOT JUMP, THIS TEST PASSES.
C14600: SETZ ;PRELOAD AC WITH 0
JUMPL .+2 ;*JUMPL SHOULD NOT JUMP
SKIPA ;PASS IF JUMPL DOES NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT JUMPE IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC)=0. IN THIS TEST, THE AC CONTAINS 0. HENCE,
;JUMPE SHOULD JUMP. IF JUMPE JUMPS, THIS TEST PASSES.
C14700: SETZ ;PRELOAD AC WITH 0
JUMPE .+2 ;*JUMPE SHOULD JUMP
STOP
;**********
;THIS TEST VERIFIES THAT JUMPN IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC) IS NON-ZERO. IN THIS TEST, THE AC CONTAINS 1. HENCE,
;JUMPN SHOULD JUMP. IF JUMPN JUMPS, THIS TEST PASSES.
C15000: MOVEI 1 ;PRELOAD AC WITH 1
JUMPN .+2 ;*JUMPN SHOULD JUMP
STOP
;**********
;THIS TEST VERIFIES THAT JUMPE IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC)=0. IN THIS TEST, THE AC CONTAINS 2. HENCE,
;JUMPL SHOULD NOT JUMP. IF JUMPE DOES NOT JUMP, THIS TEST PASSES.
C15100: MOVEI 2 ;PRELOAD AC WITH 2
JUMPE .+2 ;*JUMPE SHOULD NOT JUMP
SKIPA ;PASS IF JUMPE DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT JUMPN IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC) IS NON-ZERO. IN THIS TEST, THE AC CONTAINS 0. HENCE,
;JUMPN SHOULD NOT JUMP. IF JUMPN DOES NOT JUMP, THIS TEST PASSES.
C15200: SETZ ;PRELOAD AC WITH 0
JUMPN .+2 ;*JUMPN SHOULD NOT JUMP
SKIPA ;PASS IF JUMPN DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT JUMPG IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC) IS GREATER THAN 0. IN THIS TEST, THE AC CONTAINS 1. HENCE,
;JUMPG SHOULD JUMP. IF JUMPG JUMPS, THIS TEST PASSES.
C15300: MOVEI 1 ;PRELOAD AC WITH 1
JUMPG .+2 ;*JUMPG SHOULD JUMP
STOP
;**********
;THIS TEST VERIFIES THAT JUMPG IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF
;C(AC) IS GREATER THAN 0. IN THIS TEST, THE AC CONTAINS -1,,0. HENCE,
;JUMPG SHOULD NOT JUMP. IF JUMPG DOES NOT JUMP, THIS TEST PASSES.
C15400: MOVSI -1 ;PRELOAD AC WITH -1,,0
JUMPG .+2 ;*JUMPG SHOULD NOT JUMP
SKIPA ;PASS IF JUMPG DID NOT JUMP
STOP
;**********
SUBTTL TEST OF AOJ AND SOJ INSTRUCTIONS
;**********
;THIS TEST VERIFIES THAT AOJ ADDS 1 TO THE AC AND DOES NOT JUMP.
;FIRST, THE AC IS PRELOADED WITH 0; THEN, AOJ IS EXECUTED. NEXT, THE
;AC IS CHECKED FOR 1. IF C(AC) IS NOT 1 OR AOJ SKIPPED, THIS TEST FAILS.
C15500: SETZ ;PRELOAD AC WITH 0
AOJ .+2 ;*AOJ SHOULD ADD 1 TO THE AC AND NOT JUMP
CAIE 1 ;PASS IF C(AC)=1 AND AOJ DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT AOJ ADDS 1 TO THE AC AND DOES NOT JUMP.
;FIRST, THE AC IS PRELOADED WITH -1,,-1; THEN, AOJ IS EXECUTED. NEXT, THE
;AC IS CHECKED FOR 0. IF C(AC) IS NOT 0 OR AOJ SKIPPED, THIS TEST FAILS.
C15600: SETO ;PRELOAD AC WITH 0
AOJ .+2 ;*AOJ SHOULD ADD 1 TO THE AC AND NOT JUMP
CAIE 0 ;PASS IF C(AC)=1 AND AOJ DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT SOJ SUBTRACTS 1 FROM THE AC AND DOES NOT JUMP.
;FIRST, THE AC IS PRELOADED WITH 0; THEN, SOJ IS EXECUTED. NEXT, THE
;AC IS CHECKED FOR -1,,-1. IF C(AC) IS NOT -1,,-1 OR SOJ SKIPPED, THIS TEST FAILS.
C15700: SETZ ;PRELOAD AC WITH 0
SOJ .+2 ;*SOJ SHOULD SUBTRACT 1 FROM THE AC AND NOT JUMP
CAME [-1] ;PASS IF C(AC)=-1,,-1 AND SOJ DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT SOJ SUBTRACTS 1 FROM THE AC AND DOES NOT JUMP.
;FIRST, THE AC IS PRELOADED WITH -1,,-1; THEN, SOJ IS EXECUTED. NEXT, THE
;AC IS CHECKED FOR -1,,-2. IF C(AC) IS NOT -1,,-2 OR SOJ SKIPPED, THIS TEST FAILS.
C16000: SETO ;PRELOAD AC WITH -1,,-1
SOJ .+2 ;*SOJ SHOULD SUBTRACT 1 FROM THE AC AND NOT JUMP
CAME [-2] ;PASS IF C(AC)=-1,,-2 AND SOJ DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT SOJ SUBTRACTS 1 FROM THE AC AND DOES NOT JUMP.
;FIRST, THE AC IS PRELOADED WITH 0,,1; THEN, SOJ IS EXECUTED. NEXT, THE
;AC IS CHECKED FOR 0. IF C(AC) IS NOT 0 OR SOJ SKIPPED, THIS TEST FAILS.
C16100: MOVEI 1 ;PRELOAD AC WITH 1
SOJ .+2 ;*SOJ SHOULD SUBTRACT 1 FROM THE AC AND NOT JUMP
CAIE 0 ;PASS IF C(AC)=0 AND SOJ DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT SOJ AC, FOLLOWED BY AOJ AC, HAS NO NET EFFECT ON C(AC).
;IN THIS CASE, THE AC IS PRELOADED WITH 0; THEN, SOJ AC, FOLLOWED BY AOJ.
;AC, IS REPEATED 7 TIMES. THE AC IS THEN CHECKED FOR ITS ORIGINAL CONTENTS, 0.
;IF C(AC)=0, THIS TEST PASSES; OTHERWISE AOJ OR SOJ FAILED.
C16200: AC=17
SETZ AC, ;PRELOAD AC WITH 0
REPEAT ^D10,<
SOJ AC,. ;*SOJ SHOULD SUBTRACT 1 FROM THE AC
AOJ AC,. ;*AOJ SHOULD ADD 1 TO THE AC>
SKIPE AC ;PASS IF C(AC) IS UNCHANGED. I.E. C(AC)=0
STOP
;**********
;THIS TEST VERIFIES THAT SOJ SETS CRY0/1 FLAGS IF C(E) IS A NON-ZERO NUMBER OTHER
;THAN 400000,,0. IN THIS CASE, C(E)=1. FIRST THE FLAGS ARE RESET; THEN
;SOJ IS EXECUTED. THE FLAGS ARE CHECKED. IF CRY0 AND CRY1 ARE SET
;AND AROV AND FOV ARE RESET, THIS TEST PASSES.
C16201: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS
MOVEI 1 ;PRELOAD E WITH 1
SOJ ;*SOJ SHOULD SET CRY0/1
JCRY0 .+2 ;PASS IF CRY0 IS SET
STOP
JCRY1 .+2 ;PASS IF CRY1 IS SET
STOP
JOV .+2 ;PASS IF AROV IS RESET
SKIPA
STOP
JFOV .+2 ;PASS IF FOV IS RESET
SKIPA
STOP
;**********
;THIS TEST VERIFIES THAT AOJ SETS CRY0 AND CRY1 FLAG IF C(E) IS -1,,-1
;FIRST THE FLAGS ARE RESET; THEN
;AOJ IS EXECUTED. THE FLAGS ARE CHECKED.
;IF CRY0 AND CRY1 ARE SET AND AROV AND FOV ARE RESET, THIS TEST PASSES.
C16202: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS
SETO ;PRELOAD E WITH 1
AOJ ;*AOJ SHOULD SET CRY0 AND CRY1
JCRY0 .+2 ;PASS IF CRY0 IS SET
STOP
JCRY1 .+2 ;PASS IF CRY1 IS SET
STOP
JOV .+2 ;PASS IF AROV IS RESET
SKIPA
STOP
JFOV .+2 ;PASS IF FOV IS RESET
SKIPA
STOP
;**********
SUBTTL TEST OF MEMORY, BOTH AND SELF MODE INSTRUCTIONS
;**********
;THIS TEST VERIFIES THAT ADDM DOES NOT MODIFY C(AC)
;BOTH AC AND E ARE PRELOADED WITH -1,,-1. THEN ADDM IS EXECUTED.
;THIS TEST PASSES IF C(AC) ARE UNCHANGED
C16400: SETOB 1 ;PRELOAD AC, E WITH -1,,-1
ADDM 1 ;*ADDM SHOULD NOT AFFECT C(AC)
CAME [-1] ;PASS IF C(AC) IS UNMODIFIED BY ADDM
STOP
;**********
;THIS TEST VERIFIES THAT HRREM DOES NOT MODIFY C(AC)
;THE AC IS PRELOADED WITH 0,,-1. THEN HRRM IS EXECUTED.
;THIS TEST PASSES IF C(AC) ARE UNCHANGED
C16500: MOVEI -1 ;PRELOAD AC WITH 0,,-1
HRREM 1 ;*HRRM SHOULD NOT AFFECT C(AC)
CAIE -1 ;PASS IF C(AC) IS UNMODIFIED BY HRRM
STOP
;**********
;THIS TEST VERIFIES THAT MOVSM DOES NOT MODIFY C(AC)
;THE AC IS PRELOADED WITH 0,,-1. THEN MOVSM IS EXECUTED.
;THIS TEST PASSES IF C(AC) ARE UNCHANGED
C16600: MOVEI -1 ;PRELOAD AC WITH 0,,-1
MOVSM 1 ;*MOVSM SHOULD NOT AFFECT C(AC)
CAIE -1 ;PASS IF C(AC) IS UNMODIFIED BY MOVSM
STOP
;**********
;THIS TEST VERIFIES THAT XORM DOES NOT MODIFY C(AC)
;BOTH AC AND E ARE PRELOADED WITH -1,,-1. THEN XORM IS EXECUTED.
;THIS TEST PASSES IF C(AC) ARE UNCHANGED
C16700: SETOB 1 ;PRELOAD AC, E WITH -1,,-1
XORM 1 ;*XORM SHOULD NOT AFFECT C(AC)
CAME [-1] ;PASS IF C(AC) IS UNMODIFIED BY XORM
STOP
;**********
;THIS TEST VERIFIES THAT ADDB ADDS C(AC) TO C(E) AND PLACES THE
;RESULT IN BOTH AC AND E. IN THIS TEST, BOTH AC AND E ARE PRELOADED
;WITH -1,,-1, THEN, ADDB IS EXECUTED. C(AC) IS THEN COMPARED TO C(E);
;AND C(AC) IS THEN COMPARED TO -2. IF BOTH OF THESE COMPARISONS SUCCEED, THIS
;TEST PASSES; OTHERWISE, ADDB FAILED
C17000: SETOB 1 ;PRELOAD AC, E WITH -1,,-1
ADDB 1 ;*ADDB SHOULD ADD C(AC) TO C(E) AND PLACE RESULT
;INTO BOTH AC AND E
CAME 1 ;PASS IF C(AC)=C(E)
STOP
CAME [-2] ;PASS IF C(AC)=-2
STOP
;**********
;THIS TEST VERIFIES THAT ADDM ADDS C(AC) TO C(E) AND PLACES THE RESULT IN E
;IN THIS CASE, AC, E ARE BOTH PRELOADED WITH -1; THEN, ADDM IS EXECUTED.
;E IS THEN CHECKED FOR -2. IF C(E)=-2, THIS TEST PASSES; OTHERWISE, ADDM FAILED
C17100: SETOB 1 ;PRELOAD AC, E WITH -1,,-1
ADDM 1 ;*ADDM SHOULD ADD C(AC) TO C(E)
CAME 1,[-2] ;PASS IF C(E)=-2
STOP
;**********
;THIS TEST VERIFIES THAT HLLOS PLACES ONES ON THE RIGHT HALF OF E
;BUT DOES NOT AFFECT THE LEFT HALF OF E. IN THIS CASE,
;E IS PRELOADED WITH 0; THE, HLLOS IS EXECUTED. THE RESULT
;IN E SHOULD BE 0,,-1. IF C(E)=0,,-1, THIS TEST PASSES
C17200: SETZM 1 ;PRELOAD E WITH 0
HLLOS 1 ;*HLLOS SHOULD PLACE 0,,-1 INTO E
CAIE 1,-1 ;PASS IF C(E)=0,,-1
STOP
;**********
;THIS TEST VERIFIES THAT MOVSS SWAPS BOTHS HALVES OF E AND
;PLACES THE RESULT IN E. IN THIS CASE, E IS PRELOADED WITH
;-1,,0; THEN, MOVSS IS EXECUTED. THE RESULT IN E SHOULD BE 0,,-1.
;IF C(E)=0,,-1, THIS TEST PASSES
C17300: MOVSI 1,-1 ;PRELOAD E WITH -1,,0
MOVSS 1 ;*MOVSS SHOULD PLACE 0,,-1 INTO E
CAIE 1,-1 ;PASS IF C(E)=0,,-1
STOP
;**********
;THIS TEST VERIFIES THAT AOS ADDS ONE TO MEMORY BUT DOES NOT SKIP
;FIRST, E IS PRELOADED WITH -1,-1; THEN, AOS IS EXECUTED. NEXT, E IS CHECKED FOR 0.
;IF C(E) IS NOT 0 OR AOS SKIPPED, THIS TEST FAILS
C17400: SETOB 1 ;PRELOAD E WITH -1,,-1
AOS 1 ;*AOS SHOULD ADD TO C(E) AND NOT SKIP
CAIE 1,0 ;PASS IF C(E)=0,,0 AND AOS DID NOT SKIP
STOP
;**********
;THIS TEST VERIFIES THAT HRLM PLACES C(AC-RIGHT) INTO E-LEFT AND DOES
;NOT MODIFY E-RIGHT. IN THIS CASE, AC IS PRELOADED WITH 0 AND E IS PRELOADED
;WITH -1,,-1. THEN, HRLM IS EXECUTED. E IS THEN CHECKED FOR 0,,-1. IF
;C(E)=0,,-1, THIS TEST PASSES
C17500: SETZ ;PRELOAD AC WITH 0
SETO 1, ;PRELOAD E WITH -1,,-1
HRLM 1 ;*HRLM SHOULD PLACE 0,,-1 INTO E
CAIE 1,-1 ;PASS IF C(E)=0,,-1
STOP
;**********
;THIS TEST VERIFIES THAT HRRS DOES NOT MODIFY E
;E IS PRELOADED WITH 0 AND AC IS PRELOADED WITH -1,,-1.
;HRRS IS EXECUTED; THEN E IS CHECKED. IF C(E) DOES
;NOT CHANGE, THIS TEST PASSES
C17600: SETO ;PRELOAD AC WITH -1,,-1
SETZ 1, ;PRELOAD E WITH 0,,0
HRRS 1 ;*HRRS SHOULD PLACE 0,,0 INTO E
SKIPE 1
STOP
;**********
;THIS TEST VERIFIES THAT HRRZM PLACES C(AC-RIGHT) INTO E-RIGHT AND PLACES
;ZEROS INTO E-LEFT. IN THIS CASE, AC=E=AC1 AND C(AC)=C(E)=-1,,0. HRRZM
;IS EXECUTED AND AC1 IS CHECKED FOR 0. IF AC1=0, THIS TEST PASSES.
C17700: SETO ;PRELOAD AC0 WITH -1,,-1
MOVSI 1,-1 ;PRELOAD AC1 WITH -1,,0
HRRZM 1,1 ;*HRRZM SHOULD PLACE 0 INTO AC1
SKIPE 1 ;PASS IF C(AC1)=0
STOP
;**********
;THIS TEST VERIFIES THAT JFCL 17,.+1 NEVER JUMPS AND DOES NOT MODIFY C(AC0).
;FIRST, AC0 IS PRELOADED; THEN, JFCL IS EXECUTED. IF AC0 IS MODIFIED
;OR JFCL SKIPS, THIS TEST FAILS
C20000: SETZ ;CLEAR AC0
JFCL 17,.+1 ;*JFCL SHOULD NOT JUMP OR MODIFY C(AC0).
SKIPE ;PASS IF C(AC0)=0 AND JFCL DID NOT JUMP
STOP
;**********
;THIS TEST VERIFIES THAT XORM PERFORMS THE LOGICAL EXCLUSIVE OR FUNCTION
;BETWEEN C(AC) AND C(E) AND PLACES THE RESULT INTO E
;IN THIS CASE, AC AND E ARE PRELOADED WITH -1,,-1; THEN, XORM IS
;EXECUTED. IF THE RESULT IN E IS 0, THE TEST PASSES
C20100: SETOB 1 ;PRELOAD AC,E WITH -1,,-1
XORM 1 ;*XORM SHOULD PLACE 0 INTO E
CAIE 1,0 ;PASS IF C(E)=0
STOP
;**********
;THIS TEST VERIFIES THAT SETZB PLACES ZEROS INTO BOTH AC AND E.
;AFTER SETZB IS EXECUTED, BOTH AC AND E ARE CHECKED
;FOR 0. IF EITHER AC OR E CONTAINS ANY ONES, THIS TEST FAILS
C20200: SETZB 1 ;*SETZB SHOULD PLACE ZEROES IN BOTH AC AND E
CAMN [0] ;FAIL IF C(AC) IS NON-ZERO
CAME 1 ;FAIL IF C(E) IS NON-ZERO
STOP
;**********
;THIS TEST VERIFIES THAT SETAB PLACES C(AC) INTO BOTH AC AND E.
;FIRST, AC IS PRELOADED WITH -1,,-1 AND E IS PRELOADED WITH 0;
;THEN, SETAB IS EXECUTED. BOTH AC AND E ARE CHECKED FOR -1,,-1
;IF EITHER AC OR E CONTAIN ANY ZEROS, THIS TEST FAILS.
C20300: SETZ 1, ;PRELOAD E WITH 0
SETO ;PRELOAD AC WITH -1,,-1
SETAB 1 ;*SETAB SHOULD PLACE -1,,-1 INTO BOTH AC AND E
CAMN [-1] ;FAIL IF C(AC) IS NOT -1,-1
CAME 1 ;FAIL IF C(E) IS NOT -1,,-1
STOP
;**********
SUBTTL XCT INSTRUCTION - BASIC TESTS
;**********
;THIS TEST VERIFIES THAT XCT WILL EXECUTE THE INSTRUCTION SPECIFIED BY C(E)
;IN THIS CASE, C(E) SPECIFIES A MOVEI INSTRUCTION
;AFTER EXECUTING MOVEI, CONTROL SHOULD RETURN TO
;THE NEXT SEQUENTIAL INSTRUCTION FOLLOWING XCT.
;THIS TEST PASSES IF CONTROL RETURNS TO THE NEXT SEQUENTIAL INSTRUCTION FOLLOWING XCT
C20400: SETZB 1 ;CLEAR AC0 AND AC1
XCT [MOVEI 1,.+2] ;*XCT SHOULD RETURN CONTROL TO NEXT INSTRUCTION
SKIPA
STOP
;**********
;THIS TEST VERIFIES THAT XCT WILL EXECUTE THE INSTRUCTION SPECIFIED BY C(E)
;IN THIS CASE, C(E) SPECIFIES A MOVEI INSTRUCTION.
;AFTER EXECUTING MOVEI, THE AC SPECIFIED BY MOVEI IS CHECKED FOR
;0,,1 (THE EXPECTED RESULT). IF C(AC)=0,,1, THIS TEST PASSES
C20500: SETZB 1 ;CLEAR AC
XCT [MOVEI 1,1] ;*XCT OF MOVEI SHOULD PLACE 1 IN THE AC
CAIE 1,1 ;PASS IF C(AC)=1
STOP
;**********
;THIS TEST VERIFIES THAT A NEST OF XCT INSTRUCTIONS WILL EXECUTE
;THE INSTRUCTION SPECIFIED BY THE MOST NESTED XCT AND RETURN CONTROL TO
;THE NEXT SEQUENTIAL INSTRUCTION FOLLOWING THE FIRST XCT.
;IN THIS CASE, THE EXECUTED INSTRUCTION IS MOVEI. AFTER EXECUTING THE MOVEI,
;C(AC) IS CHECKED FOR 0,,-1 (THE EXPECTED RESULT). IF C(AC)=0,,-1, THIS TEST PASSES
C20600: SETZB 1 ;CLEAR AC
XCT [XCT[XCT[XCT[XCT[MOVEI 1,-1]]]]] ;*NESTED XCT OF MOVEI
;SHOULD PLACE 0,,-1 INTO AC
CAIE 1,-1 ;PASS IF C(AC)=0,,-1
STOP
;**********
;THIS TEST VERIFIES THAT XCT WILL NOT MODIFY AN AC WHICH IS NOT SPECIFIED BY THE
;EXECUTED INSTRUCTION. IN THIS CASE, AC0 IS CLEARED AND THEN CHECKED FOR ZERO AFTER
;THE XCT INSTRUCTION IS EXECUTED. AC0 SHOULD NOT BE MODIFIED.
C20700: SETZB 1 ;CLEAR AC0,AC1
XCT [MOVE 1,[-1]] ;*XCT SHOULD NOT MODIFY AC0
SKIPE ;PASS IF AC0 WAS NOT MODIFIED
STOP
;**********
;THIS TEST VERIFIES THAT XCT OF SKIPA SHOULD RETURN CONTROL TO THE
;SECOND SEQUENTIAL INSTRUCTION FOLLOWING XCT
C21000: XCT [SKIPA] ;XCT OF SKIPA SHOULD RETURN CONTROL TO .+2
STOP
;**********
SUBTTL INDIRECT ADDRESSING - BASIC TESTS
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E
;ARE WITHIN THE AC RANGE.
;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE.
;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 0,
;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS
C21100: SETOM 1 ;PRELOAD AC WITH -1,,-1
MOVEI 7,3 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS
SETZM 3 ;PRELOAD INDIRECT ADDRESS WITH 0
MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESSS SHOULD
;PLACE 0 INTO THE AC
SKIPE 1 ;PASS IF C(AC)=0
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E
;ARE WITHIN THE AC RANGE.
;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE.
;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR -1,,-1,
;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS
C21200: SETZM 1 ;PRELOAD AC WITH -1,,-1
MOVEI 7,3 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS
SETOM 3 ;PRELOAD INDIRECT ADDRESS WITH -1,,-1
MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESS SHOULD
;PLACE -1,,-1 INTO THE AC
CAME 1,[-1,,-1] ;PASS IF C(AC)=-1,,-1
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E
;ARE WITHIN THE AC RANGE.
;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE.
;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 707070,,707070,
;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS
C21300: SETZM 1 ;PRELOAD AC WITH 0
MOVEI 7,3 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS
MOVE 3,[707070,,707070] ;PRELOAD INDIRECT ADDRESS WITH 707070,,707070
MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESS SHOULD
;PLACE 707070,,707070 INTO THE AC
CAME 1,[707070,,707070] ;PASS IF C(AC)=707070,,707070
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN E IS WITHIN THE AC RANGE
;AND @E IS BEYOND THE AC RANGE.
;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE.
;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 707070,,707070,
;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS
C21400: JRST .+2
XWD 707070,707070 ;INDIRECT ADDRESS AND ITS DATA
SETZM 1 ;PRELOAD AC WITH 0
MOVEI 7,C21400+1 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS
MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESS SHOULD
;PLACE 707070,,707070 INTO AC
CAME 1,C21400+1 ;PASS IF C(AC)=707070,,707070
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E
;ARE BEYOND THE AC RANGE.
;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE.
;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 202020,,202020,
;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS
C21500: JRST .+3
.+1 ;DIRECT ADDRESS AND ITS DATA
XWD 202020,202020 ;INDIRECT ADDRESS AND ITS DATA
SETZM 1 ;PRELOAD AC WITH 0
MOVE 1,@C21500+1 ;*FWT FROM INDIRECT ADDRESS SHOULD
;PLACE 202020,,202020 INTO AC
CAME 1,C21500+2 ;PASS IF C(AC)=202020,,202020
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E
;ARE BEYOND THE AC RANGE.
;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A CAME.
C21600: JRST .+3
.+1 ;DIRECT ADDRESS AND ITS DATA
XWD 272727,272727 ;INDIRECT ADDRESS AND ITS DATA
MOVE 1,C21600+2 ;PRELOAD AC
CAME 1,@C21600+1 ;*CAME OF DATA FROM INDIRECT ADDRESS - NON-AC RANGE
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN E IS WITHIN THE AC RANGE
;AND @E IS BEYOND THE AC RANGE.
;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A CAME.
C21700: JRST .+2
XWD 252525,252525 ;INDIRECT ADDRESS AND ITS DATA
MOVEI 7,C21700+1 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS
MOVE 1,C21700+1 ;SETUP AC
CAME 1,@7 ;*CAME IF DATA FROM INDIRECT ADDRESS - AC RANGE
STOP
;**********
SUBTTL TEST INDIRECT ADDRESSING WITH INDEXING
;SETUP INDEX REGISTERS
MOVEI 1,-4
MOVEI 3,2
MOVEI 4,10
MOVEI 5,1
MOVEI 6,5
MOVEI 7,7
MOVEI 10,4
MOVEI 11,-6
MOVEI 12,5
MOVEI 13,2
JRST C22000 ;RESUME TEST
;INDIRECT ADDRESSING/INDEXING TEST TABLE
;;;;;;;;;;; ;;;;;;;;;; ;;;;;;;;;;
;DO NOT MODIFY THIS TABLE OR TESTS C21700 THRU C22600 INDEPENDENTLY !
;;;;;;;;;; ;;;;;;;;;; ;;;;;;;;;;
E217: E217A(3)
E220: @E220A
E220B: 220220,,220220
E217A: @E221A ;E221-4
E221B: 221221,,221221
E222A: 217217,,217217 ;E217A+2
E220A: E220B
E221: E221
E221A: E221B
E222: E221
E223A: 223223,,223223
E224A: E224A(4) ;E223-6
222222,,222222 ;E222A+7
E225: E225
E222A(7) ;E222+5
@E225A ;E225+2
E225B: 225225,,225225
E223: E223
E225A: E225B
224224,,224224 ;E224A+10
E226B: 226226,,226226
E223A ;E223+4
E226A: @E226A(5) ;E223+5
E226B ;E226A+1
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE, MOVE 2,@E217 IS TESTED WHERE C(E217)=E217A(3) AND C(3)=0,,2.
;HENCE, THE RESULT IN THE AC SHOULD BE C(E217A+2)=217217,,217217
C22000: SETOM 2 ;INITIALIZE AC
MOVE 2,@E217 ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E217A+2 ;PASS IF C(AC)=217217,,217217
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE, MOVE 2,@E220 IS TESTED WHERE C(E220)=@E220A AND C(E220A)=E220B.
;HENCE, THE RESULT IN THE AC SHOULD BE C(E220B)=220220,,220220
C22100: SETZM 2 ;INITIALIZE AC
MOVE 2,@E220 ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E220B ;PASS IF C(AC)=220220,,220220
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE,E221(1) 2,@E217 IS TESTED WHERE C(1)=-4 AND E221-4=E217A
;HENCE, THE RESULT IN THE AC SHOULD BE C(E217A)=@E221A=20,,E221A
C22200: SETOM 2 ;INITIALIZE AC
MOVE 2,E221(1) ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E217A ;PASS IF C(AC)=@E221A=20,,E221A
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE, MOVE 2,E222(6) IS TESTED WHERE C(6)=5
;HENCE, THE RESULT IN THE AC SHOULD BE C(E222+5)=E222A(7)=7,,E222A
C22300: SETZM 2 ;INITIALIZE AC
MOVE 2,E222(6) ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E222+5 ;PASS IF C(AC)=E222A(7)=7,,E222A
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE, MOVE 2,@E223(10) IS TESTED WHERE C(10)=4 AND C(E223+4)=E223A
;HENCE, THE RESULT IN THE AC SHOULD BE C(E223A)=223223,,223223
C22400: SETOM 2 ;INITIALIZE AC
MOVE 2,@E223(10) ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E223A ;PASS IF C(AC)=223223,,223223
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE, MOVE 2,@E223(11) IS TESTED WHERE C(11)=-6, C(E223-6)=E224A(4) AND C(4)=10
;HENCE, THE RESULT IN THE AC SHOULD BE C(E224A+10)=224224,,224224
C22500: SETZM 2 ;INITIALIZE AC
MOVE 2,@E223(11) ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E224A+10 ;PASS IF C(AC)=224224,,224224
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE, MOVE 2,@E225(13) IS TESTED WHERE C(13)=2, C(E225+2)=@E225A
;AND C(E225A)=E225B
;HENCE, THE RESULT IN THE AC SHOULD BE C(E225B)=225225,,225225
C22600: SETOM 2 ;INITIALIZE AC
MOVE 2,@E225(13) ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E225B ;PASS IF C(AC)=225225,,225225
STOP
;**********
;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY.
;IN THIS CASE, MOVE 2,@E223(12) IS TESTED WHERE C(12)=5, C(E223+5)=@E226A(5),
;C(5)=1 AND C(E226A+1)=E226B
;HENCE, THE RESULT IN THE AC SHOULD BE C(E226B)=226226,,226226
C22700: SETZM 2 ;INITIALIZE AC
MOVE 2,@E223(12) ;TEST INDIRECT ADDRESSING WITH INDEXING
CAME 2,E226B ;PASS IF C(AC)=226226,,226226
STOP
;**********