4. CALL/FUNC

Aus CBMPET.DE

Wechseln zu: Navigation, Suche
4. CALL/FUNC

4.1 Übersicht

LOS-96 bietet eine Schnittstelle zu 'fremden'
Maschinenprogrammen, die dann über Namen vom Interpreter
gerufen werden. Die LOS residente Schnittstelle ist sehr
einfach: Empfängt der Interpeter das Wort (Token) 'CALL'
oder 'FUNC', so springt er über den Vektor in 1507/1508.

Der CALL-Handier wird dadurch angesprungen, sofern er
geladen ist. Er sieht in der Tabelle, die durch den
Vektor in 1510/1511 definiert ist, nach, ab der hinter
CALL oder FUNC angegebene Name vorhanden ist, und springt
im Ja-Fall auf die angegebene Adresse. Im Nein-Fall wird
noch versucht, den Namen in einer REM-Zeile zu finden,
die dann die Maschinenrautine enthält. Wird auch dort der
Name nicht gefunden, wird UNDEF'D FUNCTION ERROR
gemeldet.

Da sich diese Beschreibung nur an erfahrene
Assembierprogrammierer richtet, bitten wir Sie, anhand
des auf der Diskette enthaltenen Demos die einzelnen
Eigenschaften nachzuvollziehen, wenn Sie selbst
Erweiterungen schreiben und ankoppeln wollen.

4.2 Die Tabelle

CALL bzw. FUNC ruft ein Maschinenprogramm über einen
Namen auf. Die Namen und Einsprungadressen der Programme
stehen in Tabellen.

Die Tabelle ist folgendermaßen aufgebaut: Im ersten Teil
der Tabelle stehen die Adressen der Routinen und
Untertabellen, im zweiten Teil die dazugehörigen Namen.
Die Eintragungen in der Adresstabelle können länger als
zwei Bytes sein. Die Länge einer Eintragung steht im
zweiten Byte der Tabelle. Die ersten beiden Bytes einer
Eintragung werden als Startadresse verwendet. Beim Aufruf
des Maschinenprogramms zeigt (31/32) in die Tabelle auf
das Low-Byte der Sprungadresse.

Eine Tabelle kann mehrere Untertabellen besitzen. Die
Untertabellen sind genauso aufgebaut, wie die
Haupttabelle.

Sie werden nur durchsucht, wenn der aufgerufene Name in
den ersten Zeichen mit dem Namen der Untertabelle
übereinstimmt. Wenn die Untertabelle auf jeden Fall
durchsucht werden soll, wird kein Name für die
Untertabelle angegeben. Eine Untertabelle kann wieder
Untertabellen enthalten.


Byte         Inhalt

0            0 = Offset zur Namenstabelle
1            L = Länge einer Eintragung in der
             Adreßtabelle
2...L+l      erste Adresse
.
.
.
0 ... 0+11-1 erster Name (Länge 11)
0+11         Endezeichen (s.u.)
.
.
.
0            Tabellenende


Endezeichen:

Jeder Name in der Tabelle muß durch ein Endezeichen
begrenzt werden:
  __________________________________________________________________________
EndezeichenBedeutung

1          Aufruf als CALL
2          Aufruf als FUNC
3          Namen nicht berücksichtigen (z.B. Programm
           nicht geladen)
4          Untertabelle


4.3 Aufruf von CALL oder FUNC vom Betriebssystem

Beim Erkennen eines CALL in der Interpreterschleife oder
FUNC in der Formelauswertung setzt der Interpreter die
Zelle 94 auf 1 (bei CALL) bzw. 2 (bei FUNC) und springt
auf die CALL-Routine über den Vektor (1507/1508).

Beim Start des Systems zeigt dieser Vektor auf SYNTAX
ERROR, so daß bei nicht geladenem CALL-handler kein
Absturz möglich ist.

Der Tabellenvektor (s.o.) zeigt beim Start auf eine
Zelle, die 0 enthält. Damit wird bei nicht geladener
Tabelle, aber geladenem CALL-Handler nur nach REM-
Routinen gesucht.


4.4 REM-Routinen

Der Interpreter akzeptiert hinter REM jedes Byte mit
Ausnahme von 0 (Zeilen-ende). Diese Eigenschaft kann man
nutzen, um kurze (max 250 Bytes) Maschinenprogramme
direkt ins BASIC-Programm zu schreiben, wodurch weitere
Nachladevorgänge und Platzreservierungen überflüssig
sind.

