Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Zugriff auf Portadressen unter MicroDOS Assembler KC85 » Themenansicht

Autor Thread - Seiten: -1-
000
26.12.2024, 18:23 Uhr
mwd



Hallo,
wie kann ich unter MicroDOS (ML-DOS) am geschicktesten auf z.B. die Module M001 und M010 zugreifen? Im Grundgerät nutze ich die Assemblerbefehle IN und OUT bzw. in BASIC die Anweisungen INP und OUT. Wie das für Druckertreiber unter MicroDOS funktioniert steht im Handbuch für den Programmierer. Ich könnte also im Grundgerät (D001) kleine Unterprogramme mit den IN und OUT Anweisungen ablegen und über den Koppel-RAM kommunizieren. Aber wie geht das genau? Wie spreche ich diese kleinen Routinen aus MicroDos in eigenem Assemblercode an? Direkt kann ich ja die Kanaladressen (z.B. 4 bis 7 für M001) aus MicroDos nicht ansprechen, oder?
Das Modulschalten geht über ESC Funktion 0x63. Kann ich vlt. mittels ESC Funktion auch von Kanaladressen lesen und schreiben?
Vielen Dank für eure Hilfe und viele Grüße,
Matthias.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
26.12.2024, 22:49 Uhr
susowa




Zitat:
mwd schrieb
Ich könnte also im Grundgerät (D001) kleine Unterprogramme mit den IN und OUT Anweisungen ablegen und über den Koppel-RAM kommunizieren. Aber wie geht das genau?



Da gibt es keine "Standardbeschreibung". Ab ZAS 1.3 wird der RAM im D001 von ZAS verwaltet:

https://web.archive.org/web/20220815063818fw_/https://www.iee.et.tu-dresden.de/~kc-club/02/KCN97-04/KCN97-04-16.HTML

Man kann freie (temporäre) Speicherpage(s) beantragen, dort seinen Code ablegen und am Programmende wieder freigeben (ESC m / ESC T / ESC l).


Zitat:
mwd schrieb
Wie spreche ich diese kleinen Routinen aus MicroDos in eigenem Assemblercode an?



Mit ESC U, wobei die zurückgegebene Pageadresse von ESC m zu verwenden ist.


Zitat:
mwd schrieb
Direkt kann ich ja die Kanaladressen (z.B. 4 bis 7 für M001) aus MicroDos nicht ansprechen, oder?



Nein.


Zitat:
mwd schrieb
Kann ich vlt. mittels ESC Funktion auch von Kanaladressen lesen und schreiben?



Nein.

Ich hatte Dich hier in Beitrag 03 bereits auf ein Programm / einen Quelltext verwiesen, wo diese Vorgehensweise benutzt wird:

https://www.robotrontechnik.de/html/forum/thwb/showtopic.php?threadid=15187

aktueller Link:

http://kc85.info/index.php/download.html?view=download&id=192:picgen20&catid=6


MfG susowa

Dieser Beitrag wurde am 27.12.2024 um 17:22 Uhr von susowa editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
27.12.2024, 16:10 Uhr
mwd



Danke! Muß ich wohl etwas probieren. Ganz klar ist mir das noch nicht. Wo finde ich übrigens HELP-Dateien zu ZAS? Dort sollte man eine komplette Übersicht aller Steuercodes und ESC-Funktionen finden.

Viele Grüße.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
27.12.2024, 17:12 Uhr
susowa




Zitat:
mwd schrieb
Wo finde ich übrigens HELP-Dateien zu ZAS



Das ist das letzte vollständige Archiv mit ZAS 1.6 :

http://kc85.info/index.php/download.html?view=download&id=214:zasv16&catid=35

Die beiden Hilfedateien gelten aber auch für ZAS 1.7.

Das, was Du suchst ist in zasmem.hlp beschrieben, kann u.a. mit dem KC-Commander angeschaut werden.


Zitat:
mwd schrieb
Ganz klar ist mir das noch nicht.



So habe ich auch angefangen :-). Du hast aber einen Vorteil mit einer vorhandenen Quelle zum "verstehen" - das geht nur, wenn man damit selbst etwas macht.


