* * Turbo Racer. Game and Code ©1992 by Mark Sheeky * You can alter and assemble this, but you cannot give the * altered program to anyone without my consent. * Assembled on Devpac 2 * program move.l #700000,kount jsr delay jsr initialise jsr main jsr exit rts initialise jsr initbitmap rts initvars move.l #map,a0 clr.l d0 move.b tlevel,d0 sub.b #1,d0 mulu #1792,d0 add.l d0,a0 move.l a0,datapt1 move.l a0,datapt2 move.l #0,time1 move.l #0,time2 move.l #0,laptime1 move.l #0,laptime2 move.w #0,bexpl1 move.w #0,bexpl2 move.w #0,pexpl1 move.w #0,pexpl2 move.w #$ffff,$dff044 move.w #$ffff,$dff046 move.w #256,loopct1 move.w #256,loopct2 move.w #144,topbluex move.w #144,botbluex move.w #144,toppurpx move.w #144,botpurpx move.w #3776,blueglobal move.w #3776,purpglobal move.w #94,bluey move.w #94,purpy move.b #32,nrg1 move.b #32,nrg2 move.b #0,spd1 move.b #0,spd2 move.b #0,status1 move.b #0,status2 move.b #0,bluedead move.b #0,purpdead move.b #-1,bluelaps move.b #-1,purplaps move.b tacc,accel1 move.b tacc,accel2 move.b tdcc,decel1 move.b tdcc,decel2 move.b #0,count1 move.b #0,count2 move.b #0,flag1 move.b #0,flag2 move.b #0,gameover move.b #1,fflag1 move.b #1,fflag2 rts init2 move.b #1,tlevel move.b #5,tlap move.b #20,tacc move.b #50,tdcc move.b #20,accel1 move.b #20,accel2 move.b #50,decel1 move.b #50,decel2 rts exit jsr exitbitmap rts main jsr initvars jsr init2 .mainloop jsr mainmenu move.l #modmain,a0 jsr mt_init **** initialise title music jsr menuloop jsr prog jsr results .ok btst #7,$bfe001 beq .ok2 btst #6,$bfe001 beq .ok2 bra .ok .ok2 move.l #32,d0 move.l #fadetable,a0 jsr fadeout ; btst #7,$bfe001 ; hold fire after ; bne .mainloop ; results to exit. bra .mainloop ; no exit !!!! rts prog jsr setupsc jsr spron .vbg move.l $dff004,d0 and.l #$0001ff00,d0 cmp.l #$00012000,d0 bne .vbg jsr purpend jsr blueend jsr printships jsr ghost1 jsr ghost2 jsr collisions jsr topscroll jsr testaccel1 tst.b bluedead bne .1dead jsr joystick1 .1dead jsr botscroll jsr testaccel2 tst.b purpdead bne .2dead jsr joystick2 .2dead jsr ranges jsr times jsr ended jsr noise cmp.b #117,$bfec01 beq .end tst.b gameover beq .vbg .end move.w #$f,$dff096 move.l #100000,kount jsr delay move.l #blacktable,a1 jsr copycols jsr sproff rts * check for end of game condition. ended tst.b flag1 ; both speeds must be zero beq .end tst.b flag2 beq .end move.b #1,gameover move.l #modend,a0 jsr mt_init **** initialise game over music here .vbg move.l $dff004,d0 and.l #$0001ff00,d0 cmp.l #$00012000,d0 bne .vbg jsr mt_music **** call game over music btst #7,$bfe001 bne .vbg jsr mt_end **** turn off game over music here .end rts blueend tst.b flag1 bne .end tst.b spd1 bne .end tst.b status1 beq .end move.b #1,flag1 move.b #3,d0 move.l bit.start,a1 add.l #1600,a1 move.l #raceover,a0 .loop1 move.w #$4d8,d1 .loop2 move.b (a0)+,d2 or.b d2,(a1)+ subq.w #1,d1 bne .loop2 add.l #20480-$4d8,a1 subq.b #1,d0 bne .loop1 .end rts purpend tst.b flag2 bne .end tst.b spd2 bne .end tst.b status2 beq .end move.b #1,flag2 move.b #3,d0 move.l bit.start,a1 add.l #6520,a1 move.l #raceover,a0 .loop1 move.w #$4d8,d1 .loop2 move.b (a0)+,d2 or.b d2,(a1)+ subq.w #1,d1 bne .loop2 add.l #20480-$4d8,a1 subq.b #1,d0 bne .loop1 .end rts menuloop move.l #$dff194,a6 move.l #10,d4 .menloop move.l $dff004,d0 and.l #$1ff00,d0 cmp.l #$12000,d0 bne .menloop jsr mt_music **** call title music move.w $dff00c,d0 btst #9,d0 beq .notleft move.b #-1,d1 bsr subone bra .end .notleft btst #1,d0 beq .notright move.b #1,d1 bsr subone bra .end .notright btst #8,d0 beq .notup tst.b d2 bne .end move.b #255,d2 cmp.l #$dff194,a6 beq .notup move.w #0,(a6) sub.l #2,a6 move.w #$fff,(a6) bra .end .notup btst #0,d0 beq .end2 tst.b d2 bne .end move.b #255,d2 cmp.l #$dff19a,a6 beq .end move.w #0,(a6) add.l #2,a6 move.w #$fff,(a6) bra .end .end2 clr.l d2 .end btst #7,$bfe001 bne .menloop jsr mt_end **** turn off title music move.l #32,d0 move.l #fadetable,a0 jsr fadeout jsr initvars rts subone subq.b #1,d4 bne .end move.l #10,d4 cmp.l #$dff194,a6 bne .notlev add.b d1,tlevel tst.b tlevel beq .1bad cmp.b #11,tlevel beq .1bad .notlev cmp.l #$dff196,a6 bne .notlaps add.b d1,tlap tst.b tlap beq .2bad cmp.b #41,tlap beq .2bad .notlaps cmp.l #$dff198,a6 bne .notacc add.b d1,tacc tst.b tacc beq .3bad cmp.b #51,tacc beq .3bad .notacc cmp.l #$dff19a,a6 bne .notdcc add.b d1,tdcc tst.b tdcc beq .4bad cmp.b #51,tdcc beq .4bad bra .notdcc .1bad sub.b d1,tlevel bra .notdcc .2bad sub.b d1,tlap bra .notdcc .3bad sub.b d1,tacc bra .notdcc .4bad sub.b d1,tdcc .notdcc jsr outvals .end rts * do engine sounds in channels 3 & 4 relative to speed noise clr.b d0 move.b spd1,d0 lsl.l #4,d0 move.w #428,d1 sub.w d0,d1 move.w d1,$dff0c6 clr.b d0 move.b spd2,d0 lsl.l #4,d0 move.w #428,d1 sub.w d0,d1 move.w d1,$dff0d6 rts * set up main screen (title and bars) mainscreen jsr sproff jsr cls move.w #$2c81,$dff08e * shrink screen move.w #$2cc1,$dff090 * (borders on l & r) move.w #$5000,$dff100 * dual play field mode move.l #blacktable,a1 jsr copycols move.b #5,d0 move.l bit.start,a1 add.l #440,a1 move.l #Turbotop,a0 .loop1 move.w #2480,d1 .loop2 move.b (a0)+,(a1)+ subq.w #1,d1 bne .loop2 add.l #10240-2480,a1 subq.b #1,d0 bne .loop1 move.b #5,d0 move.l bit.start,a1 add.l #8920,a1 move.l #Turbobar,a0 .loop3 move.w #680,d1 .loop4 move.b (a0)+,(a1)+ subq.w #1,d1 bne .loop4 add.l #10240-680,a1 subq.b #1,d0 bne .loop3 rts * check ranges ranges cmp.w #44,bluey bge .ok5 move.w #44,bluey .ok5 cmp.w #44,purpy bge .ok6 move.w #44,purpy .ok6 cmp.w #143,bluey ble .ok7 move.w #143,bluey .ok7 cmp.w #143,purpy ble .ok8 move.w #143,purpy .ok8 rts * print main menu mainmenu jsr mainscreen move.b #5,d0 move.l bit.start,a1 add.l #3320,a1 move.l #Turbomenu,a0 .loop3 move.w #560,d1 .loop4 move.b (a0)+,(a1)+ subq.w #1,d1 bne .loop4 add.l #10240-560,a1 subq.b #1,d0 bne .loop3 move.b #5,d0 move.l bit.start,a1 add.l #4520,a1 move.l #Turboopts,a0 .loop1 move.w #4000,d1 .loop2 move.b (a0)+,(a1)+ subq.w #1,d1 bne .loop2 add.l #10240-4000,a1 subq.b #1,d0 bne .loop1 move.l bit.start,a1 add.l #4892,a1 move.l #txlevel,a0 jsr write2 move.l bit.start,a1 add.l #4892,a1 add.l #10240,a1 move.l #txlevel,a0 jsr write2 move.l bit.start,a1 add.l #4892,a1 add.l #20480,a1 move.l #txlevel,a0 jsr write2 move.l bit.start,a1 add.l #4892,a1 add.l #30720,a1 move.l #txlevel,a0 jsr write2 move.l bit.start,a1 add.l #4892,a1 add.l #40960,a1 move.l #txlevel,a0 jsr write2 move.l bit.start,a1 add.l #5892,a1 move.l #txlap,a0 jsr write2 move.l bit.start,a1 add.l #5892,a1 add.l #10240,a1 move.l #txlap,a0 jsr write2 move.l bit.start,a1 add.l #5892,a1 add.l #20480,a1 move.l #txlap,a0 jsr write2 move.l bit.start,a1 add.l #5892,a1 add.l #30720,a1 move.l #txlap,a0 jsr write2 move.l bit.start,a1 add.l #5892,a1 add.l #40960,a1 move.l #txlap,a0 jsr write2 move.l bit.start,a1 add.l #6892,a1 move.l #txacc,a0 jsr write2 move.l bit.start,a1 add.l #6892,a1 add.l #10240,a1 move.l #txacc,a0 jsr write2 move.l bit.start,a1 add.l #6892,a1 add.l #20480,a1 move.l #txacc,a0 jsr write2 move.l bit.start,a1 add.l #6892,a1 add.l #30720,a1 move.l #txacc,a0 jsr write2 move.l bit.start,a1 add.l #6892,a1 add.l #40960,a1 move.l #txacc,a0 jsr write2 move.l bit.start,a1 add.l #7892,a1 move.l #txdcc,a0 jsr write2 move.l bit.start,a1 add.l #7892,a1 add.l #10240,a1 move.l #txdcc,a0 jsr write2 move.l bit.start,a1 add.l #7892,a1 add.l #20480,a1 move.l #txdcc,a0 jsr write2 move.l bit.start,a1 add.l #7892,a1 add.l #30720,a1 move.l #txdcc,a0 jsr write2 move.l bit.start,a1 add.l #7892,a1 add.l #40960,a1 move.l #txdcc,a0 jsr write2 jsr outvals move.l #32,d0 move.l #coltable2,a0 move.l #fadetable,a1 jsr fadein rts * print results screen results jsr mainscreen tst.b status1 bne .ok11 move.b #2,status1 .ok11 tst.b status2 bne .ok22 move.b #2,status2 .ok22 move.b #5,d0 move.l bit.start,a1 add.l #3321,a1 move.l #turbores,a0 .loop3 move.w #560,d1 .loop4 move.b (a0)+,(a1)+ subq.w #1,d1 bne .loop4 add.l #10240-560,a1 subq.b #1,d0 bne .loop3 .not11 cmp.b #2,status1 bne .not21 move.l #Turbolose1,a0 .not21 cmp.b #3,status1 bne .not31 move.l #Turbowin1,a0 .not31 move.b #5,d0 move.l bit.start,a1 add.l #4520,a1 .loop5 move.w #$a78,d1 .loop6 move.b (a0)+,d2 or.b d2,(a1)+ subq.w #1,d1 bne .loop6 add.l #10240-$a78,a1 subq.b #1,d0 bne .loop5 .not12 cmp.b #2,status2 bne .not22 move.l #Turbolose2,a0 .not22 cmp.b #3,status2 bne .not32 move.l #Turbowin2,a0 .not32 move.b #5,d0 move.l bit.start,a1 add.l #4520,a1 .loop7 move.w #$a78,d1 .loop8 move.b (a0)+,d2 or.b d2,(a1)+ subq.w #1,d1 bne .loop8 add.l #10240-$a78,a1 subq.b #1,d0 bne .loop7 move.l #32,d0 move.l #coltable3,a0 move.l #fadetable,a1 jsr fadein rts * print out values on the title screen outvals clr.l d0 move.b tlevel,d0 move.l #2,d1 move.l #nxlevel,a0 jsr convert move.l bit.start,a1 add.l #4906,a1 move.l #nxlevel,a0 jsr write move.l bit.start,a1 add.l #4906,a1 add.l #10240,a1 move.l #nxlevel,a0 jsr write move.l bit.start,a1 add.l #4906,a1 add.l #20480,a1 move.l #nxlevel,a0 jsr write move.l bit.start,a1 add.l #4906,a1 add.l #30720,a1 move.l #nxlevel,a0 jsr write move.l bit.start,a1 add.l #4906,a1 add.l #40960,a1 move.l #nxlevel,a0 jsr write clr.l d0 move.b tlap,d0 move.l #2,d1 move.l #nxlap,a0 jsr convert move.l bit.start,a1 add.l #5906,a1 move.l #nxlap,a0 jsr write move.l bit.start,a1 add.l #5906,a1 add.l #10240,a1 move.l #nxlap,a0 jsr write move.l bit.start,a1 add.l #5906,a1 add.l #20480,a1 move.l #nxlap,a0 jsr write move.l bit.start,a1 add.l #5906,a1 add.l #30720,a1 move.l #nxlap,a0 jsr write move.l bit.start,a1 add.l #5906,a1 add.l #40960,a1 move.l #nxlap,a0 jsr write clr.l d0 move.b tacc,d0 move.l #2,d1 move.l #nxacc,a0 jsr convert move.l bit.start,a1 add.l #6906,a1 move.l #nxacc,a0 jsr write move.l bit.start,a1 add.l #6906,a1 add.l #10240,a1 move.l #nxacc,a0 jsr write move.l bit.start,a1 add.l #6906,a1 add.l #20480,a1 move.l #nxacc,a0 jsr write move.l bit.start,a1 add.l #6906,a1 add.l #30720,a1 move.l #nxacc,a0 jsr write move.l bit.start,a1 add.l #6906,a1 add.l #40960,a1 move.l #nxacc,a0 jsr write clr.l d0 move.b tdcc,d0 move.l #2,d1 move.l #nxdcc,a0 jsr convert move.l bit.start,a1 add.l #7906,a1 move.l #nxdcc,a0 jsr write move.l bit.start,a1 add.l #7906,a1 add.l #10240,a1 move.l #nxdcc,a0 jsr write move.l bit.start,a1 add.l #7906,a1 add.l #20480,a1 move.l #nxdcc,a0 jsr write move.l bit.start,a1 add.l #7906,a1 add.l #30720,a1 move.l #nxdcc,a0 jsr write move.l bit.start,a1 add.l #7906,a1 add.l #40960,a1 move.l #nxdcc,a0 jsr write rts * fade in colours. a1-coltable (the one thats initially black). * a0-pointer to destination cols. d0-number of colours to fade in. * change kount value to adjust speed of fade. fadein move.l #$fff,d1 move.l a1,a5 move.l a0,a4 clr.l d2 move.b d0,d2 .mloop move.l #5000,kount * fade speed jsr delay .vbgloop move.l $dff004,d0 and.l #$1ff00,d0 cmp.l #$12000,d0 bne .vbgloop move.l d2,d0 move.l a5,a1 move.l a4,a0 .loop1 move.w (a0)+,(a1)+ subq.b #1,d0 bne .loop1 move.l a5,a1 move.l a4,a0 move.l d2,d0 .loop2 move.w (a1),d6 move.w d1,d3 and.w #$0f00,d3 move.w d6,d4 and.w #$0f00,d4 sub.w d3,d4 tst.w d4 bpl .ok1 clr.l d4 .ok1 move.w d4,(a1) move.w d4,d5 move.w d1,d3 and.w #$00f0,d3 move.w d6,d4 and.w #$00f0,d4 sub.w d3,d4 tst.w d4 bpl .ok2 move.w d5,d4 .ok2 or.w d4,(a1) move.w d4,d5 move.w d1,d3 and.w #$000f,d3 move.w d6,d4 and.w #$000f,d4 sub.w d3,d4 tst.w d4 bpl .ok move.w d5,d4 .ok or.w d4,(a1) add.l #2,a1 subq.b #1,d0 bne .loop2 move.l a5,a1 movem.l d0-d2/a0-a1,-(sp) jsr copycols movem.l (sp)+,d0-d2/a0-a1 sub.w #$111,d1 tst.w d1 bmi .end bra .mloop .end rts * fade out colours. d0-number of colours. a0-pointer to colour table. fadeout move.l #$f,d1 move.l a0,a2 clr.l d2 move.b d0,d2 .mloop move.l a2,a0 move.l #5000,kount * fade speed jsr delay .vbgloop move.l $dff004,d0 and.l #$1ff00,d0 cmp.l #$12000,d0 bne .vbgloop move.l d2,d0 .loop clr.l d3 clr.l d4 clr.l d5 move.w (a0),d3 and.w #$f00,d3 beq .redo sub.w #$100,d3 .redo move.w (a0),d4 and.w #$f0,d4 beq .grno sub.w #$10,d4 .grno move.w (a0),d5 and.w #$f,d5 beq .bluo sub.w #1,d5 .bluo or.w d4,d3 or.w d5,d3 move.w d3,(a0)+ subq.b #1,d0 bne .loop move.l a2,a1 movem.l d0-d3/a0-a3,-(sp) jsr copycols movem.l (sp)+,d0-d3/a0-a3 subq.b #1,d1 bne .mloop rts * collision detector ! collisions move.w $dff00e,colreg move.w colreg,d1 btst #1,d1 bne .bluehit btst #10,d1 bne .bluehit bra .blueok .bluehit tst.b status1 bne .blueok move.b spd1,d0 tst.b d0 bne .ok1 move.b #1,d0 .ok1 sub.b d0,nrg1 bpl .bluealive tst.b bluedead bne .bluealive .bluealive move.b #0,spd1 cmp.w #144,topbluex beq .blueok subq.w #2,topbluex subq.w #2,blueglobal bpl .blueok add.w #4096,blueglobal .blueok btst #4,d1 bne .purplehit btst #13,d1 bne .purplehit bra .purpleok .purplehit tst.b status2 bne .purpleok move.b spd2,d0 tst.b d0 bne .ok2 move.b #1,d0 .ok2 sub.b d0,nrg2 bpl .purpalive tst.b purpdead bne .purpalive .purpalive move.b #0,spd2 cmp.w #144,botpurpx beq .purpleok subq.w #2,botpurpx subq.w #2,purpglobal bpl .purpleok add.w #4096,purpglobal .purpleok rts * work out times times tst.b bluelaps bmi .start tst.b bluedead bne .notgo1 add.l #2,time1 cmp.l #1000000,time1 bne .ok1 .start move.l #0,time1 .ok1 move.l time1,d0 move.l #6,d1 move.l #btime1,a0 jsr convert move.l bit.start,a1 add.l #25042,a1 move.l #btime1,a0 jsr write .notgo1 tst.b purplaps bmi .start2 tst.b purpdead bne .end add.l #2,time2 cmp.l #1000000,time2 bne .ok2 .start2 move.l #0,time2 .ok2 move.l time2,d0 move.l #6,d1 move.l #btime2,a0 jsr convert move.l bit.start,a1 add.l #25072,a1 move.l #btime2,a0 jsr write .end rts * work out times (lap) laptime move.l laptime1,d0 move.l #6,d1 move.l #blaptime1,a0 jsr convert move.l laptime2,d0 move.l #6,d1 move.l #blaptime2,a0 jsr convert move.l bit.start,a1 add.l #25049,a1 move.l #blaptime1,a0 jsr write move.l bit.start,a1 add.l #25065,a1 move.l #blaptime2,a0 jsr write rts * do laps (print on screen) laps clr.l d0 move.b bluelaps,d0 tst.b d0 bpl .notb clr.l d0 .notb cmp.b tlap,d0 bne .ok1 move.b #3,bluedead cmp.b #3,status2 bne .notwon1 move.b #2,status1 bra .ok1 .notwon1 move.b #3,status1 .ok1 move.l #2,d1 move.l #blaps1,a0 jsr convert move.l bit.start,a1 add.l #25056,a1 move.l #blaps1,a0 jsr write clr.l d0 move.b purplaps,d0 tst.b d0 bpl .notp clr.l d0 .notp cmp.b tlap,d0 bne .ok2 move.b #3,purpdead cmp.b #3,status1 bne .notwon2 move.b #2,status2 bra .ok2 .notwon2 move.b #3,status2 .ok2 move.l #2,d1 move.l #blaps2,a0 jsr convert move.l bit.start,a1 add.l #25062,a1 move.l #blaps2,a0 jsr write rts * work out blue ship in lower scroll area in correct relative place ghost1 cmp.b #1,status1 bgt .outofrng clr.l d0 move.w purpglobal,d1 move.w blueglobal,d0 sub.w d1,d0 cmp.w #-1024,d0 bge .ok1 add.w #4096,d0 bra .ok2 .ok1 cmp.w #1024,d0 blt .ok2 sub.w #4096,d0 .ok2 add.w botpurpx,d0 cmp.w #100,d0 blt .outofrng cmp.w #468,d0 bgt .outofrng tst.b bluelaps bmi .outofrng tst.b purplaps bmi .outofrng move.w d0,botbluex rts .outofrng move.w #0,botbluex rts * work out purple ship in upper scroll area in correct relative place ghost2 cmp.b #1,status2 bgt .outofrng clr.l d0 move.w blueglobal,d1 move.w purpglobal,d0 sub.w d1,d0 cmp.w #-1024,d0 bge .ok1 add.w #4096,d0 bra .ok2 .ok1 cmp.w #1024,d0 blt .ok2 sub.w #4096,d0 .ok2 add.w topbluex,d0 cmp.w #100,d0 blt .outofrng cmp.w #468,d0 bgt .outofrng tst.b bluelaps bmi .outofrng tst.b purplaps bmi .outofrng move.w d0,toppurpx rts .outofrng move.w #0,toppurpx rts * write out message at a0 to location a1. 8x9 letters. 1 plane. write move.b (a0),d0 * letter code in d0 tst.b d0 beq .eom sub.l #40,a1 move.b #0,(a1) add.l #40,a1 cmp.b #32,d0 bne .workout move.l #Null,a2 bra .printlet .workout sub.b #47,d0 move.l #Alphabet,a2 sub.l #8,a2 .loop2 add.l #8,a2 * work out address sub.b #1,d0 * of letter picture bne .loop2 .printlet move.b #8,d1 * print letter .loop3 move.b (a2)+,(a1) add.l #40,a1 sub.b #1,d1 bne .loop3 sub.l #319,a1 add.l #1,a0 bra write .eom rts write2 move.b (a0),d0 tst.b d0 beq .eom cmp.b #32,d0 bne .workout move.l #Null,a2 bra .printlet .workout sub.b #47,d0 move.l #Alphabet,a2 sub.l #8,a2 .loop2 add.l #8,a2 sub.b #1,d0 bne .loop2 .printlet move.b #8,d1 .loop3 move.b (a2)+,d2 or.b d2,(a1) add.l #40,a1 sub.b #1,d1 bne .loop3 sub.l #319,a1 add.l #1,a0 bra write2 .eom rts * converts a number to ascii. d0-The number * d1-How many chars to convert (2 - 6). a0-Address of where to put result convert move.l #1,d2 move.b d1,d3 subq.b #1,d3 .loop mulu #10,d2 subq.b #1,d3 bne .loop .loop1 move.b #48,(a0) .loop2 cmp.l d2,d0 blt .end sub.l d2,d0 addq.b #1,(a0) bra .loop2 .end add.l #1,a0 divu #10,d2 subq.b #1,d1 bne .loop1 rts * check the joystick for player 1 joystick1 move.w $dff00c,d0 btst #9,d0 beq .notleft btst #7,$bfe001 bne .left sub.b #15,decel1 .left cmp.w #144,topbluex beq .ok1 subq.w #2,topbluex subq.w #2,blueglobal bpl .ok1 add.w #4096,blueglobal .ok1 btst #8,d0 beq .uptoo btst #0,d0 bne .downtoo rts .notleft btst #1,d0 beq .notright cmp.w #300,topbluex beq .ok2 addq.w #2,topbluex addq.w #2,blueglobal bra blap .ok2 btst #0,d0 beq .downtoo btst #8,d0 bne .uptoo rts .notright btst #9,d0 bne .notup btst #8,d0 beq .notup btst #1,d0 bne .notup .uptoo subq.w #2,bluey rts .notup btst #8,d0 bne .end btst #1,d0 bne .end btst #0,d0 beq .end .downtoo addq.w #2,bluey .end rts * check the joystick for player 2 joystick2 move.w $dff00a,d0 btst #9,d0 beq .notleft btst #6,$bfe001 bne .left sub.b #15,decel2 .left cmp.w #144,botpurpx beq .ok1 subq.w #2,botpurpx subq.w #2,purpglobal bpl .ok1 add.w #4096,purpglobal .ok1 btst #8,d0 beq .uptoo btst #0,d0 bne .downtoo rts .notleft btst #1,d0 beq .notright cmp.w #300,botpurpx beq .ok2 addq.w #2,botpurpx addq.w #2,purpglobal bra plap .ok2 btst #0,d0 beq .downtoo btst #8,d0 bne .uptoo rts .notright btst #9,d0 bne .notup btst #8,d0 beq .notup btst #1,d0 bne .notup .uptoo subq.w #2,purpy rts .notup btst #8,d0 bne .end btst #1,d0 bne .end btst #0,d0 beq .end .downtoo addq.w #2,purpy .end rts * set up screen setupsc move.l #blacktable,a1 jsr copycols jsr cls move.w #$2c91,$dff08e * shrink screen move.w #$2cb1,$dff090 * (borders on l & r) move.w #$5400,$dff100 * dual play field mode move.w #$f041,$dff098 * collisions move.l bit.start,a3 move.b #20,d1 .loop01 move.b #7,d2 move.l #mapp,a1 .loop1 move.b #16,d4 .loop move.w (a1),(a3) add.l #40,a3 subq.b #1,d4 bne .loop add.l #2,a1 subq.b #1,d2 bne .loop1 sub.l #4478,a3 subq.b #1,d1 bne .loop01 move.l bit.start,a3 add.l #4920,a3 move.b #20,d1 .loop21 move.b #7,d2 move.l #mapp,a1 .loop2 move.b #16,d4 .loop0 move.w (a1),(a3) add.l #40,a3 subq.b #1,d4 bne .loop0 add.l #2,a1 subq.b #1,d2 bne .loop2 sub.l #4478,a3 subq.b #1,d1 bne .loop21 move.l bit.start,a1 add.l #10240,a1 add.l #4920,a1 move.l #cavewall,a0 move.w #4480,d0 .loop3 move.b (a0)+,(a1)+ subq.w #1,d0 bne .loop3 move.l bit.start,a1 add.l #30720,a1 add.l #4920,a1 move.w #4480,d0 .loop4 move.b (a0)+,(a1)+ subq.w #1,d0 bne .loop4 move.l bit.start,a1 add.l #10240,a1 move.l #cavewall,a0 move.w #4480,d0 .loop5 move.b (a0)+,(a1)+ subq.w #1,d0 bne .loop5 move.l bit.start,a1 add.l #30720,a1 move.w #4480,d0 .loop6 move.b (a0)+,(a1)+ subq.w #1,d0 bne .loop6 jsr times jsr laptime jsr laps move.l #coltable,a1 jsr copycols move.l #Engine,$dff0c0 move.w #3538,$dff0c4 move.w #64,$dff0c8 move.w #430,$dff0c6 move.l #Engine,$dff0d0 move.w #3538,$dff0d4 move.w #64,$dff0d8 move.w #430,$dff0d6 move.w #$800c,$dff096 rts * speed up if neccesary/slow down if not speeding up testaccel1 tst.b bluedead bne .end2 btst #7,$bfe001 bne .end2 move.w $dff00c,d0 btst #9,d0 bne .end2 subq.b #1,accel1 bne .end move.b tacc,accel1 cmp.b #16,spd1 beq .end add.b #1,spd1 rts .end2 subq.b #1,decel1 bpl .end move.b tdcc,decel1 tst.b spd1 beq .end subq.b #1,spd1 .end rts * speed up if neccesary/slow down if not speeding up testaccel2 tst.b purpdead bne .end2 btst #6,$bfe001 bne .end2 move.w $dff00a,d0 btst #9,d0 bne .end2 subq.b #1,accel2 bne .end move.b tacc,accel2 cmp.b #16,spd2 beq .end add.b #1,spd2 rts .end2 subq.b #1,decel2 bpl .end move.b tdcc,decel2 tst.b spd2 beq .end subq.b #1,spd2 .end rts * turn on sprites. Uses dma, so all sprites are enabled spron move.l $dff004,d0 and.l #$0001ff00,d0 cmp.l #$00012000,d0 bne spron move.w #$8020,$dff096 rts * turn off sprites. Uses dma, so all sprites are disabled. sproff move.l $dff004,d0 and.l #$0001ff00,d0 cmp.l #$00012000,d0 bne sproff move.w #$20,$dff096 rts printships move.l #13,d2 clr.l d0 clr.l d1 move.w topbluex,d0 move.w bluey,d1 move.l #topblue1,a0 jsr printpoint add.w #16,d0 move.l #topblue2,a0 jsr printpoint move.w botbluex,d0 add.w #123,d1 move.l #botblue1,a0 jsr printpoint add.w #16,d0 move.l #botblue2,a0 jsr printpoint clr.l d0 clr.l d1 move.w #50,d0 move.w toppurpx,d0 move.w purpy,d1 move.l #toppurp1,a0 jsr printpoint add.w #16,d0 move.l #toppurp2,a0 jsr printpoint move.w #50,d0 move.w botpurpx,d0 add.w #123,d1 move.l #botpurp1,a0 jsr printpoint add.w #16,d0 move.l #botpurp2,a0 jsr printpoint rts * print sprite at word positions d0,d1 address in a0 (of words) * height in d2 printpoint movem.l d0/d1,-(sp) move.l a0,a1 add.l #1,a0 bsr horzshow bsr chy movem.l (sp)+,d0/d1 rts horzshow lsr.w #1,d0 bcs setit move.b d0,(a0) add.l #2,a0 bclr #0,(a0) rts setit move.b d0,(a0) add.l #2,a0 bset #0,(a0) rts chy move.w d1,d0 move.l a1,a0 move.b d0,(a0) add.l #3,a0 cmp.w #255,d0 ble notgrt bset #2,(a0) bra isgrt notgrt bclr #2,(a0) isgrt add.w d2,d0 cmp.w #255,d0 ble notgrt2 bset #1,(a0) bra isgrt2 notgrt2 bclr #1,(a0) isgrt2 sub.l #1,a0 move.b d0,(a0) rts * Multipurpose delay delay subq.l #1,kount bne delay rts * clear the screen cls move.w #51200,d0 ; 10240 bytes per plane (PAL) move.l bit.start,a0 .loop move.b #0,(a0)+ subq.w #1,d0 bne .loop rts blap cmp.w #4096,blueglobal blt .lt sub.w #4096,blueglobal tst.b status1 bne .lt tst.b fflag1 beq .lt move.b #0,fflag1 add.b #1,bluelaps jsr laps tst.b bluelaps move.l time1,laptime1 move.l #0,time1 jsr laptime .lt cmp.w #2000,blueglobal blt .lt2 cmp.w #3000,blueglobal bgt .lt2 move.b #1,fflag1 .lt2 rts * scroll top area completely topscroll clr.l d0 move.b spd1,d0 add.w d0,blueglobal jsr blap clr.l d2 move.b count1,d2 move.l d2,d3 sub.b spd1,d3 move.b d3,count1 cmp.b #1,d3 bge .gtthan1 move.l d2,d0 jsr scroll1 move.l bit.start,a0 add.l #38,a0 move.l datapt1,a1 jsr printline add.l #1,datapt1 subq.w #1,loopct1 bne .ok sub.l #256,datapt1 move.w #256,loopct1 .ok neg.b count1 clr.l d0 move.b count1,d0 jsr scroll1 move.l #16,d0 sub.b count1,d0 move.b d0,count1 rts .gtthan1 clr.l d0 move.b spd1,d0 jsr scroll1 rts plap cmp.w #4096,purpglobal blt .lt sub.w #4096,purpglobal tst.b status2 bne .lt tst.b fflag2 beq .lt move.b #0,fflag2 add.b #1,purplaps jsr laps move.l time2,laptime2 move.l #0,time2 jsr laptime .lt cmp.w #2000,purpglobal blt .lt2 cmp.w #3000,purpglobal bgt .lt2 move.b #1,fflag2 .lt2 rts * scroll bottom area completely botscroll clr.l d0 move.b spd2,d0 add.w d0,purpglobal jsr plap clr.l d2 move.b count2,d2 move.l d2,d3 sub.b spd2,d3 move.b d3,count2 cmp.b #1,d3 bge .gtthan1 move.l d2,d0 jsr scroll2 move.l bit.start,a0 add.l #4958,a0 move.l datapt2,a1 jsr printline add.l #1,datapt2 subq.w #1,loopct2 bne .ok sub.l #256,datapt2 move.w #256,loopct2 .ok neg.b count2 clr.l d0 move.b count2,d0 jsr scroll2 move.l #16,d0 sub.b count2,d0 move.b d0,count2 rts .gtthan1 clr.l d0 move.b spd2,d0 jsr scroll2 rts * scroll top area by d0 pixels. uses blitter & d0 & d1 scroll1 tst.b d0 beq .end move.l #16,d1 sub.b d0,d1 lsl.l #4,d1 lsl.l #4,d1 lsl.l #4,d1 or.w #$9f0,d1 .looop btst #14,$dff002 bne .looop move.w d1,$dff040 move.w #0,$dff042 move.w #0,$dff066 move.w #0,$dff064 move.l bit.start,d0 move.l d0,$dff054 add.l #2,d0 move.l d0,$dff050 move.w #112*64+20,$dff058 move.w #$8040,$dff096 .end rts * scroll bottom area by d0 pixels. uses blitter & d0 & d1 scroll2 tst.b d0 beq .end move.l #16,d1 sub.b d0,d1 lsl.l #4,d1 lsl.l #4,d1 lsl.l #4,d1 or.w #$9f0,d1 .looop btst #14,$dff002 bne .looop move.w d1,$dff040 move.w #0,$dff042 move.w #0,$dff066 move.w #0,$dff064 move.l bit.start,d0 add.l #4920,d0 move.l d0,$dff054 add.l #2,d0 move.l d0,$dff050 move.w #112*64+20,$dff058 move.w #$8040,$dff096 .end rts * printaline of data at a0 with pointer in a1 printline btst #14,$dff002 bne printline move.l #7,d1 move.w #$9f0,$dff040 move.w #0,$dff042 move.w #38,$dff066 move.w #0,$dff064 .loop move.l #tiles,a2 clr.l d0 move.b (a1),d0 lsl.l #5,d0 add.l d0,a2 move.l a0,$dff054 move.l a2,$dff050 move.w #16*64+1,$dff058 move.w #$8040,$dff096 .wait btst #14,$dff002 bne .wait add.l #256,a1 add.l #640,a0 subq.l #1,d1 bne .loop rts * copys colours into correct registers. Address of table in a1 copycols move.l #$dff180,a0 move.b #32,d0 .loop move.w (a1),(a0) addq.l #2,a0 addq.l #2,a1 subq.b #1,d0 bne .loop rts * initialise bitmap (default pal - 5 planes). no Own blitter. initbitmap move.l 4,a6 jsr -132(a6) * stop multitasking move.l 4,a6 move.l #gfxname,a1 clr.l d0 jsr -408(a6) move.l a6,gfxbase move.l $4,a6 * reserve memory move.l #51200,d0 * 8000 ntsc, 10240 pal move.l #$10002,d1 jsr -198(a6) move.l d0,bit.start move.l #1000,d0 move.l #2,d1 jsr -198(a6) move.l d0,cop.start move.l cop.start,a0 * create copperlist move.l bit.start,d1 move.w #4,d4 * change to planes - 1 move.w #$e0,d2 loop move.w d2,(a0)+ swap d1 move.w d1,(a0)+ add #2,d2 move.w d2,(a0)+ swap d1 move.w d1,(a0)+ add.l #10240,d1 add #2,d2 dbf d4,loop move.l #topblue1,d0 * sprite 0 move.w #$120,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$122,(a0)+ move.w d0,(a0)+ move.l #topblue2,d0 * sprite 1 move.w #$124,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$126,(a0)+ move.w d0,(a0)+ move.l #botblue1,d0 * sprite 2 move.w #$128,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$12a,(a0)+ move.w d0,(a0)+ move.l #botblue2,d0 * sprite 3 move.w #$12c,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$12e,(a0)+ move.w d0,(a0)+ move.l #toppurp1,d0 * sprite 4 move.w #$130,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$132,(a0)+ move.w d0,(a0)+ move.l #toppurp2,d0 * sprite 5 move.w #$134,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$136,(a0)+ move.w d0,(a0)+ move.l #botpurp1,d0 * sprite 6 move.w #$138,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$13a,(a0)+ move.w d0,(a0)+ move.l #botpurp2,d0 * sprite 7 move.w #$13c,(a0)+ swap d0 move.w d0,(a0)+ swap d0 move.w #$13e,(a0)+ move.w d0,(a0)+ move.w #$ffff,(a0)+ move.w #$fffe,(a0) lea $dff000,a5 * disable dma .wait move.b 6(a5),d6 cmp.b #$20,d6 bne .wait move.w #$01a0,$96(a5) move.l cop.start,$80(a5) * start copperlist clr.w $88(a5) move.l #coltable,a1 jsr copycols move.w #$2c81,$8e(a5) * diwstart move.w #$2cc1,$90(a5) * diwstop move.w #$38,$92(a5) * ddfstart move.w #$d0,$94(a5) * ddfstop move.w #$5000,$100(a5) * num of planes, bits 12-14 clr.w $102(a5) * bplcon1 move.w #$24,$dff104 * bplcon2 clr.w $108(a5) * bpl1mod clr.w $10a(a5) * bpl2mod move.w #$8380,$96(a5) * start dma rts * free bitmap memory, and turn off bitmap exitbitmap move.w #$8020,$dff096 lea $dff000,a5 move.l 4,a6 move.l #gfxname,a1 clr.l d0 jsr -552(a6) move.l d0,a4 move.l 38(a4),$80(a5) clr.w $88(a5) move.l bit.start,a1 move.l #51200,d0 * amount to free jsr -210(a6) move.l cop.start,a1 move.l #1000,d0 jsr -210(a6) move.l gfxbase,a1 * close gfx library jsr -414(a6) move.l 4,a6 jsr -138(a6) * restore System rts ;******************************************** ;* ----- Protracker V2.0A Playroutine ----- * ;******************************************** ; VBlank Version 3: ; Call mt_init to initialize the routine, then call mt_music on ; each vertical blank (50 Hz). To end the song and turn off all ; voices, call mt_end. DMAWait = 300 n_note EQU 0 ; W n_cmd EQU 2 ; W n_cmdlo EQU 3 ; B n_start EQU 4 ; L n_length EQU 8 ; W n_loopstart EQU 10 ; L n_replen EQU 14 ; W n_period EQU 16 ; W n_finetune EQU 18 ; B n_volume EQU 19 ; B n_dmabit EQU 20 ; W n_toneportdirec EQU 22 ; B n_toneportspeed EQU 23 ; B n_wantedperiod EQU 24 ; W n_vibratocmd EQU 26 ; B n_vibratopos EQU 27 ; B n_tremolocmd EQU 28 ; B n_tremolopos EQU 29 ; B n_wavecontrol EQU 30 ; B n_glissfunk EQU 31 ; B n_sampleoffset EQU 32 ; B n_pattpos EQU 33 ; B n_loopcount EQU 34 ; B n_funkoffset EQU 35 ; B n_wavestart EQU 36 ; L n_reallength EQU 40 ; W mt_init MOVE.L A0,mt_SongDataPtr MOVE.L A0,A1 LEA 952(A1),A1 MOVEQ #127,D0 MOVEQ #0,D1 mtloop MOVE.L D1,D2 SUBQ.W #1,D0 mtloop2 MOVE.B (A1)+,D1 CMP.B D2,D1 BGT.S mtloop DBRA D0,mtloop2 ADDQ.B #1,D2 LEA mt_SampleStarts(PC),A1 ASL.L #8,D2 ASL.L #2,D2 ADD.L #1084,D2 ADD.L A0,D2 MOVE.L D2,A2 MOVEQ #30,D0 mtloop3 CLR.L (A2) MOVE.L A2,(A1)+ MOVEQ #0,D1 MOVE.W 42(A0),D1 ASL.L #1,D1 ADD.L D1,A2 ADD.L #30,A0 DBRA D0,mtloop3 OR.B #2,$BFE001 MOVE.B #6,mt_speed CLR.B mt_counter CLR.B mt_SongPos CLR.W mt_PatternPos mt_end CLR.W $DFF0A8 CLR.W $DFF0B8 CLR.W $DFF0C8 CLR.W $DFF0D8 MOVE.W #$F,$DFF096 RTS mt_music MOVEM.L D0-D4/A0-A6,-(SP) ADDQ.B #1,mt_counter MOVE.B mt_counter(PC),D0 CMP.B mt_speed(PC),D0 BLO.S mt_NoNewNote CLR.B mt_counter TST.B mt_PattDelTime2 BEQ.S mt_GetNewNote BSR.S mt_NoNewAllChannels BRA mt_dskip mt_NoNewNote BSR.S mt_NoNewAllChannels BRA mt_NoNewPosYet mt_NoNewAllChannels LEA $DFF0A0,A5 LEA mt_chan1temp(PC),A6 BSR mt_CheckEfx LEA $DFF0B0,A5 LEA mt_chan2temp(PC),A6 BSR mt_CheckEfx LEA $DFF0C0,A5 LEA mt_chan3temp(PC),A6 BSR mt_CheckEfx LEA $DFF0D0,A5 LEA mt_chan4temp(PC),A6 BRA mt_CheckEfx mt_GetNewNote MOVE.L mt_SongDataPtr(PC),A0 LEA 12(A0),A3 LEA 952(A0),A2 ;pattpo LEA 1084(A0),A0 ;patterndata MOVEQ #0,D0 MOVEQ #0,D1 MOVE.B mt_SongPos(PC),D0 MOVE.B (A2,D0.W),D1 ASL.L #8,D1 ASL.L #2,D1 ADD.W mt_PatternPos(PC),D1 CLR.W mt_DMACONtemp LEA $DFF0A0,A5 LEA mt_chan1temp(PC),A6 BSR.S mt_PlayVoice LEA $DFF0B0,A5 LEA mt_chan2temp(PC),A6 BSR.S mt_PlayVoice LEA $DFF0C0,A5 LEA mt_chan3temp(PC),A6 BSR.S mt_PlayVoice LEA $DFF0D0,A5 LEA mt_chan4temp(PC),A6 BSR.S mt_PlayVoice BRA mt_SetDMA mt_PlayVoice TST.L (A6) BNE.S mt_plvskip BSR mt_PerNop mt_plvskip MOVE.L (A0,D1.L),(A6) ADDQ.L #4,D1 MOVEQ #0,D2 MOVE.B n_cmd(A6),D2 AND.B #$F0,D2 LSR.B #4,D2 MOVE.B (A6),D0 AND.B #$F0,D0 OR.B D0,D2 TST.B D2 BEQ mt_SetRegs MOVEQ #0,D3 LEA mt_SampleStarts(PC),A1 MOVE D2,D4 SUBQ.L #1,D2 ASL.L #2,D2 MULU #30,D4 MOVE.L (A1,D2.L),n_start(A6) MOVE.W (A3,D4.L),n_length(A6) MOVE.W (A3,D4.L),n_reallength(A6) MOVE.B 2(A3,D4.L),n_finetune(A6) MOVE.B 3(A3,D4.L),n_volume(A6) MOVE.W 4(A3,D4.L),D3 ; Get repeat TST.W D3 BEQ.S mt_NoLoop MOVE.L n_start(A6),D2 ; Get start ASL.W #1,D3 ADD.L D3,D2 ; Add repeat MOVE.L D2,n_loopstart(A6) MOVE.L D2,n_wavestart(A6) MOVE.W 4(A3,D4.L),D0 ; Get repeat ADD.W 6(A3,D4.L),D0 ; Add replen MOVE.W D0,n_length(A6) MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) ; Set volume BRA.S mt_SetRegs mt_NoLoop MOVE.L n_start(A6),D2 ADD.L D3,D2 MOVE.L D2,n_loopstart(A6) MOVE.L D2,n_wavestart(A6) MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) ; Set volume mt_SetRegs MOVE.W (A6),D0 AND.W #$0FFF,D0 BEQ mt_CheckMoreEfx ; If no note MOVE.W 2(A6),D0 AND.W #$0FF0,D0 CMP.W #$0E50,D0 BEQ.S mt_DoSetFineTune MOVE.B 2(A6),D0 AND.B #$0F,D0 CMP.B #3,D0 ; TonePortamento BEQ.S mt_ChkTonePorta CMP.B #5,D0 BEQ.S mt_ChkTonePorta CMP.B #9,D0 ; Sample Offset BNE.S mt_SetPeriod BSR mt_CheckMoreEfx BRA.S mt_SetPeriod mt_DoSetFineTune BSR mt_SetFineTune BRA.S mt_SetPeriod mt_ChkTonePorta BSR mt_SetTonePorta BRA mt_CheckMoreEfx mt_SetPeriod MOVEM.L D0-D1/A1,-(SP) MOVE.W (A6),D1 AND.W #$0FFF,D1 LEA mt_PeriodTable(PC),A1 MOVEQ #0,D0 MOVEQ #36,D4 mt_ftuloop CMP.W (A1,D0.W),D1 BHS.S mt_ftufound ADDQ.L #2,D0 DBRA D4,mt_ftuloop mt_ftufound MOVEQ #0,D1 MOVE.B n_finetune(A6),D1 MULU #36*2,D1 ADD.L D1,A1 MOVE.W (A1,D0.W),n_period(A6) MOVEM.L (SP)+,D0-D1/A1 MOVE.W 2(A6),D0 AND.W #$0FF0,D0 CMP.W #$0ED0,D0 ; Notedelay BEQ mt_CheckMoreEfx MOVE.W n_dmabit(A6),$DFF096 BTST #2,n_wavecontrol(A6) BNE.S mt_vibnoc CLR.B n_vibratopos(A6) mt_vibnoc BTST #6,n_wavecontrol(A6) BNE.S mt_trenoc CLR.B n_tremolopos(A6) mt_trenoc MOVE.L n_start(A6),(A5) ; Set start MOVE.W n_length(A6),4(A5) ; Set length MOVE.W n_period(A6),D0 MOVE.W D0,6(A5) ; Set period MOVE.W n_dmabit(A6),D0 OR.W D0,mt_DMACONtemp BRA mt_CheckMoreEfx mt_SetDMA MOVE.W #DMAWait,D0 mt_WaitDMA DBRA D0,mt_WaitDMA MOVE.W mt_DMACONtemp(PC),D0 OR.W #$8000,D0 MOVE.W D0,$DFF096 MOVE.W #DMAWait,D0 mt_WaitDMA2 DBRA D0,mt_WaitDMA2 LEA $DFF000,A5 LEA mt_chan4temp(PC),A6 MOVE.L n_loopstart(A6),$D0(A5) MOVE.W n_replen(A6),$D4(A5) LEA mt_chan3temp(PC),A6 MOVE.L n_loopstart(A6),$C0(A5) MOVE.W n_replen(A6),$C4(A5) LEA mt_chan2temp(PC),A6 MOVE.L n_loopstart(A6),$B0(A5) MOVE.W n_replen(A6),$B4(A5) LEA mt_chan1temp(PC),A6 MOVE.L n_loopstart(A6),$A0(A5) MOVE.W n_replen(A6),$A4(A5) mt_dskip ADD.W #16,mt_PatternPos MOVE.B mt_PattDelTime,D0 BEQ.S mt_dskc MOVE.B D0,mt_PattDelTime2 CLR.B mt_PattDelTime mt_dskc TST.B mt_PattDelTime2 BEQ.S mt_dska SUBQ.B #1,mt_PattDelTime2 BEQ.S mt_dska SUB.W #16,mt_PatternPos mt_dska TST.B mt_PBreakFlag BEQ.S mt_nnpysk SF mt_PBreakFlag MOVEQ #0,D0 MOVE.B mt_PBreakPos(PC),D0 CLR.B mt_PBreakPos LSL.W #4,D0 MOVE.W D0,mt_PatternPos mt_nnpysk CMP.W #1024,mt_PatternPos BLO.S mt_NoNewPosYet mt_NextPosition MOVEQ #0,D0 MOVE.B mt_PBreakPos(PC),D0 LSL.W #4,D0 MOVE.W D0,mt_PatternPos CLR.B mt_PBreakPos CLR.B mt_PosJumpFlag ADDQ.B #1,mt_SongPos AND.B #$7F,mt_SongPos MOVE.B mt_SongPos(PC),D1 MOVE.L mt_SongDataPtr(PC),A0 CMP.B 950(A0),D1 BLO.S mt_NoNewPosYet CLR.B mt_SongPos mt_NoNewPosYet TST.B mt_PosJumpFlag BNE.S mt_NextPosition MOVEM.L (SP)+,D0-D4/A0-A6 RTS mt_CheckEfx BSR mt_UpdateFunk MOVE.W n_cmd(A6),D0 AND.W #$0FFF,D0 BEQ.S mt_PerNop MOVE.B n_cmd(A6),D0 AND.B #$0F,D0 BEQ.S mt_Arpeggio CMP.B #1,D0 BEQ mt_PortaUp CMP.B #2,D0 BEQ mt_PortaDown CMP.B #3,D0 BEQ mt_TonePortamento CMP.B #4,D0 BEQ mt_Vibrato CMP.B #5,D0 BEQ mt_TonePlusVolSlide CMP.B #6,D0 BEQ mt_VibratoPlusVolSlide CMP.B #$E,D0 BEQ mt_E_Commands SetBack MOVE.W n_period(A6),6(A5) CMP.B #7,D0 BEQ mt_Tremolo CMP.B #$A,D0 BEQ mt_VolumeSlide mt_Return2 RTS mt_PerNop MOVE.W n_period(A6),6(A5) RTS mt_Arpeggio MOVEQ #0,D0 MOVE.B mt_counter(PC),D0 DIVS #3,D0 SWAP D0 CMP.W #0,D0 BEQ.S mt_Arpeggio2 CMP.W #2,D0 BEQ.S mt_Arpeggio1 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 LSR.B #4,D0 BRA.S mt_Arpeggio3 mt_Arpeggio1 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #15,D0 BRA.S mt_Arpeggio3 mt_Arpeggio2 MOVE.W n_period(A6),D2 BRA.S mt_Arpeggio4 mt_Arpeggio3 ASL.W #1,D0 MOVEQ #0,D1 MOVE.B n_finetune(A6),D1 MULU #36*2,D1 LEA mt_PeriodTable(PC),A0 ADD.L D1,A0 MOVEQ #0,D1 MOVE.W n_period(A6),D1 MOVEQ #36,D4 mt_arploop MOVE.W (A0,D0.W),D2 CMP.W (A0),D1 BHS.S mt_Arpeggio4 ADDQ.L #2,A0 DBRA D4,mt_arploop RTS mt_Arpeggio4 MOVE.W D2,6(A5) RTS mt_FinePortaUp TST.B mt_counter BNE.S mt_Return2 MOVE.B #$0F,mt_LowMask mt_PortaUp MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B mt_LowMask(PC),D0 MOVE.B #$FF,mt_LowMask SUB.W D0,n_period(A6) MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 CMP.W #113,D0 BPL.S mt_PortaUskip AND.W #$F000,n_period(A6) OR.W #113,n_period(A6) mt_PortaUskip MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 MOVE.W D0,6(A5) RTS mt_FinePortaDown TST.B mt_counter BNE mt_Return2 MOVE.B #$0F,mt_LowMask mt_PortaDown CLR.W D0 MOVE.B n_cmdlo(A6),D0 AND.B mt_LowMask(PC),D0 MOVE.B #$FF,mt_LowMask ADD.W D0,n_period(A6) MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 CMP.W #856,D0 BMI.S mt_PortaDskip AND.W #$F000,n_period(A6) OR.W #856,n_period(A6) mt_PortaDskip MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 MOVE.W D0,6(A5) RTS mt_SetTonePorta MOVE.L A0,-(SP) MOVE.W (A6),D2 AND.W #$0FFF,D2 LEA mt_PeriodTable(PC),A0 ADD.L D0,A0 MOVEQ #0,D0 mt_StpLoop CMP.W (A0,D0.W),D2 BHS.S mt_StpFound ADDQ.W #2,D0 CMP.W #36*2,D0 BLO.S mt_StpLoop MOVEQ #35*2,D0 mt_StpFound MOVEQ #0,D2 MOVE.B n_finetune(A6),D2 MULU #36*2,D2 ADD.L D2,A0 MOVE.W (A0,D0.W),D2 MOVE.L (SP)+,A0 MOVE.W D2,n_wantedperiod(A6) MOVE.W n_period(A6),D0 CLR.B n_toneportdirec(A6) CMP.W D0,D2 BEQ.S mt_ClearTonePorta BGE mt_Return2 MOVE.B #1,n_toneportdirec(A6) RTS mt_ClearTonePorta CLR.W n_wantedperiod(A6) RTS mt_TonePortamento MOVE.B n_cmdlo(A6),D0 BEQ.S mt_TonePortNoChange MOVE.B D0,n_toneportspeed(A6) CLR.B n_cmdlo(A6) mt_TonePortNoChange TST.W n_wantedperiod(A6) BEQ mt_Return2 MOVEQ #0,D0 MOVE.B n_toneportspeed(A6),D0 TST.B n_toneportdirec(A6) BNE.S mt_TonePortaUp mt_TonePortaDown ADD.W D0,n_period(A6) MOVE.W n_wantedperiod(A6),D0 CMP.W n_period(A6),D0 BGT.S mt_TonePortaSetPer MOVE.W n_wantedperiod(A6),n_period(A6) CLR.W n_wantedperiod(A6) BRA.S mt_TonePortaSetPer mt_TonePortaUp SUB.W D0,n_period(A6) MOVE.W n_wantedperiod(A6),D0 CMP.W n_period(A6),D0 BLT.S mt_TonePortaSetPer MOVE.W n_wantedperiod(A6),n_period(A6) CLR.W n_wantedperiod(A6) mt_TonePortaSetPer MOVE.W n_period(A6),D2 MOVE.B n_glissfunk(A6),D0 AND.B #$0F,D0 BEQ.S mt_GlissSkip MOVEQ #0,D0 MOVE.B n_finetune(A6),D0 MULU #36*2,D0 LEA mt_PeriodTable(PC),A0 ADD.L D0,A0 MOVEQ #0,D0 mt_GlissLoop CMP.W (A0,D0.W),D2 BHS.S mt_GlissFound ADDQ.W #2,D0 CMP.W #36*2,D0 BLO.S mt_GlissLoop MOVEQ #35*2,D0 mt_GlissFound MOVE.W (A0,D0.W),D2 mt_GlissSkip MOVE.W D2,6(A5) ; Set period RTS mt_Vibrato MOVE.B n_cmdlo(A6),D0 BEQ.S mt_Vibrato2 MOVE.B n_vibratocmd(A6),D2 AND.B #$0F,D0 BEQ.S mt_vibskip AND.B #$F0,D2 OR.B D0,D2 mt_vibskip MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 BEQ.S mt_vibskip2 AND.B #$0F,D2 OR.B D0,D2 mt_vibskip2 MOVE.B D2,n_vibratocmd(A6) mt_Vibrato2 MOVE.B n_vibratopos(A6),D0 LEA mt_VibratoTable(PC),A4 LSR.W #2,D0 AND.W #$001F,D0 MOVEQ #0,D2 MOVE.B n_wavecontrol(A6),D2 AND.B #$03,D2 BEQ.S mt_vib_sine LSL.B #3,D0 CMP.B #1,D2 BEQ.S mt_vib_rampdown MOVE.B #255,D2 BRA.S mt_vib_set mt_vib_rampdown TST.B n_vibratopos(A6) BPL.S mt_vib_rampdown2 MOVE.B #255,D2 SUB.B D0,D2 BRA.S mt_vib_set mt_vib_rampdown2 MOVE.B D0,D2 BRA.S mt_vib_set mt_vib_sine MOVE.B 0(A4,D0.W),D2 mt_vib_set MOVE.B n_vibratocmd(A6),D0 AND.W #15,D0 MULU D0,D2 LSR.W #7,D2 MOVE.W n_period(A6),D0 TST.B n_vibratopos(A6) BMI.S mt_VibratoNeg ADD.W D2,D0 BRA.S mt_Vibrato3 mt_VibratoNeg SUB.W D2,D0 mt_Vibrato3 MOVE.W D0,6(A5) MOVE.B n_vibratocmd(A6),D0 LSR.W #2,D0 AND.W #$003C,D0 ADD.B D0,n_vibratopos(A6) RTS mt_TonePlusVolSlide BSR mt_TonePortNoChange BRA mt_VolumeSlide mt_VibratoPlusVolSlide BSR.S mt_Vibrato2 BRA mt_VolumeSlide mt_Tremolo MOVE.B n_cmdlo(A6),D0 BEQ.S mt_Tremolo2 MOVE.B n_tremolocmd(A6),D2 AND.B #$0F,D0 BEQ.S mt_treskip AND.B #$F0,D2 OR.B D0,D2 mt_treskip MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 BEQ.S mt_treskip2 AND.B #$0F,D2 OR.B D0,D2 mt_treskip2 MOVE.B D2,n_tremolocmd(A6) mt_Tremolo2 MOVE.B n_tremolopos(A6),D0 LEA mt_VibratoTable(PC),A4 LSR.W #2,D0 AND.W #$001F,D0 MOVEQ #0,D2 MOVE.B n_wavecontrol(A6),D2 LSR.B #4,D2 AND.B #$03,D2 BEQ.S mt_tre_sine LSL.B #3,D0 CMP.B #1,D2 BEQ.S mt_tre_rampdown MOVE.B #255,D2 BRA.S mt_tre_set mt_tre_rampdown TST.B n_tremolopos(A6) BPL.S mt_tre_rampdown2 MOVE.B #255,D2 SUB.B D0,D2 BRA.S mt_tre_set mt_tre_rampdown2 MOVE.B D0,D2 BRA.S mt_tre_set mt_tre_sine MOVE.B 0(A4,D0.W),D2 mt_tre_set MOVE.B n_tremolocmd(A6),D0 AND.W #15,D0 MULU D0,D2 LSR.W #6,D2 MOVEQ #0,D0 MOVE.B n_volume(A6),D0 TST.B n_tremolopos(A6) BMI.S mt_TremoloNeg ADD.W D2,D0 BRA.S mt_Tremolo3 mt_TremoloNeg SUB.W D2,D0 mt_Tremolo3 BPL.S mt_TremoloSkip CLR.W D0 mt_TremoloSkip CMP.W #$40,D0 BLS.S mt_TremoloOk MOVE.W #$40,D0 mt_TremoloOk MOVE.W D0,8(A5) MOVE.B n_tremolocmd(A6),D0 LSR.W #2,D0 AND.W #$003C,D0 ADD.B D0,n_tremolopos(A6) RTS mt_SampleOffset MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 BEQ.S mt_sononew MOVE.B D0,n_sampleoffset(A6) mt_sononew MOVE.B n_sampleoffset(A6),D0 LSL.W #7,D0 CMP.W n_length(A6),D0 BGE.S mt_sofskip SUB.W D0,n_length(A6) LSL.W #1,D0 ADD.L D0,n_start(A6) RTS mt_sofskip MOVE.W #$0001,n_length(A6) RTS mt_VolumeSlide MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 LSR.B #4,D0 TST.B D0 BEQ.S mt_VolSlideDown mt_VolSlideUp ADD.B D0,n_volume(A6) CMP.B #$40,n_volume(A6) BMI.S mt_vsuskip MOVE.B #$40,n_volume(A6) mt_vsuskip MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) RTS mt_VolSlideDown MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 mt_VolSlideDown2 SUB.B D0,n_volume(A6) BPL.S mt_vsdskip CLR.B n_volume(A6) mt_vsdskip MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) RTS mt_PositionJump MOVE.B n_cmdlo(A6),D0 SUBQ.B #1,D0 MOVE.B D0,mt_SongPos mt_pj2 CLR.B mt_PBreakPos ST mt_PosJumpFlag RTS mt_VolumeChange MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 CMP.B #$40,D0 BLS.S mt_VolumeOk MOVEQ #$40,D0 mt_VolumeOk MOVE.B D0,n_volume(A6) MOVE.W D0,8(A5) RTS mt_PatternBreak MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 MOVE.L D0,D2 LSR.B #4,D0 MULU #10,D0 AND.B #$0F,D2 ADD.B D2,D0 CMP.B #63,D0 BHI.S mt_pj2 MOVE.B D0,mt_PBreakPos ST mt_PosJumpFlag RTS mt_SetSpeed MOVE.B 3(A6),D0 BEQ mt_Return2 CLR.B mt_counter MOVE.B D0,mt_speed RTS mt_CheckMoreEfx BSR mt_UpdateFunk MOVE.B 2(A6),D0 AND.B #$0F,D0 CMP.B #$9,D0 BEQ mt_SampleOffset CMP.B #$B,D0 BEQ mt_PositionJump CMP.B #$D,D0 BEQ.S mt_PatternBreak CMP.B #$E,D0 BEQ.S mt_E_Commands CMP.B #$F,D0 BEQ.S mt_SetSpeed CMP.B #$C,D0 BEQ mt_VolumeChange BRA mt_PerNop mt_E_Commands MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 LSR.B #4,D0 BEQ.S mt_FilterOnOff CMP.B #1,D0 BEQ mt_FinePortaUp CMP.B #2,D0 BEQ mt_FinePortaDown CMP.B #3,D0 BEQ.S mt_SetGlissControl CMP.B #4,D0 BEQ mt_SetVibratoControl CMP.B #5,D0 BEQ mt_SetFineTune CMP.B #6,D0 BEQ mt_JumpLoop CMP.B #7,D0 BEQ mt_SetTremoloControl CMP.B #9,D0 BEQ mt_RetrigNote CMP.B #$A,D0 BEQ mt_VolumeFineUp CMP.B #$B,D0 BEQ mt_VolumeFineDown CMP.B #$C,D0 BEQ mt_NoteCut CMP.B #$D,D0 BEQ mt_NoteDelay CMP.B #$E,D0 BEQ mt_PatternDelay CMP.B #$F,D0 BEQ mt_FunkIt RTS mt_FilterOnOff MOVE.B n_cmdlo(A6),D0 AND.B #1,D0 ASL.B #1,D0 AND.B #$FD,$BFE001 OR.B D0,$BFE001 RTS mt_SetGlissControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 AND.B #$F0,n_glissfunk(A6) OR.B D0,n_glissfunk(A6) RTS mt_SetVibratoControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 AND.B #$F0,n_wavecontrol(A6) OR.B D0,n_wavecontrol(A6) RTS mt_SetFineTune MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 MOVE.B D0,n_finetune(A6) RTS mt_JumpLoop TST.B mt_counter BNE mt_Return2 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BEQ.S mt_SetLoop TST.B n_loopcount(A6) BEQ.S mt_jumpcnt SUBQ.B #1,n_loopcount(A6) BEQ mt_Return2 mt_jmploop MOVE.B n_pattpos(A6),mt_PBreakPos ST mt_PBreakFlag RTS mt_jumpcnt MOVE.B D0,n_loopcount(A6) BRA.S mt_jmploop mt_SetLoop MOVE.W mt_PatternPos(PC),D0 LSR.W #4,D0 MOVE.B D0,n_pattpos(A6) RTS mt_SetTremoloControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 LSL.B #4,D0 AND.B #$0F,n_wavecontrol(A6) OR.B D0,n_wavecontrol(A6) RTS mt_RetrigNote MOVE.L D1,-(SP) MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BEQ.S mt_rtnend MOVEQ #0,D1 MOVE.B mt_counter(PC),D1 BNE.S mt_rtnskp MOVE.W (A6),D1 AND.W #$0FFF,D1 BNE.S mt_rtnend MOVEQ #0,D1 MOVE.B mt_counter(PC),D1 mt_rtnskp DIVU D0,D1 SWAP D1 TST.W D1 BNE.S mt_rtnend mt_DoRetrig MOVE.W n_dmabit(A6),$DFF096 ; Channel DMA off MOVE.L n_start(A6),(A5) ; Set sampledata pointer MOVE.W n_length(A6),4(A5) ; Set length MOVE.W #DMAWait,D0 mt_rtnloop1 DBRA D0,mt_rtnloop1 MOVE.W n_dmabit(A6),D0 BSET #15,D0 MOVE.W D0,$DFF096 MOVE.W #DMAWait,D0 mt_rtnloop2 DBRA D0,mt_rtnloop2 MOVE.L n_loopstart(A6),(A5) MOVE.L n_replen(A6),4(A5) mt_rtnend MOVE.L (SP)+,D1 RTS mt_VolumeFineUp TST.B mt_counter BNE mt_Return2 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$F,D0 BRA mt_VolSlideUp mt_VolumeFineDown TST.B mt_counter BNE mt_Return2 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BRA mt_VolSlideDown2 mt_NoteCut MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 CMP.B mt_counter(PC),D0 BNE mt_Return2 CLR.B n_volume(A6) MOVE.W #0,8(A5) RTS mt_NoteDelay MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 CMP.B mt_Counter,D0 BNE mt_Return2 MOVE.W (A6),D0 BEQ mt_Return2 MOVE.L D1,-(SP) BRA mt_DoRetrig mt_PatternDelay TST.B mt_counter BNE mt_Return2 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 TST.B mt_PattDelTime2 BNE mt_Return2 ADDQ.B #1,D0 MOVE.B D0,mt_PattDelTime RTS mt_FunkIt TST.B mt_counter BNE mt_Return2 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 LSL.B #4,D0 AND.B #$0F,n_glissfunk(A6) OR.B D0,n_glissfunk(A6) TST.B D0 BEQ mt_Return2 mt_UpdateFunk MOVEM.L A0/D1,-(SP) MOVEQ #0,D0 MOVE.B n_glissfunk(A6),D0 LSR.B #4,D0 BEQ.S mt_funkend LEA mt_FunkTable(PC),A0 MOVE.B (A0,D0.W),D0 ADD.B D0,n_funkoffset(A6) BTST #7,n_funkoffset(A6) BEQ.S mt_funkend CLR.B n_funkoffset(A6) MOVE.L n_loopstart(A6),D0 MOVEQ #0,D1 MOVE.W n_replen(A6),D1 ADD.L D1,D0 ADD.L D1,D0 MOVE.L n_wavestart(A6),A0 ADDQ.L #1,A0 CMP.L D0,A0 BLO.S mt_funkok MOVE.L n_loopstart(A6),A0 mt_funkok MOVE.L A0,n_wavestart(A6) MOVEQ #-1,D0 SUB.B (A0),D0 MOVE.B D0,(A0) mt_funkend MOVEM.L (SP)+,A0/D1 RTS mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128 mt_VibratoTable dc.b 0, 24, 49, 74, 97,120,141,161 dc.b 180,197,212,224,235,244,250,253 dc.b 255,253,250,244,235,224,212,197 dc.b 180,161,141,120, 97, 74, 49, 24 mt_PeriodTable ; Tuning 0, Normal dc.w 856,808,762,720,678,640,604,570,538,508,480,453 dc.w 428,404,381,360,339,320,302,285,269,254,240,226 dc.w 214,202,190,180,170,160,151,143,135,127,120,113 ; Tuning 1 dc.w 850,802,757,715,674,637,601,567,535,505,477,450 dc.w 425,401,379,357,337,318,300,284,268,253,239,225 dc.w 213,201,189,179,169,159,150,142,134,126,119,113 ; Tuning 2 dc.w 844,796,752,709,670,632,597,563,532,502,474,447 dc.w 422,398,376,355,335,316,298,282,266,251,237,224 dc.w 211,199,188,177,167,158,149,141,133,125,118,112 ; Tuning 3 dc.w 838,791,746,704,665,628,592,559,528,498,470,444 dc.w 419,395,373,352,332,314,296,280,264,249,235,222 dc.w 209,198,187,176,166,157,148,140,132,125,118,111 ; Tuning 4 dc.w 832,785,741,699,660,623,588,555,524,495,467,441 dc.w 416,392,370,350,330,312,294,278,262,247,233,220 dc.w 208,196,185,175,165,156,147,139,131,124,117,110 ; Tuning 5 dc.w 826,779,736,694,655,619,584,551,520,491,463,437 dc.w 413,390,368,347,328,309,292,276,260,245,232,219 dc.w 206,195,184,174,164,155,146,138,130,123,116,109 ; Tuning 6 dc.w 820,774,730,689,651,614,580,547,516,487,460,434 dc.w 410,387,365,345,325,307,290,274,258,244,230,217 dc.w 205,193,183,172,163,154,145,137,129,122,115,109 ; Tuning 7 dc.w 814,768,725,684,646,610,575,543,513,484,457,431 dc.w 407,384,363,342,323,305,288,272,256,242,228,216 dc.w 204,192,181,171,161,152,144,136,128,121,114,108 ; Tuning -8 dc.w 907,856,808,762,720,678,640,604,570,538,508,480 dc.w 453,428,404,381,360,339,320,302,285,269,254,240 dc.w 226,214,202,190,180,170,160,151,143,135,127,120 ; Tuning -7 dc.w 900,850,802,757,715,675,636,601,567,535,505,477 dc.w 450,425,401,379,357,337,318,300,284,268,253,238 dc.w 225,212,200,189,179,169,159,150,142,134,126,119 ; Tuning -6 dc.w 894,844,796,752,709,670,632,597,563,532,502,474 dc.w 447,422,398,376,355,335,316,298,282,266,251,237 dc.w 223,211,199,188,177,167,158,149,141,133,125,118 ; Tuning -5 dc.w 887,838,791,746,704,665,628,592,559,528,498,470 dc.w 444,419,395,373,352,332,314,296,280,264,249,235 dc.w 222,209,198,187,176,166,157,148,140,132,125,118 ; Tuning -4 dc.w 881,832,785,741,699,660,623,588,555,524,494,467 dc.w 441,416,392,370,350,330,312,294,278,262,247,233 dc.w 220,208,196,185,175,165,156,147,139,131,123,117 ; Tuning -3 dc.w 875,826,779,736,694,655,619,584,551,520,491,463 dc.w 437,413,390,368,347,328,309,292,276,260,245,232 dc.w 219,206,195,184,174,164,155,146,138,130,123,116 ; Tuning -2 dc.w 868,820,774,730,689,651,614,580,547,516,487,460 dc.w 434,410,387,365,345,325,307,290,274,258,244,230 dc.w 217,205,193,183,172,163,154,145,137,129,122,115 ; Tuning -1 dc.w 862,814,768,725,684,646,610,575,543,513,484,457 dc.w 431,407,384,363,342,323,305,288,272,256,242,228 dc.w 216,203,192,181,171,161,152,144,136,128,121,114 mt_chan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0 mt_chan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0 mt_chan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0 mt_chan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0 mt_SampleStarts dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 mt_SongDataPtr dc.l 0 mt_speed dc.b 6 mt_counter dc.b 0 mt_SongPos dc.b 0 mt_PBreakPos dc.b 0 mt_PosJumpFlag dc.b 0 mt_PBreakFlag dc.b 0 mt_LowMask dc.b 0 mt_PattDelTime dc.b 0 mt_PattDelTime2 dc.b 0,0 mt_PatternPos dc.w 0 mt_DMACONtemp dc.w 0 ;/* End of File */ even ;qx bit.start dc.l 0 cop.start dc.l 0 gfxbase dc.l 0 kount dc.l 0 datapt1 dc.l 0 datapt2 dc.l 0 time1 dc.l 0 time2 dc.l 0 laptime1 dc.l 0 laptime2 dc.l 0 loopct1 dc.w 0 loopct2 dc.w 0 topbluex dc.w 0 botbluex dc.w 0 bluey dc.w 0 toppurpx dc.w 0 botpurpx dc.w 0 purpy dc.w 0 blueglobal dc.w 0 purpglobal dc.w 0 colreg dc.w 0 pexpl1 dc.w 0 pexpl2 dc.w 0 bexpl1 dc.w 0 bexpl2 dc.w 0 blacktable dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 fadetable dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 coltable dc.w $0000,$0def,$09ab,$0bcd,$0678,$0400,$0800,$0c00 dc.w $0000,$0667,$0445,$0223,$0000,$0000,$0000,$0000 dc.w $0000,$0fff,$007a,$0158,$0000,$0fff,$007a,$0158 dc.w $0000,$0fff,$0a7a,$0858,$0000,$0fff,$0a7a,$0858 coltable2 dc.w $0000,$0def,$0abc,$09ab,$089a,$0789,$0678,$0567 dc.w $0456,$0345,$0fff,$0000,$0000,$0000,$0102,$0204 dc.w $0306,$0408,$060b,$070d,$080f,$007a,$0058,$0a7a dc.w $0858,$0840,$0a70,$0da0,$0ff0,$0090,$0c40,$0fff coltable3 dc.w $0000,$0def,$0abc,$09ab,$089a,$0789,$0678,$0567 dc.w $0456,$0345,$0fff,$0000,$0000,$0000,$0102,$0204 dc.w $0306,$0408,$060b,$070d,$080f,$007a,$0058,$0a7a dc.w $0858,$0840,$0a70,$0da0,$0ff0,$0090,$0c40,$0b00 mapp dc.w $ffff,0,0,0,0,0,$ffff spd1 dc.b 0 spd2 dc.b 0 status1 dc.b 0 status2 dc.b 0 accel1 dc.b 0 accel2 dc.b 0 decel1 dc.b 0 decel2 dc.b 0 flag1 dc.b 0 flag2 dc.b 0 gameover dc.b 0 count1 dc.b 0 count2 dc.b 0 bluelaps dc.b 0 purplaps dc.b 0 bexdel dc.b 0 pexdel dc.b 0 nrg1 dc.b 0 nrg2 dc.b 0 bluedead dc.b 0 purpdead dc.b 0 tlap dc.b 1 tlevel dc.b 1 tacc dc.b 1 tdcc dc.b 1 gfxname dc.b "graphics.library",0,0 txlevel dc.b "TRACK NUMBER",0 txlap dc.b "LAPS TO RACE",0 txacc dc.b "ACCELERATION",0 txdcc dc.b "DECELERATION",0 nxlevel dc.b "00",0 nxlap dc.b "00",0 nxacc dc.b "00",0 nxdcc dc.b "00",0 btime1 dc.b "000000",0 btime2 dc.b "000000",0 blaptime1 dc.b "000000",0 blaptime2 dc.b "000000",0 blaps1 dc.b "00",0 blaps2 dc.b "00",0 fflag1 dc.b 0 fflag2 dc.b 0 map incbin df0:maps cavewall incbin df0:Turbocave.gfx turbotop incbin df0:Turbotop.gfx turbomenu incbin df0:Turbomenu.gfx turbores incbin df0:Turboresults.gfx turbobar incbin df0:Turbobar.gfx turboopts incbin df0:Turboopts.gfx raceover incbin df0:Turboover.gfx turbowin1 incbin df0:Turbowin1.gfx turbowin2 incbin df0:Turbowin2.gfx turbolose1 incbin df0:Turbolose1.gfx turbolose2 incbin df0:Turbolose2.gfx * Techfont 1. 0-9 '©.-,?! A-Z. 8x9 1 plane Alphabet dc.b 126,78,78,78,78,78,126,0 dc.b 24,24,24,24,24,24,24,0 dc.b 126,14,14,126,64,64,126,0 dc.b 126,14,14,62,14,14,126,0 dc.b 78,78,78,126,14,14,14,0 dc.b 126,64,64,126,14,14,126,0 dc.b 64,64,64,126,78,78,126,0 dc.b 126,14,14,14,14,14,14,0 dc.b 126,78,78,126,78,78,126,0 dc.b 126,78,78,126,14,14,14,0 dc.b 24,24,24,0,0,0,0,0 dc.b 60,66,90,82,90,66,60,0 dc.b 0,0,0,0,0,24,24,0 dc.b 0,0,0,126,0,0,0,0 dc.b 0,0,0,0,0,24,24,8 dc.b 126,14,14,30,0,24,24,0 dc.b 56,56,56,56,0,24,24,0 dc.b 126,114,114,126,114,114,114,0 dc.b 126,114,114,124,114,114,126,0 dc.b 126,112,112,112,112,112,126,0 dc.b 124,114,114,114,114,114,124,0 dc.b 126,112,112,124,112,112,126,0 dc.b 126,112,112,124,112,112,112,0 dc.b 126,112,112,118,114,114,126,0 dc.b 114,114,114,126,114,114,114,0 dc.b 60,24,24,24,24,24,60,0 dc.b 2,2,2,2,114,114,126,0 dc.b 114,114,114,124,114,114,114,0 dc.b 112,112,112,112,112,112,126,0 dc.b 66,102,122,114,114,114,114,0 dc.b 66,98,114,122,118,114,114,0 dc.b 126,114,114,114,114,114,126,0 dc.b 126,114,114,126,112,112,112,0 dc.b 126,114,114,114,114,118,126,0 dc.b 126,114,114,124,114,114,114,0 dc.b 126,112,112,126,2,2,126,0 dc.b 126,24,24,24,24,24,24,0 dc.b 114,114,114,114,114,114,126,0 dc.b 114,114,114,114,114,50,28,0 dc.b 114,114,114,114,122,102,66,0 dc.b 114,114,114,60,114,114,114,0 dc.b 114,114,114,60,24,24,24,0 dc.b 126,6,12,24,48,112,126,0 section "chipdata",data_c null dc.b 0,0,0,0,0,0,0,0,0,0 topblue1 dc.w $0000,$0000 dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2 dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3 dc.w $0000,$ff0f,$0000,$0000 topblue2 dc.w $0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818 dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000 dc.w $0030,$ffe0,$0000,$0000 botblue1 dc.w $0000,$0000 dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2 dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3 dc.w $0000,$ff0f,$0000,$0000 botblue2 dc.w $0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818 dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000 dc.w $0030,$ffe0,$0000,$0000 toppurp1 dc.w $0000,$0000 dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2 dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3 dc.w $0000,$ff0f,$0000,$0000 toppurp2 dc.w $0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818 dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000 dc.w $0030,$ffe0,$0000,$0000 botpurp1 dc.w $0000,$0000 dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2 dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3 dc.w $0000,$ff0f,$0000,$0000 botpurp2 dc.w $0000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818 dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000 dc.w $0030,$ffe0,$0000,$0000 Tiles ds.b 32 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 0,1,0,3,0,7,0,15,0,31,0,63,0,127,0,255 dc.b 1,255,3,255,7,255,15,255,31,255,63,255,127,255,255,255 dc.b 255,255,255,254,255,252,255,248,255,240,255,224,255,192,255,128 dc.b 255,0,254,0,252,0,248,0,240,0,224,0,192,0,128,0 dc.b 128,0,192,0,224,0,240,0,248,0,252,0,254,0,255,0 dc.b 255,128,255,192,255,224,255,240,255,248,255,252,255,254,255,255 dc.b 255,255,127,255,63,255,31,255,15,255,7,255,3,255,1,255 dc.b 0,255,0,127,0,63,0,31,0,15,0,7,0,3,0,1 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,3,0,15,0,63,0,255,3,255,15,255,63,255,255,255 dc.b 0,3,0,15,0,63,0,255,3,255,15,255,63,255,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 192,0,240,0,252,0,255,0,255,192,255,240,255,252,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 192,0,240,0,252,0,255,0,255,192,255,240,255,252,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,255,252,255,240,255,192,255,0,252,0,240,0,192,0 dc.b 255,255,255,252,255,240,255,192,255,0,252,0,240,0,192,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 255,255,63,255,15,255,3,255,0,255,0,63,0,15,0,3 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,63,255,15,255,3,255,0,255,0,63,0,15,0,3 dc.b 0,3,0,15,0,63,0,255,3,255,15,255,63,255,255,255 dc.b 255,255,63,255,15,255,3,255,0,255,0,63,0,15,0,3 dc.b 192,0,240,0,252,0,255,0,255,192,255,240,255,252,255,255 dc.b 255,255,255,252,255,240,255,192,255,0,252,0,240,0,192,0 dc.b 0,0,0,0,0,0,0,0,7,224,15,240,15,240,15,240 dc.b 15,240,15,240,15,240,7,224,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,15,0,255,15,255,255,255 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,15,0,255,15,255,255,255,255,255,255,255,255,255,255,255 dc.b 0,0,0,0,0,0,0,0,0,15,0,255,15,255,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 0,15,0,255,15,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 240,0,255,0,255,240,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 0,0,0,0,0,0,0,0,240,0,255,0,255,240,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 240,0,255,0,255,240,255,255,255,255,255,255,255,255,255,255 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,240,0,255,0,255,240,255,255 dc.b 255,255,15,255,0,255,0,15,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 255,255,255,255,255,255,255,255,255,255,15,255,0,255,0,15 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,15,255,0,255,0,15,0,0,0,0,0,0,0,0 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,15,255,0,255,0,15 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,255,255,255,255,255,255,255,255,255,240,255,0,240,0 dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 dc.b 255,255,255,240,255,0,240,0,0,0,0,0,0,0,0,0 dc.b 255,255,255,255,255,255,255,255,255,255,255,240,255,0,240,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 255,255,255,240,255,0,240,0,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Engine incbin df0:Turboengine.snd Modmain incbin df0:mod.invasion Modend incbin df0:mod.gameover