Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Blitz und Assembler mischen
#1
Ich mache momentan ein Program, wo einige Abschnitte jede VBl laufen muß, und aus Geschwindigkeitsgrunden sind sie als selbstständigen Assemblerroutinen geschrieben, die in einen Array eingeladen und folgendermaßen aufgerufen werden:
GetReg a0, &Liste() ; Basisadresse um Variabeln bearbeiten zu können
GetReg a1, &Liste()\array[0] ; Basisadresse für die ML-Routine
JSR (a1)

Das scheint zu funktionieren, obwohl ich manchmal Abstürze kriege.

Doch kann ich nicht alles mit Assembler lösen, sondern brauche auch manchmal die Hilfe der Blitz-Bibliotheken, z.B. um Text herauszugeben.

Ich habe gelesen, daß A5 als Basisregister für globalen Variablen dient, aber wie kann man das ausnützen um eine Variabeln zu finden und benutzen?

Und kann man überhaupt einen Sprung in einen Blitz-Befehl aus Maschinensprache durchführen? Ich kenne TokeJSR, aber das ist an sich ein Blitz-Befehl, und meine Assembler-Programmchen sind außer Blitz geschrieben, und das muß so sein, denn sie werden dynamisch eingeladen und wieder gelöscht.
Zitieren
#2
Was wäre, wenn du die Programmteile (Abschnitte), die ASM erfordern, als Library oder (einfacher) als Funcs/Statements machst? So kannst du das Problem schonmal separieren und dann schauen wir mal, wo wir ansetzen können.
Zitieren
#3
Ich glaube, das ist fast unmöglich. Die ASM-Abschnitte sind die AI-Logik der Gegner eines Spieles, und sie werden zusammen mit jedem Level hereingeladen. Es gibt eine vielfalt von möglichen Gegner, und sie allen statisch einzubinden ist technisch unsund.
Zitieren
#4
Du könntest ein Macro einfügen, das die Aufrufe "einkapselt" und an spezifische Funcs weiterleitet.
Zitieren
#5
Wenn ich Dich richtig verstehe, würde die Func-Lösung doch eine statische Einbindung aller ASM-Abschnitten mitführen, oder?

Vielleicht muß ich noch erwähnen, daß die ASM-Routinen automatisch geschrieben werden. Ich habe sie vorher in Blitz gemacht, aber das war zu langsam und ich war gezwungen, diese externe Assemblerlösung zu basteln.
Zitieren
#6
idrougge schrieb:Wenn ich Dich richtig verstehe, würde die Func-Lösung doch eine statische Einbindung aller ASM-Abschnitten mitführen, oder?
Das weiß ich doch nicht; den Src hast du.
idrougge schrieb:Vielleicht muß ich noch erwähnen, daß die ASM-Routinen automatisch geschrieben werden.
DAS hört sich seltsam an: Da wird dann ein Binärblock irgendwohin kopiert und darauf gesprungen, oder was?

Ich verstehe (noch) nicht, warum ein statisches Stück Code etwas anderes sein soll, als ein dazugeladenes, auch wenn Letzteres ASM Code ist.
Entweder kannst du es nicht in Blitz mit ASM abbilden oder es ist so kaputt, daß du es auch nicht als OBJ (=DATA) includen (und aufrufen) kannst.
Deine Bestrebungen hinsichtlich der Register sind mir micht nur fremd, sie verwirren mich auch Confusedhock:
Zitieren
#7
Hallo,

So ganz verstehe ich dein Problem auch nicht, aber wie hackball schon schrieb,
pack deinen AsmSource in ein Statement oder Funktion.(anstatt ihn dazu zu laden)
Zum rauspringen benutzt du dann den Befehl AsmExit
Zitieren
#8
hackball schrieb:
idrougge schrieb:Vielleicht muß ich noch erwähnen, daß die ASM-Routinen automatisch geschrieben werden.
DAS hört sich seltsam an: Da wird dann ein Binärblock irgendwohin kopiert und darauf gesprungen, oder was?

Genau so. Das habe ich nicht ganz eindeutich erklärt, aber genau so ist es. Jeder Feind (oder Freund) hat ein kurzes Maschinensprachenabschnitt um seine Logik auszuführen, und das wird in ein Feld im Gegner-Newtype eingelesen und jede Vbl durchgeführt.

hackball schrieb:Ich verstehe (noch) nicht, warum ein statisches Stück Code etwas anderes sein soll, als ein dazugeladenes, auch wenn Letzteres ASM Code ist.

Jenes wird in TED geschrieben und von Blitz compiliert, und hat deshalb ein natürliches Zuhause, während das eingelesene als Gast keine Zugang an den Ressourcen von Blitz hat. Ich kann in meinen externen Asm-Routinen Befehle wie "TokeJsr" oder "AsmExit" benutzen, z.B.
Zitieren
#9
Hört sich nach einen "Codewar" an.

Ok, um die Abstürze zu vermeiden musst du ein paar Register retten.

[ab3]GetReg a0, &Liste() ; Basisadresse um Variabeln bearbeiten zu können
GetReg a1, &Liste()\array[0] ; Basisadresse für die ML-Routine
MOVE.l a4, -(a7)
MOVE.l a5, -(a7)
MOVE.l a6, -(a7)
MOVE.l d7, -(a7)
JSR (a1)
MOVE.l d7, (a7)+
MOVE.l a6, (a7)+
MOVE.l a5, (a7)+
MOVE.l a4, (a7)+[/ab3]
d7 ist nicht unbedingt notwendig, kommt drauf an was für code noch drumherum existiert.
a4 musst du nur retten wenn du in einer Function bist (Basis für lokale Variablen)
a5 musst du IMMER retten (Basis für globale Variablen/Resourcen)
a6 ist der Cache für library Aufrufe. Hängt auch vom drumliegenden Code ab.

Trotzdem wäre eine Library doch irgendwie sauberer.
Mit der "libary.include" geht das recht fix. Und du kannst auch Assembler verwenden, wenn es schnell sein muss.
Zitieren
#10
Ich habe schon in der Blitzdoku gelesen, daß die Register a4-a6 für internen Blitz-Zwecke reserviert sind, und benutze deshalb in meinen Asm-Routinen nur a0 und a1. Müssen a4-a7 trotzdem "gerettet" werden?

Und ist library.include nicht Amiblitz-spezifisch? Ich bleibe noch Blitz2 treu.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste