; Orange programmer module v4.0 beta 
; (c) 2002-2012 CnCLab
; Atmel AVR Tiny

;CHIP=ATtiny13 HV,1K,ATTIN13h.hpl
;AREA=FLASH,1K(32),0
;AREA=EEPROM,64


; High-voltage (12V) Serial programming mode
; primary tested

; auto-erase of EEPROM is not available in High-voltage Serial Programming, 
; only in SPI Programming.

SOCKET=0 ;
OPTIONS=mf,   ;FLASH: no modify, skip blank

INFO="PIC-AVR Adapter"


PINO=SDIN, 2,5   ;PB0
PINO=SIIN, 1,6   ;PB1
PING=SDOUT,0,7   ;PB2
PINO=SCK,  12,2  ;PB3 !
PINO=PB5VPP,5,1  ;RESET


PINO=GND,255,4
PINO=VCC,254,8


R8=Fuses,B8
R9=Lock,L,All,Prog,Off
R10=CKSEL,L,"00: Ext Clk,01: IntRC 4.8MHz,10: IntRC 9.6MHz,11: IntRC 128k"
;R11=SUT,L,00,01,10,11
R11=SUT,C2
R12=CKDIV,L,"0 - On,1 - Off"
R13=WDTON,L,"0 - On,1 - Off"
R14=EESAVE,L,"0 - Save,1 - Clear"
R15=SPIEN,L,"0 - On,1 - Off"

R16=RSTDISBL,L,"0 - PB5:IO,1 - PB5:RST"
R17=BODLEVEL,L,"00,01,10,11"
R18=DWEN,L,"0 - On,1 - Off"
R19=SELFPRG,L,"0 - On,1 - Off"


R1A=Calibration,H2


CDELAY=1 ; 


[_SCKP]
SCK=1,P=1,SCK=0,P=1

[_DOUT]
R1=0;
LOOP=(7,0){SDIN=R0[I],SCK=1,R1[I]=SDOUT,SCK=0}

[_DIN]
R0=0
LOOP=(7,0){SCK=1,R0[I]=SDOUT,SCK=0,P=1}

[_INSTR]
R2=0
SDIN=0,SIIN=0
_SCKP
LOOP=(7,0){
R2[I]=SDOUT
SDIN=R0[I]
SIIN=R1[I]
_SCKP
}
SDIN=0,SIIN=0
_SCKP
_SCKP


[_RdID]
R0=00001000B     ;1
R1=01001100B
_INSTR

R8=0	
R3=0    ;adr
LOOP=(0,2){
R0=R3	         ;2
R1=00001100B
_INSTR

R0=0                 ;3
R1=01101000B
_INSTR

R0=0                 ;4
R1=01101100B
_INSTR

R8=*256
R8=|R2
R3=+1
}


[INIT]
SDOUT=Z
PB5VPP=0,SDIN=0,P=1000
SDOUT=0
SDIN=0
SIIN=0
LOOP=(6){SCK=P}
SCK=0
P=100
PB5VPP=1
VPP=12000
P=100000
SDOUT=1
P=50
_RdID
R8?0xFFFFFF{
PRINT=A("Wring Chip ID detected!\nContinue?")
RA?0{EXIT}

; If RST pin disabled try unlock:
;PRINT=S("Unlock mode 1")
PB5VPP=0
VPP=0
P=200
VCC=0
P=100000
VCC=1
PB5VPP=1
VPP=12000
P=100000
SDOUT=1
P=50

_RdID
R8=&0xFFFF00
R8?!0x1E9000{
PRINT=S("Unlock failed!")

LOOP(10){
_RdID
R8=&0xFFFF00
R8?0x1E9000{BREAK}
R0=00000000B ;Load "No Operation" Command
R1=01001100B
_INSTR
}
PRINT=S("")
}

}


[READ]
$AREA?0{
;R9=0x20            ;program memory area

;Read Flash High and Low Address
R0=00000010B     ;1
R1=01001100B
_INSTR

R0=ADR,R0=/512   ;2        adr l
R1=00011100B
_INSTR

R0=ADR,R0=/2,R0=&0xFF  ;3  adr h
R1=00001100B
_INSTR


;Read Flash
R0=00000000B     ;1
R1=ADR,R1=&1,R1=<<4,R1=|01101000B ;Low or High
_INSTR

R0=00000000B     ;2
R1=01101100B
_INSTR

}

