; STARTREKKER 1.2 8 CHANNEL REPLAYER ; BY BJOERN WESEN / EXOLON OF FAIRLIGHT ; This player takes quite a lot of rastertime... (And it could use a ; bit more optimizing) But I made it so no one should complain. ; To use, call mt8_init, and call mt8_music first among your raster ; routines. mt8_music waits for the raster itself, so you should not ; do that. This is important, again, call mt8_music first and then your ; own routines. To finish, call mt8_end. ; NOTE! DON'T call mt8_music from a vblank interrupt. In fact, shut off ; all interrupts when using this player... ; The mt8_data doesn't have to be in CHIP mem, it can be as well in ; fast mem. ; HOWEVER the mt8_buf0 and others have to reside in CHIP mem. Therefore ; the ORG below. mt8_data: EQU $40000 ORG $35000 LOAD $35000 TESTPLAY: move.w #$4000,$dff09a bsr mt8_init loop: bsr mt8_music btst #6,$bfe001 bne.s loop bsr mt8_end move.w #$c000,$dff09a rts mt8_init: lea mt8_data+$3b8,a1 moveq #$7f,d0 moveq #0,d1 mt8_l1: move.l d1,d2 subq.w #1,d0 mt8_l2: move.b (a1)+,d1 cmp.b d2,d1 bgt.s mt8_l1 dbra d0,mt8_l2 addq.b #2,d2 lea mt8_samplestarts,a1 lsl.l #8,d2 lsl.l #2,d2 lea mt8_data,a2 lea 42(a2),a0 add.l d2,a2 add.w #$43c,a2 moveq #31,d0 mt8_il: move.l a2,(a1)+ moveq #0,d1 move.w (a0),d1 add.l d1,d1 add.l d1,a2 add.w #$1e,a0 dbra d0,mt8_il lea mt8_buf0,a0 move.w #697,d0 mt8_clr:clr.l (a0)+ dbra d0,mt8_clr move.w #6,mt8_speed move.w #1,mt8_speedcnt clr.w mt8_songpos clr.w mt8_doublebuf bsr mt8_gtsongpos move.w #$f,$dff096 move.l #mt8_buf0,$dff0a0 move.l #mt8_buf1,$dff0b0 move.l #mt8_buf2,$dff0c0 move.l #mt8_buf3,$dff0d0 move.w #313,d0 move.w d0,$dff0a4 move.w d0,$dff0b4 move.w d0,$dff0c4 move.w d0,$dff0d4 move.w #227,d0 move.w d0,$dff0a6 move.w d0,$dff0b6 move.w d0,$dff0c6 move.w d0,$dff0d6 moveq #64,d0 move.w d0,$dff0a8 move.w d0,$dff0b8 move.w d0,$dff0c8 move.w d0,$dff0d8 mt8_fw2:move.l $dff004,d0 lsr.l #8,d0 and.w #$1ff,d0 cmp.w #301,d0 bne.s mt8_fw2 move.w #$800f,$dff096 rts mt8_end:move.w #$f,$dff096 clr.w $dff0a8 clr.w $dff0b8 clr.w $dff0c8 clr.w $dff0d8 bclr #1,$bfe001 rts mt8_music: move.l $dff004,d0 lsr.l #8,d0 and.w #$1ff,d0 cmp.w #301,d0 bne.s mt8_music subq.w #1,mt8_speedcnt beq.s mt8_dor bra mt8_zup mt8_dor:move.w mt8_speed,mt8_speedcnt add.l #16,mt8_trackpos add.l #16,mt8_trackpos2 lea mt8_samplestarts-4,a0 lea mt8_data+42,a1 lea mt8_voice1,a3 lea $dff0a8,a6 lea mt8_oldins,a4 move.l mt8_trackpos,a2 moveq #7,d7 mt8_voiceloop: moveq #0,d0 move.b d0,d3 move.b 2(a2),d0 and.b #$f,d0 beq mt8_ncm cmp.b #$f,d0 ; tempo change bne.s mt8_nsc move.b 3(a2),mt8_speed+1 bra mt8_ncm mt8_nsc:cmp.b #$d,d0 ; pattern break bne.s mt8_npq st mt8_pbflag bra mt8_ncm mt8_npq:cmp.b #$c,d0 ; volume change bne.s mt8_nvc move.b 3(a2),1(a6) move.b 3(a2),25(a3) st d3 bra mt8_ncm mt8_nvc:cmp.b #$1,d0 ; picth up bne.s mt8_nfu moveq #0,d0 move.b 3(a2),d0 lsl.w #7,d0 add.l d0,8(a3) bra mt8_ncm mt8_nfu:cmp.b #$2,d0 ; pitch down bne.s mt8_nfd moveq #0,d0 move.b 3(a2),d0 lsl.w #7,d0 sub.l d0,8(a3) bra mt8_ncm mt8_nfd:cmp.b #$a,d0 ; volume slide bne.s mt8_nvs move.w (a2),d0 and.w #$fff,d0 bne.s mt8_n64 move.w #64,24(a3) mt8_n64:moveq #0,d0 move.b 3(a2),d0 move.w d0,d1 and.w #$f,d0 add.w d0,d0 and.w #$f0,d1 lsr.w #3,d1 add.w d1,24(a3) sub.w d0,24(a3) bpl.s mt8_vm1 clr.w 24(a3) bra.s mt8_vm2 mt8_vm1:cmp.w #64,24(a3) ble.s mt8_vm2 move.w #64,24(a3) mt8_vm2:move.w 24(a3),(a6) st d3 bra mt8_ncm mt8_nvs:cmp.b #$4,d0 ; vibrato bne mt8_ncm move.b 3(a2),d0 beq.s mt8_nv2 move.b d0,26(a3) move.l 8(a3),28(a3) mt8_nv2:move.b 27(a3),d0 lsr.w #2,d0 and.w #$1f,d0 moveq #0,d2 move.l a4,-(sp) lea mt8_sin,a4 move.b (a4,d0.w),d2 move.l (sp)+,a4 sub.b #128,d2 ext.w d2 move.b 26(a3),d0 and.w #$f,d0 muls d0,d2 move.l 28(a3),d0 add.l d2,d0 move.l d0,8(a3) move.b 26(a3),d0 lsr.w #2,d0 and.w #$3c,d0 add.b d0,27(a3) mt8_ncm:move.w (a2),d0 and.w #$fff,d0 beq mt8_nxt move.b #$22,26(a3) tst.b d3 bne mt8_vas move.w #64,(a6) move.w #64,24(a3) mt8_vas:move.l #227*16384,d1 divu d0,d1 swap d1 clr.w d1 swap d1 add.l d1,d1 add.l d1,d1 move.l d1,8(a3) move.l d1,28(a3) moveq #0,d0 move.b 2(a2),d0 lsr.b #4,d0 btst #7,(a2) beq.s mt8_n10 add.b #16,d0 mt8_n10:tst.w d0 bne.s mt8_nsa move.w (a4),d0 bra.s mt8_nas mt8_nsa:move.w d0,(a4) mt8_nas:move.w d0,d1 subq.b #1,d1 add.w d0,d0 add.w d0,d0 move.l (a0,d0.w),d2 move.l d2,(a3) mulu #$1e,d1 move.w (a1,d1.w),d0 add.l d0,d0 sub.l #313,d0 bpl.s mt8_sma move.l #313,d0 mt8_sma:add.l d2,d0 move.l d0,4(a3) tst.w 4(a1,d1.w) beq.s mt8_nir move.l (a3),12(a3) moveq #0,d0 move.w 4(a1,d1.w),d0 add.l d0,d0 sub.l #313,d0 bpl.s mt8_sm2 move.l #313,d0 mt8_sm2:add.l d0,12(a3) move.w 6(a1,d1.w),d0 add.l d0,d0 move.l d0,16(a3) bra.s mt8_nxt mt8_nir:clr.l 12(a3) clr.l 16(a3) clr.l 20(a3) mt8_nxt:cmp.w #4,d7 bne.s mt8_chp lea $dff0a8,a6 move.l mt8_trackpos2,a2 bra.s mt8_urk mt8_chp:add.w #$10,a6 addq.w #4,a2 mt8_urk:addq.w #2,a4 lea 36(a3),a3 dbra d7,mt8_voiceloop tst.w mt8_pbflag bne.s mt8_pb addq.w #1,mt8_patpos cmp.w #64,mt8_patpos bne.s mt8_zup mt8_pb: clr.w mt8_pbflag addq.w #1,mt8_songpos mt8_gtsongpos: clr.w mt8_patpos lea mt8_data,a0 move.w mt8_songpos,d0 cmp.b $3b6(a0),d0 blt.s mt8_grz clr.b mt8_songpos move.b $3b7(a0),mt8_songpos+1 mt8_grz:move.w mt8_songpos,d0 lea mt8_data+$3b8,a0 moveq #0,d1 move.b (a0,d0.w),d1 lsl.l #8,d1 lsl.l #2,d1 add.l #mt8_data+$43c-16,d1 move.l d1,mt8_trackpos add.l #1024,d1 move.l d1,mt8_trackpos2 mt8_zup:move.w mt8_doublebuf,d5 eor.w #313,mt8_doublebuf mt8_zip:lea mt8_voices,a2 movem.l (a2)+,a3-a4 lea mt8_buf0,a5 add.w d5,a5 bsr mt8_makebuffer movem.l (a2)+,a3-a4 lea mt8_buf1,a5 add.w d5,a5 bsr mt8_makebuffer movem.l (a2)+,a3-a4 lea mt8_buf2,a5 add.w d5,a5 bsr mt8_makebuffer movem.l (a2)+,a3-a4 lea mt8_buf3,a5 add.w d5,a5 bsr mt8_makebuffer rts mt8_gs: macro move.b (a0,d0.w),d4 ext.w d4 move.b (a1,d1.w),d6 ext.w d6 add.w d6,d4 asr.w #1,d4 move.b d4,(a5)+ swap d0 swap d1 add.l d2,d0 add.l d3,d1 swap d0 swap d1 endm mt8_makebuffer: move.l (a3),d0 cmp.l 4(a3),d0 bcs.s mt8_sun tst.l 12(a3) beq.s mt8_nr1 move.l 12(a3),d0 move.l d0,(a3) move.l 16(a3),4(a3) add.l d0,4(a3) bra.s mt8_sun mt8_nr1:clr.l (a3) clr.l 4(a3) clr.l 8(a3) mt8_sun:move.l (a4),d0 cmp.l 4(a4),d0 bcs.s mt8_pbx tst.l 12(a4) beq.s mt8_nr2 move.l 12(a4),d0 move.l d0,(a4) move.l 16(a4),4(a4) add.l d0,4(a4) bra.s mt8_pbx mt8_nr2:clr.l (a4) clr.l 4(a4) clr.l 8(a4) mt8_pbx:move.l (a3),a0 move.l 8(a3),d2 move.l (a4),a1 move.l 8(a4),d3 moveq #0,d0 moveq #0,d1 mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs mt8_gs add.w d0,a0 add.w d1,a1 move.l a0,(a3) move.l a1,(a4) rts mt8_speed: dc.w 0 mt8_speedcnt: dc.w 0 mt8_songpos: dc.w 0 mt8_trackpos: dc.l 0 mt8_trackpos2: dc.l 0 mt8_patpos: dc.w 0 mt8_pbflag: dc.w 0 mt8_doublebuf: dc.w 0 mt8_voices: dc.l mt8_voice1,mt8_voice5,mt8_voice2,mt8_voice6 dc.l mt8_voice3,mt8_voice7,mt8_voice4,mt8_voice8 mt8_oldins: blk.w 8,0 mt8_sin: dc.b 128,153,177,199,219,234,246,254,255,254,246 dc.b 234,219,199,177,153,128,103,79,57,37,22,9,2,0 dc.b 2,9,22,37,57,79,103 mt8_samplestarts: blk.l 31,0 mt8_buf0: blk.w 313,0 mt8_buf1: blk.w 313,0 mt8_buf2: blk.w 313,0 mt8_buf3: blk.w 313,0 mt8_voice1: blk.w 18,0 mt8_voice2: blk.w 18,0 mt8_voice3: blk.w 18,0 mt8_voice4: blk.w 18,0 mt8_voice5: blk.w 18,0 mt8_voice6: blk.w 18,0 mt8_voice7: blk.w 18,0 mt8_voice8: blk.w 18,0 .