Source file: /~heha/ewa/Kram/igr-251008.zip/flash.i15

;Flash (14-Bit-Werte) nach RAM lesen
;PE:	PMADR = Flash-Adresse (Quelle, beliebig)
;	FSR0 = RAM-Adresse (Ziel)
;	W = Länge in Words
;VR:	W, FSR1H = 0, PMADR (vorgerückt), FSR0 (vorgerückt)
flashRead
	movwf	FSR1H
	banksel	PMCON1
_rloop	bsf	PMCON1,RD	; Capture one flash word
	nop
	nop
	movfw	PMDATL		; read LoByte
	movwi	FSR0++		; save it
	movfw	PMDATH		; read HiByte
	movwi	FSR0++		; save it
	incf	PMADRL,f
	skpnz
	 incf	PMADRH,f
	decfsz	FSR1H,f
	 bra	_rloop
	return


;Flash-Page löschen
;PE:	PMADR = Flash-Adresse, durch 32 teilbar?
flashErase
	banksel	PMCON1		;bank 3
	bsf	PMCON1,FREE
	bsf	PMCON1,WREN	; enable write and erase to program memory
	bra	flash_unlock	; stalls until erase finishes

;Flash-Page schreiben
;PE:	PMADR = Flash-Adresse, durch 32 teilbar!
;	FSR0 = RAM-Adresse mit 64 Byte Daten
;PA:	-
flashWrite
	banksel	PMCON1
	bsf	PMCON1,LWLO	; write to latches only
	bsf	PMCON1,WREN

_wloop	moviw	FSR0++		; load lower byte
	movwf	PMDATL		; copy to write latch
	moviw	FSR0++		; load upper byte
	movwf	PMDATH		; copy to write latch
	comf	PMADRL,w
	andlw	31		;Null beim letzten Word in der Page
	brz	_wend
	call	flash_unlock	; execute unlock sequence
	incf	PMADRL,f	; increment write address
	bra	_wloop
_wend	bcf	PMCON1,LWLO	; flash entire page while writing last word

;Flash-Freigabe-Sequenz ausführen
;PE:	PMCON1 bits CFGS, LWLO, FREE and WREN set appropriately, BSR==3
;VR:	W
flash_unlock
	movlwf	0x55,PMCON2
	movlwf	0xAA,PMCON2
	bsf	PMCON1,WR
	nop
	nop
	return
Detected encoding: UTF-80