* * - SoundTracker pro playroutine - * * To use this playroutine you have to take the following steps: * * - At the end of this source you will see labels named * song,sample1,sample2,...,sample15, followed by * blk.b $. * Fill in the length in bytes of the songdata and the samples * behind the $-sign * If you don't use one of the samples set its length to zero * * - Assemble the source * * - Load the song and the samples with the ri command: * SEKA>ri * FILENAME>songname * START>song * END> * SEKA>ri * FILENAME>sample1 * START>sample1 * END> * SEKA> * etc... * * - Write the object file with the wo command. * * READY ! * (make sure you load the samples into chip mem) * * To all who want to use this playroutine as part of their * own program: * * Because Soundtracker pro uses speeds with a resolution of 1/4 * the subroutine 'playmusic' must be called four times per * display build-up. * You should spread these four times evenly,so for PAL-mode * this would mean the vertical blanking area and raster lines * $4f,$9e and $ed * * If you don't use speeds of 1/4 or 3/4 you can call the routine * twice during the vertical blanking period,and twice at raster * line $9e. * * If you don't use speeds of 1/4,1/2 or 3/4 you can call the * routine four times during the vertical blanking period, * or any other raster line * Only one of these four times will the notes actually be played * so your interupt code can still be fast. * * Before playing the music you must call 'initmusic' start: bsr initmusic move.l $6c,a0 move.l $2230,a1 move.l #level3int,$6c waitforbutton: btst #10,$dff016 ; RIGHT button bne waitforbutton move.l a0,$6c move.l a1,$2230 move.w #$000f,$dff096 ; DMA off rts ******** actually you should use graphicsbase+$32 ******** instead of $2230. initmusic: move.w #$0400,label72 clr.l d0 move.b song+$1d7,d0 cmp.b #64,d0 bgt lengthok mulu #$10,d0 move.w d0,label72 lengthok: move.l #6,label64 clr.w label66 clr.l label68 clr.l label69 lea $dff0a8,a0 clr.w (a0) clr.w $10(a0) clr.w $20(a0) clr.w $30(a0) lea label73,a0 move.l #15,d0 clearloop: move.l (a0)+,a1 clr.l (a1) dbf d0,clearloop rts coplist: dc.w $0180,0 dc.w $4f01,$ff00 dc.w $009a,$8010 dc.w $009c,$8010 dc.w $5001,$ff00 dc.w $0180,$0800 dc.w $5101,$ff00 dc.w $0180,$0c00 dc.w $5201,$ff00 dc.w $0180,$0f00 dc.w $5301,$ff00 dc.w $0180,$0c00 dc.w $5401,$ff00 dc.w $0180,$0800 dc.w $5501,$ff00 dc.w $0180,0 dc.w $9e01,$ff00 dc.w $009a,$8010 dc.w $009c,$8010 dc.w $9f01,$ff00 dc.w $0180,$0555 dc.w $a001,$ff00 dc.w $0180,$0999 dc.w $a101,$ff00 dc.w $0180,$0ccc dc.w $a201,$ff00 dc.w $0180,$0999 dc.w $a301,$ff00 dc.w $0180,$0555 dc.w $a401,$ff00 dc.w $0180,0 dc.w $ed01,$ff00 dc.w $009a,$8010 dc.w $009c,$8010 dc.w $ee01,$ff00 dc.w $0180,$0008 dc.w $ef01,$ff00 dc.w $0180,$000b dc.w $f001,$ff00 dc.w $0180,$000f dc.w $f101,$ff00 dc.w $0180,$000b dc.w $f201,$ff00 dc.w $0180,$0008 dc.w $f301,$ff00 dc.w $0180,0 dc.w $ffff,$fffe level3int: move.l #coplist,$2230 MOVEM.L D0-D1/A0-A1/A5-A6,-(A7) LEA $00DFF000,A0 MOVE.L $00000004,A6 MOVE.W $001C(A0),D1 BTST #$0E,D1 BEQ level3end AND.W $001E(A0),D1 BTST #$06,D1 BEQ blitternotfinished MOVEM.L $009C(A6),A1/A5 PEA -$0024(A6) JMP (A5) blitternotfinished: BTST #$05,D1 BEQ noblank MOVEM.L D0-D7/A0-A6,-(A7) bsr playmusic MOVEM.L (A7)+,D0-D7/A0-A6 MOVEM.L $0090(A6),A1/A5 PEA -$0024(A6) JMP (A5) noblank:BTST #$04,D1 BEQ level3end MOVEM.L D0-D7/A0-A6,-(A7) bsr playmusic movem.l (a7)+,d0-d7/a0-a6 MOVEM.L $0084(A6),A1/A5 PEA -$0024(A6) JMP (A5) level3end: MOVEM.L (A7)+,D0-D1/A0-A1/A5-A6 RTE playmusic: subq.w #1,label64 bpl label1 move.w #3,label64 bra label2 label1: rts label2: tst.w label70 bne label3 bsr label38 label3: addq.w #1,label70 move.w label70,d0 cmp.w label65,d0 blt.s label4 clr.w label70 move.w label66,d0 add.w d0,label64 bra.L label35 label4: lea label74,a6 move.l #$dff0a0,a5 bsr label10 tst.b 3(a6) beq.s label5 bsr.s label9 label5: lea label75,a6 move.l #$dff0b0,a5 bsr label10 tst.b 3(a6) beq.s label6 bsr.s label9 label6: lea label76,a6 move.l #$dff0c0,a5 bsr label10 tst.b 3(a6) beq.s label7 bsr.s label9 label7: lea label77,a6 move.l #$dff0d0,a5 bsr label10 tst.b 3(a6) beq.s label8 bsr.s label9 label8: bra.L label44 label9: move.b 2(a6),d0 and.b #$0f,d0 tst.b d0 beq.L label28 cmp.b #1,d0 beq label17 cmp.b #2,d0 beq label21 rts label10:btst #2,26(a6) bne label16 btst #3,26(a6) bne label20 rts label11:move.b 3(a6),19(a6) rts label12:and.w #$00ff,d0 mulu label67,d0 lsr.l #6,d0 move.w d0,8(a5) rts label13:move.b 3(a6),d0 lsr.w #4,d0 and.w #$f,d0 cmp.w #2,d0 blt label14 move.w d0,label65 move.b 3(a6),d0 and.w #$3,d0 move.w d0,label66 label14:rts label15:move.b 3(a6),d0 and.b #$01,d0 lsl.b #1,d0 eor.b #2,d0 and.b #$fd,$bfe001 or.b d0,$bfe001 rts label16:clr.w d0 move.b 24(a6),d0 bra label18 label17:and.b #%11110000,26(a6) clr.w d0 move.b 3(a6),d0 label18:sub.w d0,22(a6) cmp.w #$71,22(a6) bpl.s label19 move.w #$71,22(a6) label19:move.w 22(a6),6(a5) rts label20:clr.w d0 move.b 24(a6),d0 bra label22 label21:and.b #%11110000,26(a6) clr.w d0 move.b 3(a6),d0 label22:add.w d0,22(a6) cmp.w #$358,22(a6) bmi.s label23 move.w #$358,22(a6) label23:move.w 22(a6),6(a5) rts label24:clr.w d0 move.b 3(a6),d0 label25:move.w d0,d2 lsr.b #4,d0 and.b #$0f,d2 add.w d2,18(a6) sub.w d0,18(a6) bmi label27 cmp.w #$40,18(a6) ble label26 move.w #$40,18(a6) label26:rts label27:clr.w 18(a6) rts label28:cmp.w #1,label70 beq.s label29 cmp.w #2,label70 beq.s label30 cmp.w #3,label70 beq.s label31 cmp.w #4,label70 beq.s label29 cmp.w #5,label70 beq.s label30 rts label29:clr.l d0 move.b 3(a6),d0 lsr.b #4,d0 bra.s label32 label30:clr.l d0 move.b 3(a6),d0 and.b #$0f,d0 bra.s label32 label31:move.w 16(a6),d2 bra.s label34 label32:lsl.w #1,d0 move.w 16(a6),d3 lea label78,a0 label33:move.w (a0,d0),d2 cmp.w (a0)+,d3 bne label33 label34:move.w d2,6(a5) rts label35:lea song,a0 move.l a0,a3 add.l #$0c,a3 move.l a0,a2 add.l #$1d8,a2 add.l #$258,a0 move.l label69,d0 clr.l d1 move.b (a2,d0),d1 mulu label72,d1 add.l label68,d1 clr.w label71 move.l #$dff0a0,a5 lea label74,a6 bsr.L label45 move.l #$dff0b0,a5 lea label75,a6 bsr.L label45 move.l #$dff0c0,a5 lea label76,a6 bsr.L label45 move.l #$dff0d0,a5 lea label77,a6 bsr.L label45 move.b label77+27,d0 beq label36 bsr label61 label36:bsr label59 move.l #$1f4,d0 label37:dbf d0,label37 move.w label71,d0 or.w #$8000,d0 move.w d0,$dff096 bra label43 label38:lea label77,a6 tst.w (a6) beq label39 move.w 14(a6),$dff0d4 cmp.w #1,14(a6) beq label39 move.l 10(a6),$dff0d0 label39:lea label76,a6 tst.w (a6) beq label40 move.w 14(a6),$dff0c4 cmp.w #1,14(a6) beq label40 move.l 10(a6),$dff0c0 label40:lea label75,a6 tst.w (a6) beq label41 move.w 14(a6),$dff0b4 cmp.w #1,14(a6) beq label41 move.l 10(a6),$dff0b0 label41:lea label74,a6 tst.w (a6) beq label42 move.w 14(a6),$dff0a4 cmp.w #1,14(a6) beq label42 move.l 10(a6),$dff0a0 label42:rts label43:move.l label68,d0 add.l #$10,d0 move.l d0,label68 cmp.w label72,d0 bne.s label44 clr.l label68 addq.l #1,label69 clr.l d0 move.b song+$1d6,d0 move.l label69,d1 cmp.l d0,d1 blt.s label44 clr.l label69 label44:rts label45:move.l (a0,d1),(a6) addq.l #4,d1 clr.l d2 move.b 2(a6),d2 lsr.b #4,d2 tst.b d2 beq.s label46 clr.l d3 lea label73-4,a1 move.l d2,d4 mulu #4,d2 mulu #$1e,d4 move.l (a1,d2),4(a6) move.w (a3,d4),8(a6) move.w 2(a3,d4),18(a6) clr.b 25(a6) move.w 4(a3,d4),d3 move.l 4(a6),d2 add.l d3,d2 move.l d2,10(a6) move.w 6(a3,d4),14(a6) label46:tst.w (a6) beq.s label47 move.w (a6),16(a6) move.w (a6),22(a6) and.b #%11110000,26(a6) move.w 20(a6),$dff096 move.l 4(a6),(a5) move.w 8(a6),4(a5) move.w (a6),6(a5) move.w 20(a6),d0 or.w d0,label71 label47:move.w 20(a6),d0 lsl.w #4,d0 add.w 20(a6),d0 move.w d0,$dff09e bsr label49 clr.w d0 move.b 25(a6),d0 beq label48 bsr label25 label48:btst #0,26(a6) bne label16 btst #1,26(a6) bne label20 rts label49:move.b 2(a6),d0 and.b #$0f,d0 cmp.b #3,d0 beq label51 cmp.b #4,d0 beq label52 cmp.b #5,d0 beq label53 cmp.b #6,d0 beq label54 cmp.b #7,d0 beq label57 cmp.b #8,d0 beq label60 cmp.b #9,d0 beq label17 cmp.b #$a,d0 beq label21 cmp.b #$b,d0 beq label50 cmp.b #$c,d0 beq label11 cmp.b #$d,d0 beq label24 cmp.b #$e,d0 beq label15 cmp.b #$f,d0 beq label13 rts label50:move.b 3(a6),25(a6) rts label51:move.b #$0001,d0 bra label55 label52:move.b #%0010,d0 bra label55 label53:move.b #%0101,d0 bra label55 label54:move.b #%1010,d0 label55:and.b #$f0,26(a6) or.b d0,26(a6) move.b 3(a6),24(a6) bne label56 clr.b 26(a6) label56:rts label57:clr.w d0 move.b 3(a6),d0 cmp.w #$40,d0 ble label58 move.w #$40,d0 label58:move.w d0,label67 clr.b label77+27 rts label59:move.l #$dff0a0,a5 move.w label74+18,d0 bsr label12 move.l #$dff0b0,a5 move.w label75+18,d0 bsr label12 move.l #$dff0c0,a5 move.w label76+18,d0 bsr label12 move.l #$dff0d0,a5 move.w label77+18,d0 bsr label12 rts label60:move.b 3(a6),label77+27 rts label61:clr.w d0 move.b label77+27,d0 move.w d0,d2 lsr.b #4,d0 and.b #$0f,d2 add.w d2,label67 sub.w d0,label67 bmi label63 cmp.w #$40,label67 ble label62 move.w #$40,label67 label62:rts label63:clr.w label67 rts label64:dc.w 0 label65:dc.w 6 label66:dc.w 0 label67:dc.w $40 label68:dc.l 0 label69:dc.l 0 label70:dc.w 0 label71:dc.w 0 label72:dc.w $400 label73:dc.l sample1 dc.l sample2 dc.l sample3 dc.l sample4 dc.l sample5 dc.l sample6 dc.l sample7 dc.l sample8 dc.l sample9 dc.l sample10 dc.l sample11 dc.l sample12 dc.l sample13 dc.l sample14 dc.l sample15 label74:dc.l 0,0,0,0 dc.w 0,0,1,0,0,0 label75:dc.l 0,0,0,0 dc.w 0,0,2,0,0,0 label76:dc.l 0,0,0,0 dc.w 0,0,4,0,0,0 label77:dc.l 0,0,0,0 dc.w 0,0,8,0,0,0 label78:dc.w $0358,$0328,$02FA,$02D0,$02A6,$0280,$025C,$023A dc.w $021A,$01FC,$01E0,$01C5,$01AC,$0194,$017D,$0168 dc.w $0153,$0140,$012E,$011D,$010D,$00FE,$00F0,$00E2 dc.w $00D6,$00CA,$00BE,$00B4,$00AA,$00A0,$0097,$008F dc.w $0087,$007F,$0078,$0071,$0000 song: blk.b $ even ; sample1: blk.b $ even ; sample2: blk.b $ even ; sample3: blk.b $ even ; sample4: blk.b $ even ; sample5: blk.b $ even ; sample6: blk.b $ even ; sample7: blk.b $ even ; sample8: blk.b $ even ; sample9: blk.b $ even ; sample10: blk.b $ even ; sample11: blk.b $ even ; sample12: blk.b $ even ; sample13: blk.b $ even ; sample14: blk.b $ even ; sample15: blk.b $  .