Hallo,
ich möchte ein Byte-Array an eine Sub übergeben, in der aber per Assembler auf das Array zugegriffen werden soll.
Damit ich in der Sub nicht lange die Adresse des Arrays ermitteln muss, wollte ich die Adresse direkt per X- oder Z-Register übergeben.
In den Bascom-Libs wird das oft so gemacht, dass die Zeiger schon bei Einsprung in ein Label bereits in den Register stehen.
In Basic würde man folgendes schreiben, um einen Zeiger zu übergeben:
Der Zeiger steht aber dann nicht in einem Register, sondern liegt auf dem Frame und muss man erst per Y-Register einlesen.
Ich dachte jetzt, wenn ich die Sub wie folgt deklariere, dass das Array dann direkt per Register übergeben werden könnte. Der Aufruf der Sub bleibt gleich.
Leider kommt im X-Register nur der Wert aus dem Array an.
Weil Bascom ja manchmal eigen ist, dachte ich, es könnte vielleicht mit Byref anstatt ByReg klappen. Also so:
Da kommt aber leider auch nur Müll an.
Ich habe dann gedacht, ok, dann berechne ich eben den Pointer und gebe diesen dann per Register rüber:
Leider hat diese Methode auch Tücken. Denn wenn ich noch einen Parameter vor dem eigentlichen Zeiger übergeben möchte, zerschießt es mir den 1. Parameter. Also diese Methode fällt dann auch weg.
Die beste Lösung, die ich jetzt finden konnte und auch zuverlässig funktioniert, war folgende:
Über 2 Assembler-Befehle habe ich dann die Adresse im gewünschten Register.
So, jetzt zurück zur Eingangsfrage.
Gibt es eine Möglichkeit, die Array-Adresse ohne Umwege (aus Geschwindigkeitsgründen) direkt in einem Register (X oder Z) zu übergeben?
Also dass in der Sub-Routine dann direkt die Adresse in r27:r26 steht oder wahlweise in einem anderen Register?
Hat jemand eine Idee?
Gruß Mitch64
ich möchte ein Byte-Array an eine Sub übergeben, in der aber per Assembler auf das Array zugegriffen werden soll.
Damit ich in der Sub nicht lange die Adresse des Arrays ermitteln muss, wollte ich die Adresse direkt per X- oder Z-Register übergeben.
In den Bascom-Libs wird das oft so gemacht, dass die Zeiger schon bei Einsprung in ein Label bereits in den Register stehen.
In Basic würde man folgendes schreiben, um einen Zeiger zu übergeben:
Der Zeiger steht aber dann nicht in einem Register, sondern liegt auf dem Frame und muss man erst per Y-Register einlesen.
Ich dachte jetzt, wenn ich die Sub wie folgt deklariere, dass das Array dann direkt per Register übergeben werden könnte. Der Aufruf der Sub bleibt gleich.
Leider kommt im X-Register nur der Wert aus dem Array an.
Weil Bascom ja manchmal eigen ist, dachte ich, es könnte vielleicht mit Byref anstatt ByReg klappen. Also so:
Ich habe dann gedacht, ok, dann berechne ich eben den Pointer und gebe diesen dann per Register rüber:
Die beste Lösung, die ich jetzt finden konnte und auch zuverlässig funktioniert, war folgende:
So, jetzt zurück zur Eingangsfrage.
Gibt es eine Möglichkeit, die Array-Adresse ohne Umwege (aus Geschwindigkeitsgründen) direkt in einem Register (X oder Z) zu übergeben?
Also dass in der Sub-Routine dann direkt die Adresse in r27:r26 steht oder wahlweise in einem anderen Register?
Hat jemand eine Idee?
Gruß Mitch64