Loop Optimierung

Es gibt 11 Antworten in diesem Thema, welches 2.564 mal aufgerufen wurde. Der letzte Beitrag (27. April 2020 um 14:20) ist von Mac Bacon.

  • 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
    drawCol:
                    ldx #39                             ; Zeile X
    -           
    
                    ldy SCREENRAM+40,x                  ; A = char an position x                           
                    lda colors,y                        ; A = Farbe die ins COLRAM muss
                    sta COLORRAM+40,x                   ; und A ins COLRAM and Pos Y
                    dex                                 ; Ende der Zeile?
                    bne -                               ; nein
                    rts

    Ist schonmal deutlich kürzer.

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

  • Ist jetzt ungetestet, aber so kann du einige tax tay und tya sparen:

    Ldx screenram,y

    Lda colors,x

    Sta colorram,y

  • 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.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • 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)

  • Ich habe im Code jetzt zweimal selfmod, einmal für ScreenRAM, einmal für ColorRAM.

    Bekomme ich die beiden noch verheiratet und kann ein paar Zeilen sparen?

  • 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 :)

  • Ich würde es vom Prinzip her bei sowas immer so machen wie RealWanderer: Eine Schleife 250x durchlaufen lassen, mit vier entsprechenden LDAs/STAs (Screen+0,Screen+250,Screen+500,Screen+750)...

  • Zitat

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

    Meine Güte, das ist ja sowas von in jeder Hinsicht besser.

    So einfach und effizient.

    Danke!

  • 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

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..