; Orange programmer module v4.0 ; (c) 2000,2006 CnCLab ; Dallas 1-Wire ;CHIP=DS2502,128(32),ds2502.hp4 ;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 ; Primary Tested! SOCKET=0 ALLPINS=0 PINO=#DAT,0 PINO=DATZ,1 PINI=DAT,1 CDELAY = 0 ; one set delay R9=CRC,H [_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] DATZ=1 DAT=1,P=5000 ;_RESET ;R8?!0{PRINT=("ANSWER ERROR %lX",R0),EXIT} [_TBYTE] 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 [_RBYTE] R13=R12 R0=0xFF,_TBYTE R12=R13 ;RESTORE CRC [READBLOCK] R15=ADR LOOP(20){ 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 LOOP(20){ LOOP(20){ _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 _TBYTE(0xCC) ;Skip ROM R12=0 _TBYTE(0x0F) ;Write Scratchpad R0=ADR,R0=&0xFF,_TBYTE R0=ADR,R0=/256,_TBYTE R0=DATA,_TBYTE _RBYTE R1?R12{BREAK} ;CRC PRINT=L("CRC ERROR: %03lXH %03lXH\n",R1,R12) P=20000 } DAT=1 VPP=12500 P=1000 ;Default delay = 1000 VPP=0 P=12000 _RBYTE R9=DATA PRINT=S("WR: %03lXH RD%03lXH\n",R9,R1) R1?R9{BREAK} ; запись прошла нормально P=12000 } } [ReadRomID] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 R0=0x33,_TBYTE R9=0 _RBYTE,R2=R1,_CRCB _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,RB=R1 ; ,_CRC 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) [TEST] LOOP(5000){ DAT=1 VPP=12500 P=500 VPP=0 P=1000 }