MetaGraph, Version 1.01

Copyright 1994 by Daniel Mahrenholz, Magdeburg

Dokumentation

------------------------------------------------------------------------------

I Allgemeine Information
========================

Dieses Softwareprodukt wurde fr die Untersttzung grafisch orientierter
Anwendungen entwickelt. Es bietet unter Turbo-Pascal 6.0 und Borland(R)-
Pascal 7.0 einen gegenber den Routinen des Borland(R) Graphics Interface
(BGI) abgewandelten Umfang an hochoptimierten Grafikroutinen. Zustzlich
wird das Metafile-Konzept untersttzt, d.h. einmal gezeichnete Grafiken
lassen sich beliebig oft (z.B. zur Wiederherstellung von Fenstern) unter
vernderlichen Clipping-Bedingungen reproduzieren.

II Informationen zu MetaGraph, Version 1.01
===========================================

Die Unit MetaGr, Version 1.01, dient der schnellen Darstellungen von Grafiken
auf VGA-Karten und SVGA-Karten. Sie weist folgende Leistungsmerkmale auf:

 1. Hochoptimierte Grafikroutinen, die speziell auf Rechnern mit geringerer
    Prozessorleistung oder bei Rechnern mit schnellen BUS-Varianten eine
    deutliche Geschwindigkeitssteigerung gegenber der Verwendung von BGI-
    Routinen bewirken.

 2. Zusammenarbeit mit dem Borland(R) Graphics Interface (BGI). Um eine
    optimale Geschwindigkeit zu erzielen, ist ein direkter Zugriff auf die
    VGA-Karte notwendig. Um Fehler der BGI-Routinen zu verhindern, werden
    bei gleichzeitigem Einsatz die durch die BGI-Routinen getroffenen
    Einstellungen der VGA-Karte wiederhergestellt.

 3. Untersttzung des Metafile-Konzepts. MetaGraph ermglicht es, Grafiken
    als Menge von grafischen Objekte zu speichern und dann unter vernder-
    lichen Clippingbedingungen an beliebiger Stelle auf dem Bildschirm
    erneut darzustellen. Dies erhht die Darstellungsgeschwindigkeit durch
    die Vermeidung der Berechnungen seitens der Anwendung und der
    Grafikroutinen.

 4. Untersttzung von SVGA-Karten (800x600x16 Farben). MetaGraph untersttzt
    den hochauflsenden Modus der SVGA-Karten in vollem Funktionsumfang. Das
    Setzen des SVGA-Modus mu von der jeweiligen Anwendung nach der Art der
    SVGA-Karte veranlat werden.

 5. Untersttzung verschiedener Write-Modi. MetaGraph untersttzt die
    verschiedenen Write-Modi der VGA-Karte (normales Zeichnen; XOR-, OR-,
    AND-Verknpfung) in allen Zeichenfunktionen.

 6. Untersttzung virtueller Bildschirme. Durch die Nutzung eines, in der
    Gr-Unit implementierten, flexiblen Speicherverwaltungskonzepts wird die
    Nutzung virtueller Bildschirme, im Rahmen des VGA-Speichers, beliebiger
    Gre ermglicht, d.h. es ist mglich komplexe Bildteile auerhalb des
    sichtbaren Speicherbereiches zu zeichnen um sie dann in den sichtbaren
    Bereich zu kopieren, ohne gleich mit mehreren Bildschirmseiten arbeiten
    zu mssen.

 7. Untersttzung mehrerer Bildschirmseiten. Die Untersttzung mehrerer
    Bildschirmseiten ist ber die Gr-Unit mglich.

 8. Bereitstellung der MetaFile-Funktionen fr externe Funktionen. MetaGraph
    ermglicht es, eigene Prozeduren und Funktionen in das MetaFile-Konzept
    einzubinden, d.h. die Funktionsaufrufe beliebiger FAR-kodierter Routinen
    knnen in einem Puffer gespeichert werden, um sie spter mehrfach zu
    wiederholen.

 9. Untersttzung von DPMI.

