Assembler-Beginner: indirekte Adressierung

Moderator: Rockford

Antworten
DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Assembler-Beginner: indirekte Adressierung

Beitrag von DocSash »

Sorry, dass ich euch mit so einer Frage nerve, aber ich fange gerade an mich mit dem 6502-Assembler zu beschäftigen (derzeit mit Mads und Eclipse), und stehe bei einer Sache ziemlich auf dem Schlauch:

Wie kann ich den Inhalt einer Adresse auslesen, die ich zuvor mit 2 Byte im Speicher abgelegt habe? Konkret: ich berechne per Multiplikation den Offset für eine Adresse in meinem Bildschirmspeicher (Bildschirm beginnt bei $8150, Antic E), und speichere diese Adresse als Low in $1100 und High in $1101. Nun habe ich erstmal das Problem meinen Offset zur Bildschirmadresse zu addieren. Für das High-Byte ist es ja noch in Ordnung, wenn ich die $81 einfach drauf rechne (auf den Wert in $1101), aber beim Low könnte ich ja theoretisch eine Grenze überschreiten aufgrund dessen ich das High ja noch einen hochzählen müsste. Aber noch schwerwiegender: ich habe keine Ahnung wie ich nun den Inhalt der bis hierhin errechneten Speicherzelle in ein Register lade um ihn zu vergleichen. Mein Ansatz wäre eine indirekte Adressierung, aber ich glaube ich habe das Konzept noch nicht verstanden. :D

Wahrscheinlich ist meine Herangehensweise schon komplett falsch. Wie ihr euch bestimmt schon denken könnt geht es um eine Collision Detection, und die Hardwarelösung scheidet leider aus. Ich möchte einfach nur prüfen was in der/den Speicherzellen in einer bestimmten Richtung neben meinem Player steht. Trotz der ja zahlreichen Infos im Netz zum 6502 und auch speziell zum Atari-Assembler komme ich da einfach nicht hinter. Wäre echt dankbar, wenn ihr einem Noob auf die Sprünge helfen könntet.

Benutzeravatar
JAC!
Beiträge: 170
Registriert: 18.06.2021 23:13
Has thanked: 119 times
Been thanked: 171 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von JAC! »

Willkommen im Forum!
An Beispielen lernt mal da am einfachsten.

Code: Alles auswählen

; Deklarationen
p1=$80 ; Zero-Page Pointer
sm = $8150

CLC ; Kein Übertrag
LDA $1100
ADC #<sm ;Low von $8150, kann C=1 Übertrag erzeugen
STA p1
LDA $1101
ADC #>sm ;Hight von $8150, addiert auch C
STA p1+1

LDY #0 ;Offset
LDA (p1),y ;Wert an der Adresse, die in p1/p1+1 steht, plus Y Bytes in Register A
CMP #... ; Vergleiche welches Zeichen dort steht..
Visit https://www.wudsn.com the home of WUDSN IDE.

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von DocSash »

Ah, die Nebel lichten sich. :D

Vielen Dank erstmal, und ja, Codebeispiele sind immer am besten.

Habe nur noch ein Frage: woher weiß das LDA (p1),y, dass es die Adresse aus p1 und p1+1 nehmen soll? Sind indirekte Adressierungen immer 16bit und man gibt grundsätzlich nur das Lowbyte an? Dann war ich tatsächlich zumindest schon auf dem richtigen Weg, hatte nur die ganze Zeit gedacht, ich müsste die Adresse dann noch irgendwie wieder manuell zusammen setzen.

Und eine kurze Frage noch zum Carry: das bleibt solange gesetzt bis ich entweder ein clc ausführe oder eine Berechnung durchführe dessen Ergebnis kein Carry beinhaltet, korrekt?

Benutzeravatar
Dr. Irata
Beiträge: 1135
Registriert: 24.08.2021 14:40
Has thanked: 165 times
Been thanked: 365 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von Dr. Irata »

moin und willkommen...
Beide Antworten sind korrekt!

Benutzeravatar
Dr. Irata
Beiträge: 1135
Registriert: 24.08.2021 14:40
Has thanked: 165 times
Been thanked: 365 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von Dr. Irata »

... leider schaffe ich es gerade aus Zeitmangel nicht, das AtariWiki mit den ganzen Codes zu befüllen, die wir hier erarbeitet haben. Wenn du aber mal das Forum von Seite 1 an durchstöberst, wirst du eine ganze Menge an Fragen/Antworten finden, die wir hier die letzten Jahre besprochen haben mit einer ganzen Reihe an einfachen und überwiegend gut erklärten Code-Beispielen für Mads/Eclipse....

