#include <exec/types.h>
#include <intuition/intuitionbase.h>
#include <exec/memory.h>
#include <graphics/gfxmacros.h>
extern LONG OpenLibrary();
extern void CloseLibrary();
extern BYTE trace,bildaus;
extern char *textpuffer;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Window *Dialog;
extern struct Window *GWindow1;

int x,y; /*Position des Cursors*/
int druck=-1; /*Handle für Druckerdatei*/
int schreiby,schreiboben,schreibscreen,viewschreib;
BYTE UMFORMAT=0;
char *DIALOG;
char zeilen[235]; /*Puffer für die Eingabezeile*/
struct IntuiText text15 =
  {
   0,
   1,                                            /*Menüpunkt quit*/
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Interpreter verlassen",
   NULL
  };

struct MenuItem unter15 =
  {
   NULL,
   0,
   60,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text15,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text14 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Dialog -> PRT:",
   NULL
  };
                                         /*Menüpunkt Ausdruck*/
struct MenuItem unter14 =
  {
   &unter15,
   0,
   48,
   208,
   10,
   ITEMTEXT|ITEMENABLED|CHECKIT|HIGHCOMP,
   0,
   (APTR) &text14,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text13 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Knotenstatistik",
   NULL
  };
                                         /*Menüpunkt Speicherbelegung*/
struct MenuItem unter13 =
  {
   &unter14,
   0,
   36,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text13,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text12 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Lisp-Prg. laden",
   NULL
  };                                  /*Menüpunkt Nachladen*/

struct MenuItem unter12 =
  {
   &unter13,
   0,
   24,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text12,
   NULL,
   0,
   NULL,  /*Untermenüs*/
   0
  };

struct IntuiText text11 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Grafik-Fenster ein/aus",
   NULL
  };

struct MenuItem unter11 =     /* Menüpunkt : Grafik */
  {
   &unter12,
   0,
   12,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text11,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text10 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Editor [Ctrl q]",
   NULL
  };

struct MenuItem unter10 =     /* Menüpunkt : Editor */
  {
   &unter11,
   0,
   0,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text10,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text23 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Trace - Modus",
   NULL
  };

struct MenuItem unter23 =     /* Menüpunkt Trace-Clear */
  {
   NULL,
   0,
   36,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0,
   (APTR) &text23,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text22 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Bindungen löschen",
   NULL
  };

struct MenuItem unter22 =     /* Menüpunkt Speicher-Clear */
  {
   &unter23,
   0,
   24,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text22,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text21 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Symbole bearbeiten",
   NULL
  };

struct MenuItem unter21 =     /* Menüpunkt (varlist) */
  {
   &unter22,
   0,
   12,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text21,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text20 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Symbolliste ansehen",
   NULL
  };

struct MenuItem unter20 =     /* Menüpunkt (varlist) */
  {
   &unter21,
   0,
   0,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text20,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text31 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Pause",
   NULL
  };

struct MenuItem unter31 =     /* Anhalten */
  {
   NULL,
   0,
   12,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0,
   (APTR) &text31,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text30 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Evaluierung abbrechen",
   NULL
  };

struct MenuItem unter30 =     /* Abbruch */
  {
   &unter31,
   0,
   0,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text30,
   NULL,
   0,
   NULL,
   0
  };

struct Menu ober3 =
  {
   NULL,
   400,
   0,
   200,
   10,
   MENUENABLED,
   "Abbruch",
   &unter30
  };

struct Menu ober2 =
  {
   &ober3,
   200,
   0,
   200,
   10,
   MENUENABLED,
   "Variablen",
   &unter20
  };

struct Menu ober1 = /*Anfang der Menü-Struktur*/
  {
   &ober2,
   0,
   0,
   200,
   10,
   MENUENABLED,
   "System",
   &unter10
  };

/* Gadgets */
extern struct Gadget leiste1,leiste2,leiste3;
struct Image    d_img;
struct PropInfo d_prop;
struct Gadget d_gad =
{ NULL,300,201,300,8,GADGHCOMP,GADGIMMEDIATE|RELVERIFY,PROPGADGET,
  (APTR)&d_img,0,NULL,0,(APTR)&d_prop,3,0 };
struct Gadget zhoch = { &leiste1,162,201,24,7,GADGHNONE,GADGIMMEDIATE|RELVERIFY,
                        BOOLGADGET,NULL,NULL,NULL,NULL,NULL,1,NULL };
struct Gadget zrunter={ &zhoch,194,201,24,7,GADGHNONE,GADGIMMEDIATE|RELVERIFY,
                        BOOLGADGET,NULL,NULL,NULL,NULL,NULL,2,NULL };
struct NewWindow NewDialog =
{ 0,0,640,256,0,1,
  MENUPICK|GADGETUP,
  ACTIVATE|WINDOWDEPTH,
  &zrunter,NULL,
  "ALisp -  Dialogfenster",
  NULL,NULL,
  0,0,0,0,
  WBENCHSCREEN
};