Ich hatte noch ein wichtiges Detail "weggelassen". Der Code im Grundgerät muss verschieblich bleiben, da ZAS bestimmt, wohin er geladen wird. Das steht zwar auch in der HLP aber nicht in rot !

Bei Aufruf von eigenen Unterprogrammen CALL mit F00FH benutzen (Relativer Unterprogrammaufruf für verschiebliche Programme mit UP-Abstand unmittelbar nach Aufruf) und JP ... nicht verwenden. Die absoluten Lade/Speicher-Befehle auf Adressen innerhalb des eigenen Codes sind auch mehr oder weniger tabu, dafür besser den Koppel-RAM verwenden.

MfG susowa

Dieser Beitrag wurde am 27.12.2024 um 19:29 Uhr von susowa editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
27.12.2024, 20:14 Uhr
maleuma



Besser hätte ich das auch nicht erklären können

Vom D004-Prozessor hast Du keinen direkten Zugriff auf Portadressen des Grundgerätes. Du brauchst immer ein Hilfsprogramm im Grundgerät, welches das übernimmt. Und genau für solche Fälle haben wir uns damals das Treibersystem von ZAS ausgedacht.
ZAS bestimmt dabei, auf welcher Adresse im Grundgerät der Treiber läuft. Deshalb muss das verschieblich sein. Und als Programmierer vom D004 greifst Du dann über ESC-Befehle auf die Treiberfunktionen zu.

Bei Fragen, einfach noch einmal hier melden.
--
Mario.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
29.12.2024, 16:00 Uhr
mwd



Freie Speicherbereiche anfordern und Daten bzw. Code dort ablegen funktioniert super. Die Kommunikation über den Koppel-RAM mittels ESC-Funktionen auch. Aber wie schreibe ich vom Grundgerät aus Daten in den Koppel-RAM direkt? Und muß ich das überhaupt, wenn ich nur ein einzelnen Byte übertragen will? Die Funktion, die mittels ESC-U aufgerufen wird, darf sicher keine Register oder den Stack verändern. Gilt das auch für A? Der Druckertreiber z.B. erhält doch das zu druckende Zeichen über A.

Danke für eure Hilfe,
Matthias.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
29.12.2024, 19:03 Uhr
maleuma



Das klingt doch schon einmal ganz gut

ESC-U ist eher nicht die geeignete Variante, denn damit bekommst Du keine Daten zurück. Da müsstest Du für Dein Programm eine Übergabezelle und auch noch ein Handshake-Protokoll vereinbaren, damit des D004-Programm weiß, wenn die Daten verfügbar sind.

Besser geeignet ist ESC-o. Das ist der Aufruf einer Treiber-Funktion. Die Übergabe und Rückgabe von Parametern ist dabei bereits vorgesehen.
Lies Dir am besten die Hilfedatei ZAS4MEM.HLP durch, das geht mit NC2 oder auch mit einem normalen Texteditor. Darin sind die Grundlagen zur Treiberprogrammierung erklärt.

Zum Ausprobieren kannst Du für Deinen Treiber die ID 240 bis 255 (F0..FFh) verwenden. Solltest du den Treiber für die Allgemeinheit veröffentlichen wollen, bekommst Du von mir eine offizielle ID zugeteilt. Damit wollen wir vermeiden, dass sich Treiber gegenseitig beeinflussen oder inkompatibel sind.
--
Mario.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
29.12.2024, 23:44 Uhr
susowa




Zitat:
mwd schrieb
Aber wie schreibe ich vom Grundgerät aus Daten in den Koppel-RAM direkt? Und muß ich das überhaupt, wenn ich nur ein einzelnen Byte übertragen will?



Geschrieben und gelesen wird vom D001 aus in den zur Verfügung stehenden Koppel-RAM-Bereichen mit I/O-Befehlen. Auch ein einzelnes Byte muss so übertragen werden.


Zitat:
mwd schrieb
Die Funktion, die mittels ESC-U aufgerufen wird, darf sicher keine Register oder den Stack verändern.


Du rufst mit ESC-U nicht Dein Programm im D001 auf, sondern eine ESC-Funktion von ZAS. Alles was Dein Programm machen darf, steht in der ZAS-Hilfe. Wenn da nichts steht, darfst Du auch alles machen, was sonst auch in einem D001-Programm gemacht werden darf.
Da mit ESC-U nur Dein UP gerufen wird ohne Parameter, kannst Du auch alle Register ändern, wie Du willst und es muss mit RET zu ZAS zurückkehren.

Für die Parameterübergabe musst Du eine Zelle im Koppel-RAM verwenden, so wie Mario schon schrieb.

Für die Quittierung kannst Du MEMANF auf 0FFAEH verwenden, was ohnehin für so etwas vorgesehen ist. Du ersparst Dir damit bei Deiner Anwendung einen kompletten Treiber zu programmieren. Sieh' Dir das UP "CREADN:" in der genannten Quelle an.

MfG susowa
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
30.12.2024, 22:38 Uhr
mwd



O.k., die Sache mit dem Aufruf einer Treiberfunktion wird langsam. Wenn ich verschieblichen Code aufrufe, dann passiert auch das Gewünschte. Aber ich verstehe nicht, wie in dem Beispiel der Dokumentation (zasmem.hlp) der Wert in USE hochgezählt werden kann. In der INIT-Routine steht ja eine fixe Adresse, deren Inhalt hochgezählt wird. Das kann ja auf irgendeiner Speicheradresse nicht funktionieren. Und in der Tat geht es bei mir auch nicht. Also ich habe ein minimales Treiberprogramm mit ID=240 erstellt und mit DRIVER geladen. Dann steht der Code auch korrekt im Grundgerät, in dem Fall auf Adresse 3700h. Driver /L listet meinen Treiber auch, aber USE ist immer 0. Kann ja auch nicht hochgezählt werden, da der Code ja nicht bei 100h beginnt. Im M052-Treiber z.B. steht das aber auch so drin, und dort funktioniert das. Was mache ich hier falsch?

Grüße,
Matthias.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
30.12.2024, 23:10 Uhr
mwd



Habe die entsprechenden Bytes im Grundgerät ausgelesen. In M052.DRV beispielsweise steht im Ladebefehl LD A,(USE) noch die Adresse 105h. Nachdem der Treiber mit DRIVER geladen ist, steht diese Adresse dann auf 3A05h, also 3A 05 3A im Code, was völlig korrekt ist. Nur bei meinem Treiber klappt das nicht. Da steht nach wie vor die 105h im Ladebefehl, also 3A 05 01.
Dieser Beitrag wurde am 30.12.2024 um 23:12 Uhr von mwd editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
31.12.2024, 11:09 Uhr
maleuma



Der "Trick" besteht darin, die DRV verschieblich zu machen. Dazu wird das PRL-Format benutzt. Dieses enthält nach dem eigentlichen Programmcode noch ein Teil mit den Informationen, welche Adressen umzurechnen sind. Die Umrechnung auf die Adresse, welche tatsächlich benutzt wird, macht DRIVER.COM beim Laden des Treibers.
Bei Verwendung des PRL-Formates kannst Du in deinem Treiber übrigens auch ganz normal mit JP und CALL arbeiten

Das Erzeugen der PRL-Datei macht zum Beispiel der Linker LINK131.COM mit der Option [OP]. Zum Erzeugen der Datei M052.DRV gehe ich wie folgt vor:

Quellcode:
SLRZ80 M052DRV/M
LINK131 M052.PRL=M052DRV.REL [OP,NR]
REN M052.PRL M052.DRV
ERA M052DRV.REL


--
Mario.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
31.12.2024, 22:24 Uhr
mwd



Genau das hat mir noch gefehlt. Jetzt funktioniert alles. Vielen Dank für die Hilfe! Damit erklären sich auch die Daten an Anfang und am Ende der Treiberfiles.
Viele Grüße und einen guten Rutsch,
Matthias.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek