...was ist alles zu beachten?
zu den Gründen muß ich wohl nicht viel sagen - gerade bei kurzen und zeitkritischen Sachen möchte ich bei Assembler bleiben - beim rumprobieren mal so auf die Schnelle, und bei komplizierten Algorithmen ist's mit Bascom einfacher. Außerdem scheinen einige speziellere Hardwarefunktionen mit den Bascom-Config-Befehlen nicht vorgesehen zu sein. Falls es bereits so eine Übersicht gibt, verweist mich bitte dahin (ich hab bisher nichts komplettes gefunden). Folgendes hab ich bisher zusammengetragen (bitte bestätigen/korrigieren/ergänzen):
-Bascom erkennt (und übersetzt/verwendet) die Assembler-Mnemonics, außer...
-gleichnamige Bascom-Mnemonics haben vorrang
-will man trotzdem das entsprechende Assembler-Mnemonic verwenden, muß man direkt ein "!" voranstellen.
-die Compiler-Direktiven "$asm" und "end asm" umschließen einen reinen Assembler-Codeblock
-Bascom pusht (Eintritt) und popt (Austritt) bei IRQs alle "Rechenregister" es sei denn, man legt die ISR mit einem nachgestellten "nosafe" fest.
-für jede Operation (also eine Zeile Bascom-Code) holt Bascom etwaige Variablen etc. aus dem Speicher (in Rechenregister), verrechnet diese, und schreibt das/die Ergebnis/se ggf zurück - insbesondere hier könnte man mit Assemblerverwendung sparen. (Stimmt das so?) Die verwendeten Register sollten also nach der Bascom-Code-Zeile wieder frei sein.
-Da eine Bascom-Zeile (i.a.) in mehrere Assembler-Befehle übersetzt wird, müssen in ISRs verwendete Register (ggf auch das SREG) auf dem Stack gesichert werden (aber halt nicht unbedingt alle )
-Bascom belegt außerdem "permanent" die Register R4/R5 (->FrameStack), R8/R9 (->Read(?)), das low-Nibble von R6. (noch mehr?).
Jetzt wirds noch ein wenig unsicherer:
-wie komme ich mit Assembler an, von Bascom definierte, Variablen ran? Einerseits kann man die Variable mit "DIM name AS typ AT adresse" definieren - die Adresse (konstant) kann dann auch in Assemblerinstruktionen verwendet werden. Was ist mit "LOADADDR var,Platzhalter"? Wenn ich das recht verstanden habe, existiert der Platzhalter nur für den Compiler, und wird beim assemblieren halt durch die Adresse (von var) ersetzt - die LOADADDR-Instruktion selbst erzeugt letztendlich keinen Code. (?)
-wie verhält sich das mit Sprüngen - also kann ich in einem ASM-Block ein Sprungziel festlegen, und aus einem anderen dahin jmpen? (überprüft Bascom insbesondere die zulässige Sprungdistanz?)
-wird irgendwie sichergestellt, daß bascom-generierte Sprungziele mit meinen nicht ... äh ... gleiche Namen haben?
-zumindest beim Mega88 gibt es 3(?) I/O-Register, die sich mMn noch mit IN/OUT ansprechen lassen - also "schneller" SRAM. verwendet Bascom sowas, oder hab ich da dann alleinigen Zugriff drauf? Achso, dabei fällt mir grad ein:
-kann man irgendwie Rechenregister "reservieren", sodaß Bascom die nicht überschreiben kann (für oft/zeitkritisch verwendete Konstanten/Variablen...)?
so, das wär erstmal alles, was mir bisher so auf die Schnelle dazu eingefallen ist. Dank an alle, die bis hier gelesen haben. Und jetzt bitte Korrekturen/Ergänzungen und (!) Bestätigungen.
zu den Gründen muß ich wohl nicht viel sagen - gerade bei kurzen und zeitkritischen Sachen möchte ich bei Assembler bleiben - beim rumprobieren mal so auf die Schnelle, und bei komplizierten Algorithmen ist's mit Bascom einfacher. Außerdem scheinen einige speziellere Hardwarefunktionen mit den Bascom-Config-Befehlen nicht vorgesehen zu sein. Falls es bereits so eine Übersicht gibt, verweist mich bitte dahin (ich hab bisher nichts komplettes gefunden). Folgendes hab ich bisher zusammengetragen (bitte bestätigen/korrigieren/ergänzen):
-Bascom erkennt (und übersetzt/verwendet) die Assembler-Mnemonics, außer...
-gleichnamige Bascom-Mnemonics haben vorrang
-will man trotzdem das entsprechende Assembler-Mnemonic verwenden, muß man direkt ein "!" voranstellen.
-die Compiler-Direktiven "$asm" und "end asm" umschließen einen reinen Assembler-Codeblock
-Bascom pusht (Eintritt) und popt (Austritt) bei IRQs alle "Rechenregister" es sei denn, man legt die ISR mit einem nachgestellten "nosafe" fest.
-für jede Operation (also eine Zeile Bascom-Code) holt Bascom etwaige Variablen etc. aus dem Speicher (in Rechenregister), verrechnet diese, und schreibt das/die Ergebnis/se ggf zurück - insbesondere hier könnte man mit Assemblerverwendung sparen. (Stimmt das so?) Die verwendeten Register sollten also nach der Bascom-Code-Zeile wieder frei sein.
-Da eine Bascom-Zeile (i.a.) in mehrere Assembler-Befehle übersetzt wird, müssen in ISRs verwendete Register (ggf auch das SREG) auf dem Stack gesichert werden (aber halt nicht unbedingt alle )
-Bascom belegt außerdem "permanent" die Register R4/R5 (->FrameStack), R8/R9 (->Read(?)), das low-Nibble von R6. (noch mehr?).
Jetzt wirds noch ein wenig unsicherer:
-wie komme ich mit Assembler an, von Bascom definierte, Variablen ran? Einerseits kann man die Variable mit "DIM name AS typ AT adresse" definieren - die Adresse (konstant) kann dann auch in Assemblerinstruktionen verwendet werden. Was ist mit "LOADADDR var,Platzhalter"? Wenn ich das recht verstanden habe, existiert der Platzhalter nur für den Compiler, und wird beim assemblieren halt durch die Adresse (von var) ersetzt - die LOADADDR-Instruktion selbst erzeugt letztendlich keinen Code. (?)
-wie verhält sich das mit Sprüngen - also kann ich in einem ASM-Block ein Sprungziel festlegen, und aus einem anderen dahin jmpen? (überprüft Bascom insbesondere die zulässige Sprungdistanz?)
-wird irgendwie sichergestellt, daß bascom-generierte Sprungziele mit meinen nicht ... äh ... gleiche Namen haben?
-zumindest beim Mega88 gibt es 3(?) I/O-Register, die sich mMn noch mit IN/OUT ansprechen lassen - also "schneller" SRAM. verwendet Bascom sowas, oder hab ich da dann alleinigen Zugriff drauf? Achso, dabei fällt mir grad ein:
-kann man irgendwie Rechenregister "reservieren", sodaß Bascom die nicht überschreiben kann (für oft/zeitkritisch verwendete Konstanten/Variablen...)?
so, das wär erstmal alles, was mir bisher so auf die Schnelle dazu eingefallen ist. Dank an alle, die bis hier gelesen haben. Und jetzt bitte Korrekturen/Ergänzungen und (!) Bestätigungen.