MADS / Problem bzw. Frage

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 274 times
Kontaktdaten:

MADS / Problem bzw. Frage

Beitrag von Dr. Irata »

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

Benutzeravatar
Kveldulfur
Beiträge: 637
Registriert: 17.08.2021 02:32
Has thanked: 246 times
Been thanked: 168 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Kveldulfur »

Hi!

Für jsr gibt es das nicht.
Beim jmp muss man den vektor in klammern setzen.

Jmp (vektor)

Grüße
Janko

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 274 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Dr. Irata »

geht das aber auch als variable?

Also ich schreibe etwas in die Variable rein und dorthin springt er dann?

Dietrich
Beiträge: 75
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Dietrich »

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)

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 274 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Dr. Irata »

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:

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

Dietrich
Beiträge: 75
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Dietrich »

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.

Code: Alles auswählen

blau      lda #$80
          jmp setcolor

rot       lda #$30

setcolor  sta 710
          rts
Was macht den .proc ? Sieht für mich wie ein stinknormales Label aus.

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 274 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Dr. Irata »

... 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.

Dietrich
Beiträge: 75
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Dietrich »

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

Benutzeravatar
pps
Beiträge: 556
Registriert: 18.06.2021 23:05
Has thanked: 116 times
Been thanked: 219 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von pps »

Man kann ja auch variabel selbst die Adresse hinter den JMP oder den JSR Befehl setzen. Das ist dann selbstmodifizierender Code.

Code: Alles auswählen

lp
   JSR code1
   JMP lp

code1
   mwa #code2 lp+1
   rts

code2
   mwa #code1 lp+1
   rts
Total sinnig wird hier abwechselnd mal zu code1 mal zu code2 gesprungen und das endlos.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Kveldulfur
Beiträge: 637
Registriert: 17.08.2021 02:32
Has thanked: 246 times
Been thanked: 168 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Kveldulfur »

Hi!

Etwas schicker... naja, ich empfinde es so, geht es so:

Code: Alles auswählen

			JMP $1234
JmpAdr			EQU *-2
Durch *-2 bekommt JMPADR genau die Speicheradresse für die Zielangabe.

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
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

Benutzeravatar
DjayBee
Beiträge: 657
Registriert: 17.08.2021 04:02
Has thanked: 404 times
Been thanked: 189 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von DjayBee »

Prodehl hat geschrieben:
19.08.2022 16:25
Ich wollte es so umsetzen:
[...]
Leider geht das nicht...
Disclaimer: Ich habe keine Ahnung, rate aber mal munter drauf los. :lol:

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).

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 274 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von Dr. Irata »

... 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

Benutzeravatar
LarsImNetz
Beiträge: 156
Registriert: 24.08.2021 18:27
Has thanked: 114 times
Been thanked: 84 times
Kontaktdaten:

Re: MADS / Problem bzw. Frage

Beitrag von LarsImNetz »

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)

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
LG
Lars

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast