Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » Frage: Programmaufruf mit Parameterübergabe aus BASI heraus... » Themenansicht

Autor Thread - Seiten: -1-
000
07.02.2016, 18:51 Uhr
Klaus



Hallo,

ich hatte ja schon mehrfach erwähnt, dass ich nicht gerade der große Programmierprofi bin und nicht auch noch sinnlose Zeit für ewig lange Internetrecherchen verschwenden will, deshalb frage ich gleich mal hier.
Für mach einen evtl. eine lächerliche Frage:

Kurz zum Plan:
Unter CP/M soll ein kleines Programm (als eine Art Minitreiber für Heikos Farb-BWS-Karte in meinem NANOS) geladen werden.
Irgendwo am oberen Speicherende des TPA.
Danach soll BASI (MBASIC) gestartet werden.
Aus einem BASIC-Programm heraus soll dann (vermutlich mit CALL) auf bestimmte Routinen des kleinen Treibers zugegriffen werden.
Dabei müssen auch Parameter übergeben werden. Ist die Routine beendet gehts dann wieder zurück ins BASIC um dort fortzufahren.

Mal an einem Beispiel:
Angenommen die Treiberroutine COLOR steht auf 0C00h:
Ich würde gern aus Basic heraus die Farbattribute (Zeichenfarbe und Hintergrundfarbe) für ein Zeichen setzen.
CALL COLOR (Zeichenfarbe, Hintergrundfarbe) .... als Parameter

Geht so etwas überhaupt, oder würde das BASI den Bildspeicher gleich wieder überschreiben?
Wie müsste so ein Aufruf in BASIC aussehen?
Wie müssen die Parameter übergeben werden?
Wie müsste der Einsprung und Rücksprung im "Treiber" aussehen?

Falls jemand schon mal so etwas gemacht hat und mir an einem kleinen Beispiel auf die Sprünge helfen könnte, würde ich mich sehr freuen.
Eigentlich geht es vorwiegend um das setzen der Farbattribute (COLOR) und das setzen der Cursorposition (PRINT AT...).

Danke und viele Grüße,
Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
07.02.2016, 21:30 Uhr
Lötspitze



Hallo Klaus, Du hast Post.

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
07.02.2016, 22:04 Uhr
Klaus



Vielen Dank Matthias.

Ich habe nur mal ganz schnell überflogen, aber das ist vermutlich genau das, was ich mir vorstelle.

Viele Grüße
Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
08.02.2016, 13:38 Uhr
Heiko_P



Hallo,

falls es noch jemanden interessiert

Die Übergabe von Parametern ist in den verschiedenen Dokumentationen unterschiedlich und nicht immer leicht verständlich beschrieben. Ich möchte hier - ohne Aspruch auf Vollständigkeit - das von mir praktisch getestete Verfahren vorstellen.

Der Aufruf des Programms erfolgt mit CALL <PROGRAMM> (Parameter1,Parameter2,…)

Die Parameter werden im Basic als INTEGER-Werte definiert und können Variablen zugewiesen werden. Damit können keine Zeichenketten oder Datenfelder übergeben werden. Die Anzahl der zu übergebenden Parameter wird vom Basic nicht übermittelt. Der Programmierer muss dafür sorgen, dass die Anzahl der von Basic übergebenen und vom aufgerufenen Programm erwarteten Parameter übereinstimmen, anderenfalls entstehen Fehler die vom Basic nicht gemeldet werden.

Die Übergabe der Parameter erfolgt mittels Zeigern auf ein Datenfeld, in dem der jeweilige Parameter als Gleitkommazahl gespeichert ist. Bei der Übergabe von 1 bis 3 Parametern befinden sich die Zeiger in den Registern HL (1. Parameter), DE (2. Parameter, falls vorhanden) und BC (3. Parameter, falls vorhanden). Bei der Übergabe von 4 und mehr Parametern wird in BC eine Adresse übermittelt, die auf eine Liste zeigt, in der die Adressen der Parameter 3 bis n zu finden sind.

Die Umwandlung der Gleitkommazahl aus dem Datenfeld in einen 16 Bit Binärwert kann mittels des folgenden Programmschnipsels erfolgen:


Quellcode:

        ;
        ; BASI-Parameter in Binaerwert konvertieren
        ; INP:        HL = Zeiger auf Datenfeld
        ; OUT:        HL = Parameter
        ;
bkonv:  push de
        inc hl        ;erstes Byte ueberspringen
        ld e,(hl)
        inc hl
        ld a,(hl)
        or 80h
        ld d,a
        inc hl
        ld a,(hl)
        and 7Fh       ;erstes Bit maskieren
        jr nz,bkon1   ;und Test auf 00
        ld hl,0
        jr bkon3
bkon1:  ld b,a        
        and a         ;CY ruecksetzen
        ld hl,0
bkon2:  rl e          ;Byte ueber CY schieben
        rl d
        rl l
        rl h
        djnz bkon2
bkon3:  pop de
        ret
        ;



Gruß
Heiko

Dieser Beitrag wurde am 08.02.2016 um 13:38 Uhr von Heiko_P editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
08.02.2016, 20:15 Uhr
Klaus



Danke Matthias, Danke Heiko.

Mal sehen, was daraus wird.
Rest per Mail...

Viele Grüße,
Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
20.02.2016, 19:46 Uhr
Klaus



Hallo,
nur nochmal ganz kurz zur Info.
Dank der Hilfe von Heiko und Matthias, habe ich es jetzt soweit hinbekommen, dass ich folgende Aufrufe mit Parameterübergabe in BASI machen kann:
....
ZF=Zeichenfarbe (Integer-Wert 0...15)
CALL INK (ZF)
HF=Hintergrundfarbe (Integer-Wert 1...15)
CALL PAPER (HF)
X=Zeile (Integer-Wert 0...79)
Y=Zeile (Integer-Wert 0...23)
CALL PRINTAT (X,Y)
....
Natürlich muss ein ganz kleiner Minitreiber geladen werden, bevor BASI und das BASIC-Programm gestartet wird.
Der Minitreiber übernimmt die Parameter (bei mir bis max.3) und springt dann die einzelnen Routinen an, um am Ende die entsprechenden Ausgaben (Farbe, Position) über BDOS-Aufrufe zu machen.
Voraussetzung ist dabei natürlich, dass die CONOUT-Routine im BIOS um die Möglichkeit der Farbdarstellung mit Heikos Farb-BWS-Karte erweitert wurde.

So kann dann z.B. eine Darstellung von Farben im BASI (MBASIC) unter CP/M (mit Heikos BWS-Karte) aussehen.



Nochmals vielen Dank für die Hilfe.
Viele Grüße,
Klaus
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