BasCom Example


TEST.BAS

$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.)