home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d549 / ffex.lha / FFEX / source / render.mod < prev    next >
Text File  |  1991-09-19  |  6KB  |  184 lines

  1. IMPLEMENTATION MODULE Render;
  2.  
  3. FROM Arts      IMPORT TermProcedure, Assert;
  4. FROM SYSTEM    IMPORT ADR,ADDRESS,INLINE;
  5. FROM Intuition IMPORT WindowPtr,SetPointer;
  6. FROM Exec      IMPORT CopyMem,AllocMem,FreeMem,MemReqs,MemReqSet,TypeOfMem;
  7.  
  8. CONST
  9.   MAX16=4096.0;         (* 2^12 Multiplikator für Int16 *)
  10.   MAX32=268435456.0; (* 2^28 Multiplikator für Int32 *)
  11.  
  12.  
  13. (*** Prozeduren für Fraktalgrafik ************************************)
  14.  
  15. PROCEDURE SetPixel(x{0},y{1},col{2},maxit{3},
  16.                    maxcol{4}:LONGINT;plane0Ptr{8}:ADDRESS);
  17. (* $E- schneller als WritePixel, direkt in die BitMap!   *)
  18. BEGIN
  19.   INLINE(0B483H,06C00H,0002EH,084C4H,04242H,04842H,05242H,02800H,
  20.          0E68CH,00240H,00007H,07A07H,09A40H,0D881H,02258H,00802H,
  21.          00000H,06700H,00006H,0D3C4H,00BD1H,0E20AH,04A02H,06600H,
  22.          0FFECH,04E75H);
  23. END SetPixel;
  24.  
  25. PROCEDURE GetPixel(x{0},y{1},planes{2}:LONGINT;
  26.                    plane0Ptr{8}:ADDRESS):LONGINT;
  27. (* $E- $F- schneller als ReadPixel                       *)
  28. BEGIN
  29.   INLINE(05342H,02600H,0E68BH,00240H,00007H,07807H,09840H,0203CH,
  30.          00000H,00000H,07A00H,0D681H,02258H,0D3C3H,00911H,06700H,
  31.          00004H,00BC0H,05245H,051CAH,0FFF0H,04E75H);
  32. END GetPixel;
  33.  
  34. PROCEDURE FastIter32(cx,cy:LONGREAL;maxiter:LONGINT):LONGINT;
  35.  
  36. PROCEDURE Assem(cx{0},cy{1},max{2}:LONGINT):LONGINT;
  37.   (* $E- $F- Assemblerprogramm für INT32                   *)
  38.   BEGIN
  39.     INLINE(048E7H,01FF8H,02440H,02641H,02842H,02E3CH,00000H,
  40.     00000H,0227CH,00000H,00000H,0207CH,00000H,00000H,02008H,
  41.     06A00H,00004H,04480H,03200H,04840H,0C2C0H,0E389H,03801H,
  42.     0243CH,00000H,00000H,0E352H,04842H,04241H,04841H,0C0C0H,
  43.     0D081H,06900H,000DAH,0D082H,06900H,000D4H,0E980H,06900H,
  44.     000CEH,0183CH,00000H,0E95CH,08004H,02800H,02009H,06A00H,
  45.     00004H,04480H,03200H,04840H,0C2C0H,0E389H,03A01H,0243CH,
  46.     00000H,00000H,0E352H,04842H,04241H,04841H,0C0C0H,0D081H,
  47.     06900H,0009CH,0D082H,06900H,00096H,0E980H,06900H,00090H,
  48.     01A3CH,00000H,0E95DH,08005H,06900H,00084H,02A00H,0D084H,
  49.     06900H,0007CH,09885H,0D88AH,02C3CH,00000H,00000H,02008H,
  50.     06A00H,00006H,04480H,05246H,03400H,04840H,02209H,06A00H,
  51.     00006H,04481H,05246H,03601H,04841H,0C6C0H,0C4C1H,0C0C1H,
  52.     0D682H,03A03H,0223CH,00000H,00000H,0E351H,04841H,04243H,
  53.     04843H,0D083H,06900H,00038H,0D081H,06900H,00032H,0E980H,
  54.     06900H,0002CH,01A3CH,00000H,0E95DH,08005H,00806H,00000H,
  55.     06700H,00004H,04480H,0E388H,06900H,00014H,0D08BH,06900H,
  56.     0000EH,02240H,02044H,05247H,0BE8CH,06600H,0FF02H,02007H,
  57.     04CDFH,01FF8H,04E75H);
  58.   END Assem;
  59.  
  60.   BEGIN
  61.     RETURN Assem(LONGINT(cx*MAX32),LONGINT(cy*MAX32),maxiter)
  62.   END FastIter32;
  63.  
  64.  
  65. PROCEDURE FastIter16(cx,cy:LONGREAL; maxiter:LONGINT):LONGINT;
  66.  
  67. PROCEDURE Assem(cx{0},cy{1},max{2}:LONGINT):LONGINT;
  68.   (* $E- $F- Assemblerprogramm für INT16                   *)
  69.   BEGIN
  70.     INLINE(0207CH,00000H,00000H,0227CH,00000H,00000H,02E3CH,
  71.     00000H,00000H,02608H,0C7C3H,0E983H,06900H,00038H,04243H,
  72.     04843H,02809H,0C9C4H,0E984H,06900H,0002AH,04244H,04844H,
  73.     02A04H,0DA43H,06B00H,0001EH,03A08H,03C09H,0CBC6H,0EB85H,
  74.     04845H,0DA41H,03245H,03A03H,09A44H,0DA40H,03045H,05247H,
  75.     051CAH,0FFC2H,02007H,04E75H);
  76.   END Assem;
  77.  
  78.   BEGIN
  79.     RETURN Assem(LONGINT(cx*MAX16),LONGINT(cy*MAX16),maxiter)
  80.   END FastIter16;
  81.  
  82.  
  83. PROCEDURE LongRealIter(cx,cy:LONGREAL; maxiter:LONGINT):LONGINT;
  84. (* der normale Mandelbrot-Algorithmus:  z:=z^2+c         *)
  85.   VAR
  86.     zi,zr,zi2,zr2:LONGREAL;
  87.     count:LONGINT;
  88.   BEGIN
  89.     zr:=0.0;zi:=0.0;count:=0;
  90.     LOOP
  91.       zr2:=zr*zr;zi2:=zi*zi;
  92.       IF (zr2+zi2)>8.0 THEN EXIT END;
  93.       zi:=zr*zi;zi:=zi+zi+cy;zr:=zr2-zi2+cx;INC(count);
  94.       IF count=maxiter THEN EXIT END;
  95.     END;
  96.     RETURN count;
  97.   END LongRealIter;
  98.  
  99.  
  100. (*** INLINE Daten und Prozeduren für Mauszeiger **********************)
  101.  
  102. VAR NormalPointer,ZZZPointer,ZoomPointer : ADDRESS;
  103.  
  104. PROCEDURE NormalPointerData; (* $E- *)
  105.   BEGIN
  106.     INLINE(00000H,00000H,04000H,08000H,0B000H,0C000H,04C00H,07000H,
  107.            04300H,07C00H,020C0H,03F00H,02000H,03FC0H,01100H,01E00H,
  108.            01280H,01F00H,00940H,00D80H,008A0H,00CC0H,00040H,00060H,
  109.            00000H,00000H)
  110.   END NormalPointerData;
  111.  
  112.  
  113. PROCEDURE ZZZPointerData; (* $E- *)
  114.   BEGIN
  115.     INLINE(00000H,00000H,0FFE0H,00000H,08020H,00000H,08020H,00000H,
  116.            0C060H,04040H,071C0H,03180H,07FC0H,03F80H,03F80H,00E00H,
  117.            00E00H,00400H,03580H,00400H,04040H,00000H,04040H,00000H,
  118.            08420H,00400H,09F20H,01F00H,0FFE0H,07FC0H,0FFE0H,00000H,
  119.            00000H,00000H);
  120.   END ZZZPointerData;
  121.  
  122.  
  123. PROCEDURE ZoomPointerData; (* $E- *)
  124. BEGIN
  125.   INLINE(00000H,00000H,00000H,01E00H,00000H,07380H,00800H,04080H,
  126.          01000H,0C0C0H,00000H,08040H,00000H,08040H,00000H,0C0C0H,
  127.          00000H,04080H,00040H,07380H,021A0H,03FC0H,01E50H,01E60H,
  128.          00028H,00030H,00010H,00018H,00000H,00000H);
  129. END ZoomPointerData;
  130.  
  131.  
  132. PROCEDURE SetNormalPointer(win:WindowPtr);
  133.   BEGIN
  134.     SetPointer(win,NormalPointer,0BH,16,0,0);
  135.   END SetNormalPointer;
  136.  
  137.  
  138. PROCEDURE SetZZZPointer(win:WindowPtr);
  139.   BEGIN
  140.     SetPointer(win,ZZZPointer,0FH,16,-8,-10);
  141.   END SetZZZPointer;
  142.  
  143.  
  144. PROCEDURE SetZoomPointer(win:WindowPtr);
  145.   BEGIN
  146.     SetPointer(win,ZoomPointer,0DH,16,-5,-5);
  147.   END SetZoomPointer;
  148.  
  149.  
  150. PROCEDURE Cleanup;
  151.   BEGIN
  152.     IF NormalPointer#NIL THEN FreeMem(NormalPointer,4*0DH) END;
  153.     IF ZZZPointer#NIL THEN FreeMem(ZZZPointer,4*011H) END;
  154.     IF ZoomPointer#NIL THEN FreeMem(ZoomPointer,4*0FH) END;
  155.   END Cleanup;
  156.  
  157. BEGIN
  158.   TermProcedure(Cleanup);
  159.  
  160.   (*** Pointerdaten falls nötig ins Chipmem kopieren. ***)
  161.  
  162.   NormalPointer := ADR(NormalPointerData);
  163.   IF NOT (chip IN TypeOfMem(NormalPointer)) THEN
  164.     NormalPointer := AllocMem(4*0DH,MemReqSet{chip,memClear});
  165.     Assert(NormalPointer#NIL,ADR("AllocMem() failed!"));
  166.     CopyMem(ADR(NormalPointerData),NormalPointer,4*0DH);
  167.   END;
  168.  
  169.   ZZZPointer := ADR(ZZZPointerData);
  170.   IF NOT (chip IN TypeOfMem(ZZZPointer)) THEN
  171.     ZZZPointer := AllocMem(4*11H,MemReqSet{chip,memClear});
  172.     Assert(ZZZPointer#NIL,ADR("AllocMem() failed!"));
  173.     CopyMem(ADR(ZZZPointerData),ZZZPointer,4*11H);
  174.   END;
  175.  
  176.   ZoomPointer := ADR(ZoomPointerData);
  177.   IF NOT (chip IN TypeOfMem(ZoomPointer)) THEN
  178.     ZoomPointer := AllocMem(4*0FH,MemReqSet{chip,memClear});
  179.     Assert(ZoomPointer#NIL,ADR("AllocMem() failed!"));
  180.     CopyMem(ADR(ZoomPointerData),ZoomPointer,4*0FH);
  181.   END;
  182.  
  183. END Render.mod
  184.