Messagepipeline Da Capo <-> CyPress
===================================

Hier ist ein kleiner berblick ber die von CyPress und Da Capo verwendete 
1st-Base-kompatible Messagepipeline. Nheres kann man auch dem 
Beispielprogramm 1B_PIPE.C entnehmen, welches als Programm oder Accessory 
luft.

Die Adressverwaltung mu 4 verschiedene Messagetypen erkennen und verarbeiten 
knnen. Es mu in jedem Fall eine Antwort abgeschickt werden.


1. Allgemeiner Init $1A00 (Abfrage der Programmversion)
   ----------------------------------------------------

    +--------------------------+--------------------------------+
    | Input                    | Output                         |
    +--------------------------+--------------------------------+
    | Message_buf [0] = $1A00  | Message_buf [0]   = n.a.       |
    | Message_buf [1] = ACC-ID | Message_buf [1]   = PRG-ID     |
    | Message_buf [2] = PRG-ID | Message_buf [3]   = instcode   |
    |                          | Message_buf [4/5] = versionptr |
    +--------------------------+--------------------------------+

ACC-ID:     Die ID von Da Capo.
PRG-ID:     Die ID von CyPress. (An das die Antwort geschickt werden mu)
instcode:   >= Null bedeutet Da Capo fehlerfrei initialisiert.
            <  Null knnen diverse Fehlermeldungen sein.
versionptr: Pointer auf die Programmversion.
n.a.:       nicht ausgewertet.

WICHTIG:  ber den Version ptr wird nachgeprft, welches Programm (bis jetzt 1ST-
ADDRESS und 1ST-BASE) installiert wurde. Vor dem Pointer, der ja nur 
auf eine Versionsnummer zeigt, steht der Name des Programmes. Bei 1ST-BASE 
sieht das folgenderweise aus: "1ST-BASE  V1.00-D" (Zeiger zeigt auf das 
'V').

Anmerkung: Gegenwrtig mu der Eintrag "1ST-BASE  V1.00-D" sein, da das 
Accessory sonst von CyPress nicht als 1st-Base kompatible Adressverwaltung 
erkannt wird.


2. Abfrage wichtiger Systemadressen $1B00
   ---------------------------------------

    +-------------------------------+-----------------------------+
    | Input                         | Output                      |
    +-------------------------------+-----------------------------+
    | Message_buf [0] = $1B00       | Message_buf [0]   = n.a.    |
    | Message_buf [1] = ACC-ID      | Message_buf [1]   = PRG-ID  |
    | Message_buf [2] = PRG-ID      | Message_buf [2]   = ACC-ID  |
    | Message_buf [3] = file-Nummer | Message_buf [3]   = errcode |
    |                               | Message_buf [4/5] = infoptr |
    +-------------------------------+-----------------------------+

ACC-ID:   Die ID von Da Capo.
PRG-ID:   Die ID von CyPress. (An das die Antwort geschickt werden mu)
file-Nr:  Nummer der Tabelle, Klemmbrett = 0, Erste Datei = 1, usw.
errcode:  -1 = Tabelle existiert nicht.
           0 = OK, Tabelle nicht selektiert.
           1 = OK, Tabelle selektiert.
infoptr   Pointer auf 2 Langworte:
          msk-len   Anzahl der Symbole
          msk-addr  Pointer auf die Symboltabelle (Feldbezeichner) z.B. 
          "Name","Vorname",...
n.a.      nicht ausgewertet.

Anmerkung: Die Symboltabelle hat einen speziellen Aufbau: 1 Lngenbyte 
(entspricht der Lnge des folgenden Eintrages ohne NULL-Byte, also strlen), 
das Symbol selbst und als Abschlu ein (berflssiges) NULL-Byte, also z.B. 
'5','F','i','r','m','a','\0'... Da Capo untersttzt nur eine Tabelle, d.h. 
die Symbole in CyPress lauten "1:Firma", "1:Nachname" usw.


