Hallo Besucher, der Thread wurde 1,2k mal aufgerufen und enthält 10 Antworten

letzter Beitrag von faddie am

Speicherbereiche in Schleifen kopieren

  • Huhu,
    ich hab schon wieder was, wobei ich gar nicht weiß, ob das überhaupt geht.


    Ich habe einen Speicherbereich, wo ich für alle Mitspieler die Attribute ablege. Aktuell dachte ich an 128 Byte pro Spieler, wobei ich aktuell 76 Byte auch wirklich benutze.
    Das Spiel ist rundenbasiert und ich wollte für jede Runde die Werte aus obigen Speicherbereich in einen temp. Bereich kopieren. Also ungefähr sowas:


    curentPlayerMoney:
    .dword $0000,$0000 // Vermögen 4 Byte
    currentPlayerDebtFlag:
    .byte 00 // Schulden in bit 7 1 Byte
    currentPlayerEstate: // Anteile der Gegend 1 Byte
    .byte 00
    // Besitz 14 Byte
    currentPlayerSlotmachine:
    .word $0000
    etc...



    Und dann habe ich noch player1 mit 128 byte Platzhalter, player2, player3 usw.


    Jetzt dachte ich mir das so: Ich lade pro Runde die Spielernummer ins X-Register und dann rufe ich eine Kopierroutine auf, die dann alles in den temp Bereich kopiert. Am Ende der Runde wird dann alles zurückgeschrieben.
    Aber... geht das auch?


    Ich dachte irgendwie an Tabellen, ungefähr so:


    // Adressen der Spielerarrays zum Durchzählen in der Schleife
    playerAddressTbl:
    .word player1, player2, player3, player4, player5, player6, player7, player8


    // Attribut-Offsets der einzelnen Werte
    playerAttrTbl:
    .byte 4,1,1,14,10,10,1,1,1,1,32



    Und jetzt kommt der Part, wo ich dann gar nicht mehr durchsteige :drunk:
    Der Algoritmus wäre:
    Lade den Größe des Speicherbereichs aus playerAttrTbl ins Y-Register: ldy playerAttrTbl, X
    Schleife über Y
    - Hole die Adresse von PlayerX
    - lade das Byte + Y in den Akku
    - speichere das Byte an die Zieladresse



    Könnte man das so machen? Und wenn ja, kann ich die Bytes 1:1 kopieren oder muss ich die LittleEndian-mäßig vertauschen. Geht das mit den Tabellen überhaupt oder muss ich die ZP benutzen?


    Es wäre schön, wenn jemand Licht in mein ewiges Dunkel bringen könnte :D

  • ...für jedes Attribut eine eigene Tabelle anzulegen und diese mit X=Spielernummer zu indizieren.

    Ich weiß nicht, hängt wohl stark vom Fall ab.
    Immerhin brauchst Du so ein Index-Register mit der Spieler-Nummer, das Dir dann für andere Zwecke fehlt.


    Wo es hier Rundenbasiert ist würde ich es machen, wie Faddie es beschrieben hat.
    Also einen temp-Bereich (besser "Aktuelle Attribute") und einen Spieler-Bereich, dazu Koperischleifgen "Lade aus Spieler X" und "Speichere in Spieler X"
    Allerdings verstehe ich das Kopierproblem nicht.

  • Allerdings verstehe ich das Kopierproblem nicht.

    jepp wuerde das auch wie Hoogo machen, immerhin weist du ja das du 128 bytes laden/speichern moechtest dann is das
    hin und her kopieren ja eher einfach zu bewerkstelligen.


    Mein Problem ist, dass ich sowas noch nie gemacht habe. Klar, einen 128 Byte Block kopieren sollte ich hinbekommen. Hab schon bei Codebase64 ein Beispiel gefunden.


    Was mir aber unklar ist:
    bisher habe ich bei den Spielernamen einfach 32 Bytes kopiert und dafür dank euch das hier gemacht
    txa
    5x asl
    tay
    jsr print_text_offset


    Jetzt wollte ich eigentlich alle Werte einzeln kopieren und dafür eine Tabelle nutzen, weil die Attribute alle unterschiedlich lang sind.


    Bloß wie ich das anstelle, und ob das überhaupt geht - das ist der Kern meiner Unwissenheit :)


    Deshalb finde ich Lösung von @Mac Bacon eigentlich ganz einfach. Nur der Lerneffekt ist 'übersichtlich' ;)

  • Jetzt wollte ich eigentlich alle Werte einzeln kopieren und dafür eine Tabelle nutzen, weil die Attribute alle unterschiedlich lang sind.

    Willst Du das auch nur wegen des Lerneffekts so einzeln machen?


    Ich gehe mal davon aus, dass Du NUR die Daten des aktuellen Spielers für eine Runde brauchst.
    Dann mach Dir für Deinen Tmp-Bereich ein schönes Speicherlayout, so dass alle Attribute des Spielers schön hintereinanderliegen.
    Kopieren kannst Du dann alle zusammen wie einen dummen Speicherblock, völlig unabhängig vom Inhalt.


    Spannender wird es, wenn Du während der Runde auch Daten der anderen Spieler lesen musst. Dann wäre das Layout von McBacon u.U. wieder besser, wobei das wieder nicht so schön für Strings ist.

  • Es funzt ja tatsächlich mal was ^^


    Hab das Bacon-Layout umgesetzt und ich kann tatsächlich auf die Werte zugreifen und sie anzeigen. :Peace
    Die einzige Kröte, die es zu schlucken gilt: ich muss für jeden Wert immer mit vielen ASLs den Offset für den aktuellen Wert des Spielers berechnen. Ob das wohl noch eleganter ginge? :gruebel
    So sieht es derzeit aus: bisher wird der Name und das Vermögen des aktuellen Spielers angezeigt. Eigentlich bin ich soweit auch ganz zufrieden, aber Luft nach oben ist ja immer.


  • Wenn man einfach nur Byte-Werte hat, dann entfällt das Gerolle.
    Statt Playermoney (32Bit) könntest Du Playermoney1...money4 machen, allerdings passt dann das Makro nicht mehr so schön.
    Und den ganzen String in dieser Form abzulegen wird dann noch hässlicher.


    Alternative, die mir grad einfällt:
    -currentPlayerNumber
    -currentPlayerNumber_2
    -currentPlayerNumber_4
    -currentPlayerNumber_8
    Beim Spielerwechsel berechnest Du aus der aktuellen Nummer gleich die nötigen Vielfachen und kannst die dann bei Bedarf gleich mit Ldy holen.