home *** CD-ROM | disk | FTP | other *** search
/ Die ASC Mega 2 / ASC-Mega2-CD-ROM.iso / SPIELE / KAISER / FONTEDIT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-11-09  |  34.8 KB  |  1,167 lines

  1. program fontedit;
  2. (* Oliver Redner, 12.08.
  3.                   15.08.1990 *)
  4. {$A-,B-,D+,E-,F-,I-,L+,N-,O-,R-,S-,V-}
  5. {$M 16384,0,655360}
  6.  
  7. uses  crt,dos,screen;
  8.  
  9. const titelzeile         = ' FONTEDIT  *  (C) Copyright 1990  *  Oliver Redner ';
  10.       wildcard           = '*.FNT';
  11.  
  12. type  palette_typ        = array[1..16] of byte;
  13.       string2            = string[2];
  14.       filename           = string[12];
  15.       maxstring          = string[80];
  16.       byte_array         = array[0..$8000] of byte;
  17.       byte_array_ptr     = ^byte_array;
  18.  
  19. const normal             = 7;      (* Bildschirm-Attribute für monochrom *)
  20.       hell               = 15;
  21.       invers             = 7*16;
  22.  
  23.       mono_palette:        palette_typ =
  24.                              (normal,invers,
  25.                               invers,normal,invers,
  26.                               invers,invers,
  27.                               normal,normal,hell,invers,
  28.                               invers,invers,
  29.                               normal,hell,
  30.                               0);
  31.       farb_palette:        palette_typ =
  32.                              (lightgray,blue*16+lightgray,
  33.                               blue*16+white,lightgray,lightgray*16,
  34.                               blue*16+yellow,blue*16+lightred,
  35.                               red*16+yellow,red*16+lightgray,
  36.                               red*16+white,red+lightgray*16,
  37.                               cyan*16+yellow,cyan*16+white,
  38.                               lightgray,blue*16+white,
  39.                               green*16+white);
  40.       page_value:          array[0..3] of byte = (1,2,4,8);
  41.       max_zeile:           byte = 24;
  42.  
  43. var   att_titelzeile,
  44.       att_backgr,
  45.       att_feld,att_leer,
  46.       att_voll,att_menue_l,
  47.       att_menue_r,
  48.       att_fsb_rahmen,
  49.       att_fsb_normal,
  50.       att_fsb_hell,
  51.       att_fsb_cursor,
  52.       att_eing_rahmen,
  53.       att_eing_schrift,
  54.       att_zeig,att_ja,
  55.       att_farb,
  56.       hoehe,breite,farben:  byte;
  57.       datei,pfad:           pathstr;
  58.       std_cursor:           word;
  59.       save_screen:          crt_screen_type;
  60.       font:                 byte_array_ptr;
  61.  
  62.  
  63. {$I kextrn}
  64.  
  65. {$F+}
  66. {$I kgraph} {$L kgraph}
  67. {$F-}
  68.  
  69. {$F+}
  70. procedure ega_mono;
  71. var regs: registers;
  72. begin
  73.   with regs do begin
  74.     ax:=$F; intr($10,regs);
  75.   end;
  76. end;   (* ega_mono *)
  77.  
  78.  
  79. procedure ega_mono_hor (von_x,bis_x,y: word);
  80. var x: word;
  81. begin
  82.   for x:=(von_x shr 3) to ((bis_x+7) shr 3) do
  83.     mem[$A000:y*80+x]:=$FF;
  84. end;   (* ega_mono_hor *)
  85.  
  86.  
  87. procedure dummy_proc (a,b,c: word);
  88. begin
  89. end;
  90.  
  91.  
  92. procedure ega_big_plot (x: byte; y: word; zeichen: byte);
  93. var x2,i,y2: byte;
  94. begin
  95.   for y2:=0 to 31 do for i:=0 to 1 do
  96.     mem[$A000:(y+y2)*80+x+i]:=font^[zeichen*64+y2*2+i];
  97. end;   (* ega_big_plot *)
  98. {$F-}
  99.  
  100.  
  101. procedure initialisieren;
  102. var regs: registers;
  103. begin
  104.   checkbreak:=false; setcbreak(false);
  105.   if crt_mode=7 then move(mono_palette,att_titelzeile,sizeof(palette_typ))
  106.                 else begin
  107.                   move(farb_palette,att_titelzeile,sizeof(palette_typ));
  108.                   palette:=@palette1; ega_palette;
  109.                 end;
  110.   pfad:=''; datei:='';
  111.   with regs do begin
  112.     ah:=3; bh:=0; intr($10,regs);
  113.     std_cursor:=cx;
  114.   end;
  115. end;   (* initialisieren *)
  116.  
  117.  
  118. procedure schreibe_titelzeile;
  119. begin
  120.   textattr:=att_titelzeile;
  121.   clrscr; writeln; writeln;
  122.   wrm(0,40,att_titelzeile,titelzeile);
  123. end;   (* schreibe_titelzeile *)
  124.  
  125.  
  126. procedure parameter_auswerten;
  127. const unbekannt       = 'Unbekannter Parameter: ';
  128.       falsche_groesse = 'Unbekannte Zeichengröße: ';
  129.       falsche_farben  = 'Unbekannte Farbenzahl: ';
  130. var   lauf,i:           byte;
  131.       s:                maxstring;
  132.  
  133. procedure hilfe (text: maxstring);
  134. begin
  135.   schreibe_titelzeile;
  136.   writeln(text); writeln;
  137.   writeln('Aufruf: FONTEDIT [<Parameter>]'); writeln;
  138.   writeln('          <Parameter>: /H       Diese Hilfe erscheint.'); writeln;
  139.   writeln('                       /G8X8    Zeichensätze  8x 8 Punkte');
  140.   writeln('                       /G16X16  Zeichensätze 16x16 Punkte');
  141.   writeln('                       /G16X32  Zeichensätze 16x32 Punkte');
  142.   writeln('                       /F2      Zwei Farben');
  143.   writeln('                       /F16     16 Farben (nur EGA/VGA)');
  144.   writeln; halt;
  145. end;   (* hilfe *)
  146.  
  147. begin  (* parameter_auswerten *)
  148.   hoehe:=16; breite:=16; farben:=2;
  149.   if paramcount>0 then for lauf:=1 to paramcount do begin
  150.     s:=paramstr(lauf); for i:=1 to length(s) do s[i]:=upcase(s[i]);
  151.     if s[1] in ['/','-']
  152.       then case s[2] of
  153.         'H': hilfe ('Hilfe:');
  154.         'G': if s='/G8X8'
  155.                then begin breite:=8; hoehe:=8; end
  156.                else if s='/G16X16'
  157.                       then begin breite:=16; hoehe:=16; end
  158.                       else if s='/G16X32'
  159.                              then begin breite:=16; hoehe:=32; end
  160.                              else hilfe (falsche_groesse+s);
  161.         'F': if s='/F2'
  162.                then farben:=2
  163.                else if s='/F16' then farben:=16
  164.                                 else hilfe (falsche_farben+s);
  165.         else hilfe (unbekannt+s);
  166.       end;
  167.   end;
  168. end;   (* parameter_auswerten *)
  169.  
  170.  
  171. procedure editieren;
  172. const menue_l_max                      = 7;
  173.       menue_l_lng:                       byte = menue_l_max;
  174.       menue_r_lng                      = 9;
  175.       menue_l:                           array[1..menue_l_max] of string[28] =
  176.                                          (#24','#25','#26','#27'   Cursor bewegen',
  177.                                           'Leertaste Setz/Lösch Punkt',
  178.                                           'F1..F4    Rollen',
  179.                                           'H,V       Hor./Vert. Spiegel',
  180.                                           'W         Farbwahl',
  181.                                           'F         Füllen mit Farbe',
  182.                                           '+,-       Zeichen Drehen');
  183.       menue_l_inv                      =  'I         Invertieren';
  184.       menue_r:                           array[1..menue_r_lng] of string[28] =
  185.                                          ('L      Zeichensatz laden    ',
  186.                                           'S      Zeichensatz speichern',
  187.                                           'U      Speichern unter ...  ',
  188.                                           'K      Zeichen kopieren     ',
  189.                                           'Z      Zeichen löschen      ',
  190.                                           'A      Alles löschen        ',
  191.                                           'RETURN Anderes Zeichen      ',
  192.                                           'ESC    Ungeschehen          ',
  193.                                           'Q      Quit / Beenden       ');
  194.       max_anz                          = $100;
  195. type  word_array                       = array[0..$4000] of word;
  196.       word_array_ptr                   = ^word_array;
  197.       word_ptr                         = ^word;
  198.       control_typ                      = (li,re,auf,ab,bauf,bab,pos1,end_,key,ext);
  199. var   feld_x,feld_y,pages,z_lng,zeichen: byte;
  200.       z_farbe,cs_x,cs_y:                 shortint;
  201.       font_groesse,anzahl:               word;
  202.       aufbauen,ende,quit,saved,dummy:    boolean;
  203.       feld:                              array[0..15,0..31] of byte;
  204.       control:                           control_typ;
  205.       taste:                             char;
  206.  
  207. procedure zeige_farbe;
  208. var col: byte;
  209.     s:   string[8];
  210. begin
  211.  if pages=1
  212.    then begin
  213.      if z_farbe=0 then s:='Löschen '
  214.                   else s:=' Setzen ';
  215.      wrm(max_zeile-2,40,att_backgr,s);
  216.    end else begin
  217.      box(hor_single_box,38,max_zeile-3,2,1,att_backgr,0);
  218.      wr(max_zeile-2,39,z_farbe,'██');
  219.    end;
  220. end;   (* zeige_farbe *)
  221.  
  222.  
  223. function strr (zahl: longint; stellen: byte): maxstring;
  224. var s: maxstring;
  225. begin
  226.   str(zahl,s); while length(s)<stellen do s:='0'+s;
  227.   strr:=s;
  228. end;  (* strr *)
  229.  
  230.  
  231. function hex (zahl: byte): string2;
  232. const hexchars: array[0..$F] of char = '0123456789ABCDEF';
  233. begin
  234.   hex:=hexchars[(zahl and $F0) shr 4]+hexchars[zahl and $F];
  235. end;  (* hex *)
  236.  
  237.  
  238. procedure bildschirm;
  239. const zeich_breite = 16;
  240.       zeich_x      = (80-zeich_breite) div 2;
  241.       zeich_y      = 2;
  242. var   lauf:          byte;
  243. begin  (* bildschirm *)
  244.   if hoehe=32 then textmode(co80+font8x8);
  245.   box(all_double_box,0,0,78,pred(max_zeile),att_backgr,att_backgr);
  246.   wrm(0,40,att_backgr,titelzeile);
  247.   box(all_single_box,pred(zeich_x),pred(zeich_y),zeich_breite,1,
  248.       att_feld,att_feld);
  249.   wr(zeich_y,zeich_x,att_feld,'Zeichen: '+strr(zeichen,3)+'/$'+hex(zeichen));
  250.   box(all_single_box,pred(feld_x),pred(feld_y),breite,hoehe,att_feld,att_leer);
  251.   if breite=16 then begin
  252.     wr(pred(feld_y),39,att_feld,'┬┬'); wr(feld_y+hoehe,39,att_feld,'┴┴');
  253.   end;
  254.   if hoehe=16 then begin
  255.     wr(10,pred(feld_x),att_feld,'├'); wr(11,pred(feld_x),att_feld,'├');
  256.     wr(10,feld_x+breite,att_feld,'┤'); wr(11,feld_x+breite,att_feld,'┤');
  257.     wr(pred(feld_y),pred(feld_x),att_feld,'├');
  258.     wr(pred(feld_y),feld_x+breite,att_feld,'┤');
  259.   end;
  260.   if hoehe=32 then begin
  261.     wr(feld_y+15,pred(feld_x),att_feld,'├'); wr(feld_y+15,feld_x+breite,att_feld,'┤');
  262.     wr(feld_y+16,pred(feld_x),att_feld,'├'); wr(feld_y+16,feld_x+breite,att_feld,'┤');
  263.   end;
  264.   for lauf:=1 to menue_l_lng do wr(5+lauf,2,att_menue_l,menue_l[lauf]);
  265.   for lauf:=1 to menue_r_lng do wrr(5+lauf,77,att_menue_r,menue_r[lauf]);
  266.   zeige_farbe;
  267.   aufbauen:=false;
  268. end;   (* bildschirm *)
  269.  
  270.  
  271. procedure zeig_punkt (x,y: byte);
  272. var col: byte;
  273. begin
  274.   col:=feld[x,y];
  275.   if pages=1 then if col=0 then wr(feld_y+y,feld_x+x,att_leer,'∙')
  276.                            else wr(feld_y+y,feld_x+x,att_voll,'∙')
  277.              else if col=0 then wr(feld_y+y,feld_x+x,white,' ')
  278.                            else wr(feld_y+y,feld_x+x,col,'▓');
  279. end;   (* zeig_punkt *)
  280.  
  281.  
  282. procedure setz_punkt (x,y,col: byte);
  283. begin
  284.   feld[x,y]:=col; zeig_punkt (x,y);
  285. end;   (* setz_punkt *)
  286.  
  287. procedure darstellen;
  288. var   pw:           word_array_ptr;
  289.       pb:           byte_array_ptr;
  290.       x,y,lauf,col: byte;
  291.       werte:        array[0..3] of longint;
  292.       mask:         word;
  293. begin
  294.   pw:=ptr(seg(font^),ofs(font^)+zeichen*z_lng); pb:=byte_array_ptr(pw);
  295.   for y:=0 to pred(hoehe) do begin
  296.     if breite=16
  297.       then for lauf:=0 to pred(pages) do
  298.         werte[lauf]:=pw^[y*pages+lauf]
  299.       else for lauf:=0 to pred(pages) do
  300.         werte[lauf]:=pb^[y*pages+lauf];
  301.     mask:=$80;
  302.     for x:=0 to pred(breite) do begin
  303.       col:=0;
  304.       for lauf:=0 to pred(pages) do
  305.         if (werte[lauf] and mask)>0 then inc(col,page_value[lauf]);
  306.       if pages=1 then if col=0 then setz_punkt(x,y,0)
  307.                                else setz_punkt(x,y,1)
  308.                  else setz_punkt (x,y,col);
  309.       mask:=mask shr 1; if mask=0 then mask:=$8000;
  310.     end;
  311.   end;
  312. end;   (* darstellen *)
  313.  
  314.  
  315. procedure font_loeschen;
  316. begin
  317.   fillchar(font^,font_groesse,0); zeichen:=0; saved:=true;
  318. end;   (* font_loeschen *)
  319.  
  320.  
  321. procedure lies (var control: control_typ; var taste: char; num_pad: boolean);
  322. begin
  323.   taste:=readkey;
  324.   if taste=#0
  325.     then begin
  326.       taste:=readkey;
  327.       case ord(taste) of
  328.         72:  control:=auf;
  329.         80:  control:=ab;
  330.         75:  control:=li;
  331.         77:  control:=re;
  332.         73:  control:=bauf;
  333.         81:  control:=bab;
  334.         71:  control:=pos1;
  335.         79:  control:=end_;
  336.         else control:=ext;
  337.       end;
  338.     end else
  339.       if num_pad
  340.         then case taste of
  341.                '8': control:=auf;
  342.                '2': control:=ab;
  343.                '4': control:=li;
  344.                '6': control:=re;
  345.                '9': control:=bauf;
  346.                '3': control:=bab;
  347.                '7': control:=pos1;
  348.                '1': control:=end_;
  349.                else control:=key;
  350.              end
  351.         else control:=key;
  352. end;   (* lies *)
  353.  
  354.  
  355. procedure cursor (sichtbar: boolean);
  356. var regs: registers;
  357. begin
  358.   with regs do begin
  359.     ah:=1;
  360.     if sichtbar then cx:=std_cursor
  361.                 else cx:=$1000;
  362.     intr($10,regs);
  363.   end;
  364. end;   (* cursor *)
  365.  
  366.  
  367. function ja (text: maxstring): boolean;
  368. var control: control_typ;
  369.     taste:   char;
  370. begin
  371.   save_screen:=crt_screen^;
  372.   wrm(max_zeile,40,att_ja,text);
  373.   cursor (false);
  374.   repeat
  375.     lies (control,taste,false); taste:=upcase(taste);
  376.   until (control=key) and (taste in ['J','N',#27]);
  377.   cursor (true);
  378.   ja:=taste='J';
  379.   crt_screen^:=save_screen;
  380. end;  (* ja *)
  381.  
  382.  
  383. function gesichert: boolean;
  384. begin
  385.   if saved then gesichert:=true
  386.            else gesichert:=ja(' Bearbeiteten Zeichensatz verwerfen (J/N) ? ');
  387. end;  (* gesichert *)
  388.  
  389.  
  390. procedure min(var zahl1: shortint; zahl2: shortint);
  391. begin
  392.   if zahl1<zahl2 then zahl1:=zahl2;
  393. end;   (* min *)
  394.  
  395.  
  396. procedure max(var zahl1: shortint; zahl2: shortint);
  397. begin
  398.   if zahl1>zahl2 then zahl1:=zahl2;
  399. end;   (* max *)
  400.  
  401.  
  402. procedure invertieren;
  403. var x,y: byte;
  404. begin
  405.   for y:=0 to pred(hoehe) do
  406.     for x:=0 to pred(breite) do setz_punkt (x,y,1-feld[x,y]);
  407. end;   (* invertieren *)
  408.  
  409.  
  410. procedure vertikal;
  411. var x,y,carry: byte;
  412. begin
  413.   for x:=0 to pred(breite div 2) do
  414.     for y:=0 to pred(hoehe) do begin
  415.       carry:=feld[x,y]; feld[x,y]:=feld[pred(breite)-x,y];
  416.       feld[pred(breite)-x,y]:=carry;
  417.       zeig_punkt (x,y); zeig_punkt (pred(breite)-x,y);
  418.     end;
  419.   saved:=false;
  420. end;   (* vertikal *)
  421.  
  422.  
  423. procedure horizontal;
  424. var x,y,carry: byte;
  425. begin
  426.   for y:=0 to pred(hoehe div 2) do
  427.     for x:=0 to pred(breite) do begin
  428.       carry:=feld[x,y]; feld[x,y]:=feld[x,pred(hoehe)-y];
  429.       feld[x,pred(hoehe)-y]:=carry;
  430.       zeig_punkt (x,y); zeig_punkt (x,pred(hoehe)-y);
  431.     end;
  432.   saved:=false;
  433. end;   (* horizontal *)
  434.  
  435.  
  436. procedure roll_li;
  437. var x,y,carry: byte;
  438. begin
  439.   for y:=0 to pred(hoehe) do begin
  440.     carry:=feld[0,y];
  441.     for x:=0 to breite-2 do setz_punkt (x,y,feld[x+1,y]);
  442.     setz_punkt (pred(breite),y,carry);
  443.   end;
  444.   saved:=false;
  445. end;   (* roll_li *)
  446.  
  447.  
  448. procedure roll_re;
  449. var x,y,carry: byte;
  450. begin
  451.   for y:=0 to pred(hoehe) do begin
  452.     carry:=feld[pred(breite),y];
  453.     for x:=pred(breite) downto 1 do setz_punkt (x,y,feld[x-1,y]);
  454.     setz_punkt (0,y,carry);
  455.   end;
  456.   saved:=false;
  457. end;   (* roll_re *)
  458.  
  459.  
  460. procedure roll_auf;
  461. var x,y,carry: byte;
  462. begin
  463.   for x:=0 to pred(breite) do begin
  464.     carry:=feld[x,0];
  465.     for y:=0 to hoehe-2 do setz_punkt (x,y,feld[x,y+1]);
  466.     setz_punkt (x,pred(hoehe),carry);
  467.   end;
  468.   saved:=false;
  469. end;   (* roll_auf *)
  470.  
  471.  
  472. procedure roll_ab;
  473. var x,y,carry: byte;
  474. begin
  475.   for x:=0 to pred(breite) do begin
  476.     carry:=feld[x,pred(hoehe)];
  477.     for y:=pred(hoehe) downto 1 do setz_punkt (x,y,feld[x,y-1]);
  478.     setz_punkt (x,0,carry);
  479.   end;
  480.   saved:=false;
  481. end;   (* roll_ab *)
  482.  
  483.  
  484. procedure drehen (richtg: boolean);
  485. var x,xx,y,yy,carry: byte;
  486.  
  487. procedure tausch;
  488. var xalt,yalt: byte;
  489. begin
  490.   xalt:=x; yalt:=y;
  491.   if richtg then begin
  492.     x:=yalt; y:=breite-xalt-1;
  493.   end else begin
  494.     x:=hoehe-yalt-1; y:=xalt;
  495.   end;
  496.   setz_punkt (xalt,yalt,feld[x,y]);
  497. end;   (* tausch *)
  498.  
  499. begin  (* drehen *)
  500.   for xx:=0 to pred(breite div 2) do
  501.     for yy:=0 to pred(hoehe div 2) do begin
  502.       x:=xx; y:=yy;
  503.       carry:=feld[x,y];
  504.       tausch; tausch; tausch;
  505.       setz_punkt (x,y,carry);
  506.     end;
  507.   saved:=false;
  508. end;   (* drehen *)
  509.  
  510.  
  511. procedure zurueck;
  512. var   pw:           word_array_ptr;
  513.       pb:           byte_array_ptr;
  514.       x,y,lauf,col: byte;
  515.       werte:        array[0..3] of word;
  516.       mask:         word;
  517. begin
  518.   pw:=ptr(seg(font^),ofs(font^)+zeichen*z_lng); pb:=byte_array_ptr(pw);
  519.   for y:=0 to pred(hoehe) do begin
  520.     for lauf:=0 to pred(pages) do werte[lauf]:=0;
  521.     mask:=$80;
  522.     for x:=0 to pred(breite) do begin
  523.       for lauf:=0 to pred(pages) do
  524.         inc(werte[lauf],ord((feld[x,y] and page_value[lauf])>0)*mask);
  525.       mask:=mask shr 1; if mask=0 then mask:=$8000;
  526.     end;
  527.     if breite=16
  528.       then for lauf:=0 to pred(pages) do
  529.         pw^[y*pages+lauf]:=werte[lauf]
  530.       else for lauf:=0 to pred(pages) do
  531.         pb^[y*pages+lauf]:=werte[lauf];
  532.   end;
  533. end;   (* zurueck *)
  534.  
  535.  
  536. procedure laden;
  537. var f:    file;
  538.     size: longint;
  539.  
  540. function fileselect(wildcard: filename; var path: dirstr): pathstr;
  541. type  eintragzeiger = ^eintragrec;
  542.       eintragrec    = record
  543.                         name:       filename;
  544.                         nachfolger: eintragzeiger
  545.                       end;
  546. const fsb_x         = 10;
  547.       fsb_y         = 8;
  548.       fsb_pro_zeile = 4;
  549.       fsb_zeilen    = 10;
  550.       fsb_eintr     = fsb_pro_zeile*fsb_zeilen;
  551. var startzeiger:      eintragzeiger;
  552.     fertig,abbruch,
  553.     eintraege_vorh:   boolean;
  554.     eintraege:        integer;
  555.  
  556. procedure eintraege_lesen;
  557. var eintrag: searchrec;
  558.  
  559. procedure zur_liste(was: filename);
  560. var zeiger,hilfszeiger: eintragzeiger;
  561. begin
  562.   if startzeiger=nil then begin
  563.     new(startzeiger);
  564.     zeiger:=startzeiger;
  565.     zeiger^.nachfolger:=nil
  566.   end
  567.   else begin
  568.     zeiger:=startzeiger;
  569.     while (zeiger^.nachfolger<>nil) and (zeiger^.name<was) do
  570.       zeiger:=zeiger^.nachfolger;
  571.     if zeiger^.nachfolger=nil then begin
  572.       new(zeiger^.nachfolger);
  573.       zeiger:=zeiger^.nachfolger;
  574.       zeiger^.nachfolger:=nil
  575.     end
  576.     else begin
  577.       hilfszeiger:=zeiger^.nachfolger;
  578.       new(zeiger^.nachfolger);
  579.       zeiger:=zeiger^.nachfolger;
  580.       zeiger^.nachfolger:=hilfszeiger
  581.     end;
  582.   end;
  583.   zeiger^.name:=was;
  584.   inc(eintraege);
  585. end;   (* zur_liste *)
  586.  
  587. begin  (* eintraege_lesen *)
  588.   eintraege:=0;
  589.   findfirst(path+wildcard,archive,eintrag);
  590.   while doserror=0 do begin
  591.     zur_liste(eintrag.name);
  592.     findnext(eintrag)
  593.   end;
  594.   findfirst(path+'*.*',archive+directory,eintrag);
  595.   while doserror=0 do begin
  596.     if ((eintrag.attr and directory)>0) and (eintrag.name<>'.') then
  597.       zur_liste('['+eintrag.name+']');
  598.     findnext(eintrag)
  599.   end;
  600.   eintraege_vorh:=startzeiger<>nil;
  601.   if not eintraege_vorh then
  602.     wrm(fsb_y+1,40,att_fsb_hell,'Keine Einträge vorhanden!');
  603. end;   (* eintraege_lesen *)
  604.  
  605. procedure auswaehlen;
  606. var wahl,oben:      integer;
  607.     taste:          char;
  608.     changed,cursor: boolean;
  609.     control:        control_typ;
  610.     x,y:            byte;
  611.  
  612. function eintrag(nr: integer): eintragzeiger;
  613. var zeiger: eintragzeiger;
  614. begin
  615.   zeiger:=startzeiger;
  616.   while nr>0 do begin
  617.     zeiger:=zeiger^.nachfolger;
  618.     dec(nr);
  619.   end;
  620.   eintrag:=zeiger
  621. end;  (* eintrag *)
  622.  
  623. procedure ausschnitt;
  624.  
  625. procedure darstellen;
  626. var nr:     integer;
  627.     zeiger: eintragzeiger;
  628.     lauf:   byte;
  629. begin  (* darstellen *)
  630.   for lauf:=fsb_y to fsb_y+fsb_zeilen-1 do
  631.     wischen (lauf,fsb_x,fsb_pro_zeile*15,att_fsb_normal);
  632.   zeiger:=eintrag(oben);
  633.   nr:=0;
  634.   while (nr<fsb_eintr) and (zeiger<>nil) do begin
  635.     wr(fsb_y+(nr div fsb_pro_zeile),fsb_x+(nr mod fsb_pro_zeile)*15,
  636.        att_fsb_normal,zeiger^.name);
  637.     zeiger:=zeiger^.nachfolger;
  638.     inc(nr);
  639.   end;
  640. end;   (* darstellen *)
  641.  
  642. begin  (* ausschnitt *)
  643.   if (wahl<oben) then begin
  644.     oben:=(wahl div fsb_pro_zeile)*fsb_pro_zeile;
  645.     darstellen;
  646.   end else
  647.     if (wahl>=oben+fsb_eintr) then begin
  648.       oben:=((wahl div fsb_pro_zeile)*fsb_pro_zeile)-fsb_eintr+fsb_pro_zeile;
  649.       darstellen;
  650.     end;
  651.   x:=fsb_x+(wahl mod fsb_pro_zeile)*15;
  652.   y:=fsb_y+((wahl-oben) div fsb_pro_zeile);
  653.   setattr(y,x,14,att_fsb_cursor);
  654. end;   (* ausschnitt *)
  655.  
  656. procedure suchen(wonach: string2);
  657. var zeiger: eintragzeiger;
  658.     alt:    integer;
  659. begin
  660.   if startzeiger=nil then exit;
  661.   alt:=wahl;
  662.   zeiger:=eintrag(wahl);
  663.   repeat
  664.     inc(wahl);
  665.     zeiger:=zeiger^.nachfolger;
  666.     if zeiger=nil then begin
  667.       zeiger:=startzeiger;
  668.       wahl:=0
  669.     end;
  670.   until (wahl=alt) or
  671.         (copy(zeiger^.name,1,length(wonach))=wonach)
  672. end;   (* suchen *)
  673.  
  674. procedure laufwerk;
  675. begin
  676.   if diskfree(ord(taste))<>-1 then begin
  677.     path:=chr(ord(taste)+64)+':';
  678.     changed:=true
  679.   end;
  680. end;   (* laufwerk *)
  681.  
  682. procedure gewaehlt;
  683. var zeiger: eintragzeiger;
  684. begin
  685.   zeiger:=eintrag(wahl);
  686.   if zeiger^.name[1]='[' then
  687.     path:=path+copy(zeiger^.name,2,length(zeiger^.name)-2)+'\'
  688.   else begin
  689.     fileselect:=fexpand(path+zeiger^.name);
  690.     fertig:=true
  691.   end;
  692. end;   (* gewaehlt *)
  693.  
  694. begin  (* auswaehlen *)
  695.   changed:=false;
  696.   wahl:=0;
  697.   oben:=1;
  698.   repeat
  699.     if eintraege_vorh then ausschnitt;
  700.     lies (control,taste,true);
  701.     if eintraege_vorh then setattr(y,x,14,att_fsb_normal);
  702.     case control of
  703.       auf:  dec(wahl,fsb_pro_zeile);
  704.       ab:   inc(wahl,fsb_pro_zeile);
  705.       li:   dec(wahl);
  706.       re:   inc(wahl);
  707.       pos1: wahl:=0;
  708.       end_: wahl:=eintraege;
  709.       key:  case taste of
  710.               'a'..'z': suchen(chr(ord(taste)-32));
  711.               'A'..'Z': suchen('['+taste);
  712.               '.',':':  suchen('[.');
  713.               #1..#10:  laufwerk;
  714.             end;
  715.     end;
  716.     if wahl<0 then wahl:=0;
  717.     if wahl>=eintraege then wahl:=eintraege-1;
  718.   until changed or (taste in [#27,#13]);
  719.   if taste=#27 then abbruch:=true
  720.                else if not changed then gewaehlt
  721. end;   (* auswaehlen *)
  722.  
  723. procedure liste_loeschen;
  724. var zeiger: eintragzeiger;
  725. begin
  726.   zeiger:=startzeiger;
  727.   while zeiger<>nil do begin
  728.     dispose(zeiger); zeiger:=zeiger^.nachfolger;
  729.   end;
  730.   startzeiger:=nil;
  731. end;   (* liste_loeschen *)
  732.  
  733. begin (* fileselect *)
  734.   fileselect:=''; fertig:=false; abbruch:=false; cursor (false);
  735.   repeat
  736.     path:=fexpand(path); startzeiger:=nil;
  737.     box(all_single_box,fsb_x-2,fsb_y-4,succ(fsb_pro_zeile*15),fsb_zeilen+3,
  738.         att_fsb_rahmen,att_fsb_normal);
  739.     box(all_single_box,fsb_x-2,fsb_y-4,succ(fsb_pro_zeile*15),2,
  740.         att_fsb_rahmen,att_fsb_normal);
  741.     wr(fsb_y-1,fsb_x-2,att_fsb_rahmen,'├');
  742.     wr(fsb_y-1,fsb_x+fsb_pro_zeile*15,att_fsb_rahmen,'┤');
  743.     wr(fsb_y-3,fsb_x,att_fsb_normal,'Pfad: '+path+wildcard);
  744.     wrm(fsb_y-2,fsb_x+((fsb_pro_zeile*15) div 2),att_fsb_normal,
  745.                                'CTRL + Laufwerksbuchstabe: Laufwerk ändern');
  746.     eintraege_lesen;
  747.     auswaehlen;
  748.     liste_loeschen;
  749.   until fertig or abbruch;
  750.   aufbauen:=true; cursor (true);
  751. end;  (* fileselect *)
  752.  
  753.  
  754. begin  (* laden *)
  755.   zurueck;
  756.   if not gesichert then exit;
  757.   datei:=fileselect (wildcard,pfad);
  758.   if (datei<>'') then begin
  759.     assign(f,datei); reset(f,1);
  760.     if ioresult=0 then begin
  761.       font_loeschen; size:=filesize(f);
  762.       if size>longint(font_groesse) then size:=font_groesse;
  763.       blockread(f,font^,size);
  764.       close(f);
  765.       inoutres:=0;
  766.     end;
  767.   end;
  768. end;   (* laden *)
  769.  
  770.  
  771. procedure taste_druecken;
  772. var taste: char;
  773. begin
  774.   taste:=readkey;
  775. end;   (* taste_druecken *)
  776.  
  777.  
  778. procedure speichern;
  779. var anzahl,lauf: byte;
  780.     f:           file;
  781.  
  782. function empty (z: byte): boolean;
  783. var lauf: byte;
  784.     p:    byte_array_ptr;
  785. begin
  786.   p:=ptr(seg(font^),ofs(font^)+z*z_lng);
  787.   lauf:=0;
  788.   while (lauf<z_lng) and (p^[lauf]=0) do inc(lauf);
  789.   empty:=lauf=z_lng;
  790. end;  (* empty *)
  791.  
  792. function error: boolean;
  793. begin
  794.   if ioresult=0
  795.     then error:=false
  796.     else begin
  797.       save_screen:=crt_screen^;
  798.       wrm(24,40,att_backgr,' Fehler beim Schreiben von '+datei+' ');
  799.       taste_druecken;
  800.       crt_screen^:=save_screen;
  801.     end;
  802. end;  (* error *)
  803.  
  804. begin  (* speichern *)
  805.   zurueck;
  806.   anzahl:=pred(max_anz);
  807.   while (anzahl>0) and empty (anzahl) do dec(anzahl);
  808.   if not empty (anzahl) then inc(anzahl);
  809.   if anzahl>0 then begin
  810.     lauf:=0;
  811.     while (lauf<anzahl) and (not empty (lauf)) do inc(lauf);
  812.     if lauf>=anzahl then inc(anzahl);
  813.     assign(f,datei); rewrite(f,1);
  814.     if not error then begin
  815.       blockwrite(f,font^,anzahl*z_lng);
  816.       close(f);
  817.       if not error then saved:=true;
  818.     end;
  819.   end;
  820. end;   (* speichern *)
  821.  
  822.  
  823. procedure string_eingabe (text: maxstring; laenge: byte;
  824.                           var buffer: maxstring; var abbruch: boolean);
  825. const eing_y           = 12;
  826. var   s,s2:              maxstring;
  827.       eing_x,alt_lng,cs: byte;
  828.       control:           control_typ;
  829.       taste:             char;
  830. begin
  831.   save_screen:=crt_screen^;
  832.   eing_x:=(78-laenge) div 2;
  833.   box(hor_double_box,pred(eing_x),pred(eing_y),laenge,1,
  834.       att_eing_rahmen,att_eing_schrift);
  835.   wrm(pred(eing_y),40,att_eing_rahmen,' '+text+' ');
  836.   s:=buffer; alt_lng:=0; cs:=length(s);
  837.   repeat
  838.     if length(s)<alt_lng then wischen (eing_y,eing_x,laenge,att_eing_schrift);
  839.     wr(eing_y,eing_x,att_eing_schrift,s); gotoxy(succ(eing_x+cs),succ(eing_y));
  840.     alt_lng:=length(s);
  841.     lies (control,taste,false);
  842.     case control of
  843.       li:   if cs>0 then dec(cs);
  844.       re:   if cs<alt_lng then inc(cs);
  845.       pos1: cs:=0;
  846.       end_: cs:=alt_lng;
  847.       key:  case taste of
  848.               #8:      if (cs>0) and (alt_lng>0) then begin
  849.                          delete(s,cs,1); dec(cs);
  850.                        end;
  851.               #13,#27: ;
  852.               else     if length(s)<laenge then begin
  853.                          s2:=''; if cs>0 then s2:=copy(s,1,cs);
  854.                          s2:=s2+taste;
  855.                          if cs<alt_lng then s2:=s2+copy(s,succ(cs),alt_lng-cs);
  856.                          s:=s2; inc(cs);
  857.                        end;
  858.             end;
  859.       ext:  case ord(taste) of
  860.               83: if (alt_lng>0) and (cs<alt_lng) then delete(s,succ(cs),1);
  861.             end;
  862.     end;
  863.   until taste in [#13,#27];
  864.   abbruch:=taste=#27; if not abbruch then buffer:=s;
  865.   crt_screen^:=save_screen;
  866. end;   (* string_eingabe *)
  867.  
  868.  
  869. procedure speichern_unter;
  870. var abbruch: boolean;
  871.     dir:     dirstr;
  872.     name:    namestr;
  873.     ext:     extstr;
  874. begin
  875.   zurueck;
  876.   string_eingabe ('Dateiname',40,datei,abbruch);
  877.   if not abbruch then begin
  878.     datei:=fexpand(datei); fsplit (datei,dir,name,ext);
  879.     if ext='' then ext:='.FNT';
  880.     datei:=dir+name+ext;
  881.     speichern;
  882.   end;
  883. end;   (* speichern unter *)
  884.  
  885.  
  886. function zeichen_wahl (var abbruch: boolean): byte;
  887. var z,x,y,x_lng,y_lng,x_fak: byte;
  888.     x_rand,y_rand:           word;
  889.     control:                 control_typ;
  890.     taste:                   char;
  891.     plot:                    procedure (x: byte; y: word; zeichen: byte);
  892.     open,shut:               procedure;
  893.     hor:                     procedure (x1,x2,y: word);
  894.     ver:                     procedure (x,y1,y2: word);
  895.  
  896. procedure cursor_lines;
  897. begin
  898.   hor (x_rand+(x*x_fak) shl 3,x_rand+pred((succ(x)*x_fak) shl 3),y_rand+y*(hoehe+2));
  899.   hor (x_rand+(x*x_fak) shl 3,x_rand+pred((succ(x)*x_fak) shl 3),y_rand+succ(y*(hoehe+2)+hoehe));
  900. end;   (* cursor_lines *)
  901.  
  902. begin (* zeichen_wahl *)
  903.   if (breite=16) and (hoehe=32) and (pages=1)
  904.     then begin
  905.       open:=ega_mono; shut:=ega_textmode;
  906.       hor:=ega_mono_hor; ver:=dummy_proc;
  907.       plot:=ega_big_plot;
  908.       x_fak:=2; x_lng:=32; x_rand:=64;
  909.       y_lng:=8; y_rand:=39;
  910.     end else
  911.       if (pages=1)
  912.         then begin
  913.           open:=hgc_graphmode; shut:=hgc_textmode;
  914.           hor:=hgc_horline; ver:=hgc_verline; xorput:=false; x_rand:=104;
  915.           if (hoehe=16) and (breite=16)
  916.             then begin
  917.               plot:=hgc_mal; graf_satz:=pointer(font);
  918.               x_lng:=32; y_lng:=8; x_fak:=2; y_rand:=102;
  919.             end else
  920.               if (hoehe=8) and (breite=8) then begin
  921.                 if crt_screen=ptr($B800,0)
  922.                   then begin
  923.                     open:=ega_graphmode; shut:=ega_textmode;
  924.                     hor:=ega_horline; ver:=ega_verline;
  925.                     plot:=ega_char; x_rand:=64; y_rand:=155;
  926.                   end else begin
  927.                     plot:=hgc_char; y_rand:=154;
  928.                   end;
  929.                 text_satz:=pointer(font);
  930.                 x_lng:=64; y_lng:=4; x_fak:=1;
  931.               end else exit;
  932.         end else begin
  933.           open:=ega_graphmode; shut:=ega_textmode;
  934.           hor:=ega_horline; ver:=ega_verline; xorput:=true;
  935.           if (hoehe=16) and (breite=16)
  936.             then begin
  937.               plot:=ega_mal; graf_satz:=pointer(font);
  938.               x_lng:=32; y_lng:=8; x_fak:=2; x_rand:=64; y_rand:=103;
  939.             end else exit;
  940.         end;
  941.   z:=zeichen; farbe:=15;
  942.   open;
  943.   for y:=0 to pred(y_lng) do
  944.     for x:=0 to pred(x_lng) do
  945.       plot ((x_rand shr 3)+x*x_fak,y_rand+succ(y*(hoehe+2)),x+(y*x_lng));
  946.   ver (x_rand-2,y_rand-2,y_rand+(hoehe+2)*y_lng+1);
  947.   ver (x_rand+breite*x_lng+1,y_rand-2,y_rand+(hoehe+2)*y_lng+1);
  948.   hor (x_rand-2,x_rand+breite*x_lng+1,y_rand-2);
  949.   hor (x_rand-2,x_rand+breite*x_lng+1,y_rand+(hoehe+2)*y_lng+1);
  950.   repeat
  951.     x:=(z mod x_lng); y:=(z div x_lng); farbe:=1;
  952.     repeat
  953.       cursor_lines; inc(farbe); if farbe>15 then farbe:=1;
  954.     until keypressed;
  955.     lies (control,taste,true);
  956.     farbe:=0; cursor_lines;
  957.     case control of
  958.       li:   dec(z);
  959.       re:   inc(z);
  960.       auf:  dec(z,x_lng);
  961.       ab:   inc(z,x_lng);
  962.       pos1: z:=z-(z mod x_lng);
  963.       end_: z:=z-(z mod x_lng)+pred(x_lng);
  964.       bauf: z:=z mod x_lng;
  965.       bab:  z:=(z mod x_lng)+(max_anz-x_lng);
  966.     end;
  967.   until taste in [#13,#27];
  968.   shut;
  969.   aufbauen:=true; abbruch:=taste=#27; cursor (true);
  970.   if not abbruch then zeichen_wahl:=z
  971.                  else zeichen_wahl:=zeichen;
  972. end;  (* zeichen_wahl *)
  973.  
  974.  
  975. procedure kopieren;
  976. var abbruch:            boolean;
  977.     von,bis,nach,carry: integer;
  978.     alt:                byte;
  979.  
  980. function zeig: boolean;
  981. const zeig_y  = 22;
  982.       zeig_x1 = 2;
  983.       zeig_x2 = 16;
  984.       zeig_x3 = 50;
  985. var   taste:    char;
  986.       s:        maxstring;
  987.  
  988. procedure schreib (x: byte; text: maxstring; zahl: integer);
  989. begin
  990.   wr(zeig_y,x,att_backgr,text+'   /   ');
  991.   if zahl=-1
  992.     then begin
  993.       setattr(zeig_y,x+5,3,att_zeig); setattr(zeig_y,x+9,3,att_zeig);
  994.     end else begin
  995.       wr(zeig_y,x+5,att_zeig,strr(zahl,3));
  996.       wr(zeig_y,x+9,att_zeig,'$'+hex(zahl));
  997.     end;
  998. end;   (* schreib *)
  999.  
  1000. begin (* zeig *)
  1001.   s:=' Taste drücken, um das Zeichen zu bestimmen oder ESC zum Abbrechen ';
  1002.   if aufbauen then bildschirm;
  1003.   schreib (zeig_x1,'von: ',von);
  1004.   if von<>-1 then begin
  1005.     schreib (zeig_x2,'bis: ',bis);
  1006.     if bis<>-1 then begin
  1007.       schreib (zeig_x3,'nach:',nach);
  1008.       if nach<>-1 then
  1009.         s:=' Taste drücken, um die Zeichen zu kopieren oder ESC zum Abbrechen ';
  1010.     end;
  1011.   end;
  1012.   wrm(24,40,att_backgr,s);
  1013.   taste:=readkey;
  1014.   zeig:=taste<>#27;
  1015. end;  (* zeig *)
  1016.  
  1017. begin  (* kopieren *)
  1018.   von:=-1; bis:=-1; nach:=-1; alt:=zeichen;
  1019.   if zeig then begin
  1020.     von:=zeichen_wahl (abbruch);
  1021.     if not abbruch then begin
  1022.       if zeig then begin
  1023.         zeichen:=von; bis:=zeichen_wahl (abbruch);
  1024.         if not abbruch then begin
  1025.           if bis<von then begin
  1026.             carry:=von; von:=bis; bis:=carry;
  1027.           end;
  1028.           if zeig then begin
  1029.             zeichen:=alt; nach:=zeichen_wahl (abbruch);
  1030.             if (not abbruch) and (zeig) then begin
  1031.               move(font^[von*z_lng],font^[nach*z_lng],succ(bis-von)*z_lng);
  1032.               saved:=false;
  1033.             end;
  1034.           end;
  1035.         end;
  1036.       end;
  1037.     end;
  1038.   end;
  1039.   zeichen:=alt; aufbauen:=true;
  1040. end;   (* kopieren *)
  1041.  
  1042.  
  1043. procedure fuellen (farbe: byte);
  1044. var x,y: byte;
  1045. begin
  1046.   if ja(' Sind Sie sicher (J/N) ? ')
  1047.     then for x:=0 to pred(breite) do for y:=0 to pred(hoehe) do
  1048.       setz_punkt (x,y,farbe);
  1049. end;   (* fuellen *)
  1050.  
  1051.  
  1052. procedure farbwahl;
  1053. const farb_breite = 32;
  1054.       farb_x      = (80-farb_breite) div 2;
  1055.       farb_hoehe  = 8;
  1056.       farb_y      = (24-farb_hoehe) div 2;
  1057. var   lauf,x,y:      byte;
  1058.       c:            char;
  1059. begin
  1060.   if farben=2
  1061.     then z_farbe:=1-z_farbe
  1062.     else begin
  1063.       save_screen:=crt_screen^; cursor (false);
  1064.       box(all_double_box,pred(farb_x),pred(farb_y),farb_breite,farb_hoehe,
  1065.           att_farb,att_farb);
  1066.       wrm(pred(farb_y),40,att_farb,' Farbauswahl ');
  1067.       wrm(farb_y+farb_hoehe,40,att_farb,
  1068.           ' Cursor: '#24','#25','#26','#27',Pos1,Ende ');
  1069.       repeat
  1070.         for lauf:=0 to 15 do begin
  1071.           if lauf=z_farbe then c:='▓' else c:='█';
  1072.           for y:=farb_y+(lauf div 8)*4 to farb_y+3+(lauf div 8)*4 do
  1073.             for x:=farb_x+(lauf mod 8)*4 to farb_x+3+(lauf mod 8)*4 do begin
  1074.               crt_screen^[y,x,0]:=c; crt_screen^[y,x,1]:=chr(lauf);
  1075.             end;
  1076.         end;
  1077.         lies (control,taste,true);
  1078.         case control of
  1079.           li:   dec(z_farbe);
  1080.           re:   inc(z_farbe);
  1081.           auf:  dec(z_farbe,8);
  1082.           ab:   inc(z_farbe,8);
  1083.           pos1: z_farbe:=z_farbe and 8;
  1084.           end_: z_farbe:=z_farbe or 7;
  1085.         end;
  1086.         if z_farbe<0 then inc(z_farbe,farben);
  1087.         if z_farbe>=farben then dec(z_farbe,farben);
  1088.       until taste in [#27,#13];
  1089.       crt_screen^:=save_screen; cursor (true);
  1090.     end;
  1091.   zeige_farbe;
  1092. end;   (* farbwahl *)
  1093.  
  1094.  
  1095. begin  (* editieren *)
  1096.   if hoehe=32 then begin
  1097.     textmode(co80+font8x8); max_zeile:=mem[0:$484];
  1098.   end;
  1099.   feld_x:=(80-breite) div 2; feld_y:=(max_zeile-hoehe) div 2;
  1100.   if farben=2
  1101.     then begin
  1102.       pages:=1; menue_l[6]:=menue_l_inv;
  1103.     end else pages:=4;
  1104.   if breite<>hoehe then dec(menue_l_lng);
  1105.   z_lng:=(breite shr 3)*hoehe*pages; font_groesse:=max_anz*z_lng;
  1106.   getmem(font,font_groesse); aufbauen:=true;
  1107.   font_loeschen; cs_x:=0; cs_y:=0; quit:=false; z_farbe:=1;
  1108.   repeat
  1109.     if aufbauen then bildschirm;
  1110.     darstellen;
  1111.     repeat
  1112.       ende:=false;
  1113.       gotoxy(succ(feld_x)+cs_x,succ(feld_y)+cs_y);
  1114.       lies (control,taste,true); taste:=upcase(taste);
  1115.       case control of
  1116.         li:   dec(cs_x);
  1117.         re:   inc(cs_x);
  1118.         auf:  dec(cs_y);
  1119.         ab:   inc(cs_y);
  1120.         pos1: begin cs_x:=0; cs_y:=0; end;
  1121.         end_: begin cs_x:=0; cs_y:=pred(hoehe); end;
  1122.         bauf: begin cs_x:=pred(breite); cs_y:=0; end;
  1123.         bab:  begin cs_x:=pred(breite); cs_y:=pred(hoehe); end;
  1124.         key:  case taste of
  1125.                 #13: begin zurueck; zeichen:=zeichen_wahl (dummy); end;
  1126.                 #27: ende:=true;
  1127.                 ' ': begin
  1128.                        if feld[cs_x,cs_y]=z_farbe
  1129.                          then setz_punkt(cs_x,cs_y,0)
  1130.                          else setz_punkt(cs_x,cs_y,z_farbe);
  1131.                        saved:=false;
  1132.                      end;
  1133.                 'A': if gesichert then font_loeschen;
  1134.                 '+': if breite=hoehe then drehen (true);
  1135.                 '-': if breite=hoehe then drehen (false);
  1136.                 'F': fuellen (z_farbe);
  1137.                 'H': horizontal;
  1138.                 'I': if pages=1 then invertieren;
  1139.                 'K': kopieren;
  1140.                 'L': laden;
  1141.                 'Q': if gesichert then quit:=true;
  1142.                 'S': if datei='' then speichern_unter
  1143.                                  else speichern;
  1144.                 'U': speichern_unter;
  1145.                 'V': vertikal;
  1146.                 'W': farbwahl;
  1147.                 'Z': fuellen (0);
  1148.               end;
  1149.         ext:  case ord(taste) of
  1150.                 59: roll_li;
  1151.                 60: roll_re;
  1152.                 61: roll_auf;
  1153.                 62: roll_ab;
  1154.               end;
  1155.       end;
  1156.       min(cs_x,0); min(cs_y,0); max(cs_x,pred(breite)); max(cs_y,pred(hoehe));
  1157.     until ende or aufbauen or quit;
  1158.   until quit;
  1159. end;   (* editieren *)
  1160.  
  1161.  
  1162. begin (* fontedit *)
  1163.   initialisieren;
  1164.   parameter_auswerten;
  1165.   editieren;
  1166.   schreibe_titelzeile;
  1167. end.