Hallo Rag_Empire,
In der Hilfe ist unter "Mixing ASM and BASIC" einiges zu finden.
Es ist ( derzeit ) mit BASCOM-AVR nicht möglich, BASIC-Code in entsprechenden ASM-Code zu übersetzen. Daher ist also selber in ASM programmieren nötig.
Für die Variablenbehandlung gibt es mehrere Möglichkeiten:
Eine Variable kann mit z.B.
lds r24, {Variablenname}
in ein Register geladen werden. Analog dazu natürlich abspeichern mit
sts {Variablenname}, r24.
Hier kann auch mit Offset gearbeitet werden z.B.: {Variablenname+1}
Während dieses Verfahren für Byte-Variablen gut geeignet ist, ist für Variablen mit mehreren Bytes (Word, Integer, Long, String) die Verwendung eines Variablenpointers besser geeignet.
Loadadr X, Variablenname
Loadadr ist eine Hilfs-Befehl, welcher es ermöglicht mit Variablenpointer in BASCOM-AVR zu arbeiten.
Ist die Variable z.B. auf der Adresse &H123 wird dieser Befehl beim Kompilieren in
ldi xl, &H23
ldi xh, &H01
übersetzt.
Hat man die Adresse einer Variablen in einem der X oder Z Pointer-Register, kann dann mit folgender Sequenz eine Long-Variable in die Register r20-r23 geladen werden:
ld r20, X+
ld r21, X+
ld r22, X+
ld r23, X+
Abspeichern geht analog dazu.
Damit selbst erstellte Lib-Routinen aus dem BASIC aufgerufen werden können, müssen diese wie SUB oder FUNCTION in BASIC deklariert werden und die Library mit $LIB "MyLib.lib" gelinkt werden. "MyLib" steht für den Namen der selbst erstellten LIB.
Die Adressen der übergebenen Parameter, sowie die Adresse eines Rückgabewertes bei einer FUNCTION werden auf dem Y-Pointer (Soft-Stack) gespeichert.
Makros sind nicht mit LIBs vergleichbar. Lib-Routinen sind mit eingebundene Routinen, welche bei Bedarf angesprungen/aufgerufen werden, während Makros direkt beim Makro-Aufruf in den Code eingefügt werden. Eine LIB-Routine wird nur einmal eingebunden, während ein Makro bei jedem Aufruf in den Code eingefügt wird.
Man könnte z.B. die Hilfsfunktion Loadadr als ein Makro bezeichnen.
Grundsätzlich wäre aber zu überlegen, ob ein Portieren eines BASCOM-AVR Programmteiles in eine Library notwendig ist. Es lassen sich mit Librarys Code-Größe als auch Ausführungsgeschwindigkeit optimieren. Falls weder Code-Größe noch die Geschwindigkeit ein Problem sind, können diese Funktionalitäten in BASIC-Code in SUB od FUNCTION verpackt werden und dann von jedem Programmpunkt aufgerufen und verwendet werden. Siehe dazu DECLARE SUB und DECLARE FUNCTION in der Hilfe
Lesezeichen