; Orange programmer module v1.5
; (c) 2010-2011 CnCLab
;PIC18 with no EEPROM!

; CHIP=PIC18F2410,16K,P18F4x1x.HPL
; AREA=FLASH,16K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F2450,16K,P18F4x1x.HPL
; AREA=FLASH,16K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F2510,32K,P18F4x1x.HPL
; AREA=FLASH,32K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F2515,48K,P18F4x1x.HPL
; AREA=FLASH,48K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F2610,64K,P18F4x1x.HPL
; AREA=FLASH,64K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F4410,16K,P18F4x1x.HPL
; AREA=FLASH,16K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F4450,16K,P18F4x1x.HPL
; AREA=FLASH,16K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F4510,32K,P18F4x1x.HPL
; AREA=FLASH,32K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F4515,48K,P18F4x1x.HPL
; AREA=FLASH,48K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

; CHIP=PIC18F4610,64K,P18F4x1x.HPL
; AREA=FLASH,64K(8),0,m
; AREA=ID,8(8),200000h,m
; AREA=CONFIG,14,300000h

;
; DS39622L for PIC18F2410, 2450, 2510 2515, 2610, 4410, 4450, 4510, 4515, 4610


; ERASE algo not compatible with p18f258.hpl!
;Tested - PIC18F2520


ALLPINS=28
INFO="PIC Adapter"


PING=SDA,1,28 ;RB7
PINO=CLK,0,27 ;RB6
PINO=MCLR,5,1  ;/MCLR

PING=GND,255,8  ;Vss
PINO=VCC,254,20  ;Vcc

CDELAY=1


R1=CONFIG,H


[_CMD]
; R0 - CMD
;P=1
LOOP=(0,3){SDA=R0[I],CLK=P}
;P=1

[_CMD0]
SDA=0,CLK=P4



[_OUT]
LOOP=(0,7){SDA=R0[I],CLK=P}

[_OUTW]
LOOP=(0,15){SDA=R0[I],CLK=P}

; R1 - Hi, R0 - Lo
[_OUT2]
R1=&0xFF,R1=<<8
R0=&0xFF,R0=|R1
_OUTW



[_IN]
SDA=1
R1=0
LOOP=(0,7){CLK=1,R1[I]=SDA,CLK=0}

; Special cmd with delay
[_CMDNOP]
SDA=0,CLK=P3
CLK=1,P=1100,CLK=0
P=200 ;min 100
_OUTW(0)


[_INCADD]
R8=ADR
LOOP=(0,0xFFFF){  ;increment address to current value!
R9?R8{BREAK}
_CMD(6) ;INCADD
R9=+1
}

;-------------------------------------------------
; Read all memory w/o EEPROM, return R1
;R3 - full adr
[_RDFL]

;PRINT=("%02X",R3)
_CMD0,R1=0x0E,R0=R3,R0=>>16,_OUT2
_CMD0,_OUTW(0x6EF8)
_CMD0,R1=0x0E,R0=R3,R0=>>8,_OUT2
_CMD0,_OUTW(0x6EF7)
_CMD0,R1=0x0E,R0=R3,_OUT2
_CMD0,_OUTW(0x6EF6)
_CMD(1001b),_OUT(0),P=1
_IN

; Read EEPROM, return R1
[_RDEE]
; Step 1: Direct access to data EEPROM
_CMD0,_OUTW(0x9EA6)
_CMD0,_OUTW(0x9CA6)
; Step 2: Set EEPROM address pointer
_CMD0,R1=0x0E,R0=ADR,_OUT2
_CMD0,_OUTW(0x6EA9)
_CMD0,R1=0x0E,R0=ADR,R0=/256,_OUT2
_CMD0,_OUTW(0x6EAA)
; Step 3: Initiate a memory read
_CMD0,_OUTW(0x80A6)
; Step 4: Load data into the Serial Data Holding register
_CMD0,_OUTW(0x50A8)
_CMD0,_OUTW(0x6EF5)
_CMD0,_OUTW(0x0000) ;need for PIC18F2xxx/4xxx (DS39622L)

_CMD(0010b),_OUT(0),P=1
_IN


[INIT]
MCLR=0
CLK=0,SDA=0
$VERSION=/65536
$VERSION?3{P=100000}
P=20000
MCLR=1,VPP=12500,P=20000  ;Programm/Verify Mode!
SDA=1,P=100
R9=0 ;current address register
;Read ID for connect test
R3=3FFFFEH,_RDFL,R9=R1
R3=3FFFFFH,_RDFL,R1=*256,R1=|R9
R1?0xFFFF{
PRINT=A("MCU not detected.\nContinue?")
RA?0{EXIT}
}


;-------------------------------------------------



[READ]

R3=ADR,R3=+RC
_RDFL
DATA=R1

; not for EEPROM, Only FLASH,ID,CFG - For speed++
[READBLOCK]
R4=ADR,R4=+RC
_CMD0,R1=0x0E,R0=R4,R0=>>16,_OUT2
_CMD0,_OUTW(0x6EF8)
_CMD0,R1=0x0E,R0=R4,R0=>>8,_OUT2
_CMD0,_OUTW(0x6EF7)

