;;; " Includes & Defines" Machine 68020 Incdir "!includes:" Include "StdLibInc.i" Include "StdHardInc.i" Include "Loader.i" Include "Support.i" Include "Demo.i" xdef DotTunnel_Init xdef DotTunnel_Show xdef DotTunnel_Counter xdef DotTunnel_Main xdef DotTunnel_Remove xdef DotTunnel_Speed xdef DotTunnel_XS xdef DotTunnel_YS KK Equ 85 DotTunnel_ID Equ 1234 Farg1 Equ $3af Farg21 Equ $05fb Farg22 Equ $07fc Farg23 Equ $0bfd Farg24 Equ $0fff Back0 Equ $0055 Back1 Equ $0066 Back2 Equ $0077 Back3 Equ $0088 STARTRINGS Equ 70 RINGAD Equ 280 ;;; *************************************** * Exempel/TestProgram... * *************************************** Section code,CODE IFND noexample ;;; " Example" Start: Jsr _InitDemo Tst.l d0 Bne Exit PlayMusic: Bsr _PlayMusic Tst.l d0 Bne Uninit Bsr DotTunnel_Init Tst.l d0 Bne StopMusic Bsr DotTunnel_Show Main: Bsr _Sync Bsr DotTunnel_Counter ;Move.w #$0020,$dff106 ;Move.w #$0a00,$dff180 Bsr DotTunnel_Main ;Move.w #$0020,$dff106 ;Move.w #$0000,$dff180 Btst #6,$bfe001 Bne Main .waitlop Btst #6,$bfe001 Beq .waitlop Bsr DotTunnel_Remove StopMusic: Bsr _StopMusic Uninit: Bsr _UninitDemo Exit: Moveq #0,d0 Rts ;;; ENDC *************************************** * Subrutiner nedanfor.... * *************************************** DotTunnel_Init: ;;; " Open Screen" OpenScreen: Move.l #64*512*6,d0 Move.l #DotTunnel_ID,d1 Bsr _AllocChip Tst.l d0 Beq InitError Add.l #64*512,d0 Add.l #64*512,d0 Move.l d0,ScreenPtr Move.l d0,PtrView Add.l #64*512,d0 Move.l d0,PtrDraw Lea BplPtr,a0 Move.l PtrView,d1 Add.l #128*64+16,d1 Moveq #1,d2 Moveq #0,d0 Bsr _SetPtrs Lea BplPtr+16,a0 Move.l PtrView,d1 Add.l #128*64+16+64,d1 Moveq #1,d2 Moveq #0,d0 Bsr _SetPtrs ;;; ;;; " Install Sprites" Lea SprPtr,a0 Move.l #SpriteDummy,d1 Moveq #7,d2 Moveq #0,d0 Bsr _SetPtrs ;- - - - - - - - - - - - - IFD kul Lea SprPtr,a0 Move.l #Sprite1,d1 Moveq #0,d2 Moveq #0,d0 Jsr _SetPtrs Lea SprPtr,a0 Lea 8(a0),a0 Move.l #Sprite2,d1 Moveq #0,d2 Moveq #0,d0 Jsr _SetPtrs Lea SprPtr,a0 Lea 16(a0),a0 Move.l #Sprite3,d1 Moveq #0,d2 Moveq #0,d0 Jsr _SetPtrs Lea SprPtr,a0 Lea 24(a0),a0 Move.l #Sprite4,d1 Moveq #0,d2 Moveq #0,d0 Jsr _SetPtrs Lea SprPtr,a0 Lea 32(a0),a0 Move.l #Sprite5,d1 Moveq #0,d2 Moveq #0,d0 Jsr _SetPtrs Lea SprPtr,a0 Lea 40(a0),a0 Move.l #Sprite6,d1 Moveq #0,d2 Moveq #0,d0 Jsr _SetPtrs Lea Custom,a5 Move.w #DMAF_SETCLR!DMAF_SPRITE,dmacon(a5) ENDC ;;; ;;; " Allocate perspective table 1" AllocTable1: Move.l #64*640*2,d0 ; *2 = Words Move.l #DotTunnel_ID,d1 Bsr _AllocPublic Tst.l d0 Beq InitError Move.l d0,Table ;;; ;;; " Alloc Small Tables" AllocSmall: Move.l #100*2*4+320*2+STARTRINGS*2*4*2,d0 ; *2 = Words Move.l #DotTunnel_ID,d1 Bsr _AllocPublic Tst.l d0 Beq InitError Move.l d0,X Add.l #100*2,d0 Move.l d0,Y Add.l #100*2,d0 Move.l d0,Z Add.l #100*2,d0 Move.l d0,Draw Add.l #100*2,d0 Move.l d0,K1 Add.l #320*2,d0 Move.l d0,BackBuffPtr Add.l #STARTRINGS*2*4,d0 Move.l d0,BackBuffPtr2 ;;; ;;; " Init XYZ-Coords" InitXYZ: Move.w RINGS,d0 Subq.w #1,d0 Ext.l d0 Move.l X,a0 Move.l Y,a1 Move.l Z,a2 Move.l Draw,a3 .lop Clr.w (a0)+ Move.l d0,d1 Clr.w (a1)+ Mulu.w #RINGAD,d1 Divu.w RINGS,d1 Move.w d1,(a2,d0.w*2) Clr.w (a3)+ Dbra d0,.lop Move.w #0,C1 Move.w #256*8,C2 Clr.w OldTx Clr.w OldTy Clr.w Tx Clr.w Ty Clr.w Step Clr.w Rx Clr.w Ry ;;; ;;; " Init perspective table" InitP1: Move.l #300,d0 ; Z laget i d0 Move.l Table,a0 ; Perspektiv tabell Lea _Sin1024,a1 ; Sinus tabell Moveq #0,d7 .lop1 Move.l #65536*110*128,d2 ; X,Y,R Konstant i d2 Move.l #255+KK-4,d3 ; Z Konstant i d3 Sub.l d0,d3 ; -Z laget i d3 Divu.l d3,d2 ; /Z varde i d2 Swap d2 ; /65536 i d2 And.l #$ffff,d2 ; Move.l #63,d1 ; Vinkeln i d1 .lop2 Move.l d1,d4 ; Vinkeln i d4 Lsl.l #4,d4 ; *16 i d4 Move.w (a1,d4.w*2),d4 ; Sin(d4)*256 i d5 Muls.w d2,d4 ; *K i d5 Asr.l #8,d4 ; /256 i d5 Addx.l d7,d4 Move.l d1,d5 ; Vinkeln i d4 Add.l #16,d5 And.l #63,d5 Lsl.l #4,d5 ; *16 i d4 Move.w (a1,d5.w*2),d5 ; Sin(d4)*256 i d5 Muls.w d2,d5 ; *K i d5 Asr.l #8,d5 ; /256 i d5 Addx.l d7,d5 Asl.l #6,d5 Move.l d0,d3 ; Z laget i d3 Lsl.l #6,d3 ; *64 i d3 Add.l d1,d3 ; +Vinkeln i d3 Move.w d4,(a0,d3.w*4) ; Konstant till Persp.tab. Move.w d5,2(a0,d3.w*4) ; Konstant till Persp.tab. Dbra d1,.lop2 ; Dbra d0,.lop1 ; ;;; ;;; " Init second perspective table" InitK1: Move.l #300,d0 Move.l K1,a0 Moveq #0,d7 .lop Move.l #110*65536,d1 Move.l #255+KK-4,d2 Sub.l d0,d2 Divu.l d2,d1 Asr.l #2,d1 Addx.l d7,d1 Move.w d1,(a0,d0.w*2) Dbra d0,.lop ;;; ;;; " Rts" Moveq #0,d0 Rts InitError: Move.l #DotTunnel_ID,d0 Bsr _FreeMany Moveq #1,d0 Rts ;;; DotTunnel_Show: ;;; " Init Cols" Move.w #$0020,$dff106 Move.w #$0000,$dff180 ; Bakgrund Move.w #Farg21,$dff182 ; 1 Move.w #Farg21,$dff184 ; 2 Move.w #Farg22,$dff186 ; 1 2 Move.w #Farg21,$dff188 ; 3 Move.w #Farg22,$dff18a ; 1 3 Move.w #Farg22,$dff18c ; 2 3 Move.w #Farg23,$dff18e ; 1 2 3 Move.w #Farg21,$dff190 ; 4 Move.w #Farg22,$dff192 ; 1 4 Move.w #Farg22,$dff194 ; 2 4 Move.w #Farg23,$dff196 ; 1 2 4 Move.w #Farg22,$dff198 ; 3 4 Move.w #Farg23,$dff19a ; 1 3 4 Move.w #Farg23,$dff19c ; 2 3 4 Move.w #Farg24,$dff19e ; 1 2 3 4 ;;; Lea Copperlista,a0 Bsr _InstallCopper Rts DotTunnel_Counter: ;;; " Increase Counters" Move.w #RINGAD,d2 Divu.w RINGS,d2 Divu.w DotTunnel_Speed,d2 Move.w d2,AD ;------------------------- Move.w DotTunnel_XS,d1 Muls.w DotTunnel_Speed,d1 Move.w DotTunnel_YS,d2 Muls.w DotTunnel_Speed,d2 Add.w d1,C1 And.w #8191,C1 Add.w d2,C2 And.w #8191,C2 Subq.w #1,Count Moveq #0,d2 Move.w C1,d0 Asr.w #3,d0 Addx.l d2,d0 Move.w d0,Co1 Move.w C2,d0 Asr.w #3,d0 Addx.l d2,d0 Move.w d0,Co2 Lea OldTx,a0 Lea Tx,a1 Lea Step,a2 Lea Rx,a3 Move.w (a1),d0 Sub.w (a0),d0 Asl.w #2,d0 Muls.w (a2),d0 Divs.w AD,d0 Move.w (a0),d1 Asl.w #2,d1 Add.w d1,d0 Move.w d0,(a3) Lea OldTy,a0 Lea Ty,a1 Lea Step,a2 Lea Ry,a3 Move.w (a1),d0 Sub.w (a0),d0 Asl.w #2,d0 Muls.w (a2),d0 Divs.w AD,d0 Move.w (a0),d1 Asl.w #2,d1 Add.w d1,d0 Move.w d0,(a3) Lea Step,a0 Addq.w #1,(a0) Move.w AD,d1 Cmp.w (a0),d1 Bge .ok Sub.w d1,(a0) .ok ;;; IFD kul ;;; " Increase Sprite Positions" Move.l BackBuffPtr,a0 Move.w BackBuffPos,d0 Move.w (a0,d0.w*2),d1 Move.w d1,SprX Move.w BackBuffPos,d0 Move.w Co1,d1 Move.w d1,(a0,d0.w*2) Move.w BackBuffPos,d0 Addq.w #1,d0 Move.w #STARTRINGS*4,d1 Divu.w DotTunnel_Speed,d1 Divu.w d1,d0 Swap d0 Move.w d0,BackBuffPos Lea _Sin1024,a3 Move.w SprX,d0 ;Add.w #512,d0 And.w #1023,d0 Move.w (a3,d0.w*2),d1 ;1 acc Asr.w #4,d1 And.w #31,d1 Move.w d1,SprX ;------------------------- Move.l BackBuffPtr2,a0 Move.w BackBuffPos,d0 Move.w (a0,d0.w*2),d1 Move.w d1,SprY Move.w BackBuffPos,d0 Move.w Co2,d1 Move.w d1,(a0,d0.w*2) Lea _Sin1024,a3 Move.w SprY,d0 Add.w #512,d0 And.w #1023,d0 Move.w (a3,d0.w*2),d1 ;1 acc Asr.w #3,d1 And.w #15,d1 Move.w d1,SprY ;;; ENDC Rts DotTunnel_Main: IFD kul ;;; " Update Sprites" Move.l #$00200000,d1 Move.w #$2c,d0 Sub.w SprY,d0 Lsl.w #8,d0 Move.w #$40,d2 Sub.w SprX,d2 Add.w d2,d0 Swap d0 And.l #$ffff0000,d0 ;Or.l #$4c000000,d0 Move.l d0,Sprite1 Add.l d1,d0 Move.l d0,Sprite2 Add.l d1,d0 Move.l d0,Sprite3 Add.l d1,d0 Move.l d0,Sprite4 Add.l d1,d0 Move.l d0,Sprite5 Add.l d1,d0 Move.l d0,Sprite6 Add.l d1,d0 ;;; ENDC ;;; " Clear Screen" Move.l PtrDraw,a0 Clear: Moveq #63,d0 Lea 24568(a0),a0 ;(64*128+16)+(64*255+40) Moveq #0,d1 Moveq #0,d2 Moveq #0,d3 Moveq #0,d4 Moveq #0,d5 Sub.l a1,a1 Sub.l a2,a2 Sub.l a3,a3 Sub.l a4,a4 Sub.l a5,a5 Moveq #24,d6 .loop Movem.l d1-d5/a1-a5,-(a0) Sub.l d6,a0 Movem.l d1-d5/a1-a5,-(a0) Sub.l d6,a0 Movem.l d1-d5/a1-a5,-(a0) Sub.l d6,a0 Movem.l d1-d5/a1-a5,-(a0) Sub.l d6,a0 Dbra d0,.loop ;;; ;;; " Dot It Out!" DrawTunnel1: Move.w RINGS,d0 Subq.w #1,d0 Ext.l d0 Move.l X,a0 Move.l Y,a1 Move.l Z,a2 Move.l PtrDraw,a4 Add.l #63,a4 Move.l Table,CurrTable Move.l K1,d5 Moveq #0,d2 Move.w Ry,d6 Move.l Draw,a6 .RingLoop Move.w (a2),d2 ;1 acc Move.l d5,a5 Move.w (a0),d3 ;1 acc Sub.w Rx,d3 Move.w (a5,d2.w*2),d7 ;1 acc Muls.w d7,d3 Add.l #(256-3*8)*65536,d3 Move.w (a1),d4 ;1 acc Sub.w d6,d4 Muls.w d7,d4 Swap d4 Add.w #256*4,d4 Asr.w #2,d4 Asl.w #6,d4 Move.w d4,d3 Lsl.l #8,d2 Move.l CurrTable,a5 Add.l d2,a5 Move.w DotTunnel_Speed,d7 Add.w d7,(a2) ;1 acc Moveq #15,d1 Tst.w (a6) Beq .skipdraw .DotLoop REPT 4 Move.l a4,a3 ;2 Move.l d3,d4 ;2 Add.l (a5)+,d4 ;5 Add.w d4,a3 ;4 Swap d4 ;4 Move.w d4,d7 ;2 Lsr.w #3,d4 ;4 Sub.w d4,a3 ;4 Bset d7,(a3) ;9 ENDR Dbra.b d1,.DotLoop ;6 ;--------------- .skipdraw Cmp.w #RINGAD-1,(a2) ;1 acc Ble .skip Sub.w #RINGAD,(a2) ;1 acc Clr.w Step ;1 acc Move.w #1,(a6) Lea Tx,a3 Move.w (a3),d3 ;1 acc Move.w d3,OldTx Move.w (a0),d3 ;1 acc Asr.w #2,d3 Move.w d3,(a3) Lea Ty,a3 Move.w (a3),d3 ;1 acc Move.w d3,OldTy Move.w (a1),d3 ;1 acc Asr.w #2,d3 Move.w d3,(a3) Lea _Sin1024,a3 Move.w Co1,d3 Move.w (a3,d3.w*2),d4 ;1 acc Muls.w XX,d4 Asr.l #8,d4 Move.w d4,(a0) ;1 acc Move.w Co2,d3 Add.w #256,d3 And.w #1023,d3 Move.w (a3,d3.w*2),d4 ;1 acc Muls.w YY,d4 Asr.l #8,d4 Move.w d4,(a1) ;1 acc .skip Addq.l #2,a0 Addq.l #2,a1 Addq.l #2,a2 Addq.l #2,a6 Dbra d0,.RingLoop ;;; ;;; " Screen Swap" ScreenSwap: Move.l PtrView,d0 Move.l PtrDraw,PtrView Move.l d0,PtrDraw Lea BplPtr,a0 Move.l PtrView,d1 Add.l #128*64+16,d1 Moveq #1,d2 Moveq #0,d0 Bsr _SetPtrs Lea BplPtr+16,a0 Move.l PtrView,d1 Add.l #128*64+16+64,d1 Moveq #1,d2 Moveq #0,d0 Bsr _SetPtrs ;;; Rts DotTunnel_Remove: ;;; " Free Memory" FreeMemory: Move.l #DotTunnel_ID,d0 Bsr _FreeMany ;;; Rts *************************************** * Data... * *************************************** Section data,DATA ;;; "Data..." BackBuffPtr: Dc.l 0 BackBuffPtr2: Dc.l 0 BackBuffPos: Dc.l 0 BackBuffPos2: Dc.l 0 SprX: Dc.l 0 SprY: Dc.l 0 StoryCount: Dc.l 0 CurrTable: Dc.l 0 DotTunnel_XS: Dc.w 0 DotTunnel_YS: Dc.w 0 XX: Dc.w 512 YY: Dc.w 2048 Count: Dc.w 0 Persp: Dc.w 0 Mode: Dc.w 0 OldMode: Dc.w 0 DotTunnel_Speed: Dc.w 1 AD: Dc.w 0 RINGS: Dc.w STARTRINGS COPEFF: Dc.w 0 C1: Dc.w 0 C2: Dc.w 256*8 Co1: Dc.w 0 Co2: Dc.w 0 Table: Dc.l 0,0 ScreenPtr: Dc.l 0 PtrView: Dc.l 0 PtrDraw: Dc.l 0 X: Dc.l 0 Y: Dc.l 0 Z: Dc.l 0 Draw: Dc.l 0 K1: Dc.l 0 K2: Dc.l 0 OldTx: Dc.w 0 OldTy: Dc.w 0 Tx: Dc.w 0 Ty: Dc.w 0 Step: Dc.w 0 Rx: Dc.w 0 Ry: Dc.w 0 ;;; IFD kul2 ;;; "StoryBoard" StoryBoard: ;Dc.w XS,YS,TIME,PERSP,MODE: 0-1=true,2-3=half true ; 4-5=false ,XX,YY,SPEED,RINGS,COPEFF ;------------------------------ ;XS,YS: helst delbart med 8 Dc.w 34,38,100,2 Dc.w 36,32,200,2 Dc.w 16,46,100,2 Dc.w 26,24,200,2 Dc.w 24,34,100,2 Dc.w 16,26,100,2 Dc.w 32,24,100,2 Dc.w 24,14,50,2 Dc.w 22,24,50,2 Dc.w 14,35,50,2 Dc.w 17,24,50,4 Dc.w 34,14,50,4 Dc.w 32,34,50,4 Dc.w 14,18,50,4 Dc.w 32,24,50,4 Dc.w 19,9,100,4 Dc.w 19,19,50,4 Dc.w 29,9,20,4 Dc.w 19,29,20,4 Dc.w 40,23,50,4 Dc.w 12,20,20,4 Dc.w 19,9,50,4 Dc.w 39,29,20,4 Dc.w 29,49,20,4 Dc.w 19,29,50,4 Dc.w 10,23,20,4 Dc.w 12,30,20,4 Dc.w 29,9,50,4 Dc.w 19,29,20,4 Dc.w 40,23,20,4 Dc.w 12,20,50,4 Dc.w 19,19,20,4 Dc.w 39,29,20,4 Dc.w 29,49,50,4 Dc.w 19,29,20,4 Dc.w 10,23,20,4 Dc.w 12,30,100,4 Dc.w $FFFF ;;; ENDC Section chipdata,DATA_C ;;; "Copperlist" Copperlista: Dc.w $008e,$2c81 ; DIWSTRT Dc.w $0090,$2bc1 ; DIWSTOP Dc.w $0092,$0038 ; DDFSTRT Dc.w $0094,$00d0 ; DDFSTOP Dc.w $0100,$4201 ; BPLCON0 Dc.w $0102,$0001 ; BPLCON1 Dc.w $0104,$0000 ; BPLCON2 Dc.w $0106,$0020 ; BPLCON3 ($0020 = copborder) Dc.w $0108,24-8 ; BPLMOD1 Dc.w $010a,24-8 ; BPLMOD2 Dc.w $010c,$0022 ; Sprite palette = 32 Dc.w $01fc,$000f ; FETCHMODE BplPtr Dc.w $00e0,$0000 ; BPL1PTH Dc.w $00e2,$0000 ; BPL1PTL Dc.w $00e4,$0000 ; BPL1PTL Dc.w $00e6,$0000 ; BPL1PTL Dc.w $00e8,$0000 ; BPL1PTL Dc.w $00ea,$0000 ; BPL1PTL Dc.w $00ec,$0000 ; BPL1PTL Dc.w $00ee,$0000 ; BPL1PTL SprPtr: SprNum Set $0120 Rept 16 Dc.w SprNum,$0000 ; SPRxPT SprNum Set SprNum+2 Endr IFD kul Dc.w $0106,$2020 Dc.w $0180,Back0 Dc.w $0182,Back1 Dc.w $0184,Back2 Dc.w $0186,Back3 ;-------------------- Dc.w $0188,Back0 Dc.w $018a,Back1 Dc.w $018c,Back2 Dc.w $018e,Back3 ;-------------------- Dc.w $0190,Back0 Dc.w $0192,Back1 Dc.w $0194,Back2 Dc.w $0196,Back3 ;-------------------- Dc.w $0198,Back0 Dc.w $019a,Back1 Dc.w $019c,Back2 Dc.w $019e,Back3 ENDC Dc.w $ffff,$fffe ; End of list ;;; IFD kul ;;; "Sprites" Cnop 0,8 Sprite1: Dc.l $2c400000,0,$2c020000,0 REPT (256+16)/16 Include "!intro:dottunnel/back.spr4" ENDR Dc.l 0,0,0,0 Cnop 0,8 Sprite2: Dc.l $2c600000,0,$2c020000,0 REPT (256+16)/16 Include "!intro:dottunnel/back.spr4" ENDR Dc.l 0,0,0,0 Cnop 0,8 Sprite3: Dc.l $2c800000,0,$2c020000,0 REPT (256+16)/16 Include "!intro:dottunnel/back.spr4" ENDR Dc.l 0,0,0,0 Cnop 0,8 Sprite4: Dc.l $2ca00000,0,$2c020000,0 REPT (256+16)/16 Include "!intro:dottunnel/back.spr4" ENDR Dc.l 0,0,0,0 Cnop 0,8 Sprite5: Dc.l $2cc00000,0,$2c020000,0 REPT (256+16)/16 Include "!intro:dottunnel/back.spr4" ENDR Dc.l 0,0,0,0 Cnop 0,8 Sprite6: Dc.l $2ce00000,0,$2c020000,0 REPT (256+16)/16 Include "!intro:dottunnel/back.spr4" ENDR Dc.l 0,0,0,0 ;;; ENDC .