\ --------------------------------------------------------------
\ history:  last revision first                ALL 14:07 28AUG95

\ ALL950828 V0.06 first release
\ ....
\ ALL950112 V0.01 first try


\ --------------------------------------------------------------
\ TMEM?         DALLAS TOUCHMEMORY             ALL 11:53 28AUG95
DECIMAL

ASSEMBLER
 P1.5 EQU   $PTM     \ define TOUCH-MEM DATA port pin
FORTH

HEX 33   EQU cTMRD  DECIMAL     \ 0F or 33 are read commands


\ --------------------------------------------------------------
\ TMEM?         DALLAS TOUCHMEMORY present?    ALL 21:13 14APR96

CODE TMEM?      ( -- t=PRESENT )    \ TM present?
    A,# 4 MOV       $PTM CLR        \ start of RESET pulse LOW
    B ,# 250 MOV    1$: B , 1$ DJNZ \ 480..960uSEC->500Tcycles
    $PTM SETB                       \ end of RESET pulse   HIGH
    B ,# 6 MOV      C CLR       \ clear CY = NO_presence
2$:     $PTM , 3$ JB            \ B: HIGH, leave loop
        B    , 2$ DJNZ          \   LOOP for 3360uSEC
        ACC  , 2$ DJNZ          \    if DATA stays LOW
    9$ SJMP                     \ STUCK LOW
3$: B ,#  40 MOV                \ 60..240uSEC-> 160Tcycles
4$: C,/ $PTM ORL    B , 4$ DJNZ \ delay CY=1=PRESENCE detect
9$: A CLR   A,# 0 SUBB   R1,A MOV   
    APUSH LJMP   END-CODE


\ --------------------------------------------------------------
\ TM><CY TM><bit0    exchange bits w/ DOW      ALL 21:14 14APR96
\ 15uS DS2401 window, then MASTER window, 60..120uS total slot

PROC TM><CY     \ exchange CY and TMdata bit
    B PUSH 
    $PTM CLR      NOP NOP NOP NOP   \ start time slot 1..15uSEC
    $PTM ,C MOV                     \ >=1uS ..6T, send CY
    B ,# 05 MOV   1$: B , 1$ DJNZ   \ ..6+2+10=18Tcycles
    C, $PTM MOV                     \ read DS_DATA ..20Tcycles
    B ,# 18 MOV   1$: B , 1$ DJNZ   \ 20+2+36=78Tcycles
    B POP                           \ =60..120uSEC =tSLOT
    $PTM SETB                       \ terminate time slot
    RET   END-PROC

CODE TM><bit0   ( c -- c' )  \ exchange bit0 and TMdata
    DP=SP   DPL INC   A,@DPTR MOVX      \ get c -> ACC
    A RRC   TM><CY LCALL   A RLC
    @DPTR,A MOVX                        \ put ACC -> c'
    NEXT LJMP   END-CODE


\ --------------------------------------------------------------
\ TMC><C TMRD TMWR   exchange bytes w/ DOW     ALL 21:15 14APR96

CODE TM><C  ( c -- c' )     \ exchange byte and TMdata
        DP=SP   DPL INC   A,@DPTR MOVX      \ get c -> ACC
        B PUSH  B ,# 8 MOV                  \ bit count=8
1$:         A RRC   TM><CY LCALL   B , 1$ DJNZ  \ send a bit
        A RRC                               \ get final bit
        B POP
        @DPTR,A MOVX                        \ put ACC -> c'
        NEXT LJMP   END-CODE

: TMRD  ( -- c )    255   TM><C        ;
: TMWR  ( c -- )          TM><C   DROP ;


\ --------------------------------------------------------------
\ CRC8          =X^8+X^5+X^4+1                 ALL 21:17 14APR96

CODE CRC8   ( crc char -- crc' )  DP=SP         \ build CRC8
            DPL INC   A,@DPTR MOVX  DPTR INC    \ charL ->ACC
            R0,A MOV                            \  -> R0
            DPL INC   A,@DPTR MOVX   R1,A MOV   \ crc -> R1
            B ,# 8 MOV    A,R0 MOV  \ B=bit count; A=char
1$:             A,R1 XRL   A RRC            \ CY=char XOR crc.0
                A,R1 MOV   2$ JNC           \ NC: bit0 was 0
                    A,# 24 XRL                  \ 18h feedbacks
2$:             A RRC   R1,A MOV            \ positition new crc
                A,R0 MOV   A RR   R0,A MOV  \ next bit to bit0
                B , 1$ DJNZ                 \ NZ: more bits
            A,R1 MOV   @DPTR,A MOVX   DPL DEC   \ put crc'
            DP=>SP LJMP   END-CODE


\ --------------------------------------------------------------
\ .tm# TML     show DOW/DS2401 data            ALL 12:43 31JAN95
\ L. shows low byte as 2 HEX chars

: .tm#  TMEM? IF
            CR
            cTMRD TM><C     \ 33h | 0Fh is RD CMD
            DROP
            0 ( -- cCRC )
            8 0 DO   TMRD DUP L. CRC8   LOOP
            IF  7 EMIT ." CRC error " THEN  \ append moaning
        THEN 
 ;

: TML   BEGIN .tm#   ESC? UNTIL ;  \ an endless loop shows DOW


\ --------------------------------------------------------------