; Orange programmer module v3.9 ; (c) 2000,2001 Alex Plusov ; Dallas iButton ;CHIP=DS2502,128,ds2502.hpl ;AREA=EPROM,128(32) ;AREA=STATUS,8(8) ;AREA=ROM-NUMBER,8(8) ; 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=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 } ;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 } [_CRCALL] ADR=0 R9=0 LOOP=(0,7){ ; BYTES LOOP R1=DATA ; DATA _CRCB ADR=+1 } [INIT] DAT=1,P=5000 ;_RESET ;R8?!0{PRINT=("ANSWER ERROR %lX",R0),EXIT} ;PRINT=("V: %03lXH",$VERSION) ; 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] R2=$VERSION R2=/65536 R0=&0xFF R2?3{_TBYTE3,RETURN} R2?4{_TBYTE4,RETURN} R2?0x12{_TBYTESE,RETURN} ;SE _TBYTE3 [_RBYTE] R13=R12 R0=0xFF,_TBYTE R12=R13 ;RESTORE CRC [READBLOCK] R15=ADR LOOP(5){ ADR=R15 ;PRINT=L("RST\n") _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 R9=0 $AREA?0{ ;EPROM _TBYTE(0xCC) ;Skip ROM R12=0 _TBYTE(0xF0) ;Read Memory R0=ADR,R0=&0xFF,_TBYTE R0=ADR,R0=/256,_TBYTE _RBYTE ;CRC R1?R12{ ;PRINT=("CRC: %03lXH %03lXH",R1,R12)} R9=0 LOOP=($BLOCKSIZE){_RBYTE,DATA=R1,_CRCB,ADR=+1} BREAK } } $AREA?1{ ;STATUS _TBYTE(0xCC) ;Skip ROM R12=0 _TBYTE(0xAA) ;Read Status Memory R0=ADR,R0=&0xFF,_TBYTE R0=ADR,R0=/256,_TBYTE _RBYTE ;CRC R1?R12{ ;PRINT=("CRC: %03lXH %03lXH",R1,R12) R9=0 LOOP=($BLOCKSIZE){_RBYTE,DATA=R1,_CRCB,ADR=+1} BREAK } } $AREA?2{ ;ROM NUMBER _TBYTE(0x33) R9=0 R3=$BLOCKSIZE,R3=-1 LOOP=(R3){_RBYTE,DATA=R1,_CRCB,ADR=+1} R4=R9 _RBYTE,DATA=R1 R1?R4{BREAK} PRINT=L("CRC: %03lXH %03lXH\n",R1,R4) } } ;PRINT=("CRC: %03lXH",R9) [WRITE] $AREA?0{ ;EPROM _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 _TBYTE(0xCC) ;Skip ROM _TBYTE(0x0F) ;Write Scratchpad R0=ADR,R0=&0xFF,_TBYTE R0=ADR,R0=/256,_TBYTE R0=DATA,_TBYTE } [_ReadRomID] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} _TBYTE(0x33) R9=0 _RBYTE,R3=R1,_CRCB _RBYTE,R4=R1,_CRCB _RBYTE,R5=R1,_CRCB _RBYTE,R6=R1,_CRCB _RBYTE,R7=R1,_CRCB _RBYTE,R8=R1,_CRCB _RBYTE,RA=R1,_CRCB _RBYTE,RB=R1 ; ,_CRCBYTE RB?R9{ PRINT=("ID = %02lX %02lX%02lX%02lX%02lX%02lX%02lX %02lX",R3, RA,R8,R7,R6,R5,R4, RB) } RB?!R9{ ; CRC Error detected! PRINT=E("ID = %02lX %02lX%02lX%02lX%02lX%02lX%02lX %02lX",R3, RA,R8,R7,R6,R5,R4, RB) }