struct IntuiMessage *message;
ULONG MessageClass;
USHORT code;
struct RastPort *RPort,*DPort;  /*RPort = DPort*/

struct IntuiText vitext =
{  0,1,JAM2,0,0,NULL,
   "Eingabefenster      <-  ->",NULL };
void virtuellesFenster()
{  SetAPen(RPort,1);
   RectFill(RPort,2,200,637,209);
   PrintIText(RPort,&vitext,2,201);
   SetAPen(RPort,0);
   RectFill(RPort,2,210,637,253);
   SetAPen(RPort,1);
   RefreshGadgets(&zrunter,Dialog,0);
}
struct { char text[234];
         int ende;       }ringliste[8];

struct IntuiText text =  /*Struktur zum Erstellen des Fensterinhaltes*/
  {
   1,
   0,
   JAM2,
   8,
   1,
   NULL,
   "",
   NULL
  };

struct IntuiText dtext =  /*Ausgabe im Dialogfenster*/
  {
   1,
   0,
   JAM1,
   8,
   13,
   NULL,
   "",
   NULL
  };

UWORD  maus2[]= { 0x0000,0x0000,
                  0x03c0,0x0000,
                  0x0ff0,0x0000,
                  0x1ff8,0x0000,
                  0x3ffc,0x0000,
                  0x7ffe,0x0000,
                  0x7ffe,0x0000,
                  0xffff,0x0000,
                  0xffff,0x0000,
                  0xffff,0x0000,
                  0xffff,0x0000,
                  0x7ffe,0x0000,
                  0x7ffe,0x0000,
                  0x3ffc,0x0000,
                  0x1ff8,0x0000,
                  0x0ff0,0x0000,
                  0x03c0,0x0000,
                  0x0000,0x0000 };

UWORD  maus1[]= { 0x0000,0x0000,
                  0xff00,0x0000,
                  0xfe00,0x0000,
                  0xfc00,0x0000,
                  0xf800,0x0000,
                  0xfc00,0x0000,
                  0xee00,0x0000,
                  0xc700,0x0000,
                  0x8380,0x0000,
                  0x01c0,0x0000,
                  0x00e0,0x0000,
                  0x0070,0x0000,
                  0x0038,0x0000,
                  0x001c,0x0000,
                  0x000c,0x0000,
                  0x0000,0x0000,
                  0x0000,0x0000,
                  0x0000,0x0000 };

/* Variablendefinition :
   schreibscreen : wird geschrieben, so muß dieser Ausschnitt dargestellt sein.
   viewschreib : dieser Screen ist gerade sichtbar
   schreiboben : erste Zeile der History (rotiert).
   schreiby    : letzte Zeile
   az          : Zeilenzahl der History ohne sichtbaren Bereich */

int az=0;

void darstellen(position) /*stellt die gewünschte Position des
                            Ausgabefensters dar*/
