Z80-Assembler-Thread

ZX-Team Forum
Antworten
Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Z80-Assembler-Thread

Beitrag von Joachim » 17.06.2018, 14:22

Ich möchte hier einen Thread aufmachen, in dem Z80-Assemblerprobleme, Vorschläge, Tricks oder Lösungen vorgestellt werden können. Im Betreff kann man das jeweilige Thema eingeben.
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Stapel aufräumen

Beitrag von Joachim » 17.06.2018, 14:23

Da es beim CNC-Fräsen hinundwieder das Problem gibt, dass man einen Parameter falsch eingestellt hat, war es für mich wichtig, in mein Maschinenprogramm eine Break-Tastenabfrage einzubauen. Wenn Break gedrückt wird, bricht das MC ab und springt ins BASIC zurück. Das habe ich gelöst, indem ich den Stack durch mehrfaches POP HL (oder ein anderes Doppelregister) bereinigt habe. Es war aber nicht so einfach und ist auch nicht hundertprozentig, weil man bei einem umfangreichen Programm nie weiß, wieviele CALLs bis zur Breakroutine noch nicht ihren Rücksprung bekommen haben.
Gibt es einen Trick oder vielleicht eine ROM-Routine, die das zuverlässig erledigt? Kann man feststellen, welche abgelegte Adresse noch zu meinem Programm gehört und welche zum ZX81-Betriebssystem?
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

bokje
User
Beiträge: 99
Registriert: 02.05.2015, 15:38

Re: Stapel aufräumen

Beitrag von bokje » 17.06.2018, 14:41

Wäre das Folgende eine Lösung?

Code: Alles auswählen

; back to BASIC when running and keep running
ld hl,(16388) ; RAMTOP
dec hl
dec hl
dec hl
dec hl
ld sp,hl ; fixed return address
ret

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Stapel aufräumen

Beitrag von Joachim » 17.06.2018, 16:08

Hallo bokje!
Ich hätte zwei Fragen dazu: Was meinst du mit 'and keep running'? In meinem Fall sollte das Basic-Programm stoppen.
Und warum sind es 4x dec hl? Hat das was mit den Internas des ZX81 zu tun.
Zuletzt geändert von Joachim am 17.06.2018, 16:32, insgesamt 1-mal geändert.
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

bokje
User
Beiträge: 99
Registriert: 02.05.2015, 15:38

Re: Stapel aufräumen

Beitrag von bokje » 17.06.2018, 16:17

Hallo Joachim,

1) "Break pressed" beendet und Stapel ist ok:

Code: Alles auswählen

call 0f46
jp nc,3a6h
2) Ja normalerweise wird eine BASIC Linie (z.B. "10 RAND USR 16514") am 673h angerufen, und (RAMTOP-4) ist dann 676h :)

Edit: "Break-1" routine dazugefügt.
Zuletzt geändert von bokje am 17.06.2018, 23:02, insgesamt 2-mal geändert.

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Stapel aufräumen

Beitrag von Joachim » 17.06.2018, 16:35

Vielen Dank für die Infos!
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

Benutzeravatar
tokabln
User
Beiträge: 1399
Registriert: 10.11.2013, 00:24
Wohnort: D, Berlin (Mariendorf)

Re: Z80-Assembler-Thread

Beitrag von tokabln » 17.06.2018, 17:53

Hallo Joachim,

das wäre doch eigentlich etwas für einen Interrupt... der den aktuellen Programmablauf sofort abbricht, die CNC Maschine damit sofort den Verfahrweg stoppt, den Fräser aus dem Werkstück herausfährt und auf die Homeposition fährt. Zeitgleich müssen natürlich die Register sowie die letzte Fräsposition gesichert werden um bei Bedarf wieder mit dem aktuellen Frässatz an der letzten Position zu starten. Dabei müsste das Basic Programm nicht beendet werden... sondern es wartet dann z.B. auf Deine nächste Aktion... zwecks Fehlerbehebung oder was auch immer ansteht.
Lieben Gruß Torsten
BMZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, T41, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Stapel aufräumen

Beitrag von Joachim » 17.06.2018, 18:27

Hallo Torsten,
Ähnliches läuft auch ab (nicht ganz in diesem Umfang), aber irgendwann müssen die Call-Adressen vom Stack wieder abgeholt werden. Ein Rücksprung zur Routine, zu Bsp. 'Senken', verbietet sich, weil ja genau da ein Fehler war. Ich bin dabei bokjes Vorschlag auszuprobieren. Ich denke, das müßte so funktionieren.
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Stapel aufräumen

Beitrag von Joachim » 18.06.2018, 00:35

Eine Lösung, die bisher funktioniert hat:
Unmittelbar nach dem Aufruf des MC wird zu Beginn des MC der Stack gesichert:
ld (oldsp),sp
Wenn die Break-Abfrage positiv war, wird der alte Stack wieder hergestellt:
ld sp,(oldsp)
ret
Offen gestanden habe ich die beiden Ladebefehle für den Stack bisher noch nie verwendet. Deshalb bin ich auch nicht gleich drauf gekommen.
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

bokje
User
Beiträge: 99
Registriert: 02.05.2015, 15:38

Re: Stapel aufräumen

Beitrag von bokje » 18.06.2018, 08:12

Das ist eine gute Lösung für den Stapel! Aber das Basic-Programm wird dann beendet werden wegen ein zweites Test ab 6a0h. Nach "jp 3a6h" wird den Stapel auch ok sein.

Benutzeravatar
siggi
User
Beiträge: 2379
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: Z80-Assembler-Thread

Beitrag von siggi » 18.06.2018, 10:15

Hallo Joachim
BASIC räumt nach einem Fehler ja selbst den Stapel auf.
Wenn es also mit dem BASIC-Error-Handling klappen würde (Rückkkehr also mit oder ohne Fehler ins BASIC), dann kann der bekannte

Code: Alles auswählen

	RST 08
defb	$FF
benutzt werden (Byte $FF führt zum "Fehler" 0 und BASIC-Programm läuft weiter, andere Werte führen zum Abbruch oder Absturz).

Wenn aber Rücksprung zu einem M/C-Programm passieren soll, mußt Du Dich selbst um Aufräumen kümmern (Stack auf alten Wert setzen).

Gruß
Siggi
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Stapel aufräumen

Beitrag von Joachim » 18.06.2018, 11:01

Vielen Dank, bokje und Siggi! Soweit blicke ich jetzt durch. Ich werde mehrere der angesprochenen Methoden nehmen müssen. Da das Programm im Ursprung nicht von mir ist (es war für einen Flachbettplotter gedacht) und auch ursprünglich nicht für den ZX81, muss ich mich an einige Eigenheiten halten. Z.B. werden IX und IY gleich nach einem bestimmten Einstieg ins MC gepusht. Wenn ich also zurückspringe zu BASIC, müssen diese Register wieder restauriert werden. Bei einem anderen Einstieg ist das nicht so und ich kann die ROM-Routinen verwenden. Da die Break-Taste nur im Notfall verwendet werden soll (sozusagen Notausknopf), sollte auch das BASIC stehen bleiben, da z.B. etwas mit der Mechanik nicht stimmen könnte. Da wäre das Fahren zum Nullpunkt fatal. In einem anderen Fall wäre es gut, wenn das Basic weiterlaufen und zum Bsp. eine freie Speicheradresse abfragen würde, ob der Rücksprung wegen Break erfolgte und dann evtl. zum Hauptmenü verzweigt. Mit eueren Hinweisen kann ich nun jedem Fall gerecht werden. Habe viel über den Stack und die Behandlung desselben erfahren. Danke!
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

Benutzeravatar
siggi
User
Beiträge: 2379
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: Z80-Assembler-Thread

Beitrag von siggi » 18.06.2018, 12:46

Na dann wäre

Code: Alles auswählen

	call restore81
	rst 08
defb $FF (kein Fehler und weiter) oder $0C (BREAK ERROR "D" und STOP BASIC)
der universelle Code.
In "restore81" wird ggf. die Register- und sonstige Umgebung für BASIC wieder hergestellt (also anwendungsspezifisch)

"restore81" gibt's aus diesem Grund auch im Z88DK :mrgreen:

Gruß
Siggi
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Re: Z80-Assembler-Thread

Beitrag von Joachim » 18.06.2018, 16:09

Optimal!
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

Benutzeravatar
tokabln
User
Beiträge: 1399
Registriert: 10.11.2013, 00:24
Wohnort: D, Berlin (Mariendorf)

Re: Z80-Assembler-Thread

Beitrag von tokabln » 18.06.2018, 16:36

Nun das Anfahren der Homeposition bei einem Break sehe ich nicht als fatal an, im Gegenteil. Dabei muß natürlich die letzte Position der X und Y Achse als auch ggf. der Z Achse gespeichert werden. Was dann noch ggf. wichtig wäre, wäre der Einbau einer Routine der Du entsprechende Anweisungen manuell geben kannst um das Problem zu umschiffen. Wie auch immer würdest Du dafür aber die letzte gültige Position benötigen um da dann wieder anzusetzen. Bei meiner Fräse ist das so, das sie einen Errorcode ausgibt, in dem auch der letzte gültige Befehl steht. An diesem Punkt kann ich dann ggf. manuell neu einstarten.

Ausserdem ist die Homeposition die sicherste Position da Du dann immer wieder von 0,0,0 (x,y,z) starten kannst.
Lieben Gruß Torsten
BMZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, T41, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e

Benutzeravatar
Joachim
User
Beiträge: 995
Registriert: 06.11.2004, 20:21

Re: Z80-Assembler-Thread

Beitrag von Joachim » 18.06.2018, 19:47

Hallo Torsten!
Unlängst ist mir ein Kabel in die Spindel (ist halt alles Eigenbau) gekommen und hat alles verklemmt. Da hätte sich nichts mehr drehen dürfen. Und zur Homeposition hätte der Stepper es auch nicht geschafft. Sonst ist das schon klar und größtenteils läuft es so, wie du beschreibst.
Viele Grüße!
Joachim


ZX80, ZX81, ZX-Spectrum, ZX96, ZX2000, ZXmore, ZX81NU, Blauer Engel, AX81

Benutzeravatar
tokabln
User
Beiträge: 1399
Registriert: 10.11.2013, 00:24
Wohnort: D, Berlin (Mariendorf)

Re: Z80-Assembler-Thread

Beitrag von tokabln » 18.06.2018, 20:17

Hallo Joachim,

das ist natürlich nicht schön. Gegen soetwas helfen Kabelführungsketten / Energieketten:

https://www.google.com/search?q=Kabelf% ... 20&bih=962

Ist sehr zu empfehlen...

Nachtrag: Break ist kein Notaus, wenn dann ein Nothalt... ein echter Notaus Taster ist mehr als sinnvoll, legt dann aber das gesamte System stromlos... da ist dann auch keine Assemblerroutine oder ein Basicprogramm mehr von Nöten :twisted:

https://www.precifast.de/not-aus-schalt ... chaltplan/
Lieben Gruß Torsten
BMZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, T41, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e

Antworten