; Orange programmer module v3.9.2 ; (c) 2000-2011 CnCLab ; Dallas iButton ; CHIP=DS1992,128(32),ds1993.hpl ; CHIP=DS1993,512(32),ds1993.hpl ; Connect P1 - DATA, GND - GND ; May be speed correction need for other PC ; CRC=x^8 + x^5 + x^4 + 1 ; LSB first ; Tested! SOCKET=0 ALLPINS=0 PING=GND,0 PING=SDA,1 CDELAY = 0 ; one set delay R9=CRC,H [_RESET] R8=0 ; status SDA=1,P=200 IDISABLE SDA=0,P=650 SDA=1 P=1 ; Wait answer LOOP=(0,10000){ R8[0]=SDA R8[0]?0{BREAK} } R8[0]?1{R8[1]=1} ;check state timeout LOOP=(0,10000){ R8[0]=SDA R8[0]?1{BREAK} } R8=^1; IENABLE P=1000 [_CRCBYTE] LOOP=(0,7){ ; BITS LOOP R0=R1 R0=^R9 R0=&1 ; CF R0?1{R9=^0x18} ;R9[8]=R9[0] R9=>>1,R9=&0xFF R0=<<7 R9=|R0 R1=>>1 } [_CRCALL] ADR=0 R9=0 LOOP=(0,7){ ; BYTES LOOP R1=DATA ; DATA _CRCBYTE ADR=+1 } [INIT] GND=0,SDA=1,P=50000 ;_RESET ;R8?!0{PRINT=("ANSWER ERROR %lX",R0),EXIT} [_TBYTE] R1=0 LOOP=(0,7){ SDA=0,P=5 SDA=R0[I] P=3 R1[I]=SDA P=70 SDA=1 P=20 } [_RBYTE] R0=0xFF,_TBYTE [READBLOCK] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 IDISABLE R0=0xCC,_TBYTE ;Skip ROM R0=0xF0,_TBYTE ;Read Memory R0=ADR,R0=&0xFF,_TBYTE R0=ADR,R0=/256,_TBYTE R9=0 LOOP=($BLOCKSIZE){_RBYTE,DATA=R1,ADR=+1,_CRCBYTE} IENABLE ;PRINT=("CRC: %03lXH",R9) [WRITEBLOCK] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 IDISABLE R0=0xCC,_TBYTE ;Skip ROM R0=0x0F,_TBYTE ;Write Scratchpad R0=ADR,R0=&0xFF,_TBYTE R0=ADR,R0=/256,_TBYTE LOOP=(0,31){R0=DATA,_TBYTE,ADR=+1} IENABLE _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 IDISABLE R0=0xCC,_TBYTE ;Skip ROM R0=0xAA,_TBYTE ;Read Scratchpad _RBYTE,R2=R1 ;TA1 _RBYTE,R3=R1 ;TA2 _RBYTE,R4=R1 ;E/S _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 IDISABLE R0=0xCC,_TBYTE ;Skip ROM R0=0x55,_TBYTE ;Copy Scratchpad R0=R2,_TBYTE ;TA1 R0=R3,_TBYTE ;TA2 R0=R4,_TBYTE ;E/S P=100 [ReadRomID] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 IDISABLE R0=0x33,_TBYTE R9=0 _RBYTE,R2=R1,_CRCBYTE _RBYTE,R3=R1,_CRCBYTE _RBYTE,R4=R1,_CRCBYTE _RBYTE,R5=R1,_CRCBYTE _RBYTE,R6=R1,_CRCBYTE _RBYTE,R7=R1,_CRCBYTE _RBYTE,R8=R1,_CRCBYTE _RBYTE,RB=R1 ; ,_CRCBYTE IENABLE RB?R9{ PRINT=("ID = %02lX %02lX%02lX%02lX%02lX%02lX%02lX %02lX",R2, R8,R7,R6,R5,R4,R3, RB) } RB?!R9{ ; CRC Error detected! PRINT=E("ID = %02lX %02lX%02lX%02lX%02lX%02lX%02lX %02lX",R2, R8,R7,R6,R5,R4,R3, RB) } ;[CalcCRC] ;_CRCALL ;PRINT=("CRC: %03lXH",R9)