DjayBee hat geschrieben: ↑24.03.2024 00:08
Code: Alles auswählen
.proc clearmem
lda #0
TAY
loop
sta (addr),y
iny
BNE loop
rts
.endp
Ja, "tay" lädt ja den Akku A in das Y-Register. Da A auf 00 eingestellt ist ist das gleichbedeutend mit "ldy #0" in diesem Kontext. Will man den Speicher wirklich immer auf 00 einstellen ist das ok, will man ihn mit einem beliebigen Wert initialisieren, z.B. auch mal $FF, dann müsste man es getrennt machen.
Ist das Assembler-Makro ".proc" und ".endp" nur guter Stil, oder hat das auch eine echte Funktion? Die Angabe der Schleifenposition "loop" ist ja immer etwas kritisch, weil man die ja oft braucht. Sorgt das Klammern in proc/endp vielleicht dafür das diese Sprungmarke nur innerhalb dieser Subroutine gilt und nicht global für den Rest des Codes?
Damit kann ich ja auch nur 256 Bytes in auf einer Page-Boundary leeren. Wenn ich, wie z.B. beim PM 2kb Speicher initialisieren will, müsste ich die 8mal aufrufen. Man könnte nun eine Spezialroutine machen die sowas tut:
Code: Alles auswählen
sta (addr),y
sta (addr+$100),y
sta (addr+$200),y
sta (addr+$300),y
sta (addr+$400),y
sta (addr+$500),y
sta (addr+$600),y
sta (addr+$700),y
und somit gleich acht 256-Byte Blöcke auf einmal leert. Das wäre dann eine "clearmem2kb" oder so.
Macht das Sinn? Oder baut man eine universelle Routine die dann andere Parameter benötigt?
Dazu müsste man neben der Basis-Adresse auch die Anzahl der Bytes in einem WORD irgendwo im Speicher ablegen. Man könnte ja anstelle dem Register auch die Speicherstelle mit "inc/dec" zählen lassen. Nur für den Überlauf muss man wohl selbst sorgen, da inc/dec auch nur auf ein Byte wirken.
Da man damit ohnehin nur Speicherbereiche initialisieren kann die auf eine Page-Boundary liegen, würde es doch auch reichen als Einsprung-Parameter neben der Länge in Bytes die Page anzugeben? Ich merke schon das es einen großen Unterschied macht ob man eine Universalroutine bauen will oder eine hochspezialisierte. Auch später im Laufzeitverhalten. Also sollte man sich evtl. sogar zwei Routinen bauen:
Variante a) Eine die an einer beliebigen Stelle im Arbeitsspeicher eine beliebige Anzahl Bytes auf einen beliebigen Wert einstellen kann.
Variante b) Eine die eine oder mehrere Pages an einer gegebenen Page auf einen bestimmten Wert einstellt. Hier würde ich nichtmal einen Byte-Counter angeben, sondern es wird die ganze Page initialisiert.
So hätte man etwas superflexibles, was halt länger läuft und für die Holzhammer-Dinger eine hochperformante, die aber nur grob arbeitet.