;********************************
;
;   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