home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 5
/
FreshFish_July-August1994.bin
/
bbs
/
mus
/
delitracker-2.01.lha
/
DeliTracker
/
Files
/
developer.lha
/
Developer
/
Examples
/
QCReplay.s
< prev
next >
Wrap
Text File
|
1994-04-15
|
24KB
|
1,248 lines
incdir "Includes:"
include "misc/DeliPlayer.i"
;
;
SECTION Player,Code
;
;
PLAYERHEADER PlayerTagArray
dc.b '$VER: QuadraComposer 2.0 player module V0.8 (18 Mar 94)',0
even
PlayerTagArray
dc.l DTP_RequestDTVersion,16
dc.l DTP_PlayerVersion,00<<16+80
dc.l DTP_PlayerName,PName
dc.l DTP_Creator,CName
dc.l DTP_DeliBase,delibase
dc.l DTP_Check2,Chk
dc.l DTP_CheckLen,ChkLen
dc.l DTP_Interrupt,Int
dc.l DTP_InitPlayer,InitPlay
dc.l DTP_EndPlayer,EndPlay
dc.l DTP_InitSound,InitSnd
dc.l DTP_EndSound,EndSnd
dc.l TAG_DONE
*-----------------------------------------------------------------------*
;
; Player/Creatorname und lokale Daten
PName dc.b 'QuadraComposer',0
CName dc.b 'Copyright © 1993 Technological ArtWork',10
dc.b '(Bo Lincoln & Calle Englund)',10
dc.b 'adapted by Delirium',0
even
delibase dc.l 0
*-----------------------------------------------------------------------*
;
;Interrupt für Replay
Int
movem.l d2-d7/a2-a6,-(sp)
bsr QC_music ; DudelDiDum
movem.l (sp)+,d2-d7/a2-a6
rts
*-----------------------------------------------------------------------*
;
; Testet auf Modul
Chk ; QuadraComposer ?
move.l dtg_ChkData(a5),a0
moveq #-1,d0 ; Modul nicht erkannt (default)
cmp.l #"FORM",(a0)
bne.s ChkEnd
cmp.l #"EMOD",8(a0)
bne.s ChkEnd
cmp.l #"EMIC",12(a0)
bne.s ChkEnd
cmp.w #1,20(a0)
bne.s ChkEnd
moveq #0,d0 ; Modul erkannt
ChkEnd
rts
ChkLen = *-Chk
*-----------------------------------------------------------------------*
;
; Init Player
InitPlay
moveq #0,d0
move.l dtg_GetListData(a5),a0 ; Function
jsr (a0)
move.l a0,QC_data
bsr QC_rel
move.l dtg_AudioAlloc(a5),a0 ; Function
jsr (a0) ; returncode is already set !
rts
*-----------------------------------------------------------------------*
;
; End Player
EndPlay
move.l dtg_AudioFree(a5),a0 ; Function
jsr (a0)
rts
*-----------------------------------------------------------------------*
;
; Init Module
InitSnd
bsr QC_init
rts
*-----------------------------------------------------------------------*
;
; Clean up Module
EndSnd
bsr QC_end
rts
*-----------------------------------------------------------------------*
;
; QuadraComposer2.0-Replay
* This replayroutine was written by Bo Lincoln (Eternal).
* Copyright © 1993 Technological Artwork. All rights reserved.
* You may use this routine in your programs.
* This is the normal routine.
* Worst case is about 20(?) rasterlines.
* How to use: Call QC_init to init the mod.
* Call QC_music every vertical blank.
* Call QC_end to stop.
* The EMOD should be at QC_data.
* You can not use Tempo in this routine.
QC_rel: move.l QC_data(pc),a0 ;Check if the module is ok
cmp.l #"FORM",(a0)
bne QC_relerr
cmp.l #"EMOD",8(a0)
bne QC_relerr
cmp.l #"EMIC",12(a0)
bne QC_relerr
cmp.w #1,20(a0)
bne QC_relerr
; or.b #$2,$bfe001
moveq #0,d7 ;Get the adresses to the sampleinfos
move.b 63(a0),d7 ;and init the real adresses in the infos
subq #1,d7
move.l QC_data(pc),d1
lea 64(a0),a0
lea QC_samplepointers(pc),a1
QC_sploop:moveq #0,d0
move.b (a0),d0
add.w d0,d0
add.w d0,d0
move.l a0,(a1,d0.w)
add.l d1,30(a0)
move.l 30(a0),a2
clr.w (a2)
lea 34(a0),a0
dbf d7,QC_sploop
lea QC_patternpointers(pc),a1 ;Get the patternadresses
moveq #0,d7
addq #1,a0
move.b (a0)+,d7
subq #1,d7
move.l QC_data(pc),d1
QC_pploop:moveq #0,d0
move.b (a0),d0
add.w d0,d0
add.w d0,d0
move.l a0,(a1,d0.w)
add.l d1,22(a0)
lea 26(a0),a0
dbf d7,QC_pploop
clr.w QC_nrofpos
move.b (a0)+,QC_nrofpos+1
move.l a0,QC_posstart
moveq #0,d0
QC_relerr:moveq #-1,d0
rts
QC_init:move.l QC_posstart(pc),a0
lea QC_patternpointers(pc),a1
moveq #0,d0
move.b (a0),d0
add.w d0,d0
add.w d0,d0
move.l (a1,d0.w),a1
move.l 22(a1),QC_currpattpointer
move.b 1(a1),QC_breakrow+1
move.w #6,QC_speed
move.w QC_speed(pc),QC_speedcount
clr.b QC_newposflag
clr.w QC_rowcount
clr.w QC_pos
move.w #1,t_length+QC_chan1
move.w #1,t_length+QC_chan2
move.w #1,t_length+QC_chan3
move.w #1,t_length+QC_chan4
move.w #1,t_replen+QC_chan1
move.w #1,t_replen+QC_chan2
move.w #1,t_replen+QC_chan3
move.w #1,t_replen+QC_chan4
QC_end:
moveq #0,d0
lea $dff000,a0
move.w d0,$a8(a0)
move.w d0,$b8(a0)
move.w d0,$c8(a0)
move.w d0,$d8(a0)
move.w #$f,$96(a0)
rts
QC_music:
addq.w #1,QC_speedcount
move.w QC_speed,d0
cmp.w QC_speedcount,d0
bgt QC_nonew
tst.b QC_pattwait
beq QC_getnotes
subq.b #1,QC_pattwait
clr.w QC_speedcount
QC_nonew:lea QC_samplepointers(pc),a4
lea QC_periods(pc),a3
lea QC_chan1(pc),a6
lea $dff0a0,a5
bsr QC_chkplayfx
lea QC_chan2-QC_chan1(a6),a6
lea $10(a5),a5
bsr QC_chkplayfx
lea QC_chan2-QC_chan1(a6),a6
lea $10(a5),a5
bsr QC_chkplayfx
lea QC_chan2-QC_chan1(a6),a6
lea $10(a5),a5
bsr QC_chkplayfx
tst.w QC_dmacon
beq QC_mend
move.w QC_dmacon(pc),$dff096
move.l a0,-(sp)
move.l delibase(pc),a0 ; added by Delirium
move.l dtg_WaitAudioDMA(a0),a0
jsr (a0)
move.l (sp)+,a0
or.w #$8000,QC_dmacon
move.w QC_dmacon(pc),$dff096
move.l a0,-(sp)
move.l delibase(pc),a0 ; added by Delirium
move.l dtg_WaitAudioDMA(a0),a0
jsr (a0)
move.l (sp)+,a0
clr.w QC_dmacon
lea QC_chan1+t_repeat(pc),a0
lea $dff000,a5
move.l (a0),$a0(a5)
move.w 4(a0),$a4(a5)
move.l QC_chan2-QC_chan1(a0),$b0(a5)
move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
move.l QC_chan3-QC_chan1(a0),$c0(a5)
move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
move.l QC_chan4-QC_chan1(a0),$d0(a5)
move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
rts
QC_chkplayfx:
lea QC_playfx(pc),a2
move.b t_cmd(a6),d0
and.w #$f,d0
add.w d0,d0
add.w d0,d0
move.l (a2,d0.w),a0
jmp (a0)
QC_getnotes:
clr.w QC_speedcount
move.l QC_currpattpointer(pc),a0
move.w QC_rowcount(pc),d0
asl.w #4,d0
add.w d0,a0
lea QC_samplepointers(pc),a4
lea QC_periods(pc),a3
lea $dff0a0,a5
lea QC_chan1(pc),a6
bsr QC_playnote
lea $10(a5),a5
lea QC_chan2-QC_chan1(a6),a6
bsr QC_playnote
lea $10(a5),a5
lea QC_chan2-QC_chan1(a6),a6
bsr QC_playnote
lea $10(a5),a5
lea QC_chan2-QC_chan1(a6),a6
bsr QC_playnote
tst.w QC_dmacon
beq QC_update
move.w QC_dmacon(pc),$dff096
move.l a0,-(sp)
move.l delibase(pc),a0 ; added by Delirium
move.l dtg_WaitAudioDMA(a0),a0
jsr (a0)
move.l (sp)+,a0
or.w #$8000,QC_dmacon
move.w QC_dmacon(pc),$dff096
move.l a0,-(sp)
move.l delibase(pc),a0 ; added by Delirium
move.l dtg_WaitAudioDMA(a0),a0
jsr (a0)
move.l (sp)+,a0
clr.w QC_dmacon
lea QC_chan1+t_repeat(pc),a0
lea $dff000,a5
move.l (a0),$a0(a5)
move.w 4(a0),$a4(a5)
move.l QC_chan2-QC_chan1(a0),$b0(a5)
move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
move.l QC_chan3-QC_chan1(a0),$c0(a5)
move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
move.l QC_chan4-QC_chan1(a0),$d0(a5)
move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
QC_update:tst.b QC_newposflag
beq QC_tstend
clr.b QC_newposflag
move.w QC_newposnr,QC_pos
bra QC_newpos
QC_tstend:tst.b QC_jumpbreakflag
beq QC_tstend2
clr.b QC_jumpbreakflag
move.w QC_looprow(pc),d0
cmp.w QC_breakrow(pc),d0
bgt QC_mend
move.w d0,QC_rowcount
rts
QC_tstend2:
addq.w #1,QC_rowcount
move.w QC_rowcount(pc),d0
cmp.w QC_breakrow(pc),d0
ble QC_mend
addq.w #1,QC_pos
QC_newpos:move.w QC_pos(pc),d0
cmp.w QC_nrofpos(pc),d0
blt QC_getpos
clr.w QC_pos
moveq #0,d0
QC_getpos:move.l QC_posstart(pc),a0
move.b (a0,d0.w),d0
add.w d0,d0
add.w d0,d0
lea QC_patternpointers(pc),a0
move.l (a0,d0.w),a0
move.l 22(a0),QC_currpattpointer
move.b 1(a0),QC_breakrow+1
move.w QC_newrow(pc),QC_rowcount
clr.w QC_newrow
QC_mend:rts
QC_playnote:move.l (a0)+,(a6)
moveq #0,d0
move.b (a6),d0
beq QC_isnote
add.w d0,d0
add.w d0,d0
move.l (a4,d0.w),a1
move.b 1(a1),t_volume+1(a6)
move.b 25(a1),d0
and.w #$f,d0
add.w d0,d0
add.w d0,d0
move.l (a3,d0.w),t_finetune(a6)
move.l 30(a1),d1
move.l d1,t_start(a6)
move.w t_volume(a6),8(a5)
btst #0,24(a1)
beq QC_noloop
moveq #0,d0
move.w 26(a1),d0
add.l d0,d1
add.l d0,d1
move.l d1,t_repeat(a6)
moveq #0,d0
move.w 26(a1),d0
moveq #0,d1
move.w 28(a1),d1
add.l d0,d1
move.w d1,t_length(a6)
move.w 28(a1),t_replen(a6)
bra QC_isnote
QC_noloop:clr.l t_repeat(a6)
move.w #$1,t_replen(a6)
move.w 2(a1),t_length(a6)
QC_isnote:
tst.b t_notenr(a6)
blt QC_chkfirstfx
move.