Files
aqhomecontrol/avr/common/eeprom-r.asm
2026-04-20 23:56:52 +02:00

105 lines
2.5 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. *
; ***************************************************************************
#ifndef AQH_AVR_COMMON_EEPROM_R_H
#define AQH_AVR_COMMON_EEPROM_R_H
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine Eeprom_ReadByte
;
; Read a byte from EEPROM (see example in ATtiny24/44/84 manual p.19).
;
; @param X EEPROM Address to read from
; @return CFLAG set if address okay, cleared if out of range
; @return R16 byte read
; @clobbers none
Eeprom_ReadByte:
rcall Eeprom_CheckAddr ; (R16)
brcc Eeprom_ReadByte_ret
push r15
inr r15, SREG
cli
; wait until EEPROM ready
Eeprom_ReadByte_waitLoop:
.ifdef EEPE
sbic EECR, EEPE ; wait for previous write to complete (if any)
.else
sbic EECR, EEWE ; wait for previous write to complete (if any)
.endif
rjmp Eeprom_ReadByte_waitLoop
; read from EEPROM
out EEARH, xh ; set EEPROM address
out EEARL, xl
sbi EECR, EERE ; start EEPROM read by writing EERE
in r16, EEDR ; read data from data register
outr SREG, r15
pop r15
sec
Eeprom_ReadByte_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine Eeprom_CheckAddr
;
; @param X EEPROM Address to validate
; @return CFLAG set if address okay, cleared if out of range
; @clobbers r16
Eeprom_CheckAddr:
mov r16, xl
subi r16, LOW(EEPROMEND)
mov r16, xh
sbci r16, HIGH(EEPROMEND)
ret
; @end
; ---------------------------------------------------------------------------
; @routine Eeprom_ReadBytes
;
; @param X EEPROM Address to read from
; @param Y address in SDRAM to write to
; @param R17 number of bytes to copy
; @clobbers r16, r17, X, Y
Eeprom_ReadBytes:
Eeprom_ReadBytes_loop:
rcall Eeprom_ReadByte ; r16=byte read (none)
brcc Eeprom_ReadBytes_done
st Y+, r16
adiw xh:xl, 1
dec r17
brne Eeprom_ReadBytes_loop
sec
Eeprom_ReadBytes_done:
ret
; @end
#endif ; AQH_AVR_COMMON_EEPROM_R_H