LOOP($BLOCKSIZE){
_CMD0,R1=0x0E,R0=R4,_OUT2
_CMD0,_OUTW(0x6EF6)       ;only low address
_CMD(1001b),_OUT(0),P=1
_IN
DATA=R1
R4=+1 ;ADR++
ADR=+1
}


;Data EEPROM Programming
[_WREE]
_CMD0,_OUTW(0x9EA6)
_CMD0,_OUTW(0x9CA6)
_CMD0,R1=0x0E,R0=ADR,_OUT2
_CMD0,_OUTW(0x6EA9)
_CMD0,R1=0x0E,R0=ADR,R0=/256,_OUT2
_CMD0,_OUTW(0x6EAA)
_CMD0,R1=0x0E,R0=DATA,_OUT2
_CMD0,_OUTW(0x6EA8)
_CMD0,_OUTW(0x84A6)

_CMD0,_OUTW(0x0E55) ;pass
_CMD0,_OUTW(0x6EA7)
_CMD0,_OUTW(0x0EAA)
_CMD0,_OUTW(0x6EA7)

_CMD0,_OUTW(0x82A6)
_CMD0,_OUTW(0x50A6)
_CMD0,_OUTW(0x6EF5)
_CMD(0010b),_OUT(0),SDA=1
_IN
P=10000 ;todo
_CMD0,_OUTW(0x94A6)

[_WRCFG]
;Enabling the write protection of config bits (WRTC = 0 in CONFIG6H)
;will prevent further writing of config bits.
;Always write all the config bits before enabling the write protection for config bits

;Step 1: Direct access to config memory
;PRINT=L("WRF")
_CMD0,_OUTW(0x8EA6)
_CMD0,_OUTW(0x8CA6)

;Step 2: Position the program counter
_CMD0,_OUTW(0xEF00)
_CMD0,_OUTW(0xF800)

;Step 3(2): Set Table Pointer for config byte to be written. Write even/odd addresses
R3=ADR,R3=+RC
_CMD0,R1=0x0E,R0=R3,R0=>>16,_OUT2
_CMD0,_OUTW(0x6EF8)
_CMD0,R1=0x0E,R0=R3,R0=>>8,_OUT2
_CMD0,_OUTW(0x6EF7)
_CMD0,R1=0x0E,R0=R3,_OUT2
_CMD0,_OUTW(0x6EF6)

_CMD(1111b)
R0=DATA,_OUT   ; one of byte ignored
R0=DATA,_OUT
;
_CMDNOP



[WRITE]
;$AREA?1{_WREE,RETURN}
$AREA?2{_WRCFG,RETURN}

; FLASH & ID
[WRITEBLOCK]
;Step 1: Direct access to config memory
;PRINT=L("WRF")
_CMD0,_OUTW(0x8EA6)
_CMD0,_OUTW(0x8CA6)
_CMD0,_OUTW(0x86A6)
;Step 2: Configure device for multi-panel writes.
_CMD0,_OUTW(0x0E3C)
_CMD0,_OUTW(0x6EF8)
_CMD0,_OUTW(0x0E00)
_CMD0,_OUTW(0x6EF7)
_CMD0,_OUTW(0x0E06)
_CMD0,_OUTW(0x6EF6)
_CMD(1100b),_OUTW(0x0000)   ;single panel writes
;Step 3: Direct access to code memory.
_CMD0,_OUTW(0x8EA6)
_CMD0,_OUTW(0x9CA6)
;Step 4: Load write buffer for Panel 1.
R3=ADR,R3=+RC
_CMD0,R1=0x0E,R0=R3,R0=>>16,_OUT2
_CMD0,_OUTW(0x6EF8)
_CMD0,R1=0x0E,R0=R3,R0=>>8,_OUT2
_CMD0,_OUTW(0x6EF7)
_CMD0,R1=0x0E,R0=R3,_OUT2
_CMD0,_OUTW(0x6EF6)

LOOP(3){
_CMD(1101b)
R0=DATA,_OUT,ADR=+1
R0=DATA,_OUT,ADR=+1
}
_CMD(1111b) ;last panel!!!
R0=DATA,_OUT,ADR=+1
R0=DATA,_OUT,ADR=+1
;
_CMDNOP


[Erase]
_CMD0,_OUTW(0x0E3C)
_CMD0,_OUTW(0x6EF8)
_CMD0,_OUTW(0x0E00)
_CMD0,_OUTW(0x6EF7)
_CMD0,_OUTW(0x0E05) ;!
_CMD0,_OUTW(0x6EF6)
_CMD(1100b),_OUTW(0x3F3F) ;!

_CMD0,_OUTW(0x0E3C)
_CMD0,_OUTW(0x6EF8)
_CMD0,_OUTW(0x0E00)
_CMD0,_OUTW(0x6EF7)
_CMD0,_OUTW(0x0E04) ;!
_CMD0,_OUTW(0x6EF6)
_CMD(1100b),_OUTW(0x8F8F) ;!

_CMD0,_OUTW(0x0000)

_CMD0
P=50000
_OUTW(0x0000)
P=50000




