Hello, Guest the thread was viewed496 times and contains 11 replies

last post from Mike at the

Assembler Fragen

  • Ich habe vorkuzem angefangen mit Assembler zu programmieren und habe folgendes Programm programmiert um den Bildschirm zu Leeren:

    Ich weiß dass es einfachere methoden gibt den Bildschirm zu Leeren aber ich wollte ein Programm schreiben

    dass im Speicheradressenbereich: 1024 bis 2023 die Zahl 96 reinschreibt.

    Ich habe das Problem dass mein Programm reisig ist weil es 999 Speicheradressen sind aber die Register nur höchsten 255 halten können.

    Wie kann ich das Programm verkleinern?

    Ich habe mich auch gefragt wie ich die Zahl 96 in die Speicheradressen reinkriege ohne es vorher in ein Register zu stecken.

  • Wie kann ich das Programm verkleinern?

    Du legst alle Schleifen zusammen zu einer einzigen. Dafür brauchst du auch keine Subroutine.



    Ich habe mich auch gefragt wie ich die Zahl 96 in die Speicheradressen reinkriege ohne es vorher in ein Register zu stecken.

    Du speicherst eine Datei mit 1000 Bytes (also 1000 mal die 96) und lädst das dann nach $0400. :D



    Edit: daybyter war schneller ...

  • ... ich wollte ein Programm schreiben

    dass im Speicheradressenbereich: 1024 bis 2023 die Zahl 96 reinschreibt.

    ...

    Die vorherige Lösung/en beschreiben leider auch den Speicherbereich bis 2047 und somit u.a. auch die Spritepointer.
    Ganz klassisch würde ich es so machen:

    Code
    1.         ldx #0
    2.         lda #96
    3. L0: sta $400,x
    4.         sta $500,x
    5.         sta $600,x
    6.         sta $6e8,x
    7.         inx
    8.         bne L0
    9.         rts

    oder so

    Code
    1.        ldx #$fa
    2.        lda #96
    3. L1:    sta $3ff,x
    4.        sta $4f9,x
    5.        sta $5f3,x
    6.        sta $6ed,x
    7.        dex
    8.        bne L1
    9.        rts
    Quote

    ...

    Ich habe mich auch gefragt wie ich die Zahl 96 in die Speicheradressen reinkriege ohne es vorher in ein Register zu stecken.

    ...

    Angenommen der zu beschreibende Speicherbereich ist undefiniert (unbekannte Werte) "eigentlich" gar nicht (d.h. möglich aber nur sehr unpraktikabel).

  • Ich habe mich auch gefragt wie ich die Zahl 96 in die Speicheradressen reinkriege ohne es vorher in ein Register zu stecken.

    Auf den Intel-CPUs gibt es Befehle, die direkt eine Konstante in den Speicher wegschreiben.


    Beim 65xx wirst Du aber damit 'leben' müssen, daß de facto alle Daten irgendwie durch den Akkumulator gehen. Der Akkumulator und die beiden Index-Register dienen nur als extrem kurzlebige Schmierzettel und nicht dazu, über längere Zeit so etwas wie Variablenwerte zu halten. Für den letzteren Anwendungsfall wird der normale (RAM-)Speicher benutzt.


    Daß die genannten Register nur Werte von 0 bis 255 halten können ist eben dem geschuldet, daß es sich beim 65xx um eine 8-Bit-CPU handelt. Deswegen ist trotzdem bei (Adreß-)Berechnungen nicht bei 255 Schluß, man muß es nur mit den vorhandenen Befehlen geeignet ausdrücken können. Diese Lösungen sind allerdings immer spezifisch zum 65xx und haben keine naheliegende Begründung aus einer Hochsprache, z.B. beim 8080 bzw. Z80 sehen die Implementierungen auch anders aus, obwohl es sich auch beim 8080 bzw. Z80 ebenfalls um 8-Bit-CPUs handelt.


    Insofern ist die von 1570 beschriebene Version recht typisch für den 65xx: ein Index-Register (hier X) wird über einen Bereich (hier 1..250) verändert, der 1000 glatt teilt und in 8 Bit 'reinpaßt'. Der Schleifenkörper ist viermal 'ausgerollt' um den Zeitbedarf der Zählanweisungen soweit wie möglich zu 'drücken'. Und es wird rückwärts gezählt um einen Vergleichsbefehl einzusparen: viele Befehle setzen die Prozessor-Status-Flag in Abhängigkeit vom gerade berechneten Wert; daß eine 0 berechnet wurde, setzt beim DEX-Befehl das Zero-Flag und das wird mit BNE abgeprüft (bei X<>0 wird die Schleife fortgesetzt).


    Die Schleife lädt also den Akku mit 96 und schreibt den Akkumulator dann an die (dezimalen) Adressen 1273, 1523, 1773, 2023, 1272, 1522, 1772, 2022, 1271, ..., 1775, 1024, 1274, 1524, 1774. Im Endergebnis steht im kompletten Bereich 1024..2023 der Wert 96. In welcher Reihenfolge der Wert dorthin gelangt ist, ist ja meistens egal.


    In einer Hochsprache würde man das sicher nicht so anschreiben, aber das ist ja auch keine Hochsprache hier. :D