82 lines
2.0 KiB
NASM
82 lines
2.0 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
|
|
|
|
|
|
|
|
|
|
#endif ; AQH_AVR_COMMON_EEPROM_R_H
|
|
|
|
|