;;; -*- Mode:LISP; Package:LAMBDA; Base:8; Readtable:ZL -*- ;;; Memory diagnostic system, includes microcode and debugging function ;; for each test, we step through all memory locations doing a write followed by ;; an immediate read. We then make a second pass of reads over the memory, verifying ;; that the pattern has been written as expected (the second phase catches ;; refresh problems in memories and also address problems. Address problems are noticed ;; when data is overwritten by a later part of the test, when the two writes should ;; have been to different addresses (SETQ FPCM16 '( (DEF-DATA-FIELD OAL-MROT 5 0) ;MROT field of microinstruction (LOCALITY M-MEM) M-GARBAGE (0) M-HUNOZ (0) M-ZERO (0) M-MINUS-ONE M-ONES (0) M-A (0) M-B (0) M-C (0) M-D (0) M-S (0) M-PAGE (0) M-PAIGE (0) ;variables used to update l2map M-1 (0) M-2 (0) M-TOM (0) M-LOOP-COUNT (0) M-CURRENT-MEMORY-DATA (0) M-TEST (0) ;Dispatch offset of current test M-STARTING-POINT (0) M-CURRENT-MEMORY-LOC (0) ;The memory location being hacked currently M-WAB (0) ;register for returned mode register data (LOCALITY A-MEM) A-GARBAGE (0) A-HUNOZ (0) A-ZERO (0) A-ONES (0) A-A (0) A-B (0) A-C (0) A-D (0) A-S (0) A-PAGE (0) A-PAIGE (0) ;variables used to update l2map A-1 (0) A-2 (0) A-TOM (0) ;top of map used to test for reload of map A-LOOP-COUNT (0) A-CURRENT-MEMORY-DATA (0) ;The data that should be at VMA A-TEST (0) ;Dispatch offset of current test A-STARTING-POINT (0) ;Starting point of next pass over memory for certain tests A-CURRENT-MEMORY-LOC (0) ;The memory location being hacked currently A-WAB (0) ;returned from status-reg (LOC 40) A-TEM1 (0) A-TEM2 (0) A-TEM3 (0) A-MAIN-MEMORY-START (0) ;First memory loc of interest, mapped to vir adr 0 A-MAIN-MEMORY-SIZE (0) ;Size of memory under test A-REPEAT-COUNT (0) ;Number of times to do the main data loop (decremented til 0) ;Below registers used by test loop TL A-WA1 (0) ;address for first cycle (write) A-RA1 (0) ;address for 2nd cycle (read) A-WA2 (0) ; " 3rd cycle (write) A-RA2 (0) ; " 4th cycle (read) A-WD1 (0) ;data for first write A-WD2 (37777777777) ;data for second write (LOCALITY D-MEM) (START-DISPATCH 3 (PLUS INHIBIT-XCT-NEXT-BIT P-BIT)) MEMORY-DATA-TESTS-INIT-DATA (DATA-ZEROES-INIT) ;ZEROES (DATA-ONES-INIT) ;ONES (DATA-FLOATING-ZEROES-INIT) ;FLOATING ZEROES (DATA-FLOATING-ONES-INIT) ;FLOATING ONES (DATA-OFFSET-FLOATING-ZEROES-INIT) ;FLOATING ZEROES, OFFSET PER ADR (DATA-OFFSET-FLOATING-ONES-INIT) ;FLOATING ONES, OFFSET PER ADR (DATA-FLOATING-ADDRESS-INIT) ;DATA IS FLOATING ADDRESS (DATA-FLOATING-ADDRESS-COM-INIT) ;DATA IS FLOATING COM OF ADDRESS (END-DISPATCH) (START-DISPATCH 3 (PLUS INHIBIT-XCT-NEXT-BIT P-BIT)) MEMORY-DATA-TESTS-INIT-ADDRESS (R-BIT) ;ZEROES, DROP THROUGH (R-BIT) ;ONES (DATA-OFFSET-FLOATING-ZEROES-ADR-INIT) ;FLOATING ZEROES (SLEEP) ;FLOATING KNAIZUK/REFRESH (DATA-OFFSET-FLOATING-ZEROES-ADR-INIT) ;FLOATING ZEROES OFFSET (DATA-OFFSET-FLOATING-ONES-ADR-INIT) ;FLOATING ONES OFFSET (R-BIT) ;DATA IS ADDRESS (R-BIT) ;DATA IS COMPLEMENT OF ADDRESS (END-DISPATCH) (START-DISPATCH 3 (PLUS INHIBIT-XCT-NEXT-BIT P-BIT)) MEMORY-DATA-TESTS-STEP-DATA (MEMORY-TEST-OK) ;ZEROES (MEMORY-TEST-OK) ;ONES (DATA-OFFSET-FLOATING-ZEROES-STEP) ;ODD ADDRESS& ODDER DATA (MEMORY-TEST-OK) ;FLOATING ONES (MEMORY-TEST-OK) ;FLOATING ZEROES OFFSET (MEMORY-TEST-OK) ;FLOATING ONES OFFSET (DATA-FLOATING-ADDRESS-STEP) ;DATA IS ADDRESS (DATA-FLOATING-ADDRESS-COM-STEP) ;DATA IS COMPLEMENT OF ADDRESS (END-DISPATCH) (START-DISPATCH 3 (PLUS INHIBIT-XCT-NEXT-BIT P-BIT)) MEMORY-DATA-TESTS-STEP-ADDRESS (R-BIT) ;ZEROES, DROP THROUGH (R-BIT) ;ONES (DATA-WALKING-ZEROES-ODD-ADDR) ;GEE I DON'T KNOW (DATA-ALT-ADR-STEP) ;ALTERNATE ONES (DATA-OFFSET-FLOATING-ZEROES-ADR-STEP) ;FLOATING ZEROES OFFSET (DATA-OFFSET-FLOATING-ONES-ADR-STEP) ;FLOATING ONES OFFSET (DATA-FLOATING-ADDRESS-ADR-STEP) ;DATA IS ADDRESS (DATA-FLOATING-ADDRESS-COM-ADR-STEP) ;DATA IS COMPLEMENT OF ADDRESS (END-DISPATCH) (LOCALITY I-MEM) (LOC 0) ;;; Main diagnostic loop, data tests INITIALIZE ((M-ONES) SETO) ; - executed only once ((M-ZERO) SETZ) (CALL MESS-L1-MAP) (CALL FLUSH-MAP-LOOP) ((MD) (A-CONSTANT 3776400)) ;code to shut off parity led ((L2-MAP-CONTROL) (A-CONSTANT 3400)) ;pkt size to byte op ((M-PAIGE) L2-MAP-PHYSICAL-PAGE) ((M-PAGE) DPB(BYTE-FIELD 2 12.) M-ONES A-PAIGE) ((M-PAGE) DPB(BYTE-FIELD 1 22.) M-ONES A-PAGE) ;for byte op ((L2-MAP-PHYSICAL-PAGE) M-PAGE) ((VMA) (A-CONSTANT #x3FFDFF)) ((MD-START-WRITE) M-ZERO) (JUMP-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) ((MD) (A-CONSTANT 3776400)) ((L2-MAP-PHYSICAL-PAGE) M-PAIGE) ((L2-MAP-CONTROL) (A-CONSTANT 1400)) ;reset pkt size for word op MEMORY-DATA-TEST ;perform init for the test ((M-ONES) SETO) ; - executed only once ((M-ZERO) SETZ) (DISPATCH MEMORY-DATA-TESTS-INIT-DATA (BYTE-FIELD 3 0) M-TEST) ;set the value of a-repeat-count (NO-OP) ;; this is the the begining of the main loop, which is done until a-repeat-count ;; has been decremented to zero. MEMORY-DATA-TEST-1 ((M-CURRENT-MEMORY-LOC) A-MAIN-MEMORY-START) ;start from the beginning memory loc ;init the address for tests 4 and 5 ;drop through the dispatch for all others (DISPATCH MEMORY-DATA-TESTS-INIT-ADDRESS (BYTE-FIELD 3 0) M-TEST) (NO-OP) ((M-LOOP-COUNT) SETZ) MEMORY-DATA-LOOP-1 (DISPATCH MEMORY-DATA-TESTS-STEP-ADDRESS (BYTE-FIELD 3 0) M-TEST) (NO-OP) ;step the address for tests 4-7 ;drop through for tests 0-3 (CALL-LESS-OR-EQUAL M-TOM A-CURRENT-MEMORY-LOC WR-MAP-LOOP) (JUMP-GREATER-THAN M-CURRENT-MEMORY-LOC A-MAIN-MEMORY-SIZE MEMORY-CHECK-LOOP-GJ) ((VMA) M-CURRENT-MEMORY-LOC) ((MD-START-WRITE) M-CURRENT-MEMORY-DATA) ;WRITE APPROPRIATE DATA (JUMP-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) MEMORY-DATA-IMMEDIATE-READBACK ;used to be readbak here ((M-LOOP-COUNT) M+A+1 M-LOOP-COUNT A-ZERO) ;increment loop counter (JUMP-LESS-THAN-XCT-NEXT M-LOOP-COUNT A-MAIN-MEMORY-SIZE MEMORY-DATA-LOOP-1) ;jump to check data after resetting maps ((M-CURRENT-MEMORY-LOC) M+A+1 M-CURRENT-MEMORY-LOC A-ZERO) ;increment memory location counter ;; NOW WE HAVE WRITTEN A DATA PATTERN, READ IT BACK AND INSURE IT IS CORRECT ;; - identical to memory-data-loop except that we only read MEMORY-CHECK-LOOP-GJ ;routine to reset l2 map to bottom of 16M board (CALL FLUSH-MAP-LOOP) (DISPATCH MEMORY-DATA-TESTS-INIT-ADDRESS (BYTE-FIELD 3 0) M-TEST) (NO-OP) MEMORY-CHECK-LOOP ((M-CURRENT-MEMORY-LOC) A-MAIN-MEMORY-START) (DISPATCH MEMORY-DATA-TESTS-INIT-ADDRESS (BYTE-FIELD 3 0) M-TEST) (NO-OP) ((M-LOOP-COUNT) SETZ) MEMORY-CHECK-LOOP-1 (DISPATCH MEMORY-DATA-TESTS-STEP-ADDRESS (BYTE-FIELD 3 0) M-TEST) (NO-OP) (CALL-LESS-OR-EQUAL M-TOM A-CURRENT-MEMORY-LOC WR-MAP-LOOP) (JUMP-GREATER-THAN M-CURRENT-MEMORY-LOC A-MAIN-MEMORY-SIZE PROCEED) ((VMA-START-READ) M-CURRENT-MEMORY-LOC) (JUMP-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) MEMORY-CHECK (CALL-NOT-EQUAL-XCT-NEXT MD A-CURRENT-MEMORY-DATA ERROR-WRONG-DATA) ((M-LOOP-COUNT) M+A+1 M-LOOP-COUNT A-ZERO) (JUMP-LESS-THAN-XCT-NEXT M-LOOP-COUNT A-MAIN-MEMORY-SIZE MEMORY-CHECK-LOOP-1) ((M-CURRENT-MEMORY-LOC) M+A+1 M-CURRENT-MEMORY-LOC A-ZERO) PROCEED (CALL PARITY-CHECK) (CALL FLUSH-MAP-LOOP) (DISPATCH MEMORY-DATA-TESTS-STEP-DATA (BYTE-FIELD 3 0) M-TEST) (NO-OP) (JUMP-LESS-THAN-XCT-NEXT M-ZERO A-REPEAT-COUNT MEMORY-DATA-TEST-1) ((A-REPEAT-COUNT) ADD M-MINUS-ONE A-REPEAT-COUNT) MEMORY-TEST-OK (JUMP HALT-CONS MEMORY-TEST-OK) (NO-OP) ERROR-BAD-PAGE-FAULT (JUMP HALT-CONS ERROR-BAD-PAGE-FAULT) (NO-OP) ERROR-PARITY-ERROR (JUMP HALT-CONS ERROR-PARITY-ERROR) (NO-OP) ERROR-WRONG-DATA (NO-OP HALT-CONS) ;DATA ERROR, CONTINUABLE (POPJ) (NO-OP) ;SO PC SAYS ERROR-WRONG-DATA INSTEAD OF DATA-ZEROS WHEN IT STOPS ;;; Data tests ;; the zeroes test writes 0 in all memory locations and then checks DATA-ZEROES DATA-ZEROES-INIT (POPJ-AFTER-NEXT (A-REPEAT-COUNT) M+A+1 M-ZERO A-ZERO) ((M-CURRENT-MEMORY-DATA) SETZ) DATA-ONES ;; the ones test writes -1 in all locations and then checks DATA-ONES-INIT (POPJ-AFTER-NEXT (A-REPEAT-COUNT) M+A+1 M-ZERO A-ZERO) ((M-CURRENT-MEMORY-DATA) SETO) DATA-FLOATING-ZEROES ;; the floating zeroes test inits current-memory-data to 17777777777 ;; and then rotates current-memory-data on each step. we get a pattern in which ;; the bits walk as the addresses increment DATA-FLOATING-ZEROES-INIT ((M-STARTING-POINT) (BYTE-FIELD 37 0) M-ONES A-ZERO) (POPJ-AFTER-NEXT (A-REPEAT-COUNT) (A-CONSTANT 16.)) ((M-CURRENT-MEMORY-DATA) (BYTE-FIELD 37 0) M-ONES A-ZERO) DATA-FLOATING-ZEROES-STEP ((M-CURRENT-MEMORY-DATA) (BYTE-FIELD 40 1) M-CURRENT-MEMORY-DATA) (POPJ) DATA-FLOATING-ONES ;; the floating ones test is like the floating zeroes except that we init ;; current-memory-data to 20000000000 SLEEP ((M-WAB) (A-CONSTANT 1_25)) SLEEP-1 ((M-WAB) M-A-1 M-WAB A-ZERO) (JUMP-NOT-EQUAL M-WAB A-ZERO SLEEP-1) DATA-FLOATING-ONES-INIT (POPJ-AFTER-NEXT (A-REPEAT-COUNT) (A-CONSTANT 1.)) ((M-CURRENT-MEMORY-DATA) (A-CONSTANT 12525252525)) DATA-WALKING-ZEROES-ODD-ADDR ((M-CURRENT-MEMORY-LOC) ADD M-CURRENT-MEMORY-LOC (A-CONSTANT 2)) ((M-LOOP-COUNT) ADD M-LOOP-COUNT (A-CONSTANT 2)) DATA-FLOATING-ONES-STEP ((M-CURRENT-MEMORY-DATA) (BYTE-FIELD 40 1) M-CURRENT-MEMORY-DATA) (POPJ) DATA-ALT-ADR-STEP ((M-CURRENT-MEMORY-DATA) SUB M-CURRENT-MEMORY-DATA (A-CONSTANT #x55555555)) (POPJ-NOT-EQUAL M-CURRENT-MEMORY-DATA A-ZERO) ((M-CURRENT-MEMORY-DATA) A-ONES) (POPJ) DATA-OFFSET-FLOATING-ZEROES ;; the diference between the floating tests and the offset floating tests ;; is that m-starting-point is initialized by the same al DATA-OFFSET-FLOATING-ZEROES-INIT (POPJ-AFTER-NEXT M-STARTING-POINT (BYTE-FIELD 37 0) M-ONES A-ZERO) ((A-REPEAT-COUNT) (A-CONSTANT 1.)) DATA-OFFSET-FLOATING-ZEROES-ADR-INIT ((M-CURRENT-MEMORY-DATA) M-STARTING-POINT) (POPJ) DATA-OFFSET-FLOATING-ZEROES-ADR-STEP ((M-CURRENT-MEMORY-DATA) (BYTE-FIELD 40 1) M-CURRENT-MEMORY-DATA) (POPJ) DATA-OFFSET-FLOATING-ZEROES-STEP ((M-STARTING-POINT) (BYTE-FIELD 40 1) M-STARTING-POINT) (POPJ) DATA-OFFSET-FLOATING-ONES DATA-OFFSET-FLOATING-ONES-INIT (POPJ-AFTER-NEXT (M-STARTING-POINT) DPB (BYTE-FIELD 1 37) M-ONES A-ZERO) ((A-REPEAT-COUNT) (A-CONSTANT 1.)) DATA-OFFSET-FLOATING-ONES-ADR-INIT ((M-CURRENT-MEMORY-DATA) M-STARTING-POINT) (POPJ) DATA-OFFSET-FLOATING-ONES-ADR-STEP ((M-CURRENT-MEMORY-DATA) (BYTE-FIELD 40 1) M-CURRENT-MEMORY-DATA) (POPJ) DATA-OFFSET-FLOATING-ONES-STEP ((M-STARTING-POINT) (BYTE-FIELD 40 1) M-STARTING-POINT) (POPJ) DATA-FLOATING-ADDRESS DATA-FLOATING-ADDRESS-INIT (POPJ-AFTER-NEXT (M-STARTING-POINT) SETZ) ((A-REPEAT-COUNT) (A-CONSTANT 1.)) DATA-FLOATING-ADDRESS-ADR-STEP (POPJ-AFTER-NEXT (OA-REG-LOW) DPB M-STARTING-POINT OAL-MROT A-ZERO) ((M-CURRENT-MEMORY-DATA) LDB (BYTE-FIELD 40 0) M-CURRENT-MEMORY-LOC A-ZERO) DATA-FLOATING-ADDRESS-STEP ((M-STARTING-POINT) M+A+1 M-STARTING-POINT A-ZERO) (POPJ) DATA-FLOATING-ADDRESS-COM DATA-FLOATING-ADDRESS-COM-INIT ((M-CURRENT-MEMORY-DATA) (A-CONSTANT #XFFFF)) (POPJ-AFTER-NEXT (M-STARTING-POINT) SETZ) ((A-REPEAT-COUNT) (A-CONSTANT 16.)) DATA-FLOATING-ADDRESS-COM-ADR-STEP ((M-CURRENT-MEMORY-DATA) LDB(BYTE-FIELD 40 1) M-CURRENT-MEMORY-DATA A-ZERO) (POPJ) DATA-FLOATING-ADDRESS-COM-STEP ((M-CURRENT-MEMORY-DATA) LDB(BYTE-FIELD 40 1) M-CURRENT-MEMORY-DATA A-ZERO) ((M-STARTING-POINT) M+A+1 M-STARTING-POINT A-ZERO) ;increment starting-point (POPJ) ;separate little test loop TL ((MD) A-WD1) ((VMA-START-WRITE) A-WA1) (CALL-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) ((VMA-START-READ) A-RA1) (CALL-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) ((MD) A-WD2) ((VMA-START-WRITE) A-WA2) (CALL-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) ((VMA-START-READ) A-RA2) (CALL-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) (JUMP TL) (NO-OP) ;;;follows are the map-maintenance routines. WR-MAP-LOOP updates the 4k entries in ;;;the l2 map phy page to point to the next contiguous 4meg byte or 1meg word memory ;;;location. FLUSH-MAP-LOOP adjusts the map to point at the first 4meg byte of phy ;;;memory on the board WR-MAP-LOOP ((MD) A-ZERO) WR-MAP-LOOP-1 ((M-PAGE) L2-MAP-PHYSICAL-PAGE) ;GET OUT MAP DATA ((M-PAIGE) LDB (BYTE-FIELD 14 14) M-PAGE A-ZERO) ((M-PAIGE) M+A+1 M-PAIGE A-ZERO) ;INCREMENT REALLY ONLY TWO BITS ((M-PAGE) DPB (BYTE-FIELD 2 14) M-PAIGE A-PAGE) ((L2-MAP-PHYSICAL-PAGE) M-PAGE) ;PUT DATA BACK THERE ((M-PAGE) MD) ;GET READY TO TEST FOR OVERFLOW ((M-PAGE) ADD (A-CONSTANT 400) M-PAGE) ;BUMP MD,ITS A MAP ADDRESS ((MD) M-PAGE) ;PUT NEXT ADDRESS AWAY (JUMP-LESS (A-CONSTANT 4000000) M-PAGE WR-MAP-LOOP-1) ;IS THE MAP FULL? UPDATE-ATOM ((M-PAIGE) DPB(BYTE-FIELD 2. 20.) M-PAIGE A-ZERO) ((M-TOM) ADD M-PAIGE (A-CONSTANT 4000000)) (POPJ) FLUSH-MAP-LOOP ((MD) A-ZERO) FLUSH-MAP-LOOP-1 ((M-PAGE) L2-MAP-PHYSICAL-PAGE) ;GET OUT MAP DATA ((M-PAGE) DPB (BYTE-FIELD 2 14) M-ZERO A-PAGE) ((M-PAIGE) LDB (BYTE-FIELD 2 14) M-PAGE A-ZERO) ((L2-MAP-PHYSICAL-PAGE) M-PAGE) ;PUT DATA BACK THERE ((M-PAGE) MD) ;GET READY TO TEST FOR OVERFLOW ((M-PAGE) ADD (A-CONSTANT 400) M-PAGE) ;BUMP MD,ITS A MAP ADDRESS ((MD) M-PAGE) ;PUT NEXT ADDRESS AWAY (JUMP-LESS (A-CONSTANT 4000000) M-PAGE FLUSH-MAP-LOOP-1) ;IS THE MAP FULL? (JUMP UPDATE-ATOM) MESS-L1-MAP ((MD) A-ZERO) ((M-PAIGE) A-ZERO) MESS-A ((L1-MAP) M-PAIGE) ((M-PAIGE) M+A+1 M-PAIGE A-ZERO) (CALL-GREATER M-PAIGE (A-CONSTANT 177) KLUGE) ((M-PAGE) MD) ;GET READY TO TEST FOR OVERFLOW ((M-PAGE) ADD M-PAGE (A-CONSTANT 1_13.)) ((MD) M-PAGE) (JUMP-LESS M-PAGE (A-CONSTANT 1_25.) MESS-A) (POPJ) KLUGE ((M-PAIGE) A-ZERO) (POPJ) PARITY-CHECK ((A-WA2) VMA) ((A-WA1) MD) ((MD) (A-CONSTANT 3776400)) ;setup for mem-mode-read parity ((L2-MAP-CONTROL) (A-CONSTANT 3400)) ((M-PAIGE) L2-MAP-PHYSICAL-PAGE) ((M-PAGE) DPB(BYTE-FIELD 2 14) M-ONES A-PAIGE) ((M-PAGE) DPB(BYTE-FIELD 1 22.) M-ONES A-PAGE) ;for byte ops ((L2-MAP-PHYSICAL-PAGE) M-PAGE) ((M-WAB) (A-CONSTANT #x3FFDFF)) ((VMA-START-READ) M-WAB) (JUMP-IF-PAGE-FAULT ERROR-BAD-PAGE-FAULT) ((M-WAB) MD) ((MD) (A-CONSTANT 3776400)) ((L2-MAP-CONTROL) (A-CONSTANT 1400)) ((L2-MAP-PHYSICAL-PAGE) M-PAIGE) (JUMP-IF-BIT-SET (BYTE-FIELD 1 2) M-WAB ERROR-PARITY-ERROR) ((MD) A-WA1) ((VMA) A-WA2) (POPJ) )) ;END OF MICROCODE