home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff258.lzh / STReplay / Source / play.asm < prev    next >
Assembly Source File  |  1989-10-18  |  10KB  |  469 lines

  1.         section "play",CODE
  2.         include "exec/types.i"
  3.         include "libraries/dos.i"
  4.         include "streplay_lib.i"
  5.         xdef    mt_start
  6.         xdef    mt_brems
  7.  
  8. call    MACRO
  9.         xref    _LVO\1
  10.         jsr     _LVO\1(a6)
  11.         ENDM
  12.  
  13.         even
  14. mt_start:
  15.         movem.l d2-d7/a2-a6,-(sp)
  16.         bsr     mt_init
  17.         move.l  4,a6
  18.         lea     intnode(pc),a1
  19.         moveq   #5,d0
  20.         call    AddIntServer
  21.         movem.l (sp)+,d2-d7/a2-a6
  22.         rts
  23.  
  24. mt_brems:
  25.         movem.l d2-d7/a2-a6,-(sp)
  26.         lea     intnode(pc),a1
  27.         moveq   #5,d0
  28.         move.l  4,a6
  29.         call    RemIntServer
  30.         bsr     mt_end
  31.         movem.l (sp)+,d2-d7/a2-a6
  32.         rts
  33.  
  34.  
  35. intnode:
  36.         dc.l    0,0
  37.         dc.b    2,0
  38.         dc.l    intname,0,mt_call
  39. intname:
  40.         dc.b    "STReplay_Lib Interrupt",0
  41.         even
  42.  
  43. mt_init:
  44.         moveq   #6,d0
  45.         bsr inits
  46.         move.l  strb_Module(a6),a0
  47.         move.l  a0,mt_data
  48.         add.l   #$03b8,a0
  49.         moveq   #$7f,d0
  50.         moveq   #0,d1
  51. mt_init1:
  52.         move.l  d1,d2
  53.         subq.w  #1,d0
  54. mt_init2:
  55.         move.b  (a0)+,d1
  56.         cmp.b   d2,d1
  57.         bgt     mt_init1
  58.         dbf     d0,mt_init2
  59.         addq.b  #1,d2
  60.  
  61. mt_init3:
  62.         move.l  mt_data(pc),a0
  63.         lea     mt_sample1(pc),a1
  64.         asl.l   #8,d2
  65.         asl.l   #2,d2
  66.         add.l   #$438,d2
  67.         add.l   a0,d2
  68.         moveq   #$1e,d0
  69. mt_init4:
  70.         move.l  d2,(a1)+
  71.         moveq   #0,d1
  72.         move.w  42(a0),d1
  73.         asl.l   #1,d1
  74.         add.l   d1,d2
  75.         add.l   #$1e,a0
  76.         dbf     d0,mt_init4
  77.  
  78.         lea     mt_sample1(PC),a0
  79.         moveq   #0,d0
  80. mt_clear:
  81.         move.l  0(a0,d0.w),a1
  82.         clr.l   (a1)
  83.         addq.w  #4,d0
  84.         cmp.w   #$7c,d0
  85.         bne     mt_clear
  86.  
  87.         clr.w   $dff0a8
  88.         clr.w   $dff0b8
  89.         clr.w   $dff0c8
  90.         clr.w   $dff0d8
  91.         clr.l   mt_partnrplay
  92.         clr.l   mt_partnote
  93.         clr.l   mt_partpoint
  94.  
  95.         move.l  mt_data(pc),a0
  96.         move.b  $3b6(a0),mt_maxpart+1
  97.         rts
  98.  
  99. ; call 'mt_end' to switch the sound off
  100.  
  101. mt_end: clr.w   $dff0a8
  102.         clr.w   $dff0b8
  103.         clr.w   $dff0c8
  104.         clr.w   $dff0d8
  105.         move.w  #$f,$dff096
  106.         rts
  107.  
  108. ; the playroutine - call this every frame
  109.  
  110. mt_call:
  111.         movem.l d2-d7/a2-a6,-(sp)
  112.         bsr.s   mt_music
  113.         movem.l (sp)+,d2-d7/a2-a6
  114.         rts
  115.  
  116. mt_music:
  117.         addq.w  #1,mt_counter
  118. mt_cool: cmp.w  #6,mt_counter
  119.         bne     mt_notsix
  120.         clr.w   mt_counter
  121.         bra     mt_rout2
  122.  
  123. mt_notsix:
  124.         lea     mt_aud1temp(PC),a6
  125.         tst.b   3(a6)
  126.         beq     mt_arp1
  127.         lea     $dff0a0,a5
  128.         bsr     mt_arprout
  129. mt_arp1: lea    mt_aud2temp(PC),a6
  130.         tst.b   3(a6)
  131.         beq     mt_arp2
  132.         lea     $dff0b0,a5
  133.         bsr     mt_arprout
  134. mt_arp2: lea    mt_aud3temp(PC),a6
  135.         tst.b   3(a6)
  136.         beq     mt_arp3
  137.         lea     $dff0c0,a5
  138.         bsr     mt_arprout
  139. mt_arp3: lea    mt_aud4temp(PC),a6
  140.         tst.b   3(a6)
  141.         beq     mt_arp4
  142.         lea     $dff0d0,a5
  143.         bra     mt_arprout
  144. mt_arp4: rts
  145.  
  146. mt_arprout:
  147.         move.b  2(a6),d0
  148.         and.b   #$0f,d0
  149.         tst.b   d0
  150.         beq     mt_arpegrt
  151.         cmp.b   #$01,d0
  152.         beq     mt_portup
  153.         cmp.b   #$02,d0
  154.         beq     mt_portdwn
  155.         cmp.b   #$0a,d0
  156.         beq     mt_volslide
  157.         rts
  158.  
  159. mt_portup:
  160.         moveq   #0,d0
  161.         move.b  3(a6),d0
  162.         sub.w   d0,22(a6)
  163.         cmp.w   #$71,22(a6)
  164.         bpl     mt_ok1
  165.         move.w  #$71,22(a6)
  166. mt_ok1: move.w  22(a6),6(a5)
  167.         rts
  168.  
  169. mt_portdwn:
  170.         moveq   #0,d0
  171.         move.b  3(a6),d0
  172.         add.w   d0,22(a6)
  173.         cmp.w   #$538,22(a6)
  174.         bmi     mt_ok2
  175.         move.w  #$538,22(a6)
  176. mt_ok2: move.w  22(a6),6(a5)
  177.         rts
  178.  
  179. mt_volslide:
  180.         moveq   #0,d0
  181.         move.b  3(a6),d0
  182.         lsr.b   #4,d0
  183.         tst.b   d0
  184.         beq     mt_voldwn
  185.         add.w   d0,18(a6)
  186.         cmp.w   #64,18(a6)
  187.         bmi     mt_ok3
  188.         move.w  #64,18(a6)
  189. mt_ok3: move.w  18(a6),8(a5)
  190.         rts
  191. mt_voldwn:
  192.         moveq   #0,d0
  193.         move.b  3(a6),d0
  194.         and.b   #$0f,d0
  195.         sub.w   d0,18(a6)
  196.         bpl     mt_ok4
  197.         clr.w   18(a6)
  198. mt_ok4: move.w  18(a6),8(a5)
  199.         rts
  200.  
  201. mt_arpegrt:
  202.         move.w  mt_counter(PC),d0
  203.         cmp.w   #1,d0
  204.         beq     mt_loop2
  205.         cmp.w   #2,d0
  206.         beq     mt_loop3
  207.         cmp.w   #3,d0
  208.         beq     mt_loop4
  209.         cmp.w   #4,d0
  210.         beq     mt_loop2
  211.         cmp.w   #5,d0
  212.         beq     mt_loop3
  213.         rts
  214.  
  215. mt_loop2:
  216.         moveq   #0,d0
  217.         move.b  3(a6),d0
  218.         lsr.b   #4,d0
  219.         bra     mt_cont
  220. mt_loop3:
  221.         moveq   #$00,d0
  222.         move.b  3(a6),d0
  223.         and.b   #$0f,d0
  224.         bra     mt_cont
  225. mt_loop4:
  226.         move.w  16(a6),d2
  227.         bra     mt_endpart
  228. mt_cont:
  229.         add.w   d0,d0
  230.         moveq   #0,d1
  231.         move.w  16(a6),d1
  232.         and.w   #$fff,d1
  233.         lea     mt_arpeggio(PC),a0
  234. mt_loop5:
  235.         move.w  0(A0,d0),d2
  236.         cmp.w   (a0),d1
  237.         beq     mt_endpart
  238.         addq.l  #2,a0
  239.         bra     mt_loop5
  240. mt_endpart:
  241.         move.w  d2,6(a5)
  242.         rts
  243.  
  244. mt_rout2:
  245.         move.l  mt_data(pc),a0
  246.         move.l  a0,a3
  247.         add.l   #$0c,a3
  248.         move.l  a0,a2
  249.         add.l   #$3b8,a2
  250.         add.l   #$43c,a0
  251.         move.l  mt_partnrplay(PC),d0
  252.         moveq   #0,d1
  253.         move.b  0(A2,d0),d1
  254.         asl.l   #8,d1
  255.         asl.l   #2,d1
  256.         add.l   mt_partnote(PC),d1
  257.         move.l  d1,mt_partpoint
  258.         clr.w   mt_dmacon
  259.  
  260.         lea     $dff0a0,a5
  261.         lea     mt_aud1temp(PC),a6
  262.         bsr     mt_playit
  263.         lea     $dff0b0,a5
  264.         lea     mt_aud2temp(PC),a6
  265.         bsr     mt_playit
  266.         lea     $dff0c0,a5
  267.         lea     mt_aud3temp(PC),a6
  268.         bsr     mt_playit
  269.         lea     $dff0d0,a5
  270.         lea     mt_aud4temp(PC),a6
  271.         bsr     mt_playit
  272.         move.w  #$01f4,d0
  273. mt_rls: dbf     d0,mt_rls
  274.  
  275.         move.w  #$8000,d0
  276.         or.w    mt_dmacon,d0
  277.         move.w  d0,$dff096
  278.  
  279.         lea     mt_aud4temp(PC),a6
  280.         cmp.w   #1,14(a6)
  281.         bne     mt_voice3
  282.         move.l  10(a6),$dff0d0
  283.         move.w  #1,$dff0d4
  284. mt_voice3:
  285.         lea     mt_aud3temp(PC),a6
  286.         cmp.w   #1,14(a6)
  287.         bne     mt_voice2
  288.         move.l  10(a6),$dff0c0
  289.         move.w  #1,$dff0c4
  290. mt_voice2:
  291.         lea     mt_aud2temp(PC),a6
  292.         cmp.w   #1,14(a6)
  293.         bne     mt_voice1
  294.         move.l  10(a6),$dff0b0
  295.         move.w  #1,$dff0b4
  296. mt_voice1:
  297.         lea     mt_aud1temp(PC),a6
  298.         cmp.w   #1,14(a6)
  299.         bne     mt_voice0
  300.         move.l  10(a6),$dff0a0
  301.         move.w  #1,$dff0a4
  302. mt_voice0:
  303.         move.l  mt_partnote(PC),d0
  304.         add.l   #$10,d0
  305.         move.l  d0,mt_partnote
  306.         cmp.l   #$400,d0
  307.         bne     mt_stop
  308. mt_higher:
  309.         clr.l   mt_partnote
  310.         addq.l  #1,mt_partnrplay
  311.         moveq   #0,d0
  312.         move.w  mt_maxpart(PC),d0
  313.         move.l  mt_partnrplay(PC),d1
  314.         cmp.l   d0,d1
  315.         bne     mt_stop
  316.         clr.l   mt_partnrplay
  317. ;       st      Pflag
  318. mt_stop: tst.w  mt_status
  319.         beq     mt_stop2
  320.         clr.w   mt_status
  321.         bra     mt_higher
  322. mt_stop2:
  323.         rts
  324.  
  325. mt_playit:
  326.         move.l  0(A0,d1.l),(a6)
  327.         addq.l  #4,d1
  328.         moveq   #0,d2
  329.         move.b  2(a6),d2
  330.         and.b   #$f0,d2
  331.         lsr.b   #4,d2
  332.  
  333.         move.b  (a6),d0
  334.         and.b   #$f0,d0
  335.         or.b    d0,d2
  336.         tst.b   d2
  337.         beq     mt_nosamplechange
  338.  
  339.         moveq   #0,d3
  340.         lea     mt_samples(PC),a1
  341.         move.l  d2,d4
  342.         asl.l   #2,d2
  343.         mulu    #$1e,d4
  344.         move.l  0(A1,d2),4(a6)
  345.         move.w  0(A3,d4.l),8(a6)
  346.         move.w  2(A3,d4.l),18(a6)
  347.         move.w  4(A3,d4.l),d3
  348.         tst.w   d3
  349.         beq     mt_displace
  350.         move.l  4(a6),d2
  351.         add.l   d3,d2
  352.         move.l  d2,4(a6)
  353.         move.l  d2,10(a6)
  354.         move.w  6(a3,d4.l),8(a6)
  355.         move.w  6(a3,d4.l),14(a6)
  356.         move.w  18(a6),8(a5)
  357.         bra     mt_nosamplechange
  358.  
  359. mt_displace:
  360.         move.l  4(a6),d2
  361.         add.l   d3,d2
  362.         move.l  d2,10(a6)
  363.         move.w  6(a3,d4.l),14(a6)
  364.         move.w  18(a6),8(a5)
  365. mt_nosamplechange:
  366.         move.w  (a6),d0
  367.         and.w   #$fff,d0
  368.         tst.w   d0
  369.         beq     mt_retrout
  370.         move.w  (a6),16(a6)
  371.         move.w  20(a6),$dff096
  372.         move.l  4(a6),(a5)
  373.         move.w  8(a6),4(a5)
  374.         move.w  (a6),d0
  375.         and.w   #$fff,d0
  376.         move.w  d0,6(a5)
  377.         move.w  20(a6),d0
  378.         or.w    d0,mt_dmacon
  379.  
  380. mt_retrout:
  381.         tst.w   (a6)
  382.         beq     mt_nonewper
  383.         move.w  (a6),22(a6)
  384.  
  385. mt_nonewper:
  386.         move.b  2(a6),d0
  387.         and.b   #$0f,d0
  388.         cmp.b   #$0b,d0
  389.         beq     mt_posjmp
  390.         cmp.b   #$0c,d0
  391.         beq     mt_setvol
  392.         cmp.b   #$0d,d0
  393.         beq     mt_break
  394.         cmp.b   #$0e,d0
  395.         beq     mt_setfil
  396.         cmp.b   #$0f,d0
  397.         beq     mt_setspeed
  398.         rts
  399.  
  400. mt_posjmp:
  401.         not.w   mt_status
  402.         moveq   #0,d0
  403.         move.b  3(a6),d0
  404.         subq.b  #1,d0
  405.         move.l  d0,mt_partnrplay
  406.         rts
  407.  
  408. mt_setvol:
  409.         move.b  3(a6),8(a5)
  410.         rts
  411.  
  412. mt_break:
  413.         not.w   mt_status
  414.         rts
  415.  
  416. mt_setfil:
  417.         moveq   #0,d0
  418.         move.b  3(a6),d0
  419.         and.b   #1,d0
  420.         rol.b   #1,d0
  421.         and.b   #$fd,$bfe001
  422.         or.b    d0,$bfe001
  423.         rts
  424.  
  425. mt_setspeed:
  426.         move.b  3(a6),d0
  427.         and.b   #$0f,d0
  428.         beq     mt_back
  429. inits:  clr.w   mt_counter
  430.         move.b  d0,mt_cool+3
  431. mt_back: rts
  432.  
  433. mt_aud1temp:
  434.         ds.w    10
  435.         dc.w    1
  436.         ds.w    2
  437. mt_aud2temp:
  438.         ds.w    10
  439.         dc.w    2
  440.         ds.w    2
  441. mt_aud3temp:
  442.         ds.w    10
  443.         dc.w    4
  444.         ds.w    2
  445. mt_aud4temp:
  446.         ds.w    10
  447.         dc.w    8
  448.         ds.w    2
  449.  
  450. mt_partnote:    dc.l    0
  451. mt_partnrplay:  dc.l    0
  452. mt_counter:     dc.w    0
  453. mt_partpoint:   dc.l    0
  454. mt_samples:     dc.l    0
  455. mt_sample1:     ds.l    31
  456. mt_maxpart:     dc.w    0
  457. mt_dmacon:      dc.w    0
  458. mt_status:      dc.w    0
  459.  
  460. mt_arpeggio:
  461.         dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c
  462.         dc.w $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d
  463.         dc.w $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0
  464.         dc.w $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097
  465.         dc.w $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000
  466. mt_data:        dc.l    0
  467.  
  468.         END
  469.