home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 26 / af026.adf / PlayRoutines / replay23.S < prev    next >
Text File  |  1991-07-09  |  10KB  |  407 lines

  1. *************************************************
  2. *             Muzak  Replay-Routine             *
  3. *               Version 1.2 (.23)               *
  4. *                        *
  5. *     © copyright 8/1987 by Karsten Obarski       *
  6. *      3000 Hannover 61  Anderter Strase 1    *
  7. *           Tel.:  0511/584293        *
  8. *************************************************
  9. ;effect (1) appregiato  form = 1.halfup , 2.halfup
  10. ;effect (2) pitchbend   form = 0-f down , 0-f up
  11.  
  12. *************************************************
  13. * main program-loop
  14. *************************************************
  15. ;org    $xxxxxx
  16. ;load    $xxxxxx
  17. ;start:    bra    muzakstart        ;startaddress +0
  18. ;    bra    preparemuzak        ;startaddress +4
  19. ;    bra    enablereplay        ;startaddress +8
  20. ;    bra    disablereplay        ;startaddress +12
  21. *************************************************
  22.  
  23. start:    jsr    preparemuzak
  24.     move.l    $6c,framirqsave        ;set frame-flop irq
  25.     move.l    #frameirq,$6c
  26.     jsr    enablereplay
  27.  
  28. main:    btst    #6,$bfe001
  29.     bne    main
  30.  
  31.     jsr    disablereplay
  32.     move.l    framirqsave,$6c
  33.     clr.l    d0
  34. end:    rts
  35.  
  36. *************************************************
  37. * first settings before muzakstart
  38. *************************************************
  39. preparemuzak:
  40.     move.l    #snd1,sounds+0
  41.     move.l    #snd2,sounds+4
  42.     move.l    #snd3,sounds+8
  43.     move.l    #snd4,sounds+12
  44.     move.l    #snd5,sounds+16
  45.     move.l    #snd6,sounds+20
  46.     move.l    #snd7,sounds+24
  47.     move.l    #snd8,sounds+28
  48.     move.l    #snd9,sounds+32
  49.     move.l    #snda,sounds+36
  50.     move.l    #sndb,sounds+40
  51.     move.l    #sndc,sounds+44
  52.     move.l    #sndd,sounds+48
  53.     move.l    #snde,sounds+52
  54.     move.l    #sndf,sounds+56
  55.     lea.l    samples,a0
  56.     move.l    #geslaenge,d0        ;code or endcode samples
  57. docode:    eor.b    #$55,(a0)+
  58.     subq.l    #1,d0
  59.     cmp.l    #0,d0
  60.     bne.s    docode
  61.     move.l    #sounds,a0        ;clear first longw
  62.     clr.l    d0            ;in all samples
  63. clrsam:    move.l    (a0,d0.l),a1
  64.     clr.l    (a1)
  65.     addq.l    #4,d0
  66.     cmp.l    #60,d0
  67.     bne    clrsam    
  68.     lea.l    muzakdata,a0
  69.     move.b    470(a0),numofpatt+1    ;save #of patts
  70.     rts
  71.  
  72. *************************************************
  73. * enable replay routine 
  74. *************************************************
  75. enablereplay:
  76.     move.w    #$ffff,playmode
  77.     move.w    #00,$dff0a8
  78.     move.w    #00,$dff0b8
  79.     move.w    #00,$dff0c8
  80.     move.w    #00,$dff0d8
  81.     clr.l    timerpos
  82.     clr.l    trackpos
  83.     clr.l    patternpos    
  84.     rts
  85.  
  86. *************************************************
  87. * disable replay routine 
  88. *************************************************
  89. disablereplay:
  90.     clr.w    playmode
  91.     move.w    #00,$dff0a8
  92.     move.w    #00,$dff0b8
  93.     move.w    #00,$dff0c8
  94.     move.w    #00,$dff0d8
  95.     move.w    #$f,$dff096
  96.     rts
  97.  
  98. *************************************************
  99. * complete muzak replayer (muzakstart > muzakend)
  100. *************************************************
  101.     ;datach x format
  102.     ;w +0    current note
  103.     ;b +2    sound#
  104.     ;b +3    effect
  105.     ;l +4    sndstart
  106.     ;w +8    sndlen
  107.     ;l +10    repeatstart
  108.     ;w +14    repeatlen
  109.     ;w +16    last saved note
  110.     ;w +18    volume of sample
  111.     ;w +20    dma-bit
  112.     datach0:blk.l    5,0
  113.     dc.w    1
  114.     datach1:blk.l    5,0
  115.     dc.w    2
  116.     datach2:blk.l    5,0
  117.     dc.w    4
  118.     datach3:blk.l    5,0
  119.     dc.w    8
  120.     patternpos:    dc.l    0
  121.     trackpos:    dc.l    0
  122.     timerpos:    dc.l    0
  123.     muzakdata:    blk.b    2,0    ;patterndata
  124.     sounds:        blk.l    15,0
  125.     numofpatt:    dc.w    0
  126.     playmode:    dc.w    0
  127.     enablebits:    dc.w    0
  128.     notetable:
  129.     dc.w    856,808,762,720,678,640
  130.     dc.w    604,570,538,508,480,453
  131.     dc.w    428,404,381,360,339,320
  132.     dc.w    302,285,269,254,240,226  
  133.     dc.w    214,202,190,180,170,160
  134.     dc.w    151,143,135,127,120,113
  135.     dc.w    000
  136. *************************************************
  137. muzakstart:
  138.     movem.l    d0-d7/a0-a6,-(a7)
  139.     addq.l    #1,timerpos        ;control timing
  140.     cmp.l    #6,timerpos
  141.     bne.s    effecthandler
  142.     clr.l    timerpos
  143.     bra     replayhandler
  144.  
  145. *************************************************
  146. * handle possible effects
  147. *************************************************
  148. effecthandler:
  149. eff0:    lea.l    datach0,a6
  150.     cmp.b    #0,3(a6)
  151.     beq.s    eff1
  152.     move.l    #$dff0a0,a5
  153.     bsr.s    effcmp
  154. eff1:    lea.l    datach1,a6
  155.     cmp.b    #0,3(a6)
  156.     beq.s    eff2
  157.     move.l    #$dff0b0,a5
  158.     bsr.s    effcmp
  159. eff2:    lea.l    datach2,a6
  160.     cmp.b    #0,3(a6)
  161.     beq.s    eff3
  162.     move.l    #$dff0c0,a5
  163.     bsr.s    effcmp
  164. eff3:    lea.l    datach3,a6
  165.     cmp.b    #0,3(a6)
  166.     beq.s    eff4
  167.     move.l    #$dff0d0,a5
  168.     bsr.s    effcmp
  169. eff4:    bra    muzakend
  170. effcmp:    move.b    2(a6),d0        ;compare effect #
  171.     and.b    #$0f,d0
  172.     cmp.b    #1,d0
  173.     beq    appreggiato        ;appre-effect (#1)
  174.     cmp.b    #2,d0
  175.     beq    pitchbend        ;slide up/down(#4)
  176.     rts
  177.  
  178. *************************************************
  179. * effect-module (1) appregiato / timbre
  180. *************************************************
  181. appreggiato:
  182.     cmp.l    #1,timerpos
  183.     beq.s    trans2            ;1. transposed note
  184.     cmp.l    #2,timerpos
  185.     beq.s    trans3            ;2. transposed note
  186.     cmp.l    #3,timerpos
  187.     beq.s    notrans            ;original note
  188.     cmp.l    #4,timerpos
  189.     beq.s    trans2            ;1. transposed note
  190.     cmp.l    #5,timerpos
  191.     beq.s    trans3            ;2. transposed note
  192.     rts
  193. trans2:    clr.l    d0            ;2nd note
  194.     move.b    3(a6),d0        ;effectbyte
  195.     lsr.b    #4,d0            ;upper nibble
  196.     bra.s    starttranspose
  197. trans3:    clr.l    d0            ;3rd note
  198.     move.b    3(a6),d0        ;effectbyte
  199.     and.b    #$0f,d0            ;lower nibble
  200.     bra.s    starttranspose
  201. notrans:move.w    16(a6),d2        ;last saved note
  202.     bra.s    startt2
  203. starttranspose:
  204.     lsl.l    #1,d0            ;transpose-wert *2 ...
  205.     clr.l    d1            ;b'cause wordlen in table
  206.     move.w    16(a6),d1        ;last saved note
  207.     lea.l    notetable,a0
  208. startt1:move.w    (a0,d0.l),d2        ;get transposed note
  209.     cmp.w    (a0),d1            ;search last note in table
  210.     beq.s    startt2
  211.     addq.l    #2,a0
  212.     bra.s    startt1
  213. startt2:move.w    d2,6(a5)        ;set note  $dff0x6
  214.     rts
  215.  
  216. *************************************************
  217. * effect-module (2) pitchwheel
  218. *************************************************
  219. pitchbend:
  220.     clr.l    d0            ;2nd note
  221.     move.b    3(a6),d0        ;effectbyte
  222.     lsr.b    #4,d0            ;upper nibble
  223.     cmp.b    #0,d0
  224.     beq.s    pitch2
  225.     add.w    d0,(a6)
  226.     move.w    (a6),6(a5)        ;set note
  227.     rts
  228. pitch2:    clr.l    d0            ;3rd note
  229.     move.b    3(a6),d0        ;effectbyte
  230.     and.b    #$0f,d0            ;lower nibble
  231.     cmp.b    #0,d0
  232.     beq.s    pitch3
  233.     sub.w    d0,(a6)
  234.     move.w    (a6),6(a5)        ;set note
  235. pitch3:    rts
  236.  
  237. *************************************************
  238. * replay-module
  239. *************************************************
  240. replayhandler:
  241.     lea.l    muzakdata,a0        ;top offset
  242.     move.l    a0,a3
  243.     add.l    #12,a3            ;start of sndpreferences
  244.     move.l    a0,a2
  245.     add.l    #472,a2            ;start of tracksdata
  246.     add.l    #600,a0            ;start of patterndata
  247.     move.l    trackpos,d0
  248.     clr.l    d1            ;here was a bugg
  249.     move.b    (a2,d0.l),d1        ;get patt ptr
  250.     mulu    #1024,d1        ;with patternlen
  251.     add.l    patternpos,d1        ;add 16tel position
  252.     clr.w    enablebits        ;no start if no note
  253.  
  254.     move.l    #$dff0a0,a5        ;handle chanel0
  255.     lea.l    datach0,a6
  256.     bsr.s    soundhandler
  257.     move.l    #$dff0b0,a5        ;handle chanel1
  258.     lea.l    datach1,a6
  259.     bsr.s    soundhandler
  260.     move.l    #$dff0c0,a5        ;handle chanel2
  261.     lea.l    datach2,a6
  262.     bsr.s    soundhandler
  263.     move.l    #$dff0d0,a5        ;handle chanel3
  264.     lea.l    datach3,a6
  265.     bsr.s    soundhandler
  266.     bra    assume
  267.  
  268. soundhandler:
  269.     move.l    (a0,d1.l),(a6)        ;note, snd# & effect
  270.     addq.l    #4,d1            ;aha
  271.     clr.l    d2
  272.     move.b    2(a6),d2        ;get sound#
  273.     and.b    #$f0,d2            ;kill effect number
  274.     lsr.b    #4,d2            ;shift to lo-nibble
  275.     cmp.b    #00,d2            ;no soundchange?
  276.     beq.s    notehandler        ;than forget it
  277.     clr.l    d3
  278.     lea.l    sounds-4,a1        ;sample ptr table
  279.     move.l    d2,d4            ;exch soundnumber
  280.     mulu    #4,d2            ;calc pointer
  281.     mulu    #30,d4            ;soundpreferernce
  282.     move.l    (a1,d2.l),4(a6)        ;store sndstart
  283.     move.w    (a3,d4.l),8(a6)        ;store sndlen
  284.     move.w    2(a3,d4.l),18(a6)    ;store volume
  285.     move.w    4(a3,d4.l),d3        ;repeatstart value
  286.     cmp.w    #0,d3            ;sustain-sound ?
  287.     beq.s    sndhan2            ;then..
  288.     move.l    4(a6),d2        ;add repstart to ..
  289.     add.l    d3,d2            ;sndstart to ..
  290.     move.l    d2,4(a6)        ;store soundstart
  291.     move.l    d2,10(a6)        ;store repeatstart
  292.     move.w    6(a3,d4),8(a6)        ;store soundlen
  293.     move.w    6(a3,d4),14(a6)        ;store repeatlen
  294.     move.w    18(a6),8(a5)        ;set new volume 
  295.     bra.s    notehandler
  296. sndhan2:move.l    4(a6),d2        ;add repstart to ..
  297.     add.l    d3,d2            ;sndstart to ..
  298.     move.l    d2,10(a6)        ;store repeatstart
  299.     move.w    6(a3,d4.l),14(a6)    ;store repeatlen
  300.     move.w    18(a6),8(a5)        ;set new volume 
  301. notehandler:
  302.     cmp.w    #00,(a6)        ;is a new note set?
  303.     beq.s    handlerend        ;then forget it
  304.     move.w    (a6),16(a6)        ;save note for effect
  305.     move.w    20(a6),$dff096        ;clear dma-bit
  306.     move.l    4(a6),0(a5)        ;set sndstart
  307.     move.w    8(a6),4(a5)        ;set sndlen
  308.     move.w    0(a6),6(a5)        ;set period
  309.     move.w    20(a6),d0
  310.     or.w    d0,enablebits        ;set enable if needed
  311. handlerend:
  312.     rts
  313.  
  314. assume:    move.l    #300,d0
  315. ass2:    dbra    d0,ass2            ;wait a while
  316.     move.l    #$8000,d0
  317.     add.w    enablebits,d0        ;enable used dmas
  318.     move.w    d0,$dff096
  319. ass3:    move.l    #datach3,a6
  320.     cmp.w    #1,14(a6)        ;repeatsound ?
  321.     bne.s    ass4            ;eq = no!
  322.     move.l    10(a6),$dff0d0        ;set to repeatpoints
  323.     move.w    14(a6),$dff0d4        ;set to repeatlenghts
  324. ass4:    move.l    #datach2,a6
  325.     cmp.w    #1,14(a6)
  326.     bne.s    ass5
  327.     move.l    10(a6),$dff0c0
  328.     move.w    14(a6),$dff0c4
  329. ass5:    move.l    #datach1,a6
  330.     cmp.w    #1,14(a6)
  331.     bne.s    ass6
  332.     move.l    10(a6),$dff0b0
  333.     move.w    14(a6),$dff0b4
  334. ass6:    move.l    #datach0,a6
  335.     cmp.w    #1,14(a6)
  336.     bne.s    ass7
  337.     move.l    10(a6),$dff0a0    
  338.     move.w    14(a6),$dff0a4
  339. ass7:    add.l    #16,patternpos        ;4*longw further
  340.     cmp.l    #64*16,patternpos    ;pattern end?
  341.     bne.s    muzakend
  342.     clr.l    patternpos
  343.     addq.l    #1,trackpos        ;increase pointer
  344.     clr.l    d0
  345.     move.w    numofpatt,d0        ;number of all patts
  346.     move.l    trackpos,d1        ;current pos
  347.     cmp.l    d0,d1            ;last pattern done?
  348.     bne.s    muzakend        ;no!
  349.     clr.l    trackpos        ;set on top of seq
  350. muzakend:
  351.     movem.l    (a7)+,d0-d7/a0-a6
  352.     rts
  353.  
  354. *************************************************
  355. * sounddata behind the replayer 
  356. *************************************************
  357. samples:
  358.     snd1:    blk.b    2,0
  359.     snd2:    blk.b    2,0
  360.     snd3:    blk.b    2,0
  361.     snd4:    blk.b    2,0
  362.     snd5:    blk.b    2,0
  363.     snd6:    blk.b    2,0
  364.     snd7:    blk.b    2,0
  365.     snd8:    blk.b    2,0
  366.     snd9:    blk.b    2,0
  367.     snda:    blk.b    2,0
  368.     sndb:    blk.b    2,0
  369.     sndc:    blk.b    2,0
  370.     sndd:    blk.b    2,0
  371.     snde:    blk.b    2,0
  372.     sndf:    blk.b    2,0
  373.     samplesend:
  374.  
  375. *************************************************
  376. * interrupt level 3 (frame flop)
  377. *************************************************
  378.     framirqsave:    dc.l    0
  379. *************************************************
  380. frameirq:
  381.     movem.l    d0/d1/a0/a1/a5/a6,-(a7)    ;save stack
  382.     lea    $dff000,a0
  383.     move.l    4,a6
  384.     move.w    $1c(a0),d1
  385.     btst    #$e,d1            ;irq dissable?
  386.     beq.s    irqend
  387.     and.w    $1e(a0),d1
  388.     btst    #6,d1
  389.     beq.s    lev3vb
  390.     movem.l    $9c(a6),a1/a5
  391.     pea    -$24(a6)
  392.     jmp    (a5)
  393. lev3vb:    btst    #5,d1            ;vertical blank
  394.     beq.s    lev3cop
  395.     bsr    muzakstart         ;own rout
  396.     movem.l    $90(a6),a1/a5
  397.     pea    -$24(a6)
  398.     jmp    (a5)
  399. lev3cop:btst    #4,d1            ;copper
  400.     beq.s    irqend
  401.     movem.l    $84(a6),a1/a5
  402.     pea    -$24(a6)
  403.     jmp    (a5)
  404. irqend:    movem.l    (a7)+,d0/d1/a0/a1/a5/a6
  405.     rte
  406. ;end:
  407.