Hallo Besucher, der Thread wurde 1,5k mal aufgerufen und enthält 13 Antworten

letzter Beitrag von faddie am

Zugriff auf Speicherbereiche mit berechtem Offset

  • Moin,
    ich stehe mal wieder auf dem Schlauch :)


    Ich möchte eigentlich nur 1-4 Spielern ermöglichen, ihre Namen einzugeben und das dann entsprechend im Speicher abzulegen.


    Momentan scheitere ich daran, den Namen überhaupt abzulegen. Ich habe 32 Bytes für einen Namen vorgesehen und der Speicherbereich beginnt bei 0e08. Bei 4 Spielern wären das also die Bereiche:
    0e08 + 0*32
    0e08 + 1*32
    0e08 + 2*32
    0e08 + 3*32



    Aber ich habe keine Ahnung, wie ich die Zieladresse richtig berechne, bzw. an LDA übergabe.


    Namen eingeben funzt, den Offset berechnen und im Y-Register ablegen (zB.2*32) geht auch. Das LDA nach dem !end Label geht aber nicht, sondern wird einen Syntax Error. Mittlerweile macht sich große Verwirrung breit ;(




    Wie könnte man das richtig machen?



  • Syntax-Error, weil Immediate-Adressierung (#) mit Indirect-Indexed-Y vermischt.


    Vorschlag, nebst kompakterem Multiplizieren mit 32, dann die Kopierschleife ausprogrammiert (die sich hinter Move_input_to_TextPtr verbergen könnte) ... ;)

  • Super, das funzt wunderbar!


    In meiner großen Verwirrung wollte ich unbedingt den Offset außerhalb der Copyloop haben. Meinen Grad der Verwirrung kann man ja schon im Betreff ablesen, dass ich auch nicht mehr fehlerfrei schreiben konnte :)
    Der Trick mit ASL ist auch prima!


    Es ist mir wirklich ein Rätsel, warum ich immer bei ASM so einen Knoten im Kopf bekomme. Vielen Dank für die Hilfe!

  • Fein, fein. :)


    Nur ein Nachtrag zur LSR-Variante statt den ASLs: Da hier das Carry-Flag beteiligt ist, müsste man es vorher explizit löschen. Also
    CLC
    LSR
    LSR
    LSR
    LSR


    Will damit sagen, gegen über 5x ASL spart man sich nichts (außer man weiß, dass beim Eintritt in diesen Teil das C-Flag 0 ist).
    Also erst beim Multiplizieren mit 64 oder 128 spart man sich wirklich was ... es sei denn, wenn man das LSR/ASL in einer Speicherstelle machen muss, dann ist ja das CLC gegen ASL zp etc. immer flotter. ;)

  • Stimmt, das war jetzt doch nicht durchgehend überlegt. Das LSR ist ja überhaupt falsch (damit vernichtet man ja die Bits 0 bis 2 statt sie in die Bit-Positionen 5 bis 7 zu bekommen ) ...


    CLC
    ROR
    ROR
    ROR
    ROR


    Setzt natürlich voraus, dass Ausgangswert wirklich nur im Bereich von 0 bis 7 ist.
    Oder hab ich mich jetzt wieder "verdacht"?

  • Mal so als Gedanke: Wenn eh pro Name 32 Bytes reserviert sind, dann sind doch auch die Speicheradressen fix. Warum soll ich die berechnen?


    Name_1 = $0e08
    Name_2 = Name_1 + 32
    Name_3 = Name_2 + 32
    Name_4 = Name_3 + 32


    Wenn der Name kürzer ist/sein kann einfach ein Byte als Endflag hinten ransetzen, am besten $00. Beim Auslesen auf BEQ testen und ggfs. zum nächsten Namen springen...

  • Mal so als Gedanke: Wenn eh pro Name 32 Bytes reserviert sind, dann sind doch auch die Speicheradressen fix. Warum soll ich die berechnen?

    Weil die Routinen über die Spielernummer faktorisiert sind?
    Ich zumindest finde, dass man auch in der Assembler-Programmierung eine gewisse Eleganz (im Design, Änderungsfreundlichkeit) beibehalten kann, ohne gleich alles fixen Adressen und selbstmodizierenden Codes zu opfern. ;)

  • Und das ist elegant? ;)


    Warum nicht eine Tabelle mit den Low (und Hi)-Bytes der Adressen anlegen, das sind vier (8) fixe Bytes. Dann y = gewünschter Player (0-3) und Adresse aus der Tabelle lesen - fertig.


    ldy #0 ; Name 1
    lda Table_Address,y ; get Address of Name
    sta Temp
    ...


    Wahrscheinlich nicht nur schneller, sonder auch kürzer und übersichtlicher - sprich: eleganter :)