[ACME] lokaler Label in for-loop?

Es gibt 12 Antworten in diesem Thema, welches 1.645 mal aufgerufen wurde. Der letzte Beitrag (20. Juni 2014 um 10:11) ist von sauhund.

  • Moin,

    ich fange grade wieder an, mich in ASM und ACME einzuarbeiten, nach einem Jahrzehnt Abstinenz. Offenbar weiß ich nicht mehr allzu viel ^^.
    Ich wollte gerne in einer for-Schleife einen lokalen Label definieren:

    Code
    !for i, 0, 4 {.loop		lda screen+i*$100,xsta $0400+i*$100,xinxbne .loop}

    Es kommt die Fehlermeldung, Symbol already defined. Wie kann man dieses Problem lösen?

    Gruß
    Daniel

  • Mit anonymen Labels sollte das gehen:

    Code
    !for i, 0, 4 {
    -		
      lda screen+i*$100,x
      sta $0400+i*$100,x
      inx
      bne -
    }


    müsste klappen, obwohl es *so* ohnehin schlauer wäre:

    Code
    -
      !for i, 0, 4 {
        lda screen+i*$100,x
        sta $0400+i*$100,x
        }
      inx
      bne -


    verbraucht weniger Speicher & ist auch noch schneller ...

  • Ok, danke! Anonyme labels hatte ich probiert, ging aber nicht. Vielleicht hab ich mich vertippt. Aber die 2. Lösung ist natürlich noch besser, und geht auch, solange die sprungweite nicht überschritten wird.

  • ...im Augenblick kopiert der Code allerdings nicht vier, sondern fünf Pages. Ich nehme an, da soll eigentlich "!for i, 0, 3 {" stehen.

    Und nur um es mal erklärt zu haben: Die ursprüngliche Fehlermeldung kam, weil ".loop" in jedem Schleifendurchlauf einen anderen Wert zugewiesen bekam. Ein "!zone { }" innerhalb der Schleife hätte das Problem behoben, weil dann jedes ".loop" seinen eigenen Scope bekommen hätte. Aber die von spider-j vorgeschlagene Lösung ist natürlich besser.

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

  • Klar, soll nur von 0-3 laufen, nicht bis 4.
    Und nun klappt es auch, das Koala Logo darzustellen. Was man so alles vergisst :wink:

  • Und falls einem Spritepointer oder Prozessor Zyklen etwas bedeuten, hier noch ein Vorschlag :wink:

    Code
    ldx #$fa
    -
      !for i, 0, 3 {
        lda screen+(i*$fa)-1,x
        sta $0400+(i*$fa)-1,x
      }
      dex
      bne -


    Ich finde das eine schlechte Angewohnheit $0400-$07FF zu überschreiben, wenn man eigentlich nur $0400-$07E7 braucht.

  • spider-j, in sachen verschwendeten zyklen ist dein letztes beispiel aber schlechter als das "normale": denn es gibt extra zyklen wenn man mit lda abs,[xy] eine page boundary ueberschrietet.

    "normal":
    1 * ldx = 2
    1024 * lda abs,x (selbe seite) = 1024 * 4 = 4096
    1024 * sta abs,x = 1024 * 5 = 5120
    255 * bra loop (ausfuehren) = 255 * 3 = 765
    1 * bra loop (nicht) = 1 * 2 = 2
    total: 9985 zyklen

    "250er":
    1 * ldx = 2
    250 * lda $0400,x (selbe seite) = 250 * 4 = 1000
    6 * lda $04fa,x (selbe seite) = 6 * 4 = 24
    244 * lda $04fa,x (andere seite) = 244 * 5 = 1220
    12 * lda $05f4,x (selbe seite) = 12 * 4 = 48
    238 * lda $05f4,x (andere seite) = 238 * 5 = 1190
    18 * lda $06ee,x (selbe seite) = 18 * 4 = 72
    232 * lda $06ee,x (andere seite) = 232 * 5 = 1160
    1000 * sta abs,x = 1000* 5 = 5000
    249 * bra loop (ausfuehren) = 249 * 3 = 747
    1 * bra loop (nicht) = 1 * 2 = 2
    total:10465 = 5% langsamer

  • spider-j, in sachen verschwendeten zyklen ist dein letztes beispiel aber schlechter als das "normale": denn es gibt extra zyklen wenn man mit lda abs,[xy] eine page boundary ueberschrietet.


    Oh, recht haste. Bin von generell 5 wie beim STA auch ausgegangen...

  • Es gäbe da noch den Mittelweg mit 10217 Zyklen:

    Code
    ldx #0
    -
            !for i, 0, 2 {
                    lda screen + (i * $100), x
                    sta $0400 + (i * $100), x
            }
            lda screen + 1000 - 256, x
            sta $0400 + 1000 - 256, x
            inx
            bne -

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

  • ich habe nie verstanden, wie man sich für sowas profanes wie schleifen das hirn mit irgendwelchen CrossAss tags wie !for verrenken kann, statt es gleich in "echtem" assembler zu coden, das ist doch eher leichter zu begreifen als schwieriger, gut, mag in fällen wie CLRSCR nicht hübsch aussehen... naja, ich bin wohl ein spießer ^^

  • "!for" ist gedacht (und sinnvoll) für Speedcode, Sinustabellen und ähnlich große Strukturen. In diesem Fall (vier Wiederholungen von zwei Zeilen) würde ich es eigentlich auch nicht nehmen - aber es stand nun mal in der ursprünglichen Frage...

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

  • Grundsätzlich ist eine for-Schleife dafür gedacht, bestimmte Anweisungen, die sich in einer bestimmten Anzahl wiederholen, mit dieser Schleife zu kontrollieren. Insofern ist es auch für einen !for-Befehl angemessen, nur 2 Wiederholungen zu haben. Ob es Arbeit spart, ist eine andere Frage. :wink:

    Ich hatte zuvor die 2 Zeilen auch 4x geschrieben (also den Code "ausgeschrieben"), aber rein aus didaktischen Zwecken (siehe mein 1. post, ich versuche mich wieder einzuarbeiten) versuche ich, das, was ich durch den Assembler irgendwie kürzen oder in Kontrollstrukturen, macros etc. packen kann, auch zu machen.

    Grade bei Assembler finde ich es für mich "passender", alles so zu schreiben, wie es ist (also quasi Monitor-like). Das sieht mehr nach ASM-coding aus, hehe. Aber man muss sich ja nicht allem Neuen gegenüber verschließen... :tong:

  • so bald man da was mit scrolling und zeilenweisem kopieren hat will man es auch wirklich nicht mehr händisch ausschreiben :)