int position;
{  /*Bildschirm löschen*/
   int i=0,j,nr;
   char *hilf,z;
   SetAPen(Dialog->RPort,0);            /*Fenster löschen*/
   RectFill(Dialog->RPort,4,12,636,199);
   SetAPen(Dialog->RPort,1);
   while(i<=22)
   {   if((nr=position+i)>124)
         nr-=125;
       hilf=DIALOG+81*nr;
       if(j=(int)(*(hilf+80))) /* beginnt farbig*/
       {  z=*(hilf+j);*(hilf+j)=0;
          dtext.FrontPen=2;
          dtext.IText=hilf;
          PrintIText(DPort,&dtext,0,i<<3);
          dtext.FrontPen=1;
          *(hilf+j)=z;
          dtext.IText=hilf+j;
          PrintIText(DPort,&dtext,j<<3,(i++)<<3);
       }
       else
       { dtext.IText=hilf;
         PrintIText(DPort,&dtext,0,(i++)<<3);
       }
       if(nr==schreiby) /*Darstellungsende erreicht*/
         i=23;
   }
   viewschreib=position;
}
void pagedown()
{  if(viewschreib==schreiboben)
   { if(UMFORMAT) darstellen(schreibscreen); UMFORMAT=0; return(); }
   if(viewschreib>schreiboben)
   { if(viewschreib-schreiboben>23)
     { darstellen(viewschreib-23); d_prop.HorizPot+=0xffff/az*23;}
     else
     { darstellen(schreiboben); d_prop.HorizPot=0xffff; }
   }
   else
   { if(viewschreib+125-schreiboben>23)
     {  if(viewschreib-23<0) darstellen(viewschreib-23+125);
                        else darstellen(viewschreib-23);
        d_prop.HorizPot+=0xffff/az*23;
     }
     else
     { darstellen(schreiboben); d_prop.HorizPot=0xffff; }
   }
   RefreshGadgets(&d_gad,Dialog,0);
}
void pageup()
{  if(viewschreib==schreibscreen)
   {  if(UMFORMAT) darstellen(schreibscreen); UMFORMAT=0; return(); }
   if(viewschreib<schreibscreen)
   {  if(schreibscreen-viewschreib>23)
      { darstellen(viewschreib+23); d_prop.HorizPot-=0xffff/az*23; }
      else
      { darstellen(schreibscreen); d_prop.HorizPot=0; }
   }
   else
   {  if(125-viewschreib+schreibscreen>23)
      {  darstellen((viewschreib+23)%125); d_prop.HorizPot-=0xffff/az*23;}
      else
      {  darstellen(schreibscreen); d_prop.HorizPot=0; }
   }
   RefreshGadgets(&d_gad,Dialog,0);
}
void setpage()
{  int nr,hilf;
   nr=d_prop.HorizPot;
   if(!az) return();
   nr/=(0xffff/az);
   if((hilf=schreibscreen-nr)<0) hilf=125+schreibscreen-nr;
   if(hilf==schreiby) /*Rundungsfehler !*/
     hilf=(hilf+1)%125;
   darstellen(hilf);
}
void linedown()
{  if(viewschreib!=schreiboben) /* 1 hoch */
   {  char *hilf,z;
      int i;
      if(UMFORMAT) { darstellen(schreibscreen); UMFORMAT=0; return(); }
      ScrollRaster(DPort,0,-8,4,12,635,196);
      if(--viewschreib<0) viewschreib=124;
      hilf=DIALOG+81*viewschreib;
      if(i=(int)(*(hilf+80))) /* beginnt farbig*/
      {  z=*(hilf+i);*(hilf+i)=0;
         dtext.FrontPen=2;
         dtext.IText=hilf;
         PrintIText(DPort,&dtext,0,0);
         dtext.FrontPen=1;
         *(hilf+i)=z;
         dtext.IText=hilf+i;
         PrintIText(DPort,&dtext,i<<3,0);
      }
      else
      { dtext.IText=DIALOG+81*viewschreib;
        PrintIText(DPort,&dtext,0,0);
      }           /*Fehlerkorrektur :*/
      if(viewschreib==schreiboben) d_prop.HorizPot=0xffff;
      else  d_prop.HorizPot+=0xffff/az;
      RefreshGadgets(&d_gad,Dialog,0);
   }
}
void lineup()
{  int i,merke;
   char z,*hilf;
   if(viewschreib!=schreibscreen)
   {  if(UMFORMAT) { darstellen(schreibscreen); UMFORMAT=0; return(); }
      ScrollRaster(DPort,0,8,4,13,635,197);
      if(++viewschreib>124) viewschreib=0;
      merke=viewschreib+22; if(merke>124) merke-=125;

      hilf=DIALOG+81*merke;
      if(i=(int)(*(hilf+80))) /* beginnt farbig*/
      {  z=*(hilf+i); *(hilf+i)=0; 
         dtext.FrontPen=2;
         dtext.IText=hilf;
         PrintIText(DPort,&dtext,0,176);
         dtext.FrontPen=1;
         *(hilf+i)=z;
         dtext.IText=hilf+i;
         PrintIText(DPort,&dtext,i<<3,176);
      }
      else
      { dtext.IText=hilf;
        PrintIText(DPort,&dtext,0,176);
      }
      if(viewschreib==schreibscreen) d_prop.HorizPot=0;
      else d_prop.HorizPot-=0xffff/az;
      RefreshGadgets(&d_gad,Dialog,0);
   }
}
extern BYTE EDACTIVE;
/* nprint ersetzt printf im Dialogfenster*/
void nprint(string)
char *string;
{  static char puffer[80];
   static BYTE rotieren=0; /* falls 1 wird Historyanfang auch bewegt*/
   static int x=0,merke=0,y=0; /*x gibt die Position ohne, merke mit
   /*Grafikfenster in einer Zeile wieder*/
   extern struct Window *GWindow1;
   extern int ednprintpos;
   int i=0,j; /* gibt Breite des Ausgabefensters an.*/
   char *z,*z1;
   if(EDACTIVE) /* zur Zeit im Editor, Ausgabe->textpuffer*/
   {  z=string; z1=textpuffer+ednprintpos;
      while((ednprintpos<39999)&&(*z)) {*z1++=*z++;ednprintpos++; }
      *z1=0;
      return();
   }
   if(druck!=-1) /*Text soll auch auf den Drucker*/
   {  z=string;
      while(*z++) i++;        /*Stringlänge ermitteln*/
      i=write(druck,string,i);/*und ausdrucken*/
   }
   /*prüfen, ob Ausgabefenster richtig positioniert ist*/
   if(viewschreib!=schreibscreen)
   { darstellen(schreibscreen); d_prop.HorizPot=0; RefreshGadgets(&d_gad,Dialog,0);}
   if((!rotieren)&&(schreiby<22)&&(!UMFORMAT)) y=schreiby;
   dtext.IText=&puffer[0];
   while(*string!=0)
   {  if((*string=='\n')||(x>=78))
      { y++; if(y>22)
             {  if(!rotieren)
                {  d_prop.HorizBody=0xffff/(++az+23)*23;
                   RefreshGadgets(&d_gad,Dialog,0); }
                y=22; ScrollRaster(DPort,0,8,4,13,635,197);
                if(rotieren||(schreiby>21))
                  schreibscreen=(schreibscreen+1)%125;
             }
        if(++schreiby>124) /* einmal History voll */
        {  schreiby=0; rotieren=1; }
        if(rotieren) schreiboben=(schreiboben+1)%125;
        *(DIALOG+81*schreiby)=*(DIALOG+81*schreiby+80)=0;/* neue Zeile leer*/
        x=merke=0;
        if(*string=='\n') string++;
        viewschreib=schreibscreen;
      }
      else
      {  i=x;j=merke;z=&puffer[0];z1=(DIALOG+81*schreiby+x);
         while((i<78)&&(*string!='\n')&&(*string!=0))
         {  *z++=*string; *z1++=*string++; i++;
            if(GWindow1)
            { j++;
              if(j>=24)
              { *z=0;j=0;PrintIText(DPort,&dtext,merke<<3,y<<3);
                y++; merke=0;z=&puffer[0];
                if(y>22) {y=22; ScrollRaster(DPort,0,8,4,13,635,197); }
                UMFORMAT=1; /*spätere Umformatierung erforderlich*/
              }
            }
         }
         *z=0;*z1=0;
         PrintIText(DPort,&dtext,merke<<3,y<<3);
         merke=x=i;if(GWindow1) merke=j;
      }
   }
}