LG Peter

Benutzeravatar
Dr. Irata
Beiträge: 1135
Registriert: 24.08.2021 14:40
Has thanked: 165 times
Been thanked: 365 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von Dr. Irata »

... wenn du z.B. einen 16-Bit Zähler machen möchtest fu nktioniert das so:

Code: Alles auswählen

	CLC
	LDA var1
	ADC #1
	STA var1
	LDA var1+1
	ADC #0
	STA var1+1
oder noch schlanker so:

Code: Alles auswählen

	INC var1
	BNE weiter
	INC var1+1
weiter
wenn du Fragen hast, wir helfen gerne!
Hier im Forum tummeln sich echte Programmiergranaten ;-)

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von DocSash »

Vielen Dank für den Tipp mit dem Forum, da werde ich auf jeden Fall mal durchstöbern.

Wegen des Zählers: hatte ich auch so gemacht wie im ersten Codebeispiel, also zum High nochmal 0 addieren damit das Carry mitgenommen wird. Auf die Idee mit dem zweiten Beispiel wäre ich wahrscheinlich nie gekommen, aber klar, ist Var1 durch das INC nicht auf 0 gesprungen, wird das hochzählen des High einfach übersprungen. In meinem Code mache ich derzeit noch viel zu Fuß und unnötig kompliziert und speicherfressend aber Assembler bietet so viele Möglichkeiten für elegante Lösungen. Mehr Kunst als Programmiersprache. :lol:

Benutzeravatar
Dr. Irata
Beiträge: 1135
Registriert: 24.08.2021 14:40
Has thanked: 165 times
Been thanked: 365 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von Dr. Irata »

... ja das stimmt. Ich finde es immer wieder erstaunlich, wie man Dinge einfacher und schneller hinbekommen kann...

Benutzeravatar
cas
Beiträge: 1021
Registriert: 18.06.2021 21:01
Wohnort: Solar System
Has thanked: 270 times
Been thanked: 639 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von cas »

Im "Apple Assembly Line" Newsletter von Bob Sander-Cederlof finden sich viele 6502-Assembler Schätze. Vieles ist für den Apple II, lässt sich aber auf den A8 übertragen:

https://www.txbobsc.com/aal/index.html

slx
Beiträge: 198
Registriert: 18.06.2021 23:16
Has thanked: 180 times
Been thanked: 27 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von slx »

Dr. Irata hat geschrieben:
10.10.2024 14:54
... ja das stimmt. Ich finde es immer wieder erstaunlich, wie man Dinge einfacher und schneller hinbekommen kann...
Ebenso erstaunlich ist, dass man vieles auf viele verschiedene Arten lösen kann.

Je cleverer und vor allem je kürzer die Lösung, desto besser sollte man sie allerdings dokumentieren, denn sonst ist die Gefahr groß, dass man schon wenige Wochen später keinen Tau mehr hat, wie und warum das funktioniert. Diese Gefahr ist invers proportional zur Codelänge und direkt proportional zu Alter und Zeit seit Codeerstellung. (Ich habe einen Ausdruck eines ca. 7K Langen Assembler-Programms rumliegen, dass ich vor ca. 40 Jahren verfasst habe und tue mir sehr schwer zu verstehen, wie und wieso ich das so geschrieben habe.)

Benutzeravatar
JAC!
Beiträge: 170
Registriert: 18.06.2021 23:13
Has thanked: 119 times
Been thanked: 171 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von JAC! »

Diese Gefahr ist invers proportional zur Codelänge und direkt proportional zu Alter und Zeit seit Codeerstellung
Hehe, sehr treffend. Der Teil in das Vorwort jedes Programmierkurses gehört - und immer fehlt.
Visit https://www.wudsn.com the home of WUDSN IDE.

Elephant
Beiträge: 28
Registriert: 17.08.2021 00:56
Been thanked: 16 times
Kontaktdaten:

Re: Assembler-Beginner: indirekte Adressierung

Beitrag von Elephant »

Sicher auch hilfreich das Assemblerbuch von Peter Finzel von dem ich eine PDF-Datei gesetzt habe.

Download hier: https://www.elephantxxl.de/Das-Assemblerbuch.php

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast