$TITLE ('INTERNAL ETERNAL RAM, PROM-CRC CHECK ROUTINE 09/23/83')

    PUBLIC    RAM_ROM_CHK,DUM_X

    EXTRN     CODE    (CRC_ROUTINE)
    EXTRN     BIT     (BLOCK_BIT)
    EXTRN     BYTE    (BYTE_IN,CRC_WORD,ERROR_LOC,INT_RAM_ERROR)
    EXTRN     BYTE    (EXT_RAM_ERROR,PROM_ERROR)

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;             INT RAM CHECK
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

               MOV    R0,#8                   ;START W B 1   
 DO_AGAIN:
        SET    0E8H.8                  ;DISABLE
        MOV    A,@R0                   ;GET INT RAM
        MOV    R4,A                    ;STORE

        MOV    @R0,#55H                ;055H TEST
        CJNE   @R0,#55H,BAD_55_ONCE
        MOV    @R0,#0AAH               ;0AAH TEST
        CJNE   @R0,#0AAH,BAD_AA_ONCE
        MOV    A,R4                    ;RETURN
        MOV    @R0,A                   ;INT_RAM

        CLR    0E8H.8                  ;ENABLE
        MOV    R5,#0
        MOV    R6,#0
        INC    R0
        CJNE   R0,#080H,DO_AGAIN
        JMP    DONE_1                  ;INT RAM OK

 BAD_55_ONCE:
        INC    R5
        CJNE   R5,02,DO_AGAIN_1
        JMP    BAD_INT
 BAD_AA_ONCE:
        INC    R6
        CJNE   R6,02,DO_AGAIN_1
 BAD_INT:
        MOV    DPTR,#ERROR_LOC
        MOVX   @DPTR,R0
        MOV    DPTR,#INT_RAM_ERROR
        JMP    RAM_ROM_ERROR


;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;             EXT RAM CHECK
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


 DONE_1:
        MOV    R0,#0
        MOV    R1,#0
        MOV    DPTR,#0000

 DO_AGAIN_2:
        SET    0E8H.8                  ;DISABLE
        MOVX   A,@DPTR                 ;GET EXT RAM
        MOV    R4,A                    ;STORE
        MOV    A,#055H                 ;055H TEST
        CALL   LOAD_CHK
        CJNE   A,#055H,BAD_55_TWICE
        MOV    A,#0AAH                 ;0AAH TEST
        CALL   LOAD_CHK
        CJNE   A,#0AAH,BAD_AA_TWICE
        INC    DPTR
        INC    R0                      ;INC DPTR
        JNC    OK
        INC    R1
        MOV    R5,#0
        MOV    R6,#0                   ;ZERO BAD CHK
 OK:
        MOV    DPL,R1                  ;RELOAD DPTR
        MOV    DPH,R2
        CJNE   R2,#03FH,DO_AGAIN_2
        CJNE   R1,#0FFH,DO_AGAIN_2
        JMP    DONE_2                  ;INC DPTR

 BAD_55_TWICE:
        INC    R5
        CJNE   R5,#02,DO_AGAIN_2
        JMP    BAD_EXT
 BAD_AA_TWICE:
        INC    R6
        CJNE   R6,#02,DO_AGAIN_2
 BAD_EXT:
        MOV    DPTR,#ERROR_LOC
        MOV    R1,A
        MOVX   DPTR,@A
        MOV    R2,A
        INC    DPTR
        MOVX   DPTR,@A

        MOV    DPTR,#EXT_RAM_ERROR
        JMP    RAM_PROM_ERROR


 LOAD_CHK:
        MOVX   DPRT,@A
        MOVX   A,@DPTR
        RET

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;                PROM CHECK
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


 DONE_2:
        JB     BLOCK_BIT,DONE_2        ;WAIT FOR NO SMART_T

        MOV    DPTR,#DUM_X             ;LOOP VARIABLE
        MOV    A,#0
        MOVX   DPTR,@A
 CRC_LOOP:
        MOV    R0,#0
        CJNE   A,#00,PROM_2
        MOV    R2,#00
        MOV    R3,#03FH
        JMP    CRC_RUN
 PROM_2:
        CJNE   A,#01,PROM_3
        MOV    R2,#40H
        MOV    R3,#07FH
        JMP    CRC_RUN
 PROM_3:
        CJNE   A,#02,PROM_4
        MOV    R2,#080H
        MOV    R3,#0BFH
 PROM_4:
        MOV    R2,#0C0H
        MOV    R3,#0FFH

 CRC_RUN:
        INC    A
        CJNE   A,#04,END_CHK
        MOVX   DPTR,@A

        MOV    DPTR,#CRC_WORD          ;CLR CRC_WORD
        MOV    A,#0
        MOV    DPTR,@A
        INC    DPTR
        MOV    DPTR,@A

        MOV    A,R1                    ;BYTE INDEX INTO DPTR
        MOV    DPH,R2
        MOV    DPL,#00

 LOOPER:
        JB     BLOCK_BIT,DONE_2
        MOV    A,@A, +DPTR
        MOV    DPTR,#BYTE_IN
        MOVX   DPTR,@A
        LCALL  CRC_ROUTINE
        CJNE   R1,#0FFH,OK_2
        MOV    A,R3
        CJNE   A,R2,OK_3

        MOV    DPTR,#DUM_X              ;GET INDEX INTO CRC STORAGE
        MOVX   A,@DPTR
        MOV    R2,A
        ADD    A,R2
        MOV    DPL,#0F8H
        MOV    DPH,#0FFH
        MOVC   A,@A +DPTR

        MOV    R2,A                     ;COMPAIR CRC W CRC_WORD
        INC    DPTR
        MOV    R3,A
        MOV    DPTR,#CRC_WORD
        MOVX   A,@DPTR
        CJNE   A,R2,BAD_PROM
        INC    DPTR
        MOVX   A,@DPTR
        CJNE   A,R3,BAD_PROM

        MOV    DPTR,#DUM_X
        MOVX   A,@DPTR
        JMP    CRC_LOOP

 OK_3:
        MOV    R1,#0
        INC    R2
        JMP    OK_4
 OK_2:
        INC    R1
 OK_4:
        MOV    A,R1
        MOV    DPH,R2
        MOV    DPL,#0
        JMP    LOOPER

 BAD_PROM:
        MOV    DPTR,#DUM_X
        MOVX   A,@DPTR
        MOV    DPTR,#ERROR_LOC
        MOVX   DPTR,@A

        MOV    DPTR,#PROM_ERROR

 RAM_ROM_ERROR:
        MOV    A,#0FFH
        MOVX   DPTR,@A

 END_CHK:

        END
