home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaDemoCD1.iso / DEMOS / DREAMDEALERS-PipelineVOL4.DMS / DREAMDEALERS-PipelineVOL4.adf / TMC / TMC_Replay.s next >
Encoding:
Text File  |  1993-08-06  |  17.9 KB  |  764 lines

  1.  
  2.     *********************************************************
  3.     *                            *
  4.     *    TMC_Replay.s v4.2  coded by Sync/DreamDealers    *
  5.     *        Last change : 4 August 1993        *
  6.     *                            *
  7.     *    This replay is for 68020 and more only!!    *
  8.     *        NOTE: VBR must be set to 0        *
  9.     *                            *
  10.     *    bsr mt_init    : at the init (D0/A0-A1 used )    *
  11.     *    bsr mt_music    : each vbl (D0-D7/A0-A5 used)    *
  12.     *    bsr mt_end    : at the end (D0/A0 used )    *
  13.     *                            *
  14.     *    Uses an interrupt of level 6  ( $78.w )        *
  15.     *    DO NOT DISABLE the 13th and 14th bits of INTENA    *
  16.     *    ALSO DO NOT DISABLE bit 9 of DMACON if ya want    *
  17.     *    to hear something...                *
  18.     *    Also uses the CIA-B timer B for initializing    *
  19.     *    the samples while replaying            *
  20.     *                            *
  21.     *  Suported commands :  0/1/2/3/4/5/6/7/9/A/B/C/D/F    *
  22.     *            E0/E1/E2/E6/E9/EA/EB/EC/ED/EE    *
  23.     *            + FineTune            *
  24.     *                            *
  25.     *********************************************************
  26.  
  27.     rsreset
  28. mt_struct_voice    rs.b 0
  29. mt_info        rs.b 1
  30. mt_sampleoffset    rs.b 1
  31. mt_finetune    rs.l 1
  32. mt_samp_adr    rs.l 1
  33. mt_len        rs.w 1
  34. mt_volume    rs.w 1
  35. mt_repeat    rs.l 1
  36. mt_replen    rs.w 1
  37. mt_period    rs.w 1
  38. mt_port_per    rs.w 1
  39. mt_port_speed    rs.w 1
  40. mt_vib_depth    rs.w 1
  41. mt_trem_depth    rs.w 1
  42. mt_vib_rate    rs.b 1
  43. mt_trem_rate    rs.b 1
  44. mt_vib_pos    rs.b 1
  45. mt_trem_pos    rs.b 1
  46. mt_retrig_tic    rs.w 1
  47. mt_cutnote_tic    rs.b 1
  48. mt_delay_tic    rs.b 1
  49. mt_loop_counter    rs.b 1
  50. mt_vumetre    rs.b 1
  51. mt_loop_start    rs.w 1
  52. mt_function    rs.w 1
  53. mt_dma        rs.w 1
  54. mt_SIZEOF    rs.b 0
  55.     rsreset
  56. mt_sample    rs.b 0
  57. mt_samp_repeat    rs.l 1
  58. mt_samp_replen    rs.w 1
  59. mt_samp_volume    rs.w 1
  60. mt_samp_length    rs.w 1
  61. mt_samp_data    rs.w 0
  62. mt_init
  63.     lea mt_voice0(pc),a0
  64.     moveq #mt_SIZEOF-1,d0
  65. mt_clear_voice
  66.     clr.l (a0)+
  67.     dbf d0,mt_clear_voice
  68.     addq.w #$1,mt_voice0+mt_dma-mt_dmacon(a0)
  69.     addq.w #$2,mt_voice1+mt_dma-mt_dmacon(a0)
  70.     addq.w #$4,mt_voice2+mt_dma-mt_dmacon(a0)
  71.     addq.w #$8,mt_voice3+mt_dma-mt_dmacon(a0)
  72.     clr.w (a0)
  73.     lea mt_pos(pc),a1
  74.     move.l a1,mt_songpos-mt_dmacon(a0)
  75.     move.l (a1),a1
  76.     move.w (a1),mt_pattern_len-mt_dmacon(a0)
  77.     move.l #(5<<16)!(5),mt_counter-mt_dmacon(a0)
  78.     move.l #(2<<16),mt_pattpos-mt_dmacon(a0)
  79.     bsr.s mt_set_global_volume
  80.     lea $dff000,a0
  81.     lea $bfe000,a1
  82.     move.w #$2000,$9a(a0)
  83.     move.l #mt_IT6_1,$78.w
  84.     move.b #$7f,$dd00-$e000(a1)
  85.     move.b #$80,$d600-$e000(a1)
  86.     move.b #$01,$d700-$e000(a1)
  87.     move.b #$19,$df00-$e000(a1)
  88.     bset #1,$e001-$e000(a1)
  89. mt_wait
  90.     btst #1,$dd00-$e000(a1)
  91.     beq.s mt_wait
  92.     move.b #$82,$dd00-$e000(a1)
  93.     move.w #$2000,$9c(a0)
  94.     move.w #$a000,$9a(a0)
  95. mt_end
  96.     moveq #0,d0
  97.     lea $dff000,a0
  98.     move.w d0,$a8(a0)
  99.     move.w d0,$b8(a0)
  100.     move.w d0,$c8(a0)
  101.     move.w d0,$d8(a0)
  102.     move.w #$f,$96(a0)
  103.     rts
  104. mt_set_global_volume
  105.     move.l mt_global_volume(pc),d0
  106.     divu.l #100,d0
  107.     lea mt_percent(pc),a0
  108.     move.l d0,(a0)
  109.     rts
  110. mt_music
  111.     lea mt_samples_list(pc),a4
  112.     move.w mt_counter(pc),d0
  113.     cmp.w mt_speed(pc),d0
  114.     bne mt_nonew
  115.     clr.l mt_dmacon-mt_samples_list(a4)
  116.     move.l mt_songpos(pc),a0
  117.     move.l (a0),a0
  118.     add.w mt_pattpos(pc),a0
  119.     lea mt_voice0(pc),a1
  120.     lea $dff000,a3
  121.     lea $a0(a3),a2
  122.     moveq #0,d3
  123.     moveq #4-1,d4
  124.     moveq #3*4,d5
  125.     move.w mt_pattdelay(pc),d6
  126.     moveq #0,d7
  127.     bra.s mt_playvoice
  128. mt_loop_playvoice
  129.     lea mt_SIZEOF(a1),a1
  130.     lea $10(a2),a2
  131. mt_playvoice
  132.     tst.b mt_vumetre(a1)
  133.     beq.s mt_vumetre_init
  134.     subq.b #1,mt_vumetre(a1)
  135. mt_vumetre_init
  136.     move.b (a0)+,d1
  137.     bmi mt_pack
  138.     and.w #$7c,d1
  139.     beq.s mt_oldinstr
  140.     move.l -4(a4,d1.w),a5
  141.     move.l (a5)+,mt_len(a1)
  142.     move.w -2(a5),8(a2)
  143.     move.l (a5)+,mt_repeat(a1)
  144.     move.w (a5)+,mt_replen(a1)
  145.     move.l (a5)+,mt_finetune(a1)
  146.     move.l a5,mt_samp_adr(a1)
  147.     move.b mt_volume+1(a1),mt_vumetre(a1)
  148. mt_oldinstr    
  149.     moveq #0,d0
  150.     move.w mt_volume(a1),d0
  151.     mulu.l mt_percent(pc),d0
  152.     swap d0
  153.     move.w d0,8(a2)
  154.     move.b (a0)+,d0
  155.     and.w #$f,d0
  156.     move.w d0,mt_function(a1)
  157.     jmp mt_com2_function(pc,d0.w*4)
  158. mt_com2_function
  159.     bra.w mt_others
  160.     bra.w mt_others
  161.     bra.w mt_others
  162.     bra.w mt_setport
  163.     bra.w mt_others
  164.     bra.w mt_setvolport
  165.     bra.w mt_others
  166.     bra.w mt_others
  167.     bra.w mt_others
  168.     bra.w mt_sample_offset
  169.     bra.w mt_others
  170.     bra.w mt_posjmp
  171.     bra.w mt_setvol
  172.     bra.w mt_pattbreak
  173.     bra.w mt_E_commands
  174. mt_set_speed
  175.     move.b (a0)+,mt_speed+1-mt_samples_list(a4)
  176.     bra mt_set_instr
  177. mt_setvolport
  178.     move.b (a0)+,(a1)
  179.     bra.s mt_do_setport
  180. mt_setport
  181.     move.b (a0)+,d1
  182.     beq.s mt_do_setport
  183.     move.w d1,mt_port_speed(a1)
  184. mt_do_setport
  185.     bfextu -3(a0){6:6},d1
  186.     move.l mt_finetune(a1),a5
  187.     move.w (a5,d1.w*2),d0
  188.     beq mt_no_instr
  189.     move.b mt_volume+1(a1),mt_vumetre(a1)
  190.     move.w d0,mt_port_per(a1)
  191.     dbf d4,mt_loop_playvoice
  192.     bra mt_end_playvoice
  193. mt_sample_offset
  194.     move.b (a0)+,d1
  195.     beq.s mt_offset_old
  196.     move.b d1,mt_sampleoffset(a1)
  197. mt_offset_old
  198.     move.b mt_sampleoffset(a1),d1
  199.     lsl.w #7,d1
  200.     cmp.w mt_len(a1),d1
  201.     bge.s mt_offset_skip
  202.     sub.w d1,mt_len(a1)
  203.     add.w d1,d1
  204.     add.l d1,mt_samp_adr(a1)
  205.     bra mt_set_instr
  206. mt_offset_skip
  207.     move.w #$1,mt_len(a1)
  208.     move.w mt_dma(a1),$96(a3)
  209.     dbf d4,mt_loop_playvoice
  210.     bra mt_end_playvoice
  211. mt_posjmp
  212.     move.w #2,mt_pattpos-mt_samples_list(a4)
  213.     move.b (a0)+,d1
  214.     lea mt_pos-mt_samples_list(a4,d1.w*2),a5
  215.     move.l a5,mt_songpos-mt_samples_list(a4)
  216.     move.l (a5),a5
  217.     move.w (a5),mt_pattern_len-mt_samples_list(a4)
  218.     moveq #-5,d3
  219.     bra mt_set_instr
  220. mt_setvol
  221.     moveq #0,d1
  222.     move.b (a0)+,d1
  223.     move.b d1,mt_volume+1(a1)
  224.     mulu.l mt_percent(pc),d1
  225.     swap d1
  226.     move.w d1,8(a2)
  227.     bra mt_set_instr
  228. mt_pattbreak
  229.     move.b (a0)+,d1
  230.     move.w mt_break(pc,d1.w),mt_pattpos-mt_samples_list(a4)
  231.     addq.w #1,d3
  232.     bra mt_set_instr
  233. mt_break
  234.     dc.w 2,14,26,38,50,62,74,86,98,110,122,134,146,158,170,182,194
  235.     dc.w 206,218,230,242,254,266,278,290,302,314,326,338,350,362
  236.     dc.w 374,386,398,410,422,434,446,458,470,482,494,506,518,530
  237.     dc.w 542,554,566,578,590,602,614,626,638,650,662,674,686,698
  238.     dc.w 710,722,734,746,758
  239. mt_E_commands
  240.     move.b (a0)+,d1
  241.     move.b d1,d2
  242.     and.w #$f0,d1
  243.     lsr.w #2,d1
  244.     and.w #$f,d2
  245.     jmp mt_com2_E_function(pc,d1.w)
  246. mt_com2_E_function
  247.     bra.w mt_set_filter
  248.     bra.w mt_fineslide_up
  249.     bra.w mt_fineslide_down
  250.     bra.w mt_set_instr
  251.     bra.w mt_set_instr
  252.     bra.w mt_set_instr
  253.     bra.w mt_set_loop
  254.     bra.w mt_set_instr
  255.     bra.w mt_set_instr
  256.     bra.w mt_set_retrig
  257.     bra.w mt_finevolslide_up
  258.     bra.w mt_finevolslide_down
  259.     bra.w mt_set_cutnote
  260.     bra.w mt_set_notedelay
  261.     bra.w mt_set_patterndelay
  262.     bra.w mt_set_instr
  263. mt_set_filter
  264.     beq.s mt_filter_on
  265.     bset #1,$bfe001
  266.     bra mt_set_instr
  267. mt_filter_on
  268.     bclr #1,$bfe001
  269.     bra mt_set_instr
  270. mt_fineslide_up
  271.     bfextu -3(a0){6:6},d1
  272.     move.l mt_finetune(a1),a5
  273.     move.w (a5,d1.w*2),d0
  274.     beq mt_no_instr
  275.     sub.w d2,d0
  276.     bra mt_E_branch
  277. mt_fineslide_down
  278.     bfextu -3(a0){6:6},d1
  279.     move.l mt_finetune(a1),a5
  280.     move.w (a5,d1.w*2),d0
  281.     beq mt_no_instr
  282.     add.w d2,d0
  283.     bra mt_E_branch
  284. mt_set_loop
  285.     beq.s mt_init_loop_start
  286.     tst.b mt_loop_counter(a1)
  287.     bne.s mt_jump_loop
  288.     move.b d2,mt_loop_counter(a1)
  289.     move.w mt_loop_start(a1),mt_pattpos-mt_samples_list(a4)
  290.     moveq #-1,d7
  291.     bra mt_set_instr
  292. mt_init_loop_start
  293.     move.w mt_pattpos(pc),mt_loop_start(a1)
  294.     bra mt_set_instr
  295. mt_jump_loop
  296.     subq.b #1,mt_loop_counter(a1)
  297.     beq.s mt_remove_loop
  298.     move.w mt_loop_start(a1),mt_pattpos-mt_samples_list(a4)
  299.     moveq #-1,d7
  300.     bra mt_set_instr
  301. mt_remove_loop
  302.     clr.w mt_loop_start(a1)
  303.     bra mt_set_instr
  304. mt_set_retrig
  305.     beq.s mt_zero_retrig
  306.     move.w d2,mt_retrig_tic(a1)
  307.     move.w #$10,mt_function(a1)
  308. mt_zero_retrig
  309.     bra mt_set_instr
  310. mt_finevolslide_up
  311.     add.w d2,mt_volume(a1)
  312.     cmp.w #64,mt_volume(a1)
  313.     ble.s mt_finevolslide_ok
  314.     move.w #64,mt_volume(a1)
  315. mt_finevolslide_ok
  316.     moveq #0,d0
  317.     move.w mt_volume(a1),d0
  318.     mulu.l mt_percent(pc),d0
  319.     swap d0
  320.     move.w d0,8(a2)
  321.     bra.s mt_set_instr
  322. mt_finevolslide_down
  323.     sub.w d2,mt_volume(a1)
  324.     bge.s mt_finevolslide_ok
  325.     move.w #0,8(a2)
  326.     clr.w mt_volume(a1)
  327.     bra.s mt_set_instr
  328. mt_set_cutnote
  329.     move.b d2,mt_cutnote_tic(a1)
  330.     move.w #$11,mt_function(a1)
  331.     bra.s mt_set_instr
  332. mt_set_notedelay
  333.     move.b d2,mt_delay_tic(a1)
  334.     move.w #$12,mt_function(a1)
  335.     bra.s mt_no_instr
  336. mt_set_patterndelay
  337.     tst.w mt_pattdelay-mt_samples_list(a4)
  338.     bne.s mt_set_instr
  339.     move.w d2,d6
  340.     addq.w #1,d6
  341.     bra.s mt_set_instr
  342. mt_pack
  343.     and.w #$3,d1
  344.     sub.w d1,d4
  345.     addq.w #1,d5
  346. mt_pack_skip
  347.     moveq #0,d0
  348.     move.w mt_volume(a1),d0
  349.     mulu.l mt_percent(pc),d0
  350.     swap d0
  351.     move.w d0,8(a2)
  352.     clr.b (a1)
  353.     clr.w mt_function(a1)
  354.     lea mt_SIZEOF(a1),a1
  355.     lea $10(a2),a2
  356.     subq.w #3,d5
  357.     dbf d1,mt_pack_skip
  358.     dbf d4,mt_playvoice
  359.     bra.s mt_end_playvoice
  360. mt_others
  361.     move.b (a0)+,(a1)
  362. mt_set_instr
  363.     bfextu -3(a0){6:6},d1
  364.     move.l mt_finetune(a1),a5
  365.     move.w (a5,d1.w*2),d0
  366.     beq.s mt_no_instr
  367.     move.b mt_volume+1(a1),mt_vumetre(a1)
  368. mt_E_branch
  369.     move.w mt_dma(a1),d1
  370.     move.w d1,$96(a3)
  371.     or.w d1,mt_dmacon-mt_samples_list(a4)
  372.     move.l mt_samp_adr(a1),(a2)
  373.     move.w mt_len(a1),4(a2)
  374.     move.w d0,mt_period(a1)
  375.     move.w d0,6(a2)
  376.     clr.w mt_vib_pos(a1)
  377. mt_no_instr
  378.     dbf d4,mt_loop_playvoice
  379. mt_end_playvoice
  380.     tst.w mt_dmacon-mt_samples_list(a4)
  381.     beq.s mt_nodma
  382.     move.b #$19,$bfdf00
  383.     or.w #$8000,mt_dmacon-mt_samples_list(a4)
  384. mt_nodma
  385.     tst.w d6
  386.     beq.s mt_no_pattdelay
  387.     subq.w #1,d6
  388.     move.w d6,mt_pattdelay-mt_samples_list(a4)
  389.     bne.s mt_exit
  390. mt_no_pattdelay
  391.     tst.w d7
  392.     bne.s mt_exit
  393.     tst.w d3
  394.     bmi.s mt_exit
  395.     bne.s mt_do_break
  396.     add.w d5,mt_pattpos-mt_samples_list(a4)
  397.     move.w mt_pattern_len(pc),d0
  398.     cmp.w mt_pattpos-mt_samples_list(a4),d0
  399.     bne.s mt_exit
  400.     move.w #2,mt_pattpos-mt_samples_list(a4)
  401. mt_do_break
  402.     addq.l #4,mt_songpos-mt_samples_list(a4)
  403.     move.l mt_songpos(pc),a0
  404.     cmp.l #mt_pos_end,a0
  405.     blt.s mt_exit2
  406.     move.l mt_restart(pc),a0
  407.     move.l a0,mt_songpos-mt_samples_list(a4)
  408. mt_exit2
  409.     move.l (a0),a0
  410.     move.w (a0),mt_pattern_len-mt_samples_list(a4)
  411. mt_exit
  412.     rts
  413. mt_do_retrig
  414.     move.w mt_dmacon(pc),d1
  415.     beq.s mt_retrig_nodma
  416.     move.w d1,$96-$d0(a1)
  417.     move.b #$19,$bfdf00
  418.     or.w #$8000,mt_dmacon-mt_samples_list(a4)
  419. mt_retrig_nodma
  420.     rts
  421. mt_nonew
  422.     pea mt_do_retrig(pc)
  423.     clr.w mt_dmacon-mt_samples_list(a4)
  424.     addq.w #1,mt_counter-mt_samples_list(a4)
  425.     lea mt_voice0(pc),a0
  426.     lea $dff0a0,a1
  427.     moveq #4-1,d4
  428.     bra.s mt_com
  429. mt_loop_nonew
  430.     lea mt_SIZEOF(a0),a0
  431.     lea $10(a1),a1
  432. mt_com
  433.     tst.b mt_vumetre(a0)
  434.     beq.s mt_vumetre_com
  435.     subq.b #1,mt_vumetre(a0)
  436. mt_vumetre_com
  437.     moveq #0,d1
  438.     move.w mt_volume(a0),d1
  439.     mulu.l mt_percent(pc),d1
  440.     swap d1
  441.     move.w d1,8(a1)
  442.     move.w mt_function(a0),d0
  443.     jmp mt_com_function(pc,d0.w*4)
  444. mt_com_function
  445.     bra.w mt_check_arp
  446.     bra.w mt_portup
  447.     bra.w mt_portdown
  448.     bra.w mt_port
  449.     bra.w mt_vibrato
  450.     bra.w mt_volport
  451.     bra.w mt_volvib
  452.     bra.w mt_tremolo
  453.     bra.w mt_com_exit
  454.     bra.w mt_com_exit
  455.     bra.w mt_volslide
  456.     bra.w mt_com_exit
  457.     bra.w mt_com_exit
  458.     bra.w mt_com_exit
  459.     bra.w mt_com_exit
  460.     bra.w mt_com_exit
  461.     bra.w mt_retrig
  462.     bra.w mt_cutnote
  463.     bra.w mt_notedelay
  464. mt_check_arp
  465.     move.b (a0),d1
  466.     bne.s mt_arp
  467. mt_normper
  468.     move.w mt_period(a0),6(a1)
  469. mt_com_exit
  470.     dbf d4,mt_loop_nonew
  471.     rts
  472. mt_arp
  473.     move.w mt_counter(pc),d0
  474.     move.b mt_arplist(pc,d0.w),d0
  475.     beq.s mt_normper
  476.     bpl.s mt_arp2
  477. mt_arp1
  478.     lsr.b #4,d1
  479. mt_arp2
  480.     and.w d0,d1
  481. mt_arpdo
  482.     move.w mt_period(a0),d0
  483.     move.l mt_finetune(a0),a2
  484. mt_search_arp
  485.     cmp.w (a2)+,d0
  486.     blt.s mt_search_arp
  487. mt_arpfound
  488.     move.w -2(a2,d1.w*2),6(a1)
  489.     dbf d4,mt_loop_nonew
  490.     rts
  491. mt_arplist
  492.     dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
  493.     dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
  494.     dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
  495.     dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
  496.     dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
  497.     dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0
  498. mt_portup
  499.      move.b (a0),d0
  500.     move.w mt_period(a0),d1
  501.     sub.w d0,d1
  502.     cmp.w #113,d1
  503.     bge.s mt_portup2
  504.     move.w #113,d1
  505. mt_portup2
  506.     move.w d1,mt_period(a0)
  507.     move.w d1,6(a1)
  508.     dbf d4,mt_loop_nonew
  509.     rts
  510. mt_portdown
  511.     move.b (a0),d0
  512.     move.w mt_period(a0),d1
  513.     add.w d0,d1
  514.     cmp.w #856,d1
  515.     ble.s mt_portup2
  516.     move.w #856,d1
  517.     move.w d1,mt_period(a0)
  518.     move.w d1,6(a1)
  519.     dbf d4,mt_loop_nonew
  520.     rts
  521. mt_port
  522.     pea mt_com_exit(pc)
  523. mt_port2
  524.     move.w mt_period(a0),d0
  525.     beq.s mt_port_exit
  526.     move.w mt_port_per(a0),d1
  527.     beq.s mt_port_exit
  528.     cmp.w d0,d1
  529.     beq.s mt_port_end
  530.     bgt.s mt_port_add
  531. mt_port_sub
  532.     sub.w mt_port_speed(a0),d0
  533.     cmp.w d0,d1
  534.     bge.s mt_port_end
  535.     move.w d0,6(a1)
  536.     move.w d0,mt_period(a0)
  537. mt_port_exit
  538.     rts
  539. mt_port_add
  540.     add.w mt_port_speed(a0),d0
  541.     cmp.w d0,d1
  542.     ble.s mt_port_end
  543.     move.w d0,6(a1)
  544.     move.w d0,mt_period(a0)
  545.     rts
  546. mt_port_end
  547.     move.w d1,6(a1)
  548.     move.w d1,mt_period(a0)
  549.     clr.w mt_port_per(a0)
  550.     rts
  551. mt_vibrato
  552.     pea mt_com_exit(pc)
  553.     move.b (a0),d1
  554.     beq.s mt_vibrato2
  555.     move.b d1,d2
  556.     and.w #$f,d2
  557.     beq.s mt_vib_skip
  558.     add.w d2,d2
  559.     add.w d2,d2
  560.     move.b d2,mt_vib_rate(a0)
  561. mt_vib_skip
  562.     and.w #$f0,d1
  563.     beq.s mt_vibrato2
  564.     add.w d1,d1
  565.     move.w d1,mt_vib_depth(a0)
  566. mt_vibrato2
  567.     moveq #$3c,d1
  568.     and.b mt_vib_pos(a0),d1
  569.     lsr.w #2,d1
  570.     add.w mt_vib_depth(a0),d1
  571.     move.b mt_vibrato_table(pc,d1.w),d0
  572.     move.w mt_period(a0),d1
  573.     tst.b mt_vib_pos(a0)
  574.     bpl.s mt_vib_add
  575.     neg.w d0
  576. mt_vib_add
  577.     add.w d0,d1
  578.     move.w d1,6(a1)
  579.     move.b mt_vib_rate(a0),d0
  580.     add.b d0,mt_vib_pos(a0)
  581.     rts
  582. mt_vibrato_table
  583.     dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  584.     dc.b 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0
  585.     dc.b 0,0,0,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,0,0
  586.     dc.b 0,0,1,1,2,2,3,3,4,4,4,5,5,5,5,5,5,5,5,5,5,5,4,4,4,3,3,2,2,1,1,0
  587.     dc.b 0,0,1,2,3,3,4,5,5,6,6,7,7,7,7,7,7,7,7,7,7,7,6,6,5,5,4,3,3,2,1,0
  588.     dc.b 0,0,1,2,3,4,5,6,7,7,8,8,9,9,9,9,9,9,9,9,9,8,8,7,7,6,5,4,3,2,1,0
  589.     dc.b 0,1,2,3,4,5,6,7,8,9,9,10,11,11,11,11,11,11,11,11,11,10,9,9,8,7,6,5,4,3,2,1
  590.     dc.b 0,1,2,4,5,6,7,8,9,10,11,12,12,13,13,13,13,13,13,13,12,12,11,10,9,8,7,6,5,4,2,1
  591.     dc.b 0,1,3,4,6,7,8,10,11,12,13,14,14,15,15,15,15,15,15,15,14,14,13,12,11,10,8,7,6,4,3,1
  592.     dc.b 0,1,3,5,6,8,9,11,12,13,14,15,16,17,17,17,17,17,17,17,16,15,14,13,12,11,9,8,6,5,3,1
  593.     dc.b 0,1,3,5,7,9,11,12,14,15,16,17,18,19,19,19,19,19,19,19,18,17,16,15,14,12,11,9,7,5,3,1
  594.     dc.b 0,2,4,6,8,10,12,13,15,16,18,19,20,20,21,21,21,21,21,20,20,19,18,16,15,13,12,10,8,6,4,2
  595.     dc.b 0,2,4,6,9,11,13,15,16,18,19,21,22,22,23,23,23,23,23,22,22,21,19,18,16,15,13,11,9,6,4,2
  596.     dc.b 0,2,5,7,9,12,14,16,18,20,21,22,23,24,25,25,25,25,25,24,23,22,21,20,18,16,14,12,9,7,5,2
  597.     dc.b 0,2,5,8,10,13,15,17,19,21,23,24,25,26,27,27,27,27,27,26,25,24,23,21,19,17,15,13,10,8,5,2
  598.     dc.b 0,2,5,8,11,14,16,18,21,23,24,26,27,28,29,29,29,29,29,28,27,26,24,23,21,18,16,14,11,8,5,2
  599. mt_tremolo
  600.     move.b (a0),d1
  601.     beq.s mt_tremolo2
  602.     move.b d1,d2
  603.     and.w #$f,d2
  604.     beq.s mt_trem_skip
  605.     add.w d2,d2
  606.     add.w d2,d2
  607.     move.b d2,mt_trem_rate(a0)
  608. mt_trem_skip
  609.     and.w #$f0,d1
  610.     beq.s mt_tremolo2
  611.     add.w d1,d1
  612.     move.w d1,mt_trem_depth(a0)
  613. mt_tremolo2
  614.     moveq #$3c,d1
  615.     and.b mt_trem_pos(a0),d1
  616.     lsr.w #2,d1
  617.     add.w mt_trem_depth(a0),d1
  618.     move.b mt_tremolo_table(pc,d1.w),d0
  619.     moveq #0,d1
  620.     move.w mt_volume(a0),d1
  621.     tst.b mt_trem_pos(a0)
  622.     bpl.s mt_trem_add
  623.     neg.w d0
  624. mt_trem_add
  625.     add.w d0,d1
  626.     bpl.s mt_trem_pl
  627.     moveq #0,d1
  628.     bra.s mt_trem_le
  629. mt_trem_pl
  630.     cmp.b #$40,d1
  631.     ble.s mt_trem_le
  632.     moveq #$40,d1
  633. mt_trem_le
  634.     mulu.l mt_percent(pc),d1
  635.     swap d1
  636.     move.w d1,8(a1)
  637.     move.b mt_trem_rate(a0),d0
  638.     add.b d0,mt_trem_pos(a0)
  639.     dbf d4,mt_loop_nonew
  640.     rts
  641. mt_tremolo_table
  642.     dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  643.     dc.b 0,0,0,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,0,0
  644.     dc.b 0,0,1,2,3,3,4,5,5,6,6,7,7,7,7,7,7,7,7,7,7,7,6,6,5,5,4,3,3,2,1,0
  645.     dc.b 0,1,2,3,4,5,6,7,8,9,9,10,11,11,11,11,11,11,11,11,11,10,9,9,8,7,6,5,4,3,2,1
  646.     dc.b 0,1,3,4,6,7,8,10,11,12,13,14,14,15,15,15,15,15,15,15,14,14,13,12,11,10,8,7,6,4,3,1
  647.     dc.b 0,1,3,5,7,9,11,12,14,15,16,17,18,19,19,19,19,19,19,19,18,17,16,15,14,12,11,9,7,5,3,1
  648.     dc.b 0,2,4,6,9,11,13,15,16,18,19,21,22,22,23,23,23,23,23,22,22,21,19,18,16,15,13,11,9,6,4,2
  649.     dc.b 0,2,5,8,10,13,15,17,19,21,23,24,25,26,27,27,27,27,27,26,25,24,23,21,19,17,15,13,10,8,5,2
  650.     dc.b 0,3,6,9,12,15,17,20,22,24,26,28,29,30,31,31,31,31,31,30,29,28,26,24,22,20,17,15,12,9,6,3
  651.     dc.b 0,3,6,10,13,16,19,22,25,27,29,31,33,34,35,35,35,35,35,34,33,31,29,27,25,22,19,16,13,10,6,3
  652.     dc.b 0,3,7,11,15,18,22,25,28,30,33,35,36,38,39,39,39,39,39,38,36,35,33,30,28,25,22,18,15,11,7,3
  653.     dc.b 0,4,8,12,16,20,24,27,30,33,36,38,40,41,42,43,43,43,42,41,40,38,36,33,30,27,24,20,16,12,8,4
  654.     dc.b 0,4,9,13,18,22,26,30,33,36,39,42,44,45,46,47,47,47,46,45,44,42,39,36,33,30,26,22,18,13,9,4
  655.     dc.b 0,5,10,15,19,24,28,32,36,40,43,45,47,49,50,51,51,51,50,49,47,45,43,40,36,32,28,24,19,15,10,5
  656.     dc.b 0,5,10,16,21,26,30,35,39,43,46,49,51,53,54,55,55,55,54,53,51,49,46,43,39,35,30,26,21,16,10,5
  657.     dc.b 0,5,11,17,22,28,33,37,42,46,49,52,55,57,58,59,59,59,58,57,55,52,49,46,42,37,33,28,22,17,11,5
  658. mt_volport
  659.     pea mt_volslide(pc)
  660.     bra mt_port2
  661. mt_volvib
  662.     bsr mt_vibrato2
  663. mt_volslide
  664.     move.b (a0),d0
  665.     add.b d0,mt_volume+1(a0)
  666.     bmi.s mt_vol2
  667.     cmp.w #64,mt_volume(a0)
  668.     ble.s mt_vol1
  669.     move.w #64,mt_volume(a0)
  670. mt_vol1
  671.     moveq #0,d0
  672.     move.w mt_volume(a0),d0
  673.     mulu.l mt_percent(pc),d0
  674.     swap d0
  675.     move.w d0,8(a1)
  676.     dbf d4,mt_loop_nonew
  677.     rts
  678. mt_vol2
  679.     move.w #0,8(a1)
  680.     clr.w mt_volume(a0)
  681.     dbf d4,mt_loop_nonew
  682.     rts
  683. mt_retrig
  684.     move.w mt_speed(pc),d0
  685.     sub.w mt_counter(pc),d0
  686.     divu.w mt_retrig_tic(a0),d0
  687.     swap d0
  688.     tst.w d0
  689.     bne.s mt_no_retrig
  690.     move.w mt_dma(a0),d0
  691.     or.w d0,mt_dmacon-mt_samples_list(a4)
  692.     move.l mt_samp_adr(a0),(a1)
  693.     move.w mt_len(a0),4(a1)
  694.     move.w mt_period(a0),6(a1)
  695. mt_no_retrig
  696.     dbf d4,mt_loop_nonew
  697.     rts
  698. mt_cutnote
  699.     move.w mt_speed(pc),d0
  700.     sub.w mt_counter(pc),d0
  701.     cmp.b mt_cutnote_tic(a0),d0
  702.     bge.s mt_no_cutnote
  703.     move.w #0,8(a1)
  704.     clr.w mt_volume(a0)
  705.     move.w #$E,mt_function(a0)
  706. mt_no_cutnote
  707.     dbf d4,mt_loop_nonew
  708.     rts
  709. mt_notedelay
  710.     move.w mt_speed(pc),d0
  711.     sub.w mt_counter(pc),d0
  712.     cmp.b mt_delay_tic(a0),d0
  713.     bge.s mt_no_notedelay
  714.     move.w mt_dma(a0),d0
  715.     or.w d0,mt_dmacon-mt_samples_list(a4)
  716.     move.l mt_samp_adr(a0),(a1)
  717.     move.w mt_len(a0),4(a1)
  718.     move.w mt_period(a0),6(a1)
  719.     move.w #$E,mt_function(a0)
  720. mt_no_notedelay
  721.     dbf d4,mt_loop_nonew
  722.     rts
  723. mt_IT6_1
  724.     move.w mt_dmacon(pc),$dff096
  725.     tst.b $bfdd00
  726.     add.l #mt_IT6_2-mt_IT6_1,$78.w
  727.     move.b #$19,$bfdf00
  728.     move.w #$2000,$dff09c
  729.     rte
  730. mt_IT6_2
  731.     move.l a0,-(sp)
  732.     lea $dff0a0,a0
  733.     move.l mt_voice0+mt_repeat(pc),(a0)+
  734.     move.w mt_voice0+mt_replen(pc),(a0)
  735.     move.l mt_voice1+mt_repeat(pc),$b0-$a4(a0)
  736.     move.w mt_voice1+mt_replen(pc),$b4-$a4(a0)
  737.     move.l mt_voice2+mt_repeat(pc),$c0-$a4(a0)
  738.     move.w mt_voice2+mt_replen(pc),$c4-$a4(a0)
  739.     move.l mt_voice3+mt_repeat(pc),$d0-$a4(a0)
  740.     move.w mt_voice3+mt_replen(pc),$d4-$a4(a0)
  741.     tst.b $bfdd00
  742.     sub.l #mt_IT6_2-mt_IT6_1,$78.w
  743.     move.w #$2000,$9c-$a4(a0)
  744.     move.l (sp)+,a0
  745.     rte
  746.     CNOP 0,4
  747. mt_songpos    ds.l 1
  748. mt_percent    ds.l 1
  749. mt_voice0    ds.b mt_SIZEOF
  750. mt_voice1    ds.b mt_SIZEOF
  751. mt_voice2    ds.b mt_SIZEOF
  752. mt_voice3    ds.b mt_SIZEOF
  753. mt_dmacon    ds.w 1
  754. mt_counter    ds.w 1
  755. mt_speed    ds.w 1
  756. mt_pattpos    ds.w 1
  757. mt_pattdelay    ds.w 1
  758. mt_pattern_len    ds.w 1
  759.  
  760. *************************************************
  761. * INCLUDE here the file Song.s generated by TMC *
  762. * and -maybe- somewhere else the file Samples.s *
  763. *************************************************
  764.