               /* Fenster-datei */
           /* Copyright H.-J.Schlossarek 1989 */


#define NOR  0x07 /* normal     */
#define INT  0x0F /* intensiv   */
#define INV  0x70 /* invers     */
#define BLI  0x87 /* blinken    */

void loesch(int, int, int, int);
void rahmen(int, int, int, int, int, int);
void p_zeich(int, int, char, char);
void p_satz(int, int, char, char *);

unsigned int n_balken (int, int, int, int,
int, int, unsigned int, char);

void neg_balken (int, int, char);

extern unsigned int bildseg;
union REGS inregs, outregs;

void loesch(int x1, int y1, int x2, int y2)
/* zeile,spalte oben,zeile,spalte unten */

{
/* ah = F.-Nr.,al = 0 Aussch. wird geloescht */
   inregs.h.ah = 06; inregs.h.al = 0;
   inregs.h.bh = 07;
   inregs.h.ch = x1;  inregs.h.cl = y1;
   inregs.h.dh = x2; inregs.h.dl = y2;
   int86(0x10,&inregs,&outregs);
}

void rahmen (int zeil, int spal,
int breit, int hoch, int attr, int art)
{
  int b, h;
  char r1, r2, r3, r4, r5, r6;

/* auswahl der Zeichen fuer Rahmen */
      switch(art)
      {
        case 1: r1=218; r2=196; r3=191;
         r4=179; r5=192; r6=217; break;

        case 2: r1=201; r2=205; r3=187;
         r4=186; r5=200; r6=188; break;

        case 3: r1=r2=r3=r4=r5=r6=177;
         break;   /* ± */

        case 4: r1=r2=r3=r4=r5=r6=176;
        break;     /* ° */

        case 5: r1=r2=r3=r4=r5=r6=178;
                      /* ² */
       }
/* zeichen Rahmen rechts oben */
   p_zeich(zeil,spal,attr,r1);

/* schleife Rahmenbreite */
   for (b = 1; b < breit; b++)
    p_zeich(zeil, spal + b, attr, r2);

/* zeichen Rahmen links oben */
   p_zeich(zeil,spal + b,attr,r3);

/* schleife Rahmenhoehe */
   for (h = 1; h < hoch; h++)
   {
    p_zeich(zeil + h,spal,attr,r4);
    p_zeich(zeil + h,spal + b,attr,r4);
    }

/* untere Rahmenteile zeichnen */
    p_zeich(zeil + h,spal,attr,r5);
     for (b = 1; b < breit; b++)
     p_zeich(zeil + h,spal + b,attr,r2);
     p_zeich(zeil + h,spal + b,attr,r6);

}

void p_zeich (int x, int y,
char att, char zeich)
{
  unsigned int offset;

/* offsetadresse berechnen */
  offset = (x * 160) + (y * 2);

/* zeichen an adresse bildsegadr * 16 + */
/* offsetadr schreiben */
/* bildadr * 16 wird intern durch pokeb */
/* berechnet  */
  pokeb(bildseg,offset,zeich);
  pokeb(bildseg,offset + 1,att);
}

void p_satz (int x, int y, char att, char *string)
{
   unsigned int offset;
/* siehe p_zeich */
   offset = (x * 160) + (y * 2);

/* solange zeichen im String */
/* vorhanden fuehre schleife aus */
   while (*string)
   {
     pokeb(bildseg,offset++,*string++);

/* offset++ erhoeht adr. um 1 */
/* *string++ erhoeht zeiger um 1 */
/* uebergibt immer naechstes zeichen */
     pokeb(bildseg,offset++,att);
   }
}


unsigned int n_balken (int zeile, int spalte, int z_breit, int z_hoch,
int a_pos, int e_pos, unsigned int pos, char richt)
{
  int x, y, maximal;
  int zeichen, tastcode;
  unsigned int ergeb, taste;
  static unsigned balken[41];
/* Array fuer Bildschirm-Adressen */
  maximal = a_pos * e_pos;
/* Maximale Positionen */
  zeile *= 160; spalte *= 2;
   z_breit *= 2; z_hoch *= 2;
  if ((richt == 'h') || (richt == 'H'))
/* Balken Horizontal oder */
/* Vertikal */
  {
   for (ergeb = 1, x = 0; ergeb <= maximal; x++)
    {
     for (y = 0; y < a_pos; y++, ergeb++)
      balken[ergeb] = zeile * 160 + (x * spalte)
       + (z_breit * x) + (z_hoch * y) + 1;
/* Berechnen der Bildschirmadressen, im Array speichern */
       }                                                                                               /* speichern */
    }else
     for (ergeb = 1, x = 0; ergeb <= maximal; x++)
/* Vertikal */
     {
     for (y = 0; y < a_pos; y++, ergeb++)
     balken[ergeb] = zeile + (x * 160) + spalte
     + (z_hoch * y) + (z_breit * y) + 1;
     }

    neg_balken(balken[ergeb=pos], z_breit, INV);
/* Balken an Pos */
    do
    {
    taste = bioskey(0);   /* Gedrueckte taste */
    tastcode = (taste & 0xFF00) >> 8;  /* Scan-Code */
     zeichen = taste & 0x00FF;
     if ((tastcode == 45) && (zeichen == 27))
/* Alt und x */
      return(0);
      neg_balken(balken[ergeb], z_breit, NOR);
/* Balken loeschen */
      switch(tastcode)
       {
     case 72:           /* Cursor hoch */
       if ((richt == 'h') || (richt == 'H')) break;
        else
       if ((ergeb - a_pos) < 1)
       ergeb = ergeb + (a_pos * (e_pos-1));
        else ergeb = ergeb - a_pos; break;
     case 80:          /* Cursor runter */
       if ((richt == 'h') || (richt == 'H')) break;
        else
       if (ergeb + a_pos > maximal)
        ergeb = ergeb - (a_pos * (e_pos-1));
        else ergeb = ergeb + a_pos; break;
     case 75:          /* Cursor links */
       if ((richt == 'v') || (richt == 'V')) break;
        else
       if (ergeb - a_pos < 1)
        ergeb = ergeb + (e_pos - 1);
        else ergeb = ergeb - a_pos; break;
     case 77:          /* Cursor rechts */
       if ((richt == 'v') || (richt == 'V')) break;
        else
       if (ergeb + a_pos > maximal)
/* ergebnis ausserhalb Bereich */
/* ergeb zurcksetzen */
        ergeb = ergeb - (e_pos -1);
        else ergeb = ergeb + a_pos; break;                                                          /* sonst um a_pos */
/* sonst ergeb erhoehen */
        }
     neg_balken(balken[ergeb], z_breit, INV);
/* Balken zeigen */
    }
    while (zeichen != 13);   /* RETURN = Auswahl */
    neg_balken(balken[ergeb], z_breit, NOR);
/* Balken loeschen */
    return(ergeb);  /* Wert fr Auswahl zurueckliefern */
}

 void neg_balken(int pos, int breite, char att)
/* in pos, erste offsetadresse fuer balkendarstellung */
{
  int zahl;
  for (zahl = 0; zahl <= breite; zahl += 2)
      pokeb(bildseg,pos + zahl,att);
}
/* pos + zahl erhoehen offsetadresse um 2 */


