************************************************************************ * * * These are simply Lissajous figures which you can create using an * * oscilloscope and two frequency generators. * * The definition is: * * x(t)=sin(u*t) * * y(t)=sin(v*t+p) * * * * u is the angular frequency in the x direction * * v is the angular frequency in the y direction * * p is the phase difference between x and y * * * * This implementation was written by: * * E. Lenz * * Johann-Fichte-Strasse 11 * * 8 Munich 40 * * Germany * * * ************************************************************************ XREF GetReal,RealOut,request _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 ****** _LVOCloseWindow equ -$48 _LVOOpenWindow equ -$cc _LVOSetMenuStrip equ -$108 ***** graphics ****** _LVOMove equ -$f0 _LVODraw equ -$f6 _LVORectFill equ -$132 _LVOSetAPen equ -$156 *** mathffp *** _LVOSPFix equ -$1e _LVOSPAdd equ -$42 _LVOSPMul equ -$4e *** mathtrans *** _LVOSPSin equ -$24 wd_RPort equ $32 wd_UserPort equ $56 pr_MsgPort equ $5c pr_CLI equ $ac ThisTask equ $114 VBlankFrequency equ $212 hund3 equ $96000049 300 hund equ $b4000047 90 hund1 equ $f0000047 120 dt equ $a3d70b3a 0.01 movea.l _AbsExecBase,a6 test if WB or CLI movea.l ThisTask(a6),a0 tst.l pr_CLI(a0) bne.s isCLI lea pr_MsgPort(a0),a0 for WB get WB Message jsr _LVOWaitPort(a6) jsr _LVOGetMsg(a6) move.l d0,WBenchMsg isCLI cmpi.b #60,VBlankFrequency(a6) test if PAL or NTSC beq.s isNTSC move.w #256,nw+6 move.l #hund1,NTSC+2 isNTSC lea GfxName(pc),a1 open graphics library moveq #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,GfxBase beq.s Gexit lea IntName(pc),a1 open intuition library moveq #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,IntBase beq.s Gexit lea MathName(pc),a1 open mathffp library moveq #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,MathBase beq.s Gexit lea MtransName(pc),a1 open mathtrans library moveq #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,MtransBase bne.s Trok lea MtransName(pc),a0 first line movem.l a4-a5,-(a7) lea notfnd(pc),a1 second line suba.l a2,a2 no third line lea hdtxt(pc),a3 header lea OkTxt(pc),a4 gadget text suba.l a5,a5 no 2nd gadget moveq #0,d0 moveq #1,d1 jsr request movem.l (a7)+,a4-a5 Gexit bra exit Trok lea nw(pc),a0 open window movea.l IntBase(pc),a6 jsr _LVOOpenWindow(a6) move.l d0,window beq.s Gexit ; Set menu movea.l d0,a0 which window lea Menu1(pc),a1 which menu jsr _LVOSetMenuStrip(a6) movea.l window(pc),a0 movea.l wd_RPort(a0),a5 redraw movea.l GfxBase(pc),a6 clear screen moveq #0,d0 movea.l a5,a1 jsr _LVOSetAPen(a6) movea.l a5,a1 moveq #0,d0 moveq #0,d1 move.l #640,d2 move.l #250,d3 jsr _LVORectFill(a6) movea.l a5,a1 moveq #3,d0 jsr _LVOSetAPen(a6) clr.l t draw bsr print wait bsr trycls beq.s draw cmpi.l #$200,d7 beq.s exit cmpi.l #$100,d7 bne.s wait ; Choice from menu movea.l window(pc),a0 movea.l $5e(a0),a0 Load Window.MessageKey move.w $18(a0),d0 Load message code move.w d0,d1 andi.w #$f,d1 bne.s draw andi.w #$f0,d0 Menu 1 bne.s menu12 Submenu 1 bsr xfreq sedraw bra.s redraw menu12 cmpi.w #$20,d0 Submenu 2 bne.s menu13 bsr yfreq bra.s redraw menu13 cmpi.w #$40,d0 Submenu 3 bne.s draw bsr phase bra.s sedraw exit movea.l IntBase(pc),a6 move.l window(pc),d0 beq.s noWin movea.l d0,a0 jsr _LVOCloseWindow(a6) close window noWin movea.l _AbsExecBase,a6 tst.l WBenchMsg beq.s NoBenh jsr _LVOForbid(a6) reply to WB movea.l WBenchMsg(pc),a1 jsr _LVOReplyMsg(a6) jsr _LVOPermit(a6) NoBenh move.l MtransBase(pc),d1 close mathtrans library beq.s noMtr movea.l d1,a1 jsr _LVOCloseLibrary(a6) noMtr move.l MathBase(pc),d1 close mathffp library beq.s noMath movea.l d1,a1 jsr _LVOCloseLibrary(a6) noMath move.l IntBase(pc),d1 close intuition library beq.s noInt movea.l d1,a1 jsr _LVOCloseLibrary(a6) noInt move.l GfxBase(pc),d1 close graphics library beq.s noGfx movea.l d1,a1 jsr _LVOCloseLibrary(a6) noGfx moveq #0,d0 no error rts trycls movem.l d0-d6/a0-a6,-(a7) movea.l _AbsExecBase,a6 moveq #0,d7 movea.l window(pc),a0 movea.l wd_UserPort(a0),a0 load Window.UserPort jsr _LVOGetMsg(a6) tst.l d0 beq.s noMsg1 No message movea.l d0,a1 move.l $14(a1),d7 Message in d7 noMsg1 movem.l (a7)+,d0-d6/a0-a6 noMsg tst.l d7 rts print movea.l MathBase(pc),a6 movea.l MtransBase(pc),a4 move.l t(pc),d0 move.l #dt,d1 jsr _LVOSPAdd(a6) move.l d0,t move.l d0,d1 move.l u(pc),d0 jsr _LVOSPMul(a6) exg a4,a6 jsr _LVOSPSin(a6) exg a4,a6 move.l #hund3,d1 jsr _LVOSPMul(a6) move.l #hund3,d1 jsr _LVOSPAdd(a6) jsr _LVOSPFix(a6) move.l d0,d7 move.l v(pc),d0 move.l t(pc),d1 jsr _LVOSPMul(a6) move.l p(pc),d1 jsr _LVOSPAdd(a6) exg a4,a6 jsr _LVOSPSin(a6) exg a4,a6 NTSC move.l #hund,d5 move.l d5,d1 jsr _LVOSPMul(a6) move.l d5,d1 jsr _LVOSPAdd(a6) jsr _LVOSPFix(a6) move.l d0,d6 move.l d0,d1 move.l d7,d0 movea.l GfxBase(pc),a6 movea.l a5,a1 jsr _LVOMove(a6) move.l d6,d1 move.l d7,d0 movea.l a5,a1 jsr _LVODraw(a6) rts xfreq bsr.s uout lea item11txt(pc),a0 lea tu(pc),a1 lea uval(pc),a2 jsr GetReal tst.l d1 bne.s nogo move.l d0,u rts yfreq bsr.s vout lea item12txt(pc),a0 lea tv(pc),a1 lea vval(pc),a2 jsr GetReal tst.l d1 bne.s nogo move.l d0,v nogo rts phase bsr.s pout lea item13txt(pc),a0 lea tp(pc),a1 lea pval(pc),a2 jsr GetReal tst.l d1 bne.s nogo move.l d0,p rts uout lea uval(pc),a0 move.l u(pc),d0 bra.s outout vout lea vval(pc),a0 move.l v(pc),d0 bra.s outout pout lea pval(pc),a0 move.l p(pc),d0 outout moveq #2,d1 moveq #9,d2 movea.l a0,a1 remove move.b #' ',(a1)+ dbra d2,remove jsr RealOut moveq #0,d0 moveq #1,d1 rts tu dc.b 'X freq =' uval dc.b ' ',$a tv dc.b 'Y freq =' vval dc.b ' ',$a tp dc.b 'P phase=' pval dc.b ' ',$a u dc.l $80000041 1 v dc.l $86666642 2.1 t dc.l 0 p dc.l 0 WBenchMsg dc.l 0 MtransBase dc.l 0 MathBase dc.l 0 GfxBase dc.l 0 IntBase dc.l 0 window dc.l 0 ; requester texts notfnd dc.b ' not found',0 hdtxt dc.b ' Lissajous Request',0 OkTxt dc.b ' OK',0 even MtransName dc.b 'mathtrans.library',0 MathName dc.b 'mathffp.library',0 GfxName dc.b 'graphics.library',0 IntName dc.b 'intuition.library',0 even title dc.b 'Lissajous figures',0 even ***** 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 $340 IDCMP-Flags dc.l $140f Window flags dc.l 0 ^Gadget dc.l 0 ^Menu check dc.l title ^Window name nws dc.l 0 ^Screen structure, dc.l 0 ^BitMap dc.w 100 MinWidth dc.w 40 MinHeight dc.w -1 MaxWidth dc.w -1,1 MaxHeight,Screen type **** menu definition **** Menu1 dc.l 0 Next menu dc.w 50,0 Position left edge,top edge dc.w 100,20 Dimensions width,height dc.w 1 Menu enabled dc.l mtext1 Text for menu header dc.l item11 ^First in chain dc.l 0,0 Internal mtext1 dc.b 'parameters',0 even item11 dc.l item12 next in chained list dc.w 0,0 Position left edge,top edge dc.w 170,10 Dimensions width,height dc.w $52 itemtext+highcomp+itemenabled dc.l 0 Mutual exclude dc.l I11txt Pointer to intuition text dc.l 0 dc.b 0,0 dc.l 0 dc.w 0 I11txt dc.b 0 Front pen (blue) dc.b 1 Back pen (white) dc.b 0,0 Draw mode dc.w 0 Left edge dc.w 0 Top edge dc.l 0 Text font dc.l item11txt Pointer to text dc.l 0 Next text item11txt dc.b 'u angular frequency x',0 even item12 dc.l item13 next in chained list dc.w 0,10 Position left edge,top edge dc.w 170,10 Dimensions width,height dc.w $52 itemtext+highcomp+itemenabled dc.l 0 Mutual exclude dc.l I12txt Pointer to intuition text dc.l 0 dc.b 0,0 dc.l 0 dc.w 0 I12txt dc.b 0 Front pen (blue) dc.b 1 Back pen (white) dc.b 0,0 Draw mode dc.w 0 Left edge dc.w 0 Top edge dc.l 0 Text font dc.l item12txt Pointer to text dc.l 0 Next text item12txt dc.b 'v angular frequency y',0 even item13 dc.l 0 next in chained list dc.w 0,20 Position left edge,top edge dc.w 170,10 Dimensions width,height dc.w $52 itemtext+highcomp+itemenabled dc.l 0 Mutual exclude dc.l I13txt Pointer to intuition text dc.l 0 dc.b 0,0 dc.l 0 dc.w 0 I13txt dc.b 0 Front pen (blue) dc.b 1 Back pen (white) dc.b 0,0 Draw mode dc.w 0 Left edge dc.w 0 Top edge dc.l 0 Text font dc.l item13txt Pointer to text dc.l 0 Next text item13txt dc.b 'p phase difference',0 even end