Trailing-Edge
-
PDP-10 Archives
-
klad_sources
-
klad.sources/mscrat.b36
There are no other files named mscrat.b36 in the archive.
%TITLE 'STIRS TESTS FOR M8622 (CRA) BOARD'
MODULE MSCRAT (
LANGUAGE(BLISS36)
) =
BEGIN
!
! COPYRIGHT (C) 1979 BY
! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
! COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
! OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
! TRANSFERRED.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
! CORPORATION.
!
! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
!
!++
! FACILITY: DECSYSTEM 2020 DIAGNOSTIC RELEASE TAPE 'DSTIR'
!
! ABSTRACT:
!
! THIS MODULE CONTAIN THE TEST ROUTINES FOR THE KS10 STIMULUS/RESPONSE
! (STIRS) DIAGNOSTIC FOR THE M8622 (CRA) BOARD. IT ALSO CONTAINS SEVERAL
! SUPPORTING SUBROUTINES. THE TEST ROUTINES ARE EXECUTED UNDER CONTROL
! OF THE 'MSSTRC' MODULE. THIS MODULE IS LINKED WITH THE 'MSSTRC' AND
! 'MSCRAD' MODULES TO PRODUCE THE 'MSCRA.EXE' FILE.
!
! ENVIRONMENT: RUNS UNDER 'CSL' ON A TOPS-20 SYSTEM.
!
! AUTHOR: RICH MURATORI , CREATION DATE: 23-MAY-79
!
! MODIFIED BY:
!
! RICH MURATORI, 23-MAY-79; VERSION 0.1
!--
!
! TABLE OF CONTENTS:
!
FORWARD ROUTINE
SPEC_DIALOGUE: NOVALUE, !SPECIAL USER DIALOGUE
SPEC_PRT, !SPECIAL FEATURE PRINTING
SPEC_ASK: NOVALUE, !SPECIAL FEATURE QUESTIONS
TEST_INIT: NOVALUE, !INITIALIZATION ROUTINE
CLEAR_CRAM: NOVALUE, !CLEAR CRAM BITS IN CRAM LOC 0
RESET_CRAM: NOVALUE, !DO A 'CRA/M RESET'
WRITE_CRAM: NOVALUE, !WRITE 12 BITS OF DATA INTO CRAM
CLK_DATA: NOVALUE, !CLOCKS 12 BITS OF DATA TO CRA BOARD
READ_DATA, !READS 12 BITS OF DATA FROM CRA BOARD
READ_SBR, !READS KS10 SUBROUTINE STACK RETURN ADDR
EC_BITS, !READS 96 BITS OF CRAM DATA
TST1 : NOVALUE, !READING DIAG MUX WITH DIAG FN = 7
TST2 : NOVALUE, !WRITING AND READING KS10 BUS BITS
TST3 : NOVALUE, !WRITING AND READING CRAM BITS 0-11
TST4 : NOVALUE, !WRITING AND READING CRAM BITS 12-23
TST5 : NOVALUE, !WRITING AND READING CRAM BITS 24-35A
TST6 : NOVALUE, !WRITING AND READING CRAM BITS 24-35B
TST7 : NOVALUE, !RESETTING OF CRAM BITS 0-11
TST8 : NOVALUE, !RESETTING OF CRAM BITS 12-23
TST9 : NOVALUE, !RESETTING OF CRAM BITS 24-35 A&B
TST10 : NOVALUE, !SETTING NEXT CRAM ADDR USING DIAG ADR
TST11 : NOVALUE, !'CURR LOC' CLOCKING
TST12 : NOVALUE, !SETTING NEXT CRAM ADDR USING J FIELD
TST13 : NOVALUE, !BITS 0-35 TEST FOR ALL CRAM LOCS
TST14 : NOVALUE, !CRAM ADDRESS DRIVERS
TST15 : NOVALUE, !'SBR RET' CLOCKING
TST16 : NOVALUE, !'SBR RET' BIT TEST
TST17 : NOVALUE, !SETTING NXT CRAM ADR USING 'SBR RET'
TST18 : NOVALUE, !SUBROUTINE STACK
TST19 : NOVALUE, !'STACK RESET'
TST20 : NOVALUE, !NICOND DISPATCH
TST21 : NOVALUE, !'SKIP 10' WITH 'TRAP CYCLE' INPUT
TST22 : NOVALUE, !CONSOLE EXEC MODE SKIPPING
TST23 : NOVALUE, !'NOT CONTINUE' SKIPPING
TST24 : NOVALUE, !'NOT 1 MSEC TIMER' SKIPPING
TST25 : NOVALUE, !'NOT I/O LATCH' SKIPPING
TST26 : NOVALUE, !'AD EQ 0' SKIPPING
TST27 : NOVALUE, !'SC SIGN BIT' SKIPPING
TST28 : NOVALUE, !'DPM3 SCAD 00' DISPATCHING
TST29 : NOVALUE, !'DPE5 FLAG QR 37' DISPATCHING
TST30 : NOVALUE, !'DPM6 MEMORY CYCLE' DISPATCHING
TST31 : NOVALUE, !BYTE DISPATCHING
TST32 : NOVALUE, !EFFECTIVE ADDRESS MODE DISPATCHING
TST33 : NOVALUE, !DROM DISPATCHING
TST34 : NOVALUE, !'AREAD' DISPATCHING
TST35 : NOVALUE, !PAGE FAIL DISPATCHING TO 7777
TST36 : NOVALUE, !'SKIP 40' SKIPPING
TST37 : NOVALUE, !'SKIP 20' SKIPPING
TST38 : NOVALUE, !'CRA2 RETURN' SIGNAL ASSERTION
TST39 : NOVALUE, !'SPEC/CONSOLE' SIGNAL ASSERTION
TST40 : NOVALUE; !CRAM PARITY DETECTION NETWORK
!
! INCLUDE FILES:
!
REQUIRE 'REGBIT.R36'; !8080 I/O REGISTER BIT DEFINITIONS
REQUIRE 'KSU.R36'; !KS10 MICROCODE MACROS
REQUIRE 'CSLMAC.R36'; !'CSL' INTERFACE MACROS
REQUIRE 'STIRSD.R36'; !LINKAGE TO 'MSSTRC' DEFINITIONS
!
! MACROS:
!
!
! EQUATED SYMBOLS:
!
GLOBAL LITERAL
TEST_VERSION = 1, !VERSION NUMBER FOR THIS MODULE
TEST_EDIT = 1; !EDIT NUMBER FOR THIS MODULE
GLOBAL BIND
MSGFIL = UPLIT(%SIXBIT 'MSCRA',%SIXBIT 'MSG'),
PRGNAM = UPLIT(%ASCIZ 'KS10 STIMULUS-RESPONSE DIAGNOSTIC FOR THE M8622/CRA BOARD');
!
! OWN STORAGE:
!
!
! EXTERNAL REFERENCES:
!
GLOBAL ROUTINE SPEC_DIALOGUE: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION
!
! THIS ROUTINE IS CALLED BY THE MAIN CONTROL MODULE TO PERFORM ANY
! SPECIAL USER DIALOGUE BEFORE THE ACTIVATED FEATURES ARE LISTED.
! SINCE THIS TEST MODULE HAS NO SPECIAL DIALOGUE, THIS ROUTINE IS NUL.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
GLOBAL ROUTINE SPEC_PRT =
!++
! FUNCTIONAL DESCRIPTION
!
! THIS ROUTINE IS CALLED BY THE MAIN CONTROL MODULE TO PRINT ANY SPECIAL
! PROGRAM FEATURES WHICH MAY BE ACTIVATED. SINCE THIS TEST MODULE HAS NO
! SPECIAL FEATURES, THE ROUTINE IS NUL.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
GLOBAL ROUTINE SPEC_ASK: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION
!
! THIS ROUTINE IS CALLED BY THE MAIN CONTROL MODULE TO ASK THE USER IF
! HE/SHE WISHES TO ACTIVATE FEATURES WHICH ARE PECULIAR TO THIS TEST
! MODULE. SINCE THIS MODULE HAS NO SPECIAL FEATURES, THE ROUTINE IS NUL.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
GLOBAL ROUTINE TEST_INIT: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE INITIALIZES THE KS10 HARDWARE BEFORE ANY TESTING IS DONE.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! EXECUTES SEVERAL 8080 COMMAND STRINGS TO WHICH INITIALIZE THE KS10
! HARDWARE.
!
!--
BEGIN
BIND
UC_PTR = PLIT(U_J(0) U_SPEC_MEMCLR U);
RPT_ERR_FLAG = 0; !SET FLAG TO NOT REPORT 8080 CMD ERRORS
PE(0); !TURN OFF 8080 PARITY DETECTION
SC_0(); !TURN OFF SOFT CRAM ERR RECOVERY
LOADUC(0,UC_PTR); !LOAD MEM CLR INSTR
CP_NOSS(3); !EXECUTE INSTR TO CLEAR PAGE FAULT
CLEAR_CRAM(); !CLEAR CRAM BITS IN LOC 0
CP_NOSS(1); !CLOCK ZERO ADDR INTO CURR LOC
WRT204(7); !RESET STACK, DP, AND CRAM LATCHES
WRT204(0);
DM(31,0); !CLEAR KEEP ALIVE AND STATUS WORD SO 8080
! WON'T TRY TO REBOOT IF TESTS GENERATE
! A 'HALTED' MESSAGE.
WRT114(0); !MAKE SURE BUS CONTROL BITS ARE
WRT115(0); !CLEARED IN I/O BUFFERS
SEND_NUL(); !FORCE SENDING OF COMMAND LINE
CHK_ERR_MSG(PAR_ERR); !CHECK IN CASE 'PE (1)' IS STUCK
END;
ROUTINE CLEAR_CRAM: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE DOES A MASTER RESET OF THE KS10 AND DEPOSITS ALL ZEROS
! INTO LOCATION 0 OF THE CRAM.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! DOES A MASTER RESET OF THE KS10 AND DEPOSITS 0 INTO CRAM LOC 0.
!
!--
BEGIN
BIND
DC_0 = UPLIT(%ASCIZ 'LC0,DC0'); !CMD STRING TO DEPOSIT ZEROS
MR(); !DO A KS10 MASTER RESET
SEND_LINE(DC_0,0); !INSURE CRAM BITS ARE CLEARED
END;
ROUTINE RESET_CRAM: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE IS CALLED TO TOGGLE THE 'CRA/M RESET' SIGNAL IN THE
! KS10. THIS CLEARS THE CRAM CONTROL BITS LATCHES.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! CONCATENATES A COMMAND STRING TO ASSERT AND NEGATE THE 'CRA/M RESET'
! BIT IN 8080 REGISTER 204 ONTO THE CUMULATIVE COMMAND LINE.
!
!--
BEGIN
WRT204(CRAM_RESET); !ASSERT CRA/M RESET
WRT204(0); !THEN NEGATE IT
END;
ROUTINE WRITE_CRAM(DIAG_FN,DATA): NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE WRITES THE SPECIFIED DATA INTO A 12-BIT FIELD OF THE
! KS10 CRAM AS DETERMINED BY THE 'DIAG_FN' PARAMETER. THE LOCATION
! WHICH GETS WRITTEN INTO WILL BE WHICHEVER ONE WAS LAST REFERENCED BY
! AN 'LC' OR 'EC' COMMAND.
!
! FORMAL PARAMETERS:
!
! DIAG_FN = DIAGNOSTIC FUNCTION CODE - 0 THRU 7
! DATA = 12 BITS OF DATA TO BE WRITTEN INTO CRAM
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! WRITES SPECIFIED DATA INTO SPECIFIED FIELD OF KS10 CRAM.
!
!--
BEGIN
CLK_DATA(.DATA); !CLOCK DATA TO CRA BOARD
WRT205(.DIAG_FN); !SET DIAG FN
WRT204(CRAM_WRT); !WRITE DATA INTO CRAM
WRT204(0); !CLEAR WRITE BIT
END;
ROUTINE CLK_DATA(DATA): NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE CLOCKS THE SPECIFIED 12-BIT DATA INTO THE CRA BOARD
! TRANSCEIVERS.
!
! FORMAL PARAMETERS:
!
! DATA = 12-BIT DATA
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! CLOCKS 12 BITS OF DATA INTO THE CRA BOARD TRANSCEIVERS.
!
!--
BEGIN
WRT103(.DATA AND %O'377'); !WRITE BITS 28-35 TO REG 103
WRT105((.DATA AND %O'7400')^-8); !WRITE BITS 24-27 TO REG 105
WRT210(BUS_REQ + XMIT_ADR + CRA_R_CLK); !CLOCK DATA INTO CRA BOARD TRANSCEIVERS
END;
ROUTINE READ_DATA =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE READS 12 BITS OF DATA FROM THE CRA BOARD DIAGNOSTIC MUX.
! THE MUX SELECT INPUTS WILL BE DETERMINED BY THE LAST 'LF' COMMAND
! WHICH LOADS THE DIAGNOSTIC FUNCTION CODE.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! 12 BIT DATA READ FROM THE CRA BOARD MUX.
!
! SIDE EFFECTS:
!
! READS 12 BITS OF DATA FROM CRA BOARD MUX.
!
!--
BEGIN
LOCAL
TEMP;
WRT210(BUS_REQ + CRA_T_CLK + CLOSE_LATCH); !READ CRA BOARD DATA INTO TRANSCEIVERS
TEMP = RD_1 AND %O'17'; !GET BITS 24-27
RETURN (.TEMP^8 OR RD_0); !RETURN BITS 24-35
END;
ROUTINE READ_SBR =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE READS THE SUBROUTINE RETURN ADDRESS FROM THE KS10 SUBROUTINE
! STACK. IT DOES THIS BY EXECUTING AN 'EJ' COMMAND AND RETURNING THE
! 'SBR' PORTION OF THE RESPONSE.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! 12 BIT SUBROUTINE RETURN ADDRESS
!
! SIDE EFFECTS:
!
! EXECUTES AN 'EJ' COMMAND.
!
!--
BEGIN
RETURN .(EJ() + 3); !EXECUTE 'EJ' CMD AND RETURN 'SBR'
END;
ROUTINE EC_BITS(ADDR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! THIS ROUTINE READS THE SPECIFIED KS10 CRAM ADDRESS AND RETURNS A POINTER
! TO THE 96-BIT DATA. TO DO THIS IT EXECUTES AN 'EC' COMMAND.
!
! FORMAL PARAMETERS:
!
! ADDR = CRAM ADDRESS TO BE READ
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! POINTER TO 3-WORD BUFFER CONTAINING THE 96-BIT CRAM DATA
!
! POINTER -> CRAM BITS 0-35
! CRAM BITS 36-71
! CRAM BITS 72-95
!
! SIDE EFFECTS:
!
! EXECUTES AN 'EC' COMMAND.
!
!--
BEGIN
LOCAL
TEMP,
PTR;
OWN
EC_BUF: VECTOR[3]; !BUFFER TO RETURN 96-BIT DATA
PTR = EC(.ADDR); !PERFORM AN EC CMD
TEMP = .(.PTR + 3); !GET WORD WITH BITS 0-23 RIGHT ADJUSTED
EC_BUF[0] = .TEMP^12; !LEFT ADJUST BITS 0-23 IN WORD 0 OF BUFFER
TEMP = .(.PTR + 2); !GET WORD WITH BITS 24-59
EC_BUF[0] = .EC_BUF[0] OR ((.TEMP^-24) AND %O'7777'); !ADD BITS 24-35 RIGHT ADJUSTED
EC_BUF[1] = (.TEMP AND %O'77777777')^12; !LEFT ADJUST BITS 36-59
TEMP = .(.PTR + 1); !GET WORD WITH BITS 60-95
EC_BUF[1] = .EC_BUF[1] OR ((.TEMP^-24) AND %O'7777'); !ADD BITS 60-71 RIGHT ADJUSTED
EC_BUF[2] = .TEMP AND %O'77777777'; !PUT BITS 72-95 IN WORD 3 OF BUFFER
RETURN EC_BUF; !RETURN POINTER TO BUFFER
END;
GLOBAL ROUTINE TST1: NOVALUE =
!THIS TEST CHECKS THAT READING FROM THE CRA BOARD WITH DIAG FN = 7
!YIELDS ALL ZEROS.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR205,DR7,LR210,DR111,RP');
LOCAL
ACTUAL;
DO (0) WHILE
BLOCK1: BEGIN
WRT205(7); !SET DIAG FN TO READ ZERO
ACTUAL = READ_DATA(); !READ DATA FROM CRA BOARD
IF .ACTUAL NEQ 0 !DID WE GET BACK ZEROS?
THEN
ERBLK1: BEGIN
ERMCA(1,0,.ACTUAL,4); !NO, REPORT ERROR
INCR J FROM 0 TO 11 BY 1 DO
IF .ACTUAL EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
FAILURE(2);
END;
!*MESSAGE 1
!*STIMULUS:
!* WRT 205/7 - SET DIAG FN = 7 TO READ BACK ZEROS.
!* WRT 210/111 - CLOCK DATA FROM CRA BOARD TO CSL BOARD USING
!* 'CRA T CLK ENABLE'.
!*RESPONSE:
!* DATA READ BACK WAS NOT ALL ZEROS.
IF FLP_CHK(1,FLP_PTR) !GO CHECK FOR FAST ERROR LOOPING
!]ERROR 1
!]DMX7 BUSBUF XCVRS NTWK
!]ERROR 2
!]DFN7 NTWK
THEN
LEAVE BLOCK1 WITH 1;
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST2: NOVALUE =
!THIS TEST CHECKS THAT DATA CAN BE WRITTEN TO AND READ FROM THE CRA
!BOARD. A DATA PATTERN IS CLOCKED INTO THE CRA BOARD TRANSCEIVERS THEN
!IT IS READ BACK USING DIAG FN 11.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR210,DR144,LR205,DR11,LR210,DR111,RP');
OWN
DATA: VECTOR[2] INITIAL(%O'5252',%O'2525');
LOCAL
ERFLG,
DISCREP,
CORRECT,
ACTUAL;
ERFLG = 0; !INIT ERROR FLAG
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
CORRECT = .DATA[.I]; !GET TEST DATA
DO (0) WHILE
BLOCK1: BEGIN
CLK_DATA(.CORRECT); !CLOCK DATA TO CRA BOARD
WRT205(%O'11'); !SET DIAG FN TO READ BUS BITS
ACTUAL = READ_DATA(); !READ DATA FROM CRA BOARD
IF .ACTUAL NEQ .CORRECT !DID DATA MAKE ROUND TRIP OKAY?
THEN
ERBLK1: BEGIN
ERFLG = -1; !SET ERROR FLAG
ERMCA(1,.CORRECT,.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .CORRECT; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!CHECK IF A GROUP OF 4 BITS ARE INCORRECT
INCR J FROM 0 TO 8 BY 4 DO
IF (.DISCREP AND (NOT %O'17'^.J)) EQL 0
THEN
BEGIN
FAILURE(2); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
! IF WE GET THIS FAR THE WHOLE WORD MUST HAVE BEEN IN ERROR.
FAILURE(3);
END;
!*MESSAGE 1
!*STIMULUS:
!* WRT 103/DATA - WRITE DATA PATTERN INTO CSL I/O BUFFER
!* WRT 105/DATA
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 205/11 - SET DIAG FN = 11 TO READ BACK BUS DATA BITS.
!* WRT 210/111 - CLOCK DATA FROM CRA BOARD TO CSL BOARD USING
!* 'CRA T CLK ENABLE'.
!*RESPONSE:
!* DATA READ BACK WAS NOT WHAT WAS WRITTEN TO CRA BOARD.
!]ERROR 1
!]XCVRS BUSBUF DMX11 NTWK
!]ERROR 2
!]XCVRS BUSBUF NTWK
!]ERROR 3
!]TCLKC DFN11 NTWK
IF FLP_CHK(1,FLP_PTR) !GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1;
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
IF .ERFLG EQL 0 !IF WE HAD NO ERRORS IN THIS TEST
THEN
NOERR(1);
!]NO ERROR 1
!]XCVRS BUSBUF DMX11 TCLKC DFN11 NTWK
END;
GLOBAL ROUTINE TST3: NOVALUE =
!THIS TEST CHECKS THAT BITS 0-11 CAN BE WRITTEN INTO AND READ BACK FROM
!A LOCATION IN THE CRAM. THE CRAM ADDRESS IS SET TO ZERO BUT AT THIS
!POINT IN THE TESTING WE DON'T KNOW THAT THE ADDRESS LINES ARE GOOD. IN
!ANY CASE, WE DON'T CARE WHAT ADDRESS IS REALLY BEING ACCCESSED.
!THIS TEST IS CONCERNED WITH VERIFYING THAT THE DIAG FN BITS GET
!DECODED CORRECTLY ON THE CRA BOARD, ALTHOUGH THE DATA LINES TO AND
!FROM THE CRAM ARE ALSO IMPLICITLY CHECKED.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR210,DR144,LR204,DR40,DR0,LR206,DR2,LR210,DR111,RP');
OWN
DATA: VECTOR[2] INITIAL(%O'5252',%O'2525');
LOCAL
ERFLG,
DISCREP,
CORRECT,
ACTUAL;
ERFLG = 0; !INIT ERROR FLAG
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
CORRECT = .DATA[.I]; !GET TEST DATA
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDRESS TO ZERO
WRITE_CRAM(0,.CORRECT); !WRITE PATTERN TO CRAM BITS 0-11
WRT206(SINGLE_CLK); !CLOCK CRAM BITS INTO LATCHES
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 0-11
IF .ACTUAL NEQ .CORRECT !DID DATA MAKE ROUND TRIP OKAY?
THEN
ERBLK1: BEGIN
ERFLG = -1; !SET ERROR FLAG
ERMCA(1,.CORRECT,.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .CORRECT; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(.J+1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!CHECK IF UPPER OR LOWER 6 BITS ARE INCORRECT.
INCR J FROM 0 TO 1 BY 1 DO
IF .DISCREP EQL %O'77'^(.J*6)
THEN
BEGIN
FAILURE(13+.J);
LEAVE ERBLK1;
END;
IF .ACTUAL EQL 0 !IF ACTUAL IS ALL ZEROS
THEN
BEGIN
FAILURE(15); !THEN, 'RESET' MUST BE STUCK
LEAVE ERBLK1;
END;
! IF WE GET THIS FAR THE WHOLE WORD MUST BEEN INCORRECT.
FAILURE(16);
END;
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/0 - SET DIAG FN = 0 TO ACCESS CRAM BITS 0-11
!* WRT 103/DATA - WRITE 'CORRECT' DATA INTO CSL I/O BUFFER
!* WRT 105/DATA
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 0-11.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 210/111 - CLOCK CRAM BITS 0-11 TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 0-11 WERE NOT READ BACK AS THEY WERE WRITTEN.
!]ERROR 1
!]DMX0 CRM0_11 CREG2 NTWK
!]ERROR 2
!]DMX0 CRM0_10 CREG2 NTWK
!]ERROR 3
!]DMX0 CRM0_9 CREG2 NTWK
!]ERROR 4
!]DMX0 CRM0_8 CREG2 NTWK
!]ERROR 5
!]DMX0 CRM0_7 CREG2 NTWK
!]ERROR 6
!]DMX0 CRM0_6 CREG2 NTWK
!]ERROR 7
!]DMX0 CRM0_5 CREG1 NTWK
!]ERROR 8
!]DMX0 CRM0_4 CREG1 NTWK
!]ERROR 9
!]DMX0 CRM0_3 CREG1 NTWK
!]ERROR 10
!]DMX0 CRM0_2 CREG1 NTWK
!]ERROR 11
!]DMX0 CRM0_1 CREG1 NTWK
!]ERROR 12
!]DMX0 CRM0_0 CREG1 NTWK
!]ERROR 13
!]CREG1 CWRT0_5 NTWK
!]ERROR 14
!]CREG2 CWRT6_11 NTWK
!]ERROR 15
!]DFN0 CLKE CLKEN RESET NTWK
!]ERROR 16
!]DFN0 NTWK
IF FLP_CHK(1,FLP_PTR) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
IF .ERFLG EQL 0 !IF WE HAD NO ERRORS IN THIS TEST
THEN
NOERR(1);
!]NO ERROR 1
!]DMX0 CWRT0_5 CWRT6_11 CLKE CLKEN DFN0 NTWK
CLEAR_CRAM(); !ZERO CRAM LOC 0
END;
GLOBAL ROUTINE TST4: NOVALUE =
!THIS TEST CHECKS THAT BITS 12-23 CAN BE WRITTEN INTO AND READ BACK FROM
!A LOCATION IN THE CRAM. THE CRAM ADDRESS IS SET TO ZERO BUT AT THIS
!POINT IN THE TESTING WE DON'T KNOW THAT THE ADDRESS LINES ARE GOOD. IN
!ANY CASE, WE DON'T CARE WHAT ADDRESS IS REALLY BEING ACCCESSED.
!THIS TEST IS CONCERNED WITH VERIFYING THAT THE DIAG FN BITS GET
!DECODED CORRECTLY ON THE CRA BOARD, ALTHOUGH THE DATA LINES TO AND
!FROM THE CRAM ARE ALSO IMPLICITLY CHECKED.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR210,DR144,LR205,DR1,LR204,DR40,DR0,LR206,DR2,LR205,DR4,LR210,DR111,RP');
OWN
DATA: VECTOR[2] INITIAL(%O'5252',%O'2525');
LOCAL
ERFLG,
DISCREP,
CORRECT,
ACTUAL;
ERFLG = 0; !INIT ERROR FLAG
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
CORRECT = .DATA[.I]; !GET TEST DATA
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDRESS TO ZERO
WRITE_CRAM(1,.CORRECT); !WRITE PATTERN TO CRAM BITS 12-23
WRT206(SINGLE_CLK); !CLOCK CRAM BITS INTO LATCHES
WRT205(4); !SET DIAG FN TO READ BACK BITS 12-23
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 12-23
IF .ACTUAL NEQ .CORRECT !DID DATA MAKE ROUND TRIP OKAY?
THEN
ERBLK1: BEGIN
ERFLG = -1; !SET ERROR FLAG
ERMCA(1,.CORRECT,.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .CORRECT; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(.J+1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!CHECK FOR 2-BIT ERRORS WHICH WOULD BE CAUSED BY FAULTY CONTROL REGISTER.
INCR J FROM 0 TO 5 BY 1 DO
IF .DISCREP EQL %O'101'^.J
THEN
BEGIN
FAILURE(13+.J); !THEN BITS 12-17 ARE WRONG
LEAVE ERBLK1;
END;
!CHECK FOR ERROR IN UPPER OR LOWER 6 BITS, BUT NOT BOTH.
INCR J FROM 0 TO 1 BY 1 DO
IF .DISCREP EQL %O'77'^(.J*6)
THEN
BEGIN
FAILURE(19+.J);
LEAVE ERBLK1;
END;
!CHECK FOR DISCREPANCY PATTERNS WHICH INDICATE CLOCK FAULTS
INCR J FROM 0 TO 1 BY 1 DO
IF .DISCREP EQL %O'707'^(.J*6)
THEN
BEGIN
FAILURE(21+.J); !THEN BITS 12-17 ARE WRONG
LEAVE ERBLK1;
END;
IF .ACTUAL EQL 0 !IF ACTUAL IS ALL ZEROS
THEN
BEGIN
FAILURE(23); !THEN, 'RESET' MUST BE STUCK
LEAVE ERBLK1;
END;
! IF WE GET THIS FAR THE WHOLE WORD MUST BEEN INCORRECT.
FAILURE(24);
END;
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/1 - SET DIAG FN = 1 TO ACCESS CRAM BITS 12-23
!* WRT 103/DATA - WRITE 'CORRECT' DATA INTO CSL I/O BUFFER
!* WRT 105/DATA
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 12-23.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 205/4 - SET DIAG FN = 4 TO READ CRAM BITS 12-23.
!* WRT 210/111 - CLOCK CRAM BITS 12-23 TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 12-23 WERE NOT READ BACK AS THEY WERE WRITTEN.
!]ERROR 1
!]DMX4 CRM0_23 CREG8 NTWK
!]ERROR 2
!]DMX4 CRM0_22 CREG7 NTWK
!]ERROR 3
!]DMX4 CRM0_21 CREG6 NTWK
!]ERROR 4
!]DMX4 CRM0_20 CREG5 NTWK
!]ERROR 5
!]DMX4 CRM0_19 CREG4 NTWK
!]ERROR 6
!]DMX4 CRM0_18 CREG3 NTWK
!]ERROR 7
!]DMX4 CRM0_17 CREG8 NTWK
!]ERROR 8
!]DMX4 CRM0_16 CREG7 NTWK
!]ERROR 9
!]DMX4 CRM0_15 CREG6 NTWK
!]ERROR 10
!]DMX4 CRM0_14 CREG5 NTWK
!]ERROR 11
!]DMX4 CRM0_13 CREG4 NTWK
!]ERROR 12
!]DMX4 CRM0_12 CREG3 NTWK
!]ERROR 13
!]CREG8 NTWK
!]ERROR 14
!]CREG7 NTWK
!]ERROR 15
!]CREG6 NTWK
!]ERROR 16
!]CREG5 NTWK
!]ERROR 17
!]CREG4 NTWK
!]ERROR 18
!]CREG3 NTWK
!]ERROR 19
!]CWRT12_17 NTWK
!]ERROR 20
!]CWRT18_23 NTWK
!]ERROR 21
!]CLKJ SYNCH NTWK
!]ERROR 22
!]CLKH SYNCH NTWK
!]ERROR 23
!]SYNCH DFN1 DFN4 RESET NTWK
!]ERROR 24
!]DFN1 DFN4 NTWK
IF FLP_CHK(1,FLP_PTR) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
IF .ERFLG EQL 0 !IF WE HAD NO ERRORS IN THIS TEST
THEN
NOERR(1);
!]NO ERROR 1
!]DFN1 DMX4 DFN4 CLKJ SYNCH CLKH SYNCH CWRT18_23 CWRT12_17 NTWK
CLEAR_CRAM(); !ZERO CRAM LOC 0
END;
GLOBAL ROUTINE TST5: NOVALUE =
!THIS TEST CHECKS THAT BITS 24-35A CAN BE WRITTEN INTO AND READ BACK FROM
!A LOCATION IN THE CRAM. THE CRAM ADDRESS IS SET TO ZERO BUT AT THIS
!POINT IN THE TESTING WE DON'T KNOW THAT THE ADDRESS LINES ARE GOOD. IN
!ANY CASE, WE DON'T CARE WHAT ADDRESS IS REALLY BEING ACCCESSED.
!THIS TEST IS CONCERNED WITH VERIFYING THAT THE DIAG FN BITS GET
!DECODED CORRECTLY ON THE CRA BOARD, ALTHOUGH THE DATA LINES TO AND
!FROM THE CRAM ARE ALSO IMPLICITLY CHECKED.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR210,DR144,LR205,DR2,LR204,DR40,DR0,LR206,DR2,LR205,DR5,LR210,DR111,RP');
OWN
DATA: VECTOR[2] INITIAL(%O'5252',%O'2525');
LOCAL
ERFLG,
DISCREP,
CORRECT,
ACTUAL;
ERFLG = 0; !INIT ERROR FLAG
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
CORRECT = .DATA[.I]; !GET TEST DATA
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDRESS TO ZERO
WRITE_CRAM(2,.CORRECT); !WRITE PATTERN TO CRAM BITS 24-35
WRT206(SINGLE_CLK); !CLOCK CRAM BITS INTO LATCHES
WRT205(5); !SET DIAG FN TO READ BACK BITS 24-35A
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 24-35A
IF .ACTUAL NEQ .CORRECT !DID DATA MAKE ROUND TRIP OKAY?
THEN
ERBLK1: BEGIN
ERFLG = -1; !SET ERROR FLAG
ERMCA(1,.CORRECT,.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .CORRECT; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(.J+1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!CHECK FOR ERROR IN UPPER OR LOWER 6 BITS, BUT NOT BOTH.
INCR J FROM 0 TO 1 BY 1 DO
IF .DISCREP EQL %O'77'^(.J*6)
THEN
BEGIN
FAILURE(13+.J);
LEAVE ERBLK1;
END;
IF .ACTUAL EQL 0 !IF ACTUAL IS ALL ZEROS
THEN
BEGIN
FAILURE(15); !THEN, 'RESET' MUST BE STUCK
LEAVE ERBLK1;
END;
! IF WE GET THIS FAR THE WHOLE WORD MUST BEEN INCORRECT.
FAILURE(16);
END;
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/2 - SET DIAG FN = 2 TO WRITE CRAM BITS 24-35A
!* WRT 103/DATA - WRITE 'CORRECT' DATA INTO CSL I/O BUFFER
!* WRT 105/DATA
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 24-35A.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 205/5 - SET DIAG FN = 5 TO READ CRAM BITS 24-35A.
!* WRT 210/111 - CLOCK CRAM BITS 24-35A TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 24-35A WERE NOT READ BACK AS THEY WERE WRITTEN.
!]ERROR 1
!]DMX5 CRM0_35 CREG8 NTWK
!]ERROR 2
!]DMX5 CRM0_34 CREG7 NTWK
!]ERROR 3
!]DMX5 CRM0_33 CREG6 NTWK
!]ERROR 4
!]DMX5 CRM0_32 CREG5 NTWK
!]ERROR 5
!]DMX5 CRM0_31 CREG4 NTWK
!]ERROR 6
!]DMX5 CRM0_30 CREG3 NTWK
!]ERROR 7
!]DMX5 CRM0_29 CREG8 NTWK
!]ERROR 8
!]DMX5 CRM0_28 CREG7 NTWK
!]ERROR 9
!]DMX5 CRM0_27 CREG6 NTWK
!]ERROR 10
!]DMX5 CRM0_26 CREG5 NTWK
!]ERROR 11
!]DMX5 CRM0_25 CREG4 NTWK
!]ERROR 12
!]DMX5 CRM0_24 CREG3 NTWK
!]ERROR 13
!]CWRT24_29 NTWK
!]ERROR 14
!]CWRT30_35 NTWK
!]ERROR 15
!]SYNCH RESET DFN2 DFN5 NTWK
!]ERROR 16
!]DFN2 DFN5 NTWK
IF FLP_CHK(1,FLP_PTR) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
IF .ERFLG EQL 0 !IF WE HAD NO ERRORS IN THIS TEST
THEN
NOERR(1);
!]NO ERROR 1
!]DFN2 DFN5 DMX5 CWRT24_29 CWRT30_35 NTWK
CLEAR_CRAM(); !ZERO CRAM LOC 0
END;
GLOBAL ROUTINE TST6: NOVALUE =
!THIS TEST CHECKS THAT BITS 24-35B CAN BE WRITTEN INTO AND READ BACK FROM
!A LOCATION IN THE CRAM. THE CRAM ADDRESS IS SET TO ZERO BUT AT THIS
!POINT IN THE TESTING WE DON'T KNOW THAT THE ADDRESS LINES ARE GOOD. IN
!ANY CASE, WE DON'T CARE WHAT ADDRESS IS REALLY BEING ACCCESSED.
!THIS TEST IS CONCERNED WITH VERIFYING THAT THE DIAG FN BITS GET
!DECODED CORRECTLY ON THE CRA BOARD, ALTHOUGH THE DATA LINES TO AND
!FROM THE CRAM ARE ALSO IMPLICITLY CHECKED.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR210,DR144,LR205,DR1,LR204,DR40,DR0,LR206,DR2,LR205,DR6,LR210,DR111,RP');
OWN
DATA: VECTOR[2] INITIAL(%O'5252',%O'2525');
LOCAL
ERFLG,
DISCREP,
CORRECT,
ACTUAL;
ERFLG = 0; !INIT ERROR FLAG
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
CORRECT = .DATA[.I]; !GET TEST DATA
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDRESS TO ZERO
WRITE_CRAM(2,.CORRECT); !WRITE PATTERN TO CRAM BITS 24-35
WRT206(SINGLE_CLK); !CLOCK CRAM BITS INTO LATCHES
WRT205(6); !SET DIAG FN TO READ BACK BITS 24-35B
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 24-35B
IF .ACTUAL NEQ .CORRECT !DID DATA MAKE ROUND TRIP OKAY?
THEN
ERBLK1: BEGIN
ERFLG = -1; !SET ERROR FLAG
ERMCA(1,.CORRECT,.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .CORRECT; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(.J+1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
! IF WE GET THIS FAR THE WHOLE WORD MUST BEEN INCORRECT.
FAILURE(13);
END;
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/2 - SET DIAG FN = 2 TO WRITE CRAM BITS 24-35B
!* WRT 103/DATA - WRITE 'CORRECT' DATA INTO CSL I/O BUFFER
!* WRT 105/DATA
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 24-35B.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 205/6 - SET DIAG FN = 6 TO READ CRAM BITS 24-35B.
!* WRT 210/111 - CLOCK CRAM BITS 24-35B TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 24-35B WERE NOT READ BACK AS THEY WERE WRITTEN.
!]ERROR 1
!]DMX6 CRM0_35 CREG8 NTWK
!]ERROR 2
!]DMX6 CRM0_34 CREG7 NTWK
!]ERROR 3
!]DMX6 CRM0_33 CREG6 NTWK
!]ERROR 4
!]DMX6 CRM0_32 CREG5 NTWK
!]ERROR 5
!]DMX6 CRM0_31 CREG4 NTWK
!]ERROR 6
!]DMX6 CRM0_30 CREG3 NTWK
!]ERROR 7
!]DMX6 CRM0_29 CREG8 NTWK
!]ERROR 8
!]DMX6 CRM0_28 CREG7 NTWK
!]ERROR 9
!]DMX6 CRM0_27 CREG6 NTWK
!]ERROR 10
!]DMX6 CRM0_26 CREG5 NTWK
!]ERROR 11
!]DMX6 CRM0_25 CREG4 NTWK
!]ERROR 12
!]DMX6 CRM0_24 CREG3 NTWK
!]ERROR 13
!]DFN2 DFN6 NTWK
IF FLP_CHK(1,FLP_PTR) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
IF .ERFLG EQL 0 !IF WE HAD NO ERRORS IN THIS TEST
THEN
NOERR(1);
!]NO ERROR 1
!]DFN2 DFN6 DMX6 NTWK
CLEAR_CRAM(); !ZERO CRAM LOC 0
END;
GLOBAL ROUTINE TST7: NOVALUE =
!THIS TEST CHECKS THAT THE 'CRA/M RESET' SIGNAL NEGATES BITS 0-11 IN
!THE CRAM REGISTER.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR210,DR144,LR204,DR40,DR0,LR206,DR2,LR204,DR1,LR210,DR111,RP');
LOCAL
ACTUAL;
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDRESS TO ZERO
WRITE_CRAM(0,%O'7777'); !WRITE ONES TO CRAM BITS 0-11
WRT206(SINGLE_CLK); !CLOCK CRAM BITS INTO LATCHES
WRT204(CRAM_RESET); !ASSERT 'CRA/M RESET'
WRT204(0); !NEGATE IT
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 0-11
IF .ACTUAL NEQ 0 !IF DATA READ BACK IS NOT ZERO
THEN
ERBLK1: BEGIN
ERMCA(1,0,.ACTUAL,4); !THEN REPORT IT
IF (.ACTUAL AND %O'77') EQL 0 !IF BITS 6-11 ARE ZERO,
THEN
BEGIN
FAILURE(1); !THEN 0-5 DIDN'T CLEAR
LEAVE ERBLK1;
END;
IF (.ACTUAL AND %O'7700') EQL 0 !IF BITS 0-5 ARE ZERO,
THEN
BEGIN
FAILURE(2); !THEN 6-11 DIDN'T CLEAR
LEAVE ERBLK1;
END;
!IF WE GET THIS FAR ASSUME WHOLE WORD DID NOT CLEAR
FAILURE(3);
END;
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/0 - SET DIAG FN = 0 TO ACCESS CRAM BITS 0-11
!* WRT 103/377 - WRITES ALL ONES INTO CSL I/O BUFFER
!* WRT 105/17
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 0-11.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 204/1 - ASSERT 'CRA/M RESET'.
!* WRT 204/0 - NEGATE IT.
!* WRT 210/111 - CLOCK CRAM BITS 0-11 TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 0-11 WERE NOT NEGATED BY 'CRA/M RESET'.
!]ERROR 1
!]DMX0 CREG1 NTWK
!]ERROR 2
!]DMX0 CREG2 NTWK
!]ERROR 3
!]DMX0 RESET NTWK
IF FLP_CHK(1,FLP_PTR) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
CLEAR_CRAM(); !ZERO CRAM LOC 0
END;
GLOBAL ROUTINE TST8: NOVALUE =
!THIS TEST CHECKS THAT THE 'CRA/M RESET' SIGNAL NEGATES BITS 12-23 IN
!THE CRAM REGISTER.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'LR210,DR144,LR205,DR1,LR204,DR40,DR0,LR206,DR2,LR204,DR1,LR205,DR4,LR210,DR111,RP');
LOCAL
ACTUAL;
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDRESS TO ZERO
WRITE_CRAM(1,%O'7777'); !WRITE ONES TO CRAM BITS 12-23
WRT206(SINGLE_CLK); !CLOCK CRAM BITS INTO LATCHES
WRT204(CRAM_RESET); !ASSERT 'CRA/M RESET'
WRT204(0); !NEGATE IT
WRT205(4); !SET DIAG FN TO READ BITS 12-23
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 12-23
IF .ACTUAL NEQ 0 !IF DATA READ BACK IS NOT ZERO
THEN
ERBLK1: BEGIN
ERMCA(1,0,.ACTUAL,4); !THEN REPORT IT
!CHECK FOR 2-BIT ERRORS WHICH WOULD BE CAUSED BY FAULTY CONTROL REGISTER.
INCR J FROM 0 TO 5 BY 1 DO
IF (.ACTUAL AND (%O'101'^.J)) EQL 0
THEN
BEGIN
FAILURE(1+.J); !THEN BITS 12-17 ARE WRONG
LEAVE ERBLK1;
END;
!IF WE GET THIS FAR THE WHOLE WORD DIDN'T CLEAR
FAILURE(7);
END;
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/1 - SET DIAG FN = 1 TO ACCESS CRAM BITS 12-23
!* WRT 103/377 - WRITES ALL ONES INTO CSL I/O BUFFER
!* WRT 105/17
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 12-23.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 204/1 - ASSERT 'CRA/M RESET'.
!* WRT 204/0 - NEGATE IT.
!* WRT 205/4 -SET DIAG FN = 4 TO READ CRAM BITS 12-23
!* WRT 210/111 - CLOCK CRAM BITS 12-23 TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 12-23 WERE NOT NEGATED BY 'CRA/M RESET'.
!]ERROR 1
!]DMX4 CREG8 NTWK
!]ERROR 2
!]DMX4 CREG7 NTWK
!]ERROR 3
!]DMX4 CREG6 NTWK
!]ERROR 4
!]DMX4 CREG5 NTWK
!]ERROR 5
!]DMX4 CREG4 NTWK
!]ERROR 6
!]DMX4 CREG3 NTWK
!]ERROR 7
!]RESET NTWK
IF FLP_CHK(1,FLP_PTR) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
CLEAR_CRAM(); !ZERO CRAM LOC 0
END;
GLOBAL ROUTINE TST9: NOVALUE =
!THIS TEST CHECKS THAT THE 'CRA/M RESET' SIGNAL NEGATES BITS 24-35 A&B IN
!THE CRAM REGISTER.
BEGIN
LABEL BLOCK1,ERBLK1,ERBLK2;
BIND
FLP_PTR1 = UPLIT(%ASCIZ 'LR210,DR144,LR205,DR2,LR204,DR40,DR0,LR206,DR2,LR204,DR1,LR205,DR5,LR210,DR111,RP'),
FLP_PTR2 = UPLIT(%ASCIZ 'LR210,DR144,LR205,DR2,LR204,DR40,DR0,LR206,DR2,LR204,DR1,LR205,DR6,LR210,DR111,RP');
LOCAL
ACTUAL;
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDRESS TO ZERO
WRITE_CRAM(2,%O'7777'); !WRITE ONES TO CRAM BITS 24-35A
WRT206(SINGLE_CLK); !CLOCK CRAM BITS INTO LATCHES
WRT204(CRAM_RESET); !ASSERT 'CRA/M RESET'
WRT204(0); !NEGATE IT
WRT205(5); !SET DIAG FN TO READ BITS 24-35A
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 24-35A
IF .ACTUAL NEQ 0 !IF DATA READ BACK IS NOT ZERO
THEN
ERBLK1: BEGIN
ERMCA(1,0,.ACTUAL,4); !THEN REPORT IT
!CHECK FOR 2-BIT ERRORS WHICH WOULD BE CAUSED BY FAULTY CONTROL REGISTER.
INCR J FROM 0 TO 5 BY 1 DO
IF (.ACTUAL AND (%O'101'^.J)) EQL 0
THEN
BEGIN
FAILURE(1+.J); !THEN BITS 12-17 ARE WRONG
LEAVE ERBLK1;
END;
!IF WE GET THIS FAR THE WHOLE WORD DIDN'T CLEAR
FAILURE(7);
END;
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/2 - SET DIAG FN = 2 TO ACCESS CRAM BITS 24-35A
!* WRT 103/377 - WRITES ALL ONES INTO CSL I/O BUFFER
!* WRT 105/17
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 24-35A.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 204/1 - ASSERT 'CRA/M RESET'.
!* WRT 204/0 - NEGATE IT.
!* WRT 205/5 - SET DIAG FN = 5 TO READ CRAM BITS 24-35A
!* WRT 210/111 - CLOCK CRAM BITS 24-35A TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 24-35A WERE NOT NEGATED BY 'CRA/M RESET'.
!]ERROR 1
!]DMX5 CREG8 NTWK
!]ERROR 2
!]DMX5 CREG7 NTWK
!]ERROR 3
!]DMX5 CREG6 NTWK
!]ERROR 4
!]DMX5 CREG5 NTWK
!]ERROR 5
!]DMX5 CREG4 NTWK
!]ERROR 6
!]DMX5 CREG3 NTWK
!]ERROR 7
!]RESET NTWK
IF FLP_CHK(1,FLP_PTR1) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
WRT205(6); !SET DIAG FN TO READ BITS 24-35B
ACTUAL = READ_DATA(); !READ BACK CRAM BITS 24-35B
IF .ACTUAL NEQ 0 !IF DATA READ BACK IS NOT ZERO
THEN
ERBLK2: BEGIN
ERMCA(2,0,.ACTUAL,4); !THEN REPORT IT
!CHECK FOR 2-BIT ERRORS WHICH WOULD BE CAUSED BY FAULTY CONTROL REGISTER.
INCR J FROM 0 TO 5 BY 1 DO
IF (.ACTUAL AND (%O'101'^.J)) EQL 0
THEN
BEGIN
FAILURE(8+.J); !THEN BITS 12-17 ARE WRONG
LEAVE ERBLK2;
END;
!IF WE GET THIS FAR THE WHOLE WORD DIDN'T CLEAR
FAILURE(14);
END;
!*MESSAGE 2
!*STIMULUS:
!* SET CRAM ADDRESS TO ZERO
!* WRT 205/2 - SET DIAG FN = 2 TO ACCESS CRAM BITS 24-35B
!* WRT 103/377 - WRITES ALL ONES INTO CSL I/O BUFFER
!* WRT 105/17
!* WRT 210/144 - CLOCK DATA INTO CRA BOARD TRANSCEIVERS USING
!* 'CRA R CLK'.
!* WRT 204/40 - ASSERT 'CRAM WRITE' TO WRITE DATA INTO CRAM
!* WRT 204/0 - BITS 24-35B.
!* WRT 206/2 - ASSERT 'SINGLE CLK' TO CLOCK CRAM BITS INTO
!* LATCHES.
!* WRT 204/1 - ASSERT 'CRA/M RESET'.
!* WRT 204/0 - NEGATE IT.
!* WRT 205/6 - SET DIAG FN = 6 TO READ CRAM BITS 24-35B
!* WRT 210/111 - CLOCK CRAM BITS 24-35B TO CSL BOARD.
!*RESPONSE:
!* CRAM BITS 24-35B WERE NOT NEGATED BY 'CRA/M RESET'.
!]ERROR 8
!]DMX6 CREG8 NTWK
!]ERROR 9
!]DMX6 CREG7 NTWK
!]ERROR 10
!]DMX6 CREG6 NTWK
!]ERROR 11
!]DMX6 CREG5 NTWK
!]ERROR 12
!]DMX6 CREG4 NTWK
!]ERROR 13
!]DMX6 CREG3 NTWK
!]ERROR 14
!]RESET NTWK
IF FLP_CHK(2,FLP_PTR2) ! GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
CLEAR_CRAM(); !ZERO CRAM LOC 0
END;
GLOBAL ROUTINE TST10: NOVALUE =
!THIS TEST CHECKS THAT THE CRAM ADDRESS CAN BE SET USING THE 'DIAG ADR'.
!THE CRAM REGISTER IS NEGATED USING 'CRA/M RESET'. THIS SELECTS THE
!DIAG ADR INPUTS TO THE DISPATCH MUXS. THEN THE DIAG ADR REGISTER IS
!LOADED WITH A DATA PATTERN. THIS PATTERN SHOULD FEED THROUGH THE
!MUXS AND BE READ BACK AS THE NEXT CRAM ADDRESS.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'X12525,LR205,DR1,LR210,DR111,RP',
%ASCIZ 'X15252,LR205,DR1,LR210,DR111,RP');
MAP
FLP_PTR: VECTOR;
LOCAL
ERFLG,
DISCREP,
ACTUAL,
TST_ADR;
OWN
ADR: VECTOR[2] INITIAL (%O'2525',%O'5252');
ERFLG = 0; !INIT ERROR FLAG
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
TST_ADR = .ADR[.I]; !GET TEST ADDR TO USE
DO (0) WHILE
BLOCK1: BEGIN
SETNXT(.TST_ADR); !LOAD THE TST ADR INTO THE DIAG ADDR REG
WRT205(1); !SET THE DIAG FN TO READ NEXT CRAM ADDR
ACTUAL = READ_DATA(); !READ THE NEXT CRAM ADDR
IF .ACTUAL NEQ .TST_ADR !IF NXT CRAM ADDR IS NOT CORRECT
THEN
ERBLK1: BEGIN
ERMCAS(1,.TST_ADR,.ACTUAL,4,TST_ADR); !THEN REPORT IT
ERFLG = 1; !SET ERROR FLAG
DISCREP = .ACTUAL XOR .TST_ADR; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(.J+1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!CHECK IF A GROUP OF 4 BITS ARE INCORRECT
INCR J FROM 0 TO 2 BY 1 DO
IF (.DISCREP AND (NOT %O'17'^(.J*4))) EQL 0
THEN
BEGIN
FAILURE(13+.J); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!IF ADDR IS ALL ONES THEN 'PAGE FAIL' MUST BE ASSERTED.
IF (.ACTUAL EQL %O'1777') OR
((.ACTUAL AND %O'7760') EQL %O'7760') OR
((.ACTUAL AND %O'17') EQL %O'17')
THEN
BEGIN
FAILURE(16); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
! IF WE GET THIS FAR THE WHOLE WORD MUST BEEN INCORRECT.
FAILURE(17);
END;
!*MESSAGE 1
!*STIMULUS:
!* X1 \O0 - THIS EXECUTES AN 8080 SUBROUTINE WHICH:
!* CLEARS THE CRAM REGISTER,
!* LOADS THE DIAG ADR = \O0.
!* WRT 205/1 - SET DIAG FN = 1 TO READ NEXT CRAM ADDR
!* WRT 210/111 - READ THE NEXT CRAM ADDR
!*RESPONSE:
!* THE NEXT CRAM ADDR IS NOT WHAT WAS WRITTEN AS 'DIAG ADR'.
!]ERROR 1
!]DADR3 AMX11_00 DMX1 SKIP10 NTWK
!]ERROR 2
!]DADR3 AMX10_00 DMX1 NTWK
!]ERROR 3
!]DADR3 AMX9_00 DMX1 NTWK
!]ERROR 4
!]DADR3 AMX8_00 DMX1 NTWK
!]ERROR 5
!]DADR2 AMX7_00 DMX1 NTWK
!]ERROR 6
!]DADR2 AMX6_00 DMX1 NTWK
!]ERROR 7
!]DADR2 AMX5_00 DMX1 NTWK
!]ERROR 8
!]DADR2 AMX4_00 DMX1 NTWK
!]ERROR 9
!]DADR1 AMX3_00 DMX1 NTWK
!]ERROR 10
!]DADR1 AMX2_00 DMX1 NTWK
!]ERROR 11
!]DADR1 AMX1_00 DMX1 NTWK
!]ERROR 12
!]DADR1 AMX0_00 DMX1 NTWK
!]ERROR 13
!]DADR3 NTWK
!]ERROR 14
!]DADR2 NTWK
!]ERROR 15
!]DADR1 NTWK
!]ERROR 16
!]PFBUF NTWK
!]ERROR 17
!]DADR AMX DFN1 NTWK
!]NO ERROR 1
!]DADR DADR1 DADR2 DADR3 AMX_00 DMX1 DFN1 NTWK
IF FLP_CHK(1,FLP_PTR[.I]) !GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
IF .ERFLG EQL 0 !IF WE HAD NO ERRORS THEN
THEN
NOERR(1); !DO FAULT ISOLATION
END;
GLOBAL ROUTINE TST11: NOVALUE =
!THIS TEST CHECKS THAT THE 'CURRENT ADDR' REGISTER GETS CLOCKED
!CORRECTLY. A TEST ADDRESS IS LOADED INTO NEXT CRAM ADDRESS. THEN A
!CPU CLOCK PULSE IS GIVEN WHICH SHOULD CLOCK THE NEXT CRAM ADDR INTO
!THE CURRENT ADDR. THE CURRENT ADDR IS THEN READ BACK VIA DIAG FN 3.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
FLP_PTR = UPLIT(%ASCIZ 'X16314,LR206,DR2,LR205,DR3,X10,LR210,DR111,RP',
%ASCIZ 'X11463,LR206,DR2,LR205,DR3,X10,LR210,DR111,RP');
MAP
FLP_PTR: VECTOR;
LOCAL
ERFLG,
DISCREP,
ACTUAL,
TST_ADR;
OWN
ADR: VECTOR[2] INITIAL (%O'6314',%O'1463');
ERFLG = 0; !INIT ERROR FLAG
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
TST_ADR = .ADR[.I]; !GET TEST ADDR TO USE
DO (0) WHILE
BLOCK1: BEGIN
SETNXT(.TST_ADR); !LOAD THE TST ADR INTO THE DIAG ADDR REG
WRT206(SINGLE_CLK); !CLOCK NEXT ADDR INTO CURR ADDR
WRT205(3); !SET THE DIAG FN TO READ CURRENT CRAM ADDR
SETNXT(0); !SET NXT ADDR=0 SO FAULT IN DIAG
!MUX SELECTION WILL BE DETECTABLE
ACTUAL = READ_DATA(); !READ THE CURRENT CRAM ADDR
IF .ACTUAL NEQ .TST_ADR !IF CURR ADDR IS NOT CORRECT
THEN
ERBLK1: BEGIN
ERFLG = -1; !SET ERROR FLAG
ERMCAS(1,.TST_ADR,.ACTUAL,4,TST_ADR); !THEN REPORT IT
DISCREP = .ACTUAL XOR .TST_ADR; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(.J+1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!CHECK IF A GROUP OF 4 BITS ARE INCORRECT
INCR J FROM 0 TO 2 BY 1 DO
IF (.DISCREP AND (NOT %O'17'^(.J*4))) EQL 0
THEN
BEGIN
FAILURE(13+.J); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
! IF WE GET THIS FAR THE WHOLE WORD MUST BEEN INCORRECT.
FAILURE(13);
END;
!*MESSAGE 1
!*STIMULUS:
!* X1 \O0 - THIS EXECUTES AN 8080 SUBROUTINE WHICH:
!* CLEARS THE CRAM REGISTER,
!* LOADS THE DIAG ADR = \O0.
!* WRT 206/2 - CLOCK NEXT ADDR INTO CURRENT ADDR
!* WRT 205/3 - SET DIAG FN = 3 TO READ CURR LOC
!* X1 0 - THIS EXECUTES AN 8080 SUBROUTINE WHICH:
!* CLEARS THE CRAM REGISTER,
!* LOADS THE DIAG ADR = 0.
!* WRT 210/111 - READ THE CURR LOC
!*RESPONSE:
!* 'CURR LOC' DID NOT GET LOADED CORRECTLY.
!]ERROR 1
!]DADR3 CLOC3 AMX11_00 DMX3 SKIP10 NTWK
!]ERROR 2
!]DADR3 CLOC3 AMX10_00 DMX3 NTWK
!]ERROR 3
!]DADR3 CLOC3 AMX9_00 DMX3 NTWK
!]ERROR 4
!]DADR3 CLOC3 AMX8_00 DMX3 NTWK
!]ERROR 5
!]DADR2 CLOC2 AMX7_00 DMX3 NTWK
!]ERROR 6
!]DADR2 CLOC2 AMX6_00 DMX3 NTWK
!]ERROR 7
!]DADR2 CLOC2 AMX5_00 DMX3 NTWK
!]ERROR 8
!]DADR2 CLOC2 AMX4_00 DMX3 NTWK
!]ERROR 9
!]DADR1 CLOC1 AMX3_00 DMX3 NTWK
!]ERROR 10
!]DADR1 CLOC1 AMX2_00 DMX3 NTWK
!]ERROR 11
!]DADR1 CLOC1 AMX1_00 DMX3 NTWK
!]ERROR 12
!]DADR1 CLOC1 AMX0_00 DMX3 NTWK
!]ERROR 13
!]CLKF CLKEN DADR3 CLOC3 NTWK
!]ERROR 14
!]CLKD CLKEN DADR2 CLOC2 NTWK
!]ERROR 15
!]CLKE CLKEN DADR1 CLOC1 NTWK
!]ERROR 16
!]DFN3 NTWK
IF FLP_CHK(1,FLP_PTR[.I]) !GO CHECK FOR FAST ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
IF .ERFLG EQL 0 !IF WE HAD NO ERRORS IN THIS TEST
THEN
NOERR(1);
!]NO ERROR 1
!]DADR1 DADR2 DADR3 AMX_00 DMX3 CLOC1 CLOC2 CLOC3 DFN3 NTWK
END;
GLOBAL ROUTINE TST12: NOVALUE =
!THIS TEST CHECKS THAT THE J FIELD OF THE MICRO-INSTRUCTION CAN BE
!GATED CORRECTLY THRU THE CRAM ADDRESS MUXS TO PRODUCE THE NEXT CRAM
!ADDRESS. CRAM LOCATION 0 IS LOADED WITH A MICRO-INSTR WHICH HAS A J
!FIELD OF 1 WITH NO DISPATCHING OR SKIPPING. THIS INSTRUCTION IS
!EXECUTED AND THE NEXT CRAM ADDRESS IS CHECKED FOR A 1. THIS IS
!REPEATED FOR NEXT ADDRESSES OF 2,4,8,10,20,40,100,200,400.
BEGIN
LOCAL
PTR,
CORRECT,
ACTUAL;
BIND
TEST_PAT = PLIT(-1,-1,-1),
UC_PTR = PLIT(U_J(0) U);
MAP
PTR: REF VECTOR;
LABEL BLOCK1;
LOADUC(0,UC_PTR);
INCR I FROM 0 TO 11 BY 1 DO
BEGIN
CORRECT = 1^.I; !COMPUTE NEXT ADDR TO BE USED
LOADUC(.CORRECT,TEST_PAT); !WRITE -1 TO CORRECT LOCATION
DO (0) WHILE
BLOCK1: BEGIN
LC(0); !SET CRAM ADDR TO ZERO
MOD_FLD(0,.CORRECT); !MODIFY J FIELD TO TEST ADDR
ACTUAL = STEP_U_NEXT(1); !GIVE PULSE AND READ NXT ADDR
IF .ACTUAL NEQ .CORRECT !IS NEXT ADDR = J FIELD?
THEN
ERRCAS(.I+1,1,.CORRECT,.ACTUAL,4,CORRECT); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD CRAM LOCATION ZERO WITH MICRO-INSTR WITH J FIELD = \O0.
!* CP 1 - GIVE A CLOCK PULSE TO GATE THE J FIELD THRU THE CRAM
!* ADDRESS MUXS.
!*RESPONSE:
!* THE J FIELD DID NOT BECOME THE NEXT CRAM ADDRESS.
!]ERROR 1
!]AMX11 SKIP10 NTWK
!]ERROR 2
!]AMX10 NTWK
!]ERROR 3
!]AMX9 NTWK
!]ERROR 4
!]AMX8 NTWK
!]ERROR 5
!]AMX6_7 NTWK
!]ERROR 6
!]AMX6_7 NTWK
!]ERROR 7
!]AMX4_5 NTWK
!]ERROR 8
!]AMX4_5 NTWK
!]ERROR 9
!]AMX2_3 NTWK
!]ERROR 10
!]AMX2_3 NTWK
!]ERROR 11
!]AMX0_1 NTWK
!]ERROR 12
!]AMX0_1 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
CP(1); !CLOCK CRAM BITS AT 'NEXT ADDR' LOCATION INTO REGISTER
PTR = EC_BITS(-1); !READ BACK THOSE BITS
ACTUAL = .PTR[1]; !GET BITS 36-71
IF .ACTUAL NEQ -1 !ARE ALL BITS ONES AS THEY SHOULD BE?
THEN
ERRCAS(.I+13,2,-1,.ACTUAL,12,CORRECT); !NO, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD CRAM LOCATION \O0 WITH ALL ONES.
!* LOAD CRAM LOCATION ZERO WITH MICRO-INSTR WITH J FIELD = \O0.
!* CP 1 - GIVE A CLOCK PULSE TO GATE THE J FIELD THRU THE CRAM
!* ADDRESS MUXS.
!* CP 1 - GIVE ANOTHER PULSE TO CLOCK CRAM BITS FROM LOCATION
!* \O0 INTO THE CRAM BIT REGISTER.
!* EC - READ BACK THOSE BITS
!*RESPONSE:
!* BITS 36-71 WERE NOT READ BACK AS ONES. THIS IMPLIES THAT THE
!* NEXT ADDRESS BITS WHICH GO TO THE 'CRM' BOARD (CRA1 ADR 00-11)
!* ARE NOT CORRECT, I.E., NOT EQUAL TO \O0. THEREFORE, THE CRAM
!* BITS READ BACK WERE FROM A DIFFERENT LOCATION.
!]ERROR 13
!]AMX11 SKIP10 NTWK
!]ERROR 14
!]AMX10 NTWK
!]ERROR 15
!]AMX9 NTWK
!]ERROR 16
!]AMX8 NTWK
!]ERROR 17
!]AMX6_7 NTWK
!]ERROR 18
!]AMX6_7 NTWK
!]ERROR 19
!]AMX4_5 NTWK
!]ERROR 20
!]AMX4_5 NTWK
!]ERROR 21
!]AMX2_3 NTWK
!]ERROR 22
!]AMX2_3 NTWK
!]ERROR 23
!]AMX0_1 NTWK
!]ERROR 24
!]AMX0_1 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
END;
GLOBAL ROUTINE TST13: NOVALUE =
!THIS TEST CHECKS THAT ONES AND ZEROS CAN BE WRITTEN INTO AND READ FROM
!BITS 0-35 OF EACH CRAM LOCATION.
BEGIN
LABEL BLOCK1,ERBLK1,ERBLK2;
LOCAL
DISCREP,
ADDR,
PTR,
ACTUAL;
BIND
UC_PTR1 = PLIT(0,0,0),
UC_PTR2 = PLIT(-1,-1,-1);
LC(0); !SET CRAM ADDRESS TO 0
PTR = WR_CRAM(0); !GO WRITE ZEROS TO EACH LOC AND CHECK IT
ACTUAL = .(.PTR + 1); !GET ACTUAL DATA
ADDR = .(.PTR); !GET CRAM ADDRESS
IF .ACTUAL NEQ 0 !IF ACTUAL NOT EQUAL TO ZERO, HAD ERROR
THEN
ERBLK1: BEGIN
ERMCAS(1,0,.ACTUAL,12,ADDR); !REPORT ERROR
INCR I FROM 0 TO 35 BY 1 DO
IF .ACTUAL EQL 1^.I !CHECK FOR SINGLE BIT ERROR
THEN
BEGIN
FAILURE(.I+1); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!IF WE GET THIS FAR IT IS A MULTIPLE BIT ERROR, SO JUST CALL OUT ALL
!CRAM CHIPS.
FAILURE(37);
END;
!*MESSAGE 1
!*STIMULUS:
!* WRITE ZEROS TO BITS 0-35 OF CRAM LOCATION \O0.
!*RESPONSE:
!* NON-ZERO DATA WAS READ BACK FROM LOCATION \O0.
!]ERROR 1
!]CRAM35 NTWK
!]ERROR 2
!]CRAM34 NTWK
!]ERROR 3
!]CRAM33 NTWK
!]ERROR 4
!]CRAM32 NTWK
!]ERROR 5
!]CRAM31 NTWK
!]ERROR 6
!]CRAM30 NTWK
!]ERROR 7
!]CRAM29 NTWK
!]ERROR 8
!]CRAM28 NTWK
!]ERROR 9
!]CRAM27 NTWK
!]ERROR 10
!]CRAM26 NTWK
!]ERROR 11
!]CRAM25 NTWK
!]ERROR 12
!]CRAM24 NTWK
!]ERROR 13
!]CRAM23 NTWK
!]ERROR 14
!]CRAM22 NTWK
!]ERROR 15
!]CRAM21 NTWK
!]ERROR 16
!]CRAM20 NTWK
!]ERROR 17
!]CRAM19 NTWK
!]ERROR 18
!]CRAM18 NTWK
!]ERROR 19
!]CRAM17 NTWK
!]ERROR 20
!]CRAM16 NTWK
!]ERROR 21
!]CRAM15 NTWK
!]ERROR 22
!]CRAM14 NTWK
!]ERROR 23
!]CRAM13 NTWK
!]ERROR 24
!]CRAM12 NTWK
!]ERROR 25
!]CRAM11 NTWK
!]ERROR 26
!]CRAM10 NTWK
!]ERROR 27
!]CRAM9 NTWK
!]ERROR 28
!]CRAM8 NTWK
!]ERROR 29
!]CRAM7 NTWK
!]ERROR 30
!]CRAM6 NTWK
!]ERROR 31
!]CRAM5 NTWK
!]ERROR 32
!]CRAM4 NTWK
!]ERROR 33
!]CRAM3 NTWK
!]ERROR 34
!]CRAM2 NTWK
!]ERROR 35
!]CRAM1 NTWK
!]ERROR 36
!]CRAM0 NTWK
!]ERROR 37
!]CRAM NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
WHILE 1 DO
BEGIN
LOADUC(.ADDR,UC_PTR1); !WRITE ZEROS TO CRAM
EC(.ADDR); !READ THEM BACK
END;
LC(0); !SET CRAM ADDRESS TO 0
PTR = WR_CRAM(-1); !GO WRITE ONES TO EACH LOC AND CHECK IT
ACTUAL = .(.PTR + 1); !GET ACTUAL DATA
ADDR = .(.PTR); !GET CRAM ADDRESS
IF .ACTUAL NEQ -1 !IF ACTUAL NOT EQUAL TO ONES, HAD ERROR
THEN
ERBLK2: BEGIN
ERMCAS(1,-1,.ACTUAL,12,ADDR); !REPORT ERROR
DISCREP = .ACTUAL XOR -1; !COMPUTE DISCREPANCIES
INCR I FROM 0 TO 35 BY 1 DO
IF .DISCREP EQL 1^.I !CHECK FOR SINGLE BIT ERROR
THEN
BEGIN
FAILURE(.I+1); !DO FAULT ISOLATION
LEAVE ERBLK2;
END;
!IF WE GET THIS FAR IT IS A MULTIPLE BIT ERROR, SO JUST CALL OUT ALL
!CRAM CHIPS.
FAILURE(37);
END;
!*MESSAGE 1
!*STIMULUS:
!* WRITE ONES TO BITS 0-35 OF CRAM LOCATION \O0.
!*RESPONSE:
!* DATA WHICH WAS NOT ALL ONES WAS READ BACK FROM LOCATION \O0.
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
WHILE 1 DO
BEGIN
LOADUC(.ADDR,UC_PTR2); !WRITE ZEROS TO CRAM
EC(.ADDR); !READ THEM BACK
END;
END;
GLOBAL ROUTINE TST14: NOVALUE =
!THIS TEST CHECKS THAT THE ADDRESSING LOGIC FOR THE CRAM WORKS
!CORRECTLY.
BEGIN
LABEL BLOCK1;
BIND
ONES = PLIT(-1,-1,-1),
ZEROS = PLIT(0,0,0);
LOCAL
BITS,
ACTUAL,
PTR,
OTHER_ADR;
MAP
PTR: REF VECTOR;
DO (0) WHILE
BLOCK1: BEGIN
INCR I FROM 0 TO 10 BY 1 DO
BEGIN
OTHER_ADR = 1^.I; !COMPUTE OTHER ADDR
LOADUC(0,ZEROS); !WRITE ALL ZEROS INTO TEST ADDR
LOADUC(.OTHER_ADR,ONES); !WRITE ONES INTO OTHER ADDR
PTR = EC_BITS(0); !READ BACK CONTENTS OF TEST ADDR
ACTUAL = .PTR[0]; !GET BITS 0-35
IF .ACTUAL NEQ 0 !CHECK THAT TEST ADDR STAYED ZEROS
THEN
ERRCAS(.I+1,1,0,.ACTUAL,12,OTHER_ADR); !REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* WRITE ZEROS INTO BITS 0-35 OF CRAM LOCATION 0.
!* WRITE ONES INTO BITS 0-35 OF CRAM LOCATION \O0.
!*RESPONSE:
!* BITS 0-35 READ BACK FROM LOCATION 0 ARE NOT ALL ZEROS. THIS
!* IMPLIES THAT WRITING INTO LOCATION \O0 REALLY WROTE INTO
!* LOCATION 0, OR VICE-VERSA.
!]ERROR 1
!]CADR11 NTWK
!]ERROR 2
!]CADR10 NTWK
!]ERROR 3
!]CADR9 NTWK
!]ERROR 4
!]CADR8 NTWK
!]ERROR 5
!]CADR7 NTWK
!]ERROR 6
!]CADR6 NTWK
!]ERROR 7
!]CADR5 NTWK
!]ERROR 8
!]CADR4 NTWK
!]ERROR 9
!]CADR3 NTWK
!]ERROR 10
!]CADR2 NTWK
!]ERROR 11
!]CADR1 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
IF (.PTR[1] NEQ 0) OR !ARE BITS 36-71 ZEROS
(.PTR[2] NEQ 0) !ARE BITS 72-95 ZEROS
THEN
ERRCAS(.I+12,2,ZEROS,.PTR + 1,20,OTHER_ADR); !NO, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* WRITE ZEROS INTO BITS 36-95 OF CRAM LOCATION 0.
!* WRITE ONES INTO BITS 36-95 OF CRAM LOCATION \O0.
!*RESPONSE:
!* BITS 36-95 READ BACK FROM LOCATION 0 ARE NOT ALL ZEROS. THIS
!* IMPLIES THAT WRITING INTO LOCATION \O0 REALLY WROTE INTO
!* LOCATION 0, OR VICE-VERSA.
!]ERROR 12
!]AMX11 SKIP10 NTWK
!]ERROR 13
!]AMX10 NTWK
!]ERROR 14
!]AMX9 NTWK
!]ERROR 15
!]AMX8 NTWK
!]ERROR 16
!]AMX6_7 NTWK
!]ERROR 17
!]AMX6_7 NTWK
!]ERROR 18
!]AMX4_5 NTWK
!]ERROR 19
!]AMX4_5 NTWK
!]ERROR 20
!]AMX2_3 NTWK
!]ERROR 21
!]AMX2_3 NTWK
!]ERROR 22
!]AMX0_1 NTWK
!]ERROR 23
!]AMX0_1 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
END;
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST15: NOVALUE =
!THIS TEST CHECKS THAT THE SUBROUTINE RETURN ADDRESS, 'SBR RET', DOES
!NOT GET WRITTEN IF NO 'CALL' IS MADE.
!A DATA PATTERN IS LOADED INTO THE NEXT CRAM ADDRESS AND A SINGLE CLOCK
!PULSE IS GENERATED. THIS CLOCKS THE ADDRESS INTO 'CURR LOC' AND WRITES
!IT INTO THE SUBROUTINE STACK. THEN ANOTHER CLOCK PULSE IS GENERATED.
!SINCE 'CALL OR RETURN' IS NOT ASSERTED, THE 'SBR RET' LATCHES SHOULD
!NOT GET CLOCKED WITH THE DATA PATTERN FROM THE STACK.
BEGIN
LABEL BLOCK1;
LOCAL
ADDR,
CORRECT,
ACTUAL;
BIND
UC_PTR = PLIT( U_J(0) U);
DO (0) WHILE
BLOCK1: BEGIN
CORRECT = READ_SBR(); !SET CORRECT = 'SBR RET'
ADDR = NOT .CORRECT; !SET TEST ADDR = COMPLEMENT OF THAT
CLEAR_CRAM(); !MAKE SURE CRAM BITS ARE ZERO
LOADUC(.ADDR,UC_PTR); !LOAD NOP MICRO-INSTR INTO ADDR
CP(2); !CLOCK ADDR INTO 'CURR LOC'
ACTUAL = READ_SBR(); !READ 'SBR RET'
IF .ACTUAL NEQ .CORRECT !'SBR RET' SHOULDN'T HAVE CHANGED
THEN
ERRCAS(1,1,.CORRECT,.ACTUAL,4,ADDR);
!*MESSAGE 1
!*STIMULUS:
!* SET CRAM ADDRESS = THE COMPLEMENT OF THE PRESENT VALUE OF
!* 'SBR RET'.
!* GENERATE 2 CPU CLOCK PULSES - THE FIRST WILL CLOCK THE CRAM
!* ADDRESS INTO 'CURR LOC' AND INTO THE STACK. SINCE
!* 'CALL OR RETURN' SHOULD BE NEGATED, THE 2ND PULSE
!* SHOULD NOT CLOCK THE ADDRESS INTO 'SBR RET'.
!*RESPONSE:
!* THE VALUE OF 'SBR RET' CHANGED.
!]ERROR 1
!]PFBUF RTN CALLRTN NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST16: NOVALUE =
! THIS TEST CHECKS THAT ADDRESSES CAN BE CLOCKED FROM THE 'CURR LOC'
! LATCHES THRU THE SUBROUTINE STACK AND INTO THE 'SBR RET' LATCHES. THE
! CRAM LOCATION CORRESPONDING TO THE TEST PATTERN ADDRESS IS LOADED WITH
! A CALL INSTRUCTION. THE NEXT ADDRESS IS THEN SET TO BE THAT ADDRESS.
! TWO CLOCK PULSES ARE GENERATED. THE FIRST WILL CLOCKED THE ADDRESS
! INTO 'CURR LOC'. THE 2ND WILL DO THE CALL AND CLOCKED THE ADDRESS
! INTO 'SBR RET'.
BEGIN
OWN
ADR_TAB: VECTOR[4] INITIAL(%O'4210',%O'2104',%O'1042',%O'0421');
BIND
UC_PTR = PLIT(U_CALL U);
LOCAL
DISCREP,
CORRECT,
ACTUAL;
LABEL BLOCK1,ERBLK1;
INCR I FROM 0 TO 3 BY 1 DO
BEGIN
CORRECT = .ADR_TAB[.I];
DO (0) WHILE
BLOCK1: BEGIN
LOADUC(.CORRECT,UC_PTR); !LOAD CALL INSTR AT TEST ADDR
CP(2); !GIVE 2 CLK PULSES
ACTUAL = READ_SBR(); !READ 'SBR RET' VALUE
IF .ACTUAL NEQ .CORRECT !DID ADDR GET LATCHED INTO 'SBR RET'?
THEN
ERBLK1: BEGIN
ERMCAS(1,.CORRECT,.ACTUAL,4,CORRECT); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .CORRECT; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE((.J+4) MOD 4); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!IF WE GET THIS FAR, THE WHOLE WORD IS INCORRECT.
FAILURE(4);
END
ELSE
NOERR(1);
!*MESSAGE 1
!*STIMULUS:
!* LOAD CRAM ADDR \O0 WITH A CALL MICROINSTRUCTION.
!* CP 2 - THE FIRST CLOCK PULSE WILL CLOCK THE CRAM ADDR INTO
!* 'CURR LOC' AND THE CALL MICRO-INSTR INTO THE LATCHES.
!* THE 2ND PULSE SHOULD EXECUTE THE CALL MICRO-INSTR.
!* THIS SHOULD CLOCK THE 'CURR LOC' CONTENTS THRU THE
!* SUBROUTINE STACK RAM AND INTO THE 'SBR RET' LATCHES.
!*RESPONSE:
!* THE VALUE CLOCKED INTO 'SBR RET' IS NOT EQUAL TO THE ORIGINAL
!* CRAM ADDR.
!]ERROR 1
!]CLOC3 STACK3 DMX2 SBRET3 NTWK
!]ERROR 2
!]CLOC2 STACK2 DMX2 SBRET2 NTWK
!]ERROR 3
!]CLOC1 STACK1 DMX2 SBRET1 NTWK
!]ERROR 4
!]STKWRT FRSTCYC SYNCH TCLKB DFN2 CLKD CLKEN CALLRTN NTWK
!]NO ERROR 1
!]SBRET1 SBRET2 SBRET3 STKWRT CLKD CLKEN FRSTCYC SYNCH TCLKB NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
END;
GLOBAL ROUTINE TST17: NOVALUE =
!THIS TEST CHECKS THAT THE 'SBR RET' ADDRESS CAN BE GATED CORRECTLY THRU
!THE CRAM ADDRESS MUXS. A TEST CRAM ADDRESS IS LOADED WITH A CALL
!MICROINSTRUCTION TO ANOTHER CRAM ADDRESS. THAT ADDRESS IS LOADED WITH
!A RETURN MICROINSTRUCTION. TWO CLOCK PULSES ARE GIVEN. THE 2ND SHOULD
!CLOCK THE RETURN ADDRESS INTO 'SBR RET' AND THE RETURN MICROINSTR INTO
!THE CONTROL LATCHES. THIS WILL SELECT THE 'SBR RET' INPUTS TO THE CRAM
!ADDR MUXS. SINCE THE DIAG ADDRESS WILL BE THE SAME VALUE AS THE 'SBR
!RET' SHOULD BE, TO AVOID MASKING A MUX SELECT FAULT, THE DIAG ADDR IS
!CHENGED BEFORE READING BACK THE NEXT CRAM ADDR VALUE.
BEGIN
OWN
ADR_TAB: VECTOR[2] INITIAL(%O'7777',0);
BIND
UC_PTR1 = PLIT(U_CALL U_J(707) U),
UC_PTR2 = PLIT(U_DISP_RETURN U);
LOCAL
DISCREP,
CORRECT,
ACTUAL;
LABEL BLOCK1,ERBLK1;
INCR I FROM 0 TO 1 BY 1 DO
BEGIN
CORRECT = .ADR_TAB[.I];
DO (0) WHILE
BLOCK1: BEGIN
LOADUC(%O'707',UC_PTR2); !LOAD RETURN INSTR
LOADUC(.CORRECT,UC_PTR1); !LOAD CALL INSTR AT TEST ADDR
CP(2); !GIVE 2 CLK PULSES
CLK_DATA(NOT .CORRECT); !SET DIAG ADDR TO COMP OF EXPECTED
WRT204(CRAM_ADR_LD); !LOAD DIAG ADR
WRT204(0);
ACTUAL = EX_NXT; !READ NEXT CRAM ADDR
IF .ACTUAL NEQ .CORRECT !DID ADDR GATE THRU TO CRAM ADDR?
THEN
ERBLK1: BEGIN
ERMCAS(1,.CORRECT,.ACTUAL,4,CORRECT); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .CORRECT; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J !IS THERE A SINGLE BIT ERROR?
THEN
BEGIN
FAILURE(.J +1); !GO DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!IF WE GET THIS FAR, THE WHOLE WORD IS INCORRECT.
FAILURE(13);
END
ELSE
NOERR(1);
!*MESSAGE 1
!*STIMULUS:
!* LOAD CRAM ADDR \O0 WITH A CALL MICROINSTRUCTION.
!* LOAD CRAM ADDR 707 WITH RETURN MICROINSTRUCTION.
!* CP 2 - THE FIRST CLOCK PULSE WILL CLOCK THE CRAM ADDR INTO
!* 'CURR LOC' AND THE CALL MICRO-INSTR INTO THE LATCHES.
!* THE 2ND PULSE SHOULD EXECUTE THE CALL MICRO-INSTR.
!* THIS SHOULD CLOCK THE 'CURR LOC' CONTENTS THRU THE
!* SUBROUTINE STACK RAM AND INTO THE 'SBR RET' LATCHES.
!* IT WILL ALSO LATCH THE RETURN MICRO-INSTR WHICH IN
!* TURN WILL SELECT THE 'SBR RET' INPUTS TO THE CRAM
!* ADDR MUXS.
!*RESPONSE:
!* THE NEXT CRAM ADDR IS NOT EQUAL TO THE 'SBR RET' ADDRESS.
!]ERROR 1
!]AMX11 SKIP10 SBRET1 STACK1 NTWK
!]ERROR 2
!]AMX10 SBRET1 STACK1 NTWK
!]ERROR 3
!]AMX9 SBRET1 STACK1 NTWK
!]ERROR 4
!]AMX8 SBRET1 STACK1 NTWK
!]ERROR 5
!]AMX6_7 SBRET2 STACK2 NTWK
!]ERROR 6
!]AMX6_7 SBRET2 STACK2 NTWK
!]ERROR 7
!]AMX4_5 SBRET2 STACK2 NTWK
!]ERROR 8
!]AMX4_5 SBRET2 STACK2 NTWK
!]ERROR 9
!]AMX2_3 SBRET1 STACK3 NTWK
!]ERROR 10
!]AMX2_3 SBRET1 STACK3 NTWK
!]ERROR 11
!]AMX0_1 SBRET1 STACK3 NTWK
!]ERROR 12
!]AMX0_1 SBRET1 STACK3 NTWK
!]ERROR 13
!]CLKD CLKEN CALLRTN STKWRT FRSTCYC SYNCH TCLKB NTWK
!]NO ERROR 1
!]CLKD CLKEN STKWRT FRSTCYC SYNCH TCLKB SBRET1 SBRET2 SBRET3 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
END;
GLOBAL ROUTINE TST18: NOVALUE =
!THIS TEST CHECKS THAT THE SUBROUTINE STACK WORKS CORRECTLY. IT EXECUTES
!15 MICRO-INSTRUCTIONS WHICH DO SUBROUTINE CALLS, THEN EXECUTES 15
!INSTRS WHICH DO RETURNS. AFTER EACH RETURN, THE NEXT CRAM ADDR IS
!CHECKED FOR CORRECTNESS.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
UC_PTR = PLIT(U_J(2) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(4) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(6) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(10) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(12) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(14) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(16) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(20) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(22) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(24) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(26) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(30) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(32) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(34) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(36) U_CALL U,
U_J(1) U_DISP_RETURN U,
U_J(1) U_DISP_RETURN U);
LOCAL
DISCREP,
NUMCLKS,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICRO-INSTRS
WRT204(STK_RESET); !RESET STACK
WRT204(0);
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0);
CP(15); !EXECUTE ALL THE CALL INSTRS
DECR I FROM 29 TO 1 BY 2 DO
BEGIN
ACTUAL = STEP_U_NEXT(1); !EXECUTE RETURN AND READ NEXT ADDR
IF .ACTUAL NEQ .I !ARE WE AT CORRECT RETURN ADDR?
THEN
ERBLK1: BEGIN
NUMCLKS = (31-.I)/2; !COMPUTE # OF RETURN CLK PULSES
ERMCAS(1,.I,.ACTUAL,4,NUMCLKS); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR .I; !COMPUTE DISCREPANCIES
!CHECK IF A GROUP OF 4 BITS ARE INCORRECT
INCR J FROM 0 TO 2 BY 1 DO
IF (.DISCREP AND (NOT %O'17'^(.J*4))) EQL 0
THEN
BEGIN
FAILURE(1+.J); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
!IF WE GET THIS FAR THE WHOLE WORD IS WRONG
FAILURE(4);
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRUCTIONS STARTING AT LOCATION 0 WHICH WILL
!* EXECUTE 15 'CALLS' FROM EVEN LOCATIONS, I.E., FROM 0 TO
!* 2 TO 4 TO 6 ETC. LOCATION 36 AND ALL ODD LOCATIONS UP
!* TO THAT CONTAIN 'RETURNS' WITH A J FIELD OF 1.
!* X1 0 - SET CRAM ADDRESS TO 0.
!* CP 15 - EXECUTE THE 15 CALL INSTRUCTIONS.
!* CP \O0 - EXECUTE \O0 RETURN INSTRUCTIONS.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS IS NOT CORRECT.
!]ERROR 1
!]RTN CALLRTN STKADR STACK3 TCLKB STKRST PFBUF NTWK
!]ERROR 2
!]RTN CALLRTN STKADR STACK2 TCLKB STKRST PFBUF NTWK
!]ERROR 3
!]RTN CALLRTN STKADR STACK1 TCLKB STKRST PFBUF NTWK
!]ERROR 4
!]STKADR RTN CALLRTN TCLKB STKRST PFBUF NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
END;
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST19: NOVALUE =
!THIS TEST CHECKS THAT THE SUBROUTINE STACK POINTER GETS RESET WHEN
!A 'STACK RESET' IS DONE.
! A MICROINSTRUCTION AT LOCATION ZERO JUMPS TO LOCATION 2. FROM
! LOCATION 2, A CALL IS EXECUTED TO LOCATION 4. THERE A CALL IS
! EXECUTED TO LOCATION 6. THEN A 'STACK RESET' IS DONE AND A RETURN
! INSTRUCTION IS EXECUTED. THIS RETURN SHOULD GO TO LOCATION 2 INSTEAD
! OF 4.
BEGIN
LABEL BLOCK1;
BIND
UC_PTR = PLIT(U_J(2) U,
U,
U_J(4) U_CALL U,
U,
U_J(6) U_CALL U,
U,
U_DISP_RETURN U);
LOCAL
ACTUAL;
WRT204(STK_RESET); !DO A STACK RESET
WRT204(0);
LOADUC(0,UC_PTR); !LOAD MICRO-INSTRS
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0);
CP(3); !EXECUTE ALL THE CALL INSTRS
WRT204(STK_RESET); !DO A STACK RESET
WRT204(0);
ACTUAL = STEP_U_NEXT(1); !EXECUTE RETURN AND READ NEXT ADDR
IF .ACTUAL NEQ 2 !ARE WE AT CORRECT RETURN ADDR?
THEN
ERRCA(1,2,.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRUCTIONS TO JUMP FROM 0 TO 2, DO A CALL FROM 2 TO
!* 4, DO A CALL FROM 4 TO 6, AND DO A RETURN FROM 6.
!* X1 0 - SET THE CRAM ADDRESS TO ZERO.
!* CP 3 - THREE CLOCK PULSES EXECUTE THE CALL INSTRS AT LOCS 2
!* AND 4.
!* WRT 204/2 - DO A STACK RESET.
!* WRT 204/0
!* CP 1 - EXECUTE THE RETURN INSTR AT LOC 6. AFTER THE STACK
!* RESET, THIS SHOULD CAUSE THE NEXT CRAM ADDR TO BE 2
!* INSTEAD OF 4.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS AFTER EXECUTING THE RETURN IS NOT 2.
!]ERROR 1
!]STKRST PFBUF CALLRTN RTN STKADR STACK NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST20: NOVALUE =
!THIS TEST CHECKS THAT THE NICOND DISPATCH LOGIC WORKS CORRECTLY.
BEGIN
LABEL
BLOCK1,BLOCK2,BLOCK3,BLOCK4,BLOCK5,
ERBLK1,ERBLK2,ERBLK3,ERBLK4,ERBLK5;
BIND
UC_PTR = PLIT( U_J(3770) U_DISP_NICOND U),
UC_PTR1 = PLIT(U_J(1) U_N(20000) U_SPEC_APR_EN U_DBUS_DBM U_ALU_OR U_RSRC_D0 U,
U_J(2) U_N(1000) U_SPEC_FLAGS U,
U_J(3770) U_DISP_NICOND U),
UC_PTR2 = PLIT(U_J(2) U_N(2000) U_SPEC_FLAGS U),
UC_PTR3 = PLIT(U_J(2) U_N(3000) U_SPEC_FLAGS U);
LOCAL
DISCREP,
ERFLG,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICRO-INSTR
ERFLG = 0; !INIT ERROR FLAG
DO (0) WHILE
BLOCK1: BEGIN
TP(0); !TURN OFF TRAP ENABLES
WRT212(RUN); !ASSERT 'RUN' PRE-FLOP
CP_NOSS(1); !GIVE CLK PULSE TO ASSERT 'RUN'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE NICOND DISP AND READ NEXT ADDR
IF .ACTUAL NEQ %O'3777' !DID WE DISPATCH CORRECTLY?
THEN
ERBLK1: BEGIN
ERFLG = 1; !SET ERROR FLAG
ERMCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3777'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 2 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1);
LEAVE ERBLK1;
END;
FAILURE(4);
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO DO A NICOND DISPATCH TO 377X.
!* TP 0 - NEGATE 'CSL4 TRAP EN'. THIS WILL NEGATE
!* 'DPE9 TRAP 1,2 AND 3'.
!* WRT 212/4 - ASSERT 'RUN' PRE-FLOP
!* CP 1 - GIVE A CLOCK PULSE TO ASSERT 'RUN'.
!* X1 0 - SET NEXT CRAM ADDR TO 0.
!* CP 1 - EXECUTE THE NICOND DISPATCH. WITH ALL TRAPS
!* NEGATED AND 'RUN' ASSERTED, 'CRA2 NICOND 9, 10
!* AND 11' SHOULD ALL BE ASSERTED.
!*RESPONSE:
!* THE NEXT CRAM ADDR DID NOT DISPATCH TO 3777.
!]ERROR 1
!]NIC_ENC AMX11 NTWK
!]ERROR 2
!]NIC_ENC AMX10 NTWK
!]ERROR 3
!]NIC_ENC AMX9 NTWK
!]ERROR 4
!]NIC_ENC NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
WRT212(0); !NEGATE 'RUN' PRE-FLOP
WRT100(RESET); !ASSERT 'RESET' TO NEGATE 'RUN'
WRT100(0);
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE NICOND DISP AND READ NEXT ADDR
IF .ACTUAL NEQ %O'3775' !DID WE DISPATCH CORRECTLY?
THEN
ERBLK2: BEGIN
ERFLG = 1; !SET ERROR FLAG
ERMCA(2,%O'3775',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3775'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 2 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1);
LEAVE ERBLK2;
END;
FAILURE(4);
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO DO A NICOND DISPATCH TO 377X.
!* TP 0 - NEGATE 'CSL4 TRAP EN'. THIS WILL NEGATE
!* 'DPE9 TRAP 1,2 AND 3'.
!* WRT 212/0 - NEGATE 'RUN' PRE-FLOP
!* WRT 100/200 - ASSERT 'RESET' TO NEGATE 'RUN'
!* WRT 100/0 - NEGATE 'RESET'
!* X1 0 - SET NEXT CRAM ADDR TO 0.
!* CP 1 - EXECUTE THE NICOND DISPATCH. WITH ALL TRAPS
!* NEGATED AND 'RUN' NEGATED, 'CRA2 NICOND 9
!* AND 11' SHOULD ALL BE ASSERTED AND 'CRA2
!* NICOND 10' SHOULD BE NEGATED.
!*RESPONSE:
!* THE NEXT CRAM ADDR DID NOT DISPATCH TO 3775.
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK3: BEGIN
TP(1); !ASSERT 'CSL4 TRAP EN'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(3); !EXECUTE NICOND DISP AND READ NEXT ADDR
IF .ACTUAL NEQ %O'3773' !DID WE DISPATCH CORRECTLY?
THEN
ERBLK3: BEGIN
ERFLG = 1; !SET ERROR FLAG
ERMCA(3,%O'3773',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3773'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 2 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1);
LEAVE ERBLK3;
END;
FAILURE(4);
END;
!*MESSAGE 3
!*STIMULUS:
!* LOAD MICRO-INSTRS TO SET 'DPE9 TRAP 1' AND DO A NICOND DISPATCH
!* TO 377X.
!* TP 1 - ASSERT 'CSL4 TRAP EN'.
!* WRT 212/0 - NEGATE 'RUN' PRE-FLOP
!* WRT 100/200 - ASSERT 'RESET' TO NEGATE 'RUN'
!* WRT 100/0 - NEGATE 'RESET'
!* X1 0 - SET NEXT CRAM ADDR TO 0.
!* CP 3 - EXECUTION OF THE FIRST MICRO-INSTR ASSERTS
!* 'DPEB TRAP EN'. THE 2ND INSTR ASSERTS
!* 'DPE9 TRAP 1'. THE 3RD INSTR DOES A NICOND
!* DISPATCH TO LOCATION 377X. WITH 'TRAP 1'
!* ASSERTED, 'CRA2 NICOND 9-11' SHOULD BE = 3.
!*RESPONSE:
!* THE NEXT CRAM ADDR DID NOT DISPATCH TO 3773.
IF LOOP_CHK(3) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK3 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(1,UC_PTR2); !LOAD MICROCODE
DO (0) WHILE
BLOCK4: BEGIN
TP(1); !ASSERT 'CSL4 TRAP EN'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(3); !EXECUTE NICOND DISP AND READ NEXT ADDR
IF .ACTUAL NEQ %O'3772' !DID WE DISPATCH CORRECTLY?
THEN
ERBLK4: BEGIN
ERFLG = 1; !SET ERROR FLAG
ERMCA(4,%O'3772',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3772'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 2 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+5);
LEAVE ERBLK4;
END;
FAILURE(4);
END;
!*MESSAGE 4
!*STIMULUS:
!* LOAD MICRO-INSTRS TO SET 'DPE9 TRAP 2' AND DO A NICOND DISPATCH
!* TO 377X.
!* TP 1 - ASSERT 'CSL4 TRAP EN'.
!* WRT 212/0 - NEGATE 'RUN' PRE-FLOP
!* WRT 100/200 - ASSERT 'RESET' TO NEGATE 'RUN'
!* WRT 100/0 - NEGATE 'RESET'
!* X1 0 - SET NEXT CRAM ADDR TO 0.
!* CP 3 - EXECUTION OF THE FIRST MICRO-INSTR ASSERTS
!* 'DPEB TRAP EN'. THE 2ND INSTR ASSERTS
!* 'DPE9 TRAP 2'. THE 3RD INSTR DOES A NICOND
!* DISPATCH TO LOCATION 377X. WITH 'TRAP 2'
!* ASSERTED, 'CRA2 NICOND 9-11' SHOULD BE = 2.
!*RESPONSE:
!* THE NEXT CRAM ADDR DID NOT DISPATCH TO 3772.
!]ERROR 5
!]SKIP10 NIC_ENC AMX11 NTWK
!]ERROR 6
!]NIC_ENC AMX10 NTWK
!]ERROR 7
!]NIC_ENC AMX9 NTWK
IF LOOP_CHK(4) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK4 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(1,UC_PTR3); !LOAD MICROCODE
DO (0) WHILE
BLOCK5: BEGIN
TP(1); !ASSERT 'CSL4 TRAP EN'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(3); !EXECUTE NICOND DISP AND READ NEXT ADDR
IF .ACTUAL NEQ %O'3771' !DID WE DISPATCH CORRECTLY?
THEN
ERBLK5: BEGIN
ERFLG = 1; !SET ERROR FLAG
ERMCA(5,%O'3771',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3771'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 2 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1);
LEAVE ERBLK5;
END;
FAILURE(4);
END;
!*MESSAGE 5
!*STIMULUS:
!* LOAD MICRO-INSTRS TO SET 'DPE9 TRAP 1 AND 2' AND DO A NICOND
!* DISPATCH TO 377X.
!* TP 1 - ASSERT 'CSL4 TRAP EN'.
!* WRT 212/0 - NEGATE 'RUN' PRE-FLOP
!* WRT 100/200 - ASSERT 'RESET' TO NEGATE 'RUN'
!* WRT 100/0 - NEGATE 'RESET'
!* X1 0 - SET NEXT CRAM ADDR TO 0.
!* CP 3 - EXECUTION OF THE FIRST MICRO-INSTR ASSERTS
!* 'DPEB TRAP EN'. THE 2ND INSTR ASSERTS
!* 'DPE9 TRAP 1 AND 2'. THE 3RD INSTR DOES A
!* NICOND DISPATCH TO LOCATION 377X. WITH
!* 'TRAP 1 AND 2' ASSERTED, 'CRA2 NICOND 9-11'
!* SHOULD BE = 1.
!*RESPONSE:
!* THE NEXT CRAM ADDR DID NOT DISPATCH TO 3771.
IF LOOP_CHK(5) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK5 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
IF .ERFLG EQL 0 !IF WE DIDN'T HAVE ANY ERRORS THEN
THEN
NOERR(1); !DO SOME FAULT ISOLATION
!]NO ERROR 1
!]NIC_ENC NTWK
END;
GLOBAL ROUTINE TST21: NOVALUE =
!THIS TEST CHECKS THAT NEXT CRAM ADDRESS SKIPPING WORKS CORRECTLY WHEN
!A 'SKIP 10' IS EXECUTED WHICH SELECTS THE 'TRAP CYCLE' INPUT.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(1) U_N(20000) U_SPEC_APR_EN U_DBUS_DBM U_ALU_OR U_RSRC_D0 U,
U_J(2) U_N(1000) U_SPEC_FLAGS U,
U_J(3) U_SPEC_NICOND U,
U_J(3776) U_SKIP_TRAP_CYC U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICRO-INSTR
DO (0) WHILE
BLOCK1: BEGIN
TP(1); !ASSERT 'CSL4 TRAP EN'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(4); !EXECUTE NICOND SKIP AND READ NEXT ADDR
IF .ACTUAL NEQ %O'3777' !DID WE SKIP CORRECTLY?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO SET 'DPE9 TRAP 1' AND DO A TRAP CYCLE SKIP
!* TO 3776.
!* TP 1 - ASSERT 'CSL4 TRAP EN'.
!* X1 0 - SET NEXT CRAM ADDR TO 0.
!* CP 4 - EXECUTION OF THE FIRST MICRO-INSTR ASSERTS
!* 'DPEB TRAP EN'. THE 2ND INSTR ASSERTS
!* 'DPE9 TRAP 1'. THE 3RD INSTR ASSERTS 'SPEC/
!* NICOND' WHICH SHOULD ASSERT 'TRAP CYCLE'.
!* THE 4TH INSTR DOES A TRAP CYCLE SKIP.
!*RESPONSE:
!* THE NEXT CRAM ADDR DID NOT SKIP TO 3777.
!]ERROR 1
!]NIC_ENC TRPCYC SKIP10 AMX11 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
DO (0) WHILE
BLOCK2: BEGIN
TP(0); !TURN OFF TRAP ENABLES
SET_C(2); !SET CRAM ADDR TO 2
ACTUAL = STEP_U_NEXT(2); !EXECUTE TRAP CYCLE SKIP AND READ NEXT ADDR
IF .ACTUAL NEQ %O'3776' !DID WE DISPATCH CORRECTLY?
THEN
ERRCA(2,%O'3776',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO ASSERT 'SPEC/NICOND' AND DO A TRAP CYCLE
!* SKIP TO 3776.
!* TP 0 - NEGATE 'CSL4 TRAP EN'. THIS WILL NEGATE
!* 'DPE9 TRAP 1,2 AND 3'.
!* X1 3 - SET NEXT CRAM ADDR TO 3.
!* CP 2 - THE 1ST INSTR WILL ASSERT 'SPEC/NICOND'. WITH
!* ALL TRAPS NEGATED, 'NICOND 9' IS ASSERTED. SO
!* 'TRAP CYCLE' WILL BE NEGATED. WITH 'TRAP
!* CYCLE' NEGATED, THE 2ND INSTR WHICH DOES A
!* TRAP CYCLE SKIP, SHOULD NOT SKIP.
!*RESPONSE:
!* THE NEXT CRAM ADDR DID SKIP TO 3777.
!]ERROR 2
!]NIC_ENC TRPCYC SKIP10 AMX11 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST22: NOVALUE =
!THIS TEST CHECKS THAT THE CONSOLE EXECUTE MODE SKIPPING WORKS
!CORRECTLY, I.E., SKIP FIELD = 64.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(3776) U_SKIP_EXECUTE U);
LOCAL
ERFLG,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
ERFLG = 0; !INIT ERROR FLAG
WRT212(EXECUTE); !ASSERT 'EXECUTE' PRE-FLOP
CP_NOSS(1); !GIVE CLK PULSE TO ASSERT 'EXECUTE'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
BEGIN
ERFLG = 1; !SET ERROR FLAG
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A CONSOLE EXECUTE MODE SKIP.
!* WRT 212/2 - ASSERT 'EXECUTE' PRE-FLOP
!* CP 1 - ASSERT 'EXECUTE'
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE EXECUTE MODE SKIP.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 1
!]SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
IF .ERFLG EQL 0
THEN
BEGIN
WRT100(RESET); !NEGATE 'EXECUTE'
WRT100(0);
ACTUAL = EX_NXT; !GET NEXT ADDR
IF .ACTUAL NEQ %O'3777'
THEN
BEGIN
ERFLG = 1;
ERRCA(2,%O'3777',.ACTUAL,4);
END;
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A CONSOLE EXECUTE MODE SKIP.
!* WRT 212/2 - ASSERT 'EXECUTE' PRE-FLOP
!* CP 1 - ASSERT 'EXECUTE'
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE EXECUTE MODE SKIP. THIS WILL CAUSE
!* THE NEXT CRAM ADDR TO BECOME 3777.
!* WRT 100/200 - ASSERT 'RESET' ON THE CSL BOARD. THIS WILL
!* NEGATE 'CSL4 EXECUTE'. BUT WITH 'CRA2 DISP &
!* SKIP EN' NEGATED, THE NEXT ADDR SHOULD NOT
!* CHANGE.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS CHANGED FROM 3777. THIS IMPLIES THAT
!* 'CRA2 DISP & SKIP EN' IS STUCK ASSERTED.
!]ERROR 2
!]DSP_SKP_EN SYNCH FRSTCYC NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
DO (0) WHILE
BLOCK2: BEGIN
WRT212(0); !NEGATE 'EXECUTE' PRE-FLOP
CP_NOSS(1); !GIVE CLK PULSE TO NEGATE 'EXECUTE'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3776' !DID WE TAKE SKIP?
THEN
BEGIN
ERFLG = 1;
ERRCA(3,%O'3776',.ACTUAL,4); !YES, REPORT ERROR
END;
!*MESSAGE 3
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A CONSOLE EXECUTE MODE SKIP.
!* WRT 212/0 - NEGATE 'EXECUTE' PRE-FLOP
!* CP 1 - NEGATE 'EXECUTE'
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE EXECUTE MODE SKIP.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID SKIP TO 3777.
!]ERROR 3
!]SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(3) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
IF .ERFLG EQL 0
THEN
NOERR(1);
!]NO ERROR 1
!]DSP_SKP_EN SYNCH TCLKB NTWK
END;
GLOBAL ROUTINE TST23: NOVALUE =
!THIS TEST CHECKS THAT THE 'NOT CONTINUE' SKIPPING WORKS
!CORRECTLY, I.E., SKIP FIELD = 66.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(3776) U_SKIP_CONTINUE U);
LOCAL
ERFLG,
ACTUAL;
ERFLG = 0; !INIT ERROR FLAG
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
WRT212(CONTINUE); !ASSERT 'CONTINUE' PRE-FLOP
CP_NOSS(1); !GIVE CLK PULSE TO ASSERT 'CONTINUE'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3776' !DID WE TAKE SKIP?
THEN
BEGIN
ERFLG = 1;
ERRCA(1,%O'3776',.ACTUAL,4); !YES, REPORT ERROR
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A 'NOT CONTINUE' SKIP.
!* WRT 212/2 - ASSERT 'CONTINUE' PRE-FLOP
!* CP 1 - ASSERT 'CONTINUE'
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE NOT CONTINUE SKIP. SINCE
!* 'CONTINUE' IS ASSERTED, NO SKIP SHOULD OCCUR.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID SKIP TO 3777.
!]ERROR 1
!]SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
DO (0) WHILE
BLOCK2: BEGIN
WRT212(0); !NEGATE 'CONTINUE' PRE-FLOP
CP_NOSS(1); !GIVE CLK PULSE TO NEGATE 'CONTINUE'
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
BEGIN
ERFLG = 1;
ERRCA(2,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A 'NOT CONTINUE' SKIP.
!* WRT 212/0 - NEGATE 'CONTINUE' PRE-FLOP
!* CP 1 - NEGATE 'CONTINUE'
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE NOT CONTINUE SKIP. SINCE
!* 'CONTINUE' IS NEGATED, WE SHOULD SKIP TO 3777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 2
!]SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
IF .ERFLG EQL 0
THEN
NOERR(1);
!]NO ERROR 1
!]DSP_SKP_EN TCLKB SYNCH NTWK
END;
GLOBAL ROUTINE TST24: NOVALUE =
!THIS TEST CHECKS THAT THE 'NOT 1 MSEC TIMER' SKIPPING WORKS
!CORRECTLY, I.E., SKIP FIELD = 66.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(3776) U_SKIP_1_MS U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
WRT100(EN_1MS); !ENABLE 1 MSEC TIME-OUT
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3776' !DID WE TAKE SKIP?
THEN
ERRCA(1,%O'3776',.ACTUAL,4); !YES, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A 'NOT 1 MSEC TIMER' SKIP.
!* WRT 100/4 - ENABLE 1 MSEC TIMER. THIS SHOULD CAUSE 'DPMC
!* 1 MSEC' TO ASSERT.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE NOT 1 MSEC TIMER SKIP. SINCE
!* '1 MSEC' IS ASSERTED, NO SKIP SHOULD OCCUR.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID SKIP TO 3777.
!]ERROR 1
!]SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
DO (0) WHILE
BLOCK2: BEGIN
WRT100(0); !NEGATE '1 MSEC TIMER' ENABLE
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
ERRCA(2,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A 'NOT 1 MSEC TIMER' SKIP.
!* WRT 100/0 - NEGATE '1 MSEC TIMER' ENABLE. THIS SHOULD
!* CAUSE 'DPMC 1 MSEC' TO NEGATE.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE NOT 1 MSEC TIMER SKIP. SINCE
!* '1 MSEC' IS NEGATED, WE SHOULD SKIP TO 3777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 2
!]SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST25: NOVALUE =
!THIS TEST CHECKS THAT THE 'NOT I/O LATCH' SKIPPING WORKS
!CORRECTLY, I.E., SKIP FIELD = 65.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(3776) U_SKIP_IO_BUSY U),
UC_PTR1 = PLIT(U_J(1) U_SPEC_CLRIOLAT U,
U_J(3776) U_SKIP_IO_BUSY U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
WRT115(IO_DATA); !SET 'I/O DATA CYCLE' IN CSL BUFFER
WRT210(BUS_REQ + XMIT_ADR); !PUT IT ON BUS
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3776' !DID WE TAKE SKIP?
THEN
ERRCA(1,%O'3776',.ACTUAL,4); !YES, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO EXECUTE A 'NOT I/O LATCH' SKIP.
!* WRT 115/2 - ASSERT 'I/O DATA CYCLE' IN CSL I/O BUFFER.
!* WRT 210/140 - GATE 'I/O DATA CYCLE' ONTO KS10 BUS. THIS
!* SHOULD ASSERT 'CRA2 I/O LATCH'.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE NOT I/O LATCH SKIP. SINCE
!* 'I/O LATCH' IS ASSERTED, NO SKIP SHOULD OCCUR.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID SKIP TO 3777.
!]ERROR 1
!]IOLTCH SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
WRT115(IO_DATA); !SET 'I/O DATA CYCLE' IN CSL BUFFER
WRT210(BUS_REQ + XMIT_ADR); !PUT IT ON BUS
SET_C(0); !SET CRAM ADDR TO 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE SKIP INSTR
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
ERRCA(2,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTRS TO CLEAR 'I/O LATCH' AND TO EXECUTE A 'NOT
!* I/O LATCH' SKIP.
!* WRT 115/2 - ASSERT 'I/O DATA CYCLE' IN CSL I/O BUFFER.
!* WRT 210/140 - GATE 'I/O DATA CYCLE' ONTO KS10 BUS. THIS
!* SHOULD ASSERT 'CRA2 I/O LATCH'.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 - THE 1ST INSTR DOES A 'SPEC/CLR I/O LATCH'.
!* THIS SHOULD CLEAR 'I/O LATCH'. THE 2ND INSTR
!* EXECUTES THE NOT CONTINUE SKIP. SINCE
!* 'I/O LATCH' IS NEGATED,WE SHOULD SKIP TO 3777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 2
!]SPEC10 IOLTCH SKIP10 AMX11 TCLKB DSP_SKP_EN SYNCH NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST26: NOVALUE =
!THIS TEST CHECKS THAT THE 'AD EQ 0' SKIPPING WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(3776) U_SKIP_ADEQ0 U),
UC_PTR1 = PLIT(U_J(3776) U_ALU_XNOR U_LSRC_AB U_RSRC_AB U_DEST_PASS U_SKIP_ADEQ0 U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE AD EQ 0 SKIP
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO DO 'AD EQ 0' SKIP TO LOCATION 3776.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE INSTR WHICH ASSERTS 'DPEA AD=0' AND DOES
!* A 'AD EQ 0' SKIP (SKIP FIELD = 62).
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 1
!]SKIP10 AMX11 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE AD EQ 0 SKIP
IF .ACTUAL NEQ %O'3776' !DID WE TAKE SKIP?
THEN
ERRCA(2,%O'3776',.ACTUAL,4); !YES, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO DO 'AD EQ 0' SKIP TO LOCATION 3776.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE INSTR WHICH NEGATES 'DPEA AD=0' AND DOES
!* A 'AD EQ 0' SKIP (SKIP FIELD = 62).
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID SKIP TO 3777.
!]ERROR 2
!]SKIP10 AMX11 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST27: NOVALUE =
!THIS TEST CHECKS THAT THE 'SC SIGN BIT' SKIPPING WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(1) U_LOADSC U_SCADA_SN U_SN(1000) U_SCAD_A U,
U_J(3776) U_SKIP_SC U),
UC_PTR1 = PLIT(U_J(1) U_LOADSC U_SCADA_SN U_SN(0) U_SCAD_A U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE SC SIGN BIT SKIP
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO ASSERT 'DPM4 SC SIGN' AND TO DO 'SC SIGN
!* BIT' SKIP TO LOCATION 3776.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 - THE FIRST INSTR SHOULD SETUP FOR THE ASSERTION OF
!* 'DPM SC SIGN'. THE 2ND INSTR WILL ASSERT IT AND DO A
!* SKIP BASED ON THAT ASSERTION.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 1
!]SKIP10 AMX11 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE SC SIGN BIT SKIP
IF .ACTUAL NEQ %O'3776' !DID WE TAKE SKIP?
THEN
ERRCA(2,%O'3776',.ACTUAL,4); !YES, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTRS TO NEGATE 'DPM4 SC SIGN' AND TO DO 'SC SIGN
!* BIT' SKIP TO LOCATION 3776.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 - THE FIRST INSTR SHOULD SETUP FOR THE NEGATION OF
!* 'DPM SC SIGN'. THE 2ND INSTR WILL NEGATE IT AND DO A
!* SKIP BASED ON THAT NEGATION.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID SKIP TO 3777.
!]ERROR 2
!]SKIP10 AMX11 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST28: NOVALUE =
!THIS TEST CHECKS THAT DISPATCHING ON 'DPM3 SCAD 00' WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(3775) U_SCADA_SN U_SN(1000) U_SCAD_A U_DISP_SCAD0 U),
UC_PTR1 = PLIT(U_J(3775) U_SCADA_SN U_SN(0) U_SCAD_A U_DISP_SCAD0 U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SCAD 0 DISPATCH
IF .ACTUAL NEQ %O'3777' !DID WE TAKE DISPATCH?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO ASSERT 'DPM3 SCAD 00' AND DO A SCAD 00
!* DISPATCH (67) TO 3775.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE MICRO-INSTR. WITH 'SCAD 00' ASSERTED, THE
!* NEXT CRAM ADDRESS SHOULD DISPATCH TO 3777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3777.
!]ERROR 1
!]AMX10 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE SCAD 0 DISPATCH
IF .ACTUAL NEQ %O'3775' !DID WE TAKE SKIP?
THEN
ERRCA(2,%O'3775',.ACTUAL,4); !YES, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO NEGATE 'DPM3 SCAD 00' AND DO A SCAD 00
!* DISPATCH (67) TO 3775.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE MICRO-INSTR. WITH 'SCAD 00' NEGATED, THE
!* NEXT CRAM ADDRESS SHOULD DISPATCH TO 3775.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3775.
!]ERROR 2
!]AMX10 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST29: NOVALUE =
!THIS TEST CHECKS THAT DISPATCHING ON 'DPE5 FLAG QR 37' WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(1) U_N(777777) U_DBUS_DBM U_ALU_OR U_LSRC_D0 U_DEST_Q_AD U,
U_J(2) U_DEST_Q_DIV2 U,
U_J(3) U_DEST_Q_DIV2 U,
U_J(4) U_DEST_Q_DIV2 U,
U_J(3773) U_DISP_MUL U),
UC_PTR1 = PLIT(U_J(1) U_DEST_Q_AD U,
U_J(2) U_DEST_Q_DIV2 U,
U_J(3773) U_DISP_MUL U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(5); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3777' !DID WE TAKE DISPATCH?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO ASSERT 'DPE5 FLAG QR 37' THEN DO A
!* 'MULTIPLY' DISPATCH (62) TO 3773.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 5 - THE FIRST INSTR LOADS ONES INTO THE Q REGISTER.
!* THE NEXT 3 INSTRS SHIFT THE Q REG RIGHT AND ASSERT
!* 'DPE1-2 QR 37'. THE LAST INSTR ASSERTS 'DPE5 FLAG
!* QR 37' AND DOES THE 'MULTIPLY' DISPATCH WHICH SHOULD
!* GO TO 3777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3777.
!]ERROR 1
!]AMX9 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(3); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3773' !DID WE TAKE SKIP?
THEN
ERRCA(2,%O'3773',.ACTUAL,4); !YES, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTRS TO NEGATE 'DPE5 FLAG QR 37' THEN DO A
!* 'MULTIPLY' DISPATCH (62) TO 3773.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 3 - THE FIRST INSTR LOADS A ZERO INTO BIT 37 OF THE Q
!* REGISTER. THE NEXT INSTR SHIFTS THE Q REG RIGHT AND
!* NEGATES 'DPE1-2 QR 37'. THE LAST INSTR NEGATES
!* 'DPE5 FLAG QR 37' AND DOES A MULTIPLY DISPATCH WHICH
!* SHOULD GO TO 3773.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3773.
!]ERROR 2
!]AMX9 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST30: NOVALUE =
!THIS TEST CHECKS THAT DISPATCHING ON 'DPM6 MEMORY CYCLE' WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(1) U_SPEC_MEMCLR U,
U_J(2) U_N(40002) U_MEM U,
U_J(3767) U_DISP_NICOND U),
UC_PTR1 = PLIT(U_J(1) U_SPEC_MEMCLR U,
U_J(3767) U_DISP_NICOND U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(3); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3777' !DID WE TAKE DISPATCH?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO ASSERT 'DPM6 MEMORY CYCLE' THEN DO A
!* 'NICOND' DISPATCH (64) TO 3767.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 3 - THE FIRST INSTR CLEARS ANY LEFT OVER PAGE FAULTS.
!* THE 2ND INSTR STARTS A MEMORY CYCLE. THE 3RD INSTR
!* ASSERTS 'DPM6 MEMORY CYCLE' AND DOES A NICOND DISPATCH
!* WHICH SHOULD GO TO 3777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3777.
!]ERROR 1
!]AMX8 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3767' !DID WE TAKE SKIP?
THEN
ERRCA(2,%O'3767',.ACTUAL,4); !YES, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTRS TO NEGATE 'DPM6 MEMORY CYCLE' THEN DO A
!* 'NICOND' DISPATCH (64) TO 3767.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 - THE FIRST INSTR DOES A SPEC/MEMORY CLEAR.THE 2ND INSTR
!* NEGATES 'DPM6 MEMORY CYCLE' AND DOES A NICOND DISPATCH
!* WHICH SHOULD GO TO 3767.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3767.
!]ERROR 2
!]AMX8 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST31: NOVALUE =
!THIS TEST CHECKS THAT 'BYTE' DISPATCHING WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2,ERBLK1,ERBLK2;
BIND
UC_PTR = PLIT(U_J(3770) U_N(10700) U_DBUS_DBM U_ALU_OR U_LSRC_D0 U_DISP_BYTE U),
UC_PTR1 = PLIT(U_J(3770) U_DISP_BYTE U);
LOCAL
DISCREP,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3777' !DID WE TAKE DISPATCH?
THEN
ERBLK1: BEGIN
ERMCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3777'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 2 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1);
LEAVE ERBLK1;
END;
FAILURE(4);
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO ASSERT 'DPE5 BYTE DISP 9,10,11' AND DO A
!* BYTE DISPATCH TO 3770.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE MICRO-INSTR TO ASSERT THE 'BYTE DISP' BITS
!* AND DO A BYTE DISPATCH WHICH SHOULD GO TO 3777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3777.
!]ERROR 1
!]AMX11 NTWK
!]ERROR 2
!]AMX10 NTWK
!]ERROR 3
!]AMX9 NTWK
!]ERROR 4
!]AMX9 AMX10 AMX11 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3770' !DID WE TAKE SKIP?
THEN
ERBLK2: BEGIN
ERMCA(2,%O'3770',.ACTUAL,4); !YES, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3770'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 2 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+5);
LEAVE ERBLK2;
END;
FAILURE(4);
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO NEGATE 'DPE5 BYTE DISP 9,10,11' AND DO A
!* BYTE DISPATCH TO 3770.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE THE MICRO-INSTR TO NEGATE THE 'BYTE DISP' BITS
!* AND DO A BYTE DISPATCH WHICH SHOULD GO TO 3770.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3770.
!]ERROR 5
!]SKIP10 AMX11 NTWK
!]ERROR 6
!]AMX10 NTWK
!]ERROR 7
!]AMX9 NTWK
!]ERROR 8
!]AMX9 AMX10 AMX11 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST32: NOVALUE =
!THIS TEST CHECKS THAT 'EFFECTIVE ADDRESS MODE' DISPATCHING WORKS
!CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2,ERBLK1,ERBLK2;
BIND
UC_PTR = PLIT(U_J(1) U_SPEC_LDINST U_N(20) U_DBUS_DBM U,
U_J(3760) U_DISP_EAMODE U),
UC_PTR1 = PLIT(U_J(1) U_SPEC_LDINST U_N(254017) U_DBUS_DBM U,
U_J(3760) U_DISP_EAMODE U);
LOCAL
DISCREP,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3776' !DID WE TAKE DISPATCH?
THEN
ERBLK1: BEGIN
ERMCA(1,%O'3776',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3776'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 3 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1);
LEAVE ERBLK1;
END;
FAILURE(5);
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO SETUP THE 3 EA MODE DISPATCH SIGNALS AND DO
!* AN 'EA MODE' DISPATCH TO 3760.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 -THE 1ST INSTR SETS UP THE DBUS BITS AND ASSERTS SPEC IR
!* AND XR LOAD. THE 2ND INSTR NEGATES 'DPEA JRST,0' AND
!* ASSERTS 'DPEA XR=0' AND 'DPEA INDIRECT' THEN DOES AN
!* EA MODE DISPATCH WHICH SHOULD GO TO 3776.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3776.
!]ERROR 1
!]SKIP10 AMX11 NTWK
!]ERROR 2
!]AMX10 NTWK
!]ERROR 3
!]AMX9 NTWK
!]ERROR 4
!]AMX8 NTWK
!]ERROR 5
!]AMX8 AMX9 AMX10 AMX11 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'3760' !DID WE TAKE SKIP?
THEN
ERBLK2: BEGIN
ERMCA(2,%O'3760',.ACTUAL,4); !YES, REPORT ERROR
DISCREP = .ACTUAL XOR %O'3760';
INCR J FROM 0 TO 3 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1);
LEAVE ERBLK2;
END;
FAILURE(5);
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO SETUP THE 3 EA MODE DISPATCH SIGNALS AND DO
!* AN 'EA MODE' DISPATCH TO 3760.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 -THE 1ST INSTR SETS UP THE DBUS BITS AND ASSERTS SPEC IR
!* AND XR LOAD. THE 2ND INSTR ASSERTS 'DPEA JRST,0' AND
!* NEGATES 'DPEA XR=0' AND 'DPEA INDIRECT' THEN DOES AN
!* EA MODE DISPATCH WHICH SHOULD GO TO 3760.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 3760.
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST33: NOVALUE =
!THIS TEST CHECKS THAT 'DROM' DISPATCHING WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2,ERBLK1,ERBLK2;
BIND
UC_PTR = PLIT(U_J(1) U_SPEC_LDINST U_N(702740) U_DBUS_DBM U,
U_J(0) U_DISP_DROM U),
UC_PTR1 = PLIT(U_J(1) U_SPEC_LDINST U_N(600000) U_DBUS_DBM U,
U_J(0) U_DISP_DROM U);
LOCAL
DISCREP,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'1777' !DID WE TAKE DISPATCH?
THEN
ERBLK1: BEGIN
ERMCA(1,%O'1777',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'1777'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
FAILURE(13);
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO SELECT DROM LOCATION WITH 'DROM J 00-03'
!* EQUAL TO ONES AND 'AC DISP' ASSERTED. ALSO, ASSERT
!* 'AC 09' TO 'AC 12'.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 -THE 1ST INSTR SETS UP THE DBUS BITS AND ASSERTS SPEC IR
!* AND XR LOAD. THE 2ND INSTR LOADS THE IR WITH 702,
!* SELECTING A DROM LOCATION WITH 'DROM J 00-03' = 1S AND
!* 'AC DISP' ASSERTED. WITH THE AC FIELD ALL ONES, THE
!* DROM DISPATCH THEN SHOULD GO TO 1777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 1777.
!]ERROR 1
!]AMX11 NTWK
!]ERROR 2
!]AMX10 NTWK
!]ERROR 3
!]AMX9 NTWK
!]ERROR 4
!]AMX8 NTWK
!]ERROR 5
!]AMX6_7 NTWK
!]ERROR 6
!]AMX6_7 NTWK
!]ERROR 7
!]AMX4_5 NTWK
!]ERROR 8
!]AMX4_5 NTWK
!]ERROR 9
!]AMX2_3 NTWK
!]ERROR 10
!]AMX2_3 NTWK
!]ERROR 11
!]AMX0_1 NTWK
!]ERROR 12
!]AMX0_1 NTWK
!]ERROR 13
!]AMX NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'1400' !DID WE TAKE SKIP?
THEN
ERBLK2: BEGIN
ERMCA(2,%O'1400',.ACTUAL,4); !YES, REPORT ERROR
DISCREP = .ACTUAL XOR %O'1400'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1); !DO FAULT ISOLATION
LEAVE ERBLK2;
END;
FAILURE(13);
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTRS TO CAUSE A DROM DISPATCH FROM A DROM LOACTION
!* WHICH HAS 'DROM 00-07' = 0 AND 'AC DISP' NEGATED.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 -THE 1ST INSTR SETS UP THE DBUS BITS AND ASSERTS SPEC IR
!* AND XR LOAD. THE 2ND INSTR LOADS THE IR WITH 600,
!* SELECTING A DROM LOCATION WITH 'DROM 00-07' = 0. THE
!* DROM DISPATCH SHOULD THEN GO TO 1400.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 1400.
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST34: NOVALUE =
!THIS TEST CHECKS THAT 'AREAD' DISPATCHING WORKS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2,BLOCK3,ERBLK1,ERBLK2,ERBLK3;
BIND
UC_PTR = PLIT(U_J(1) U_SPEC_LDINST U_N(110000) U_DBUS_DBM U,
U_J(17) U_DISP_AREAD U),
UC_PTR1 = PLIT(U_J(1) U_SPEC_LDINST U_N(324000) U_DBUS_DBM U,
U_J(17) U_DISP_AREAD U),
UC_PTR2 = PLIT(U_J(1) U_SPEC_LDINST U_N(221000) U_DBUS_DBM U,
U_J(17) U_DISP_AREAD U);
LOCAL
DISCREP,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'57' !DID WE TAKE DISPATCH?
THEN
ERBLK1: BEGIN
ERMCA(1,%O'57',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'57'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 7 BY 1 DO
IF .DISCREP EQL %O'20'^.J
THEN
BEGIN
FAILURE(.J+1); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
FAILURE(9);
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO SELECT DROM LOCATION WITH 'DROM A=J' = 0
!* THEN DO AN 'AREAD' DISPATCH.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 -THE 1ST INSTR SETS UP THE DBUS BITS AND ASSERTS SPEC IR
!* AND XR LOAD. THE 2ND INSTR LOADS THE IR WITH 110,
!* SELECTING A DROM LOCATION WITH 'DROM A=J' NEGATED.
!* WITH THE J FIELD = 17, THE AREAD DISPATCH SHOULD THEN
!* GO TO 57.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 57.
!]ERROR 1
!]AMX6_7 AREAD NTWK
!]ERROR 2
!]AMX6_7 AREAD NTWK
!]ERROR 3
!]AMX4_5 AREAD NTWK
!]ERROR 4
!]AMX4_5 AREAD NTWK
!]ERROR 5
!]AMX2_3 AREAD NTWK
!]ERROR 6
!]AMX2_3 AREAD NTWK
!]ERROR 7
!]AMX0_1 AREAD NTWK
!]ERROR 8
!]AMX0_1 AREAD NTWK
!]ERROR 9
!]AREAD NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR1); !LOAD MICROCODE
DO (0) WHILE
BLOCK2: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'1537' !DID WE TAKE SKIP?
THEN
ERBLK2: BEGIN
ERMCA(2,%O'1537',.ACTUAL,4); !YES, REPORT ERROR
DISCREP = .ACTUAL XOR %O'1537'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 7 BY 1 DO
IF .DISCREP EQL %O'20'^.J
THEN
BEGIN
FAILURE(.J+1); !DO FAULT ISOLATION
LEAVE ERBLK2;
END;
FAILURE(9);
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO CAUSE AN 'AREAD' DISPATCH FROM A DROM
!* LOACTION WHICH HAS 'DROM A=J' ASSERTED AND 'DROM 00-
!* 03' = 5.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 -THE 1ST INSTR SETS UP THE DBUS BITS AND ASSERTS SPEC IR
!* AND XR LOAD. THE 2ND INSTR LOADS THE IR WITH 324,
!* SELECTING A DROM LOCATION WITH 'DROM 00-03' = 5 AND
!* 'DROM A=J' ASSERTED. WITH THE J FIELD = 17, THE
!* DROM DISPATCH SHOULD THEN GO TO 1537.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 1537.
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR2); !LOAD MICROCODE
DO (0) WHILE
BLOCK3: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(2); !EXECUTE DISPATCH
IF .ACTUAL NEQ %O'1657' !DID WE TAKE SKIP?
THEN
ERBLK3: BEGIN
ERMCA(3,%O'1657',.ACTUAL,4); !YES, REPORT ERROR
DISCREP = .ACTUAL XOR %O'1657'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 7 BY 1 DO
IF .DISCREP EQL %O'20'^.J
THEN
BEGIN
FAILURE(.J+1); !DO FAULT ISOLATION
LEAVE ERBLK3;
END;
FAILURE(9);
END;
!*MESSAGE 3
!*STIMULUS:
!* LOAD MICRO-INSTR TO CAUSE AN 'AREAD' DISPATCH FROM A DROM
!* LOACTION WHICH HAS 'DROM A=J' ASSERTED AND 'DROM 00-
!* 03' = 12.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 2 -THE 1ST INSTR SETS UP THE DBUS BITS AND ASSERTS SPEC IR
!* AND XR LOAD. THE 2ND INSTR LOADS THE IR WITH 221,
!* SELECTING A DROM LOCATION WITH 'DROM 00-03' = 12 AND
!* 'DROM A=J' ASSERTED. WITH THE J FIELD = 17, THE
!* DROM DISPATCH SHOULD THEN GO TO 1657.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT DISPATCH TO 1657.
IF LOOP_CHK(3) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK3 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST35: NOVALUE =
!THIS TEST CHECKS THAT A PAGE FAIL CAUSES A DISPATCH TO CRAM ADDR 7777.
!IT ALSO VERIFIES THAT THAT DISPATCH IS REALLY DONE AS A SUBROUTINE
!CALL.
BEGIN
LABEL BLOCK1,ERBLK1;
BIND
UC_PTR = PLIT(U_J(1) U_SPEC_MEMCLR U,
U_J(2) U_ALU_OR U_RSRC_D0 U_DBUS_DBM U_N(10000) U_SPEC_APR_EN U,
U_J(3) U_ALU_OR U_RSRC_D0 U_DBUS_DBM U_N(10000) U_SPEC_APR_EN U,
U_J(4) U_ALU_XNOR U_LSRC_AB U_RSRC_AB U_MEM U_N(403010) U_SPEC_LDPAGE U,
U_J(5) U,
U_J(6) U_ALU_XNOR U_LSRC_AB U_RSRC_AB U_MEM U_N(432012) U,
U_J(0) U_MEM U_N(2) U),
UC_PTR1 = PLIT(U_J(0) U_SPEC_MEMCLR U_DISP_RETURN U),
UC_PTR2 = PLIT(U_J(0) U_SPEC_MEMCLR U);
LOCAL
DISCREP,
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE FOR PAGE FAIL
LOAD_U(7777,UC_PTR1); !LOAD RETURN INSTR
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(7); !GENERATE PAGE FAIL
IF .ACTUAL NEQ %O'7777' !DID WE TRAP?
THEN
ERBLK1: BEGIN
ERMCA(1,%O'7777',.ACTUAL,4); !NO, REPORT ERROR
DISCREP = .ACTUAL XOR %O'7777'; !COMPUTE DISCREPANCIES
INCR J FROM 0 TO 11 BY 1 DO
IF .DISCREP EQL 1^.J
THEN
BEGIN
FAILURE(.J+1); !DO FAULT ISOLATION
LEAVE ERBLK1;
END;
FAILURE(13);
END;
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO CAUSE A PAGE FAIL TRAP TO ADDR 7777.
!* X1 0 - SET CRAM ADDR = 0.
!* CP 7 - THE FIRST 5 INSTRS CLEAR ANY LEFT OVER PAGE FAULT
!* CONDITIONS AND LOAD A ZERO ENTRY INTO THE PAGE
!* TABLE AT PAGE -1. THE NEXT 2 INSTRS ATTEMPT A PAGED
!* MEMORY REFERENCE TO PAGE -1. THIS SHOULD CAUSE A PAGE
!* FAIL (SINCE 'PAGE VALID' IS NEGATED) WHICH SHOULD TRAP
!* THE CRAM ADDR TO 7777.
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT TRAP TO 7777.
!]ERROR 1
!]AMX11 NTWK
!]ERROR 2
!]AMX10 NTWK
!]ERROR 3
!]AMX9 NTWK
!]ERROR 4
!]AMX8 NTWK
!]ERROR 5
!]AMX6_7 NTWK
!]ERROR 6
!]AMX6_7 NTWK
!]ERROR 7
!]AMX4_5 NTWK
!]ERROR 8
!]AMX4_5 NTWK
!]ERROR 9
!]AMX2_3 NTWK
!]ERROR 10
!]AMX2_3 NTWK
!]ERROR 11
!]AMX0_1 NTWK
!]ERROR 12
!]AMX0_1 NTWK
!]ERROR 13
!]PFBUF NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
ACTUAL = STEP_U_NEXT(1); !EXECUTE THE RETRUN INSTR
IF .ACTUAL NEQ 6 !DID WE RETURN OKAY?
THEN
BEGIN
ERMCA(2,6,.ACTUAL,4); !NO, REPORT ERROR
FAILURE(14);
END;
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTRS TO CAUSE A PAGE FAIL TRAP TO ADDR 7777 AND
!* THEN DO A RETURN FROM THERE.
!* X1 0 - SET CRAM ADDRESS = 0.
!* CP 7 - CAUSE THE PAGE FAIL AND TRAP TO ADDRESS 7777.
!* CP 1 - EXECUTE THE RETURN INSTR THERE. IF THE PAGE FAIL TRAP
!* WORKED CORRECTLY, IT WOULD HAVE DONE A PUSH ONTO THE
!* STACK. THEN THE RETURN WILL GO TO ADDR 6.
!*RESPONSE:
!* THE RETURN INSTR AT 7777 DID NOT GO TO ADDR 6.
!]ERROR 14
!]PFBUF STKADR CALLRTN NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOADUC(0,UC_PTR2); !LOAD MEM CLR INSTR
CP_NOSS(3); !EXECUTE INSTR TO CLEAR PAGE FAULT
END;
GLOBAL ROUTINE TST36: NOVALUE =
!THIS TEST CHECKS THAT THE 'SKIP 40' INPUT TO THE NEXT ADDR MUX CAN BE
!ASSERTED AND CAUSES A SKIP.
BEGIN
LABEL BLOCK1;
BIND
UC_PTR = PLIT(U_J(3776) U_SKIP_ADLEQ0 U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE AD EQ 0 SKIP
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO DO 'ADL = 0' SKIP TO LOCATION 3776.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE INSTR WHICH ASSERTS 'DPE1 ADL=0' AND DOES
!* A 'ADL EQ 0' SKIP (SKIP FIELD = 32).
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 1
!]AMX11 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST37: NOVALUE =
!THIS TEST CHECKS THAT THE 'SKIP 20' INPUT TO THE NEXT ADDR MUX CAN BE
!ASSERTED AND CAUSES A SKIP.
BEGIN
LABEL BLOCK1;
BIND
UC_PTR = PLIT(U_J(3776) U_SKIP_DP0 U_N(777777) U_DBUS_DBM U_ALU_OR U_LSRC_D0 U);
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
DO (0) WHILE
BLOCK1: BEGIN
SET_C(0); !SET CRAM ADDR = 0
ACTUAL = STEP_U_NEXT(1); !EXECUTE AD EQ 0 SKIP
IF .ACTUAL NEQ %O'3777' !DID WE TAKE SKIP?
THEN
ERRCA(1,%O'3777',.ACTUAL,4); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO DO 'ADL SIGN' SKIP TO LOCATION 3776.
!* X1 0 - SET CRAM ADDR TO 0
!* CP 1 - EXECUTE INSTR WHICH ASSERTS 'DPE1 ADL SIGN' AND DOES
!* A 'ADL SIGN' SKIP (SKIP FIELD = 52).
!*RESPONSE:
!* THE NEXT CRAM ADDRESS DID NOT SKIP TO 3777.
!]ERROR 1
!]AMX11 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST38: NOVALUE =
!THIS TEST CHECKS THAT THE 'CRA2 RETURN' SIGNAL GETS ASSERTED ONLY WHEN
!IT IS SUPPOSED TO, I.E., WHEN 'CRA6 DISP SEL 1A' IS ASSERTED AND
!'CRA6 DISP SEL 2A' AND 'CRA6 DISP EN 20' ARE NEGATED. THIS OCCURS WHEN
!THE DISPATCH FIELDS ARE EQUAL TO 41.
!TO DO THE TEST A 'CALL' IS DONE FROM LOCATION 0 TO LOCATION 1. FROM
!LOCATION 1 A 'CALL' IS MADE TO LOCATION 2. AT LOCATION 2 A DISPATCH OF
!'71' IS DONE WITH A J FIELD OF 3. THIS DISPATCH SHOULD NOT AFFECT THE
!NEXT ADDRESS BUT IF THERE IS A FAULT 'CRA2 RETURN' WILL GET ASSERTED.
!IN THAT CASE, THE SUBROUTINE STACK WILL BE DECREMENTED. AFTER EXECUTE
!THE INSTRUCTION AT LOCATION 3, THE STACK WILL CONTAIN 0 INSTEAD OF THE
!CORRECT VALUE OF 1. THIS IS REPEATED TWICE MORE WITH LOCATION 2 HAVING
!DISPATCH FIELDS OF 50 AND 53.
BEGIN
LABEL BLOCK1;
BIND
UC_PTR = PLIT(U_J(1) U_CALL U,
U_J(2) U_CALL U,
U,
U_J(4) U);
OWN
DISP_TAB: VECTOR[3] INITIAL (%O'71', %O'50', %O'53'),
PTR_TAB: VECTOR[3] INITIAL (PLIT(U_J(3) U_DISP(%O'71') U),
PLIT(U_J(3) U_DISP(%O'50') U),
PLIT(U_J(3) U_DISP(%O'53') U));
LOCAL
ACTUAL;
LOADUC(0,UC_PTR); !LOAD MICROCODE
INCR I FROM 0 TO 2 BY 1 DO
BEGIN
LOADUC(2,.PTR_TAB[.I]); !LOAD DISPATCH INSTR
DO (0) WHILE
BLOCK1: BEGIN
WRT204(STK_RESET); !RESET STACK PTR
WRT204(0);
SET_C(0); !SET CRAM ADDR = 0
CP(4); !EXECUTE BAD DISPATCH
ACTUAL = READ_SBR(); !READ 'SBR RET'
IF .ACTUAL NEQ 1 !DID 'CRA2 RETURN' ASSERT?
THEN
ERRCAS(1,1,1,.ACTUAL,4,DISP_TAB[.I]); !YES, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTRS TO DO 2 'CALLS' AND A DISPATCH '\O0'.
!* WRT 204/2 - DO A STACK RESET
!* WRT 204/0
!* X1 0 - SET CRAM ADDRESS = 0.
!* CP 4 - THIS FIRST INSTR DOES A CALL TO LOCATION 1.
!* THE 2ND INSTR DOES A CALL TO LOCATION 2. THIS
!* SHOULD PUT A 1 AT THE TOP OF THE STACK. THE
!* 3RD INSTR HAS A DISPATCH FIELD OF \O0 WHICH
!* SHOULD DO NOTHING. THE 4TH INSTR IS JUST
!* EXECUTED TO CLOCK THE 'SBR RET' REGISTER. THE
!* 'SBR RET' SHOULD CONTAIN A 1.
!*RESPONSE:
!* THE 'SBR RET' DOES NOT CONTAIN A 1. THIS IMPLIES THAT THE
!* INSTR AT LOC 2 WITH DISPATCH FIELD \O0 INCORRECTLY ASSERTED
!* 'CRA2 RETURN' THUS CAUSING THE STACK TO GET DECREMENTED.
!]ERROR 1
!]RTN NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
END;
GLOBAL ROUTINE TST39: NOVALUE =
!THIS TEST CHECKS THAT THE 'SPEC/CONSOLE' SIGNAL GETS GENERATED
!CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2;
BIND
UC_PTR = PLIT(U_J(1) U_SPEC_N U_N(10) U),
UC_PTR1 = PLIT(U_J(1) U_N(10) U);
LOAD_U(0,UC_PTR); !LOAD CRAM BITS
DO (0) WHILE
BLOCK1: BEGIN
WRT100(RESET); !DO A RESET
WRT100(0);
SET_C(0); !SET CRAM ADDR = 0
WRT212(4); !ASSERT 1ST STAGE FLOP
CP(2); !GIVE 2 CLK PULSES
IF (RD_300 AND RUN_1 ) NEQ 0 !DID 'RUN (1)' NEGATE?
THEN
ERR(1); !NO, REPORT ERROR
!*MESSAGE 1
!*STIMULUS:
!* LOAD MICRO-INSTR TO ASSERT 'SPEC/CONSOLE' AND 'CRM2 # 14B'.
!* ASSERT AND NEGATE 'RESET'
!* X1 0 - SET CRAM ADDR = 0.
!* WRT 212/4 - ASSERT 'RUN' PRE-FLOP
!* CP 2 - THE 1ST CLOCK PULSE WILL EXECUTE THE MICRO-
!* INSTR TO ASSERT 'CRA2 SPEC/CONSOLE' AND 'CRM2
!* # 14B'. THIS WILL NEGATE THE 'RUN' PRE-FLOP.
!* AT THE SAME TIME THE 'RUN' FLOP WILL BE
!* ASSERTED. THE 2ND PULSE WILL CLOCK THE
!* NEGATED OUTPUT OF THE PRE-FLOP INTO THE 'RUN'
!* FLOP, THUS NEGATING 'RUN'.
!*RESPONSE:
!* 'RUN (1)' DID NOT NEGATE. THIS IMPLIES THAT 'CRA2 SPEC/CONSOLE'
!* DID NOT ASSERT.
!]ERROR 1
!]SPEC10 NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
LOAD_U(0,UC_PTR1); !LOAD CRAM BITS
DO (0) WHILE
BLOCK2: BEGIN
WRT100(RESET); !DO A RESET
WRT100(0);
SET_C(0); !SET CRAM ADDR = 0
WRT212(4); !ASSERT 1ST STAGE FLOP
CP(2); !GIVE 2 CLK PULSES
IF (RD_300 AND RUN_1 ) EQL 0 !DID 'RUN (1)' NEGATE?
THEN
ERR(2); !YES, REPORT ERROR
!*MESSAGE 2
!*STIMULUS:
!* LOAD MICRO-INSTR TO NEGATE 'SPEC/CONSOLE' AND ASSERT
!* 'CRM2 # 14B'.
!* ASSERT AND NEGATE 'RESET'
!* X1 0 - SET CRAM ADDR = 0.
!* WRT 212/4 - ASSERT 'RUN' PRE-FLOP
!* CP 2 - THE 1ST CLOCK PULSE WILL EXECUTE THE MICRO-
!* INSTR TO NEGATE 'CRA2 SPEC/CONSOLE' AND
!* ASSERT 'CRM2 # 14B'. THIS SHOULD NOT NEGATE
!* THE 'RUN' PRE-FLOP. AT THE SAME TIME THE
!* 'RUN' FLOP WILL BE ASSERTED. THE 2ND PULSE
!* WILL CLOCK THE STILL ASSERTED OUTPUT OF THE
!* PRE-FLOP INTO THE 'RUN' FLOP, THUS LEAVING
!* 'RUN' ASSERTED.
!*RESPONSE:
!* 'RUN (1)' NEGATED. THIS IMPLIES THAT 'CRA2 SPEC/CONSOLE'
!* ASSERTED WHEN IT SHOULDN'T HAVE.
!]ERROR 2
!]SPEC10 NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
END;
GLOBAL ROUTINE TST40: NOVALUE =
!THIS TEST CHECKS THAT THE PARITY DETECTION NETWORK FUNCTIONS CORRECTLY.
BEGIN
LABEL BLOCK1,BLOCK2;
LOCAL
ERFLG;
OWN
EVEN_PAR_TBL: VECTOR[16] INITIAL( %O'0',
%O'400040000000',
%O'200020000000',
%O'001000000010',
%O'000400000004',
%O'000151030303',
%O'000152030303',
%O'000153010303',
%O'000153020303',
%O'000153030103',
%O'000153030203',
%O'000153030301',
%O'000153030302',
%O'776737777777',
%O'777367777777',
%O'777727777777'),
ODD_PAR_TBL: VECTOR[29] INITIAL( %O'100010400000',
%O'040004200000',
%O'020000104000',
%O'010000042000',
%O'004000001040',
%O'002000000420',
%O'000200000000',
%O'000100000000',
%O'000000000020',
%O'000000000004',
%O'000002000000',
%O'000001000000',
%O'000000020000',
%O'000000010000',
%O'000000000200',
%O'000000000100',
%O'000000000002',
%O'000000000001',
%O'000153030303',
%O'377727777777',
%O'577753777777',
%O'677777277777',
%O'737777537777',
%O'757777772777',
%O'767777775377',
%O'773777777727',
%O'775777777753',
%O'777577777777',
%O'777677777777');
ERFLG = 0; !INIT ERROR FLAG
LCA(0); !SET CRAM ADDR = 0
INCR I FROM 0 TO 15 BY 1 DO
BEGIN
DO (0) WHILE
BLOCK1: BEGIN
DC_035(.EVEN_PAR_TBL[.I]); !LOAD PATTERN INTO CRAM
CP(1); !CLOCK CRAM BITS INTO REGISTER
IF (RD_100 AND CRA_PE) EQL 0 !DID CRA PARITY ERROR ASSERT?
THEN
BEGIN
ERRS(1,1,EVEN_PAR_TBL[.I]); !YES, REPORT ERROR
ERFLG = -1; !SET ERROR FLAG
END;
!*MESSAGE 1
!*STIMULUS:
!* LC 0 - SET CRAM ADDR = 0
!* DC \O000000000000000000000 - DEPOSIT TEST PATTERN INTO
!* BITS 0-35 OF CRAM. THIS SHOULD YIELD
!* VALID EVEN PARITY.
!*RESPONSE:
!* 'CRA PARITY ERR' ASSERTED ON THE CSL BOARD.
!]ERROR 1
!]PARNET NTWK
IF LOOP_CHK(1) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK1 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
IF .ERFLG NEQ 0
THEN
RETURN;
END;
LCA(0); !SET CRAM ADDR = 0
INCR I FROM 0 TO 28 BY 1 DO
BEGIN
DO (0) WHILE
BLOCK2: BEGIN
DC_035(.ODD_PAR_TBL[.I]); !LOAD PATTERN INTO CRAM
CP(1); !CLOCK CRAM BITS INTO REGISTER
IF (RD_100 AND CRA_PE) NEQ 0 !DID CRA PARITY ERROR ASSERT?
THEN
BEGIN
ERRS(2,2,ODD_PAR_TBL[.I]); !NO, REPORT ERROR
ERFLG = -1; !SET ERROR FLAG
END;
!*MESSAGE 2
!*STIMULUS:
!* LC 0 - SET CRAM ADDR = 0
!* DC \O000000000000000000000 - DEPOSIT TEST PATTERN INTO
!* BITS 0-35 OF CRAM. THIS SHOULD YIELD
!* INVALID ODD PARITY.
!*RESPONSE:
!* 'CRA PARITY ERR' DID NOT ASSERT ON THE CSL BOARD.
!]ERROR 2
!]PARNET NTWK
IF LOOP_CHK(2) !CHECK FOR ERROR LOOPING
THEN
LEAVE BLOCK2 WITH 1; !LEAVE BLOCK TO LOOP
0 !TO PREVENT INFO MSG WHEN COMPILING
END;
IF .ERFLG NEQ 0
THEN
RETURN;
END;
END;
END
ELUDOM