$AREA?1{

;Enter EEPROM Read mode.
R0=00000011B     ;1
R1=01001100B
_INSTR

;Read EEPROM address lo
R0=ADR           ;2        adr l
R1=00001100B
_INSTR


;Read 
R0=ADR,R0=/256   ;3
R1=01101000B 
_INSTR

R0=00000000B     ;4
R1=01101100B
_INSTR

}
DATA=R2


[WRITE]
$AREA?0{
;R0=0x40 ;program memory
PRINT=("Only Page Write Supported!")
EXIT
}

$AREA?1{
;Write EEPROM 

; Enter EEPROM Programming mode.
R0=00010001B     ;1
R1=01001100B
_INSTR

;Write EEPROM
R0=ADR           ;1        adr l
R1=00001100B
_INSTR

R0=DATA     	;2
R1=00101100B 
_INSTR

R0=00000000B     ;3
R1=01101101B 	;R1=01100100B 
_INSTR

R0=00000000B     ;4
R1=01100100B 
_INSTR

R0=00000000B     ;5
R1=01101100B 
_INSTR

P=20000 ; 4ms

}

[WRITEBLOCK]

$AREA?1{EXIT}
; For Flash

;Enter Flash Programming code.
R0=00010000B     ;1
R1=01001100B
_INSTR


R6=ADR
R7=$BLOCKSIZE,R7=/2
LOOP=(R7){
R0=ADR		   ;1        adr lo
R0=/2
R1=00001100B
_INSTR

R0=DATA     	   ;2
R1=00101100B
_INSTR

ADR=+1

R0=DATA     	   ;3
R1=00111100B
_INSTR

ADR=+1


R0=00000000B     ;4
R1=01111101B
_INSTR

R0=00000000B     ;5
R1=01111100B
_INSTR
}

;Wait after Instr 3 until SDO goes high. Repeat Instr. 2 - 3 for each
;loaded Flash Page until the entire Flash or all data is programmed.
;Repeat Instr. 1 for a new
R6=/512
R0=R6		; 1 Load Flash High Address and Program Page
R1=00011100B
_INSTR

R0=00000000B     ;2
R1=01100100B
_INSTR

R0=00000000B     ;3
R1=01101100B
_INSTR

;P=5000 ; min 4ms

LOOP(200){
P=100
SDOUT?1{BREAK}
}



[WRITEEND]
P=20000



["Read Fuses"]
_INSTR(00000100B,01001100B) ;1

_INSTR(0,01101000B)  ;2

_INSTR(0,01101100B);  ;3

R8=R2

R10=0,R11=0,R12=0,R13=0,R14=0,R15=0
R10[0]=R8[0]	;R10=CKSEL,L
R10[1]=R8[1]	;R10=CKSEL,L
R11[0]=R8[2]    ;R11=SUT
R11[1]=R8[3]
R12[0]=R8[4]    ;CKDIV
R13[0]=R8[5]    ;WDTON
R14[0]=R8[6]    ;EESAVE
R15[0]=R8[7]    ;SPIEN SPIEN Fuse is not accessible in SPI Programming mode.


;Read Fuse High Bits....
_INSTR(00000100B,01001100B) ;1

_INSTR(0,01111010B)  ;2

_INSTR(0,01111110B);  ;3
R8=R2

R16=0,R17=0,R18=0,R19=0
R16[0]=R8[0]	;RSTDISBL,L,"0 - PB5:IO,1 - PB5:RST"
R17[0]=R8[1]	;BODLEVEL,L,"00,01,10,11"
R17[1]=R8[2]	;
R18[0]=R8[3]	;DWEN,L,"0 - On,1 - Off"
R19[0]=R8[4]	;SELFPRG,L,"0 - On,1 - Off"

