; Orange programmer module v3.6 ; (c) 2002-2010 CnCLab, Noi, Evimix ; CHIP=M35080,1K(2),m35080.hpl ; ST read/write special inc area ; Orange O4/O5/SE INFO="SPI EEPROM with Protected Area" ; Nonstandard pinout: ; This Standard: ; 1 Gnd 4 ; 2 /S - CS P2 1 ; 3 /W - WP P3 3 ; 4 Q - SO PI1 2 ; 5 ; 6 C - SCK P0 6 ; 7 D - SI P1 5 ; 8 Vcc 8 ;Status Register: 7 6 5 4 3 2 1 0 ;"clasic" WPEN X X X BL1 BL0 WEL WIP ; r/o r/o ;M35080 SRWD UV INC BP1 BP0 WEL WIP ; r/o r/o r/o r/o SOCKET=8 ;"M35" PINO=SCK,5 PINO=SI,6 PINO=CS,1 PINO=WP,2 ;PINO=SO,3 PINI=SO,3 CDELAY=2 ; one set delay R9=STATUS,b8 ;R8=COMMAND,b8 R5=SRWD,L,"0 - Software protect,1 - Hardware protect" R6=BP,L,"00 - none,01 - (0300h - 03FFh),10 - (0200h - 03FFh),11 - Unknown?" ;R1F=ADDRESS,H [_SEND] LOOP=(7,0){SI=R0[I],SCK=P} [INIT] CS=1 WP=0 SCK=0 [READ] SCK=0 CS=0 _SEND(00000011b) ;Read Data from Memory_Array R0=ADR,R0?<0x20{ ;inc R0=&0x0FFFFFFFE ;reset adr bit0 LOOP=(15,0){SI=R0[I],SCK=P} SI=1 LOOP=(15,0){R2[I]=SO,SCK=P} ;Data receiving read both 2 regs! R0=ADR,R0=&1 R0?0{R2=>>8,R2=&0xFF,DATA=R2} ;1 R0?1{ R2=&0xFF,DATA=R2} ;2 } R0=ADR,R0?>0x1F{ ; normal reading,,, LOOP=(15,0){SI=R0[I],SCK=P} SI=1 LOOP=(7,0){DATA[I]=SO,SCK=P} ;Data receiving } CS=1 [READBLOCK] ;HOLD=1 CS=1 SCK=0 CS=0 _SEND(00000011b) LOOP=(15,0){SI=ADR[I],SCK=P} SI=1 LOOP=($BLOCKSIZE){ LOOP=(7,0){SCK=1,DATA[I]=SO,SCK=0} ADR=+1 } CS=1 ;P=2 [_WAITWR] ;Wait for end write memory... SCK=0 LOOP=(0,100){ CS=0 _SEND(00000101b) SI=1 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 R9[0]?0{BREAK} ;WIP bit P=10 } [#WRITEINIT] WP=1 CS=1 SCK=0 CS=0 _SEND(00000110b) ; Write enable SI=1,CS=1 P=2 CS=0,SI=0 _SEND(00000001b) ;WRSR _SEND(00000000b) ;Status Register SI=1,CS=1 P=10000 ; mark corrector for INC area: ADR=0 LOOP=(0,0x0F){ R1=MARK ADR=+1 R2=MARK R1=|R2 R1?!0{ADR=-1,MARK=R1,ADR=+1,MARK=R1} ADR=+1 } [WRITE] ;HOLD=1 WP=1 SCK=0 CS=0 _SEND(00000110b) ; Write enable SI=1,CS=1 P=20 CS=0,SI=0 R0=ADR,R0?>0x1F{ ; main mamory _SEND(00000010b) ; Write instruction LOOP=(15,0){SI=ADR[I],SCK=P} LOOP=(7,0){SI=DATA[I],SCK=P} SI=1,CS=1 _WAITWR } R0=ADR,R0?<0x20{ ; first 20h bytes - special inc area R0=&1 R0?0{ ; write word only in Low (even) byte _SEND(00000111b) ; Write INC instruction LOOP=(15,0){SI=ADR[I],SCK=P} LOOP=(7,0){SI=DATA[I],SCK=P} ; byte 1 ADR=+1 LOOP=(7,0){SI=DATA[I],SCK=P} ; byte 2 SI=1,CS=1 P=10000 ; 'hard' delay _WAITWR ; 'spft' delay } } [ReadStatusBits] SCK=0 CS=1 CS=0 _SEND(00000101b) SI=1 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 R5=0,R6=0 R5[0]=R9[7] R6[0]=R9[2] R6[1]=R9[3] GET=("Status Register Bits",R9,R5,R6) [WriteStatusBits] WP=1 CS=1 SCK=0 GET=("Write Status Register Bits",R5,R6) RA?0{EXIT} R9=0 R9[7]=R5[0] R9[2]=R6[0] R9[3]=R6[1] CS=0 _SEND(00000110b) ; Write enable SI=1,CS=1 P=2 CS=0,SI=0 _SEND(00000001b) ;WRSR _SEND(R9) ;Status Register SI=1,CS=1 P=10000