Da REM-Routinen in der Regel verschiebbar sein müssen,
dürfen keine absoluten Sprünge (JMP, JSR auf diese oder
andere REM-Routinen und keine Lade- oder Speicherbefehle
auf denBereich des BASIC-Programms vorhanden sein.

REM-Routinen unterhalb von 32768 (nach unten verlängerter
PRG-Bereich) werden direkt ausgeführt, solche von
oberhalb 32766 (Normalfall) werden vom CALL-Handler in
den Input-Buffer (Page 2) kopiert und dann ausgeführt. Im
Direktmodus erfolgt in solchen Fällen ILLEGAL DIRECT
ERROR.

Wenn REM-Routinen immer oberhalb von 32768 stehen, können
Sie direkt für die zweite Page assembliert werden und
dann absolute Sprünge und Speicherzugriffe auf sich
selbst enthalten.

REM Routinen müssen unmittelbar nach dem REM-Token den
Namen enthalten. Der Name kann ein Token sein oder Token
enthalten.
  __________________________________________________________________________
System- und Beispielprogramme

Zusätzlich zu den beiden unbedingt nötigen Programmen
(unterstrichen) sind auf der LOS-Diskette noch einige
kleine Hilfsprogramme, die nebenbei einige der neuen
Programmiermöglichkeiten zeigen.

Zuerst ein Überblick über die Diskette-

0 "los-96/sm/010182" hg 2c
1 91 "los96.......110m" prg Betriebssystem-Objektcode
2  5 "start-catal.cv0p" prg Catalog$-Demo als
Startprogramm
3  4 "start/call..culp" prg Lader für CALL-Option
4  2 "call.e65169.cu0m" prg CALL-Objektcode
5  1 "tab.e32614..cu0m" prg Demo für CALL/FUNC
6  3 "zeiger-monitcv0p" prg zeigt die eingestellten
Speicherbereiche
7  3 "cs(catal-screen)" prg Bildschirmprogramm für
Catalog im Direktmodus
8  2 "fehlercodes.ct0p" prg druckt Fehlermeidungen mit
EC/EO - Codes
9  2 "prg-untergrenze" prg Programm-Untergrenze verändern
  1939 blocks free.

1)     Das Betriebssystem sollte immer als erste Datei im
Directory stehen, um den einfachen Start durch SHIFT/RUN
zu ermöglichen.

2) Ein ganz brauchbares Directory-Druck-Programm, das die
Anwendung von CATALOG$ zeigt.

3/4/5) Wenn die CALL-Option verwendet werden soll, muß
das Programm (4) auf der Diskette sein. (3) lädt die
Option in den dafür vorgesehenen Speicherbereich an der
Obergrenze des Programmbereiches und reserviert den
benötigten Platz vor BASIC. Als Beispiel lädt (3) eine
kleine DEMO-Erweiterung, die für Interessierte das
Prinzip verdeutlichen kann (s. dazu die CALL-
Beschreibung):

func f1 (3)
6
? func f2 (3)
1.5
call hl
hl
call h2
h2

6) zeigt die aktuelle Einstellung des Programm- und
Variablenbereiches

7) da CATALOG$ im Direktmodus etwas unhandlich ist, wurde
dieses kleine Programm auf den Bildschirm geschrieben. Es
wird durch

load ¶32768,"cs*

direkt in den Bildschirm geladen, ohne Programm und
Variable zu beeinflußen (mit Ausnahme von A$( und A$

In der zweiten Bildschirmzeile stehen alle Parameter von
CATALOG$. Ändern Sie die Vorgaben, wie gewünscht und
drücken Sie zweimal RETURN. Nach kurzer Zeit erscheint
das Directory im Bildschirm. Falls ein langes Directory
zu schnell durchläuft, drücken Sie nach dem Ende einfach
nochmal RETURN.

8) Dieses kleine Programm druckt alle Fehlercodes mit EC
und EO auf Bildschirm oder Drucker.

9) Mit diesem Programm können Sie die PRG-Bereich-
Untergrenze verändern. Zwei benötigte Absicherungen sind
in diesem Programm enthalten, die dritte fehlt: wenn der
Programmbereich unterhalb von 32768 beginnen soll, muß
gefragt werden, ob der Variablenbereich (42/43) nicht
auch schon unterhalb beginnt.
Persönliche Werkzeuge