Beiträge von atomcode im Thema „Parameterübergabe über die Zeropage“

    Die (C64-)Stackfunktionen nutze ich hauptsächlich zum Retten bzw. Zwischenspeichern von Registerinhalten. Vorteil dabei: Braucht gegenüber ZP-Befehlen nur den halben Speicherplatz für Befehle und quasi keinen Platz für die Daten. Parameterübergabe kann man machen, ist aber mit Vorsicht zu genießen.

    ZP-Register haben gegenüber dem Stack den Vorteil, dass sie zu jedem Zeitpunkt gelesen werden können, also auch bedingt; dass das Laden ein TZ schneller ist; dass sie beliebig oft gelesen werden können und nicht nur einmal; dass sie direkt in X und Y geladen werden können und nicht nur direkt in A; und auch die Indizierungsarten sind nützlich, zumal es für die ZP die Indexregister-Befehle auch x- und y-indiziert gibt, nicht aber für 16Bit-Adressen.

    Zu der Sache mit den Modulen und veränderten ROMs verweise ich noch mal auf die PLA, die es erlaubt, alles auszublenden und das ganze RAM zu nutzen, mit oder ohne IO-Layer.

    Bitte melde dich an, um diesen Link zu sehen.

    Man kann ein Programm auch mit aktiviertem Modul einladen; das Programm muss dann nur selbst dafür sorgen, dass es die Kontrolle übernimmt und sich nicht durch das Modul stören lässt. Wenn man z.B. die Multi-Disk-Demo "Uncensored" mit aktivierter AR6 startet, dann wird ein 1,5 kB großer Loader mit AR6-Fastload geladen, und nach dessen Start hat das AR6-Fastload nichts mehr zu melden.

    Was ich aber nervig finde, ist, dass man ein Freezer-Modul nicht mehr verwenden kann, z.B. den Monitor davon, wenn man ein anderes Modul eingelegt hat. Aber ok, hat jetzt nichts mit dem Thema ZP zu tun.

    Wofür sollte man denn ein Modul während eines Spieles brauchen? Freezen geht eigtl. immer. Ansonsten fällt mir nur Schnellladen ein. Aber genau das ist oft gar nicht gewollt, weil man dann z.B. Übergangsbilder beim Laden nicht zu sehen bekommt, wenn der VIC abgeschaltet wird. Manche Spiele lassen auch die Musik laufen beim Laden, zeigen Animationen etc., z.B. Hawkeye. Es wird aber kein Demoprogrammierer oder Entwickler eines größeren Spieles auf die Zeropage, die für die CPU und die Programmierung essenziell ist, verzichten wollen, nur damit alle möglichen Module aktiv bleiben dürfen.

    Was kann abgeschaltet werden?

    das Modul

    Es gibt Programme, die laufen dann einfach nicht.

    Das ist aber kein Beleg dafür, dass das so sein muss. Meine ursprgl. Aussage war, dass man mit Assembler den C64 übernehmen und dann auch die ZP frei verwenden kann.

    Wer ein nicht umschaltbares alternatives Kernel fährt, ist im Prinzip selbst schuld, wenn deswegen ein Programm nicht läuft. Die meisten Programme setzen die original verbauten ROMs voraus. Selbst die Sprungvektoren, die ursprünglich für Kompatibilität sorgen sollten, werden von den meisten schon längst nicht mehr genutzt, weil man davon ausging, dass sich an den originalen ROMS nichts mehr ändert. Ob das i.O. ist, ist eine andere Frage, aber es ist so. Allerdings spielt das bzgl. meiner Aussage eigtl. auch keine Rolle. Denn ich sagte ja, man kann den C64 übernehmen, und das heißt, dass mich auch die verbauten ROMs nicht interessieren müssen. Die werden dann nämlich auch ausgeblendet. CPU, SID, VIC und CIAs dürfen als unveränderlich betrachtet werden; ansonsten ist es kein C64/C128.

    Es gibt ein paar Addressen, bei denen "unbenutzt" dabei steht.

    Dieses "unbenutzt" bezieht sich aber auch nur auf BASIC und Kernal, nicht auf etwaige eingesteckte aktive Module. Dann dürfte man diese Register genauso wenig benutzen wie alle anderen. Aber so ist es eben nicht; vielmehr kann man alles abschalten und die ZP komplett leerfegen, von den ersten beiden Adressen abgesehen. Frag mal die Demoprogrammierer; da wird nichts dem Zufall überlassen.

    Wenn da jemand ein Steckmodul (Basic-Erweiterung, Fastloader, etc.) drin hat, weißt Du halt nicht mehr unbedingt, was Du da benutzen kannst.

    Das kann abgeschaltet werden.

    Ich habe schon öfters Programme gehabt, wo ich mein Steckmodul mit Schnelllader raus ziehen und langsam laden musste.

    Dann ist es aber schlecht programmiert. Entweder, man nutzt bewusst das vorhandene Schnelllademodul, oder man baut einen eigenen Schnelllader ein. Wenn denn überhaupt nachgeladen werden muss. Davon ging ich nicht unbedingt aus. Wenn man eine Einzeldatei, meinetwegen 200 Blocks, mit Speeder einlädt, dann kann man danach im C64 machen, was man will. Auch ergeben sich keine Probleme, wenn man selbst für Modul programmiert.

    Es gibt unzählige Module. Wenn man die alle als aktive Module berücksichtigen wollte, dürfte man gar nichts in der Zeropage nutzen, auch nicht die "ab Werk" dauerhaft freien Register, die Claus oben schon aufzählte. Dann gäbe es die großen Spiele und sämtlichen Demos erst gar nicht. Man hat sich m.E. eigentlich darauf geeinigt, einen originalen C64 voraussetzen zu dürfen. Viele Puristen fordern dies sogar als Grundlage.

    Das Schöne an Maschinensprache ist: Die Kiste gehört komplett Dir - wenn Du es willst. D.h., man kann grundsätzlich alle Arbeitsspeicheradressen nach Belieben benutzen, außer die, die hardwareseitig schon in irgendeiner Weise Verwendung finden, und selbst von denen lassen sich viele noch auf andere Weise nutzen, nämlich vom Stack. Die CPU hat ja extra Befehle bzw. Indizierungsarten zur Benutzung der Zeropage vorgesehen, und da diese effizient sind, ist es ratsam, sie ausgiebig zu verwenden.

    Wenn man BASIC und Maschinensprache kombinieren will, ist es anders. Dann hängt es davon ab, welche ROM-Routinen überhaupt zum Einsatz kommen. Das fängt schon mal beim Service-Interrupt an. Pauschal kann man also nicht sagen, welche Zeropage-Adressen bei Benutzung des BASIC frei oder sicher sind. Viele Adressen kann man aber temporär nutzen. Die werden erst dann wieder überschrieben, wenn eine entsprechende BASIC-Routine zum Einsatz kommt, die ebenfalls diese Adressen verwendet. So kann man z.B. in der Regel die Fließkomma-Register problemlos vorübergehend verwenden, werden aber durch den Gebrauch von BASIC-Berechnungen wieder überschrieben. Wenn man nur danach gehen würde, welche Register tatsächlich dauerhaft von BASIC unberührt bleiben, dann ist die Auswahl sehr gering und im C64-Wiki zur Zeropage dokumentiert.