MetaGraph, Version 1.01, weist folgende Beschrnkungen auf:

 1. MetaGraph-Programme lassen sich unter Microsoft(R) Windows(TM) 3.x im
    erweiterten Modus fr 386-PC in einem Fenster ausfhren. Dies fhrt
    jedoch zu einer stark reduzierten Ausfhrungsgeschwindigkeit. Des
    weiteren werden die ber die Paletten- und Farbregisterfunktionen ge-
    troffenen Einstellungen ignoriert. Eine Ausfhrung im Fenster ist deshalb
    nicht ratsam.

 2. Die BGI-Routinen arbeitet nicht korrekt mit MetaGraph zusammen, wenn zur
    besseren Ausnutzung des VGA-Speichers die gepackten Gr-Modi oder sonstige
    Nicht-Stndartmodi (s. Dokumentation der Gr-Unit) verwendet werden.


III Technische Informationen
============================

Werden MetaGraph und Graph gleichzeitig verwendet, so ist zu beachten, da
die Routinen bzw. Variablen z.T. gleiche Namen tragen.


III.1 Prozeduren und Funktionen
-------------------------------

 A Metafile-Funktionen
 _____________________


Procedure InitMetaGr;

  Diese Prozedur initialisiert den internen Stack und ermglicht die
  Wiedergabe von Funktionssequenzen. Dafr werden 64KB Heapspeicher
  belegt.

Procedure DoneMetaGr;

  Diese Prozedur gibt den von InitMetaGr belegten Speicherplatz wieder
  frei.

Function GetBuffer(Size: Word):Pointer;

  Diese Funktion initialisiert einen dynamischen Puffer zur Aufzeichnung von
  Funktionssequenzen. Der Parameter Size gibt die Gre des zu reservierenden
  Speicherbereichs an.

Procedure FreeBuffer(Buffer: Pointer);

  Diese Prozedur gibt den vom angegebenen Puffer auf dem Heap belegten
  Speicherplatz wieder frei.

Procedure SetBuffer(Buffer: Pointer);

  Diese Prozedur legt einen ber GetDrawBuffer reservierten Puffer als
  den aktuellen Aufzeichnungspuffer fest. Alle Aufrufe von Zeichenfunktionen
  und ber SaveExt gespeicherte Funktionen werden dann in diesem Puffer zur
  spteren Wiedergabe gespeichert.

Procedure ClearBuffer(Buffer: Pointer);

  Diese Prozedur lscht die im angegebenen Puffer gespeicherten Funktions-
  aufrufe.

Procedure SetMetaState(State: Word);

  Diese Prozedur bestimmt den Aufzeichnungs- und Zeichenmodus. Wird das Flag
  ms_Draw gesetzt, so wird die Zeichenaktion beim Aufruf einer Zeichenfunktion
  ausgefhrt. Wird das Flag ms_Record gesetzt, so wird beim Aufruf der
  Zeichenfunktion der Funktionsaufruf gespeichert. Die Ausfhrung der
  Zeichenaktion ist unabhngig von der Speicherung des Funktionsaufrufs, d.h.
  es knnen auch Grafiken ohne Darstellung aufgezeichnet werden.

Procedure DrawBuffer(Buffer: Pointer);

  Diese Prozedur gibt die im angegebenen Puffer gespeicherten Funktions-
  aufrufe wieder, d.h. die Folge der gespeicherten Funktionsaufrufe wird
  entsprechend der Reihenfolge der Aufzeichnung wiederholt. Bei der Wieder-
  gabe von Grafiken werden die dann gltigen Einstellungen in ClipRect und
  MetaOrigin (Gr-Unit) beachtet.

Procedure GetBufferInfo(B: Pointer; var BufferInfo: TBufferInfo);

  Diese Prozedur gibt in BufferInfo den Zustand des angegebenen Puffers
  zurck.

Function FullBuffer(B: Pointer; Data: Word);

  Diese Funktion gibt true zurck, wenn im angegebenen Puffer noch Data
  Bytes freier Speicherplatz vorhanden sind, sonst wird false zurckgegeben.
  Diese Funktion sollte vor der Aufzeichnung komplexerer Grafiken aufgerufen
  werden um sicherzustellen, da diese Grafiken auch vollstndig gespeichert
  werden Knnen.

Procedure SaveExt; far;

  Diese Funktion ermglicht die Speicherung MetaGraph-fremder (externer),
  FAR-kodierter Prozeduren in den Aufzeichnungspuffer. Bei der Wiedergabe
  ist keine Sonderbehandlung ntig. Das spezielle Aufrufschema diese Prozedur
  ist zu beachten. (s. III.5)

