home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 1: Collection A / 17Bit_Collection_A.iso / files / 778.dms / 778.adf / Sources / NormalReplay.S < prev   
Encoding:
Text File  |  1987-06-04  |  8.0 KB  |  501 lines

  1.  
  2. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  3. ;­   NoisetrackerV2.0 Normal replay   ­
  4. ;­     Uses registers d0-d3/a0-a5     ­
  5. ;­ Mahoney & Kaktus - (C) E.A.S. 1990 ­
  6. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  7.  
  8. mt_data=$58000
  9.  
  10. mt_init:movem.l    d0-d2/a0-a2,-(a7)
  11.     lea    mt_data,a0
  12.     lea    $3b8(a0),a1
  13.     moveq    #$7f,d0
  14.     moveq    #0,d2
  15.     moveq    #0,d1
  16. mt_lop2:move.b    (a1)+,d1
  17.     cmp.b    d2,d1
  18.     ble.s    mt_lop
  19.     move.l    d1,d2
  20. mt_lop:    dbf    d0,mt_lop2
  21.     addq.b    #1,d2
  22.  
  23.     asl.l    #8,d2
  24.     asl.l    #2,d2
  25.     lea    4(a1,d2.l),a2
  26.     lea    mt_samplestarts(pc),a1
  27.     add.w    #42,a0
  28.     moveq    #$1e,d0
  29. mt_lop3:clr.l    (a2)
  30.     move.l    a2,(a1)+
  31.     moveq    #0,d1
  32.     move.w    (a0),d1
  33.     asl.l    #1,d1
  34.     add.l    d1,a2
  35.     add.l    #$1e,a0
  36.     dbf    d0,mt_lop3
  37.  
  38.     or.b    #2,$bfe001
  39.     move.b    #6,mt_speed
  40.     moveq    #0,d0
  41.     lea    $dff000,a0
  42.     move.w    d0,$a8(a0)
  43.     move.w    d0,$b8(a0)
  44.     move.w    d0,$c8(a0)
  45.     move.w    d0,$d8(a0)
  46.     clr.b    mt_songpos
  47.     clr.b    mt_counter
  48.     clr.w    mt_pattpos
  49.     movem.l    (a7)+,d0-d2/a0-a2
  50.     rts
  51.  
  52. mt_end:    clr.w    $dff0a8
  53.     clr.w    $dff0b8
  54.     clr.w    $dff0c8
  55.     clr.w    $dff0d8
  56.     move.w    #$f,$dff096
  57.     rts
  58.  
  59.  
  60. mt_music:
  61.     movem.l    d0-d3/a0-a5,-(a7)
  62.     lea    mt_data,a0
  63.     addq.b    #1,mt_counter
  64.     move.b    mt_counter(pc),d0
  65.     cmp.b    mt_speed(pc),d0
  66.     blt    mt_nonew
  67.     clr.b    mt_counter
  68.  
  69.     lea    mt_data,a0
  70.     lea    $c(a0),a3
  71.     lea    $3b8(a0),a2
  72.     lea    $43c(a0),a0
  73.  
  74.     moveq    #0,d0
  75.     moveq    #0,d1
  76.     move.b    mt_songpos(pc),d0
  77.     move.b    (a2,d0.w),d1
  78.     lsl.w    #8,d1
  79.     lsl.w    #2,d1
  80.     add.w    mt_pattpos(pc),d1
  81.     clr.w    mt_dmacon
  82.  
  83.     lea    $dff0a0,a5
  84.     lea    mt_voice1(pc),a4
  85.     bsr    mt_playvoice
  86.     addq.l    #4,d1
  87.     lea    $dff0b0,a5
  88.     lea    mt_voice2(pc),a4
  89.     bsr    mt_playvoice
  90.     addq.l    #4,d1
  91.     lea    $dff0c0,a5
  92.     lea    mt_voice3(pc),a4
  93.     bsr    mt_playvoice
  94.     addq.l    #4,d1
  95.     lea    $dff0d0,a5
  96.     lea    mt_voice4(pc),a4
  97.     bsr    mt_playvoice
  98.  
  99.     move.w    mt_dmacon(pc),d0
  100.     beq.s    mt_nodma
  101.  
  102.     bsr    mt_wait
  103.     or.w    #$8000,d0
  104.     move.w    d0,$dff096
  105.     bsr    mt_wait
  106. mt_nodma:
  107.     lea    mt_voice1(pc),a4
  108.     lea    $dff000,a3
  109.     move.l    $a(a4),$a0(a3)
  110.     move.w    $e(a4),$a4(a3)
  111.     move.l    $a+$1c(a4),$b0(a3)
  112.     move.w    $e+$1c(a4),$b4(a3)
  113.     move.l    $a+$38(a4),$c0(a3)
  114.     move.w    $e+$38(a4),$c4(a3)
  115.     move.l    $a+$54(a4),$d0(a3)
  116.     move.w    $e+$54(a4),$d4(a3)
  117.  
  118.     add.w    #$10,mt_pattpos
  119.     cmp.w    #$400,mt_pattpos
  120.     bne.s    mt_exit
  121. mt_next:clr.w    mt_pattpos
  122.     clr.b    mt_break
  123.     addq.b    #1,mt_songpos
  124.     and.b    #$7f,mt_songpos
  125.     move.b    -2(a2),d0
  126.     cmp.b    mt_songpos(pc),d0
  127.     bne.s    mt_exit
  128.     move.b    -1(a2),mt_songpos
  129. mt_exit:tst.b    mt_break
  130.     bne.s    mt_next
  131.     movem.l    (a7)+,d0-d3/a0-a5
  132.     rts
  133.  
  134. mt_wait:moveq    #3,d3
  135. mt_wai2:move.b    $dff006,d2
  136. mt_wai3:cmp.b    $dff006,d2
  137.     beq.s    mt_wai3
  138.     dbf    d3,mt_wai2
  139.     moveq    #8,d2
  140. mt_wai4:dbf    d2,mt_wai4
  141.     rts
  142.  
  143. mt_nonew:
  144.     lea    mt_voice1(pc),a4
  145.     lea    $dff0a0,a5
  146.     bsr    mt_com
  147.     lea    mt_voice2(pc),a4
  148.     lea    $dff0b0,a5
  149.     bsr    mt_com
  150.     lea    mt_voice3(pc),a4
  151.     lea    $dff0c0,a5
  152.     bsr    mt_com
  153.     lea    mt_voice4(pc),a4
  154.     lea    $dff0d0,a5
  155.     bsr    mt_com
  156.     bra.s    mt_exit
  157.  
  158. mt_mulu:
  159. dc.w $000,$01e,$03c,$05a,$078,$096,$0b4,$0d2,$0f0,$10e,$12c,$14a
  160. dc.w $168,$186,$1a4,$1c2,$1e0,$1fe,$21c,$23a,$258,$276,$294,$2b2
  161. dc.w $2d0,$2ee,$30c,$32a,$348,$366,$384,$3a2
  162.  
  163. mt_playvoice:
  164.     move.l    (a0,d1.l),(a4)
  165.     moveq    #0,d2
  166.     move.b    2(a4),d2
  167.     lsr.b    #4,d2
  168.     move.b    (a4),d0
  169.     and.b    #$f0,d0
  170.     or.b    d0,d2
  171.     beq.s    mt_oldinstr
  172.  
  173.     lea    mt_samplestarts-4(pc),a1
  174.     asl.w    #2,d2
  175.     move.l    (a1,d2.l),4(a4)
  176.     lsr.w    #1,d2
  177.     move.w    mt_mulu(pc,d2.w),d2
  178.     move.w    (a3,d2.w),8(a4)
  179.     move.w    2(a3,d2.w),$12(a4)
  180.     moveq    #0,d3
  181.     move.w    4(a3,d2.w),d3
  182.     tst.w    d3
  183.     beq.s    mt_noloop
  184.     move.l    4(a4),d0
  185.     asl.w    #1,d3
  186.     add.l    d3,d0
  187.     move.l    d0,$a(a4)
  188.     move.w    4(a3,d2.w),d0
  189.     add.w    6(a3,d2.w),d0
  190.     move.w    d0,8(a4)
  191.     bra.s    mt_hejaSverige
  192. mt_noloop:
  193.     move.l    4(a4),d0
  194.     add.l    d3,d0
  195.     move.l    d0,$a(a4)
  196. mt_hejaSverige:
  197.     move.w    6(a3,d2.w),$e(a4)
  198.     moveq    #0,d0
  199.     move.b    $13(a4),d0
  200.     move.w    d0,8(a5)
  201.  
  202. mt_oldinstr:
  203.     move.w    (a4),d0
  204.     and.w    #$fff,d0
  205.     beq    mt_com2
  206.     tst.w    8(a4)
  207.     beq.s    mt_stopsound
  208.     tst.b    $12(a4)
  209.     bne.s    mt_stopsound
  210.     move.b    2(a4),d0
  211.     and.b    #$f,d0
  212.     cmp.b    #5,d0
  213.     beq.s    mt_setport
  214.     cmp.b    #3,d0
  215.     beq.s    mt_setport
  216.  
  217.     move.w    (a4),$10(a4)
  218.     and.w    #$fff,$10(a4)
  219.     move.w    $1a(a4),$dff096
  220.     clr.b    $19(a4)
  221.  
  222.     move.l    4(a4),(a5)
  223.     move.w    8(a4),4(a5)
  224.     move.w    $10(a4),6(a5)
  225.  
  226.     move.w    $1a(a4),d0    ;dmaset
  227.     or.w    d0,mt_dmacon
  228.     bra    mt_com2
  229.  
  230. mt_stopsound:
  231.     move.w    $1a(a4),$dff096
  232.     bra    mt_com2
  233.  
  234. mt_setport:
  235.     move.w    (a4),d2
  236.     and.w    #$fff,d2
  237.     move.w    d2,$16(a4)
  238.     move.w    $10(a4),d0
  239.     clr.b    $14(a4)
  240.     cmp.w    d0,d2
  241.     beq.s    mt_clrport
  242.     bge    mt_com2
  243.     move.b    #1,$14(a4)
  244.     bra    mt_com2
  245. mt_clrport:
  246.     clr.w    $16(a4)
  247.     rts
  248.  
  249. mt_port:move.b    3(a4),d0
  250.     beq.s    mt_port2
  251.     move.b    d0,$15(a4)
  252.     clr.b    3(a4)
  253. mt_port2:
  254.     tst.w    $16(a4)
  255.     beq.s    mt_rts
  256.     moveq    #0,d0
  257.     move.b    $15(a4),d0
  258.     tst.b    $14(a4)
  259.     bne.s    mt_sub
  260.     add.w    d0,$10(a4)
  261.     move.w    $16(a4),d0
  262.     cmp.w    $10(a4),d0
  263.     bgt.s    mt_portok
  264.     move.w    $16(a4),$10(a4)
  265.     clr.w    $16(a4)
  266. mt_portok:
  267.     move.w    $10(a4),6(a5)
  268. mt_rts:    rts
  269.  
  270. mt_sub:    sub.w    d0,$10(a4)
  271.     move.w    $16(a4),d0
  272.     cmp.w    $10(a4),d0
  273.     blt.s    mt_portok
  274.     move.w    $16(a4),$10(a4)
  275.     clr.w    $16(a4)
  276.     move.w    $10(a4),6(a5)
  277.     rts
  278.  
  279. mt_sin:
  280. dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  281. dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  282.  
  283. mt_vib:    move.b    $3(a4),d0
  284.     beq.s    mt_vib2
  285.     move.b    d0,$18(a4)
  286.  
  287. mt_vib2:move.b    $19(a4),d0
  288.     lsr.w    #2,d0
  289.     and.w    #$1f,d0
  290.     moveq    #0,d2
  291.     move.b    mt_sin(pc,d0.w),d2
  292.     move.b    $18(a4),d0
  293.     and.w    #$f,d0
  294.     mulu    d0,d2
  295.     lsr.w    #7,d2
  296.     move.w    $10(a4),d0
  297.     tst.b    $19(a4)
  298.     bmi.s    mt_vibsub
  299.     add.w    d2,d0
  300.     bra.s    mt_vib3
  301. mt_vibsub:
  302.     sub.w    d2,d0
  303. mt_vib3:move.w    d0,6(a5)
  304.     move.b    $18(a4),d0
  305.     lsr.w    #2,d0
  306.     and.w    #$3c,d0
  307.     add.b    d0,$19(a4)
  308.     rts
  309.  
  310.  
  311. mt_arplist:
  312. dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  313.  
  314. mt_arp:    moveq    #0,d0
  315.     move.b    mt_counter(pc),d0
  316.     move.b    mt_arplist(pc,d0.w),d0
  317.     beq.s    mt_arp0
  318.     cmp.b    #2,d0
  319.     beq.s    mt_arp2
  320. mt_arp1:moveq    #0,d0
  321.     move.b    3(a4),d0
  322.     lsr.b    #4,d0
  323.     bra.s    mt_arpdo
  324. mt_arp2:moveq    #0,d0
  325.     move.b    3(a4),d0
  326.     and.b    #$f,d0
  327. mt_arpdo:
  328.     asl.w    #1,d0
  329.     move.w    $10(a4),d1
  330.     and.w    #$fff,d1
  331.     lea    mt_periods(pc),a0
  332.     moveq    #$24,d2
  333. mt_arp3:cmp.w    (a0)+,d1
  334.     bge.s    mt_arpfound
  335.     dbf    d2,mt_arp3
  336. mt_arp0:move.w    $10(a4),6(a5)
  337.     rts
  338. mt_arpfound:
  339.     move.w    -2(a0,d0.w),6(a5)
  340.     rts
  341.  
  342. mt_normper:
  343.     move.w    $10(a4),6(a5)
  344.     rts
  345.  
  346. mt_com:    move.w    2(a4),d0
  347.     and.w    #$fff,d0
  348.     beq.s    mt_normper
  349.     move.b    2(a4),d0
  350.     and.b    #$f,d0
  351.     tst.b    d0
  352.     beq.s    mt_arp
  353.     cmp.b    #1,d0
  354.     beq.s    mt_portup
  355.     cmp.b    #2,d0
  356.     beq.s    mt_portdown
  357.     cmp.b    #3,d0
  358.     beq    mt_port
  359.     cmp.b    #4,d0
  360.     beq    mt_vib
  361.     cmp.b    #5,d0
  362.     beq.s    mt_volport
  363.     cmp.b    #6,d0
  364.     beq.s    mt_volvib
  365.     move.w    $10(a4),6(a5)
  366.     cmp.b    #$a,d0
  367.     beq.s    mt_volslide
  368.     rts
  369.  
  370. mt_portup:
  371.     moveq    #0,d0
  372.     move.b    3(a4),d0
  373.     sub.w    d0,$10(a4)
  374.     move.w    $10(a4),d0
  375.     cmp.w    #$71,d0
  376.     bpl.s    mt_portup2
  377.     move.w    #$71,$10(a4)
  378. mt_portup2:
  379.     move.w    $10(a4),6(a5)
  380.     rts
  381.  
  382. mt_portdown:
  383.     moveq    #0,d0
  384.     move.b    3(a4),d0
  385.     add.w    d0,$10(a4)
  386.     move.w    $10(a4),d0
  387.     cmp.w    #$358,d0
  388.     bmi.s    mt_portdown2
  389.     move.w    #$358,$10(a4)
  390. mt_portdown2:
  391.     move.w    $10(a4),6(a5)
  392.     rts
  393.  
  394. mt_volvib:
  395.      bsr    mt_vib2
  396.      bra.s    mt_volslide
  397. mt_volport:
  398.      bsr    mt_port2
  399.  
  400. mt_volslide:
  401.     moveq    #0,d0
  402.     move.b    3(a4),d0
  403.     lsr.b    #4,d0
  404.     beq.s    mt_vol3
  405.     add.b    d0,$13(a4)
  406.     cmp.b    #$40,$13(a4)
  407.     bmi.s    mt_vol2
  408.     move.b    #$40,$13(a4)
  409. mt_vol2:moveq    #0,d0
  410.     move.b    $13(a4),d0
  411.     move.w    d0,8(a5)
  412.     rts
  413.  
  414. mt_vol3:move.b    3(a4),d0
  415.     and.b    #$f,d0
  416.     sub.b    d0,$13(a4)
  417.     bpl.s    mt_vol4
  418.     clr.b    $13(a4)
  419. mt_vol4:moveq    #0,d0
  420.     move.b    $13(a4),d0
  421.     move.w    d0,8(a5)
  422.     rts
  423.  
  424. mt_com2:move.b    $2(a4),d0
  425.     and.b    #$f,d0
  426.     cmp.b    #$e,d0
  427.     beq.s    mt_filter
  428.     cmp.b    #$d,d0
  429.     beq.s    mt_pattbreak
  430.     cmp.b    #$b,d0
  431.     beq.s    mt_songjmp
  432.     cmp.b    #$c,d0
  433.     beq.s    mt_setvol
  434.     cmp.b    #$f,d0
  435.     beq.s    mt_setspeed
  436.     rts
  437.  
  438. mt_filter:
  439.     move.b    3(a4),d0
  440.     and.b    #1,d0
  441.     asl.b    #1,d0
  442.     and.b    #$fd,$bfe001
  443.     or.b    d0,$bfe001
  444.     rts
  445.  
  446. mt_pattbreak:
  447.     move.b    #1,mt_break
  448.     rts
  449.  
  450. mt_songjmp:
  451.     move.b    #1,mt_break
  452.     move.b    3(a4),d0
  453.     subq.b    #1,d0
  454.     move.b    d0,mt_songpos
  455.     rts
  456.  
  457. mt_setvol:
  458.     cmp.b    #$40,3(a4)
  459.     bls.s    mt_sv2
  460.     move.b    #$40,3(a4)
  461. mt_sv2:    moveq    #0,d0
  462.     move.b    3(a4),d0
  463.     move.b    d0,$13(a4)
  464.     move.w    d0,8(a5)
  465.     rts
  466.  
  467. mt_setspeed:
  468.     moveq    #0,d0
  469.     move.b    3(a4),d0
  470.     cmp.b    #$1f,d0
  471.     bls.s    mt_sp2
  472.     moveq    #$1f,d0
  473. mt_sp2:    tst.w    d0
  474.     bne.s    mt_sp3
  475.     moveq    #1,d0
  476. mt_sp3:    move.b    d0,mt_speed
  477.     rts
  478.  
  479. mt_periods:
  480. dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
  481. dc.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
  482. dc.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
  483. dc.w $007f,$0078,$0071,$0000
  484.  
  485. mt_speed:    dc.b    6
  486. mt_counter:    dc.b    0
  487. mt_pattpos:    dc.w    0
  488. mt_songpos:    dc.b    0
  489. mt_break:    dc.b    0
  490. mt_dmacon:    dc.w    0
  491. mt_samplestarts:blk.l    $1f,0
  492. mt_voice1:    blk.w    13,0
  493.         dc.w    1
  494. mt_voice2:    blk.w    13,0
  495.         dc.w    2
  496. mt_voice3:    blk.w    13,0
  497.         dc.w    4
  498. mt_voice4:    blk.w    13,0
  499.         dc.w    8
  500.  
  501.