/* rprint gibt die Ausgaben in einer Warnfarbe aus */
/* Die Ausgabe muß zu Beginn einer Zeile stehen und endet mit Space\0 */
/* Zu Beginn muß \n stehen. */
void rprint(string)
char *string;
{  char *z;
   int i=-1;
   if(EDACTIVE) return();
   z=string;
   while(*z++!=0) i++;
   if(viewschreib!=schreibscreen)
   { darstellen(schreibscreen); d_prop.HorizPot=0; RefreshGadgets(d_gad,Dialog,0);}
   dtext.FrontPen=2;
   nprint(string);
   dtext.FrontPen=1;
   *(DIALOG+81*schreiby+80)=(char)i; /*Farbmarkierung setzen (Anzahl der farbigen Zeichen)*/
}

extern char *req();

/* Filerequester der arp.library oeffnen */

unsigned long *arplib;
char arpname[12]="arp.library";
char filereq[30];
char filename[33]=".lsp";
char dirname[33]=":lisp";
char realfilename[66]="";
char freqtext[30];

int dir()
{
   int done=0;  /* 0 cancel 1 eigener Requester 2 klappt*/

#asm
   move.l 4,a6
   move.l #0,d0
   lea _arpname,a1
   jsr -552(a6)
   move.l d0,_arplib
   tst.l d0
   bne.s weiter
   move.l #1,-4(a5)
   bne.s exit
  weiter:
   lea _filereq,a0
   lea _freqtext,a1
   move.l a1,(a0)+
   lea _filename,a1
   move.l a1,(a0)+
   lea _dirname,a1
   move.l a1,(a0)+
   move.l #0,(a0)+
   clr.l (a0)
   lea _filereq,a0
   move.l _arplib,a6
   jsr -294(a6)
   tst.l d0
   beq.s ende
   move.l #2,-4(a5)
   lea _realfilename,a2
   move.l a2,a0
   lea _dirname,a1
  loop:
   move.b (a1)+,(a2)+
   bne.s loop
   lea _filename,a1
   move.l _arplib,a6
   jsr -624(a6)
  ende:
   move.l _arplib,a1
   move.l 4,a6
   jsr -414(a6)
  exit:
#endasm

   return(done);
}

int kopf=0; /*Kopf der Ringliste*/

UWORD *datas;
extern UWORD *AllocMem();
BYTE Editor;
extern BYTE edinit();
struct SpriteImage *Cursor=0L;
int SpriteNo=0;
struct SimpleSprite { UWORD *posctldata,height,x,y,num; };
struct SimpleSprite CursorSprite = {0L,9,6,11,2 };

