* SManCP * By David M. McKinstry. * This version completed 6/13/89 * This is copyrighted by the author and not to be used in any commerical * application (excepting Amiga demonstrations) with out his permission. * However, it may be freely used any duplicated for any non-commercial * applications. INCLUDE "exec/types.i" ;Needed for SOFFSET macro INCLUDE "graphics/rastport.i" INCLUDE "intuition/intuition.i" XDEF _PlotIt XREF _GfxBase XREF _LVOSetAPen XREF _LVOWritePixel XREF _xtemp XREF _ytemp XREF _IntWindow XREF _CWRast XREF _SWidth XREF _SHeight XREF _S1Width XREF _S1Height XREF _Limit XREF _CurCnt XREF _MaxCnt _PlotIt: move.l _CurCnt,d0 ;Get Mandelbrot count cmp.l #$FFFF,d0 ;See if indicated as M.B. It won't be this big bne.s MandOut move.l #15,d0 bra.s SetC MandOut: ext.l d0 lsr.l #2,d0 add.l #1,d0 SetC: move.l _CWRast,a1 move.b d0,rp_FgPen(a1) move.l _ytemp,d1 cmp.l #49,d1 bge.s OKay movem.l d0-d7/a0-a6,-(a7) move.l a1,-(a7) ;Save raster port move.l _GfxBase,a6 jsr _LVOSetAPen(a6) move.l _IntWindow,a0 move.w wd_MouseY(a0),d0 cmp.w #49,d0 blt.s IntSet ;Mouse in menu region cmp.l #10,_ytemp ;See if y less than 12 ble.s IntSet bra.s MySet IntSet: move.l _xtemp,d0 move.l _ytemp,d1 move.l (a7)+,a1 jsr _LVOWritePixel(a6) movem.l (a7)+,d0-d7/a0-a6 rts MySet: move.l (a7)+,a1 ;Recover Raster port movem.l (a7)+,d0-d7/a0-a6 OKay: move.l _xtemp,d0 bsr SetOne rts SetOne: cmp.w _SWidth,d0 bge.s SetNot cmp.w _SHeight,d1 bgt.s SetNot tst.l d1 ;See if - bmi.s SetNot bsr SetPix SetNot: rts *SetPix has inputs of d0.w for x, d1.w for y, and a3 for the video pointer * Registers affected include d1, d2, and a0. It returns with the address * of the pixel in a0 and the bit to be set or cleared in d1 SetPix: movem.l d0-d3/a0-a2,-(a7) move.b rp_FgPen(a1),d3 ;Get mask for rastport move.l rp_BitMap(a1),a1 ;Get pointer to bitmap move.l a1,a2 ;Save bit map pointer in a2 addq.l #bm_Planes,a1 ;Get pointer to planes move.w d1,d2 ;See if y is - and get into d2 bmi.s SetNo ;Don't set if negative cmp.w (_S1Height+2),d1 bgt.s SetNo move.w d1,d2 ;y is in d2 move.w d0,d1 ;See if x is negative bmi.s SetNo ;Don't set if is cmp.w (_S1Width+2),d0 bgt.s SetNo ;bcc.s SetNo ;If no carry then too big move.l d2,d1 ;Save y in d1 mulu _SWidth,d1 ;Get Screen width times y add.l d0,d1 ;Add in x coordinate lsr.l #3,d1 ;d1 is x/8 move.l d1,d2 move.w d0,d1 ;d1 is x eori.w #7,d1 ;Toggle lowest 3 bits. andi.w #7,d1 ;Get 7 - x(mod 8) ext.l d3 move.l d3,d0 ;Move pen color into d0 move.b bm_Depth(a2),d3 ;Get depth in d3 SetPln: move.l (a1)+,a0 ;Get pointer to bit plane adda.l d2,a0 ;Add in offset btst #0,d0 ;See if 1st color beq.s NoOne bset d1,(a0) ;Set bit 7-x(mod8) bra.s PlnOne NoOne: bclr d1,(a0) PlnOne: asr.l #1,d0 ;Move next bit in color down. sub.b #1,d3 ;See if all planes done. bne.s SetPln SetNo: movem.l (a7)+,d0-d3/a0-a2 rts END