home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 2002 January / STC_CD_01_2002.iso / APP / TRAIL_PG / GEMJING / GEMJ136.LZH / Develop / GEMJING.C < prev    next >
Text File  |  2000-06-01  |  34KB  |  1,165 lines

  1. /*
  2.   GEMJing
  3.   (c) by Götz Hoffart, Rheinstetten. Alle Rechte vorbehalten.
  4.   E-Mail: Götz Hoffart @ FR (MausNet)
  5.           goetz@hoffart.de (Internet)
  6.   Web:    http://www.hoffart.de/
  7.           http://www.nogfradelt.de/
  8.  
  9.   V.0.1₧:    24.07.96        o erste Version
  10.   V.0.2₧:r    28.07.96        o Abspielen läuft per VA_START
  11.   V.0.3₧:    29.07.96        o Abspielen per Fileselektor
  12.                                 o mehr Sicherheitsabfragen
  13.   V.0.4:r    19.08.96        o Infodialog wg. Problemen wieder raus
  14.                                 o zusätzliche MiNT/MagX-Cookie-Abfrage wg. Mxalloc-Speicherschutzbits
  15.                                 o Kommandozeilenoption "-q" wird unterstützt (wg. Texel)
  16.   V.0.5:        20.08.96        o Stellt auf Thomas' Wunsch hin bei Parameter -mq keine Menüzeile mehr dar
  17.   V.0.51:r    24.08.96    o Testet nun auch auf argv[1], nicht nur auf [2] :-)
  18.                               Führte unter Nicht-MagiCMac auf 68040 zu Bomben.
  19.   V.0.52₧:    25.08.96        o Supexec() statt Super()
  20.                                 o Fxattr(), wenn vorhanden, für Dateilängenermittlung
  21.   V.0.53:    28.08.96        o Was einem unter MagiCMac nicht auffällt: gab's da doch tatsächlich einen Adre₧-
  22.                                     fehler auf non-MagiCMac-Systemen (vergessen, eine Zeile auszukommentieren). Ab
  23.                                     jetzt wird auch auf einem 520ST getestet, versprochen - er läuft wieder.
  24.   V.0.53:    29.08.96        o statt wind_update() gibt's nun menu_ienable().
  25.   V.0.60:r    31.08.96        o Grö₧ere Überarbeitung
  26.                                 o kein "-mq" mehr (wird von "-q" erledigt),
  27.                                 o kein VA_START mit "-q" mehr
  28.                                 o 6.5kB Speicher gespart (Malloc() statt calloc()).
  29.                                 o Bei "-q" Übergabe keine AES/GEM-Anmeldung mehr, kein rsrc_load etc.
  30.   V.0.61:r    04.09.96        o Neue EMail-Adressen
  31.                                 o -q bei VA_START geht wieder (kürzer),
  32.                                 o NULL bei VA_START wird abgefangen.
  33.   V.0.64:r    17.09.96        o Aktive Unterstützung von WeirdMac 0.64
  34.                                 o dadurch freie Samplefrequenzwahl
  35.                                 o etwas toleranter gegenüber fehlerhaften Windows-WAVEs
  36.                                 o zusätzliche Abfrage auf Cookie von MSND und WeirdMac drin wegen
  37.                                     seltsamen Verhaltens der beiden
  38.   V.0.65:r    18.09.96        o nun gibt's Alert-Fehlermeldungen, wenn das Auswählen des Samples
  39.                                     per Fileselector erfolgte (und nur dann!).
  40.                                 o 0,5kB Speicher gespart
  41.   V.0.66: 18.09.96        o GEMJing gibt bei Start per Kommandozeile mit Option -q nun einen
  42.                                     Returncode zurück (siehe GEMJing-Returnmessage).
  43.                                 o etwas Speicher gespart
  44.   V.0.67:r    01.10.96        o totale interne Umstrukturierung :-)
  45.                                     Vorteile: leichte(re)s Einbinden neuer Formate, schnellere Laderoutine
  46.                 03.12.96        o McSn wird auch dann benutzt, wenn HSND da ist.
  47.                 10.12.96        o StIc-Unterstützung
  48.                 21.12.96        o neue Kommandooptionen:
  49.                                     -d x    Delay von x Sekunden zw. wiederholten Samples
  50.                                     -r x    Repeat x-mal
  51.                 30.01.97        o endlich blöden Bug bei der Hardwareerkennung gefunden. Dank an Holger
  52.                                     Weets für das Drängen und Anders Henke für den sinnlosen Anruf.
  53.   V.0.69r    20.02.97        o -r und -d funktionieren jetzt endlich /richtig/
  54.                 26.02.97        o VA_START-Bug beseitigt
  55.   V.0.70r    27.02.97        o GEMJing ist 8kB kleiner und braucht 7kB weniger RAM
  56.                 04.03.97        o statt GEMJING.RSC wird gemjing.rsc geladen
  57.   V.0.71r    08.03.97        o TT-Abspielbug beseitigt, PSG
  58.                                 o GEMJing spielt auf dem Hades060: CETiK 97 Edition!
  59.                                 o menu_register-Abfrage geändert  
  60.                                 o erste Version auf der Homepage
  61.   V.0.72        11.03.97        o Vorbereitungen für HSN und SMP-Samples
  62.                                 o statt GEMJING.HYP wird gemjing.hyp geladen
  63.   V.1.00r    24.03.97        o erste über ASH veröffentlichte Version
  64.   V.1.01        23.04.97        o Englische Version :-)
  65.   .            13.05.97        o sleep als evnt_timer-Ersatz für TTP-Start
  66.   .            17.05.97        o GEMScript, Versuch Nummer eins
  67.   V.1.02        18.05.97        o GEMScript, Kommando "OPEN" wird theoretisch verstanden
  68.                                 o OLGA-Server-Funktionalität eingebaut
  69.                                 o appl_getinfo -> shel_write(9, ...) für AP_TERM
  70.                 22.05.97        o OLE_EXIT eingebaut
  71.   V.1.03r    02.06.97        o OLGA-Manager sollte nun auch unter MultiTOS & Co. nachgestartet werden
  72.                                 o einige Verschlankungen: geringerer Speicherverbrauch
  73.                 12.06.97        o GS_COMMAND korrigiert, dank Alexander Bartons "GS-Test"
  74.                 27.06.97        o böser Bug bei OLGA-Initialisierung raus -
  75.                                     dank Olivier Booklage
  76.                 15.07.97r    o kleinere Änderungen (Info-Dialog: Internet-Adresse)
  77.     V.1.04    28.07.97        o GEMScript R.008 wird unterstützt.
  78.                                 o GEMScript-Kommando "QUIT" wird unterstützt.
  79.                                 o Bug bei Kommandozeilenübergabe bei SingleTOS raus (Dank an Peter Melzer)
  80.                 30.07.97        o SCCS-Kennung eingebaut
  81.                 03.08.97        o GS_INFO-Extension korrigiert
  82.                 06.08.97        o Nullpointerkorrekturen: msg[3], msg[4]
  83.                 07.08.97₧    o WDIALOG-Routinen rausgeworfen, sie werden nicht
  84.                                   mehr benötigt.
  85.                 09.08.97        o AP-Term-Anmeldung korrigiert
  86.                                 o Mfree am Ende des Spielens
  87.                 11.08.97₧    o paar Bytes kleiner
  88.                                 o Es wird nun unter N.AES und MagiC per Fselect gewartet,
  89.                                   unter SingleTOS mit sleep.
  90.                 29.08.97        o AV_SENDKEY eingebaut
  91.     V.1.05    04.10.97        o Neuss-Messe-Release in den Sprachen:
  92.                                   Deutsch, Englisch, Französisch, Spanisch,
  93.                                   Japanisch, Fidschi, Bishlamaro, Esperanto,
  94.                                   Latein.
  95.     V.1.06REL15.10.97        o Versionsnummer wird direkt in den Dialog
  96.                                   eingetragen
  97.                                 o Abbruchmöglichkeit während Delay
  98.                                 o Türkisch, Italienisch, Philippinisch
  99.                                 o Env.var. GEMJINGPATH
  100.                 17.10.97        o Bugfixes bei AVR stereo
  101.                 28.10.97        o AV_STARTED direkt nach Umkopieren des Strings versenden
  102.     V.1.10    97-12-01        o Shared-Lib-Versuch ("Ping-Lib" :-)
  103.                                 o WAV-Einleseroutine chunkfester gemacht,
  104.                                   klappt ganz gut
  105.                                 o GS_COMMAND-Code korrigiert, dank an Manfred Lippert
  106.     V.1.20    98-03-17        o OLGA-Manager wird nicht mehr nachgestartet
  107.                                 o -m-Parameter
  108.                 98-03-18        o GEMScript-Kommando MEMORYPLAY
  109.                                 o AV_STARTED wird jetzt nach dem Abspielen verschickt, wg. "-m".
  110.     V.1.21    98-03-31        o Kleinigkeiten geändert, Beta-Release
  111.     V.1.25    98-04-04        o Neuss-Messe-Version
  112.     V.1.26    98-04-10        o Parameter -p (CLI) eingebaut: keine Menüzeile mehr, aber AES. Für Holger Weets.
  113.     V.1.30    98-05-25        o o minor bugfixes (Falcon/MSND playing code)
  114.                         o updated documentation
  115.             98-05-29    o SMP: stupid bug found and removed. Thanks to Thorsten Otto.
  116.    V.1.33   99-01-27        o GEMJing trötet auch mit Liberty respektive Freedom 2
  117.                                o Fileselektorbug mit alten SingleTOSsen hoffentlich behoben
  118.     V.1.34    99-02-28        o Dudelt jetzt auch mit den StarTrack-Frequenzen, CETiK-Edition
  119.     V.1.35    99-03-07        o Release mit Texel 2.20. Freedom2-Workaround erstmal wieder ausgebaut
  120.     V.1.36   00-06-01    o Lizenz von Freeware auf Cat PL geändert, siehe Doku.
  121.                                 o neuer Kommandozeilenparser von Dimitri Junker eingebaut
  122. */
  123.  
  124.  
  125. /*
  126.    
  127.    Allgemein gilt: Dieser Code ist alt. Uralt. GEMJing fu₧t auf einem Programm
  128.    namens PCM-Play, das ich (GH) in GFA-Basic anno 1991 schrieb, um auf meinem
  129.    MegaSTE DMA-Qualität bei der Sampleausgabe zu erhalten. Das Programm wurde
  130.    dann in MaxonPascal umgeschrieben, nach TurboC portiert, nach PurePascal
  131.    portiert und wieder zurück nach PureC. Da beginnt die Versionszählung, die
  132.    oben aufgeführt ist. Dementsprechend sieht der Code aus.
  133.   
  134.    Und nein, Steve Maguire kannte ich damals ganz offensichtlich noch nicht.
  135.    
  136.    Stellen, die ein "XXX" im Kommentar tragen, weisen darauf hin, da₧ hier
  137.    entweder ein Bug sitzt oder vermutet wird, oder da₧ daran nochmals gearbeitet
  138.    werden mu₧.
  139.    
  140.     gemjing.c        Hauptprogramm mit der Oberfläche
  141.     gemjing.h        zugehörig
  142.     jingle.c            die eigentlichen Sample- und Konvertierroutinen, oberflächenlos
  143.     jingle.h            Definitionen, die sowohl gemjing.c als auch jingle.c kennen müssen
  144.     jingein.h        jingle.c-interne Definitionen
  145.     snd.h                erweiterte Sounddefinitionen
  146.     
  147.     16to8.c            Code von Dirk Haun (danke, da₧ ich ihn mitveröffentlichen darf, Dirk),
  148.                         um eine qualitativ bessere 16 Bit nach 8 Bit Wandlung vorzunehmen.
  149.  
  150.     data.bin            Sprungtabelle, um gepackte Daten zu dekodieren, siehe jingle.c und
  151.                         suche nach "lookup". Leider scheint die Tabelle falsch zu sein,
  152.                         denn das Entpacken funktioniert hinten und vorne nicht. Oder ich war
  153.                         blind.
  154.     data.h            Die Lookup-Tabelle als C-Include.
  155.  
  156.     samrouts.s        Die Assembler-Routinen von Jörg Hahne, um auch auf'm ST sauber
  157.                    abzuspielen. Dank der hervorragenden Qualität von Jörgs Code
  158.                    läuft das ganze ohne Änderungen auch auf dem Hades und anderen
  159.                    Clones, die PSG-Sound anbieten.
  160.     samtab.i            Die Sprungtabellen für samrouts.s als Include-File.
  161.                         (Anmerkung: samrouts.s und samtab.i sind von mir (GH) nachbearbeitet.
  162.                         Die Originalsourcen von Jörg stecken in samrouts.src (TurboAss).)
  163.     samrouts.h        Definitionen
  164.  
  165.     portabn.h        Eigene PORTAB.H-Definition, angelehnt an GEISS/GEISS.
  166.                         Muss im INCLUDE-Ordner liegen!
  167.     error.h            Need to say more?
  168.     olga.h            OLGA-Konstanten
  169.  
  170.  
  171.     Bekannte Unzulänglichkeiten und Fehler, die sonst nirgends dokumentiert
  172.     sind:
  173.  
  174.     - Spielt nicht mit Liberty 2 / Freedom 2. Liegt IMO an Freedom. Ein
  175.       Workaround ist aber nicht trivial, da die Cookie-Abfrage-Logik ge-
  176.       ändert werden mü₧te. Das ist aber heikel ...
  177.     - Unzureichender GEMScript-Code, da er nur mit einem Akteur funktioniert.
  178.     - Parameterübergabe mü₧te dringend renoviert werden. Die Arbeit habe
  179.       ich mir ewig gespart, da ich an einer MagiC-Shared-Library-Version
  180.       von GEMJing gearbeitet habe, die all den Kram nicht mehr braucht.    
  181.  
  182.    Götz Hoffart, 21.5.2000
  183.    
  184. */
  185.  
  186.  
  187. /*----------------------------------------------------------------------------------------*/ 
  188. /* Globale Includes                                               */
  189. /*----------------------------------------------------------------------------------------*/ 
  190. #include    <tos.h>
  191. #include    <vdi.h>
  192. #include    <aes.h>
  193. #include    <string.h>
  194. #include    <stdlib.h>
  195. #include    <stdio.h>
  196. #include "error.h"
  197. #include    <portabn.h>
  198. #include    <ext.h>
  199. #include    "olga.h"
  200. /*----------------------------------------------------------------------------------------*/ 
  201. /* Lokale Includes                                                */
  202. /*----------------------------------------------------------------------------------------*/ 
  203. #include "GEMJING.H"
  204.  
  205. #include "JINGLE.H"
  206.  
  207. char SCCS[]="@(#)GEMJing.prg V.1.36 (2000-06-01); (c) by Götz Hoffart, Rheinstetten (goetz@hoffart.de, Götz Hoffart @ FR). All rights reserved. GEMJing is a sample player that can be operated by other applications via remote-control.";
  208.  
  209. #define VERS_DATE_STR "13620000601"
  210.  
  211. NEWDEF neue_strct;
  212. NEWDEF *new = &neue_strct;
  213.  
  214. /*----------------------------------------------------------------------------------------*/ 
  215. /* Definitionen                                                         */
  216. /*----------------------------------------------------------------------------------------*/ 
  217.  
  218. #define MGLOBAL            0x20
  219.  
  220. #define VA_START            0x4711
  221. #define AV_STARTED        0x4738
  222. #define AV_SENDKEY        0x4710
  223.  
  224. #define GEMJING_RETURN    0x7407
  225.  
  226. #define GS_REQUEST        0x1350
  227. #define GS_REPLY            0x1351
  228. #define GS_COMMAND        0x1352
  229. #define GS_ACK                0x1353
  230. #define GS_QUIT            0x1354
  231. #define GSM_COMMAND        0x001
  232. #define GSCRIPT_VERSION    0x50
  233. #define NO_GS_PARTNER    -777
  234.  
  235. /*----------------------------------------------------------------------------------------*/ 
  236. /* globale Variablen                                                */
  237. /*----------------------------------------------------------------------------------------*/ 
  238.  
  239. BOOLEAN    MultiTOS;
  240. BOOLEAN    MagiC;
  241. BOOLEAN    MagiCMac;
  242. BOOLEAN    plain = FALSE;
  243.  
  244. WORD        app_id,
  245.             aes_handle;
  246.  
  247. RSHDR        *rsh;
  248. BYTE        **fstring_addr;
  249.  
  250. WORD        work_out[57];
  251. WORD        exinput = FALSE;
  252. WORD        vdi_handle;
  253.  
  254. OBJECT   *infodial;
  255. OBJECT    *menu;
  256.  
  257. WORD        quit;
  258.  
  259. AESPB        aespb;
  260.  
  261. BYTE        *va_helpbuf = NULL;            /* ST-Guide */
  262. BYTE        *gs_helpbuf = NULL;
  263. BYTE        *args, *path, *name;            /* Filebuffer */
  264.  
  265. WORD        playing = FALSE;
  266.  
  267. WORD        gs_partner_id = NO_GS_PARTNER;        /* AES-ID des GEMScript-Partners */
  268. WORD        gs_req_id = 0;
  269. WORD        gs_bel_id = 0;
  270.  
  271. typedef    BYTE STRING[82];
  272.  
  273. /* OLGA */
  274. typedef struct
  275. {
  276.   WORD    manager_id;
  277.   BOOLEAN okay;
  278. } MY_OLGA_STRCT;
  279.  
  280. /* GEMScript-Info */
  281. typedef struct {
  282.    long len;       /* Länge der Struktur in Bytes                      */
  283.    int  version;   /* Versionsnummer des Protokolles beim Sender
  284.                       (z.Z. 0x0080 = 0.80)                             */
  285.    int  msgs;      /* Bitmap der unterstützten Nachrichten (GSM_xxx)   */
  286.    long ext;       /* benutzte Endung, etwa '.SIC'                     */
  287. } GS_INFO;
  288.  
  289. MY_OLGA_STRCT olga;
  290. GS_INFO *gsinfo;
  291.  
  292. /*----------------------------------------------------------------------------------------*/ 
  293. /* Funktionsprototypen                                              */
  294. /*----------------------------------------------------------------------------------------*/ 
  295. WORD            open_screen_wk( WORD aes_handle, WORD *work_out );
  296. VOID            init_rsrc( VOID );
  297. /*----------------------------------------------------------------------------------------*/ 
  298.  
  299. VOID            do_events(VOID);
  300. VOID            hdle_mesag(WORD *msg);
  301. VOID            hdle_keybd(WORD key, WORD kstate);
  302. VOID            handle_menu(WORD item, WORD *msg);
  303. VOID            do_help(BYTE *pattern);
  304. VOID            handle_play_error(WORD ret);
  305.  
  306. WORD            select_file(BYTE *path, BYTE *name);
  307. WORD            file_exist(BYTE *name);
  308. VOID            hide_menu_entries(VOID);
  309. VOID            show_menu_entries(VOID);
  310.  
  311. VOID            do_stic(WORD flag); /* 1: Icon darstellen, 0: aus */
  312. VOID            split_argumentline(NEWDEF *new, BYTE *args);
  313. VOID            split_gs_line(NEWDEF *new, BYTE *args);
  314.  
  315. WORD            appl_xgetinfo (WORD type, WORD *out1, WORD *out2, WORD *out3, WORD *out4);
  316.  
  317. VOID            olga_init(VOID);
  318. VOID            olga_exit(VOID);
  319. WORD            get_avserver(VOID);
  320.  
  321. VOID            check_getinfo(VOID);
  322.  
  323. void call_aes(void);
  324. int  form_xdo(OBJECT *tree, int startob, int *lastcrsr, void *tabs, void *flydial);
  325. int  form_xdial(int flag, int ltx, int lty, int ltw, int lth, int bgx, int bgy, int bgw, int bgh, void **flydial);
  326.  
  327. VOID set_new_to_null(VOID)
  328. {
  329.     new->adr = NULL;
  330.     new->end = NULL;
  331.     new->len = 0L;
  332.     new->header_len = 0L;
  333.     new->sample_start = NULL;
  334.     new->res = 0;
  335.     new->frq = 0;
  336.     new->channels = 0;
  337.     new->fmt = 0;
  338.     new->snd_system = 0;
  339.  /* WORD    malloc_flag; */ 
  340.     new->delayrate = 0;
  341.     new->repeatrate = 0;   
  342.     new->memoryplay = NULL;
  343.     new->memoryplay_len = 0L;
  344.     new->no_menu = FALSE;  
  345.     new->gs_valid = FALSE;
  346.     new->file = NULL;
  347. }
  348.  
  349. /*----------------------------------------------------------------------------------------*/ 
  350. /* Hauptprogramm                                                  */
  351. /*----------------------------------------------------------------------------------------*/ 
  352. WORD main(INT argc, BYTE *argv [])
  353. {
  354.     WORD  ret_code = -1;
  355.     LONG  dummy;
  356.     WORD  i;
  357.     
  358.     Pdomain(1);
  359.     Psignal(SIGUSR1, handle_SIGUSR1);
  360.     Psignal(SIGTERM, handle_SIGTERM);
  361.     
  362.     args = (BYTE*) Malloc(511L);
  363.     name = (BYTE*) Malloc(511L);
  364.     path = (BYTE*) Malloc(511L);
  365.  
  366.     if ((get_cookie(MagX_COOKIE, &dummy)==TRUE) || (get_cookie(MiNT_COOKIE, &dummy)==TRUE))
  367.     {
  368.         va_helpbuf = (BYTE *) Mxalloc(150,3|MGLOBAL);
  369.         gs_helpbuf = (BYTE *) Mxalloc(sizeof(GS_INFO),3|MGLOBAL);
  370.     }
  371.     else
  372.     {
  373.         va_helpbuf = (BYTE *) Malloc(150);
  374.         gs_helpbuf = (BYTE *) Malloc(sizeof(GS_INFO));
  375.     }
  376.  
  377.     if (args == NULL || path == NULL || name == NULL || va_helpbuf == NULL || gs_helpbuf == NULL)
  378.         return ENSMEM;
  379.     
  380.     args[0] = name[0] = va_helpbuf[0] = gs_helpbuf[0] = 0;
  381.     path[0]=Dgetdrv()+65;path[1]=0;
  382.     strcat(path, ":\\*.*");
  383.  
  384.     set_new_to_null();
  385.  
  386.     i = argc;
  387.     if (i > 0)
  388.     {
  389.         while (i > 0)
  390.         {
  391.             i--;
  392.             strcat(args, argv[i]);
  393.             if (i > 1)
  394.                 strcat(args, " ");
  395.         }
  396.         split_argumentline(new, args);
  397.     }
  398.  
  399.     check_getinfo();
  400.     
  401.     if (new->no_menu == TRUE)
  402.         ret_code = spiele_sample(new);
  403.     else
  404.     {
  405.         app_id = appl_init();             /* anmelden */
  406.     
  407.         if( app_id != -1 )
  408.         {
  409.             WORD dum;
  410.  
  411.             if ( (_GemParBlk.global[0] >= 0x140) || get_cookie(FSEL_COOKIE, &dummy) )
  412.                 exinput = TRUE;
  413.  
  414.             if (_GemParBlk.global[0] >= 0x399)
  415.             {
  416.                 menu_register(app_id, "  GEMJing ");
  417.                 menu_register(-1, "GEMJING ");
  418.             }
  419.  
  420.             aes_handle = graf_handle(&dum, &dum, &dum, &dum);   
  421.  
  422.             vdi_handle = open_screen_wk( aes_handle, work_out );
  423.   
  424.             if ( vdi_handle > 0 )
  425.             {
  426.                 graf_mouse( ARROW, 0L );
  427.  
  428.                 if( rsrc_load( "gemjing.rsc" ))               /* Resource laden */
  429.                 {
  430.                     if (plain == FALSE)
  431.                     {
  432.                         init_rsrc();
  433.                         menu_bar(menu, 1);
  434.                     }
  435.                     olga_init();
  436.                 
  437.                     do_events();                      /* Fensterdialog anzeigen */
  438.                     ret_code = 0;
  439.  
  440.                     olga_exit();
  441.                     if (plain == FALSE)
  442.                     {
  443.                         menu_bar(menu, 0);
  444.                     }
  445.                     rsrc_free();
  446.                 }
  447.                 else
  448.                     form_alert(1,"[1]['gemjing.rsc' not found! |Program will terminate. ][ OK ]");
  449.  
  450.                 v_clsvwk(vdi_handle);
  451.                 }
  452.             appl_exit();                            /* abmelden */    
  453.         }
  454.     }
  455.     Mfree(path);
  456.     Mfree(name);
  457.     Mfree(args);
  458.     Mfree(va_helpbuf);
  459.     Mfree(gs_helpbuf);
  460.  
  461.     return ret_code;
  462. }
  463.  
  464. VOID olga_init(VOID)
  465. {
  466.     WORD answer[8];
  467.     
  468.     olga.manager_id = appl_find("OLGA    ");
  469.     
  470.     if (olga.manager_id >= 0)
  471.     {
  472.         answer[0] = OLE_INIT;
  473.         answer[1] = app_id;
  474.         answer[2] = 0;
  475.         answer[3] = OL_SERVER;    /* Bitmap, OL_SERVER und/oder OL_CLIENT gesetzt, OL_PIPES */
  476.         answer[4] = 0;          /* max. von der App. verstandene Stufe des Protokolls (z.Z. immer 0) */
  477.         answer[5] = 0;        /* OEP:  Bitmap, OL_OEP gesetzt */
  478.         answer[6] = 0;          /* OEP:  reserviert (0) */
  479.         answer[7] = 'MU';       /* maschinenlesbarer XAcc-Programmtyp (oder 0) */
  480.         appl_write(olga.manager_id, 16, answer);
  481.     }
  482. }
  483.  
  484. VOID olga_exit(VOID)
  485. {
  486.     WORD answer[8];
  487.  
  488.     if (olga.manager_id < 0 || olga.okay == FALSE)
  489.         return;
  490.  
  491.     answer[0] = OLE_EXIT;
  492.     answer[1] = app_id;
  493.     answer[2] = answer[3] = answer[4] = answer[5] = answer[6] = answer[7] = 0;
  494.     appl_write(olga.manager_id, 16, answer);
  495. }
  496.  
  497. /*
  498.     Der folgende Code testet, ob appl_getinfo in der aktuellen
  499.     Systemumgebung zur Verfügung steht, und ruft im positiven
  500.     Fall die besagte Funktion auf.
  501.     
  502.     Es bietet sich an, statt appl_getinfo nur appl_xgetinfo
  503.     in eigenen Programmen zu verwenden.
  504.     Frisch aus dem TOS.HYP
  505. */
  506. WORD appl_xgetinfo (WORD type, WORD *out1, WORD *out2, WORD *out3, WORD *out4)
  507. {
  508.     BOOLEAN has_agi = FALSE;
  509.  
  510.     has_agi = ((_GemParBlk.global[0] == 0x399 && MagiC == TRUE)
  511.                     || (_GemParBlk.global[0] == 0x400 && type < 4)
  512.                     || (_GemParBlk.global[0] > 0x400)
  513.                     || (appl_find ("?AGI") >= 0));
  514.  
  515.     if (has_agi)
  516.         return (appl_getinfo (type, out1, out2, out3, out4));
  517.     
  518.     else return (0);
  519. } /* appl_xgetinfo */
  520.  
  521.  
  522. VOID check_getinfo(VOID)
  523. {
  524.     WORD g1, dum;
  525.     LONG ldum;
  526.  
  527.     if ((get_cookie(MiNT_COOKIE, &ldum) == TRUE) && (_GemParBlk.global[1] > 1 || _GemParBlk.global[1] == -1))
  528.         MultiTOS = TRUE;
  529.     if (get_cookie(MagX_COOKIE, &ldum) == TRUE)
  530.         MagiC = TRUE;
  531.     if (get_cookie(MgMc_COOKIE, &ldum) == TRUE)
  532.         MagiCMac = TRUE;
  533.  
  534.     appl_xgetinfo(10, &g1, &dum, &dum, &dum);
  535.     g1 = g1 << 8; g1 = g1 >> 8;                    /* ich brauche nur die unteren 8 Bit (0-7) */
  536.     if (g1 >= 9)  
  537.         shel_write(9, 1, 0, NULL, NULL);            /* Sag der Shell, da₧ GEMJing AP_TERM versteht */
  538. }
  539.  
  540. VOID split_gs_line(NEWDEF *new, BYTE *str)
  541. {
  542.     if (strcmpi(str, "OPEN") == 0)
  543.     {
  544.         while (*str++)
  545.             ;
  546.         new->file = str;
  547.     }
  548.     else if (strcmpi(str, "MEMORYPLAY") == 0)
  549.     {
  550.         while (*str++)
  551.             ;
  552.         new->memoryplay = (BYTE*) atol(str);
  553.         while (*str++)
  554.             ;
  555.         new->memoryplay_len = atol(str);
  556.         if (new->memoryplay_len == 0)
  557.             new->memoryplay = NULL;
  558.     }
  559.     else if (strcmpi(str, "QUIT") == 0)
  560.         quit = TRUE;
  561. }
  562.  
  563.  
  564. /* Neue Version von Dimitri Junker*/
  565. /* Eigentlich sollten nur Dateinamen gequoted werden, CAB hat da aber eine seltsame Alternative:
  566. Message send    : [15 CAB] -> [14 GEMJING]: VA_START( »'-q -r0 -d7 H:\CAB\HTML\cow test.wav'« )
  567. Deshalb habe ich die Routine so geschrieben, da₧ innerhalb des gequoteten noch Argumente erlaubt sind.
  568. Programm die richtig quoten stört das nicht, aber so funktioniert es eben auch mit CAB.
  569. */
  570. VOID split_argumentline(NEWDEF *new, BYTE *str)
  571. {
  572.     BYTE        *p,*apostroph,*fileName=NULL;
  573.     BOOLEAN         inQuote=FALSE;
  574.  
  575.  
  576.     memset(new, 0, sizeof(NEWDEF)); new->repeatrate = 1;
  577.     p=str;
  578.     while(p && *p)
  579.     {
  580.         switch (*p)
  581.         {
  582.             case '\'':
  583.                 inQuote=TRUE;
  584.             case ' ':
  585.                 p++;
  586.                 break;
  587.             case '-':
  588.                 switch(p[1])
  589.                 {
  590.                     case 'd':
  591.                         new->delayrate = atoi(&p[2]);
  592.                         break;
  593.                     case 'r':
  594.                         new->repeatrate = atoi(&p[2]);
  595.                         break;
  596.                     case 'p':
  597.                         plain = TRUE;
  598.                         break;
  599.                     case 'm':
  600.                         new->memoryplay = (BYTE *) atol(p);
  601.                         p=strchr(p,',');
  602.                         if(p)
  603.                             new->memoryplay_len = atol(++p);
  604.                         else
  605.                             new->memoryplay = NULL;                /* dann besser ganz ignorieren*/
  606.                         break;
  607.                     case 'q':
  608.                         new->no_menu = TRUE;
  609.                         break;
  610.                 }
  611.                 if(p)
  612.                     p=strchr(p,' ');
  613.                 break;
  614.             default:
  615.                 fileName=p;
  616.                 if(inQuote)
  617.                 {
  618.                     while((apostroph=strstr(p,"''"))!=NULL)        /* gequotetes Apostroph */
  619.                     {
  620.                         p=apostroph+1;
  621.                         strcpy(apostroph,p);
  622.                     }
  623.                     p=strchr(p,'\'');
  624.                 }
  625.                 else
  626.                     p=strchr(p,' ');
  627.                 if(p)
  628.                     *p++='\0';
  629.                 if (file_exist(fileName) == TRUE)
  630.                     new->file = fileName;
  631.                 break;
  632.         }
  633.     }
  634. }
  635.  
  636. /*----------------------------------------------------------------------------------------*/ 
  637. /* Funktionsergebnis: -                                           */
  638. /*----------------------------------------------------------------------------------------*/ 
  639. VOID  do_events( VOID )
  640. {
  641.     WORD    mwhich;
  642.     WORD  msg[8], mx, my, mbutton, kstate, key, mclicks;
  643.  
  644.     if (new->file != NULL)
  645.     {
  646.         spiele_sample(new);
  647.     } 
  648.  
  649.     do
  650.     {
  651.         mwhich = evnt_multi(MU_KEYBD+MU_BUTTON+MU_MESAG,
  652.             2,                            /* Doppelklicks erkennen */
  653.             1,                            /* nur linke Maustaste */
  654.             1,                            /* linke Maustaste gedrückt */
  655.             0, 0, 0, 0, 0,                /* kein 1. Rechteck */
  656.             0, 0, 0, 0, 0,                /* kein 2. Rechteck */
  657.             msg,
  658.             0, 0,                         /* ms */
  659.             &mx, &my,
  660.             &mbutton, &kstate,
  661.             &key, &mclicks );
  662.     
  663.         if (mwhich & MU_KEYBD)           /* Tastendruck? */
  664.             hdle_keybd(key, kstate);
  665.     
  666.         if (mwhich & MU_MESAG)           /* Mitteilungen des SCRENMGR? */
  667.             hdle_mesag(msg);
  668.     
  669.     } while (!quit);
  670.  
  671.     if (gs_partner_id != NO_GS_PARTNER)
  672.     {
  673.         WORD answer[8];
  674.  
  675.         /* beim GS-Partner verabschieden */
  676.         answer[0] = GS_QUIT;
  677.         answer[1] = app_id;
  678.         answer[2] = answer[3] = answer[4] = answer[5]  = answer[6] = 0;
  679.         answer[7] = gs_req_id;
  680.         appl_write(gs_req_id, 16, answer);
  681.     }
  682. }
  683.  
  684. /*----------------------------------------------------------------------------------------*/ 
  685. VOID hdle_keybd(WORD key, WORD kstate)
  686. {
  687.   if (playing == FALSE)
  688.   {
  689.     switch(key)
  690.     {
  691.       case 4113:  handle_menu(MEN_QUIT, NULL); break;
  692.       case 5897:  handle_menu(MEN_ABOUT, NULL); break;
  693.       case 6159:  handle_menu(MEN_OPEN, NULL); break;
  694.       case 25088: handle_menu(MEN_CONTEXT, NULL); break;
  695.       default:        {
  696.                           WORD msg[8];
  697.                           msg[0] = AV_SENDKEY;
  698.                           msg[1] = app_id;
  699.                           msg[2] = 0;
  700.                           msg[3] = kstate;
  701.                           msg[4] = key;
  702.                           msg[5] = msg[6] = msg[7] = 0;
  703.                       appl_write(get_avserver(), 16, &msg);
  704.                       }
  705.     }
  706.   }
  707. }
  708. /*----------------------------------------------------------------------------------------*/ 
  709. VOID hdle_mesag(WORD *msg)
  710. {
  711.     if (msg[0] == MN_SELECTED)
  712.     {
  713.         if (plain == FALSE)
  714.             handle_menu(msg[4], msg);
  715.     }
  716.     else if (msg[0] == AP_TERM)
  717.         quit=TRUE;
  718.     else if (msg[0] == OLGA_INIT)
  719.     {
  720.         if ((msg[3] & OL_MANAGER) && msg[7] != 0)
  721.             olga.okay = TRUE;
  722.     }
  723.     else if (msg[0] == OLE_EXIT)
  724.     {
  725.         olga.okay = FALSE;
  726.         olga.manager_id = -1;
  727.     }
  728.     else if (msg[0] == OLE_NEW)                 /* Manager teilt sich mit */
  729.     {
  730.         olga_init();
  731.     }
  732.     else if (msg[0] == GS_REQUEST)
  733.     {
  734.        WORD answer[8];
  735.        GS_INFO *my_gsinfo;
  736.  
  737.         my_gsinfo = (GS_INFO *) gs_helpbuf;
  738.  
  739.         gs_partner_id = msg[1];
  740.         gs_bel_id = msg[7];
  741.  
  742.         answer[6] = 0;
  743.         gsinfo = (GS_INFO *) *(BYTE **) &msg[3];
  744.         if (gsinfo)
  745.         {
  746.             if (gsinfo->len > (2*sizeof(int) + sizeof(long)))
  747.                 if (gsinfo->version < 0x100)
  748.                     answer[6] = 777;            /* 777 = willkürlich, aber lt. Doku erlaubt */
  749.         }
  750.         else
  751.             answer[6] = 777;                    /* 777 = willkürlich, aber lt. Doku erlaubt */
  752.  
  753.         /* GS_INFO füllen und zurückschicken */
  754.         my_gsinfo = (GS_INFO *) my_gsinfo;
  755.         my_gsinfo->len         = 2*sizeof(int)+2*sizeof(long);
  756.         my_gsinfo->version    = 0x100;
  757.         my_gsinfo->msgs        = GSM_COMMAND;
  758.         my_gsinfo->ext            = 0L;
  759.  
  760.         answer[0] = GS_REPLY;
  761.         answer[1] = app_id;
  762.         answer[2] = 0;
  763.  
  764.         answer[3] = (WORD)(((LONG)my_gsinfo >> 16) & 0x0000ffff);
  765.         answer[4] = (WORD)((LONG)my_gsinfo & 0x0000ffff);
  766.         
  767.         answer[5] = 0;
  768.         answer[7] = gs_bel_id;          /* XXX */
  769.         appl_write(msg[1], 16, answer);
  770.   }
  771.     else if (msg[0] == GS_COMMAND)
  772.     {
  773.         WORD answer[8];
  774.         BYTE *p;
  775.  
  776.         p = *(BYTE **) &msg[3];
  777.  
  778.         if (!p)
  779.             return;
  780.  
  781.         if (strlen(p) != 0)
  782.         {
  783.             memset(new, 0, sizeof(NEWDEF));
  784.             new->repeatrate = 1;
  785.  
  786.             split_gs_line(new, p);
  787.  
  788.             hide_menu_entries();
  789.             spiele_sample(new);
  790.             show_menu_entries();
  791.  
  792.             answer[7] = 0;      
  793.         }
  794.         else
  795.             answer[7] = 2;
  796.  
  797.         answer[0] = GS_ACK;
  798.         answer[1] = app_id;
  799.         answer[2] = 0;
  800.         answer[3] = msg[3];
  801.         answer[4] = msg[4];
  802.         answer[5] = 0;
  803.         answer[6] = 0;
  804.         appl_write(msg[1], 16, answer);
  805.     }
  806.     else if (msg[0] == VA_START)
  807.     {
  808.         WORD answer[8];
  809.         BYTE *p;
  810.  
  811.  
  812.         p = *(BYTE **) &msg[3];
  813.         if (!p)
  814.             return;
  815.  
  816.         args[510] = 0;
  817.         strncpy(args, p, 511);        /* zur Sicherheit umkopieren */
  818.  
  819.         if (strlen(args) != 0)
  820.         {
  821.             WORD ret;
  822.  
  823.             split_argumentline(new, args);
  824.  
  825.           hide_menu_entries();
  826.           ret = spiele_sample(new);
  827.           show_menu_entries();
  828.  
  829.           /* Antwort: "Habe verstanden." */
  830.           answer[0] = AV_STARTED;
  831.           answer[1] = app_id;
  832.           answer[2] = 0;
  833.           answer[3] = msg[3];
  834.           answer[4] = msg[4];
  835.           answer[5] = 0;
  836.           answer[6] = 0;
  837.           answer[7] = 0;
  838.           appl_write(msg[1], 16, answer);
  839.  
  840.           answer[0] = GEMJING_RETURN;
  841.           answer[1] = app_id;
  842.           answer[2] = 0;
  843.           answer[3] = ret;
  844.           answer[4] = 0;
  845.           answer[5] = 0;
  846.           answer[6] = 0;
  847.           answer[7] = 0;
  848.           appl_write(msg[1], 16, answer);
  849.         }
  850.   }
  851. }
  852.  
  853. VOID do_info_dialog(VOID)
  854. {
  855.     WORD    cx, cy, cw, ch, ret, dummy;
  856.     VOID    *flyinf;
  857.  
  858.     wind_update(BEG_UPDATE);
  859.     wind_update(BEG_MCTRL);
  860.  
  861.     form_center(infodial, &cx, &cy, &cw, &ch);
  862.     graf_growbox(0, 0, 0, 0, cx, cy, cw, ch);
  863.     form_xdial(FMD_START, cx, cy, cw, ch, cx, cy, cw, ch, &flyinf);
  864.  
  865.     objc_draw(infodial, ROOT, MAX_DEPTH, cx, cy, cw, ch);
  866.     ret = form_xdo(infodial, 0, &dummy, NULL, flyinf) & 0x7fff;
  867.  
  868.     form_xdial(FMD_FINISH, cx, cy, cw, ch, cx, cy, cw, ch, &flyinf);
  869.     graf_shrinkbox(0, 0, 0, 0, cx, cy, cw, ch);
  870.  
  871.     wind_update(END_MCTRL);
  872.     wind_update(END_UPDATE);
  873.  
  874.     infodial[ret].ob_state &= ~SELECTED;
  875.  
  876.     return;    
  877. }
  878.  
  879. /*------------------------------*/
  880. VOID handle_menu(WORD item, WORD *msg)
  881. {
  882.   if (new->no_menu == FALSE)
  883.   {
  884.         if (plain == FALSE)
  885.             if (msg)
  886.               menu_tnormal(menu,msg[3],1);      /* Kopfzeile normal */
  887.   }
  888.  
  889.     if (plain == FALSE)
  890.     {
  891.         switch(item)
  892.         {
  893.             case MEN_ABOUT:
  894.                 do_info_dialog();
  895.                 break;
  896.             case MEN_OPEN:
  897.                 if (select_file(path, name) == 1 && name[0] != 0)
  898.                 {
  899.                     WORD ret;
  900.                     
  901.                     args[0] = 0;
  902.                     strcpy(args, path);
  903.                     strcat(args, name);
  904.                     if (file_exist(args) == TRUE)
  905.                     {
  906.                         memset(new, 0, sizeof(NEWDEF));
  907.                         new->repeatrate = 1;
  908.                         
  909.                         new->file = args;
  910.                         
  911.                         hide_menu_entries();
  912.                         ret = spiele_sample(new);
  913.                         show_menu_entries();
  914.                         handle_play_error(ret);
  915.                     }
  916.                 }
  917.                 break;
  918.         
  919.             case MEN_QUIT:
  920.                 quit = TRUE;
  921.                 break;
  922.         
  923.             case MEN_CONTEXT:
  924.                 do_help("Main");
  925.                 break;
  926.         }
  927.     }
  928. }
  929.  
  930. /*----------------------------------------------------------------------------------------*/ 
  931. /* Resource und dazugehörige Strukturen initialisieren                        */
  932. /* Funktionsergebnis: -                                           */
  933. /*----------------------------------------------------------------------------------------*/ 
  934. VOID  init_rsrc( VOID )
  935. {
  936.   rsh = *((RSHDR **)(&_GemParBlk.global[7]));         /* Adresse des Resource-Headers über global[7/8] holen */
  937.  
  938.   fstring_addr = (BYTE **)((UBYTE *)rsh + rsh->rsh_frstr);  /* Zeiger auf die Free-Strings */
  939.  
  940.   rsrc_gaddr(R_TREE, MENU, &menu);
  941.   rsrc_gaddr(R_TREE, INFODIAL, &infodial);
  942.  
  943.   strcpy(infodial[INF_VERSION].ob_spec.tedinfo->te_ptext, VERS_DATE_STR);
  944. }
  945.  
  946. /*----------------------------------------------------------------------------------------*/ 
  947. /* Virtuelle Bildschirm-Workstation öffnen                                */
  948. /* Funktionsresultat: VDI-Handle oder 0 als Fehlernummer                      */
  949. /* work_out:        Geräteinformationen                               */
  950. /*----------------------------------------------------------------------------------------*/ 
  951. WORD  open_screen_wk( WORD aes_handle, WORD *work_out )
  952. {
  953.   WORD  work_in[11];
  954.   WORD  handle;
  955.   WORD  i;
  956.  
  957.   for( i = 1; i < 10; i++ )
  958.     work_in[i] = 1;
  959.  
  960.   work_in[0] = Getrez() + 2;                      /* Auflösung */
  961.   work_in[10] = 2;                            /* Rasterkoordinaten benutzen */
  962.   handle = aes_handle;
  963.  
  964.   v_opnvwk( work_in, &handle, work_out );
  965.  
  966.   return( handle );
  967. }
  968.  
  969. /*----------------------------------------------------------------------------------------*/ 
  970.  
  971. VOID do_help(BYTE *pattern)
  972. {
  973.   WORD  msg[8], i;
  974.  
  975.   if ((i=appl_find("ST-GUIDE"))>=0)
  976.   {
  977.     strcpy(va_helpbuf, "*:\\gemjing.hyp ");            /* klein wg. Minix-FS */
  978.     strcat(va_helpbuf, pattern);
  979.     msg[0] = VA_START;
  980.     msg[1] = app_id;
  981.     msg[2] = 0;
  982.  
  983.     msg[3] = (int)(((long)va_helpbuf >> 16) & 0x0000ffff);
  984.     msg[4] = (int)((long)va_helpbuf & 0x0000ffff);
  985.     msg[5] = 0;
  986.     msg[6] = 0;
  987.     msg[7] = 0;
  988.     appl_write(i, 16, msg);
  989.   }
  990.   else
  991.     form_alert(1, fstring_addr[STGUIDE_MISSING] );
  992. }
  993.  
  994. WORD select_file(BYTE *path, BYTE *name)
  995. {
  996.     WORD i;
  997.     WORD b;                             /* Enthält Code des Buttons der  */
  998.                                        /* zum Abbruch der Dateiauswahl  */
  999.                                        /* führte.                       */
  1000.     WORD  result;
  1001.     
  1002.     name[0] = 0;                        /* Dateinamen löschen.           */
  1003.  
  1004.     if (path[strlen(path)-1] != '*' && path[strlen(path)-2] != '.' && path[strlen(path)-3] != '*')
  1005.     {
  1006.         strcat(path, "*.*");
  1007.     }
  1008.  
  1009.     if ( exinput == FALSE )
  1010.         result = fsel_input(path, name, &b);
  1011.     else
  1012.         result = fsel_exinput(path, name, &b, fstring_addr[FSEL_TITLE]);
  1013.     
  1014.     if ( result == 0 )
  1015.     {
  1016.         path[0] = 0;
  1017.         name[0] = 0;
  1018.     }
  1019.     
  1020.     for (i=(WORD) strlen(path); i > -1; i--)
  1021.         if (path[i] == '\\')
  1022.         {
  1023.             path[i+1] = 0;
  1024.             break;
  1025.         }
  1026.     
  1027.     return ( b );
  1028. }
  1029.  
  1030. WORD file_exist(BYTE *name)
  1031. {
  1032.     LONG ret;
  1033.  
  1034.     ret = Fopen(name, FO_READ);
  1035.     if (ret < 0)
  1036.         return FALSE;
  1037.     Fclose((WORD)ret);
  1038.     return TRUE;
  1039. }
  1040.  
  1041. VOID hide_menu_entries(VOID)
  1042. {
  1043.     if (plain == TRUE)
  1044.         return;
  1045.   menu_ienable(menu, MEN_ABOUT, 0);
  1046.   menu_ienable(menu, MEN_OPEN, 0);
  1047.   menu_ienable(menu, MEN_QUIT, 0);
  1048.   menu_ienable(menu, MEN_CONTEXT, 0);
  1049.   playing = TRUE;
  1050. }
  1051.  
  1052. VOID show_menu_entries(VOID)
  1053. {
  1054.     if (plain == TRUE)
  1055.         return;
  1056.   menu_ienable(menu, MEN_ABOUT, 1);
  1057.   menu_ienable(menu, MEN_OPEN, 1);
  1058.   menu_ienable(menu, MEN_QUIT, 1);
  1059.   menu_ienable(menu, MEN_CONTEXT, 1);
  1060.   playing = FALSE;
  1061. }
  1062.  
  1063. VOID handle_play_error(WORD ret)
  1064. {
  1065.   switch(ret)
  1066.   {
  1067.     case RT_WRONG_HARDWARE: form_alert(1, fstring_addr[SND_ERR]); break;
  1068.     case RT_NO_MEM: form_alert(1, fstring_addr[MEM_ERR]); break;
  1069.     case RT_PACKED:
  1070.     case RT_WRONG_CHUNK:
  1071.     case RT_WRONG_FILE:
  1072.     case RT_UNSUPPORTED_AU_SND:
  1073.     case RT_NO_FILE: form_alert(1, fstring_addr[READ_ERR]); break;
  1074.     case RT_LOCKED: form_alert(1, fstring_addr[SND_LOCKED]); break;
  1075.   }
  1076. }
  1077.  
  1078. int form_xdo(OBJECT *tree, int startob, int *lastcrsr, void *tabs, void *flydial)
  1079. {
  1080.     _GemParBlk.contrl[0] = 50;
  1081.     _GemParBlk.contrl[1] =  1;
  1082.     _GemParBlk.contrl[2] =  2;
  1083.     _GemParBlk.contrl[3] =  3;
  1084.     _GemParBlk.contrl[4] =  0;
  1085.     _GemParBlk.intin[0]  = startob;
  1086.     _GemParBlk.addrin[0] = tree;
  1087.     _GemParBlk.addrin[1] = tabs;
  1088.     _GemParBlk.addrin[2] = flydial;
  1089.  
  1090.     call_aes();
  1091.     *lastcrsr = _GemParBlk.intout[1];
  1092.     return(_GemParBlk.intout[0]);
  1093. }
  1094.  
  1095.  
  1096. int form_xdial(int flag, int ltx, int lty, int ltw, int lth, int bgx, int bgy, int bgw, int bgh, void **flydial)
  1097. {
  1098.     _GemParBlk.contrl[0] = 51;
  1099.     _GemParBlk.contrl[1] =  9;
  1100.     _GemParBlk.contrl[2] =  1;
  1101.     _GemParBlk.contrl[3] =  2;
  1102.     _GemParBlk.contrl[4] =  0;
  1103.     _GemParBlk.intin[0]  = flag;
  1104.     _GemParBlk.intin[1]  = ltx;
  1105.     _GemParBlk.intin[2]  = lty;
  1106.     _GemParBlk.intin[3]  = ltw;
  1107.     _GemParBlk.intin[4]  = lth;
  1108.     _GemParBlk.intin[5]  = bgx;
  1109.     _GemParBlk.intin[6]  = bgy;
  1110.     _GemParBlk.intin[7]  = bgw;
  1111.     _GemParBlk.intin[8]  = bgh;
  1112.     _GemParBlk.addrin[0] = flydial;
  1113.     _GemParBlk.addrin[1] = 0;
  1114.  
  1115.     call_aes();
  1116.     return(_GemParBlk.intout[0]);
  1117. }
  1118.  
  1119. void call_aes(void)
  1120. {
  1121.     aespb.contrl  = _GemParBlk.contrl;
  1122.     aespb.global  = _GemParBlk.global;
  1123.     aespb.intin   = _GemParBlk.intin;
  1124.     aespb.intout  = _GemParBlk.intout;
  1125.     aespb.addrin  = (int *)_GemParBlk.addrin;
  1126.  
  1127.     _crystal(&aespb);
  1128. }
  1129.  
  1130. WORD get_avserver(VOID)
  1131. {
  1132.     WORD ret;
  1133.  
  1134.     va_helpbuf = getenv("AVSERVER");
  1135.     if (va_helpbuf)
  1136.     {
  1137.         ret = appl_find(va_helpbuf);
  1138.         va_helpbuf[0] = 0;                    /* String wieder löschen */
  1139.         if (ret >= 0)
  1140.             return ret;
  1141.     }
  1142.  
  1143.     ret = appl_find("AVSERVER");
  1144.     if (ret >= 0)
  1145.         return ret;
  1146.  
  1147.     ret = appl_find("JINNEE  ");
  1148.     if (ret >= 0)
  1149.         return ret;
  1150.  
  1151.     ret = appl_find("THING   ");
  1152.     if (ret >= 0)
  1153.         return ret;
  1154.  
  1155.     ret = appl_find("MAGXDESK");
  1156.     if (ret >= 0)
  1157.         return ret;
  1158.  
  1159.     ret = appl_find("GEMINI  ");
  1160.     if (ret >= 0)
  1161.         return ret;
  1162.  
  1163.     return -100;
  1164. }
  1165.