home *** CD-ROM | disk | FTP | other *** search
- ***********************************
- * TurboMandel Assembler Functions *
- ***********************************
-
- CSECT data
-
- XREF _GfxBase
- XREF _MathTransBase
- XREF _MathBase
- XREF _CycleOn
- XREF _CurrSpeed
- XREF _CycleLeft
- XREF _Palette
- XREF _Manvp
- XREF _CycleSpeed
- XREF _toppos
-
- CSECT text
-
- XREF _LVOWaitTOF
- XREF _LVOSPMul
- XREF _LVOSPAdd
- XREF _LVOSPSub
- XREF _LVOSPCmp
- XREF _LVOSPTieee
- XREF _LVOSPFieee
- XREF _LVOLoadRGB4
- XREF _CXV45
- XREF _CXV54
-
- XDEF _F2I
- XDEF _I2F
- XDEF _Int32Mand_asm
- XDEF _FloatMand_asm
- XDEF _DoCycle_asm
- XDEF _PaletteLeft
- XDEF _PaletteRight
-
- * Int32Mand_asm (long,long,LONG);
- * A0 A1 D0
-
- _Int32Mand_asm:
- movem.l d2-d7/a2-a6,-(a7)
- move.l d0,d3
- moveq #0,d4 ; q1 = 0
- moveq #0,d5 ; q2 = 0
- moveq #0,d6 ; x = 0
- moveq #0,d7 ; y = 0
- subq.w #1,d3
- mandelloop2:
- move.l d6,d1 ; D1 = oldx;
- move.l d4,d6
- sub.l d5,d6
- add.l a0,d6 ; x(D6) = q1(D4) - q2(D5) + acoo(A0);
- move.l d1,d2
- bpl.s Pos1
- neg.l d1
- Pos1:
- eor.l d7,d2
- tst.l d7
- bpl.s Pos2
- neg.l d7
- Pos2:
- move.l d1,d0
- swap d0
- move.w d0,d2
- mulu d7,d0
- clr.w d0
- swap d0
- swap d7
- mulu d7,d1
- clr.w d1
- swap d1
- mulu d2,d7
- add.l d0,d7
- add.l d1,d7
- tst.l d2
- bpl.s Pos3
- neg.l d7
- Pos3:
- moveq #6,d0
- asl.l d0,d7
- add.l a1,d7 ; y(D7) = 2 * oldx(D1) * y(D7) + bcoo(A1);
- moveq #5,d0
- move.l d7,d5
- bpl.s Pos4
- neg.l d5
- Pos4:
- move.l d5,d2
- swap d5
- mulu d5,d2
- clr.w d2
- swap d2
- mulu d5,d5
- add.l d2,d5
- add.l d2,d5
- asl.l d0,d5 ; q2(D4) = y(D7)^2;
- bvs.s mandelexit
- move.l d6,d4
- bpl.s Pos5
- neg.l d4
- Pos5:
- move.l d4,d2
- swap d4
- mulu d4,d2
- clr.w d2
- swap d2
- mulu d4,d4
- add.l d2,d4
- add.l d2,d4
- asl.l d0,d4 ; q1(D4) = x(D6)^2;
- bvs.s mandelexit
- move.l d4,d0
- add.l d5,d0
- bvs.s mandelexit
- cmp.l #536870912,d0
- bgt.s mandelexit
- dbf d3,mandelloop2
- moveq #1,d3
- mandelexit:
- subq.w #1,d3
- move.l d3,d0
- movem.l (a7)+,d2-d7/a2-a6
- rts
-
- * LONG __asm FloatMand_asm (float,float,LONG);
- * D0 A0 A1 D0
-
- _FloatMand_asm:
- movem.l d2-d7/a2-a6,-(a7) ; /* Calculate iteration of point */
- move.l a0,_acoo
- move.l a1,_bcoo
- move.l d0,d3
- move.l _MathBase(a4),a6
- moveq #0,d4 ; q1
- moveq #0,d5 ; q2
- moveq #0,d6 ; x
- moveq #0,d7 ; y
- subq.w #1,d3
- mandelloop:
- move.l d4,d0
- move.l d5,d1
- jsr _LVOSPSub(a6) ; d0 = q1 - q2;
- move.l _acoo(PC),d1
- jsr _LVOSPAdd(a6)
- move.l d6,d1 ; lastx = x
- move.l d0,d6 ; x = q1 - q2 + a;
- move.l d7,d0
- jsr _LVOSPMul(a6) ; d0 = lastx * y;
- addq.b #1,d0 ; move.l d0,d1
- ; jsr _LVOSPAdd(a6) ; d0 = 2 * lastx * y;
- move.l _bcoo(PC),d1
- jsr _LVOSPAdd(a6)
- move.l d0,d7 ; y = 2 * lastx * y + b;
- move.l d0,d1
- jsr _LVOSPMul(a6) ; q2 = y * y;
- move.l d0,d5
- move.l d6,d0 ; d0 = x;
- move.l d0,d1
- jsr _LVOSPMul(a6) ; q1 = x * x;
- move.l d0,d4
- move.l d5,d1
- jsr _LVOSPAdd(a6) ; d0 = q1 + q2;
- move.l #$80000043,d1
- jsr _LVOSPCmp(a6)
- bgt.s leavemandel ; if (q1 + q2 > 4.0) goto leavemandel;
- dbf d3,mandelloop
- moveq #1,d3
- leavemandel:
- subq.w #1,d3
- move.l d3,d0
- movem.l (a7)+,d2-d7/a2-a6
- rts
-
- _acoo: dc.l 0
- _bcoo: dc.l 0
-
- * void DoCycle_asm
-
- _DoCycle_asm:
- Forever:
- move.l _GfxBase(a4),a6
- jsr _LVOWaitTOF(a6)
- move.w _CycleOn(a4),d0
- beq ExitCycle
- CyclePalette:
- move.w _CurrSpeed(a4),d0
- subq.w #1,d0
- bne.s NoCycle
- tst.w _CycleLeft(a4)
- beq.s CycleRight
- bsr.s PaletteLeft
- bra.s SetColors
- CycleRight:
- bsr.s PaletteRight
- SetColors:
- lea _Palette(a4),a1
- move.l _Manvp(a4),a0
- moveq #32,d0
- move.l _GfxBase(a4),a6
- jsr _LVOLoadRGB4(a6)
- move.w _CycleSpeed(a4),d0
- NoCycle:
- move.w d0,_CurrSpeed(a4)
- bra.s Forever
- PaletteLeft:
- lea _Palette(a4),a1
- move.w 8(a1),d2
- move.w #8,d3
- moveq #26,d7
- CycleLoop:
- move.w 2(a1,d3.l),0(a1,d3.l)
- addq.l #2,d3
- dbf d7,CycleLoop
- move.w d2,62(a1)
- lea _toppos(a4),a1
- moveq #2,d7
- TopLeft:
- move.w (a1),d0
- subq.w #1,d0
- cmp.w #3,d0
- bne.s Ok2
- moveq #31,d0
- Ok2:
- move.w d0,(a1)+
- dbf d7,TopLeft
- rts
- PaletteRight:
- lea _Palette(a4),a1
- move.w 62(a1),d2
- move.w #62,d3
- moveq #26,d7
- CycleLoop2:
- move.w -2(a1,d3.l),0(a1,d3.l)
- subq.l #2,d3
- dbf d7,CycleLoop2
- move.w d2,8(a1)
- lea _toppos(a4),a1
- moveq #2,d7
- TopRight:
- move.w (a1),d0
- addq.w #1,d0
- cmp.w #32,d0
- bne.s Ok1
- moveq #4,d0
- Ok1:
- move.w d0,(a1)+
- dbf d7,TopRight
- ExitCycle:
- rts
-
- _PaletteLeft:
- movem.l d2/d3/d7/a1,-(a7)
- jsr PaletteLeft
- movem.l (a7)+,d2/d3/d7/a1
- rts
-
- _PaletteRight:
- movem.l d2/d3/d7/a1,-(a7)
- jsr PaletteRight
- movem.l (a7)+,d2/d3/d7/a1
- rts
-
- * FFP-IEEE conversions *
-
- * void F2I (ULONG *ieee,float getal)
- * A0 D0
- _F2I:
- move.l a3,-(a7)
- move.l a0,a3
- movea.l _MathTransBase(a4),a6
- jsr _LVOSPTieee(a6)
- jsr _CXV45(PC) ; convert single ieee to double ieee
- movem.l d0-d1,(a3)
- movea.l (a7)+,a3
- rts
-
- * float I2F (ULONG *ieee)
- * D0 A0
- _I2F:
- movem.l (a0),d0-d1
- jsr _CXV54(PC) ; convert double ieee to single ieee
- movea.l _MathTransBase(a4),a6
- jsr _LVOSPFieee(a6)
- rts
-
- END
-