Procedure SetMetaClipRect(x1, y1, x2, y2: Integer);

  Diese Prozedur setzt den bei der Wiedergabe sichtbaren Bildschirmausschnitt.
  Die Einstellungen im MetaClipRect (Gr-Unit) haben bei normalen Zeichen-
  aufrufen keinen Einflu. Zu beachten ist, da die Turbo-Vision-Notation
  verwendet wird, d.h. der Punkt (x2|y2) liegt auerhalb des sichtbaren
  Bereichs.

Procedure SetMetaCliRectR(R: TRect);

  Diese Prozedur setzt den bei der Wiedergabe sichtbaren Bildschirmausschnitt
  auf das bergebene Rechteck.

Procedure SetMetaOrigin(x, y: Integer);

  Diese Prozedur setzt den globalen Bildschirmursprung bei der Wiedergabe von
  MetaFiles, d.h. durch Vernderung des MetaOrigin knnen komplette Grafiken
  bei der Wiedergabe auf dem Bildschirm verschoben werden. Nach dem Aufruf der
  Wiedergabe sollte der MetaOrigin wieder auf den Wert (0|0) gesetzt werden.

Procedure SetMetaOriginP(P: TPoint);

  Diese Prozedur setzt den MetaOrigin auf den bergebenen Punkt.


 B Zeichenfunktionen
 ___________________

Procedure PutPixel(x,y: Integer; Color: Byte);

  Diese Prozedur setzt an der Koordinate (x|y) einen Punkt der Farbe Color.
  Dabei beziehen sich die Koordinatenangaben auf den durch die globale
  Variable DrawOrigin festgelegten Koordinatenursprung, d.h. beim Zeichnen
  werden die DrawOrigin-Werte zu den bergebenen Koordinaten addiert um die
  Bildschirmkoordinaten zu erhalten.

Procedure HoriLine(x1,y1,x2: Integer);

  Diese Prozedur zeichnet eine horizontale Linie zwischen den Punkten (x1|y1)
  und (x2|y1) in der aktuellen Zeichenfarbe im aktuellen Linienstil.

Procedure VertLine(x1,y1,y2: Integer);

  Diese Prozedur zeichnet eine vertikale Linie zwischen den Punkten (x1|y1)
  und (x1|y2) in der aktuellen Zeichenfarbe im aktuellen Linienstil.

Procedure Line(x1,y1,x2,y2: Integer);

  Diese Prozedur zeicnet eine Linie zwischen den Punkten (x1|y1) und (x2|y2)
  in der aktuellen Zeichenfarbe mit dem ber SetLineStyle gesetzten Linienstil
  und -dicke.

Procedure MoveTo(x,y: Integer);

  Diese Prozedur setzt den Zeichencursor an den Punkt (x1|y1).

Procedure MoveRel(x,y: Integer);

  Diese Prozedur verschiebt den Zeichencursor um die in x und y angegebenen
  Werte.

Procedure LineTo(x,y: Integer);

  Diese Prozedur zeichnet eine Linie von der aktuellen Zeichencursorposition
  zum Punkt (x|y) in der aktuellen Zeichenfarbe und dem aktuellen Liniestil.

Procedure LineRel(x,y: Integer);

  Diese Prozedur zeichnet eine Linie relativ zur aktuellen Zeichencursor-
  position in der aktuellen Zeichenfarbe und dem aktuellen Linienstil.

Procedure Bar(x1,y1,x2,y2: Integer);

  Diese Prozedur zeichnet ein, in der aktuellen Fllfarbe und dem aktuellen
  Fllmuster, geflltes Rechteck. Die Punkte (x1|y1) und (x2|y2) geben
  hierbei die beiden gegenberliegenden Eckpunkte des Rechtecks an.

Procedure Rectangle(x1,y1,x2,y2: Integer);

  Diese Prozedur zeichnet ein Rechteck in der aktuellen Zeichenfarbe. Die
  Punkte (x1|y1) und (x2|y2) geben hierbei die beiden gegenberliegenden
  Eckpunkte des Rechtecks an.

Procedure Circle(xm,ym,r: Integer);

  Diese Prozedur zeichnet einen Kreis mit dem Mittelpunkt (xm|ym) und dem
  Radius r in der aktuellen Zeichenfarbe.

Procedure FillCircle(xm,ym,r: Integer);

  Diese Prozedur zeichnet einen, in der aktuellen Fllfarbe und dem aktuellen
  Fllmuster, gefllten Kreis mit dem Mittelpunkt (xm|ym) und dem Radius r.
  Zustzlich wird der Kreis mit einer Umrandung in der aktuellen Zeichenfarbe
  versehen.


 C Palettenfunktionen
 ____________________

