Beiträge von BlackJack im Thema „Real-Zahlen und Funktionen im cc65 nutzen...zur Umsetzung“

    Wenn man `byteAddr` und `bitmask` als ``register`` deklariert:

    Code
    000098r 1               ;
    000098r 1               ; *byteAddr &= bitmask;
    000098r 1               ;
    000098r 1  A0 00        L001C:	ldy     #$00
    00009Ar 1  B1 rr        	lda     (regbank+4),y
    00009Cr 1  85 rr        	sta     ptr1
    00009Er 1  A2 00        	ldx     #$00
    0000A0r 1  A5 rr        	lda     regbank+3
    0000A2r 1  25 rr        	and     ptr1
    0000A4r 1  91 rr        	sta     (regbank+4),y


    Allderdings ist `register` kein Allheilmittel. Es stehen nicht unbegrenzt "Register" in der Zeropage zur Verfügung und es gibt den Mehraufwand die alten "Register"-Inhalte am Anfang der Funktion auf den Softwarestack zu sichern und am Ende der Funktion wieder herzustellen. Man sollte also nicht blindlings alles als ``register`` deklarieren, sondern auch darauf achten ob man dadurch wirklich etwas gewinnt und mit welchen Variablen der Gewinn am grössten ist.

    daybyter: Öhm, Du machst Dir ständig Gedanken was wohl für den 6510 zu schnellerem Code übersetzt wird, lässt den Compiler aber anscheinend nichts optimieren!? So sieht das mit Optimierungen aus:


    Und so wenn man dem Compiler sagt er soll lokale Variablen statisch machen:


    Dann ist die Funktion nicht „reentrant“, aber man hat für die lokalen Variablen (nicht die Argumente!) die Indirektion über den Softwarestack nicht mehr. (Man sieht das der Optimierer trotzdem noch Code erzeugt für den man einen menschlichen Programmierer hauen würde. :-))

    Beim optimierten Code musst Du auch nicht mehr so viele Unterroutinen nachschlagen. Die würde ich nicht bei Google suchen, sondern in den Quelltexten vom cc65.

    daybyter: Ich ging davon aus, dass eine Linien-Zeichnen-Routine Bits setzt und man das mit den Farben über das Video-RAM und nicht über das Bitmuster löst.

    Bezüglich `y` oder Endadresse berechnen müsstest Du halt einfach schauen was der Compiler an Code generiert. Und vielleicht noch mit der „static locals“-Einstellung und dem ``register``-Schlüsselwort experimentieren. Wobei es da dann eventuell auch einfacher sein kann es gleich in Assembler zu implementieren.

    Ein Problem dürfte sein, das der Compiler Floats für das Zielformat erstellen können muss. Es sei denn Du lässt ihn da Zeichenketten schreiben, die erst zur Laufzeit umgewandelt werden. Und wenn er optimieren können soll, muss er mit der gleichen (Un)Genauigkeit rechnen wie die Routinen auf dem Zielsystem. Das heisst wenn man Unterstützung für Gleitpunktzahlen implementieren möchte, muss man das sowohl für den 6510 als auch in C für den Compiler machen.