MADS / Problem bzw. Frage
Moderator: Rockford
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
MADS / Problem bzw. Frage
Hallo in die Runde!
Folgendes Problem habe ich noch nicht lösen können:
Ich möchte in MADS-Assembler einen bedingten Sprung bzw. eine Verzweigung ausführen in folgender Art:
jmp oder jsr nach variable - also ich speichere den Ort wohin gesprungen werden soll in eine Variable und zu dieser Adresse springt "er" dann hin.
Klingt simpel, habe ich noch nicht gelöst... wer hat die Lösung???=
Gruß
Peter
Folgendes Problem habe ich noch nicht lösen können:
Ich möchte in MADS-Assembler einen bedingten Sprung bzw. eine Verzweigung ausführen in folgender Art:
jmp oder jsr nach variable - also ich speichere den Ort wohin gesprungen werden soll in eine Variable und zu dieser Adresse springt "er" dann hin.
Klingt simpel, habe ich noch nicht gelöst... wer hat die Lösung???=
Gruß
Peter
Online
- Kveldulfur
- Beiträge: 648
- Registriert: 17.08.2021 02:32
- Has thanked: 249 times
- Been thanked: 176 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Hi!
Für jsr gibt es das nicht.
Beim jmp muss man den vektor in klammern setzen.
Jmp (vektor)
Grüße
Janko
Für jsr gibt es das nicht.
Beim jmp muss man den vektor in klammern setzen.
Jmp (vektor)
Grüße
Janko
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
geht das aber auch als variable?
Also ich schreibe etwas in die Variable rein und dorthin springt er dann?
Also ich schreibe etwas in die Variable rein und dorthin springt er dann?
-
- Beiträge: 85
- Registriert: 20.09.2021 20:59
- Has thanked: 8 times
- Been thanked: 40 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
MADS kann ich nicht, ich schreibe hier mal ein Beispiel in MAC/65-Syntax
jmpadr = $600
lda #$74
sta jmpadr
lda #$e4
sta jmpadr+1
jmp (jmpadr)
Das springt dorthin, wohin der Inhalt von $600+$601 zeigt (Lo-/Hi-Byte), also nach $e474 = RESET
Möchte man einen JSR dorthin machen, dann geht das so (soetwas wie JSR (xxx) gibt es nicht):
jsr dojmp
; hier geht's nach dem jsr weiter
rts
dojmp jmp (jmpadr)
jmpadr = $600
lda #$74
sta jmpadr
lda #$e4
sta jmpadr+1
jmp (jmpadr)
Das springt dorthin, wohin der Inhalt von $600+$601 zeigt (Lo-/Hi-Byte), also nach $e474 = RESET
Möchte man einen JSR dorthin machen, dann geht das so (soetwas wie JSR (xxx) gibt es nicht):
jsr dojmp
; hier geht's nach dem jsr weiter
rts
dojmp jmp (jmpadr)
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Hallo und vielen Dank!
Diesen Sprung habe ich jetzt so auch im Programm durchgeführt und das geht. Der indizierte Jump war mir noch nicht so geläufig - das habe ich vorher umständlich anders gelöst.
Peter (JAC!) hat mir noch einen Tip mit selbstmodifizierendem Code gesagt, für meine Zwecke wahrscheinlich am besten, da es schneller wird und wenige Code verbraucht. Ich muss dann nur 2 Speicherstellen ändern - man muss halt gut aufpassen, wo man den Code ändert.
Das mit dem Jump hätte ich gerne anders gelöst, denn wenn ich an eine definierte Adresse springe, ist es ähnlich wie mit dem selbstmodifizierendem Code - es muss sehr exakt sein und darf sich nicht verändern. wenn ich nämlich vor dem jmp Code verändere, dann stimmen die Adressen nicht mehr und das Programm bleibt im dümmsten Fall hängen. Daher würde ich das gerne "labeln" können... das muss doch gehen!!!
Ich wollte es so umsetzen:
Leider geht das nicht...
Gruß
Peter
Diesen Sprung habe ich jetzt so auch im Programm durchgeführt und das geht. Der indizierte Jump war mir noch nicht so geläufig - das habe ich vorher umständlich anders gelöst.
Peter (JAC!) hat mir noch einen Tip mit selbstmodifizierendem Code gesagt, für meine Zwecke wahrscheinlich am besten, da es schneller wird und wenige Code verbraucht. Ich muss dann nur 2 Speicherstellen ändern - man muss halt gut aufpassen, wo man den Code ändert.
Das mit dem Jump hätte ich gerne anders gelöst, denn wenn ich an eine definierte Adresse springe, ist es ähnlich wie mit dem selbstmodifizierendem Code - es muss sehr exakt sein und darf sich nicht verändern. wenn ich nämlich vor dem jmp Code verändere, dann stimmen die Adressen nicht mehr und das Programm bleibt im dümmsten Fall hängen. Daher würde ich das gerne "labeln" können... das muss doch gehen!!!
Ich wollte es so umsetzen:
Code: Alles auswählen
jumplabel =$600
;--------------------------Hauptprogramm-------
lda #<label1
sta jumplabel
lda #>label1
sta jumplabel+1
jsr subroutine
...
....
;--------------------------Hauptprogramm-------
;--------------------------Subroutine----------
.proc subroutine
jmp(jumplabel)
....
....
rts
label1 .... ; hier hinspringen
rts
.endp
;--------------------------Subroutine-Ende----
Leider geht das nicht...
Gruß
Peter
-
- Beiträge: 85
- Registriert: 20.09.2021 20:59
- Has thanked: 8 times
- Been thanked: 40 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Verstehe nicht ganz, was du meinst: Wenn du an eine bestimmte Stelle im Code springen willst, die der Assembler ermitteln soll, dann schreibe einfach ein Label davor (oder kann das MADS nicht?), z.B.
Was macht den .proc ? Sieht für mich wie ein stinknormales Label aus.
Code: Alles auswählen
blau lda #$80
jmp setcolor
rot lda #$30
setcolor sta 710
rts
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
... in diesem Fall ist jumplabel die Variable - ich fülle die Variable mit der Adresse von label1 z.B. in meiner Subroutine - und springe dann mit jmp(jumplabel) zur Stelle label1.
Ich will halt variabel springen können - mal zu label1, mal zu label2 ... usw. und das muss ich ja dann jeweils in die Variable jumplabel einfügen.
In deinem Beispiel kann ich im Code immer nur zu label1 springen.
Ich will halt variabel springen können - mal zu label1, mal zu label2 ... usw. und das muss ich ja dann jeweils in die Variable jumplabel einfügen.
In deinem Beispiel kann ich im Code immer nur zu label1 springen.
-
- Beiträge: 85
- Registriert: 20.09.2021 20:59
- Has thanked: 8 times
- Been thanked: 40 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Wenn du nach label2 springen willst, dann packe einfach den Wert von label2 in jmplabel:
Code: Alles auswählen
lda #<label2
sta jumplabel
lda #>label2
sta jumplabel+1
- pps
- Beiträge: 566
- Registriert: 18.06.2021 23:05
- Has thanked: 122 times
- Been thanked: 224 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Man kann ja auch variabel selbst die Adresse hinter den JMP oder den JSR Befehl setzen. Das ist dann selbstmodifizierender Code.
Total sinnig wird hier abwechselnd mal zu code1 mal zu code2 gesprungen und das endlos.
Code: Alles auswählen
lp
JSR code1
JMP lp
code1
mwa #code2 lp+1
rts
code2
mwa #code1 lp+1
rts
Online
- Kveldulfur
- Beiträge: 648
- Registriert: 17.08.2021 02:32
- Has thanked: 249 times
- Been thanked: 176 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Hi!
Etwas schicker... naja, ich empfinde es so, geht es so:
Durch *-2 bekommt JMPADR genau die Speicheradresse für die Zielangabe.
Das Beispiel von pps sähe dann so aus:
In dem kurzem Beispiel vielleicht auf dem ersten Blick nicht notwendig, ist es bei einem längerem Programm vllt. praktisch, wenn man sich nicht merken muss, dass man +1 noch zu lp addieren muss.
Grüße
Janko
Etwas schicker... naja, ich empfinde es so, geht es so:
Code: Alles auswählen
JMP $1234
JmpAdr EQU *-2
Das Beispiel von pps sähe dann so aus:
Code: Alles auswählen
lp
JSR code1
JsrAdr EQU *-2
JMP lp
code1
MWA #code2 JsrAdr
RTS
code2
MWA #code1 JsrAdr
RTS
Grüße
Janko
- DjayBee
- Beiträge: 674
- Registriert: 17.08.2021 04:02
- Has thanked: 417 times
- Been thanked: 195 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Disclaimer: Ich habe keine Ahnung, rate aber mal munter drauf los.
Kann es sein, dass durch dein ".proc" die darin angesprochenen Labels lokal sind?
Dann hätte jumplabel außerhalb den zugewiesenen Wert $600, innerhalb des .proc wäre es aber undefiniert (oder evtl. 0).
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
... ich Trottel ... ja klar, das ist die Lösung und die Erklärung, warum es bei mir nicht funktioniert hat.
Unterroutinen baue ich in Proceduren ein - das ist schön übersichtlich - aber klar, die Labels sind lokal. Logo!!
Danke für alle Anregungen und letztlich für die Lösung am Ende. Gut, daß wir das Forum hier haben!!!!
Gruß
Peter
Unterroutinen baue ich in Proceduren ein - das ist schön übersichtlich - aber klar, die Labels sind lokal. Logo!!
Danke für alle Anregungen und letztlich für die Lösung am Ende. Gut, daß wir das Forum hier haben!!!!
Gruß
Peter
- LarsImNetz
- Beiträge: 156
- Registriert: 24.08.2021 18:27
- Has thanked: 114 times
- Been thanked: 84 times
- Kontaktdaten:
Re: MADS / Problem bzw. Frage
Hallo Peter,
wenn ich das richtig verstehe, willst Du eine Art Function Pointer.
Also einfach eine Adresse aus dem Speicher laden und diese anspringen.
Hier 3 Beispiele:
1. SMC Code mag ich nicht so gerne.
2. Indirekter Sprung, kostet hier 2 Bytes in der Zero Page
3. Adresse auf den Stack schieben per pha und mit php/rti anspringen, sieht komisch aus, funktioniert aber wie erwartet. Ist nur etwas langsamer. (Trotzdem mein Favorit)
LG
Lars
wenn ich das richtig verstehe, willst Du eine Art Function Pointer.
Also einfach eine Adresse aus dem Speicher laden und diese anspringen.
Hier 3 Beispiele:
1. SMC Code mag ich nicht so gerne.
2. Indirekter Sprung, kostet hier 2 Bytes in der Zero Page
3. Adresse auf den Stack schieben per pha und mit php/rti anspringen, sieht komisch aus, funktioniert aber wie erwartet. Ist nur etwas langsamer. (Trotzdem mein Favorit)
Code: Alles auswählen
; Beispiel für den function pointer call (function)()
LDY #<function
LDX #>function
jsr @function_pointer ; function ist die Adresse, die angesprungen wird
[...]
@function_pointer
; Some old ideas, not taken
; SMC-Code!
; STY ?ADDRESS+1 ; 4
; STX ?ADDRESS+2 ; 4
;?ADDRESS
; JMP $4000 ; 3 sum: 11 cycles, 9 Bytes, RAM only
; need 2 bytes in Zero page
; STY @FKT_PTR ; 3
; STX @FKT_PTR+1 ; 3
; JMP (@FKT_PTR) ; 5 sum 11 cycles, 2 bytes in zero page
; need 8 cycles more, but no extra memory
TXA ; 2
PHA ; 3
TYA ; 2
PHA ; 3
; RTS ; funktioniert hier nicht, weil die Adresse -1 sein müsste
PHP ; 3 ; RTI expect this byte
RTI ; 6 sum 19 cycles, 6 bytes, no extra RAM
Lars
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast