************************************************************************ * * * These are prime number maps * * * * This implementation was written by: * * E. Lenz * * Johann-Fichte-Strasse 11 * * 8 Munich 40 * * Germany * * * ************************************************************************ ; d0 Number counter ; d1 ; d2 flag if prime ; d3 colour counter ; d4 x coordinate ; d5 y coordinate ; d6 pointer to buffer ; d7 menu stuff ; a0 ; a1 ; a2 ; a3 GfxBase ; a4 pointer to buffer ; a5 rast port _AbsExecBase equ 4 **** exec ***** _LVOForbid equ -$84 _LVOPermit equ -$8a _LVOAllocMem equ -$c6 _LVOFreeMem equ -$d2 _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 _LVOSetMenuStrip equ -$108 ***** graphics ****** _LVOText equ -$3c _LVOLoadRGB4 equ -$c0 _LVOMove equ -$f0 _LVODraw equ -$f6 _LVORectFill equ -$132 _LVOSetAPen equ -$156 _LVOScrollRaster equ -$18c wd_Width equ 8 wd_Height equ $a sc_ViewPort equ $2c wd_RPort equ $32 wd_UserPort equ $56 pr_MsgPort equ $5c pr_CLI equ $ac ThisTask equ $114 VBlankFrequency equ $212 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.w #256,ns+6 isNTSC move.l #$6700,d0 allocate buffer move.l #$30000,d1 largest + clear jsr _LVOAllocMem(a6) move.l d0,d6 beq.s Gexit lea GfxName(pc),a1 open graphics library moveq #0,d0 jsr _LVOOpenLibrary(a6) movea.l d0,a3 tst.l d0 beq.s Gexit lea IntName(pc),a1 open intuition library moveq #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,IntBase Gexit beq exit lea ns(pc),a0 open screen movea.l d0,a6 jsr _LVOOpenScreen(a6) move.l d0,screen beq.s Gexit move.l d0,nws move.l d0,d2 lea nw(pc),a0 open window 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 movea.l d2,a0 lea sc_ViewPort(a0),a0 lea ColourTable(pc),a1 moveq #16,d0 movea.l a3,a6 jsr _LVOLoadRGB4(a6) ** start off with the prime number 3 *** rest movea.l d6,a4 moveq #3,d0 move.l d0,(a4)+ moveq #1,d2 redraw movem.l d0/d2,-(a7) movea.l a3,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 #1,d0 jsr _LVOSetAPen(a6) moveq #0,d4 set x position to 0 moveq #0,d5 moveq #0,d3 clr.w fin draw tst.w fin bne.s wait movem.l (a7)+,d0/d2 bsr func movem.l d0/d2,-(a7) tst.l d0 beq.s exit1 wait bsr trycls beq.s draw cmpi.l #$200,d7 beq.s exit1 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 ismen2 andi.w #$f0,d0 Menu 1 bne.s menu12 Submenu 1 move.w #ShowPr-addr,addr Gdraw movem.l (a7)+,d0/d2 bra rest menu12 cmpi.w #$20,d0 Submenu 2 bne.s menu13 move.w #print-addr,addr bra.s Gdraw menu13 cmpi.w #$40,d0 Submenu 2 bne.s wait move.w #diff-addr,addr bra.s Gdraw ismen2 cmpi.w #1,d1 bne.s wait andi.w #$f0,d0 Menu 2 bne.s wait movem.l (a7)+,d0/d2 bra redraw exit1 movem.l (a7)+,d0/d2 exit movea.l IntBase(pc),a6 move.l window(pc),d0 beq.s noWin movea.l d0,a0 jsr _LVOCloseWindow(a6) close window noWin move.l screen(pc),d0 close screen beq.s noScr movea.l d0,a0 jsr _LVOCloseScreen(a6) noScr movea.l _AbsExecBase,a6 tst.l WBenchMsg beq.s free jsr _LVOForbid(a6) reply to WB movea.l WBenchMsg(pc),a1 jsr _LVOReplyMsg(a6) jsr _LVOPermit(a6) free tst.l d6 free buffer beq.s NoBenh movea.l d6,a1 move.l #$6700,d0 jsr _LVOFreeMem(a6) NoBenh move.l IntBase(pc),d1 close intuition library beq.s noInt movea.l d1,a1 jsr _LVOCloseLibrary(a6) noInt move.l a3,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 ******************************************** * * * Write number in d0 as decimal to console * * * ******************************************** ShowPr movem.l d0-d3/a0-a1,-(a7) move.l d0,-(a7) movea.l a3,a6 addq.l #8,d5 move.l d5,d0 addq.l #8,d0 movea.l window(pc),a0 cmp.w wd_Height(a0),d0 bcs.s isok subq.l #8,d5 move.l d5,-(a7) movea.l a5,a1 moveq #0,d0 moveq #8,d1 moveq #0,d2 moveq #0,d3 moveq #60,d4 move.w wd_Height(a0),d5 jsr _LVOScrollRaster(a6) move.l (a7)+,d5 isok moveq #0,d0 move.l d5,d1 movea.l a5,a1 jsr _LVOMove(a6) move.l (a7)+,d0 lea Prime(pc),a1 movea.l a1,a0 move.l #'0000',d1 move.l d1,(a1)+ move.l d1,(a1)+ move.l d1,(a1)+ lea Num(pc),a1 plop move.l (a1)+,d1 addq.l #1,a0 pnext cmp.l d1,d0 bcs.s plop sub.l d1,d0 addq.b #1,(a0) tst.l d0 bne.s pnext lea Prime(pc),a0 moveq #11,d0 ptest cmpi.b #'0',(a0) bne.s endp subq.l #1,d0 addq.l #1,a0 bra.s ptest endp movea.l a5,a1 jsr _LVOText(a6) movem.l (a7)+,d0-d3/a0-a1 next bsr.s NextPr tst.l d2 beq.s next rts ******************************** * * advance one graphic point * ******************************** advan move.l d0,-(a7) movea.l a3,a6 move.l d4,d0 move.l d5,d1 movea.l a5,a1 jsr _LVOMove(a6) move.l d3,d0 movea.l a5,a1 jsr _LVOSetAPen(a6) move.l d4,d0 move.l d5,d1 movea.l a5,a1 jsr _LVODraw(a6) addq.l #1,d4 move.l d4,d0 addi.w #20,d0 move.l window(pc),a0 cmp.w wd_Width(a0),d0 bne.s nolin moveq #0,d4 addq.l #1,d5 cmp.w wd_Height(a0),d5 bne.s nolin move.w #1,fin nolin move.l (a7)+,d0 rts ********************************** * * * print map of prime differences * * * ********************************** diff bsr.s advan moveq #0,d3 knot bsr.s NextPr tst.l d2 bne.s found addq.l #1,d3 bra.s knot found rts *********************** * * * print map of primes * * * *********************** print moveq #3,d3 tst.l d2 bne.s isPrim moveq #0,d3 isPrim bsr.s advan ****************************************** * * * Calculate next prime number * * * ****************************************** NextPr move.l d6,a0 addq.l #2,d0 bcs.s eprim nlop move.l (a0)+,d2 beq.s isPr move.l d2,d1 mulu d2,d1 cmp.l d1,d0 bcs.s isPr bsr.s mod tst.l d2 beq.s nosave no prime - try next number bra.s nlop try next divisor isPr move.l d0,d1 swap d1 tst.w d1 bne.s nosave move.l d0,(a4)+ nosave rts eprim moveq #0,d0 rts ************************** * * * return d0 mod d2 in d2 * * * ************************** mod move.l d0,-(a7) lea pow(pc),a1 moveq #9,d1 mlop move.l d2,(a1)+ add.l d2,d2 dbra d1,mlop mnext move.l -(a1),d1 beq.s mend mwhat cmp.l d1,d0 bcs.s mnext sub.l d1,d0 beq.s mend bra.s mwhat mend move.l d0,d2 move.l (a7)+,d0 rts func dc.w $6000 addr dc.w print-* fin ds.w 1 WBenchMsg dc.l 0 DosBase dc.l 0 IntBase dc.l 0 window dc.l 0 screen dc.l 0 ColourTable dc.w $15a,$fff,$000,$e83 dc.w $069,$087,$0a5,$0c3 dc.w $0f0,$2d0,$4b0,$690 dc.w $870,$a50,$c30,$f00 Num dc.l 1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1 Prime ds.b 12 dc.l 0 pow ds.l 1 DosName dc.b 'dos.library',0 GfxName dc.b 'graphics.library',0 IntName dc.b 'intuition.library',0 even title1 dc.b 'Screen',0 even **** 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 title dc.b 'Prime evil & all that jazz',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 $344 ;IDCMP-Flags dc.l $144f ;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 10 ;MinWidth dc.w 10 ;MinHeight dc.w -1 ;MaxWidth dc.w -1,$f ;MaxHeight,Screen type **** menu definition **** Menu1 dc.l Menu2 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 'mode',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 $53 itemtext+highcomp+itemenabled+checkit dc.l $e 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 ' Numbers',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 $153 itemtext+highcomp+itemenabled+checkit+checked dc.l $d 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 ' Map',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 $53 itemtext+highcomp+itemenabled+checkit dc.l $b 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 ' Differences',0 even ***** 2nd menu definition ***** Menu2 dc.l 0 Next menu dc.w 150,0 Position left edge,top edge dc.w 120,20 Dimensions width,height dc.w 1 Menu enabled dc.l mtext2 Text for menu header dc.l item21 ^First in chain dc.l 0,0 Internal mtext2 dc.b 'redraw',0 even item21 dc.l 0 next in chained list dc.w 0,0 Position left edge,top edge dc.w 120,10 Dimensions width,height dc.w $52 itemtext+highcomp+itemenabled dc.l 0 Mutual exclude dc.l I21txt Pointer to intuition text dc.l 0 dc.b 0,0 dc.l 0 dc.w 0 I21txt 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 item21txt Pointer to text dc.l 0 Next text item21txt dc.b 'next page',0 even end