void coninit()
{  int i;
   UWORD *z1,*z2;
   ULONG *z;
   IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",0L);
   GfxBase = (struct GfxBase*)OpenLibrary("graphics.library",0L);
   d_prop.Flags = FREEHORIZ|AUTOKNOB;
   d_prop.HorizBody = 0xFFFF;    /*Proportional-Gadget init.*/
   d_prop.HorizPot = 0;
   if(!(Dialog=(struct Window*)OpenWindow(&NewDialog)))
      exit();
   if(datas=AllocMem(204L,3L))
   {  z1=datas;z2=&maus2[0];
      for(i=0;i<36;i++)
        *z1++=*z2++;
      z2=&maus1[0];
      for(i=0;i<36;i++)
        *z1++=*z2++;
      Cursor=((char*)datas)+160;
      CursorSprite.posctldata=Cursor;
      z=Cursor;
      *z++=0L; *z++=0x80008000; for(i=0;i<7;i++) *z++=0x80008000;
      *z++=0xf000f000; *z=0L; /*Cursor-Daten*/
      SetRGB4(&(Dialog->WScreen->ViewPort),23,13,4,1);
      SpriteNo=GetSprite(&CursorSprite,2);
      if(SpriteNo==-1)
      {  FreeMem(datas,204L); CloseWindow(Dialog);exit();}
   }
   else
   {  CloseWindow(Dialog);
      exit();
   }
   if(!(DIALOG=AllocMem(10130L,1L)))
   {  FreeSprite(SpriteNo);
      FreeMem(datas,204L);
      CloseWindow(Dialog); exit();
   }
   schreiby=0;viewschreib=0;schreiboben=0;schreibscreen=0;
   *DIALOG=*(DIALOG+80)=0;
   RPort=DPort=Dialog->RPort;
   virtuellesFenster();
   nprint(" Amiga   ©1990 Steffen Goebbels, Alte Heerstr.25 D4179 Weeze (02837/1546)\n");
   nprint("    Lisp Semesteranschrift : Muffeter Weg 39 D5100 Aachen (0241/870384)\n");
   SetMenuStrip(Dialog,&ober1);
   for(i=0;i<10;i++)
      ringliste[i].text[0]=0; /*Ringliste initialisieren*/
   Editor=edinit();
   if(!Editor) { rprint("Achtung :");nprint("nicht genügend Speicher für den Editor frei.\n");}
}

struct IntuiText reqe =  /*Struktur zum Erstellen eines Requestertextes*/
  {
   0,
   1,
   JAM1,
   17,
   20,
   NULL,
   "Sind Sie Sich sicher ?",
   NULL
  };

struct IntuiText ja =
  {
   0,
   1,
   JAM2,
   7,
   4,
   NULL,
   "JA",
   NULL
  };

struct IntuiText nein =
  {
   0,
   1,
   JAM2,
   7,
   4,
   NULL,
   "NEIN",
   NULL
  };


void print(zeiger,x,y,end)    /*print gibt die Window-Textstruktur aus*/
char *zeiger;
int x,y,end; /* Anfang bzw. Ende des Darstellungsbereichs*/
{  char merke;
   text.IText=zeiger;
   if((y==0)||((y==1)&&(x==0)))
   { merke=*(zeiger+78);*(zeiger+78)=0;
     PrintIText(RPort,&text,0,214);
     *(zeiger+78)=merke;
   }
   if((end>77)&&((y<2)||(x==0)))
   { merke=*(zeiger+156);*(zeiger+156)=0;
     text.IText=zeiger+78;
     PrintIText(RPort,&text,0,223);
     *(zeiger+156)=merke;
   }
   if(end>154)
   { text.IText=zeiger+156;
     PrintIText(RPort,&text,0,232);
   }
}
extern BYTE ed();
void menuset()
{ OnMenu(Dialog,0);OnMenu(Dialog,1);
  if(!Editor) unter10.Flags=ITEMTEXT|HIGHCOMP;
  unter11.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
  unter12.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
  unter14.Flags|=ITEMENABLED;
  unter13.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
  unter15.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
  unter21.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
  unter22.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
  unter23.Flags|=ITEMENABLED;
  unter31.Flags=ITEMTEXT|HIGHCOMP|CHECKIT;
}
void menuclear()
{ OffMenu(Dialog,0);   /*Menüs auf Geisterschrift setzen*/
  OffMenu(Dialog,1);
  unter11.Flags=ITEMTEXT|HIGHCOMP;
  unter12.Flags=ITEMTEXT|HIGHCOMP;
  unter14.Flags&=(0xffff-ITEMENABLED);
  unter13.Flags=ITEMTEXT|HIGHCOMP;
  unter15.Flags=ITEMTEXT|HIGHCOMP;
  unter21.Flags=ITEMTEXT|HIGHCOMP;
  unter22.Flags=ITEMTEXT|HIGHCOMP;
  unter23.Flags&=(0xffff-ITEMENABLED);
}
int AReq()
{  return(AutoRequest(NULL,&reqe,&ja,&nein,NULL,NULL,270,70));  }
extern BYTE breakmenu();

