home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaMiscModsCD3.iso / _PROGRAMME / PLAYER / SOURCECODE / ps3msrc.lha / PS3M / demo / estrellar0.s next >
Encoding:
Text File  |  1996-02-25  |  58.3 KB  |  4,518 lines

  1. ;PS3M Replay version 0.942/020+ / 30.10.1994
  2. ;Copyright (c) Jarno Paananen a.k.a. Guru / S2 1994-95
  3.  
  4. ;Some portions based on STMIK 0.9ß by Sami Tammilehto / PSI of Future Crew
  5.  
  6. ;ASM-ONE 1.20 or newer is required unless disable020 is set to 1, when
  7. ;at least 1.09 (haven't tried older) is sufficient.
  8.  
  9.  
  10. *****************************************************************************
  11. ** Contraption by K-P / HpD / iNS (14.12.1995)
  12. ** What's left: killermode, 000/020+ mixingroutines, all 5 playmodes, and
  13. ** the S3M replayer.
  14. *****************************************************************************
  15.  
  16. MONO = 1
  17. STEREO = 2
  18. SURROUND = 3
  19. REAL = 4
  20. STEREO14 = 5
  21.  
  22. mtS3M = 1
  23.  
  24. ENABLED = 0
  25. DISABLED = 1
  26.  
  27. * Mixauspuskurin koko
  28.  
  29. BUFFER = 4*1024                    ; MUST BE 2^N
  30.                         ; MIN 4K
  31.  
  32. disable020 = 0
  33.  
  34.  
  35.     incdir    include:
  36.  
  37.     include    exec/execbase.i
  38.     include    exec/exec_lib.i
  39.     include    exec/memory.i
  40.     include    graphics/graphics_lib.i
  41.     
  42.     include    Guru.i
  43.     include    ps3m.i
  44.  
  45.  
  46.  
  47. pushm    macro
  48.     ifc    "\1","all"
  49.     movem.l    d0-a6,-(sp)
  50.     else
  51.     movem.l    \1,-(sp)
  52.     endc
  53.     endm
  54.  
  55. popm    macro
  56.     ifc    "\1","all"
  57.     movem.l    (sp)+,d0-a6
  58.     else
  59.     movem.l    (sp)+,\1
  60.     endc
  61.     endm
  62.  
  63. push    macro
  64.     move.l    \1,-(sp)
  65.     endm
  66.  
  67. pop    macro
  68.     move.l    (sp)+,\1
  69.     endm
  70.  
  71. lob    macro
  72.     jsr    _LVO\1(a6)
  73.     endm
  74.  
  75. iword    macro
  76.     ror    #8,\1
  77.     endm
  78.  
  79. ilword    macro
  80.     ror    #8,\1
  81.     swap    \1
  82.     ror    #8,\1
  83.     endm
  84.  
  85. tlword    macro
  86.     move.b    \1,\2
  87.     ror.l    #8,\2
  88.     move.b    \1,\2
  89.     ror.l    #8,\2
  90.     move.b    \1,\2
  91.     ror.l    #8,\2
  92.     move.b    \1,\2
  93.     ror.l    #8,\2
  94.     endm
  95.  
  96. tword    macro
  97.     move.b    \1,\2
  98.     ror    #8,\2
  99.     move.b    \1,\2
  100.     ror    #8,\2
  101.     endm
  102.  
  103.  
  104.  
  105. s3init    
  106.     move.l    4.w,a6
  107.     lea    gfxname,a1
  108.     lob    OldOpenLibrary
  109.     move.l    d0,gfxbase
  110.     
  111.  
  112.     clr    PS3M_eject
  113.     clr    PS3M_position
  114.     clr    PS3M_wait
  115.     clr    PS3M_play
  116.     clr    PS3M_initialized
  117.  
  118.  
  119.     move.l    #28000,mixingrate    * Mixingrate (0-n)
  120.     move.l    #2,vboost        * Volumeboost (0-8)
  121.     move.l    #module,s3m        * module address
  122.     move    #SURROUND,pmode        * playmode
  123. ;    move    #STEREO14,pmode        * playmode
  124.  
  125.  
  126.     bsr.w    init
  127.  
  128.     move    #$40,PS3M_master    * master volume
  129.  
  130.  
  131.     lea    data,a5
  132.     basereg    data,a5
  133.  
  134. *** Alloc mem
  135.  
  136.  
  137.     move.l    #BUFFER,d0
  138.     move.l    d0,buffSize(a5)
  139.     subq.l    #1,d0
  140.     move.l    d0,buffSizeMask(a5)
  141.     lsl.l    #8,d0
  142.     move.b    #$ff,d0
  143.     move.l    d0,buffSizeMaskFF
  144.  
  145.     move.l    4.w,a6
  146.  
  147.     move.l    #1024*4*2,d0
  148.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  149.     lob    AllocMem
  150.     move.l    d0,tbuf(a5)
  151.     beq.w    .memerr
  152.     add.l    #1024*4,d0
  153.     move.l    d0,tbuf2(a5)    
  154.  
  155.     move.l    buffSize(a5),d0
  156.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  157.     lob    AllocMem
  158.     move.l    d0,buff1(a5)
  159.     beq.w    .memerr
  160.  
  161.     move.l    buffSize(a5),d0
  162.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  163.     lob    AllocMem
  164.     move.l    d0,buff2(a5)
  165.     beq.w    .memerr
  166.  
  167.     move.l    #66*256,d7            ; Volume tab size
  168.  
  169.     cmp    #REAL,pmode(a5)
  170.     beq.b    .varaa
  171.     cmp    #STEREO14,pmode(a5)
  172.     bne.b    .ala2
  173.  
  174. .varaa    move.l    buffSize(a5),d0
  175.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  176.     lob    AllocMem
  177.     move.l    d0,buff3(a5)
  178.     beq.b    .memerr
  179.  
  180.     move.l    buffSize(a5),d0
  181.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  182.     lob    AllocMem
  183.     move.l    d0,buff4(a5)
  184.     beq.b    .memerr
  185.  
  186. .ala2    cmp    #STEREO14,pmode(a5)
  187.     beq.b    .bit14
  188.  
  189.     moveq    #0,d0
  190.     move    maxchan(a5),d1
  191.     move.l    #256,d2
  192.     subq    #1,d1
  193. .l    add.l    d2,d0
  194.     add.l    #256,d2
  195.     dbf    d1,.l
  196.  
  197.     move.l    d0,dtabsize(a5)
  198.     moveq    #MEMF_PUBLIC,d1
  199.     lob    AllocMem
  200.     move.l    d0,dtab(a5)
  201.     beq.b    .memerr    
  202.     bra.b    .alavaraa
  203.  
  204. .bit14    move.l    #66*256*2,d7            ; Volume tab size
  205.  
  206.     move.l    #64*1024,d0
  207.     moveq    #MEMF_PUBLIC,d1
  208.     lob    AllocMem
  209.     move.l    d0,buff14(a5)
  210.     bne.b    .alavaraa
  211.  
  212. .memerr    bsr.w    s3end
  213.  
  214.     moveq    #-1,d0            * ERROR: no mem!
  215.     rts
  216.  
  217. .alavaraa
  218.     move.l    d7,d0
  219.     moveq    #MEMF_PUBLIC,d1
  220.     lob    AllocMem
  221.     move.l    d0,vtab(a5)
  222.     beq.b    .memerr
  223.  
  224.     add.l    #255,d0
  225.     and.l    #~$ff,d0
  226.     move.l    d0,vtabaddr(a5)
  227.  
  228.     clr    PS3M_cont(a5)
  229.     clr    PS3M_eject(a5)
  230.     clr    PS3M_position(a5)
  231.     st     PS3M_play(a5)
  232.  
  233.     bsr.w    s3mPlay
  234.     bsr.b    s3end
  235.     moveq    #0,d0            * All ok
  236.     rts
  237.  
  238.      endb    a5
  239.  
  240.  
  241.  
  242.  
  243. ** Stop playing
  244.  
  245. s3stop    pushm    all
  246.     lea    data,a5
  247.     st    PS3M_paused-data(a5)
  248.     bsr.w    PS3M_pause
  249.     st    jjo
  250.     popm    all
  251.     rts
  252.  
  253. jjo    dc    0
  254.  
  255.  
  256. ** continue after stop
  257.  
  258. s3cont    tst    jjo
  259.     bne.b    .jm
  260.     rts
  261. .jm    pushm    all
  262.     lea    data,a5
  263.     clr    PS3M_paused-data(a5)
  264.     bsr.w    PS3M_pause
  265.     clr    jjo
  266.     popm    all
  267.     rts
  268.  
  269. ** End music
  270.  
  271. s3end
  272.     lea    data,a5
  273.     basereg    data,a5
  274.  
  275.     bsr.b    s3cont
  276.  
  277.     st    PS3M_eject(a5)
  278.     st    PS3M_wait(a5)
  279.  
  280.     move.l    4.w,a6
  281.     move.l    tbuf(a5),d0
  282.     beq.b    .eumg
  283.     move.l    d0,a1
  284.     move.l    #1024*4*2,d0
  285.     lob    FreeMem
  286.     clr.l    tbuf(a5)
  287.     clr.l    tbuf2(a5)
  288.  
  289. .eumg    move.l    buff1(a5),d0
  290.     beq.b    .eimem
  291.     move.l    d0,a1
  292.     move.l    buffSize(a5),d0
  293.     lob    FreeMem
  294.     clr.l    buff1(a5)
  295.  
  296. .eimem    move.l    buff2(a5),d0
  297.     beq.b    .eimem1
  298.     move.l    d0,a1
  299.     move.l    buffSize(a5),d0
  300.     lob    FreeMem
  301.     clr.l    buff2(a5)
  302.  
  303. .eimem1    move.l    buff3(a5),d0
  304.     beq.b    .eimem2
  305.     move.l    d0,a1
  306.     move.l    buffSize(a5),d0
  307.     lob    FreeMem
  308.     clr.l    buff3(a5)
  309.  
  310. .eimem2    move.l    buff4(a5),d0
  311.     beq.b    .eimem3
  312.     move.l    d0,a1
  313.     move.l    buffSize(a5),d0
  314.     lob    FreeMem
  315.     clr.l    buff4(a5)
  316.  
  317. .eimem3    move.l    buff14(a5),d0
  318.     beq.b    .eimem4
  319.     move.l    d0,a1
  320.     move.l    #64*1024,d0
  321.     lob    FreeMem
  322.     clr.l    buff14(a5)
  323.  
  324. .eimem4    move.l    vtab(a5),d0
  325.     beq.b    .eimem5
  326.     move.l    d0,a1
  327.     move.l    #66*256,d0
  328.     cmp    #STEREO14,pmode(a5)
  329.     bne.b    .cd
  330.     add.l    d0,d0
  331. .cd    lob    FreeMem
  332.     clr.l    vtab(a5)
  333.  
  334. .eimem5    move.l    dtab(a5),d0
  335.     beq.b    .eimem6
  336.     move.l    d0,a1
  337.     move.l    dtabsize(a5),d0
  338.     lob    FreeMem
  339.     clr.l    dtab(a5)
  340.  
  341. .eimem6    rts
  342.  
  343.     endb    a5
  344.  
  345.  
  346.  
  347. ** Forward one pattern
  348.  
  349. eteen    pushm    all
  350.     move    positioneita,d1
  351.     subq    #2,d1
  352.     bmi.b    .bb
  353.     move    PS3M_position,d0
  354.     addq    #1,d0
  355.     cmp    d1,d0
  356.     blo.b    .a
  357.     clr    d0
  358. .a    bsr.w    setPosition
  359. .bb    popm    all
  360.     rts
  361.  
  362. ** Backward one pattern
  363.  
  364. taakse    pushm    all
  365.     move    PS3M_position,d0
  366.     subq    #1,d0
  367.     bpl.b    .b
  368.     clr    d0
  369. .b    bsr.w    setPosition
  370.     popm    all
  371.     rts
  372.  
  373.  
  374.  
  375.  
  376. *********************************
  377. *       PS3M 0.9A ®        *
  378. *      Version 0.950        *
  379. *   © 1994-95 Jarno Paananen    *
  380. *      All rights reserved    *
  381. *********************************
  382.  
  383. ;; LEV4 - IRQ HANDLER
  384.  
  385. lev4    clr.l    playpos
  386.     move    #$80,$dff09c
  387.     nop
  388.     rte
  389.  
  390. * Lev3 
  391.  
  392. lev3    move.l    d0,-(sp)
  393.     move    #$20,$dff09c
  394.     move.l    mrate50,d0
  395.     add.l    d0,playpos
  396.     move.l    buffSizeMaskFF(pc),d0
  397.     and.l    d0,playpos
  398.     move.l    (sp)+,d0
  399.     nop
  400.     rte
  401.  
  402.  
  403. buffSizeMaskFF
  404.     dc.l    (BUFFER-1)<<8!$ff
  405.  
  406.  
  407.     basereg    data,a5
  408. play    ;movem.l    d0-a6,-(sp)
  409.     lea    data,a5
  410.  
  411.     move.l    playpos(a5),d2
  412.     lsr.l    #8,d2
  413.     move.l    bufpos(a5),d0
  414.     cmp.l    d2,d0
  415.     ble.b    .norm
  416.     sub.l    buffSize(a5),d0
  417. .norm    move.l    mrate50(a5),d1
  418.     lsr.l    #7,d1
  419.     add.l    d0,d1
  420.  
  421.     sub.l    d1,d2
  422.     bmi.b    .ei
  423.  
  424.     moveq    #1,d0
  425.     and.l    d2,d0
  426.     add    d0,d2
  427.  
  428.     cmp.l    #16,d2
  429.     blt.b    .ei
  430.  
  431.     move    d2,todobytes(a5)
  432.  
  433. .mix    move    bytes2music(a5),d0
  434.     cmp    todobytes(a5),d0
  435.     bgt.b    .mixaa
  436.  
  437.     sub    d0,todobytes(a5)
  438.     sub    d0,bytes2music(a5)
  439.     move    d0,bytes2do(a5)
  440.     beq.b    .q
  441.     
  442.     bsr.w    domix
  443.  
  444. .q    tst    PS3M_paused
  445.     bne.b    .o
  446.  
  447.     tst    PS3M_play
  448.     beq.b    .o
  449.  
  450. ;    cmp    #mtS3M,mtype(a5)
  451. ;    bne.b    .xm
  452.     bsr.w    s3m_music
  453.     lea    data,a5
  454. ;    bra.b    .o
  455.  
  456. .o    move    bytesperframe(a5),d0
  457.     add    d0,bytes2music(a5)
  458.     bra.b    .mix
  459.  
  460. .mixaa    move    todobytes(a5),d0
  461.     sub    d0,bytes2music(a5)
  462.     move    d0,bytes2do(a5)
  463.     beq.b    .q2
  464.  
  465.     bsr.w    domix
  466.  
  467. .q2    lea    data,a5
  468. .ei    moveq    #0,d7
  469.     rts
  470.  
  471.  
  472. init    lea    data,a5
  473.     clr    mtype(a5)
  474.  
  475. ;    move.l    s3m(a5),a0
  476. ;    cmp.l    #`SCRM`,44(a0)
  477. ;    beq    .s3m
  478.  
  479. .s3m    move    #mtS3M,mtype(a5)
  480.  
  481.  
  482. .init    
  483.     cmp    #2,maxchan(a5)
  484.     bhs.b    .opk
  485.     move    #2,maxchan(a5)
  486. .opk    
  487.     tst    mtype(a5)
  488.     beq.b    .error
  489.  
  490.     cmp    #mtS3M,mtype(a5)
  491.     beq.w    s3m_init
  492.  
  493. .error    moveq    #1,d0
  494.     rts
  495.  
  496.  
  497. FinalInit
  498.     lea    data,a5
  499.     clr.l    bufpos(a5)
  500.     clr.l    playpos(a5)
  501.  
  502.     clr    cn(a5)
  503. ;    clr.b    mt_counter
  504.  
  505.     lea    buff1,a0
  506.     moveq    #3,d6
  507. .clloop
  508.     move.l    (a0)+,d0
  509.     beq.b    .skip
  510.     move.l    d0,a1
  511.  
  512.     move.l    buffSize(a5),d7
  513.     lsr.l    #2,d7
  514.     subq.l    #1,d7
  515. .cl    clr.l    (a1)+
  516.     dbf    d7,.cl
  517. .skip    dbf    d6,.clloop
  518.  
  519.     tst    PS3M_cont(a5)
  520.     bne.w    .q
  521.  
  522. .huu    lea    cha0(a5),a0
  523.     move    #mChanBlock_SIZE*16-1,d7
  524. .cl2    clr    (a0)+
  525.     dbf    d7,.cl2
  526.  
  527.     lea    c0(a5),a0
  528.     move    #s3mChanBlock_SIZE*8-1,d7
  529. .cl3    clr.l    (a0)+
  530.     dbf    d7,.cl3
  531.  
  532.     move    tempo(a5),d0
  533.     bne.b    .qw
  534.     moveq    #125,d0
  535. .qw    move.l    mrate(a5),d1
  536.     move.l    d1,d2
  537.     lsl.l    #2,d1
  538.     add.l    d2,d1
  539.     add    d0,d0
  540.     divu    d0,d1
  541.  
  542.     addq    #1,d1
  543.     and    #~1,d1
  544.  
  545.     move    d1,bytesperframe(a5)
  546.     clr    bytes2do(a5)
  547.  
  548.     bset    #1,$bfe001
  549.  
  550.     bsr.w    makedivtabs
  551.     bsr.w    Makevoltable
  552.  
  553.     ifeq    disable020
  554.     
  555.     move.l    4.w,a6
  556.     btst    #1,297(a6)
  557.     beq.b    .no020
  558.  
  559. ; Processor is 020+!
  560.  
  561.     st    opt020(a5)
  562.     
  563.     cmp    #STEREO14,pmode(a5)
  564.     beq.b    .s14_020
  565.  
  566.     move.l    #mix_020,mixad1(a5)
  567.     move.l    #mix2_020,mixad2(a5)
  568.     bra.b    .e
  569.  
  570. .s14_020
  571.     move.l    #mix16_020,mixad1(a5)
  572.     move.l    #mix162_020,mixad2(a5)
  573.     bra.b    .e
  574.  
  575.     endc
  576.  
  577. ; Processor is 000/010
  578.  
  579. .no020    clr    opt020(a5)
  580.  
  581.     cmp    #STEREO14,pmode(a5)
  582.     beq.b    .s14_000
  583.  
  584.     move.l    #mix,mixad1(a5)
  585.     move.l    #mix2,mixad2(a5)
  586.     bra.b    .e
  587.  
  588. .s14_000
  589.     move.l    #mix16,mixad1(a5)
  590.     move.l    #mix162,mixad2(a5)
  591.  
  592.  
  593. .e    cmp    #STEREO14,pmode(a5)
  594.     bne.b    .nop
  595.  
  596.     move.l    #copybuf14,cbufad(a5)
  597.  
  598.     bsr.w    do14tab
  599.     bra.b    .q
  600.  
  601. .nop    cmp    #REAL,pmode(a5)
  602.     beq.b    .surr
  603.  
  604.     move.l    #copybuf,cbufad(a5)
  605.     bra.b    .q
  606.  
  607. .surr    move.l    #copysurround,cbufad(a5)
  608.  
  609. .q    moveq    #0,d0
  610.     rts
  611.  
  612.  
  613.  
  614.  
  615. ; D0 = New position
  616.  
  617. setPosition
  618.     lea    data,a5
  619.     move    d0,PS3M_position(a5)
  620.  
  621. ; S3M
  622. .s3m    subq    #1,d0
  623.     move    d0,pos(a5)
  624.     move.l    s3m(a5),a0
  625.     move.b    initialspeed(a0),d0
  626.     bne.b    .ok
  627.     moveq    #6,d0
  628. .ok    move    d0,spd(a5)
  629.     clr    cn
  630.     bra.w    burk
  631.  
  632. ; XM
  633. .xm    move    d0,pos(a5)
  634.     st    pbflag(a5)
  635.     clr    rows(a5)
  636.     rts
  637.  
  638. PS3M_pause
  639.     lea    data,a5
  640.     tst    PS3M_paused(a5)
  641.     beq.b    .restore
  642.  
  643. .save    lea    cha0,a0
  644.     lea    saveArray(pc),a1
  645.     moveq    #31,d0
  646. .l    move.b    mOnOff(a0),(a1)+
  647.     st    mOnOff(a0)
  648.     lea    mChanBlock_SIZE(a0),a0
  649.     dbf    d0,.l
  650.     rts
  651.  
  652. .restore
  653.     lea    cha0,a0
  654.     lea    saveArray(pc),a1
  655.     moveq    #31,d0
  656. .l2    move.b    (a1)+,mOnOff(a0)
  657.     lea    mChanBlock_SIZE(a0),a0
  658.     dbf    d0,.l2
  659.     rts
  660.  
  661. saveArray
  662.     dcb.b    32
  663.  
  664.  
  665.  
  666.  
  667. ;;***** Mixing routines *********
  668.  
  669.  
  670. domix    lea    cha0(a5),a4
  671.     lea    pantab(a5),a0
  672.     moveq    #31,d7
  673.     move.l    mixad1(a5),a1
  674. .loo    tst.b    (a0)+
  675.     beq.b    .n
  676.     bmi.b    .n
  677.  
  678.     move.l    tbuf(a5),a2
  679.     Push    a0/a1/d7
  680.     jsr    (a1)                ; Mix
  681.     Pull    a0/a1/d7
  682.     move    #1,chans(a5)
  683.     lea    mChanBlock_SIZE(a4),a4
  684.     subq    #1,d7
  685.     bra.b    .loo2
  686.  
  687. .n    lea    mChanBlock_SIZE(a4),a4
  688.     dbf    d7,.loo
  689.     bra.b    .ddq
  690.  
  691.  
  692. .loo2    cmp    #1,maxchan(a5)
  693.     beq.b    .ddq
  694.  
  695.     move.l    mixad2(a5),a1
  696. .loka    tst.b    (a0)+
  697.     beq.b    .n2
  698.     bmi.b    .n2
  699.  
  700.     move.l    tbuf(a5),a2
  701.     Push    a0/a1/d7
  702.     jsr    (a1)
  703.     Pull    a0/a1/d7
  704.  
  705. .n2    lea    mChanBlock_SIZE(a4),a4
  706.     dbf    d7,.loka
  707.  
  708. .ddq    move.l    tbuf(a5),a0
  709.     move.l    buff1(a5),a1
  710.     move.l    buff3(a5),a4
  711.     move.l    cbufad(a5),a2
  712.     jsr    (a2)
  713.  
  714.  
  715. right    lea    cha0(a5),a4
  716.     lea    pantab(a5),a0
  717.     move.l    mixad1(a5),a1
  718.     moveq    #31,d7
  719. .loo    tst.b    (a0)+
  720.     bpl.b    .n
  721.  
  722.     move.l    tbuf2(a5),a2
  723.     Push    a0/a1/d7
  724.     jsr    (a1)
  725.     Pull    a0/a1/d7
  726.     move    #1,chans(a5)
  727.     lea    mChanBlock_SIZE(a4),a4
  728.     subq    #1,d7
  729.     bra.b    .loo2
  730.  
  731. .n    lea    mChanBlock_SIZE(a4),a4
  732.     dbf    d7,.loo
  733.     bra.b    .ddq
  734.  
  735.  
  736. .loo2    cmp    #1,maxchan(a5)
  737.     beq.b    .ddq
  738.     move.l    mixad2(a5),a1
  739. .loka    tst.b    (a0)+
  740.     bpl.b    .n2
  741.  
  742.     move.l    tbuf2(a5),a2
  743.     Push    a0/a1/d7
  744.     jsr    (a1)
  745.     Pull    a0/a1/d7
  746.  
  747. .n2    lea    mChanBlock_SIZE(a4),a4
  748.     dbf    d7,.loka
  749.  
  750. .ddq    move.l    tbuf2(a5),a0
  751.     move.l    buff2(a5),a1
  752.     move.l    buff4(a5),a4
  753.     move.l    cbufad(a5),a2
  754.     jsr    (a2)
  755.  
  756.     moveq    #0,d0
  757.     move    bytes2do(a5),d0
  758.     add.l    d0,bufpos(a5)
  759.     move.l    buffSizeMask(a5),d0
  760.     and.l    d0,bufpos(a5)
  761.     clr    bytes2do(a5)
  762.     rts
  763.  
  764.  
  765. copybuf    move.l    bufpos(a5),d0
  766.     move.l    d0,d1
  767.     moveq    #0,d2
  768.     move    bytes2do(a5),d2
  769.     add.l    d2,d1
  770.     cmp.l    buffSizeMask(a5),d1
  771.     ble.b    .dd
  772.  
  773.     move.l    a1,a3
  774.  
  775.     move.l    buffSize(a5),d7
  776.     sub.l    d0,d7
  777.     lsr.l    #1,d7
  778.     subq    #1,d7
  779.     add.l    d0,a1
  780.     lea    divtabs(a5),a2
  781.     move    chans(a5),d0
  782.     lsl    #2,d0
  783.     move.l    -4(a2,d0),a2
  784.  
  785. .ldd    move    (a0)+,d2
  786.     move.b    (a2,d2),(a1)+
  787.     move    (a0)+,d2
  788.     move.b    (a2,d2),(a1)+
  789.     dbf    d7,.ldd
  790.  
  791.     move.l    a3,a1
  792.     move.l    d1,d7
  793.     sub.l    buffSize(a5),d7
  794.     lsr.l    #1,d7
  795.     subq    #1,d7
  796.     bmi.b    .ddq
  797. .ldd2    move    (a0)+,d2
  798.     move.b    (a2,d2),(a1)+
  799.     move    (a0)+,d2
  800.     move.b    (a2,d2),(a1)+
  801.     dbf    d7,.ldd2
  802. .ddq    rts
  803.  
  804. .dd    add.l    d0,a1
  805.     lea    divtabs(a5),a2
  806.     move    chans(a5),d0
  807.     lsl    #2,d0
  808.     move.l    -4(a2,d0),a2
  809.     move    bytes2do(a5),d7
  810.     lsr    #1,d7
  811.     subq    #1,d7
  812. .ldd3    move    (a0)+,d1
  813.     move.b    (a2,d1),(a1)+
  814.     move    (a0)+,d1
  815.     move.b    (a2,d1),(a1)+
  816.     dbf    d7,.ldd3
  817.     rts
  818.  
  819. copysurround
  820.     move.l    bufpos(a5),d0
  821.     move.l    d0,d1
  822.  
  823.     moveq    #0,d2
  824.     move    bytes2do(a5),d2
  825.     add.l    d2,d1
  826.  
  827.     cmp.l    buffSizeMask(a5),d1
  828.     ble.b    .dd
  829.  
  830.     movem.l    a1/a4,-(sp)
  831.  
  832.     move.l    buffSize(a5),d7
  833.     sub.l    d0,d7
  834.     lsr.l    #1,d7
  835.     subq    #1,d7
  836.     add.l    d0,a1
  837.     add.l    d0,a4
  838.     lea    divtabs(a5),a2
  839.     move    chans(a5),d0
  840.     lsl    #2,d0
  841.     move.l    -4(a2,d0),a2
  842.  
  843. .ldd    move    (a0)+,d2
  844.     move.b    (a2,d2),d2
  845.     move.b    d2,(a1)+
  846.     not    d2
  847.     move.b    d2,(a4)+
  848.  
  849.     move    (a0)+,d2
  850.     move.b    (a2,d2),d2
  851.     move.b    d2,(a1)+
  852.     not    d2
  853.     move.b    d2,(a4)+
  854.     dbf    d7,.ldd
  855.  
  856.     movem.l    (sp)+,a1/a4
  857.  
  858.     move.l    d1,d7
  859.     sub.l    buffSize(a5),d7
  860.     lsr.l    #1,d7
  861.     subq    #1,d7
  862.     bmi.b    .ddq
  863. .ldd2    move    (a0)+,d2
  864.     move.b    (a2,d2),d2
  865.     move.b    d2,(a1)+
  866.     not    d2
  867.     move.b    d2,(a4)+
  868.  
  869.     move    (a0)+,d2
  870.     move.b    (a2,d2),d2
  871.     move.b    d2,(a1)+
  872.     not    d2
  873.     move.b    d2,(a4)+
  874.     dbf    d7,.ldd2
  875. .ddq    rts
  876.  
  877. .dd    add.l    d0,a1
  878.     add.l    d0,a4
  879.     lea    divtabs(a5),a2
  880.     move    chans(a5),d0
  881.     lsl    #2,d0
  882.     move.l    -4(a2,d0),a2
  883.     move    bytes2do(a5),d7
  884.     lsr    #1,d7
  885.     subq    #1,d7
  886. .ldd3    move    (a0)+,d2
  887.     move.b    (a2,d2),d2
  888.     move.b    d2,(a1)+
  889.     not    d2
  890.     move.b    d2,(a4)+
  891.  
  892.     move    (a0)+,d2
  893.     move.b    (a2,d2),d2
  894.     move.b    d2,(a1)+
  895.     not    d2
  896.     move.b    d2,(a4)+
  897.     dbf    d7,.ldd3
  898.     rts
  899.  
  900.  
  901. copybuf14
  902.     move.l    bufpos(a5),d0
  903.     move.l    d0,d1
  904.     moveq    #0,d2
  905.     move    bytes2do(a5),d2
  906.     add.l    d2,d1
  907.     cmp.l    buffSizeMask(a5),d1
  908.     ble.b    .dd
  909.  
  910.     movem.l    a1/a4,-(sp)
  911.  
  912.     move.l    buffSize(a5),d7
  913.     sub.l    d0,d7
  914.     subq    #1,d7
  915.     add.l    d0,a1
  916.     add.l    d0,a4
  917.     moveq    #0,d2
  918.     move.l    buff14(a5),a2
  919.     moveq    #-2,d0
  920. .ldd    move    (a0)+,d2
  921.     and.l    d0,d2
  922.     move.b    (a2,d2.l),(a1)+
  923.     move.b    1(a2,d2.l),(a4)+
  924.     dbf    d7,.ldd
  925.  
  926. .huu    movem.l    (sp)+,a1/a4
  927.     move.l    d1,d7
  928.     sub.l    buffSize(a5),d7
  929.     subq    #1,d7
  930.     bmi.b    .ddq
  931.  
  932. .ldd2    move    (a0)+,d2
  933.     and.l    d0,d2
  934.     move.b    (a2,d2.l),(a1)+
  935.     move.b    1(a2,d2.l),(a4)+
  936.     dbf    d7,.ldd2
  937. .ddq    rts
  938.  
  939.  
  940. .dd    add.l    d0,a1
  941.     add.l    d0,a4
  942.     move    bytes2do(a5),d7
  943.     subq    #1,d7
  944.     move.l    buff14(a5),a2
  945.     moveq    #0,d2
  946.     moveq    #-2,d0
  947. .ldd3    move    (a0)+,d2
  948.     and.l    d0,d2
  949.     move.b    (a2,d2.l),(a1)+
  950.     move.b    1(a2,d2.l),(a4)+
  951.     dbf    d7,.ldd3
  952.     rts
  953.  
  954.  
  955. ; 000/010 Mixing routines
  956.  
  957. ; Mixing routine for the first channel (moves data)
  958.  
  959.  
  960. mix    moveq    #0,d7
  961.     move    bytes2do(a5),d7
  962.     subq    #1,d7
  963.     
  964.     tst    mPeriod(a4)
  965.     beq.w    .ty
  966.     tst.b    mOnOff(a4)
  967.     bne.w    .ty            ;sound off
  968.  
  969.     tst    mVolume(a4)
  970.     beq.w    .vol0
  971.  
  972. .dw    move.l    clock(a5),d4
  973.     divu    mPeriod(a4),d4
  974.     swap    d4
  975.     clr    d4
  976.     lsr.l    #2,d4
  977.  
  978.     move.l    mrate(a5),d0
  979.     divu    d0,d4
  980.     swap    d4
  981.     clr    d4
  982.     rol.l    #4,d4
  983.  
  984.     move.l    vtabaddr(a5),d2
  985.     move    mVolume(a4),d0
  986.     mulu    PS3M_master(a5),d0
  987.     lsr    #6,d0
  988.     lsl.l    #8,d0
  989.     add.l    d0,d2                ; Position in volume table
  990.  
  991.     move.l    (a4),a0                ;mStart
  992.     move.l    mFPos(a4),d0
  993.  
  994.     moveq    #0,d3
  995.     moveq    #0,d5
  996.  
  997.     move.l    mLength(a4),d6
  998.     bne.b    .2
  999.  
  1000.     tst.b    mLoop(a4)
  1001.     bne.b    .q
  1002.     st    mOnOff(a4)
  1003.     bra.b    .qw
  1004.  
  1005. .2    cmp.l    #$ffff,d6
  1006.     bls.b    .leii
  1007.     move    #$ffff,d6
  1008.  
  1009. .leii    cmp    #32,d7
  1010.     blt.b    .lep
  1011.     move.l    d4,d1
  1012.     swap    d1
  1013.     lsl.l    #5,d1
  1014.     swap    d1
  1015.     add.l    d0,d1
  1016.     cmp    d6,d1
  1017.     bhs.b    .lep
  1018.     pea    .leii(pc)
  1019.     bra.w    .mix32
  1020.  
  1021. .lep    move.b    (a0,d0),d2
  1022.     move.l    d2,a1
  1023.     add.l    d4,d0
  1024.     move.b    (a1),d3
  1025.     addx    d5,d0
  1026.     move    d3,(a2)+
  1027.  
  1028.     cmp    d6,d0
  1029.     bhs.b    .ddwq
  1030.     dbf    d7,.lep
  1031.     bra.b    .qw
  1032.  
  1033. .ddwq    tst.b    mLoop(a4)
  1034.     bne.b    .q
  1035.     st    mOnOff(a4)
  1036.     dbf    d7,.ty
  1037.     bra.b    .qw
  1038.  
  1039. .q    move.l    mLStart(a4),a0
  1040.     moveq    #0,d1
  1041.     move    d0,d1
  1042.     sub.l    mLength(a4),d1
  1043.     add.l    d1,a0
  1044.     move.l    mLLength(a4),d6
  1045.     sub.l    d1,d6
  1046.     move.l    d6,mLength(a4)
  1047.  
  1048.     cmp.l    #$ffff,d6
  1049.     bls.b    .j
  1050.     move    #$ffff,d6
  1051. .j    clr    d0                ;reset integer part
  1052.     dbf    d7,.leii
  1053.  
  1054. .qw    moveq    #0,d1
  1055.     move    d0,d1
  1056.     add.l    d1,a0
  1057.     clr    d0
  1058.     move.l    a0,(a4)                ;mStart
  1059.     move.l    d0,mFPos(a4)
  1060.  
  1061.     sub.l    d1,mLength(a4)
  1062.     bpl.b    .u
  1063.  
  1064.     tst.b    mLoop(a4)
  1065.     bne.b    .q2
  1066.     st    mOnOff(a4)
  1067.     bra.b    .u
  1068.  
  1069. .q2    move.l    mLLength(a4),d6
  1070.     sub.l    (a4),a0
  1071.     add.l    mLStart(a4),a0
  1072.     sub.l    d6,a0
  1073.     add.l    d6,mLength(a4)
  1074.     move.l    a0,(a4)                ; mStart
  1075. .u    rts
  1076.  
  1077. .ty    addq    #1,d7
  1078.     beq.b    .u
  1079.  
  1080.     move.l    #$800080,d0
  1081.     lsr    d7
  1082.     bcc.b    .sk
  1083.     move    d0,(a2)+
  1084. .sk    subq    #1,d7
  1085.     bmi.b    .u
  1086. .lk    move.l    d0,(a2)+
  1087.     dbf    d7,.lk
  1088.     rts
  1089.  
  1090. .mix32    rept    16
  1091.     move.b    (a0,d0),d2
  1092.     move.l    d2,a1
  1093.     move.b    (a1),d3
  1094.     add.l    d4,d0
  1095.     addx    d5,d0
  1096.     swap    d3
  1097.     move.b    (a0,d0),d2
  1098.     move.l    d2,a1
  1099.     move.b    (a1),d3
  1100.     move.l    d3,(a2)+
  1101.     add.l    d4,d0
  1102.     addx    d5,d0
  1103.     endr
  1104.  
  1105.     sub    #32,d7
  1106.     rts
  1107.  
  1108.  
  1109.  
  1110. .vol0    move.l    clock(a5),d4
  1111.     divu    mPeriod(a4),d4        ;period
  1112.     swap    d4
  1113.     clr    d4
  1114.     lsr.l    #2,d4
  1115.  
  1116.     move.l    mrate(a5),d0
  1117.     divu    d0,d4
  1118.     swap    d4
  1119.     clr    d4
  1120.     rol.l    #4,d4
  1121.     swap    d4
  1122.  
  1123.     move.l    (a4),a0            ;mStart
  1124.     move.l    mFPos(a4),d0
  1125.  
  1126.     addq    #1,d7
  1127.  
  1128.     movem.l    d0/d1,-(sp)
  1129.     move.l    d7,d1
  1130.     move.l    d4,d0
  1131.     bsr.w    mulu_32
  1132.     move.l    d0,d4
  1133.     movem.l    (sp)+,d0/d1
  1134.  
  1135.     subq    #1,d7
  1136.  
  1137.     swap    d0
  1138.     add.l    d4,d0            ; Position after "mixing"
  1139.     swap    d0
  1140.     
  1141.     moveq    #0,d1
  1142.     move    d0,d1
  1143.     add.l    d1,a0
  1144.     clr    d0
  1145.     move.l    a0,(a4)
  1146.     move.l    d0,mFPos(a4)
  1147.     sub.l    d1,mLength(a4)
  1148.     bpl.w    .ty            ; OK, Done!
  1149.  
  1150. ; We're about to mix past the end of the sample
  1151.  
  1152.     tst.b    mLoop(a4)
  1153.     bne.b    .q3
  1154.     st    mOnOff(a4)
  1155.     bra.w    .ty
  1156.  
  1157. .q3    move.l    mLLength(a4),d6
  1158. .loop    sub.l    d6,a0
  1159.     add.l    d6,mLength(a4)
  1160.     bmi.b    .loop
  1161.     beq.b    .loop
  1162.  
  1163.     move.l    a0,(a4)
  1164.     bra.w    .ty
  1165.  
  1166.  
  1167.  
  1168. ; Mixing routine for rest of the channels (adds data)
  1169.  
  1170. mix2    moveq    #0,d7
  1171.     move    bytes2do(a5),d7
  1172.  
  1173.     tst    mPeriod(a4)
  1174.     beq.w    .ty
  1175.     tst.b    mOnOff(a4)
  1176.     bne.w    .ty            ;noloop
  1177.  
  1178.     tst    mVolume(a4)
  1179.     beq.w    .vol0
  1180.  
  1181. .dw    subq    #1,d7
  1182.  
  1183.     move.l    clock(a5),d4
  1184.     divu    mPeriod(a4),d4
  1185.     swap    d4
  1186.     clr    d4
  1187.     lsr.l    #2,d4
  1188.  
  1189.     move.l    mrate(a5),d0
  1190.     divu    d0,d4
  1191.     swap    d4
  1192.     clr    d4
  1193.     rol.l    #4,d4
  1194.  
  1195.     move.l    vtabaddr(a5),d2
  1196.     move    mVolume(a4),d0
  1197.     mulu    PS3M_master(a5),d0
  1198.     lsr    #6,d0
  1199.     lsl.l    #8,d0
  1200.     add.l    d0,d2
  1201.  
  1202.     move.l    (a4),a0            ;mStart
  1203.     move.l    mFPos(a4),d0
  1204.  
  1205.     moveq    #0,d3
  1206.     moveq    #0,d5
  1207.  
  1208.     move.l    mLength(a4),d6
  1209.     bne.b    .2
  1210.  
  1211.     tst.b    mLoop(a4)
  1212.     bne.b    .q
  1213.     st    mOnOff(a4)
  1214.     bra.b    .qw
  1215.  
  1216. .2    cmp.l    #$ffff,d6
  1217.     bls.b    .leii
  1218.     move    #$ffff,d6
  1219.  
  1220. .leii    cmp    #32,d7
  1221.     blt.b    .lep
  1222.     move.l    d4,d1
  1223.     swap    d1
  1224.     lsl.l    #5,d1
  1225.     swap    d1
  1226.     add.l    d0,d1
  1227.     cmp    d6,d1
  1228.     bhs.b    .lep
  1229.     pea    .leii(pc)
  1230.     bra.w    .mix32
  1231.  
  1232. .lep    move.b    (a0,d0),d2
  1233.     move.l    d2,a1
  1234.     add.l    d4,d0
  1235.     move.b    (a1),d3
  1236.     addx    d5,d0
  1237.     add    d3,(a2)+
  1238.  
  1239.     cmp    d6,d0
  1240.     bhs.b    .ddwq
  1241.     dbf    d7,.lep
  1242.     bra.b    .qw
  1243.  
  1244. .ddwq    tst.b    mLoop(a4)
  1245.     bne.b    .q
  1246.     st    mOnOff(a4)
  1247.     dbf    d7,.tyy
  1248.     bra.b    .qw
  1249.  
  1250. .q    move.l    mLStart(a4),a0
  1251.     moveq    #0,d1
  1252.     move    d0,d1
  1253.     sub.l    mLength(a4),d1
  1254.     add.l    d1,a0
  1255.     move.l    mLLength(a4),d6
  1256.     sub.l    d1,d6
  1257.     move.l    d6,mLength(a4)
  1258.     cmp.l    #$ffff,d6
  1259.     bls.b    .j
  1260.     move    #$ffff,d6
  1261. .j    clr    d0            ;reset integer part
  1262.     dbf    d7,.leii
  1263.  
  1264. .qw    moveq    #0,d1
  1265.     move    d0,d1
  1266.     add.l    d1,a0
  1267.     clr    d0
  1268.     move.l    a0,(a4)
  1269.     move.l    d0,mFPos(a4)
  1270.  
  1271.     sub.l    d1,mLength(a4)
  1272.     bpl.b    .u
  1273.  
  1274.     tst.b    mLoop(a4)
  1275.     bne.b    .q2
  1276.     st    mOnOff(a4)
  1277.     bra.b    .u
  1278.  
  1279. .q2    move.l    mLLength(a4),d6
  1280.     sub.l    (a4),a0
  1281.     add.l    mLStart(a4),a0
  1282.     sub.l    d6,a0
  1283.     add.l    d6,mLength(a4)
  1284.     move.l    a0,(a4)
  1285.  
  1286. .u    addq    #1,chans(a5)
  1287. .ty    rts
  1288.  
  1289. .tyy    addq    #1,d7
  1290.     beq.b    .u
  1291.  
  1292.     move.l    #$800080,d0
  1293.     lsr    d7
  1294.     bcc.b    .sk
  1295.     add    d0,(a2)+
  1296. .sk    subq    #1,d7
  1297.     bmi.b    .u
  1298. .lk    add.l    d0,(a2)+
  1299.     dbf    d7,.lk
  1300.     bra.b    .u
  1301.  
  1302. .mix32    rept    16
  1303.     move.b    (a0,d0),d2
  1304.     move.l    d2,a1
  1305.     move.b    (a1),d3
  1306.     add.l    d4,d0
  1307.     addx    d5,d0
  1308.     swap    d3
  1309.     move.b    (a0,d0),d2
  1310.     move.l    d2,a1
  1311.     move.b    (a1),d3
  1312.     add.l    d3,(a2)+
  1313.     add.l    d4,d0
  1314.     addx    d5,d0
  1315.     endr
  1316.     sub    #32,d7
  1317.     rts
  1318.  
  1319.  
  1320. .vol0    move.l    clock(a5),d4
  1321.     divu    mPeriod(a4),d4
  1322.     swap    d4
  1323.     clr    d4
  1324.     lsr.l    #2,d4
  1325.  
  1326.     move.l    mrate(a5),d0
  1327.     divu    d0,d4
  1328.     swap    d4
  1329.     clr    d4
  1330.     rol.l    #4,d4
  1331.     swap    d4
  1332.  
  1333.     move.l    (a4),a0            ;pos (addr)
  1334.     move.l    mFPos(a4),d0
  1335.  
  1336.     addq    #1,d7
  1337.     movem.l    d0/d1,-(sp)
  1338.     move.l    d7,d1
  1339.     move.l    d4,d0
  1340.     bsr.w    mulu_32
  1341.     move.l    d0,d4
  1342.     movem.l    (sp)+,d0/d1
  1343.  
  1344.     subq    #1,d7
  1345.     swap    d0
  1346.     add.l    d4,d0            ; Position after "mixing"
  1347.     swap    d0
  1348.     
  1349.     moveq    #0,d1
  1350.     move    d0,d1
  1351.     add.l    d1,a0
  1352.     clr    d0
  1353.     move.l    a0,(a4)
  1354.     move.l    d0,mFPos(a4)
  1355.     sub.l    d1,mLength(a4)
  1356.     bpl.w    .ty            ; OK, Done!
  1357.  
  1358. ; We're about to mix past the end of the sample
  1359.  
  1360.     tst.b    mLoop(a4)
  1361.     bne.b    .q3
  1362.     st    mOnOff(a4)
  1363.     bra.w    .ty
  1364.  
  1365. .q3    move.l    mLLength(a4),d6
  1366. .loop    sub.l    d6,a0
  1367.     add.l    d6,mLength(a4)
  1368.     bmi.b    .loop
  1369.     beq.b    .loop
  1370.  
  1371.     move.l    a0,(a4)
  1372.     bra.w    .ty
  1373.  
  1374.  
  1375. ; 16-bit mixing routine for first channel (moves data)
  1376.  
  1377. mix16    moveq    #0,d7
  1378.     move    bytes2do(a5),d7
  1379.     subq    #1,d7
  1380.  
  1381.     tst    mPeriod(a4)
  1382.     beq.w    .ty
  1383.     tst.b    mOnOff(a4)
  1384.     bne.w    .ty
  1385.  
  1386.     tst    mVolume(a4)
  1387.     beq.w    .vol0
  1388.  
  1389. .dw    move.l    clock(a5),d4
  1390.     divu    mPeriod(a4),d4
  1391.     swap    d4
  1392.     clr    d4
  1393.     lsr.l    #2,d4
  1394.  
  1395.     move.l    mrate(a5),d0
  1396.     divu    d0,d4
  1397.     swap    d4
  1398.     clr    d4
  1399.     rol.l    #4,d4
  1400.  
  1401.     move.l    vtabaddr(a5),a3
  1402.     move    mVolume(a4),d0
  1403.     mulu    PS3M_master(a5),d0
  1404.     lsr    #6,d0
  1405.     add    d0,d0
  1406.     lsl.l    #8,d0
  1407.     add.l    d0,a3                ; Position in volume table
  1408.  
  1409.     move.l    (a4),a0                ;mStart
  1410.     move.l    mFPos(a4),d0
  1411.  
  1412.     moveq    #0,d3
  1413.     moveq    #0,d5
  1414.  
  1415.     move.l    mLength(a4),d6
  1416.     bne.b    .2
  1417.  
  1418.     tst.b    mLoop(a4)
  1419.     bne.b    .q
  1420.     st    mOnOff(a4)
  1421.     bra.b    .qw
  1422.  
  1423. .2    cmp.l    #$ffff,d6
  1424.     bls.b    .leii
  1425.     move    #$ffff,d6
  1426.  
  1427. .leii    cmp    #32,d7
  1428.     blt.b    .lep
  1429.     move.l    d4,d1
  1430.     swap    d1
  1431.     lsl.l    #5,d1
  1432.     swap    d1
  1433.     add.l    d0,d1
  1434.     cmp    d6,d1
  1435.     bhs.b    .lep
  1436.     pea    .leii(pc)
  1437.     bra.w    .mix32
  1438.  
  1439. .lep    moveq    #0,d2
  1440.     move.b    (a0,d0),d2
  1441.     add    d2,d2
  1442.     add.l    d4,d0
  1443.     move    (a3,d2),(a2)+
  1444.     addx    d5,d0
  1445.  
  1446.     cmp    d6,d0
  1447.     bhs.b    .ddwq
  1448.     dbf    d7,.lep
  1449.     bra.b    .qw
  1450.  
  1451. .ddwq    tst.b    mLoop(a4)
  1452.     bne.b    .q
  1453.     st    mOnOff(a4)
  1454.     dbf    d7,.ty
  1455.     bra.b    .qw
  1456.  
  1457. .q    move.l    mLStart(a4),a0
  1458.     moveq    #0,d1
  1459.     move    d0,d1
  1460.     sub.l    mLength(a4),d1
  1461.     add.l    d1,a0
  1462.     move.l    mLLength(a4),d6
  1463.     sub.l    d1,d6
  1464.     move.l    d6,mLength(a4)
  1465.  
  1466.     cmp.l    #$ffff,d6
  1467.     bls.b    .j
  1468.     move    #$ffff,d6
  1469. .j    clr    d0                ;reset integer part
  1470.     dbf    d7,.leii
  1471.  
  1472. .qw    moveq    #0,d1
  1473.     move    d0,d1
  1474.     add.l    d1,a0
  1475.     clr    d0
  1476.     move.l    a0,(a4)                ;mStart
  1477.     move.l    d0,mFPos(a4)
  1478.  
  1479.     sub.l    d1,mLength(a4)
  1480.     bpl.b    .u
  1481.  
  1482.     tst.b    mLoop(a4)
  1483.     bne.b    .q2
  1484.     st    mOnOff(a4)
  1485.     bra.b    .u
  1486.  
  1487. .q2    move.l    mLLength(a4),d6
  1488.     sub.l    (a4),a0
  1489.     add.l    mLStart(a4),a0
  1490.     sub.l    d6,a0
  1491.     add.l    d6,mLength(a4)
  1492.     move.l    a0,(a4)                ; mStart
  1493. .u    rts
  1494.  
  1495. .ty    addq    #1,d7
  1496.     beq.b    .u
  1497.  
  1498.     moveq    #0,d0
  1499.     lsr    d7
  1500.     bcc.b    .sk
  1501.     move    d0,(a2)+
  1502. .sk    subq    #1,d7
  1503.     bmi.b    .u
  1504. .lk    move.l    d0,(a2)+
  1505.     dbf    d7,.lk
  1506.     rts
  1507.  
  1508. .mix32    rept    32
  1509.  
  1510.     moveq    #0,d2
  1511.     move.b    (a0,d0),d2
  1512.     add    d2,d2
  1513.     add.l    d4,d0
  1514.     move    (a3,d2),(a2)+
  1515.     addx    d5,d0
  1516.  
  1517.     endr
  1518.  
  1519.     sub    #32,d7
  1520.     rts
  1521.  
  1522.  
  1523. .vol0    move.l    clock(a5),d4
  1524.     divu    mPeriod(a4),d4        ;period
  1525.     swap    d4
  1526.     clr    d4
  1527.     lsr.l    #2,d4
  1528.  
  1529.     move.l    mrate(a5),d0
  1530.     divu    d0,d4
  1531.     swap    d4
  1532.     clr    d4
  1533.     rol.l    #4,d4
  1534.     swap    d4
  1535.  
  1536.     move.l    (a4),a0            ;mStart
  1537.     move.l    mFPos(a4),d0
  1538.  
  1539.     addq    #1,d7
  1540.  
  1541.     movem.l    d0/d1,-(sp)
  1542.     move.l    d7,d1
  1543.     move.l    d4,d0
  1544.     bsr.w    mulu_32
  1545.     move.l    d0,d4
  1546.     movem.l    (sp)+,d0/d1
  1547.  
  1548.     subq    #1,d7
  1549.  
  1550.     swap    d0
  1551.     add.l    d4,d0            ; Position after "mixing"
  1552.     swap    d0
  1553.     
  1554.     moveq    #0,d1
  1555.     move    d0,d1
  1556.     add.l    d1,a0
  1557.     clr    d0
  1558.     move.l    a0,(a4)
  1559.     move.l    d0,mFPos(a4)
  1560.     sub.l    d1,mLength(a4)
  1561.     bpl.w    .ty            ; OK, Done!
  1562.  
  1563. ; We're about to mix past the end of the sample
  1564.  
  1565.     tst.b    mLoop(a4)
  1566.     bne.b    .q3
  1567.     st    mOnOff(a4)
  1568.     bra.w    .ty
  1569.  
  1570. .q3    move.l    mLLength(a4),d6
  1571. .loop    sub.l    d6,a0
  1572.     add.l    d6,mLength(a4)
  1573.     bmi.b    .loop
  1574.     beq.b    .loop
  1575.  
  1576.     move.l    a0,(a4)
  1577.     bra.w    .ty
  1578.  
  1579.  
  1580.  
  1581. ; Mixing routine for rest of the channels (adds data)
  1582.  
  1583. mix162    moveq    #0,d7
  1584.     move    bytes2do(a5),d7
  1585.  
  1586.     tst    mPeriod(a4)
  1587.     beq.w    .ty
  1588.     tst.b    mOnOff(a4)
  1589.     bne.w    .ty
  1590.  
  1591.     tst    mVolume(a4)
  1592.     beq.w    .vol0
  1593.  
  1594. .dw    subq    #1,d7
  1595.  
  1596.     move.l    clock(a5),d4
  1597.     divu    mPeriod(a4),d4
  1598.     swap    d4
  1599.     clr    d4
  1600.     lsr.l    #2,d4
  1601.  
  1602.     move.l    mrate(a5),d0
  1603.     divu    d0,d4
  1604.     swap    d4
  1605.     clr    d4
  1606.     rol.l    #4,d4
  1607.  
  1608.     move.l    vtabaddr(a5),a3
  1609.     move    mVolume(a4),d0        ;volu
  1610.     mulu    PS3M_master(a5),d0
  1611.     lsr    #6,d0
  1612.     add    d0,d0
  1613.     lsl.l    #8,d0
  1614.     add.l    d0,a3
  1615.  
  1616.     move.l    (a4),a0            ;mStart
  1617.     move.l    mFPos(a4),d0
  1618.  
  1619.     moveq    #0,d3
  1620.     moveq    #0,d5
  1621.  
  1622.     move.l    mLength(a4),d6
  1623.     bne.b    .2
  1624.  
  1625.     tst.b    mLoop(a4)
  1626.     bne.b    .q
  1627.     st    mOnOff(a4)
  1628.     bra.b    .qw
  1629.  
  1630. .2    cmp.l    #$ffff,d6
  1631.     bls.b    .leii
  1632.     move    #$ffff,d6
  1633.  
  1634. .leii    cmp    #32,d7
  1635.     blt.b    .lep
  1636.     move.l    d4,d1
  1637.     swap    d1
  1638.     lsl.l    #5,d1
  1639.     swap    d1
  1640.     add.l    d0,d1
  1641.     cmp    d6,d1
  1642.     bhs.b    .lep
  1643.     pea    .leii(pc)
  1644.     bra.w    .mix32
  1645.  
  1646. .lep    moveq    #0,d2
  1647.     move.b    (a0,d0),d2
  1648.     add    d2,d2
  1649.     add.l    d4,d0
  1650.     move    (a3,d2),d3
  1651.     addx    d5,d0
  1652.     add    d3,(a2)+
  1653.  
  1654.     cmp    d6,d0
  1655.     bhs.b    .ddwq
  1656.     dbf    d7,.lep
  1657.     bra.b    .qw
  1658.  
  1659. .ddwq    tst.b    mLoop(a4)
  1660.     bne.b    .q
  1661.     st    mOnOff(a4)
  1662.     dbf    d7,.tyy
  1663.     bra.b    .qw
  1664.  
  1665. .q    move.l    mLStart(a4),a0
  1666.     moveq    #0,d1
  1667.     move    d0,d1
  1668.     sub.l    mLength(a4),d1
  1669.     add.l    d1,a0
  1670.     move.l    mLLength(a4),d6
  1671.     sub.l    d1,d6
  1672.     move.l    d6,mLength(a4)
  1673.     cmp.l    #$ffff,d6
  1674.     bls.b    .j
  1675.     move    #$ffff,d6
  1676. .j    clr    d0            ;reset integer part
  1677.     dbf    d7,.leii
  1678.  
  1679. .qw    moveq    #0,d1
  1680.     move    d0,d1
  1681.     add.l    d1,a0
  1682.     clr    d0
  1683.     move.l    a0,(a4)
  1684.     move.l    d0,mFPos(a4)
  1685.  
  1686.     sub.l    d1,mLength(a4)
  1687.     bpl.b    .u
  1688.  
  1689.     tst.b    mLoop(a4)
  1690.     bne.b    .q2
  1691.     st    mOnOff(a4)
  1692.     bra.b    .u
  1693.  
  1694. .q2    move.l    mLLength(a4),d6
  1695.     sub.l    (a4),a0
  1696.     add.l    mLStart(a4),a0
  1697.     sub.l    d6,a0
  1698.     add.l    d6,mLength(a4)
  1699.     move.l    a0,(a4)
  1700.  
  1701. .u
  1702. .ty
  1703. .tyy
  1704.     rts
  1705.  
  1706.  
  1707. .mix32    rept    32
  1708.     moveq    #0,d2
  1709.     move.b    (a0,d0),d2
  1710.     add    d2,d2
  1711.     move    (a3,d2),d3
  1712.     add    d3,(a2)+
  1713.     add.l    d4,d0
  1714.     addx    d5,d0
  1715.     endr
  1716.     sub    #32,d7
  1717.     rts
  1718.  
  1719. .vol0    move.l    clock(a5),d4
  1720.     divu    mPeriod(a4),d4
  1721.     swap    d4
  1722.     clr    d4
  1723.     lsr.l    #2,d4
  1724.  
  1725.     move.l    mrate(a5),d0
  1726.     divu    d0,d4
  1727.     swap    d4
  1728.     clr    d4
  1729.     rol.l    #4,d4
  1730.     swap    d4
  1731.  
  1732.     move.l    (a4),a0            ;pos (addr)
  1733.     move.l    mFPos(a4),d0
  1734.  
  1735.     addq    #1,d7
  1736.     movem.l    d0/d1,-(sp)
  1737.     move.l    d7,d1
  1738.     move.l    d4,d0
  1739.     bsr.w    mulu_32
  1740.     move.l    d0,d4
  1741.     movem.l    (sp)+,d0/d1
  1742.  
  1743.     subq    #1,d7
  1744.     swap    d0
  1745.     add.l    d4,d0            ; Position after "mixing"
  1746.     swap    d0
  1747.     
  1748.     moveq    #0,d1
  1749.     move    d0,d1
  1750.     add.l    d1,a0
  1751.     clr    d0
  1752.     move.l    a0,(a4)
  1753.     move.l    d0,mFPos(a4)
  1754.     sub.l    d1,mLength(a4)
  1755.     bpl.w    .ty            ; OK, Done!
  1756.  
  1757. ; We're about to mix past the end of the sample
  1758.  
  1759.     tst.b    mLoop(a4)
  1760.     bne.b    .q3
  1761.     st    mOnOff(a4)
  1762.     bra.w    .ty
  1763.  
  1764. .q3    move.l    mLLength(a4),d6
  1765. .loop    sub.l    d6,a0
  1766.     add.l    d6,mLength(a4)
  1767.     bmi.b    .loop
  1768.     beq.b    .loop
  1769.  
  1770.     move.l    a0,(a4)
  1771.     bra.w    .ty
  1772.  
  1773.  
  1774.  
  1775.  
  1776.     ifeq    disable020
  1777.  
  1778. ; 020+ Optimized versions!
  1779.  
  1780. ; Mixing routine for the first channel (moves data)
  1781.  
  1782.  
  1783. mix_020    moveq    #0,d7
  1784.     move    bytes2do(a5),d7
  1785.     tst    mPeriod(a4)
  1786.     beq.w    .ty
  1787.     tst.b    mOnOff(a4)
  1788.     bne.w    .ty
  1789.  
  1790.     tst    mVolume(a4)
  1791.     beq.w    .vol0
  1792.  
  1793. .dw    move.l    clock(a5),d4
  1794.     moveq    #0,d0
  1795.     move    mPeriod(a4),d0
  1796.  
  1797.     divu.l    d0,d4
  1798.  
  1799.     lsl.l    #8,d4
  1800.     lsl.l    #6,d4
  1801.  
  1802.     move.l    mrate(a5),d0
  1803.     lsr.l    #4,d0
  1804.  
  1805.     divu.l    d0,d4
  1806.     swap    d4
  1807.  
  1808.     move.l    vtabaddr(a5),d2
  1809.     move    mVolume(a4),d0
  1810.     mulu    PS3M_master(a5),d0
  1811.     lsr    #6,d0
  1812.     lsl.l    #8,d0
  1813.     add.l    d0,d2            ; Position in volume table
  1814.  
  1815.     move.l    (a4),a0            ;pos (addr)
  1816.     move.l    mFPos(a4),d0        ;fpos
  1817.  
  1818.     move.l    mLength(a4),d6        ;len
  1819.     beq.w    .resloop
  1820.  
  1821.     cmp.l    #$ffff,d6
  1822.     bls.b    .restart
  1823.     move    #$ffff,d6
  1824. .restart
  1825.     swap    d6
  1826.     swap    d0
  1827.     sub.l    d0,d6
  1828.     swap    d0
  1829.     move.l    d4,d5
  1830.     swap    d5
  1831.  
  1832.     divul.l    d5,d5:d6        ; bytes left to loop end
  1833.     tst.l    d5
  1834.     beq.b    .e
  1835.     addq.l    #1,d6
  1836. .e
  1837.     moveq    #0,d3
  1838.     moveq    #0,d5
  1839. .mixloop
  1840.     moveq    #8,d1
  1841.     cmp    d1,d7
  1842.     bhs.b    .ok
  1843.     move    d7,d1
  1844. .ok    cmp.l    d1,d6
  1845.     bhs.b    .ok2
  1846.     move.l    d6,d1
  1847. .ok2    sub    d1,d7
  1848.     sub.l    d1,d6
  1849.  
  1850.     jmp    .jtab1(pc,d1*2)
  1851.  
  1852. .a set 0
  1853. .jtab1
  1854.     rept    8
  1855.     bra.b    .mend-.a
  1856. .a set .a+14                ; (mend - dmix) / 8
  1857.     endr
  1858.  
  1859. .dmix    rept    8
  1860.     move.b    (a0,d0),d2
  1861.     move.l    d2,a1
  1862.     move.b    (a1),d3
  1863.     add.l    d4,d0
  1864.     move    d3,(a2)+
  1865.     addx    d5,d0
  1866.     endr
  1867. .mend    tst    d7
  1868.     beq.b    .done
  1869.     tst.l    d6
  1870.     bne.w    .mixloop
  1871.  
  1872. .resloop
  1873.     tst.b    mLoop(a4)
  1874.     bne.b    .q
  1875.     st    mOnOff(a4)
  1876.     bra.b    .ty
  1877.  
  1878. .q    moveq    #0,d1
  1879.     move    d0,d1
  1880.     sub.l    mLength(a4),d1
  1881.     move.l    mLStart(a4),a0
  1882.     add.l    d1,a0
  1883.     move.l    mLLength(a4),d6
  1884.     sub.l    d1,d6
  1885.     move.l    d6,mLength(a4)
  1886.     cmp.l    #$ffff,d6
  1887.     bls.b    .j
  1888.     move    #$ffff,d6
  1889. .j    clr    d0            ;reset integer part
  1890.     bra.w    .restart
  1891.  
  1892. .done    moveq    #0,d1
  1893.     move    d0,d1
  1894.     add.l    d1,a0
  1895.     clr    d0
  1896.     move.l    a0,(a4)
  1897.     move.l    d0,mFPos(a4)
  1898.     sub.l    d1,mLength(a4)
  1899.     bpl.b    .u
  1900.  
  1901.     tst.b    mLoop(a4)
  1902.     bne.b    .q2
  1903.     st    mOnOff(a4)
  1904.     bra.b    .u
  1905.  
  1906. .q2    move.l    mLLength(a4),d6
  1907.     sub.l    (a4),a0
  1908.     add.l    mLStart(a4),a0
  1909.     sub.l    d6,a0
  1910.     add.l    d6,mLength(a4)
  1911.     move.l    a0,(a4)
  1912. .u    rts
  1913.  
  1914. .ty    move.l    #$800080,d0
  1915.     lsr    d7
  1916.     bcc.b    .sk
  1917.     move    d0,(a2)+
  1918. .sk    subq    #1,d7
  1919.     bmi.b    .u
  1920. .lk    move.l    d0,(a2)+
  1921.     dbf    d7,.lk
  1922.     rts
  1923.  
  1924.  
  1925. .vol0    move.l    clock(a5),d4
  1926.     moveq    #0,d0
  1927.     move    mPeriod(a4),d0
  1928.  
  1929.     divu.l    d0,d4
  1930.  
  1931.     lsl.l    #8,d4
  1932.     lsl.l    #6,d4
  1933.  
  1934.     move.l    mrate(a5),d0
  1935.     lsr.l    #4,d0
  1936.  
  1937.     divu.l    d0,d4
  1938.  
  1939.     move.l    (a4),a0
  1940.     move.l    mFPos(a4),d0
  1941.  
  1942.     mulu.l    d7,d4
  1943.  
  1944.     swap    d0
  1945.     add.l    d4,d0            ; Position after "mixing"
  1946.     swap    d0
  1947.     
  1948.     moveq    #0,d1
  1949.     move    d0,d1
  1950.     add.l    d1,a0
  1951.     clr    d0
  1952.     move.l    a0,(a4)
  1953.     move.l    d0,mFPos(a4)
  1954.     sub.l    d1,mLength(a4)
  1955.     bpl.b    .ty            ; OK, Done!
  1956.  
  1957. ; We're about to mix past the end of the sample
  1958.  
  1959.     tst.b    mLoop(a4)
  1960.     bne.b    .q3
  1961.     st    mOnOff(a4)
  1962.     bra.b    .ty
  1963.  
  1964. .q3    move.l    mLLength(a4),d6
  1965. .loop    sub.l    d6,a0
  1966.     add.l    d6,mLength(a4)
  1967.     bmi.b    .loop
  1968.     beq.b    .loop
  1969.  
  1970.     move.l    a0,(a4)
  1971.     bra.b    .ty
  1972.  
  1973.  
  1974. ; Mixing routine for rest of the channels (adds data)
  1975.  
  1976. mix2_020
  1977.     moveq    #0,d7
  1978.     move    bytes2do(a5),d7
  1979.     tst    mPeriod(a4)
  1980.     beq.w    .ty
  1981.     tst.b    mOnOff(a4)
  1982.     bne.w    .ty
  1983.  
  1984.     tst    mVolume(a4)
  1985.     beq.w    .vol0
  1986.  
  1987. .dw    move.l    clock(a5),d4
  1988.     moveq    #0,d0
  1989.     move    mPeriod(a4),d0
  1990.  
  1991.     divu.l    d0,d4
  1992.  
  1993.     lsl.l    #8,d4
  1994.     lsl.l    #6,d4
  1995.  
  1996.     move.l    mrate(a5),d0
  1997.     lsr.l    #4,d0
  1998.  
  1999.     divu.l    d0,d4
  2000.  
  2001.     swap    d4
  2002.  
  2003.     move.l    vtabaddr(a5),d2
  2004.     move    mVolume(a4),d0
  2005.     mulu    PS3M_master(a5),d0
  2006.     lsr    #6,d0
  2007.     lsl.l    #8,d0
  2008.     add.l    d0,d2            ; Position in volume table
  2009.  
  2010.     move.l    (a4),a0
  2011.     move.l    mFPos(a4),d0
  2012.  
  2013.     move.l    mLength(a4),d6
  2014.     beq.w    .resloop
  2015.  
  2016.     cmp.l    #$ffff,d6
  2017.     bls.b    .restart
  2018.     move    #$ffff,d6
  2019. .restart
  2020.     swap    d6
  2021.     swap    d0
  2022.     sub.l    d0,d6
  2023.     swap    d0
  2024.  
  2025.     move.l    d4,d5
  2026.     swap    d5
  2027.  
  2028.     divul.l    d5,d5:d6        ; bytes left to loop end
  2029.     tst.l    d5
  2030.     beq.b    .e
  2031.     addq.l    #1,d6
  2032. .e    moveq    #0,d3
  2033.     moveq    #0,d5
  2034. .mixloop
  2035.     moveq    #8,d1
  2036.     cmp    d1,d7
  2037.     bhi.b    .ok
  2038.     move    d7,d1
  2039. .ok    cmp.l    d1,d6
  2040.     bhi.b    .ok2
  2041.     move    d6,d1
  2042. .ok2    sub    d1,d7
  2043.     sub.l    d1,d6
  2044.     jmp    .jtab1(pc,d1*2)
  2045.  
  2046. .a set 0
  2047. .jtab1    rept    8
  2048.     bra.b    .mend-.a
  2049. .a set .a+14                ; (mend - dmix) / 8
  2050.     endr
  2051.  
  2052. .dmix    rept    8
  2053.     move.b    (a0,d0),d2
  2054.     move.l    d2,a1
  2055.     move.b    (a1),d3
  2056.     add    d3,(a2)+
  2057.     add.l    d4,d0
  2058.     addx    d5,d0
  2059.     endr
  2060. .mend    tst    d7
  2061.     beq.b    .done
  2062.     tst.l    d6
  2063.     bne.w    .mixloop
  2064.  
  2065. .resloop
  2066.     tst.b    mLoop(a4)
  2067.     bne.b    .q
  2068.     st    mOnOff(a4)
  2069.     bra.b    .tyy
  2070.  
  2071. .q    moveq    #0,d1
  2072.     move    d0,d1
  2073.     sub.l    mLength(a4),d1
  2074.     move.l    mLStart(a4),a0
  2075.     add.l    d1,a0
  2076.     move.l    mLLength(a4),d6
  2077.     sub.l    d1,d6
  2078.     move.l    d6,mLength(a4)
  2079.     cmp.l    #$ffff,d6
  2080.     bls.b    .j
  2081.     move    #$ffff,d6
  2082. .j    clr    d0            ;reset integer part
  2083.     bra.w    .restart
  2084.  
  2085. .done    moveq    #0,d1
  2086.     move    d0,d1
  2087.     add.l    d1,a0
  2088.     clr    d0
  2089.     move.l    a0,(a4)
  2090.     move.l    d0,mFPos(a4)
  2091.     sub.l    d1,mLength(a4)
  2092.     bpl.b    .u
  2093.  
  2094.     tst.b    mLoop(a4)
  2095.     bne.b    .q2
  2096.     st    mOnOff(a4)
  2097.     bra.b    .u
  2098.  
  2099. .q2    move.l    mLLength(a4),d6
  2100.     sub.l    (a4),a0
  2101.     add.l    mLStart(a4),a0
  2102.     sub.l    d6,a0
  2103.     add.l    d6,mLength(a4)
  2104.     move.l    a0,(a4)
  2105.  
  2106. .u    addq    #1,chans
  2107. .ty    rts
  2108.  
  2109. .tyy    move.l    #$800080,d0
  2110.     lsr    d7
  2111.     bcc.b    .sk
  2112.     add    d0,(a2)+
  2113. .sk    subq    #1,d7
  2114.     bmi.b    .u
  2115. .lk    add.l    d0,(a2)+
  2116.     dbf    d7,.lk
  2117.     bra.b    .u
  2118.  
  2119.  
  2120. .vol0    move.l    clock(a5),d4
  2121.     moveq    #0,d0
  2122.     move    mPeriod(a4),d0
  2123.  
  2124.     divu.l    d0,d4
  2125.  
  2126.     lsl.l    #8,d4
  2127.     lsl.l    #6,d4
  2128.  
  2129.     move.l    mrate(a5),d0
  2130.     lsr.l    #4,d0
  2131.  
  2132.     divu.l    d0,d4
  2133.  
  2134.     move.l    (a4),a0
  2135.     move.l    mFPos(a4),d0
  2136.  
  2137.     mulu.l    d7,d4
  2138.  
  2139.     swap    d0
  2140.     add.l    d4,d0            ; Position after "mixing"
  2141.     swap    d0
  2142.     
  2143.     moveq    #0,d1
  2144.     move    d0,d1
  2145.     add.l    d1,a0
  2146.     clr    d0
  2147.     move.l    a0,(a4)
  2148.     move.l    d0,mFPos(a4)
  2149.     sub.l    d1,mLength(a4)
  2150.     bpl.b    .ty            ; OK, Done!
  2151.  
  2152. ; We're about to mix past the end of the sample
  2153.  
  2154.     tst.b    mLoop(a4)
  2155.     bne.b    .q3
  2156.     st    mOnOff(a4)
  2157.     bra.b    .ty
  2158.  
  2159. .q3    move.l    mLLength(a4),d6
  2160. .loop    sub.l    d6,a0
  2161.     add.l    d6,mLength(a4)
  2162.     bmi.b    .loop
  2163.     beq.b    .loop
  2164.  
  2165.     move.l    a0,(a4)
  2166.     bra.b    .ty
  2167.  
  2168.  
  2169.  
  2170. ; Mixing routine for the first channel (moves data)
  2171.  
  2172.  
  2173. mix16_020
  2174.     moveq    #0,d7
  2175.     move    bytes2do(a5),d7
  2176.     tst    mPeriod(a4)
  2177.     beq.w    .ty
  2178.     tst.b    mOnOff(a4)
  2179.     bne.w    .ty
  2180.  
  2181.     tst    mVolume(a4)
  2182.     beq.w    .vol0
  2183.  
  2184. .dw    move.l    clock(a5),d4
  2185.     moveq    #0,d0
  2186.     move    mPeriod(a4),d0
  2187.  
  2188.     divu.l    d0,d4
  2189.  
  2190.     lsl.l    #8,d4
  2191.     lsl.l    #6,d4
  2192.  
  2193.     move.l    mrate(a5),d0
  2194.     lsr.l    #4,d0
  2195.  
  2196.     divu.l    d0,d4
  2197.     swap    d4
  2198.  
  2199.     move.l    vtabaddr(a5),a3
  2200.     move    mVolume(a4),d0
  2201.     mulu    PS3M_master(a5),d0
  2202.     lsr    #6,d0
  2203.     add    d0,d0
  2204.     lsl.l    #8,d0
  2205.     add.l    d0,a3            ; Position in volume table
  2206.  
  2207.     move.l    (a4),a0            ;pos (addr)
  2208.     move.l    mFPos(a4),d0        ;fpos
  2209.  
  2210.     move.l    mLength(a4),d6        ;len
  2211.     beq.w    .resloop
  2212.  
  2213.     cmp.l    #$ffff,d6
  2214.     bls.b    .restart
  2215.     move    #$ffff,d6
  2216. .restart
  2217.     swap    d6
  2218.     swap    d0
  2219.     sub.l    d0,d6
  2220.     swap    d0
  2221.     move.l    d4,d5
  2222.     swap    d5
  2223.  
  2224.     divul.l    d5,d5:d6        ; bytes left to loop end
  2225.     tst.l    d5
  2226.     beq.b    .e
  2227.     addq.l    #1,d6
  2228. .e
  2229.     moveq    #0,d5
  2230.     moveq    #0,d2
  2231. .mixloop
  2232.     moveq    #8,d1
  2233.     cmp    d1,d7
  2234.     bhs.b    .ok
  2235.     move    d7,d1
  2236. .ok    cmp.l    d1,d6
  2237.     bhs.b    .ok2
  2238.     move.l    d6,d1
  2239. .ok2    sub    d1,d7
  2240.     sub.l    d1,d6
  2241.  
  2242.     jmp    .jtab1(pc,d1*2)
  2243.  
  2244. .a set 0
  2245. .jtab1
  2246.     rept    8
  2247.     bra.b    .mend-.a
  2248. .a set .a+12                ; (mend - dmix) / 8
  2249.     endr
  2250.  
  2251. .dmix    rept    8
  2252.     move.b    (a0,d0),d2
  2253.     add.l    d4,d0
  2254.     move    (a3,d2*2),(a2)+
  2255.     addx    d5,d0
  2256.     endr
  2257.  
  2258. .mend    tst    d7
  2259.     beq.b    .done
  2260.     tst.l    d6
  2261.     bne.w    .mixloop
  2262.  
  2263. .resloop
  2264.     tst.b    mLoop(a4)
  2265.     bne.b    .q
  2266.     st    mOnOff(a4)
  2267.     bra.b    .ty
  2268.  
  2269. .q    moveq    #0,d1
  2270.     move    d0,d1
  2271.     sub.l    mLength(a4),d1
  2272.     move.l    mLStart(a4),a0
  2273.     add.l    d1,a0
  2274.     move.l    mLLength(a4),d6
  2275.     sub.l    d1,d6
  2276.     move.l    d6,mLength(a4)
  2277.     cmp.l    #$ffff,d6
  2278.     bls.b    .j
  2279.     move    #$ffff,d6
  2280. .j    clr    d0            ;reset integer part
  2281.     bra.w    .restart
  2282.  
  2283. .done    moveq    #0,d1
  2284.     move    d0,d1
  2285.     add.l    d1,a0
  2286.     clr    d0
  2287.     move.l    a0,(a4)
  2288.     move.l    d0,mFPos(a4)
  2289.     sub.l    d1,mLength(a4)
  2290.     bpl.b    .u
  2291.  
  2292.     tst.b    mLoop(a4)
  2293.     bne.b    .q2
  2294.     st    mOnOff(a4)
  2295.     bra.b    .u
  2296.  
  2297. .q2    move.l    mLLength(a4),d6
  2298.     sub.l    (a4),a0
  2299.     add.l    mLStart(a4),a0
  2300.     sub.l    d6,a0
  2301.     add.l    d6,mLength(a4)
  2302.     move.l    a0,(a4)
  2303. .u    rts
  2304.  
  2305. .ty    addq    #1,d7
  2306.     beq.b    .u
  2307.  
  2308.     moveq    #0,d0
  2309.     lsr    d7
  2310.     bcc.b    .sk
  2311.     move    d0,(a2)+
  2312. .sk    subq    #1,d7
  2313.     bmi.b    .u
  2314. .lk    move.l    d0,(a2)+
  2315.     dbf    d7,.lk
  2316.     rts
  2317.  
  2318. .vol0    move.l    clock(a5),d4
  2319.     moveq    #0,d0
  2320.     move    mPeriod(a4),d0
  2321.  
  2322.     divu.l    d0,d4
  2323.  
  2324.     lsl.l    #8,d4
  2325.     lsl.l    #6,d4
  2326.  
  2327.     move.l    mrate(a5),d0
  2328.     lsr.l    #4,d0
  2329.  
  2330.     divu.l    d0,d4
  2331.  
  2332.     move.l    (a4),a0
  2333.     move.l    mFPos(a4),d0
  2334.  
  2335.     mulu.l    d7,d4
  2336.  
  2337.     swap    d0
  2338.     add.l    d4,d0            ; Position after "mixing"
  2339.     swap    d0
  2340.     
  2341.     moveq    #0,d1
  2342.     move    d0,d1
  2343.     add.l    d1,a0
  2344.     clr    d0
  2345.     move.l    a0,(a4)
  2346.     move.l    d0,mFPos(a4)
  2347.     sub.l    d1,mLength(a4)
  2348.     bpl.b    .ty            ; OK, Done!
  2349.  
  2350. ; We're about to mix past the end of the sample
  2351.  
  2352.     tst.b    mLoop(a4)
  2353.     bne.b    .q3
  2354.     st    mOnOff(a4)
  2355.     bra.b    .ty
  2356.  
  2357. .q3    move.l    mLLength(a4),d6
  2358. .loop    sub.l    d6,a0
  2359.     add.l    d6,mLength(a4)
  2360.     bmi.b    .loop
  2361.     beq.b    .loop
  2362.  
  2363.     move.l    a0,(a4)
  2364.     bra.b    .ty
  2365.  
  2366.  
  2367. ; Mixing routine for rest of the channels (adds data)
  2368.  
  2369. mix162_020
  2370.     moveq    #0,d7
  2371.     move    bytes2do(a5),d7
  2372.     tst    mPeriod(a4)
  2373.     beq.w    .ty
  2374.     tst.b    mOnOff(a4)
  2375.     bne.w    .ty
  2376.  
  2377.     tst    mVolume(a4)
  2378.     beq.w    .vol0
  2379.  
  2380. .dw    move.l    clock(a5),d4
  2381.     moveq    #0,d0
  2382.     move    mPeriod(a4),d0
  2383.  
  2384.     divu.l    d0,d4
  2385.  
  2386.     lsl.l    #8,d4
  2387.     lsl.l    #6,d4
  2388.  
  2389.     move.l    mrate(a5),d0
  2390.     lsr.l    #4,d0
  2391.  
  2392.     divu.l    d0,d4
  2393.  
  2394.     swap    d4
  2395.  
  2396.     move.l    vtabaddr(a5),a3
  2397.     move    mVolume(a4),d0
  2398.     mulu    PS3M_master(a5),d0
  2399.     lsr    #6,d0
  2400.     add    d0,d0
  2401.     lsl.l    #8,d0
  2402.     add.l    d0,a3            ; Position in volume table
  2403.  
  2404.     move.l    (a4),a0
  2405.     move.l    mFPos(a4),d0
  2406.  
  2407.     move.l    mLength(a4),d6
  2408.     beq.w    .resloop
  2409.  
  2410.     cmp.l    #$ffff,d6
  2411.     bls.b    .restart
  2412.     move    #$ffff,d6
  2413. .restart
  2414.     swap    d6
  2415.     swap    d0
  2416.     sub.l    d0,d6
  2417.     swap    d0
  2418.  
  2419.     move.l    d4,d5
  2420.     swap    d5
  2421.  
  2422.     divul.l    d5,d5:d6        ; bytes left to loop end
  2423.     tst.l    d5
  2424.     beq.b    .e
  2425.     addq.l    #1,d6
  2426. .e    moveq    #0,d2
  2427.     moveq    #0,d5
  2428. .mixloop
  2429.     moveq    #8,d1
  2430.     cmp    d1,d7
  2431.     bhi.b    .ok
  2432.     move    d7,d1
  2433. .ok    cmp.l    d1,d6
  2434.     bhi.b    .ok2
  2435.     move    d6,d1
  2436. .ok2    sub    d1,d7
  2437.     sub.l    d1,d6
  2438.     jmp    .jtab1(pc,d1*2)
  2439.  
  2440. .a set 0
  2441. .jtab1
  2442.     rept    8
  2443.     bra.b    .mend-.a
  2444. .a set .a+14                ; (mend - dmix) / 8
  2445.     endr
  2446.  
  2447. .dmix    rept    8
  2448.     move.b    (a0,d0),d2
  2449.     add.l    d4,d0
  2450.     move    (a3,d2*2),d3
  2451.     addx    d5,d0
  2452.     add    d3,(a2)+
  2453.     endr
  2454.  
  2455. .mend    tst    d7
  2456.     beq.b    .done
  2457.     tst.l    d6
  2458.     bne.w    .mixloop
  2459.  
  2460. .resloop
  2461.     tst.b    mLoop(a4)
  2462.     bne.b    .q
  2463.     st    mOnOff(a4)
  2464.     bra.b    .tyy
  2465.  
  2466. .q    moveq    #0,d1
  2467.     move    d0,d1
  2468.     sub.l    mLength(a4),d1
  2469.     move.l    mLStart(a4),a0
  2470.     add.l    d1,a0
  2471.     move.l    mLLength(a4),d6
  2472.     sub.l    d1,d6
  2473.     move.l    d6,mLength(a4)
  2474.     cmp.l    #$ffff,d6
  2475.     bls.b    .j
  2476.     move    #$ffff,d6
  2477. .j    clr    d0            ;reset integer part
  2478.     bra.w    .restart
  2479.  
  2480. .done    moveq    #0,d1
  2481.     move    d0,d1
  2482.     add.l    d1,a0
  2483.     clr    d0
  2484.     move.l    a0,(a4)
  2485.     move.l    d0,mFPos(a4)
  2486.     sub.l    d1,mLength(a4)
  2487.     bpl.b    .u
  2488.  
  2489.     tst.b    mLoop(a4)
  2490.     bne.b    .q2
  2491.     st    mOnOff(a4)
  2492.     bra.b    .u
  2493.  
  2494. .q2    move.l    mLLength(a4),d6
  2495.     sub.l    (a4),a0
  2496.     add.l    mLStart(a4),a0
  2497.     sub.l    d6,a0
  2498.     add.l    d6,mLength(a4)
  2499.     move.l    a0,(a4)
  2500. .u
  2501. .ty
  2502. .tyy    rts
  2503.  
  2504.  
  2505. .vol0    move.l    clock(a5),d4
  2506.     moveq    #0,d0
  2507.     move    mPeriod(a4),d0
  2508.  
  2509.     divu.l    d0,d4
  2510.  
  2511.     lsl.l    #8,d4
  2512.     lsl.l    #6,d4
  2513.  
  2514.     move.l    mrate(a5),d0
  2515.     lsr.l    #4,d0
  2516.  
  2517.     divu.l    d0,d4
  2518.  
  2519.     move.l    (a4),a0
  2520.     move.l    mFPos(a4),d0
  2521.  
  2522.     mulu.l    d7,d4
  2523.  
  2524.     swap    d0
  2525.     add.l    d4,d0            ; Position after "mixing"
  2526.     swap    d0
  2527.     
  2528.     moveq    #0,d1
  2529.     move    d0,d1
  2530.     add.l    d1,a0
  2531.     clr    d0
  2532.     move.l    a0,(a4)
  2533.     move.l    d0,mFPos(a4)
  2534.     sub.l    d1,mLength(a4)
  2535.     bpl.b    .ty            ; OK, Done!
  2536.  
  2537. ; We're about to mix past the end of the sample
  2538.  
  2539.     tst.b    mLoop(a4)
  2540.     bne.b    .q3
  2541.     st    mOnOff(a4)
  2542.     bra.b    .ty
  2543.  
  2544. .q3    move.l    mLLength(a4),d6
  2545. .loop    sub.l    d6,a0
  2546.     add.l    d6,mLength(a4)
  2547.     bmi.b    .loop
  2548.     beq.b    .loop
  2549.  
  2550.     move.l    a0,(a4)
  2551.     bra.b    .ty
  2552.  
  2553.     endc
  2554.  
  2555.  
  2556. * mulu_32 --- d0 = d0*d1
  2557. mulu_32    movem.l    d2/d3,-(sp)
  2558.     move.l    d0,d2
  2559.     move.l    d1,d3
  2560.     swap    d2
  2561.     swap    d3
  2562.     mulu    d1,d2
  2563.     mulu    d0,d3
  2564.     mulu    d1,d0
  2565.     add    d3,d2
  2566.     swap    d2
  2567.     clr    d2
  2568.     add.l    d2,d0
  2569.     movem.l    (sp)+,d2/d3
  2570.     rts    
  2571.  
  2572. * divu_32 --- d0 = d0/d1, d1=jakojäännös
  2573. divu_32    move.l    d3,-(a7)
  2574.     swap    d1
  2575.     tst    d1
  2576.     bne.b    lb_5f8c
  2577.     swap    d1
  2578.     move.l    d1,d3
  2579.     swap    d0
  2580.     move    d0,d3
  2581.     beq.b    lb_5f7c
  2582.     divu    d1,d3
  2583.     move    d3,d0
  2584. lb_5f7c    swap    d0
  2585.     move    d0,d3
  2586.     divu    d1,d3
  2587.     move    d3,d0
  2588.     swap    d3
  2589.     move    d3,d1
  2590.     move.l    (a7)+,d3
  2591.     rts    
  2592.  
  2593. lb_5f8c    swap    d1
  2594.     move    d2,-(a7)
  2595.     moveq    #16-1,d3
  2596.     move    d3,d2
  2597.     move.l    d1,d3
  2598.     move.l    d0,d1
  2599.     clr    d1
  2600.     swap    d1
  2601.     swap    d0
  2602.     clr    d0
  2603. lb_5fa0    add.l    d0,d0
  2604.     addx.l    d1,d1
  2605.     cmp.l    d1,d3
  2606.     bhi.b    lb_5fac
  2607.     sub.l    d3,d1
  2608.     addq    #1,d0
  2609. lb_5fac    dbf    d2,lb_5fa0
  2610.     move    (a7)+,d2
  2611.     move.l    (a7)+,d3
  2612.     rts    
  2613.  
  2614.  
  2615. ;;******** Init routines ***********
  2616.  
  2617.  
  2618. detectchannels
  2619.     lea    ch(pc),a0
  2620.     moveq    #7,d0
  2621. .l2    clr.l    (a0)+
  2622.     dbf    d0,.l2
  2623.  
  2624.     move.l    patts(a5),a1
  2625.     lea    ch(pc),a2
  2626.     move.l    s3m(a5),a0
  2627.     move    pats(a5),d7
  2628.     subq    #1,d7
  2629. .pattloop
  2630.     moveq    #0,d0
  2631.     move    (a1)+,d0
  2632.     beq.b    .qt
  2633.     iword    d0
  2634.     lsl.l    #4,d0
  2635.     lea    (a0,d0.l),a3
  2636.     addq.l    #2,a3
  2637.     moveq    #63,d6
  2638. .rowloop
  2639.     move.b    (a3)+,d0
  2640.     beq.b    .newrow
  2641.  
  2642.     moveq    #31,d1
  2643.     and    d0,d1
  2644.  
  2645.     moveq    #32,d2
  2646.     and    d0,d2
  2647.     beq.b    .nnot
  2648.  
  2649.     tst.b    (a3)
  2650.     bmi.b    .skip
  2651.     beq.b    .skip
  2652.  
  2653.     tst.b    1(a3)
  2654.     bmi.b    .skip
  2655.     beq.b    .skip
  2656.  
  2657.     st    (a2,d1)
  2658.  
  2659. .skip    addq.l    #2,a3
  2660.  
  2661. .nnot    moveq    #64,d2
  2662.     and    d0,d2
  2663.     beq.b    .nvol
  2664.  
  2665.     addq.l    #1,a3
  2666.  
  2667. .nvol    and    #128,d0
  2668.     beq.b    .rowloop
  2669.  
  2670.     move.b    (a3),d0
  2671.     cmp.b    #1,d0
  2672.     blo.b    .skip2
  2673.  
  2674.     cmp.b    #`Z`-`@`,d0
  2675.     bhi.b    .skip2
  2676.  
  2677.     st    (a2,d1)
  2678.  
  2679. .skip2    addq.l    #2,a3
  2680.     bra.b    .rowloop
  2681.  
  2682. .newrow
  2683.     dbf    d6,.rowloop
  2684. .qt
  2685.     dbf    d7,.pattloop    
  2686.  
  2687.     moveq    #1,d0
  2688.     moveq    #1,d1
  2689.     moveq    #31,d7
  2690.     moveq    #0,d5
  2691.     moveq    #0,d6
  2692.     lea    $40(a0),a1
  2693.     lea    pantab(a5),a0
  2694. .l    clr.b    (a0)
  2695.     tst.b    (a2)+
  2696.     beq.b    .d
  2697.  
  2698.     move.b    (a1),d2
  2699.     bmi.b    .d
  2700.     cmp.b    #8,d2
  2701.     blo.b    .vas
  2702.     move.b    #-1,(a0)
  2703.     move    d1,d0
  2704.     addq    #1,d5
  2705.     bra.b    .d
  2706. .vas    move.b    #1,(a0)
  2707.     move    d1,d0
  2708.     addq    #1,d6
  2709. .d    addq.l    #1,a1
  2710.     addq.l    #1,a0
  2711.     addq    #1,d1
  2712.     dbf    d7,.l
  2713.  
  2714.     cmp    d5,d6
  2715.     bls.b    .k    
  2716.     move    d6,d5
  2717. .k    move    d5,maxchan(a5)
  2718.     
  2719.     move    d0,numchans(a5)
  2720. ret    rts
  2721.  
  2722. ch    ds.b    32
  2723.  
  2724.  
  2725. makedivtabs
  2726.     cmp    #STEREO14,pmode(a5)
  2727.     beq.b    ret
  2728.  
  2729.     lea    divtabs(a5),a1
  2730.     move.l    dtab(a5),a0
  2731.  
  2732.     move    #255,d6
  2733.     moveq    #0,d5
  2734.     move    maxchan(a5),d5
  2735.     move.l    d5,d3
  2736.     move.l    d5,d2
  2737.  
  2738.     subq    #1,d5
  2739.     move    d5,d4
  2740.     lsl.l    #7,d5
  2741.  
  2742.     lsl.l    #7,d2
  2743.  
  2744.     sub.l    vboost(a5),d3
  2745.     cmp    #1,d3
  2746.     bge.b    .laa
  2747.     moveq    #1,d3
  2748.  
  2749. .laa    moveq    #0,d0
  2750.     move    d6,d7
  2751.     move.l    a0,(a1)+
  2752. .l    move.l    d0,d1
  2753.     add.l    d5,d1
  2754.     sub.l    d2,d1
  2755.     divs    d3,d1
  2756.     cmp    #$7f,d1
  2757.     ble.b    .d
  2758.     move    #$7f,d1
  2759. .d    cmp    #$ff80,d1
  2760.     bge.b    .d2
  2761.     move    #$80,d1
  2762. .d2    move.b    d1,(a0)+
  2763.     addq.l    #1,d0
  2764.     dbf    d7,.l
  2765.  
  2766.     add    #256,d6
  2767.     sub.l    #$80,d5
  2768.     dbf    d4,.laa
  2769.     rts
  2770.  
  2771.  
  2772. Makevoltable
  2773.     move.l    vtabaddr(a5),a0
  2774.  
  2775.     cmp    #STEREO14,pmode(a5)
  2776.     beq.b    bit16
  2777.  
  2778.     moveq    #0,d3        ;volume
  2779.     cmp    #1,fformat(a5)
  2780.     beq.b    signed
  2781.  
  2782. .lop    moveq    #0,d4        ;data
  2783. .lap    move    d4,d5
  2784.     sub    #$80,d5
  2785.     mulu    d3,d5
  2786.     asr.l    #6,d5
  2787.     add    #$80,d5
  2788.     move.b    d5,(a0)+
  2789.     addq    #1,d4
  2790.     cmp    #256,d4
  2791.     bne.b    .lap
  2792.     addq    #1,d3
  2793.     cmp    #65,d3
  2794.     bne.b    .lop
  2795.     rts
  2796.  
  2797. signed
  2798. .lop    moveq    #0,d4        ;data
  2799. .lap    move.b    d4,d5
  2800.     ext    d5
  2801.     mulu    d3,d5
  2802.     asr.l    #6,d5
  2803.     add    #$80,d5
  2804.     move.b    d5,(a0)+
  2805.     addq    #1,d4
  2806.     cmp    #256,d4
  2807.     bne.b    .lap
  2808.     addq    #1,d3
  2809.     cmp    #65,d3
  2810.     bne.b    .lop
  2811.     rts
  2812.  
  2813.  
  2814. bit16    move    maxchan(a5),d3
  2815.     moveq    #0,d7        ; "index"
  2816.  
  2817.     cmp    #1,fformat(a5)
  2818.     beq.b    signed2
  2819.  
  2820. .lop    move    d7,d6
  2821.     tst.b    d7
  2822.     bmi.b    .above
  2823.  
  2824.     and    #127,d6
  2825.     move    #128,d5
  2826.     sub    d6,d5
  2827.     lsl    #8,d5
  2828.     move    d7,d6
  2829.     lsr    #8,d6
  2830.     mulu    d6,d5
  2831.     divu    #63,d5
  2832.     swap    d5
  2833.     clr    d5
  2834.     swap    d5
  2835.     divu    d3,d5
  2836.     neg    d5
  2837.     move    d5,(a0)+
  2838.     addq    #1,d7
  2839.     cmp    #256*65,d7
  2840.     bne.b    .lop
  2841.     rts
  2842.  
  2843. .above    and    #127,d6
  2844.     lsl    #8,d6
  2845.  
  2846.     move    d7,d5
  2847.     lsr    #8,d5
  2848.     mulu    d6,d5
  2849.     divu    #63,d5
  2850.     swap    d5
  2851.     clr    d5
  2852.     swap    d5
  2853.     divu    d3,d5
  2854.     move    d5,(a0)+
  2855.     addq    #1,d7
  2856.     cmp    #256*65,d7
  2857.     bne.b    .lop
  2858.     rts
  2859.  
  2860. signed2
  2861. .lop    move    d7,d6
  2862.     tst.b    d7
  2863.     bpl.b    .above
  2864.  
  2865.     and    #127,d6
  2866.     move    #128,d5
  2867.     sub    d6,d5
  2868.     lsl    #8,d5
  2869.     move    d7,d6
  2870.     lsr    #8,d6
  2871.     mulu    d6,d5
  2872.     divu    #63,d5
  2873.     swap    d5
  2874.     clr    d5
  2875.     swap    d5
  2876.     divu    d3,d5
  2877.     neg    d5
  2878.     move    d5,(a0)+
  2879.     addq    #1,d7
  2880.     cmp    #256*65,d7
  2881.     bne.b    .lop
  2882.     rts
  2883.  
  2884. .above    and    #127,d6
  2885.     lsl    #8,d6
  2886.  
  2887.     move    d7,d5
  2888.     lsr    #8,d5
  2889.     mulu    d6,d5
  2890.     divu    #63,d5
  2891.     swap    d5
  2892.     clr    d5
  2893.     swap    d5
  2894.     divu    d3,d5
  2895.     move    d5,(a0)+
  2896.     addq    #1,d7
  2897.     cmp    #256*65,d7
  2898.     bne.b    .lop
  2899.     rts
  2900.  
  2901.  
  2902. do14tab    move.l    buff14(a5),a0
  2903.     moveq    #0,d7
  2904. .loo    move    d7,d2
  2905.     bpl.b    .plus
  2906.  
  2907.     neg    d2
  2908.     move    d2,d3
  2909.     lsr    #8,d2
  2910.     neg.b    d2
  2911.  
  2912.     lsr.b    #2,d3
  2913.     neg    d3
  2914.  
  2915.     move.b    d2,(a0)+
  2916.     move.b    d3,(a0)+
  2917.     addq.l    #2,d7
  2918.     cmp.l    #$10000,d7
  2919.     bne.b    .loo
  2920.     rts
  2921.  
  2922. .plus    move    d2,d3
  2923.     lsr    #8,d2
  2924.     lsr.b    #2,d3
  2925.     move.b    d2,(a0)+
  2926.     move.b    d3,(a0)+
  2927.     addq.l    #2,d7
  2928.     cmp.l    #$10000,d7
  2929.     bne.b    .loo
  2930.     rts
  2931.  
  2932.  
  2933.  
  2934.  
  2935.  
  2936. ;;********** S3M Play Routine **********
  2937.  
  2938.  
  2939. s3m_init
  2940.     move.l    s3m(a5),a0
  2941.     move.l    a0,mname(a5)
  2942.     move    ordernum(a0),d0
  2943.     iword    d0
  2944.     move    d0,slen(a5)
  2945.     move    d0,positioneita(a5)
  2946.  
  2947.     move    patnum(a0),d0
  2948.     iword    d0
  2949.     move    d0,pats(a5)
  2950.  
  2951.     move    insnum(a0),d0
  2952.     iword    d0
  2953.     move    d0,inss(a5)
  2954.  
  2955.     move    ffv(a0),d0
  2956.     iword    d0
  2957.     move    d0,fformat(a5)
  2958.  
  2959.     move    flags(a0),d0
  2960.     iword    d0
  2961.     move    d0,sflags(a5)
  2962.  
  2963.     cmp    #$1301,fformat(a5)
  2964.     bhi.b    .ok
  2965.  
  2966.     bset    #6,sflags+1(a5)
  2967.  
  2968. .ok    lea    $60(a0),a1
  2969.     moveq    #0,d0
  2970.     move    slen(a5),d0
  2971.     moveq    #1,d1
  2972.     and    d0,d1
  2973.     add    d1,d0
  2974.     lea    (a1,d0.l),a2
  2975.     move.l    a2,samples(a5)
  2976.  
  2977.     move    inss(a5),d0
  2978.     add    d0,d0
  2979.     lea    (a2,d0.l),a3
  2980.     move.l    a3,patts(a5)
  2981.  
  2982.     moveq    #0,d0
  2983.     move.b    (a1),d0
  2984.     add    d0,d0
  2985.     sub.l    a1,a1
  2986.     move    (a3,d0),d0
  2987.     beq.b    .q
  2988.     iword    d0
  2989.     asl.l    #4,d0
  2990.     lea    2(a0,d0.l),a1
  2991. .q    move.l    a1,ppos(a5)
  2992.  
  2993.     moveq    #0,d0
  2994.     move.b    initialspeed(a0),d0
  2995.     bne.b    .ok2
  2996.     moveq    #6,d0
  2997. .ok2    move    d0,spd(a5)
  2998.  
  2999.     move.b    initialtempo(a0),d0
  3000.     cmp    #32,d0
  3001.     bhi.b    .qw
  3002.     moveq    #125,d0
  3003. .qw    move    d0,tempo(a5)
  3004.  
  3005.     move    inss(a5),d0
  3006.     subq    #1,d0
  3007.     move.l    samples(a5),a2
  3008. .instloop
  3009.     moveq    #0,d1
  3010.     move    (a2)+,d1
  3011.     iword    d1
  3012.     lsl.l    #4,d1
  3013.     lea    (a0,d1.l),a1
  3014.     btst    #0,insflags(a1)
  3015.     beq.b    .eloo
  3016.     move.l    insloopend(a1),d1
  3017.     ilword    d1
  3018.     cmp.l    #2,d1
  3019.     bls.b    .eloo
  3020.     move.l    insloopend(a1),inslength(a1)
  3021. .eloo    dbf    d0,.instloop
  3022.  
  3023.     clr    pos(a5)
  3024.     clr    rows(a5)
  3025.     clr    cn(a5)
  3026.     clr    pbrkflag(a5)
  3027.     clr    pbrkrow(a5)
  3028.     clr    loopcnt(a5)
  3029.     clr    loopflag(a5)
  3030.     clr    looprow(a5)
  3031.  
  3032.     bsr.w    detectchannels
  3033.  
  3034.     move.l    #14317056/4,clock(a5)        ; Clock constant
  3035.     move    #64,globalVol(a5)
  3036.     moveq    #0,d0
  3037.     rts
  3038.  
  3039.  
  3040. s3m_music
  3041.     lea    data,a5
  3042.     move.l    s3m(a5),a0
  3043.  
  3044.     addq    #1,cn
  3045.     move    cn(a5),d0
  3046.     cmp    spd(a5),d0
  3047.     beq.b    uusrow
  3048.  
  3049. ccmds    lea    c0(a5),a2
  3050.     lea    cha0(a5),a4
  3051.     move    numchans(a5),d7
  3052.     subq    #1,d7
  3053. .loo    btst    #7,5(a2)
  3054.     beq.b    .edi
  3055.  
  3056.     lea    cct(pc),a1
  3057.     moveq    #0,d0
  3058.     move.b    cmd(a2),d0
  3059.     cmp    #`Z`-`@`,d0
  3060.     bhi.b    .edi
  3061.     add    d0,d0
  3062.     move    (a1,d0),d0
  3063.     jsr    (a1,d0)
  3064.  
  3065. .edi    lea    s3mChanBlock_SIZE(a2),a2
  3066.     lea    mChanBlock_SIZE(a4),a4
  3067.     dbf    d7,.loo
  3068.     rts
  3069.  
  3070. uusrow    clr    cn
  3071.  
  3072.     lea    c0(a5),a2
  3073.     move    numchans(a5),d7
  3074.     subq    #1,d7
  3075. .cl    clr.b    flgs(a2)
  3076.     lea    s3mChanBlock_SIZE(a2),a2
  3077.     dbf    d7,.cl
  3078.  
  3079.     move.l    ppos(a5),d0
  3080.     beq.b    process
  3081.     move.l    d0,a1
  3082.  
  3083.     lea    c0(a5),a4        ;chanblocks
  3084. .loo    move.b    (a1)+,d0
  3085.     beq.b    .end
  3086.  
  3087.     moveq    #$1f,d5
  3088.     and    d0,d5            ;chan
  3089.     mulu    #s3mChanBlock_SIZE,d5
  3090.     lea    (a4,d5),a2
  3091.  
  3092.     and    #~31,d0
  3093.     move.b    d0,flgs(a2)
  3094.     
  3095.     moveq    #32,d2
  3096.     and    d0,d2
  3097.     beq.b    .nnot
  3098.  
  3099.     move.b    (a1)+,(a2)
  3100.     move.b    (a1)+,inst(a2)
  3101.  
  3102. .nnot    moveq    #64,d2
  3103.     and    d0,d2
  3104.     beq.b    .nvol
  3105.  
  3106.     move.b    (a1)+,vol(a2)
  3107.  
  3108. .nvol    and    #128,d0
  3109.     beq.b    .loo
  3110.  
  3111.     move.b    (a1)+,d0
  3112.     bmi.b    .d
  3113.     move.b    d0,cmd(a2)
  3114. .d    move.b    (a1)+,info(a2)
  3115.     bra.b    .loo
  3116.  
  3117. .end    move.l    a1,ppos
  3118.  
  3119. process    lea    c0(a5),a2
  3120.     lea    cha0(a5),a4
  3121.     move    numchans(a5),d7
  3122.     move.l    samples(a5),a5
  3123.     subq    #1,d7
  3124.     endb    a5
  3125.  
  3126. .lloo    tst.b    5(a2)
  3127.     beq.w    .evol
  3128.  
  3129.     moveq    #32,d0
  3130.     and.b    flgs(a2),d0
  3131.     beq.w    .f
  3132.  
  3133.     move.b    inst(a2),d0
  3134.     beq.w    .esmp
  3135.     bmi.w    .esmp
  3136.  
  3137.     cmp    inss,d0
  3138.     bgt.w    .mute
  3139.  
  3140.     btst    #7,flgs(a2)
  3141.     beq.b    .eii
  3142.     cmp.b    #`S`-`@`,cmd(a2)
  3143.     bne.b    .eii
  3144.     move.b    info(a2),d1
  3145.     and    #$f0,d1
  3146.     cmp    #$d0,d1
  3147.     beq.w    .evol
  3148.  
  3149. .eii    add    d0,d0
  3150.     move    -2(a5,d0),d0
  3151.     iword    d0
  3152.     lsl    #4,d0
  3153.     lea    (a0,d0),a1
  3154.  
  3155.     moveq    #0,d0
  3156.     move    insmemseg(a1),d0
  3157.     iword    d0
  3158.     lsl.l    #4,d0
  3159.     move.l    a0,d4
  3160.     add.l    d0,d4
  3161.  
  3162.     move.l    insloopbeg(a1),d1
  3163.     ilword    d1
  3164.     move.l    insloopend(a1),d2
  3165.     ilword    d2
  3166.     sub.l    d1,d2
  3167.     add.l    d4,d1
  3168.  
  3169.     move.l    d1,mLStart(a4)
  3170.     move.l    d2,mLLength(a4)
  3171.     move.b    insvol(a1),volume+1(a2)
  3172.     cmp    #64,volume(a2)
  3173.     blo.b    .e
  3174.     move    #63,volume(a2)
  3175. .e    move.l    a1,sample(a2)
  3176.  
  3177.     btst    #0,insflags(a1)
  3178.     beq.b    .eloo
  3179.     cmp.l    #2,d2
  3180.     shi    mLoop(a4)
  3181.     bra.b    .esmp
  3182.  
  3183.  
  3184. .mute    st    mOnOff(a4)
  3185.     bra.w    .f
  3186.  
  3187. .eloo    clr.b    mLoop(a4)
  3188. .esmp    moveq    #0,d0
  3189.     move.b    (a2),d0
  3190.     beq.w    .f
  3191.     cmp.b    #254,d0
  3192.     beq.b    .mute
  3193.     cmp.b    #255,d0
  3194.     beq.w    .f
  3195.  
  3196.     move.b    d0,note(a2)
  3197.     move    d0,d1
  3198.     lsr    #4,d1
  3199.  
  3200.     and    #$f,d0
  3201.     add    d0,d0
  3202.  
  3203.     move.l    sample(a2),a1
  3204.     move.l    $20(a1),d2
  3205.     ilword    d2
  3206.  
  3207.     lea    Periods(pc),a1
  3208.     move    (a1,d0),d0
  3209.     mulu    #8363,d0
  3210.     lsl.l    #4,d0
  3211.     lsr.l    d1,d0    
  3212.  
  3213.     divu    d2,d0
  3214.  
  3215.  
  3216.     btst    #7,flgs(a2)
  3217.     beq.b    .ei
  3218.  
  3219.     cmp.b    #`Q`-`@`,cmd(a2)    ;retrig
  3220.     beq.b    .eiik
  3221.  
  3222. .ei    clr.b    retrigcn(a2)
  3223.  
  3224. .eiik    clr.b    vibpos(a2)
  3225.  
  3226.  
  3227.     btst    #7,flgs(a2)
  3228.     beq.b    .eitopo
  3229.  
  3230.     cmp.b    #`G`-`@`,cmd(a2)    ;TOPO
  3231.     beq.b    .eddo
  3232.  
  3233.     cmp.b    #`L`-`@`,cmd(a2)    ;TOPO+VSLD
  3234.     bne.b    .eitopo
  3235.  
  3236. .eddo    move    d0,toperiod(a2)
  3237.     bra.b    .f
  3238.  
  3239. .eitopo    move    d0,mPeriod(a4)
  3240.     move    d0,period(a2)
  3241.     clr.l    mFPos(a4)
  3242.  
  3243.     move.l    sample(a2),d0
  3244.     beq.b    .f
  3245.     move.l    d0,a1
  3246.  
  3247.     moveq    #0,d0
  3248.     move    insmemseg(a1),d0
  3249.     iword    d0
  3250.     lsl.l    #4,d0
  3251.     move.l    a0,d4
  3252.     add.l    d0,d4
  3253.  
  3254.     move.l    inslength(a1),d0
  3255.     ilword    d0
  3256.  
  3257.     move.l    d4,(a4)
  3258.     move.l    d0,mLength(a4)
  3259.     clr.b    mOnOff(a4)
  3260.  
  3261. .f    moveq    #64,d0
  3262.     and.b    flgs(a2),d0
  3263.     beq.b    .evol
  3264.     move.b    vol(a2),volume+1(a2)
  3265.     cmp    #64,volume(a2)
  3266.     blo.b    .evol
  3267.     move    #63,volume(a2)
  3268.  
  3269. .evol    btst    #7,flgs(a2)
  3270.     beq.b    .eivib
  3271.  
  3272.     cmp.b    #`H`-`@`,cmd(a2)
  3273.     beq.b    .vib
  3274.  
  3275. .eivib    bsr.w    checklimits
  3276. .vib
  3277.  
  3278.     btst    #7,flgs(a2)
  3279.     beq.b    .eitre
  3280.  
  3281.     cmp.b    #`R`-`@`,cmd(a2)
  3282.     beq.b    .tre
  3283.     cmp.b    #`I`-`@`,cmd(a2)
  3284.     beq.b    .tre
  3285.  
  3286. .eitre    move    volume(a2),d0
  3287.     mulu    globalVol,d0
  3288.     lsr    #6,d0
  3289.     move    d0,mVolume(a4)
  3290.  
  3291. .tre    btst    #7,flgs(a2)
  3292.     beq.b    .edd
  3293.  
  3294.     move.b    info(a2),d0
  3295.     beq.b    .dd
  3296.     move.b    d0,lastcmd(a2)
  3297. .dd    lea    ct(pc),a1
  3298.     moveq    #0,d0
  3299.     move.b    cmd(a2),d0
  3300.     cmp    #`Z`-`@`,d0
  3301.     bhi.b    .edd
  3302.  
  3303.     add    d0,d0
  3304.     move    (a1,d0),d0
  3305.     jsr    (a1,d0)
  3306.  
  3307. .edd    lea    s3mChanBlock_SIZE(a2),a2
  3308.     lea    mChanBlock_SIZE(a4),a4
  3309.     dbf    d7,.lloo
  3310.  
  3311.     basereg    data,a5
  3312.     lea    data,a5
  3313.  
  3314.     tst    pbrkflag(a5)
  3315.     bne.b    .newpos
  3316.  
  3317.     addq    #1,rows(a5)
  3318.  
  3319.     move    rows(a5),d0
  3320.     cmp    #64,d0
  3321.     blo.w    dee
  3322.  
  3323. .newpos
  3324.     clr    pbrkflag(a5)
  3325.     move    pbrkrow(a5),rows(a5)
  3326.     clr    pbrkrow(a5)
  3327.  
  3328. burk    addq    #1,pos(a5)
  3329.     move    slen(a5),d0
  3330.     cmp    pos(a5),d0
  3331.     bgt.b    .notend
  3332.  
  3333.     clr    pos(a5)
  3334.     st    PS3M_break(a5)
  3335.  
  3336.     move.b    initialspeed(a0),d0
  3337.     bne.b    .ok
  3338.     moveq    #6,d0
  3339. .ok    move    d0,spd(a5)
  3340.  
  3341. .notend    move    pos(a5),d0
  3342.  
  3343.     sub.l    a1,a1
  3344.  
  3345.     moveq    #0,d1
  3346.     move.b    $60(a0,d0),d1
  3347.     cmp.b    #$fe,d1
  3348.     beq.b    burk
  3349.     cmp.b    #$ff,d1
  3350.     beq.b    burk
  3351.     cmp    pats(a5),d1
  3352.     bhs.b    .newp
  3353.  
  3354.     add    d1,d1
  3355.     move.l    patts(a5),a3
  3356.     moveq    #0,d0
  3357.     move    (a3,d1),d0
  3358.     beq.b    .newp
  3359.     iword    d0
  3360.     lsl.l    #4,d0
  3361.     lea    2(a0,d0.l),a1
  3362.  
  3363.     move    rows(a5),d0
  3364.     beq.b    .newp
  3365.     subq    #1,d0
  3366.     moveq    #0,d1
  3367. .loop    move.b    (a1)+,d1
  3368.     beq.b    .next
  3369.  
  3370.     moveq    #32,d2
  3371.     and    d1,d2
  3372.     beq.b    .nnot
  3373.     addq    #2,a1
  3374. .nnot
  3375.     moveq    #64,d2
  3376.     and    d1,d2
  3377.     beq.b    .nvol
  3378.     addq    #1,a1
  3379. .nvol
  3380.     and    #128,d1
  3381.     beq.b    .loop
  3382.     addq    #2,a1
  3383.  
  3384.     bra.b    .loop
  3385. .next
  3386.     dbf    d0,.loop
  3387. .newp
  3388.     move.l    a1,ppos(a5)
  3389.  
  3390.     move    pos(a5),d0
  3391.     move    d0,PS3M_position(a5)
  3392.     st    PS3M_poscha(a5)
  3393. dee
  3394. ;    bra    xm_dee
  3395.  
  3396.  
  3397.  
  3398.  
  3399. xm_dee    lea    c0(a5),a2
  3400.     lea    cha0(a5),a4
  3401.     move    numchans(a5),d7
  3402.     subq    #1,d7
  3403.  
  3404. .luu    tst    volume(a2)
  3405.     bne.b    .noaging
  3406.  
  3407.     cmp.b    #8,age(a2)
  3408.     bhs.b    .stop
  3409.     addq.b    #1,age(a2)
  3410.     bra.b    .nextt
  3411. .stop    st    mOnOff(a4)
  3412.     bra.b    .nextt
  3413. .noaging
  3414.     clr.b    age(a2)
  3415.  
  3416. .nextt    lea    s3mChanBlock_SIZE(a2),a2
  3417.     lea    mChanBlock_SIZE(a4),a4
  3418.     dbf    d7,.luu
  3419. xm_exit    rts
  3420.  
  3421.  
  3422.     endb    a5
  3423.  
  3424.  
  3425. ct    dc    rt-ct
  3426.     dc    changespeed-ct
  3427.     dc    posjmp-ct
  3428.     dc    patbrk-ct
  3429.     dc    vslide-ct
  3430.     dc    portadwn-ct
  3431.     dc    portaup-ct
  3432.     dc    rt-ct
  3433.     dc    rt-ct
  3434.     dc    tremor-ct
  3435.     dc    arpeggio-ct
  3436.     dc    rt-ct
  3437.     dc    rt-ct
  3438.     dc    rt-ct
  3439.     dc    rt-ct
  3440.     dc    soffset-ct
  3441.     dc    rt-ct
  3442.     dc    retrig-ct
  3443.     dc    rt-ct
  3444.     dc    specials-ct
  3445.     dc    stempo-ct
  3446.     dc    rt-ct
  3447.     dc    setmaster-ct
  3448.     dc    rt-ct
  3449.     dc    rt-ct
  3450.     dc    rt-ct
  3451.     dc    rt-ct
  3452.  
  3453.  
  3454.  
  3455. cct    dc    rt-cct
  3456.     dc    rt-cct
  3457.     dc    rt-cct
  3458.     dc    rt-cct
  3459.     dc    vslide-cct
  3460.     dc    portadwn-cct
  3461.     dc    portaup-cct
  3462.     dc    noteporta-cct
  3463.     dc    vibrato-cct
  3464.     dc    tremor-cct
  3465.     dc    arpeggio-cct
  3466.     dc    vvslide-cct
  3467.     dc    pvslide-cct
  3468.     dc    rt-cct
  3469.     dc    rt-cct
  3470.     dc    rt-cct
  3471.     dc    rt-cct
  3472.     dc    retrig-cct
  3473.     dc    tremolo-cct
  3474.     dc    specials-cct
  3475.     dc    rt-cct
  3476.     dc    finevib-cct
  3477.     dc    rt-cct
  3478.     dc    rt-cct
  3479.     dc    rt-cct
  3480.     dc    rt-cct
  3481.     dc    rt-cct
  3482.  
  3483. tremor
  3484. tremolo
  3485. rt    rts
  3486.  
  3487.  
  3488.  
  3489.  
  3490.  
  3491.  
  3492.  
  3493.  
  3494.  
  3495. changespeed
  3496.     move.b    info(a2),d0
  3497.     bne.b    .e
  3498.     st    PS3M_break
  3499.     st    PS3M_poscha
  3500.     rts
  3501. .e    move.b    info(a2),spd+1
  3502.     rts
  3503.  
  3504. posjmp    clr    pbrkrow
  3505.     st    pbrkflag
  3506.  
  3507.     moveq    #0,d0
  3508.     move.b    pos,d0
  3509.     addq    #1,d0
  3510.  
  3511.     cmp    slen,d0
  3512.     bne.b    .notlast
  3513.     st    PS3M_break
  3514. .notlast
  3515.     moveq    #0,d0
  3516.     move.b    info(a2),d0
  3517.     cmp    pos,d0
  3518.     bhi.b    .e
  3519.     st    PS3M_break
  3520.     moveq    #0,d0
  3521. .e    subq    #1,d0
  3522.     move    d0,pos
  3523.     st    PS3M_poscha
  3524.     rts
  3525.  
  3526. patbrk    moveq    #0,d0
  3527.     move.b    info(a2),d0
  3528.     moveq    #$f,d2
  3529.     and    d0,d2
  3530.     lsr    #4,d0
  3531.     add.b    .dtab(pc,d0),d2
  3532.     cmp.b    #63,d2        ; valid line number given?
  3533.     ble.s    .ok    
  3534.     moveq    #0,d2        ; else zero it
  3535. .ok    move    d2,pbrkrow
  3536.     st    pbrkflag
  3537.     st    PS3M_poscha
  3538.     rts
  3539.  
  3540. .dtab:    dc.b    0,10,20,30    ; Don't think this little table is a waste!
  3541.     dc.b     40,50,60,70    ; The routine is shorter using this table
  3542.     dc.b    80,90,100,110    ; and faster too :-)
  3543.     dc.b     120,130,140,150    ; 16 bytes vs. 8 instructions (wordlength)
  3544.  
  3545. vslide    moveq    #0,d0
  3546.     move.b    lastcmd(a2),d0
  3547.     moveq    #$f,d1
  3548.     and    d0,d1
  3549.     move    d0,d2
  3550.     lsr    #4,d2
  3551.  
  3552.     cmp.b    #$f,d1
  3553.     beq.b    .addfine
  3554.  
  3555.     cmp.b    #$f,d2
  3556.     beq.b    .subfine
  3557.  
  3558.     btst    #6,sflags+1
  3559.     bne.b    .ok
  3560.  
  3561.     tst    cn
  3562.     beq.b    .dd    
  3563.  
  3564. .ok    tst    d1
  3565.     beq.b    .add
  3566.     and    #$f,d0
  3567.     bra.b    .sub
  3568.  
  3569. .subfine
  3570.     tst    cn
  3571.     bne.b    .dd
  3572.     and    #$f,d0
  3573. .sub    sub    d0,volume(a2)
  3574.     bpl.b    .dd
  3575.     clr    volume(a2)
  3576. .dd    move    volume(a2),d0
  3577.     mulu    globalVol,d0
  3578.     lsr    #6,d0
  3579.     move    d0,mVolume(a4)
  3580.     rts
  3581.  
  3582. .addfine
  3583.     tst    d2
  3584.     beq.b    .sub
  3585.     tst    cn
  3586.     bne.b    .dd
  3587. .add    lsr    #4,d0
  3588.  
  3589. .add2    add    d0,volume(a2)
  3590.     cmp    #64,volume(a2)
  3591.     blo.b    .dd
  3592.     move    #63,volume(a2)
  3593.     bra.b    .dd
  3594.  
  3595.  
  3596. portadwn
  3597.     moveq    #0,d0
  3598.     move.b    lastcmd(a2),d0
  3599.  
  3600.     tst    cn
  3601.     beq.b    .fined
  3602.     cmp.b    #$e0,d0
  3603.     bhs.b    .dd
  3604.     lsl    #2,d0
  3605.  
  3606. .ddd    add    d0,period(a2)
  3607.     bra.b    checklimits
  3608. .dd    rts
  3609.  
  3610. .fined    cmp.b    #$e0,d0
  3611.     bls.b    .dd
  3612.     cmp.b    #$f0,d0
  3613.     bls.b    .extr
  3614.     and    #$f,d0
  3615.     lsl    #2,d0
  3616.     bra.b    .ddd
  3617.  
  3618. .extr    and    #$f,d0
  3619.     bra.b    .ddd
  3620.  
  3621. portaup
  3622.     moveq    #0,d0
  3623.     move.b    lastcmd(a2),d0
  3624.  
  3625.     tst    cn
  3626.     beq.b    .fined
  3627.     cmp.b    #$e0,d0
  3628.     bhs.b    .dd
  3629.     lsl    #2,d0
  3630.  
  3631. .ddd    sub    d0,period(a2)
  3632.     bra.b    checklimits
  3633.  
  3634. .dd    rts
  3635.  
  3636. .fined    cmp.b    #$e0,d0
  3637.     bls.b    .dd
  3638.     cmp.b    #$f0,d0
  3639.     bls.b    .extr
  3640.     and    #$f,d0
  3641.     lsl    #2,d0
  3642.     bra.b    .ddd
  3643.  
  3644. .extr    and    #$f,d0
  3645.     bra.b    .ddd
  3646.  
  3647.  
  3648. checklimits
  3649.     move    period(a2),d0
  3650.     btst    #4,sflags+1
  3651.     beq.b    .sii
  3652.     
  3653.     cmp    #856*4,d0
  3654.     bls.b    .dd
  3655.     move    #856*4,d0
  3656. .dd    cmp    #113*4,d0
  3657.     bhs.b    .dd2
  3658.     move    #113*4,d0
  3659. .dd2    move    d0,period(a2)
  3660.     move    d0,mPeriod(a4)
  3661.     rts
  3662.  
  3663. .sii    cmp    #$7fff,d0
  3664.     bls.b    .dd3
  3665.     move    #$7fff,d0
  3666. .dd3    cmp    #64,d0
  3667.     bhs.b    .dd4
  3668.     move    #64,d0
  3669. .dd4    move    d0,mPeriod(a4)
  3670.     rts
  3671.  
  3672.  
  3673. noteporta
  3674.     move.b    info(a2),d0
  3675.     beq.b    notchange
  3676.     move.b    d0,notepspd(a2)
  3677. notchange
  3678.     move    toperiod(a2),d0
  3679.     beq.b    .1
  3680.     moveq    #0,d1
  3681.     move.b    notepspd(a2),d1
  3682.     lsl    #2,d1
  3683.  
  3684.     cmp    period(a2),d0
  3685.     blt.b    .topoup
  3686.  
  3687.     add    d1,period(a2)
  3688.     cmp    period(a2),d0
  3689.     bgt.b    .1
  3690.     move    d0,period(a2)
  3691.     clr    toperiod(a2)
  3692. .1    move    period(a2),mPeriod(a4)
  3693.     rts
  3694.  
  3695. .topoup    sub    d1,period(a2)
  3696.     cmp    period(a2),d0
  3697.     blt.b    .dd
  3698.     move    d0,period(a2)
  3699.     clr    toperiod(a2)
  3700. .dd    move    period(a2),mPeriod(a4)
  3701.     rts
  3702.  
  3703.  
  3704. vibrato    move.b    cmd(a2),d0
  3705.     bne.b    .e
  3706.     move.b    vibcmd(a2),d0
  3707.     bra.b    .skip2
  3708.  
  3709. .e    move    d0,d1
  3710.     and    #$f0,d1
  3711.     bne.b    .skip2
  3712.  
  3713.     move.b    vibcmd(a2),d1
  3714.     and    #$f0,d1
  3715.     or    d1,d0
  3716.  
  3717. .skip2
  3718.     move.b    d0,vibcmd(a2)
  3719.  
  3720. vibrato2
  3721.     moveq    #$1f,d0
  3722.     and.b    vibpos(a2),d0
  3723.     moveq    #0,d2
  3724.     lea    mt_vibratotable(pc),a3
  3725.     move.b    (a3,d0),d2
  3726.     moveq    #$f,d0
  3727.     and.b    vibcmd(a2),d0
  3728.     mulu    d0,d2
  3729.  
  3730.     moveq    #4,d0
  3731.     btst    #0,sflags+1
  3732.     bne.b    .sii
  3733.     moveq    #5,d0
  3734. .sii    lsr    d0,d2
  3735.     move    period(a2),d0
  3736.     btst    #5,vibpos(a2)
  3737.     bne.b    .neg
  3738.     add    d2,d0
  3739.     bra.b    .vib3
  3740. .neg
  3741.     sub    d2,d0
  3742. .vib3
  3743.     move    d0,mPeriod(a4)
  3744.     move.b    vibcmd(a2),d0
  3745.     lsr.b    #4,d0
  3746.     add.b    d0,vibpos(a2)
  3747.     rts
  3748.  
  3749.  
  3750. finevib    move.b    cmd(a2),d0
  3751.     bne.b    .e
  3752.     move.b    vibcmd(a2),d0
  3753.     bra.b    .skip2
  3754.  
  3755. .e    move    d0,d1
  3756.     and    #$f0,d1
  3757.     bne.b    .skip2
  3758.  
  3759.     move.b    vibcmd(a2),d1
  3760.     and    #$f0,d1
  3761.     or    d1,d0
  3762.  
  3763. .skip2
  3764.     move.b    d0,vibcmd(a2)
  3765.     moveq    #$1f,d0
  3766.     and.b    vibpos(a2),d0
  3767.     moveq    #0,d2
  3768.     lea    mt_vibratotable(pc),a3
  3769.     move.b    (a3,d0),d2
  3770.     moveq    #$f,d0
  3771.     and.b    vibcmd(a2),d0
  3772.     mulu    d0,d2
  3773.  
  3774.     lsr    #7,d2
  3775.     move    period(a2),d0
  3776.     btst    #5,vibpos(a2)
  3777.     bne.b    .neg
  3778.     add    d2,d0
  3779.     bra.b    .vib3
  3780. .neg    sub    d2,d0
  3781. .vib3    move    d0,mPeriod(a4)
  3782.     move.b    vibcmd(a2),d0
  3783.     lsr.b    #4,d0
  3784.     add.b    d0,vibpos(a2)
  3785.     rts
  3786.  
  3787.  
  3788. arpeggio
  3789.     moveq    #0,d0
  3790.     move.b    note(a2),d0
  3791.     beq.b    .qq
  3792.  
  3793.     moveq    #$70,d1
  3794.     and    d0,d1
  3795.     and    #$f,d0
  3796.  
  3797.     moveq    #0,d2
  3798.     move    cn,d2
  3799.     divu    #3,d2
  3800.     swap    d2
  3801.     tst    d2
  3802.     beq.b    .norm
  3803.     subq    #1,d2
  3804.     beq.b    .1
  3805.  
  3806.     moveq    #$f,d2
  3807.     and.b    lastcmd(a2),d2
  3808.     add    d2,d0
  3809. .f    cmp    #12,d0
  3810.     blt.b    .norm
  3811.     sub    #12,d0
  3812.     add    #$10,d1
  3813.     bra.b    .f
  3814.  
  3815. .1    move.b    lastcmd(a2),d2
  3816.     lsr.b    #4,d2
  3817.     add.b    d2,d0
  3818. .f2    cmp    #12,d0
  3819.     blt.b    .norm
  3820.     sub    #12,d0
  3821.     add    #$10,d1
  3822.     bra.b    .f2
  3823.  
  3824. .norm    add    d0,d0
  3825.     lsr    #4,d1
  3826.  
  3827.     move.l    sample(a2),a1
  3828.  
  3829.     move.l    $20(a1),d2
  3830.     ilword    d2
  3831.  
  3832.     lea    Periods(pc),a1
  3833.     move    (a1,d0),d0
  3834.     mulu    #8363,d0
  3835.     lsl.l    #4,d0
  3836.     lsr.l    d1,d0
  3837.     divu    d2,d0
  3838.     move    d0,mPeriod(a4)
  3839. .qq    rts
  3840.  
  3841.  
  3842. pvslide    bsr.w    notchange
  3843.     bra.w    vslide
  3844.  
  3845. vvslide    bsr.w    vibrato2
  3846.     bra.w    vslide
  3847.  
  3848. soffset    moveq    #32,d0
  3849.     and.b    flgs(a2),d0
  3850.     beq.b    .f
  3851.     move.b    (a2),d0
  3852.     beq.b    .f
  3853.     cmp.b    #255,d0
  3854.     beq.b    .f
  3855.  
  3856.     move.l    sample(a2),d0
  3857.     beq.b    .f
  3858.     move.l    d0,a1
  3859.  
  3860.     moveq    #0,d0
  3861.     move    insmemseg(a1),d0
  3862.     iword    d0
  3863.     lsl.l    #4,d0
  3864.     move.l    a0,d4
  3865.     add.l    d0,d4
  3866.  
  3867.     move.l    inslength(a1),d0
  3868.     ilword    d0
  3869.  
  3870.     moveq    #0,d2
  3871.     move.b    lastcmd(a2),d2
  3872.     lsl.l    #8,d2
  3873.     add.l    d2,d4
  3874.     sub.l    d2,d0
  3875.     bpl.b    .ok
  3876.     move.l    mLStart(a4),d4
  3877.     move.l    mLLength(a4),d0
  3878. .ok    move.l    d4,(a4)
  3879.     move.l    d0,mLength(a4)
  3880. .f    rts
  3881.  
  3882.  
  3883. retrig    move.b    retrigcn(a2),d0
  3884.     subq.b    #1,d0
  3885.     cmp.b    #0,d0
  3886.     ble.b    .retrig
  3887.  
  3888.     move.b    d0,retrigcn(a2)
  3889.     rts
  3890.  
  3891. .retrig    move.l    sample(a2),d0
  3892.     beq.w    .f
  3893.     move.l    d0,a1
  3894.     moveq    #0,d1
  3895.     move    insmemseg(a1),d1
  3896.     iword    d1
  3897.     lsl.l    #4,d1
  3898.     move.l    a0,d4
  3899.     add.l    d1,d4
  3900.  
  3901.     move.l    inslength(a1),d1
  3902.     ilword    d1
  3903.  
  3904.     move.l    d4,(a4)
  3905.     move.l    d1,mLength(a4)
  3906.     clr.b    mOnOff(a4)
  3907.     clr.l    mFPos(a4)
  3908.  
  3909.     move.b    lastcmd(a2),d0
  3910.     moveq    #$f,d1
  3911.     and.b    d0,d1
  3912.     move.b    d1,retrigcn(a2)
  3913.  
  3914.     and    #$f0,d0
  3915.     lsr    #4,d0
  3916.     lea    ftab2(pc),a3
  3917.     moveq    #0,d2
  3918.     move.b    (a3,d0),d2
  3919.     beq.b    .ddq
  3920.  
  3921.     mulu    volume(a2),d2
  3922.     lsr    #4,d2
  3923.     move    d2,volume(a2)
  3924.     bra.b    .ddw
  3925.  
  3926. .ddq    lea    ftab1(pc),a3
  3927.     move.b    (a3,d0),d2
  3928.     ext    d2
  3929.     add    d2,volume(a2)
  3930.  
  3931. .ddw    tst    volume(a2)
  3932.     bpl.b    .ei0
  3933.     clr    volume(a2)
  3934. .ei0    cmp    #64,volume(a2)
  3935.     blo.b    .ei64
  3936.     move    #63,volume(a2)
  3937. .ei64    move    volume(a2),d0
  3938.     mulu    globalVol,d0
  3939.     lsr    #6,d0
  3940.     move    d0,mVolume(a4)
  3941. .f    rts
  3942.  
  3943. specials
  3944. ncut_delay
  3945.     move.b    info(a2),d0
  3946.     and    #$f0,d0
  3947.     cmp    #$b0,d0
  3948.     beq.b    .ploop
  3949.     cmp    #$d0,d0
  3950.     beq.b    .delay
  3951.     cmp    #$c0,d0
  3952.     bne.b    .dd
  3953.  
  3954.     move.b    info(a2),d0
  3955.     and    #$f,d0
  3956.     cmp    cn,d0
  3957.     bne.b    .dd
  3958.     clr    volume(a2)
  3959.     clr    mVolume(a4)
  3960. .dd    rts
  3961.  
  3962. .ploop    tst    cn
  3963.     bne.b    .dd
  3964.  
  3965.     moveq    #$f,d0
  3966.     and.b    info(a2),d0
  3967.     beq.b    .setlp            ; 0 means "set loop mark" in current line
  3968.  
  3969.     tst    loopflag
  3970.     beq.b    .jcnt
  3971.  
  3972.     subq    #1,loopcnt        ; count down
  3973.     bne.b    .jloop            ; jump again if still not zero
  3974.     clr    loopflag
  3975.     rts
  3976.  
  3977. .jcnt    move    d0,loopcnt        ; accept new loop value
  3978.     st    loopflag
  3979. .jloop    move    looprow,pbrkrow        ; put line number to jump to
  3980.     subq    #1,pos
  3981.     st    pbrkflag
  3982.     rts
  3983. .setlp    move    rows,looprow
  3984.     rts
  3985.  
  3986. .delay    move.b    info(a2),d0
  3987.     and    #$f,d0
  3988.     cmp    cn,d0
  3989.     bne.b    .dd
  3990.     
  3991.     moveq    #32,d0
  3992.     and.b    flgs(a2),d0
  3993.     beq.w    .f
  3994.  
  3995.     move.b    inst(a2),d0
  3996.     beq.w    .esmp
  3997.     bmi.w    .esmp
  3998.  
  3999.     cmp    inss,d0
  4000.     bgt.w    .dd
  4001.  
  4002.     move.l    samples,a5
  4003.     add    d0,d0
  4004.     move    -2(a5,d0),d0
  4005.     iword    d0
  4006.     asl    #4,d0
  4007.     lea    (a0,d0),a1
  4008.  
  4009.     moveq    #0,d0
  4010.     move    insmemseg(a1),d0
  4011.     iword    d0
  4012.     asl.l    #4,d0
  4013.     move.l    a0,d4
  4014.     add.l    d0,d4
  4015.  
  4016.     move.l    insloopbeg(a1),d1
  4017.     ilword    d1
  4018.     move.l    insloopend(a1),d2
  4019.     ilword    d2
  4020.     sub.l    d1,d2
  4021.     add.l    d4,d1
  4022.  
  4023.     move.l    inslength(a1),d0
  4024.     ilword    d0
  4025.  
  4026.     move.l    d4,(a4)
  4027.     move.l    d0,mLength(a4)
  4028.     move.l    d1,mLStart(a4)
  4029.     move.l    d2,mLLength(a4)
  4030.     move.b    insvol(a1),volume+1(a2)
  4031.     cmp    #64,volume(a2)
  4032.     blo.b    .e
  4033.     move    #63,volume(a2)
  4034. .e    clr.b    mOnOff(a4)
  4035.  
  4036.     move.l    a1,sample(a2)
  4037.  
  4038.     btst    #0,insflags(a1)
  4039.     bne.b    .loo
  4040.     clr.b    mLoop(a4)
  4041.     bra.b    .esmp
  4042. .loo    cmp.l    #2,d2
  4043.     shi    mLoop(a4)
  4044.  
  4045. .esmp    moveq    #0,d0
  4046.     move.b    (a2),d0
  4047.     beq.b    .f
  4048.     bmi.b    .f
  4049.  
  4050.     moveq    #$70,d1
  4051.     and    d0,d1
  4052.     lsr    #4,d1
  4053.  
  4054.     and    #$f,d0
  4055.     add    d0,d0
  4056.  
  4057.     move.l    sample(a2),a1
  4058.  
  4059.     move.l    $20(a1),d2
  4060.     ilword    d2
  4061.  
  4062.     lea    Periods(pc),a1
  4063.     move    (a1,d0),d0
  4064.     mulu    #8363,d0
  4065.     lsl.l    #4,d0
  4066.     lsr.l    d1,d0
  4067.     divu    d2,d0
  4068.  
  4069.     move    d0,mPeriod(a4)
  4070.     move    d0,period(a2)
  4071.     clr.l    mFPos(a4)
  4072.     clr.b    vibpos(a2)
  4073.  
  4074. .f    moveq    #64,d0
  4075.     and.b    flgs(a2),d0
  4076.     beq.b    .evol
  4077.     move.b    vol(a2),volume+1(a2)
  4078.     cmp    #64,volume(a2)
  4079.     blo.b    .evol
  4080.     move    #63,volume(a2)
  4081. .evol    move    volume(a2),d0
  4082.     mulu    globalVol,d0
  4083.     lsr    #6,d0
  4084.     move    d0,mVolume(a4)
  4085.     rts
  4086.  
  4087.  
  4088. stempo    moveq    #0,d0
  4089.     move.b    info(a2),d0
  4090.     cmp    #32,d0
  4091.     bls.b    .e
  4092.     move.l    mrate,d1
  4093.     move.l    d1,d2
  4094.     lsl.l    #2,d1
  4095.     add.l    d2,d1
  4096.     add    d0,d0
  4097.     divu    d0,d1
  4098.  
  4099.     addq    #1,d1
  4100.     and    #~1,d1
  4101.     move    d1,bytesperframe
  4102. .e    rts
  4103.  
  4104. setmaster
  4105.     moveq    #0,d0
  4106.     move.b    info(a2),d0
  4107.     cmp    #64,d0
  4108.     bls.b    .d
  4109.     moveq    #64,d0
  4110. .d    move    d0,globalVol
  4111.     rts
  4112.  
  4113. Periods
  4114.  dc    1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,907
  4115.  
  4116. ftab1    dc.b    0,-1,-2,-4,-8,-16,0,0
  4117.     dc.b    0,1,2,4,8,16,0,0
  4118.  
  4119. ftab2    dc.b    0,0,0,0,0,0,10,8
  4120.     dc.b    0,0,0,0,0,0,24,32
  4121.  
  4122.  
  4123.  
  4124. mt_vibratotable    
  4125.     dc.b   0, 24, 49, 74, 97,120,141,161
  4126.     dc.b 180,197,212,224,235,244,250,253
  4127.     dc.b 255,253,250,244,235,224,212,197
  4128.     dc.b 180,161,141,120, 97, 74, 49, 24
  4129.  
  4130.  
  4131.  
  4132.  
  4133.  
  4134.  
  4135.  
  4136.  
  4137.  
  4138. ******************************************************************************
  4139. ******************************************************************************
  4140. ******************************************************************************
  4141. * Soittolooppi
  4142.  
  4143.  
  4144.     basereg    data,a5
  4145.  
  4146.  
  4147. s3mPlay    movem.l    d0-a6,-(sp)
  4148.     lea    data,a5
  4149.     move    $dff002,-(sp)        ;Old DMAs
  4150.  
  4151.     move.l    gfxbase(pc),a6
  4152.     move.l    34(a6),-(sp)        ;Old view
  4153.     move.l    a6,-(sp)
  4154.     sub.l    a1,a1
  4155.     CALL    LoadView
  4156.     CALL    WaitTOF
  4157.     CALL    WaitTOF
  4158.  
  4159.     lob    WaitBlit
  4160.  
  4161.     lea    $dff000,a6
  4162.     move    $1c(a6),d1
  4163. .irqs    move    $1e(a6),d0        ;Wait for all IRQs to finish...
  4164.     and    d1,d0            ;before killing the system...
  4165.     bne.b    .irqs            ;Over safety you might think, but...
  4166.  
  4167.     move    #$7ff,$96(a6)        ;Disable DMAs
  4168.     move    #$8200,$96(a6)        ;Enable master DMA
  4169.     move    $1c(a6),-(sp)        ;Old IRQs
  4170.     move    #$7fff,$9a(a6)        ;Disable IRQs
  4171.  
  4172.     move.l    4.w,a6
  4173.     move.b    PowerSupplyFrequency(a6),d0
  4174.     cmp.b    #60,d0
  4175.     beq.b    .NTSC
  4176.     move.l    #3546895,audiorate(a5)
  4177.     bra.b    .qw
  4178. .NTSC
  4179.     move.l    #3579545,audiorate(a5)
  4180. .qw
  4181.     move.l    audiorate(a5),d0
  4182.     move.l    mixingrate(a5),d1
  4183.     divu    d1,d0
  4184.     move.l    audiorate(a5),d1
  4185.     divu    d0,d1
  4186.     swap    d1
  4187.     clr    d1
  4188.     swap    d1
  4189.     move.l    d1,mrate(a5)
  4190.  
  4191.     move.l    audiorate(a5),d0
  4192.     divu    d1,d0
  4193.  
  4194.     swap    d0
  4195.     clr    d0
  4196.     swap    d0
  4197.     move.l    d0,mixingperiod(a5)
  4198.  
  4199.     lsl.l    #8,d1                ; 8-bit fraction
  4200.     move.l    d1,d0
  4201.     move.l    4.w,a6
  4202.     moveq    #0,d1
  4203.     move.b    VBlankFrequency(a6),d1
  4204.     bsr.w    divu_32
  4205.     move.l    d0,mrate50(a5)            ;In fact vblank frequency
  4206.  
  4207.     movem.l    buff1(a5),a0-a3
  4208.     move.l    mixingperiod(a5),d0
  4209.  
  4210.     lea    $dff000,a6
  4211.     move.l    buffSize(a5),d1
  4212.     lsr.l    #1,d1
  4213.     move    d1,$a4(a6)
  4214.     move    d1,$b4(a6)
  4215.     move    d1,$c4(a6)
  4216.     move    d1,$d4(a6)
  4217.     move    d0,$a6(a6)
  4218.     move    d0,$b6(a6)
  4219.     move    d0,$c6(a6)
  4220.     move    d0,$d6(a6)
  4221.  
  4222.     moveq    #64,d1
  4223.  
  4224.     move    pmode(a5),d0    
  4225.     subq    #1,d0
  4226.     bne.b    .nosurround
  4227.  
  4228.     moveq    #32,d2
  4229.  
  4230.     move.l    a0,$a0(a6)
  4231.     move.l    a1,$b0(a6)
  4232.     move.l    a0,$c0(a6)
  4233.     move.l    a1,$d0(a6)
  4234.     move    d1,$a8(a6)
  4235.     move    d1,$b8(a6)
  4236.     move    d2,$c8(a6)
  4237.     move    d2,$d8(a6)
  4238.     bra.w    .ohiis
  4239.  
  4240. .nosurround
  4241.     subq    #1,d0
  4242.     bne.b    .nostereo
  4243.  
  4244.     move.l    a0,$a0(a6)
  4245.     move.l    a1,$b0(a6)
  4246.     move.l    a1,$c0(a6)
  4247.     move.l    a0,$d0(a6)
  4248.     move    d1,$a8(a6)
  4249.     move    d1,$b8(a6)
  4250.     move    d1,$c8(a6)
  4251.     move    d1,$d8(a6)
  4252.     bra.b    .ohiis
  4253.  
  4254. .nostereo
  4255.     subq    #1,d0
  4256.     bne.b    .nomono
  4257.  
  4258.     move.l    a0,$a0(a6)
  4259.     move.l    a1,$b0(a6)
  4260.     move.l    a0,$c0(a6)
  4261.     move.l    a1,$d0(a6)
  4262.     move    d1,$a8(a6)
  4263.     move    d1,$b8(a6)
  4264.     move    d1,$c8(a6)
  4265.     move    d1,$d8(a6)
  4266.     bra.b    .ohiis
  4267.  
  4268. .nomono
  4269.  
  4270. ; REAL SURROUND!
  4271.  
  4272.     subq    #1,d0
  4273.     bne.b    .bit14
  4274.  
  4275.     move.l    a0,$a0(a6)
  4276.     move.l    a1,$b0(a6)
  4277.     move.l    a2,$c0(a6)
  4278.     move.l    a3,$d0(a6)
  4279.     move    d1,$a8(a6)
  4280.     move    d1,$b8(a6)
  4281.     move    d1,$c8(a6)
  4282.     move    d1,$d8(a6)
  4283.     bra.b    .ohiis
  4284.  
  4285.  
  4286. ; 14-BIT STEREO
  4287.  
  4288. .bit14    moveq    #1,d2
  4289.  
  4290.     move.l    a0,$a0(a6)
  4291.     move.l    a1,$b0(a6)
  4292.     move.l    a3,$c0(a6)
  4293.     move.l    a2,$d0(a6)
  4294.     move    d1,$a8(a6)
  4295.     move    d1,$b8(a6)
  4296.     move    d2,$c8(a6)
  4297.     move    d2,$d8(a6)
  4298.  
  4299. .ohiis    move.l    4.w,a6
  4300.     moveq    #0,d0
  4301.     btst    d0,AttnFlags+1(a6)
  4302.     beq.b    .no68010
  4303.  
  4304.     Push    a5
  4305.     lea    liko(pc),a5
  4306.     CALL    Supervisor
  4307.     Pull    a5
  4308. .no68010
  4309.     move.l    d0,vbrr(a5)
  4310.  
  4311.     Push    a5
  4312.     jsr    FinalInit
  4313.     Pull    a5
  4314.  
  4315.     lea    $dff000,a6
  4316.     move.l    vbrr(a5),a0
  4317.     move.l    $70(a0),olev4(a5)
  4318.     move.l    #lev4,$70(a0)
  4319.     move.l    $6c(a0),olev3(a5)
  4320.     move.l    #lev3,$6c(a0)
  4321.     move    #$800f,$96(a6)
  4322.  
  4323.     move    #$80+$20,$9c(a6)
  4324.     move    #$c080+$20,$9a(a6)
  4325.  
  4326. sync
  4327.  
  4328. .q    btst    #0,5(a6)        * VBlank
  4329.     beq.b    .q
  4330. .qq    btst    #0,5(a6)
  4331.     bne.b    .qq
  4332.  
  4333.     move    #4,$180(a6)        * Rastermeter
  4334.     bsr    play            * Play!
  4335.     move    #$5a,$180(a6)
  4336.  
  4337. ** You don't have to call play within regular intervals. The routine just 
  4338. ** swallows cpu as it needs fit, but probably some 50Hz is the best.
  4339.  
  4340.     btst    #6,$bfe001
  4341.     bne.b    sync
  4342.  
  4343.  
  4344. exitz    move    #$f00,$180(a6)
  4345.     move    #$7fff,$9a(a6)        ;Restore system status
  4346.     move    #$7ff,$96(a6)
  4347.     move    #$7fff,$9c(a6)        ;Clear possible IRQ-requests (4 safety)
  4348.  
  4349.     move.l    vbrr(a5),a0
  4350.     move.l    olev4(a5),$70(a0)    ;Restore IRQ-vectors
  4351.     move.l    olev3(a5),$6c(a0)
  4352.  
  4353. .q    btst    #6,$bfe001
  4354.     beq.b    .q
  4355.  
  4356.     move    (sp)+,d7        ;Old IRQs
  4357.  
  4358.     move.l    (sp)+,a6        ;Old gfxbase
  4359.     move.l    (sp)+,a1        ;Old view
  4360.  
  4361.     lea    $dff000,a0
  4362.     move    #$ff0,$180(a0)        ;!!! debug color
  4363.  
  4364.     or    #$8000,d7
  4365.     and    #~$780,d7        ;And off Audio IRQs (for safety again)
  4366.     move    d7,$9a(a0)        ;Old IRQs
  4367.  
  4368.     move    (sp)+,d7        ;Old DMAs
  4369.     or    #$8000,d7
  4370.     and    #~$f,d7            ;And off Audio DMAs (convenience...)
  4371.     move    d7,$96(a0)
  4372.  
  4373.     clr    $a8(a0)            ;Volumes down...
  4374.     clr    $b8(a0)
  4375.     clr    $c8(a0)
  4376.     clr    $d8(a0)
  4377.  
  4378.     move    #$ff,$180(a0)        ;!!! debug color2
  4379.  
  4380.     CALL    LoadView        ;Old view
  4381.     move.l    38(a6),d3        ;Old Copper1
  4382.     move.l    d3,$dff080        ;Set old Copper
  4383.     move    d3,$dff088        ;Trigger
  4384.  
  4385.     movem.l    (sp)+,d0-a6
  4386.     moveq    #0,d0            ;No error code
  4387.     move    #$f0,$dff000        ;Safe! (Hopefully...)
  4388.     rts
  4389.  
  4390. liko    ifeq    disable020
  4391.     MOVEC    VBR,d0
  4392.     endc
  4393.     rte
  4394.  
  4395.  
  4396. *******
  4397.  
  4398. ;*** Datas ***
  4399.  
  4400. data
  4401.  
  4402. vbrr        dc.l    0
  4403. olev4        dc.l    0
  4404. olev3        dc.l    0
  4405. vtabaddr    dc.l    0
  4406. playpos        dc.l    0
  4407. bufpos        dc.l    0
  4408. buffSize    dc.l    BUFFER
  4409. buffSizeMask    dc.l    BUFFER-1
  4410.  
  4411. bytesperframe    dc    0
  4412. bytes2do    dc    0
  4413. todobytes    dc    0
  4414. bytes2music    dc    0
  4415.  
  4416. mixad1        dc.l    0
  4417. mixad2        dc.l    0
  4418. cbufad        dc.l    0
  4419. opt020        dc    0
  4420.  
  4421. mixingrate    dc.l    16000
  4422. mixingperiod    dc.l    0
  4423. vboost        dc.l    0
  4424. pmode        dc    SURROUND
  4425.  
  4426. PS3M_play    dc    0
  4427. PS3M_break    dc    0
  4428. PS3M_poscha    dc    0
  4429. PS3M_position    dc    0
  4430. PS3M_master    dc    64
  4431. PS3M_eject    dc    0
  4432. PS3M_wait    dc    0
  4433. PS3M_cont    dc    0
  4434. PS3M_paused    dc    0
  4435. PS3M_initialized dc    0
  4436. PS3M_reinit    dc    0
  4437.  
  4438. audiorate    dc.l    0
  4439. mrate        dc.l    0
  4440. mrate50        dc.l    0
  4441.  
  4442. slen        dc    0
  4443. pats        dc    0
  4444. inss        dc    0
  4445.  
  4446. samples        dc.l    0
  4447. patts        dc.l    0
  4448.  
  4449. fformat        dc    0
  4450. sflags        dc    0
  4451.  
  4452. rows        dc    63
  4453. pbrkrow        dc    0
  4454. pbrkflag    dc    0
  4455. loopcnt        dc    0
  4456. loopflag    dc    0
  4457. looprow        dc    0
  4458. spd        dc    6
  4459. tempo        dc    125
  4460.  
  4461. cn        dc    0
  4462. pbflag        dc    0
  4463. pdelaycnt    dc.b    0
  4464. ploopcnt    dc.b    0
  4465.  
  4466. chans        dc    0
  4467. numchans    dc    0
  4468. maxchan        dc    0
  4469. mtype        dc    0            
  4470. clock        dc.l    0            ; 14317056/4 for S3Ms
  4471. globalVol    dc    0
  4472.  
  4473. pos        dc    0
  4474. plen        dc    0
  4475. ppos        dc.l    0
  4476.  
  4477. divtabs        ds.l    16
  4478.  
  4479. c0        ds.b    s3mChanBlock_SIZE*32
  4480.  
  4481. cha0        ds.b    mChanBlock_SIZE*32
  4482.  
  4483. pantab        ds.b    32            ;channel panning infos
  4484.  
  4485.  
  4486. s3m        dc.l    0
  4487. s3mlen        dc.l    0
  4488.  
  4489. tbuf        dc.l    0
  4490. tbuf2        dc.l    0
  4491. buff1        dc.l    0
  4492. buff2        dc.l    0
  4493. buff3        dc.l    0
  4494. buff4        dc.l    0
  4495. buff14        dc.l    0
  4496. vtab        dc.l    0
  4497. dtab        dc.l    0
  4498. dtabsize    dc.l    0
  4499.  
  4500. mname        dc.l    0
  4501.  
  4502. gfxbase        dc.l    0
  4503.  
  4504. thi        dc.b    0
  4505. tlo        dc.b    0
  4506. timer        dc.l    0
  4507. ciares        dc.l    0
  4508. craddr        dc.l    0,0,0
  4509. positioneita    dc    1
  4510. gfxname        dc.b    "graphics.library",0
  4511.         even
  4512.  
  4513.  
  4514.  
  4515.     section    blahb,data_f
  4516.  
  4517. module    incbin    "music:done/s3m.the crossing"
  4518.