; Orange programmer module v1.1 ; (c) 2003-2011 CnCLab ; CHIP=25C1024,128K(128),25C1024.HPL ; SPI - 24 bit address ;Status Register: 7 6 5 4 3 2 1 0 ; WPEN X X X BL1 BL0 WEL WIP ; r/o r/o SOCKET=4 ;"SPI" PINO=SCK,0 PINO=SI,1 PINO=CS,2 PINO=WP,3 PINO=HOLD,4 PINI=SO,1 CDELAY=1 ; one set delay R9=STATUS,C8,WPEN,x,x,x,BL1,BL0,WEL,WIP ;R9=STATUS,B8 [INIT] HOLD=1 WP=0 CS=1 SCK=0 [_SENDBYTE] LOOP=(7,0){SI=R0[I],SCK=P} [READ] CS=0 R0=00000011b,_SENDBYTE ;Read LOOP=(23,0){SI=ADR[I],SCK=P} SI=1 LOOP=(7,0){SCK=1,DATA[I]=SO,SCK=0} CS=1 P=1 [READBLOCK] CS=0 _SENDBYTE(00000011b) ;Read LOOP=(23,0){SI=ADR[I],SCK=P} SI=1 LOOP=($BLOCKSIZE){ LOOP=(7,0){SCK=1,DATA[I]=SO,SCK=0} ADR=+1 } CS=1 [_WAITWR] ;Wait for end write memory... SCK=0 LOOP=(0,500){ CS=0 R0=00000101b,_SENDBYTE ;RDSR SI=1 R9=0 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 R9[0]?0{BREAK} ;WIP bit P=10 } [_WREN] SCK=0 CS=0 _SENDBYTE(00000110b) ; Write enable CS=1 [WRITEINIT] HOLD=1 WP=1 CS=1 _WREN CS=0 R0=00000001b ;WRSR _SENDBYTE R0=00000000b ;Status Register _SENDBYTE CS=1 P=5000 [WRITE] SCK=0 _WREN CS=0 _SENDBYTE(R0=00000010b) ; Write LOOP=(23,0){SI=ADR[I],SCK=P} LOOP=(7,0){SI=DATA[I],SCK=P} SI=1,CS=1 ;P=5000 _WAITWR [WRITEBLOCK] SCK=0 _WREN CS=0 _SENDBYTE(00000010b) ; Write LOOP=(23,0){SI=ADR[I],SCK=P} LOOP=($BLOCKSIZE){ LOOP=(7,0){SI=DATA[I],SCK=P} ADR=+1 } CS=1 _WAITWR [ReadID] WP=1 SCK=0 CS=1 CS=0 R7=0 _SENDBYTE(10101011b) ;RES R0=0 ; DUMMY adr LOOP=(23,0){SI=R0[I],SCK=P} SI=1 LOOP=(7,0){SCK=1,R7[I]=SO,SCK=0} CS=1 P=10000 PRINT=("ID value = %02lXH",R7) [ReadStatus] ;HOLD=1 WP=1 SCK=0 CS=1 CS=0 R9=0 _SENDBYTE(00000101b) ;RDSR SI=1 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 P=10000 GET=("Status",R9) [WriteStatus] GET=("Write Status",R9) RA?0{EXIT} WP=1 CS=1 SCK=0 ;PRINT=("value %02lX",R9) _WREN CS=0 _SENDBYTE(00000001b) ;WRSR R0=R9 ;Status Register _SENDBYTE CS=1 P=20000 [Erase] HOLD=1 WP=1 SCK=0 CS=1 _WREN CS=0 _SENDBYTE(00000001b) ;WRSR R0=0 _SENDBYTE ;Status Register CS=1 P=10000 _WREN CS=0 _SENDBYTE(11000111b) ;BE Bulk Erase) CS=1 ; Full erase time - 4 sec! SCK=0 R2=0 LOOP=(0,5000){ CS=0 PRINT=S("Erase %lu",R2) R2=+1 _SENDBYTE(00000101b) ;RDSR SI=1 R9=0 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 R9[0]?0{BREAK} ;WIP bit P=1000 }