Byte
LDI XL,$60 Adresse Variable
LDI XH,$00
LD r24,X Variable -> R24
SUBI r24,$FF subtract -1 ==== +1
ST X,r24 store
Word/Integer
(signed / unsigned spielt hier keine Rolle)
LDI XL,$60
LDI XH,$00
CALL IncWord
---
IncWord:
LD ZL,X++ (x) --> Z
LD ZH,X
ADIW ZL,$0001 + 1
ST X,ZH (x) <-- Z
ST --X,ZL
RET
Long
LDI XL,$60
LDI XH,$00
CALL IncLong
----
IncLong:
LD r16,X++ (X) --> R16::R19
LD r17,X++
LD r18,X++
LD r19,X
LDI r24,$01 1 to add
ADD r16,r24 add
CLR r24 carry
ADC r17,r24
ADC r18,r24
ADC r19,r24
ST X,r19 (X) <-- R16::R19
ST --X,r18
ST --X,r17
ST --X,r16
RET
Single
LDI ZL,$A2 Flash literal "1.0"
(s.o)
LDI ZH,$02
CALL FlashSingToR18 ; "1.0" ? R18:R19:R20:R21
LDI ZL,$60 Sram Variable
LDI ZH,$00
CALL LoadSingR13 Variable ? R13:R14:R15:R16
CALL AddSingle R13::R16 + R18::R21 ? R13::R16
CLR ZH
LDI ZL,$0D addr. reg 13
LDI XL,$60 Variable
LDI XH,$00
CALL MoveMem4 R13:R14:R15:R16 ? Variable
------
;---------------------------------------------------
L_$027C:
LPM flash (Z) ? R0
ADIW ZL,$0001 Z ++
AND r0,r0 Test R0
RET
FlashSingToR18:
RCALL L_$027C first byte of single
MOV r18,r0 to R18
RCALL L_$027C
MOV r19,r0
RCALL L_$027C
MOV r20,r0
RCALL L_$027C
MOV r21,r0
RET
;------------------------------------------------
LoadSingR13:
LD r13,Z++
LD r14,Z++
LD r25,Z++
LD r26,Z++
RET
;-----------------------------------------------
MoveMem4:
LDI r25,$04
MoveMem:
LD r24,Z++
ST X++,r24
DEC r25
BRNE MoveMem
RET
;---------------------------------------------------
AddSingle:
…..
Anm: Diese Funktion addiert zwei beliebige Float-Zahlen, ein spezifisches
„Increment“ gibt es nicht.