Hallo, guten Tag.
Ich brauche bitte eine Schleife für 76800 Byte.
Das ist mein Anfang. Ich habe 256x256 schleifendurchgänge. Es fehlen noch 34 Schleifen. Wie kann man die bitte dort zwischen den 2x loop mit unterbringen oder muss ich am ende eine schleife mit 34x256 dranhängen?
Du könntest auch Bytes auf zero page verwenden, z.B. $10 und $11
lda #44
sta $10
lda #01
sta $11
ldy #$00
loop:
lda #45
sta $9f23
iny
bne loop
dec $10
bne loop
dec $11
bpl loop
Das hilft überhaupt nichts da es nicht das Problem löst über
die 16-Bit Grenze von 65535 hinaus zählen zu müssen.
Wer soll denn da außer der CPU noch zählen? Einfach einen Sack voller gleicher Werte zB. an ein Display senden um es mit einer Farbe oder einem Muster zu initialisieren. Das Display wird dafür sorgen die eingehenden Daten angemessen zu verarbeiten.
Das hilft überhaupt nichts da es nicht das Problem löst über
die 16-Bit Grenze von 65535 hinaus zählen zu müssen.
Das ist korrekt, mit x und y lassen sich 256*256 = 65536 Werte zählen. Um bis 76800 zu zählen kommt man also um eine zweite Schleife nicht herum. Verstehe nur den Sinn des ganzen nicht...
Man darf auch in Assembler weiter rechnen als nur bis 255. Dazu werden mehrere 8Bit Variablen zusammen gefaßt.
Im einfachsten Fall nimmst Du ein C-Programm, legst eine Schleife mit 32Bit Variable an und läßt es nach Assembler übersetzen.
Man darf auch in Assembler weiter rechnen als nur bis 255. Dazu werden
mehrere 8Bit Variablen zusammen gefaßt.
Im einfachsten Fall nimmst Du ein C-Programm, legst eine Schleife mit
32Bit Variable an und läßt es nach Assembler übersetzen.
Recht und schön, funktioniert aber nicht mit beim 6502. Der hat nur einen 8 Bit Datenbus und 16 Bit breiten Adressbus. Der 6502 kann auch Arrays grösser 256 nur blockweise ansprechen.
Recht und schön, funktioniert aber nicht mit beim 6502.
Wäre schön wenn hier nur Leute schrieben, die sich zumindest mal auf weniger als 500m einem Assembler genähert hätten. Über handgedengelten Maschinencode will ich schon gar nicht schreiben.
Aber – dies ist ja mittlerweile das Arduino Forum - was will man erwarten…
PS: Es gab auch mal einen 4004 Prozessor. Der konnte dann wohl nur bis fünfzehn zählen…
…und selbst wenn es um Arrays ginge, selbst dann wäre seine Aussage falsch.
Und zwar so falsch das noch nicht einmal das Gegenteil richtig wäre.
Der 6502 kannte natürlich auch indirect,indexed und ebenso indexed,indirect.
Und damit konnte man den kompletten Adressbereich ohne – wie war das, "Blöcke" – abarbeiten.
Recht und schön, funktioniert aber nicht mit beim 6502. Der hat nur
einen 8 Bit Datenbus und 16 Bit breiten Adressbus.
Hat der 8051 auch nur. Trotzdem benutze ich dort problemlos 32Bit long und 32Bit float Variablen. Der Compiler bastelt sich das automatisch aus 4 Byte im RAM oder in Registern zusammen, in Assembler muß man das eben händisch machen.
Schön ist das nicht, aber „wat mutt, dat mutt“.
Um eine weitere 8-Bit-Familie ins Spiel zu bringen, ein beispielhaftes 32-Bit-Macro für PIC (wie ich die Syntax hasse, einfach nur hässlich, wie schön war doch Z80):
Der Compiler bastelt sich das automatisch aus
4 Byte im RAM oder in Registern zusammen, in Assembler muß man das eben
händisch machen.
Genau. Und der funkheld wird das wohl nie wirklich lernen. Der versucht sich mit unzähligen Architekturen, begreift aber offensichtlich bei keiner davon auch nur irgendetwas.
Crackhead oder Troll? Ich bin mir trotz der langen Historie seiner Bemühungen immer noch nicht sicher.
und selbst wenn es um Arrays ginge, selbst dann wäre seine Aussage
falsch.
Und zwar so falsch das noch nicht einmal das Gegenteil richtig wäre.
Der 6502 kannte natürlich auch indirect,indexed und ebenso
indexed,indirect.
Und damit konnte man den kompletten Adressbereich ohne – wie war das,
"Blöcke" – abarbeiten.
Achso, das stimmt also nicht?
Wie gross ist denn das x und y Register vom 6502?
Und wenn ich jetzt einen Speicherblock (Array) ansprechen will, geht das dann auf einen Rutsch oder blockweise?
Und wenn ich jetzt indirekt adressiere z.B mit <lda ($45),y inc y...> kann er dann weiter zählen als bis zum Maximum des y Wertes?
Spätestens dann muss der Wert von im Beispiel $45 geändert werden um den restlichen Speicher zu adressieren.
Ich sehe schon, du hast dein Wissen nun um eine Seite erweitert.
Zumindest hast du erkannt, das man die Basisadresse auf die in der ZP verwiesen wird, beliebig ändern (zB. inkrementieren) kann. Das ist sogar der tiefer liegende Sinn des ›indirect‹
Man kann diese auch 2^16-1 × inkrementieren (oder ein Gemisch aus Basis und Index). Das hatte MOS (der Hersteller) schon Mitte der Siebziger erkannt und in ihrem ›Programming Manual‹ freundlicherweise sehr sauber dokumentiert.
Du jedoch schriebst:
Kurt schrieb im Beitrag #7642650:
Der 6502 kann auch
Arrays grösser 256 nur blockweise ansprechen.
MOS ist da eben anderer Meinung. Wenn man sich allerdings explizit nur auf Änderung der X/Y Register versteifen möchte, dann bleibt man in seinem 8Bit Denken verfangen…
Du denkst offensichtlich an ›absolute indexed addressing‹ und ja, damit kann man nur 256 Bytes mittels X oder Y Register ansprechen. Es gibt aber mehr…
Fakt bleibt, Arrays (egal welcher Größe bis zum maximalen Adressraum) können Byte-weise angesprochen werden. Sowohl ›indirect‹ als auch ›indirect indexed‹. Der Programmierer hat da freie Wahl. Einfach indem er den ›indirect‹ Part und vielleicht auch noch den ›indexed‹ Part ändert.
Und wenn ich jetzt indirekt adressiere z.B mit <lda ($45),y inc y...>
kann er dann weiter zählen als bis zum Maximum des y Wertes?
Wenn man nicht darauf besteht, Y hochzählen zu lassen, sondern das Bytepaar {$45/$46} hochzählen lässt, dann geht das durchaus. Nicht nur blockweise.
Die Zero-Page des 6205 kann man dabei als erweiterte Registerbank betrachten, ähnlich wie beim AVR der Speicherbereich 0x00-0x1f, der dort explizit auf die Register r0..r31 gemapt ist.
Welchen Sinn macht es 76800 (vermutl. verschiedene) Werte an eine
einzige Adresse zu schreiben?
Zugriff auf Speicher, die größer als die 16-Bit des Adressbusses des 6502 sind. Hat man auch bei Z80 oder 8051 schon so gemacht. Grafikkarten, Massenspeicher, Peripherie, ...
Drittens: Zählen (um das ging es dem TO) kann der 6502 so weit, wie man Speicherstellen benutzt, also auch 32-Bit oder 64-Bit oder noch längeres, so weit der Speicher reicht.
Man muss sich nur davon lösen, das alles ausschließlich mit A oder Y oder X machen zu wollen, sondern die Mittel nutzen, die der Prozessor sonst noch zur Verfügung stellt.
Wenn man nicht darauf besteht, Y hochzählen zu lassen, sondern das
Bytepaar {$45/$46} hochzählen lässt, dann geht das durchaus. Nicht nur
blockweise.
Klar kann man damit eine 16 bit Zahl darstellen, aber wie gross kann denn der Wert von $45 oder $46 werden? Spätestens bei $00 oder $ff muss einer der beiden Zeiger geändert werden wenn weiter gezählt werden soll.
Natürlich ist das ein Zeiger, wo hasst in dein Beispiel die beiden Pointer definiert?
Und dein Pogramm macht genau das, was ich die ganze Zeit hier schreibe. Du lädst in dem ersten Beispiel x mit 00 und zählst bis ff hoch. Anschliessend erhöhst du das Highbyte deines Pointers. Und weil das Highbyte des Pointers nicht ausgewertet wird, haben wir jetzt eine Enlosschleife.
ARRPTR = $40, das ist eine 8 bit Adresse -- ARRPTR+1 = $41, ebenso 8 bit, beide zusammen 16 bit und nicht einer allein. Wenn du mit 16 bit rechnen willst, brauchst du Low und High Byte
Man könnts auch direkt schreiben: lda $40 - eor #$ff - sta $40 und später inc $41
Schreib jetz auch nix mehr, iss mir einfach zu dumm...