home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 26 / af026.adf / NoiseTrackerPlayer.asm < prev    next >
Assembly Source File  |  1991-07-09  |  9KB  |  521 lines

  1.  section scx,code_c
  2.  opt c-,o+,ow-
  3. max equ 2
  4. WOBMAX EQU $24
  5. go:
  6.  jsr mt_init
  7.   move.w #$8010,$dff09a
  8.  move.l $6c.w,old
  9.  move.l  #new,$6c.w
  10. WAIT: 
  11.  bset #1,$bfe001
  12.  ANDI.B #$40,$BFE001    ;\
  13.  Bne.s wait        ; >-- Delete these lines to play in background
  14.  move.l old,$6c.w    ;/
  15. ERROR:
  16.  move.l 4.w,a6
  17.  jsr -138(a6)
  18.  moveq #0,d0
  19.  move.w #$f,$dff096
  20.  move.w #$0,$dff0a8
  21.  move.w #$0,$dff0b8
  22.  move.w #$0,$dff0c8
  23.  move.w #$0,$dff0d8
  24.  RTS
  25. new:  movem.l d0-d7/a0-a6,-(sp)
  26.  move.w #$10,$dff09c
  27.  jsr mt_music    ;;;;;;;;;;;;;;;;;;
  28.  btst #10,$dff016
  29.  beq out
  30.  subq.b #1,ctd
  31.  bne.s out
  32.  move.b #max,ctd
  33.  subq.b #1,ct2
  34.  bne.s out
  35.  move.b #8,ct2
  36.  ; interupt routine goes in here
  37. out: movem.l (sp)+,d0-d7/a0-a6
  38.  dc.w $4ef9
  39. old: dc.l 0
  40. ctd dc.b 1,0
  41. ct2 dc.b 1,0
  42.  rts
  43.     even
  44. *** END OF MY CODE ***
  45.  
  46. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  47. ;­   NoisetrackerV1.0 replayroutine   ­
  48. ;­ Mahoney & Kaktus - HALLONSOFT 1989 ­
  49. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  50.  
  51.  
  52.  
  53. mt_init:lea    mt_data,a0
  54.     move.l    a0,a1
  55.     add.l    #$3b8,a1
  56.     moveq    #$7f,d0
  57.     moveq    #0,d1
  58. mt_loop:move.l    d1,d2
  59.     subq.w    #1,d0
  60. mt_lop2:move.b    (a1)+,d1
  61.     cmp.b    d2,d1
  62.     bgt.s    mt_loop
  63.     dbf    d0,mt_lop2
  64.     addq.b    #1,d2
  65.  
  66.     lea    mt_samplestarts(pc),a1
  67.     asl.l    #8,d2
  68.     asl.l    #2,d2
  69.     add.l    #$43c,d2
  70.     add.l    a0,d2
  71.     move.l    d2,a2
  72.     moveq    #$1e,d0
  73. mt_lop3:clr.l    (a2)
  74.     move.l    a2,(a1)+
  75.     moveq    #0,d1
  76.     move.w    42(a0),d1
  77.     asl.l    #1,d1
  78.     add.l    d1,a2
  79.     add.l    #$1e,a0
  80.     dbf    d0,mt_lop3
  81.  
  82. ;    or.b    #$2,$bfe001
  83.     move.b    #$6,mt_speed
  84.     clr.w    $dff0a8
  85.     clr.w    $dff0b8
  86.     clr.w    $dff0c8
  87.     clr.w    $dff0d8
  88.     clr.b    mt_songpos
  89.     clr.b    mt_counter
  90.     clr.w    mt_pattpos
  91.     rts
  92.  
  93. mt_end:    clr.w    $dff0a8
  94.     clr.w    $dff0b8
  95.     clr.w    $dff0c8
  96.     clr.w    $dff0d8
  97.     move.w    #$f,$dff096
  98.     rts
  99.  
  100. mt_music:
  101.     movem.l    d0-d4/a0-a3/a5-a6,-(a7)
  102.     lea    mt_data,a0
  103.     addq.b    #$1,mt_counter
  104.     move.b    mt_counter,D0
  105.     cmp.b    mt_speed,D0
  106.     blt.s    mt_nonew
  107.     clr.b    mt_counter
  108.     bra    mt_getnew
  109.  
  110. mt_nonew:
  111.     lea    mt_voice1(pc),a6
  112.     lea    $dff0a0,a5
  113.     bsr    mt_checkcom
  114.     lea    mt_voice2(pc),a6
  115.     lea    $dff0b0,a5
  116.     bsr    mt_checkcom
  117.     lea    mt_voice3(pc),a6
  118.     lea    $dff0c0,a5
  119.     bsr    mt_checkcom
  120.     lea    mt_voice4(pc),a6
  121.     lea    $dff0d0,a5
  122.     bsr    mt_checkcom
  123.     bra    mt_endr
  124.  
  125. mt_arpeggio:
  126.     moveq    #0,d0
  127.     move.b    mt_counter,d0
  128.     divs    #$3,d0
  129.     swap    d0
  130.     cmp.w    #$0,d0
  131.     beq.s    mt_arp2
  132.     cmp.w    #$2,d0
  133.     beq.s    mt_arp1
  134.  
  135.     moveq    #0,d0
  136.     move.b    $3(a6),d0
  137.     lsr.b    #4,d0
  138.     bra.s    mt_arp3
  139. mt_arp1:moveq    #0,d0
  140.     move.b    $3(a6),d0
  141.     and.b    #$f,d0
  142.     bra.s    mt_arp3
  143. mt_arp2:move.w    $10(a6),d2
  144.     bra.s    mt_arp4
  145. mt_arp3:asl.w    #1,d0
  146.     moveq    #0,d1
  147.     move.w    $10(a6),d1
  148.     lea    mt_periods(pc),a0
  149.     moveq    #$24,d7
  150. mt_arploop:
  151.     move.w    (a0,d0.w),d2
  152.     cmp.w    (a0),d1
  153.     bge.s    mt_arp4
  154.     addq.l    #2,a0
  155.     dbf    d7,mt_arploop
  156.     rts
  157. mt_arp4:move.w    d2,$6(a5)
  158.     rts
  159.  
  160. mt_getnew:
  161.     lea    mt_data,a0
  162.     move.l    a0,a3
  163.     move.l    a0,a2
  164.     add.l    #$c,a3
  165.     add.l    #$3b8,a2
  166.     add.l    #$43c,a0
  167.  
  168.     moveq    #0,d0
  169.     move.l    d0,d1
  170.     move.b    mt_songpos,d0
  171.     move.b    (a2,d0.w),d1
  172.     asl.l    #8,d1
  173.     asl.l    #2,d1
  174.     add.w    mt_pattpos,d1
  175.     clr.w    mt_dmacon
  176.  
  177.     lea    $dff0a0,a5
  178.     lea    mt_voice1(pc),a6
  179.     bsr.s    mt_playvoice
  180.     lea    $dff0b0,a5
  181.     lea    mt_voice2(pc),a6
  182.     bsr.s    mt_playvoice
  183.     lea    $dff0c0,a5
  184.     lea    mt_voice3(pc),a6
  185.     bsr.s    mt_playvoice
  186.     lea    $dff0d0,a5
  187.     lea    mt_voice4(pc),a6
  188.     bsr.s    mt_playvoice
  189.     bra    mt_setdma
  190.  
  191. mt_playvoice:
  192.     move.l    (a0,d1.l),(a6)
  193.     addq.l    #4,d1
  194.     moveq    #0,d2
  195.     move.b    $2(a6),d2
  196.     and.b    #$f0,d2
  197.     lsr.b    #4,d2
  198.     move.b    (a6),d0
  199.     and.b    #$f0,d0
  200.     or.b    d0,d2
  201.     tst.b    d2
  202.     beq.s    mt_setregs
  203.     moveq    #0,d3
  204.     lea    mt_samplestarts(pc),a1
  205.     move.l    d2,d4
  206.     subq.l    #$1,d2
  207.     asl.l    #2,d2
  208.     mulu    #$1e,d4
  209.     move.l    (a1,d2.l),$4(a6)
  210.     move.w    (a3,d4.l),$8(a6)
  211.     move.w    $2(a3,d4.l),$12(a6)
  212.     move.w    $4(a3,d4.l),d3
  213.     tst.w    d3
  214.     beq.s    mt_noloop
  215.     move.l    $4(a6),d2
  216.     asl.w    #1,d3
  217.     add.l    d3,d2
  218.     move.l    d2,$a(a6)
  219.     move.w    $4(a3,d4.l),d0
  220.     add.w    $6(a3,d4.l),d0
  221.     move.w    d0,8(a6)
  222.     move.w    $6(a3,d4.l),$e(a6)
  223.     move.w    $12(a6),$8(a5)
  224.     bra.s    mt_setregs
  225. mt_noloop:
  226.     move.l    $4(a6),d2
  227.     add.l    d3,d2
  228.     move.l    d2,$a(a6)
  229.     move.w    $6(a3,d4.l),$e(a6)
  230.     move.w    $12(a6),$8(a5)
  231. mt_setregs:
  232.     move.w    (a6),d0
  233.     and.w    #$fff,d0
  234.     beq    mt_checkcom2
  235.     move.b    $2(a6),d0
  236.     and.b    #$F,d0
  237.     cmp.b    #$3,d0
  238.     bne.s    mt_setperiod
  239.     bsr    mt_setmyport
  240.     bra    mt_checkcom2
  241. mt_setperiod:
  242.     move.w    (a6),$10(a6)
  243.     and.w    #$fff,$10(a6)
  244.     move.w    $14(a6),d0
  245.     move.w    d0,$dff096
  246.     clr.b    $1b(a6)
  247.  
  248.     move.l    $4(a6),(a5)
  249.     move.w    $8(a6),$4(a5)
  250.     move.w    $10(a6),d0
  251.     and.w    #$fff,d0
  252.     move.w    d0,$6(a5)
  253.     move.w    $14(a6),d0
  254.     or.w    d0,mt_dmacon
  255.     bra    mt_checkcom2
  256.  
  257. mt_setdma:
  258.     move.w    #$12c,d0
  259. mt_wait:dbf    d0,mt_wait
  260.     move.w    mt_dmacon,d0
  261.     or.w    #$8000,d0
  262.     move.w    d0,$dff096
  263.     move.w    #$12c,d0
  264. mt_wai2:dbf    d0,mt_wai2
  265.     lea    $dff000,a5
  266.     lea    mt_voice4(pc),a6
  267.     move.l    $a(a6),$d0(a5)
  268.     move.w    $e(a6),$d4(a5)
  269.     lea    mt_voice3(pc),a6
  270.     move.l    $a(a6),$c0(a5)
  271.     move.w    $e(a6),$c4(a5)
  272.     lea    mt_voice2(pc),a6
  273.     move.l    $a(a6),$b0(a5)
  274.     move.w    $e(a6),$b4(a5)
  275.     lea    mt_voice1(pc),a6
  276.     move.l    $a(a6),$a0(a5)
  277.     move.w    $e(a6),$a4(a5)
  278.  
  279.     add.w    #$10,mt_pattpos
  280.     cmp.w    #$400,mt_pattpos
  281.     bne.s    mt_endr
  282. mt_nex:    clr.w    mt_pattpos
  283.     clr.b    mt_break
  284.     addq.b    #1,mt_songpos
  285.     and.b    #$7f,mt_songpos
  286.     move.b    mt_songpos,d1
  287.     cmp.b    mt_data+$3b6,d1
  288.     bne.s    mt_endr
  289.     clr.b    mt_songpos
  290. mt_endr:tst.b    mt_break
  291.     bne.s    mt_nex
  292.     movem.l    (a7)+,d0-d4/a0-a3/a5-a6
  293.     rts
  294.  
  295. mt_setmyport:
  296.     move.w    (a6),d2
  297.     and.w    #$fff,d2
  298.     move.w    d2,$18(a6)
  299.     move.w    $10(a6),d0
  300.     clr.b    $16(a6)
  301.     cmp.w    d0,d2
  302.     beq.s    mt_clrport
  303.     bge.s    mt_rt
  304.     move.b    #$1,$16(a6)
  305.     rts
  306. mt_clrport:
  307.     clr.w    $18(a6)
  308. mt_rt:    rts
  309.  
  310. mt_myport:
  311.     move.b    $3(a6),d0
  312.     beq.s    mt_myslide
  313.     move.b    d0,$17(a6)
  314.     clr.b    $3(a6)
  315. mt_myslide:
  316.     tst.w    $18(a6)
  317.     beq.s    mt_rt
  318.     moveq    #0,d0
  319.     move.b    $17(a6),d0
  320.     tst.b    $16(a6)
  321.     bne.s    mt_mysub
  322.     add.w    d0,$10(a6)
  323.     move.w    $18(a6),d0
  324.     cmp.w    $10(a6),d0
  325.     bgt.s    mt_myok
  326.     move.w    $18(a6),$10(a6)
  327.     clr.w    $18(a6)
  328. mt_myok:move.w    $10(a6),$6(a5)
  329.     rts
  330. mt_mysub:
  331.     sub.w    d0,$10(a6)
  332.     move.w    $18(a6),d0
  333.     cmp.w    $10(a6),d0
  334.     blt.s    mt_myok
  335.     move.w    $18(a6),$10(a6)
  336.     clr.w    $18(a6)
  337.     move.w    $10(a6),$6(a5)
  338.     rts
  339.  
  340. mt_vib:    move.b    $3(a6),d0
  341.     beq.s    mt_vi
  342.     move.b    d0,$1a(a6)
  343.  
  344. mt_vi:    move.b    $1b(a6),d0
  345.     lea    mt_sin(pc),a4
  346.     lsr.w    #$2,d0
  347.     and.w    #$1f,d0
  348.     moveq    #0,d2
  349.     move.b    (a4,d0.w),d2
  350.     move.b    $1a(a6),d0
  351.     and.w    #$f,d0
  352.     mulu    d0,d2
  353.     lsr.w    #$6,d2
  354.     move.w    $10(a6),d0
  355.     tst.b    $1b(a6)
  356.     bmi.s    mt_vibmin
  357.     add.w    d2,d0
  358.     bra.s    mt_vib2
  359. mt_vibmin:
  360.     sub.w    d2,d0
  361. mt_vib2:move.w    d0,$6(a5)
  362.     move.b    $1a(a6),d0
  363.     lsr.w    #$2,d0
  364.     and.w    #$3c,d0
  365.     add.b    d0,$1b(a6)
  366.     rts
  367.  
  368. mt_nop:    move.w    $10(a6),$6(a5)
  369.     rts
  370.  
  371. mt_checkcom:
  372.     move.w    $2(a6),d0
  373.     and.w    #$fff,d0
  374.     beq.s    mt_nop
  375.     move.b    $2(a6),d0
  376.     and.b    #$f,d0
  377.     tst.b    d0
  378.     beq    mt_arpeggio
  379.     cmp.b    #$1,d0
  380.     beq.s    mt_portup
  381.     cmp.b    #$2,d0
  382.     beq    mt_portdown
  383.     cmp.b    #$3,d0
  384.     beq    mt_myport
  385.     cmp.b    #$4,d0
  386.     beq    mt_vib
  387.     move.w    $10(a6),$6(a5)
  388.     cmp.b    #$a,d0
  389.     beq.s    mt_volslide
  390.     rts
  391.  
  392. mt_volslide:
  393.     moveq    #0,d0
  394.     move.b    $3(a6),d0
  395.     lsr.b    #4,d0
  396.     tst.b    d0
  397.     beq.s    mt_voldown
  398.     add.w    d0,$12(a6)
  399.     cmp.w    #$40,$12(a6)
  400.     bmi.s    mt_vol2
  401.     move.w    #$40,$12(a6)
  402. mt_vol2:move.w    $12(a6),$8(a5)
  403.     rts
  404.  
  405. mt_voldown:
  406.     moveq    #0,d0
  407.     move.b    $3(a6),d0
  408.     and.b    #$f,d0
  409.     sub.w    d0,$12(a6)
  410.     bpl.s    mt_vol3
  411.     clr.w    $12(a6)
  412. mt_vol3:move.w    $12(a6),$8(a5)
  413.     rts
  414.  
  415. mt_portup:
  416.     moveq    #0,d0
  417.     move.b    $3(a6),d0
  418.     sub.w    d0,$10(a6)
  419.     move.w    $10(a6),d0
  420.     and.w    #$fff,d0
  421.     cmp.w    #$71,d0
  422.     bpl.s    mt_por2
  423.     and.w    #$f000,$10(a6)
  424.     or.w    #$71,$10(a6)
  425. mt_por2:move.w    $10(a6),d0
  426.     and.w    #$fff,d0
  427.     move.w    d0,$6(a5)
  428.     rts
  429.  
  430. mt_portdown:
  431.     clr.w    d0
  432.     move.b    $3(a6),d0
  433.     add.w    d0,$10(a6)
  434.     move.w    $10(a6),d0
  435.     and.w    #$fff,d0
  436.     cmp.w    #$358,d0
  437.     bmi.s    mt_por3
  438.     and.w    #$f000,$10(a6)
  439.     or.w    #$358,$10(a6)
  440. mt_por3:move.w    $10(a6),d0
  441.     and.w    #$fff,d0
  442.     move.w    d0,$6(a5)
  443.     rts
  444.  
  445. mt_checkcom2:
  446.     move.b    $2(a6),d0
  447.     and.b    #$f,d0
  448.     cmp.b    #$e,d0
  449.     beq.s    mt_setfilt
  450.     cmp.b    #$d,d0
  451.     beq.s    mt_pattbreak
  452.     cmp.b    #$b,d0
  453.     beq.s    mt_posjmp
  454.     cmp.b    #$c,d0
  455.     beq.s    mt_setvol
  456.     cmp.b    #$f,d0
  457.     beq.s    mt_setspeed
  458.     rts
  459.  
  460. mt_setfilt:
  461.     rts
  462. mt_pattbreak:
  463.     not.b    mt_break
  464.     rts
  465. mt_posjmp:
  466.     move.b    $3(a6),d0
  467.     subq.b    #$1,d0
  468.     move.b    d0,mt_songpos
  469.     not.b    mt_break
  470.     rts
  471. mt_setvol:
  472.     cmp.b    #$40,$3(a6)
  473.     ble.s    mt_vol4
  474.     move.b    #$40,$3(a6)
  475. mt_vol4:move.b    $3(a6),$8(a5)
  476.     rts
  477. mt_setspeed:
  478.     move.b    $3(a6),d0
  479.     and.w    #$1f,d0
  480.     beq.s    mt_rts2
  481.     clr.b    mt_counter
  482.     move.b    d0,mt_speed
  483. mt_rts2:rts
  484.  
  485.  
  486.  
  487.  
  488. mt_sin:
  489.  dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  490.  dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  491.  
  492. mt_periods:
  493.  dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
  494.  dc.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
  495.  dc.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
  496.  dc.w $007f,$0078,$0071,$0000,$0000
  497.  
  498. mt_speed:    dc.b    $6
  499. mt_songpos:    dc.b    $0
  500. mt_pattpos:    dc.w    $0
  501. mt_counter:    dc.b    $0
  502.  
  503. mt_break:    dc.b    $0
  504. mt_dmacon:    dc.w    $0
  505. mt_samplestarts:dcb.l    $1f,0
  506. mt_voice1:    dcb.w    10,0
  507.         dc.w    $1
  508.         dcb.w    3,0
  509. mt_voice2:    dcb.w    10,0
  510.         dc.w    $2
  511.         dcb.w    3,0
  512. mt_voice3:    dcb.w    10,0
  513.         dc.w    $4
  514.         dcb.w    3,0
  515. mt_voice4:    dcb.w    10,0
  516.         dc.w    $8
  517.         dcb.w    3,0
  518.  
  519.  
  520. mt_data incbin "ST-00:MODULES/mod.FRESH HOUSE"    ;Noisetracker Module Only !!!!!
  521.