BYTE calleditor()
{ if(Editor) /*Editor vorhanden*/
  { menuclear();
    OFF_DISPLAY;
    OffGadget(&zhoch,Dialog,0);
    OffGadget(&zrunter,Dialog,0);
    OffGadget(&d_gad,Dialog,0);
    OffGadget(&leiste1,Dialog,0);
    OffGadget(&leiste2,Dialog,0);
    OffGadget(&leiste3,Dialog,0);
    if(ed())
    { OnGadget(&zhoch,Dialog,0);
      OnGadget(&zrunter,Dialog,0);
      OnGadget(&d_gad,Dialog,0);
      OnGadget(&leiste1,Dialog,0);
      OnGadget(&leiste2,Dialog,0);
      OnGadget(&leiste3,Dialog,0);
      virtuellesFenster();
      print(zeilen,0,0,155);
      MoveSprite(&(Dialog->WScreen->ViewPort),&CursorSprite,(x<<3)+6,y*9+214);
      ON_DISPLAY;
      darstellen(viewschreib);
      return(20); }
    else
    { OnGadget(&zhoch,Dialog,0);
      OnGadget(&zrunter,Dialog,0);
      OnGadget(&d_gad,Dialog,0);
      OnGadget(&leiste1,Dialog,0);
      OnGadget(&leiste2,Dialog,0);
      OnGadget(&leiste3,Dialog,0);
      virtuellesFenster();
      print(zeilen,0,0,155);
      menuset();
      MoveSprite(&(Dialog->WScreen->ViewPort),&CursorSprite,(x<<3)+6,y*9+214);
      ON_DISPLAY;
      darstellen(viewschreib);
      return(1); }
  }
  return(1);
}
extern struct IntuiText leiste1txt,leiste2txt,leiste3txt;
void dia_prt()
{ if(druck==-1)
  {  int dummy=0;
     unter14.Flags|=CHECKED;
     druck=open("PRT:",1,dummy);
     if(druck==-1)
     { if(unter14.Flags&ITEMENABLED)
          unter14.Flags=ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT;
       else
          unter14.Flags=ITEMTEXT|HIGHCOMP|CHECKIT;
     }
     else { *(leiste3txt.IText)='°';RefreshGadgets(&leiste3,Dialog,0l); }
  }
  else
  {  close(druck);
     if(unter14.Flags&ITEMENABLED)
        unter14.Flags=ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT;
     else
        unter14.Flags=ITEMTEXT|HIGHCOMP|CHECKIT;
     druck=-1;
     *(leiste3txt.IText)=' ';RefreshGadgets(&leiste3,Dialog,0l);
  }
}
void f_trace()
{
  if(trace)
  { if(unter23.Flags&ITEMENABLED)
       unter23.Flags=ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT;
    else
       unter23.Flags=ITEMTEXT|HIGHCOMP|CHECKIT;
    *(leiste2txt.IText)=' ';
  }
  else
  { *(leiste2txt.IText)='°';
    unter23.Flags|=CHECKED;
  }
  trace=!trace;
  RefreshGadgets(&leiste2,Dialog,0L);
}
void b_allow()
{  if(bildaus)
     *(leiste1txt.IText)=' ';
   else
     *(leiste1txt.IText)='°';
   RefreshGadgets(&leiste1,Dialog,0L);
}
BYTE menu()
{  int i; 
   if(MENUNUM(code) != MENUNULL)
     switch(MENUNUM(code))
     {  case 0: {  switch(ITEMNUM(code))
                   { case 0: return(calleditor()); /*Editor vorhanden*/
                             break;
                     case 1: return(19);
                     case 2:  strcpy(freqtext,"Lispprogramm laden");
                              i=dir();
                              if(i==0) return(1);
                              if(i==2) return(9);
                              return(4);
                     case 3: return(5); /*(free)*/
                     case 4: dia_prt(); return(1);
                     case 5: if(AReq())
                                return((BYTE)ITEMNUM(code)-3);
                             else
                                return(1);
                   }
                }
        case 1: {  switch(ITEMNUM(code))
                   { case 0: return(6);
                     case 1: return(3);
                     case 2: if(AReq())
                                return(8);
                             else
                                return(1);
                     case 3: f_trace();
                             return(1);
                   }
                }
        case 2: return(1);
     }
   return(1);
}

/* transform wandelt RAW-Codes in ASCII-Codes um*/
extern char transform();

void cursorcontrol(zeichen)
char zeichen;
{  if(x<0) {x=77;y--;}
   else if(x>77) {x=0;y++;}
   if(y<0) {y=0; if(zeichen!=28) x=0;}
   else if(y>2) {y=2; if(zeichen!=29) x=77;}
   if((x==0)&&(y==0)) x=1;
   MoveSprite(&(Dialog->WScreen->ViewPort),&CursorSprite,(x<<3)+6,y*9+214);
}

/* mit escape wird das Esc-Menu während der Interpretation abgefragt.*/

