home *** CD-ROM | disk | FTP | other *** search
-
- PROGRAM MANDELB;
- { BERECHNEN UND ABSPEICHERN MANDELBROTMENGE }
-
- {$N+}
- {$E+}
- { ***** für Irm ***** }
-
-
- USES TPCRT,GRAPH,DOS,TPDOS,
- SELECTD,GETPUT,DIRBOXG,
- EGAVGA,TPENHKBD,
- TPSTRING;
-
- CONST
- SELCOL = 12; { TEXTFARBE AKTUELLER MENUEPUNKT }
- NORMCOL = 9; { TEXTFARBE NICHT AKTUELLER MENUEPUNKT }
- UEBCOL = 10; { TEXTFARBE UEBERSCHRIFTEN }
- BLANK = ' ';
-
- MAXMAXCOL = 60; { MAXIMALE GROESSE DES FARBEN- ARRAY }
-
- MMAX = 9;
- MMAX1 = 9;
-
- CONST FBUFSIZ = 8192;
-
- TYPE XARR = ARRAY [1..2] OF BYTE;
-
- VAR I,J,K,XWID,YWID,XOFF,YOFF,
- GDRIV,GMODE,MPOS,MPOS1,
- OXWID,OYWID,OXOFF,OYOFF,
- XMAX,YMAX : INTEGER;
- L,L1 : LONGINT;
- STD,MIN,SEC,MSEC : WORD;
- CH : CHAR;
- HATBILD,PARSAV : BOOLEAN;
- BB,MAXCOL,PP : BYTE;
- COL : ARRAY[0..255] OF BYTE;
- SIZ,ZSIZ : WORD;
- GSIZ : LONGINT;
- BILD : ARRAY[0..8] OF ^XARR;
- ZOOM : POINTER;
- N,NMAX : INTEGER;
- A,B,DA,DB,AMIN,AMAX,BMIN,BMAX,
- X,Y,G,CA,CB : SINGLE;
- NM_S : INTEGER;
- AA_S,AI_S,BA_S,BI_S,G_S : SINGLE;
- JULIA : BOOLEAN;
- DP,RP : PALETTETYPE;
-
- PATH,FNAM,PARAM : STRING;
- F : FILE;
- FP : ^XARR;
- FPTR : WORD;
- RC : SINGLE;
- RCB : ARRAY[0..5] OF BYTE ABSOLUTE RC;
-
-
- PROCEDURE ZEIGEBILD(WMOD:BYTE);
- VAR I : BYTE;
- BEGIN
- FOR I := 0 TO 8 DO
- PUTIMAGE(XOFF,YOFF+(I*SUCC(YWID DIV 8)),BILD[I]^,WMOD);
- END; { ZEIGEBILD }
-
-
- FUNCTION SHIFT:BOOLEAN;
- BEGIN
- SHIFT := (MEM[$40:$17] AND 3) <> 0;
- (*
- MEM[$40:$17] -> D0 = RIGHT SHIFT
- D1 = LEFT SHIFT
- D2 = CONTROL
- D3 = ALT
- D4 = SCROLL LOCK (GESPEICHERT)
- D5 = NUMLOCK (GESPEICHERT)
- D6 = CAPSLOCK (GESPEICHERT)
- D7 = INSERT (GESPEICHERT)
- *)
- END;
-
-
- PROCEDURE DISPPAR(XP,YP:INTEGER);
- BEGIN
- GOTOXY(XP,YP); WRITE('File -> ',FNAM);
- GOTOXY(XP,YP+1); WRITE(' Größe : ',XWID:4,' *',YWID:4);
- GOTOXY(XP,YP+2); WRITE(' XMIN =',AMIN:8:5);
- GOTOXY(XP,YP+3); WRITE(' XMAX =',AMAX:8:5);
- GOTOXY(XP,YP+4); WRITE(' YMIN =',BMIN:8:5);
- GOTOXY(XP,YP+5); WRITE(' YMAX =',BMAX:8:5);
- GOTOXY(XP,YP+6); WRITE(' Tiefe =',NMAX:5,' ');
- GOTOXY(XP,YP+7); WRITE('Grenzwert =',G:8:2);
- IF NOT JULIA THEN EXIT;
- GOTOXY(XP,YP+8); WRITE(' C - Real =',CA:8:5);
- GOTOXY(XP,YP+9); WRITE('C-Imaginär=',CB:8:5);
- END;
-
-
- PROCEDURE HELP;
- VAR CH : CHAR;
- BEGIN
- CLEARDEVICE;
- WRITELN('***** HELP NOCH NICHT INSTALLIERT *****');
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- CLEARDEVICE;
- END;
-
-
- PROCEDURE SETOUTP;
- VAR CH : CHAR;
- R : SINGLE;
- CSIZ,XW1,YW1 : INTEGER;
- FAKT : BYTE;
- OVF : BOOLEAN;
-
- PROCEDURE XRECT;
- BEGIN
- SETCOLOR(2);
- SETLINESTYLE(SOLIDLN,0,1);
- SETWRITEMODE(XORPUT);
- RECTANGLE(OXOFF,OYOFF,OXOFF+OXWID,OYOFF+OYWID);
- SETWRITEMODE(COPYPUT);
- END;
-
- PROCEDURE CHKOVR;
- BEGIN
- CSIZ := IMAGESIZE(0,0,OXWID,(OYWID DIV 8));
- L := CSIZ; L := L * 9;
- IF L > (MEMAVAIL + GSIZ) THEN BEGIN
- IF NOT OVF THEN BEGIN
- GOTOXY(1,15);
- WRITE('***** ZU WENIG SPEICHER *****');
- WRITE(CHR(7));
- OVF := TRUE;
- END;
- END ELSE BEGIN
- IF OVF THEN BEGIN
- GOTOXY(1,15);
- WRITE(' ':30);
- OVF := FALSE;
- END;
- END;
- END; { CHKOVR }
-
- BEGIN { SETOUTP }
- MPOS := 3;
- OVF := FALSE;
- CLEARDEVICE;
- WINDOW(28,10,80,25);
- GOTOXY(1,1);
- WRITELN('Fenstergröße : ',OXWID:4,' *',OYWID:4);
- WRITELN('Offset : ',OXOFF:4,' -',OYOFF:4);
- WRITELN(' ',#27,',',#24,' kleiner');
- WRITELN(' ',#26,',',#25,' größer');
- WRITELN(' mit SHIFT schneller');
- WRITELN;
- WRITE('Verzerrung');
- R := OXWID; R := R / OYWID; WRITE(' 1:',R:4:2);
- R := (AMAX-AMIN) / (BMAX-BMIN); WRITE(', 1:',R:4:2);
- WRITELN;
- WRITELN;
- WRITELN('<Home> = Quadrat');
- WRITELN;
- WRITELN('<End> oder E = Ende');
- CHKOVR;
- REPEAT;
- OXOFF := (SUCC(XMAX)-OXWID) DIV 2;
- OYOFF := (SUCC(YMAX)-OYWID) DIV 2; IF OYOFF < 0 THEN OYOFF := 0;
- XRECT;
-
- IF NOT KEYPRESSED THEN BEGIN
- XRECT;
- GOTOXY(16,1);
- WRITELN(OXWID:4,' *',OYWID:4);
- GOTOXY(16,2);
- WRITELN(OXOFF:4,' -',OYOFF:4);
- GOTOXY(14,7);
- R := OXWID; R := R / OYWID; WRITE(R:4:2);
- GOTOXY(22,7);
- R := (AMAX-AMIN) / (BMAX-BMIN); WRITE(R:4:2);
- XRECT;
- END;
-
- CH := UPCASE(READKEY); IF CH = #0 THEN CH := READKEY;
- XW1 := OXWID; YW1 := OYWID;
- XRECT;
- IF SHIFT THEN FAKT := 5 ELSE FAKT := 1;
- CASE CH OF
- #72 : BEGIN { AUF }
- IF OYWID > (50+FAKT) THEN DEC(OYWID,FAKT) ELSE OYWID := 50;
- END;
- #80 : BEGIN { AB }
- IF OYWID < (YMAX-FAKT) THEN INC(OYWID,FAKT) ELSE OYWID := YMAX;
- END;
- #75 : BEGIN { LINKS }
- IF OXWID > (50+FAKT) THEN DEC(OXWID,FAKT) ELSE OXWID := 50;
- END;
- #77 : BEGIN { RECHTS }
- IF OXWID < (XMAX-FAKT) THEN INC(OXWID,FAKT) ELSE OXWID := XMAX;
- END;
- #79 : CH := 'E'; { END }
- #71 : BEGIN { HOME }
- IF OXWID < YMAX THEN OYWID := OXWID ELSE OXWID := OYWID;
- END;
- END; { CASE }
- CHKOVR;
- UNTIL CH = 'E';
- CLEARDEVICE;
- END; { SETOUTP }
-
-
- PROCEDURE BILDFREIGEBEN;
- VAR I : BYTE;
- BEGIN
- IF HATBILD THEN BEGIN
- FOR I := 0 TO 8 DO FREEMEM(BILD[I],SIZ);
- GSIZ := 0;
- END;
- END; { BILDFREIGEBEN }
-
-
- FUNCTION GETFILENAME:STRING;
- VAR FNAM : STRING;
- BEGIN
- GETFILENAME := '';
- FNAM := '';
- WINDOW(6,3,74,15);
- GOTOXY(1,1);
- WRITE('╔');
- FOR I := 1 TO 66 DO WRITE('═');
- WRITE('╗');
- FOR I := 2 TO 11 DO BEGIN
- GOTOXY(1,I); WRITE('║');
- GOTOXY(68,I); WRITE('║');
- END;
- GOTOXY(1,12);
- WRITE('╚');
- FOR I := 1 TO 66 DO WRITE('═');
- WRITE('╝');
- WINDOW(7,4,72,13);
- FNAM := SELECTFILE(PATH,'*.MBM');
- WINDOW(1,1,80,25);
- IF LENGTH(FNAM) = 0 THEN BEGIN
- CLEARDEVICE;
- EXIT;
- END;
- PATH := JUSTPATHNAME(FNAM);
- GETFILENAME := FNAM;
- END; { GETFILENAME }
-
-
- FUNCTION LIESFILE(FNAM:STRING;MSG:BOOLEAN):BOOLEAN;
- VAR I,J : INTEGER;
- CH : CHAR;
- B1 : BYTE ABSOLUTE CH;
- OK : BOOLEAN;
- R : REAL;
- BEGIN
- LIESFILE := FALSE;
- IF NOT EXISTFILE(FNAM) THEN BEGIN
- IF MSG THEN WRITELN(' File ',FNAM,' nicht gefunden');
- EXIT;
- END;
- FOPEN(F,FNAM);
- {$I-}
- OK := TRUE;
- FGETC(F,CH); IF CH <> 'M' THEN OK := FALSE;
- FGETC(F,CH); IF CH <> 'B' THEN OK := FALSE;
- FGETC(F,CH); IF CH <> 'M' THEN OK := FALSE;
- FGETC(F,CH); IF (CH <> #$1A) AND ((CH < '1') OR (CH > '3')) THEN OK := FALSE;
- IF NOT OK THEN BEGIN
- FCLOSE(F);
- IF MSG THEN WRITELN('***** INKOMPATIBLES DATEIFORMAT *****');
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- CLEARDEVICE;
- PARSAV := FALSE;
- EXIT;
- END;
- IF CH >= '2' THEN BEGIN
- FOR I := 5 TO 8 DO FGETB(F,BB);
- FGETW(F,STD); FGETW(F,MIN); FGETW(F,SEC); FGETW(F,MSEC);
- END ELSE BEGIN
- FOR I := 5 TO 16 DO FGETB(F,BB);
- STD := 9999;
- END;
- FGETI(F,XWID); FGETI(F,YWID);
- FGETI(F,NMAX); FGETW(F,SIZ);
- OXWID := XWID; OYWID := YWID;
- FGETR(F,R); AMIN := R; FGETR(F,R); AMAX := R;
- FGETR(F,R); BMIN := R; FGETR(F,R); BMAX := R;
- FGETR(F,R); G := R;
- IF CH >= '1' THEN BEGIN
- FGETB(F,MAXCOL);
- FOR I := 1 TO MAXMAXCOL DO FGETB(F,COL[I]);
- END;
- IF CH >= '3' THEN BEGIN
- FGETR(F,R); CA := R;
- FGETR(F,R); CB := R;
- FGETB(F,B1); IF B1 = 0 THEN JULIA := FALSE ELSE JULIA := TRUE;
- END ELSE BEGIN
- CA := 0;
- CB := 0;
- JULIA := FALSE;
- END;
- XOFF := (SUCC(XMAX)-XWID) DIV 2;
- YOFF := (SUCC(YMAX)-YWID) DIV 2; IF YOFF < 0 THEN YOFF := 0;
- OXWID := XWID; OXOFF := XOFF;
- OYWID := YWID; OYOFF := YOFF;
-
- L := SIZ; L := L * 9;
- IF L > (MEMAVAIL+GSIZ) THEN BEGIN
- FCLOSE(F);
- IF MSG THEN WRITELN('***** ZU WENIG SPEICHERPLATZ *****');
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- HATBILD := FALSE;
- PARSAV := FALSE;
- EXIT;
- END;
-
- FOR I := 0 TO 8 DO BEGIN
- GETMEM(BILD[I],SIZ);
- GSIZ := GSIZ + SIZ;
- FGET(F,BILD[I],SIZ);
- END; { NEXT I }
- {$I+}
- IF FILEERR = 0 THEN BEGIN
- FCLOSE(F);
- HATBILD := TRUE;
- END ELSE BEGIN
- IF MSG THEN WRITELN('Lesefehler File ',FNAM);
- HATBILD := FALSE;
- END;
-
- LIESFILE := TRUE;
- END; { LIESFILE }
-
-
- PROCEDURE DISPPZEIT;
- BEGIN
- DISPPAR(1,1);
- IF STD < 9999 THEN BEGIN
- GOTOXY(42,1);
- WRITE('Rechenzeit :',STD:3,' Std,',MIN:3,' min,',SEC:3,',',MSEC:3,' sec');
- END;
- END; { DISPPZEIT }
-
-
- PROCEDURE LOAD;
- VAR CH : CHAR;
- BEGIN
- MPOS := 1;
- CLEARDEVICE;
- BILDFREIGEBEN;
-
- GOTOXY(1,1);
- WRITE(' Einlesen File');
- FNAM := GETFILENAME;
- IF FNAM = '' THEN EXIT;
- GOTOXY(1,21);
-
- IF NOT LIESFILE(FNAM,TRUE) THEN EXIT;
-
- CLEARDEVICE;
- ZEIGEBILD(0);
- GOTOXY(1,1); WRITE(BLANK,BLANK);
- DISPPZEIT;
- WRITE(CHR(7));
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- CLEARDEVICE;
- PARSAV := FALSE;
- END; { LOAD }
-
-
- PROCEDURE STORE;
- VAR I,J : INTEGER;
- CH : CHAR;
- R : REAL;
- BEGIN
- IF NOT HATBILD THEN EXIT;
- MPOS := 7;
- CLEARDEVICE;
- IF PARSAV THEN BEGIN
- AMIN := AI_S; AMAX := AA_S; BMIN := BI_S; BMAX := BA_S;
- G := G_S; NMAX := NM_S;
- PARSAV := FALSE;
- END;
- ZEIGEBILD(0);
-
- GOTOXY(1,1);
- FNAM := '';
- WRITELN('Eingabe ''*'' = File- Selector- Box');
- WRITE('Abspeichern File -> '); READLN(FNAM);
- IF FNAM = '*' THEN FNAM := GETFILENAME;
- IF LENGTH(FNAM) = 0 THEN BEGIN
- CLEARDEVICE;
- EXIT;
- END;
- IF POS('.',FNAM) = 0 THEN FNAM := FNAM + '.MBM';
-
- CLEARDEVICE;
- ZEIGEBILD(0);
- DISPPAR(1,1);
-
- FOPEN(F,FNAM);
- {$I-}
- FPUTC(F,'M'); FPUTC(F,'B'); FPUTC(F,'M'); FPUTC(F,'3'); FPUTB(F,$1A);
- FOR I := 6 TO 8 DO FPUTB(F,0);
- FPUTW(F,STD); FPUTW(F,MIN); FPUTW(F,SEC); FPUTW(F,MSEC);
- FPUTW(F,XWID); FPUTW(F,YWID);
- FPUTW(F,NMAX); FPUTW(F,SIZ);
- R := AMIN; FPUTR(F,R); R := AMAX; FPUTR(F,R);
- R := BMIN; FPUTR(F,R); R := BMAX; FPUTR(F,R);
- R := G; FPUTR(F,R);
- FPUTB(F,MAXCOL);
- FOR I := 1 TO MAXMAXCOL DO FPUTB(F,COL[I]);
- R := CA; FPUTR(F,R);
- R := CB; FPUTR(F,R);
- IF JULIA THEN FPUTB(F,$FF) ELSE FPUTB(F,$00);
-
- FOR I := 0 TO 8 DO BEGIN
- FPUT(F,BILD[I],SIZ);
- END; { NEXT I }
- {$I+}
- IF FILEERR = 0 THEN BEGIN
- FCLOSE(F);
- END ELSE BEGIN
- WRITELN('Schreibfehler File ',FNAM);
- END;
-
- WRITE(CHR(7));
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- CLEARDEVICE;
- END;
-
-
- PROCEDURE GETPARAM;
- VAR R : SINGLE;
- S : STRING[10];
- I : INTEGER;
- CH : CHAR;
- MM : BYTE;
-
- PROCEDURE GETVAL;
- BEGIN
- IF S = '' THEN EXIT;
- IF S[1] = '.' THEN INSERT('0',S,1);
- IF (S[1] = '-') AND (S[2]='.') THEN INSERT('0',S,2);
- CASE MPOS1 OF
- 1 : VAL(S,AMIN,I);
- 2 : VAL(S,AMAX,I);
- 3 : VAL(S,BMIN,I);
- 4 : VAL(S,BMAX,I);
- 5 : VAL(S,NMAX,I);
- 6 : VAL(S,G,I);
- 7 : VAL(S,CA,I);
- 8 : VAL(S,CB,I);
- END; { CASE }
- IF G < 0.1 THEN G := 0.1;
- IF NMAX < 1 THEN NMAX := 1;
- S := '';
- END;
-
- PROCEDURE DISPPMENUE(VON,BIS:BYTE);
- LABEL ENDE;
- BEGIN
- IF VON = 0 THEN BEGIN
- WINDOW(20,8,80,25);
- TEXTCOLOR(UEBCOL);
- GOTOXY(1,1);
- WRITELN('Berechnungsparameter :');
- WRITELN;
- WRITELN('<End> oder E = Ende');
- END;
- WINDOW(20,12,80,25);
- IF BIS < 1 THEN GOTO ENDE;
- IF VON < 2 THEN BEGIN
- GOTOXY(1,1);
- IF MPOS1 = 1 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE(' XMIN (',AMIN:8:5,') -> ');
- IF MPOS1 = 1 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- IF BIS < 2 THEN GOTO ENDE;
- IF VON < 3 THEN BEGIN
- GOTOXY(1,2);
- IF MPOS1 = 2 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE(' XMAX (',AMAX:8:5,') -> ');
- IF MPOS1 = 2 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- IF BIS < 3 THEN GOTO ENDE;
- IF VON < 4 THEN BEGIN
- GOTOXY(1,3);
- IF MPOS1 = 3 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE(' YMIN (',BMIN:8:5,') -> ');
- IF MPOS1 = 3 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- IF BIS < 4 THEN GOTO ENDE;
- IF VON < 5 THEN BEGIN
- GOTOXY(1,4);
- IF MPOS1 = 4 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE(' YMAX (',BMAX:8:5,') -> ');
- IF MPOS1 = 4 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- IF BIS < 5 THEN GOTO ENDE;
- IF VON < 6 THEN BEGIN
- GOTOXY(1,5);
- IF MPOS1 = 5 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE(' Tiefe (',NMAX:5 ,' ) -> ');
- IF MPOS1 = 5 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- IF BIS < 6 THEN GOTO ENDE;
- IF VON < 7 THEN BEGIN
- GOTOXY(1,6);
- IF MPOS1 = 6 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE(' Grenzwert (',G:8:2 ,') -> ');
- IF MPOS1 = 6 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- IF BIS < 7 THEN GOTO ENDE;
- IF VON < 8 THEN BEGIN
- GOTOXY(1,8);
- IF MPOS1 = 7 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE(' C - Real (',CA:8:5 ,') -> ');
- IF MPOS1 = 7 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- IF BIS < 8 THEN GOTO ENDE;
- IF VON < 9 THEN BEGIN
- GOTOXY(1,9);
- IF MPOS1 = 8 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE('C-Imaginär (',CB:8:5 ,') -> ');
- IF MPOS1 = 8 THEN WRITE(S);
- WRITELN(BLANK);
- END;
- ENDE:
- TEXTCOLOR(UEBCOL);
- END;
-
- BEGIN { PARAM }
- MPOS := 4;
- MPOS1 := 1;
- MM := MMAX1; IF NOT JULIA THEN DEC(MM,2);
- CLEARDEVICE;
- IF NOT PARSAV THEN BEGIN
- AI_S := AMIN; AA_S := AMAX; BI_S := BMIN; BA_S := BMAX;
- G_S := G; NM_S := NMAX;
- PARSAV := TRUE;
- END;
- S := '';
- DISPPMENUE(0,MM);
- REPEAT
- DISPPMENUE(MPOS1,MPOS1);
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- CASE CH OF
- ^H : IF LENGTH(S) > 0 THEN DELETE(S,LENGTH(S),1);
- ^M : BEGIN
- GETVAL;
- INC(MPOS1);
- DISPPMENUE(PRED(MPOS1),PRED(MPOS1));
- IF MPOS1 > MM THEN MPOS1 := 1;
- END;
- ',','.' : IF POS('.',S) = 0 THEN IF LENGTH(S) < 3 THEN S := S + '.';
- '-' : IF LENGTH(S) = 0 THEN S := '-';
- '0'..'9' : S := S + CH;
- #72 : BEGIN { AUF }
- DEC(MPOS1);
- DISPPMENUE(SUCC(MPOS1),SUCC(MPOS1));
- IF MPOS1 < 1 THEN MPOS1 := MM;
- END;
- #80 : BEGIN { AB }
- INC(MPOS1);
- DISPPMENUE(PRED(MPOS1),PRED(MPOS1));
- IF MPOS1 > MM THEN MPOS1 := 1;
- END;
- #79 : CH := 'E'; { END }
- END; { CASE }
-
- IF AMIN > AMAX THEN BEGIN
- R := AMIN; AMIN := AMAX; AMAX := R;
- DISPPMENUE(1,2);
- END;
- IF BMIN > BMAX THEN BEGIN
- R := BMIN; BMIN := BMAX; BMAX := R;
- DISPPMENUE(3,4);
- END;
- UNTIL CH = 'E';
- CLEARDEVICE;
- END;
-
-
- PROCEDURE AUSSCHN;
- VAR I,J,YP,XW1,YW1,XP1,YP1,ZF : INTEGER;
- CH,CH1 : CHAR;
- XSC,YSC,R,
- AI_T,AA_T,BI_T,BA_T,G_T : SINGLE;
- NM_T : INTEGER;
- ON : BOOLEAN;
- FAKT : BYTE;
-
- PROCEDURE INIDISP;
- BEGIN
- SETCOLOR(15);
- SETLINESTYLE(SOLIDLN,0,3);
- SETWRITEMODE(XORPUT);
-
- GOTOXY(65,YP); WRITE('XMIN = ',XP1*XSC+AMIN:8:5);
- GOTOXY(65,YP+1); WRITE('XMAX = ',(XP1+XW1)*XSC+AMIN:8:5);
- GOTOXY(65,YP+2); WRITE('YMIN = ',YP1*YSC+BMIN:8:5);
- GOTOXY(65,YP+3); WRITE('YMAX = ',(YP1+YW1)*YSC+BMIN:8:5);
-
- GOTOXY(65,YP+4);
- WRITE('Verzerrung ');
- GOTOXY(65,YP+5);
- R := XWID; R := R / YWID; WRITE(' 1:',R:4:2);
- R := XW1; R := R * XSC; R := R / YSC; R := R /YW1;
- WRITE(', 1:',R:4:2);
- GOTOXY(65,YP+6); WRITE('<End> = Ende ');
- END; { INIDISP }
-
- PROCEDURE BLINK;
- BEGIN
- BEGIN
- RECTANGLE(XOFF+XP1,YOFF+YP1,XOFF+XP1+XW1,YOFF+YP1+YW1);
- END;
-
- IF ON THEN ON := FALSE ELSE ON := TRUE;
- END; { BLINK }
-
- PROCEDURE SETWIN;
- BEGIN
- BLINK;
- GOTOXY(72,YP); WRITE(XP1*XSC+AMIN:8:5);
- GOTOXY(72,YP+1); WRITE((XP1+XW1)*XSC+AMIN:8:5);
- GOTOXY(72,YP+2); WRITE(YP1*YSC+BMIN:8:5);
- GOTOXY(72,YP+3); WRITE((YP1+YW1)*YSC+BMIN:8:5);
- GOTOXY(68,YP+5);
- R := XWID; R := R / YWID; WRITE(R:4:2);
- GOTOXY(76,YP+5);
- R := XW1; R := R * XSC; R := R / YSC; R := R /YW1;
- WRITE(R:4:2);
- END; { SETWIN }
-
- BEGIN { AUSSCHN }
- IF NOT HATBILD THEN EXIT;
- MPOS := 6;
- CLEARDEVICE;
- ON := FALSE;
- AI_T := AMIN; AA_T := AMAX; BI_T := BMIN; BA_T := BMAX;
- G_T := G; NM_T := NMAX;
- IF PARSAV THEN BEGIN
- AMIN := AI_S; AMAX := AA_S; BMIN := BI_S; BMAX := BA_S;
- G := G_S; NMAX := NM_S;
- END;
- YP := 1;
- XW1 := XWID DIV 2;
- YW1 := YWID DIV 2;
- XP1 := XWID DIV 4;
- YP1 := YWID DIV 4;
- XSC := (AMAX-AMIN); XSC := XSC / XWID;
- YSC := (BMAX-BMIN); YSC := YSC / YWID;
- ZEIGEBILD(0);
- INIDISP;
- SETWIN;
- REPEAT
- L := TIMEMS;
- REPEAT
- IF TIMEMS - L > 50 THEN BEGIN
- L := TIMEMS;
- BLINK;
- END;
- UNTIL KEYPRESSED;
- CH := UPCASE(READKEY); IF CH = #0 THEN CH1 := READKEY ELSE CH1 := #0;
- IF NOT ON THEN BLINK;
- IF SHIFT THEN FAKT := 5 ELSE FAKT := 1;
- CASE CH OF
- 'P' : BEGIN
- SETWIN;
- IF YP = 1 THEN YP := 19 ELSE YP := 1;
- CLEARDEVICE;
- ZEIGEBILD(0);
- INIDISP;
- SETWIN;
- END;
- 'Z' : BEGIN { ZOOM }
- IF (XW1 <= (XWID DIV 2)) AND (YW1 <= (YWID DIV 2)) THEN BEGIN
- SETWIN;
- I := XMAX DIV XW1; J := YMAX DIV YW1;
- IF I < J THEN ZF := I ELSE ZF := J;
-
- ZSIZ := IMAGESIZE(0,0,1,YW1+1);
- GETMEM(ZOOM,ZSIZ);
- FOR I := 0 TO PRED(XW1) DO BEGIN
- GETIMAGE(XOFF+XP1+I,YOFF+YP1,XOFF+XP1+I+1,YOFF+YP1+YW1,ZOOM^);
- FOR J := 0 TO PRED(ZF) DO PUTIMAGE(ZF*I+J,0,ZOOM^,0);
- END; { NEXT I }
- FREEMEM(ZOOM,ZSIZ);
-
- ZSIZ := IMAGESIZE(0,0,XW1*ZF,1);
- GETMEM(ZOOM,ZSIZ);
- FOR I := PRED(YW1) DOWNTO 0 DO BEGIN
- GETIMAGE(0,I,XW1*ZF,I+1,ZOOM^);
- FOR J := PRED(ZF) DOWNTO 0 DO PUTIMAGE(0,ZF*I+J,ZOOM^,0);
- END; { NEXT I}
- FREEMEM(ZOOM,ZSIZ);
-
- CH := UPCASE(READKEY);
- IF CH = #0 THEN CH1 := READKEY ELSE CH1 := #0;
- CLEARDEVICE;
- ZEIGEBILD(0);
- INIDISP;
- SETWIN;
- END;
- END;
- ELSE CASE CH1 OF
- #59 : BEGIN { F1 }
- SETWIN;
- SETFILLSTYLE(1,0);
- BAR(0,0,400,160);
- GOTOXY(1,1);
- WRITELN('Ausschnitt verschieben : ',#24,',',#25,',',#26,',',#27);
- WRITELN('Ausschnitt verkleinern : CTRL- ',#27,',',#24);
- WRITELN('Ausschnitt vergrößern : CTRL- ',#26,',',#25);
- WRITELN(' schneller mit SHIFT');
- WRITELN;
- WRITELN('Verzerrung zeigt die Verhältnisse Breite zu Höhe');
- WRITELN(' des Ausgabefensters und');
- WRITELN(' des zu berechnenden Ausschnitts an');
- WRITELN;
- WRITELN('"Z" = zoom zeigt den Ausschnitt vergrößert');
- CH := UPCASE(READKEY);
- IF CH = #0 THEN CH1 := READKEY ELSE CH1 := #0;
- CLEARDEVICE;
- ZEIGEBILD(0);
- INIDISP;
- SETWIN;
- END;
- #75 : BEGIN { LINKS }
- SETWIN;
- IF (XOFF+XP1) > PRED(FAKT) THEN DEC(XP1,FAKT);
- SETWIN;
- END;
- #77 : BEGIN { RECHTS }
- SETWIN;
- IF (XOFF+XP1+XW1) < (XMAX-FAKT) THEN INC(XP1,FAKT);
- SETWIN;
- END;
- #72 : BEGIN { AUF }
- SETWIN;
- IF (YOFF+YP1) > PRED(FAKT) THEN DEC(YP1,FAKT);
- SETWIN;
- END;
- #80 : BEGIN { AB }
- SETWIN;
- IF (YOFF+YP1+YW1) < (YMAX-FAKT) THEN INC(YP1,FAKT);
- SETWIN;
- END;
- #115 : BEGIN { CTRL LINKS }
- SETWIN;
- IF XW1 > (3+FAKT) THEN DEC(XW1,FAKT) ELSE XW1 := 3;
- SETWIN;
- END;
- #116 : BEGIN { CTRL RECHTS }
- SETWIN;
- IF XW1 < (XMAX-XOFF-XP1-FAKT) THEN INC(XW1,FAKT) ELSE XW1 := XMAX - XOFF - XP1;
- SETWIN;
- END;
- #141 : BEGIN { CTRL AUF }
- SETWIN;
- IF YW1 > (3+FAKT) THEN DEC(YW1,FAKT) ELSE YW1 := 3;
- SETWIN;
- END;
- #145 : BEGIN { CTRL AB }
- SETWIN;
- IF YW1 < (YMAX-YOFF-YP1-FAKT) THEN INC(YW1,FAKT) ELSE YW1 := YMAX - YOFF - YP1;
- SETWIN;
- END;
- #79 : CH := 'E'; { END }
- END; { CASE CH1 }
- END; { CASE CH }
- UNTIL CH = 'E';
- GOTOXY(1,1);
- WRITE('Ausschnitt übernehmen J/N ? ');
- CH := UPCASE(READKEY); IF CH = #0 THEN CH1 := READKEY ELSE CH1 := #0;
- IF CH = 'J' THEN BEGIN
-
- IF NOT PARSAV THEN BEGIN
- AI_S := AMIN; AA_S := AMAX; BI_S := BMIN; BA_S := BMAX;
- G_S := G; NM_S := NMAX;
- PARSAV := TRUE;
- END;
-
- R := AMIN;
- AMIN := XP1*XSC+R;
- AMAX := (XP1+XW1)*XSC+R;
- R := BMIN;
- BMIN := YP1*YSC+R;
- BMAX := (YP1+YW1)*YSC+R;
-
- MPOS := 5;
- END ELSE BEGIN
- AMIN := AI_T; AMAX := AA_T; BMIN := BI_T; BMAX := BA_T;
- G := G_T; NMAX := NM_T;
- END;
- SETLINESTYLE(SOLIDLN,0,1);
- SETWRITEMODE(COPYPUT);
- CLEARDEVICE;
- END; { AUSSCHN }
-
-
- PROCEDURE FARBEN;
- VAR I,J,W,A : INTEGER;
- ACOL : BYTE;
- CH,CH1 : CHAR;
- YYOFF,YYWID,YZWID,YCOFF : INTEGER;
-
- PROCEDURE DISPPOS(FARBE:BYTE);
- BEGIN
- TEXTCOLOR(FARBE);
- GOTOXY(10+5*(PRED(ACOL) MOD 12),YCOFF+YCOFF*(PRED(ACOL) DIV 12));
- WRITE(ACOL:5);
- TEXTCOLOR(UEBCOL);
- END;
-
- PROCEDURE DISPCOL(SELPOS:INTEGER);
- VAR I,J : INTEGER;
- BEGIN
- I := PRED(SELPOS) DIV 12;
- J := SUCC(PRED(SELPOS) MOD 12);
- IF SELPOS = ACOL THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- GOTOXY(10+5*PRED(J),YCOFF+YCOFF*I);
- WRITE(SELPOS:5);
- TEXTCOLOR(UEBCOL);
- SETFILLSTYLE(1,COL[12*I+J]);
- BAR(50+40*J,YYOFF+YYOFF*I,80+40*J,YYOFF+YYWID+YYOFF*I);
- RECTANGLE(50+40*J,YYOFF+YYOFF*I,80+40*J,YYOFF+YYWID+YYOFF*I);
- END; { DISPCOL }
-
- BEGIN { FARBEN }
- MPOS := 2;
- CLEARDEVICE;
- ACOL := 1;
- W := -1;
-
- IF YMAX = 479 THEN BEGIN
- YYOFF := 80;
- YYWID := 50;
- YZWID := 16;
- YCOFF := 5;
- END ELSE BEGIN
- YYOFF := 56;
- YYWID := 36;
- YZWID := 14;
- YCOFF := 4;
- END;
-
- TEXTCOLOR(UEBCOL);
- GOTOXY(1,1);
- WRITE(#24,' = 1 Farbe mehr, ',#25,' = 1 Farbe weniger <End> oder "E" = Ende');
- GOTOXY(1,2);
- WRITE(#26,',',#27,' = Farb- Nr. auswählen');
- GOTOXY(1,3);
- WRITE('Zahl eingeben dann Enter = aktuelle Farbe einstellen');
-
- FOR I := 0 TO 15 DO BEGIN
- GOTOXY(1,I+SUCC(YCOFF)); WRITE(I:2);
- SETFILLSTYLE(1,I); BAR( 30,YYOFF+YZWID*I,42,YYOFF+12+YZWID*I);
- SETCOLOR(15); RECTANGLE(30,YYOFF+YZWID*I,42,YYOFF+12+YZWID*I);
- END;
-
- FOR I := 1 TO MAXCOL DO DISPCOL(I);
-
- REPEAT
- CH := UPCASE(READKEY); IF CH = #0 THEN CH1 := READKEY ELSE CH1 := #0;
- CASE CH OF
- '0'..'9' : BEGIN
- A := ORD(CH) - $30;
- IF W > -1 THEN IF W = 1 THEN W := 10 + A ELSE W := A
- ELSE W := A;
- GOTOXY(13+5*(PRED(ACOL) MOD 12),YCOFF+YCOFF*(PRED(ACOL) DIV 12)+1);
- TEXTCOLOR(14);
- WRITE(W:2);
- TEXTCOLOR(UEBCOL);
- END;
- ^H : BEGIN
- GOTOXY(13+5*(PRED(ACOL) MOD 12),YCOFF+YCOFF*(PRED(ACOL) DIV 12)+1);
- IF W > 0 THEN BEGIN
- W := W DIV 10;
- TEXTCOLOR(14);
- WRITE(W:2);
- TEXTCOLOR(UEBCOL);
- END ELSE BEGIN
- W := -1;
- WRITE(' ');
- END;
- END;
- ^M : BEGIN
- IF W > -1 THEN BEGIN
- IF W > 15 THEN W := 15;
- COL[ACOL] := W;
- DISPCOL(ACOL);
- W := -1;
- END;
- IF ACOL < MAXCOL THEN BEGIN
- DISPCOL(ACOL);
- DISPPOS(NORMCOL);
- INC(ACOL);
- DISPPOS(SELCOL);
- END;
- END;
- ELSE CASE CH1 OF
- #75 : BEGIN { LINKS }
- DISPCOL(ACOL);
- W := -1;
- DISPPOS(NORMCOL);
- IF ACOL > 1 THEN DEC(ACOL);
- DISPPOS(SELCOL);
- END;
- #77 : BEGIN { RECHTS }
- DISPCOL(ACOL);
- W := -1;
- DISPPOS(NORMCOL);
- IF ACOL < MAXCOL THEN INC(ACOL);
- DISPPOS(SELCOL);
- END;
- #72 : BEGIN { AUF }
- DISPCOL(ACOL);
- W := -1;
- IF MAXCOL < MAXMAXCOL THEN BEGIN
- INC(MAXCOL);
- DISPCOL(MAXCOL);
- END;
- END;
- #80 : BEGIN { AB }
- DISPCOL(ACOL);
- W := -1;
- DISPPOS(NORMCOL);
- IF MAXCOL > 2 THEN BEGIN
- I := PRED(MAXCOL) DIV 12;
- J := SUCC(PRED(MAXCOL) MOD 12);
- SETFILLSTYLE(1,0);
- BAR(50+40*J,YYOFF-16+YYOFF*I,80+40*J,YYOFF+YYWID+YYOFF*I);
- DEC(MAXCOL);
- END;
- IF ACOL > MAXCOL THEN ACOL := MAXCOL;
- DISPPOS(SELCOL);
- END;
- #82 : BEGIN { INSERT }
- DISPCOL(ACOL);
- W := -1;
- IF ACOL < MAXMAXCOL THEN BEGIN
- IF MAXCOL < MAXMAXCOL THEN INC(MAXCOL);
- FOR I := PRED(MAXMAXCOL) DOWNTO ACOL DO BEGIN
- COL[SUCC(I)] := COL[I];
- IF I < MAXCOL THEN DISPCOL(SUCC(I));
- END;
- END;
- END;
- #83 : BEGIN { DELETE }
- DISPCOL(ACOL);
- W := -1;
- IF ACOL < MAXMAXCOL THEN BEGIN
- IF MAXCOL > 2 THEN BEGIN
- I := PRED(MAXCOL) DIV 12;
- J := SUCC(PRED(MAXCOL) MOD 12);
- SETFILLSTYLE(1,0);
- BAR(50+40*J,YYOFF-16+YYOFF*I,80+40*J,YYOFF+YYWID+YYOFF*I);
- DEC(MAXCOL);
- END;
- FOR I := ACOL TO MAXMAXCOL DO BEGIN
- COL[I] := COL[SUCC(I)];
- IF I <= MAXCOL THEN DISPCOL(I);
- END;
- END;
- IF ACOL > MAXCOL THEN ACOL := MAXCOL;
- DISPPOS(SELCOL);
- END;
- #79 : CH := 'E'; { END }
- END; { CASE CH1 }
- END; { CASE CH }
- UNTIL CH = 'E';
- TEXTCOLOR(UEBCOL);
- CLEARDEVICE;
- END;
-
-
- PROCEDURE MACHHIN;
- VAR I,J,XW1,YW1,XO1,YO1 : INTEGER;
- CH : CHAR;
- COL1 : WORD;
- XW2,YW2 : INTEGER;
- XQ,YQ : SINGLE;
- RAND : BOOLEAN;
-
- PROCEDURE RECHNEPUNKT(XO,YO:INTEGER);
- BEGIN
- IF JULIA THEN BEGIN
- X := AMIN + ((I+XO) * DA);
- Y := BMIN + ((J+YO) * DB);
- END ELSE BEGIN
- B := BMIN + ((J+YO) * DB);
- X := 0; Y := 0;
- END;
- N := 0;
- REPEAT
- XQ := SQR(X);
- YQ := SQR(Y);
- Y := 2 * X * Y + B;
- X := XQ - YQ + A;
- INC(N);
- UNTIL (N = NMAX) OR ((XQ + YQ) > G);
- IF N < NMAX THEN PUTPIXEL(XOFF+I+XO,YOFF+J+YO,COL[N MOD MAXCOL])
- ELSE PUTPIXEL(XOFF+I,YOFF+J,0);
- END;
-
- BEGIN { MACHHIN }
- COL[0] := COL[MAXCOL];
- MPOS := 5;
- CLEARDEVICE;
- XW1 := XWID; YW1 := YWID;
- XO1 := XOFF; YO1 := YOFF;
- XWID := OXWID; YWID := OYWID;
- XOFF := OXOFF; YOFF := OYOFF;
- XW2 := (XWID AND $FFFE); YW2 := (YWID AND $FFFE);
- SETLINESTYLE(SOLIDLN,0,1);
- RECTANGLE(XOFF,YOFF,XOFF+XW2,YOFF+YW2);
- L := IMAGESIZE(0,0,OXWID,(OYWID DIV 8));
- L := L * 9;
- IF L > (MEMAVAIL+GSIZ) THEN BEGIN
- FCLOSE(F);
- GOTOXY(1,10);
- WRITELN('***** ZU WENIG SPEICHERPLATZ *****');
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- CLEARDEVICE;
- HATBILD := FALSE;
- PARSAV := FALSE;
- EXIT;
- END;
- DISPPAR(1,1);
- SETCOLOR(15);
-
- L := TIMEMS;
- IF JULIA THEN BEGIN
- A := CA;
- B := CB;
- END;
-
- DA := (AMAX - AMIN) / XWID;
- DB := (BMAX - BMIN) / YWID;
-
- FOR I := 0 TO XWID DO BEGIN
- RAND := ((I = 0) OR (I = XW2));
- IF NOT JULIA THEN A := AMIN + I * DA;
- IF (I AND 1) <> 0 THEN BEGIN
- END ELSE BEGIN
- FOR J := 0 TO YWID DO BEGIN
- IF (J AND 1) <> 0 THEN BEGIN
- END ELSE BEGIN
- RECHNEPUNKT(0,0);
- IF KEYPRESSED THEN BEGIN
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- IF CH = ^[ THEN BEGIN
- XWID := XW1; YWID := YW1;
- XOFF := XO1; YOFF := YO1;
- CLEARDEVICE;
- EXIT;
- END;
- END;
- IF J > 1 THEN BEGIN
- COL1 := GETPIXEL(XOFF+I,YOFF+J);
- IF COL1 = GETPIXEL(XOFF+I,YOFF+J-2)
- THEN PUTPIXEL(XOFF+I,YOFF+J-1,COL1)
- ELSE RECHNEPUNKT(0,-1);
- END;
- END; { IF (J AND 1) <> 0 }
- END; { NEXT J }
- IF I > 1 THEN BEGIN
- FOR J := 0 TO YWID DO BEGIN
- COL1 := GETPIXEL(XOFF+I,YOFF+J);
- IF COL1 = GETPIXEL(XOFF+I-2,YOFF+J)
- THEN PUTPIXEL(XOFF+I-1,YOFF+J,COL1)
- ELSE BEGIN
- IF NOT JULIA THEN A := AMIN + (PRED(I) * DA);
- RECHNEPUNKT(-1,0);
- END;
- END; { NEXT J }
- END;
- END; { IF (I AND 1) <> 0 }
- END; { NEXT I }
-
- BILDFREIGEBEN;
- SIZ := IMAGESIZE(0,0,XWID,(YWID DIV 8));
- FOR I := 0 TO 8 DO BEGIN
- GETMEM(BILD[I],SIZ);
- GSIZ := GSIZ + SIZ;
- GETIMAGE(XOFF,YOFF+(I*(YWID DIV 8)),
- XOFF+XWID,YOFF+((I+1)*(YWID DIV 8)),BILD[I]^);
- END; { NEXT I }
- HATBILD := TRUE;
-
- L1 := TIMEMS;
- IF L < L1 THEN L := L1 - L ELSE L := 86400000 - L + L1;
- STD := L DIV 3600000;
- L1 := STD; L1 := L1 * 3600000; L := L - L1;
- MIN := L DIV 60000;
- L1 := MIN; L1 := L1 * 60000; L := L - L1;
- SEC := L DIV 1000;
- L1 := SEC; L1 := L1 * 1000; L := L - L1;
- MSEC := L;
- GOTOXY(42,1);
- WRITE('Rechenzeit :',STD:3,' Std,',MIN:3,' min,',SEC:3,',',MSEC:3,' sec');
-
- WRITE(CHR(7));
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- CLEARDEVICE;
- PARSAV := FALSE;
- MPOS := 7;
- END; { MACHHIN }
-
-
- PROCEDURE GUCKMAL;
- VAR CH1 : CHAR;
- I : BYTE;
- BEGIN
- IF NOT HATBILD THEN EXIT;
- CLEARDEVICE;
- ZEIGEBILD(0);
- CH1 := READKEY; IF CH1 = #0 THEN CH1 := READKEY;
- (*
- CLEARDEVICE;
- *)
- END; { GUCKMAL }
-
-
- PROCEDURE MENUE;
- CONST SELCHAR : ARRAY[1..MMAX] OF CHAR =
- ('1','2','3','4','5','6','7','8','E');
- VAR CH,CH1 : CHAR;
-
- PROCEDURE DISPMENUE(VON,BIS:BYTE);
- LABEL ENDE;
- BEGIN
- IF VON = 0 THEN BEGIN
- WINDOW(1,1,80,25);
- TEXTCOLOR(7);
- GOTOXY(55,25); WRITE(MAXAVAIL,' Bytes Speicher');
-
- WINDOW(15,2,80,25);
- TEXTCOLOR(UEBCOL);
- GOTOXY(1,1);
- IF JULIA THEN WRITE(' ****** Juliamengen- Berechnung ****** ')
- ELSE WRITE('Mandelbrotmengen- Berechnung (Apfelmännchen)');
- WINDOW(20,4,80,25);
- TEXTCOLOR(NORMCOL);
- IF JULIA THEN WRITE('Mandelbrotmenge ........... M')
- ELSE WRITE('Juliamenge ................ J');
- END;
- WINDOW(20,6,80,25);
- IF BIS < 1 THEN GOTO ENDE;
- IF VON < 2 THEN BEGIN
- GOTOXY(1,1);
- IF MPOS = 1 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE('File laden ................ 1');
- END;
- IF BIS < 2 THEN GOTO ENDE;
- IF VON < 3 THEN BEGIN
- GOTOXY(1,3);
- IF MPOS = 2 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE('Farben einstellen ......... 2');
- END;
- IF BIS < 3 THEN GOTO ENDE;
- IF VON < 4 THEN BEGIN
- GOTOXY(1,5);
- IF MPOS = 3 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE('Fenstergröße einstellen ... 3');
- END;
- IF BIS < 4 THEN GOTO ENDE;
- IF VON < 5 THEN BEGIN
- GOTOXY(1,7);
- IF MPOS = 4 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE('Parameter einstellen ...... 4');
- END;
- IF BIS < 5 THEN GOTO ENDE;
- IF VON < 6 THEN BEGIN
- GOTOXY(1,9);
- IF MPOS = 5 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE('Berechnen ................. 5');
- END;
- IF BIS < 6 THEN GOTO ENDE;
- IF VON < 7 THEN BEGIN
- GOTOXY(1,11);
- IF MPOS = 6 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- IF HATBILD THEN WRITE('Ausschnitt festlegen ...... 6');
- END;
- IF BIS < 7 THEN GOTO ENDE;
- IF VON < 8 THEN BEGIN
- GOTOXY(1,13);
- IF MPOS = 7 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- IF HATBILD THEN WRITE('File abspeichern .......... 7');
- END;
- IF BIS < 8 THEN GOTO ENDE;
- IF VON < 9 THEN BEGIN
- GOTOXY(1,15);
- IF MPOS = 8 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- IF HATBILD THEN WRITE('Bild ansehen .............. 8');
- END;
- IF BIS < 9 THEN GOTO ENDE;
- IF VON < 10 THEN BEGIN
- GOTOXY(1,17);
- IF MPOS = 9 THEN TEXTCOLOR(SELCOL) ELSE TEXTCOLOR(NORMCOL);
- WRITE('Programm Ende ............. E');
- END;
- ENDE:
- TEXTCOLOR(UEBCOL);
- WINDOW(1,1,80,25); GOTOXY(1,1);
- END;
-
- BEGIN { MENUE }
- SETVIEWPORT(0,0,XMAX,YMAX,CLIPON);
- CH := ' ';
- REPEAT
- IF CH <> #0 THEN DISPMENUE(0,99);
- CH := UPCASE(READKEY); IF CH = #0 THEN CH1 := READKEY ELSE CH1 := #0;
- IF CH = #0 THEN CASE CH1 OF
- #59 : BEGIN { F1 }
- HELP;
- CH := '@';
- DISPMENUE(0,99);
- END;
- #72 : BEGIN { AUF }
- DEC(MPOS);
- DISPMENUE(SUCC(MPOS),SUCC(MPOS));
- IF (NOT HATBILD) AND (MPOS = 7) THEN MPOS := 5;
- IF MPOS < 1 THEN MPOS := MMAX;
- DISPMENUE(MPOS,MPOS);
- END;
- #80 : BEGIN { AB }
- INC(MPOS);
- DISPMENUE(PRED(MPOS),PRED(MPOS));
- IF (NOT HATBILD) AND (MPOS = 6) THEN MPOS := 8;
- IF MPOS > MMAX THEN MPOS := 1;
- DISPMENUE(MPOS,MPOS);
- END;
- #79 : CH := 'E'; { END }
- END; { CASE }
- IF CH = ^M THEN CH := SELCHAR[MPOS];
- CASE CH OF
- '1' : LOAD;
- '2' : FARBEN;
- '3' : SETOUTP;
- '4' : GETPARAM;
- '5' : MACHHIN;
- '6' : AUSSCHN;
- '7' : STORE;
- '8' : GUCKMAL;
- 'J','j' : JULIA := TRUE;
- 'M','m' : JULIA := FALSE;
- END; { CASE }
- UNTIL CH = 'E';
- END; { MENUE }
-
-
- PROCEDURE ROTATEPAL(DIR:BOOLEAN);
- VAR PC : CHAR;
- PS : STRING[16] ABSOLUTE RP;
- BEGIN
- IF DIR THEN BEGIN
- PC := PS[2];
- MOVE(PS[3],PS[2],14);
- PS[16] := PC;
- END ELSE BEGIN
- INSERT(PS[16],PS,2);
- END;
- SETALLPALETTE(RP);
- END; { ROTATEPAL }
-
-
- PROCEDURE BATCH;
- VAR BF : TEXT;
- LIN : STRING;
- WMOD : BYTE;
- STOP,ANIMATE : BOOLEAN;
- CH1 : CHAR;
- SCHLEIFE : WORD;
-
- PROCEDURE DELBLANK;
- BEGIN
- WHILE (LENGTH(LIN) > 0) AND (LIN[1] = ' ') DO DELETE(LIN,1,1);
- END; { DELBLANK }
-
- PROCEDURE DELNONBLANK;
- BEGIN
- WHILE (LENGTH(LIN) > 0) AND (LIN[1] <> ' ') DO DELETE(LIN,1,1);
- END; { DELNONBLANK }
-
- PROCEDURE BATCHCOMMAND;
- VAR I,J : WORD;
- CH1 : CHAR;
- S : STRING;
- BEGIN { BATCHCOMMAND }
- DELBLANK;
- CASE LIN[1] OF
- 'A' : ANIMATE := NOT ANIMATE;
- 'C' : CLEARDEVICE;
- 'D' : BEGIN
- DELNONBLANK;
- DELBLANK;
- VAL(LIN,I,J);
- IF J = 0 THEN REPEAT
- DELAY(100);
- IF ANIMATE THEN ROTATEPAL(FALSE);
- DEC(I);
- UNTIL KEYPRESSED OR (I = 0);
- END;
- 'F' : BEGIN
- DELNONBLANK;
- DELBLANK;
- IF SCHLEIFE = 0 THEN BEGIN
- I := POS(' ',LIN);
- VAL(COPY(LIN,1,PRED(I)),SCHLEIFE,J);
- IF J = 0 THEN BEGIN
- DELNONBLANK;
- DELBLANK;
- END ELSE SCHLEIFE := 0;
- END ELSE BEGIN
- DELNONBLANK;
- DELBLANK;
- DEC(SCHLEIFE);
- END;
- IF SCHLEIFE > 0 THEN BEGIN
- IF TEXTSEEK(BF,0) THEN REPEAT
- READLN(BF,S);
- UNTIL EOF(BF) OR (S = ':'+LIN);
- END;
- END;
- 'G' : BEGIN
- DELNONBLANK;
- DELBLANK;
- IF TEXTSEEK(BF,0) THEN REPEAT
- READLN(BF,S);
- UNTIL EOF(BF) OR (S = ':'+LIN);
- END;
- 'K' : BEGIN
- REPEAT
- DELAY(100);
- IF ANIMATE THEN ROTATEPAL(FALSE);
- UNTIL KEYPRESSED;
- CH1 := READKEY;
- IF CH1 = ^[ THEN STOP := TRUE;
- IF CH1 = #0 THEN CH1 := READKEY;
- END;
- 'L' : BEGIN
- DELNONBLANK;
- DELBLANK;
- RP := DP;
- SETALLPALETTE(RP);
- ANIMATE := FALSE;
- BILDFREIGEBEN;
- IF LIESFILE(LIN,FALSE) THEN ZEIGEBILD(WMOD);
- END;
- 'P' : DISPPZEIT;
- 'R' : ZEIGEBILD(WMOD);
- 'W' : BEGIN
- DELNONBLANK;
- DELBLANK;
- VAL(LIN,I,J);
- IF (J = 0) AND (I IN [0..3]) THEN WMOD := I;
- END;
- END; { CASE LIN[1] }
- END; { BATCHCOMMAND }
-
- BEGIN { BATCH }
- STOP := FALSE;
- ANIMATE := FALSE;
- WMOD := 0;
- SCHLEIFE := 0;
- ASSIGN(BF,PARAM);
- RESET(BF);
- WHILE NOT EOF(BF) AND NOT STOP DO BEGIN
- READLN(BF,LIN);
- LIN := STUPCASE(LIN);
- BATCHCOMMAND;
- IF KEYPRESSED THEN BEGIN
- CH1 := READKEY;
- IF CH1 = ^[ THEN STOP := TRUE;
- IF CH1 = #0 THEN CH1 := READKEY;
- END;
- END; { WHILE NOT EOF(BF) }
- CLOSE(BF);
- CLOSEGRAPH;
- HALT;
- END; { BATCH }
-
-
- BEGIN { MAIN }
- DIRECTVIDEO := FALSE;
- TEXTCOLOR(UEBCOL);
-
- DETECTGRAPH(GDRIV,GMODE);
- IF (GDRIV <> EGA) AND (GDRIV <> VGA) THEN BEGIN
- WRITELN;
- WRITELN;
- WRITELN('Dies Programm funktioniert nur mit EGA > 64k Bytes');
- WRITELN('oder VGA - mein Vorschlag : neuen Computer kaufen !');
- WRITELN;
- HALT;
- END;
-
- PATH := ZIELDIR;
- FNAM := 'GBILD.MBM';
- PARAM := '';
- HATBILD := FALSE;
- PARSAV := FALSE;
- MPOS := 1;
- MAXCOL := 15;
- FOR I := 1 TO MAXMAXCOL DO COL[I] := I MOD 16;
- GSIZ := 0;
-
- IF ZIELDIR[LENGTH(ZIELDIR)] = '\' THEN FNAM := ZIELDIR + FNAM
- ELSE FNAM := ZIELDIR + '\' + FNAM;
-
- if RegisterBGIdriver(@EGAVGADriver) < 0 then BEGIN
- WRITELN('FEHLER BEI REGISTERBGIDRIVER');
- HALT(1);
- END;
-
- DETECTGRAPH(GDRIV,GMODE);
- PP := 2;
- IF PARAMCOUNT > 0 THEN BEGIN
- IF STUPCASE(PARAMSTR(1)) = '/E' THEN BEGIN
- GDRIV := EGA;
- GMODE := EGAHI;
- END ELSE BEGIN
- IF STUPCASE(PARAMSTR(1)) = '/V' THEN BEGIN
- GDRIV := VGA;
- GMODE := VGAHI;
- END ELSE BEGIN
- PP := 1;
- END;
- END;
- PARAM := STUPCASE(PARAMSTR(PP));
- IF POS('.MBM',PARAM) > 0 THEN FNAM := PARAM;
- END;
-
- INITGRAPH(GDRIV,GMODE,'');
- XMAX := GETMAXX;
- YMAX := GETMAXY;
- SETLINESTYLE(SOLIDLN,0,1);
-
- DP.SIZE := 16;
- DP.COLORS[0] := 0;
- DP.COLORS[1] := 1;
- DP.COLORS[2] := 2;
- DP.COLORS[3] := 3;
- DP.COLORS[4] := 4;
- DP.COLORS[5] := 5;
- DP.COLORS[6] := 6;
- DP.COLORS[7] := 7;
- DP.COLORS[8] := $38;
- DP.COLORS[9] := 1 + 1 SHL 3;
- DP.COLORS[10] := 2 + 2 SHL 3;
- DP.COLORS[11] := 3 + 3 SHL 3;
- DP.COLORS[12] := 4 + 4 SHL 3;
- DP.COLORS[13] := 5 + 5 SHL 3;
- DP.COLORS[14] := 6 + 6 SHL 3;
- DP.COLORS[15] := 7 + 7 SHL 3;
- RP := DP;
-
- YWID := YMAX - 100;
- XWID := YWID;
- XOFF := (SUCC(XMAX)-XWID) DIV 2;
- YOFF := (SUCC(YMAX)-YWID) DIV 2; IF YOFF < 0 THEN YOFF := 0;
- OXWID := XWID; OYWID := YWID;
- OXOFF := XOFF; OYOFF := YOFF;
- STD := 9999;
-
- AMIN := -2;
- AMAX := 1;
- BMIN := -1.15;
- BMAX := 1.15;
- NMAX := 100;
- G := 100;
- CA := 0;
- CB := 0;
- JULIA := FALSE;
-
- SETVIEWPORT(0,0,XMAX,YMAX,CLIPON);
- CLEARDEVICE;
- { GGF. MANDELBROT- BATCH AUSFÜHREN }
- IF (POS('.MBB',PARAM) > 0) AND (EXISTFILE(PARAM)) THEN BATCH;
- IF LIESFILE(FNAM,FALSE) THEN ZEIGEBILD(0);
- MENUE;
-
- CLOSEGRAPH;
- END.
-