SCK=0, PB5VPP=0
GET=("Read Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19)



["Write Fuses"]
GET=("Write Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19)
RA?0{EXIT}

R5=0
R18?0{R5=1}  ;DWEN
;R16?0{R5=1}
R5?1{
PRINT=A("This fuses value disable HV Programming, continue?")
RA?0{EXIT}
}

R8=0xFF
R8[0]=R10[0]	;R10=CKSEL,L
R8[1]=R10[1]	;R10=CKSEL,L
R8[2]=R11[0]    ;R11=SUT
R8[3]=R11[1]
R8[4]=R12[0]    ;CKDIV     
R8[5]=R13[0]    ;WDTON     
R8[6]=R14[0]    ;EESAVE    
R8[7]=R15[0]    ;SPIEN 

_INSTR(01000000B,01001100B)  ;1

R0=R8	         ;2 fuses
R1=00101100B
_INSTR

R0=0                 ;3
R1=01100100B
_INSTR

R0=0                 ;4
R1=01101100B
_INSTR

P=30000

R8=0xFF
R8[0]=R16[0]	;RSTDISBL,L,"0 - PB5:IO,1 - PB5:RST"
R8[1]=R17[0]	;BODLEVEL,L,"00,01,10,11"
R8[2]=R17[1]	;
R8[3]=R18[0]	;DWEN,L,"0 - On,1 - Off"
R8[4]=R19[0]	;SELFPRG,L,"0 - On,1 - Off"


;Write Fuse High Bits....

_INSTR(01000000B,01001100B)  ;1

R0=R8	         ;2 fuses
R1=00101100B
_INSTR

_INSTR(0,01110100B)   ;3

_INSTR(0,01111100B)   ;4

P=30000


["Read Lock"]
R0=00000100B     ;1
R1=01001100B
_INSTR

R0=0         ;2
R1=01111000B
_INSTR

R0=0                 ;3
R1=01111100B
_INSTR

SCK=0, PB5VPP=0

;PRINT=("LOCK %02X",R2)
R2=&3
R9=R2
R9?1{PRINT=("Undefined lock value 1"),EXIT}

R2?2{R9=1}
R2?3{R9=2}

GET=("Lock Bits",R9)

["Write Lock"]
R9=0
GET=("Lock Bits",R9)
RA?0{EXIT}
R9?2{R9=3}
R9?1{R9=2}

R0=00100000B     ;1
R1=01001100B
_INSTR

R0=R9 ;,R0=*2	 ;2 
R1=00101100B
_INSTR

R0=0             ;3
R1=01100100B
_INSTR

R0=0             ;4
R1=01101100B
_INSTR

P=20000

["Read Calibration"]
R0=00001000B     ;1
R1=01001100B
_INSTR

R0=0         	;2
R1=00001100B
_INSTR

R0=0            ;3
R1=01111000B
_INSTR

R0=0            ;3
R1=01111100B
_INSTR

SCK=0, PB5VPP=0

R1A=R2
GET=("Read Calibration",R1A)

[ReadID]
R0=00001000B     ;1
R1=01001100B
_INSTR

R8=0	
R7=0    ;adr
LOOP=(0,2){
R0=R7	         ;2
R1=00001100B
_INSTR

R0=0                 ;3
R1=01101000B
_INSTR

R0=0                 ;4
R1=01101100B
_INSTR

R8=*256
R8=|R2
R7=+1
}

SCK=0, PB5VPP=0

R8?0x1E9004{PRINT=("ID: %06lX - ATTiny11",R8),EXIT}
R8?0x1E9005{PRINT=("ID: %06lX - ATTiny12",R8),EXIT}
R8?0x1E9006{PRINT=("ID: %06lX - ATTiny15",R8),EXIT}
R8?0x1E9007{PRINT=("ID: %06lX - ATTiny13",R8),EXIT}
PRINT=("ID: %06lX",R8)



[Erase]
R0=10000000B     ;1
R1=01001100B
_INSTR

R0=0	         ;2 
R1=01100100B
_INSTR

R0=0             ;3
R1=01101100B
_INSTR

P=20000

R0=0             ;4
R1=01001100B
_INSTR

P=50000


[END]
SCK=0, PB5VPP=0
VPP=0
P=1000