Procedure SetPalette(Palette, Color: Byte);

  Diese Prozedur setzt den in Palette angegebenen Paletteneintrag auf die
  Farbe Color.

Function GetPalette(Palette: Byte): Byte;

  Diese Funktion gibt den unter dem angegebenen Paletteneintrag abgelegte
  Farbe als Funktionswert zurck.

Procedure SetPaletteEntry(Palette, Color: Byte);

  Diese Prozedur setzt einen Paletteneintrag in der internen Farbpalette.
  Wird als Palettennummer die Konstante Border bergeben, so wird der
  Farbwert fr die Randfarbe gesetzt.

Function GetPaletteEntry(Palette: Byte): Byte;

  Diese Funktion gibt die Farbe eines Paletteneintrages der internen Farb-
  palette zurck.

Procedure SetPalettes(Palettes: PPalettes);

  Diese Prozedur stetzt einen Block von Paletteneintrgen und die Randfarbe.
  Wird als Zeiger auf die Farbpalette nil bergeben, so wird die interne
  Farbpalette gesetzt.

Procedure GetPalettes(Palettes: PPalettes);

  Diese Prozedur liest einen Block von Paletteneintrgen und die Randfarbe.
  Wird als Zeiger nil bergeben, so werden die gelesenen Daten in die interne
  Farbpalette geschrieben.

Procedure SetRGBColor(Color, R, G, B: Byte);

  Diese Prozedur setzt die Farbkomponenten der angegebenen Farbe auf die Werte
  von R, G und B. Der zulssige Wertebereich fr die Farbkomponenten liegt
  zwischen 0 und 63. Bei greren Farbwerten werden die oberen 2 Bit der
  Komponenten ignoriert.

Procedure GetRGBColor(Color: Byte; var R, G, B: Byte);

  Diese Prozedur ermittelt die Werte der Farbkomponenten der angegebenen
  Farbe und gibt diese zurck.

Procedure SetRGBColorEntry(Color, R, G, B: Byte);

  Diese Prozedur setzt die Farbkomponenten einer Farbe in der internen
  Farbtabelle.

Procedure GetRGBColorEntry(Color: Byte; var R, G, B:Byte): Byte;

  Diese Prozedur ermittelt die Farbkomponenten einer Farbe der internen
  Farbtabelle.

Procedure SetRGBColors(Colors: PColors; Start, Count: Byte);

  Diese Prozedur setzt einen Block von Farbregistern. Ab der in Start ange-
  gebenen Nummer werden Count Farbregister mit neuen Werten belegt. Dabei
  werden die Werte fr die einzelnen Farbkomponenten aus dem mit Colors
  zugewiesenen Speicherbereich ausgelesen. Wird als Adresse der Farbtabelle
  nil bergeben, so werden die Farbwerte der internen Farbtabelle werwendet.

Procedure GetRGBColors(Colors: PColors; Start, Count: Byte);

  Diese Prozedur ermittelt die Farbkomponenten fr einen Block von Farb-
  registern und bertrgt diese in den ber Colors angegebenen Speicher-
  bereich. Ab der ber Start angegebenen Farbregisternummer werden Count
  Register gelesen. Wird als Adresse der Farbtabelle nil bergeben, so
  werden die ermittelten Werte in die interne Farbtabelle bertragen.

Procedure SetBorder(Color: Byte);

  Diese Prozedur setzt die Randfarbe des Bildschirms.

Function GetBorder: Byte;

  Diese Funktion ermittelt die aktuelle Randfarbe.


 D sonstige Funktionen
 _____________________

Function LastError: Byte;

  Diese Funktion gibt den Fehlercode des letzten Fehler zurck.

Procedure SetColor(Color: Byte);

  Diese Prozedur setzt die aktuelle Zeichenfarbe.

Procedure SetFillStyle(FillStyle, Color: Word);

  Diese Prozedur setzt die aktuelle Fllfarbe und das aktuelle Fllmuster.

Procedure SetWriteMode(Mode: Byte);

  Diese Prozedur setzt einen Write-Modus der VGA-Karte.

Procedure ClearDevice;

  Diese Prozedur lscht den kompletten VGA-Speicher.

