; Orange programmer module v3.2
; (c) 2002 Alex Plusov / CnC Lab
; CHIP=X24645 (8Kx8) Xicor

; with Write Protect Register WPR (Addr = FFFh)
; 7     6   5   4   3    2     1   0
; WPEN  0   0  BP1 BP0  RWEL  WEL  0

; Внимание: При random read/write 0xFFF доступ к Protect Register
; при sequential - доступ к памяти 

; Tested - Ok

SOCKET=1 ;"I2C"

PING=SCL,0
PING=SDA,1
PINO=WP, 2
PINO=S0, 3
PINO=S1, 4
PINO=S2, 5


CDELAY=4                              ; one cycle time
R9=PROTECT,C8,WPEN,x,x,BP1,BP0,RWEL,WEL,x

[_START]
SDA=1,SCL=1,SDA=0,SCL=0               ; Start  10

[_STOP]
SDA=0,SCL=1,SDA=1,SCL=0               ; Stop   01


; R1 - DATA, not 0xFFF check
[_READB]
_START
R0=10B
LOOP=(1,0) {SDA=R0[I],SCL=1,SCL=0}    ; out 3 bits DeviceAdr
LOOP=(12,8){SDA=ADR[I],SCL=1,SCL=0}   ; out 4 bits Hi(Adr)
SDA=0,SCL=1,SCL=0                     ; out 1 bit, 0=Write Mode
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out  DeviceAdr, Hi(Adr), Mode

LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0}   ; out 8 bits Lo(Adr)
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out   Lo(Adr)

_START
R0=10B
LOOP=(1,0) {SDA=R0[I],SCL=1,SCL=0}    ; out 3 bits DeviceAdr
LOOP=(12,8) {SDA=ADR[I],SCL=1,SCL=0}  ; out 4 bits Hi(Adr)
SDA=1,SCL=1,SCL=0                     ; out 1 bit, 1=Read Mode
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN  check
                                      ; end  out  DeviceSelect
R1=0
LOOP=(7,0) {SCL=1,R1[I]=SDA,SCL=0}  ; read byte Data
SDA=1,SCL=1,SCL=0                     ; out  master  NO_ACKN

_STOP



; R1 - data  not 0xFFF check
[_WRITEB]
_START
R0=10B
LOOP=(1,0) {SDA=R0[I],SCL=1,SCL=0}    ; out 3 bits DeviceAdr
LOOP=(12,8) {SDA=ADR[I],SCL=1,SCL=0}  ; out 4 bits Hi(Adr)
SDA=0,SCL=1,SCL=0                     ; out 1 bit, 0=Write Mode
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out DeviceAdr, Hi(Adr), Mode

LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0}   ; out 8 bits Lo(Adr)
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out   Lo(Adr)

LOOP=(7,0) {SDA=R1[I],SCL=1,SCL=0}  ; out byte Data
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN  check
                                      ; end out Data
_STOP



[INIT]
S0=0,S1=0,S2=0
WP=1 ; write disable

[READ]
R2=ADR
R2?0x1FFF{R2=0x1FFE} ; last address read only sequential

_START
R0=10B
LOOP=(1,0) {SDA=R0[I],SCL=1,SCL=0}    ; out 3 bits DeviceAdr
LOOP=(12,8){SDA=R2[I],SCL=1,SCL=0}    ; out 4 bits Hi(Adr)
SDA=0,SCL=1,SCL=0                     ; out 1 bit, 0=Write Mode
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out  DeviceAdr, Hi(Adr), Mode

LOOP=(7,0) {SDA=R2[I],SCL=1,SCL=0}    ; out 8 bits Lo(Adr)
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out   Lo(Adr)

_START
R0=10B
LOOP=(1,0) {SDA=R0[I],SCL=1,SCL=0}    ; out 3 bits DeviceAdr
LOOP=(12,8) {SDA=ADR[I],SCL=1,SCL=0}  ; out 4 bits Hi(Adr)
SDA=1,SCL=1,SCL=0                     ; out 1 bit, 1=Read Mode
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN  check
                                      ; end  out  DeviceSelect

R2=ADR
R2?0x1FFF{
LOOP=(7,0) {SCL=1,P=2,SCL=0}          ; read imitation 
SDA=0,SCL=1,SCL=0                     ; out  master  CKN
SDA=1
}  

LOOP=(7,0) {SCL=1,DATA[I]=SDA,SCL=0}  ; read byte Data
SDA=1,SCL=1,SCL=0                     ; out  master  NO_ACKN

_STOP



[WRITEINIT]
WP=0 ;write enabe
P=10
; Clear protection:
ADR=0x1FFF,R1=0000010B,_WRITEB ;Set WEL = 1
ADR=0x1FFF,R1=0000110B,_WRITEB ;Set RWEL = 1
ADR=0x1FFF,R1=0000010B,_WRITEB ;Set RWEL = 0 , BP - clear!
P=10000                               ; delay: (Write Time)


[WRITE]
R2=ADR
; we read and store data from 0xFFE:
R2?0x1FFF{ADR=0x1FFE,_READB,R2=0x1FFE,ADR=0x1FFF} ; last address write only sequential


_START
R0=10B
LOOP=(1,0) {SDA=R0[I],SCL=1,SCL=0}    ; out 3 bits DeviceAdr
LOOP=(12,8) {SDA=R2[I],SCL=1,SCL=0}  ; out 4 bits Hi(Adr)
SDA=0,SCL=1,SCL=0                     ; out 1 bit, 0=Write Mode
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out DeviceAdr, Hi(Adr), Mode

LOOP=(7,0) {SDA=R2[I],SCL=1,SCL=0}   ; out 8 bits Lo(Adr)
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN check
                                      ; end  out   Lo(Adr)

R2=ADR
R2?0x1FFF{             ; last address write only sequential
LOOP=(7,0) {SDA=R1[I],SCL=1,SCL=0}  ; out byte Data 0xFFE
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN  check
}

LOOP=(7,0) {SDA=DATA[I],SCL=1,SCL=0}  ; out byte Data
SDA=1,SCL=1,SDA?0,SCL=0               ; ACKN  check
                                      ; end out Data

_STOP

P=10000                               ; delay: (Write Time)




[ReadProtect]
ADR=0x1FFF,_READB
R9=R1
GET=("Register",R9)

[WriteProtect]
WP=0 ;write enabe
GET=("Write Register",R9)
RA?0{EXIT}
R9=&00011000B
R9=|00000010B ;WEL=1
ADR=0x1FFF,R1=0000010B,_WRITEB ;Set WEL = 1
ADR=0x1FFF,R1=0000110B,_WRITEB ;Set RWEL = 1
ADR=0x1FFF,R1=R9,_WRITEB ;Set WPEN and BP1,BP0
P=10000                               ; delay: (Write Time)
ADR=0x1FFF,_READB
R9=R1
GET=("Register",R9)


[WriteEnable]
WP=0 ;write enabe
ADR=0x1FFF,R1=0000010B,_WRITEB ;Set WEL = 1
ADR=0x1FFF,R1=0000110B,_WRITEB ;Set RWEL = 1
ADR=0x1FFF,R1=0000010B,_WRITEB ;Set RWEL = 0
P=10000                               ; delay: (Write Time)