[END]
MCLR=0
VPP=0
CLK=0,SDA=0

["Read ID"]
R3=3FFFFEH,_RDFL,R9=R1
R3=3FFFFFH,_RDFL,R1=*256,R1=|R9
R2=R1
R2=&0FFE0H ;id mask

R2?0480H{PRINT=("ID = %04lX - PIC18F242",R1),EXIT}
R2?0400H{PRINT=("ID = %04lX - PIC18F252",R1),EXIT}
R2?04A0H{PRINT=("ID = %04lX - PIC18F442",R1),EXIT}
R2?0420H{PRINT=("ID = %04lX - PIC18F452",R1),EXIT}

R2?0800H{PRINT=("ID = %04lX - PIC18F248",R1),EXIT}
R2?0840H{PRINT=("ID = %04lX - PIC18F258",R1),EXIT}
R2?0820H{PRINT=("ID = %04lX - PIC18F448",R1),EXIT}
R2?0860H{PRINT=("ID = %04lX - PIC18F458",R1),EXIT}

R2?2160H{PRINT=("ID = %04lX - PIC18F2221",R1),EXIT}
R2?2120H{PRINT=("ID = %04lX - PIC18F2321",R1),EXIT}
R2?1160H{PRINT=("ID = %04lX - PIC18F2410",R1),EXIT}
R2?1140H{PRINT=("ID = %04lX - PIC18F2420",R1),EXIT}
R2?1140H{PRINT=("ID = %04lX - PIC18F2423",R1),EXIT}
R2?2420H{PRINT=("ID = %04lX - PIC18F2450",R1),EXIT}
R2?1260H{PRINT=("ID = %04lX - PIC18F2455",R1),EXIT}
R2?2A60H{PRINT=("ID = %04lX - PIC18F2458",R1),EXIT}
R2?1AE0H{PRINT=("ID = %04lX - PIC18F2480",R1),EXIT}
R2?1120H{PRINT=("ID = %04lX - PIC18F2510",R1),EXIT}
R2?0CE0H{PRINT=("ID = %04lX - PIC18F2515",R1),EXIT}
R2?1100H{PRINT=("ID = %04lX - PIC18F2520",R1),EXIT}
R2?1100H{PRINT=("ID = %04lX - PIC18F2523",R1),EXIT}
R2?0CC0H{PRINT=("ID = %04lX - PIC18F2525",R1),EXIT}
R2?1240H{PRINT=("ID = %04lX - PIC18F2550",R1),EXIT}
R2?2A40H{PRINT=("ID = %04lX - PIC18F2553",R1),EXIT}
R2?1AC0H{PRINT=("ID = %04lX - PIC18F2580",R1),EXIT}
R2?0EE0H{PRINT=("ID = %04lX - PIC18F2585",R1),EXIT}
R2?0CA0H{PRINT=("ID = %04lX - PIC18F2610",R1),EXIT}
R2?0C80H{PRINT=("ID = %04lX - PIC18F2620",R1),EXIT}
R2?0EC0H{PRINT=("ID = %04lX - PIC18F2680",R1),EXIT}
R2?2700H{PRINT=("ID = %04lX - PIC18F2682",R1),EXIT}
R2?2720H{PRINT=("ID = %04lX - PIC18F2685",R1),EXIT}
R2?2140H{PRINT=("ID = %04lX - PIC18F4221",R1),EXIT}
R2?2100H{PRINT=("ID = %04lX - PIC18F4321",R1),EXIT}
R2?10E0H{PRINT=("ID = %04lX - PIC18F4410",R1),EXIT}
R2?10C0H{PRINT=("ID = %04lX - PIC18F4420",R1),EXIT}
R2?10C0H{PRINT=("ID = %04lX - PIC18F4423",R1),EXIT}
R2?2400H{PRINT=("ID = %04lX - PIC18F4450",R1),EXIT}
R2?1220H{PRINT=("ID = %04lX - PIC18F4455",R1),EXIT}
R2?2A20H{PRINT=("ID = %04lX - PIC18F4458",R1),EXIT}
R2?1AA0H{PRINT=("ID = %04lX - PIC18F4480",R1),EXIT}
R2?10A0H{PRINT=("ID = %04lX - PIC18F4510",R1),EXIT}
R2?0C60H{PRINT=("ID = %04lX - PIC18F4515",R1),EXIT}
R2?1080H{PRINT=("ID = %04lX - PIC18F4520",R1),EXIT}
R2?1080H{PRINT=("ID = %04lX - PIC18F4523",R1),EXIT}
R2?0C40H{PRINT=("ID = %04lX - PIC18F4525",R1),EXIT}
R2?1200H{PRINT=("ID = %04lX - PIC18F4550",R1),EXIT}
R2?2A00H{PRINT=("ID = %04lX - PIC18F4553",R1),EXIT}
R2?1A80H{PRINT=("ID = %04lX - PIC18F4580",R1),EXIT}
R2?0EA0H{PRINT=("ID = %04lX - PIC18F4585",R1),EXIT}
R2?0C20H{PRINT=("ID = %04lX - PIC18F4610",R1),EXIT}

PRINT=("ID = %04lX",R1)