Blitz und Assembler mischen - Druckversion +- AmiBlitz³ (https://www.amiblitz.de/community) +-- Forum: Blitzbasic2 (https://www.amiblitz.de/community/forum-5.html) +--- Forum: Questions & Answers (https://www.amiblitz.de/community/forum-6.html) +--- Thema: Blitz und Assembler mischen (/thread-122.html) Seiten:
1
2
|
Blitz und Assembler mischen - idrougge - 12.12.2014 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. Re: Blitz und Assembler mischen - hackball - 12.12.2014 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. Re: Blitz und Assembler mischen - idrougge - 12.12.2014 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. Re: Blitz und Assembler mischen - hackball - 12.12.2014 Du könntest ein Macro einfügen, das die Aufrufe "einkapselt" und an spezifische Funcs weiterleitet. Re: Blitz und Assembler mischen - idrougge - 12.12.2014 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. Re: Blitz und Assembler mischen - hackball - 12.12.2014 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 hock: Re: Blitz und Assembler mischen - Blackbird - 12.12.2014 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 Re: Blitz und Assembler mischen - idrougge - 13.12.2014 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. Re: Blitz und Assembler mischen - Der Wanderer - 13.12.2014 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. Re: Blitz und Assembler mischen - idrougge - 15.12.2014 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. |