; Orange programmer module v3.5
; (c) 2000-2004 CnCLab
; CHIP=M58658P,20x16

; Use ER1400 modified adaper, external power 35V
; For Orange-2,3,OSE 
; Tested Ok!


SOCKET=0
ALLPINS=14
INFO="ER1400 Adapter M, short jumper!"

PINO=CLK,0,6
PING=DO,1,12
PINO=DI,2,12
PINO=C1,3,7
PINO=C2,4,8
PINO=C3,5,9

CDELAY = 1 ; 14kHz Max (for CLK used BIG delay )

;R1=ADDR,C8

[_CLKPULSE]
CLK=1,P=100,CLK=0,P=100     ; 14kHz Max


[INIT]
C1=0,C2=0,C3=0 ;StandBy
CLK=0,DI=0,P=100
DO=Z
P=1000

[END]
C1=0,C2=0,C3=0 ;StandBy
CLK=1,DI=1



[_SENDADR]
R2=ADR
R2?<16{
C1=0,C2=1,C3=1              ; Accept address Mode
R1=0                        ; fill address word
R2=ADR  		    ; get address
R2=/4                       ; Hi
R2=+4			    ; move left
R1[R2]=1                    ; reset bit
R2=ADR,R2=%4                ; Lo
R1[R2]=1                    ; reset bit
LOOP=(7,0){DI=R1[I],_CLKPULSE} ; send Hi word
}

R2=ADR
R2?>15{
C1=0,C2=0,C3=1              ; Accept AD address Mode
R2=ADR  		    ; get address
R1=0                        ; fill address word
R2=-16                      ; Hi
R1[R2]=1                    ; reset bit
LOOP=(7,0){DI=R1[I],_CLKPULSE} ; send Hi word
}


;R2=ADR
;GET=("ADR",R1,R2)


[READ]
DI=1
C1=0,C2=0,C3=0,_CLKPULSE ;StandBy

_SENDADR

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy

C1=1,C2=0,C3=0,_CLKPULSE ; Read Mode

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy

DI=1 
C1=1,C2=0,C3=1           ; Shift data output Mode
P=200
LOOP=(0,15){DATA[I]=DO,CLK=1,P=100,CLK=0,P=100}

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


[WRITE]
DI=1
C1=0,C2=0,C3=0,_CLKPULSE ;StandBy

_SENDADR

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy

C1=0,C2=1,C3=0,_CLKPULSE ;Erase
LOOP=(0,250){CLK=1,P=100,CLK=0,P=100}

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy
;_CLKPULSE,_CLKPULSE

C1=1,C2=1,C3=1           ;DATA
LOOP=(0,15){DI=DATA[I],_CLKPULSE}

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy
;_CLKPULSE,_CLKPULSE

C1=1,C2=1,C3=0,_CLKPULSE ; write
LOOP=(0,250){CLK=1,P=100,CLK=0,P=100}

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy


[Erase]
ADR=0
R9=1
LOOP=(R9,RF){

DI=1
C1=0,C2=0,C3=0,_CLKPULSE ;StandBy


_SENDADR

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy

C1=0,C2=1,C3=0,_CLKPULSE ;Erase
LOOP=(0,250){CLK=1,P=100,CLK=0,P=100}

C1=0,C2=0,C3=0,_CLKPULSE ;StandBy
ADR=+1
PRINT=S("Erase: %lu",ADR)
}