Ich programmiere schon seit 40 Jahren Microcontroller und es gab noch nie eine Notwendigkeit für selbstmodifizierenden Code.
Allein wie oft ich mit BIT / JMP gearbeitet hab... ![]()
Ich programmiere schon seit 40 Jahren Microcontroller und es gab noch nie eine Notwendigkeit für selbstmodifizierenden Code.
Allein wie oft ich mit BIT / JMP gearbeitet hab... ![]()
Zwei Tipps:
Zum einen kannst du das Kopieren vom Colorram in die erste Schleife integrieren (und das gleiche y nutzen).
Zum anderen würde ich Selfmod immer ein eigenes Label gönnen. Also direkt vor dem zu ändernden Befehl ein Label schreiben. So verhinderst du Fehler, wenn du später noch Befehle einfügst und dann dein petsciiloop+4 plötzlich was falsches erhöht.
Beim letzten Durchlauf musst du dich fragen, wie wichtig dir eingesparte 24 Bytes sind. Die Petscii und Colorram Daten würde ich eh als 1kb Blöcke ablegen, ist aufgeräumter. Wenn du statt Indirekt. Adress. komplett auf Selfmod gehst könntest du y auch einfach viermal nur von 249/250 an runterzählen lassen, was genau 1000 ergibt.
Bitte melde dich an, um diesen Link zu sehen.
Mal grundsätzlich zur indirekten Addressierung:
Du schreibst in zwei aufeinanderfolgende Zeropage-Adressen Lo,dann Hi deiner eigenlichen "Zieladresse". Also wenn du Daten von $2000 lesen willst schreibst du in $80 eine $00, in $81 dann $20.
Mit lda ($80),y (und es muss hier Y benutzt werden!!), liest er nun den Wert aus genau der Adresse, die du in $80 und $81 abgelegt hast PLUS y. Wenn y = 0 ist liest du also den Wert aus genau $2000. Ist y=1 liest du den Wert aus $2001.
Jetzt kannst du in einer Schleife y durchlaufen lassen und die entsprechenden Daten lesen. Allerdings gibt es noch ein Problem: y kann höchstens 255 sein, also könntest du nur die Daten von $2000 bis $20ff lesen.
Deshalb kannst du nachdem y einmal durchlaufen wurde einfach das Hi (hier abgelegt in der Zeropage $81) um einen erhöhen und dann von neuem 256 Werte lesen - nämlich mit einem erneuten Durchlauf der Schleife (diesmal für die "neue" Adresse $2100).
Also ungefähr so:
ldy #0
Loop
lda ($80),y
dey
bne Loop
inc $81
; jetzt ein compare, damit er nicht endlos erhöht. Bei Screendaten braucht man z.B. vier Durchläufe (4x256 = 1024)
jmp Loop
So, ich hoffe, es war nicht zu spät für mich... ![]()