;********************************
;
; MEMTST - memory diagnostic
;
;********************************
;3.0 17-Jul-84 DFP version 3 created by D. Pallmann.
;3.1 19-Jul-84 DFP correct bug in addr/comp tests.
;3.2 19-Jul-84 DFP add option 0 (all tests).
VMAJOR=3
VMINOR=2
SEARCH SYS
SEARCH SYSSYM
ADR=A4
MEM=A5
INDEX=D3
READ=D4
WRITE=D5
.OFINI
.OFDEF START,4
.OFDEF COUNT,4
.OFDEF ERRCNT,4
.OFDEF LOGFIL,D.DDB
.OFSIZ MEMSIZ
DEFINE CNE ADDR
BEQ 1$$
CALL ADDR
1$$:
ENDM
;********************
;
; Initialization
;
;********************
MEMTST: PHDR -2,0,PH$REE!PH$REU ;program header
GETIMP MEMSIZ,MEM ;allocate local memory
CRLF
CRLF
TYPECR **********************
TYPECR LMS TECHNICAL SERVICES
TYPESP MEMORY DIAGNOSTIC
VCVT MEMTST+2,OT$TRM
CRLF
TYPECR **********************
;*********************************************
;
; Check for log-file spec on command line
;
;*********************************************
CHKLOG: CLR LOGFIL+D.FIL(MEM)
BYP
LIN
BEQ GETADR
FSPEC LOGFIL(MEM),LOG
INIT LOGFIL(MEM)
LOOKUP LOGFIL(MEM)
BNE 10$
DSKDEL LOGFIL(MEM)
10$: OPENO LOGFIL(MEM)
;***************************************
;
; Get Starting and Ending Addresses
;
;***************************************
GETADR: CRLF
USRFRE D0
MOV D0,START(MEM)
USREND D1
SUB D0,D1
MOV D1,COUNT(MEM)
TYPESP Starting address (RETURN for own partition):
KBD EXIT
BYP
NUM
BNE SETUP
MOV A2,A3
GTOCT
CMPB @A2,#'K ;nnnK
BNE 10$
MOV A3,A2
GTDEC
MUL D1,#1024.
BR 20$
10$: CMPB @A2,#'M ;nnnMB
BNE 20$
MOV A2,A2
GTDEC
MUL D1,#1024.
MUL D1,#1024.
20$: MOV D1,START(MEM)
ENDADR: TYPESP Ending address:
KBD EXIT
BYP
NUM
JNE GETADR
MOV A2,A3
GTOCT
CMPB @A2,#'K ;nnnK
BNE 10$
MOV A3,A2
GTDEC
MUL D1,#1024.
BR 20$
10$: CMPB @A2,#'M ;nnnMB
BNE 20$
MOV A3,A2
GTDEC
MUL D1,#1024.
MUL D1,#1024.
20$: MOV START(MEM),D0
SUB D0,D1
MOV D1,COUNT(MEM)
SETUP: CRLF
TYPESP Ready to test addresses
MOV START(MEM),D1
OCVT 0,OT$TRM!OT$TSP
TYPESP through
MOV COUNT(MEM),D0
ADD D0,D1
OCVT 0,OT$TRM!OT$TSP
TYPE (
MOV COUNT(MEM),D1
DCVT 0,OT$TRM!OT$TSP
TYPECR bytes).
;*****************
;
; Select Test
;
;*****************
SELECT: JOBIDX A0
ANDW #^C<J.CCC>,JOBSTS(A0) ;clear ^C
CRLF
TYPECR <0. All tests>
TYPECR <1. Zeroes test>
TYPECR <2. Ones test>
TYPECR <3. Address test>
TYPECR <4. Complement test>
TYPECR <5. Walking 0-bit left test>
TYPECR <6. Walking 0-bit right test>
TYPECR <7. Walking 1-bit left test>
TYPECR <8. Walking 1-bit right test>
TYPECR <9. Exit>
CRLF
TYPESP Test >
KBD
CRLF
CTRLC DONE
NUM
JNE SELECT
GTDEC
CMP D1,#0
JLT SELECT
CMP D1,#9.
JEQ DONE
JGT SELECT
BRANCH: ADD D1,D1
MOVW JMPTBL[~D1],D1
CALL JMPTBL[~D1]
JMP SELECT
JMPTBL: WORD TEST0-JMPTBL
WORD TEST1-JMPTBL
WORD TEST2-JMPTBL
WORD TEST3-JMPTBL
WORD TEST4-JMPTBL
WORD TEST5-JMPTBL
WORD TEST6-JMPTBL
WORD TEST7-JMPTBL
WORD TEST8-JMPTBL
DONE: MOV ERRCNT(MEM),D1
DCVT 0,OT$TRM!OT$TSP
TYPECR errors detected.
LSTLOG: TST LOGFIL+D.FIL(MEM)
BEQ EXIT
TST ERRCNT(MEM)
BEQ EXIT
TYPESP Errors logged in
PFILE LOGFIL(MEM)
TYPECR .
EXIT: CRLF
TST LOGFIL+D.FIL(MEM)
BEQ 10$
CLOSE LOGFIL(MEM)
10$: EXIT
PAGE
;***********************
;
; TEST0 - all tests
;
;***********************
TEST0: TYPECR 1. zeroes test
CALL TEST1
CTRLC 10$
TYPECR 2. ones test
CALL TEST2
CTRLC 10$
TYPECR 3. address test
CALL TEST3
CTRLC 10$
TYPECR 4. complement test
CALL TEST4
CTRLC 10$
TYPECR 5. walking 0 bit left test
CALL TEST5
CTRLC 10$
TYPECR 6. walking 0 bit right test
CALL TEST6
CTRLC 10$
TYPECR 7. walking 1 bit left test
CALL TEST7
CTRLC 10$
TYPECR 8. walking 1 bit right test
CALL TEST8
10$: RTN
PAGE
;*************************
;
; TEST1 - zeroes test
;
;*************************
TEST1: CALL INIT
CLR WRITE
10$: CTRLC 30$
MOVB WRITE,(ADR)+
SOB INDEX,10$
CALL INIT
20$: CTRLC 30$
MOVB (ADR)+,READ
CNE ERROR
SOB INDEX,20$
30$: RTN
;***********************
;
; TEST2 - ones test
;
;***********************
TEST2: CALL INIT
SET WRITE
10$: CTRLC 30$
MOVB WRITE,(ADR)+
SOB INDEX,10$
CALL INIT
20$: CTRLC 30$
MOVB (ADR)+,READ
CMPB READ,WRITE
CNE ERROR
SOB INDEX,20$
30$: RTN
;**************************
;
; TEST3 - address test
;
;*************************(
TEST3: CALL INIT
10$: CTRLC 30$
MOV ADR,WRITE
MOVB WRITE,(ADR)+
SOB INDEX,10$
CALL INIT
20$: CTRLC 30$
MOV ADR,WRITE
MOVB (ADR)+,READ
CMPB READ,WRITE
CNE ERROR
SOB INDEX,20$
30$: RTN
;*****************************
;
; TEST4 - complement test
;
;*****************************
TEST4: CALL INIT
10$: CTRLC 30$
MOV ADR,WRITE
COM WRITE
MOVB WRITE,(ADR)+
SOB INDEX,10$
CALL INIT
20$: CTRLC 30$
MOV ADR,WRITE
COM WRITE
MOVB (ADR)+,READ
CMPB READ,WRITE
CNE ERROR
SOB INDEX,20$
30$: RTN
;*************************************
;
; TEST5 - walking 0 bit left test
;
;*************************************
TEST5: CALL INIT
10$: LEA A0,TBL.0L
MOV #8.,D0
20$: CTRLC 30$
MOVB @A0,WRITE
MOVB WRITE,@ADR
MOVB (ADR)+,READ
CMPB READ,WRITE
CNE ERROR
INC A0
DEC ADR
SOB D0,20$
INC ADR
SOB INDEX,10$
30$: RTN
TBL.0L: BYTE ^C<1_0>,^C<1_1>,^C<1_2>,^C<1_3>
BYTE ^C<1_4>,^C<1_5>,^C<1_6>,^C<1_7>
;**************************************
;
; TEST6 - walking 0 bit right test
;
;*************************************(
TEST6: CALL INIT
10$: LEA A0,TBL.0R
MOV #8.,D0
20$: CTRLC 30$
MOVB @A0,WRITE
MOVB WRITE,@ADR
MOVB (ADR)+,READ
CMPB READ,WRITE
CNE ERROR
INC A0
DEC ADR
SOB D0,20$
INC ADR
SOB INDEX,10$
30$: RTN
TBL.0R: BYTE ^C<1_7>,^C<1_6>,^C<1_5>,^C<1_4>
BYTE ^C<1_3>,^C<1_2>,^C<1_1>,^C<1_0>
;*************************************
;
; TEST7 - walking 1 bit left test
;
;*************************************
TEST7: CALL INIT
10$: LEA A0,TBL.1L
MOV #8.,D0
20$: CTRLC 30$
MOVB @A0,WRITE
MOVB WRITE,@ADR
MOVB (ADR)+,READ
CMPB READ,WRITE
CNE ERROR
INC A0
DEC ADR
SOB D0,20$
INC ADR
SOB INDEX,10$
30$: RTN
TBL.1L: BYTE 1_0,1_1,1_2,1_3,1_4,1_5,1_6,1_7
;**************************************
;
; TEST8 - walking 1 bit right test
;
;**************************************
TEST8: CALL INIT
10$: LEA A0,TBL.1R
MOV #8.,D0
20$: CTRLC 30$
MOVB @A0,WRITE
MOVB WRITE,@ADR
MOVB (ADR)+,READ
CMPB READ,WRITE
CNE ERROR
INC A0
DEC ADR
SOB D0,20$
INC ADR
SOB INDEX,10$
30$: RTN
TBL.1R: BYTE 1_7,1_6,1_5,1_4,1_3,1_2,1_1,1_0
;***********
;
; ERROR
;
;***********
ERROR: SAVE A0,D1
TST ERRCNT(MEM)
BNE 10$
MOV #7,D1
TTY
10$: AND #377,READ
AND #377,WRITE
TYPESP *** ERROR AT ADDRESS
MOV ADR,D1
DEC D1
OCVT 0,OT$TRM
TYPE <, WROTE >
MOV WRITE,D1
CALL BINARY
TYPE <, READ >
MOV READ,D1
CALL BINARY
CRLF
INC ERRCNT(MEM)
ERRLOG: TST LOGFIL+D.FIL(MEM)
BEQ 10$
LEA A0,ERRTXT
CALL PUTSTR
MOV ADR,D1
DEC D1
CALL PUTOCT
LEA A0,ERRTX2
CALL PUTSTR
MOV WRITE,D1
CALL PUTBIN
LEA A0,ERRTX3
CALL PUTSTR
MOV READ,D1
CALL PUTBIN
LEA A0,ERRTX4
CALL PUTSTR
10$: REST A0,D1
RTN
PUTSTR: SAVE A0,D1
10$: MOVB (A0)+,D1
BEQ 20$
FILOTB LOGFIL(MEM)
BR 10$
20$: REST A0,A1
RTN
PUTBIN: SAVE D0-D2
MOV #8.,D0
MOV D1,D2
10$: ASLB D2,#1
BLO 20$
MOVB #'0,D1
BR 30$
20$: MOVB #'1,D1
30$: FILOTB LOGFIL(MEM)
SOB D0,10$
REST D0-D2
RTN
PUTOCT: SAVE A2
LEA A2,LOGFIL(MEM)
OCVT 0,OT$DDB
REST A2
RTN
INIT: MOV START(MEM),ADR
MOV COUNT(MEM),INDEX
RTN
BINARY: SAVE D0
MOV #8.,D0
10$: ASLB D1,#1
BLO 20$
TYPE 0
BR 30$
20$: TYPE 1
30$: SOB D0,10$
REST D0
RTN
ERRTXT: ASCIZ /*** ERROR @ADDRESS /
ERRTX2: ASCIZ /: WROTE /
ERRTX3: ASCIZ /, READ /
ERRTX4: BYTE 15,12,0
EVEN
END