BasCom Code4


Increment SRAM-Variable

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.