Hello, Guest the thread was called477 times and contains 11 replays

last post from Mac Bacon at the

Loop Optimierung

  • Folgende Situation:


    Ich will den Character für jede Position auf dem Screen auslesen.

    Dann will ich in einer Tabelle "colors" an der Position, die dem Wert des Chars entspricht, eine Farbe holen.

    Diese Farbe soll dann im Color RAM an der Stelle dieses Chars gesetzt werden.


    Beispiel: Jedes A wird rot, jedes B wird grün, jedes C gelb usw.


    Mein Vorgehen:


    1. In Schleife Char aus Screen RAM holen

    2. Den Wert des Chars als Offset für die Color Tabelle nehmen

    3. Wert aus Color Tabelle holen

    4. Wert aus Color Tabelle ins Color RAM speichern


    Hier mein Code, der für eine Zeile funktioniert:



    Zwei Probleme:

    1. Es funktioniert nur für eine Zeile.

    2. Es erscheint mir wahnsinnig umständlich


    Für jede Hilfe bin ich dankbar.

    Ich bin schon wieder mächtig eingerostet beim Assembler coden.

    Vielen Dank.

  • Puh, Gott sei Dank hat noch keiner geantwortet, also mache ich das mal haha


    Code
    1. drawCol:
    2. ldx #39 ; Zeile X
    3. -
    4. ldy SCREENRAM+40,x ; A = char an position x
    5. lda colors,y ; A = Farbe die ins COLRAM muss
    6. sta COLORRAM+40,x ; und A ins COLRAM and Pos Y
    7. dex ; Ende der Zeile?
    8. bne - ; nein
    9. rts

    Ist schonmal deutlich kürzer.

    Jetzt das ganze noch für alle 25 Zeilen...

  • Hallo awsm,

    probier' mal dies:


    Gruß,


    Neptun

  • EDIT: Viel zu langsam...


    Es gibt "LDX 16bit,Y" und "LDY 16bit,X, damit kann man evtl. ein TAX o.ä. einsparen. Aber bevor Du daran herumoptimierst, solltest Du klären, wie Du das Programm auf den ganzen Bildschirm erweitern willst: Bei 1000 Zeichen reicht einfache X/Y-Indizierung nicht mehr, da muss man entweder indirekte ZP-Adressierung nehmen oder Selbstmodifikationen. Und wenn es auf (ZP),Y hinausläuft, ist man an dieser Stelle auf die Verwendung von Y festgenagelt.

    An den Stellen, wo man die freie Wahl zwischen X und Y hat, sollte man sich daher nicht von vorn herein für eins der Register entscheiden, sondern das nehmen, was am Ende übrig bleibt (in diesem Fall also X, da Y bereits gebraucht wird).

    Geschachtelte Schleifen optimiert man aus diesem Grund "von innen nach außen", dann lösen sich diese "Werte zwischen Registern hin- und herschieben"-Knoten oft von selbst.

  • da muss man entweder indirekte ZP-Adressierung nehmen oder Selbstmodifikationen.

    Es müsste doch auch ohne ZP-Adressierung und ohne Selbstmodifikation gehen. Dann braucht man eben 4 x die notwendigen ldx abs,y , lda abs,x, sta abs,y mit einer Y-Schleife die 250 Durchläufe hat. Das sollte zudem auch schneller sein als ZP Indirekt Y, oder?

  • Hier noch der aktuelle Stand, der nun den ganzen Bildschirm füllt (lese Eure sehr guten Kommentare erst im Anschluß gerade)


    • Helpful

    Wieder ungetestet (da momentan nicht daheim), aber sollte das nicht so für den ganzen Bildschirm gehen?


    EDIT: Code nochmal formatiert und getestet. Läuft :)

  • da muss man entweder indirekte ZP-Adressierung nehmen oder Selbstmodifikationen.

    Es müsste doch auch ohne ZP-Adressierung und ohne Selbstmodifikation gehen. Dann braucht man eben 4 x die notwendigen ldx abs,y , lda abs,x, sta abs,y mit einer Y-Schleife die 250 Durchläufe hat. Das sollte zudem auch schneller sein als ZP Indirekt Y, oder?

    Ja, das geht natürlich auch... :whistling:


    Jetzt frage ich mich, warum ich diese Möglichkeit nicht mit aufgezählt habe. Bei "Bildschirm mit Zeichen füllen" hätte ich sie selber benutzt (4 x "STA"), bei "Bildschirm kopieren" auch noch (4 x "LDA+STA").

    Aber in diesem Fall schien mir der Code wohl unterbewusst zu lang zu sein (4 x "LDY+LDA+STA"), um das teilweise Ausrollen der Schleife vor mir selbst verantworten zu können. :D