home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
fractals
/
sman
/
cp
/
mandcp.asm
< prev
next >
Wrap
Assembly Source File
|
1991-02-02
|
5KB
|
234 lines
* 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"
mc68881
XDEF _FuncFind
XDEF _ConExt
XREF _LVOSetAPen
XREF _LVOWritePixel
XREF _GfxBase
XREF _LVOSetAPen
XREF _LVOWritePixel
XREF _Factor
XREF _XCenter
XREF _YCenter
XREF _xtemp
XREF _ytemp
XREF _LacMod
XREF _IntWindow
XREF _CWRast
XREF _SWidth
XREF _SHeight
XREF _S1Width
XREF _S1Height
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 ;Use my SetPix if below Menus,
movem.l d0-d7/a0-a6,-(a7) ;Otherwise use WritePixel.
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
* Convert relevant double precision values from main to extended precision.
_ConExt:
fmove.x fp0,-(a7)
fmove.d _Factor,fp0
fmove.x fp0,Factor
move.l #2,d0
fmove.l d0,fp0
fmove.x fp0,Two
fmove.x Factor,fp0
fmul.x Two,fp0
fmul.x fp0,fp0
fmove.x fp0,Limit
fmove.d _XCenter,fp0
fmove.x fp0,XCenter
fmove.d _YCenter,fp0
fmove.x fp0,YCenter
fmove.x (a7)+,fp0
rts
nop
nop
nop
nop
nop
nop
nop
nop
lea Limit,a0
_FuncFind:
bsr FncFnd
move.l d7,_CurCnt
bsr PlotIt
rts
FncFnd:
fmove.x Two,fp7
fmove.x Factor,fp6
move.l _xtemp,d0
move.l _ytemp,d1
tst.w _LacMod
bne.s IsLace
lsl.l #1,d1 ;If non-interlace, double y.
IsLace: fmove.l d0,fp0
fmove.l d1,fp1
fsub.x XCenter,fp0
fsub.x YCenter,fp1
bsr Mand
rts
Mand: move.l #0,d7 ;Initialize counter
fmove.l d7,fp2 ;Place 0 in Zr
fmove.x fp2,fp3 ;Same for Zi
ZConv: bsr.s ZFind ;Get next value for Zr and Zi
cmp.l _MaxCnt,d7 ;See if to be assumed within Mandelbrot set
bgt.s LimCnt
bra.s ZConv
LimCnt: move.l #$FFFF,d7 ;Indicate it is part of Mandelbrot
NotMand:
rts
ZFind: fmove.x fp2,fp4 ;Get current Zr into temporary
fmove.x fp3,fp5 ;Do same for Zi
fmul.x fp4,fp4 ;Find Zr^2
fmul.x fp5,fp5 ;Find Zi^2
fmove.x fp5,-(a7) ;Save Zi^2 on stack
fadd.x fp4,fp5 ;Find z-squared
fcmp.x Limit,fp5 ;See if > 2^2 (i.e. is |Z|>2?)
fbgt TooBig ;If so extablish count to failure
fmove.x (a7)+,fp5 ;Recover Zi^2
fsub.x fp5,fp4 ;Find Zr^2 - Zi^2
fdiv.x fp6,fp4 ;Divide by factor to get part of new Zr
fadd.x fp0,fp4 ;Find New Zr
fmul.x fp2,fp3 ;Find original Zi*Zr
fmul.x fp7,fp3 ;Find 2*Zi*Ze
fdiv.x fp6,fp3 ;Divide by Factor
fadd.x fp1,fp3 ;Add in original Zi to get new Zi
fmove.x fp4,fp2 ;and get new Zr into fp2
addq.l #1,d7 ;Increment counter
rts
TooBig: fmove.x (a7)+,fp5 ;Recover fp5 to balance stack
fmove.x fp2,fp5 ;See if fp5 really needed
addq.l #4,a7 ;Balance stack for return from ZFind
bra.s NotMand ;Back to Main
dseg
Limit: ds.l 3
Factor: ds.l 3
Two: ds.l 3
XCenter:
ds.l 3
YCenter:
ds.l 3
END