; Orange programmer module v4.6 ; (c) 2000,2005 Alex Plusov ; Dallas iButton with CRC calculator ; CHIP=DS1990,8(8),ds1990.hpl ; Connect P1 - DATA, GND - GND ; May be correction need for other PC ; CRC=x^8 + x^5 + x^4 + 1 ; LSB first SOCKET=0 ALLPINS=0 PING=GND,0 PING=DAT,1 CDELAY = 0 ; one set delay R9=CRC,H BUSO=LTX,254 BUSI=LRX,254 [_RESET] R8=0 ; status DAT=1,P=200 IDISABLE DAT=0,P=650 DAT=1 P=1 ; Wait answer LOOP=(0,10000){ R8[0]=DAT R8[0]?0{BREAK} } R8[0]?1{R8[1]=1} ;check state timeout LOOP=(0,10000){ R8[0]=DAT R8[0]?1{BREAK} } R8=^1; IENABLE P=1000 [_CRCB] LOOP=(0,7){ ; BITS LOOP R10=R1 R10=^R9 R10=&1 ; CF R10?1{R9=^0x18} ;R9[8]=R9[0] R9=>>1,R9=&0xFF R10=<<7 R9=|R10 R1=>>1 ;PRINT=("STEP CRC : %03lXH, data=%03lXH",R9,R1) } [_CRCALL] ADR=0 R9=0 LOOP=(0,7){ ; BYTES LOOP R1=DATA ; DATA _CRCB ADR=+1 } ;TX CRC: R0-input, R12-CRC [_CRCT] R11=R0 LOOP=(0,7){ ; BITS LOOP R10=R11 R10=^R12 R10=&1 ; CF R10?1{R12=^0x18} ;R9[8]=R9[0] R12=>>1,R12=&0xFF R10=<<7 R12=|R10 R11=>>1 } [INIT] GND=0,DAT=1,P=50000 ;_RESET ;R8?!0{PRINT=("ANSWER ERROR %lX",R0),EXIT} ; for Orange3 [_TBYTE3] R1=0 _CRCT IDISABLE LOOP=(0,7){ DAT=0,P=5 DAT=R0[I] P=3 R1[I]=DAT P=80 DAT=1 P=70 } IENABLE ; [_TBYTE4] R1=0 _CRCT ;IDISABLE LOOP=(0,7){ LTX=14 ;cmd load ram LTX=17,LTX=0 ;size LTX=28,LTX=0 ;DAT=0 LTX=38,LTX=4 ;P_USDELAY=4 R2=R0,R2=&1,R2=*2 LTX=28,LTX=R2 ;DAT=d LTX=38,LTX=5 ;P_USDELAY=5 LTX=30,LTX=0 ;P_GETBUS0 LTX=38,LTX=80 ;P_USDELAY=80 LTX=28,LTX=2 ;DAT=d LTX=23,LTX=0 ;lpttx LTX=0 ;end R2=LRX R2?>0x100{PRINT=("SEND P-CODE ERROR: %03lXH",R2),EXIT} LTX=99 ;RUN! R2=LRX R2=/2,R2=&1,R2=<<7 R1=>>1 R1=|R2 R0=/2 ;shift P=60 } ;IENABLE ;PRINT=S("RD: %03lXH",R1) ; Omega Orange [_TBYTESE] R1=0 _CRCT LOOP=(0,7){ LTX=15 ;cmd load ram LTX=16,LTX=0 ;size LTX=68,LTX=0 ;DAT=0 LTX=36,LTX=4 ;P_USDELAY=4 R2=R0,R2=&1,R2=*2 LTX=68,LTX=R2 ;DAT=d LTX=36,LTX=5 ;P_USDELAY=5 LTX=60,LTX=0 ;P_GETBUSA LTX=36,LTX=80 ;P_USDELAY=80 LTX=68,LTX=2 ;DAT=d LTX=51 ;lpttxA LTX=0 ;end R2=LRX R2?>0x100{PRINT=("SEND P-CODE ERROR: %03lXH",R2),EXIT} LTX=30 ;RUN! R2=LRX R2=/2,R2=&1,R2=<<7 R1=>>1 R1=|R2 R0=/2 ;shift P=60 } ;PRINT=S("RD: %03lXH",R1) [_TBYTE] R0=&0xFF R2=$VERSION R2=/65536 R2?4{_TBYTE4,RETURN} ;O4 R2?0x12{_TBYTESE,RETURN} ;SE _TBYTE3 ; O3,O5 [READBLOCK] LOOP(10){ _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} _TBYTE(0x33) LOOP=(0,7){_TBYTE(0xFF),DATA=R1,ADR=+1} _CRCALL R9?0{BREAK} } R9?!0{PRINT=("CRC ERROR %03lX",R9)} [!CalcCRC] _CRCALL PRINT=("CRC: %03lXH",R9)