I don't know about all the others, but the 18F series lets you modify FLASH at run-time. You have to first erase a block, (8-64 bytes, depending on your chip type - and you have to start at a block boundary) with the ERASECODE command. After erasure, you can write whatever you want.
I did this in several versions or "levels". This is the lowest level.
The following to allow the bootloader to run (or not) depending on a program variable. If you set PROTECT and called PatchLoader, the bootloader will not run. If in the program, you set PROTECT = 0, and run it, the bootloader will again work.
It should be noted that this was used with PBP 250a and an 18F8722 and MCLOADER.
PBP2.50a could not access the upper half of the big chips (>64K) memory using READCODE,WRITECODE or ERASECODE, so I had to modify PBPPPIC18.LIB to include a new SYSTEM variable called UPMEM. The library modification set TBLPTRU to UPMEM at the beginning of these 3 routines, and cleared UPMEM at the end (so as not to screw up PBP). By setting UPMEM to 1, I could read the upper half of memory (and by setting it to 0x30, you can set/read the configuration registers). You will see that I need to set upmem before each operation to get to that upper half of FLASH. You wouldn't have to deal with that in a smaller chip.
I have done quite a bit of this, let me know if you need any more help.
Code:
PatchLoader:
UPMEM = 0
ERASECODE $0
WRITECODE $0,$EFE0 ; Change the initial jump vector
WRITECODE $2,$F0FF ; 0X1FFC0
WRITECODE $4,$FFFF
WRITECODE $6,$FFFF
for xx = $8 TO $3E STEP 2 ; Do the rest of the block
WRITECODE XX,$FFFF
NEXT Xx
PAUSE 100
PROTECT = 1
GOSUB PROTECT_UNPROTECT
RETURN
PROTECT_UNPROTECT:
UPMEM = 1
ERASECODE $FFC0
UPMEM = 1
WRITECODE $FFC0,$6B08
UPMEM = 1
WRITECODE $FFC2,$0000
UPMEM = 1
WRITECODE $FFC4,$0000
UPMEM = 1
WRITECODE $FFC6,$0000
UPMEM = 1
WRITECODE $FFC8,$3F08
UPMEM = 1
WRITECODE $FFCA,$D7FB
if PROTECT = 0 THEN
UPMEM = 1
WRITECODE $FFCC,$EF82
UPMEM = 1
WRITECODE $FFCE,$F0FE ; JUMP TO 1FD04
ELSE
UPMEM = 1
WRITECODE $FFCC,$EF78
UPMEM = 1
WRITECODE $FFCE,$F0FE ; JUMP TO 1fcF0
ENDIF
FOR XX = $FFD0 TO $FFFE STEP 2
UPMEM = 1
WRITECODE XX,$FFFF
NEXT XX
RETURN
REPROTECT:
UPMEM = 1
READCODE $FFCC,X
IF X = $82 THEN
HSEROUT [13,10,10,"Reprotecting Loader",13,10]
PROTECT = 1
GOSUB PROTECT_UNPROTECT
ENDIF
RETURN
GetTypeLoader:
READCODE 0,TypeLoader
RETURN
Bookmarks