home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d9xx / d930 / quadracomp.lha / QuadraComp / QCReplay.s < prev    next >
Text File  |  1993-10-07  |  22KB  |  1,136 lines

  1. * This replayroutine was written by Bo Lincoln (Eternal).
  2. * Copyright © 1993 Technological Artwork. All rights reserved.
  3. * You may use this routine in your programs.
  4. * This is the normal routine.
  5. * Worst case is about 20(?) rasterlines.
  6. * How to use: Call QC_init to init the mod.
  7. *             Call QC_music every vertical blank.
  8. *             Call QC_end to stop.
  9. *             The EMOD should be at QC_data.
  10. * You can not use Tempo in this routine.
  11.               
  12. QC_dmawait = 6            ;How many rasterrows it waits for dma
  13.                 ;(2 times).
  14.  
  15.     section QC,code_c
  16.  
  17.     
  18. s:    move.w $dff01c,-(sp)
  19.     move.w #$7fff,$dff09a
  20.     bsr QC_init
  21. .loop:    bsr QC_music
  22. .loop2:    cmp.b #70,$dff006
  23.     bne .loop2
  24. .loop3:    cmp.b #70,$dff006
  25.     beq .loop3
  26.     btst #6,$bfe001
  27.     bne .loop
  28.     bsr QC_end
  29.     move.w (sp)+,d0
  30.     or.w #$8000,d0
  31.     move.w d0,$dff09a
  32.     rts
  33.  
  34. QC_init:lea QC_data(pc),a0        ;Check if the module is ok
  35.     cmp.l #"FORM",(a0)
  36.     bne QC_initerr
  37.     cmp.l #"EMOD",8(a0)
  38.     bne QC_initerr
  39.     cmp.l #"EMIC",12(a0)
  40.     bne QC_initerr
  41.     cmp.w #1,20(a0)
  42.     bne QC_initerr
  43.  
  44.     or.b #$2,$bfe001
  45.     moveq #0,d7        ;Get the adresses to the sampleinfos
  46.     move.b 63(a0),d7    ;and init the real adresses in the infos
  47.     subq #1,d7
  48.     lea 64(a0),a0
  49.     lea QC_samplepointers(pc),a1
  50. QC_sploop:moveq #0,d0
  51.     move.b (a0),d0
  52.     add.w d0,d0
  53.     add.w d0,d0
  54.     move.l a0,(a1,d0.w)
  55.     add.l #QC_data,30(a0)
  56.     move.l 30(a0),a2
  57.     clr.w (a2)
  58.     lea 34(a0),a0
  59.     dbf d7,QC_sploop
  60.  
  61.     lea QC_patternpointers(pc),a1    ;Get the patternadresses
  62.     moveq #0,d7
  63.     addq #1,a0
  64.     move.b (a0)+,d7
  65.     subq #1,d7
  66. QC_pploop:moveq #0,d0
  67.     move.b (a0),d0
  68.     add.w d0,d0
  69.     add.w d0,d0
  70.     move.l a0,(a1,d0.w)
  71.     add.l #QC_data,22(a0)
  72.     lea 26(a0),a0
  73.     dbf d7,QC_pploop
  74.  
  75.     clr.w QC_nrofpos
  76.     move.b (a0)+,QC_nrofpos+1    
  77.     move.l a0,QC_posstart
  78.     moveq #0,d0
  79.     move.b (a0),d0
  80.     add.w d0,d0
  81.     add.w d0,d0
  82.     move.l (a1,d0.w),a1
  83.     move.l 22(a1),QC_currpattpointer    
  84.     move.b 1(a1),QC_breakrow+1
  85.     move.w #6,QC_speed
  86.     move.w QC_speed(pc),QC_speedcount
  87.     clr.b QC_newposflag
  88.     clr.w QC_rowcount
  89.     clr.w QC_pos
  90.     move.w #1,t_length+QC_chan1
  91.     move.w #1,t_length+QC_chan2
  92.     move.w #1,t_length+QC_chan3
  93.     move.w #1,t_length+QC_chan4
  94.     move.w #1,t_replen+QC_chan1
  95.     move.w #1,t_replen+QC_chan2
  96.     move.w #1,t_replen+QC_chan3
  97.     move.w #1,t_replen+QC_chan4
  98.     moveq #0,d0
  99. QC_end:    move.w #$f,$dff096
  100.     clr.w $dff0a8
  101.     clr.w $dff0b8
  102.     clr.w $dff0c8
  103.     clr.w $dff0d8
  104.     rts        
  105. QC_initerr:moveq #-1,d0
  106.     rts
  107.  
  108. QC_music:
  109.     addq.w #1,QC_speedcount
  110.     move.w QC_speed,d0
  111.     cmp.w QC_speedcount,d0
  112.     bgt QC_nonew
  113.     tst.b QC_pattwait
  114.     beq QC_getnotes
  115.     subq.b #1,QC_pattwait
  116.     clr.w QC_speedcount
  117.  
  118. QC_nonew:lea QC_samplepointers(pc),a4
  119.     lea QC_periods(pc),a3
  120.     lea QC_chan1(pc),a6
  121.     lea $dff0a0,a5
  122.     bsr QC_chkplayfx
  123.     lea QC_chan2-QC_chan1(a6),a6
  124.     lea $10(a5),a5
  125.     bsr QC_chkplayfx
  126.     lea QC_chan2-QC_chan1(a6),a6
  127.     lea $10(a5),a5
  128.     bsr QC_chkplayfx
  129.     lea QC_chan2-QC_chan1(a6),a6
  130.     lea $10(a5),a5    
  131.     bsr QC_chkplayfx
  132.  
  133.     tst.w QC_dmacon
  134.     beq QC_mend
  135.     move.w QC_dmacon(pc),$dff096
  136.     moveq #QC_dmawait,d7
  137. QC_wait6:move.b $dff006,d0    
  138. QC_wait5:cmp.b $dff006,d0
  139.     beq QC_wait5
  140.     dbf d7,QC_wait6
  141.     or.w #$8000,QC_dmacon
  142.     move.w QC_dmacon(pc),$dff096
  143.     moveq #QC_dmawait,d7
  144. QC_wait8:move.b $dff006,d0    
  145. QC_wait7:cmp.b $dff006,d0
  146.     beq QC_wait7
  147.     dbf d7,QC_wait8
  148.     clr.w QC_dmacon
  149.     lea QC_chan1+t_repeat(pc),a0
  150.     lea $dff000,a5
  151.     move.l (a0),$a0(a5)    
  152.     move.w 4(a0),$a4(a5)
  153.     move.l QC_chan2-QC_chan1(a0),$b0(a5)    
  154.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  155.     move.l QC_chan3-QC_chan1(a0),$c0(a5)    
  156.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  157.     move.l QC_chan4-QC_chan1(a0),$d0(a5)    
  158.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  159.     rts
  160.     
  161.  
  162. QC_chkplayfx:
  163.     lea QC_playfx(pc),a2
  164.     move.b t_cmd(a6),d0
  165.     and.w #$f,d0
  166.     add.w d0,d0    
  167.     add.w d0,d0    
  168.     move.l (a2,d0.w),a0
  169.     jmp (a0)    
  170.     
  171. QC_getnotes:
  172.     clr.w QC_speedcount
  173.     move.l QC_currpattpointer(pc),a0
  174.     move.w QC_rowcount(pc),d0
  175.     asl.w #4,d0
  176.     add.w d0,a0
  177.     lea QC_samplepointers(pc),a4
  178.     lea QC_periods(pc),a3
  179.     
  180.     lea $dff0a0,a5
  181.     lea QC_chan1(pc),a6
  182.     bsr QC_playnote
  183.     lea $10(a5),a5
  184.     lea QC_chan2-QC_chan1(a6),a6
  185.     bsr QC_playnote
  186.     lea $10(a5),a5
  187.     lea QC_chan2-QC_chan1(a6),a6
  188.     bsr QC_playnote
  189.     lea $10(a5),a5
  190.     lea QC_chan2-QC_chan1(a6),a6
  191.     bsr QC_playnote
  192.     tst.w QC_dmacon
  193.     beq QC_update
  194.  
  195.     move.w QC_dmacon(pc),$dff096
  196.     moveq #QC_dmawait,d7
  197. QC_wait2:move.b $dff006,d0    
  198. QC_wait1:cmp.b $dff006,d0
  199.     beq QC_wait1
  200.     dbf d7,QC_wait2
  201.     or.w #$8000,QC_dmacon
  202.     move.w QC_dmacon(pc),$dff096
  203.     moveq #QC_dmawait,d7
  204. QC_wait4:move.b $dff006,d0    
  205. QC_wait3:cmp.b $dff006,d0
  206.     beq QC_wait3
  207.     dbf d7,QC_wait4
  208.     clr.w QC_dmacon
  209.     lea QC_chan1+t_repeat(pc),a0
  210.     lea $dff000,a5
  211.     move.l (a0),$a0(a5)    
  212.     move.w 4(a0),$a4(a5)
  213.     move.l QC_chan2-QC_chan1(a0),$b0(a5)    
  214.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  215.     move.l QC_chan3-QC_chan1(a0),$c0(a5)    
  216.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  217.     move.l QC_chan4-QC_chan1(a0),$d0(a5)    
  218.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  219.  
  220. QC_update:tst.b QC_newposflag
  221.     beq QC_tstend
  222.     clr.b QC_newposflag
  223.     move.w QC_newposnr,QC_pos
  224.     bra QC_newpos
  225. QC_tstend:tst.b QC_jumpbreakflag
  226.     beq QC_tstend2
  227.     clr.b QC_jumpbreakflag
  228.     move.w QC_looprow(pc),d0
  229.     cmp.w QC_breakrow(pc),d0
  230.     bgt QC_mend
  231.     move.w d0,QC_rowcount
  232.     rts
  233. QC_tstend2:    
  234.     addq.w #1,QC_rowcount
  235.     move.w QC_rowcount(pc),d0
  236.     cmp.w QC_breakrow(pc),d0
  237.     ble QC_mend
  238.     addq.w #1,QC_pos
  239. QC_newpos:move.w QC_pos(pc),d0
  240.     cmp.w QC_nrofpos(pc),d0
  241.     blt QC_getpos
  242.     clr.w QC_pos
  243.     moveq #0,d0
  244. QC_getpos:move.l QC_posstart(pc),a0
  245.     move.b (a0,d0.w),d0
  246.     add.w d0,d0
  247.     add.w d0,d0
  248.     lea QC_patternpointers(pc),a0
  249.     move.l (a0,d0.w),a0
  250.     move.l 22(a0),QC_currpattpointer
  251.     move.b 1(a0),QC_breakrow+1
  252.     move.w QC_newrow(pc),QC_rowcount
  253.     clr.w QC_newrow
  254. QC_mend:rts
  255.  
  256. QC_playnote:move.l (a0)+,(a6)
  257.     moveq #0,d0
  258.     move.b (a6),d0
  259.     beq QC_isnote
  260.     add.w d0,d0
  261.     add.w d0,d0
  262.     move.l (a4,d0.w),a1
  263.     move.b 1(a1),t_volume+1(a6)
  264.     move.b 25(a1),d0
  265.     and.w #$f,d0
  266.     add.w d0,d0
  267.     add.w d0,d0
  268.     move.l (a3,d0.w),t_finetune(a6)
  269.     move.l 30(a1),d1
  270.     move.l d1,t_start(a6)
  271.     move.w t_volume(a6),8(a5)
  272.     btst #0,24(a1)
  273.     beq QC_noloop
  274.     moveq #0,d0
  275.     move.w 26(a1),d0
  276.     add.l d0,d1
  277.     add.l d0,d1
  278.     move.l d1,t_repeat(a6)
  279.     moveq #0,d0
  280.     move.w 26(a1),d0
  281.     moveq #0,d1
  282.     move.w 28(a1),d1
  283.     add.l d0,d1
  284.     move.w d1,t_length(a6)
  285.     move.w 28(a1),t_replen(a6)
  286.     bra QC_isnote
  287. QC_noloop:clr.l t_repeat(a6)
  288.     move.w #$1,t_replen(a6)
  289.     move.w 2(a1),t_length(a6)
  290. QC_isnote:
  291.     tst.b t_notenr(a6)
  292.     blt QC_chkfirstfx
  293.     move.b t_notenr(a6),t_notenr2+1(a6)
  294.     move.w t_cmd(a6),d0
  295.     and.w #$ff0,d0
  296.     cmp.w #$e50,d0
  297.     beq QC_setfinetunefirst
  298.     and.w #$f00,d0
  299.     cmp.w #$300,d0
  300.     beq QC_settoneport
  301.     cmp.w #$500,d0
  302.     beq QC_settoneport
  303. QC_getper:move.w t_notenr2(a6),d0
  304.     add.w d0,d0
  305.     move.l t_finetune(a6),a2
  306.     move.w (a2,d0.w),t_period(a6)
  307.     move.w t_cmd(a6),d0
  308.     and.w #$ff0,d0
  309.     cmp.w #$ed0,d0
  310.     beq QC_notedelay
  311.     move.w t_dmabit(a6),d0
  312.     or.w d0,QC_dmacon
  313.     move.l t_start(a6),(a5)
  314.     move.w t_length(a6),4(a5)
  315.     move.w t_period(a6),6(a5)
  316. QC_chkfirstfx:
  317.     lea QC_fxaftersetperiod(pc),a2
  318.     moveq #0,d0
  319.     move.b t_cmd(a6),d0
  320.     add.w d0,d0
  321.     add.w d0,d0
  322.     move.l (a2,d0.w),a2
  323.     jmp (a2)
  324.  
  325. QC_setfinetunefirst:
  326.     move.b t_cmdarg(a6),d0
  327.     add.w d0,d0
  328.     add.w d0,d0
  329.     move.l (a3,d0.w),t_finetune(a6)
  330.     bra QC_getper
  331.             
  332. QC_ecommands:
  333.     lea QC_efx(pc),a2
  334.     move.b t_cmdarg(a6),d0
  335.     and.w #$f0,d0
  336.     lsr.w #2,d0
  337.     move.l (a2,d0.w),a2
  338.     jmp (a2) 
  339.  
  340. QC_playecommands:
  341.     lea QC_playefx(pc),a2
  342.     move.b t_cmdarg(a6),d0
  343.     and.w #$f0,d0
  344.     lsr.w #2,d0
  345.     move.l (a2,d0.w),a2
  346.     jmp (a2) 
  347.  
  348. ********** Effect commands **********
  349.  
  350. QC_arpeggio:
  351.     tst.b t_cmdarg(a6)
  352.     beq QC_mend
  353.     move.w QC_speedcount,d0
  354.     lea QC_arptbl,a2
  355.     tst.b (a2,d0.w)
  356.     beq QC_arp2
  357.     blt QC_arp1
  358.     move.b t_cmdarg(a6),d0
  359.     and.w #$f,d0
  360.     add.w t_notenr2(a6),d0
  361.     add.w d0,d0
  362.     move.l t_finetune(a6),a2    
  363.     move.w (a2,d0.w),6(a5)    
  364.     rts
  365. QC_arp1:move.w t_period(a6),6(a5)
  366.     rts
  367. QC_arp2:moveq #0,d0
  368.     move.b t_cmdarg(a6),d0
  369.     lsr.w #4,d0
  370.     add.w t_notenr2(a6),d0
  371.     add.w d0,d0    
  372.     move.l t_finetune(a6),a2
  373.     move.w (a2,d0.w),6(a5)    
  374.     rts
  375.  
  376. QC_slideup:
  377.     moveq #0,d0            
  378.     move.b t_cmdarg(a6),d0        
  379.     sub.w d0,t_period(a6)        
  380.     cmp.w #113,t_period(a6)        
  381.     bgt QC_sunotlow
  382.     move.w #113,t_period(a6)
  383. QC_sunotlow:
  384.     move.w t_period(a6),6(a5)
  385.     rts    
  386.  
  387. QC_slidedown:
  388.     moveq #0,d0
  389.     move.b t_cmdarg(a6),d0
  390.     add.w d0,t_period(a6)
  391.     cmp.w #856,t_period(a6)
  392.     blt QC_sdnothigh
  393.     move.w #856,t_period(a6)
  394. QC_sdnothigh:
  395.     move.w t_period(a6),6(a5)
  396.     rts    
  397.  
  398. QC_settoneport:
  399.     move.w t_notenr2(a6),d0
  400.     add.w d0,d0
  401.     move.l t_finetune(a6),a2
  402.     move.w (a2,d0.w),d0
  403.     move.w d0,t_wantedperiod(a6)
  404.     cmp.w t_period(a6),d0    
  405.     bgt QC_setportdown
  406.     clr.b t_portdir(a6)
  407.     rts
  408. QC_setportdown:
  409.     move.b #1,t_portdir(a6)
  410.     rts    
  411.  
  412. QC_toneport:
  413.     tst.w t_wantedperiod(a6)
  414.     beq QC_mend
  415.     moveq #0,d0
  416.     move.b t_cmdarg(a6),d0
  417.     beq QC_tpold
  418.     move.b d0,t_portspeed(a6)
  419.     tst.b t_portdir(a6)
  420.     bne QC_portdown
  421.     sub.w d0,t_period(a6)
  422.     move.w t_wantedperiod(a6),d0
  423.     cmp.w t_period(a6),d0
  424.     blt QC_notyetwanted
  425.     move.w d0,6(a5)
  426.     move.w d0,t_period(a6)
  427.     clr.w t_wantedperiod(a6)
  428.     rts
  429. QC_tpold:move.b t_portspeed(a6),d0
  430.     tst.b t_portdir(a6)
  431.     bne QC_portdown
  432.     sub.w d0,t_period(a6)
  433.     move.w t_wantedperiod(a6),d0
  434.     cmp.w t_period(a6),d0
  435.     blt QC_notyetwanted
  436.     move.w d0,6(a5)
  437.     move.w d0,t_period(a6)
  438.     clr.w t_wantedperiod(a6)
  439.     rts
  440. QC_portdown:
  441.     add.w d0,t_period(a6)
  442.     move.w t_wantedperiod(a6),d0
  443.     cmp.w t_period(a6),d0
  444.     bgt QC_notyetwanted
  445.     move.w d0,6(a5)
  446.     move.w d0,t_period(a6)
  447.     clr.w t_wantedperiod(a6)
  448.     rts
  449. QC_notyetwanted:
  450.     tst.b t_glisscont(a6)
  451.     beq QC_nogliss
  452.     move.l t_finetune(a6),a2
  453.     move.w t_period(a6),d0
  454. QC_glissloop:
  455.     cmp.w (a2)+,d0
  456.     blt QC_glissloop
  457.     move.w -2(a2),6(a5)
  458.     rts
  459. QC_nogliss:
  460.     move.w t_period(a6),6(a5)
  461.     rts
  462.     
  463. QC_vibrato:
  464.     moveq #0,d0
  465.     move.b t_vibwave(a6),d0
  466.     asl.w #7,d0
  467.     lea QC_vibtables(pc),a2
  468.     add.w d0,a2
  469.     moveq #0,d0
  470.     move.b t_cmdarg(a6),d0
  471.     beq QC_vib    
  472.     move.w d0,d1
  473.     and.b #$f,d0
  474.     beq QC_vibusespeed
  475.     and.b #$f0,t_vibcmd(a6)
  476.     or.b d0,t_vibcmd(a6)
  477. QC_vibusespeed:
  478.     and.b #$f0,d1
  479.     beq QC_vib
  480.     and.b #$f,t_vibcmd(a6)
  481.     or.b d1,t_vibcmd(a6)
  482. QC_vib:    move.b t_vibcmd(a6),d0
  483.     lsr.w #3,d0
  484.     add.w d0,t_vibpos(a6)
  485.     and.w #$7e,t_vibpos(a6)
  486.     move.w t_vibpos(a6),d0
  487.     move.w t_period(a6),d1
  488.     move.w (a2,d0.w),d0
  489.     move.b t_vibcmd(a6),d2
  490.     and.w #$f,d2
  491.     muls d2,d0
  492.     add.l d0,d0
  493.     add.l d0,d0
  494.     swap d0
  495.     add.w d0,d1
  496.     cmp.w #856,d1
  497.     blt QC_vibnothigh
  498.     move.w #856,d1
  499. QC_vibnothigh:
  500.     cmp.w #113,d1
  501.     bgt QC_vibnotlow
  502.     moveq #113,d1
  503. QC_vibnotlow:
  504.     move.w d1,6(a5)
  505.     rts    
  506.  
  507. QC_toneportandvolslide:
  508.     tst.w t_wantedperiod(a6)
  509.     beq QC_volslide
  510.     bsr QC_tpold
  511.     bra QC_volslide
  512.  
  513. QC_vibratoandvolslide:
  514.     bsr QC_vib
  515.     bra QC_volslide
  516.  
  517. QC_tremolo:
  518.     moveq #0,d0
  519.     move.b t_tremwave(a6),d0
  520.     asl.w #7,d0
  521.     lea QC_vibtables(pc),a2
  522.     add.w d0,a2
  523.     moveq #0,d0
  524.     move.b t_cmdarg(a6),d0
  525.     beq QC_trem    
  526.     move.w d0,d1
  527.     and.b #$f,d0
  528.     beq QC_tremusespeed
  529.     and.b #$f0,t_tremcmd(a6)
  530.     or.b d0,t_tremcmd(a6)
  531. QC_tremusespeed:
  532.     and.b #$f0,d1
  533.     beq QC_trem
  534.     and.b #$f,t_tremcmd(a6)
  535.     or.b d1,t_tremcmd(a6)
  536. QC_trem:move.b t_tremcmd(a6),d0
  537.     lsr.w #3,d0
  538.     add.w d0,t_trempos(a6)
  539.     and.w #$7e,t_trempos(a6)
  540.     move.w t_trempos(a6),d0
  541.     move.w t_volume(a6),d1
  542.     move.w (a2,d0.w),d0
  543.     move.b t_tremcmd(a6),d2
  544.     and.w #$f,d2
  545.     muls d2,d0
  546.     asl.l #3,d0
  547.     swap d0
  548.     add.w d0,d1
  549.     cmp.w #40,d1
  550.     blt QC_tremnothigh
  551.     move.w #40,d1
  552. QC_tremnothigh:
  553.     tst.w d1
  554.     bgt QC_tremnotlow
  555.     moveq #0,d1
  556. QC_tremnotlow:
  557.     move.w d1,8(a5)
  558.     rts    
  559.  
  560. QC_sampleoffset:
  561.     moveq #0,d0
  562.     move.b t_cmdarg(a6),d0
  563.     beq QC_sook
  564.     move.b d0,t_sampleoffset(a6)
  565. QC_sook:move.b t_sampleoffset(a6),d0
  566.     asl.w #8,d0
  567.     moveq #0,d1
  568.     move.w t_length(a6),d1
  569.     sub.l d0,d1
  570.     ble QC_sotoolong
  571.     move.w d1,t_length(a6)
  572.     add.l d0,d0
  573.     add.l d0,t_start(a6)
  574.     move.l t_start(a6),(a5)
  575.     move.w t_length(a6),4(a5)
  576.     rts
  577. QC_sotoolong:
  578.     move.w #1,t_length(a6)
  579.     move.w t_length(a6),4(a5)
  580.     rts
  581.     
  582. QC_volslide:
  583.     moveq #0,d0
  584.     move.b t_cmdarg(a6),d0
  585.     lsr.w #4,d0
  586.     beq QC_volslidedown
  587.     add.w d0,t_volume(a6)
  588.     cmp.w #$40,t_volume(a6)    
  589.     blt QC_setvol
  590.     move.w #$40,t_volume(a6)
  591. QC_setvol:move.w t_volume(a6),8(a5)
  592.     rts
  593. QC_volslidedown:
  594.     move.b t_cmdarg(a6),d0
  595.     sub.w d0,t_volume(a6)
  596.     tst.w t_volume(a6)    
  597.     bgt QC_setvol
  598.     clr.w t_volume(a6)
  599.     clr.w 8(a5)
  600.     rts        
  601.  
  602. QC_posjump:
  603.     move.b t_cmdarg(a6),QC_newposnr+1
  604.     move.b #1,QC_newposflag
  605.     clr.w QC_newrow
  606.     rts        
  607.  
  608. QC_volumechange:
  609.     move.b t_cmdarg(a6),d0
  610.     cmp.b #$40,d0
  611.     blo QC_volchhigh
  612.     move.w #$40,t_volume(a6)
  613.     move.w #$40,8(a5)
  614.     rts
  615. QC_volchhigh:
  616.     move.b d0,t_volume+1(a6)
  617.     move.w t_volume(a6),8(a5)
  618.     rts
  619.  
  620. QC_patternbreak:
  621.     move.w QC_pos,d0
  622.     addq.w #1,d0
  623.     move.w d0,QC_newposnr
  624.     move.b t_cmdarg(a6),QC_newrow+1
  625.     move.b #1,QC_newposflag
  626.     rts
  627.  
  628. QC_setspeed:
  629.     move.b t_cmdarg(a6),d0
  630.     beq QC_setspeed1
  631.     cmp.b #$1f,d0
  632.     bhi QC_end
  633.     move.b d0,QC_speed+1
  634.     clr.w QC_speedcount
  635.     rts
  636. QC_setspeed1:
  637.     move.w #1,QC_speed
  638.     clr.w QC_speedcount
  639.     rts
  640.  
  641. QC_setfilter:
  642.     move.b t_cmdarg(a6),d0
  643.     and.b #1,d0
  644.     add.b d0,d0
  645.     and.b #$fd,$bfe001
  646.     or.b d0,$bfe001
  647.     rts
  648.  
  649. QC_fineslideup:
  650.     move.b t_cmdarg(a6),d0
  651.     and.w #$f,d0
  652.     sub.w d0,t_period(a6)
  653.     cmp.w #113,t_period(a6)
  654.     bgt QC_fsunotlow
  655.     move.w #113,t_period(a6)
  656. QC_fsunotlow:
  657.     move.w t_period(a6),6(a5)
  658.     rts
  659.  
  660. QC_fineslidedown:
  661.     move.b t_cmdarg(a6),d0
  662.     and.w #$f,d0
  663.     add.w d0,t_period(a6)
  664.     cmp.w #856,t_period(a6)
  665.     blt QC_fsdnothigh
  666.     move.w #856,t_period(a6)
  667. QC_fsdnothigh:
  668.     move.w t_period(a6),6(a5)
  669.     rts    
  670.     
  671. QC_glisscontrol:
  672.     move.b t_cmdarg(a6),t_glisscont(a6)
  673.     and.b #$f,t_glisscont(a6)
  674.     rts
  675.  
  676. QC_vibratowave:
  677.     move.b t_cmdarg(a6),t_vibwave(a6)
  678.     and.b #$f,t_vibwave(a6)
  679.     rts
  680.  
  681. QC_finetune:
  682.     move.b t_cmdarg(a6),d0
  683.     and.w #$f,d0
  684.     add.w d0,d0
  685.     add.w d0,d0
  686.     move.l (a3,d0.w),t_finetune(a6)
  687.     rts
  688.     
  689. QC_jumploop:
  690.     move.b t_cmdarg(a6),d0
  691.     and.w #$f,d0
  692.     beq QC_saveloop
  693.     tst.b QC_loopcount
  694.     beq QC_saveloop
  695.     subq.b #1,QC_loopcount
  696.     beq QC_mend
  697.     move.b #1,QC_jumpbreakflag
  698.     rts    
  699. QC_newloop:
  700.     move.b d0,QC_loopcount
  701.     move.b #1,QC_jumpbreakflag
  702.     rts    
  703. QC_saveloop:
  704.     move.w QC_rowcount(pc),QC_looprow
  705.     rts
  706.  
  707. QC_tremolowave:
  708.     move.b t_cmdarg(a6),t_tremwave(a6)
  709.     and.b #$f,t_tremwave(a6)
  710.     rts
  711.  
  712. QC_initretrig:
  713.     clr.b t_retrig(a6)
  714. QC_retrignote:
  715.     addq.b #1,t_retrig(a6)
  716.     move.b t_cmdarg(a6),d0
  717.     and.b #$f,d0
  718.     cmp.b t_retrig(a6),d0
  719.     bgt QC_mend
  720.     clr.b t_retrig(a6)
  721.     move.w t_dmabit(a6),d0
  722.     or.w d0,QC_dmacon
  723.     move.l t_start(a6),(a5)
  724.     move.w t_length(a6),4(a5)
  725.     move.w t_period(a6),6(a5)
  726.     rts
  727.  
  728. QC_volumefineup:
  729.     move.b t_cmdarg(a6),d0
  730.     and.w #$f,d0
  731.     add.w d0,t_volume(a6)
  732.     cmp.w #$40,t_volume(a6)
  733.     blt QC_vfuset
  734.     move.w #$40,t_volume(a6)
  735.     move.w #$40,8(a5)
  736.     rts
  737. QC_vfuset:move.w t_volume(a6),8(a5)
  738.     rts    
  739.  
  740. QC_volumefinedown:
  741.     move.b t_cmdarg(a6),d0
  742.     and.w #$f,d0
  743.     sub.w d0,t_volume(a6)
  744.     bge QC_vfdset
  745.     clr.w t_volume(a6)
  746.     clr.w 8(a5)
  747.     rts
  748. QC_vfdset:move.w t_volume(a6),8(a5)
  749.     rts    
  750.  
  751. QC_notecut:
  752.     moveq #0,d1
  753.     move.b t_cmdarg(a6),d1
  754.     and.b #$f,d1
  755.     cmp.w QC_speedcount(pc),d1
  756.     bgt QC_mend
  757.     clr.w t_volume(a6)
  758.     clr.w 8(a5)
  759.     rts
  760.  
  761. QC_notedelay:
  762.     moveq #0,d1
  763.     move.b t_cmdarg(a6),d1
  764.     and.b #$f,d1
  765.     cmp.w QC_speedcount(pc),d1
  766.     bne QC_mend
  767.     move.w t_dmabit(a6),d0
  768.     or.w d0,QC_dmacon
  769.     move.l t_start(a6),(a5)
  770.     move.w t_length(a6),4(a5)
  771.     move.w t_period(a6),6(a5)
  772.     rts
  773.  
  774. QC_patterndelay:
  775.     move.b t_cmdarg(a6),QC_pattwait
  776.     and.b #$f,QC_pattwait
  777.     rts
  778.  
  779. QC_arptbl:rept 86        ;if your assembler doensn't want to handle
  780.     dc.b -1,0,1        ;the "rept" command, you'll have to write
  781.     endr            ;a list incl. 256 numbers like this:
  782.                 ;-1,0,1,-1,0,1,-1.. and so on.
  783.  
  784.  
  785. QC_playfx:dc.l QC_arpeggio
  786.     dc.l QC_slideup
  787.     dc.l QC_slidedown
  788.     dc.l QC_toneport
  789.     dc.l QC_vibrato
  790.     dc.l QC_toneportandvolslide
  791.     dc.l QC_vibratoandvolslide
  792.     dc.l QC_tremolo
  793.     dc.l QC_mend
  794.     dc.l QC_mend
  795.     dc.l QC_volslide
  796.     dc.l QC_mend
  797.     dc.l QC_mend
  798.     dc.l QC_mend
  799.     dc.l QC_playecommands    
  800.     dc.l QC_mend
  801.  
  802. QC_playefx:dc.l QC_mend
  803.     dc.l QC_mend
  804.     dc.l QC_mend
  805.     dc.l QC_mend
  806.     dc.l QC_mend
  807.     dc.l QC_mend
  808.     dc.l QC_mend
  809.     dc.l QC_mend
  810.     dc.l QC_mend
  811.     dc.l QC_retrignote
  812.     dc.l QC_mend
  813.     dc.l QC_mend
  814.     dc.l QC_notecut
  815.     dc.l QC_notedelay
  816.     dc.l QC_mend
  817.     dc.l QC_mend
  818.  
  819. QC_efx:    dc.l QC_setfilter
  820.     dc.l QC_fineslideup
  821.     dc.l QC_fineslidedown
  822.     dc.l QC_glisscontrol
  823.     dc.l QC_vibratowave
  824.     dc.l QC_finetune
  825.     dc.l QC_jumploop
  826.     dc.l QC_tremolowave
  827.     dc.l QC_mend
  828.     dc.l QC_initretrig
  829.     dc.l QC_volumefineup
  830.     dc.l QC_volumefinedown
  831.     dc.l QC_notecut
  832.     dc.l QC_notedelay
  833.     dc.l QC_patterndelay
  834.     dc.l QC_mend
  835.     
  836.  
  837. QC_fxaftersetperiod:
  838.     dc.l QC_arpeggio
  839.     dc.l QC_mend
  840.     dc.l QC_mend
  841.     dc.l QC_mend
  842.     dc.l QC_mend
  843.     dc.l QC_mend
  844.     dc.l QC_mend
  845.     dc.l QC_mend
  846.     dc.l QC_mend
  847.     dc.l QC_sampleoffset
  848.     dc.l QC_mend
  849.     dc.l QC_posjump
  850.     dc.l QC_volumechange
  851.     dc.l QC_patternbreak
  852.     dc.l QC_ecommands
  853.     dc.l QC_setspeed        
  854.  
  855.  
  856. QC_vibtables:
  857.     dc.w 0,3211,6392,9511,12539,15446,18204,20787,23169,25329
  858.     dc.w 27244,28897,30272,31356,32137,32609,32767,32609,32137
  859.     dc.w 31356,30272,28897,27244,25329,23169,20787,18204,15446
  860.     dc.w 12539,9511,6392,3211
  861.     dc.w 0,-3211,-6392,-9511,-12539,-15446,-18204,-20787,-23169,-25329
  862.     dc.w -27244,-28897,-30272,-31356,-32137,-32609,-32767,-32609,-32137
  863.     dc.w -31356,-30272,-28897,-27244,-25329,-23169,-20787,-18204,-15446
  864.     dc.w -12539,-9511,-6392,-3211
  865.  
  866.     dc.w 32767,31744,30720,29696,28672,27648,26624,25600,24576,23552
  867.     dc.w 22528,21504,20480,19456,18432,17408,16384,15360,14336,13312
  868.     dc.w 12288,11264,10240,9216,8192,7168,6144,5120,4096,3072,2048,1024
  869.     dc.w 0,-1024,-2048,-3072,-4096,-5120,-6144,-8168,-8192,-9216,-10240
  870.     dc.w -11264,-12288,-13312,-14336,-15360,-16384,-17408,-18432,-19456
  871.     dc.w -20480,-21504,-22528,-23552,-24576,-25600,-26624,-27648,-28672
  872.     dc.w -29696,-30720,-31744,-32768
  873.  
  874.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  875.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  876.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  877.     dc.w 32767,32767
  878.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  879.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  880.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  881.     dc.w -32767,-32767
  882.     
  883.  
  884.  
  885.  
  886. QC_periods:dc.l QC_periodtable
  887.     dc.l QC_periodtable+72
  888.     dc.l QC_periodtable+144
  889.     dc.l QC_periodtable+216
  890.     dc.l QC_periodtable+288
  891.     dc.l QC_periodtable+360
  892.     dc.l QC_periodtable+432
  893.     dc.l QC_periodtable+504
  894.     dc.l QC_periodtable+576
  895.     dc.l QC_periodtable+648
  896.     dc.l QC_periodtable+720
  897.     dc.l QC_periodtable+792
  898.     dc.l QC_periodtable+864
  899.     dc.l QC_periodtable+936
  900.     dc.l QC_periodtable+1008
  901.     dc.l QC_periodtable+1080
  902.  
  903.  
  904. QC_periodtable:
  905.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  906.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  907.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  908.  
  909.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  910.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  911.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  912.  
  913.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  914.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  915.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  916.  
  917.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  918.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  919.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  920.  
  921.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  922.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  923.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  924.  
  925.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  926.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  927.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  928.  
  929.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  930.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  931.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  932.  
  933.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  934.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  935.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  936.  
  937.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  938.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  939.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  940.  
  941.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  942.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  943.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  944.  
  945.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  946.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  947.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  948.  
  949.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  950.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  951.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  952.  
  953.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  954.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  955.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  956.  
  957.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  958.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  959.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  960.  
  961.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  962.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  963.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  964.  
  965.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  966.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  967.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  968.  
  969.  
  970. QC_samplepointers:
  971.     blk.l 256,QC_quietsamp    
  972. QC_patternpointers:
  973.     blk.l 256,0
  974. QC_currpattpointer:dc.l 0
  975. QC_posstart:dc.l 0
  976. QC_nrofpos:dc.w 0
  977. QC_pos:    dc.w 0
  978. QC_speed:dc.w 6
  979. QC_speedcount:dc.w 0
  980. QC_breakrow:dc.w 0
  981. QC_newrow:dc.w 0
  982. QC_newposnr:dc.w 0
  983. QC_rowcount:dc.w 0
  984. QC_quiet:dc.w 0
  985. QC_dmacon:dc.w 0
  986. QC_looprow:dc.w 0
  987. QC_tempo:dc.w 125
  988. QC_oldirq:dc.l 0
  989. QC_newposflag:dc.b 0
  990. QC_jumpbreakflag:dc.b 0
  991. QC_loopcount:dc.b 0
  992. QC_pattwait:dc.b 0
  993.  
  994. QC_quietsamp:
  995.     dc.w 0,1
  996.     blk.b 20
  997.     dc.w 0
  998.     dc.w 1
  999.     dc.l QC_quiet
  1000.  
  1001.  
  1002.  
  1003. t_notenr = 1
  1004. t_cmd = 2
  1005. t_cmdarg = 3
  1006. t_repeat = 4
  1007. t_replen = 8
  1008. t_period = 10
  1009. t_volume = 12
  1010. t_length = 14
  1011. t_finetune = 42
  1012. t_start = 18
  1013. t_dmabit = 22
  1014. t_notenr2 = 24
  1015. t_wantedperiod = 26
  1016. t_portdir = 28
  1017. t_vibwave = 29
  1018. t_glisscont = 30
  1019. t_vibcmd = 31
  1020. t_vibpos = 32
  1021. t_tremwave = 34
  1022. t_tremcmd = 35
  1023. t_trempos = 36
  1024. t_sampleoffset = 38
  1025. t_retrig = 39
  1026. t_portspeed = 40
  1027.     even
  1028. QC_chan1:dc.l 0            ;The note and command
  1029.     dc.l 0            ;Repeat
  1030.     dc.w 0            ;Replen
  1031.     dc.w 0            ;Period
  1032.     dc.w 0            ;Volume
  1033.     dc.w 0            ;Length
  1034.     dc.w 0            ;Finetune
  1035.     dc.l 0            ;Start
  1036.     dc.w 1            ;DMAbit
  1037.     dc.w 0            ;NoteNr2
  1038.     dc.w 0            ;WantedPeriod
  1039.     dc.b 0            ;Portdir
  1040.     dc.b 0            ;VibWave
  1041.     dc.b 0            ;Glisscont
  1042.     dc.b 0            ;Vibcmd
  1043.     dc.w 0            ;VibPos
  1044.     dc.b 0            ;Tremwave
  1045.     dc.b 0            ;Tremcmd
  1046.     dc.w 0            ;Trempos
  1047.     dc.b 0            ;Sampleoffset
  1048.     dc.b 0            ;Retrig
  1049.     dc.b 0            ;Portspeed
  1050.     dc.b 0            ;
  1051.     dc.l 0            ;FineTune
  1052.  
  1053.     even
  1054. QC_chan2:dc.l 0
  1055.     dc.l 0
  1056.     dc.w 0
  1057.     dc.w 0
  1058.     dc.w 0
  1059.     dc.w 0
  1060.     dc.w 0
  1061.     dc.l 0
  1062.     dc.w 2
  1063.     dc.w 0
  1064.     dc.w 0
  1065.     dc.b 0
  1066.     dc.b 0
  1067.     dc.b 0
  1068.     dc.b 0
  1069.     dc.w 0
  1070.     dc.b 0
  1071.     dc.b 0
  1072.     dc.w 0
  1073.     dc.b 0
  1074.     dc.b 0
  1075.     dc.b 0
  1076.     dc.b 0
  1077.     dc.l 0
  1078.  
  1079.     even
  1080. QC_chan3:dc.l 0
  1081.     dc.l 0
  1082.     dc.w 0
  1083.     dc.w 0
  1084.     dc.w 0
  1085.     dc.w 0
  1086.     dc.w 0
  1087.     dc.l 0
  1088.     dc.w 4
  1089.     dc.w 0
  1090.     dc.w 0
  1091.     dc.b 0
  1092.     dc.b 0
  1093.     dc.b 0
  1094.     dc.b 0
  1095.     dc.w 0
  1096.     dc.b 0
  1097.     dc.b 0
  1098.     dc.w 0
  1099.     dc.b 0
  1100.     dc.b 0
  1101.     dc.b 0
  1102.     dc.b 0
  1103.     dc.l 0
  1104.  
  1105.     even
  1106. QC_chan4:dc.l 0
  1107.     dc.l 0
  1108.     dc.w 0
  1109.     dc.w 0
  1110.     dc.w 0
  1111.     dc.w 0
  1112.     dc.w 0
  1113.     dc.l 0
  1114.     dc.w 8
  1115.     dc.w 0
  1116.     dc.w 0
  1117.     dc.b 0
  1118.     dc.b 0
  1119.     dc.b 0
  1120.     dc.b 0
  1121.     dc.w 0
  1122.     dc.b 0
  1123.     dc.b 0
  1124.     dc.w 0
  1125.     dc.b 0
  1126.     dc.b 0
  1127.     dc.b 0
  1128.     dc.b 0
  1129.     dc.l 0
  1130.  
  1131.     even
  1132. QC_data:            ;Your module here!
  1133.  
  1134.  
  1135.  
  1136.