BYTE escape()
{  BYTE meldung=0;
   extern BYTE breakmenu();
   while(message=GetMsg(Dialog->UserPort))
   {  MessageClass=message->Class;
      code=message->Code;
      ReplyMsg(message);
      if(MessageClass==MENUPICK)
      {  if(MENUNUM(code) == 2)
           if(ITEMNUM(code)==0)
              meldung=1;
           else
           { if(!breakmenu())
             {code=0;
              unter31.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED|CHECKIT|CHECKED;
              do
              { if(message=GetMsg(Dialog->UserPort))
                {  MessageClass=message->Class;
                   code=message->Code;
                   ReplyMsg(message);
                   if(MessageClass==GADGETUP)
                   {  switch(((struct Gadget*)message->IAddress)->GadgetID)
                      { case 1 : lineup(); break;
                        case 2 : linedown(); break;
                        case 3 : setpage(); break;
                        case 4 : bildaus=!bildaus; b_allow(); break; /*allow/forbid*/
                        case 5 : f_trace(); break;
                        case 6 : dia_prt(); break;
                      }
                   }
                }
                else
                   Wait(1<<Dialog->UserPort->mp_SigBit);
              }while((MessageClass!=MENUPICK)||(MENUNUM(code)!=2));
              if(ITEMNUM(code)==0)  /* break nach stop */
                 meldung=1;
             }
             unter31.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED|CHECKIT;
           }
      }
      else if(MessageClass==GADGETUP)
      {  switch(((struct Gadget*)message->IAddress)->GadgetID)
         { case 1 : lineup(); break;
           case 2 : linedown(); break;
           case 3 : setpage(); break;
           case 4 : bildaus=!bildaus; b_allow(); break;
           case 5 : f_trace(); break;
           case 6 : dia_prt(); break;
         }
      }
   }
   return(meldung);
}

BYTE menuflag=1;  /*Erlaubt oder verbietet Menüs bei der Eingabe*/

