* ------------------- * * - ChaosLand/VD - * * - Blitter Tornado - * * ------------------- * ;General registers dmaconr = $2 vposr = $4 vhposr = $6 dskdatr = $8 joy0dat = $A joy1dat = $C clxdat = $E potinp = $16 dskbytr = $1A intenar = $1C intreqr = $1E dskpth = $20 dskptl = $22 dsklen = $24 dskdat = $26 copcon = $2E joytest = $36 dsksync = $7E adkcon = $9E ;blitter bltcon0 = $40 bltcon1 = $42 bltafwm = $44 bltalwm = $46 bltcpth = $48 bltcptl = $4A bltbpth = $4C bltbptl = $4E bltapth = $50 bltaptl = $52 bltdpth = $54 bltdptl = $56 bltsize = $58 bltcmod = $60 bltbmod = $62 bltamod = $64 bltdmod = $66 bltcdat = $70 bltbdat = $72 bltadat = $74 ;Copper registers cop1lc = $80 cop1lch = $80 cop1lcl = $82 cop2lc = $84 cop2lch = $84 cop2lcl = $86 copjmp1 = $88 copjmp2 = $8A diwstrt = $8E diwstop = $90 ddfstrt = $92 ddfstop = $94 dmacon = $96 clxcon = $98 intena = $9A intreq = $9C bpl1pth = $E0 bpl1ptl = $E2 bpl2pth = $E4 bpl2ptl = $E6 bpl3pth = $E8 bpl3ptl = $EA bpl4pth = $EC bpl4ptl = $EE bpl5pth = $F0 bpl5ptl = $F2 bpl6pth = $F4 bpl6ptl = $F6 bplcon0 = $100 bplcon1 = $102 bplcon2 = $104 bpl1mod = $108 bpl2mod = $10A spr0pth = $120 spr0ptl = $122 spr1pth = $124 spr1ptl = $126 spr2pth = $128 spr2ptl = $12A spr3pth = $12C spr3ptl = $12E spr4pth = $130 spr4ptl = $132 spr5pth = $134 spr5ptl = $136 spr6pth = $138 spr6ptl = $13A spr7pth = $13C spr7ptl = $13E spr0pos = $140 spr0ctl = $142 spr0data = $144 spr0datb = $146 spr1pos = $148 spr1ctl = $14A spr1data = $14C spr1datb = $14E spr2pos = $150 spr2ctl = $152 spr2data = $154 spr2datb = $156 spr3pos = $158 spr3ctl = $15A spr3data = $15C spr3datb = $15E spr4pos = $160 spr4ctl = $162 spr4data = $164 spr4datb = $166 spr5pos = $168 spr5ctl = $16A spr5data = $16C spr5datb = $16E spr6pos = $170 spr6ctl = $172 spr6data = $174 spr6datb = $176 spr7pos = $178 spr7ctl = $17A spr7data = $17C spr7datb = $17E * ------------------------------------ TabShift dmacon D_init=$8200 D_priB=$400 D_Btpl=$100 D_Copp=$80 D_Blit=$40 D_sprt=$20 D_disk=$10 D_CON=D_init|D_copp|D_Btpl|D_Blit|D_priB * ----------------------------------- TabShift execlib OpenLib equ -552 CloseLib equ -414 Forbid equ -132 Permit equ -138 Supervisor equ -30 * ----------------------------------- TabShift gfxlib LoadView equ -222 WaitBlit equ -228 WaitTOF equ -270 OwnBlit equ -456 DisownBlit equ -462 Width=48 Height=288 Depth=2 modulo=Width+(52-Width) bplsize=Width*Depth screensize=Width*Height*Depth nbscreen=2 Wpattern=32/8 Hpattern=32 Custom equ $DFF000 rsreset PtScreen1 rs.l 1 ; -> Screen1 PtScreen2 rs.l 1 ; -> Screen2 ptTornadoData rs.l 1 counter rs.w 1 delaypattern rs.w 1 ptvalueshift rs.w 1 maxdelaypattern rs.w 1 ; =10 shift1 rs.b 1 shift2 rs.b 1 VarSize rs.w 0 waitvb macro .waitvb\@: cmpi.b #\1,6(a6) bne.s .waitvb\@ tst.b 5(a6) beq.s .waitvb\@ endm waitvb2 macro .waitvb\@: cmpi.b #\1,6(a6) bne.s .waitvb\@ endm section routine,code ; ---------------------------------------------- start movem.l d0-d7/a0-a6,-(sp) movea.l 4.w,a6 lea GfxName(pc),a1 moveq #0,d0 jsr OpenLib(a6) tst.l d0 beq NoGfx lea GfxBase(pc),a0 move.l d0,(a0) move.l d0,a6 lea OldView(pc),a0 move.l $22(a6),(a0) suba.l a1,a1 jsr LoadView(a6) jsr WaitTOF(a6) jsr WaitTOF(a6) jsr WaitBlit(a6) movea.l 4.w,a6 jsr Forbid(a6) bsr GetVBR bsr Init jmp exit BlitterTornado: lea Vars(pc),a5 lea Custom,a6 ; clear screen lea Screen,a0 moveq #0,d0 move.w #nbscreen*screensize-1,d7 _clear: move.l d0,(a0)+ move.l d0,(a0)+ move.l d0,(a0)+ move.l d0,(a0)+ dbf d7,_clear ; moveq #-1,d0 bsr waitblitter move.l d0,bltAfwm(a6) move.w #Width-6,bltAmod(a6) move.w #Width-6,bltDmod(a6) waitvb $35 ; start copper lea copperlist,a0 move.l a0,cop1lc(a6) move.w d0,copjmp1(a6) ; start copper bra.s cont ; -------- mainloop: waitvb $37 tst.w counter(a5) bne.s skip moveq #0,d7 loopwait: waitvb2 $f0 waitvb2 $f1 dbf d7,loopwait skip: move.w #1,counter(a5) ; -- cont: bsr shiftscreen bsr computeshift bsr Tornado addq.w #1,delaypattern(a5) addq.w #1,ptvalueshift(a5) ; delay before set colors cmpi.w #2,ptvalueshift(a5) blt.s .notyet ; 10 ; change colors move.w #$F00,color1 ; red move.w #$523,color2 move.w #$423,color3 .notyet: move.w maxdelaypattern(a5),d7 ; 10 delay before put new pattern cmp.w delaypattern(a5),d7 bgt.s flipscreen ; put new pattern 10x before screen swap movea.l PtScreen1(a5),a0 ; bltBpt bsr PutPattern tst.w d7 ; last pattern ? bne.s EndTornado ; the end move.l #0,delaypattern(a5) move.w #0,bplcon1(a6) ; reset bplshift ; --- double buffering flipscreen: move.l PtScreen1(a5),d0 move.l PtScreen2(a5),PtScreen1(a5) move.l d0,PtScreen2(a5) btst #6,$bfe001 ; Left Mouse Button to quit beq EndTornado bra mainloop ; -------- EndTornado: move.w #$200,bplcon0cop EXIT: lea $dff000,a6 bsr Restore movea.l 4.w,a6 jsr Permit(a6) movea.l GfxBase(pc),a6 movea.l OldView(pc),a1 jsr LoadView(a6) move.l $26(a6),$dff080 movea.l a6,a1 movea.l 4.w,a6 jsr CloseLib(a6) NoGfx movem.l (sp)+,d0-d7/a0-a6 moveq #0,d0 rts ; End of function BlitterTornado ; -------------------------------------------- waitblitter btst #6,$dff002 .wait btst #6,$dff002 bne.s .wait rts PutPattern: moveq #0,d6 move.b shift1(a5),d6 move.l d6,d7 asr.w #3,d6 ; /8 muls.w #Width*Depth,d7 ; 48*2 add.l d7,d6 addq.l #2,d6 moveq #15,d7 and.b shift1(a5),d7 ; max 16 values ror.l #4,d7 addi.l #$DFC0000,d7 ; bltcon0/1 adda.l d6,a0 adda.l #Width*Depth*128+Width+Width/2-Wpattern/2,a0 ; middle of screen movea.l a0,a2 ; bltDpt A=D lea TornadoData(pc),a3 adda.l ptTornadoData(a5),a3 addq.l #2*4,ptTornadoData(a5) tst.l (a3) ; last pattern ? bge.s notyetend ; bltApt moveq #1,d7 ; the end rts ; --- notyetend: movea.l (a3)+,a1 ; pattern -> bltApt move.l (a3)+,d6 move.w d6,maxdelaypattern(a5) bsr waitblitter move.l d7,bltcon0(a6) ; bltcon0/1 move.l #$ffff0000,bltAfwm(a6) move.w #Width*2-6,bltBmod(a6) move.w #Wpattern-6,bltAmod(a6) ; pattern 32x32=4x32 move.w #Width*2-6,bltDmod(a6) ; screen+width*(height+1)+20 movem.l a0-a2,bltBpth(a6) ; a0=bltBpt / a1=bltApt / a2=bltDpt move.w #Hpattern*64+6/2,bltsize(a6) tst.l (a3) bge.s .notyet lea TornadoData(pc),a3 .notyet: cmpa.l (a3),a1 ; same pattern ? bne.s .end ; no movea.l (a3)+,a1 ; pattern -> bltApt move.l (a3)+,d6 lea Width(a0),a0 ; next plane lea Width(a2),a2 bsr waitblitter move.l d7,bltcon0(a6) move.l #$ffff0000,bltAfwm(a6) move.w #Width*2-6,bltBmod(a6) move.w #Wpattern-6,bltAmod(a6) move.w #Width*2-6,bltDmod(a6) movem.l a0-a2,bltBpth(a6) move.w #Hpattern*64+6/2,bltsize(a6) .end bsr waitblitter move.l #-1,bltAfwm(a6) moveq #0,d7 rts ; End of function putnewpattern ; --------------------------------------- TornadoData: dc.l pattern1,30 ; 1 plane dc.l pattern1,30 dc.l pattern2,32 dc.l pattern2,32 dc.l pattern3,20 dc.l pattern3,20 dc.l pattern3,20 dc.l pattern3,20 dc.l pattern4_1,20 dc.l pattern4_1,20 dc.l pattern4_1,20 dc.l pattern4_1,20 dc.l pattern4_2,24 dc.l pattern4_2,24 dc.l pattern5,26 dc.l pattern5,26 dc.l pattern5,26 dc.l pattern5,26 dc.l pattern5,26 dc.l pattern6,64 dc.l pattern6,64 dc.l pattern7,90 dc.l $FFFFFFFF ; -------------------- computeshift: move.b shift1(a5),shift2(a5) moveq #31,d0 and.w ptvalueshift(a5),d0 ; 32 values max move.b valueshift(pc,d0.w),shift1(a5) rts ; End of function shiftbitplan ; ------------------------------ valueshift: dc.b 0,16,8,24,4,20,12,28,2,18,10,26 dc.b 6,22,14,30,1,17,9,25,5,21,13,29 dc.b 3,19,11,27,7,23,15,31 ; ------------------------------ shiftscreen: moveq #0,d0 move.b shift1(a5),d0 move.l d0,d1 asr.w #3,d0 ; /8 x pos muls.w #bplsize,d1 ; y pos add.w d1,d0 addi.w #14*bplsize+2,d0 ; +14 lines add.l PtScreen2(a5),d0 lea bplcop,a0 moveq #1,d7 ; 2 planes _loopplane: move.w d0,6(a0) swap d0 move.w d0,2(a0) swap d0 addi.l #Width,d0 ; next plane addq.l #8,a0 dbf d7,_loopplane moveq #15,d1 and.b shift1(a5),d1 ; 16 values max. move.b bplshift(pc,d1.w),d1 move.w d1,bplcon1(a6) rts ; End of function instscreen ; -------------------------------------------------- bplshift: dc.b $FF,$EE,$DD,$CC,$BB,$AA,$99,$88 dc.b $77,$66,$55,$44,$33,$22,$11,0 ; ------------------------------------------------- ; grid the screen 32 pix * 9 line = 12.l*9 Tornado: movea.l PtScreen2(a5),a0 movea.l PtScreen1(a5),a4 move.l #Width*2*16+(Width-Wpattern),d0 adda.l d0,a4 adda.l d0,a0 lea posY(pc),a1 lea posX(pc),a2 moveq #0,d5 move.b shift2(a5),d5 sub.b shift1(a5),d5 ext.w d5 muls.w #8*Width*Depth+1,d5 addi.w #15,d5 move.w #Hpattern*Depth*64+6/2,d3 ; bltsize move.l #Width*Depth*Hpattern+Width,d4 bsr waitblitter move.l #$2A002A,bltAmod(a6) ; bltAmod/bltDmod = 48-6 =42 moveq #9,d7 ; 10 _loopY: move.w (a1)+,d1 ; Y add.w d5,d1 moveq #11,d6 ; x 12 _loopX: move.w (a2)+,d0 ; X add.w d1,d0 moveq #15,d2 and.w d0,d2 add.w d2,d2 move.w bltcon0dat(pc,d2.w),d2 ; bltcon0 asr.w #3,d0 ; x/8 lea (a0,d0.w),a3 ; pos in screen2 bsr waitblitter move.w d2,bltcon0(a6) ; bltcon0 movem.l a3-a4,bltApth(a6) ; a3=A screen2 / a4=D = screen1 move.w d3,bltsize(a6) subq.l #4,a0 ; -32 pix subq.l #4,a4 dbf d6,_loopX adda.l d4,a0 adda.l d4,a4 lea -12*2(a2),a2 dbf d7,_loopY rts ; End of function Blit1 ; -------------------------------- Vars ds.b VarSize even * -------------------------------------------- bltcon0dat: dc.w $F9F0,$E9F0,$D9F0,$C9F0,$B9F0 dc.w $A9F0,$99F0,$89F0,$79F0,$69F0 dc.w $59F0,$49F0,$39F0,$29F0,$19F0 dc.w $9F0 ; tile 8x8 pos (12x10) - grid 32x9 X=1+8*(Width*Depth) Y=8*(Width*Depth)-1 posY: dc.w 4*Y dc.w 3*Y dc.w 2*Y dc.w 1*Y dc.w 0 dc.w -1*Y dc.w -2*Y dc.w -3*Y dc.w -4*Y dc.w -5*Y posX: dc.w -5*X dc.w -4*X dc.w -3*X dc.w -2*X dc.w -1*X dc.w 0*X dc.w 1*X dc.w 2*X dc.w 3*X dc.w 4*X dc.w 5*X dc.w 6*X ; ------------------------------------ * --------------------------------------------- Init: lea $dff000,a6 lea Dma(pc),a0 move.w 2(a6),d0 ;save dma or.w d0,(a0)+ move.w $1c(a6),d0 ;intena or.w d0,(a0)+ move.w #$7fff,d0 move.w d0,$96(a6) move.w d0,$9a(a6) move.w d0,$9c(a6) * -- movea.l VBR(pc),a1 move.l $6c(a1),(a0) ; int3 ; lea interrupt(pc),a0 ; move.l a0,$6c(a1) ; move.w #$c020,$9a(a6) lea CopperList,a0 move.l a0,$80(a6) move.w #0,$88(a6) move.w #D_con,$96(a6) rts * --------------------------------------------- Restore: lea $dff000,a6 move.w #$7fff,d0 move.w d0,$96(a6) move.w d0,$9a(a6) move.w d0,$9c(a6) lea Dma(pc),a0 movea.l VBR(pc),a1 move.l 4(a0),$6c(a1) move.w 2(a0),$9a(a6) move.w (a0),$96(a6) rts * -------------------------------------------- GetVBR: movea.l 4.w,a6 btst #0,$129(a6) beq.s .normal lea SuperCode(pc),a5 jsr Supervisor(a6) lea VBR(pc),a0 move.l d0,(a0) .normal rts CNOP 0,4 SuperCode: dc.l $4e7a0801 ; movec Vbr,d0 (680x0) rte * -------------------------------------------- interrupt: movem.l a0-a6/d0-d7,-(sp) lea $dff000,a6 andi.w #$20,$1e(a6) ;interruption VBL beq.s pasInt lea flagVBL(pc),a0 move.w #0,(a0) move.w #$0020,$dff09c ; ok ! interrupt finished pasInt movem.l (sp)+,a0-a6/d0-d7 rte * -------------------------------------------- ; ------------------------------------ even flagVBL dc.w 0 Dma dc.w $8000 dc.w $c000 ;intena int3 dc.l 0 GfxBase dc.l 0 OldView dc.l 0 VBR dc.l 0 GfxName dc.b 'graphics.library',0 ; ------------------------------------ section chip,data_c copperlist: dc.w $108,modulo dc.w $10A,modulo dc.w $1FC,0 dc.w $8E,$2571 dc.w $90,$35C1 dc.w $92,$28 dc.w $94,$D0 dc.l $1200000 dc.l $1220000 bplcop: dc.l $E00006 dc.l $E20000 dc.l $E40006 dc.l $E60030 dc.w $100 bplcon0cop dc.w 2200 dc.w $180 color0 dc.w $0012 dc.w $182 color1 dc.w $0012 dc.w $184 color2 dc.w $0012 dc.w $186 color3 dc.w $0012 dc.l $FFFFFFFE ; pattern 32x32 pattern1: incbin pattern1.rw pattern2: incbin pattern2.rw pattern3: incbin pattern3.rw pattern4_1: incbin pattern4_1.rw pattern4_2: incbin pattern4_2.rw pattern5: incbin pattern5.rw pattern6: incbin pattern6.rw pattern7: ds.b Wpattern*Hpattern ; empty section screen,bss_c Screen ds.b screensize Screen2 ds.b screensize .