home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / MIDICOM.LZH / MCTALK_3.9 / SOURCEN / MC_TALK4.PAS < prev    next >
Pascal/Delphi Source File  |  1993-10-07  |  46KB  |  1,956 lines

  1. {$A+,S35}
  2.     PROGRAM mc_talk;
  3.  
  4.     {$i MC_TALK4.I}
  5.   {$I d:\library\gemdef.pas}
  6. const
  7.   {$I d:\library\trixcons.pas}
  8.  
  9.     { ESC-Codes für Anfragen an MIDI_COM }
  10.       GET_VERW     = 6009; { Lese Ring-Karte     }
  11.  
  12.     { Interne Erkennungen von empfangenen bzw. fuer gesendete Nachrichten }
  13.       talk    =5;
  14.       anm_talk=6;
  15.       end_talk=7;
  16.       txt     =8;
  17.       login   =9;
  18.       s_mail  =10; { Anforderung, lese MAIL auf eigene Disk }
  19.       r_mail  =11; { Mail wird gelesen !!! }
  20.       no_mail =12; { Mail wird nicht angenommen }
  21.       get_pic =13; { Bildschirm angefordert }
  22.       s_pic   =14; { (Teil-) Bild als Antwort }
  23.       no_pic  =15; { Bild kann nicht übertragen werden }
  24.     TYPE
  25.   {$I d:\library\trixtype.pas}
  26.  
  27. str9=string[9];
  28.  
  29. verw  = record my_name :str9;     { Appl. Name  } 
  30.                r_name  :str9;
  31.            status  :integer; { Status-Bits }
  32.            disk_st :integer;
  33.     end;
  34.     
  35. cstr9=packed array[0..9] of char;
  36. verw_c = record my_name :cstr9;     { Appl. Name  } 
  37.                r_name  :cstr9;
  38.            status  :integer; { Status-Bits }
  39.            disk_st :integer;
  40.     end;
  41.  
  42. Karte=array[0..6] of verw;
  43. c_karte=array[0..6] of verw_c;
  44.  
  45.      talk_adress=RECORD num,what: integer;
  46.             rufer    : string;
  47.          END;
  48.  
  49.      bild_typ=packed record
  50.            len    :integer;
  51.            von,bis:integer; { relativer Bereich }
  52.            pic    :packed array[1..1900] of integer;
  53.           end;
  54.  
  55.      user_def=RECORD
  56.         CASE what:integer OF
  57.              talk:(quest:talk_adress);
  58.             s_pic:(xpic :bild_typ);
  59.           END;
  60.  
  61.      mailing=record got_quest:boolean;
  62.             pfad:string;
  63.          end;
  64.  
  65.      anytyp  =RECORD
  66.         CASE byte OF
  67.          1:(ver:c_karte);
  68.          2:(use:user_def)
  69.           END;
  70.  
  71.      openline=RECORD onlin :boolean;
  72.              aktiv :boolean;
  73.              called:boolean;
  74.              who   :string;
  75.           END;
  76.  
  77.       connect=ARRAY [1..6] OF openline;
  78.       recieve=ARRAY [1..9] OF string;
  79.  
  80.       flagtype=record dirok,verwok,mailwork,
  81.               neutxt,neudia,glocke,ok_pic,err_pic,
  82.               waitpic,okkiebitz:boolean;
  83.            end;
  84.  
  85.       dta_typ=packed record
  86.               reserved: packed array [0..17] of byte;
  87.               res0    : integer;
  88.               res1    : byte;
  89.               attribut: byte;
  90.               zeit    : integer;
  91.               datum   : integer;
  92.               laenge  : long_integer;
  93.               name    : packed array [1..14] of char;
  94.              end;
  95.  
  96.       dta_ptr=^dta_typ;       
  97.  
  98.  
  99.     VAR   ring_ptr :pointer; { Pointer fuer Ring-Kommunikation (immer global)}
  100.       apl_nr,
  101.       men_id,
  102.       main_wind:integer;
  103.       men_name :str255;
  104.       wname:window_title;
  105.  
  106.       flags    :flagtype;
  107.       ring_def :karte;   { Ringstatus Datentyp                 }
  108.  
  109.       name       :string;  { Name der Applikation (fuer den Ring)         }
  110.       lognam   :string;  { Name des Users, Nur fuer diese Applikation    }
  111.  
  112.       teldesk  :dialog_ptr; { Die Bedienungsobefläche im Telefonmodus    }
  113.       maindesk :dialog_ptr; { Die Bedienungsobefläche im Normalmodus     }
  114.       readpic  :dialog_ptr;
  115.  
  116.       modus    :integer; {0=closed,1=Normalmodus,2=Telefonmodus }
  117.       lw       :char;    {Netzlaufwerk}
  118.       talking  :connect; { Verwaltung der direkten Kommunikation         }
  119.       rzeil,szeil:recieve;{}
  120.  
  121.       mailbox :array[1..6] of mailing;
  122.       mailsend:array[1..6] of integer;
  123.       mailpfad:string; { zielpfad für ankommende Mail }
  124.  
  125.       alrt       :str255;
  126.       alerg    :integer;
  127.  
  128.       screen   :packed Array[0..15999] of integer; { ST Screen as Ints. }
  129.       paclen   :integer;
  130.  
  131.   {$I d:\library\trixsubs.pas}
  132.   {$I library\RING_SUB.I}      { Externals fuer MIDI_COM          }
  133.  
  134.   function GETSTAD(buffer:long_integer):integer;external;
  135.   function STADPAC(quell,ziel:long_integer):integer;external;
  136.   function gettree(var anz:integer):tree_ptr;external;
  137.   FUNCTION GETGLOB(ADR:TREE_PTR):LONG_INTEGER;EXTERNAL;
  138.   FUNCTION appl_write_msg(VAR Puffer:message_buffer;id,Anzahl: SHORT_INTEGER): SHORT_INTEGER;
  139.   EXTERNAL;
  140.   FUNCTION set_bit(bci,num:integer):integer;external;
  141.  
  142. Procedure Bconout (dev,c:integer);
  143. Bios(3);
  144.  
  145. Function Physbase : Long_Integer;
  146. XBios(2);
  147.  
  148. Function Fcreate (Var name : cstring;
  149.           attr : Integer) : Integer;
  150. Gemdos($3C);
  151.  
  152. function fopen(var name:cstring;mode:integer):integer;
  153. gemdos($3D);
  154.  
  155. procedure fclose(handle:integer);
  156. gemdos($3E);
  157.  
  158. function FREAD(handle:integer;COUNT:LONG_INTEGER;var BUFFER:integer):LONG_integer;
  159. gemdos($3F);
  160.  
  161. function FWRITE(HANDLE:INTEGER;COUNT:LONG_INTEGER;VAR BUFFER:integer):LONG_INTEGER;
  162. gemdos($40);
  163.  
  164. function dgetdrv:integer;
  165. gemdos($19);
  166.  
  167. function dgetpath(var path:cstring;drive:integer):integer;
  168. gemdos($47);
  169.  
  170. Function Malloc (nbytes : Long_Integer) : Long_Integer;
  171. Gemdos($48);
  172.  
  173. Procedure Mfree (maddr : Long_Integer);
  174. Gemdos($49);
  175.  
  176. procedure fixdia(dia:tree_ptr);
  177. var i:integer;
  178.  
  179. procedure fixchilds(parent,ind1:integer);
  180. var hlp:integer;
  181. begin
  182.  hlp:=ind1;
  183.  repeat
  184.   Obj_Fix(dia,hlp);
  185.   if dia^[hlp].ob_head>=0 then
  186.    fixchilds(hlp,dia^[hlp].ob_head);
  187.   hlp:=dia^[hlp].ob_next;
  188.  until hlp=parent;
  189. end;
  190.  
  191. begin
  192.  i:=0;
  193.  repeat
  194.   Obj_Fix(dia,i);
  195.   if dia^[i].ob_head>=0 then
  196.    fixchilds(i,dia^[i].ob_head);
  197.   i:=dia^[i].ob_next;
  198.  until i=-1;
  199. end;
  200.  
  201. procedure init_rsc;
  202. var dia:tree_ptr;
  203.     i,anz:integer;
  204.     ERG:LONG_INTEGER;
  205.  
  206. begin
  207.  dia:=gettree(anz);
  208.  ERG:=GETGLOB(DIA);
  209.  for i:=0 to anz-1 do
  210.  begin
  211.   FIND_DIALOG(i,DIA);
  212.   fixdia(dia);
  213.  end;
  214. end;
  215.  
  216.   procedure boot_drive(var path:string);
  217.   var il:long_integer;
  218.       i:integer;
  219.       hlp:string;
  220.       lw:char;
  221.  
  222.   begin
  223.    super(true);
  224.    il:=Wpeek($000446);
  225.    super(false);
  226.    i:=int(il);
  227.    lw:=chr(ord('A')+i);
  228.    hlp:=concat(lw,':',path);
  229.    path:=hlp;
  230.   end;
  231.  
  232.   FUNCTION r_mouse:boolean;
  233.   { mouse_pos=true <=> linke maustaste wird gedrueckt }
  234.   VAR intin :int_in_parms;
  235.   intout:int_out_parms;
  236.   adrin :addr_in_parms;
  237.   adrout:addr_out_parms;
  238.  
  239.   BEGIN
  240.    aes_call(79,intin,intout,adrin,adrout);
  241.    r_mouse:=(intout[3]=2);
  242.   END;
  243.  
  244. procedure on_glocke;
  245. begin
  246.  bconout(2,27);
  247.  bconout(2,106);
  248.  bconout(2,27);
  249.  bconout(2,89);
  250.  bconout(2,32);
  251.  bconout(2,105);
  252.  bconout(5,10);
  253.  bconout(5,10);
  254.  bconout(2,27);
  255.  bconout(2,107);
  256.  bconout(2,7);
  257. end;
  258.  
  259. procedure off_glocke;
  260. begin
  261.  bconout(2,27);
  262.  bconout(2,106);
  263.  bconout(2,27);
  264.  bconout(2,89);
  265.  bconout(2,32);
  266.  bconout(2,105);
  267.  bconout(2,32);
  268.  bconout(2,32);
  269.  bconout(2,27);
  270.  bconout(2,107);
  271. end;
  272.  
  273.    FUNCTION umrech(num:integer):integer;
  274.  
  275.    { Da jeder Ringteilnehmer sich selbst als Nr. 0 ansieht, muss der
  276.      Empfänger einer Nachricht erst feststellen, welche Nummer der
  277.      Absender aus der eigenen Sicht hat, um ihm zu antworten.
  278.      Beispiel:
  279.       Es seien 4 Rechner angeschlossen. ( Rechner 0..3 )
  280.       Das Programm sendet an Rechner Nr. 1 also eine Station weiter.
  281.  
  282.       Rechner Nr. 1 ist aus eigener Sicht wieder Nr.0 und mu₧, um dem
  283.       richtigen Rechner zu antworten an seinen direkten Vorgänger senden.
  284.       In diesem Fall an den Rechner mit der Nr. 3. => Umrech(1)=3;
  285.  
  286.       ACHTUNG: Bevor UMRECH korrekt arbeiten kann, mu₧ die Variable
  287.            >ring_def< belegt worden sein !!!            }
  288.  
  289.    VAR i:integer;
  290.  
  291.    BEGIN
  292.     i:=6;
  293.     WHILE ((ring_def[i].status & 7)<>7) DO i:=i-1;
  294.     num:=num-1;
  295.     WHILE num<>0 DO
  296.     BEGIN
  297.      i:=i-1;
  298.      num:=num-1;
  299.     END;
  300.     umrech:=i;
  301.    END;
  302.  
  303. procedure do_redraw(handle,x0,y0,w0,h0:integer);
  304. var x1,y1,w1,h1:integer;
  305.  
  306. begin
  307.  begin_update;
  308.  hide_mouse;
  309.  first_rect(handle,x1,y1,w1,h1);
  310.  while (w1<>0) and (h1<>0) do
  311.  begin
  312.   if rect_intersect(x0,y0,w0,h0,x1,y1,w1,h1) then
  313.   begin
  314.    obj_draw(maindesk,0,3,x1,y1,w1,h1);
  315.   end;
  316.   next_rect(handle,x1,y1,w1,h1);
  317.  end;
  318.  show_mouse;
  319.  end_update;
  320. end;
  321.  
  322.   procedure trans_picture(ziel:integer;var info:anytyp);
  323.   var bufadr:long_integer;
  324.       screnadr,e0:long_integer;
  325.       erg:integer;
  326.       i,j,e:integer;
  327.       dummy:string;
  328.       et:boolean;
  329.  
  330.   begin
  331.    if not flags.waitpic and flags.okkiebitz then
  332.    begin
  333.     BUFADR:=Adr_integer(screen[0]);
  334.     screnadr:=physbase;
  335.     e:=stadpac(screnadr,bufadr);
  336.     dummy:='';
  337.     if e>0 then
  338.     begin
  339.      erg:=e;
  340.      i:=0;j:=1;
  341.      repeat
  342.       info.use.what:=s_pic;
  343.       info.use.xpic.len:=erg;
  344.       info.use.xpic.von:=i;
  345.       while (j<=1900) and (i<=((erg+1) div 2)) do
  346.       begin
  347.        info.use.xpic.pic[j]:=screen[i];
  348.        i:=i+1;j:=j+1;
  349.       end;
  350.       info.use.xpic.bis:=i-1;
  351.       et:=transmit(ring_ptr,sizeof(anytyp),ziel,dummy,info);
  352.       j:=1;
  353.      until (2*i)>erg;
  354.     end
  355.     else
  356.     begin
  357.      info.use.what:=no_pic;
  358.      et:=transmit(ring_ptr,20,ziel,dummy,info);
  359.     end;
  360.    end
  361.    else
  362.    begin
  363.     info.use.what:=no_pic;
  364.     et:=transmit(ring_ptr,20,ziel,dummy,info);
  365.    end;
  366.   end;
  367.  
  368. procedure my_ctopstr(var quell:cstr9;var ziel:str9);
  369. var i:integer;
  370. begin
  371.  i:=0;
  372.  while (ord(quell[i])<>0) do
  373.  begin
  374.   ziel[i+1]:=quell[i];
  375.   i:=i+1;
  376.  end;
  377.  ziel[0]:=chr(i);
  378. end;
  379.  
  380. procedure req_pkarte(var r_def:karte;var ver:c_karte);
  381. var i:integer;
  382. begin
  383.   for i:=0 to 6 do
  384.   begin
  385.    r_def[i].status := ver[i].status;
  386.    r_def[i].disk_st:= ver[i].disk_st;
  387.    my_ctopstr(ver[i].r_name,r_def[i].r_name);
  388.    my_ctopstr(ver[i].my_name,r_def[i].my_name);
  389.   end;
  390. end;
  391.  
  392.     procedure msg_reader(var flags:flagtype);
  393.     { Interpreter fuer eingehende Nachrichten }
  394.  
  395.     VAR esc,len,i,j:integer;
  396.     info:anytyp;
  397.     erg:boolean;
  398.     dummy:string;
  399.  
  400.     BEGIN
  401.      wait(1);
  402.      { Solange Nachrichten im Puffer sind werden diese gelesen
  403.        und bearbeitet }
  404.      WHILE lese(ring_ptr,info,esc,len) DO
  405.      BEGIN
  406.       IF esc<>0 THEN { Ringverwaltung wurde Uebertragen }
  407.       BEGIN
  408.        req_pkarte(ring_def,info.ver);
  409.        flags.verwok:=true;
  410.        flags.neudia:=true;
  411.       END
  412.       ELSE
  413.       BEGIN
  414.        IF info.use.what=talk THEN { Jemand moechte Telefonieren }
  415.        BEGIN
  416.     CASE info.use.quest.what OF
  417.      anm_talk:BEGIN { Ich werde angerufen }
  418.            esc:=umrech(info.use.quest.num);
  419.            talking[esc].who:=info.use.quest.rufer;
  420.            talking[esc].onlin:=true;
  421.            flags.neudia:=true;
  422.            write(chr(7)); { einmal klingeln lassen }
  423.            if (not talking[esc].called) and
  424.               (modus=2) then
  425.            begin
  426.             talking[esc].called:=true;
  427.             info.use.what:=talk;
  428.             info.use.quest.num:=esc;
  429.             info.use.quest.rufer:=lognam;
  430.             info.use.quest.what:=anm_talk;
  431.             dummy:='';
  432.             {*** Übermittle den Anruf an Rechner (esc) }
  433.             erg:=transmit(ring_ptr,30,esc,dummy,info);
  434.            end;
  435.           END;
  436.      get_pic :BEGIN { Ich werde angerufen }
  437.        esc:=umrech(info.use.quest.num);
  438.            trans_picture(esc,info);
  439.           END;
  440.      end_talk:BEGIN { Der Anrufer hat es Aufgegeben und hat aufgelegt }
  441.            esc:=umrech(info.use.quest.num);
  442.            talking[esc].called:=false;
  443.            if talking[esc].onlin then talking[esc].aktiv:=false;
  444.            talking[esc].onlin:=false;
  445.            flags.neudia:=true;
  446.           END;
  447.      txt     :begin
  448.            FOR i:=1 TO 8 DO rzeil[i]:=rzeil[i+1];
  449.            esc:=umrech(info.use.quest.num);
  450.            writev(rzeil[9],talking[esc].who:8,'> ',
  451.               info.use.quest.rufer);
  452.            flags.neutxt:=true;
  453.           end;
  454.      login     :begin
  455.            esc:=umrech(info.use.quest.num);
  456.            if talking[esc].who='' then
  457.            begin
  458.             talking[esc].who:=info.use.quest.rufer;
  459.             info.use.quest.rufer:=lognam;
  460.             info.use.quest.num:=esc;
  461.             dummy:='';
  462.             erg:=transmit(ring_ptr,40,esc,dummy,info);
  463.            end else
  464.             talking[esc].who:=info.use.quest.rufer;
  465.            if mc_neustat(ring_ptr) then
  466.            begin
  467.             get_karte(ring_ptr);
  468.             flags.verwok:=false;
  469.            end;
  470.           end;
  471.      r_mail  :begin
  472.            esc:=umrech(info.use.quest.num);
  473.            mailsend[esc]:=r_mail;
  474.           end;
  475.      no_mail :begin
  476.            esc:=umrech(info.use.quest.num);
  477.            mailsend[esc]:=no_mail;
  478.           end;
  479.      s_mail  :begin
  480.            esc:=umrech(info.use.quest.num);
  481.            mailbox[esc].got_quest:=true;
  482.            mailbox[esc].pfad:=info.use.quest.rufer;
  483.            flags.mailwork:=true;
  484.           end;
  485.     END;{case}
  486.        END
  487.        else
  488.        begin
  489.     IF info.use.what=s_pic THEN
  490.     BEGIN
  491.      j:=1;
  492.      for i:=info.use.xpic.von to info.use.xpic.bis do
  493.      begin
  494.       screen[i]:=info.use.xpic.pic[j];
  495.       j:=j+1;
  496.      end;
  497.      writev(dummy,info.use.xpic.len-1:5);
  498.      set_dtext(readpic,picleng,dummy,system_font,te_left);
  499.      writev(dummy,(2*info.use.xpic.bis):5);
  500.      set_dtext(readpic,picget,dummy,system_font,te_left);
  501.      show_dialog(readpic);
  502.      flags.err_pic:=false;
  503.      flags.ok_pic:=2*info.use.xpic.bis>=info.use.xpic.len-1;
  504.      if flags.ok_pic then
  505.      begin
  506.       paclen:=info.use.xpic.len div 2;
  507.       for i:=paclen to 15999 do screen[i]:=0;
  508.      end;
  509.     end;
  510.     IF info.use.what=no_pic THEN
  511.     BEGIN
  512.      flags.err_pic:=true;
  513.     end;
  514.    end;
  515.   END;
  516.  END;
  517. END;
  518.  
  519.     FUNCTION show_karte:integer;
  520.     { Anzeigen der Ringverwaltung }
  521.  
  522.     VAR i,j,erg:integer;
  523.     dia:dialog_ptr;
  524.  
  525.     BEGIN
  526.      find_dialog(listuser,dia);
  527.      center_dialog(dia);
  528.  
  529. {*** Anfordern der Ringverwaltung }
  530.      get_karte(ring_ptr);
  531.      flags.verwok:=false;
  532.      while not flags.verwok do msg_reader(flags);
  533.  
  534.      { Setze Dialog fuer alle Online-Rechner auf normal }
  535.      FOR i:=ring1 TO ring6 DO
  536.      BEGIN
  537.       j:=i-ring1+1;
  538.       IF (ring_def[j].status & 7)=7
  539.        THEN obj_setstate(dia,i,normal,false)
  540.        ELSE obj_setstate(dia,i,disabled,false);
  541.      END;
  542.  
  543.      { Setze im Dialog die Namen der angemeldeten Applikationen }
  544.      FOR i:=apl1 TO apl6 DO
  545.      BEGIN
  546.       j:=i-apl1+1;
  547.       IF (ring_def[j].status & 263)=263 THEN
  548.        set_dtext(dia,i,ring_def[j].my_name,system_font,te_left)
  549.       ELSE
  550.        set_dtext(dia,i,'Desktop',system_font,te_left);
  551.      END;
  552.  
  553.      { Setze im Dialog, an welchen Rechnern ein Drucker angeschlossen ist}
  554.      FOR i:=druck1 TO druck6 DO
  555.      BEGIN
  556.       j:=i-druck1+1;
  557.       IF (ring_def[j].status & 135)=135 THEN
  558.        set_dtext(dia,i,'JA  ',system_font,te_left)
  559.       ELSE
  560.        set_dtext(dia,i,'NEIN',system_font,te_left);
  561.      END;
  562.  
  563.      { login namen einsetzen }
  564.      FOR i:=log1 TO log6 DO
  565.      BEGIN
  566.       j:=i-log1+1;
  567.       IF talking[j].who<>'' then set_dtext(dia,i,talking[j].who,system_font,te_left)
  568.                 ELSE set_dtext(dia,i,'no Login',system_font,te_left);
  569.      END;
  570.      begin_update;
  571.      erg:=do_dialog(dia,0);
  572.      obj_setstate(dia,erg,normal,false);
  573.      erg:=erg-ring1+1;
  574.      end_dialog(dia);
  575.      end_update;
  576.      IF (erg<1) OR (erg>6) THEN erg:=0;
  577.      show_karte:=erg;
  578.      { Rueckmeldung, welcher Rechner angewaehlt wurde }
  579.     END;
  580.  
  581.  
  582.     PROCEDURE show_txt(win,half:integer);
  583.     { Anzeige der empfangenen Texte in der oberen Hälfte des Bildschirms }
  584.  
  585.     VAR x,y,w,h     :integer;
  586.     px,py,pw,ph :integer;
  587.     i,j        :integer;
  588.  
  589.     BEGIN
  590.      work_rect(win,x,y,w,h);
  591.      {$P-}
  592.      y:=y+teldesk^[0].ob_h;
  593.      {$P=}
  594.      begin_update;
  595.      hide_mouse;
  596.      paint_rect(x,y+1,w,half-y-1);
  597.      py:=half-3;
  598.      FOR i:=9 DOWNTO 1 DO
  599.      BEGIN
  600.       draw_string(x+1,py,rzeil[i]);
  601.       py:=py-16;
  602.      END;
  603.      show_mouse;
  604.      end_update;
  605.     END;
  606.  
  607.     function min_leng(var szeil:string):integer;
  608.     { schlie₧ende Leerzeichen entfernen }
  609.     var i:integer;
  610.  
  611.     begin
  612.      i:=length(szeil);
  613.      while (i>1) and (szeil[i]=' ') do i:=i-1;
  614.      szeil[0]:=chr(i); {Laenge neu besetzen }
  615.      min_leng:=i;
  616.     end;
  617.  
  618.     PROCEDURE send_line;
  619.     { sende eine Textzeile an alle ausgewählten Rechner }
  620.  
  621.     VAR com:anytyp;
  622.     i,len:integer;
  623.     dummy:string;
  624.     erg:boolean;
  625.  
  626.     BEGIN
  627.      gotoxy(1,22);
  628.      dummy:='';
  629.      { Da nicht alle Programme mit dem Namen "MC_TALK" die
  630.        Nachricht empfangen sollen, muss ich diese einzeln
  631.        an alle Rechner versenden }
  632.      len:=min_leng(szeil[9]);
  633.      FOR i:=1 TO 6 DO
  634.      BEGIN
  635.       IF (talking[i].aktiv) THEN
  636.       BEGIN
  637.        com.use.what:=talk;
  638.        com.use.quest.num:=i;
  639.        com.use.quest.rufer:=szeil[9];
  640.        com.use.quest.what:=txt;
  641. {*** Verschicke die Textzeile an Rechner >i< }
  642.        erg:=transmit(ring_ptr,len+8,i,dummy,com);
  643.       END;
  644.      END;
  645.     END;
  646.  
  647.     PROCEDURE key_interpret(tast:integer;win,half:integer;VAR curx:integer);
  648.     { Da gleichzeitiges senden und empfangen möglich sein soll, kann hier
  649.       nicht die Pascalfunktion "READLN" verwendet werden, denn es muss auch
  650.       während des tippens moeglich sein, weitere Nachrichten zu empfangen }
  651.  
  652.     VAR ch:char;
  653.     i,j:integer;
  654.     x,y,w,h,py:integer;
  655.  
  656.     BEGIN
  657.      begin_update;
  658.      hide_mouse;
  659.      work_rect(win,x,y,w,h);
  660.      py:=y+h-3;
  661.      IF (tast=7181) OR (curx>67) THEN { RETURN falls RETURN-Taste oder
  662.                            Zeilenende }
  663.      BEGIN
  664.       szeil[9,curx+1]:=' ';
  665.       send_line;
  666.       { Alle Zeilen um eins Hochkopieren }
  667.       FOR i:=1 TO 8 DO szeil[i]:=szeil[i+1];
  668.  
  669.       { 9. Zeile neu initialisieren }
  670.       szeil[9]:='_       ';
  671.       WHILE length(szeil[9])<70 DO szeil[9]:=concat(szeil[9],'        ');
  672.  
  673.       { Untere Haelfte ganz neu zeichnen }
  674.       curx:=0;
  675.       paint_style(0);
  676.       paint_rect(x,half+1,w,h+y-half);
  677.       py:=y+h-19;
  678.       FOR i:=8 DOWNTO 1 DO
  679.       BEGIN
  680.        draw_string(x+1,py,szeil[i]);
  681.        py:=py-16;
  682.       END;
  683.      END
  684.      ELSE
  685.      IF (tast=3592) OR (tast=21375) THEN { Backspace oder Delete }
  686.      BEGIN
  687.       IF curx>0 THEN
  688.       BEGIN
  689.        szeil[9,curx]:='_';
  690.        szeil[9,curx+1]:=' ';
  691.        curx:=curx-1;
  692.       END;
  693.      END
  694.      ELSE
  695.      IF tast=283 THEN { Esc }
  696.      BEGIN
  697.       szeil[9]:='_       ';
  698.       WHILE length(szeil[9])<70 DO szeil[9]:=concat(szeil[9],'        ');
  699.       curx:=0;
  700.      END
  701.      ELSE
  702.      BEGIN { Druckbare Zeichen }
  703.       ch:=chr(tast & $00FF);
  704.       IF ch IN [' '..'}','ä','ö','ü','Ä','Ö','Ü','₧'] THEN
  705.       BEGIN
  706.        curx:=curx+1;
  707.        szeil[9,curx]:=ch;
  708.        szeil[9,curx+1]:='_';
  709.       END;
  710.      END;
  711.      draw_string(x+1,y+h-3,szeil[9]);
  712.      show_mouse;
  713.      end_update;
  714.     END;
  715.  
  716. procedure show_tel(win:integer;var half:integer);
  717. var  i,x,y,w,h,py:integer;
  718.      dia:dialog_ptr;
  719.  
  720. begin
  721.  begin_update;
  722.  hide_mouse;
  723.  work_rect(win,x,y,w,h);
  724.  find_dialog(teflon,dia); { Telefon-Anzeige finden }
  725.  {$P-}
  726.  y:=y+dia^[rahmtele].ob_h;
  727.  h:=h-dia^[rahmtele].ob_h;
  728.  {$P=}
  729.  paint_style(0);
  730.  paint_rect(x,y,w,h);
  731.  half:=y+(h DIV 2);   { Fenster in zwei haelften unterteilen }
  732.  pline(x,half,x+w,half);
  733.  show_txt(win,half);
  734.  
  735.  { Untere Haelfte anzeigen }
  736.  py:=y+h-3;
  737.  FOR i:=9 DOWNTO 1 DO
  738.  BEGIN
  739.   draw_string(x+1,py,szeil[i]);
  740.   py:=py-16;
  741.  END;
  742.  show_mouse;
  743.  end_update;
  744. end;
  745.  
  746. PROCEDURE start_talk(var win,curx:integer);
  747. VAR com:anytyp;
  748.     dummy:string;
  749.     wnam:string;
  750.     erg:boolean;
  751.     i,x,y,w,h,py:integer;
  752.     dia:dialog_ptr;
  753.  
  754. BEGIN
  755.  G_SET_PORT(open_port(1));
  756.  get_karte(ring_ptr);
  757.  flags.verwok:=false;
  758.  while not flags.verwok do msg_reader(flags);
  759.  FOR i:=1 TO 6 DO { pruefen, ob ich angerufen wurde }
  760.  BEGIN
  761.   IF talking[i].onlin THEN
  762.   BEGIN
  763.    talking[i].called:=true;
  764.    com.use.what:=talk;
  765.    com.use.quest.num:=i;
  766.    com.use.quest.rufer:=lognam;
  767.    com.use.quest.what:=anm_talk;
  768.    dummy:='';
  769. {** Ja ich bin nun sprechbereit an alle Anrufer senden }
  770.    erg:=transmit(ring_ptr,40,i,dummy,com);
  771.   END
  772.   else talking[i].called:=false;
  773.  END;
  774.  draw_mode(1);
  775.  text_color(1);
  776.  
  777.  { Bildschirm initialisieren }
  778.  work_rect(0,x,y,w,h);
  779.  set_wsize(win,x,y,w,h);  { Fenster =ganzer Bildschirm }
  780.  set_clip(x,y,w,h);
  781.  work_rect(win,x,y,w,h);
  782.  find_dialog(teflon,dia); { Telefon-Anzeige finden }
  783.  {$P-}
  784.  dia^[rahmtele].ob_y:=y;
  785.  {$P=}
  786.  
  787.  { 9. Zeile neu initialisieren }
  788.  curx:=0;
  789.  szeil[9]:='_          ';
  790.  WHILE length(szeil[9])<70 DO szeil[9]:=concat(szeil[9],'       ');
  791. end;
  792.  
  793. procedure tel_redraw(handle,x0,y0,w0,h0:integer; var half:integer);
  794. var x1,y1,w1,h1:integer;
  795.  
  796. begin
  797.  begin_update;
  798.  hide_mouse;
  799.  paint_color(white);
  800.  first_rect(handle,x1,y1,w1,h1);
  801.  while (w1<>0) and (h1<>0) do
  802.  begin
  803.   if rect_intersect(x0,y0,w0,h0,x1,y1,w1,h1) then
  804.   begin
  805.    set_clip(x1,y1,w1,h1);
  806.    paint_rect(x1,y1,w1,h1);
  807.    show_tel(handle,half);
  808.    obj_draw(teldesk,0,3,x1,y1,w1,h1);
  809.   end;
  810.   next_rect(handle,x1,y1,w1,h1);
  811.  end;
  812.  show_mouse;
  813.  end_update;
  814.  work_rect(handle,x1,y1,w1,h1);
  815.  set_clip(x1,y1,w1,h1);
  816. end;
  817.  
  818.  
  819. procedure pass_wind(dia:dialog_ptr;win:integer);
  820. var x,y,w,h:integer;
  821.     difh,h1:integer;
  822. begin
  823.  border_rect(win,x,y,w,h1);
  824.  work_rect(win,x,y,w,h);
  825.  difh:=h1-h;
  826.  {$P-}
  827.  w:=dia^[0].ob_w;
  828.  h:=dia^[0].ob_h+difh-1;
  829.  x:=dia^[0].ob_x;
  830.  y:=dia^[0].ob_y-difh+1;
  831.  {$P=}
  832.  set_wsize(win,x,y,w,h);
  833.  work_rect(win,x,y,w,h);
  834. end;
  835.  
  836.  
  837. procedure do_end_talk(var flags:flagtype;win:integer);
  838. VAR com:anytyp;
  839.     dummy:string;
  840.     erg:boolean;
  841.     i:integer;
  842.  
  843. { Beenden der Kommunikation }
  844. begin
  845.  begin_update;
  846.  hide_mouse;
  847.  Close_Port(Get_port);
  848.  pass_wind(maindesk,win);
  849.  show_mouse;
  850.  end_update;
  851.  FOR i:=1 TO 6 DO
  852.  BEGIN
  853.  { Mitteilung an alle, fuer die es Interessant ist: Ich lege auf }
  854.   IF (talking[i].called)
  855.      or (talking[i].onlin)
  856.      or (talking[i].aktiv) THEN
  857.   BEGIN
  858.    com.use.what:=talk;
  859.    com.use.quest.num:=i;
  860.    com.use.quest.rufer:=lognam;
  861.    com.use.quest.what:=end_talk;
  862.    dummy:='';
  863. {*** Abmeldung uebertragen }
  864.    erg:=transmit(ring_ptr,30,i,dummy,com);
  865.   END;
  866.   talking[i].onlin:=false;
  867.   talking[i].aktiv:=false;
  868.   talking[i].called:=false;
  869.  END;
  870.  flags.neudia:=true;
  871. END;
  872.  
  873.  
  874.  
  875. { ****** Setzen von Datum und Uhrzeit des Systems *************** }
  876. procedure set_time;
  877. var dia:dialog_ptr;
  878.     t,m,j,st,mi,s,i:integer;
  879.     hlp,h1:string;
  880.     dhlp:str255;
  881.  
  882. begin
  883.  find_dialog(indat,dia);
  884.  center_dialog(dia);
  885.  GetDate(t,m,j);
  886.  GetTime(st,mi,s);
  887.  writev(hlp,t);
  888.  if length(hlp)=1 then h1:=concat('0',hlp)
  889.           else h1:=hlp;
  890.  set_dedit(dia,tag,'__','99',h1,system_font,te_left);
  891.  writev(hlp,m);
  892.  if length(hlp)=1 then h1:=concat('0',hlp)
  893.           else h1:=hlp;
  894.  set_dedit(dia,monat,'__','99',h1,system_font,te_left);
  895.  writev(h1,j);
  896.  set_dedit(dia,jahr,'____','9999',h1,system_font,te_left);
  897.  writev(hlp,st);
  898.  if length(hlp)=1 then h1:=concat('0',hlp)
  899.           else h1:=hlp;
  900.  set_dedit(dia,std,'__','99',h1,system_font,te_left);
  901.  writev(hlp,mi);
  902.  if length(hlp)=1 then h1:=concat('0',hlp)
  903.           else h1:=hlp;
  904.  set_dedit(dia,minut,'__','99',h1,system_font,te_left);
  905.  i:=do_dialog(dia,tag);
  906.  obj_setstate(dia,i,normal,false);
  907.  end_dialog(dia);
  908.  if i<>dcan then
  909.  begin
  910.   get_dedit(dia,std,dhlp);
  911.   readv(dhlp,st);
  912.   get_dedit(dia,minut,dhlp);
  913.   readv(dhlp,mi);
  914.   s:=0;
  915.   SetTime(st,mi,s);
  916.   get_dedit(dia,tag,dhlp);
  917.   readv(dhlp,t);
  918.   get_dedit(dia,monat,dhlp);
  919.   readv(dhlp,m);
  920.   get_dedit(dia,jahr,dhlp);
  921.   readv(dhlp,j);
  922.   SetDate(t,m,j);
  923.   if i=sall then systemzeit(ring_ptr);
  924.  end;
  925. end;
  926.  
  927.     procedure do_login(var logn:string);
  928.     var dia:dialog_ptr;
  929.     log:str255;
  930.     info:anytyp;
  931.     i:integer;
  932.     erg:boolean;
  933.     dummy:string;
  934.  
  935.     begin
  936.      if mc_neustat(ring_ptr) then
  937.      begin
  938.       get_karte(ring_ptr);
  939.       flags.verwok:=false;
  940.       while not flags.verwok do msg_reader(flags);
  941.      end;
  942.      { Username eingeben }
  943.      find_dialog(dologin,dia);
  944.      set_dedit(dia,logname,'________','XXXXXXXX',lognam,system_font,te_left);
  945.      center_dialog(dia);
  946.      begin_update;
  947.      i:=do_dialog(dia,logname);
  948.      obj_setstate(dia,i,normal,false);
  949.      get_dedit(dia,logname,log);
  950.      end_dialog(dia);
  951.      logn:=log;
  952.      end_update;
  953.      info.use.quest.what:=login;
  954.      info.use.quest.rufer:=logn;
  955.      info.use.what:=talk;
  956.      dummy:='';
  957.      for i:=1 to 6 do
  958.      begin
  959.       if ring_def[i].my_name=name then
  960.       begin
  961.        info.use.quest.num:=i;
  962.        erg:=transmit(ring_ptr,80,i,dummy,info);
  963.       end;
  964.      end;
  965.      wait(100);
  966.     end;
  967.  
  968. procedure set_md;
  969. var i:integer;
  970.     called:boolean;
  971.  
  972. begin
  973.  called:=false;
  974.  for i:=1 to 6 do called:=called or talking[i].onlin;
  975.  if called then
  976.  begin
  977.   obj_setstate(maindesk,phone,selected,false);
  978.  end
  979.  else
  980.   obj_setstate(maindesk,phone,normal,false);
  981. end;
  982.  
  983. procedure set_td;
  984. { Bei der Kommunikation wird angezeigt, welche Teilnehmer gerade
  985.   mithoeren beziehungsweise Empfangsbereit sind }
  986. VAR i:integer;
  987.     nam:string;
  988.  
  989. BEGIN
  990.  FOR i:=1 TO 6 DO
  991.  BEGIN
  992.   IF  ((ring_def[i].status & 263)=263)
  993.    AND (ring_def[i].my_name=name) THEN { Alle Rechner auf denen dieses
  994.                      Programm laeuft können erreicht
  995.                      werden }
  996.   BEGIN
  997.    { wenn der Empfänger meine Nachrichten empfangen soll ist er aktiv }
  998.    IF talking[i].aktiv THEN obj_setstate(teldesk,i,selected,false)
  999.                ELSE obj_setstate(teldesk,i,normal,false);
  1000.  
  1001.    { Namen der Empfänger anzeigen }
  1002.    if talking[i].who<>'' then
  1003.     set_dtext(teldesk,i+txt1-1,talking[i].who,small_font,te_center)
  1004.    else
  1005.     set_dtext(teldesk,i+txt1-1,'==Online==',small_font,te_center);
  1006.  
  1007.    { wenn der Empfänger den Hoerer abgenommen hat ist er online }
  1008.    IF talking[i].onlin THEN
  1009.     obj_setstate(teldesk,i+txt1-1,selected,false)
  1010.    ELSE
  1011.     obj_setstate(teldesk,i+txt1-1,normal,false);
  1012.   END
  1013.   ELSE
  1014.   BEGIN
  1015.    obj_setstate(teldesk,i,disabled,false);
  1016.    obj_setstate(teldesk,i+txt1-1,disabled,false);
  1017.   END;
  1018.  END;
  1019. END;
  1020.  
  1021. procedure set_glocke(var flags:flagtype);
  1022. var i:integer;
  1023.     called:boolean;
  1024.  
  1025. begin
  1026.  called:=false;
  1027.  for i:=1 to 6 do called:=called or talking[i].onlin;
  1028.  if called then
  1029.  begin
  1030.   on_glocke;
  1031.   flags.glocke:=true;
  1032.  end;
  1033. end;
  1034.  
  1035. procedure mail_answer(i,what:integer);
  1036. var erg:boolean;
  1037.     info:anytyp;
  1038.     dummy:string;
  1039.  
  1040. begin
  1041.  dummy:='';
  1042.  info.use.what:=talk;
  1043.  info.use.quest.num:=i;
  1044.  info.use.quest.what:=what;
  1045.  mailbox[i].got_quest:=false;
  1046.  erg:=transmit(ring_ptr,16,i,dummy,info);
  1047. end;
  1048.  
  1049. Function Dcreate (Var path : cstring) : Long_Integer;
  1050. Gemdos($39);
  1051.  
  1052. Function Fsfirst (Var pspec : cstring;
  1053.                   attr : Integer) : Long_Integer;
  1054. Gemdos($4E);
  1055.  
  1056. Function Fgetdta : dta_ptr;
  1057. Gemdos($2F);
  1058.  
  1059. function suchpfad(i:integer;var pfad,quelle:string):boolean;
  1060. var test:file of char;
  1061.     num,j:integer;
  1062.     erg:long_integer;
  1063.     filname,hlp:string;
  1064.     neupfad:cstring;
  1065.     dta:dta_typ;
  1066.     dta_adr:dta_ptr;
  1067.  
  1068. begin
  1069.  j:=length(quelle);
  1070.  while quelle[j]<>'\' do j:=j-1;
  1071.  filname:=copy(quelle,j+1,length(quelle)-j);
  1072.  
  1073.  writev(pfad,mailpfad,talking[i].who);
  1074.  ptocstr(pfad,neupfad);
  1075.  dta_adr:=Fgetdta;
  1076.  dta:=dta_adr^;
  1077.  erg:=fsfirst(neupfad,16);
  1078.  if (erg<0) or ((dta_adr^.attribut & 16)=0) then erg:=Dcreate(neupfad);
  1079.  dta_adr^:=dta;
  1080.  
  1081.  if erg>=0 then
  1082.  begin
  1083.   writev(hlp,pfad,'\',filname);
  1084.   reset(test,hlp);
  1085.   if io_result=0 then
  1086.   begin
  1087.    j:=length(filname);
  1088.    while (filname[j]<>'.') and (j>0) do j:=j-1;
  1089.    if j>0 then filname[j]:='_';
  1090.    if length(filname)>8 then filname[0]:=chr(8);
  1091.    num:=0;
  1092.    repeat
  1093.     num:=num+1;
  1094.     writev(hlp,pfad,'\',filname,'.',num);
  1095.     reset(test,hlp);
  1096.    until io_result<>0;
  1097.   end;
  1098.   pfad:=hlp;
  1099.   rewrite(test,pfad);
  1100.   suchpfad:=(io_result=0);
  1101.   close(test);
  1102.  end else suchpfad:=false
  1103. end;
  1104.  
  1105. procedure copy_file(i:integer;var ziel,quell:string);
  1106. var hquell,hziel:integer;
  1107.     count,erg,h:long_integer;
  1108.     hlp:string;
  1109.     buff:array[1..1024] of integer; {2K Puffer}
  1110.     cziel,cquell:cstring;
  1111.  
  1112. begin
  1113.  writev(hlp,lw,':\R',I,'\',QUELL);
  1114.  ptocstr(hlp,cquell);
  1115.  hquell:=fopen(cquell,0);
  1116.  ptocstr(ziel,cziel);
  1117.  hziel:=fopen(cziel,1);
  1118.  count:=2048;
  1119.  erg:=0;
  1120.  if (hquell>0) and (hziel>0) then
  1121.  begin
  1122.   repeat
  1123.    erg:=fread(hquell,count,buff[1]);
  1124.    if erg>0 then h:=fwrite(hziel,erg,buff[1]);
  1125.   until (erg<count) or (h<erg);
  1126.  end;
  1127.  if (hquell>0) then fclose(hquell);
  1128.  if (hziel>0) then fclose(hziel);
  1129. end;
  1130.  
  1131. procedure get_mail(var flags:flagtype);
  1132. var test:file of char;
  1133.     pfad:string;
  1134.     i    :integer;
  1135.     erg :boolean;
  1136.  
  1137. begin
  1138.  flags.mailwork:=false;
  1139.  for i:=1 to 6 do
  1140.  begin
  1141.   if mailbox[i].got_quest then
  1142.   begin
  1143.    mailbox[i].got_quest:=false;
  1144.    if mailpfad='' then mail_answer(i,no_mail)
  1145.    else
  1146.    if not suchpfad(i,pfad,mailbox[i].pfad) then mail_answer(i,no_mail)
  1147.    else
  1148.    begin
  1149.     copy_file(i,pfad,mailbox[i].pfad);
  1150.     msg_reader(flags);
  1151.     mail_answer(i,r_mail);
  1152.    end;
  1153.   end;
  1154.  end;
  1155. end;
  1156.  
  1157. function not_locked(var pf:string):boolean;
  1158. var i,j:integer;
  1159.     loc_tst:cstring;
  1160. (* erstellt 17.2.92 *)
  1161.  
  1162. begin
  1163.  i:=1;
  1164.  while i<=length(pf) do
  1165.  begin
  1166.   loc_tst[i-1]:=pf[i];
  1167.   if loc_tst[i-1]='\' then j:=i;
  1168.   i:=i+1;
  1169.  end;
  1170.  loc_tst[j]:='M';
  1171.  loc_tst[j+1]:='I';
  1172.  loc_tst[j+2]:='D';
  1173.  loc_tst[j+3]:='I';
  1174.  loc_tst[j+4]:='_';
  1175.  loc_tst[j+5]:='C';
  1176.  loc_tst[j+6]:='O';
  1177.  loc_tst[j+7]:='M';
  1178.  loc_tst[j+8]:='.';
  1179.  loc_tst[j+9]:='L';
  1180.  loc_tst[j+10]:='O';
  1181.  loc_tst[j+11]:='C';
  1182.  loc_tst[j+12]:=CHR(0);
  1183.  i:=fopen(LOC_TST,1);
  1184.  if i>0 then fclose(i)
  1185.  ELSE
  1186.  BEGIN
  1187.   loc_tst[3]:='M';
  1188.   loc_tst[4]:='_';
  1189.   loc_tst[5]:='C';
  1190.   loc_tst[6]:='_';
  1191.   loc_tst[7]:='L';
  1192.   loc_tst[8]:='O';
  1193.   loc_tst[9]:='C';
  1194.   loc_tst[10]:='K';
  1195.   loc_tst[11]:='.';
  1196.   loc_tst[12]:='P';
  1197.   loc_tst[13]:='A';
  1198.   loc_tst[14]:='R';
  1199.   loc_tst[15]:=CHR(0);
  1200.   i:=fopen(LOC_TST,1); 
  1201.   if i>0 then fclose(i)
  1202.  end;
  1203.  if i>0 then fclose(i);
  1204.  not_locked:=(i<0);
  1205. end;
  1206.  
  1207. procedure do_mail;
  1208. var dia:dialog_ptr;
  1209.     i,ok:integer;
  1210.     zpfad,zdatei:string;
  1211.     hlp:cstring;
  1212.     erg,leave:boolean;
  1213.     info:anytyp;
  1214.     dummy:string;
  1215.  
  1216. begin
  1217.  while lognam='' do do_login(lognam);
  1218.  i:=dgetpath(hlp,dgetdrv+1);
  1219.  ctopstr(hlp,zdatei);
  1220.  zpfad:=concat(chr(ord('A')+dgetdrv),':',zdatei,'\*.*');
  1221.  zdatei:='';
  1222.  begin_update;
  1223.  repeat
  1224.   leave:=true;
  1225.   erg:=get_in_file(zpfad,zdatei);
  1226.   if erg then
  1227.   begin
  1228.    if (zdatei[1]=lw) then
  1229.    begin
  1230.     i:=do_alert('[3][MC_TALK:|MAIL kann nicht vom|Netz-Laufwerk eingelesen werden][ Hmmm.. ]',1);
  1231.     leave:=false;
  1232.    end
  1233.    else
  1234.    begin
  1235.     leave:=not_locked(zdatei);
  1236.     if not leave then
  1237.      i:=do_alert('[3][MC_TALK:|MAIL-FILE ist Zugriffsgeschützt|versenden nicht möglich][ Sorry!! ]',1);
  1238.    end;
  1239.   end;
  1240.  until (erg=false) or leave;
  1241.  end_update;
  1242.  
  1243.  if erg then
  1244.  begin
  1245.   find_dialog(selmail,dia);
  1246.   center_dialog(dia);
  1247.   for i:=mlog1 to mlog6 do
  1248.   begin
  1249.    if ring_def[i].my_name=name then
  1250.    begin
  1251.     obj_setstate(dia,i+mlog6,normal,false);
  1252.     if talking[i].who='' then
  1253.      set_dtext(dia,i,'no login',system_font,te_left)
  1254.     else
  1255.      set_dtext(dia,i,talking[i].who,system_font,te_left)
  1256.    end
  1257.    else
  1258.    begin
  1259.     obj_setstate(dia,i+mlog6,disabled,false);
  1260.     set_dtext(dia,i,'no login',system_font,te_left)
  1261.    end;
  1262.   end;
  1263.   begin_update;
  1264.   ok:=do_dialog(dia,0);
  1265.   obj_setstate(dia,ok,normal,true);
  1266.   obj_setstate(dia,ok,disabled,true);
  1267.   end_update;
  1268.   for i:=1 to 6 do
  1269.   begin
  1270.    if (obj_state(dia,i+mlog6) & selected)<>0 then
  1271.    begin
  1272.     mailsend[i]:=s_mail;
  1273.     dummy:='';
  1274.     info.use.what:=talk;
  1275.     info.use.quest.num:=i;
  1276.     info.use.quest.what:=s_mail;
  1277.     info.use.quest.rufer:=zdatei;
  1278.     erg:=transmit(ring_ptr,90,i,dummy,info);
  1279.    end
  1280.    else mailsend[i]:=0;
  1281.   end;
  1282.   repeat
  1283.    erg:=false;
  1284.    msg_reader(flags);
  1285.    wait(500);
  1286.    if flags.mailwork then get_mail(flags);
  1287.    for i:=1 to 6 do
  1288.    begin
  1289.     erg:=erg or (mailsend[i]=s_mail);
  1290.     if ((obj_state(dia,i+mlog6) & selected)<>0) and
  1291.        (mailsend[i]<>s_mail) then
  1292.     begin
  1293.      obj_setstate(dia,i+mlog6,normal,true);
  1294.      if mailsend[i]=r_mail then
  1295.       set_dtext(dia,i,'OK',system_font,te_center)
  1296.      else
  1297.       set_dtext(dia,i,'ERROR',system_font,te_center);
  1298.     end;
  1299.    end;
  1300.    begin_update;
  1301.    show_dialog(dia);
  1302.    end_update;
  1303.   until not erg;
  1304.   begin_update;
  1305.   obj_setstate(dia,ok,normal,false);
  1306.   set_dtext(dia,ok,'Fertig',system_font,te_center);
  1307.   ok:=do_dialog(dia,0);
  1308.   end_dialog(dia);
  1309.   obj_setstate(dia,ok,normal,false);
  1310.   set_dtext(dia,ok,'Mail senden',system_font,te_center);
  1311.   end_update;
  1312.  end;
  1313. end;
  1314.  
  1315. procedure flcon0(var flags:flagtype);
  1316. begin
  1317.  if flags.neudia then
  1318.  begin
  1319.   set_md;
  1320.   set_td;
  1321.   set_glocke(flags);
  1322.   flags.neudia:=false;
  1323.  end;
  1324. end;
  1325.  
  1326. procedure ask_bild;
  1327. var ziel:integer;
  1328.     info:anytyp;
  1329.     dummy:string;
  1330.     erg:boolean;
  1331.  
  1332. begin
  1333.  FIND_DIALOG(getpic,readpic);
  1334. (* center_dialog(readpic);*)
  1335.  dummy:='00000';
  1336.  set_dtext(readpic,picleng,dummy,system_font,te_left);
  1337.  dummy:='00000';
  1338.  set_dtext(readpic,picget,dummy,system_font,te_left);
  1339.  ziel:=show_karte;
  1340.  if ziel>0 then
  1341.  begin
  1342. (*  show_dialog(readpic);*)
  1343.   dummy:='';
  1344.   flags.waitpic:=true;
  1345.   flags.ok_pic:=false;
  1346.   flags.err_pic:=false;
  1347.   info.use.what:=talk;
  1348.   info.use.quest.num:=ziel;
  1349.   info.use.quest.what:=get_pic;
  1350.   erg:=transmit(ring_ptr,20,ziel,dummy,info);
  1351.  end;
  1352. end;
  1353.  
  1354.   procedure xshow;
  1355.   var bufadr:long_integer;
  1356.       hlp:cstring;
  1357.       screnadr:long_integer;
  1358.       zpfad,zdatei:string;
  1359.       buffer:long_integer;
  1360.       e2,i:integer;
  1361.       erg:boolean;
  1362.  
  1363.   begin
  1364.    begin_update;
  1365.    screnadr:=physbase;
  1366.    buffer:=malloc(-1);
  1367.    if buffer>=32000 then
  1368.    begin
  1369.     buffer:=malloc(32000);
  1370.     BUFADR:=Adr_Integer(screen[0]);
  1371.     e2:=do_alert('[3][MC_TALK:|Zurückschalten mit dem|rechten Mouse-Button][ Ah Ja! ]',1);
  1372.     hide_mouse;
  1373.     Move_L( screnadr, buffer, 8000);
  1374.     e2:=getstad(bufadr);
  1375.     show_mouse;
  1376.     while not r_mouse do e2:=0;
  1377.     hide_mouse;
  1378.     Move_L(buffer,screnadr,8000);
  1379.     show_mouse;
  1380.     mfree(buffer);
  1381.     e2:=do_alert('[3][MC_TALK:|Importiertes Bild speichern?| STAD-Format (.PAC)][ Ja | Nein ]',2);
  1382.     if e2=1 then
  1383.     begin
  1384.      i:=dgetpath(hlp,dgetdrv+1);
  1385.      ctopstr(hlp,zdatei);
  1386.      zpfad:=concat(chr(ord('A')+dgetdrv),':',zdatei,'\*.PAC');
  1387.      zdatei:='';
  1388.      erg:=get_in_file(zpfad,zdatei);
  1389.      if erg then
  1390.      begin
  1391.       ptocstr(zdatei,hlp);
  1392.       e2:=Fcreate (hlp,0);
  1393.       if e2>0 then buffer:=fwrite(e2,2*paclen,screen[0]);
  1394.       fclose(e2);
  1395.      end;
  1396.     end;
  1397.    end
  1398.    else
  1399.    begin
  1400.     e2:=do_alert('[3][MC_TALK:|Nicht genug Speicher|zum Bildschirm sichern][ Schade ]',1);
  1401.    end;
  1402.    end_update;
  1403.   end;
  1404.  
  1405. procedure flcon1(var flags:flagtype);
  1406. var i:integer;
  1407. begin
  1408.  if flags.neudia then
  1409.  begin
  1410.   set_md;
  1411.   set_td;
  1412.   if front_window<>main_wind then flcon0(flags)
  1413.   else
  1414.   begin
  1415.    begin_update;
  1416.    show_dialog(maindesk);
  1417.    end_update;
  1418.    flags.neudia:=false;
  1419.   end;
  1420.  end;
  1421.  if flags.waitpic then
  1422.  begin
  1423.   if flags.err_pic then
  1424.   begin
  1425.    end_dialog(readpic);
  1426.    flags.waitpic:=false;
  1427.    i:=do_alert('[3][MC_TALK:|Bildschirm kann nicht|importiert werden][ Nanu? ]',1);
  1428.   end;
  1429.   if flags.ok_pic then
  1430.   begin
  1431.    xshow;
  1432.    flags.waitpic:=false;
  1433.    end_dialog(readpic);
  1434.   end;
  1435.  end;
  1436. end;
  1437.  
  1438. procedure flcon2(var flags:flagtype;win,half:integer);
  1439. begin
  1440.  if front_window=main_wind then
  1441.  begin
  1442.   if flags.neudia then
  1443.   begin
  1444.    set_md;
  1445.    set_td;
  1446.    begin_update;
  1447.    show_dialog(teldesk);
  1448.    end_update;
  1449.    flags.neudia:=false;
  1450.   end;
  1451.   if flags.neutxt then
  1452.   begin
  1453.    show_txt(win,half);
  1454.    flags.neutxt:=false;
  1455.   end;
  1456.  end;
  1457. end;
  1458.  
  1459. procedure printwahl;
  1460. var hlp:c_string;
  1461.     ADR,i,j:INTEGER;
  1462.     msg:message_buffer;
  1463.     dia:dialog_ptr;
  1464.  
  1465. begin
  1466.  begin_update;
  1467.  find_dialog(prwahl,dia);
  1468.  center_dialog(dia);
  1469.  i:=do_dialog(dia,0);
  1470.  end_dialog(dia);
  1471.  end_update;
  1472.  Obj_SetState(Dia,i,normal,false);
  1473.  hlp[0]:='M';
  1474.  hlp[1]:='I';
  1475.  hlp[2]:='D';
  1476.  hlp[3]:='I';
  1477.  hlp[4]:='_';
  1478.  hlp[5]:='C';
  1479.  hlp[6]:='O';
  1480.  hlp[7]:='M';
  1481.  hlp[8]:=CHR(0);
  1482.  i:=0;
  1483.  if (Obj_State(dia,egal) & selected) <>0 then i:=-1
  1484.  else
  1485.  begin
  1486.   for j:=r0 to r6 do
  1487.    if (Obj_State(dia,j) & selected) <>0 then i:=set_bit(i,j-2);
  1488.  end;
  1489.  set_prconf(i,ring_ptr);
  1490. end;
  1491.  
  1492. procedure mbcon1(dummy:integer;var schluss:boolean;var modus,win,curx:integer);
  1493.  
  1494. begin
  1495.  IF (dummy>0) THEN { Wenn ja, dann entsprechend reagieren }
  1496.  BEGIN
  1497.   CASE dummy OF
  1498.    leavenet:do_login(lognam);
  1499.    weristda:dummy:=show_karte;
  1500.    phone   :BEGIN
  1501.          modus:=2;
  1502.          if lognam='' then do_login(lognam);
  1503.          start_talk(win,curx);
  1504.         END;
  1505.    alltime :set_time;
  1506.    mailsys :do_mail;
  1507.    Kiebitz :ask_bild;
  1508.    prselect:printwahl;
  1509.   END; {case}
  1510.  end;
  1511. END;
  1512.  
  1513. procedure mbcon2(num:integer;var flags:flagtype);
  1514. var info:anytyp;
  1515.     erg:boolean;
  1516.     dummy:string;
  1517.  
  1518. begin
  1519.  IF (num>=tel1) AND (num<=tel6) THEN
  1520.  BEGIN
  1521.  { ist der rechner (num) aktiv, so wird er inaktiv (kann meine Sendungen
  1522.    nicht mehr empfangen }
  1523.   IF talking[num].aktiv THEN talking[num].aktiv:=false
  1524.   ELSE
  1525.   BEGIN
  1526.   { Ist er nicht aktiv, aber noch am Telefon, so wird er wieder aktiv }
  1527.    IF (talking[num].onlin) and (talking[num].called) THEN
  1528.     talking[num].aktiv:=true
  1529.    ELSE
  1530.    BEGIN
  1531.    { Ansonsten wird er angerufen, falls ich ihn anrufen kann }
  1532.     IF ((ring_def[num].status & 263)=263) AND
  1533.     (ring_def[num].my_name=name) THEN
  1534.     BEGIN
  1535.      info.use.what:=talk;
  1536.      info.use.quest.num:=num;
  1537.      info.use.quest.rufer:=lognam;
  1538.      info.use.quest.what:=anm_talk;
  1539.      dummy:='';
  1540. {*** Übermittle den Anruf an Rechner (num) }
  1541.      erg:=transmit(ring_ptr,30,num,dummy,info);
  1542.      talking[num].aktiv:=true;
  1543.      talking[num].called:=true;
  1544.     END;
  1545.    END;
  1546.   end;
  1547.   flags.neudia:=true;
  1548.  END;
  1549. END;
  1550.  
  1551. procedure do_init;
  1552. var i:integer;
  1553.     info:anytyp;
  1554.     dummy:string;
  1555.     erg:boolean;
  1556.  
  1557. BEGIN
  1558.  { Initialisierung der Talk-Anschluesse }
  1559.  FOR i:=1 TO 6 DO
  1560.  BEGIN
  1561.   talking[i].onlin:=false;
  1562.   talking[i].aktiv:=false;
  1563.   talking[i].called:=false;
  1564.   talking[i].who:='';
  1565.   mailbox[i].got_quest:=false;
  1566.   mailbox[i].pfad:='';
  1567.   mailsend[i]:=0;
  1568.  END;
  1569.  
  1570.  { Sende- und Lesepuffer initialisieren }
  1571.  FOR i:=1 TO 9 DO
  1572.  BEGIN
  1573.   szeil[i]:='';
  1574.   rzeil[i]:='';
  1575.  END;
  1576.  szeil[9]:='         ';
  1577.  WHILE length(szeil[9])<70 DO szeil[9]:=concat(szeil[9],'       ');
  1578.  
  1579.  find_dialog(main,maindesk);
  1580.  find_dialog(teflon,teldesk);
  1581.  
  1582.  repeat
  1583.   wait(500);
  1584.  until not mc_busy(ring_ptr);
  1585.  
  1586.  get_karte(ring_ptr);
  1587.  flags.verwok:=false;
  1588.  while not flags.verwok do msg_reader(flags);
  1589.  
  1590.  info.use.quest.what:=login;
  1591.  info.use.quest.rufer:='';
  1592.  info.use.what:=talk;
  1593.  dummy:='';
  1594.  for i:=1 to 6 do
  1595.  begin
  1596.   if ring_def[i].my_name=name then
  1597.   begin
  1598.    info.use.quest.num:=i;
  1599.    erg:=transmit(ring_ptr,80,i,dummy,info);
  1600.   end;
  1601.  end;
  1602.  wait(100);
  1603.  info.use.quest.what:=login;
  1604.  info.use.quest.rufer:=lognam;
  1605.  info.use.what:=talk;
  1606.  dummy:='';
  1607.  for i:=1 to 6 do
  1608.  begin
  1609.   if ring_def[i].my_name=name then
  1610.   begin
  1611.    info.use.quest.num:=i;
  1612.    erg:=transmit(ring_ptr,80,i,dummy,info);
  1613.   end;
  1614.  end;
  1615.  wait(100);
  1616.  set_md;
  1617.  set_td;
  1618. end;{do_init}
  1619.  
  1620. procedure begin_mctalk(var flags:flagtype);
  1621. var x,y,w,h:integer;
  1622. begin
  1623.  begin_update;
  1624.  wname:=' MC_TALK ';
  1625.  main_wind:=new_window(g_close|g_move|g_name,wname,0,0,0,0);
  1626.  if main_wind<>no_window then
  1627.  begin
  1628.   if flags.glocke then
  1629.   begin
  1630.    flags.glocke:=false;
  1631.    off_glocke;
  1632.   end;
  1633.  {$P-}
  1634.  w:=maindesk^[0].ob_w;
  1635.  h:=maindesk^[0].ob_h;
  1636.  x:=maindesk^[0].ob_x;
  1637.  y:=maindesk^[0].ob_y;
  1638.  {$P=}
  1639.   open_window(main_wind,x,y,w,h);
  1640.   pass_wind(maindesk,main_wind);
  1641.   show_dialog(maindesk);
  1642.   modus:=1;
  1643.  end;
  1644.  end_update;
  1645.  flags.waitpic:=false;
  1646.  flags.ok_pic:=false;
  1647.  flags.err_pic:=false;
  1648. end;
  1649.  
  1650.         procedure norm_string(var  str:string);
  1651.         { loescht fuehrende,doppelte und schliessende Leerzeichen }
  1652.         { normiert einen string auf klein-schreibung }
  1653.  
  1654.         var     i,j,k:integer;
  1655.                 st1:str255;
  1656.                 bool:boolean;
  1657.  
  1658.         begin
  1659.          st1:=str;
  1660.          j:=length(st1);
  1661.          if j>0 then
  1662.          begin
  1663.           i:=1;
  1664.           k:=1;
  1665.           bool:=true;
  1666.           repeat
  1667.            if st1[i]<>' ' then
  1668.            begin
  1669.             st1[k]:=st1[i];
  1670.             i:=i+1;
  1671.             k:=k+1;
  1672.             bool:=false;
  1673.            end
  1674.            else
  1675.            if (st1[i]=' ') and not bool then
  1676.            begin
  1677.             st1[k]:=st1[i];
  1678.             i:=i+1;
  1679.             k:=k+1;
  1680.             bool:=true;
  1681.            end
  1682.            else i:=i+1;
  1683.           until i>j;
  1684.           k:=k-1;
  1685.           if bool then k:=k-1;
  1686.           if k>0 then str:=copy(st1,1,k);
  1687.          end;
  1688.         end;
  1689.  
  1690.  
  1691. procedure read_inf(var pfad:string);
  1692. var t     :file of text;
  1693.     help,hlp,zeile :string;
  1694.     num:integer;
  1695.  
  1696. begin
  1697.  flags.okkiebitz:=true;
  1698.  help:='\MC_TALK.INF';
  1699.  boot_drive(help);
  1700.  reset(t,help);
  1701.  if io_result<>0 then
  1702.  begin
  1703.   pfad:='';
  1704.   lognam:='';
  1705.  end
  1706.  else
  1707.  begin
  1708.   while not eof(t) do
  1709.   begin
  1710.    readln(t,zeile);
  1711.    if pos('loginname:',zeile)<>0 then
  1712.    begin
  1713.     hlp:=copy(zeile,11,length(zeile)-10);
  1714.     norm_string(hlp);
  1715.     lognam:=hlp;
  1716.    end
  1717.    else
  1718.    if pos('mail_pfad:',zeile)<>0 then
  1719.    begin
  1720.     hlp:=copy(zeile,11,length(zeile)-10);
  1721.     norm_string(hlp);
  1722.     pfad:=hlp;
  1723.    end
  1724.    else
  1725.    if pos('stop_kieb:',zeile)<>0 then
  1726.    begin
  1727.     hlp:=copy(zeile,11,length(zeile)-10);
  1728.     readv(hlp,num);
  1729.     if io_result=0 then flags.okkiebitz:=(num=0);
  1730.    end;
  1731.   end;
  1732.  end;
  1733.  close(t);
  1734. end;
  1735.  
  1736.     PROCEDURE start_netz;
  1737.     VAR erg:boolean;
  1738.     i,j:integer;
  1739.     msg : Message_Buffer ;
  1740.     event,dummy,mx,my,bcnt,taste,bstate:integer;
  1741.     half,curx:integer;
  1742.     timer:long_integer;
  1743.     schluss:boolean;
  1744.  
  1745.     BEGIN
  1746.      begin_mctalk(flags);
  1747.      flags.glocke:=false;
  1748.  
  1749.      REPEAT
  1750.       timer:=(10-(5*modus))*10;
  1751.       event:=get_event(e_button|e_message|e_keyboard|e_timer,1,1,2,timer,
  1752.                false,0,0,0,0,false,0,0,0,0,
  1753.                msg,taste,bstate,bcnt,mx,my,dummy);
  1754.  
  1755.       { wurde Nachricht empfangen ?? }
  1756.       msg_reader(flags);
  1757.       if flags.mailwork then get_mail(flags);
  1758.  
  1759.       case modus of { reagieren auf veränderte Flags }
  1760.        0:flcon0(flags);
  1761.        1:flcon1(flags);
  1762.        2:flcon2(flags,main_wind,half);
  1763.       end;{case}
  1764.  
  1765.       { Wurde der linke Maus-Button betaetigt ??? }
  1766.       IF ((event & e_button)<>0) AND (bcnt>1) then
  1767.       BEGIN
  1768.        case modus of    { Auswerten von Mausclicks }
  1769.     1:mbcon1(obj_find(maindesk,0,7,mx,my),schluss,modus,main_wind,curx);
  1770.     2:mbcon2(obj_find(teldesk,0,7,mx,my),flags);
  1771.        end;{case}
  1772.       end;
  1773.  
  1774.       IF ((event & e_keyboard)<>0) then
  1775.       begin
  1776.        if modus=2 THEN
  1777.        begin
  1778.     i:=(taste div 256)-58;
  1779.     IF (i>=tel1) AND (i<=tel6) THEN
  1780.      mbcon2(i,flags)
  1781.     else
  1782.      key_interpret(taste,main_wind,half,curx);
  1783.        end
  1784.        else
  1785.        if modus=1 then
  1786.        begin
  1787.     i:=0;
  1788.     case taste of
  1789.       5120 : i:=phone;    { ALT T => Telefon }
  1790.      12544 : i:=weristda; { ALT N => Netz-Karte }
  1791.       7680 : i:=leavenet; { ALT A => Anmeldung }
  1792.       7936 : i:=alltime;  { ALT S => Systemzeit }
  1793.      12800 : i:=mailsys;  { ALT M => Mailbox }
  1794.       9472 : i:=Kiebitz;  { ALT K => Bild importieren }
  1795.       8192 : i:=prselect; { ALT D => Drucker konfigurieren }
  1796.     end;{case}
  1797.     mbcon1(i,schluss,modus,main_wind,curx);
  1798.        end;
  1799.       end;
  1800.  
  1801.       if (event & e_message)<>0 THEN
  1802.       case msg[0] of
  1803.        AC_open    :begin
  1804.           if modus=0 then begin_mctalk(flags);
  1805.          end;
  1806.        AC_close :begin
  1807.           if modus=2 then Close_Port(Get_port);
  1808.           modus:=0;
  1809.          end;
  1810.        wm_closed:begin
  1811.           if modus=2 then do_end_talk(flags,main_wind);
  1812.           if modus=1 then
  1813.           begin
  1814.            close_window(main_wind);
  1815.            delete_window(main_wind);
  1816.           end;
  1817.           modus:=modus-1;
  1818.           if modus<0 then modus:=0;
  1819.          end;
  1820.        wm_redraw:case modus of
  1821.           1: do_redraw(msg[3],msg[4],msg[5],msg[6],msg[7]);
  1822.           2: tel_redraw(msg[3],msg[4],msg[5],msg[6],msg[7],half);
  1823.          end; { case }
  1824.        wm_topped:begin
  1825.           if flags.glocke then
  1826.           begin
  1827.            flags.glocke:=false;
  1828.            off_glocke;
  1829.           end;
  1830.           bring_to_front(msg[3]);
  1831.          end;
  1832.        wm_moved :begin
  1833.           if modus=1 then
  1834.           begin
  1835.            {$P-}
  1836.            maindesk^[0].ob_x:=msg[4];
  1837.            maindesk^[0].ob_y:=msg[5]+19;
  1838.            set_wsize(msg[3],msg[4],msg[5],msg[6],msg[7]);
  1839.            {$P=}
  1840.           end;
  1841.          end;
  1842.       end;
  1843.  
  1844.      UNTIL false;
  1845.     END;
  1846.  
  1847. function test_ring:boolean;
  1848. var dia:dialog_ptr;
  1849.  
  1850. begin
  1851.  find_dialog(initial,dia);
  1852.  center_dialog(dia);
  1853.  begin_update;
  1854.  show_dialog(dia);
  1855.  wait(1000);
  1856.  name:='MC_TALK';
  1857.  if anmeld_ring(name,15000,ring_ptr) then
  1858.  begin
  1859.   wait(500);
  1860.   if mc_closed(ring_ptr) then
  1861.   begin
  1862.    set_dtext(dia,inmeld,'MIDI-RING O.K.',system_font,te_left);
  1863.    show_dialog(dia);
  1864.    do_init;
  1865.    test_ring:=true;
  1866.   end
  1867.   else
  1868.   begin
  1869.    ring_ptr:=abmeld_ring(ring_ptr);
  1870.    test_ring:=false;
  1871.    set_dtext(dia,inmeld,'MIDI-RING ERROR',system_font,te_left);
  1872.    show_dialog(dia);
  1873.    wait(2500);
  1874.   end;
  1875.  end;
  1876.  end_dialog(dia);
  1877.  end_update;
  1878.  set_dtext(dia,inmeld,'Bitte warten',system_font,te_left);
  1879. end;
  1880.  
  1881. procedure first_wait;
  1882. var msg     : Message_Buffer ;
  1883.     event,dummy : integer;
  1884.     timer    : long_integer;
  1885.  
  1886. begin
  1887.  ring_ptr:=nil;
  1888.  for dummy:=1 to 2 do
  1889.  begin
  1890.   wait(6000);
  1891.   if test_ring then start_netz;
  1892.  end;
  1893.  REPEAT
  1894.   event:=get_event(e_message,1,1,2,timer,
  1895.            false,0,0,0,0,false,0,0,0,0,
  1896.            msg,dummy,dummy,dummy,dummy,dummy,dummy);
  1897.  
  1898.   if (event & e_message)<>0 THEN
  1899.   case msg[0] of
  1900.    AC_open  :begin
  1901.           if test_ring then start_netz;
  1902.          end;
  1903.   end;{ case }
  1904.  UNTIL false;
  1905. end;
  1906.  
  1907. procedure get_sys;
  1908. var f1:file of text;
  1909.     num:integer;
  1910.     zeile,hlp:string;
  1911.  
  1912. begin
  1913.  lw:='M';
  1914.  hlp:='\MIDI_COM.INF';
  1915.  boot_drive(hlp);
  1916.  reset(f1,HLP);
  1917.  NUM:=io_result;
  1918.  if num<>0 then
  1919.  begin
  1920.   reset(f1,'MIDI_COM.INF');
  1921.   NUM:=io_result;
  1922.  END;
  1923.  if num=0 then
  1924.  begin
  1925.   while not eof(f1) do
  1926.   begin
  1927.    readln(f1,zeile);
  1928.    if pos('micodrive:',zeile)<>0 then
  1929.    begin
  1930.     hlp:=copy(zeile,11,length(zeile)-10);
  1931.     readv(hlp,num);
  1932.     if (io_result=0) then lw:=chr(num+65);
  1933.    end;
  1934.   end;
  1935.  end;
  1936.  close(f1);
  1937. end;
  1938.  
  1939.     BEGIN
  1940.      io_check(false);
  1941.      lw:='M';
  1942.      apl_nr:=appl_init;
  1943.      if apl_nr>=0 then
  1944.      BEGIN
  1945.       men_name:='  MC_Talk';
  1946.       men_id:=menu_register(apl_nr,men_name);
  1947.       init_mouse;
  1948.       read_inf(mailpfad);
  1949.       get_sys;
  1950.       init_rsc;
  1951.       first_wait;
  1952.      END;
  1953.     end.
  1954.  
  1955.  
  1956.