char* newcon()
{  BYTE flag=1;
   char zeichen,*z1,*z2;
   int i,j,listpos,merke,ende=0;
   extern BYTE ctrl;
   x=1;y=0;listpos=kopf;
   for(j=1;j<234;j++)        /*Eingabefeld zurücksetzen.*/
      ringliste[kopf].text[j]=zeilen[j]=' ';
   zeilen[0]=ringliste[kopf].text[0]='>';
   zeilen[234]=0; /*Stringende*/
   SetAPen(Dialog->RPort,0);            /*Fenster löschen*/
   RectFill(Dialog->RPort,4,210,637,242);
   SetAPen(Dialog->RPort,1);
   cursorcontrol(0);
   /*hier auch noch Cursor setzen*/
   if(menuflag)
   {  ModifyIDCMP(Dialog,MENUPICK|RAWKEY|GADGETUP);
      {  OffMenu(Dialog,2);/*break verbieten*/
         menuset();
      }
   }
   else
   {  OffMenu(Dialog,2);
      unter31.Flags=ITEMTEXT|HIGHCOMP|CHECKIT;
      ModifyIDCMP(Dialog,RAWKEY|GADGETUP);
   }
   SetPointer(Dialog,(datas+36),16,16,-3,-3);
   text.IText=">";  /*Prompt ausgeben*/
   PrintIText(RPort,&text,0,214);
   do
   {  Wait(1<<Dialog->UserPort->mp_SigBit);
      while((message=GetMsg(Dialog->UserPort))&&(flag==1))
      {  MessageClass=message->Class;
         code=message->Code;
         ReplyMsg(message);
         if(MessageClass==MENUPICK) flag=menu();
         else
            if(MessageClass==RAWKEY)
            {  zeichen=transform(code);
               if(zeichen==13)
               {  if(ende!=0)
                  { flag=0; /*fertig*/
                    for(i=0;i<234;i++)  /*In die Ringliste einfügen*/
                      ringliste[kopf].text[i]=zeilen[i];
                    ringliste[kopf].ende=ende;
                    kopf=(kopf+1)%8;
                    /*Endzeichen setzen*/
                    if(ende<234)
                    {  zeilen[ende]='þ';
                       print(zeilen,x,y,ende);
                    }
                  }
               }
               else
               {  if((((int)zeichen>31)||((int)zeichen<0))&&(!ctrl))
                  /*Zeichen druckbar*/
                  { /*alle Zeichen eins weiterschieben*/
                    if((ende==234)&&(zeilen[233]==' ')) ende--;
                    if(ende<234) /*Zeichen paßt noch*/
                    {  merke=y*78+x;
                       if(ende>0)
                          z1=&zeilen[ende];z2=&zeilen[ende-1];
                       for(j=ende++;j>merke;j--)
                          *z1--=*z2--;
                       zeilen[merke]=zeichen;
                       x++;
                       if(ende<=merke) ende=merke+1;
                       print(zeilen,x,y,ende);
                       cursorcontrol(zeichen);
                    }
                  }
                  else
                  /*Steuercode*/
                  if(zeichen!=0)
                  { switch((int)zeichen)
                    {case  3 : if(listpos==0) listpos=7;
                               else listpos--;
                               if(ringliste[listpos].text[0]==0)
                                  listpos=(listpos+1)%8;
                               else /*Page up*/
                               {  for(i=0;i<234;i++)
                                    zeilen[i]=ringliste[listpos].text[i];
                                  ende=ringliste[listpos].ende;
                               }
                               print(zeilen,5,0,230); break;
                     case  4 : listpos=(listpos+1)%8;
                               if(ringliste[listpos].text[0]==0)
                                  listpos--; /*kein Übertrag möglich*/
                               else /*Page down*/
                               {  for(i=0;i<234;i++)
                                    zeilen[i]=ringliste[listpos].text[i];
                                  ende=ringliste[listpos].ende;
                               } print(zeilen,5,0,230); break;
                     case  5 : x=ende%78;y=ende/78; break;
                     case  6 : x=0;y=0; break;
                     case  8 : if(x<233) x++;
                               else break;
                     case  9 : merke=y*78+x; /*Backspace*/
                               if(merke>1)
                               { z1=&zeilen[merke-1];
                                 z2=&zeilen[merke];
                                 for(j=merke;j<ende;j++)
                                   *z1++=*z2++;
                                 if(ende>=merke)
                                 {  zeilen[--ende]=' ';
                                    print(zeilen,x,y,ende);
                                 }
                                 x--;
                               } print(zeilen,x,y,ende);break;
                     case 14 : /* line up im Dialogfenster*/
                               lineup();break;
                     case 15 : linedown(); break;
                     case 16 : pageup();break;
                     case 17 : pagedown();break;
                     case 28 : y--;break;
                     case 29 : y++;break;
                     case 30 : x++;break;
                     case 31 : x--;break;
                     case 't': x+=4;break;
                     case 'q': if(menuflag) flag=calleditor(); break;
                    }
                    cursorcontrol(zeichen);
                  }
               }
            }
            else if(MessageClass==GADGETUP)
            {  switch(((struct Gadget*)message->IAddress)->GadgetID)
               { case 1 : lineup(); break;
                 case 2 : linedown(); break;
                 case 3 : setpage(); break;
                 case 4 : bildaus=!bildaus; b_allow(); break;
                 case 5 : f_trace(); break;
                 case 6 : dia_prt(); break;
               }
            }
      }
   }while(flag==1);
   ModifyIDCMP(Dialog,MENUPICK|GADGETUP);
   OnMenu(Dialog,2);    /*break erlauben*/
   unter31.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED|CHECKIT;
   SetPointer(Dialog,datas,16,16,-8,-8);
   if(!menuflag) menuflag=1;
   else
     menuclear();   /*Menüs auf Geisterschrift setzen*/
   switch(flag)
   { case 0 : ende--;
              while((ende>0)&&(zeilen[ende]==' ')) ende--;
              zeilen[ende+1]=0; /*überflüssige Leerzeichen abschneiden*/
              nprint("\n");nprint(zeilen); /*ins Dialogfenster schreiben*/
              nprint("\n");
              break;
     case 2 : zeilen[0]=1;zeilen[1]=0; break;
     case 3 : nprint("\n[Variablen bearbeiten:]\n");zeilen[0]=3;zeilen[1]=0; break; /*breakmenu*/
     case 4 :
     case 9 : if(flag==4)  z1=req(0);
                     else  z1=realfilename;
              strcpy(zeilen,"(load \"");z2=&zeilen[7];
              while(*z1) *z2++=*z1++; /*Name kopieren*/
              strcpy(z2,"\")");nprint("\n");
              nprint(zeilen);nprint("\n");
              break;
     case 5 : strcpy(zeilen,"(free)");nprint("\n");
              nprint(zeilen);nprint("\n");
              break;
     case 6 : strcpy(zeilen,"(varlist)");nprint("\n");
              nprint(zeilen);nprint("\n");
              break;
     case 8 : zeilen[0]=2;zeilen[1]=0;nprint("\n");
              rprint("Achtung :");nprint("Bindungen gelöscht.\n"); break;
     case 19: if(GWindow1) strcpy(zeilen,"(text)");
                      else strcpy(zeilen,"(graphic)");
              nprint("\n");nprint(zeilen);nprint("\n");
              break;
     case 20: nprint("\n[Blockauswertung:]\n");return(textpuffer); /*Block auswerten*/
   }
   if(zeilen[0]=='>') return(&zeilen[1]);
   else return(&zeilen[0]);
}
extern void edclose();
void conreinit()
{  ClearMenuStrip(Dialog);
   FreeSprite(SpriteNo);
   FreeMem(DIALOG,10130L);
   FreeMem(datas,204);
   CloseWindow(Dialog);
   CloseLibrary(GfxBase);
   CloseLibrary(IntuitionBase);
   edclose();
   if(druck!=-1)
      close(druck); /*Druckerdatei schließen*/
}


