;*************************** AMUS Program Label ******************************
; Filename: SSDCHK.M68                                      Date: 10/05/91
; Category: UTIL         Hash Code: 770-361-661-337      Version: 1.0(100)
; Initials: ULTR/US      Name: DAVID PALLMANN
; Company: ULTRASOFT CORPORATION                   Telephone #: 5163484848
; Related Files:
; Min. Op. Sys.: AMOSL 1.0/AMOS32 1.0          Expertise Level: INT
; Special: Run this if you suspect faulty SSD chip or CPU timing problems.
; Description: Checks SSD continually, displays failures on screen.
;*****************************************************************************

;****************************************************************************
;*                                                                          *
;*                                 SSDCHK                                   *
;*                 Utility to check integrity of your SSD                   *
;*                                                                          *
;****************************************************************************
;[100] 04 October 1991 16:51    Edited by David Pallmann
;       Created.

;version number

       VMAJOR  =1
       VMINOR  =0
       VSUB    =0
       VEDIT   =100.
       VWHO    =0

;universals

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

;variables

       .OFINI
       .OFDEF  CODES1, 64.             ; 1st set of codes read
       .OFDEF  CODES2, 64.             ; last set of codes read
       .OFDEF  CODES,  4               ; number of codes to read
       .OFDEF  PASSES, 4               ; passes made
       .OFDEF  DELAY,  4               ; delay between passes
       .OFDEF  GOOD,   4               ; good pass count
       .OFDEF  BAD,    4               ; bad pass count
       .OFSIZ  MEMSIZ

;***********
;*  START  *
;***********
;initialization

START:  PHDR    -1,0,PH$REE!PH$REU      ; program header
       GETIMP  MEMSIZ,A5               ; allocate local memory for variables

       TYPESP  SSDCHK Version          ;
       VCVT    START+2,OT$TRM          ;
       CRLF                            ;
       CRLF                            ;
       TYPECR  <This utility will continually sample the SSD chip, and will display>
       TYPECR  <warnings if the codes returned differ from one pass to the next.>
       CRLF                            ;

       TYPESP  How many passes do you want to make (default: run continually):
       KBD     EXIT                    ;
       GTDEC                           ;
       MOV     D1,PASSES(A5)           ;

       TYPESP  How many seconds do you want to pause between each pass (default: none):
       KBD     EXIT                    ;
       GTDEC                           ;
       MOV     D1,DELAY(A5)            ;

10$:    TYPESP  How many bytes do you want to read during each pass (default: 16):
       KBD     EXIT                    ;
       MOV     #16.,D1                 ;
       NUM                             ;
       BNE     20$                     ;
       GTDEC                           ;
20$:    CMP     D1,#1                   ;
       BLO     10$                     ;
       CMP     D1,#64.                 ;
       BHI     10$                     ;
       MOV     D1,CODES(A5)            ;

BEGIN:  CRLF                            ;
       MOV     PASSES(A5),D5           ;
       CLR     PASSES(A5)              ;

SAMPLE: LEA     A2,CODES1(A5)           ;
       CLR     D0                      ;
       CLR     D2                      ;
       MOV     CODES(A5),D3            ;
       CALL    REDSSD                  ;

NEW.PASS:
       CTRLC   REPORT                  ;

       INC     PASSES(A5)              ;

       MOVB    #13.,D1                 ;
       TTY                             ;

       MOV     PASSES(A5),D1           ;
       TYPESP  Pass                    ;
       DCVT    0,OT$TRM                ;
       TYPE    <, error count = >      ;
       MOV     BAD(A5),D1              ;
       DCVT    0,OT$TRM                ;

       LEA     A2,CODES2(A5)           ;
       CLR     D0                      ;
       CLR     D2                      ;
       MOV     CODES(A5),D3            ;
       CALL    REDSSD                  ;

       LEA     A0,CODES1(A5)           ;
       LEA     A1,CODES2(A5)           ;
       MOV     CODES(A5),D0            ;
10$:    CMPB    (A0)+,(A1)+             ;
       BNE     ERROR                   ;
       SOB     D0,10$                  ;
       INC     GOOD(A5)                ;
       BR      SLEEP                   ;

ERROR:  MOVB    #13.,D1                 ;
       TTY                             ;
       TYPE    <********** ERROR IN SSD BYTES READ DURING PASS >
       MOV     PASSES(A5),D1           ;
       DCVT    0,OT$TRM                ;
       TYPECR  < **********>           ;
       INC     BAD(A5)                 ;

SLEEP:  MOV     DELAY(A5),D0            ;
       JEQ     NEW.PASS                ;
       MUL     D0,#10000.              ;
       SLEEP   D0                      ;

NEXT:   CTRLC   REPORT                  ;
       DEC     D5                      ;
       JNE     NEW.PASS                ;

REPORT: CRLF                            ;
       CRLF                            ;
       TYPESP  Passes made:            ;
       MOV     PASSES(A5),D1           ;
       DCVT    0,OT$TRM                ;
       CRLF                            ;
       TYPESP  Good passes:            ;
       MOV     GOOD(A5),D1             ;
       DCVT    0,OT$TRM                ;
       CRLF                            ;
       TYPESP  Bad passes:             ;
       MOV     BAD(A5),D1              ;
       DCVT    0,OT$TRM                ;
       CRLF                            ;
       CRLF                            ;

;**********
;*  EXIT  *
;**********
;exit to AMOS command level

EXIT:   EXIT                            ; exit

;************
;*  REDSSD  *
;************
;Function:      Read codes from SSD
;
;Inputs:        D0 - SSD type code:
;                       0 - Alpha Micro SSD
;                       2 - Alpha Micro SSD on AM965 board
;               D2 - bytes to ignore count
;               D3 - bytes to return count
;               A2 - buffer address
;
;Outputs:       A2 - updated

       AMSSD1  =^H0FFFFFE00            ; AM SSD at standard address
       AMSSD2  =^H0FFFFFFAA            ; AM SSD on AM965 board

REDSSD: SAVE    A0,D1-D4                ; save registers
       CALL    SLOCK                   ; lock system                   [106]
       MOV     #AMSSD1,A0              ;
       TSTW    D0                      ; at standard address?
       BEQ     RS.INI                  ;   yes
       MOV     #AMSSD2,A0              ;
RS.INI: MOVB    #0,2(A0)                ; initialize
       MOVB    #1,2(A0)                ;   SSD
RS.IGN: TST     D2                      ; ignore count zero?
       BEQ     RS.GET                  ;   yes
10$:    MOVB    @A0,D1                  ; get first byte from SSD
       SOB     D2,10$                  ;
RS.GET: TST     D3                      ; read count zero?
       BEQ     RS.CLR                  ;   yes
10$:    MOVB    @A0,(A2)+               ;
       SOB     D3,10$                  ;
RS.CLR: MOVB    #0,2(A0)                ; reset SSD
RS.RTN: CALL    SUNLOK                  ; unlock system                 [106]
       REST    A0,D1-D4                ;
       RTN                             ; return

;***********
;*  SLOCK  *
;***********
;Function:      Lock system

SLOCK:
10$:    TST     DDBCHN                  ;
       BEQ     20$                     ;
       SLEEP   #10                     ;
       BR      10$                     ;
20$:    JLOCK                           ;
       RTN                             ;

;************
;*  SUNLOK  *
;************
;Function:      Unlock system

SUNLOK: JUNLOK                          ;
       RTN                             ;

       END