SECTION TutDemo,CODE JUMPPTR start ********** relevant blitter registers ********** ;base reg $dff000 BLTDDAT =0 ;result of the last word. used for bob collision detection and ;MFM decoding DMACONR =2 ;bit 14=blitter busy flag BLTCON0 =$40 ;blitter operation setup BLTCON1 =$42 BLTAFWM =$44 BLTALWM =$46 BLTCPTH =$48 ;sources, destination, and size BLTCPTL =$4a BLTBPTH =$4c BLTBPTL =$4e BLTAPTH =$50 BLTAPTL =$52 BLTDPTH =$54 BLTDPTL =$56 BLTSIZE =$58 BLTCON0L=$5a ;ECS/AGA registers BLTSIZV =$5c BLTSIZH =$5e BLTCMOD =$60 ;modulos BLTBMOD =$62 BLTAMOD =$64 BLTDMOD =$66 BLTCDAT =$70 ;data to replace sources BLTBDAT =$72 BLTADAT =$74 DMACON =$96 ;bit 6: enable blitter DMA. bit 10: give blitter priority over ;the CPU. ;; --- screen buffer dimensions --- w =320 h =256 bplsize =w*h/8 ;; --- logo dimensions --- logow =192 logoh =67 logomargin =(320-logow)/2 logobpl =logow/8 logobwid =logobpl*3 start: OSoff: movem.l d1-a6,-(sp) move.l 4.w,a6 ;execbase clr.l d0 move.l #gfxname,a1 jsr -408(a6) ;oldopenlibrary() move.l d0,a1 move.l 38(a1),d4 ;original copper ptr jsr -414(a6) ;closelibrary() move.w #$4c-6,d7 ;start y position moveq #1,d6 ;y add move.w $dff01c,d5 move.w $dff002,d3 move.w #$138,d0 ;wait for EOFrame bsr.w WaitRaster move.w #$7fff,$dff09a ;disable all bits in INTENA move.w #$7fff,$dff09c ;disable all bits in INTREQ move.w #$7fff,$dff09c ;disable all bits in INTREQ move.w #$7fff,$dff096 ;disable all bits in DMACON move.w #$87e0,$dff096 bsr init move.l #copper,$dff080 bsr main OSon: move.w #$7fff,$dff096 or.w #$8200,d3 move.w d3,$dff096 move.l d4,$dff080 or #$c000,d5 move d5,$dff09a movem.l (sp)+,d1-a6 moveq #0,d0 rts ;end of program return to AmigaOS ********** ROUTINES ********** main: movem.l d0-a6,-(sp) ************************** mainloop: move.w #$02a,d0 ;wait for EOFrame bsr.w WaitRaster ;-----frame loop start--- add.b #1,Spr+1 add d6,d7 ;add "1" to y position cmp #$4c+logoh+1,d7 ;bottom check blo.b ok1 neg d6 ;change direction ok1: cmp.b #$4c-6,d7 ;top check bhi.b ok2 neg d6 ;change direction ok2: move.l #waitras1,a0 move d7,d0 moveq #6-1,d1 .l: move.b d0,(a0) add.w #1,d0 add.w #8,a0 DBF d1,.l bsr scrollit ;-----frame loop end--- btst #6,$bfe001 bne.b mainloop ************************** movem.l (sp)+,d0-a6 rts scrollit: ;; --- scroll! --- bltx =48 blty =30 bltoffs =30*(w/8)+bltx/8 blth =50 bltw =224/16 bltskip =(320-224)/8 brcorner =(blth-1)*(w/8)+bltw*2-2 movem.l d0-a6,-(sp) lea $dff000,a6 move.w #$8440,DMACON(a6) ;enable blitter DMA bsr BlitWait move.l #$19f00002,BLTCON0(a6) move.l #$ffffffff,BLTAFWM(a6) move.l #Screen+bltoffs+brcorner,BLTAPTH(a6) move.l #Screen+bltoffs+brcorner,BLTDPTH(a6) move.w #bltskip,BLTAMOD(a6) move.w #bltskip,BLTDMOD(a6) move.w #blth*64+bltw,BLTSIZE(a6) movem.l (sp)+,d0-a6 rts init: movem.l d0-a6,-(sp) moveq #0,d1 lea Screen,a1 move.w #bplsize/2-1,d0 .l: move.w d1,(a1)+ addq.w #1,d1 dbf d0,.l lea Logo,a0 ;ptr to first bitplane of logo lea CopBplP,a1 ;where to poke the bitplane pointer words. move #3-1,d0 .bpll: move.l a0,d1 swap d1 move.w d1,2(a1) ;hi word swap d1 move.w d1,6(a1) ;lo word addq #8,a1 ;point to next bpl to poke in copper lea LogoBpl(a0),a0 dbf d0,.bpll lea ScrBplP,a1 lea Screen,a0 move.l a0,d1 swap d1 move.w d1,2(a1) swap d1 move.w d1,6(a1) lea SprP,a1 lea Spr,a0 move.l a0,d1 swap d1 move.w d1,2(a1) swap d1 move.w d1,6(a1) lea NullSpr,a0 move.l a0,d1 moveq #7-1,d0 .sprpl: addq.w #8,a1 swap d1 move.w d1,2(a1) swap d1 move.w d1,6(a1) DBF d0,.sprpl movem.l (sp)+,d0-a6 rts BlitWait: tst DMACONR(a6) ;for compatibility .waitblit: btst #6,DMACONR(a6) bne.s .waitblit rts WaitRaster: ;wait for rasterline d0.w. Modifies d0-d2/a0. move.l #$1ff00,d2 lsl.l #8,d0 and.l d2,d0 lea $dff004,a0 .wr: move.l (a0),d1 and.l d2,d1 cmp.l d1,d0 bne.s .wr rts ********** DATA ********** gfxname: dc.b "graphics.library",0 SECTION TutData,DATA_C Spr: dc.w $ec40,$fc00 ;Vstart.b,Hstart/2.b,Vstop.b,%A0000SEH dc.w %0000011111000000,%0000000000000000 dc.w %0001111111110000,%0000000000000000 dc.w %0011111111111000,%0000000000000000 dc.w %0111111111111100,%0000000000000000 dc.w %0110011111001100,%0001100000110000 dc.w %1110011111001110,%0001100000110000 dc.w %1111111111111110,%0000000000000000 dc.w %1111111111111110,%0000000000000000 dc.w %1111111111111110,%0010000000001000 dc.w %1111111111111110,%0001100000110000 dc.w %0111111111111100,%0000011111000000 dc.w %0111111111111100,%0000000000000000 dc.w %0011111111111000,%0000000000000000 dc.w %0001111111110000,%0000000000000000 dc.w %0000011111000000,%0000000000000000 dc.w %0000000000000000,%0000000000000000 dc.w 0,0 NullSpr: dc.w $2a20,$2b00 dc.w 0,0 dc.w 0,0 Copper: dc.w $1fc,0 ;slow fetch mode, AGA compatibility dc.w $100,$0200 dc.b 0,$8e,$4c,$81 dc.b 0,$90,$2c,$c1 dc.w $92,$38+logomargin/2 dc.w $94,$d0-logomargin/2 dc.w $108,logobwid-logobpl dc.w $10a,logobwid-logobpl dc.w $102,0 dc.w $1a2,$cc5 dc.w $1a4,0 dc.w $1a6,$752 SprP: dc.w $120,0 dc.w $122,0 dc.w $124,0 dc.w $126,0 dc.w $128,0 dc.w $12a,0 dc.w $12c,0 dc.w $12e,0 dc.w $130,0 dc.w $132,0 dc.w $134,0 dc.w $136,0 dc.w $138,0 dc.w $13a,0 dc.w $13c,0 dc.w $13e,0 CopBplP: dc.w $e0,0 dc.w $e2,0 dc.w $e4,0 dc.w $e6,0 dc.w $e8,0 dc.w $ea,0 dc.w $180,$349 dc.w $2b07,$fffe dc.w $180,$56c dc.w $2c07,$fffe LogoPal: dc.w $0180,$0667,$0182,$0ddd,$0184,$0833,$0186,$0334 dc.w $0188,$0a88,$018a,$099a,$018c,$0556,$018e,$0633 dc.w $100,$3200 waitras1: dc.w $8007,$fffe dc.w $180,$055 waitras2: dc.w $8103,$fffe dc.w $180,$0aa waitras3: dc.w $8207,$fffe dc.w $180,$0ff waitras4: dc.w $8307,$fffe dc.w $180,$0aa waitras5: dc.w $8407,$fffe dc.w $180,$055 waitras6: dc.w $8507,$fffe dc.w $180,$667 dc.w $9507,$fffe ScrBplP: dc.w $e0,0 dc.w $e2,0 dc.w $108,0 dc.w $10a,0 dc.w $92,$38 dc.w $94,$d0 dc.w $100,$1200 dc.w $ffdf,$fffe dc.w $2c07,$fffe dc.w $180,$56c dc.w $2d07,$fffe dc.w $180,$349 dc.w $ffff,$fffe Logo: INCBIN "sky.178x67x3.raw" LogoE: dcb.b logobwid*6,0 SECTION TutBSS,BSS_C Screen: ds.b bplsize END Bit Channel 1001 ABCD -> D 0 000 0 1 001 0 2 010 0 3 011 0 4 100 1 5 101 1 6 110 1 7 111 1 %11110000 =$f0