Files
aqhomecontrol/avr/modules/flash/flash1p.asm
2025-05-17 10:50:09 +02:00

77 lines
2.1 KiB
NASM

; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
.equ FLASH_PAGESIZE = (PAGESIZE*2)
; ***************************************************************************
; data
.dseg
flashPageStart: .byte 2
flashPageBuffer: .byte FLASH_PAGESIZE
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; flash1pWritePage
;
; Interrupts must be disabled!
;
; @clobbers r0, r1, r20, r24, r25, X, Z
flash1pWritePage:
lds zl, flashPageStart
lds zh, flashPageStart+1
; copy from SDRAM into MCUs temporary page buffer
ldi xl, LOW(flashPageBuffer)
ldi xh, HIGH(flashPageBuffer)
ldi r24, LOW(PAGESIZE)
flash1pWritePages_loop:
ld r0, X+ ; read source data from buffer (low)
ld r1, X+ ; read source data from buffer (high)
ldi r20, (1<<SPMEN) ; enable next SPM, write R1:R0 into temp page buffer
rcall flashDoSpm ; (R16)
adiw zh:zl, 2
dec r24
brne flash1pWritePages_loop
subi zl, LOW(PAGESIZE*2) ; point back to begin of page
sbci zh, HIGH(PAGESIZE*2)
; transfer data from temporary page buffer into FLASH memory
ldi r20, (1<<PGWRT) + (1<<SPMEN) ; enable next SPM, write page (R1/R0 ignored)
rcall flashDoSpm ; (R16)
#if 0
.ifdef RWWSRE
flash1pWritePages_endLoop:
in r20, SPMCR
sbrc r20, RWWSB
rjmp flash1pWritePages_endLoop
ldi r20, (1<<RWWSRE) | (1<<SPMEN) ; reenable RWW
rcall flashDoSpm ; (R16)
.endif
#endif
ret
; @end
.equ flashWritePage = flash1pWritePage