3. ersten Datensatz holen $1B09 (search first)
   -------------------------------------------

    +-------------------------------+-----------------------------+
    | Input                         | Output                      |
    +-------------------------------+-----------------------------+
    | Message_buf [0] = $1B09       | Message_buf [0]   = n.a.    |
    | Message_buf [1] = ACC-ID      | Message_buf [1]   = PRG-ID  |
    | Message_buf [2] = PRG-ID      | Message_buf [2]   = ACC-ID  |
    | Message_buf [3] = file-Nummer | Message_buf [3]   = retcode |
    | Message_buf [4] = sel-type    | Message_buf [4/5] = recptr  |
    | Message_buf [5] = delm1/subst |                             |
    | Message_buf [6] = delm2/subst |                             |
    +-------------------------------+-----------------------------+

ACC-ID:   Die ID von Da Capo.
PRG-ID:   Die ID von CyPress. (An das die Antwort geschickt werden mu)
file-Nr:  Nummer der Tabelle, Klemmbrett = 0, Erste Datei = 1, usw.
sel-type  0 = aktuelle Liste, nur angewhlte Datenstze
          1 = aktuelle Liste, nur nicht angewhlte Datenstze
          2 = alle Datenstze in aktueller Liste
          3 = Gesamtliste
delm1     (high-byte) normale Feldtrennung.
(subst1)  (low-byte) Ersatzzeichen, falls innerhalb von Feldern vorhanden.
delm2     (high-byte) Mehrfachfeldtrennung.
(subst2)  (low-byte) Ersatzzeichen, falls innerhalb von Feldern vorhanden.
retcode:  -1 = kein Datensatz gefunden.
          Sonst Anzahl der Datenfelder.
recptr    Pointer auf Datensatz (0 - terminiert)
n.a.      nicht ausgewertet.

delm1 ist ',' und subst1 ist ';' delm2 und subst2 werden nicht verwendet


4. nchsten Datensatz holen $1B0A (search next)
   --------------------------------------------

    +-------------------------------+-----------------------------+
    | Input                         |                             |
    +-------------------------------+-----------------------------+
    | Message_buf [0] = $1B0A       | Message_buf [0]   = n.a.    |
    | Message_buf [1] = ACC-ID      | Message_buf [1]   = PRG-ID  |
    | Message_buf [2] = PRG-ID      | Message_buf [2]   = ACC-ID  |
    | Message_buf [3] = file-Nummer | Message_buf [3]   = retcode |
    | Message_buf [4] = sel-type    | Message_buf [4/5] = recptr  |
    | Message_buf [5] = delm1/subst |                             |
    | Message_buf [6] = delm2/subst |                             |
    +-------------------------------+-----------------------------+

ACC-ID:   Die ID von Da Capo.
PRG-ID:   Die ID von CyPress. (An das die Antwort geschickt werden mu)
file-Nr:  Nummer der Tabelle. Klemmbrett = 0, Erste Datei = 1, usw.
sel-type  0 = aktuelle Liste, nur angewhlte Datenstze
          1 = aktuelle Liste, nur nicht angewhlte Datenstze
          2 = alle Datenstze in aktueller Liste
          3 = Gesamtliste
delm1     (high-byte) normale Feldtrennung.
          (low-byte) Ersatzzeichen, falls innerhalb von Feldern vorhanden.
delm2     (high-byte) Mehrfachfeldtrennung.
          (low-byte) Ersatzzeichen, falls innerhalb von Feldern vorhanden.
retcode:  -1 = kein Datensatz gefunden.
          Sonst Anzahl der Datenfelder.
recptr    Pointer auf Datensatz (0 - terminiert)
n.a.      nicht ausgewertet.

WICHTIG:  Die Befehle Search_first und Search_next mssen fr jede Datei 
getrennt bearbeitet werden, da CyPress durchaus folgendes machen knnte:
          - Search first auf alle Dateien 1,2,3,...
          - Search next auf 1
          - Search next auf 1
          - Search next auf 3
          - Search next auf 1
          - Search next auf 1
          - Search next auf 3
          - usw.

1992/93, Sascha Ldemann und Francisco Mendez
