; Orange programmer module v1.6
; (c) 2010-2011 CnCLab
;PIC18F2XJ/4XJ with no EEPROM
; No Vpp on MCLR!

;CHIP=PIC18F45J10,32K,P18F4xj.hpl
;AREA=FLASH,32K(64),0
;VCC=3250
;IMAGE=pic18fjq44

;
; ERASE algo not compatible with old PICs!
;Tested - PIC18F45J10

INFO="Special Adapter"

ALLPINS=0
OPTIONS=fm,m


PING=SDA,1 ;RB7
PINO=CLK,0 ;RB6
PINO=MCLR,2  ;/MCLR

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

CDELAY=1


R1=CONFIG,H


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


[_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=3500 ;min 3.4ms 
CLK=0
P=1 
_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
P=2000
MCLR=1,P=100  ;Programm/Verify Mode!
MCLR=0,P=100

R9=0 ;current address register

;Program/Verify Entry Code = 4D434850h
R0=4D434850h
LOOP=(31,0){SDA=R0[I],CLK=P}
P=1
MCLR=1,P=500


;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
}



[_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

[_WR1]
;Step 1: Enable writes.
_CMD0,_OUTW(0x84A6)
;Step 2: Load write buffer
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) ;last 
R0=DATA,_OUT,ADR=+1
R0=DATA,_OUT,ADR=+1
;
_CMDNOP ;WITH DELAY



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

; FLASH & ID
[WRITEBLOCK]
;Step 1: Enable writes.
_CMD0,_OUTW(0x84A6)
;Step 2: Load write buffer
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)

R2=$BLOCKSIZE,R2=/2,R2=-1
;PRINT=L("R2=%u\n",R2)

LOOP(R2){
_CMD(1101b)
R0=DATA,_OUT,ADR=+1
R0=DATA,_OUT,ADR=+1
}

;_CMD(1101b) ;test??????
;_OUT(0xAA)
;_OUT(0xBB)


_CMD(1111b) ;last 
R0=DATA,_OUT,ADR=+1
R0=DATA,_OUT,ADR=+1
;
_CMDNOP ;WITH DELAY



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

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

_CMD0,_OUTW(0x0000)

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




[END]
CLK=0,SDA=0
MCLR=0
P=100
;VPP=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)