******************************************* * One of the simplest strange attractors * * is the Lorenz attractor: * * E. N. Lorenz, Deterministic Nonperiodic * * Flow, Journal of Atmospheric Science, * * 20, 130, (1963) * * * * The model consists of the differential * * equations: * * * * x' = -s*x + s*y * * y' = r*x - y - x*z * * z' = x*y - b*z * * * * with: s = 10 r = 28 b = 8/3 * * * * This implementation was written by * * E. Lenz * * Johann-Fichte-Strasse 11 * * 8 Munich 40 * * Germany * * * ******************************************* _AbsExecBase equ 4 **** exec ***** _LVOForbid equ -$84 _LVOPermit equ -$8a _LVOGetMsg equ -$174 _LVOReplyMsg equ -$17a _LVOWaitPort equ -$180 _LVOCloseLibrary equ -$19e _LVOOpenLibrary equ -$228 **** intuition ****** _LVOCloseScreen equ -$42 _LVOCloseWindow equ -$48 _LVOOpenScreen equ -$c6 _LVOOpenWindow equ -$cc _LVOViewPortAddress equ -$12c ***** graphics ****** _LVOLoadRGB4 equ -$c0 _LVOMove equ -$f0 _LVODraw equ -$f6 _LVOSetAPen equ -$156 ****** mathffp ****** _LVOSPFix equ -$1e _LVOSPAdd equ -$42 _LVOSPSub equ -$48 _LVOSPMul equ -$4e _LVOSPDiv equ -$54 wd_RPort equ $32 wd_UserPort equ $56 pr_MsgPort equ $5c pr_CLI equ $ac ThisTask equ $114 VBlankFrequency equ $212 dt equ $83126f37 ;0.001 one equ $80000041 ;1 three equ $c0000042 ;3 fif equ $f0000044 ;15 movea.l _AbsExecBase,a6 test if WB or CLI movea.l ThisTask(a6),a0 moveq #0,d0 tst.l pr_CLI(a0) bne.s isCLI lea pr_MsgPort(a0),a0 for WB get WB Message jsr _LVOWaitPort(a6) jsr _LVOGetMsg(a6) isCLI move.l d0,-(a7) cmpi.b #60,VBlankFrequency(a6) test if PAL or NTSC beq.s isNTSC move.w #256,ns+6 Patch the programme move.w #256,nw+6 for PAL at run time move.w #$7810,NTSC1 move.w #120,NTSC2+2 isNTSC lea GfxName(pc),a1 Open graphics.library moveq #0,d0 jsr _LVOOpenLibrary(a6) movea.l d0,a4 tst.l d0 beq.s Gexit lea IntName(pc),a1 open intuition library moveq #0,d0 jsr _LVOOpenLibrary(a6) movea.l d0,a2 tst.l d0 beq.s Gexit lea FfpName(pc),a1 open mathffp library moveq #0,d0 jsr _LVOOpenLibrary(a6) movea.l d0,a3 tst.l d0 beq.s Gexit lea ns(pc),a0 open screen movea.l a2,a6 jsr _LVOOpenScreen(a6) move.l d0,nws beq.s Gexit lea nw(pc),a0 open window jsr _LVOOpenWindow(a6) move.l d0,window Gexit beq exit movea.l d0,a0 movea.l wd_RPort(a0),a5 jsr _LVOViewPortAddress(a6) movea.l d0,a0 lea ColourTable(pc),a1 moveq #16,d0 movea.l a4,a6 jsr _LVOLoadRGB4(a6) move.l #300,d0 draw axis moveq #0,d1 movea.l a5,a1 jsr _LVOMove(a6) moveq #15,d6 NTSC1 moveq #12,d4 move.l d4,d5 colour move.l d6,d0 movea.l a5,a1 jsr _LVOSetAPen(a6) move.l #300,d0 move.l d5,d1 movea.l a5,a1 jsr _LVODraw(a6) add.l d4,d5 dbra d6,colour moveq #20,d3 loop movea.l _AbsExecBase,a6 movea.l window(pc),a0 movea.l wd_UserPort(a0),a0 jsr _LVOGetMsg(a6) tst.l d0 beq.s Main ;No message movea.l d0,a1 move.l $14(a1),d7 Message in a7 jsr _LVOReplyMsg(a6) Always reply movea.l a2,a6 cmpi.l #$200,d7 Close window beq exit Main movea.l a3,a6 Calculate next point move.l y(pc),d0 move.l x(pc),d1 jsr _LVOSPSub(a6) move.l #dt,d1 jsr _LVOSPMul(a6) move.l s(pc),d1 jsr _LVOSPMul(a6) move.l x(pc),d1 jsr _LVOSPAdd(a6) move.l d0,x1 ;x1 = x + s*dt*(y-x) move.l #one,d0 move.l #dt,d1 jsr _LVOSPSub(a6) move.l y(pc),d1 jsr _LVOSPMul(a6) move.l d0,d7 move.l r(pc),d0 move.l z(pc),d1 jsr _LVOSPSub(a6) move.l x(pc),d1 jsr _LVOSPMul(a6) move.l #dt,d1 jsr _LVOSPMul(a6) move.l d7,d1 jsr _LVOSPAdd(a6) move.l d0,y1 ;y1 = (1 - dt)*y + dt*x*(r - z) move.l b(pc),d0 move.l #dt,d1 jsr _LVOSPMul(a6) move.l d0,d1 move.l #one,d0 jsr _LVOSPSub(a6) move.l z(pc),d1 jsr _LVOSPMul(a6) move.l d0,d7 move.l #dt,d0 move.l x(pc),d1 jsr _LVOSPMul(a6) move.l y(pc),d1 jsr _LVOSPMul(a6) move.l d7,d1 jsr _LVOSPAdd(a6) ;z1 = (1 - b*dt)*z + dt*x*y move.l d0,z ;z = z1 jsr _LVOSPFix(a6) move.l d0,zi lsr #1,d0 move.l d0,d4 and.l #$f,d4 cmp.l #1,d4 bgt.s cont add.l #14,d4 cont move.l y1(pc),d0 move.l d0,y ;y = y1 move.l #three,d1 jsr _LVOSPMul(a6) jsr _LVOSPFix(a6) NTSC2 add.w #100,d0 move.l d0,yi move.l x1(pc),d0 move.l d0,x ;x = x1 move.l #fif,d1 jsr _LVOSPMul(a6) jsr _LVOSPFix(a6) add.w #300,d0 move.l d0,xi movea.l a4,a6 movea.l a5,a1 move.l d4,d0 jsr _LVOSetAPen(a6) move.l xi(pc),d0 move.l yi(pc),d1 movea.l a5,a1 jsr _LVOMove(a6) move.l xi(pc),d0 move.l yi(pc),d1 movea.l a5,a1 jsr _LVODraw(a6) bra loop exit movea.l a2,a6 close window move.l window(pc),d0 beq.s noWin movea.l d0,a0 jsr _LVOCloseWindow(a6) noWin move.l nws(pc),d0 close screen beq.s noScr movea.l d0,a0 jsr _LVOCloseScreen(a6) noScr movea.l _AbsExecBase,a6 move.l (a7)+,d0 beq.s NoBenh jsr _LVOForbid(a6) reply to WB movea.l d0,a1 jsr _LVOReplyMsg(a6) jsr _LVOPermit(a6) NoBenh move.l a3,d1 close mathffp library beq.s noFfp movea.l d1,a1 jsr _LVOCloseLibrary(a6) noFfp move.l a2,d1 close intuition library beq.s noInt movea.l d1,a1 jsr _LVOCloseLibrary(a6) noInt move.l a4,d1 close graphics library beq.s noGfx movea.l d1,a1 jsr _LVOCloseLibrary(a6) noGfx moveq #0,d0 no error rts ; white blue ColourTable dc.w $0000,$000f,$002d,$004b dc.w $0069,$0087,$00a5,$00c3 ; green dc.w $00f0,$02d0,$04b0,$0690 dc.w $0870,$0a50,$0c30,$0f00 ; red x dc.l $80000044 ;10 y dc.l $c0000043 ;28 z dc.l $d0000045 ;8/3 s dc.l $a0000044 ;8 r dc.l $e0000045 ;6 b dc.l $aaaaab42 ;26 x1 dc.l 0 y1 dc.l 0 xi dc.l 0 yi dc.l 0 zi dc.l 0 FfpName dc.b 'mathffp.library',0 GfxName dc.b 'graphics.library',0 IntName dc.b 'intuition.library',0 even window dc.l 0 title1 dc.b 'Screen',0 cnop 0,2 **** screen definition **** ns dc.w 0,0 dc.w 640,199,4 dc.b 0,1 dc.w $8000 dc.w $f dc.l 0 dc.l title1 dc.l 0 dc.l 0 title2 dc.b 'The Lorenz attractor',0,0 ***** Window definition ***** nw dc.w 0,0 ;Position left,top dc.w 640,199 ;Size width,height dc.b 0,1 ;Colors detail-,block pen dc.l $344 ;IDCMP-Flags dc.l $144f ;Window flags dc.l 0 ;^Gadget dc.l 0 ;^Menu check dc.l title2 ;^Window name nws dc.l 0 ;^Screen structure, dc.l 0 ;^BitMap dc.w 10 ;MinWidth dc.w 10 ;MinHeight dc.w -1 ;MaxWidth dc.w -1,$f ;MaxHeight,Screen type end