home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 1: Collection A / 17Bit_Collection_A.iso / files / 478.dms / 478.adf / Player.S < prev    next >
Text File  |  1988-07-26  |  7KB  |  405 lines

  1. *----------------------------------------------------
  2. ; The Brian's SoundMon Player Routine (C)1988
  3. ; By Brian Postma
  4. ; J.v.Hartenstraat 51
  5. ; 7576VX Oldenzaal (NL)
  6. ; Tel:05410-14763
  7. *----------------------------------------------------
  8.  
  9. bpstart:
  10.  bsr        bpinit
  11.  lea        inter,a1
  12.  moveq        #5,d0
  13.  move.l        4,a6
  14.  jsr        -168(a6)    ; Interrupt on
  15.  
  16. bpwait:
  17.  btst        #6,$bfe001
  18.  bne        bpwait
  19.  
  20.  move.l        4,a6
  21.  moveq        #32,d0
  22.  lea        inter,a1
  23.  jsr        -174(a6)    ; Interrupt Off
  24.  move.w        #$f,$dff096
  25.  clr.l        d0
  26.  rts
  27.  
  28. bpinit:
  29.  lea        samples,a0
  30.  lea        bpsong,a1
  31.  move.l        #512,d0
  32.  move.w        30(a1),d1    ;d1 now contains length in steps
  33.  move.l        #1,d2        ;1 is highest pattern number
  34.  mulu        #4,d1        ;4 voices per step
  35.  subq.w        #1,d1        ;correction for DBRA
  36. findhighest:
  37.  cmp.w        (a1,d0),d2    ;Is it higher
  38.  bge        nothigher    ;No
  39.  move.w        (a1,d0),d2    ;Yes, so let D2 be highest
  40. nothigher:
  41.  addq.l        #4,d0        ;Next Voice
  42.  dbra        d1,findhighest    ;And search
  43.  move.w        30(a1),d1
  44.  mulu        #16,d1        ;16 bytes per step
  45.  move.l        #512,d0        ;header is 512 bytes
  46.  mulu        #48,d2        ;48 bytes per pattern
  47.  add.l        d2,d0
  48.  add.l        d1,d0        ;offset for samples
  49.  
  50.  move.l        #14,d1        ;15 samples
  51.  add.l        #32+24,a1
  52.  add.l        #bpsong,d0
  53. initloop:
  54.  move.l        d0,(a0)+
  55.  move.w        (a1),d2
  56.  mulu        #2,d2        ;Length is in words
  57.  add.l        d2,d0        ;offset next sample
  58.  add.l        #32,a1        ;Length of Sample Part in header
  59.  dbra        d1,initloop
  60.  rts
  61.  
  62. bpnewirq:
  63.  movem.l    d0-d7/a0-a6,-(a7)
  64.  bsr        bpmusic
  65.  movem.l    (a7)+,d0-d7/a0-a6
  66.  moveq        #0,d0
  67.  rts
  68.  
  69. bpmusic:
  70.  subq.b        #1,arpcount
  71.  move.l        #3,d0
  72.  lea        bpcurrent,a0
  73.  move.l        #$dff0a0,a1
  74. bploop1:
  75.  move.b        12(a0),d4
  76.  ext.w        d4
  77.  add.w        d4,(a0)
  78.  move.w        (a0),6(a1)
  79.  move.l        4(a0),(a1)
  80.  move.w        8(a0),4(a1)
  81.  tst.b        11(a0)
  82.  bne        bpdoarp
  83.  tst.b        13(a0)
  84.  beq        not2
  85. bpdoarp:
  86.  tst.b        arpcount
  87.  bne        not0
  88.  move.b        11(a0),d3
  89.  move.b        13(a0),d4
  90.  and.w        #240,d4
  91.  and.w        #240,d3
  92.  lsr.w        #4,d3
  93.  lsr.w        #4,d4
  94.  add.w        d3,d4
  95.  add.b        10(a0),d4
  96.  bsr        bpplayarp
  97.  bra        not2
  98. not0:
  99.  cmpi.b        #1,arpcount 
  100.  bne        not1
  101.  move.b        11(a0),d3
  102.  move.b        13(a0),d4
  103.  and.w        #15,d3
  104.  and.w        #15,d4
  105.  add.w        d3,d4
  106.  add.b        10(a0),d4
  107.  bsr        bpplayarp
  108.  bra        not2
  109. not1:
  110.  move.b        10(a0),d4
  111.  bsr        bpplayarp
  112. not2:
  113.  lea        $10(a1),a1
  114.  lea        $e(a0),a0
  115.  dbra        d0,bploop1
  116.  tst.b        arpcount
  117.  bne        arpnotzero
  118.  move.b        #3,arpcount
  119. arpnotzero:
  120.  subq.b        #1,bpcount
  121.  beq        bpskip1
  122.  rts
  123. bpskip1:
  124.  move.b        bpdelay,bpcount
  125. bpplay:
  126.  bsr        bpnext
  127.  move.w        dma,$dff096
  128.  move.l        #$1f4,d0
  129. bpxx:
  130.  dbf        d0,bpxx
  131.  move.l        #3,d0
  132.  move.l        #$dff0a0,a1
  133.  move.w        #1,d1
  134.  lea        bpcurrent,a2
  135. bploop2:
  136.  btst        #15,(a2)
  137.  beq        bpskip7
  138.  bsr        bpplayit
  139. bpskip7:
  140.  asl.w        #1,d1
  141.  lea        $10(a1),a1
  142.  lea        $e(a2),a2
  143.  dbra        d0,bploop2
  144.  rts
  145.  
  146. bpnext:
  147.  clr.w        dma
  148.  lea        bpsong,a0
  149.  move.l        #$dff0a0,a3
  150.  move.l        #3,d0
  151.  move.w        #1,d7
  152.  lea        bpcurrent,a1
  153. bploop3:
  154.  clr.l        d1
  155.  move.w        bpstep,d1
  156.  lsl.w        #4,d1
  157.  move.l        d0,d2
  158.  lsl.l        #2,d2
  159.  add.l        d2,d1
  160.  add.l        #512,d1
  161.  move.w        (a0,d1),d2
  162.  move.b        2(a0,d1),st
  163.  move.b        3(a0,d1),tr
  164.  subq.w        #1,d2
  165.  mulu        #48,d2
  166.  clr.l        d3
  167.  move.w        30(a0),d3
  168.  lsl.w        #4,d3
  169.  add.l        d2,d3
  170.  move.l          #$00000200,d4
  171.  move.b        bppatcount,d4
  172.  add.l        d3,d4
  173.  move.l        d4,a2
  174.  add.l        a0,a2
  175.  
  176.  clr.l        d3 
  177.  move.b        (a2),d3
  178.  tst.b        d3
  179.  bne        bpskip4
  180.  bra        bpoptionals
  181. bpskip4:
  182.  clr.w        12(a1)      ;Clear autoslide/autoarpeggio
  183.  move.b        1(a2),d4
  184.  and.b        #15,d4
  185.  cmpi.b        #10,d4    ;Option 10->transposes off
  186.  bne        bp_do1
  187.  move.b        2(a2),d4
  188.  and.b        #240,d4      ;Higher nibble=transpose
  189.  bne        bp_not1
  190. bp_do1:
  191.  add.b        tr,d3
  192. bp_not1:
  193.  move.b        d3,10(a1) ; Voor Arpeggio's
  194.  lea        bpper,a4
  195.  lsl.w        #1,d3
  196.  move.w        -2(a4,d3.w),(a1)
  197.  bset        #15,(a1)
  198.  move.b        #$ff,2(a1)
  199.  
  200.  clr.w        d3
  201.  move.b        1(a2),d3
  202.  lsr.b        #4,d3
  203.  and.b        #15,d3
  204.  tst.b        d3
  205.  bne        bpskip5
  206.  move.b        3(a1),d3 
  207. bpskip5: 
  208.  move.b        1(a2),d4
  209.  and.b        #15,d4
  210.  cmpi.b        #10,d4        ;option 10
  211.  bne        bp_do2
  212.  move.b        2(a2),d4
  213.  and.b        #15,d4
  214.  bne        bp_not2
  215. bp_do2:
  216.  add.b        st,d3
  217. bp_not2:
  218.  cmpi.w        #1,8(a1)
  219.  beq        bpsamplechange
  220.  cmpi.b        3(a1),d3
  221.  beq        bpoptionals
  222. bpsamplechange:
  223.  move.b        d3,3(a1)
  224.  or.w        d7,dma
  225.  
  226. bpoptionals: 
  227.  clr.l        d3
  228.  clr.l        d4
  229.  move.b        1(a2),d3
  230.  and.b        #15,d3
  231.  move.b        2(a2),d4
  232.  
  233. ; Optionals Here
  234.  cmpi.b        #0,d3
  235.  bne        notopt0
  236.  move.b        d4,11(a1)
  237. notopt0:
  238.  cmpi.b        #1,d3
  239.  bne        bpskip3
  240.  move.w        d4,8(a3)
  241.  move.b        d4,2(a1) ; Volume ook in BPCurrent
  242. bpskip3:
  243.  cmpi.b        #2,d3  ; Set Speed
  244.  bne        bpskip9
  245.  move.b        d4,bpcount
  246.  move.b        d4,bpdelay
  247. bpskip9:
  248.  cmpi.b        #3,d3 ; Filter = LED control
  249.  bne        bpskipa
  250.  tst.b        d4
  251.  bne        bpskipb
  252.  bset        #1,$bfe001
  253.  bra        bpskip2
  254. bpskipb:
  255.  bclr        #1,$bfe001
  256. bpskipa:
  257.  cmpi.b        #4,d3 ; PortUp
  258.  bne        noportup
  259.  sub.w        d4,(a1) ; Slide data in BPCurrent
  260.  move.w        (a1),6(a3) ; En in AudPer reg.
  261.  clr.b        11(a1) ; Arpeggio's uit
  262. noportup:
  263.  cmpi.b        #5,d3 ; PortDown
  264.  bne        noportdn
  265.  add.w        d4,(a1) ; Slide down
  266.  clr.b        11(a1)
  267.  move.w        (a1),6(a3)
  268. noportdn:
  269.  cmpi.b        #6,d3    ; SetRepCount
  270.  bne        notopt6
  271.  move.b        d4,bprepcount
  272. notopt6:
  273.  cmpi.b        #7,d3    ; DBRA repcount
  274.  bne        notopt7
  275.  subq.b        #1,bprepcount
  276.  beq        notopt7
  277.  move.w        d4,bpstep
  278. notopt7:
  279.  cmpi.b        #8,d3    ;Set AutoSlide
  280.  bne        notopt8
  281.  move.b        d4,12(a1)
  282. notopt8:
  283.  cmpi.b        #9,d3    ;Set AutoArpeggio
  284.  bne        notopt9
  285.  move.b        d4,13(a1)
  286. notopt9:
  287. bpskip2:
  288.  lea        $10(a3),a3
  289.  lea        $e(a1),a1
  290.  asl.w        #1,d7
  291.  dbra        d0,bploop3                 
  292.  addq.b        #3,bppatcount
  293.  cmpi.b        #48,bppatcount
  294.  bne        bpskip8
  295.  move.b        #0,bppatcount
  296.  addq.w        #1,bpstep
  297.  lea        bpsong,a0
  298.  move.w        30(a0),d1
  299.  cmp.w        bpstep,d1
  300.  bne        bpskip8
  301.  move.w        #0,bpstep
  302. bpskip8:
  303.  rts
  304.  
  305. bpplayit:
  306.  bclr        #15,(a2)
  307.  move.w        (a2),6(a1)
  308.  clr.l        d7
  309.  move.b        3(a2),d7
  310.  move.l        d7,d6
  311.  lea        bpsong,a3
  312.  lsl.l        #2,d6
  313.  lea        samples,a4
  314.  move.l        -4(a4,d6),d4
  315.  beq        bp_nosamp
  316.  move.l        d4,(a1)
  317.  lsl.l        #5,d7
  318.  add.l        #24,d7
  319.  move.w        (a3,d7),4(a1)
  320.  move.b        2(a2),9(a1)
  321.  cmpi.b        #$ff,2(a2)
  322.  bne        skipxx
  323.  move.w        6(a3,d7),8(a1)
  324. skipxx: 
  325.  move.w        4(a3,d7),8(a2)
  326.  clr.l        d6
  327.  move.w        2(a3,d7),d6
  328.  add.l        d6,d4
  329.  move.l        d4,4(a2)
  330.  cmpi.w        #1,8(a2)
  331.  bne        bpskip6
  332. bp_nosamp:
  333.  move.l        #null,4(a2)
  334.  bra        bpskip10
  335. bpskip6:
  336.  move.w        8(a2),4(a1)
  337.  move.l        4(a2),(a1)
  338. bpskip10:
  339.  add.w        #$8000,d1
  340.  move.w        d1,$dff096
  341.  rts
  342. bpplayarp:
  343.  lea        bpper,a4
  344.  and.w        #$ff,d4
  345.  lsl.w        #1,d4
  346.  move.w        -2(a4,d4.w),6(a1)
  347.  rts
  348.   
  349. inter:
  350.  dc.l    0,0
  351.  dc.b    2,127
  352.  dc.l    0,0
  353.  dc.l    bpnewirq
  354.                         
  355. null: dc.w 0
  356. bpcurrent: dc.w 0,0    ;periode,instrument
  357.        dc.l null    ;start
  358.            dc.w 1    ;length (words)
  359.        dc.b 0,0,0,0 ;noot,arpeggio,autoslide,autoarpeggio
  360.  
  361.            dc.w 0,0
  362.        dc.l null
  363.        dc.w 1,0,0
  364.  
  365.         dc.w 0,0
  366.        dc.l null
  367.        dc.w 1,0,0
  368.  
  369.        dc.w 0,0
  370.        dc.l null
  371.        dc.w 1,0,0
  372. bpstep: dc.w 0
  373. bppatcount: dc.b 0
  374. st: dc.b 0
  375. tr: dc.b 0
  376. bpcount: dc.b 1
  377. bpdelay: dc.b 6
  378. arpcount: dc.b 1
  379. bprepcount: dc.b 1
  380.  even
  381. dma: dc.w 0
  382. bpper:
  383.  dc.w    856,808,760,720,680,640,604,572,540,508,480,452
  384.  dc.w    428,404,380,360,340,320,302,286,270,254,240,226
  385.  dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  386. samples:
  387.  dc.l    s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc,sd,se,sf
  388.  
  389. bpsong: blk.b 0,0
  390. s1:    blk.b 0,0
  391. s2:     blk.b 0,0
  392. s3:     blk.b 0,0
  393. s4:     blk.b 0,0
  394. s5:     blk.b 0,0
  395. s6:    blk.b 0,0
  396. s7:    blk.b 0,0
  397. s8:    blk.b 0,0
  398. s9:    blk.b 0,0
  399. sa:    blk.b 0,0
  400. sb:     blk.b 0,0
  401. sc:     blk.b 0,0
  402. sd:     blk.b 0,0
  403. se:    blk.b 0,0
  404. sf:    blk.b 0,0
  405.