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 >
Text File  |  1994-04-15  |  24KB  |  1,248 lines

  1.  
  2.     incdir    "Includes:"
  3.     include    "misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: QuadraComposer 2.0 player module V0.8 (18 Mar 94)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_RequestDTVersion,16
  18.     dc.l    DTP_PlayerVersion,00<<16+80
  19.     dc.l    DTP_PlayerName,PName
  20.     dc.l    DTP_Creator,CName
  21.     dc.l    DTP_DeliBase,delibase
  22.     dc.l    DTP_Check2,Chk
  23.     dc.l    DTP_CheckLen,ChkLen
  24.     dc.l    DTP_Interrupt,Int
  25.     dc.l    DTP_InitPlayer,InitPlay
  26.     dc.l    DTP_EndPlayer,EndPlay
  27.     dc.l    DTP_InitSound,InitSnd
  28.     dc.l    DTP_EndSound,EndSnd
  29.     dc.l    TAG_DONE
  30.  
  31. *-----------------------------------------------------------------------*
  32. ;
  33. ; Player/Creatorname und lokale Daten
  34.  
  35. PName        dc.b 'QuadraComposer',0
  36. CName        dc.b 'Copyright © 1993 Technological ArtWork',10
  37.         dc.b '(Bo Lincoln & Calle Englund)',10
  38.         dc.b 'adapted by Delirium',0
  39.     even
  40. delibase    dc.l 0
  41.  
  42. *-----------------------------------------------------------------------*
  43. ;
  44. ;Interrupt für Replay
  45.  
  46. Int
  47.     movem.l    d2-d7/a2-a6,-(sp)
  48.     bsr    QC_music            ; DudelDiDum
  49.     movem.l    (sp)+,d2-d7/a2-a6
  50.     rts
  51.  
  52. *-----------------------------------------------------------------------*
  53. ;
  54. ; Testet auf Modul
  55.  
  56. Chk                        ; QuadraComposer ?
  57.     move.l    dtg_ChkData(a5),a0
  58.     moveq    #-1,d0                ; Modul nicht erkannt (default)
  59.     cmp.l    #"FORM",(a0)
  60.     bne.s    ChkEnd
  61.     cmp.l    #"EMOD",8(a0)
  62.     bne.s    ChkEnd
  63.     cmp.l    #"EMIC",12(a0)
  64.     bne.s    ChkEnd
  65.     cmp.w    #1,20(a0)
  66.     bne.s    ChkEnd
  67.     moveq    #0,d0                ; Modul erkannt
  68. ChkEnd
  69.     rts
  70.  
  71. ChkLen = *-Chk
  72.  
  73. *-----------------------------------------------------------------------*
  74. ;
  75. ; Init Player
  76.  
  77. InitPlay
  78.     moveq    #0,d0
  79.     move.l    dtg_GetListData(a5),a0        ; Function
  80.     jsr    (a0)
  81.     move.l    a0,QC_data
  82.  
  83.     bsr    QC_rel
  84.  
  85.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  86.     jsr    (a0)                ; returncode is already set !
  87.     rts
  88.  
  89. *-----------------------------------------------------------------------*
  90. ;
  91. ; End Player
  92.  
  93. EndPlay
  94.     move.l    dtg_AudioFree(a5),a0        ; Function
  95.     jsr    (a0)
  96.     rts
  97.  
  98. *-----------------------------------------------------------------------*
  99. ;
  100. ; Init Module
  101.  
  102. InitSnd
  103.     bsr    QC_init
  104.     rts
  105.  
  106. *-----------------------------------------------------------------------*
  107. ;
  108. ; Clean up Module
  109.  
  110. EndSnd
  111.     bsr    QC_end
  112.     rts
  113.  
  114. *-----------------------------------------------------------------------*
  115. ;
  116. ; QuadraComposer2.0-Replay
  117.  
  118. * This replayroutine was written by Bo Lincoln (Eternal).
  119. * Copyright © 1993 Technological Artwork. All rights reserved.
  120. * You may use this routine in your programs.
  121. * This is the normal routine.
  122. * Worst case is about 20(?) rasterlines.
  123. * How to use: Call QC_init to init the mod.
  124. *             Call QC_music every vertical blank.
  125. *             Call QC_end to stop.
  126. *             The EMOD should be at QC_data.
  127. * You can not use Tempo in this routine.
  128.  
  129.  
  130. QC_rel:    move.l QC_data(pc),a0        ;Check if the module is ok
  131.     cmp.l #"FORM",(a0)
  132.     bne QC_relerr
  133.     cmp.l #"EMOD",8(a0)
  134.     bne QC_relerr
  135.     cmp.l #"EMIC",12(a0)
  136.     bne QC_relerr
  137.     cmp.w #1,20(a0)
  138.     bne QC_relerr
  139.  
  140. ;    or.b #$2,$bfe001
  141.     moveq #0,d7        ;Get the adresses to the sampleinfos
  142.     move.b 63(a0),d7    ;and init the real adresses in the infos
  143.     subq #1,d7
  144.     move.l QC_data(pc),d1
  145.     lea 64(a0),a0
  146.     lea QC_samplepointers(pc),a1
  147. QC_sploop:moveq #0,d0
  148.     move.b (a0),d0
  149.     add.w d0,d0
  150.     add.w d0,d0
  151.     move.l a0,(a1,d0.w)
  152.     add.l d1,30(a0)
  153.     move.l 30(a0),a2
  154.     clr.w (a2)
  155.     lea 34(a0),a0
  156.     dbf d7,QC_sploop
  157.  
  158.     lea QC_patternpointers(pc),a1    ;Get the patternadresses
  159.     moveq #0,d7
  160.     addq #1,a0
  161.     move.b (a0)+,d7
  162.     subq #1,d7
  163.     move.l QC_data(pc),d1
  164. QC_pploop:moveq #0,d0
  165.     move.b (a0),d0
  166.     add.w d0,d0
  167.     add.w d0,d0
  168.     move.l a0,(a1,d0.w)
  169.     add.l d1,22(a0)
  170.     lea 26(a0),a0
  171.     dbf d7,QC_pploop
  172.  
  173.     clr.w QC_nrofpos
  174.     move.b (a0)+,QC_nrofpos+1
  175.     move.l a0,QC_posstart
  176.     moveq #0,d0
  177. QC_relerr:moveq #-1,d0
  178.     rts
  179.  
  180. QC_init:move.l QC_posstart(pc),a0
  181.     lea QC_patternpointers(pc),a1
  182.     moveq #0,d0
  183.     move.b (a0),d0
  184.     add.w d0,d0
  185.     add.w d0,d0
  186.     move.l (a1,d0.w),a1
  187.     move.l 22(a1),QC_currpattpointer
  188.     move.b 1(a1),QC_breakrow+1
  189.     move.w #6,QC_speed
  190.     move.w QC_speed(pc),QC_speedcount
  191.     clr.b QC_newposflag
  192.     clr.w QC_rowcount
  193.     clr.w QC_pos
  194.     move.w #1,t_length+QC_chan1
  195.     move.w #1,t_length+QC_chan2
  196.     move.w #1,t_length+QC_chan3
  197.     move.w #1,t_length+QC_chan4
  198.     move.w #1,t_replen+QC_chan1
  199.     move.w #1,t_replen+QC_chan2
  200.     move.w #1,t_replen+QC_chan3
  201.     move.w #1,t_replen+QC_chan4
  202. QC_end:
  203.     moveq #0,d0
  204.     lea $dff000,a0
  205.     move.w d0,$a8(a0)
  206.     move.w d0,$b8(a0)
  207.     move.w d0,$c8(a0)
  208.     move.w d0,$d8(a0)
  209.     move.w #$f,$96(a0)
  210.     rts
  211.  
  212. QC_music:
  213.     addq.w #1,QC_speedcount
  214.     move.w QC_speed,d0
  215.     cmp.w QC_speedcount,d0
  216.     bgt QC_nonew
  217.     tst.b QC_pattwait
  218.     beq QC_getnotes
  219.     subq.b #1,QC_pattwait
  220.     clr.w QC_speedcount
  221.  
  222. QC_nonew:lea QC_samplepointers(pc),a4
  223.     lea QC_periods(pc),a3
  224.     lea QC_chan1(pc),a6
  225.     lea $dff0a0,a5
  226.     bsr QC_chkplayfx
  227.     lea QC_chan2-QC_chan1(a6),a6
  228.     lea $10(a5),a5
  229.     bsr QC_chkplayfx
  230.     lea QC_chan2-QC_chan1(a6),a6
  231.     lea $10(a5),a5
  232.     bsr QC_chkplayfx
  233.     lea QC_chan2-QC_chan1(a6),a6
  234.     lea $10(a5),a5    
  235.     bsr QC_chkplayfx
  236.  
  237.     tst.w QC_dmacon
  238.     beq QC_mend
  239.     move.w QC_dmacon(pc),$dff096
  240.     move.l    a0,-(sp)
  241.     move.l    delibase(pc),a0            ; added by Delirium
  242.     move.l    dtg_WaitAudioDMA(a0),a0
  243.     jsr    (a0)
  244.     move.l    (sp)+,a0
  245.     or.w #$8000,QC_dmacon
  246.     move.w QC_dmacon(pc),$dff096
  247.     move.l    a0,-(sp)
  248.     move.l    delibase(pc),a0            ; added by Delirium
  249.     move.l    dtg_WaitAudioDMA(a0),a0
  250.     jsr    (a0)
  251.     move.l    (sp)+,a0
  252.     clr.w QC_dmacon
  253.     lea QC_chan1+t_repeat(pc),a0
  254.     lea $dff000,a5
  255.     move.l (a0),$a0(a5)
  256.     move.w 4(a0),$a4(a5)
  257.     move.l QC_chan2-QC_chan1(a0),$b0(a5)
  258.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  259.     move.l QC_chan3-QC_chan1(a0),$c0(a5)
  260.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  261.     move.l QC_chan4-QC_chan1(a0),$d0(a5)
  262.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  263.     rts
  264.  
  265.  
  266. QC_chkplayfx:
  267.     lea QC_playfx(pc),a2
  268.     move.b t_cmd(a6),d0
  269.     and.w #$f,d0
  270.     add.w d0,d0
  271.     add.w d0,d0
  272.     move.l (a2,d0.w),a0
  273.     jmp (a0)
  274.  
  275. QC_getnotes:
  276.     clr.w QC_speedcount
  277.     move.l QC_currpattpointer(pc),a0
  278.     move.w QC_rowcount(pc),d0
  279.     asl.w #4,d0
  280.     add.w d0,a0
  281.     lea QC_samplepointers(pc),a4
  282.     lea QC_periods(pc),a3
  283.  
  284.     lea $dff0a0,a5
  285.     lea QC_chan1(pc),a6
  286.     bsr QC_playnote
  287.     lea $10(a5),a5
  288.     lea QC_chan2-QC_chan1(a6),a6
  289.     bsr QC_playnote
  290.     lea $10(a5),a5
  291.     lea QC_chan2-QC_chan1(a6),a6
  292.     bsr QC_playnote
  293.     lea $10(a5),a5
  294.     lea QC_chan2-QC_chan1(a6),a6
  295.     bsr QC_playnote
  296.     tst.w QC_dmacon
  297.     beq QC_update
  298.  
  299.     move.w QC_dmacon(pc),$dff096
  300.     move.l    a0,-(sp)
  301.     move.l    delibase(pc),a0            ; added by Delirium
  302.     move.l    dtg_WaitAudioDMA(a0),a0
  303.     jsr    (a0)
  304.     move.l    (sp)+,a0
  305.     or.w #$8000,QC_dmacon
  306.     move.w QC_dmacon(pc),$dff096
  307.     move.l    a0,-(sp)
  308.     move.l    delibase(pc),a0            ; added by Delirium
  309.     move.l    dtg_WaitAudioDMA(a0),a0
  310.     jsr    (a0)
  311.     move.l    (sp)+,a0
  312.     clr.w QC_dmacon
  313.     lea QC_chan1+t_repeat(pc),a0
  314.     lea $dff000,a5
  315.     move.l (a0),$a0(a5)
  316.     move.w 4(a0),$a4(a5)
  317.     move.l QC_chan2-QC_chan1(a0),$b0(a5)
  318.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  319.     move.l QC_chan3-QC_chan1(a0),$c0(a5)
  320.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  321.     move.l QC_chan4-QC_chan1(a0),$d0(a5)
  322.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  323.  
  324. QC_update:tst.b QC_newposflag
  325.     beq QC_tstend
  326.     clr.b QC_newposflag
  327.     move.w QC_newposnr,QC_pos
  328.     bra QC_newpos
  329. QC_tstend:tst.b QC_jumpbreakflag
  330.     beq QC_tstend2
  331.     clr.b QC_jumpbreakflag
  332.     move.w QC_looprow(pc),d0
  333.     cmp.w QC_breakrow(pc),d0
  334.     bgt QC_mend
  335.     move.w d0,QC_rowcount
  336.     rts
  337. QC_tstend2:
  338.     addq.w #1,QC_rowcount
  339.     move.w QC_rowcount(pc),d0
  340.     cmp.w QC_breakrow(pc),d0
  341.     ble QC_mend
  342.     addq.w #1,QC_pos
  343. QC_newpos:move.w QC_pos(pc),d0
  344.     cmp.w QC_nrofpos(pc),d0
  345.     blt QC_getpos
  346.     clr.w QC_pos
  347.     moveq #0,d0
  348. QC_getpos:move.l QC_posstart(pc),a0
  349.     move.b (a0,d0.w),d0
  350.     add.w d0,d0
  351.     add.w d0,d0
  352.     lea QC_patternpointers(pc),a0
  353.     move.l (a0,d0.w),a0
  354.     move.l 22(a0),QC_currpattpointer
  355.     move.b 1(a0),QC_breakrow+1
  356.     move.w QC_newrow(pc),QC_rowcount
  357.     clr.w QC_newrow
  358. QC_mend:rts
  359.  
  360. QC_playnote:move.l (a0)+,(a6)
  361.     moveq #0,d0
  362.     move.b (a6),d0
  363.     beq QC_isnote
  364.     add.w d0,d0
  365.     add.w d0,d0
  366.     move.l (a4,d0.w),a1
  367.     move.b 1(a1),t_volume+1(a6)
  368.     move.b 25(a1),d0
  369.     and.w #$f,d0
  370.     add.w d0,d0
  371.     add.w d0,d0
  372.     move.l (a3,d0.w),t_finetune(a6)
  373.     move.l 30(a1),d1
  374.     move.l d1,t_start(a6)
  375.     move.w t_volume(a6),8(a5)
  376.     btst #0,24(a1)
  377.     beq QC_noloop
  378.     moveq #0,d0
  379.     move.w 26(a1),d0
  380.     add.l d0,d1
  381.     add.l d0,d1
  382.     move.l d1,t_repeat(a6)
  383.     moveq #0,d0
  384.     move.w 26(a1),d0
  385.     moveq #0,d1
  386.     move.w 28(a1),d1
  387.     add.l d0,d1
  388.     move.w d1,t_length(a6)
  389.     move.w 28(a1),t_replen(a6)
  390.     bra QC_isnote
  391. QC_noloop:clr.l t_repeat(a6)
  392.     move.w #$1,t_replen(a6)
  393.     move.w 2(a1),t_length(a6)
  394. QC_isnote:
  395.     tst.b t_notenr(a6)
  396.     blt QC_chkfirstfx
  397.     move.