$regfile = "m32def.dat"
$crystal = 8000000 'Quarzfrequenz
$baud = 9600
Declare Function Myfunc(byval Op1 As Byte , Byval Op2 As Byte) As Byte
Dim Res As Byte
Res = Myfunc(23 , 12)
End
'----------------------------------------------------------------
Function Myfunc(byval Op1 As Byte , Byval Op2 As Byte) As Byte
Local Onebyte As Byte
Local Oneword As Word
Local Onesingle As Single
Onebyte = 1
Oneword = 1
Onesingle = 1.0
Oneword = Op1 + Op2
Myfunc = Oneword
End Function
HexFile.HEX
(Prolog skipped)
Res = Myfunc(23 , 12)
Adresse von Result „DIM Res as Byte“ auf den Soft-Stack
0086 LDI ZL,$60
0088 LDI ZH,$00
008A ST --Y,ZH
008C ST --Y,ZL
Adresse der Kopie von OP1 auf den Soft-Stack
008E ST --Y,r5
0090 ST --Y,r4
0092 LDI r24,$17 ; Literal „23“
0094 MOV XL,r4
0096 MOV XH,r5
0098 ST X,r24
009A LDI r24,$01
009C CALL AddFrame
Adresse der Kopie von OP2 auf den Soft-Stack
00A0 ST --Y,r5
00A2 ST --Y,r4
00A4 LDI r24,$0C ; Literal „12“
00A6 MOV XL,r4
00A8 MOV XH,r5
00AA ST X,r24
00AC LDI r24,$01
00AE CALL AddFrame
Aufruf der Funktion
00B2 CALL MyFunc
Wiederherstellen SoftStack (6 Byte)
00B6 ADIW YL,$0006
Wiederherstellen Frame (2 Byte)
00B8 LDI r24,$02
00BA CALL SubFrame
End
00BE CLI Clear Interrrupts
END:
00C0 RJMP END Ewige Schleife
----------------------------------------------------------------------------------------------------------------------------
MyFunc:
reservieren Frame 1 Byte (local Onebyte)
00C2 LDI r24,$01
00C4 CALL RsvFrame
reservieren Frame 2 Byte (local Oneword)
00C8 LDI r24,$02
00CA CALL RsvFrame
reservieren Frame 4 Byte (local Onesingle)
00CE LDI r24,$04
00D0 CALL RsvFrame
Onebyte = 1
00D4 LDI r24,$01
00D6 LD XL,Y + 4
00D8 LD XH,Y + 5
00DA ST X,r24
Oneword = 1
00DC LDI r24,$01
00DE LDI r25,$00
00E0 LD XL,Y + 2
00E2 LD XH,Y + 3
00E4 ST X++,r24
00E6 ST X,r25
Onesingle = 1
00E8 LD XL,Y + 0
00EA LD XH,Y + 1
00EC LDI ZL,$64 Im Flash auf $0164 steht das Literal „1.0“
00EE LDI ZH,$01
00F0 CALL FlashToRam4 ; Move 4 Byte in das lokale Single
Oneword = Op1 + Op2
00F4 LD XL,Y + 8 ; OP1 adresse
00F6 LD XH,Y + 9
00F8 LD r16,X++
00FA CLR r17
00FC LD XL,Y + 6 ; OP2 adresse
00FE LD XH,Y + 7
0100 LD r20,X++
0102 CLR r21 ; R20:R21 = Op2 (12)
0104 ADD r16,r20 ; Addition nach R16:R17
0106 ADC r17,r21
0108 LD XL,Y + 2 ; addresse Oneword
010A LD XH,Y + 3
010C ST X++,r16 ; speichern summe
010E ST X,r17
Myfunc = Oneword
0110 LD XL,Y + 2 ; addresse Oneword
0112 LD XH,Y + 3
0114 LD r24,X ; LSB nach R24
0116 LD XL,Y + 10 ; adresse Funktionsergebnis
0118 LD XH,Y + 11
011A ST X,r24 ; Speichern R24
End Function
011C LDI r24,$07 ; Freigabe des Frame (1 + 2 + 4 = 7 Bytes)
011E SUB r4,r24
0120 CLR r24
0122 SBC r5,r24
0124 ADIW YL,$0006 Wiederhestellen SofStack (3*2 = 6 Byte)
0126 RET return
Es folgen die zugefügten Elemente aus der BasCom Library
FlashToRam4: Kopieren 4 Bytes aus dem Flash (Z) nach SRAM
(X)
0128 LDI r24,$04
Loop:
012A LPM
012C ADIW ZL,$0001
012E ST X++,r0
0130 DEC r24
0132 BRNE Loop
0134 RET
SubFrame: Freigabe von n Bytes (r24) des Frame
0136 SUB r4,r24
0138 CLR r24
013A SBC r5,r24
013C RET
AddFrame: Reservierung von n Bytes (r24) des Frame
013E ADD r4,r24
0140 CLR r24
0142 ADC r5,r24
0144 RET
RsvFrame: reservieren von n Bytes (r24) des Frame, adresse
auf den SoftStack
0158 ST --Y,r5
015A ST --Y,r4
015C ADD r4,r24
015E CLR r24
0160 ADC r5,r24
0162 RET
0164 00 00 .. Das Literal „1.0“ (s.o.)