Procedure ClearPage;

  Diese Prozedur lscht den VGA-Speicher der aktuellen Bildschirmseite.

Function ChMetaParams(Cmd: Word; var Buf): Word;

  Diese Funktion dient als Schnittstelle zur Gr-Unit.


III.2 Typenvereinbarungen
-------------------------

TBufferInfo = Record
		Count: Word;
		Free: Word;
	      End;

  Dieser Record beinhaltet Informationen ber den Zustand eines Zeichen-
  puffers. Er wird durch die Prozedur GetBufferInfo belegt.

TErrorProc = Procedure;

  Soll eine eigene Fehlerbehandlungsroutinen installiert werden, so mu die
  entsprechende Prozedur vom Typ TErrorProc und FAR-kodiert sein.

PColors = ^TColors;
TColors = Array[0..255,1..3] of Byte;

  Die TColors-Struktur beinhaltet die Farbkomponenten einer 256-Farben-
  Farbtabelle.

PPalettes = ^TPalettes;
TPalettes = Array[0..16] of Byte;

  Die TPalettes-Struktur beinhaltet die Informationen einer Farbpalette mit
  16-Paletteneintrgen und einer Randfarbe.


III.3 Konstanten und Variablen
------------------------------

me_xxxx Konstanten (Fehlercodes)
  me_NoError		kein Fehler
  me_Init		zu wenig Heapspeicher zur Initialisierung
  me_Buffer		kein Puffer angegeben oder selektiert
  me_Full		Aufzeichnungspuffer voll
  me_Stack		kein interner Stack initialisiert
  me_Memory		zu wenig Heapspeicher fr einen neuen Puffer

  Tritt bei der Ausfhrung einer Funktion ein Fehler auf, so wird der
  entsprechende Fehlercode in MetaError gespeichert. Bei fehlerfreien
  Ausfhrung einer Funktion wird dieser Fehlercode berschrieben. Der letzte
  aufgetretene Fehler lt sich dann nur noch mit der Funktion LastError
  ermitteln.

  ms_xxxx Konstanten (MetaFile-Flags)
  ms_Draw   		Ausfhrung der Zeichenfunktion beim Aufruf
  ms_Record		Aufzeichnung Prozeduren beim Aufruf
  ms_BGI		Sicherung der BGI-Einstellungen beim Zeichnen
  ms_Execute		Ausfhrung externer Prozeduren beim Aufruf

Write-Modi
  NormalPut		keine Verknpfung beim Zeichnen
  CopyPut		keine Verknpfung beim Zeichnen
  XorPut		Xor-Verknpfung beim Zeichnen
  ORPut			Or-Verknpfung beim Zeichnen
  ANDPut                AND-Verknpfung beim Zeichnen

  Die Konstanten fr die Farben, Liniedicken und -stile entsprechen den
  BGI-Konstanten.

ErrorProc: TErrorProc;

  Diese Variable beinhaltet die Prozeduradresse einer eigenen Fehler-
  behandlungsroutine. Der Fehlercode des aufgetretenen Fehlers wird in
  AX bergeben.

MetaError: Word;

  Diese Variable liefert den aktuellen Fehlerstatus. Sie wird nur von den
  MetaFile-Funktionen verndert.


III.4 Arbeiten mit den MetaFile-Funktionen
------------------------------------------

