Hi!
welche Speicherstellen in der Zero-Page darf ich für eigene Zeiger usw. in Assemblerroutinen nutzen?
Es geht um diesen ganzen Datasetten-Klimbim, der nicht benötigt wird.
Du bist in Begriff, Forum64 zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachte, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
letzter Beitrag von Claus am
Hi!
welche Speicherstellen in der Zero-Page darf ich für eigene Zeiger usw. in Assemblerroutinen nutzen?
Es geht um diesen ganzen Datasetten-Klimbim, der nicht benötigt wird.
Auf jeden Fall die Speicheradressen $02 und $FB bis $FE oder brauchst du mehr?
Guggstduhier
So, da.
welche Speicherstellen in der Zero-Page darf ich für eigene Zeiger usw. in Assemblerroutinen nutzen?
Das hängt von Deinem Anwendungsfall ab. Wenn Du nichts vom Kernal benutzt (also auch kein BASIC) kannst Du im Extremfall alles von $02-$FF nutzen. Sonst siehe Bedeutung der Adressen, wenn Du dem Link von BladeRunner folgst.
Prinzipiell können in der Zeropage natürlich auch Assembler-Routinen laufen...
Laut Dokumentation hier, sind $2a und $52 auch frei.
$3 bis $6 ebenfalls (werden vom System vorbelegt, aber nicht genutzt).
$a und $93 werden nur bei LOAD und VERIFY überschrieben und sind sonst frei.
Der Bereich von $61 bis $70 wird als Register bei Float-Rechnungen benutzt - den kann man also nicht für die Parameterübergabe nutzen (denn dabei rechnet BASIC ja ständig rum und braucht den Speicher selbst), aber innerhalb einer Assemblerroutine ist hier massig Platz für temporäre Variablen und Zeiger.
Für die Parameterübergabe von Basic zu Assembler lohnt es sich eigentlich nicht, die "wertvollen" Zeropage-Speicherstellen zu verwenden, das kann man ebensogut über den Kassettenpuffer oder $c000 oder sonstwo machen (oder für Fortgeschrittene: indem man die Parameter an SYS anhängt und per Interpreterfunktionen einliest).
Basic muss ich noch haben, aber nichts was mit Datasette zu hat. Wie sieht es mit dem Bereich von $A4 bis $AD aus? Kann ich die nutzen oder könnte "das Basic" da noch was hinpfuschen?
$ac/ad wird von SAVE genutzt, auch wenn man auf Disk speichert.
Du könntest normalerweise auch noch $f7-$fa nehmen.
Die Frage ist: Warum brauchst du denn so viele? In die Verlegenheit kam ich bislang nicht, da man die meisten ja nicht parallel benötigt bzw. mehrfach verwenden kann.
Und warum zwingend Zeropage-Adressen?
Du könntest normalerweise auch noch $f7-$fa nehmen.
Die Frage ist: Warum brauchst du denn so viele? In die Verlegenheit kam ich bislang nicht, da man die meisten ja nicht parallel benötigt bzw. mehrfach verwenden kann.
Und warum zwingend Zeropage-Adressen?
Fürs indirekte adressieren.
Allerdings habe ich auch dafür nie mehr als 4 Adressen in ner Funktion gebraucht.
Die Frage ist: Warum brauchst du denn so viele? In die Verlegenheit kam ich bislang nicht, da man die meisten ja nicht parallel benötigt bzw. mehrfach verwenden kann.
Und warum zwingend Zeropage-Adressen?
Vor allem sind ZP-Adressen schneller und kleiner und erlauben indirekte Adressierung.
Wenn man auf Kernal+Basic verzichten kann: die abschalten (incl. irq&co) und alle 254 Adressen selber nutzen.
In einem noch nicht veröffentlichten Projekt benötige ich zwei mal ein array von 32 pointern (also 128 bytes ingesamt), auf welche ich dann mit "lda (ptr1, x)" zugreife.
Vor allem sind ZP-Adressen schneller und kleiner und erlauben indirekte Adressierung.
Wenn man auf Kernal+Basic verzichten kann: die abschalten (incl. irq&co) und alle 254 Adressen selber nutzen.
In einem noch nicht veröffentlichten Projekt benötige ich zwei mal ein array von 32 pointern (also 128 bytes ingesamt), auf welche ich dann mit "lda (ptr1, x)" zugreife.
Wow, 32-Bit-pointer! Aber macht das Sinn? Wo soll das Array denn dann liegen wenn das obere word nicht null ist??
Wow, 32-Bit-pointer! Aber macht das Sinn? Wo soll das Array denn dann liegen wenn das obere word nicht null ist??
Nein, natürlich 16-bit pointer, aber 32 stück davon.
Huch ... ok dass is ja mal was.
Vor allem sind ZP-Adressen schneller und kleiner und erlauben indirekte Adressierung.
Mir war das schon klar, aber ich weiß ja nicht, was @LordRudi damit vor hat:
eigene Zeiger usw.
Was ist "usw."? Kann ja alles sein.
Manche Sachen gehen ja eben auch gar nicht mit ZP-Adressen. Oder die Werte müssen erst dahin gebracht werden, was auch wieder Code kostet. Oder die Speicherstellen werden eh so selten angesprochen, dass man sich das auch schenken kann und die Daten/Variablen lieber en bloc irgendwo zusammenhält (meine Einstellung). Was natürlich merkbar oft durchlaufen wird und wo es möglich ist, dann natürlich gerne in die ZP. Ein paar Sachen werde ich da auch noch hin verfrachten. Aber für 10 Takte vs. 10 Bytes z. B. macht es ja einfach wenig Sinn.
Die Sache ist doch ganz einfach:
Ausnahmen gibt's natürlich zuhauf, z.B. wenn keine Selbstmodifikation möglich ist (z.B. Code im ROM) oder wenn es auf jeden Zyklus ankommt (ZP-Zugriff ist langsamer).
(ZP-Zugriff ist langsamer)
Warum?
Warum?
Weil ein indirekt-indizierter Zugriff z.B. für LDA 5-6 Zyklen braucht, ein absolut indizierter aber 4-5 Zyklen. Da kann es sich lohnen, lieber mehrere Codestellen zu modifizieren.