  PROGRAM t_rechner;
  USES crt,dos;

  CONST          { Konstantenarray mit gleichzeitiger Zuweisung }
   tasten : ARRAY[1..36] OF STRING[3] = (' ce',' û ',' % ','sin','cos',
   ' 7 ',' 8 ',' 9 ',' / ',' n ',' nü','hex',' a ',' b ',' 4 ',' 5 ',' 6 ',
   ' * ',' xı','mod','dru',' c ',' d ',' 1 ',' 2 ',' 3 ',' - ','aus',
   ' -m',' +m',' e ',' f ',' 0 ',' . ',' = ',' + ');

  VAR
      x,y,i,j,z:INTEGER;     { globale Variablen  }
      bildseg:WORD;      { Cga = $b800, Hercules = $b000 }
                         { Vga = $b800 }
      regs:REGISTERS;    { Type registers ist in Unit dos definiert }
                         { globale Proceduren }

  PROCEDURE r_string(zeil,spal,att:BYTE;satz:STRING);
  VAR                  { att -> farbe der Zeichen }
   i,l:INTEGER;
   offset:WORD;
  BEGIN
   l:=LENGTH(satz);    { L„nge des šbergebenen Strings in l speichern }
                       { LENGTH -> ermittle L„nge von satz }
   i:=1;
   offset := (zeil * 160) + (spal * 2); { Offsetanteil der Adresse }
   WHILE i <= l DO                      { MEM[bildseg:offset] bildet die }
     BEGIN                              { Adresse an der ein Zeichen }
       MEM[bildseg:offset]:=ORD(satz[i]); { geschrieben wird }
       INC(offset);                       { ORD liefert den Zahlenwert }
       MEM[bildseg:offset]:=att;          { des Zeichens z.B. 'A' = 65 }
       INC(offset);
       INC(i);
     END;
  END;

  PROCEDURE r_zeichen(zeil,spal:INTEGER;att:BYTE;zeich:CHAR);
  VAR                    {  lokale Variablen zeil,spal usw. }
  offset:WORD;
  BEGIN
  offset := (zeil * 160) + (spal * 2);
  MEM[bildseg:offset]:=ORD(zeich);
  MEM[bildseg:offset + 1]:=att;
  END;

  PROCEDURE rahmen(zeil,spal,breit,hoch,attr,art:BYTE);
  VAR                       { breit = breite des rahmens(anzahl Zeichen) }
  b,h:INTEGER;              { hoch  = h”he des rahmens }
                            { attr  = farbe des Zeichens }
                            { art = einfach 1, doppelt 2, usw. }
  r1, r2, r3, r4, r5, r6:CHAR;

  BEGIN
      CASE art OF
        1:BEGIN
          r1:=#218; r2:=#196; r3:=#191; { r1 = Ú  }
          r4:=#179; r5:=#192; r6:=#217; { einfach }
          END;
        2:BEGIN
          r1:=#201; r2:=#205; r3:=#187; { r1 = É  }
          r4:=#186; r5:=#200; r6:=#188; { doppelt }
          END;
        3:BEGIN
          r1:=#177; r2:=#177; r3:=#177;
          r4:=#177; r5:=#177; r6:=#177; { alle ± }
          END;
        4:BEGIN
          r1:=#176; r2:=#176; r3:=#176;
          r4:=#176; r5:=#176; r6:=#176; { alle ° }
          END;
        5:BEGIN
          r1:=#178; r2:=#178; r3:=#178;
          r4:=#178; r5:=#178; r6:=#178; { alle ² }
          END;
        6:BEGIN
          r1:=#219; r2:=#219; r3:=#219;
          r4:=#219; r5:=#219; r6:=#219; { Û }
          END;
      END;
      r_zeichen(zeil,spal,attr,r1);
       FOR b := 1 TO breit - 1 DO
           r_zeichen(zeil, spal + b, attr, r2);
            r_zeichen(zeil,spal + b,attr,r3);
         FOR h := 1 TO hoch - 1 DO
          BEGIN
            r_zeichen(zeil + h,spal,attr,r4);
             FOR b := 1 TO breit - 1 DO
                 r_zeichen(zeil + h,spal + b,attr,chr(32));
                  r_zeichen(zeil + h,spal + b,attr,r4);
          END;
       r_zeichen(zeil + h,spal,attr,r5);
        FOR b := 1 TO breit - 1 DO
            r_zeichen(zeil + h,spal + b,attr,r2);
        r_zeichen(zeil + h,spal + b,attr,r6);
  END;

  BEGIN                  { HAUPTPROGRAMM }
  CLRSCR;
  regs.ah := 15;
  INTR($10, regs);       { Dieser Aufruf betrifft Dos-Funktionen }
  IF regs.al = 7 then    { dazu kommen wir sp„ter (Grafikteil }
      bildseg := $b000
     ELSE
      bildseg := $b800;
  x:=7;y:=3;z:=1;
  rahmen(0,0,60,21,yellow,1);
  rahmen(1,2,56,6,yellow,2);
  FOR I:= 1 to 4 DO
  BEGIN
      FOR j := 1 to 9 DO
          BEGIN
          rahmen(x,y,5,3,yellow,2);
          INC(y,6);
          IF j = 5 THEN y:= y +1;    { das ist gleich dem befehl INC(y) }
          END;
  INC(x,3);       { erh”he x um 3, -> x := x + 3 }
  y:=3;
  END;
  TEXTCOLOR(white);          { oh wie umst„ndlich }
  GOTOXY(4,3);               { mit r_string gehts schneller }
  WRITE('->');
  GOTOXY(4,4);   { -> GOTOXY = setze Cursor auf spalte 4, zeile 4 }
  WRITE('->');
  GOTOXY(4,6);
  WRITE('Ergebnis:');
  r_string(19,26,red,'D.E.R 3000');  { oder nicht ? }
  x:=8;y:=4;
  FOR I:= 1 to 4 DO       { fhre 4 mal die folgenden Aktionen aus }
  BEGIN                    { aáere Schleife }
      FOR j := 1 to 9 DO   { fhre 9 mal die folgenden Aktionen aus }
          BEGIN            { innere Schleife }
          r_string(x,y,white,tasten[z]);  { tasten[z] -> einzelne Array- }
          INC(y,6);                       { elemente ausgeben            }
          INC(z);                         { Z„hler fr tasten[z] erh”hen }
          IF j = 5 THEN y:= y +1;    { y:=y+1 ist gleich dem befehl INC(y) }
          END;
  INC(x,3);       { erh”he x um 3, -> x := x + 3 }
  y:=4;
  END;
  READLN;
  CLRSCR;
  END.