Um die MetaFile-Funktionen nutzen zu knnen (Speichern von Funktionsaufrufen
und sptere Wiedergabe), mssen einige Vorbereitungen getroffen werden. Als
erstes mu ein Aufruf von InitMetaGr erfolgen, um die interne Speicherver-
waltung zu initialisieren. Als zweites mu dann ein Aufzeichnungspuffer der
gewnschten Gre mit der Funktion GetBuffer(Size) auf dem Heap angelegt
werden. Dieser wird dabei gleichzeitig mit den ntigen Statusinformationen
gefllt. Bei der Angabe der Gre ist darauf zu achten, da diese nicht zu
klein gewhlt wird, da immer 1KB des Pufferspeicher aus Sicherheitsgrnden
bei der Speicherung externer Prozeduren nicht verwendet wird. Werden nur die
MetaGraph-Funktionen verwendet, so wird der Zeichenpuffer vollstndig genutzt.
Nach der Bereistellung des Aufzeichnungspuffers mu dieser mit der Prozedur
SetBuffer(Buffer) zum aktuell gltigen Aufzeichnungspuffer erklrt werden.
Als letztes mssen mit der Prozedur SetMetaState(ms_xxxx) noch die ent-
sprechenden Flags gesetzt werden. Ist das Flag ms_Record gesetz, so wird
jeder folgende Aufruf einer MetaGraph-Funktion im angegebenen Puffer ge-
speichert. Sollen umfangreichere Funktionssequenzen aufgezeichnet werden, so
empfiehlt es sich mit der Funktion FullBuffer(Size) zu testen, ob im aktuellen
Aufzeichnungspuffer noch Size Byte Speicherplatz zur Verfgung stehen. Dabei
ist mit 20 Byte Speicherplatzverbrauch fr die MetaGraph-Funktionen zu
rechnen. Bei externen Prozeduren betrgt der Speicherplatzbedarf 16 Byte zu-
zglich des Speicherplatzes fr die Parameter und die gespeicherten lokalen
Variablen. Bei der Angabe des bentigten Speicherplatzes beim Aufruf von
FullBuffer(Size) ist wieder der 1KB Sicherheitsbereich fr die externen
Funtionsaufrufe zu beachten.
Die Wiedergabe der gespeicherten Funktionsaufrufe erfolgt durch den Aufruf
der Prozedur DrawBuffer(Buffer). Dabei mu der angegebene Puffer nicht dem
aktuellen Aufzeichnungspuffer entsprechen. Vor dem Aufruf vom DrawBuffer
sind wieder die entsprechenden Flags mit der Prozedur SetMetaState(ms_xxxx)
zu setzen. Ist das Flag ms_Draw gesetzt, so werden alle gespeicherten
MetaGraph-Funktionen bei der Wiedergabe ausgefhrt. Bei externen Funktionen
ist das Flag ms_Execute vor der Ausfhrung zu testen. (s. III.5). Das Wieder-
geben der in einem Puffer gespeicherten Funktionsaufrufe kann beliebig oft
wiederholt werden. Wird der Aufzeichnungspuffer nicht mehr bentigt, so
sollte der belegte Speicherplatz mit der Prozedur FreeBuffer(Buffer) frei-
gegben werden.

Zusammenfassung:

  1. Aufruf InitMetaGr zur Initialisierung
  2. Puffer mit GetBuffer(Size) reservieren
  3. Aufzeichnungspuffer mit SetBuffer(Buffer) setzen
  4. Flags mit SetMetaState(ms_xxxx) setzen
  5. zu speichernde Funktionen aufrufen
  6. Wiedergabe mit DrawBuffer(Buffer)
  7. Freigabe des Puffers mit FreeBuffer(Buffer)

III.5 Konventionen zur Speicherung externer Funktionsaufrufe
------------------------------------------------------------

Um eine externe Funktion zu speichern ist nach dem Eintritt in die Routine
der Aufruf von von ExtSave durchzufhren. Dabei sind verschiedenen Fest-
legungen zu beachten. Als erstes ist der Speicherplatzbedarf der lokalen
Variablen auf dem Stack zu bergeben. Danach folgt der Speicherplatzbeadarf
der Prozedurparameter. Als letztes folgt die Angabe darber, wie viel von
den lokalen Variablen vom Stack in den Puffer kopiert werden soll. Die zu
kopierenden lokalen Variablen mssen sich unbedingt als erste lokale
Variablen deklariert sein. Nach dem Ablegen der Parameter ist die ExtSave-
Rountine durch ein FAR-CALL aufzurufen. Dabei ist zu beachten, da der
nchste Befehl nach dem FAR-CALL den neuen Eintrittspunkt, d.h den neuen
Beginn der Funktion darstellt.
Im Register AX ist stets eine stets eine 3 zu bergeben. Die zu speichernden
Routinen sind als FAR zu deklarieren.

Beispiel:

Procedure Test(x,y,z: Word); far;
Var a,b: Word;
Begin
  ASM
  	PUSH	4				(LocalSize)
        PUSH	6				(ParamSize)
        PUSH	0				(Locals to be stored)
 	MOV	AX, 3
  	CALL	[ExtSave]
  END;
  a:=y+z;
  b:=x;
End;

IV  Warenzeichen
================

Microsoft ist ein eingetragenes Warenzeichen der Microsoft Corp., Inc.
Windows ist ein Warenzeichen der Microsoft Corp., Inc.
Borland ist ein eingetragenes Warenzeichen der Borland International, Inc.

