home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaMiscModsCD3.iso / _PROGRAMME / PLAYER / SOURCECODE / ps3msrc.lha / PS3M / PS3M313.s < prev    next >
Encoding:
Text File  |  1996-03-05  |  180.2 KB  |  12,117 lines

  1. ;PS3M 0.960 020+ 14-bit stereo surround version ;) 22.02.1996
  2. ;Copyright (c) Jarno Paananen a.k.a. Guru / S2 1994-96
  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. ;changes from 3.12:
  10. ; s3m: - speed effect fixed
  11. ;      - tremor fx added
  12. ;      - pattern delay fx added
  13. ;      - pattern break fixed
  14. ;      - pattern loop fixed
  15. ;
  16. ; xm:  - pattern break fixed
  17. ;      - pattern loop fixed
  18. ;      - envelopes fixed
  19. ;      - sample offset fx fixed
  20. ;      - added instrnum sanity check
  21.  
  22. SURROUND = 1
  23. STEREO = 2
  24. MONO = 3
  25. REAL = 4
  26. STEREO14 = 5
  27.  
  28. DISABLED = 1
  29. ENABLED = 2
  30.  
  31. mtS3M = 1
  32. mtMOD = 2
  33. mtMTM = 3
  34. mtXM  = 4
  35.  
  36. BUFFER = 16*1024                ; MUST BE 2^N
  37.                         ; MIN 4K
  38. debug = 0
  39. fromasmone = 0
  40. allocchans = 1
  41. disable020 = 0
  42. beta = 0
  43.  
  44. GADGETS = 14
  45. CTRL_C    = 12
  46.  
  47.     ifd    __G2
  48.  
  49.     opt p=68020
  50.  
  51.     incdir    includes:
  52.  
  53.     include    exec/types.i
  54.     include exec/io.i
  55.     include exec/memory.i
  56.     include    exec/execbase.i
  57.     include    hardware/intbits.i
  58.     include    graphics/gfxbase.i
  59.  
  60.     include    dos/dos.i
  61.     include    intuition/intuition.i
  62.     include    libraries/reqtools.i
  63.     include    libraries/ppbase.i
  64.     include    libraries/Powerpacker_lib.i
  65.     include    libraries/reqtools_lib.i
  66.     include    libraries/xpk.i
  67.     include    workbench/startup.i
  68.  
  69.  
  70.     include    misc/DevpacMacros.i
  71.     include    misc/Guru.i
  72.     include    misc/ps3m.i
  73.  
  74.     else
  75.  
  76.     incdir    include:
  77.     include    Guru.i
  78.     include    exec/types.i
  79.     include    ps3m.i
  80.  
  81.     include exec/io.i
  82.     include exec/memory.i
  83.     include    exec/execbase.i
  84. ;    include    lvo3.0/exec_lib.i
  85.     include    exec/exec_lib.i
  86.     include    hardware/intbits.i
  87.     include    graphics/gfxbase.i
  88.  
  89.     include    dos/dos.i
  90.     include    dos/dos_lib.i
  91.  
  92.     include    intuition/intuition_lib.i
  93. ;    include    lvo3.0/intuition_lib.i
  94.     include    intuition/intuition.i
  95.  
  96.     include    graphics/graphics_lib.i
  97. ;    include    lvo3.0/graphics_lib.i
  98.  
  99.     include    libraries/reqtools.i
  100.     include    libraries/reqtools_lib.i
  101.  
  102.     include    libraries/ppbase.i
  103.     include    libraries/Powerpacker_lib.i
  104.  
  105.     include    libraries/xpk.i
  106.  
  107.     include    libraries/diskfont_lib.i
  108.  
  109.     include    resources/cia_lib.i
  110.  
  111.     include    workbench/startup.i
  112.  
  113.     endc
  114.  
  115. ; Version macros
  116.     
  117. VER     macro
  118.     dc.b    'Version 3.13ß / 22.02.1996',10
  119.     endm
  120.  
  121. VERNUM    macro
  122.     dc.b    'PS3M 3.13ß'
  123.     endm
  124.  
  125. sVER    macro
  126.     dc.b    'Replay version 0.960/020+ / 22.02.1996 ',10,10
  127.     endm
  128.  
  129.  
  130. ; Traditional wait blitter -macro
  131.  
  132. wb    macro
  133.     btst    #14-8,2(a6)
  134.     bne.b    *-8
  135.     endm
  136.  
  137.  
  138. ; Some Intel-related macros
  139.  
  140. iword    macro
  141.     ror    #8,\1
  142.     endm
  143.  
  144. ilword    macro
  145.     ror    #8,\1
  146.     swap    \1
  147.     ror    #8,\1
  148.     endm
  149.  
  150. tlword    macro
  151.     move.b    \1,\2
  152.     ror.l    #8,\2
  153.     move.b    \1,\2
  154.     ror.l    #8,\2
  155.     move.b    \1,\2
  156.     ror.l    #8,\2
  157.     move.b    \1,\2
  158.     ror.l    #8,\2
  159.     endm
  160.  
  161. tword    macro
  162.     move.b    \1,\2
  163.     ror    #8,\2
  164.     move.b    \1,\2
  165.     ror    #8,\2
  166.     endm
  167.  
  168.  
  169.  
  170. ; Auto-detacher and command line parser
  171.  
  172.     section    detach,code
  173. CreateProc
  174.     Push    All
  175.  
  176.     BaseReg    data,a5
  177.     lea    data,a5
  178.  
  179.     Push    d0/a0
  180.  
  181.     sub.l    a1,a1
  182.     CLIB    Exec,FindTask
  183.     move.l    d0,a4
  184.  
  185.     moveq    #0,d7
  186.  
  187.     ifeq    fromasmone
  188.     tst.l   $ac(a4)
  189.     bne.b    .cli
  190.  
  191.     lea    $5c(a4),a0
  192.     CALL    WaitPort
  193.  
  194.     lea    $5c(a4),a0
  195.     CALL    GetMsg
  196.     move.l    d0,d7
  197.  
  198.     Pull    d0/a0
  199.     bra.b    .noparams
  200. .cli
  201.     endc
  202.  
  203.     Pull    d0/a0
  204.     move.l    a0,cmdline
  205.     clr.b    -1(a0,d0.l)
  206.     tst.b    (a0)
  207.     beq.b    .noparams
  208.     st    params(a5)
  209.  
  210. .noparams
  211.     lea    _DOSName(pc),a1
  212.     moveq    #0,d0
  213.     CALL    OpenLibrary
  214.     move.l    d0,_DOSBase(a5)
  215.  
  216.     tst    params(a5)
  217.     beq.b    .no
  218.     bsr    parsecmdline
  219.  
  220. .no    lea    _RTName(pc),a2
  221.     move.l    a2,a1
  222.     moveq    #0,d0
  223.     CLIB    Exec,OpenLibrary
  224.     move.l    d0,_RTBase(a5)
  225.     beq.b    print
  226.  
  227.     lea    _PPName(pc),a2
  228.     move.l    a2,a1
  229.     moveq    #0,d0
  230.     CALL    OpenLibrary
  231.     move.l    d0,_PPBase(a5)
  232.     beq.b    print
  233.  
  234.     ifne    fromasmone
  235.     Pull    All
  236.     jmp    alkuu
  237.     else
  238.  
  239.     move.l    pr_CurrentDir(a4),d1
  240.     beq.b    .oji
  241.     C5LIB    DOS,DupLock
  242.     move.l    d0,lock(a5)
  243.  
  244. .oji    move.l    #procname,d1
  245.     moveq    #-1,d2
  246.     lea    CreateProc-4(pc),a0
  247.     move.l    (a0),d3
  248.     move.l    d3,segment(a5)
  249.     clr.l   (a0)
  250.     move.l    #4096,d4
  251.     C5LIB    DOS,CreateProc
  252.     tst.l    d7
  253.     beq.b    poiss
  254.     CLIB    Exec,Forbid
  255.     move.l    d7,a1
  256.     CALL    ReplyMsg
  257.     endc
  258.  
  259. poiss    Pull    All
  260.     moveq    #0,d0
  261.     rts
  262.  
  263. ;; ERROR
  264.  
  265. print    lea    nolib(pc),a0
  266.     move.l    a0,d2
  267.     lea    nap-nolib(a0),a0
  268. .ll    move.b    (a2)+,(a0)+
  269.     bne.b    .ll
  270.     move.b    #10,-1(a0)
  271.     sub.l    d2,a0
  272.     move.l    a0,d3
  273. printa    C5LIB    DOS,Output
  274.     move.l    d0,d1
  275.      beq.b    poiss
  276.     CALL    Write
  277.     bra.b    poiss
  278.  
  279.  
  280. parsecmdline
  281.     move.l    cmdline(pc),a0
  282.  
  283. .argumentloop    
  284.     tst.b    (a0)
  285.     beq    .exit
  286.     cmp.b    #' ',(a0)
  287.     bne.b    .juu
  288.     addq.l    #1,a0
  289.     bra.b    .argumentloop
  290.  
  291. .juu    cmp.b    #'?',(a0)
  292.     beq    .apua
  293.  
  294.     cmp.b    #'-',(a0)
  295.     bne    .filename
  296.  
  297. .optio    addq.l    #1,a0
  298.     move.b    (a0),d0
  299.     cmp.b    #'Z',d0
  300.     bhs.b    .eid
  301.     add.b    #'a'-'A',d0
  302. .eid
  303.     cmp.b    #'r',(a0)
  304.     beq.b    .rate
  305.  
  306.     cmp.b    #'v',(a0)
  307.     beq.b    .boost
  308.  
  309.     cmp.b    #'m',(a0)
  310.     beq.b    .pmode
  311.  
  312.     cmp.b    #'s',(a0)
  313.     bne    .inva
  314.  
  315. .system    addq.l    #1,a0
  316.  
  317.     moveq    #0,d0
  318.     move.b    (a0)+,d0
  319.     sub    #'0'-1,d0    
  320.     cmp    #DISABLED,d0
  321.     blt    .inva
  322.     cmp    #ENABLED,d0
  323.     bgt    .inva
  324.     move    d0,fstate(a5)
  325.     addq    #8,forced(a5)
  326.     bra.b    .skip
  327.  
  328. .pmode    addq.l    #1,a0
  329.     moveq    #0,d0
  330.     move.b    (a0)+,d0
  331.     sub    #'0'-1,d0
  332.     cmp    #SURROUND,d0
  333.     blt.b    .inva
  334.     cmp    #STEREO14,d0
  335.     bgt.b    .inva
  336.  
  337.     move    d0,fpmode(a5)
  338.     addq    #4,forced(a5)
  339.     bra.b    .skip
  340.  
  341. .boost    addq.l    #1,a0
  342.     moveq    #0,d0
  343.     move.b    (a0)+,d0
  344.     sub.b    #'0',d0
  345.     bmi.b    .inva
  346.     cmp    #8,d0
  347.     bhi.b    .inva
  348.  
  349.     move.l    d0,fboost(a5)
  350.     addq    #2,forced(a5)
  351.     bra.b    .skip
  352.  
  353. .rate    addq.l    #1,a0
  354.     moveq    #0,d1
  355. .los    moveq    #0,d0
  356.     move.b    (a0)+,d0
  357.     beq.b    .lop
  358.     cmp    #' ',d0
  359.     beq.b    .lop
  360.  
  361.     sub    #'0',d0
  362.     bmi.b    .inva
  363.     cmp    #9,d0
  364.     bgt.b    .inva
  365.     mulu    #10,d1
  366.     add    d0,d1
  367.     bra.b    .los
  368.  
  369. .lop    cmp.l    #4000,d1
  370.     blt.b    .inva
  371.  
  372.     cmp.l    #56000,d1
  373.     bgt.b    .inva
  374.  
  375.     move.l    d1,frate(a5)
  376.     addq    #1,forced(a5)
  377.  
  378. .skip    tst.b    (a0)
  379.     beq.b    .exit
  380.     cmp.b    #' ',(a0)+
  381.     bne.b    .skip
  382.     bra    .argumentloop
  383.  
  384. .inva    lea    invalid(pc),a0
  385.     bra.b    .qq
  386.  
  387. .filename
  388.     lea    fname2,a1
  389.     cmp.b    #'"',(a0)
  390.     beq.b    .quotes
  391. .loo    move.b    (a0)+,d0
  392.     move.b    d0,(a1)+
  393.     beq.b    .findmodulename
  394.     cmp.b    #' ',d0
  395.     bne.b    .loo
  396.     clr.b    -1(a1)
  397.     bra.b    .findmodulename
  398.  
  399. .quotes    addq.l    #1,a0
  400. .luu    move.b    (a0)+,d0
  401.     move.b    d0,(a1)+
  402.     beq.b    .findmodulename
  403.     cmp.b    #'"',d0
  404.     bne.b    .luu
  405.     clr.b    -1(a1)
  406.  
  407. .findmodulename
  408.     lea    fname,a3
  409.     lea    fname2,a2
  410. .search    move.b    -(a1),d0
  411.     cmp.b    #':',d0
  412.     beq.b    .found
  413.     cmp.b    #'/',d0
  414.     beq.b    .found
  415.     cmp.l    a1,a2
  416.     bne.b    .search
  417.     subq.l    #1,a1
  418. .found
  419.     addq.l    #1,a1
  420. .cp    move.b    (a1)+,(a3)+
  421.     bne.b    .cp
  422.     bra    .argumentloop
  423.  
  424. .exit    tst.b    fname2
  425.     beq.b    .apu
  426.     rts
  427.  
  428. .apu
  429. .apua    lea    usage(pc),a0
  430. .qq    move.l    a0,d2
  431. .ll    tst.b    (a0)+
  432.     bne.b    .ll
  433.     sub.l    d2,a0
  434.     move.l    a0,d3
  435.     addq.l    #4,sp            ; skip return
  436.     bra    printa
  437.  
  438. cmdline    dc.l    0
  439.  
  440. ver    dc.b    '$VER: PS3M '
  441.     VER
  442.     dc.b    0
  443.  
  444. procname dc.b    'PS3M!',0
  445. nolib    dc.b    'You need '
  446. nap    dcb.b    21
  447. invalid    dc.b    'Invalid command line option!',10,10
  448. usage    dc.b    'PS3M '
  449.     VER
  450.     sVER
  451.     dc.b    'Usage: PS3M [options] [filename] [options]',10
  452.     dc.b    'Options: -r##### Mixing rate (default 16000)',10
  453.     dc.b    '         -v#     Volume boost (default 0)',10
  454.     dc.b    '         -m#     Playing mode:',10
  455.     dc.b    '                 0 = Surround (default)',10
  456.     dc.b    '                 1 = Stereo',10
  457.     dc.b    '                 2 = Mono',10
  458.     dc.b    '                 3 = Real surround',10
  459.     dc.b    '                 4 = 14-bit stereo',10
  460.     dc.b    '         -s#     System state:',10
  461.     dc.b    '                 0 = Disabled (default)',10
  462.     dc.b    '                 1 = Enabled',10,0
  463.  
  464. _DOSName DOSNAME
  465. _RTName REQTOOLSNAME
  466. _PPName    PPNAME
  467.  
  468.  
  469.  
  470. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  471. ;­   PS3M - The S3M Player  ­
  472. ;­     Version 3.12ß        ­
  473. ;­ © 1994-96 Jarno Paananen ­
  474. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  475.  
  476.     section    PS3M,code
  477. alkuu    movem.l    d0-a6,-(sp)
  478.  
  479.     lea    data,a5
  480.  
  481.     sub.l    a1,a1
  482.     CLIB    Exec,FindTask
  483.     move.l    d0,task(a5)
  484.  
  485.     lea    _XpkName(a5),a1
  486.     moveq    #0,d0
  487.     CALL    OpenLibrary
  488.     move.l    d0,_XpkBase(a5)
  489.  
  490.     moveq    #-1,d0
  491.     CALL    AllocSignal
  492.     move.l    d0,signaali(a5)
  493.     bmi    exit
  494.  
  495.     move.l    lock(a5),d1
  496.     beq.b    .ohitaaa
  497.     C5LIB    DOS,CurrentDir
  498.  
  499. .ohitaaa
  500.     move.l    _RTBase(a5),a1
  501.     move.l    rt_GfxBase(a1),_GFXBase(a5)
  502.     move.l    rt_IntuitionBase(a1),_IntBase(a5)
  503.  
  504.     lea    configname(a5),a0
  505.     moveq    #2,d0
  506.     moveq    #MEMF_PUBLIC,d1
  507.     lea    config(a5),a1
  508.     lea    conlen(a5),a2
  509.     sub.l    a3,a3
  510.     bsr    LoadData
  511.  
  512.     clr    noconf(a5)
  513.  
  514.     tst.l    d0
  515.     bpl.b    .pe
  516.  
  517.     st    noconf(a5)
  518.  
  519. .pe    tst    noconf(a5)
  520.     bne.b    .skiba
  521.  
  522.     btst    #2,forced+1(a5)
  523.     bne.b    .q1
  524.     bsr    GetPlayMode
  525.     move    d0,pmode(a5)
  526.     btst    #2,forced+1(a5)
  527.     beq.b    .q1
  528.     move    d0,fpmode(a5)
  529. .q1    btst    #3,forced+1(a5)
  530.     bne.b    .q1
  531.     bsr    GetSystemState
  532.     move    d0,system(a5)
  533.     btst    #3,forced+1(a5)
  534.     beq.b    .q2
  535.     move    d0,fstate(a5)
  536. .q2
  537.     bsr    GetDefaultRate
  538.     move.l    d0,mixingrate(a5)
  539.  
  540.     bsr    GetDefaultBoost
  541.     move.l    d0,vboost(a5)
  542.  
  543.     bsr    GetBufferSize
  544.  
  545.     bsr    GetBanner
  546.  
  547.     bsr    GetFont
  548.  
  549. .skiba    C5LIB    Int,OpenWorkBench
  550.     move.l    d0,a0
  551.     move.l    a0,wbscr(a5)
  552.  
  553.     moveq    #0,d0
  554.     move.b    sc_BarHeight(a0),d0
  555.     move    d0,bar(a5)
  556.     add.b    sc_WBorTop(a0),d0
  557.     add    d0,winstr+6(a5)
  558.     move    d0,topbor(a5)
  559.  
  560.     move    sc_Width(a0),d0
  561.     asr    #1,d0
  562.     move    winstr+4(a5),d1
  563.     asr    #1,d1
  564.     sub    d1,d0
  565.     move    d0,winstr(a5)
  566.  
  567.     move    sc_Height(a0),d0
  568.     asr    #1,d0
  569.     move    winstr+6(a5),d1
  570.     asr    #1,d1
  571.     sub    d1,d0
  572.     move    d0,winstr+2(a5)
  573.  
  574.     tst    params(a5)
  575.     bne.b    conttaa
  576.  
  577.     tst    bann(a5)
  578.     bne.b    conttaa
  579.  
  580.     lea    alkutext(a5),a1
  581.     lea    tags(a5),a0
  582.     sub.l    a3,a3
  583.     move.l    a3,a4
  584.     lea    contta2(a5),a2
  585.     C5LIB    RT,rtEZRequestA
  586.     tst.l    d0
  587.     bne.b    .nexit
  588.     bra    exit
  589.  
  590. .nexit    subq.l    #1,d0
  591.     beq.b    conttaa
  592.  
  593.     lea    alkutext2(a5),a1
  594.     lea    tags(a5),a0
  595.     sub.l    a3,a3
  596.     move.l    a3,a4
  597.     lea    contta(a5),a2
  598.     C5LIB    RT,rtEZRequestA
  599.  
  600. conttaa    lea    winstr(a5),a0
  601.     C5LIB    Int,OpenWindow
  602.     move.l    d0,winpoin(a5)
  603.     beq    exit
  604.  
  605.     move.l    d0,a0
  606.     move.l    wd_RPort(a0),rast(a5)
  607.  
  608.     bsr    drawtexture
  609.  
  610. event    moveq    #23,d0
  611.     lea    nimi(a5),a0
  612. .spc    move.b    #' ',(a0)+
  613.     dbf    d0,.spc
  614.  
  615.     lea    Name(a5),a0
  616.     move.l    winpoin(a5),a1
  617.     sub.l    a2,a2
  618.     moveq    #1,d0
  619.     C5LIB    Int,RefreshGList
  620.  
  621.     move.l    winpoin(a5),a0
  622.     lea    winname(a5),a1
  623.     lea    scrname(a5),a2
  624.     CALL    SetWindowTitles
  625.  
  626.     and    #~SELECTED,Pause+12(a5)
  627.     and    #~SELECTED,Mute+12(a5)
  628.  
  629.     lea    Pause(a5),a0
  630.     move.l    winpoin(a5),a1
  631.     sub.l    a2,a2
  632.     moveq    #1,d0
  633.     CALL    RefreshGList
  634.  
  635.     lea    position(a5),a0
  636.     move.l    winpoin(a5),a1
  637.     sub.l    a2,a2
  638.     moveq    #AUTOKNOB!FREEHORIZ!PROPBORDERLESS!PROPNEWLOOK,d0
  639.     moveq    #0,d1
  640.     moveq    #0,d2
  641.     moveq    #-1,d3
  642.     moveq    #-1,d4
  643.     moveq    #1,d5
  644.     CALL    NewModifyProp
  645.  
  646.     lea    position(a5),a0
  647.     move.l    winpoin(a5),a1
  648.     sub.l    a2,a2
  649.     moveq    #1,d0
  650.     CALL    RefreshGList
  651.  
  652.     tst    params(a5)
  653.     bne    lataa
  654.     
  655. event2    moveq    #0,d7
  656.     sub.l    a4,a4
  657.  
  658.     move.l    winpoin(a5),a0
  659.     move.l    wd_UserPort(a0),a2
  660.     move.b    15(a2),d1
  661.     moveq    #0,d0
  662.     bset    d1,d0
  663.     bset    #CTRL_C,d0
  664.     CLIB    Exec,Wait
  665.     move.l    d0,d6
  666. eventloop
  667.     move.l    a2,a0
  668.     CALL    GetMsg
  669.     tst.l    d0
  670.     beq.b    eventdone
  671.  
  672.     move.l    d0,a1
  673.  
  674.     moveq    #0,d7
  675.     cmpi.l    #INTUITICKS,im_Class(a1)
  676.     bne.b    .aj
  677.     moveq    #1,d7
  678.     bra.b    .rep
  679. .aj
  680.     move.l    im_Class(a1),d2
  681.     move    im_Code(a1),d3
  682.     move.l    im_IAddress(a1),a4
  683. .rep    CALL    ReplyMsg
  684.     bra.b    eventloop
  685.  
  686. eventdone
  687.     btst    #CTRL_C,d6
  688.     bne.b    closeup
  689.         
  690.     tst    d7
  691.     beq.b    kidp
  692.  
  693.     move    gvolume+12(a5),d0
  694.     and    #SELECTED,d0
  695.     beq.b    kidp
  696.     bsr    saataa
  697.  
  698. kidp    cmp.l    #GADGETUP,d2
  699.     beq    Painettu
  700.  
  701.     cmp.l    #MOUSEBUTTONS,d2
  702.     beq.b    button
  703.  
  704. .aj    cmp.l    #CLOSEWINDOW,d2
  705.     bne    event2
  706.  
  707. closeup    move.l    winpoin(a5),a0
  708.     C5LIB    Int,CloseWindow
  709.     clr.l    winpoin(a5)
  710.     bra    exit
  711.  
  712. button    cmp    #MENUDOWN,d3
  713.     bne    event2
  714.  
  715.     not    zoomstate(a5)
  716.     bne    pienenna
  717.  
  718.     move.l    winpoin(a5),a0
  719.     move    wd_TopEdge(a0),d0
  720.     add    winstr+6(a5),d0
  721.  
  722.     move.l    wbscr(a5),a1
  723.     cmp    sc_Height(a1),d0
  724.     blt.b    .ok
  725.  
  726.     move    sc_Height(a1),d1
  727.     sub    d0,d1
  728.     ext.l    d1
  729.     moveq    #0,d0
  730.     C5LIB    Int,MoveWindow
  731.  
  732.     move.l    winpoin(a5),a0
  733.  
  734. .ok    move    winstr+6(a5),d1
  735.     sub    bar(a5),d1
  736.     subq    #1,d1
  737.     moveq    #0,d0
  738.     C5LIB    Int,SizeWindow
  739.  
  740.     bsr.b    waitsize
  741.     pea    event2(pc)
  742.     bra    drawtexture
  743.  
  744. waitsize
  745.     moveq    #0,d7
  746. wsize    move.l    winpoin(a5),a0
  747.     move.l    wd_UserPort(a0),a2
  748.     move.b    15(a2),d1
  749.     moveq    #0,d0
  750.     bset    d1,d0
  751.     CLIB    Exec,Wait
  752.  
  753. .loop    move.l    a2,a0
  754.     CALL    GetMsg
  755.     tst.l    d0
  756.     beq.b    eventd
  757.  
  758.     move.l    d0,a1
  759.     move.l    im_Class(a1),d2
  760.     cmp.l    #NEWSIZE,d2
  761.     bne.b    .ksl
  762.     moveq    #1,d7
  763. .ksl    CALL    ReplyMsg
  764.     bra.b    .loop
  765.  
  766. eventd    tst    d7
  767.     beq.b    wsize
  768.     rts
  769.  
  770. pienenna
  771.     move.l    winpoin(a5),a0
  772.     lea    gvolume(a5),a1
  773.     moveq    #GADGETS,d0
  774.     C5LIB    Int,RemoveGList
  775.  
  776.     move    winstr+6(a5),d1
  777.     sub    bar(a5),d1
  778.     neg    d1
  779.     addq    #1,d1
  780.     moveq    #0,d0
  781.     move.l    winpoin(a5),a0
  782.     CALL    SizeWindow
  783.     bra    event2
  784.  
  785. Painettu
  786.     cmp.l    #gvolume,a4
  787.     bne.b    .ed
  788.  
  789.     pea    event2(pc)
  790.     bra    saataa
  791.  
  792. .ed    cmp.l    #Name,a4
  793.     bne.b    .dd
  794.     pea    event2(pc)
  795.     bra    aboutti
  796.  
  797. .dd    cmp.l    #Prefs,a4
  798.     bne.b    .ddq
  799.  
  800.     pea    event2(pc)
  801.     bra    override
  802.  
  803. .ddq    cmp.l    #Play,a4
  804.     bne    event2
  805.  
  806.  
  807.  
  808. ****  playmodule
  809. modplayer
  810.     move.l    s3m(a5),d0
  811.     beq.b    dnid
  812.     move.l    d0,a1
  813.     move.l    s3mlen(a5),d0
  814.     CLIB    Exec,FreeMem
  815.     clr.l    s3m(a5)
  816.  
  817. dnid    tst.l    reqptr(a5)
  818.     bne.b    .kej
  819.  
  820.     sub.l    a0,a0
  821.     moveq    #RT_FILEREQ,d0
  822.     C5LIB    RT,rtAllocRequestA
  823.     move.l    d0,reqptr(a5)
  824.     bne.b    .okei
  825.  
  826.     lea    outofmemory(a5),a0
  827.     bsr    error
  828.     bra    event2
  829.  
  830. .okei    tst    noconf(a5)
  831.     bne.b    .kej
  832.  
  833.     bsr    GetDefaultDir
  834.     tst.l    d0
  835.     beq.b    .kej
  836.  
  837.     move.l    reqptr(a5),a1
  838.     lea    diretags(a5),a0
  839.     move.l    d0,4(a0)            ; Set directory
  840.     CALL    rtChangeReqAttrA
  841.  
  842. .kej    move.l    reqptr(a5),a1
  843.     lea    playtags(a5),a0
  844.     lea    fname,a2
  845.     lea    title7(a5),a3
  846.     C5LIB    RT,rtFileRequestA
  847.     tst.l    d0
  848.     beq    event2
  849.  
  850.     move.l    d0,a2
  851.     move.l    reqptr(a5),a0
  852.     move.l    rtfi_Dir(a0),a1
  853.     move.l    a2,a0
  854.     bsr    NewProgram
  855.  
  856.     move.l    d0,program(a5)
  857.     move    d1,maxfile(a5)
  858.     clr    progpos(a5)
  859.  
  860.     move.l    a2,a0
  861.     C5LIB    RT,rtFreeFileList
  862.  
  863. nextafile
  864.     move.l    program(a5),a0
  865.     move    progpos(a5),d0
  866.     bsr    GetName
  867.  
  868.     move.l    d0,a0
  869.     lea    fname2,a1
  870. .lopa    move.b    (a0)+,(a1)+
  871.     bne.b    .lopa
  872.  
  873.     lea    fname,a1
  874.     lea    fname2,a2
  875.     move.l    a2,a3
  876. .find    move.b    (a3)+,d0
  877.     beq.b    nimee2
  878.     cmp.b    #'/',d0
  879.     beq.b    .pathia
  880.     cmp.b    #':',d0
  881.     bne.b    .find
  882. .pathia    move.l    a3,a2
  883.     bra.b    .find
  884. nimee2    move.b    (a2)+,(a1)+
  885.     bne.b    nimee2
  886.  
  887. lataa    lea    fname2,a0
  888.     moveq    #2,d0
  889.     moveq    #MEMF_PUBLIC,d1
  890.     lea    s3m(a5),a1
  891.     lea    s3mlen(a5),a2
  892.     sub.l    a3,a3
  893.     bsr    LoadData
  894.     tst.l    d0
  895.     beq.b    okeei
  896.  
  897. moka    C5LIB    PP,ppErrorMessage
  898.     move.l    d0,a0
  899.     bsr    error
  900.     clr.l    s3m(a5)
  901.     clr    PS3M_eject(a5)
  902.     tst    params(a5)
  903.     bne    exit
  904.     bra    ejecti
  905.  
  906. okeei    clr    PS3M_initialized(a5)
  907.     clr    PS3M_reinit(a5)
  908. hepoinen
  909.     clr    PS3M_eject(a5)
  910.     clr    PS3M_position(a5)
  911.     clr    PS3M_play(a5)
  912.  
  913.     move.l    a5,-(sp)
  914.     bsr    init
  915.     move.l    (sp)+,a5
  916.     tst    d0
  917.     bne    errore
  918.  
  919.     st    PS3M_play(a5)
  920.     clr    PS3M_paused(a5)
  921.  
  922.     lea    btitle,a0
  923.     move.l    #'00:0',(a0)+
  924.     move    #'0 ',(a0)+
  925.     move.l    mname(a5),a1
  926. .lep    move.b    (a1)+,(a0)+
  927.     bne.b    .lep
  928.  
  929. happo    move.l    mname(a5),a1
  930.     lea    nimi(a5),a0
  931.     moveq    #23,d0
  932. .copy    tst.b    (a1)
  933.     beq.b    spacee
  934.     move.b    (a1)+,(a0)+
  935.     dbf    d0,.copy
  936.     bra.b    lu9
  937.  
  938. spacee    move.b    #' ',(a0)+
  939.     dbf    d0,spacee
  940.  
  941. lu9    move.l    winpoin(a5),a0
  942.     lea    btitle,a1
  943.     lea    scrname(a5),a2
  944.     C5LIB    Int,SetWindowTitles
  945.  
  946.     and    #~SELECTED,Pause+12(a5)
  947.     and    #~SELECTED,Mute+12(a5)
  948.  
  949.     tst    zoomstate(a5)
  950.     bne.b    soii
  951.  
  952.     lea    Name(a5),a0
  953.     move.l    winpoin(a5),a1
  954.     sub.l    a2,a2
  955.     moveq    #1,d0
  956.     C5LIB    Int,RefreshGList
  957.  
  958.     lea    Pause(a5),a0
  959.     move.l    winpoin(a5),a1
  960.     sub.l    a2,a2
  961.     moveq    #1,d0
  962.     C5LIB    Int,RefreshGList
  963.  
  964. soii    tst    PS3M_initialized(a5)
  965.     bne.b    .kej2
  966.  
  967.     st    PS3M_initialized(a5)
  968.  
  969.     tst    noconf(a5)
  970.     bne.b    .kej2
  971.  
  972.     bsr    CheckChannelSettings
  973.     bsr    CheckSpecific
  974.  
  975. .kej2    move    forced(a5),d0
  976.     btst    #0,d0
  977.     beq.b    .nrate
  978.     move.l    frate(a5),mixingrate(a5)
  979. .nrate
  980.     btst    #1,d0
  981.     beq.b    .nboost
  982.     move.l    fboost(a5),vboost(a5)
  983. .nboost
  984.     btst    #2,d0
  985.     beq.b    .npmode
  986.     move    fpmode(a5),pmode(a5)
  987. .npmode
  988.     btst    #3,d0
  989.     beq.b    .nsstate
  990.     move    fstate(a5),system(a5)
  991. .nsstate
  992.     move    system(a5),fstate(a5)
  993.     move    pmode(a5),fpmode(a5)
  994.  
  995.     move.l    buffSize(a5),d0
  996.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  997.     CLIB    Exec,AllocMem
  998.     move.l    d0,buff1(a5)
  999.     beq    .memerr
  1000.  
  1001.     move.l    buffSize(a5),d0
  1002.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  1003.     CALL    AllocMem
  1004.     move.l    d0,buff2(a5)
  1005.     beq    .memerr
  1006.  
  1007.     move.l    #66*256,d7            ; Volume tab size
  1008.  
  1009.     cmp    #REAL,pmode(a5)
  1010.     beq.b    .varaa
  1011.     cmp    #STEREO14,pmode(a5)
  1012.     bne.b    .ala2
  1013.  
  1014. .varaa    move.l    buffSize(a5),d0
  1015.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  1016.     CLIB    Exec,AllocMem
  1017.     move.l    d0,buff3(a5)
  1018.     beq.b    .memerr
  1019.  
  1020.     move.l    buffSize(a5),d0
  1021.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  1022.     CALL    AllocMem
  1023.     move.l    d0,buff4(a5)
  1024.     beq.b    .memerr
  1025.  
  1026. .ala2    cmp    #STEREO14,pmode(a5)
  1027.     beq.b    .bit14
  1028.  
  1029.     moveq    #0,d0
  1030.     move    maxchan(a5),d1
  1031.     move.l    #256,d2
  1032.     subq    #1,d1
  1033. .ll    add.l    d2,d0
  1034.     add.l    #256,d2
  1035.     dbf    d1,.ll
  1036.  
  1037.     move.l    d0,dtabsize(a5)
  1038.     moveq    #MEMF_PUBLIC,d1
  1039.     CALL    AllocMem
  1040.     move.l    d0,dtab(a5)
  1041.     beq.b    .memerr    
  1042.     bra.b    .alavaraa
  1043.  
  1044. .bit14    move.l    #66*256*2,d7            ; Volume tab size
  1045.  
  1046.     move.l    #64*1024,d0
  1047.     moveq    #MEMF_PUBLIC,d1
  1048.     CALL    AllocMem
  1049.     move.l    d0,buff14(a5)
  1050.     bne.b    .alavaraa
  1051.  
  1052. .memerr    lea    outofmemory(a5),a0
  1053.     bsr    error
  1054.     bra    ejecti
  1055.  
  1056. .alavaraa
  1057.     move.l    d7,d0
  1058.     moveq    #MEMF_PUBLIC,d1
  1059.     CALL    AllocMem
  1060.     move.l    d0,vtab(a5)
  1061.     beq.b    .memerr
  1062.  
  1063.     add.l    #255,d0
  1064.     and.l    #~$ff,d0
  1065.     move.l    d0,vtabaddr(a5)
  1066.  
  1067.     clr    params(a5)
  1068.  
  1069.     cmp    #DISABLED,system(a5)
  1070.     bne.b    syssy
  1071.  
  1072.     clr    PS3M_cont(a5)
  1073.  
  1074. kala    jsr    s3mPlay
  1075.  
  1076.     bsr    positio
  1077.  
  1078.     or    #SELECTED,Pause+12(a5)
  1079.  
  1080.     lea    Pause(a5),a0
  1081.     move.l    winpoin(a5),a1
  1082.     sub.l    a2,a2
  1083.     moveq    #1,d0
  1084.     C5LIB    Int,RefreshGList
  1085.  
  1086.     move.l    winpoin(a5),a0
  1087.     move.l    wd_UserPort(a0),a2
  1088.  
  1089. .ksa    move.l    a2,a0
  1090.     CLIB    Exec,GetMsg
  1091.     tst.l    d0
  1092.     beq.b    pevent
  1093.  
  1094.     move.l    d0,a1
  1095.     CALL    ReplyMsg
  1096.     bra.b    .ksa
  1097.  
  1098. syssy    clr    PS3M_cont(a5)
  1099.  
  1100.     ifeq    fromasmone
  1101.     move.l    #winname,d1
  1102.     moveq    #9,d2
  1103.     lea    alkuu-4,a0            ; SYSTEM SECTION
  1104.                         ; !MUST! BE AFTER MAIN SECTION
  1105.     move.l    (a0),d3
  1106.     move.l    #4096,d4
  1107.     C5LIB    DOS,CreateProc
  1108.  
  1109.     else
  1110.  
  1111.     jsr    syss3mPlay
  1112.  
  1113.     endc
  1114.  
  1115.     clr.l    timethisfar(a5)
  1116.  
  1117.     move.l    #dates,d1
  1118.     C5LIB    DOS,DateStamp
  1119.     move.l    dates+4(a5),d0
  1120.     mulu    #50*60,d0
  1121.     add.l    d0,fifties(a5)
  1122.  
  1123.     tst    zoomstate(a5)
  1124.     bne.b    pevent
  1125.  
  1126.     bsr    positio
  1127.  
  1128. pevent    sub.l    a4,a4
  1129.     moveq    #0,d7
  1130.     move.l    winpoin(a5),a0
  1131.     move.l    wd_UserPort(a0),a2
  1132.     move.b    15(a2),d1
  1133.     moveq    #0,d0
  1134.     bset    d1,d0
  1135.     move.l    d0,d3
  1136.     move.l    signaali(a5),d1
  1137.     bset    d1,d0
  1138.     bset    #CTRL_C,d0
  1139.     CLIB    Exec,Wait
  1140.  
  1141.     move.l    d0,d6
  1142. kilke
  1143.     and.l    d0,d3
  1144.     bne.b    ksa
  1145.  
  1146.     tst    PS3M_poscha(a5)
  1147.     beq.b    .ll
  1148.  
  1149.     bsr    positio
  1150.     clr    PS3M_poscha(a5)
  1151.     tst    PS3M_break(a5)
  1152.     bne.b    .k
  1153.  
  1154. .ll    tst    paivita(a5)
  1155.     bne.b    heppi
  1156.     bra.b    pevent
  1157.  
  1158. .k    clr    PS3M_break(a5)
  1159.     cmp    #1,maxfile(a5)
  1160.     beq.b    pevent
  1161.     bra    piisiloppu
  1162.  
  1163. ksa    move.l    a2,a0
  1164.     CALL    GetMsg
  1165.     tst.l    d0
  1166.     beq    pedone
  1167.  
  1168.     move.l    d0,a1
  1169.     cmpi.l    #INTUITICKS,im_Class(a1)
  1170.     bne.b    .aj
  1171.     moveq    #1,d7
  1172.     bra.b    .rep
  1173.  
  1174. .aj    move.l    im_Class(a1),d2
  1175.     move    im_Code(a1),d3
  1176.     move.l    im_IAddress(a1),a4
  1177. .rep    CALL    ReplyMsg
  1178.     bra.b    ksa
  1179.  
  1180. heppi    btst    #CTRL_C,d6
  1181.     bne    closeup2
  1182.  
  1183.     clr    paivita(a5)
  1184.     tst    PS3M_paused(a5)
  1185.     bne    pevent
  1186.     tst    PS3M_play(a5)
  1187.     beq    pevent
  1188.     move.l    #dates2,d1
  1189.     C5LIB    DOS,DateStamp
  1190.     move.l    dates2+4(a5),d0
  1191.     mulu    #50*60,d0
  1192.     add.l    fifties2(a5),d0
  1193.     sub.l    fifties(a5),d0
  1194.  
  1195.     lea    btitle,a0
  1196.     move.l    a0,a1
  1197.  
  1198.     divu    #50,d0
  1199.     swap    d0
  1200.     clr    d0
  1201.     swap    d0
  1202.     add.l    timethisfar(a5),d0
  1203.     cmp.l    oldsec(a5),d0
  1204.     beq    pevent
  1205.     move.l    d0,oldsec(a5)
  1206.  
  1207.     divu    #60,d0
  1208.     swap    d0
  1209.     moveq    #0,d1
  1210.     move    d0,d1
  1211.     clr    d0
  1212.     swap    d0
  1213.  
  1214.     divu    #10,d0
  1215.     add.b    #'0',d0
  1216.     move.b    d0,(a0)+
  1217.     swap    d0
  1218.     add.b    #'0',d0
  1219.     move.b    d0,(a0)+
  1220.     addq.l    #1,a0
  1221.  
  1222.     divu    #10,d1
  1223.     add.b    #'0',d1
  1224.     move.b    d1,(a0)+
  1225.     swap    d1
  1226.     add.b    #'0',d1
  1227.     move.b    d1,(a0)
  1228.         
  1229.     move.l    winpoin(a5),a0
  1230.     moveq    #-1,d0
  1231.     move.l    d0,a2
  1232.     C5LIB    Int,SetWindowTitles
  1233.     bra    pevent
  1234.  
  1235. pedone    tst    d7
  1236.     beq.b    .kidp
  1237.  
  1238.     move    gvolume+12(a5),d0
  1239.     and    #SELECTED,d0
  1240.     beq.b    .kidp
  1241.     bsr    saataa
  1242.  
  1243. .kidp    cmp.l    #GADGETUP,d2
  1244.     beq    spainettu
  1245.  
  1246.     cmp.l    #MOUSEBUTTONS,d2
  1247.     beq.b    button2
  1248.  
  1249.     cmp.l    #CLOSEWINDOW,d2
  1250.     bne    pevent
  1251.  
  1252. closeup2
  1253.     move.l    winpoin(a5),a0
  1254.     C5LIB    Int,CloseWindow
  1255.     clr.l    winpoin(a5)
  1256.  
  1257.     pea    exit(pc)
  1258.     bra    lopeta
  1259.  
  1260. button2    cmp    #MENUDOWN,d3
  1261.     bne    pevent
  1262.  
  1263.     not    zoomstate(a5)
  1264.     bne.b    pienenna2
  1265.  
  1266.     move.l    winpoin(a5),a0
  1267.     move    wd_TopEdge(a0),d0
  1268.     add    winstr+6(a5),d0
  1269.  
  1270.     move.l    wbscr(a5),a1
  1271.     cmp    sc_Height(a1),d0
  1272.     blt.b    .ok
  1273.  
  1274.     move    sc_Height(a1),d1
  1275.     sub    d0,d1
  1276.     ext.l    d1
  1277.     moveq    #0,d0
  1278.     C5LIB    Int,MoveWindow
  1279.     move.l    winpoin(a5),a0
  1280.  
  1281. .ok    move    winstr+6(a5),d1
  1282.     sub    bar(a5),d1
  1283.     subq    #1,d1
  1284.     moveq    #0,d0
  1285.     C5LIB    Int,SizeWindow
  1286.  
  1287.     move.l    winpoin(a5),a0
  1288.     lea    btitle,a1
  1289.     lea    scrname(a5),a2
  1290.     CALL    SetWindowTitles
  1291.  
  1292.     bsr    waitsize
  1293.  
  1294.     bsr    drawtexture
  1295.     pea    pevent(pc)
  1296.     bra.b    positio
  1297.  
  1298. pienenna2
  1299.     move.l    winpoin(a5),a0
  1300.     lea    gvolume(a5),a1
  1301.     moveq    #GADGETS,d0
  1302.     C5LIB    Int,RemoveGList
  1303.  
  1304.     move    winstr+6(a5),d1
  1305.     sub    bar(a5),d1
  1306.     neg    d1
  1307.     addq    #1,d1
  1308.     moveq    #0,d0
  1309.     move.l    winpoin(a5),a0
  1310.     CALL    SizeWindow
  1311.  
  1312.     move.l    winpoin(a5),a0
  1313.     lea    btitle,a1
  1314.     lea    scrname(a5),a2
  1315.     CALL    SetWindowTitles
  1316.     bra    pevent
  1317.  
  1318. positio    clr    PS3M_poscha(a5)
  1319.  
  1320.     move    PS3M_position(a5),d0
  1321.     mulu    #-1,d0
  1322.     move    positioneita(a5),d1
  1323.     subq    #1,d1
  1324.     beq.b    kieldi
  1325.     divu    d1,d0
  1326.     move    d0,d1
  1327.  
  1328. kieldi    moveq    #-1,d0
  1329.     clr    d0
  1330.     swap    d0
  1331.     divu    positioneita(a5),d0
  1332.     move    d0,d3
  1333.  
  1334.     lea    position(a5),a0
  1335.     move.l    winpoin(a5),a1
  1336.     sub.l    a2,a2
  1337.  
  1338.     moveq    #AUTOKNOB!FREEHORIZ!PROPBORDERLESS!PROPNEWLOOK,d0
  1339.     moveq    #0,d2
  1340.     moveq    #-1,d4
  1341.     moveq    #1,d5
  1342.     C5LIB    Int,NewModifyProp
  1343.     rts
  1344.  
  1345. spainettu
  1346.     cmp.l    #Name,a4
  1347.     bne.b    .dd
  1348.     pea    pevent(pc)
  1349.     bra    aboutti
  1350.  
  1351. .dd    cmp.l    #Prg,a4
  1352.     beq    prog
  1353.  
  1354.     cmp.l    #Next,a4
  1355.     beq    piisiloppu
  1356.  
  1357.     cmp.l    #Prev,a4
  1358.     beq    edellinen
  1359.  
  1360.     cmp.l    #Pause,a4
  1361.     beq    pause
  1362.  
  1363.     cmp.l    #PosGad,a4
  1364.     beq    alusta
  1365.  
  1366.     cmp.l    #Mute,a4
  1367.     beq    smute
  1368.  
  1369.     cmp.l    #position,a4
  1370.     beq    jump
  1371.  
  1372.     cmp.l    #Prefs,a4
  1373.     beq    pref1
  1374.  
  1375.     cmp.l    #Play,a4
  1376.     bne.b    .ek2
  1377.  
  1378.     move.l    program(a5),d0
  1379.     beq    stopa
  1380.     move.l    d0,a0
  1381.     bsr    FreeProgram
  1382.     clr.l    program(a5)
  1383.  
  1384.     bsr    lopeta
  1385.  
  1386.     move.l    s3m(a5),d0
  1387.     beq.b    .nomem
  1388.     move.l    d0,a1
  1389.     move.l    s3mlen(a5),d0
  1390.     CLIB    Exec,FreeMem
  1391.     clr.l    s3m(a5)
  1392. .nomem    bra    modplayer
  1393.  
  1394. .ek2    cmp.l    #gvolume,a4
  1395.     bne.b    .ed
  1396.     pea    pevent(pc)
  1397.     bra    saataa
  1398.  
  1399. .ed    cmp.l    #Eject,a4
  1400.     bne    pevent
  1401.  
  1402. ejecti    move.l    program(a5),d0
  1403.     beq    stopa
  1404.     move.l    d0,a0
  1405.     bsr    FreeProgram
  1406.     clr.l    program(a5)
  1407.     bra    stopa
  1408.  
  1409. pause    move    Pause+12(a5),d0
  1410.     and    #SELECTED,d0
  1411.     beq.b    konttaa
  1412.  
  1413.     move.l    oldsec(a5),d0
  1414.     sub.l    timethisfar(a5),d0
  1415.     add.l    d0,timethisfar(a5)
  1416.     move.l    timethisfar(a5),oldsec(a5)
  1417.  
  1418.     st    PS3M_paused(a5)
  1419.  
  1420.     bsr    PS3M_pause
  1421.     bra    pevent
  1422.  
  1423. konttaa    cmp    #DISABLED,system(a5)
  1424.     beq.b    .cont
  1425.  
  1426.     move.l    #dates,d1
  1427.     C5LIB    DOS,DateStamp
  1428.     move.l    dates+4(a5),d0
  1429.     mulu    #50*60,d0
  1430.     add.l    d0,fifties(a5)
  1431.  
  1432.     clr    PS3M_paused(a5)
  1433.     bsr    PS3M_pause
  1434.     bra    pevent
  1435.  
  1436. .cont    move    #1,PS3M_cont(a5)
  1437.     bra    kala
  1438.  
  1439.  
  1440. smute    lea    $dff000,a6
  1441.     move    Mute+12(a5),d0
  1442.     and    #SELECTED,d0
  1443.     beq.b    .turnon
  1444.  
  1445.     moveq    #0,d0
  1446.     move    d0,$a8(a6)
  1447.     move    d0,$b8(a6)
  1448.     move    d0,$c8(a6)
  1449.     move    d0,$d8(a6)
  1450.     bra    pevent
  1451.  
  1452. .turnon
  1453.     moveq    #64,d1
  1454.  
  1455.     move    pmode(a5),d0
  1456.     subq    #1,d0
  1457.     bne.b    .nosurround
  1458.  
  1459.     moveq    #32,d2
  1460.     move    d1,$a8(a6)
  1461.     move    d1,$b8(a6)
  1462.     move    d2,$c8(a6)
  1463.     move    d2,$d8(a6)
  1464.     bra.b    .ohiis
  1465.  
  1466. .nosurround
  1467.     subq    #4,d0
  1468.     bpl.b    .bit14
  1469.  
  1470. ; Stereo, Mono and Real Surround
  1471. .stereo    move    d1,$a8(a6)
  1472.     move    d1,$b8(a6)
  1473.     move    d1,$c8(a6)
  1474.     move    d1,$d8(a6)
  1475.     bra.b    .ohiis
  1476.  
  1477. ; 14-bit stereo
  1478.  
  1479. .bit14    moveq    #1,d2
  1480.     move    d1,$a8(a6)
  1481.     move    d1,$b8(a6)
  1482.     move    d2,$c8(a6)
  1483.     move    d2,$d8(a6)
  1484. .ohiis    bra    pevent
  1485.  
  1486.  
  1487.  
  1488. alusta    bsr    lopeta
  1489.     bra    hepoinen
  1490.  
  1491. edellinen
  1492.     cmp    #1,maxfile(a5)
  1493.     beq    pevent
  1494.  
  1495.     move    progpos(a5),d0
  1496.     bne.b    vahenna
  1497.     move    maxfile(a5),progpos(a5)
  1498. vahenna
  1499.     subq    #1,progpos(a5)
  1500.     bra.b    stopa
  1501.  
  1502. piisiloppu
  1503.     cmp    #1,maxfile(a5)
  1504.     beq    pevent
  1505.  
  1506. uuspiisi
  1507.     addq    #1,progpos(a5)
  1508.     move    progpos(a5),d0
  1509.     cmp    maxfile(a5),d0
  1510.     bne.b    stopa
  1511.     clr    progpos(a5)
  1512.  
  1513. stopa    bsr.b    lopeta
  1514.  
  1515. urgh    move.l    s3m(a5),d0
  1516.     beq.b    .nomem
  1517.     move.l    d0,a1
  1518.     move.l    s3mlen(a5),d0
  1519.     CLIB    Exec,FreeMem
  1520.     clr.l    s3m(a5)
  1521. .nomem    tst.l    program(a5)
  1522.     bne    nextafile
  1523.     bra    event
  1524.  
  1525.  
  1526. pref1    bsr    override
  1527.     tst.l    d7
  1528.     beq    pevent
  1529.     bra.b    alusta
  1530.  
  1531.  
  1532. errore    bsr.b    lopeta
  1533.  
  1534.     lea    tags(a5),a0
  1535.     sub.l    a3,a3
  1536.     move.l    a3,a4
  1537.     lea    initerror(a5),a1
  1538.     lea    retry(a5),a2
  1539.     C5LIB    RT,rtEZRequestA
  1540.     subq    #1,d0
  1541.     bmi.b    .q
  1542.     beq    hepoinen
  1543.     bra    ejecti
  1544.  
  1545. .q    cmp    #1,maxfile(a5)
  1546.     bne.b    uuspiisi
  1547.     bra    ejecti
  1548.  
  1549. lopeta    st    PS3M_eject(a5)
  1550.     st    PS3M_wait(a5)
  1551.  
  1552.     tst    PS3M_play(a5)
  1553.     beq.b    .d
  1554.  
  1555.     cmp    #DISABLED,system(a5)
  1556.     beq.b    .d
  1557.  
  1558. .ll    tst    PS3M_wait(a5)            ; Wait for the player
  1559.     bne.b    .ll                ; task to finish
  1560.  
  1561. .d    move.l    4.w,a6
  1562.     move.l    buff1(a5),d0
  1563.     beq.b    .eimem
  1564.     move.l    d0,a1
  1565.     move.l    buffSize(a5),d0
  1566.     CALL    FreeMem
  1567.     clr.l    buff1(a5)
  1568.  
  1569. .eimem    move.l    buff2(a5),d0
  1570.     beq.b    .eimem1
  1571.     move.l    d0,a1
  1572.     move.l    buffSize(a5),d0
  1573.     CALL    FreeMem
  1574.     clr.l    buff2(a5)
  1575.  
  1576. .eimem1    move.l    buff3(a5),d0
  1577.     beq.b    .eimem2
  1578.     move.l    d0,a1
  1579.     move.l    buffSize(a5),d0
  1580.     CALL    FreeMem
  1581.     clr.l    buff3(a5)
  1582.  
  1583. .eimem2    move.l    buff4(a5),d0
  1584.     beq.b    .eimem3
  1585.     move.l    d0,a1
  1586.     move.l    buffSize(a5),d0
  1587.     CALL    FreeMem
  1588.     clr.l    buff4(a5)
  1589.  
  1590. .eimem3    move.l    buff14(a5),d0
  1591.     beq.b    .eimem4
  1592.     move.l    d0,a1
  1593.     move.l    #64*1024,d0
  1594.     CALL    FreeMem
  1595.     clr.l    buff14(a5)
  1596.  
  1597. .eimem4    move.l    vtab(a5),d0
  1598.     beq.b    .eimem5
  1599.     move.l    d0,a1
  1600.     move.l    #66*256,d0
  1601.     cmp    #STEREO14,pmode(a5)
  1602.     bne.b    .cd
  1603. .dcd    add.l    d0,d0
  1604. .cd    CALL    FreeMem
  1605.     clr.l    vtab(a5)
  1606.  
  1607. .eimem5    move.l    dtab(a5),d0
  1608.     beq.b    .eimem6
  1609.     move.l    d0,a1
  1610.     move.l    dtabsize(a5),d0
  1611.     CALL    FreeMem
  1612.     clr.l    dtab(a5)
  1613.  
  1614. .eimem6    rts
  1615.  
  1616.  
  1617. saataa    moveq    #64,d1
  1618.     move    propspecial+2(a5),d0
  1619.     mulu    d0,d1
  1620.     swap    d1
  1621.     move    d1,PS3M_master
  1622.  
  1623.     lea    gvolume(a5),a0
  1624.     move.l    winpoin(a5),a1
  1625.     sub.l    a2,a2
  1626.     moveq    #1,d0
  1627.     C5LIB    Int,RefreshGList
  1628.     rts
  1629.  
  1630. jump    move    positioneita(a5),d1
  1631.     move    propspecial2+2(a5),d0
  1632.     mulu    d0,d1
  1633.     swap    d1
  1634.     ext.l    d1
  1635.  
  1636.     move    d1,d0
  1637.     bsr    setPosition
  1638.  
  1639.     lea    position(a5),a0
  1640.     move.l    winpoin(a5),a1
  1641.     sub.l    a2,a2
  1642.     moveq    #1,d0
  1643.     C5LIB    Int,RefreshGList
  1644.     pea    pevent(pc)
  1645.     bra    positio
  1646.  
  1647.  
  1648. prog    tst.l    reqptr(a5)
  1649.     bne.b    .kej
  1650.  
  1651.     sub.l    a0,a0
  1652.     moveq    #RT_FILEREQ,d0
  1653.     C5LIB    RT,rtAllocRequestA
  1654.     move.l    d0,reqptr(a5)
  1655.     bne.b    .okei
  1656.  
  1657.     lea    outofmemory(a5),a0
  1658.     bsr    lopeta
  1659.     pea    exit(pc)
  1660.     bra    error
  1661.  
  1662. .okei    tst    noconf(a5)
  1663.     bne.b    .kej
  1664.  
  1665.     bsr    GetDefaultDir
  1666.     tst.l    d0
  1667.     beq.b    .kej
  1668.  
  1669.     move.l    reqptr(a5),a1
  1670.     lea    diretags(a5),a0
  1671.     move.l    d0,4(a0)            ; Set directory
  1672.     CALL    rtChangeReqAttrA
  1673.  
  1674. .kej    move.l    reqptr(a5),a1
  1675.     lea    addtags(a5),a0
  1676.     lea    fname,a2
  1677.     lea    title6(a5),a3
  1678.     C5LIB    RT,rtFileRequestA
  1679.     tst.l    d0
  1680.     beq    pevent
  1681.     move.l    d0,a4
  1682.  
  1683.     move.l    reqptr(a5),a0
  1684.     move.l    rtfi_Dir(a0),a2
  1685.     move.l    a4,a1
  1686.  
  1687.     move.l    program(a5),a0
  1688.     bsr    AddProgram
  1689.  
  1690.     move    d0,maxfile(a5)
  1691.     move.l    a4,a0
  1692.     C5LIB    RT,rtFreeFileList
  1693.     bra    pevent
  1694.  
  1695.  
  1696. ****************************************
  1697.  
  1698. override
  1699.     moveq    #0,d7
  1700. over    lea    vars,a1
  1701.     move.l    mixingrate(a5),(a1)+
  1702.     move.l    vboost(a5),(a1)+
  1703.  
  1704.     move    pmode(a5),d0    
  1705.     btst    #2,forced+1(a5)
  1706.     beq.b    .q
  1707.     move    fpmode(a5),d0
  1708. .q    subq    #1,d0
  1709.     bne.b    .nsurr
  1710.     lea    surr(a5),a2
  1711.     bra.b    .deq
  1712.  
  1713. .nsurr    subq    #1,d0
  1714.     bne.b    .nster
  1715.     lea    ster(a5),a2
  1716.     bra.b    .deq
  1717.  
  1718. .nster    subq    #1,d0
  1719.     bne.b    .nmon
  1720.     lea    mon(a5),a2
  1721.     bra.b    .deq
  1722.  
  1723. .nmon    subq    #1,d0
  1724.     bne.b    .nreal
  1725.     lea    real(a5),a2
  1726.     bra.b    .deq
  1727.  
  1728. .nreal    lea    stereo14(a5),a2
  1729.  
  1730. .deq    move.l    a2,(a1)+
  1731.  
  1732.     move    system(a5),d0
  1733.     btst    #3,forced+1(a5)
  1734.     beq.b    .q2
  1735.     move    fstate(a5),d0
  1736. .q2    cmp    #DISABLED,d0
  1737.     beq.b    .dis
  1738.     move.l    #on,(a1)+
  1739.     bra.b    .ddq
  1740. .dis    move.l    #off,(a1)+
  1741.  
  1742. .ddq    move.l    buffSize(a5),d0
  1743.     lsr.l    #8,d0
  1744.     lsr.l    #2,d0
  1745.     move.l    d0,(a1)+
  1746.  
  1747.     clr.l    defaultresponse(a5)
  1748.     lea    overtxt(a5),a1
  1749.     lea    tags(a5),a0
  1750.     sub.l    a3,a3
  1751.     lea    vars,a4
  1752.     lea    overgad(a5),a2
  1753.     C5LIB    RT,rtEZRequestA
  1754.     tst.l    d0
  1755.     beq    .over
  1756.  
  1757.     moveq    #1,d7
  1758.  
  1759.     subq.l    #1,d0
  1760.     beq.b    .rate
  1761.  
  1762.     subq.l    #1,d0
  1763.     beq.b    .boost
  1764.  
  1765.     subq.l    #1,d0
  1766.     beq.b    .pmode
  1767.  
  1768.     subq.l    #1,d0
  1769.     beq.b    .state
  1770.  
  1771.     move.l    mixingrate(a5),frate(a5)
  1772.     move.l    vboost(a5),fboost(a5)
  1773.     or    #$f,forced(a5)
  1774.     bra    over
  1775.  
  1776. .rate    lea    ltags(a5),a0
  1777.     lea    mixingrate(a5),a1
  1778.     lea    mratetitle(a5),a2
  1779. .d    sub.l    a3,a3
  1780.     C5LIB    RT,rtGetLongA
  1781.     bra    over
  1782.  
  1783. .boost    lea    ltags2(a5),a0
  1784.     lea    vboost(a5),a1
  1785.     lea    vboosttitle(a5),a2
  1786.     bra.b    .d
  1787.  
  1788.  
  1789. .pmode    moveq    #0,d0
  1790.     move    pmode(a5),d0
  1791.     move.l    d0,defaultresponse(a5)
  1792.  
  1793.     lea    playmode(a5),a1
  1794.     lea    tags(a5),a0
  1795.     sub.l    a3,a3
  1796.     move.l    a3,a4
  1797.     lea    pmodeg(a5),a2
  1798.     C5LIB    RT,rtEZRequestA
  1799.     tst.l    d0
  1800.     beq.b    .ov
  1801.  
  1802.     move    d0,fpmode(a5)
  1803.     or    #4,forced(a5)
  1804.  
  1805. .ov    bra    over
  1806.  
  1807.  
  1808. .state    moveq    #0,d0
  1809.     move    system(a5),d0
  1810.     move.l    d0,defaultresponse(a5)
  1811.  
  1812.     lea    killer(a5),a1
  1813.     lea    tags(a5),a0
  1814.     sub.l    a3,a3
  1815.     move.l    a3,a4
  1816.     lea    killerg(a5),a2
  1817.     C5LIB    RT,rtEZRequestA
  1818.     tst.l    d0
  1819.     beq.b    .ov2
  1820.  
  1821.     move    d0,fstate(a5)
  1822.     or    #8,forced(a5)
  1823.  
  1824. .ov2    bra    over
  1825.  
  1826. .over    rts
  1827.  
  1828.  
  1829. ****************************************
  1830.  
  1831. showsamples
  1832.     clr    ssnpos(a5)
  1833. .reqloop
  1834.     cmp    #mtMOD,mtype(a5)
  1835.     beq    .mod
  1836.     cmp    #mtMTM,mtype(a5)
  1837.     beq    .mtm
  1838.     cmp    #mtXM,mtype(a5)
  1839.     beq.b    .xm
  1840.  
  1841. .s3m    move.l    s3m(a5),a0
  1842.     move.l    samples(a5),a1
  1843.     move    ssnpos(a5),d7
  1844.     moveq    #15,d6                ; 16 names per requester
  1845.     lea    vars,a4
  1846.  
  1847.     move    insnum(a0),d5
  1848.     iword    d5
  1849.  
  1850. .loop    move    d7,d0
  1851.     add    d0,d0
  1852.     move    (a1,d0),d0
  1853.     iword    d0
  1854.     lsl    #4,d0
  1855.     lea    (a0,d0),a2
  1856.     lea    insname(a2),a3
  1857.     move.l    a3,(a4)+            ; Name
  1858.  
  1859.     move.l    inslength(a2),d0
  1860.     ilword    d0        
  1861.     move.l    d0,(a4)+
  1862.  
  1863.     addq    #1,d7
  1864.     cmp    d5,d7
  1865.     bhs    .pois
  1866.     dbf    d6,.loop
  1867.     bra    .show
  1868.  
  1869. .xm    move.l    s3m(a5),a0
  1870.     move    ssnpos(a5),d7
  1871.     moveq    #15,d6                ; 16 names per requester
  1872.     lea    vars,a4
  1873.     lea    xmNumInsts(a0),a0
  1874.     tword    (a0)+,d5
  1875.     lea    xm_insts,a0
  1876. .loop0    move    d7,d0
  1877.     lsl    #2,d0
  1878.     move.l    (a0,d0),a2
  1879.     moveq    #0,d4
  1880.     move.l    a2,a1
  1881.     tlword    (a1)+,d0            ; Insthdr size
  1882.     move.l    a1,(a4)+            ; Name
  1883.     lea    xmNumSamples(a2),a1
  1884.     tword    (a1)+,d2
  1885.     tst    d2
  1886.     beq.b    .skip
  1887.     lea    xmSmpHdrSize(a2),a1
  1888.     tlword    (a1)+,d3
  1889.     add.l    d0,a2
  1890.     subq    #1,d2
  1891. .koo    move.l    a2,a1
  1892.     tlword    (a1)+,d0
  1893.     add.l    d0,d4
  1894.     add.l    d3,a2
  1895.     dbf    d2,.koo
  1896.  
  1897. .skip    move.l    d4,(a4)+
  1898.  
  1899.     addq    #1,d7
  1900.     cmp    d5,d7
  1901.     bhs    .pois
  1902.  
  1903.     dbf    d6,.loop0
  1904.     bra    .show
  1905.  
  1906.  
  1907. .mod    move.l    s3m(a5),a0
  1908.     move    ssnpos(a5),d7
  1909.     moveq    #15,d6                ; 16 names per requester
  1910.     lea    vars,a4
  1911.     moveq    #31,d5
  1912. .loop2    move    d7,d0
  1913.     mulu    #30,d0
  1914.     lea    20(a0,d0),a2
  1915.     move.l    a2,(a4)+            ; Name
  1916.  
  1917.     moveq    #0,d0
  1918.     move    22(a2),d0
  1919.     add.l    d0,d0
  1920.     move.l    d0,(a4)+
  1921.  
  1922.     addq.l    #1,d7
  1923.     cmp    d5,d7
  1924.     bhs.b    .pois
  1925.  
  1926.     dbf    d6,.loop2
  1927.     bra.b    .show
  1928.  
  1929. .mtm    move.l    s3m(a5),a0
  1930.     move    ssnpos(a5),d7
  1931.     moveq    #15,d6                ; 15 names per requester
  1932.     lea    vars,a4
  1933.     moveq    #0,d5
  1934.     move.b    30(a0),d5
  1935. .loop3    move    d7,d0
  1936.     mulu    #37,d0
  1937.     lea    66(a0,d0),a2
  1938.     move.l    a2,(a4)+            ; Name
  1939.  
  1940.     lea    22(a2),a2
  1941.     tlword    (a2)+,d1
  1942.     move.l    d1,(a4)+
  1943.  
  1944.     addq    #1,d7
  1945.     cmp    d5,d7
  1946.     bhs.b    .pois
  1947.  
  1948.     dbf    d6,.loop3
  1949.     bra.b    .show
  1950.  
  1951. .pois    move.l    #tyhja,(a4)+
  1952.     clr.l    (a4)+
  1953.     dbf    d6,.pois
  1954.  
  1955. .show    lea    ssn(a5),a1
  1956.     lea    tags(a5),a0
  1957.     sub.l    a3,a3
  1958.     lea    vars,a4
  1959.  
  1960.     clr.l    defaultresponse(a5)
  1961.  
  1962.     tst    ssnpos(a5)
  1963.     beq.b    .first
  1964.  
  1965.     move    ssnpos(a5),d0
  1966.     add    #16,d0
  1967.     cmp    d5,d0
  1968.     bhs.b    .last
  1969.  
  1970.     lea    ssn1(a5),a2
  1971.     bra.b    .juu
  1972.  
  1973. .last    lea    ssn3(a5),a2
  1974.     move.l    #2,defaultresponse(a5)
  1975.     bra.b    .juu
  1976.  
  1977. .first    move    ssnpos(a5),d0
  1978.     add    #16,d0
  1979.     cmp    d5,d0
  1980.     blo.b    .fir
  1981.  
  1982.     lea    ssn4(a5),a2
  1983.     move.l    #2,defaultresponse(a5)
  1984.     bra.b    .juu
  1985.  
  1986. .fir    lea    ssn2(a5),a2
  1987.  
  1988. .juu    C5LIB    RT,rtEZRequestA
  1989.     cmp    #2,d0
  1990.     beq.b    .exit
  1991.     tst    d0
  1992.     beq.b    .right
  1993.  
  1994.     cmp    #16,ssnpos(a5)
  1995.     blo    .reqloop
  1996.     sub    #16,ssnpos(a5)
  1997.     bra    .reqloop
  1998.  
  1999. .right    move    ssnpos(a5),d0
  2000.     add    #16,d0
  2001.     cmp    d5,d0
  2002.     bhs    .reqloop
  2003.     add    #16,ssnpos(a5)
  2004.     bra    .reqloop
  2005.  
  2006. .exit    rts
  2007.  
  2008.  
  2009. *******
  2010.  
  2011.  
  2012. GetDefaultDir
  2013.     bsr    defaultsec
  2014.  
  2015. .dloop    bsr    getline
  2016.     cmp.b    #'[',(a0)
  2017.     beq.b    .q
  2018.     lea    directory(a5),a1
  2019.     bsr    cmpstr
  2020.     bne.b    .dloop
  2021.  
  2022.     bsr    skipequal
  2023.  
  2024.     bsr    copy2temp
  2025.  
  2026.     move.l    #tempstr,d0
  2027.     rts
  2028.  
  2029. .q    moveq    #0,d0
  2030.     rts
  2031.  
  2032. GetDefaultRate
  2033.     bsr    defaultsec
  2034.  
  2035. .dloop    bsr    getline
  2036.     cmp.b    #'[',(a0)
  2037.     beq.b    .q
  2038.     lea    mxrate(a5),a1
  2039.     bsr    cmpstr
  2040.     bne.b    .dloop
  2041.  
  2042.     bsr    skipequal
  2043.  
  2044.     bsr    decimal2temp
  2045.     move.l    tempstr,d0
  2046.     cmp.l    #4000,d0
  2047.     blo.b    .q
  2048.     cmp.l    #56000,d0
  2049.     bhi.b    .q
  2050.     rts
  2051.  
  2052. .q    move.l    #16000,d0            ; Default
  2053.     rts
  2054.  
  2055. GetDefaultBoost
  2056.     bsr    defaultsec
  2057.  
  2058. .dloop    bsr    getline
  2059.     cmp.b    #'[',(a0)
  2060.     beq.b    .q
  2061.     lea    boost(a5),a1
  2062.     bsr    cmpstr
  2063.     bne.b    .dloop
  2064.  
  2065.     bsr    skipequal
  2066.  
  2067.     bsr    decimal2temp
  2068.     move.l    tempstr,d0
  2069.     cmp.l    #8,d0
  2070.     bhi.b    .q
  2071.     rts
  2072.  
  2073. .q    moveq    #0,d0                ; Default
  2074.     rts
  2075.  
  2076.  
  2077. GetPlayMode
  2078.     bsr    defaultsec
  2079.  
  2080. .dloop    bsr    getline
  2081.     cmp.b    #'[',(a0)
  2082.     beq    .q
  2083.     lea    plmode(a5),a1
  2084.     bsr    cmpstr
  2085.     bne.b    .dloop
  2086.  
  2087.     bsr    skipequal
  2088.  
  2089.     moveq    #1,d2
  2090.     move.l    a0,-(sp)
  2091.     lea    surr(a5),a1
  2092.     bsr    cmpstr
  2093.     move.l    (sp)+,a0
  2094.     tst.l    d0
  2095.     beq.b    .qw
  2096.     addq.l    #1,d2
  2097.  
  2098.     move.l    a0,-(sp)
  2099.     lea    ster(a5),a1
  2100.     bsr    cmpstr
  2101.     move.l    (sp)+,a0
  2102.     tst.l    d0
  2103.     beq.b    .qw
  2104.  
  2105.     addq.l    #1,d2
  2106.  
  2107.     move.l    a0,-(sp)
  2108.     lea    mon(a5),a1
  2109.     bsr    cmpstr
  2110.     move.l    (sp)+,a0
  2111.     tst.l    d0
  2112.     beq.b    .qw
  2113.  
  2114.     addq.l    #1,d2
  2115.  
  2116.     move.l    a0,-(sp)
  2117.     lea    real(a5),a1
  2118.     bsr    cmpstr
  2119.     move.l    (sp)+,a0
  2120.     tst.l    d0
  2121.     beq.b    .qw
  2122.  
  2123.     addq.l    #1,d2
  2124.  
  2125.     move.l    a0,-(sp)
  2126.     lea    stereo14(a5),a1
  2127.     bsr    cmpstr
  2128.     move.l    (sp)+,a0
  2129.     tst.l    d0
  2130.     bne.b    .q
  2131.  
  2132. .qw    move.l    d2,d0
  2133.     rts
  2134.  
  2135. .q    moveq    #SURROUND,d0                ; Default
  2136.     rts
  2137.  
  2138.  
  2139. GetSystemState
  2140.     bsr    defaultsec
  2141.  
  2142. .dloop    bsr    getline
  2143.     cmp.b    #'[',(a0)
  2144.     beq.b    .q
  2145.     lea    sstate(a5),a1
  2146.     bsr    cmpstr
  2147.     bne.b    .dloop
  2148.  
  2149.     bsr    skipequal
  2150.  
  2151.     moveq    #1,d2
  2152.     move.l    a0,-(sp)
  2153.     lea    off(a5),a1
  2154.     bsr    cmpstr
  2155.     move.l    (sp)+,a0
  2156.     tst.l    d0
  2157.     beq.b    .qw
  2158.     addq.l    #1,d2
  2159.  
  2160.     move.l    a0,-(sp)
  2161.     lea    on(a5),a1
  2162.     bsr    cmpstr
  2163.     move.l    (sp)+,a0
  2164.     tst.l    d0
  2165.     bne.b    .q
  2166.  
  2167. .qw    move.l    d2,d0
  2168.     rts
  2169.  
  2170. .q    moveq    #DISABLED,d0                ; Default
  2171.     rts
  2172.  
  2173.  
  2174. GetBufferSize
  2175.     bsr    defaultsec
  2176.  
  2177. .dloop    bsr    getline
  2178.     cmp.b    #'[',(a0)
  2179.     beq.b    .q
  2180.     lea    bsize(a5),a1
  2181.     bsr    cmpstr
  2182.     bne.b    .dloop
  2183.  
  2184.     bsr    skipequal
  2185.  
  2186.     bsr    decimal2temp
  2187.     move.l    tempstr,d0
  2188.     cmp.l    #3,d0
  2189.     bhi.b    .q
  2190.  
  2191.     move.l    #4*1024,d1
  2192.     lsl.l    d0,d1
  2193.     move.l    d1,buffSize(a5)
  2194.     subq.l    #1,d1
  2195.     move.l    d1,buffSizeMask(a5)
  2196.     lsl.l    #8,d1
  2197.     move.b    #$ff,d1
  2198.     move.l    d1,buffSizeMaskFF
  2199. .q    moveq    #0,d0                ; Default
  2200.     rts
  2201.  
  2202.  
  2203. GetBanner
  2204.     bsr    defaultsec
  2205.     moveq    #0,d2
  2206. .dloop    bsr    getline
  2207.     cmp.b    #'[',(a0)
  2208.     beq.b    .qw
  2209.     lea    banner(a5),a1
  2210.     bsr    cmpstr
  2211.     bne.b    .dloop
  2212.  
  2213.     bsr    skipequal
  2214.  
  2215.     move.l    a0,-(sp)
  2216.     lea    on(a5),a1
  2217.     bsr    cmpstr
  2218.     move.l    (sp)+,a0
  2219.     tst.l    d0
  2220.     beq.b    .qw
  2221.  
  2222.     move.l    a0,-(sp)
  2223.     lea    off(a5),a1
  2224.     bsr    cmpstr
  2225.     move.l    (sp)+,a0
  2226.     tst.l    d0
  2227.     bne.b    .qw
  2228.  
  2229.     moveq    #-1,d2
  2230.  
  2231. .qw    move    d2,bann(a5)
  2232.     rts
  2233.  
  2234.  
  2235. GetFont
  2236.     bsr    defaultsec
  2237.     moveq    #0,d2
  2238. .dloop    bsr    getline
  2239.     cmp.b    #'[',(a0)
  2240.     beq.b    .q
  2241.     lea    font(a5),a1
  2242.     bsr    cmpstr
  2243.     bne.b    .dloop
  2244.  
  2245.     bsr    skipequal
  2246.  
  2247.     lea    fontname(a5),a1
  2248.     moveq    #19,d1
  2249. .c    move.b    (a0)+,d0
  2250.     move.b    d0,(a1)+
  2251.     beq.b    .invalid
  2252.     cmp.b    #'.',d0
  2253.     beq.b    .x
  2254.     cmp.b    #10,d0
  2255.     beq.b    .invalid
  2256.     dbf    d1,.c
  2257. .invalid
  2258.     lea    fontname(a5),a1
  2259.     move.l    #'topa',(a1)+
  2260.     move.l    #'z.fo',(a1)+
  2261.     move    #'nt',(a1)+
  2262.     clr.b    (a1)
  2263.     move    #8,fontsize(a5)
  2264. .q    rts
  2265.  
  2266. .x    move.b    #'f',(a1)+
  2267.     move.b    #'o',(a1)+
  2268.     move.b    #'n',(a1)+
  2269.     move.b    #'t',(a1)+
  2270.     clr.b    (a1)
  2271.     bsr    decimal2temp
  2272.     move.l    tempstr,d0
  2273.     move    d0,fontsize(a5)
  2274.     lea    textattr(a5),a0
  2275.     C5LIB    GFX,OpenFont
  2276.     move.l    d0,fontaddr(a5)
  2277.     bne.b    .q
  2278.  
  2279.     lea    _DiskFontName(a5),a1
  2280.     moveq    #0,d0
  2281.     CLIB    Exec,OpenLibrary
  2282.     move.l    d0,_DiskFontBase(a5)
  2283.     beq.b    .invalid
  2284.  
  2285.     move.l    d0,a6
  2286.     lea    textattr(a5),a0
  2287.     CALL    OpenDiskFont
  2288.     move.l    d0,fontaddr(a5)
  2289.  
  2290.     move.l    a6,a1
  2291.     CLIB    Exec,CloseLibrary
  2292.     clr.l    _DiskFontBase(a5)
  2293.     tst.l    fontaddr
  2294.     beq    .invalid
  2295.     bra.b    .q
  2296.  
  2297.  
  2298. CheckChannelSettings
  2299.     bsr    chansec
  2300.  
  2301.     moveq    #0,d2
  2302.     move    numchans(a5),d2
  2303. .dloop
  2304.     bsr    getline
  2305.     cmp.b    #'[',(a0)
  2306.     beq.b    .q
  2307.  
  2308.     bsr    decimal2temp
  2309.     cmp.l    tempstr,d2
  2310.     bne.b    .dloop
  2311.  
  2312.     bsr    skipequal
  2313.  
  2314.     bra.b    takedefaults
  2315. .q    rts
  2316.  
  2317.  
  2318. CheckSpecific
  2319.     bsr    tunesec
  2320. .dloop    bsr    getline
  2321.     cmp.b    #'[',(a0)
  2322.     beq.b    .q
  2323.     lea    fname,a1
  2324.     bsr    cmpstr
  2325.     bne.b    .dloop
  2326.  
  2327.     bsr    skipequal
  2328.  
  2329.     bra.b    takedefaults
  2330.  
  2331. .q    moveq    #0,d0
  2332.     rts
  2333.  
  2334.  
  2335. takedefaults
  2336.     move.b    (a0),d1
  2337.     bsr    locase
  2338.     cmp.b    #'r',d1
  2339.     beq.b    .rate
  2340.  
  2341.     cmp.b    #'v',d1
  2342.     beq.b    .boost
  2343.  
  2344.     cmp.b    #'m',d1
  2345.     bne.b    .skip
  2346.  
  2347. .mode    addq.l    #1,a0
  2348.     bsr    decimal2temp
  2349.     move.l    tempstr,d1
  2350.     addq.l    #1,d1
  2351.     cmp.l    #SURROUND,d1
  2352.     blo.b    .skip
  2353.     cmp.l    #STEREO14,d1
  2354.     bhi.b    .skip
  2355.  
  2356.     move    d1,pmode(a5)
  2357.     bra.b    .skip
  2358.  
  2359. .boost    addq.l    #1,a0
  2360.     bsr    decimal2temp
  2361.     move.l    tempstr,d1
  2362.     cmp    #4,d1
  2363.     bhi.b    .skip
  2364.  
  2365.     move.l    d1,vboost(a5)
  2366.     bra.b    .skip
  2367.  
  2368. .rate    addq.l    #1,a0
  2369.     bsr    decimal2temp
  2370.     move.l    tempstr,d1
  2371.     cmp.l    #4000,d1
  2372.     blo.b    .skip
  2373.     cmp.l    #56000,d1
  2374.     bhi.b    .skip
  2375.  
  2376.     move.l    d1,mixingrate(a5)
  2377.  
  2378. .skip    tst.b    (a0)
  2379.     beq.b    .q
  2380.     cmp.b    #' ',(a0)
  2381.     beq.b    .next
  2382.     cmp.b    #10,(a0)
  2383.     beq.b    .q
  2384.     cmp.l    a4,a0
  2385.     bhs.b    .q
  2386.     bra    takedefaults
  2387. .next    addq.l    #1,a0
  2388.     bra.b    .skip
  2389.  
  2390.  
  2391. .q    rts
  2392.  
  2393.  
  2394. defaultsec
  2395.     move.l    config(a5),d0
  2396.     beq.b    errexit
  2397.     move.l    d0,a0
  2398.     move.l    a0,a4
  2399.     add.l    conlen(a5),a4
  2400. .loop    bsr    getline
  2401.     lea    defaultsection(a5),a1
  2402.     bsr.b    cmpstr
  2403.     bne.b    .loop
  2404.     rts
  2405.  
  2406. errexit    addq.l    #4,sp
  2407.     moveq    #0,d0
  2408.     rts
  2409.  
  2410.  
  2411. chansec    move.l    config(a5),d0
  2412.     beq.b    errexit
  2413.     move.l    d0,a0
  2414.     move.l    a0,a4
  2415.     add.l    conlen(a5),a4
  2416. .loop    bsr    getline
  2417.     lea    channelsection(a5),a1
  2418.     bsr.b    cmpstr
  2419.     bne.b    .loop
  2420.     rts
  2421.  
  2422.  
  2423. tunesec    move.l    config(a5),d0
  2424.     beq.b    errexit
  2425.     move.l    d0,a0
  2426.     move.l    a0,a4
  2427.     add.l    conlen(a5),a4
  2428. .loop    bsr    getline
  2429.     lea    tunesection(a5),a1
  2430.     bsr.b    cmpstr
  2431.     bne.b    .loop
  2432.     rts
  2433.  
  2434.  
  2435. cmpstr    move.b    (a1)+,d1
  2436.     beq.b    .q
  2437.     bsr.b    locase
  2438.     move.b    d1,d0
  2439.  
  2440.     move.b    (a0)+,d1
  2441.     bsr.b    locase
  2442.     cmp.b    d0,d1
  2443.     beq.b    cmpstr
  2444.     moveq    #1,d0
  2445.     rts
  2446.  
  2447. .q    moveq    #0,d0                ; match
  2448.     rts
  2449.  
  2450. skipequal
  2451. .qw    cmp.b    #'=',(a0)+
  2452.     bne.b    .qw
  2453. .ll    cmp.b    #' ',(a0)+
  2454.     beq.b    .ll
  2455.     subq.l    #1,a0
  2456.     rts
  2457.  
  2458. copy2temp
  2459.     lea    tempstr,a1
  2460. .cp    move.b    (a0)+,(a1)+
  2461.     cmp.b    #10,-1(a1)
  2462.     bne.b    .cp
  2463.     clr.b    -1(a1)
  2464.     rts
  2465.  
  2466. decimal2temp
  2467.     moveq    #0,d1
  2468. .los    moveq    #0,d0
  2469.     move.b    (a0),d0
  2470.     cmp    #' ',d0
  2471.     beq.b    .lop
  2472.     cmp    #10,d0
  2473.     beq.b    .lop
  2474.     cmp.l    a4,a0
  2475.     bhs.b    .lop
  2476.  
  2477.     addq.l    #1,a0
  2478.     sub    #'0',d0
  2479.     mulu    #10,d1
  2480.     add    d0,d1
  2481.     bra.b    .los
  2482.  
  2483. .lop    move.l    d1,tempstr
  2484.     rts
  2485.  
  2486.  
  2487. locase    cmp.b    #'A',d1
  2488.     blo.b    .q
  2489.     cmp.b    #'Z',d1
  2490.     bhi.b    .q
  2491.     add.b    #'a'-'A',d1
  2492. .q    rts
  2493.  
  2494. getline    cmp.b    #10,-1(a0)
  2495.     bne.b    .skip
  2496. .gloop    cmp.b    #';',(a0)
  2497.     beq.b    .skip
  2498.     cmp.b    #10,(a0)
  2499.     beq.b    .skip
  2500. .q    rts                    ; Found
  2501.  
  2502. .skip    move.b    (a0)+,d0
  2503.     beq.b    .q2
  2504.     cmp.b    #10,d0
  2505.     beq.b    .gloop
  2506.     cmp.l    a4,a0
  2507.     blo.b    .skip
  2508. .q2    addq.l    #4,sp
  2509.     moveq    #0,d0
  2510.     rts                    ; No line found, quit
  2511.  
  2512.     endb    a5
  2513.  
  2514.  
  2515. *****************************************
  2516. *   NewProgram (filelist,path)(A0,A1)    *
  2517. *        D0 = *program        *
  2518. *        D1 = amount of files    *
  2519. *****************************************
  2520. NewProgram
  2521.     Push    d2-a6
  2522.     move.l    a1,a2
  2523. .size    tst.b    (a2)+
  2524.     bne.b    .size
  2525.     subq.l    #1,a2
  2526.     sub.l    a1,a2
  2527.     move.l    a2,d7            ;pathlength
  2528.  
  2529.     moveq    #10,d0
  2530.     add.l    d7,d0
  2531.     add.l    4(a0),d0        ;Nodenpituus
  2532.     moveq    #1,d2
  2533.     and.l    d0,d2
  2534.     add.l    d2,d0
  2535.     move.l    d0,d2
  2536.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  2537.     Push    a0/a1
  2538.     CLIB    Exec,AllocMem
  2539.     Pull    a0/a1
  2540.     move.l    d0,-(sp)        ;Program!
  2541.  
  2542.     move.l    d0,a2
  2543.     move    d2,4(a2)
  2544.  
  2545.     move.l    a1,a4
  2546.     lea    8(a2),a3
  2547.     tst.b    (a4)
  2548.     beq.b    .okd
  2549. .lopa    move.b    (a4)+,(a3)+
  2550.     bne.b    .lopa
  2551.  
  2552.     move.b    #'/',-1(a3)
  2553.     cmp.b    #':',-2(a3)
  2554.     bne.b    .okd
  2555.     subq.l    #1,a3
  2556. .okd    move.l    8(a0),a4
  2557. .lop    move.b    (a4)+,(a3)+
  2558.     bne.b    .lop
  2559.  
  2560.     moveq    #1,d6
  2561. nodeloop
  2562.     move.l    (a0),d0
  2563.     beq.b    NPloppu
  2564.     move.l    d0,a0
  2565.  
  2566.     addq.l    #1,d6
  2567.     moveq    #10,d0
  2568.     add.l    d7,d0
  2569.     add.l    4(a0),d0        ;Noden pituus
  2570.     moveq    #1,d2
  2571.     and.l    d0,d2
  2572.     add.l    d2,d0
  2573.     move.l    d0,d2
  2574.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  2575.     Push    a0/a1
  2576.     CALL    AllocMem
  2577.     Pull    a0/a1
  2578.     move.l    d0,(a2)
  2579.  
  2580.     move.l    d0,a2
  2581.     move    d2,4(a2)
  2582.  
  2583.     move.l    a1,a4
  2584.     lea    8(a2),a3
  2585.     tst.b    (a4)
  2586.     beq.b    .okd
  2587. .lopa    move.b    (a4)+,(a3)+
  2588.     bne.b    .lopa
  2589.  
  2590.     move.b    #'/',-1(a3)
  2591.     cmp.b    #':',-2(a3)
  2592.     bne.b    .okd
  2593.     subq.l    #1,a3
  2594. .okd    move.l    8(a0),a4
  2595. .lop    move.b    (a4)+,(a3)+
  2596.     bne.b    .lop
  2597.     bra.b    nodeloop
  2598.  
  2599. NPloppu    move.l    d6,d1
  2600.     move.l    (sp)+,d0
  2601.     Pull    d2-a6
  2602.     rts
  2603.  
  2604. *****************************************
  2605. *   NewProgram2 (Filename)(A0)        *
  2606. *        D0 = *program        *
  2607. *****************************************
  2608. NewProgram2
  2609.     Push    d1-a6
  2610.     move.l    a0,a2
  2611. .size    tst.b    (a2)+
  2612.     bne.b    .size
  2613.     subq.l    #1,a2
  2614.     sub.l    a0,a2
  2615.     move.l    a2,d7            ;NAMElength
  2616.  
  2617.     moveq    #10,d0
  2618.     add.l    d7,d0            ;NODElength
  2619.     moveq    #1,d2
  2620.     and.l    d0,d2
  2621.     add.l    d2,d0
  2622.     move.l    d0,d2
  2623.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  2624.     move.l    a0,a3
  2625.     CLIB    Exec,AllocMem
  2626.     move.l    d0,-(sp)        ;Program!
  2627.  
  2628.     move.l    d0,a2
  2629.     move    d2,4(a2)
  2630.     addq.l    #8,a2
  2631. .lopa    move.b    (a3)+,(a2)+
  2632.     bne.b    .lopa
  2633.     move.l    (sp)+,d0
  2634.     Pull    d1-a6
  2635.     rts
  2636.  
  2637. *************************************************
  2638. * AddProgram (program,filelist,path)(A0,A1,A2)    *
  2639. *        D0 = amount of files        *
  2640. *************************************************
  2641. AddProgram
  2642.     Push    d1-a6
  2643.     moveq    #1,d6
  2644. .montako
  2645.     move.l    (a0),d0
  2646.     beq.b    uutta
  2647.     addq.l    #1,d6
  2648.     move.l    d0,a0
  2649.     bra.b    .montako
  2650. uutta    
  2651.     move.l    a2,a4
  2652. .size    tst.b    (a4)+
  2653.     bne.b    .size
  2654.     subq    #1,a4
  2655.     sub.l    a2,a4
  2656.     move.l    a4,d7
  2657.  
  2658. nodeloop2
  2659.     addq.l    #1,d6
  2660.     moveq    #10,d0
  2661.     add.l    d7,d0
  2662.     add.l    4(a1),d0        ;Noden pituus
  2663.     moveq    #1,d2
  2664.     and.l    d0,d2
  2665.     add.l    d2,d0
  2666.     move.l    d0,d2
  2667.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  2668.     Push    a0/a1
  2669.     CLIB    Exec,AllocMem
  2670.     Pull    a0/a1
  2671.     move.l    d0,(a0)
  2672.  
  2673.     move.l    d0,a0
  2674.     move    d2,4(a0)
  2675.  
  2676.     move.l    a2,a4
  2677.     lea    8(a0),a5
  2678.     tst.b    (a4)
  2679.     beq.b    .okd
  2680. .lopa    move.b    (a4)+,(a5)+
  2681.     bne.b    .lopa
  2682.  
  2683.     move.b    #'/',-1(a5)
  2684.     cmp.b    #':',-2(a5)
  2685.     bne.b    .okd
  2686.     subq.l    #1,a5
  2687. .okd    move.l    8(a1),a4
  2688. .lop    move.b    (a4)+,(a5)+
  2689.     bne.b    .lop
  2690.  
  2691.     move.l    (a1),d0
  2692.     beq.b    NPloppu2
  2693.     move.l    d0,a1
  2694.     bra.b    nodeloop2
  2695.  
  2696. NPloppu2
  2697.     move.l    d6,d0
  2698.     Pull    d1-a6
  2699.     rts
  2700.  
  2701.  
  2702. *************************************************
  2703. * AddProgram2 (program,filename)(A0,A1)        *
  2704. *        D0 = amount of files        *
  2705. *************************************************
  2706. AddProgram2
  2707.     Push    d1-a6
  2708.     moveq    #2,d6
  2709. .montako
  2710.     move.l    (a0),d0
  2711.     beq.b    .uutta
  2712.     addq.l    #1,d6
  2713.     move.l    d0,a0
  2714.     bra.b    .montako
  2715. .uutta
  2716.     move.l    a1,a4
  2717. .size    tst.b    (a4)+
  2718.     bne.b    .size
  2719.     subq    #1,a4
  2720.     sub.l    a1,a4
  2721.  
  2722.     moveq    #10,d0
  2723.     add.l    a4,d0            ;Noden pituus
  2724.     moveq    #1,d2
  2725.     and.l    d0,d2
  2726.     add.l    d2,d0
  2727.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  2728.     move.l    a1,a3
  2729.     move.l    a0,a4
  2730.     move.l    d0,d2
  2731.     CLIB    Exec,AllocMem
  2732.     move.l    d0,(a4)
  2733.  
  2734.     move.l    d0,a0
  2735.     move    d2,4(a0)
  2736.  
  2737.     addq.l    #8,a0
  2738. .lopa    move.b    (a3)+,(a0)+
  2739.     bne.b    .lopa
  2740.     move.l    d6,d0
  2741.     Pull    d1-a6
  2742.     rts
  2743.  
  2744. *****************************************
  2745. *     GetName (program,count)(A0,D0)    *
  2746. *        D0 = *filename        *
  2747. *****************************************
  2748. GetName
  2749.     Push    d1-a6
  2750.     subq    #1,d0
  2751.     bmi.b    .eka
  2752. .dbf    move.l    (a0),a0
  2753.     dbf    d0,.dbf
  2754. .eka    addq.l    #8,a0
  2755.     move.l    a0,d0
  2756.     Pull    d1-a6
  2757.     rts
  2758.  
  2759. *****************************************
  2760. *     GetFlags (program,count)(A0,D0)    *
  2761. *        D0 = flags            *
  2762. *****************************************
  2763. GetFlags
  2764.     Push    d1-a6
  2765.     subq    #1,d0
  2766.     bmi.b    .eka
  2767. .dbf    move.l    (a0),a0
  2768.     dbf    d0,.dbf
  2769. .eka    move    6(a0),d0
  2770.     Pull    d1-a6
  2771.     rts
  2772.  
  2773. *****************************************
  2774. *     MarkProg (program,count)(A0,D0)    *
  2775. *****************************************
  2776. MarkProg
  2777.     Push    All
  2778.     subq    #1,d0
  2779.     bmi.b    .eka
  2780. .dbf    move.l    (a0),a0
  2781.     dbf    d0,.dbf
  2782. .eka    or    #1,6(a0)
  2783.     Pull    All
  2784.     rts
  2785.  
  2786. *****************************************
  2787. *    ClearProg (program)(A0)        *
  2788. *****************************************
  2789. ClearProg
  2790.     Push    All
  2791.     moveq    #-2,d1
  2792. clearloop
  2793.     and    d1,6(a0)
  2794.     move.l    (a0),d0
  2795.     beq.b    .pois
  2796.     move.l    d0,a0
  2797.     bra.b    clearloop
  2798. .pois    Pull    All
  2799.     rts
  2800.  
  2801. *****************************************
  2802. *     FreeProgram (program)(A0)    *
  2803. *****************************************
  2804. FreeProgram
  2805.     Push    All
  2806. freeloop
  2807.     move.l    (a0),d2
  2808.     moveq    #0,d0
  2809.     move    4(a0),d0
  2810.     move.l    a0,a1
  2811.     move.l    a0,-(sp)
  2812.     CLIB    Exec,FreeMem
  2813.     move.l    (sp)+,a0
  2814.     tst.l    d2
  2815.     beq.b    .pois
  2816.     move.l    d2,a0
  2817.     bra.b    freeloop    
  2818. .pois    Pull    All
  2819.     rts
  2820.  
  2821.  
  2822.     
  2823.  
  2824. ****************************************
  2825.  
  2826.     basereg    data,a5
  2827. exit    lea    data,a5
  2828.     move.l    s3m(a5),d0
  2829.     beq.b    .eimem
  2830.     move.l    d0,a1
  2831.     move.l    s3mlen(a5),d0
  2832.     CLIB    Exec,FreeMem
  2833.     clr.l    s3m(a5)
  2834.  
  2835. .eimem    move.l    config(a5),d0
  2836.     beq.b    .eicfg
  2837.     move.l    d0,a1
  2838.     move.l    conlen(a5),d0
  2839.     CLIB    Exec,FreeMem
  2840.     clr.l    config(a5)
  2841.  
  2842. .eicfg    move.l    reqptr(a5),d0
  2843.     beq.b    nodh
  2844.     move.l    d0,a1
  2845.     C5LIB    RT,rtFreeRequest
  2846.     clr.l    reqptr(a5)
  2847.  
  2848. nodh    move.l    lock(a5),d1
  2849.     beq.b    nolock
  2850.     C5LIB    DOS,UnLock
  2851.     clr.l    lock(a5)
  2852.  
  2853. nolock    move.l    signaali(a5),d0
  2854.     bmi.b    .nsig
  2855.     CLIB    Exec,FreeSignal
  2856.     move.l    #-1,signaali(a5)
  2857.  
  2858. .nsig    move.l    winpoin(a5),d0
  2859.     beq.b    .nwin
  2860.     move.l    d0,a0
  2861.     C5LIB    Int,CloseWindow
  2862.     clr.l    winpoin(a5)
  2863.  
  2864. .nwin    move.l    fontaddr(a5),d0
  2865.     beq.b    .nofont
  2866.  
  2867.     move.l    d0,a1
  2868.     C5LIB    GFX,CloseFont
  2869.     clr.l    fontaddr(a5)
  2870.  
  2871. .nofont    move.l    _XpkBase(a5),d0
  2872.     beq.b    noxpk
  2873.     move.l    d0,a1
  2874.     CLIB    Exec,CloseLibrary
  2875.     clr.l    _XpkBase(a5)
  2876.  
  2877. noxpk    move.l    _PPBase(a5),a1
  2878.     CLIB    Exec,CloseLibrary
  2879.     clr.l    _PPBase(a5)
  2880.  
  2881.     move.l    _RTBase(a5),a1
  2882.     CALL    CloseLibrary
  2883.     clr.l    _RTBase(a5)
  2884.  
  2885.     CALL    Forbid
  2886.     move.l    segment(a5),d1
  2887.     C5LIB    DOS,UnLoadSeg
  2888.  
  2889.     move.l    _DOSBase(a5),a1
  2890.     CLIB    Exec,CloseLibrary
  2891.     clr.l    _DOSBase(a5)
  2892.  
  2893.     Pull    All
  2894.     moveq    #0,d0
  2895.     rts
  2896.  
  2897.  
  2898. *******************************
  2899.  
  2900. ;; Sets up an about window
  2901.  
  2902. aboutti    move.l    #1,defaultresponse(a5)
  2903.  
  2904.     lea    alkutext(a5),a1
  2905.     lea    tags(a5),a0
  2906.     sub.l    a3,a3
  2907.     move.l    a3,a4
  2908.  
  2909.     lea    contta3(a5),a2
  2910.  
  2911.     tst.l    s3m(a5)
  2912.     bne.b    .q
  2913.     lea    contta4(a5),a2
  2914.  
  2915. .q    C5LIB    RT,rtEZRequestA
  2916.     tst.l    d0
  2917.     bne.b    .con
  2918.  
  2919.     lea    alkutext2(a5),a1
  2920.     lea    tags(a5),a0
  2921.     sub.l    a3,a3
  2922.     move.l    a3,a4
  2923.     lea    contta(a5),a2
  2924.     C5LIB    RT,rtEZRequestA
  2925.     bra    positio
  2926.  
  2927. .con    subq.l    #1,d0
  2928.     beq    positio
  2929.  
  2930.     subq.l    #1,d0
  2931.     bne.b    .info
  2932.     bsr    showsamples
  2933.     bra    positio
  2934.  
  2935.  
  2936. .info    lea    vars,a1
  2937.  
  2938.     moveq    #0,d0
  2939.     move    numchans(a5),d0
  2940.     move.l    d0,(a1)+
  2941.  
  2942.     cmp    #mtMOD,mtype(a5)
  2943.     beq.b    .dd
  2944.  
  2945.     cmp    #mtMTM,mtype(a5)
  2946.     beq.b    .qqe
  2947.  
  2948.     cmp    #mtXM,mtype(a5)
  2949.     beq.b    .qqq
  2950.  
  2951.     lea    st3(a5),a2
  2952.     bra.b    .dq
  2953.  
  2954. .qqq    lea    xm(a5),a2
  2955.     bra.b    .dq
  2956.  
  2957. .qqe    lea    mtm(a5),a2
  2958.     bra.b    .dq
  2959.  
  2960. .dd    cmp    #4,numchans(a5)
  2961.     beq.b    .pro
  2962.     lea    fast(a5),a2
  2963.     bra.b    .dq
  2964. .pro    lea    pro(a5),a2
  2965. .dq    move.l    a2,(a1)+
  2966.  
  2967.     move.l    mname(a5),(a1)+
  2968.     move.l    #fname,(a1)+
  2969.  
  2970.     move.l    mixingrate(a5),(a1)+
  2971.     move.l    vboost(a5),(a1)+
  2972.  
  2973.     move    pmode(a5),d0    
  2974.     subq    #1,d0
  2975.     bne.b    .nsurr
  2976.     lea    surr(a5),a2
  2977.     bra.b    .deq
  2978.  
  2979. .nsurr    subq    #1,d0
  2980.     bne.b    .nster
  2981.     lea    ster(a5),a2
  2982.     bra.b    .deq
  2983.  
  2984. .nster    subq    #1,d0
  2985.     bne.b    .nmon
  2986.     lea    mon(a5),a2
  2987.     bra.b    .deq
  2988.  
  2989. .nmon    subq    #1,d0
  2990.     bne.b    .nreal
  2991.     lea    real(a5),a2
  2992.     bra.b    .deq
  2993.  
  2994. .nreal    lea    stereo14(a5),a2
  2995.  
  2996. .deq    move.l    a2,(a1)+
  2997.  
  2998.     cmp    #DISABLED,system(a5)
  2999.     beq.b    .dis
  3000.     move.l    #on,(a1)+
  3001.     bra.b    .ddq
  3002. .dis    move.l    #off,(a1)+
  3003. .ddq
  3004.     tst    opt020(a5)
  3005.     bne.b    .dis2
  3006.     move.l    #m000,(a1)+
  3007.     bra.b    .ddq2
  3008. .dis2    move.l    #m020,(a1)+
  3009. .ddq2
  3010.     lea    infos(a5),a1
  3011.     lea    tags(a5),a0
  3012.     sub.l    a3,a3
  3013.     lea    vars,a4
  3014.     lea    contta(a5),a2
  3015.     C5LIB    RT,rtEZRequestA
  3016.     bra    positio
  3017.  
  3018.  
  3019.  
  3020.  
  3021. ;; Draws the background texture
  3022.  
  3023. drawtexture
  3024.     lea    texture(a5),a0
  3025.     move.l    rast(a5),a1
  3026.     move.l    a1,a2
  3027.     move.l    a0,rp_AreaPtrn(a1)
  3028.     move.b    #1,rp_AreaPtSz(a1)
  3029.  
  3030.     moveq    #2,d0
  3031.     C5LIB    GFX,SetAPen
  3032.  
  3033.     move.l    a1,a2
  3034.     moveq    #3,d0
  3035.     moveq    #-1,d1
  3036.     move    #236,d2
  3037.     move    #79,d3
  3038.     add    topbor(a5),d1
  3039.     add    topbor(a5),d3
  3040.     CALL    RectFill
  3041.  
  3042.     lea    otextu(a5),a0
  3043.     move.l    a0,rp_AreaPtrn(a2)
  3044.     clr.b    rp_AreaPtSz(a2)
  3045.  
  3046.     move.l    a2,a1
  3047.     moveq    #3,d0
  3048.     moveq    #56,d1
  3049.     add    topbor(a5),d1
  3050.     CALL    Move
  3051.  
  3052.     move.l    a2,a1
  3053.     move    #236,d0
  3054.     moveq    #56,d1
  3055.     add    topbor(a5),d1
  3056.     CALL    Draw
  3057.  
  3058.     lea    gvolume(a5),a4
  3059. gadloop    
  3060.     move    4(a4),d0
  3061.     move    winstr+6(a5),d1
  3062.     add    6(a4),d1
  3063.     subq    #1,d1
  3064.  
  3065.     move    d0,d2
  3066.     move    d1,d3
  3067.     add    8(a4),d2
  3068.     add    10(a4),d3
  3069.     subq    #1,d2
  3070.     subq    #1,d3
  3071.     move.l    a2,a1
  3072.     C5LIB    GFX,RectFill
  3073.  
  3074.     move.l    (a4),d6
  3075.     move.l    a4,a1
  3076.     move.l    winpoin(a5),a0
  3077.     moveq    #-1,d0
  3078.     C5LIB    Int,AddGadget
  3079.     tst.l    d6
  3080.     beq.b    pesa        
  3081.     move.l    d6,a4
  3082.     bra.b    gadloop
  3083.  
  3084. pesa    lea    gvolume(a5),a0
  3085.     move.l    winpoin(a5),a1
  3086.     sub.l    a2,a2
  3087.     CALL    RefreshGadgets
  3088.     rts
  3089.  
  3090.  
  3091.     
  3092. ;; Xpk, FImp and PPdata loader
  3093.  
  3094. LoadData
  3095.     movem.l    d2-d7/a2-a6,-(sp)
  3096.     movem.l    d0-d2/a0/a1,-(sp)
  3097.  
  3098.     move.l    a0,d1
  3099.     move.l    #1005,d2
  3100.     C5LIB    DOS,Open
  3101. .d    tst.l    d0
  3102.     bmi.b    .err
  3103.     bne.b    .okei
  3104. .e    moveq    #-1,d0
  3105. .err    move.l    d0,errorcode(a5)
  3106.     movem.l    (sp)+,d0-d2/a0/a1
  3107.     bra    eifimp
  3108.  
  3109. .okei    move.l    d0,d7
  3110.     move.l    d0,d1
  3111.     move.l    #buhku,d2
  3112.     moveq    #8,d3
  3113.     CALL    Read
  3114.  
  3115.     move.l    d0,d2
  3116.     move.l    d7,d1
  3117.     CALL    Close
  3118.  
  3119.     move.l    d2,d0
  3120.     bmi.b    .err
  3121.     beq.b    .e
  3122.  
  3123.     movem.l    (sp)+,d0-d2/a0/a1
  3124.  
  3125.     cmp.l    #'XPKF',buhku(a5)
  3126.     bne.b    .x
  3127.     move.l    _XpkBase(a5),d3
  3128.     bne    XPK
  3129. .x    cmp.l    #'IMP!',buhku(a5)
  3130.     beq.b    .fimp
  3131.  
  3132.     movem.l    d0/d1/a0/a1,-(sp)
  3133.     C5LIB    PP,ppLoadData
  3134.     move.l    d0,errorcode(a5)
  3135.     move.l    d0,d2
  3136.     movem.l    (sp)+,d0/d1/a0/a1
  3137.     tst.l    d2
  3138.     beq    eifimp
  3139.     clr.l    (a1)
  3140.     bra    eifimp
  3141.  
  3142. .fimp    move.l    buhku+4(a5),d0
  3143.     move.l    d0,(a2)
  3144.     movem.l    a0/a1,-(sp)
  3145.     CLIB    Exec,AllocMem
  3146.     movem.l    (sp)+,a0/a1
  3147.  
  3148.     tst.l    d0
  3149.     bne.b    memokei
  3150.  
  3151.     moveq    #-3,d0
  3152.     move.l    d0,errorcode(a5)
  3153.     clr.l    (a1)
  3154.     bra.b    eifimp
  3155.     
  3156. memokei    move.l    d0,(a1)
  3157.  
  3158.     move.l    a1,-(sp)
  3159.     move.l    a0,d1
  3160.     move.l    #1005,d2
  3161.     C5LIB    DOS,Open
  3162. .d    tst.l    d0
  3163.     bmi.b    .err
  3164.     bne.b    .okei
  3165. .e    moveq    #-1,d0
  3166. .err    move.l    d0,errorcode(a5)
  3167.     move.l    (sp)+,a1
  3168.  
  3169.     move.l    (a1),d2
  3170.     move.l    (a2),d0
  3171.     clr.l    (a1)
  3172.     move.l    d2,a1
  3173.     CLIB    Exec,FreeMem
  3174.     bra    eifimp
  3175.  
  3176. .okei    move.l    d0,d7
  3177.     move.l    d0,d1
  3178.     move.l    (sp),a1
  3179.     move.l    (a1),d2
  3180.     move.l    (a2),d3
  3181.     CALL    Read
  3182.  
  3183.     move.l    d0,d2
  3184.     move.l    d7,d1
  3185.     CALL    Close
  3186.  
  3187.     move.l    d2,d0
  3188.     bmi.b    .err
  3189.     beq.b    .e
  3190.  
  3191.     move.l    (sp)+,a1
  3192.     move.l    (a1),a0
  3193.     clr.l    errorcode(a5)
  3194.     bsr.b    FImp_decrunch
  3195.  
  3196. eifimp    movem.l    (sp)+,d2-d7/a2-a6
  3197.     move.l    errorcode(a5),d0
  3198.     rts
  3199.  
  3200. XPK    move.l    a0,XpkFN(a5)
  3201.     move.l    a1,XpkTo(a5)
  3202.     move.l    a2,XpkFlen(a5)
  3203.     move.l    d1,XpkMem(a5)
  3204.     lea    XpkTags(a5),a0
  3205.     move.l    d3,a6
  3206.     CALL    XpkUnpack
  3207.     move.l    d0,errorcode(a5)
  3208.     bra.b    eifimp
  3209.  
  3210.  
  3211. ; Decrunch routine from FImp v2.34 by A.J. Brouwer
  3212. ; A0 must be pointing at the start of the decrunched data
  3213.  
  3214. FImp_decrunch
  3215.     movem.l    d2-d5/a2-a4,-(a7)
  3216.     move.l    a0,a3
  3217.     move.l    a0,a4
  3218.     tst.l    (a0)+
  3219.     adda.l    (a0)+,a4
  3220.     adda.l    (a0)+,a3
  3221.     move.l    a3,a2
  3222.     move.l    (a2)+,-(a0)
  3223.     move.l    (a2)+,-(a0)
  3224.     move.l    (a2)+,-(a0)
  3225.     move.l    (a2)+,d2
  3226.     move    (a2)+,d3
  3227.     bmi.b    lb_180e
  3228.     subq.l    #1,a3
  3229. lb_180e    lea    -$1c(a7),a7
  3230.     move.l    a7,a1
  3231.     moveq    #6,d0
  3232. lb_1816    move.l    (a2)+,(a1)+
  3233.     dbf    d0,lb_1816
  3234.     move.l    a7,a1
  3235.     bra.b    lb_1e90
  3236. lb_1822    moveq    #0,d0
  3237.     rts
  3238. lb_1e90    tst.l    d2
  3239.     beq.b    lb_1e9a
  3240. lb_1e94    move.b    -(a3),-(a4)
  3241.     subq.l    #1,d2
  3242.     bne.b    lb_1e94
  3243. lb_1e9a    cmpa.l    a4,a0
  3244.     bcs.b    lb_1eb2
  3245.     lea    $1c(a7),a7
  3246.     moveq    #-1,d0
  3247.     cmpa.l    a3,a0
  3248.     beq.b    lb_1eaa
  3249.     moveq    #0,d0
  3250. lb_1eaa    movem.l    (a7)+,d2-d5/a2-a4
  3251.     tst.l    d0
  3252.     rts
  3253. lb_1eb2    add.b    d3,d3
  3254.     bne.b    lb_1eba
  3255.     move.b    -(a3),d3
  3256.     addx.b    d3,d3
  3257. lb_1eba    bcc.b    lb_1f24
  3258.     add.b    d3,d3
  3259.     bne.b    lb_1ec4
  3260.     move.b    -(a3),d3
  3261.     addx.b    d3,d3
  3262. lb_1ec4    bcc.b    lb_1f1e
  3263.     add.b    d3,d3
  3264.     bne.b    lb_1ece
  3265.     move.b    -(a3),d3
  3266.     addx.b    d3,d3
  3267. lb_1ece    bcc.b    lb_1f18
  3268.     add.b    d3,d3
  3269.     bne.b    lb_1ed8
  3270.     move.b    -(a3),d3
  3271.     addx.b    d3,d3
  3272. lb_1ed8    bcc.b    lb_1f12
  3273.     moveq    #0,d4
  3274.     add.b    d3,d3
  3275.     bne.b    lb_1ee4
  3276.     move.b    -(a3),d3
  3277.     addx.b    d3,d3
  3278. lb_1ee4    bcc.b    lb_1eee
  3279.     move.b    -(a3),d4
  3280.     moveq    #3,d0
  3281.     subq.b    #1,d4
  3282.     bra.b    lb_1f28
  3283. lb_1eee    add.b    d3,d3
  3284.     bne.b    lb_1ef6
  3285.     move.b    -(a3),d3
  3286.     addx.b    d3,d3
  3287. lb_1ef6    addx.b    d4,d4
  3288.     add.b    d3,d3
  3289.     bne.b    lb_1f00
  3290.     move.b    -(a3),d3
  3291.     addx.b    d3,d3
  3292. lb_1f00    addx.b    d4,d4
  3293.     add.b    d3,d3
  3294.     bne.b    lb_1f0a
  3295.     move.b    -(a3),d3
  3296.     addx.b    d3,d3
  3297. lb_1f0a    addx.b    d4,d4
  3298.     addq.b    #5,d4
  3299.     moveq    #3,d0
  3300.     bra.b    lb_1f28
  3301. lb_1f12    moveq    #4,d4
  3302.     moveq    #3,d0
  3303.     bra.b    lb_1f28
  3304. lb_1f18    moveq    #3,d4
  3305.     moveq    #2,d0
  3306.     bra.b    lb_1f28
  3307. lb_1f1e    moveq    #2,d4
  3308.     moveq    #1,d0
  3309.     bra.b    lb_1f28
  3310. lb_1f24    moveq    #1,d4
  3311.     moveq    #0,d0
  3312. lb_1f28    moveq    #0,d5
  3313.     move    d0,d1
  3314.     add.b    d3,d3
  3315.     bne.b    lb_1f34
  3316.     move.b    -(a3),d3
  3317.     addx.b    d3,d3
  3318. lb_1f34    bcc.b    lb_1f4c
  3319.     add.b    d3,d3
  3320.     bne.b    lb_1f3e
  3321.     move.b    -(a3),d3
  3322.     addx.b    d3,d3
  3323. lb_1f3e    bcc.b    lb_1f48
  3324.     move.b    lb_1fac(pc,d0),d5
  3325.     addq.b    #8,d0
  3326.     bra.b    lb_1f4c
  3327. lb_1f48    moveq    #2,d5
  3328.     addq.b    #4,d0
  3329. lb_1f4c    move.b    lb_1fb0(pc,d0),d0
  3330. lb_1f50    add.b    d3,d3
  3331.     bne.b    lb_1f58
  3332.     move.b    -(a3),d3
  3333.     addx.b    d3,d3
  3334. lb_1f58    addx    d2,d2
  3335.     subq.b    #1,d0
  3336.     bne.b    lb_1f50
  3337.     add    d5,d2
  3338.     moveq    #0,d5
  3339.     move.l    d5,a2
  3340.     move    d1,d0
  3341.     add.b    d3,d3
  3342.     bne.b    lb_1f6e
  3343.     move.b    -(a3),d3
  3344.     addx.b    d3,d3
  3345. lb_1f6e    bcc.b    lb_1f8a
  3346.     add    d1,d1
  3347.     add.b    d3,d3
  3348.     bne.b    lb_1f7a
  3349.     move.b    -(a3),d3
  3350.     addx.b    d3,d3
  3351. lb_1f7a    bcc.b    lb_1f84
  3352.     move    8(a1,d1),a2
  3353.     addq.b    #8,d0
  3354.     bra.b    lb_1f8a
  3355. lb_1f84    move    (a1,d1),a2
  3356.     addq.b    #4,d0
  3357. lb_1f8a    move.b    16(a1,d0),d0
  3358. lb_1f8e    add.b    d3,d3
  3359.     bne.b    lb_1f96
  3360.     move.b    -(a3),d3
  3361.     addx.b    d3,d3
  3362. lb_1f96    addx.l    d5,d5
  3363.     subq.b    #1,d0
  3364.     bne.b    lb_1f8e
  3365.     addq    #1,a2
  3366.     adda.l    d5,a2
  3367.     adda.l    a4,a2
  3368. lb_1fa2    move.b    -(a2),-(a4)
  3369.     dbf    d4,lb_1fa2
  3370.     bra    lb_1e90
  3371.  
  3372. lb_1fac    dc.b    6,10,10,18
  3373. lb_1fb0    dc.b    1,1,1,1,2,3,3,4
  3374.     dc.b    4,5,7,14
  3375.  
  3376.  
  3377.  
  3378. ********
  3379.  
  3380.  
  3381. ; Error message in A0
  3382.  
  3383. error    movem.l    d0/d1/a1-a4,-(sp)
  3384.     cmp.b    #'a',(a0)
  3385.     blo.b    .e
  3386.  
  3387.     cmp.b    #'z',(a0)
  3388.     bhi.b    .e
  3389.  
  3390.     sub.b    #'a'-'A',(a0)            ; Upper case :)
  3391.  
  3392. .e    move.l    a0,a1
  3393.     lea    tags(a5),a0
  3394.     move.l    #1,defaultresponse(a5)
  3395.     sub.l    a3,a3
  3396.     move.l    a3,a4
  3397.     lea    errorgadget(a5),a2
  3398.     C5LIB    RT,rtEZRequestA
  3399.     movem.l    (sp)+,d0/d1/a1-a4
  3400.     rts
  3401.  
  3402.  
  3403. *******
  3404.  
  3405. *********************************
  3406. *       PS3M 0.9A ®        *
  3407. *      Version 0.960        *
  3408. *   © 1994-96 Jarno Paananen    *
  3409. *      All rights reserved    *
  3410. *********************************
  3411.  
  3412. ;; LEV4 - IRQ HANDLER
  3413.  
  3414. lev4    clr.l    playpos
  3415.     move    #$80,$dff09c
  3416.     nop
  3417.     rte
  3418.  
  3419. slev4    move    d1,$9c(a0)
  3420.     clr.l    (a1)
  3421.     rts
  3422.  
  3423.  
  3424. lev3    move.l    d0,-(sp)
  3425.     move    #$20,$dff09c
  3426.     move.l    mrate50,d0
  3427.     add.l    d0,playpos
  3428.     move.l    buffSizeMaskFF(pc),d0
  3429.     and.l    d0,playpos
  3430.     move.l    (sp)+,d0
  3431.     nop
  3432.     rte
  3433.  
  3434.  
  3435. lev6server
  3436.     move.l    mrate50-playpos(a1),d0
  3437.     add.l    d0,(a1)
  3438.     move.l    buffSizeMaskFF(pc),d0
  3439.     and.l    d0,(a1)
  3440.     moveq    #1,d0
  3441.     rts
  3442.  
  3443. buffSizeMaskFF
  3444.     dc.l    (BUFFER-1)<<8!$ff
  3445.  
  3446.  
  3447. play    ;movem.l    d0-a6,-(sp)
  3448.     lea    data,a5
  3449.  
  3450.     move.l    playpos(a5),d2
  3451.     lsr.l    #8,d2
  3452.     move.l    bufpos(a5),d0
  3453.     cmp.l    d2,d0
  3454.     ble.b    .norm
  3455.     sub.l    buffSize(a5),d0
  3456. .norm    move.l    mrate50(a5),d1
  3457.     lsr.l    #7,d1
  3458.     add.l    d0,d1
  3459.  
  3460.     sub.l    d1,d2
  3461.     bmi    .ei
  3462.  
  3463.     moveq    #1,d0
  3464.     and.l    d2,d0
  3465.     add    d0,d2
  3466.  
  3467.     cmp.l    #16,d2
  3468.     blt    .ei
  3469.  
  3470.     move    d2,todobytes(a5)
  3471.  
  3472. .mix    move    bytes2music(a5),d0
  3473.     cmp    todobytes(a5),d0
  3474.     bgt.b    .mixaa
  3475.  
  3476.     sub    d0,todobytes(a5)
  3477.     sub    d0,bytes2music(a5)
  3478.     move    d0,bytes2do(a5)
  3479.     beq.b    .q
  3480.     
  3481.     bsr    domix
  3482.  
  3483. .q    tst    PS3M_paused
  3484.     bne.b    .o
  3485.  
  3486.     tst    PS3M_play
  3487.     beq.b    .o
  3488.  
  3489.     cmp    #mtS3M,mtype(a5)
  3490.     bne.b    .xm
  3491.     bsr    s3m_music
  3492.     lea    data,a5
  3493.     bra.b    .kool
  3494.  
  3495. .xm    cmp    #mtXM,mtype(a5)
  3496.     bne.b    .mod
  3497.  
  3498.     bsr    xm_music
  3499.     lea    data,a5
  3500.     bra.b    .kool
  3501.  
  3502. .mod    bsr    mt_music            ; Also with MTMs
  3503.  
  3504. .kool    st    paivita(a5)
  3505.  
  3506.     cmp    #DISABLED,system(a5)
  3507.     beq.b    .o
  3508.  
  3509.     move.l    signaali(a5),d1
  3510.     moveq    #0,d0
  3511.     bset    d1,d0
  3512.     move.l    task,a1
  3513.     CLIB    Exec,Signal
  3514.  
  3515. .o    move    bytesperframe(a5),d0
  3516.     add    d0,bytes2music(a5)
  3517.     bra    .mix
  3518.  
  3519. .mixaa    move    todobytes(a5),d0
  3520.     sub    d0,bytes2music(a5)
  3521.     move    d0,bytes2do(a5)
  3522.     beq.b    .q2
  3523.  
  3524.     bsr    domix
  3525.  
  3526. .q2    lea    data,a5
  3527. .ei    moveq    #0,d7
  3528.     rts
  3529.  
  3530.  
  3531. init    clr    mtype(a5)
  3532.  
  3533.     move.l    s3m(a5),a0
  3534.     cmp.l    #'SCRM',44(a0)
  3535.     beq    .s3m
  3536.  
  3537.     move.l    (a0),d0
  3538.     lsr.l    #8,d0
  3539.     cmp.l    #'MTM',d0
  3540.     beq    .mtm
  3541.  
  3542.     move.l    a0,a1
  3543.     lea    xmsign(a5),a2
  3544.     moveq    #3,d0
  3545. .ll    cmpm.l    (a1)+,(a2)+
  3546.     bne.b    .jj
  3547.     dbf    d0,.ll
  3548.     bra    .xm
  3549.  
  3550. .jj    move.l    1080(a0),d0
  3551.     cmp.l    #'OCTA',d0
  3552.     beq    .fast8
  3553.     cmp.l    #'M.K.',d0
  3554.     beq    .pro4
  3555.     cmp.l    #'M!K!',d0
  3556.     beq    .pro4
  3557.     cmp.l    #'FLT4',d0
  3558.     beq    .pro4
  3559.  
  3560.     move.l    d0,d1
  3561.     and.l    #$ffffff,d1
  3562.     cmp.l    #'CHN',d1
  3563.     beq.b    .chn
  3564.  
  3565.     and.l    #$ffff,d1
  3566.     cmp.l    #'CH',d1
  3567.     beq.b    .ch
  3568.  
  3569.     move.l    d0,d1
  3570.     and.l    #$ffffff00,d1
  3571.     cmp.l    #'TDZ'<<8,d1
  3572.     beq.b    .tdz
  3573.     bra    .error
  3574.  
  3575. .chn    move.l    d0,d1
  3576.     swap    d1
  3577.     lsr    #8,d1
  3578.     sub    #'0',d1
  3579.     move    #mtMOD,mtype(a5)
  3580.     move    d1,numchans(a5)
  3581.     addq    #1,d1
  3582.     lsr    d1
  3583.     move    d1,maxchan(a5)
  3584.     bra    .init
  3585.  
  3586. .ch    move.l    d0,d1
  3587.     swap    d1
  3588.     sub    #'00',d1
  3589.     move    d1,d0
  3590.     lsr    #8,d0
  3591.     mulu    #10,d0
  3592.     and    #$f,d1
  3593.     add    d0,d1
  3594.  
  3595.     move    #mtMOD,mtype(a5)
  3596.     move    d1,numchans(a5)
  3597.     addq    #1,d1
  3598.     lsr    d1
  3599.     move    d1,maxchan(a5)
  3600.     bra.b    .init
  3601.  
  3602. .tdz    and.l    #$ff,d0
  3603.     sub    #'0',d0
  3604.     move    #mtMOD,mtype(a5)
  3605.     move    d0,numchans(a5)
  3606.     addq    #1,d0
  3607.     lsr    d0
  3608.     move    d0,maxchan(a5)
  3609.     bra.b    .init
  3610.  
  3611. .fast8    move    #mtMOD,mtype(a5)
  3612.     move    #8,numchans(a5)
  3613.     move    #4,maxchan(a5)
  3614.     bra.b    .init
  3615.  
  3616. .pro4    move    #mtMOD,mtype(a5)
  3617.     move    #4,numchans(a5)
  3618.     move    #2,maxchan(a5)
  3619.     bra.b    .init
  3620.  
  3621. .mtm    move    #mtMTM,mtype(a5)
  3622.     bra.b    .init
  3623.  
  3624. .xm    cmp    #$401,xmVersion(a0)        ; Kool turbo-optimizin'...
  3625.     bne    .jj
  3626.     move    #mtXM,mtype(a5)
  3627.     bra.b    .init
  3628.  
  3629. .s3m    move    #mtS3M,mtype(a5)
  3630.  
  3631.  
  3632. .init
  3633.  
  3634. ; TEMPORARY BUGFIX...
  3635.  
  3636.     cmp    #2,maxchan(a5)
  3637.     bhs.b    .opk
  3638.  
  3639.     move    #2,maxchan(a5)
  3640.  
  3641. .opk    tst    mtype(a5)
  3642.     beq.b    .error
  3643.  
  3644.     cmp    #mtS3M,mtype(a5)
  3645.     beq    s3m_init
  3646.  
  3647.     cmp    #mtMOD,mtype(a5)
  3648.     beq    mt_init
  3649.  
  3650.     cmp    #mtMTM,mtype(a5)
  3651.     beq    mtm_init
  3652.  
  3653.     cmp    #mtXM,mtype(a5)
  3654.     beq    xm_init
  3655.  
  3656. .error    moveq    #1,d0
  3657.     rts
  3658.  
  3659.  
  3660. FinalInit
  3661.     clr.l    bufpos(a5)
  3662.     clr.l    playpos(a5)
  3663.  
  3664.     clr    cn(a5)
  3665.     clr.b    mt_counter
  3666.  
  3667.     lea    buff1,a0
  3668.     moveq    #3,d6
  3669. .clloop
  3670.     move.l    (a0)+,d0
  3671.     beq.b    .skip
  3672.     move.l    d0,a1
  3673.  
  3674.     move.l    buffSize(a5),d7
  3675.     lsr.l    #2,d7
  3676.     subq.l    #1,d7
  3677. .cl    clr.l    (a1)+
  3678.     dbf    d7,.cl
  3679. .skip    dbf    d6,.clloop
  3680.  
  3681.     tst    PS3M_cont(a5)
  3682.     bne    .q
  3683.  
  3684. .huu    lea    cha0(a5),a0
  3685.     move    #mChanBlock_SIZE*16-1,d7
  3686. .cl2    clr    (a0)+
  3687.     dbf    d7,.cl2
  3688.  
  3689.     lea    c0(a5),a0
  3690.     move    #s3mChanBlock_SIZE*8-1,d7
  3691. .cl3    clr.l    (a0)+
  3692.     dbf    d7,.cl3
  3693.  
  3694.     move    tempo(a5),d0
  3695.     bne.b    .qw
  3696.     moveq    #125,d0
  3697. .qw    move.l    mrate(a5),d1
  3698.     move.l    d1,d2
  3699.     lsl.l    #2,d1
  3700.     add.l    d2,d1
  3701.     add    d0,d0
  3702.     divu    d0,d1
  3703.  
  3704.     addq    #1,d1
  3705.     and    #~1,d1
  3706.  
  3707.     move    d1,bytesperframe(a5)
  3708.     clr    bytes2do(a5)
  3709.  
  3710.     bset    #1,$bfe001
  3711.  
  3712.     bsr    makedivtabs
  3713.     bsr    Makevoltable
  3714.  
  3715.     ifeq    disable020
  3716.     
  3717.     move.l    4.w,a6
  3718.     btst    #1,297(a6)
  3719.     beq.b    .no020
  3720.  
  3721. ; Processor is 020+!
  3722.  
  3723.     st    opt020(a5)
  3724.     
  3725.     cmp    #STEREO14,pmode(a5)
  3726.     beq.b    .s14_020
  3727.  
  3728.     move.l    #mix_020,mixad1(a5)
  3729.     move.l    #mix2_020,mixad2(a5)
  3730.     bra.b    .e
  3731.  
  3732. .s14_020
  3733.     move.l    #mix16_020,mixad1(a5)
  3734.     move.l    #mix162_020,mixad2(a5)
  3735.     bra.b    .e
  3736.     endc
  3737.  
  3738. ; Processor is 000/010
  3739.  
  3740. .no020    clr    opt020(a5)
  3741.  
  3742.     cmp    #STEREO14,pmode(a5)
  3743.     beq.b    .s14_000
  3744.  
  3745.     move.l    #mix,mixad1(a5)
  3746.     move.l    #mix2,mixad2(a5)
  3747.     bra.b    .e
  3748.  
  3749. .s14_000
  3750.     move.l    #mix16,mixad1(a5)
  3751.     move.l    #mix162,mixad2(a5)
  3752.  
  3753. .e    cmp    #STEREO14,pmode(a5)
  3754.     bne.b    .nop
  3755.  
  3756.     move.l    #copybuf14,cbufad(a5)
  3757.  
  3758.     bsr    do14tab
  3759.     bra.b    .q
  3760.  
  3761. .nop    cmp    #REAL,pmode(a5)
  3762.     beq.b    .surr
  3763.  
  3764.     move.l    #copybuf,cbufad(a5)
  3765.     bra.b    .q
  3766.  
  3767. .surr    move.l    #copysurround,cbufad(a5)
  3768.  
  3769. .q    moveq    #0,d0
  3770.     rts
  3771.  
  3772.  
  3773.  
  3774.  
  3775. ; D0 = New position
  3776.  
  3777. setPosition
  3778.     move    d0,PS3M_position(a5)
  3779.     cmp    #mtS3M,mtype(a5)
  3780.     beq.b    .s3m
  3781.  
  3782.     cmp    #mtXM,mtype(a5)
  3783.     beq.b    .xm
  3784.  
  3785. ; MOD or MTM
  3786.     subq.b    #1,d0
  3787.     move.b    d0,mt_songpos
  3788.     clr.b    mt_pbreakpos
  3789.     st     mt_posjumpflag
  3790.     clr.b    mt_counter
  3791.     
  3792.     movem.l    d0-d4/a0-a6,-(sp)
  3793.     bra    mt_nextposition
  3794.  
  3795. ; S3M
  3796. .s3m    subq    #1,d0
  3797.     move    d0,pos(a5)
  3798.     clr    rows(a5)
  3799.     move.l    s3m(a5),a0
  3800.     move.b    initialspeed(a0),d0
  3801.     bne.b    .ok
  3802.     moveq    #6,d0
  3803. .ok    move    d0,spd(a5)
  3804.     clr    cn(a5)
  3805.     bra    burk
  3806.  
  3807. ; XM
  3808. .xm    subq    #1,d0
  3809.     move    d0,pos(a5)
  3810.     clr    rows(a5)
  3811.     clr    cn(a5)
  3812.     bra    burki
  3813.  
  3814. PS3M_pause
  3815.     tst    PS3M_paused(a5)
  3816.     beq.b    .restore
  3817.  
  3818. .save    lea    cha0,a0
  3819.     lea    saveArray(pc),a1
  3820.     moveq    #31,d0
  3821. .ll    move.b    mOnOff(a0),(a1)+
  3822.     st    mOnOff(a0)
  3823.     lea    mChanBlock_SIZE(a0),a0
  3824.     dbf    d0,.ll
  3825.     rts
  3826.  
  3827. .restore
  3828.     lea    cha0,a0
  3829.     lea    saveArray(pc),a1
  3830.     moveq    #31,d0
  3831. .l2    move.b    (a1)+,mOnOff(a0)
  3832.     lea    mChanBlock_SIZE(a0),a0
  3833.     dbf    d0,.l2
  3834.     rts
  3835.  
  3836. saveArray
  3837.     dcb.b    32
  3838.  
  3839.  
  3840.  
  3841.  
  3842.  
  3843. ;;***** Mixing routines *********
  3844.  
  3845.  
  3846. domix    lea    cha0(a5),a4
  3847.     lea    pantab(a5),a0
  3848.     moveq    #31,d7
  3849.     move.l    mixad1(a5),a1
  3850. .loo    tst.b    (a0)+
  3851.     beq.b    .n
  3852.     bmi.b    .n
  3853.  
  3854.     lea    tbuf,a2
  3855.     Push    a0/a1/d7
  3856.     jsr    (a1)                ; Mix
  3857.     Pull    a0/a1/d7
  3858.     move    #1,chans(a5)
  3859.     lea    mChanBlock_SIZE(a4),a4
  3860.     subq    #1,d7
  3861.     bra.b    .loo2
  3862.  
  3863. .n    lea    mChanBlock_SIZE(a4),a4
  3864.     dbf    d7,.loo
  3865.     bra.b    .ddq
  3866.  
  3867.  
  3868. .loo2    cmp    #1,maxchan(a5)
  3869.     beq.b    .ddq
  3870.  
  3871.     move.l    mixad2(a5),a1
  3872. .loka    tst.b    (a0)+
  3873.     beq.b    .n2
  3874.     bmi.b    .n2
  3875.  
  3876.     lea    tbuf,a2
  3877.     Push    a0/a1/d7
  3878.     jsr    (a1)
  3879.     Pull    a0/a1/d7
  3880.  
  3881. .n2    lea    mChanBlock_SIZE(a4),a4
  3882.     dbf    d7,.loka
  3883.  
  3884. .ddq    lea    tbuf,a0
  3885.     move.l    buff1(a5),a1
  3886.     move.l    buff3(a5),a4
  3887.     move.l    cbufad(a5),a2
  3888.     jsr    (a2)
  3889.  
  3890.  
  3891. right    lea    cha0(a5),a4
  3892.     lea    pantab(a5),a0
  3893.     move.l    mixad1(a5),a1
  3894.     moveq    #31,d7
  3895. .loo    tst.b    (a0)+
  3896.     bpl.b    .n
  3897.  
  3898.     lea    tbuf2,a2
  3899.     Push    a0/a1/d7
  3900.     jsr    (a1)
  3901.     Pull    a0/a1/d7
  3902.     move    #1,chans(a5)
  3903.     lea    mChanBlock_SIZE(a4),a4
  3904.     subq    #1,d7
  3905.     bra.b    .loo2
  3906.  
  3907. .n    lea    mChanBlock_SIZE(a4),a4
  3908.     dbf    d7,.loo
  3909.     bra.b    .ddq
  3910.  
  3911.  
  3912. .loo2    cmp    #1,maxchan(a5)
  3913.     beq.b    .ddq
  3914.     move.l    mixad2(a5),a1
  3915. .loka    tst.b    (a0)+
  3916.     bpl.b    .n2
  3917.  
  3918.     lea    tbuf2,a2
  3919.     Push    a0/a1/d7
  3920.     jsr    (a1)
  3921.     Pull    a0/a1/d7
  3922.  
  3923. .n2    lea    mChanBlock_SIZE(a4),a4
  3924.     dbf    d7,.loka
  3925.  
  3926. .ddq    lea    tbuf2,a0
  3927.     move.l    buff2(a5),a1
  3928.     move.l    buff4(a5),a4
  3929.     move.l    cbufad(a5),a2
  3930.     jsr    (a2)
  3931.  
  3932.     moveq    #0,d0
  3933.     move    bytes2do(a5),d0
  3934.     add.l    d0,bufpos(a5)
  3935.     move.l    buffSizeMask(a5),d0
  3936.     and.l    d0,bufpos(a5)
  3937.     clr    bytes2do(a5)
  3938.     rts
  3939.  
  3940.  
  3941. copybuf    move.l    bufpos(a5),d0
  3942.     move.l    d0,d1
  3943.     moveq    #0,d2
  3944.     move    bytes2do(a5),d2
  3945.     add.l    d2,d1
  3946.     cmp.l    buffSizeMask(a5),d1
  3947.     ble.b    .dd
  3948.  
  3949.     move.l    a1,a3
  3950.  
  3951.     move.l    buffSize(a5),d7
  3952.     sub.l    d0,d7
  3953.     lsr.l    #1,d7
  3954.     subq    #1,d7
  3955.     add.l    d0,a1
  3956.     lea    divtabs(a5),a2
  3957.     move    chans(a5),d0
  3958.     lsl    #2,d0
  3959.     move.l    -4(a2,d0),a2
  3960.  
  3961. .ldd    move    (a0)+,d2
  3962.     move.b    (a2,d2),(a1)+
  3963.     move    (a0)+,d2
  3964.     move.b    (a2,d2),(a1)+
  3965.     dbf    d7,.ldd
  3966.  
  3967.     move.l    a3,a1
  3968.     move.l    d1,d7
  3969.     sub.l    buffSize(a5),d7
  3970.     lsr.l    #1,d7
  3971.     subq    #1,d7
  3972.     bmi.b    .ddq
  3973. .ldd2    move    (a0)+,d2
  3974.     move.b    (a2,d2),(a1)+
  3975.     move    (a0)+,d2
  3976.     move.b    (a2,d2),(a1)+
  3977.     dbf    d7,.ldd2
  3978. .ddq    rts
  3979.  
  3980. .dd    add.l    d0,a1
  3981.     lea    divtabs(a5),a2
  3982.     move    chans(a5),d0
  3983.     lsl    #2,d0
  3984.     move.l    -4(a2,d0),a2
  3985.     move    bytes2do(a5),d7
  3986.     lsr    #1,d7
  3987.     subq    #1,d7
  3988. .ldd3    move    (a0)+,d1
  3989.     move.b    (a2,d1),(a1)+
  3990.     move    (a0)+,d1
  3991.     move.b    (a2,d1),(a1)+
  3992.     dbf    d7,.ldd3
  3993.     rts
  3994.  
  3995. copysurround
  3996.     move.l    bufpos(a5),d0
  3997.     move.l    d0,d1
  3998.  
  3999.     moveq    #0,d2
  4000.     move    bytes2do(a5),d2
  4001.     add.l    d2,d1
  4002.  
  4003.     cmp.l    buffSizeMask(a5),d1
  4004.     ble.b    .dd
  4005.  
  4006.     movem.l    a1/a4,-(sp)
  4007.  
  4008.     move.l    buffSize(a5),d7
  4009.     sub.l    d0,d7
  4010.     lsr.l    #1,d7
  4011.     subq    #1,d7
  4012.     add.l    d0,a1
  4013.     add.l    d0,a4
  4014.     lea    divtabs(a5),a2
  4015.     move    chans(a5),d0
  4016.     lsl    #2,d0
  4017.     move.l    -4(a2,d0),a2
  4018.  
  4019. .ldd    move    (a0)+,d2
  4020.     move.b    (a2,d2),d2
  4021.     move.b    d2,(a1)+
  4022.     not    d2
  4023.     move.b    d2,(a4)+
  4024.  
  4025.     move    (a0)+,d2
  4026.     move.b    (a2,d2),d2
  4027.     move.b    d2,(a1)+
  4028.     not    d2
  4029.     move.b    d2,(a4)+
  4030.     dbf    d7,.ldd
  4031.  
  4032.     movem.l    (sp)+,a1/a4
  4033.  
  4034.     move.l    d1,d7
  4035.     sub.l    buffSize(a5),d7
  4036.     lsr.l    #1,d7
  4037.     subq    #1,d7
  4038.     bmi.b    .ddq
  4039. .ldd2    move    (a0)+,d2
  4040.     move.b    (a2,d2),d2
  4041.     move.b    d2,(a1)+
  4042.     not    d2
  4043.     move.b    d2,(a4)+
  4044.  
  4045.     move    (a0)+,d2
  4046.     move.b    (a2,d2),d2
  4047.     move.b    d2,(a1)+
  4048.     not    d2
  4049.     move.b    d2,(a4)+
  4050.     dbf    d7,.ldd2
  4051. .ddq    rts
  4052.  
  4053. .dd    add.l    d0,a1
  4054.     add.l    d0,a4
  4055.     lea    divtabs(a5),a2
  4056.     move    chans(a5),d0
  4057.     lsl    #2,d0
  4058.     move.l    -4(a2,d0),a2
  4059.     move    bytes2do(a5),d7
  4060.     lsr    #1,d7
  4061.     subq    #1,d7
  4062. .ldd3    move    (a0)+,d2
  4063.     move.b    (a2,d2),d2
  4064.     move.b    d2,(a1)+
  4065.     not    d2
  4066.     move.b    d2,(a4)+
  4067.  
  4068.     move    (a0)+,d2
  4069.     move.b    (a2,d2),d2
  4070.     move.b    d2,(a1)+
  4071.     not    d2
  4072.     move.b    d2,(a4)+
  4073.     dbf    d7,.ldd3
  4074.     rts
  4075.  
  4076.  
  4077. copybuf14
  4078.     move.l    bufpos(a5),d0
  4079.     move.l    d0,d1
  4080.     moveq    #0,d2
  4081.     move    bytes2do(a5),d2
  4082.     add.l    d2,d1
  4083.     cmp.l    buffSizeMask(a5),d1
  4084.     ble.b    .dd
  4085.  
  4086.     movem.l    a1/a4,-(sp)
  4087.  
  4088.     move.l    buffSize(a5),d7
  4089.     sub.l    d0,d7
  4090.     subq    #1,d7
  4091.     add.l    d0,a1
  4092.     add.l    d0,a4
  4093.     moveq    #0,d2
  4094.     move.l    buff14(a5),a2
  4095.     moveq    #-2,d0
  4096. .ldd    move    (a0)+,d2
  4097.     and.l    d0,d2
  4098.     move.b    (a2,d2.l),(a1)+
  4099.     move.b    1(a2,d2.l),(a4)+
  4100.     dbf    d7,.ldd
  4101.  
  4102. .huu    movem.l    (sp)+,a1/a4
  4103.     move.l    d1,d7
  4104.     sub.l    buffSize(a5),d7
  4105.     subq    #1,d7
  4106.     bmi.b    .ddq
  4107.  
  4108. .ldd2    move    (a0)+,d2
  4109.     and.l    d0,d2
  4110.     move.b    (a2,d2.l),(a1)+
  4111.     move.b    1(a2,d2.l),(a4)+
  4112.     dbf    d7,.ldd2
  4113. .ddq    rts
  4114.  
  4115.  
  4116. .dd    add.l    d0,a1
  4117.     add.l    d0,a4
  4118.     move    bytes2do(a5),d7
  4119.     subq    #1,d7
  4120.     move.l    buff14(a5),a2
  4121.     moveq    #0,d2
  4122.     moveq    #-2,d0
  4123. .ldd3    move    (a0)+,d2
  4124.     and.l    d0,d2
  4125.     move.b    (a2,d2.l),(a1)+
  4126.     move.b    1(a2,d2.l),(a4)+
  4127.     dbf    d7,.ldd3
  4128.     rts
  4129.  
  4130.  
  4131. ; 000/010 Mixing routines
  4132.  
  4133. ; Mixing routine for the first channel (moves data)
  4134.  
  4135.  
  4136. mix    moveq    #0,d7
  4137.     move    bytes2do(a5),d7
  4138.     subq    #1,d7
  4139.     
  4140.     tst    mPeriod(a4)
  4141.     beq    .ty
  4142.     tst.b    mOnOff(a4)
  4143.     bne    .ty            ;sound off
  4144.  
  4145.     tst    mVolume(a4)
  4146.     beq    .vol0
  4147.  
  4148. .dw    move.l    clock(a5),d4
  4149.     divu    mPeriod(a4),d4
  4150.     swap    d4
  4151.     clr    d4
  4152.     lsr.l    #2,d4
  4153.  
  4154.     move.l    mrate(a5),d0
  4155.     divu    d0,d4
  4156.     swap    d4
  4157.     clr    d4
  4158.     rol.l    #4,d4
  4159.  
  4160.     move.l    vtabaddr(a5),d2
  4161.     move    mVolume(a4),d0
  4162.     mulu    PS3M_master(a5),d0
  4163.     lsr    #6,d0
  4164.     lsl.l    #8,d0
  4165.     add.l    d0,d2                ; Position in volume table
  4166.  
  4167.     move.l    (a4),a0                ;mStart
  4168.     move.l    mFPos(a4),d0
  4169.  
  4170.     moveq    #0,d3
  4171.     moveq    #0,d5
  4172.  
  4173.     move.l    mLength(a4),d6
  4174.     bne.b    .2
  4175.  
  4176.     tst.b    mLoop(a4)
  4177.     bne.b    .q
  4178.     st    mOnOff(a4)
  4179.     bra.b    .qw
  4180.  
  4181. .2    cmp.l    #$ffff,d6
  4182.     bls.b    .leii
  4183.     move    #$ffff,d6
  4184.  
  4185. .leii    cmp    #32,d7
  4186.     blt.b    .lep
  4187.     move.l    d4,d1
  4188.     swap    d1
  4189.     lsl.l    #5,d1
  4190.     swap    d1
  4191.     add.l    d0,d1
  4192.     cmp    d6,d1
  4193.     bhs.b    .lep
  4194.     pea    .leii(pc)
  4195.     bra    .mix32
  4196.  
  4197. .lep    move.b    (a0,d0),d2
  4198.     move.l    d2,a1
  4199.     add.l    d4,d0
  4200.     move.b    (a1),d3
  4201.     addx    d5,d0
  4202.     move    d3,(a2)+
  4203.  
  4204.     cmp    d6,d0
  4205.     bhs.b    .ddwq
  4206.     dbf    d7,.lep
  4207.     bra.b    .qw
  4208.  
  4209. .ddwq    tst.b    mLoop(a4)
  4210.     bne.b    .q
  4211.     st    mOnOff(a4)
  4212.     dbf    d7,.ty
  4213.     bra.b    .qw
  4214.  
  4215. .q    move.l    mLStart(a4),a0
  4216.     moveq    #0,d1
  4217.     move    d0,d1
  4218.     sub.l    mLength(a4),d1
  4219.     add.l    d1,a0
  4220.     move.l    mLLength(a4),d6
  4221.     sub.l    d1,d6
  4222.     move.l    d6,mLength(a4)
  4223.  
  4224.     cmp.l    #$ffff,d6
  4225.     bls.b    .j
  4226.     move    #$ffff,d6
  4227. .j    clr    d0                ;reset integer part
  4228.     dbf    d7,.leii
  4229.  
  4230. .qw    moveq    #0,d1
  4231.     move    d0,d1
  4232.     add.l    d1,a0
  4233.     clr    d0
  4234.     move.l    a0,(a4)                ;mStart
  4235.     move.l    d0,mFPos(a4)
  4236.  
  4237.     sub.l    d1,mLength(a4)
  4238.     bpl.b    .u
  4239.  
  4240.     tst.b    mLoop(a4)
  4241.     bne.b    .q2
  4242.     st    mOnOff(a4)
  4243.     bra.b    .u
  4244.  
  4245. .q2    move.l    mLLength(a4),d6
  4246.     sub.l    (a4),a0
  4247.     add.l    mLStart(a4),a0
  4248.     sub.l    d6,a0
  4249.     add.l    d6,mLength(a4)
  4250.     move.l    a0,(a4)                ; mStart
  4251. .u    rts
  4252.  
  4253. .ty    addq    #1,d7
  4254.     beq.b    .u
  4255.  
  4256.     move.l    #$800080,d0
  4257.     lsr    d7
  4258.     bcc.b    .sk
  4259.     move    d0,(a2)+
  4260. .sk    subq    #1,d7
  4261.     bmi.b    .u
  4262. .lk    move.l    d0,(a2)+
  4263.     dbf    d7,.lk
  4264.     rts
  4265.  
  4266. .mix32    rept    16
  4267.     move.b    (a0,d0),d2
  4268.     move.l    d2,a1
  4269.     move.b    (a1),d3
  4270.     add.l    d4,d0
  4271.     addx    d5,d0
  4272.     swap    d3
  4273.     move.b    (a0,d0),d2
  4274.     move.l    d2,a1
  4275.     move.b    (a1),d3
  4276.     move.l    d3,(a2)+
  4277.     add.l    d4,d0
  4278.     addx    d5,d0
  4279.     endr
  4280.  
  4281.     sub    #32,d7
  4282.     rts
  4283.  
  4284.  
  4285.  
  4286. .vol0    move.l    clock(a5),d4
  4287.     divu    mPeriod(a4),d4        ;period
  4288.     swap    d4
  4289.     clr    d4
  4290.     lsr.l    #2,d4
  4291.  
  4292.     move.l    mrate(a5),d0
  4293.     divu    d0,d4
  4294.     swap    d4
  4295.     clr    d4
  4296.     rol.l    #4,d4
  4297.     swap    d4
  4298.  
  4299.     move.l    (a4),a0            ;mStart
  4300.     move.l    mFPos(a4),d0
  4301.  
  4302.     addq    #1,d7
  4303.  
  4304.     movem.l    d0/d1,-(sp)
  4305.     move.l    d7,d1
  4306.     move.l    d4,d0
  4307.     bsr    mulu_32
  4308.     move.l    d0,d4
  4309.     movem.l    (sp)+,d0/d1
  4310.  
  4311.     subq    #1,d7
  4312.  
  4313.     swap    d0
  4314.     add.l    d4,d0            ; Position after "mixing"
  4315.     swap    d0
  4316.     
  4317.     moveq    #0,d1
  4318.     move    d0,d1
  4319.     add.l    d1,a0
  4320.     clr    d0
  4321.     move.l    a0,(a4)
  4322.     move.l    d0,mFPos(a4)
  4323.     sub.l    d1,mLength(a4)
  4324.     bpl    .ty            ; OK, Done!
  4325.  
  4326. ; We're about to mix past the end of the sample
  4327.  
  4328.     tst.b    mLoop(a4)
  4329.     bne.b    .q3
  4330.     st    mOnOff(a4)
  4331.     bra    .ty
  4332.  
  4333. .q3    move.l    mLLength(a4),d6
  4334. .loop    sub.l    d6,a0
  4335.     add.l    d6,mLength(a4)
  4336.     bmi.b    .loop
  4337.     beq.b    .loop
  4338.  
  4339.     move.l    a0,(a4)
  4340.     bra    .ty
  4341.  
  4342.  
  4343.  
  4344. ; Mixing routine for rest of the channels (adds data)
  4345.  
  4346. mix2    moveq    #0,d7
  4347.     move    bytes2do(a5),d7
  4348.  
  4349.     tst    mPeriod(a4)
  4350.     beq    .ty
  4351.     tst.b    mOnOff(a4)
  4352.     bne    .ty            ;noloop
  4353.  
  4354.     tst    mVolume(a4)
  4355.     beq    .vol0
  4356.  
  4357. .dw    subq    #1,d7
  4358.  
  4359.     move.l    clock(a5),d4
  4360.     divu    mPeriod(a4),d4
  4361.     swap    d4
  4362.     clr    d4
  4363.     lsr.l    #2,d4
  4364.  
  4365.     move.l    mrate(a5),d0
  4366.     divu    d0,d4
  4367.     swap    d4
  4368.     clr    d4
  4369.     rol.l    #4,d4
  4370.  
  4371.     move.l    vtabaddr(a5),d2
  4372.     move    mVolume(a4),d0
  4373.     mulu    PS3M_master(a5),d0
  4374.     lsr    #6,d0
  4375.     lsl.l    #8,d0
  4376.     add.l    d0,d2
  4377.  
  4378.     move.l    (a4),a0            ;mStart
  4379.     move.l    mFPos(a4),d0
  4380.  
  4381.     moveq    #0,d3
  4382.     moveq    #0,d5
  4383.  
  4384.     move.l    mLength(a4),d6
  4385.     bne.b    .2
  4386.  
  4387.     tst.b    mLoop(a4)
  4388.     bne.b    .q
  4389.     st    mOnOff(a4)
  4390.     bra.b    .qw
  4391.  
  4392. .2    cmp.l    #$ffff,d6
  4393.     bls.b    .leii
  4394.     move    #$ffff,d6
  4395.  
  4396. .leii    cmp    #32,d7
  4397.     blt.b    .lep
  4398.     move.l    d4,d1
  4399.     swap    d1
  4400.     lsl.l    #5,d1
  4401.     swap    d1
  4402.     add.l    d0,d1
  4403.     cmp    d6,d1
  4404.     bhs.b    .lep
  4405.     pea    .leii(pc)
  4406.     bra    .mix32
  4407.  
  4408. .lep    move.b    (a0,d0),d2
  4409.     move.l    d2,a1
  4410.     add.l    d4,d0
  4411.     move.b    (a1),d3
  4412.     addx    d5,d0
  4413.     add    d3,(a2)+
  4414.  
  4415.     cmp    d6,d0
  4416.     bhs.b    .ddwq
  4417.     dbf    d7,.lep
  4418.     bra.b    .qw
  4419.  
  4420. .ddwq    tst.b    mLoop(a4)
  4421.     bne.b    .q
  4422.     st    mOnOff(a4)
  4423.     dbf    d7,.tyy
  4424.     bra.b    .qw
  4425.  
  4426. .q    move.l    mLStart(a4),a0
  4427.     moveq    #0,d1
  4428.     move    d0,d1
  4429.     sub.l    mLength(a4),d1
  4430.     add.l    d1,a0
  4431.     move.l    mLLength(a4),d6
  4432.     sub.l    d1,d6
  4433.     move.l    d6,mLength(a4)
  4434.     cmp.l    #$ffff,d6
  4435.     bls.b    .j
  4436.     move    #$ffff,d6
  4437. .j    clr    d0            ;reset integer part
  4438.     dbf    d7,.leii
  4439.  
  4440. .qw    moveq    #0,d1
  4441.     move    d0,d1
  4442.     add.l    d1,a0
  4443.     clr    d0
  4444.     move.l    a0,(a4)
  4445.     move.l    d0,mFPos(a4)
  4446.  
  4447.     sub.l    d1,mLength(a4)
  4448.     bpl.b    .u
  4449.  
  4450.     tst.b    mLoop(a4)
  4451.     bne.b    .q2
  4452.     st    mOnOff(a4)
  4453.     bra.b    .u
  4454.  
  4455. .q2    move.l    mLLength(a4),d6
  4456.     sub.l    (a4),a0
  4457.     add.l    mLStart(a4),a0
  4458.     sub.l    d6,a0
  4459.     add.l    d6,mLength(a4)
  4460.     move.l    a0,(a4)
  4461.  
  4462. .u    addq    #1,chans(a5)
  4463. .ty    rts
  4464.  
  4465. .tyy    addq    #1,d7
  4466.     beq.b    .u
  4467.  
  4468.     move.l    #$800080,d0
  4469.     lsr    d7
  4470.     bcc.b    .sk
  4471.     add    d0,(a2)+
  4472. .sk    subq    #1,d7
  4473.     bmi.b    .u
  4474. .lk    add.l    d0,(a2)+
  4475.     dbf    d7,.lk
  4476.     bra.b    .u
  4477.  
  4478. .mix32    rept    16
  4479.     move.b    (a0,d0),d2
  4480.     move.l    d2,a1
  4481.     move.b    (a1),d3
  4482.     add.l    d4,d0
  4483.     addx    d5,d0
  4484.     swap    d3
  4485.     move.b    (a0,d0),d2
  4486.     move.l    d2,a1
  4487.     move.b    (a1),d3
  4488.     add.l    d3,(a2)+
  4489.     add.l    d4,d0
  4490.     addx    d5,d0
  4491.     endr
  4492.     sub    #32,d7
  4493.     rts
  4494.  
  4495.  
  4496. .vol0    move.l    clock(a5),d4
  4497.     divu    mPeriod(a4),d4
  4498.     swap    d4
  4499.     clr    d4
  4500.     lsr.l    #2,d4
  4501.  
  4502.     move.l    mrate(a5),d0
  4503.     divu    d0,d4
  4504.     swap    d4
  4505.     clr    d4
  4506.     rol.l    #4,d4
  4507.     swap    d4
  4508.  
  4509.     move.l    (a4),a0            ;pos (addr)
  4510.     move.l    mFPos(a4),d0
  4511.  
  4512.     addq    #1,d7
  4513.     movem.l    d0/d1,-(sp)
  4514.     move.l    d7,d1
  4515.     move.l    d4,d0
  4516.     bsr    mulu_32
  4517.     move.l    d0,d4
  4518.     movem.l    (sp)+,d0/d1
  4519.  
  4520.     subq    #1,d7
  4521.     swap    d0
  4522.     add.l    d4,d0            ; Position after "mixing"
  4523.     swap    d0
  4524.     
  4525.     moveq    #0,d1
  4526.     move    d0,d1
  4527.     add.l    d1,a0
  4528.     clr    d0
  4529.     move.l    a0,(a4)
  4530.     move.l    d0,mFPos(a4)
  4531.     sub.l    d1,mLength(a4)
  4532.     bpl    .ty            ; OK, Done!
  4533.  
  4534. ; We're about to mix past the end of the sample
  4535.  
  4536.     tst.b    mLoop(a4)
  4537.     bne.b    .q3
  4538.     st    mOnOff(a4)
  4539.     bra    .ty
  4540.  
  4541. .q3    move.l    mLLength(a4),d6
  4542. .loop    sub.l    d6,a0
  4543.     add.l    d6,mLength(a4)
  4544.     bmi.b    .loop
  4545.     beq.b    .loop
  4546.  
  4547.     move.l    a0,(a4)
  4548.     bra    .ty
  4549.  
  4550.  
  4551. ; 16-bit mixing routine for first channel (moves data)
  4552.  
  4553. mix16    moveq    #0,d7
  4554.     move    bytes2do(a5),d7
  4555.     subq    #1,d7
  4556.  
  4557.     tst    mPeriod(a4)
  4558.     beq    .ty
  4559.     tst.b    mOnOff(a4)
  4560.     bne    .ty
  4561.  
  4562.     tst    mVolume(a4)
  4563.     beq    .vol0
  4564.  
  4565. .dw    move.l    clock(a5),d4
  4566.     divu    mPeriod(a4),d4
  4567.     swap    d4
  4568.     clr    d4
  4569.     lsr.l    #2,d4
  4570.  
  4571.     move.l    mrate(a5),d0
  4572.     divu    d0,d4
  4573.     swap    d4
  4574.     clr    d4
  4575.     rol.l    #4,d4
  4576.  
  4577.     move.l    vtabaddr(a5),a3
  4578.     move    mVolume(a4),d0
  4579.     mulu    PS3M_master(a5),d0
  4580.     lsr    #6,d0
  4581.     add    d0,d0
  4582.     lsl.l    #8,d0
  4583.     add.l    d0,a3                ; Position in volume table
  4584.  
  4585.     move.l    (a4),a0                ;mStart
  4586.     move.l    mFPos(a4),d0
  4587.  
  4588.     moveq    #0,d3
  4589.     moveq    #0,d5
  4590.  
  4591.     move.l    mLength(a4),d6
  4592.     bne.b    .2
  4593.  
  4594.     tst.b    mLoop(a4)
  4595.     bne.b    .q
  4596.     st    mOnOff(a4)
  4597.     bra.b    .qw
  4598.  
  4599. .2    cmp.l    #$ffff,d6
  4600.     bls.b    .leii
  4601.     move    #$ffff,d6
  4602.  
  4603. .leii    cmp    #32,d7
  4604.     blt.b    .lep
  4605.     move.l    d4,d1
  4606.     swap    d1
  4607.     lsl.l    #5,d1
  4608.     swap    d1
  4609.     add.l    d0,d1
  4610.     cmp    d6,d1
  4611.     bhs.b    .lep
  4612.     pea    .leii(pc)
  4613.     bra    .mix32
  4614.  
  4615. .lep    moveq    #0,d2
  4616.     move.b    (a0,d0),d2
  4617.     add    d2,d2
  4618.     add.l    d4,d0
  4619.     move    (a3,d2),(a2)+
  4620.     addx    d5,d0
  4621.  
  4622.     cmp    d6,d0
  4623.     bhs.b    .ddwq
  4624.     dbf    d7,.lep
  4625.     bra.b    .qw
  4626.  
  4627. .ddwq    tst.b    mLoop(a4)
  4628.     bne.b    .q
  4629.     st    mOnOff(a4)
  4630.     dbf    d7,.ty
  4631.     bra.b    .qw
  4632.  
  4633. .q    move.l    mLStart(a4),a0
  4634.     moveq    #0,d1
  4635.     move    d0,d1
  4636.     sub.l    mLength(a4),d1
  4637.     add.l    d1,a0
  4638.     move.l    mLLength(a4),d6
  4639.     sub.l    d1,d6
  4640.     move.l    d6,mLength(a4)
  4641.  
  4642.     cmp.l    #$ffff,d6
  4643.     bls.b    .j
  4644.     move    #$ffff,d6
  4645. .j    clr    d0                ;reset integer part
  4646.     dbf    d7,.leii
  4647.  
  4648. .qw    moveq    #0,d1
  4649.     move    d0,d1
  4650.     add.l    d1,a0
  4651.     clr    d0
  4652.     move.l    a0,(a4)                ;mStart
  4653.     move.l    d0,mFPos(a4)
  4654.  
  4655.     sub.l    d1,mLength(a4)
  4656.     bpl.b    .u
  4657.  
  4658.     tst.b    mLoop(a4)
  4659.     bne.b    .q2
  4660.     st    mOnOff(a4)
  4661.     bra.b    .u
  4662.  
  4663. .q2    move.l    mLLength(a4),d6
  4664.     sub.l    (a4),a0
  4665.     add.l    mLStart(a4),a0
  4666.     sub.l    d6,a0
  4667.     add.l    d6,mLength(a4)
  4668.     move.l    a0,(a4)                ; mStart
  4669. .u    rts
  4670.  
  4671. .ty    addq    #1,d7
  4672.     beq.b    .u
  4673.  
  4674.     moveq    #0,d0
  4675.     lsr    d7
  4676.     bcc.b    .sk
  4677.     move    d0,(a2)+
  4678. .sk    subq    #1,d7
  4679.     bmi.b    .u
  4680. .lk    move.l    d0,(a2)+
  4681.     dbf    d7,.lk
  4682.     rts
  4683.  
  4684. .mix32    rept    32
  4685.  
  4686.     moveq    #0,d2
  4687.     move.b    (a0,d0),d2
  4688.     add    d2,d2
  4689.     add.l    d4,d0
  4690.     move    (a3,d2),(a2)+
  4691.     addx    d5,d0
  4692.  
  4693.     endr
  4694.  
  4695.     sub    #32,d7
  4696.     rts
  4697.  
  4698.  
  4699. .vol0    move.l    clock(a5),d4
  4700.     divu    mPeriod(a4),d4        ;period
  4701.     swap    d4
  4702.     clr    d4
  4703.     lsr.l    #2,d4
  4704.  
  4705.     move.l    mrate(a5),d0
  4706.     divu    d0,d4
  4707.     swap    d4
  4708.     clr    d4
  4709.     rol.l    #4,d4
  4710.     swap    d4
  4711.  
  4712.     move.l    (a4),a0            ;mStart
  4713.     move.l    mFPos(a4),d0
  4714.  
  4715.     addq    #1,d7
  4716.  
  4717.     movem.l    d0/d1,-(sp)
  4718.     move.l    d7,d1
  4719.     move.l    d4,d0
  4720.     bsr    mulu_32
  4721.     move.l    d0,d4
  4722.     movem.l    (sp)+,d0/d1
  4723.  
  4724.     subq    #1,d7
  4725.  
  4726.     swap    d0
  4727.     add.l    d4,d0            ; Position after "mixing"
  4728.     swap    d0
  4729.     
  4730.     moveq    #0,d1
  4731.     move    d0,d1
  4732.     add.l    d1,a0
  4733.     clr    d0
  4734.     move.l    a0,(a4)
  4735.     move.l    d0,mFPos(a4)
  4736.     sub.l    d1,mLength(a4)
  4737.     bpl    .ty            ; OK, Done!
  4738.  
  4739. ; We're about to mix past the end of the sample
  4740.  
  4741.     tst.b    mLoop(a4)
  4742.     bne.b    .q3
  4743.     st    mOnOff(a4)
  4744.     bra    .ty
  4745.  
  4746. .q3    move.l    mLLength(a4),d6
  4747. .loop    sub.l    d6,a0
  4748.     add.l    d6,mLength(a4)
  4749.     bmi.b    .loop
  4750.     beq.b    .loop
  4751.  
  4752.     move.l    a0,(a4)
  4753.     bra    .ty
  4754.  
  4755.  
  4756.  
  4757. ; Mixing routine for rest of the channels (adds data)
  4758.  
  4759. mix162    moveq    #0,d7
  4760.     move    bytes2do(a5),d7
  4761.  
  4762.     tst    mPeriod(a4)
  4763.     beq    .ty
  4764.     tst.b    mOnOff(a4)
  4765.     bne    .ty
  4766.  
  4767.     tst    mVolume(a4)
  4768.     beq    .vol0
  4769.  
  4770. .dw    subq    #1,d7
  4771.  
  4772.     move.l    clock(a5),d4
  4773.     divu    mPeriod(a4),d4
  4774.     swap    d4
  4775.     clr    d4
  4776.     lsr.l    #2,d4
  4777.  
  4778.     move.l    mrate(a5),d0
  4779.     divu    d0,d4
  4780.     swap    d4
  4781.     clr    d4
  4782.     rol.l    #4,d4
  4783.  
  4784.     move.l    vtabaddr(a5),a3
  4785.     move    mVolume(a4),d0        ;volu
  4786.     mulu    PS3M_master(a5),d0
  4787.     lsr    #6,d0
  4788.     add    d0,d0
  4789.     lsl.l    #8,d0
  4790.     add.l    d0,a3
  4791.  
  4792.     move.l    (a4),a0            ;mStart
  4793.     move.l    mFPos(a4),d0
  4794.  
  4795.     moveq    #0,d3
  4796.     moveq    #0,d5
  4797.  
  4798.     move.l    mLength(a4),d6
  4799.     bne.b    .2
  4800.  
  4801.     tst.b    mLoop(a4)
  4802.     bne.b    .q
  4803.     st    mOnOff(a4)
  4804.     bra.b    .qw
  4805.  
  4806. .2    cmp.l    #$ffff,d6
  4807.     bls.b    .leii
  4808.     move    #$ffff,d6
  4809.  
  4810. .leii    cmp    #32,d7
  4811.     blt.b    .lep
  4812.     move.l    d4,d1
  4813.     swap    d1
  4814.     lsl.l    #5,d1
  4815.     swap    d1
  4816.     add.l    d0,d1
  4817.     cmp    d6,d1
  4818.     bhs.b    .lep
  4819.     pea    .leii(pc)
  4820.     bra    .mix32
  4821.  
  4822. .lep    moveq    #0,d2
  4823.     move.b    (a0,d0),d2
  4824.     add    d2,d2
  4825.     add.l    d4,d0
  4826.     move    (a3,d2),d3
  4827.     addx    d5,d0
  4828.     add    d3,(a2)+
  4829.  
  4830.     cmp    d6,d0
  4831.     bhs.b    .ddwq
  4832.     dbf    d7,.lep
  4833.     bra.b    .qw
  4834.  
  4835. .ddwq    tst.b    mLoop(a4)
  4836.     bne.b    .q
  4837.     st    mOnOff(a4)
  4838.     dbf    d7,.tyy
  4839.     bra.b    .qw
  4840.  
  4841. .q    move.l    mLStart(a4),a0
  4842.     moveq    #0,d1
  4843.     move    d0,d1
  4844.     sub.l    mLength(a4),d1
  4845.     add.l    d1,a0
  4846.     move.l    mLLength(a4),d6
  4847.     sub.l    d1,d6
  4848.     move.l    d6,mLength(a4)
  4849.     cmp.l    #$ffff,d6
  4850.     bls.b    .j
  4851.     move    #$ffff,d6
  4852. .j    clr    d0            ;reset integer part
  4853.     dbf    d7,.leii
  4854.  
  4855. .qw    moveq    #0,d1
  4856.     move    d0,d1
  4857.     add.l    d1,a0
  4858.     clr    d0
  4859.     move.l    a0,(a4)
  4860.     move.l    d0,mFPos(a4)
  4861.  
  4862.     sub.l    d1,mLength(a4)
  4863.     bpl.b    .u
  4864.  
  4865.     tst.b    mLoop(a4)
  4866.     bne.b    .q2
  4867.     st    mOnOff(a4)
  4868.     bra.b    .u
  4869.  
  4870. .q2    move.l    mLLength(a4),d6
  4871.     sub.l    (a4),a0
  4872.     add.l    mLStart(a4),a0
  4873.     sub.l    d6,a0
  4874.     add.l    d6,mLength(a4)
  4875.     move.l    a0,(a4)
  4876.  
  4877. .u
  4878. .ty
  4879. .tyy
  4880.     rts
  4881.  
  4882.  
  4883. .mix32    rept    32
  4884.     moveq    #0,d2
  4885.     move.b    (a0,d0),d2
  4886.     add    d2,d2
  4887.     move    (a3,d2),d3
  4888.     add    d3,(a2)+
  4889.     add.l    d4,d0
  4890.     addx    d5,d0
  4891.     endr
  4892.     sub    #32,d7
  4893.     rts
  4894.  
  4895. .vol0    move.l    clock(a5),d4
  4896.     divu    mPeriod(a4),d4
  4897.     swap    d4
  4898.     clr    d4
  4899.     lsr.l    #2,d4
  4900.  
  4901.     move.l    mrate(a5),d0
  4902.     divu    d0,d4
  4903.     swap    d4
  4904.     clr    d4
  4905.     rol.l    #4,d4
  4906.     swap    d4
  4907.  
  4908.     move.l    (a4),a0            ;pos (addr)
  4909.     move.l    mFPos(a4),d0
  4910.  
  4911.     addq    #1,d7
  4912.     movem.l    d0/d1,-(sp)
  4913.     move.l    d7,d1
  4914.     move.l    d4,d0
  4915.     bsr    mulu_32
  4916.     move.l    d0,d4
  4917.     movem.l    (sp)+,d0/d1
  4918.  
  4919.     subq    #1,d7
  4920.     swap    d0
  4921.     add.l    d4,d0            ; Position after "mixing"
  4922.     swap    d0
  4923.     
  4924.     moveq    #0,d1
  4925.     move    d0,d1
  4926.     add.l    d1,a0
  4927.     clr    d0
  4928.     move.l    a0,(a4)
  4929.     move.l    d0,mFPos(a4)
  4930.     sub.l    d1,mLength(a4)
  4931.     bpl    .ty            ; OK, Done!
  4932.  
  4933. ; We're about to mix past the end of the sample
  4934.  
  4935.     tst.b    mLoop(a4)
  4936.     bne.b    .q3
  4937.     st    mOnOff(a4)
  4938.     bra    .ty
  4939.  
  4940. .q3    move.l    mLLength(a4),d6
  4941. .loop    sub.l    d6,a0
  4942.     add.l    d6,mLength(a4)
  4943.     bmi.b    .loop
  4944.     beq.b    .loop
  4945.  
  4946.     move.l    a0,(a4)
  4947.     bra    .ty
  4948.  
  4949.  
  4950.     ifeq    disable020
  4951.  
  4952. ; 020+ Optimized versions!
  4953.  
  4954. ; Mixing routine for the first channel (moves data)
  4955.  
  4956.  
  4957. mix_020    moveq    #0,d7
  4958.     move    bytes2do(a5),d7
  4959.     tst    mPeriod(a4)
  4960.     beq    .ty
  4961.     tst.b    mOnOff(a4)
  4962.     bne    .ty
  4963.  
  4964.     tst    mVolume(a4)
  4965.     beq    .vol0
  4966.  
  4967. .dw    move.l    clock(a5),d4
  4968.     moveq    #0,d0
  4969.     move    mPeriod(a4),d0
  4970.  
  4971.     divu.l    d0,d4
  4972.  
  4973.     lsl.l    #8,d4
  4974.     lsl.l    #6,d4
  4975.  
  4976.     move.l    mrate(a5),d0
  4977.     lsr.l    #4,d0
  4978.  
  4979.     divu.l    d0,d4
  4980.     swap    d4
  4981.  
  4982.     move.l    vtabaddr(a5),d2
  4983.     move    mVolume(a4),d0
  4984.     mulu    PS3M_master(a5),d0
  4985.     lsr    #6,d0
  4986.     lsl.l    #8,d0
  4987.     add.l    d0,d2            ; Position in volume table
  4988.  
  4989.     move.l    (a4),a0            ;pos (addr)
  4990.     move.l    mFPos(a4),d0        ;fpos
  4991.  
  4992.     move.l    mLength(a4),d6        ;len
  4993.     beq    .resloop
  4994.  
  4995.     cmp.l    #$ffff,d6
  4996.     bls.b    .restart
  4997.     move    #$ffff,d6
  4998. .restart
  4999.     swap    d6
  5000.     swap    d0
  5001.     sub.l    d0,d6
  5002.     swap    d0
  5003.     move.l    d4,d5
  5004.     swap    d5
  5005.  
  5006.     divul.l    d5,d5:d6        ; bytes left to loop end
  5007.     tst.l    d5
  5008.     beq.b    .e
  5009.     addq.l    #1,d6
  5010. .e
  5011.     moveq    #0,d3
  5012.     moveq    #0,d5
  5013. .mixloop
  5014.     moveq    #8,d1
  5015.     cmp    d1,d7
  5016.     bhs.b    .ok
  5017.     move    d7,d1
  5018. .ok    cmp.l    d1,d6
  5019.     bhs.b    .ok2
  5020.     move.l    d6,d1
  5021. .ok2    sub    d1,d7
  5022.     sub.l    d1,d6
  5023.  
  5024.     jmp    .jtab1(pc,d1*2)
  5025.  
  5026. .a set 0
  5027. .jtab1
  5028.     rept    8
  5029.     bra.b    .mend-.a
  5030. .a set .a+14                ; (mend - dmix) / 8
  5031.     endr
  5032.  
  5033. .dmix    rept    8
  5034.     move.b    (a0,d0),d2
  5035.     move.l    d2,a1
  5036.     move.b    (a1),d3
  5037.     add.l    d4,d0
  5038.     move    d3,(a2)+
  5039.     addx    d5,d0
  5040.     endr
  5041. .mend    tst    d7
  5042.     beq.b    .done
  5043.     tst.l    d6
  5044.     bne    .mixloop
  5045.  
  5046. .resloop
  5047.     tst.b    mLoop(a4)
  5048.     bne.b    .q
  5049.     st    mOnOff(a4)
  5050.     bra.b    .ty
  5051.  
  5052. .q    moveq    #0,d1
  5053.     move    d0,d1
  5054.     sub.l    mLength(a4),d1
  5055.     move.l    mLStart(a4),a0
  5056.     add.l    d1,a0
  5057.     move.l    mLLength(a4),d6
  5058.     sub.l    d1,d6
  5059.     move.l    d6,mLength(a4)
  5060.     cmp.l    #$ffff,d6
  5061.     bls.b    .j
  5062.     move    #$ffff,d6
  5063. .j    clr    d0            ;reset integer part
  5064.     bra    .restart
  5065.  
  5066. .done    moveq    #0,d1
  5067.     move    d0,d1
  5068.     add.l    d1,a0
  5069.     clr    d0
  5070.     move.l    a0,(a4)
  5071.     move.l    d0,mFPos(a4)
  5072.     sub.l    d1,mLength(a4)
  5073.     bpl.b    .u
  5074.  
  5075.     tst.b    mLoop(a4)
  5076.     bne.b    .q2
  5077.     st    mOnOff(a4)
  5078.     bra.b    .u
  5079.  
  5080. .q2    move.l    mLLength(a4),d6
  5081.     sub.l    (a4),a0
  5082.     add.l    mLStart(a4),a0
  5083.     sub.l    d6,a0
  5084.     add.l    d6,mLength(a4)
  5085.     move.l    a0,(a4)
  5086. .u    rts
  5087.  
  5088. .ty    move.l    #$800080,d0
  5089.     lsr    d7
  5090.     bcc.b    .sk
  5091.     move    d0,(a2)+
  5092. .sk    subq    #1,d7
  5093.     bmi.b    .u
  5094. .lk    move.l    d0,(a2)+
  5095.     dbf    d7,.lk
  5096.     rts
  5097.  
  5098.  
  5099. .vol0    move.l    clock(a5),d4
  5100.     moveq    #0,d0
  5101.     move    mPeriod(a4),d0
  5102.  
  5103.     divu.l    d0,d4
  5104.  
  5105.     lsl.l    #8,d4
  5106.     lsl.l    #6,d4
  5107.  
  5108.     move.l    mrate(a5),d0
  5109.     lsr.l    #4,d0
  5110.  
  5111.     divu.l    d0,d4
  5112.  
  5113.     move.l    (a4),a0
  5114.     move.l    mFPos(a4),d0
  5115.  
  5116.     mulu.l    d7,d4
  5117.  
  5118.     swap    d0
  5119.     add.l    d4,d0            ; Position after "mixing"
  5120.     swap    d0
  5121.     
  5122.     moveq    #0,d1
  5123.     move    d0,d1
  5124.     add.l    d1,a0
  5125.     clr    d0
  5126.     move.l    a0,(a4)
  5127.     move.l    d0,mFPos(a4)
  5128.     sub.l    d1,mLength(a4)
  5129.     bpl.b    .ty            ; OK, Done!
  5130.  
  5131. ; We're about to mix past the end of the sample
  5132.  
  5133.     tst.b    mLoop(a4)
  5134.     bne.b    .q3
  5135.     st    mOnOff(a4)
  5136.     bra.b    .ty
  5137.  
  5138. .q3    move.l    mLLength(a4),d6
  5139. .loop    sub.l    d6,a0
  5140.     add.l    d6,mLength(a4)
  5141.     bmi.b    .loop
  5142.     beq.b    .loop
  5143.  
  5144.     move.l    a0,(a4)
  5145.     bra.b    .ty
  5146.  
  5147.  
  5148. ; Mixing routine for rest of the channels (adds data)
  5149.  
  5150. mix2_020
  5151.     moveq    #0,d7
  5152.     move    bytes2do(a5),d7
  5153.     tst    mPeriod(a4)
  5154.     beq    .ty
  5155.     tst.b    mOnOff(a4)
  5156.     bne    .ty
  5157.  
  5158.     tst    mVolume(a4)
  5159.     beq    .vol0
  5160.  
  5161. .dw    move.l    clock(a5),d4
  5162.     moveq    #0,d0
  5163.     move    mPeriod(a4),d0
  5164.  
  5165.     divu.l    d0,d4
  5166.  
  5167.     lsl.l    #8,d4
  5168.     lsl.l    #6,d4
  5169.  
  5170.     move.l    mrate(a5),d0
  5171.     lsr.l    #4,d0
  5172.  
  5173.     divu.l    d0,d4
  5174.  
  5175.     swap    d4
  5176.  
  5177.     move.l    vtabaddr(a5),d2
  5178.     move    mVolume(a4),d0
  5179.     mulu    PS3M_master(a5),d0
  5180.     lsr    #6,d0
  5181.     lsl.l    #8,d0
  5182.     add.l    d0,d2            ; Position in volume table
  5183.  
  5184.     move.l    (a4),a0
  5185.     move.l    mFPos(a4),d0
  5186.  
  5187.     move.l    mLength(a4),d6
  5188.     beq    .resloop
  5189.  
  5190.     cmp.l    #$ffff,d6
  5191.     bls.b    .restart
  5192.     move    #$ffff,d6
  5193. .restart
  5194.     swap    d6
  5195.     swap    d0
  5196.     sub.l    d0,d6
  5197.     swap    d0
  5198.  
  5199.     move.l    d4,d5
  5200.     swap    d5
  5201.  
  5202.     divul.l    d5,d5:d6        ; bytes left to loop end
  5203.     tst.l    d5
  5204.     beq.b    .e
  5205.     addq.l    #1,d6
  5206. .e    moveq    #0,d3
  5207.     moveq    #0,d5
  5208. .mixloop
  5209.     moveq    #8,d1
  5210.     cmp    d1,d7
  5211.     bhi.b    .ok
  5212.     move    d7,d1
  5213. .ok    cmp.l    d1,d6
  5214.     bhi.b    .ok2
  5215.     move    d6,d1
  5216. .ok2    sub    d1,d7
  5217.     sub.l    d1,d6
  5218.     jmp    .jtab1(pc,d1*2)
  5219.  
  5220. .a set 0
  5221. .jtab1    rept    8
  5222.     bra.b    .mend-.a
  5223. .a set .a+14                ; (mend - dmix) / 8
  5224.     endr
  5225.  
  5226. .dmix    rept    8
  5227.     move.b    (a0,d0),d2
  5228.     move.l    d2,a1
  5229.     move.b    (a1),d3
  5230.     add    d3,(a2)+
  5231.     add.l    d4,d0
  5232.     addx    d5,d0
  5233.     endr
  5234. .mend    tst    d7
  5235.     beq.b    .done
  5236.     tst.l    d6
  5237.     bne    .mixloop
  5238.  
  5239. .resloop
  5240.     tst.b    mLoop(a4)
  5241.     bne.b    .q
  5242.     st    mOnOff(a4)
  5243.     bra.b    .tyy
  5244.  
  5245. .q    moveq    #0,d1
  5246.     move    d0,d1
  5247.     sub.l    mLength(a4),d1
  5248.     move.l    mLStart(a4),a0
  5249.     add.l    d1,a0
  5250.     move.l    mLLength(a4),d6
  5251.     sub.l    d1,d6
  5252.     move.l    d6,mLength(a4)
  5253.     cmp.l    #$ffff,d6
  5254.     bls.b    .j
  5255.     move    #$ffff,d6
  5256. .j    clr    d0            ;reset integer part
  5257.     bra    .restart
  5258.  
  5259. .done    moveq    #0,d1
  5260.     move    d0,d1
  5261.     add.l    d1,a0
  5262.     clr    d0
  5263.     move.l    a0,(a4)
  5264.     move.l    d0,mFPos(a4)
  5265.     sub.l    d1,mLength(a4)
  5266.     bpl.b    .u
  5267.  
  5268.     tst.b    mLoop(a4)
  5269.     bne.b    .q2
  5270.     st    mOnOff(a4)
  5271.     bra.b    .u
  5272.  
  5273. .q2    move.l    mLLength(a4),d6
  5274.     sub.l    (a4),a0
  5275.     add.l    mLStart(a4),a0
  5276.     sub.l    d6,a0
  5277.     add.l    d6,mLength(a4)
  5278.     move.l    a0,(a4)
  5279.  
  5280. .u    addq    #1,chans
  5281. .ty    rts
  5282.  
  5283. .tyy    move.l    #$800080,d0
  5284.     lsr    d7
  5285.     bcc.b    .sk
  5286.     add    d0,(a2)+
  5287. .sk    subq    #1,d7
  5288.     bmi.b    .u
  5289. .lk    add.l    d0,(a2)+
  5290.     dbf    d7,.lk
  5291.     bra.b    .u
  5292.  
  5293.  
  5294. .vol0    move.l    clock(a5),d4
  5295.     moveq    #0,d0
  5296.     move    mPeriod(a4),d0
  5297.  
  5298.     divu.l    d0,d4
  5299.  
  5300.     lsl.l    #8,d4
  5301.     lsl.l    #6,d4
  5302.  
  5303.     move.l    mrate(a5),d0
  5304.     lsr.l    #4,d0
  5305.  
  5306.     divu.l    d0,d4
  5307.  
  5308.     move.l    (a4),a0
  5309.     move.l    mFPos(a4),d0
  5310.  
  5311.     mulu.l    d7,d4
  5312.  
  5313.     swap    d0
  5314.     add.l    d4,d0            ; Position after "mixing"
  5315.     swap    d0
  5316.     
  5317.     moveq    #0,d1
  5318.     move    d0,d1
  5319.     add.l    d1,a0
  5320.     clr    d0
  5321.     move.l    a0,(a4)
  5322.     move.l    d0,mFPos(a4)
  5323.     sub.l    d1,mLength(a4)
  5324.     bpl.b    .ty            ; OK, Done!
  5325.  
  5326. ; We're about to mix past the end of the sample
  5327.  
  5328.     tst.b    mLoop(a4)
  5329.     bne.b    .q3
  5330.     st    mOnOff(a4)
  5331.     bra.b    .ty
  5332.  
  5333. .q3    move.l    mLLength(a4),d6
  5334. .loop    sub.l    d6,a0
  5335.     add.l    d6,mLength(a4)
  5336.     bmi.b    .loop
  5337.     beq.b    .loop
  5338.  
  5339.     move.l    a0,(a4)
  5340.     bra.b    .ty
  5341.  
  5342.  
  5343.  
  5344. ; Mixing routine for the first channel (moves data)
  5345.  
  5346.  
  5347. mix16_020
  5348.     moveq    #0,d7
  5349.     move    bytes2do(a5),d7
  5350.     tst    mPeriod(a4)
  5351.     beq    .ty
  5352.     tst.b    mOnOff(a4)
  5353.     bne    .ty
  5354.  
  5355.     tst    mVolume(a4)
  5356.     beq    .vol0
  5357.  
  5358. .dw    move.l    clock(a5),d4
  5359.     moveq    #0,d0
  5360.     move    mPeriod(a4),d0
  5361.  
  5362.     divu.l    d0,d4
  5363.  
  5364.     lsl.l    #8,d4
  5365.     lsl.l    #6,d4
  5366.  
  5367.     move.l    mrate(a5),d0
  5368.     lsr.l    #4,d0
  5369.  
  5370.     divu.l    d0,d4
  5371.     swap    d4
  5372.  
  5373.     move.l    vtabaddr(a5),a3
  5374.     move    mVolume(a4),d0
  5375.     mulu    PS3M_master(a5),d0
  5376.     lsr    #6,d0
  5377.     add    d0,d0
  5378.     lsl.l    #8,d0
  5379.     add.l    d0,a3            ; Position in volume table
  5380.  
  5381.     move.l    (a4),a0            ;pos (addr)
  5382.     move.l    mFPos(a4),d0        ;fpos
  5383.  
  5384.     move.l    mLength(a4),d6        ;len
  5385.     beq    .resloop
  5386.  
  5387.     cmp.l    #$ffff,d6
  5388.     bls.b    .restart
  5389.     move    #$ffff,d6
  5390. .restart
  5391.     swap    d6
  5392.     swap    d0
  5393.     sub.l    d0,d6
  5394.     swap    d0
  5395.     move.l    d4,d5
  5396.     swap    d5
  5397.  
  5398.     divul.l    d5,d5:d6        ; bytes left to loop end
  5399.     tst.l    d5
  5400.     beq.b    .e
  5401.     addq.l    #1,d6
  5402. .e
  5403.     moveq    #0,d5
  5404.     moveq    #0,d2
  5405. .mixloop
  5406.     moveq    #8,d1
  5407.     cmp    d1,d7
  5408.     bhs.b    .ok
  5409.     move    d7,d1
  5410. .ok    cmp.l    d1,d6
  5411.     bhs.b    .ok2
  5412.     move.l    d6,d1
  5413. .ok2    sub    d1,d7
  5414.     sub.l    d1,d6
  5415.  
  5416.     jmp    .jtab1(pc,d1*2)
  5417.  
  5418. .a set 0
  5419. .jtab1
  5420.     rept    8
  5421.     bra.b    .mend-.a
  5422. .a set .a+12                ; (mend - dmix) / 8
  5423.     endr
  5424.  
  5425. .dmix    rept    8
  5426.     move.b    (a0,d0),d2
  5427.     add.l    d4,d0
  5428.     move    (a3,d2*2),(a2)+
  5429.     addx    d5,d0
  5430.     endr
  5431.  
  5432. .mend    tst    d7
  5433.     beq.b    .done
  5434.     tst.l    d6
  5435.     bne    .mixloop
  5436.  
  5437. .resloop
  5438.     tst.b    mLoop(a4)
  5439.     bne.b    .q
  5440.     st    mOnOff(a4)
  5441.     bra.b    .ty
  5442.  
  5443. .q    moveq    #0,d1
  5444.     move    d0,d1
  5445.     sub.l    mLength(a4),d1
  5446.     move.l    mLStart(a4),a0
  5447.     add.l    d1,a0
  5448.     move.l    mLLength(a4),d6
  5449.     sub.l    d1,d6
  5450.     move.l    d6,mLength(a4)
  5451.     cmp.l    #$ffff,d6
  5452.     bls.b    .j
  5453.     move    #$ffff,d6
  5454. .j    clr    d0            ;reset integer part
  5455.     bra    .restart
  5456.  
  5457. .done    moveq    #0,d1
  5458.     move    d0,d1
  5459.     add.l    d1,a0
  5460.     clr    d0
  5461.     move.l    a0,(a4)
  5462.     move.l    d0,mFPos(a4)
  5463.     sub.l    d1,mLength(a4)
  5464.     bpl.b    .u
  5465.  
  5466.     tst.b    mLoop(a4)
  5467.     bne.b    .q2
  5468.     st    mOnOff(a4)
  5469.     bra.b    .u
  5470.  
  5471. .q2    move.l    mLLength(a4),d6
  5472.     sub.l    (a4),a0
  5473.     add.l    mLStart(a4),a0
  5474.     sub.l    d6,a0
  5475.     add.l    d6,mLength(a4)
  5476.     move.l    a0,(a4)
  5477. .u    rts
  5478.  
  5479. .ty    addq    #1,d7
  5480.     beq.b    .u
  5481.  
  5482.     moveq    #0,d0
  5483.     lsr    d7
  5484.     bcc.b    .sk
  5485.     move    d0,(a2)+
  5486. .sk    subq    #1,d7
  5487.     bmi.b    .u
  5488. .lk    move.l    d0,(a2)+
  5489.     dbf    d7,.lk
  5490.     rts
  5491.  
  5492. .vol0    move.l    clock(a5),d4
  5493.     moveq    #0,d0
  5494.     move    mPeriod(a4),d0
  5495.  
  5496.     divu.l    d0,d4
  5497.  
  5498.     lsl.l    #8,d4
  5499.     lsl.l    #6,d4
  5500.  
  5501.     move.l    mrate(a5),d0
  5502.     lsr.l    #4,d0
  5503.  
  5504.     divu.l    d0,d4
  5505.  
  5506.     move.l    (a4),a0
  5507.     move.l    mFPos(a4),d0
  5508.  
  5509.     mulu.l    d7,d4
  5510.  
  5511.     swap    d0
  5512.     add.l    d4,d0            ; Position after "mixing"
  5513.     swap    d0
  5514.     
  5515.     moveq    #0,d1
  5516.     move    d0,d1
  5517.     add.l    d1,a0
  5518.     clr    d0
  5519.     move.l    a0,(a4)
  5520.     move.l    d0,mFPos(a4)
  5521.     sub.l    d1,mLength(a4)
  5522.     bpl.b    .ty            ; OK, Done!
  5523.  
  5524. ; We're about to mix past the end of the sample
  5525.  
  5526.     tst.b    mLoop(a4)
  5527.     bne.b    .q3
  5528.     st    mOnOff(a4)
  5529.     bra.b    .ty
  5530.  
  5531. .q3    move.l    mLLength(a4),d6
  5532. .loop    sub.l    d6,a0
  5533.     add.l    d6,mLength(a4)
  5534.     bmi.b    .loop
  5535.     beq.b    .loop
  5536.  
  5537.     move.l    a0,(a4)
  5538.     bra.b    .ty
  5539.  
  5540.  
  5541. ; Mixing routine for rest of the channels (adds data)
  5542.  
  5543. mix162_020
  5544.     moveq    #0,d7
  5545.     move    bytes2do(a5),d7
  5546.     tst    mPeriod(a4)
  5547.     beq    .ty
  5548.     tst.b    mOnOff(a4)
  5549.     bne    .ty
  5550.  
  5551.     tst    mVolume(a4)
  5552.     beq    .vol0
  5553.  
  5554. .dw    move.l    clock(a5),d4
  5555.     moveq    #0,d0
  5556.     move    mPeriod(a4),d0
  5557.  
  5558.     divu.l    d0,d4
  5559.  
  5560.     lsl.l    #8,d4
  5561.     lsl.l    #6,d4
  5562.  
  5563.     move.l    mrate(a5),d0
  5564.     lsr.l    #4,d0
  5565.  
  5566.     divu.l    d0,d4
  5567.  
  5568.     swap    d4
  5569.  
  5570.     move.l    vtabaddr(a5),a3
  5571.     move    mVolume(a4),d0
  5572.     mulu    PS3M_master(a5),d0
  5573.     lsr    #6,d0
  5574.     add    d0,d0
  5575.     lsl.l    #8,d0
  5576.     add.l    d0,a3            ; Position in volume table
  5577.  
  5578.     move.l    (a4),a0
  5579.     move.l    mFPos(a4),d0
  5580.  
  5581.     move.l    mLength(a4),d6
  5582.     beq    .resloop
  5583.  
  5584.     cmp.l    #$ffff,d6
  5585.     bls.b    .restart
  5586.     move    #$ffff,d6
  5587. .restart
  5588.     swap    d6
  5589.     swap    d0
  5590.     sub.l    d0,d6
  5591.     swap    d0
  5592.  
  5593.     move.l    d4,d5
  5594.     swap    d5
  5595.  
  5596.     divul.l    d5,d5:d6        ; bytes left to loop end
  5597.     tst.l    d5
  5598.     beq.b    .e
  5599.     addq.l    #1,d6
  5600. .e    moveq    #0,d2
  5601.     moveq    #0,d5
  5602. .mixloop
  5603.     moveq    #8,d1
  5604.     cmp    d1,d7
  5605.     bhi.b    .ok
  5606.     move    d7,d1
  5607. .ok    cmp.l    d1,d6
  5608.     bhi.b    .ok2
  5609.     move    d6,d1
  5610. .ok2    sub    d1,d7
  5611.     sub.l    d1,d6
  5612.     jmp    .jtab1(pc,d1*2)
  5613.  
  5614. .a set 0
  5615. .jtab1
  5616.     rept    8
  5617.     bra.b    .mend-.a
  5618. .a set .a+14                ; (mend - dmix) / 8
  5619.     endr
  5620.  
  5621. .dmix    rept    8
  5622.     move.b    (a0,d0),d2
  5623.     add.l    d4,d0
  5624.     move    (a3,d2*2),d3
  5625.     addx    d5,d0
  5626.     add    d3,(a2)+
  5627.     endr
  5628.  
  5629. .mend    tst    d7
  5630.     beq.b    .done
  5631.     tst.l    d6
  5632.     bne    .mixloop
  5633.  
  5634. .resloop
  5635.     tst.b    mLoop(a4)
  5636.     bne.b    .q
  5637.     st    mOnOff(a4)
  5638.     bra.b    .tyy
  5639.  
  5640. .q    moveq    #0,d1
  5641.     move    d0,d1
  5642.     sub.l    mLength(a4),d1
  5643.     move.l    mLStart(a4),a0
  5644.     add.l    d1,a0
  5645.     move.l    mLLength(a4),d6
  5646.     sub.l    d1,d6
  5647.     move.l    d6,mLength(a4)
  5648.     cmp.l    #$ffff,d6
  5649.     bls.b    .j
  5650.     move    #$ffff,d6
  5651. .j    clr    d0            ;reset integer part
  5652.     bra    .restart
  5653.  
  5654. .done    moveq    #0,d1
  5655.     move    d0,d1
  5656.     add.l    d1,a0
  5657.     clr    d0
  5658.     move.l    a0,(a4)
  5659.     move.l    d0,mFPos(a4)
  5660.     sub.l    d1,mLength(a4)
  5661.     bpl.b    .u
  5662.  
  5663.     tst.b    mLoop(a4)
  5664.     bne.b    .q2
  5665.     st    mOnOff(a4)
  5666.     bra.b    .u
  5667.  
  5668. .q2    move.l    mLLength(a4),d6
  5669.     sub.l    (a4),a0
  5670.     add.l    mLStart(a4),a0
  5671.     sub.l    d6,a0
  5672.     add.l    d6,mLength(a4)
  5673.     move.l    a0,(a4)
  5674. .u
  5675. .ty
  5676. .tyy    rts
  5677.  
  5678.  
  5679. .vol0    move.l    clock(a5),d4
  5680.     moveq    #0,d0
  5681.     move    mPeriod(a4),d0
  5682.  
  5683.     divu.l    d0,d4
  5684.  
  5685.     lsl.l    #8,d4
  5686.     lsl.l    #6,d4
  5687.  
  5688.     move.l    mrate(a5),d0
  5689.     lsr.l    #4,d0
  5690.  
  5691.     divu.l    d0,d4
  5692.  
  5693.     move.l    (a4),a0
  5694.     move.l    mFPos(a4),d0
  5695.  
  5696.     mulu.l    d7,d4
  5697.  
  5698.     swap    d0
  5699.     add.l    d4,d0            ; Position after "mixing"
  5700.     swap    d0
  5701.     
  5702.     moveq    #0,d1
  5703.     move    d0,d1
  5704.     add.l    d1,a0
  5705.     clr    d0
  5706.     move.l    a0,(a4)
  5707.     move.l    d0,mFPos(a4)
  5708.     sub.l    d1,mLength(a4)
  5709.     bpl.b    .ty            ; OK, Done!
  5710.  
  5711. ; We're about to mix past the end of the sample
  5712.  
  5713.     tst.b    mLoop(a4)
  5714.     bne.b    .q3
  5715.     st    mOnOff(a4)
  5716.     bra.b    .ty
  5717.  
  5718. .q3    move.l    mLLength(a4),d6
  5719. .loop    sub.l    d6,a0
  5720.     add.l    d6,mLength(a4)
  5721.     bmi.b    .loop
  5722.     beq.b    .loop
  5723.  
  5724.     move.l    a0,(a4)
  5725.     bra.b    .ty
  5726.  
  5727.     endc
  5728.  
  5729.  
  5730. * mulu_32 --- d0 = d0*d1
  5731. mulu_32    movem.l    d2/d3,-(sp)
  5732.     move.l    d0,d2
  5733.     move.l    d1,d3
  5734.     swap    d2
  5735.     swap    d3
  5736.     mulu    d1,d2
  5737.     mulu    d0,d3
  5738.     mulu    d1,d0
  5739.     add    d3,d2
  5740.     swap    d2
  5741.     clr    d2
  5742.     add.l    d2,d0
  5743.     movem.l    (sp)+,d2/d3
  5744.     rts    
  5745.  
  5746. * divu_32 --- d0 = d0/d1, d1=jakojäännös
  5747. divu_32    move.l    d3,-(a7)
  5748.     swap    d1
  5749.     tst    d1
  5750.     bne.b    lb_5f8c
  5751.     swap    d1
  5752.     move.l    d1,d3
  5753.     swap    d0
  5754.     move    d0,d3
  5755.     beq.b    lb_5f7c
  5756.     divu    d1,d3
  5757.     move    d3,d0
  5758. lb_5f7c    swap    d0
  5759.     move    d0,d3
  5760.     divu    d1,d3
  5761.     move    d3,d0
  5762.     swap    d3
  5763.     move    d3,d1
  5764.     move.l    (a7)+,d3
  5765.     rts    
  5766.  
  5767. lb_5f8c    swap    d1
  5768.     move    d2,-(a7)
  5769.     moveq    #16-1,d3
  5770.     move    d3,d2
  5771.     move.l    d1,d3
  5772.     move.l    d0,d1
  5773.     clr    d1
  5774.     swap    d1
  5775.     swap    d0
  5776.     clr    d0
  5777. lb_5fa0    add.l    d0,d0
  5778.     addx.l    d1,d1
  5779.     cmp.l    d1,d3
  5780.     bhi.b    lb_5fac
  5781.     sub.l    d3,d1
  5782.     addq    #1,d0
  5783. lb_5fac    dbf    d2,lb_5fa0
  5784.     move    (a7)+,d2
  5785.     move.l    (a7)+,d3
  5786.     rts    
  5787.  
  5788.  
  5789. ;;******** Init routines ***********
  5790.  
  5791.  
  5792. detectchannels
  5793.     lea    ch(pc),a0
  5794.     moveq    #7,d0
  5795. .l2    clr.l    (a0)+
  5796.     dbf    d0,.l2
  5797.  
  5798.     move.l    patts(a5),a1
  5799.     lea    ch(pc),a2
  5800.     move.l    s3m(a5),a0
  5801.     move    pats(a5),d7
  5802.     subq    #1,d7
  5803. .pattloop
  5804.     moveq    #0,d0
  5805.     move    (a1)+,d0
  5806.     beq.b    .qt
  5807.     iword    d0
  5808.     lsl.l    #4,d0
  5809.     lea    (a0,d0.l),a3
  5810.     addq.l    #2,a3
  5811.     moveq    #63,d6
  5812. .rowloop
  5813.     move.b    (a3)+,d0
  5814.     beq.b    .newrow
  5815.  
  5816.     moveq    #31,d1
  5817.     and    d0,d1
  5818.  
  5819.     moveq    #32,d2
  5820.     and    d0,d2
  5821.     beq.b    .nnot
  5822.  
  5823.     tst.b    (a3)
  5824.     bmi.b    .skip
  5825.     beq.b    .skip
  5826.  
  5827.     tst.b    1(a3)
  5828.     bmi.b    .skip
  5829.     beq.b    .skip
  5830.  
  5831.     st    (a2,d1)
  5832.  
  5833. .skip    addq.l    #2,a3
  5834.  
  5835. .nnot    moveq    #64,d2
  5836.     and    d0,d2
  5837.     beq.b    .nvol
  5838.  
  5839.     addq.l    #1,a3
  5840.  
  5841. .nvol    and    #128,d0
  5842.     beq.b    .rowloop
  5843.  
  5844.     move.b    (a3),d0
  5845.     cmp.b    #1,d0
  5846.     blo.b    .skip2
  5847.  
  5848.     cmp.b    #'Z'-'@',d0
  5849.     bhi.b    .skip2
  5850.  
  5851.     st    (a2,d1)
  5852.  
  5853. .skip2    addq.l    #2,a3
  5854.     bra.b    .rowloop
  5855.  
  5856. .newrow
  5857.     dbf    d6,.rowloop
  5858. .qt
  5859.     dbf    d7,.pattloop    
  5860.  
  5861.     moveq    #1,d0
  5862.     moveq    #1,d1
  5863.     moveq    #31,d7
  5864.     moveq    #0,d5
  5865.     moveq    #0,d6
  5866.     lea    $40(a0),a1
  5867.     lea    pantab(a5),a0
  5868. .ll    clr.b    (a0)
  5869.     tst.b    (a2)+
  5870.     beq.b    .d
  5871.  
  5872.     move.b    (a1),d2
  5873.     bmi.b    .d
  5874.     cmp.b    #8,d2
  5875.     blo.b    .vas
  5876.     move.b    #-1,(a0)
  5877.     move    d1,d0
  5878.     addq    #1,d5
  5879.     bra.b    .d
  5880. .vas    move.b    #1,(a0)
  5881.     move    d1,d0
  5882.     addq    #1,d6
  5883. .d    addq.l    #1,a1
  5884.     addq.l    #1,a0
  5885.     addq    #1,d1
  5886.     dbf    d7,.ll
  5887.  
  5888.     cmp    d5,d6
  5889.     bls.b    .k    
  5890.     move    d6,d5
  5891. .k    move    d5,maxchan(a5)
  5892.     
  5893.     move    d0,numchans(a5)
  5894. ret    rts
  5895.  
  5896. ch    ds.b    32
  5897.  
  5898.  
  5899. makedivtabs
  5900.     cmp    #STEREO14,pmode(a5)
  5901.     beq.b    ret
  5902.  
  5903.     lea    divtabs(a5),a1
  5904.     move.l    dtab(a5),a0
  5905.  
  5906.     move    #255,d6
  5907.     moveq    #0,d5
  5908.     move    maxchan(a5),d5
  5909.     move.l    d5,d3
  5910.     move.l    d5,d2
  5911.  
  5912.     subq    #1,d5
  5913.     move    d5,d4
  5914.     lsl.l    #7,d5
  5915.  
  5916.     lsl.l    #7,d2
  5917.  
  5918.     sub.l    vboost(a5),d3
  5919.     cmp    #1,d3
  5920.     bge.b    .laa
  5921.     moveq    #1,d3
  5922.  
  5923. .laa    moveq    #0,d0
  5924.     move    d6,d7
  5925.     move.l    a0,(a1)+
  5926. .ll    move.l    d0,d1
  5927.     add.l    d5,d1
  5928.     sub.l    d2,d1
  5929.     divs    d3,d1
  5930.     cmp    #$7f,d1
  5931.     ble.b    .d
  5932.     move    #$7f,d1
  5933. .d    cmp    #$ff80,d1
  5934.     bge.b    .d2
  5935.     move    #$80,d1
  5936. .d2    move.b    d1,(a0)+
  5937.     addq.l    #1,d0
  5938.     dbf    d7,.ll
  5939.  
  5940.     add    #256,d6
  5941.     sub.l    #$80,d5
  5942.     dbf    d4,.laa
  5943.     rts
  5944.  
  5945.  
  5946. Makevoltable
  5947.     move.l    vtabaddr(a5),a0
  5948.  
  5949.     cmp    #STEREO14,pmode(a5)
  5950.     beq.b    bit16
  5951.  
  5952.     moveq    #0,d3        ;volume
  5953.     cmp    #1,fformat(a5)
  5954.     beq.b    signed
  5955.  
  5956. .lop    moveq    #0,d4        ;data
  5957. .lap    move    d4,d5
  5958.     sub    #$80,d5
  5959.     mulu    d3,d5
  5960.     asr.l    #6,d5
  5961.     add    #$80,d5
  5962.     move.b    d5,(a0)+
  5963.     addq    #1,d4
  5964.     cmp    #256,d4
  5965.     bne.b    .lap
  5966.     addq    #1,d3
  5967.     cmp    #65,d3
  5968.     bne.b    .lop
  5969.     rts
  5970.  
  5971. signed
  5972. .lop    moveq    #0,d4        ;data
  5973. .lap    move.b    d4,d5
  5974.     ext    d5
  5975.     mulu    d3,d5
  5976.     asr.l    #6,d5
  5977.     add    #$80,d5
  5978.     move.b    d5,(a0)+
  5979.     addq    #1,d4
  5980.     cmp    #256,d4
  5981.     bne.b    .lap
  5982.     addq    #1,d3
  5983.     cmp    #65,d3
  5984.     bne.b    .lop
  5985.     rts
  5986.  
  5987.  
  5988. bit16    move    maxchan(a5),d3
  5989.     moveq    #0,d7        ; "index"
  5990.  
  5991.     cmp    #1,fformat(a5)
  5992.     beq.b    signed2
  5993.  
  5994. .lop    move    d7,d6
  5995.     tst.b    d7
  5996.     bmi.b    .above
  5997.  
  5998.     and    #127,d6
  5999.     move    #128,d5
  6000.     sub    d6,d5
  6001.     lsl    #8,d5
  6002.     move    d7,d6
  6003.     lsr    #8,d6
  6004.     mulu    d6,d5
  6005.     divu    #63,d5
  6006.     swap    d5
  6007.     clr    d5
  6008.     swap    d5
  6009.     divu    d3,d5
  6010.     neg    d5
  6011.     move    d5,(a0)+
  6012.     addq    #1,d7
  6013.     cmp    #256*65,d7
  6014.     bne.b    .lop
  6015.     rts
  6016.  
  6017. .above    and    #127,d6
  6018.     lsl    #8,d6
  6019.  
  6020.     move    d7,d5
  6021.     lsr    #8,d5
  6022.     mulu    d6,d5
  6023.     divu    #63,d5
  6024.     swap    d5
  6025.     clr    d5
  6026.     swap    d5
  6027.     divu    d3,d5
  6028.     move    d5,(a0)+
  6029.     addq    #1,d7
  6030.     cmp    #256*65,d7
  6031.     bne.b    .lop
  6032.     rts
  6033.  
  6034. signed2
  6035. .lop    move    d7,d6
  6036.     tst.b    d7
  6037.     bpl.b    .above
  6038.  
  6039.     and    #127,d6
  6040.     move    #128,d5
  6041.     sub    d6,d5
  6042.     lsl    #8,d5
  6043.     move    d7,d6
  6044.     lsr    #8,d6
  6045.     mulu    d6,d5
  6046.     divu    #63,d5
  6047.     swap    d5
  6048.     clr    d5
  6049.     swap    d5
  6050.     divu    d3,d5
  6051.     neg    d5
  6052.     move    d5,(a0)+
  6053.     addq    #1,d7
  6054.     cmp    #256*65,d7
  6055.     bne.b    .lop
  6056.     rts
  6057.  
  6058. .above    and    #127,d6
  6059.     lsl    #8,d6
  6060.  
  6061.     move    d7,d5
  6062.     lsr    #8,d5
  6063.     mulu    d6,d5
  6064.     divu    #63,d5
  6065.     swap    d5
  6066.     clr    d5
  6067.     swap    d5
  6068.     divu    d3,d5
  6069.     move    d5,(a0)+
  6070.     addq    #1,d7
  6071.     cmp    #256*65,d7
  6072.     bne.b    .lop
  6073.     rts
  6074.  
  6075.  
  6076. do14tab    move.l    buff14(a5),a0
  6077.     moveq    #0,d7
  6078. .loo    move    d7,d2
  6079.     bpl.b    .plus
  6080.  
  6081.     neg    d2
  6082.     move    d2,d3
  6083.     lsr    #8,d2
  6084.     neg.b    d2
  6085.  
  6086.     lsr.b    #2,d3
  6087.     neg    d3
  6088.  
  6089.     move.b    d2,(a0)+
  6090.     move.b    d3,(a0)+
  6091.     addq.l    #2,d7
  6092.     cmp.l    #$10000,d7
  6093.     bne.b    .loo
  6094.     rts
  6095.  
  6096. .plus    move    d2,d3
  6097.     lsr    #8,d2
  6098.     lsr.b    #2,d3
  6099.     move.b    d2,(a0)+
  6100.     move.b    d3,(a0)+
  6101.     addq.l    #2,d7
  6102.     cmp.l    #$10000,d7
  6103.     bne.b    .loo
  6104.     rts
  6105.  
  6106.  
  6107.  
  6108.  
  6109. ;;********** S3M Play Routine **********
  6110.  
  6111.  
  6112. s3m_init
  6113.     move.l    s3m(a5),a0
  6114.     move.l    a0,mname(a5)
  6115.     move    ordernum(a0),d0
  6116.     iword    d0
  6117.     move    d0,slen(a5)
  6118.     move    d0,positioneita(a5)
  6119.  
  6120.     move    patnum(a0),d0
  6121.     iword    d0
  6122.     move    d0,pats(a5)
  6123.  
  6124.     move    insnum(a0),d0
  6125.     iword    d0
  6126.     move    d0,inss(a5)
  6127.  
  6128.     move    ffv(a0),d0
  6129.     iword    d0
  6130.     move    d0,fformat(a5)
  6131.  
  6132.     move    flags(a0),d0
  6133.     iword    d0
  6134.     move    d0,sflags(a5)
  6135.  
  6136.     cmp    #$1301,fformat(a5)
  6137.     bhi.b    .ok
  6138.  
  6139.     bset    #6,sflags+1(a5)
  6140.  
  6141. .ok    lea    $60(a0),a1
  6142.     moveq    #0,d0
  6143.     move    slen(a5),d0
  6144.     moveq    #1,d1
  6145.     and    d0,d1
  6146.     add    d1,d0
  6147.     lea    (a1,d0.l),a2
  6148.     move.l    a2,samples(a5)
  6149.  
  6150.     move    inss(a5),d0
  6151.     add    d0,d0
  6152.     lea    (a2,d0.l),a3
  6153.     move.l    a3,patts(a5)
  6154.  
  6155.     moveq    #0,d0
  6156.     move.b    (a1),d0
  6157.     add    d0,d0
  6158.     sub.l    a1,a1
  6159.     move    (a3,d0),d0
  6160.     beq.b    .q
  6161.     iword    d0
  6162.     asl.l    #4,d0
  6163.     lea    2(a0,d0.l),a1
  6164. .q    move.l    a1,ppos(a5)
  6165.  
  6166.     moveq    #0,d0
  6167.     move.b    initialspeed(a0),d0
  6168.     bne.b    .ok2
  6169.     moveq    #6,d0
  6170. .ok2    move    d0,spd(a5)
  6171.  
  6172.     move.b    initialtempo(a0),d0
  6173.     cmp    #32,d0
  6174.     bhi.b    .qw
  6175.     moveq    #125,d0
  6176. .qw    move    d0,tempo(a5)
  6177.  
  6178.     move    inss(a5),d0
  6179.     subq    #1,d0
  6180.     move.l    samples(a5),a2
  6181. .instloop
  6182.     moveq    #0,d1
  6183.     move    (a2)+,d1
  6184.     iword    d1
  6185.     lsl.l    #4,d1
  6186.     lea    (a0,d1.l),a1
  6187.     btst    #0,insflags(a1)
  6188.     beq.b    .eloo
  6189.     move.l    insloopend(a1),d1
  6190.     ilword    d1
  6191.     cmp.l    #2,d1
  6192.     bls.b    .eloo
  6193.     move.l    insloopend(a1),inslength(a1)
  6194. .eloo    dbf    d0,.instloop
  6195.  
  6196.     clr    pos(a5)
  6197.     clr    rows(a5)
  6198.     clr    cn(a5)
  6199.     clr    pdelaycnt(a5)
  6200.     clr    pjmpflag(a5)
  6201.     clr    pbrkflag(a5)
  6202.     clr    pbrkrow(a5)
  6203.  
  6204.     bsr    detectchannels
  6205.  
  6206.     move.l    #14317056/4,clock(a5)        ; Clock constant
  6207.     move    #64,globalVol(a5)
  6208.     moveq    #0,d0
  6209.     rts
  6210.  
  6211.  
  6212. s3m_music
  6213.     lea    data,a5
  6214.     move.l    s3m(a5),a0
  6215.  
  6216.     addq    #1,cn(a5)
  6217.     move    cn(a5),d0
  6218.     cmp    spd(a5),d0
  6219.     beq.b    uusrow
  6220.  
  6221. ccmds    lea    c0(a5),a2
  6222.     lea    cha0(a5),a4
  6223.     move    numchans(a5),d7
  6224.     subq    #1,d7
  6225. .loo    btst    #7,5(a2)
  6226.     beq.b    .edi
  6227.  
  6228.     lea    cct(pc),a1
  6229.     moveq    #0,d0
  6230.     move.b    cmd(a2),d0
  6231.     cmp    #'Z'-'@',d0
  6232.     bhi.b    .edi
  6233.     add    d0,d0
  6234.     move    (a1,d0),d0
  6235.     jsr    (a1,d0)
  6236.  
  6237. .edi    lea    s3mChanBlock_SIZE(a2),a2
  6238.     lea    mChanBlock_SIZE(a4),a4
  6239.     dbf    d7,.loo
  6240.     rts
  6241.  
  6242. uusrow    clr    cn(a5)
  6243.  
  6244.     tst    pdelaycnt(a5)
  6245.     bne    process
  6246.  
  6247.     lea    c0(a5),a2
  6248.     move    numchans(a5),d7
  6249.     subq    #1,d7
  6250. .cl    clr.b    flgs(a2)
  6251.     lea    s3mChanBlock_SIZE(a2),a2
  6252.     dbf    d7,.cl
  6253.  
  6254.     move.l    ppos(a5),a1
  6255.     lea    c0(a5),a4        ;chanblocks
  6256. .loo    move.b    (a1)+,d0
  6257.     beq.b    .end
  6258.  
  6259.     moveq    #$1f,d5
  6260.     and    d0,d5            ;chan
  6261.     mulu    #s3mChanBlock_SIZE,d5
  6262.     lea    (a4,d5),a2
  6263.  
  6264.     and    #~31,d0
  6265.     move.b    d0,flgs(a2)
  6266.     
  6267.     moveq    #32,d2
  6268.     and    d0,d2
  6269.     beq.b    .nnot
  6270.  
  6271.     move.b    (a1)+,(a2)
  6272.     move.b    (a1)+,inst(a2)
  6273.  
  6274. .nnot    moveq    #64,d2
  6275.     and    d0,d2
  6276.     beq.b    .nvol
  6277.  
  6278.     move.b    (a1)+,vol(a2)
  6279.  
  6280. .nvol    and    #128,d0
  6281.     beq.b    .loo
  6282.  
  6283.     move.b    (a1)+,d0
  6284.     bmi.b    .d
  6285.     move.b    d0,cmd(a2)
  6286. .d    move.b    (a1)+,info(a2)
  6287.     bra.b    .loo
  6288.  
  6289. .end    move.l    a1,ppos(a5)
  6290.  
  6291. process    lea    c0(a5),a2
  6292.     lea    cha0(a5),a4
  6293.     move    numchans(a5),d7
  6294.     move.l    samples(a5),a5
  6295.     subq    #1,d7
  6296.     endb    a5
  6297.  
  6298. .lloo    tst.b    flgs(a2)
  6299.     beq    .evol
  6300.  
  6301.     moveq    #32,d0
  6302.     and.b    flgs(a2),d0
  6303.     beq    .f
  6304.  
  6305.     move.b    inst(a2),d0
  6306.     beq    .esmp
  6307.     bmi    .esmp
  6308.  
  6309.     cmp    inss,d0
  6310.     bgt    .mute
  6311.  
  6312.     btst    #7,flgs(a2)
  6313.     beq.b    .eii
  6314.     cmp.b    #'S'-'@',cmd(a2)
  6315.     bne.b    .eii
  6316.     move.b    info(a2),d1
  6317.     and    #$f0,d1
  6318.     cmp    #$d0,d1
  6319.     beq    .evol
  6320.  
  6321. .eii    add    d0,d0
  6322.     move    -2(a5,d0),d0
  6323.     iword    d0
  6324.     lsl    #4,d0
  6325.     lea    (a0,d0),a1
  6326.  
  6327.     moveq    #0,d0
  6328.     move    insmemseg(a1),d0
  6329.     iword    d0
  6330.     lsl.l    #4,d0
  6331.     move.l    a0,d4
  6332.     add.l    d0,d4
  6333.  
  6334.     move.l    insloopbeg(a1),d1
  6335.     ilword    d1
  6336.     move.l    insloopend(a1),d2
  6337.     ilword    d2
  6338.     sub.l    d1,d2
  6339.     add.l    d4,d1
  6340.  
  6341.     move.l    d1,mLStart(a4)
  6342.     move.l    d2,mLLength(a4)
  6343.     move.b    insvol(a1),volume+1(a2)
  6344.     cmp    #64,volume(a2)
  6345.     blo.b    .e
  6346.     move    #63,volume(a2)
  6347. .e    move.l    a1,sample(a2)
  6348.  
  6349.     btst    #0,insflags(a1)
  6350.     beq.b    .eloo
  6351.     cmp.l    #2,d2
  6352.     shi    mLoop(a4)
  6353.     bra.b    .esmp
  6354.  
  6355.  
  6356. .mute    st    mOnOff(a4)
  6357.     bra    .f
  6358.  
  6359. .eloo    clr.b    mLoop(a4)
  6360. .esmp    moveq    #0,d0
  6361.     move.b    (a2),d0
  6362.     beq    .f
  6363.     cmp.b    #254,d0
  6364.     beq.b    .mute
  6365.     cmp.b    #255,d0
  6366.     beq    .f
  6367.  
  6368.     move.b    d0,note(a2)
  6369.     move    d0,d1
  6370.     lsr    #4,d1
  6371.  
  6372.     and    #$f,d0
  6373.     add    d0,d0
  6374.  
  6375.     move.l    sample(a2),a1
  6376.     move.l    $20(a1),d2
  6377.     ilword    d2
  6378.  
  6379.     lea    Periods(pc),a1
  6380.     move    (a1,d0),d0
  6381.     mulu    #8363,d0
  6382.     lsl.l    #4,d0
  6383.     lsr.l    d1,d0    
  6384.  
  6385.     divu    d2,d0
  6386.  
  6387.  
  6388.     btst    #7,flgs(a2)
  6389.     beq.b    .ei
  6390.  
  6391.     cmp.b    #'Q'-'@',cmd(a2)    ;retrig
  6392.     beq.b    .eiik
  6393.  
  6394. .ei    clr.b    retrigcn(a2)
  6395.  
  6396. .eiik    clr.b    vibpos(a2)
  6397.  
  6398.  
  6399.     btst    #7,flgs(a2)
  6400.     beq.b    .eitopo
  6401.  
  6402.     cmp.b    #'G'-'@',cmd(a2)    ;TOPO
  6403.     beq.b    .eddo
  6404.  
  6405.     cmp.b    #'L'-'@',cmd(a2)    ;TOPO+VSLD
  6406.     bne.b    .eitopo
  6407.  
  6408. .eddo    move    d0,toperiod(a2)
  6409.     bra.b    .f
  6410.  
  6411. .eitopo    move    d0,mPeriod(a4)
  6412.     move    d0,period(a2)
  6413.     clr.l    mFPos(a4)
  6414.  
  6415.     move.l    sample(a2),d0
  6416.     beq.b    .f
  6417.     move.l    d0,a1
  6418.  
  6419.     moveq    #0,d0
  6420.     move    insmemseg(a1),d0
  6421.     iword    d0
  6422.     lsl.l    #4,d0
  6423.     move.l    a0,d4
  6424.     add.l    d0,d4
  6425.  
  6426.     move.l    inslength(a1),d0
  6427.     ilword    d0
  6428.  
  6429.     move.l    d4,(a4)
  6430.     move.l    d0,mLength(a4)
  6431.     clr.b    mOnOff(a4)
  6432.  
  6433. .f    moveq    #64,d0
  6434.     and.b    flgs(a2),d0
  6435.     beq.b    .evol
  6436.     move.b    vol(a2),volume+1(a2)
  6437.     cmp    #64,volume(a2)
  6438.     blo.b    .evol
  6439.     move    #63,volume(a2)
  6440.  
  6441. .evol    btst    #7,flgs(a2)
  6442.     beq.b    .eivib
  6443.  
  6444.     cmp.b    #'H'-'@',cmd(a2)
  6445.     beq.b    .vib
  6446.  
  6447. .eivib    bsr    checklimits
  6448. .vib
  6449.  
  6450.     btst    #7,flgs(a2)
  6451.     beq.b    .eitre
  6452.  
  6453.     cmp.b    #'R'-'@',cmd(a2)
  6454.     beq.b    .tre
  6455.     cmp.b    #'I'-'@',cmd(a2)
  6456.     beq.b    .tre
  6457.  
  6458. .eitre    move    volume(a2),d0
  6459.     mulu    globalVol,d0
  6460.     lsr    #6,d0
  6461.     move    d0,mVolume(a4)
  6462.  
  6463. .tre    btst    #7,flgs(a2)
  6464.     beq.b    .edd
  6465.  
  6466.     move.b    info(a2),d0
  6467.     beq.b    .dd
  6468.     move.b    d0,lastcmd(a2)
  6469. .dd    lea    ct(pc),a1
  6470.     moveq    #0,d0
  6471.     move.b    cmd(a2),d0
  6472.     cmp    #'Z'-'@',d0
  6473.     bhi.b    .edd
  6474.  
  6475.     add    d0,d0
  6476.     move    (a1,d0),d0
  6477.     jsr    (a1,d0)
  6478.  
  6479. .edd    lea    s3mChanBlock_SIZE(a2),a2
  6480.     lea    mChanBlock_SIZE(a4),a4
  6481.     dbf    d7,.lloo
  6482.  
  6483.     basereg    data,a5
  6484.     lea    data,a5
  6485.  
  6486.     tst    pdelaycnt(a5)
  6487.     beq.b    .oke
  6488.  
  6489.     subq    #1,pdelaycnt(a5)
  6490.     bra    xm_exit
  6491. .oke
  6492.     addq    #1,rows(a5)
  6493.  
  6494.     tst    pbrkflag(a5)        ; do we have to break this pattern?
  6495.     beq.b    .nobrk
  6496.     move    pbrkrow(a5),rows(a5)
  6497.     clr    pbrkrow(a5)        ; clr break position
  6498. .nobrk
  6499.     cmp    #64,rows(a5)
  6500.     bcc.b    .newpos                ; worst case opt: branch not taken
  6501.  
  6502.     tst    pjmpflag(a5)        ; do we have to jump?
  6503.     bne.b    .newpos
  6504.  
  6505.     tst    pbrkflag(a5)
  6506.     beq    dee
  6507.     bra.b    cont
  6508. .newpos
  6509.     move    pbrkrow(a5),rows(a5)
  6510.     clr    pbrkrow(a5)        ; clr break position
  6511.  
  6512. burk    addq    #1,pos(a5)            ; inc songposition
  6513.     move    slen(a5),d0
  6514.     cmp    pos(a5),d0            ; are we thru with all patterns?
  6515.     bgt.b    cont                ; nope
  6516.     clr    pos(a5)
  6517.     st    PS3M_break(a5)
  6518.  
  6519.     moveq    #0,d0
  6520.     move.b    initialspeed(a0),d0
  6521.     bne.b    .ok
  6522.     moveq    #6,d0
  6523. .ok    move    d0,spd(a5)
  6524.  
  6525. cont    move    pos(a5),d0
  6526.     move    d0,PS3M_position(a5)
  6527.     st    PS3M_poscha(a5)
  6528.  
  6529.     moveq    #0,d1
  6530.     move.b    orders(a0,d0),d1
  6531.     cmp.b    #$fe,d1                ; marker that is skipped
  6532.     beq.b    burk
  6533.     cmp.b    #$ff,d1                ; end of tune mark
  6534.     beq.b    burk
  6535.     cmp    pats(a5),d1
  6536.     bhs.b    burk
  6537.  
  6538.     add    d1,d1
  6539.     move.l    patts(a5),a3
  6540.     moveq    #0,d0
  6541.     move    (a3,d1),d0
  6542.     beq.b    burk
  6543.     iword    d0
  6544.     lsl.l    #4,d0
  6545.     lea    2(a0,d0.l),a1
  6546.  
  6547.     clr    pjmpflag(a5)
  6548.     clr    pbrkflag(a5)
  6549.  
  6550.     move    rows(a5),d0
  6551.     beq.b    .setp
  6552.     subq    #1,d0
  6553.     moveq    #0,d1
  6554. .loop    move.b    (a1)+,d1
  6555.     beq.b    .next
  6556.  
  6557.     moveq    #32,d2
  6558.     and    d1,d2
  6559.     beq.b    .nnot
  6560.     addq    #2,a1
  6561. .nnot
  6562.     moveq    #64,d2
  6563.     and    d1,d2
  6564.     beq.b    .nvol
  6565.     addq    #1,a1
  6566. .nvol
  6567.     and    #128,d1
  6568.     beq.b    .loop
  6569.     addq    #2,a1
  6570.  
  6571.     bra.b    .loop
  6572. .next
  6573.     dbf    d0,.loop
  6574. .setp
  6575.     move.l    a1,ppos(a5)
  6576.  
  6577. dee    bra    xm_dee
  6578.     endb    a5
  6579.  
  6580.  
  6581. ct    dc    rt-ct
  6582.     dc    changespeed-ct
  6583.     dc    posjmp-ct
  6584.     dc    patbrk-ct
  6585.     dc    vslide-ct
  6586.     dc    portadwn-ct
  6587.     dc    portaup-ct
  6588.     dc    rt-ct
  6589.     dc    rt-ct
  6590.     dc    tremor-ct
  6591.     dc    arpeggio-ct
  6592.     dc    rt-ct
  6593.     dc    rt-ct
  6594.     dc    rt-ct
  6595.     dc    rt-ct
  6596.     dc    soffset-ct
  6597.     dc    rt-ct
  6598.     dc    retrig-ct
  6599.     dc    rt-ct
  6600.     dc    specials-ct
  6601.     dc    stempo-ct
  6602.     dc    rt-ct
  6603.     dc    setmaster-ct
  6604.     dc    rt-ct
  6605.     dc    rt-ct
  6606.     dc    rt-ct
  6607.     dc    rt-ct
  6608.  
  6609.  
  6610.  
  6611. cct    dc    rt-cct
  6612.     dc    rt-cct
  6613.     dc    rt-cct
  6614.     dc    rt-cct
  6615.     dc    vslide-cct
  6616.     dc    portadwn-cct
  6617.     dc    portaup-cct
  6618.     dc    noteporta-cct
  6619.     dc    vibrato-cct
  6620.     dc    tremor-cct
  6621.     dc    arpeggio-cct
  6622.     dc    vvslide-cct
  6623.     dc    pvslide-cct
  6624.     dc    rt-cct
  6625.     dc    rt-cct
  6626.     dc    rt-cct
  6627.     dc    rt-cct
  6628.     dc    retrig-cct
  6629.     dc    tremolo-cct
  6630.     dc    specials-cct
  6631.     dc    rt-cct
  6632.     dc    finevib-cct
  6633.     dc    rt-cct
  6634.     dc    rt-cct
  6635.     dc    rt-cct
  6636.     dc    rt-cct
  6637.     dc    rt-cct
  6638.  
  6639. tremolo
  6640. rt    rts
  6641.  
  6642. tremor
  6643.     move.b    info(a2),d0
  6644.     beq.b    .toggle
  6645.     move.b    d0,tvalue(a2)
  6646. .toggle
  6647.     subq.b    #1,tcount(a2)
  6648.     bhi.b    .volume
  6649.     move.b    tvalue(a2),d0
  6650.     not    ttoggle(a2)
  6651.     beq.b    .off
  6652.     lsr.b    #4,d0                ; ontime
  6653. .off    and.b    #$f,d0                ; offtime
  6654.     move.b    d0,tcount(a2)
  6655. .volume
  6656.     move    volume(a2),d0
  6657.     and    ttoggle(a2),d0
  6658.     move    d0,mVolume(a4)
  6659.     rts
  6660.  
  6661. changespeed
  6662.     move.b    info(a2),d0
  6663.     bne.b    .d
  6664.     moveq    #6,d0
  6665. .d    cmp.b    #32,d0
  6666.     bcs.b    .e
  6667.     moveq    #31,d0
  6668. .e    move.b    d0,spd+1
  6669.     rts
  6670.  
  6671. posjmp    clr    pbrkrow
  6672.     st    pjmpflag
  6673.  
  6674.     moveq    #0,d0
  6675.     move.b    pos,d0
  6676.     addq    #1,d0
  6677.  
  6678.     cmp    slen,d0
  6679.     bne.b    .notlast
  6680.     st    PS3M_break
  6681. .notlast
  6682.     moveq    #0,d0
  6683.     move.b    info(a2),d0
  6684.     cmp    pos,d0
  6685.     bhi.b    .e
  6686.     st    PS3M_break
  6687. .e    subq    #1,d0
  6688.     move    d0,pos
  6689.     st    PS3M_poscha
  6690.     rts
  6691.  
  6692. patbrk    moveq    #0,d0
  6693.     move.b    info(a2),d0
  6694.     moveq    #$f,d2
  6695.     and    d0,d2
  6696.     lsr    #4,d0
  6697.     add.b    .dtab(pc,d0),d2
  6698.     cmp.b    #63,d2        ; valid line number given?
  6699.     ble.b    .ok    
  6700.     moveq    #0,d2        ; else zero it
  6701. .ok    move    d2,pbrkrow
  6702.     st    pjmpflag
  6703.     st    PS3M_poscha
  6704.     rts
  6705.  
  6706. .dtab:    dc.b    0,10,20,30    ; Don't think this little table is a waste!
  6707.     dc.b     40,50,60,70    ; The routine is shorter using this table
  6708.     dc.b    80,90,100,110    ; and faster too :-)
  6709.     dc.b     120,130,140,150    ; 16 bytes vs. 8 instructions (wordlength)
  6710.  
  6711. vslide    moveq    #0,d0
  6712.     move.b    lastcmd(a2),d0
  6713.     moveq    #$f,d1
  6714.     and    d0,d1
  6715.     move    d0,d2
  6716.     lsr    #4,d2
  6717.  
  6718.     cmp.b    #$f,d1
  6719.     beq.b    .addfine
  6720.  
  6721.     cmp.b    #$f,d2
  6722.     beq.b    .subfine
  6723.  
  6724.     btst    #6,sflags+1
  6725.     bne.b    .ok
  6726.  
  6727.     tst    cn
  6728.     beq.b    .dd    
  6729.  
  6730. .ok    tst    d1
  6731.     beq.b    .add
  6732.     and    #$f,d0
  6733.     bra.b    .sub
  6734.  
  6735. .subfine
  6736.     tst    cn
  6737.     bne.b    .dd
  6738.     and    #$f,d0
  6739. .sub    sub    d0,volume(a2)
  6740.     bpl.b    .dd
  6741.     clr    volume(a2)
  6742. .dd    move    volume(a2),d0
  6743.     mulu    globalVol,d0
  6744.     lsr    #6,d0
  6745.     move    d0,mVolume(a4)
  6746.     rts
  6747.  
  6748. .addfine
  6749.     tst    d2
  6750.     beq.b    .sub
  6751.     tst    cn
  6752.     bne.b    .dd
  6753. .add    lsr    #4,d0
  6754.  
  6755. .add2    add    d0,volume(a2)
  6756.     cmp    #64,volume(a2)
  6757.     blo.b    .dd
  6758.     move    #63,volume(a2)
  6759.     bra.b    .dd
  6760.  
  6761.  
  6762. portadwn
  6763.     moveq    #0,d0
  6764.     move.b    lastcmd(a2),d0
  6765.  
  6766.     tst    cn
  6767.     beq.b    .fined
  6768.     cmp.b    #$e0,d0
  6769.     bhs.b    .dd
  6770.     lsl    #2,d0
  6771.  
  6772. .ddd    add    d0,period(a2)
  6773.     bra.b    checklimits
  6774. .dd    rts
  6775.  
  6776. .fined    cmp.b    #$e0,d0
  6777.     bls.b    .dd
  6778.     cmp.b    #$f0,d0
  6779.     bls.b    .extr
  6780.     and    #$f,d0
  6781.     lsl    #2,d0
  6782.     bra.b    .ddd
  6783.  
  6784. .extr    and    #$f,d0
  6785.     bra.b    .ddd
  6786.  
  6787. portaup
  6788.     moveq    #0,d0
  6789.     move.b    lastcmd(a2),d0
  6790.  
  6791.     tst    cn
  6792.     beq.b    .fined
  6793.     cmp.b    #$e0,d0
  6794.     bhs.b    .dd
  6795.     lsl    #2,d0
  6796.  
  6797. .ddd    sub    d0,period(a2)
  6798.     bra.b    checklimits
  6799.  
  6800. .dd    rts
  6801.  
  6802. .fined    cmp.b    #$e0,d0
  6803.     bls.b    .dd
  6804.     cmp.b    #$f0,d0
  6805.     bls.b    .extr
  6806.     and    #$f,d0
  6807.     lsl    #2,d0
  6808.     bra.b    .ddd
  6809.  
  6810. .extr    and    #$f,d0
  6811.     bra.b    .ddd
  6812.  
  6813.  
  6814. checklimits
  6815.     move    period(a2),d0
  6816.     btst    #4,sflags+1
  6817.     beq.b    .sii
  6818.     
  6819.     cmp    #856*4,d0
  6820.     bls.b    .dd
  6821.     move    #856*4,d0
  6822. .dd    cmp    #113*4,d0
  6823.     bhs.b    .dd2
  6824.     move    #113*4,d0
  6825. .dd2    move    d0,period(a2)
  6826.     move    d0,mPeriod(a4)
  6827.     rts
  6828.  
  6829. .sii    cmp    #$7fff,d0
  6830.     bls.b    .dd3
  6831.     move    #$7fff,d0
  6832. .dd3    cmp    #64,d0
  6833.     bhs.b    .dd4
  6834.     move    #64,d0
  6835. .dd4    move    d0,mPeriod(a4)
  6836.     rts
  6837.  
  6838.  
  6839. noteporta
  6840.     move.b    info(a2),d0
  6841.     beq.b    notchange
  6842.     move.b    d0,notepspd(a2)
  6843. notchange
  6844.     move    toperiod(a2),d0
  6845.     beq.b    .1
  6846.     moveq    #0,d1
  6847.     move.b    notepspd(a2),d1
  6848.     lsl    #2,d1
  6849.  
  6850.     cmp    period(a2),d0
  6851.     blt.b    .topoup
  6852.  
  6853.     add    d1,period(a2)
  6854.     cmp    period(a2),d0
  6855.     bgt.b    .1
  6856.     move    d0,period(a2)
  6857.     clr    toperiod(a2)
  6858. .1    move    period(a2),mPeriod(a4)
  6859.     rts
  6860.  
  6861. .topoup    sub    d1,period(a2)
  6862.     cmp    period(a2),d0
  6863.     blt.b    .dd
  6864.     move    d0,period(a2)
  6865.     clr    toperiod(a2)
  6866. .dd    move    period(a2),mPeriod(a4)
  6867.     rts
  6868.  
  6869.  
  6870. vibrato    move.b    cmd(a2),d0
  6871.     bne.b    .e
  6872.     move.b    vibcmd(a2),d0
  6873.     bra.b    .skip2
  6874.  
  6875. .e    move    d0,d1
  6876.     and    #$f0,d1
  6877.     bne.b    .skip2
  6878.  
  6879.     move.b    vibcmd(a2),d1
  6880.     and    #$f0,d1
  6881.     or    d1,d0
  6882.  
  6883. .skip2
  6884.     move.b    d0,vibcmd(a2)
  6885.  
  6886. vibrato2
  6887.     moveq    #$1f,d0
  6888.     and.b    vibpos(a2),d0
  6889.     moveq    #0,d2
  6890.     lea    mt_vibratotable(pc),a3
  6891.     move.b    (a3,d0),d2
  6892.     moveq    #$f,d0
  6893.     and.b    vibcmd(a2),d0
  6894.     mulu    d0,d2
  6895.  
  6896.     moveq    #4,d0
  6897.     btst    #0,sflags+1
  6898.     bne.b    .sii
  6899.     moveq    #5,d0
  6900. .sii    lsr    d0,d2
  6901.     move    period(a2),d0
  6902.     btst    #5,vibpos(a2)
  6903.     bne.b    .neg
  6904.     add    d2,d0
  6905.     bra.b    .vib3
  6906. .neg
  6907.     sub    d2,d0
  6908. .vib3
  6909.     move    d0,mPeriod(a4)
  6910.     move.b    vibcmd(a2),d0
  6911.     lsr.b    #4,d0
  6912.     add.b    d0,vibpos(a2)
  6913.     rts
  6914.  
  6915.  
  6916. finevib    move.b    cmd(a2),d0
  6917.     bne.b    .e
  6918.     move.b    vibcmd(a2),d0
  6919.     bra.b    .skip2
  6920.  
  6921. .e    move    d0,d1
  6922.     and    #$f0,d1
  6923.     bne.b    .skip2
  6924.  
  6925.     move.b    vibcmd(a2),d1
  6926.     and    #$f0,d1
  6927.     or    d1,d0
  6928.  
  6929. .skip2
  6930.     move.b    d0,vibcmd(a2)
  6931.     moveq    #$1f,d0
  6932.     and.b    vibpos(a2),d0
  6933.     moveq    #0,d2
  6934.     lea    mt_vibratotable(pc),a3
  6935.     move.b    (a3,d0),d2
  6936.     moveq    #$f,d0
  6937.     and.b    vibcmd(a2),d0
  6938.     mulu    d0,d2
  6939.  
  6940.     lsr    #7,d2
  6941.     move    period(a2),d0
  6942.     btst    #5,vibpos(a2)
  6943.     bne.b    .neg
  6944.     add    d2,d0
  6945.     bra.b    .vib3
  6946. .neg    sub    d2,d0
  6947. .vib3    move    d0,mPeriod(a4)
  6948.     move.b    vibcmd(a2),d0
  6949.     lsr.b    #4,d0
  6950.     add.b    d0,vibpos(a2)
  6951.     rts
  6952.  
  6953.  
  6954. arpeggio
  6955.     moveq    #0,d0
  6956.     move.b    note(a2),d0
  6957.     beq.b    .qq
  6958.  
  6959.     moveq    #$70,d1
  6960.     and    d0,d1
  6961.     and    #$f,d0
  6962.  
  6963.     moveq    #0,d2
  6964.     move    cn,d2
  6965.     divu    #3,d2
  6966.     swap    d2
  6967.     tst    d2
  6968.     beq.b    .norm
  6969.     subq    #1,d2
  6970.     beq.b    .1
  6971.  
  6972.     moveq    #$f,d2
  6973.     and.b    lastcmd(a2),d2
  6974.     add    d2,d0
  6975. .f    cmp    #12,d0
  6976.     blt.b    .norm
  6977.     sub    #12,d0
  6978.     add    #$10,d1
  6979.     bra.b    .f
  6980.  
  6981. .1    move.b    lastcmd(a2),d2
  6982.     lsr.b    #4,d2
  6983.     add.b    d2,d0
  6984. .f2    cmp    #12,d0
  6985.     blt.b    .norm
  6986.     sub    #12,d0
  6987.     add    #$10,d1
  6988.     bra.b    .f2
  6989.  
  6990. .norm    add    d0,d0
  6991.     lsr    #4,d1
  6992.  
  6993.     move.l    sample(a2),a1
  6994.  
  6995.     move.l    $20(a1),d2
  6996.     ilword    d2
  6997.  
  6998.     lea    Periods(pc),a1
  6999.     move    (a1,d0),d0
  7000.     mulu    #8363,d0
  7001.     lsl.l    #4,d0
  7002.     lsr.l    d1,d0
  7003.     divu    d2,d0
  7004.     move    d0,mPeriod(a4)
  7005. .qq    rts
  7006.  
  7007.  
  7008. pvslide    bsr    notchange
  7009.     bra    vslide
  7010.  
  7011. vvslide    bsr    vibrato2
  7012.     bra    vslide
  7013.  
  7014. soffset    moveq    #32,d0
  7015.     and.b    flgs(a2),d0
  7016.     beq    .f
  7017.     move.b    (a2),d0
  7018.     beq    .f
  7019.     cmp.b    #255,d0
  7020.     beq    .f
  7021.  
  7022.     move.l    sample(a2),d0
  7023.     beq.b    .f
  7024.     move.l    d0,a1
  7025.  
  7026.     moveq    #0,d0
  7027.     move    insmemseg(a1),d0
  7028.     iword    d0
  7029.     lsl.l    #4,d0
  7030.     move.l    a0,d4
  7031.     add.l    d0,d4
  7032.  
  7033.     move.l    inslength(a1),d0
  7034.     ilword    d0
  7035.  
  7036.     moveq    #0,d2
  7037.     move.b    lastcmd(a2),d2
  7038.     lsl.l    #8,d2
  7039.     add.l    d2,d4
  7040.     sub.l    d2,d0
  7041.     bpl.b    .ok
  7042.     move.l    mLStart(a4),d4
  7043.     move.l    mLLength(a4),d0
  7044. .ok    move.l    d4,(a4)
  7045.     move.l    d0,mLength(a4)
  7046. .f    rts
  7047.  
  7048.  
  7049. retrig    move.b    retrigcn(a2),d0
  7050.     subq.b    #1,d0
  7051.     cmp.b    #0,d0
  7052.     ble.b    .retrig
  7053.  
  7054.     move.b    d0,retrigcn(a2)
  7055.     rts
  7056.  
  7057. .retrig    move.l    sample(a2),d0
  7058.     beq    .f
  7059.     move.l    d0,a1
  7060.     moveq    #0,d1
  7061.     move    insmemseg(a1),d1
  7062.     iword    d1
  7063.     lsl.l    #4,d1
  7064.     move.l    a0,d4
  7065.     add.l    d1,d4
  7066.  
  7067.     move.l    inslength(a1),d1
  7068.     ilword    d1
  7069.  
  7070.     move.l    d4,(a4)
  7071.     move.l    d1,mLength(a4)
  7072.     clr.b    mOnOff(a4)
  7073.     clr.l    mFPos(a4)
  7074.  
  7075.     move.b    lastcmd(a2),d0
  7076.     moveq    #$f,d1
  7077.     and.b    d0,d1
  7078.     move.b    d1,retrigcn(a2)
  7079.  
  7080.     and    #$f0,d0
  7081.     lsr    #4,d0
  7082.     lea    ftab2(pc),a3
  7083.     moveq    #0,d2
  7084.     move.b    (a3,d0),d2
  7085.     beq.b    .ddq
  7086.  
  7087.     mulu    volume(a2),d2
  7088.     lsr    #4,d2
  7089.     move    d2,volume(a2)
  7090.     bra.b    .ddw
  7091.  
  7092. .ddq    lea    ftab1(pc),a3
  7093.     move.b    (a3,d0),d2
  7094.     ext    d2
  7095.     add    d2,volume(a2)
  7096.  
  7097. .ddw    tst    volume(a2)
  7098.     bpl.b    .ei0
  7099.     clr    volume(a2)
  7100. .ei0    cmp    #64,volume(a2)
  7101.     blo.b    .ei64
  7102.     move    #63,volume(a2)
  7103. .ei64    move    volume(a2),d0
  7104.     mulu    globalVol,d0
  7105.     lsr    #6,d0
  7106.     move    d0,mVolume(a4)
  7107. .f    rts
  7108.  
  7109. ; NOTE: All subroutines expect the command parameter (the x of Fx, that is) in d0!
  7110. specials
  7111.     move.b    info(a2),d1
  7112.     moveq    #$f,d0
  7113.     and    d1,d0
  7114.     and    #$f0,d1
  7115.     cmp    #$b0,d1
  7116.     beq.b    .ploop
  7117.     cmp    #$d0,d1
  7118.     beq.b    .delay
  7119.     cmp    #$e0,d1
  7120.     beq.b    .pdelay
  7121.     cmp    #$c0,d1
  7122.     bne.b    .dd
  7123.  
  7124.     cmp    cn,d0
  7125.     bne.b    .dd
  7126.     clr    volume(a2)
  7127.     clr    mVolume(a4)
  7128. .dd    rts
  7129.  
  7130. .ploop    tst    cn
  7131.     bne.b    .dd
  7132.  
  7133.     tst    d0
  7134.     beq.b    .setlp            ; 0 means "set loop mark" in current line
  7135.  
  7136.     tst    loopcnt(a2)        ; dont allow nesting, accept value
  7137.     beq.b    .jcnt            ; only if we counted down the last loop
  7138.  
  7139.     subq    #1,loopcnt(a2)        ; count down
  7140.     bne.b    .jloop            ; jump again if still not zero
  7141.     rts
  7142. .jcnt    move    d0,loopcnt(a2)        ; accept new loop value
  7143. .jloop    move    looprow(a2),pbrkrow    ; put line number to jump to
  7144.     st    pbrkflag
  7145.     rts
  7146. .setlp    move    rows,looprow(a2)
  7147.     rts
  7148.  
  7149. .pdelay    tst    cn
  7150.     bne.b    .dd
  7151.  
  7152.     tst    pdelaycnt
  7153.     bne.b    .skip
  7154.  
  7155.     move    d0,pdelaycnt
  7156. .skip    rts
  7157.  
  7158. .delay    cmp    cn,d0
  7159.     bne.b    .dd
  7160.     
  7161.     moveq    #32,d0
  7162.     and.b    flgs(a2),d0
  7163.     beq    .f
  7164.  
  7165.     move.b    inst(a2),d0
  7166.     beq    .esmp
  7167.     bmi    .esmp
  7168.  
  7169.     cmp    inss,d0
  7170.     bgt    .dd
  7171.  
  7172.     move.l    samples,a5
  7173.     add    d0,d0
  7174.     move    -2(a5,d0),d0
  7175.     iword    d0
  7176.     asl    #4,d0
  7177.     lea    (a0,d0),a1
  7178.  
  7179.     moveq    #0,d0
  7180.     move    insmemseg(a1),d0
  7181.     iword    d0
  7182.     asl.l    #4,d0
  7183.     move.l    a0,d4
  7184.     add.l    d0,d4
  7185.  
  7186.     move.l    insloopbeg(a1),d1
  7187.     ilword    d1
  7188.     move.l    insloopend(a1),d2
  7189.     ilword    d2
  7190.     sub.l    d1,d2
  7191.     add.l    d4,d1
  7192.  
  7193.     move.l    inslength(a1),d0
  7194.     ilword    d0
  7195.  
  7196.     move.l    d4,(a4)
  7197.     move.l    d0,mLength(a4)
  7198.     move.l    d1,mLStart(a4)
  7199.     move.l    d2,mLLength(a4)
  7200.     move.b    insvol(a1),volume+1(a2)
  7201.     cmp    #64,volume(a2)
  7202.     blo.b    .e
  7203.     move    #63,volume(a2)
  7204. .e    clr.b    mOnOff(a4)
  7205.  
  7206.     move.l    a1,sample(a2)
  7207.  
  7208.     btst    #0,insflags(a1)
  7209.     bne.b    .loo
  7210.     clr.b    mLoop(a4)
  7211.     bra.b    .esmp
  7212. .loo    cmp.l    #2,d2
  7213.     shi    mLoop(a4)
  7214.  
  7215. .esmp    moveq    #0,d0
  7216.     move.b    (a2),d0
  7217.     beq.b    .f
  7218.     bmi.b    .f
  7219.  
  7220.     moveq    #$70,d1
  7221.     and    d0,d1
  7222.     lsr    #4,d1
  7223.  
  7224.     and    #$f,d0
  7225.     add    d0,d0
  7226.  
  7227.     move.l    sample(a2),a1
  7228.  
  7229.     move.l    $20(a1),d2
  7230.     ilword    d2
  7231.  
  7232.     lea    Periods(pc),a1
  7233.     move    (a1,d0),d0
  7234.     mulu    #8363,d0
  7235.     lsl.l    #4,d0
  7236.     lsr.l    d1,d0
  7237.     divu    d2,d0
  7238.  
  7239.     move    d0,mPeriod(a4)
  7240.     move    d0,period(a2)
  7241.     clr.l    mFPos(a4)
  7242.     clr.b    vibpos(a2)
  7243.  
  7244. .f    moveq    #64,d0
  7245.     and.b    flgs(a2),d0
  7246.     beq.b    .evol
  7247.     move.b    vol(a2),volume+1(a2)
  7248.     cmp    #64,volume(a2)
  7249.     blo.b    .evol
  7250.     move    #63,volume(a2)
  7251. .evol    move    volume(a2),d0
  7252.     mulu    globalVol,d0
  7253.     lsr    #6,d0
  7254.     move    d0,mVolume(a4)
  7255.     rts
  7256.  
  7257.  
  7258. stempo    moveq    #0,d0
  7259.     move.b    info(a2),d0
  7260.     cmp    #32,d0
  7261.     bls.b    .e
  7262.     move.l    mrate,d1
  7263.     move.l    d1,d2
  7264.     lsl.l    #2,d1
  7265.     add.l    d2,d1
  7266.     add    d0,d0
  7267.     divu    d0,d1
  7268.  
  7269.     addq    #1,d1
  7270.     and    #~1,d1
  7271.     move    d1,bytesperframe
  7272. .e    rts
  7273.  
  7274. setmaster
  7275.     moveq    #0,d0
  7276.     move.b    info(a2),d0
  7277.     cmp    #64,d0
  7278.     bls.b    .d
  7279.     moveq    #64,d0
  7280. .d    move    d0,globalVol
  7281.     rts
  7282.  
  7283. Periods
  7284.  dc    1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,907
  7285.  
  7286. ftab1    dc.b    0,-1,-2,-4,-8,-16,0,0
  7287.     dc.b    0,1,2,4,8,16,0,0
  7288.  
  7289. ftab2    dc.b    0,0,0,0,0,0,10,8
  7290.     dc.b    0,0,0,0,0,0,24,32
  7291.  
  7292. ********** Fasttracker ][ XM player **************
  7293.  
  7294.     basereg    data,a5
  7295.  
  7296. xm_init    move.l    s3m(a5),a0
  7297.     lea    xmName(a0),a1
  7298.     move.l    a1,mname(a5)
  7299.  
  7300.     lea    xmNum1A(a0),a2
  7301.     moveq    #18,d0
  7302. .t    cmp.b    #' ',-(a2)
  7303.     bne.b    .x
  7304.     dbf    d0,.t
  7305. .x    clr.b    1(a2)
  7306.  
  7307.     move    xmSpeed(a0),d0
  7308.     iword    d0
  7309.     tst    d0
  7310.     bne.b    .ok
  7311.     moveq    #6,d0
  7312. .ok    move    d0,spd(a5)
  7313.  
  7314.     move    xmTempo(a0),d0
  7315.     iword    d0
  7316.     cmp    #32,d0
  7317.     bhi.b    .qw
  7318.     moveq    #125,d0
  7319. .qw    move    d0,tempo(a5)
  7320.  
  7321.     move    xmFlags(a0),d0
  7322.     iword    d0
  7323.     move    d0,sflags(a5)
  7324.  
  7325.     tst    PS3M_reinit(a5)
  7326.     bne    xm_skipinit
  7327.  
  7328.     move    xmSongLength(a0),d0
  7329.     iword    d0
  7330.     move    d0,slen(a5)
  7331.     move    d0,positioneita(a5)
  7332.  
  7333.     moveq    #0,d0
  7334.     move.b    xmNumChans(a0),d0
  7335.     move    d0,numchans(a5)
  7336.     addq    #1,d0
  7337.     lsr    #1,d0
  7338.     move    d0,maxchan(a5)            ;!!!
  7339.  
  7340.     move    xmNumInsts(a0),d0
  7341.     iword    d0
  7342.     move    d0,inss(a5)
  7343.  
  7344.     lea    xmHdrSize(a0),a1
  7345.     move.l    (a1),d0
  7346.     ilword    d0
  7347.     add.l    d0,a1
  7348.     lea    xm_patts,a2
  7349.     move    xmNumPatts(a0),d7
  7350.     iword    d7
  7351.     subq    #1,d7
  7352. .pattloop
  7353.     move.l    a1,(a2)+
  7354.     move.l    a1,a3                ; xmPattHdrSize
  7355.     tlword    (a3)+,d0
  7356.     lea    xmPattDataSize(a1),a3
  7357.     add.l    d0,a1
  7358.     moveq    #0,d0
  7359.     tword    (a3)+,d0
  7360.     add.l    d0,a1
  7361.     dbf    d7,.pattloop
  7362.  
  7363.     lea    xm_insts,a2
  7364.     move    inss(a5),d7
  7365.     subq    #1,d7
  7366. .instloop
  7367.     moveq    #0,d5                ; instlength
  7368.     move.l    a1,(a2)+
  7369.     move.l    a1,a3                ; xmInstSize
  7370.     tlword    (a3)+,d0
  7371.     lea    xmNumSamples(a1),a3
  7372.     tword    (a3)+,d1
  7373.     lea    xmSmpHdrSize(a1),a3
  7374.     add.l    d0,a1
  7375.     tst    d1
  7376.     beq    .q
  7377.     tlword    (a3)+,d2            ; xmSmpHdrSize
  7378.     move    d2,d6
  7379.     mulu    d1,d6
  7380.     lea    (a1,d6.l),a4            ; sample start
  7381.     subq    #1,d1
  7382. .ll    move.l    a1,a3                ; xmSmpLength
  7383.     tlword    (a3)+,d0
  7384.     tst.l    d0
  7385.     beq.b    .e
  7386.     add.l    d0,d5
  7387.  
  7388.     btst    #xm16bitf,xmSmpFlags(a1)
  7389.     beq.b    .bit8
  7390.  
  7391. ; Dedelta the samples
  7392.  
  7393. .bit16    moveq    #0,d4
  7394.     move.l    a4,a6
  7395. .l3    move.b    (a4)+,d3
  7396.     move.b    (a4)+,d6
  7397.     lsl    #8,d6
  7398.     move.b    d3,d6
  7399.     add    d4,d6
  7400.     move    d6,d4
  7401.     lsr    #8,d6
  7402.     move.b    d6,(a6)+
  7403.     subq.l    #2,d0
  7404.     bne.b    .l3
  7405.     bra.b    .e
  7406.  
  7407. .bit8    moveq    #0,d4
  7408. .l2    add.b    (a4),d4
  7409.     move.b    d4,(a4)+
  7410.     subq.l    #1,d0
  7411.     bne.b    .l2
  7412.  
  7413. .e    add.l    d2,a1
  7414.     dbf    d1,.ll
  7415.  
  7416.     add.l    d5,a1
  7417.  
  7418. .q    dbf    d7,.instloop
  7419.  
  7420.  
  7421. xm_skipinit
  7422.     clr    pos(a5)
  7423.     clr    rows(a5)
  7424.     clr    cn(a5)
  7425.     clr    pdelaycnt(a5)
  7426.     clr    pjmpflag(a5)
  7427.     clr    pbrkflag(a5)
  7428.     clr    pbrkrow(a5)
  7429.     move    #64,globalVol(a5)
  7430.  
  7431.     lea    pantab(a5),a1
  7432.     move.l    a1,a2
  7433.     moveq    #7,d0
  7434. .l9    clr.l    (a2)+
  7435.     dbf    d0,.l9
  7436.  
  7437.     move    numchans(a5),d0
  7438.     subq    #1,d0
  7439.     moveq    #0,d1
  7440. .lop    tst    d1
  7441.     beq.b    .vas
  7442.     cmp    #3,d1
  7443.     beq.b    .vas
  7444. .oik    move.b    #-1,(a1)+
  7445.     bra.b    .je
  7446. .vas    move.b    #1,(a1)+
  7447. .je    addq    #1,d1
  7448.     and    #3,d1
  7449.     dbf    d0,.lop
  7450.  
  7451.     move.l    #8363*1712/4,clock(a5)        ; Clock constant
  7452.     move    #1,fformat(a5)            ; signed samples
  7453.  
  7454.     moveq    #0,d1
  7455.     move.b    xmOrders(a0),d1
  7456.     lsl.l    #2,d1
  7457.     lea    xm_patts,a1
  7458.     move.l    (a1,d1),a1
  7459.  
  7460.     lea    xmNumRows(a1),a3
  7461.     tword    (a3)+,d0
  7462.     move    d0,plen(a5)
  7463.     move.l    a1,a3
  7464.     tlword    (a3)+,d0
  7465.     add.l    d0,a1
  7466.     move.l    a1,ppos(a5)
  7467.  
  7468.     st    PS3M_reinit(a5)
  7469.     moveq    #0,d0
  7470.     rts
  7471.  
  7472.  
  7473. xm_music
  7474.     lea    data,a5
  7475.     move.l    s3m(a5),a0
  7476.     pea    xm_runEnvelopes(pc)
  7477.  
  7478.     addq    #1,cn(a5)
  7479.     move    cn(a5),d0
  7480.     cmp    spd(a5),d0
  7481.     beq    xm_newrow
  7482.  
  7483. xm_ccmds
  7484.     lea    c0(a5),a2
  7485.     lea    cha0(a5),a4
  7486.     move    numchans(a5),d7
  7487.     subq    #1,d7
  7488.  
  7489. .loo    moveq    #0,d0
  7490.     move.b    vol(a2),d0
  7491.     cmp.b    #$60,d0
  7492.     blo.b    .eivol
  7493.  
  7494.     lea    xm_cvct(pc),a1
  7495.     moveq    #$f,d1
  7496.     and    d0,d1
  7497.     move    d1,d2
  7498.     lsr    #4,d0
  7499.     subq    #6,d0
  7500.     add    d0,d0
  7501.     move    (a1,d0),d0
  7502.     jsr    (a1,d0)
  7503.  
  7504. .eivol    lea    xm_cct(pc),a1
  7505.     moveq    #0,d0
  7506.     move.b    cmd(a2),d0
  7507.     cmp.b    #$20,d0
  7508.     bhi.b    .edi
  7509.     moveq    #0,d1
  7510.     move.b    info(a2),d1
  7511.     beq.b    .zero
  7512.     move.b    d1,lastcmd(a2)
  7513. .zero    moveq    #0,d2
  7514.     move.b    lastcmd(a2),d2
  7515.     add    d0,d0
  7516.     move    (a1,d0),d0
  7517.     jsr    (a1,d0)
  7518.  
  7519. .edi    lea    s3mChanBlock_SIZE(a2),a2
  7520.     lea    mChanBlock_SIZE(a4),a4
  7521.     dbf    d7,.loo
  7522.     rts
  7523.  
  7524.  
  7525. xm_runEnvelopes
  7526.     lea    c0(a5),a2
  7527.     lea    cha0(a5),a4
  7528.     move    numchans(a5),d7
  7529.     subq    #1,d7
  7530. .envloop
  7531.     move.l    sample(a2),d1
  7532.     beq    .skip
  7533.  
  7534.     move.l    d1,a1    
  7535.  
  7536.     move    rVolume(a2),d0
  7537.  
  7538.     tst.b    volEnvOn(a2)
  7539.     beq    .nsus
  7540.  
  7541.     tst.b    fading(a2)
  7542.     beq.b    .envvol
  7543.  
  7544.     mulu    fadeOut(a2),d0
  7545.     swap    d0
  7546.  
  7547.     tst    fadeOut(a2)
  7548.     beq.b    .envvol
  7549.  
  7550.     lea    xmVolFadeout(a1),a3
  7551.     moveq    #0,d1
  7552.     tword    (a3)+,d1
  7553.     moveq    #0,d2
  7554.     move    fadeOut(a2),d2
  7555.     sub.l    d1,d2
  7556.     bpl.b    .ok
  7557.     moveq    #0,d2
  7558. .ok    move    d2,fadeOut(a2)
  7559.  
  7560. .envvol
  7561.     moveq    #0,d1
  7562.     move.b    xmNumVolPnts(a1),d1
  7563.     lea    xmVolEnv(a1),a3
  7564.     subq    #1,d1
  7565.     bcs.b    .xtst
  7566. .xlop    tword    (a3)+,d2
  7567.     addq    #2,a3
  7568.     cmp    volEnvX(a2),d2
  7569.     bcc.b    .xfnd
  7570.     dbra    d1,.xlop
  7571. .xfnd    subq    #4,a3
  7572. .xtst
  7573.     move.l    a3,a0
  7574.     tword    (a0)+,d2
  7575.     cmp    volEnvX(a2),d2
  7576.     bne.b    .points
  7577. .point
  7578.     lea    2(a3),a0
  7579.     tword    (a0)+,d3
  7580.     lsl    #8,d3                ; y
  7581.     bra.b    .vol
  7582. .points
  7583.     lea    -4(a3),a0
  7584.     tword    (a0)+,d2            ; x
  7585.     tword    (a0)+,d3            ; y
  7586.     tword    (a0)+,d4
  7587.     sub    d2,d4                ; tx
  7588.     tword    (a0)+,d5
  7589.     sub    d3,d5                ; ty
  7590.     lsl    #8,d3
  7591.     ext.l    d5
  7592.     lsl.l    #8,d5
  7593.  
  7594.     move    volEnvX(a2),d1
  7595.     sub    d2,d1
  7596.     muls    d4,d1
  7597.     beq.b    .vol
  7598.     divs    d1,d5
  7599.     add    d5,d3
  7600. .vol
  7601.     muls    d3,d0
  7602.     bpl.b    .vtst
  7603.     moveq    #0,d0
  7604.     bra.b    .sust
  7605. .vtst    lsl.l    #2,d0
  7606.     swap    d0
  7607.     moveq    #64,d1
  7608.     cmp    d0,d1
  7609.     bcc.b    .sust
  7610.     move    d1,d0
  7611. .sust
  7612.     tst.b    volSustained(a2)
  7613.     bne    .nsus
  7614.  
  7615.     btst    #xmEnvOn,xmVolType(a1)
  7616.     beq.b    .ninc
  7617.  
  7618.     moveq    #0,d1
  7619.     move.b    xmNumVolPnts(a1),d1
  7620.     bmi.b    .ninc
  7621.     lsl    #2,d1
  7622.     subq    #4,d1
  7623.     lea    xmVolEnv(a1),a3
  7624.     add    d1,a3
  7625.     tword    (a3)+,d1
  7626.     cmp    volEnvX(a2),d1
  7627.     bls.b    .ninc
  7628.     addq    #1,volEnvX(a2)
  7629. .ninc
  7630.     btst    #xmEnvLoop,xmVolType(a1)
  7631.     beq.b    .nloo
  7632.  
  7633.     moveq    #0,d1
  7634.     move.b    xmVolLoopEnd(a1),d1
  7635.     bmi.s    .nloo
  7636.     lsl    #2,d1
  7637.     lea    xmVolEnv(a1),a3
  7638.     add    d1,a3
  7639.     tword    (a3)+,d1
  7640.     cmp    volEnvX(a2),d1
  7641.     bhi.b    .nloo
  7642.     moveq    #0,d1
  7643.     move.b    xmVolLoopStart(a1),d1
  7644.     bmi.s    .nloo
  7645.     lsl    #2,d1
  7646.     lea    xmVolEnv(a1),a3
  7647.     add    d1,a3
  7648.     tword    (a3)+,d1
  7649.     move    d1,volEnvX(a2)
  7650. .nloo
  7651.     btst    #xmEnvSustain,xmVolType(a1)
  7652.     beq.b    .nsus
  7653.  
  7654.     tst.b    keyoff(a2)
  7655.     bne.s    .nsus
  7656.     moveq    #0,d1
  7657.     move.b    xmVolSustain(a1),d1
  7658.     bmi.b    .nsus
  7659.     lsl    #2,d1
  7660.     lea    xmVolEnv(a1),a3
  7661.     add    d1,a3
  7662.     tword    (a3)+,d1
  7663.     cmp    volEnvX(a2),d1
  7664.     bne.b    .nsus    
  7665.     st    volSustained(a2)
  7666. .nsus
  7667.     cmp    #64,globalVol(a5)
  7668.     beq.b    .skipgvol
  7669.  
  7670.     mulu    globalVol(a5),d0
  7671.     lsr    #6,d0
  7672. .skipgvol
  7673.     move    d0,mVolume(a4)
  7674.  
  7675. .skip    btst    #0,sflags+1(a5)
  7676.     beq.b    .amigaperiods
  7677.  
  7678.     moveq    #0,d0
  7679.     move    rPeriod(a2),d0
  7680.     divu    #768,d0
  7681.     move    d0,d1
  7682.     swap    d0
  7683.     lsl    #2,d0
  7684.     lea    xm_linFreq(pc),a0
  7685.     move.l    (a0,d0),d0
  7686.     lsr.l    d1,d0
  7687.     move.l    d0,d1
  7688.     move.l    #8363*1712,d0
  7689.     bsr    divu_32
  7690.  
  7691.     move    d0,mPeriod(a4)
  7692.     bra.b    .k
  7693.  
  7694. .amigaperiods
  7695.     move    rPeriod(a2),mPeriod(a4)
  7696.  
  7697. .k    lea    s3mChanBlock_SIZE(a2),a2
  7698.     lea    mChanBlock_SIZE(a4),a4
  7699.     dbf    d7,.envloop
  7700.     rts
  7701.  
  7702.  
  7703. xm_newrow
  7704.     clr    cn(a5)
  7705.  
  7706.     tst    pdelaycnt(a5)
  7707.     bne    .process
  7708.  
  7709.     move    pos(a5),d0
  7710.     moveq    #0,d1
  7711.     move.b    xmOrders(a0,d0),d1    
  7712.     lsl    #2,d1
  7713.     lea    xm_patts,a1
  7714.     move.l    (a1,d1),a1
  7715.     addq.l    #xmPattDataSize,a1
  7716.     tst.b    (a1)+
  7717.     bne.b    .pattok
  7718.     tst.b    (a1)+
  7719.     bne.b    .pattok
  7720.  
  7721.     lea    c0(a5),a2        ;chanblocks
  7722.     move    numchans(a5),d7
  7723.     subq    #1,d7
  7724. .luu    clr.l    (a2)
  7725.     clr.b    info(a2)
  7726.     lea    s3mChanBlock_SIZE(a2),a2
  7727.     dbf    d7,.luu
  7728.     bra.b    .process
  7729.  
  7730. .pattok    move.l    ppos(a5),a1
  7731.     lea    c0(a5),a2        ;chanblocks
  7732.     move    numchans(a5),d7
  7733.     subq    #1,d7
  7734. .loo    move.b    (a1)+,d0
  7735.     bpl.b    .all
  7736.  
  7737.     clr.l    (a2)
  7738.     clr.b    info(a2)
  7739.  
  7740.     btst    #0,d0
  7741.     beq.b    .nonote
  7742.     move.b    (a1)+,(a2)
  7743. .nonote    btst    #1,d0
  7744.     beq.b    .noinst
  7745.     move.b    (a1)+,inst(a2)
  7746. .noinst    btst    #2,d0
  7747.     beq.b    .novol
  7748.     move.b    (a1)+,vol(a2)
  7749. .novol    btst    #3,d0
  7750.     beq.b    .nocmd
  7751.     move.b    (a1)+,cmd(a2)
  7752. .nocmd    btst    #4,d0
  7753.     beq.b    .next
  7754.     move.b    (a1)+,info(a2)
  7755.     bra.b    .next
  7756.     
  7757. .all    move.b    d0,(a2)
  7758.     move.b    (a1)+,inst(a2)
  7759.     move.b    (a1)+,vol(a2)
  7760.     move.b    (a1)+,cmd(a2)
  7761.     move.b    (a1)+,info(a2)
  7762.  
  7763. .next    lea    s3mChanBlock_SIZE(a2),a2
  7764.     dbf    d7,.loo
  7765.     move.l    a1,ppos(a5)
  7766.  
  7767. .process
  7768.     lea    c0(a5),a2
  7769.     lea    cha0(a5),a4
  7770.     move    numchans(a5),d7
  7771.     subq    #1,d7
  7772. .channelloop
  7773.     tst    pdelaycnt(a5)
  7774.     bne    .skip
  7775.  
  7776.     tst    (a2)
  7777.     beq    .skip
  7778.  
  7779.     moveq    #0,d0
  7780.     move.b    (a2),d0
  7781.     bne.b    .note
  7782.     move.b    note(a2),d0
  7783. .note    move.b    d0,note(a2)
  7784.  
  7785.     moveq    #0,d1
  7786.     move.b    inst(a2),d1
  7787.     beq.b    .esmp
  7788.  
  7789.     cmp    inss,d1
  7790.     bgt.b    .esmp
  7791.  
  7792.     lsl    #2,d1
  7793.     lea    xm_insts,a1
  7794.     move.l    -4(a1,d1),a1
  7795.  
  7796.     move.l    a1,sample(a2)
  7797.     bra.b    .ju
  7798. .esmp    move.l    sample(a2),d2
  7799.     beq    .skip
  7800.     move.l    d2,a1
  7801.  
  7802. .ju    moveq    #$f,d1
  7803.     and.b    cmd(a2),d1
  7804.     cmp    #$e,d1
  7805.     bne.b    .s
  7806.     move.b    info(a2),d1
  7807.     and    #$f0,d1
  7808.     cmp    #$d0,d1
  7809.     beq    .skip
  7810.  
  7811. .s    bsr    xm_getInst
  7812.     beq    .skip
  7813.  
  7814.     tst.b    inst(a2)
  7815.     beq    .smpok
  7816.  
  7817. ; Handle envelopes
  7818.     move    #$ffff,fadeOut(a2)
  7819.     clr.b    fading(a2)
  7820.     clr.b    keyoff(a2)
  7821.  
  7822.     move.l    sample(a2),d2
  7823.     beq    .skip
  7824.     move.l    d2,a3
  7825.  
  7826.     btst    #xmEnvOn,xmVolType(a3)
  7827.     beq.b    .voloff
  7828.  
  7829.     clr    volEnvX(a2)
  7830.     st    volEnvOn(a2)
  7831.     clr.b    volSustained(a2)
  7832.     bra.b    .jep
  7833.  
  7834. .voloff    clr.b    volEnvOn(a2)
  7835.  
  7836. .jep    btst    #xmEnvOn,xmPanType(a3)
  7837.     beq.b    .panoff
  7838.  
  7839.     st    panEnvOn(a2)
  7840.     clr.b    panSustained(a2)
  7841.     bra.b    .jep2
  7842.  
  7843. .panoff    clr.b    panEnvOn(a2)
  7844.  
  7845. .jep2    move.b    xmVolume(a1),volume+1(a2)
  7846.     cmp    #64,volume(a2)
  7847.     bls.b    .e
  7848.     move    #64,volume(a2)
  7849. .e    move    volume(a2),rVolume(a2)
  7850.  
  7851.     tst.b    (a2)
  7852.     beq.b    .smpok
  7853.  
  7854.     lea    xmLoopStart(a1),a3
  7855.     tlword    (a3)+,d1
  7856.     lea    xmLoopLength(a1),a3
  7857.     tlword    (a3)+,d2
  7858.  
  7859.     btst    #xm16bitf,xmSmpFlags(a1)
  7860.     beq.b    .bit8
  7861.     lsr.l    #1,d1
  7862.     lsr.l    #1,d2
  7863. .bit8    add.l    a6,d1
  7864.  
  7865.     move.l    d1,mLStart(a4)
  7866.     move.l    d2,mLLength(a4)
  7867.     cmp.l    #2,d2
  7868.     bhi.b    .ok
  7869.  
  7870.     clr.b    mLoop(a4)
  7871.     st.b    mOnOff(a4)
  7872.     bra.b    .smpok
  7873.  
  7874. .ok    moveq    #xmLoopType,d1
  7875.     and.b    xmSmpFlags(a1),d1
  7876.     sne    mLoop(a4)
  7877.  
  7878. .smpok    tst.b    (a2)
  7879.     beq    .skip
  7880.  
  7881.     cmp.b    #97,(a2)            ; Key off -note
  7882.     beq    .keyoff
  7883.  
  7884.     bsr    xm_getPeriod
  7885.  
  7886.     cmp.b    #3,cmd(a2)
  7887.     beq    .tonep
  7888.     cmp.b    #5,cmd(a2)
  7889.     beq    .tonep
  7890.  
  7891.     move    d0,rPeriod(a2)
  7892.     move    d0,period(a2)
  7893.     clr.l    mFPos(a4)
  7894.  
  7895.     move.l    a1,a3
  7896.     tst.b    mLoop(a4)
  7897.     beq.b    .nloop
  7898.  
  7899.     addq.l    #4,a3
  7900.     tlword    (a3)+,d0
  7901.     tlword    (a3)+,d1
  7902.     add.l    d1,d0
  7903.     cmp.l    #2,d0
  7904.     bgt.b    .look
  7905.     subq.l    #8,a3
  7906.  
  7907. .nloop    tlword    (a3)+,d0            ; sample length
  7908.  
  7909. .look    moveq    #0,d1
  7910.     cmp.b    #9,cmd(a2)
  7911.     bne.b    .nooffset
  7912.  
  7913.     move.b    info(a2),d1
  7914.     bne.b    .ok3
  7915.     move.b    lastOffset(a2),d1
  7916. .ok3    move.b    d1,lastOffset(a2)
  7917.     lsl    #8,d1
  7918.     add.l    d1,a6
  7919.     sub.l    d1,d0
  7920.     bpl.b    .nooffset
  7921.     st    mOnOff(a4)
  7922.     bra.b    .skip
  7923.  
  7924. .nooffset
  7925.     btst    #xm16bitf,xmSmpFlags(a1)
  7926.     beq.b    .bit8_2
  7927.     lsr.l    #1,d0
  7928.     lsr.l    #1,d1
  7929.     sub.l    d1,a6
  7930. .bit8_2    move.l    a6,(a4)                ; sample start
  7931.     move.l    d0,mLength(a4)
  7932.     clr.b    mOnOff(a4)
  7933.     bra.b    .skip
  7934.  
  7935. .keyoff    tst.b    volEnvOn(a2)
  7936.     beq.b    .vol0
  7937.  
  7938.     clr.b    volSustained(a2)
  7939.     st    fading(a2)
  7940.     st    keyoff(a2)
  7941.     bra.b    .skip
  7942.  
  7943. .vol0    tst.b    inst(a2)
  7944.     bne.b    .skip
  7945.     clr    volume(a2)
  7946.     bra.b    .skip
  7947.  
  7948. .tonep    move    d0,toperiod(a2)
  7949.  
  7950. .skip    moveq    #0,d0
  7951.     move.b    vol(a2),d0
  7952.     cmp.b    #$10,d0
  7953.     blo.b    .eivol
  7954.  
  7955.     cmp.b    #$50,d0
  7956.     bhi.b    .volcmd
  7957.  
  7958.     sub    #$10,d0
  7959.     move    d0,volume(a2)
  7960.     bra.b    .eivol
  7961.  
  7962. .volcmd    cmp.b    #$60,d0
  7963.     blo.b    .eivol
  7964.  
  7965.     lea    xm_vct(pc),a1
  7966.     moveq    #$f,d1
  7967.     and    d0,d1
  7968.     move    d1,d2
  7969.     lsr    #4,d0
  7970.     subq    #6,d0
  7971.     add    d0,d0
  7972.     move    (a1,d0),d0
  7973.     jsr    (a1,d0)
  7974.  
  7975. .eivol    lea    xm_ct(pc),a1
  7976.     moveq    #0,d0
  7977.     move.b    cmd(a2),d0
  7978.     cmp.b    #$20,d0
  7979.     bhs.b    .skipa
  7980.     moveq    #0,d1
  7981.     move.b    info(a2),d1
  7982.     beq.b    .zero
  7983.     move.b    d1,lastcmd(a2)
  7984.  
  7985. .zero    moveq    #0,d2
  7986.     move.b    lastcmd(a2),d2
  7987.  
  7988.     ifne    debug
  7989.     move.l    kalas(a5),a3
  7990.     st    (a3,d0)
  7991.     endc
  7992.  
  7993.     add    d0,d0
  7994.     move    (a1,d0),d0
  7995.     jsr    (a1,d0)
  7996.  
  7997. .skipa    move    volume(a2),rVolume(a2)
  7998.     move    period(a2),rPeriod(a2)
  7999.  
  8000.     lea    s3mChanBlock_SIZE(a2),a2
  8001.     lea    mChanBlock_SIZE(a4),a4
  8002.     dbf    d7,.channelloop
  8003.  
  8004.     tst    pdelaycnt(a5)
  8005.     beq.b    .oke
  8006.  
  8007.     subq    #1,pdelaycnt(a5)
  8008.     bra    xm_exit
  8009.  
  8010. .oke    addq    #1,rows(a5)        ; incr. linecounter
  8011.  
  8012.     tst    pbrkflag(a5)        ; do we have to break this pattern?
  8013.     beq.b    .nobrk
  8014.     move    pbrkrow(a5),rows(a5)
  8015.     clr    pbrkrow(a5)        ; clr break position
  8016. .nobrk
  8017.     move    rows(a5),d0
  8018.     cmp    plen(a5),d0
  8019.     bcc.b    .newpos                ; worst case opt: branch not taken
  8020.  
  8021.     tst    pjmpflag(a5)        ; do we have to jump?
  8022.     bne.b    .newpos
  8023.  
  8024.     tst.w    pbrkflag(a5)
  8025.     beq    xm_dee
  8026.     moveq    #0,d2
  8027.     bra.b    conti
  8028. .newpos
  8029.     move    pbrkrow(a5),rows(a5)
  8030.     clr    pbrkrow(a5)        ; clr break position
  8031. burki
  8032.     moveq    #0,d2
  8033. burkii
  8034.     addq.w    #1,pos(a5)            ; inc songposition
  8035.     move.w    slen(a5),d0
  8036.     cmp.w    pos(a5),d0            ; are we thru with all patterns?
  8037.     bhi.b    conti                ; nope
  8038.  
  8039.     move.w    xmRestart(a0),d0
  8040.     iword    d0
  8041.     tst.l    d2
  8042.     beq.b    .okay
  8043.     moveq    #0,d0
  8044. .okay    move.w    d0,pos(a5)
  8045.     st    PS3M_break(a5)
  8046.  
  8047.     moveq    #1,d2
  8048.  
  8049. conti    move    pos(a5),d0
  8050.     move    d0,PS3M_position(a5)
  8051.     st    PS3M_poscha(a5)
  8052.  
  8053.     moveq    #0,d1
  8054.     move.b    xmOrders(a0,d0),d1    
  8055.     cmp.b    xmNumPatts(a0),d1
  8056.     bhs.b    burkii
  8057.     lsl    #2,d1
  8058.     lea    xm_patts,a1
  8059.     move.l    (a1,d1),a1
  8060.     lea    xmNumRows(a1),a3
  8061.     tword    (a3)+,d0
  8062.     move    d0,plen(a5)
  8063.     move.l    a1,a3
  8064.     tlword    (a3)+,d0
  8065.     add.l    d0,a1
  8066.  
  8067.     clr    pjmpflag(a5)
  8068.     clr    pbrkflag(a5)
  8069.  
  8070.     move.w    rows(a5),d1
  8071.     beq.b    .setp
  8072.     subq.w    #1,d1
  8073. .loop    move.w    numchans(a5),d7
  8074.     subq.w    #1,d7
  8075. .llop    move.b    (a1)+,d0
  8076.     bpl.b    .tout
  8077.     btst    #0,d0
  8078.     beq.b    .nono
  8079.     addq.w    #1,a1
  8080. .nono    btst    #1,d0
  8081.     beq.b    .noin
  8082.     addq.w    #1,a1
  8083. .noin    btst    #2,d0
  8084.     beq.b    .novo
  8085.     addq.w    #1,a1
  8086. .novo    btst    #3,d0
  8087.     beq.b    .nocm
  8088.     addq.w    #1,a1
  8089. .nocm    btst    #4,d0
  8090.     beq.b    .cont
  8091.     addq.w    #1,a1
  8092.     bra.b    .cont
  8093. .tout    addq.w    #4,a1
  8094. .cont    dbf    d7,.llop
  8095.     dbf    d1,.loop
  8096. .setp    move.l    a1,ppos(a5)
  8097.  
  8098. xm_dee    lea    c0(a5),a2
  8099.     lea    cha0(a5),a4
  8100.     move    numchans(a5),d7
  8101.     subq    #1,d7
  8102.  
  8103. .luu    tst    volume(a2)
  8104.     bne.b    .noaging
  8105.  
  8106.     cmp.b    #8,age(a2)
  8107.     bhs.b    .stop
  8108.     addq.b    #1,age(a2)
  8109.     bra.b    .nextt
  8110. .stop    st    mOnOff(a4)
  8111.     bra.b    .nextt
  8112. .noaging
  8113.     clr.b    age(a2)
  8114.  
  8115. .nextt    lea    s3mChanBlock_SIZE(a2),a2
  8116.     lea    mChanBlock_SIZE(a4),a4
  8117.     dbf    d7,.luu
  8118. xm_exit    rts
  8119.  
  8120. xm_ret    rts
  8121.  
  8122.  
  8123. ; COMMANDS!
  8124.  
  8125.  
  8126. ; Returns zero-flag set, if no samples in this instrument
  8127. ; Needs pattern note number in d0 and instrument in a1
  8128.  
  8129. xm_getInst
  8130.     moveq    #0,d6
  8131.     move.b    xmSmpNoteNums-1(a1,d0),d6    ; sample number
  8132.     lea    xmNumSamples(a1),a3
  8133.     tword    (a3)+,d2
  8134.     tst    d2
  8135.     beq    .nosample
  8136.     lea    xmSmpHdrSize(a1),a3
  8137.     tlword    (a3)+,d3
  8138.     move.l    a1,a3                ; InstHdrSize
  8139.     tlword    (a3)+,d1
  8140.     add.l    d1,a1                ; Now at the first sample!
  8141.  
  8142.     move.l    d3,d4
  8143.     mulu    d2,d4
  8144.     lea    (a1,d4),a6
  8145.  
  8146.     tst    d6
  8147.     beq.b    .rightsample
  8148.  
  8149. .skiploop
  8150.     lea    xmSmpLength(a1),a3
  8151.     tlword    (a3)+,d4
  8152.     add.l    d4,a6
  8153.     add.l    d3,a1
  8154.     subq    #1,d6
  8155.     bne.b    .skiploop
  8156.  
  8157. .rightsample
  8158.     moveq    #1,d6
  8159.     rts
  8160.  
  8161. .nosample
  8162.     st    mOnOff(a4)
  8163.     moveq    #0,d6
  8164.     rts
  8165.  
  8166.  
  8167. ; Needs instrument in a1
  8168.  
  8169. xm_getPeriod
  8170.     move.b    xmRelNote(a1),d1
  8171.     ext    d1
  8172.     add    d1,d0
  8173.     bpl.b    .ok
  8174.     moveq    #0,d0
  8175. .ok    cmp    #118,d0
  8176.     bls.b    .ok2
  8177.     moveq    #118,d0
  8178. .ok2    move.b    xmFinetune(a1),d1
  8179.     ext.l    d0
  8180.     ext    d1
  8181.  
  8182.     btst    #0,sflags+1(a5)
  8183.     beq.b    .amigafreq
  8184.  
  8185.     move    #121*64,d2
  8186.     lsl    #6,d0
  8187.     sub    d0,d2
  8188.     asr    d1
  8189.     sub    d1,d2
  8190.     move    d2,d0
  8191.     rts
  8192.  
  8193. .amigafreq
  8194.     divu    #12,d0
  8195.     swap    d0
  8196.     move    d0,d2                ; note
  8197.     clr    d0
  8198.     swap    d0                ; octave
  8199.     lsl    #3,d2
  8200.  
  8201.     move    d1,d3
  8202.     asr    #4,d3
  8203.     move    d2,d4
  8204.     add    d3,d4
  8205.  
  8206.     add    d4,d4
  8207.     lea    xm_periods(pc),a3
  8208.     moveq    #0,d5
  8209.     move    (a3,d4),d5
  8210.  
  8211.     tst    d1
  8212.     bpl.b    .k
  8213.     subq    #1,d3
  8214.     neg    d1
  8215.     bra.b    .k2
  8216. .k    addq    #1,d3
  8217. .k2    move    d2,d4
  8218.     add    d3,d4
  8219.     add    d4,d4
  8220.     moveq    #0,d6
  8221.     move    (a3,d4),d6
  8222.  
  8223.     and    #$f,d1
  8224.     mulu    d1,d6
  8225.     move    #16,d3
  8226.     sub    d1,d3
  8227.     mulu    d3,d5
  8228.     add.l    d6,d5
  8229.  
  8230.     subq    #1,d0
  8231.     bmi.b    .f2
  8232.     lsr.l    d0,d5
  8233.     bra.b    .d
  8234.  
  8235. .f2    add.l    d5,d5
  8236. .d    move    d5,d0
  8237.     rts
  8238.  
  8239.  
  8240. ; Command 0 - Arpeggio
  8241.  
  8242. xm_arpeggio
  8243.     tst.b    info(a2)
  8244.     beq.b    .skip
  8245.  
  8246.     moveq    #0,d0
  8247.     move.b    note(a2),d0
  8248.     beq.b    .skip
  8249.  
  8250.     move.l    sample(a2),d2
  8251.     beq.b    .skip
  8252.     move.l    d2,a1
  8253.  
  8254.     bsr    xm_getInst
  8255.     beq.b    .skip
  8256.  
  8257.     moveq    #0,d2
  8258.     move    cn(a5),d2
  8259.     divu    #3,d2
  8260.     swap    d2
  8261.     tst    d2
  8262.     beq.b    .f
  8263.     subq    #1,d2
  8264.     beq.b    .1
  8265.  
  8266. .2    moveq    #$f,d2
  8267.     and.b    lastcmd(a2),d2
  8268.     add    d2,d0
  8269.     bra.b    .f
  8270.  
  8271. .1    move.b    lastcmd(a2),d2
  8272.     lsr.b    #4,d2
  8273.     add.b    d2,d0
  8274.  
  8275. .f    bsr    xm_getPeriod
  8276.     move    d0,mPeriod(a4)
  8277. .skip    rts
  8278.  
  8279.  
  8280.  
  8281. ; Command 1 - Portamento up
  8282. ; Also command E1 - fine portamento up
  8283. ; and command X1 - extra fine portamento up
  8284.  
  8285. xm_slideup
  8286.     lsl    #2,d2
  8287. xm_xslideup
  8288.     sub    d2,period(a2)
  8289.     bra.b    xm_checklimits
  8290.  
  8291.  
  8292. ; Command 2 - Portamento down
  8293. ; Also command E2 - fine portamento down
  8294. ; and command X2 - extra fine portamento down
  8295.  
  8296. xm_slidedwn
  8297.     lsl    #2,d2
  8298. xm_xslidedwn
  8299.     add    d2,period(a2)
  8300.  
  8301. xm_checklimits
  8302.     move    period(a2),d0
  8303.     btst    #0,sflags+1(a5)
  8304.     beq.b    .amiga
  8305.  
  8306.     cmp    #2*64,d0
  8307.     bhs.b    .ok
  8308.     move    #2*64,d0
  8309. .ok    cmp    #121*64,d0
  8310.     bls.b    .dd2
  8311.     move    #121*64,d0
  8312.     bra.b    .dd2
  8313.  
  8314. .amiga    cmp    #$7fff,d0
  8315.     bls.b    .dd
  8316.     move    #$7fff,d0
  8317. .dd    cmp    #64,d0
  8318.     bhs.b    .dd2
  8319.     move    #64,d0
  8320. .dd2    move    d0,period(a2)
  8321.     move    d0,rPeriod(a2)
  8322.     rts
  8323.  
  8324.  
  8325. ; Command 3 - Tone portamento
  8326.  
  8327. xm_tonep
  8328.     tst    d1
  8329.     beq.b    xm_tonepnoch
  8330.     move.b    d1,notepspd(a2)
  8331. xm_tonepnoch
  8332.     move    toperiod(a2),d0
  8333.     beq.b    .1
  8334.     moveq    #0,d1
  8335.     move.b    notepspd(a2),d1
  8336.     lsl    #2,d1
  8337.  
  8338.     cmp    period(a2),d0
  8339.     blt.b    .topoup
  8340.  
  8341.     add    d1,period(a2)
  8342.     cmp    period(a2),d0
  8343.     bhi.b    .1
  8344.     move    d0,period(a2)
  8345.     clr    toperiod(a2)
  8346. .1    move    period(a2),rPeriod(a2)
  8347.     rts
  8348.  
  8349. .topoup    sub    d1,period(a2)
  8350.     cmp    period(a2),d0
  8351.     blt.b    .dd
  8352.     move    d0,period(a2)
  8353.     clr    toperiod(a2)
  8354. .dd    move    period(a2),rPeriod(a2)
  8355.     rts
  8356.  
  8357.  
  8358. ; Command 4 - Vibrato
  8359.  
  8360. xm_svibspd
  8361.     move.b    vibcmd(a2),d2
  8362.     moveq    #$f,d0
  8363.     and    d1,d0
  8364.     beq.b    .skip
  8365.     and    #$f0,d2
  8366.     or    d0,d2
  8367. .skip    move.b    d2,vibcmd(a2)
  8368.     rts
  8369.  
  8370. xm_vibrato
  8371.     move.b    vibcmd(a2),d2
  8372.     move    d1,d0
  8373.     and    #$f0,d0
  8374.     beq.b    .vib2
  8375.  
  8376.     and    #$f,d2
  8377.     or    d0,d2
  8378.  
  8379. .vib2    moveq    #$f,d0
  8380.     and    d1,d0
  8381.     beq.b    .vibskip2
  8382.  
  8383.     and    #$f0,d2
  8384.     or    d0,d2
  8385. .vibskip2
  8386.     move.b    d2,vibcmd(a2)
  8387.  
  8388. xm_vibrato2
  8389.     moveq    #$1f,d0
  8390.     and.b    vibpos(a2),d0
  8391.     moveq    #0,d2
  8392.     lea    mt_vibratotable(pc),a3
  8393.     move.b    (a3,d0),d2
  8394.     moveq    #$f,d0
  8395.     and.b    vibcmd(a2),d0
  8396.     mulu    d0,d2
  8397.     lsr    #5,d2
  8398.  
  8399.     move    period(a2),d0
  8400.     btst    #5,vibpos(a2)
  8401.     bne.b    .neg
  8402.     add    d2,d0
  8403.     bra.b    .vib3
  8404. .neg
  8405.     sub    d2,d0
  8406. .vib3
  8407.     move    d0,mPeriod(a4)
  8408.     move.b    vibcmd(a2),d0
  8409.     lsr.b    #4,d0
  8410.     add.b    d0,vibpos(a2)
  8411.     rts
  8412.  
  8413. ; Command 5 - Tone portamento and volume slide
  8414.  
  8415. xm_tpvsl
  8416.     bsr    xm_tonepnoch
  8417.     bra.b    xm_vslide
  8418.  
  8419. ; Command 6 - Vibrato and volume slide
  8420.  
  8421. xm_vibvsl
  8422.     move    d2,-(sp)
  8423.     bsr.b    xm_vibrato2
  8424.     move    (sp)+,d2
  8425.     bra.b    xm_vslide
  8426.  
  8427.  
  8428. ; Command 7 - Tremolo
  8429.  
  8430. xm_tremolo
  8431.     move.b    vibcmd(a2),d2
  8432.     move    d1,d0
  8433.     and    #$f0,d0
  8434.     beq.b    .vib2
  8435.  
  8436.     and    #$f,d2
  8437.     or    d0,d2
  8438.  
  8439. .vib2    moveq    #$f,d0
  8440.     and    d1,d0
  8441.     beq.b    .vibskip2
  8442.  
  8443.     and    #$f0,d2
  8444.     or    d0,d2
  8445. .vibskip2
  8446.     move.b    d2,vibcmd(a2)
  8447.  
  8448.     moveq    #$1f,d0
  8449.     and.b    vibpos(a2),d0
  8450.     moveq    #0,d2
  8451.     lea    mt_vibratotable(pc),a3
  8452.     move.b    (a3,d0),d2
  8453.     moveq    #$f,d0
  8454.     and.b    vibcmd(a2),d0
  8455.     mulu    d0,d2
  8456.     lsr    #6,d2
  8457.  
  8458.     move    volume(a2),d0
  8459.     btst    #5,vibpos(a2)
  8460.     bne.b    .neg
  8461.     add    d2,d0
  8462.     bra.b    .vib3
  8463. .neg
  8464.     sub    d2,d0
  8465. .vib3    move    d0,mVolume(a4)
  8466.     move.b    vibcmd(a2),d0
  8467.     lsr.b    #4,d0
  8468.     add.b    d0,vibpos(a2)
  8469.     rts
  8470.  
  8471.  
  8472. ; Command A - Volume slide
  8473. ; Also commands EA and EB, fine volume slides
  8474.  
  8475. xm_vslide
  8476.     lsr    #4,d2
  8477.     beq.b    xm_vslidedown
  8478. xm_vslideup
  8479.     add    d2,volume(a2)
  8480.     cmp    #64,volume(a2)
  8481.     bls.b    xm_vsskip
  8482.     move    #64,volume(a2)
  8483. xm_vsskip
  8484.     move    volume(a2),rVolume(a2)
  8485.     rts
  8486.  
  8487. xm_vslidedown
  8488.     moveq    #$f,d2
  8489.     and.b    lastcmd(a2),d2
  8490. xm_vslidedown2
  8491.     sub    d2,volume(a2)
  8492.     bpl.b    xm_vsskip
  8493.     clr    volume(a2)
  8494.     clr    rVolume(a2)
  8495.     rts
  8496.  
  8497.  
  8498. ; Command B - Pattern jump
  8499.  
  8500. xm_pjmp    cmp.b    pos(a5),d1
  8501.     bhi.b    .e
  8502.     st    PS3M_break
  8503. .e    subq    #1,d1
  8504.     move    d1,pos(a5)
  8505.     clr    pbrkrow(a5)
  8506.     st    pjmpflag(a5)
  8507.     st    PS3M_poscha(a5)
  8508.     rts
  8509.  
  8510.  
  8511. ; Command C - Set volume
  8512.  
  8513. xm_setvol
  8514.     cmp    #64,d1
  8515.     bls.b    .ok
  8516.     moveq    #64,d1
  8517. .ok    move    d1,volume(a2)
  8518.     rts
  8519.  
  8520.  
  8521. ; Command D - Pattern break
  8522.  
  8523. xm_pbrk    st    pjmpflag(a5)
  8524.     moveq    #$f,d2
  8525.     and.l    d1,d2
  8526.     lsr.l    #4,d1
  8527.     mulu    #10,d1
  8528.     add    d2,d1
  8529.     move    d1,pbrkrow(a5)
  8530.     st    PS3M_poscha(a5)
  8531.     rts
  8532.  
  8533.  
  8534. ; Command E - Extended commands
  8535.  
  8536. xm_ecmds
  8537.     lea    xm_ect(pc),a1
  8538. xm_ee    move    d1,d0
  8539.     moveq    #$f,d1
  8540.     and    d0,d1
  8541.     move    d1,d2
  8542.     lsr    #4,d0
  8543.  
  8544.     ifne    debug
  8545.     move.l    kalas(a5),a3
  8546.     st    $40(a3,d0)
  8547.     endc
  8548.  
  8549.     add    d0,d0
  8550.     move    (a1,d0),d0
  8551.     jmp    (a1,d0)
  8552.  
  8553. xm_cecmds
  8554.     lea    xm_cect(pc),a1
  8555.     bra.b    xm_ee
  8556.  
  8557.  
  8558. ; Command E6 - Pattern loop
  8559.  
  8560. xm_pattloop
  8561.     tst    d1
  8562.     beq.b    .setlp                ; 0 means "set loop mark" in current line
  8563.     tst.w    loopcnt(a2)            ; dont allow nesting, accept value
  8564.     beq.b    .jcnt                ; only if we counted down the last loop
  8565.     subq.w    #1,loopcnt(a2)            ; count down
  8566.     bne.b    .jloop                ; jump again if still not zero
  8567.     rts
  8568. .jcnt    move.w    d1,loopcnt(a2)            ; accept new loop value
  8569. .jloop    move.w    looprow(a2),pbrkrow(a5)    ; put line number to jump to
  8570.     st    pbrkflag(a5)
  8571.     rts
  8572. .setlp    move.w    rows(a5),looprow(a2)
  8573.     rts
  8574.  
  8575.  
  8576. ; Command E9 - Retrig note
  8577.  
  8578. xm_retrig
  8579.     subq.b    #1,retrigcn(a2)
  8580.     bne    xm_eret
  8581.  
  8582.     move.l    sample(a2),d2
  8583.     beq    xm_eret
  8584.     move.l    d2,a1
  8585.  
  8586.     move    d1,-(sp)
  8587.  
  8588.     moveq    #0,d0
  8589.     move.b    note(a2),d0
  8590.     beq    xm_sretrig
  8591.  
  8592.     bsr    xm_getInst
  8593.     beq    .skip
  8594.  
  8595.     clr.l    mFPos(a4)
  8596. ; Handle envelopes
  8597.     move    #$ffff,fadeOut(a2)
  8598.     clr.b    fading(a2)
  8599.     clr.b    keyoff(a2)
  8600.  
  8601.     move.l    sample(a2),a3
  8602.     btst    #xmEnvOn,xmVolType(a3)
  8603.     beq.b    .voloff
  8604.  
  8605.     clr    volEnvX(a2)
  8606.     st    volEnvOn(a2)
  8607.     clr.b    volSustained(a2)
  8608.     bra.b    .jep
  8609.  
  8610. .voloff    clr.b    volEnvOn(a2)
  8611.  
  8612.  
  8613. .jep    btst    #xmEnvOn,xmPanType(a3)
  8614.     beq.b    .panoff
  8615.  
  8616.     st    panEnvOn(a2)
  8617.     clr.b    panSustained(a2)
  8618.     bra.b    .jep2
  8619.  
  8620. .panoff    clr.b    panEnvOn(a2)
  8621.  
  8622. .jep2    move.l    a1,a3
  8623.     tst.b    mLoop(a4)
  8624.     beq.b    .nloop
  8625.  
  8626.     addq.l    #4,a3
  8627.     tlword    (a3)+,d0
  8628.     tlword    (a3)+,d1
  8629.     add.l    d1,d0
  8630.     cmp.l    #2,d0
  8631.     bgt.b    .look
  8632.     subq.l    #8,a3
  8633.  
  8634. .nloop    tlword    (a3)+,d0            ; sample length
  8635.  
  8636. .look    move.l    a6,(a4)                ; sample start
  8637.     btst    #xm16bitf,xmSmpFlags(a1)
  8638.     beq.b    .bit8_2
  8639.     lsr.l    #1,d0
  8640. .bit8_2    move.l    d0,mLength(a4)
  8641.     clr.b    mOnOff(a4)
  8642. .skip    move    (sp)+,d1
  8643. xm_sretrig
  8644.     move.b    d1,retrigcn(a2)
  8645.     rts
  8646.  
  8647.  
  8648. ; Command EC - Note cut
  8649.  
  8650. xm_ncut    cmp    cn(a5),d1
  8651.     bne.b    xm_eret
  8652.     clr    volume(a2)
  8653.     clr    rVolume(a2)
  8654. xm_eret    rts
  8655.  
  8656.  
  8657. ; Command ED - Delay note
  8658.  
  8659. xm_ndelay
  8660.     cmp    cn(a5),d1
  8661.     bne.b    xm_eret
  8662.  
  8663.     tst    (a2)
  8664.     beq    .skip
  8665.  
  8666.     moveq    #0,d0
  8667.     move.b    (a2),d0
  8668.     beq    .skip
  8669.  
  8670.     cmp.b    #97,d0                ; Key off -note
  8671.     beq    .keyoff
  8672.  
  8673.     move.b    d0,note(a2)
  8674.  
  8675.     moveq    #0,d1
  8676.     move.b    inst(a2),d1
  8677.     beq.b    .esmp
  8678.  
  8679.     cmp    inss,d1
  8680.     bgt.b    .esmp
  8681.  
  8682.     lsl    #2,d1
  8683.     lea    xm_insts,a1
  8684.     move.l    -4(a1,d1),a1
  8685.  
  8686.     move.l    a1,sample(a2)
  8687.     bra.b    .ju
  8688. .esmp    move.l    sample(a2),d2
  8689.     beq    .skip
  8690.     move.l    d2,a1
  8691.  
  8692. .ju    bsr    xm_getInst
  8693.     beq    .skip
  8694.  
  8695.     tst.b    inst(a2)
  8696.     beq.b    .smpok
  8697.  
  8698.     lea    xmLoopStart(a1),a3
  8699.     tlword    (a3)+,d1
  8700.     lea    xmLoopLength(a1),a3
  8701.     tlword    (a3)+,d2
  8702.  
  8703.     btst    #xm16bitf,xmSmpFlags(a1)
  8704.     beq.b    .bit8
  8705.     lsr.l    #1,d1
  8706.     lsr.l    #1,d2
  8707. .bit8    add.l    a6,d1
  8708.  
  8709.     move.l    d1,mLStart(a4)
  8710.     move.l    d2,mLLength(a4)
  8711.     cmp.l    #2,d2
  8712.     bhi.b    .ok
  8713.  
  8714.     clr.b    mLoop(a4)
  8715.     st.b    mOnOff(a4)
  8716.     bra.b    .huu
  8717.  
  8718. .ok    moveq    #xmLoopType,d1
  8719.     and.b    xmSmpFlags(a1),d1
  8720.     sne    mLoop(a4)
  8721.  
  8722. .huu    move.b    xmVolume(a1),volume+1(a2)
  8723.     cmp    #64,volume(a2)
  8724.     bls.b    .e
  8725.     move    #64,volume(a2)
  8726. .e    move    volume(a2),rVolume(a2)
  8727.  
  8728. .smpok    bsr    xm_getPeriod
  8729.  
  8730.     move    d0,rPeriod(a2)
  8731.     move    d0,period(a2)
  8732.     clr.l    mFPos(a4)
  8733.  
  8734. ; Handle envelopes
  8735.     move    #$ffff,fadeOut(a2)
  8736.     clr.b    fading(a2)
  8737.     clr.b    keyoff(a2)
  8738.  
  8739.     move.l    sample(a2),a3
  8740.  
  8741.     btst    #xmEnvOn,xmVolType(a3)
  8742.     beq.b    .voloff
  8743.  
  8744.     clr    volEnvX(a2)
  8745.     st    volEnvOn(a2)
  8746.     clr.b    volSustained(a2)
  8747.     bra.b    .jep
  8748.  
  8749. .voloff    clr.b    volEnvOn(a2)
  8750.  
  8751.  
  8752. .jep    btst    #xmEnvOn,xmPanType(a3)
  8753.     beq.b    .panoff
  8754.  
  8755.     st    panEnvOn(a2)
  8756.     clr.b    panSustained(a2)
  8757.     bra.b    .jep2
  8758.  
  8759. .panoff    clr.b    panEnvOn(a2)
  8760.  
  8761. .jep2    move.l    a1,a3
  8762.     tst.b    mLoop(a4)
  8763.     beq.b    .nloop
  8764.  
  8765.     addq.l    #4,a3
  8766.     tlword    (a3)+,d0
  8767.     tlword    (a3)+,d1
  8768.     add.l    d1,d0
  8769.     cmp.l    #2,d0
  8770.     bgt.b    .look
  8771.     subq.l    #8,a3
  8772.  
  8773. .nloop    tlword    (a3)+,d0            ; sample length
  8774.  
  8775. .look    move.l    a6,(a4)                ; sample start
  8776.     btst    #xm16bitf,xmSmpFlags(a1)
  8777.     beq.b    .bit8_2
  8778.     lsr.l    #1,d0
  8779. .bit8_2    move.l    d0,mLength(a4)
  8780.     clr.b    mOnOff(a4)
  8781.     bra.b    .skip
  8782.  
  8783. .keyoff    tst.b    volEnvOn(a2)
  8784.     beq.b    .vol0
  8785.  
  8786.     clr.b    volSustained(a2)
  8787.     st    fading(a2)
  8788.     st    keyoff(a2)
  8789.     bra.b    .skip
  8790.  
  8791. .vol0    tst.b    inst(a2)
  8792.     bne.b    .skip
  8793.     clr    volume(a2)
  8794. .skip
  8795. .ret    rts
  8796.  
  8797.  
  8798. ; Command EE - Pattern delay
  8799.  
  8800. xm_pdelay
  8801.     tst    pdelaycnt(a5)
  8802.     bne.b    .skip
  8803.  
  8804.     move    d1,pdelaycnt(a5)
  8805.  
  8806. .skip    rts
  8807.  
  8808.  
  8809. ; Command F - Set speed
  8810.  
  8811. xm_spd    cmp    #$20,d1
  8812.     bhs.b    .bpm
  8813.  
  8814.     tst    d1
  8815.     bne.b    .g
  8816.     st    PS3M_break(a5)
  8817.     st    PS3M_poscha(a5)
  8818.     rts
  8819.  
  8820. .g    move    d1,spd(a5)
  8821.     rts
  8822.  
  8823. .bpm    move    d1,tempo(a5)
  8824.     move.l    mrate(a5),d0
  8825.     move.l    d0,d2
  8826.     lsl.l    #2,d0
  8827.     add.l    d2,d0
  8828.     add    d1,d1
  8829.     divu    d1,d0
  8830.  
  8831.     addq    #1,d0
  8832.     and    #~1,d0
  8833.     move    d0,bytesperframe(a5)
  8834.     rts
  8835.  
  8836.  
  8837. ; Command G - Set global volume
  8838.  
  8839. xm_sgvol
  8840.     cmp    #64,d1
  8841.     bls.b    .ok
  8842.     moveq    #64,d1
  8843. .ok    move    d1,globalVol(a5)
  8844.     rts
  8845.  
  8846.  
  8847. ; Command H - Global volume slide
  8848.  
  8849. xm_gvslide
  8850.     lsr    #4,d2
  8851.     beq.b    .down
  8852.     add    d2,globalVol(a5)
  8853.     cmp    #64,globalVol(a5)
  8854.     bls.b    .x
  8855.     move    #64,globalVol(a5)
  8856. .x    rts
  8857.  
  8858. .down    moveq    #$f,d2
  8859.     and.b    lastcmd(a2),d2
  8860.     sub    d2,globalVol(a5)
  8861.     bpl.b    .x
  8862.     clr    globalVol(a5)
  8863.     rts
  8864.  
  8865.  
  8866. ; Command K - Key off
  8867.  
  8868. xm_keyoff
  8869.     clr.b    volSustained(a2)
  8870.     st    fading(a2)
  8871.     st    keyoff(a2)
  8872.     rts
  8873.  
  8874.  
  8875. ; Command L - Set envelope position
  8876.  
  8877. xm_setenvpos
  8878.     tst.b    volEnvOn(a2)
  8879.     beq.b    .skip
  8880.  
  8881.     move.l    sample(a2),d2
  8882.     beq.b    .skip
  8883.     move.l    d2,a3
  8884.  
  8885.     btst    #xmEnvOn,xmVolType(a1)
  8886.     beq.b    .skip
  8887.  
  8888.     move    d1,volEnvX(a2)
  8889.     st    volEnvOn(a2)
  8890.     clr.b    volSustained(a2)
  8891. .skip    rts
  8892.  
  8893.  
  8894.  
  8895. ; Command R - Multi retrig note
  8896.  
  8897. xm_rretrig
  8898.     subq.b    #1,retrigcn(a2)
  8899.     bne    xm_eret
  8900.  
  8901.     move.l    sample(a2),d2
  8902.     beq    xm_eret
  8903.     move.l    d2,a1
  8904.  
  8905.     move    d1,-(sp)
  8906.  
  8907.     moveq    #0,d0
  8908.     move.b    note(a2),d0
  8909.     beq    xm_srretrig
  8910.  
  8911.     bsr    xm_getInst
  8912.     beq.b    .skip
  8913.  
  8914.     clr.l    mFPos(a4)
  8915. ; Handle envelopes
  8916.     move    #$ffff,fadeOut(a2)
  8917.     clr.b    fading(a2)
  8918.     clr.b    keyoff(a2)
  8919.  
  8920.     move.l    sample(a2),a3
  8921.     btst    #xmEnvOn,xmVolType(a3)
  8922.     beq.b    .voloff
  8923.  
  8924.     clr    volEnvX(a2)
  8925.     st    volEnvOn(a2)
  8926.     clr.b    volSustained(a2)
  8927.     bra.b    .jep
  8928.  
  8929. .voloff    clr.b    volEnvOn(a2)
  8930.  
  8931.  
  8932. .jep    btst    #xmEnvOn,xmPanType(a3)
  8933.     beq.b    .panoff
  8934.  
  8935.     st    panEnvOn(a2)
  8936.     clr.b    panSustained(a2)
  8937.     bra.b    .jep2
  8938.  
  8939. .panoff    clr.b    panEnvOn(a2)
  8940.  
  8941. .jep2    move.l    a1,a3
  8942.     tlword    (a3)+,d0            ; sample length
  8943.  
  8944.     move.l    a6,(a4)                ; sample start
  8945.     btst    #xm16bitf,xmSmpFlags(a1)
  8946.     beq.b    .bit8_2
  8947.     lsr.l    #1,d0
  8948. .bit8_2    move.l    d0,mLength(a4)
  8949.     clr.b    mOnOff(a4)
  8950.  
  8951. .skip    moveq    #0,d0
  8952.     move.b    lastcmd(a2),d0
  8953.     lsr    #4,d0
  8954.     lea    ftab2(pc),a3
  8955.     moveq    #0,d2
  8956.     move.b    (a3,d0),d2
  8957.     beq.b    .ddq
  8958.  
  8959.     mulu    volume(a2),d2
  8960.     lsr    #4,d2
  8961.     move    d2,volume(a2)
  8962.     bra.b    .ddw
  8963.  
  8964. .ddq    lea    ftab1(pc),a3
  8965.     move.b    (a3,d0),d2
  8966.     ext    d2
  8967.     add    d2,volume(a2)
  8968.  
  8969. .ddw    tst    volume(a2)
  8970.     bpl.b    .ei0
  8971.     clr    volume(a2)
  8972. .ei0    cmp    #64,volume(a2)
  8973.     bls.b    .ei64
  8974.     move    #64,volume(a2)
  8975. .ei64    move    volume(a2),mVolume(a4)
  8976.     move    (sp)+,d1
  8977. xm_srretrig
  8978.     and    #$f,d1
  8979.     move.b    d1,retrigcn(a2)
  8980.     rts
  8981.  
  8982.  
  8983. ; Command T - Tremor
  8984.  
  8985. xm_tremor
  8986.     rts
  8987.  
  8988.  
  8989. ; Command X - Extra fine slides
  8990.  
  8991. xm_xfinesld
  8992.     move.b    d2,d1
  8993.     and    #$f,d2
  8994.     cmp.b    #$10,d1
  8995.     blo.b    .q
  8996.     cmp.b    #$20,d1
  8997.     blo    xm_xslideup
  8998.     cmp.b    #$30,d1
  8999.     blo    xm_xslidedwn
  9000. .q    rts
  9001.  
  9002.     dc    960,954,948,940,934,926,920,914
  9003. xm_periods
  9004.     dc    907,900,894,887,881,875,868,862,856,850,844,838,832,826,820,814
  9005.     dc    808,802,796,791,785,779,774,768,762,757,752,746,741,736,730,725
  9006.     dc    720,715,709,704,699,694,689,684,678,675,670,665,660,655,651,646
  9007.     dc    640,636,632,628,623,619,614,610,604,601,597,592,588,584,580,575
  9008.     dc    570,567,563,559,555,551,547,543,538,535,532,528,524,520,516,513
  9009.     dc    508,505,502,498,494,491,487,484,480,477,474,470,467,463,460,457
  9010.  
  9011. xm_linFreq
  9012.     dc.l    535232,534749,534266,533784,533303,532822,532341,531861
  9013.     dc.l    531381,530902,530423,529944,529466,528988,528511,528034
  9014.     dc.l    527558,527082,526607,526131,525657,525183,524709,524236
  9015.     dc.l    523763,523290,522818,522346,521875,521404,520934,520464
  9016.     dc.l    519994,519525,519057,518588,518121,517653,517186,516720
  9017.     dc.l    516253,515788,515322,514858,514393,513929,513465,513002
  9018.     dc.l    512539,512077,511615,511154,510692,510232,509771,509312
  9019.     dc.l    508852,508393,507934,507476,507018,506561,506104,505647
  9020.     dc.l    505191,504735,504280,503825,503371,502917,502463,502010
  9021.     dc.l    501557,501104,500652,500201,499749,499298,498848,498398
  9022.     dc.l    497948,497499,497050,496602,496154,495706,495259,494812
  9023.     dc.l    494366,493920,493474,493029,492585,492140,491696,491253
  9024.     dc.l    490809,490367,489924,489482,489041,488600,488159,487718
  9025.     dc.l    487278,486839,486400,485961,485522,485084,484647,484210
  9026.     dc.l    483773,483336,482900,482465,482029,481595,481160,480726
  9027.     dc.l    480292,479859,479426,478994,478562,478130,477699,477268
  9028.     dc.l    476837,476407,475977,475548,475119,474690,474262,473834
  9029.     dc.l    473407,472979,472553,472126,471701,471275,470850,470425
  9030.     dc.l    470001,469577,469153,468730,468307,467884,467462,467041
  9031.     dc.l    466619,466198,465778,465358,464938,464518,464099,463681
  9032.     dc.l    463262,462844,462427,462010,461593,461177,460760,460345
  9033.     dc.l    459930,459515,459100,458686,458272,457859,457446,457033
  9034.     dc.l    456621,456209,455797,455386,454975,454565,454155,453745
  9035.     dc.l    453336,452927,452518,452110,451702,451294,450887,450481
  9036.     dc.l    450074,449668,449262,448857,448452,448048,447644,447240
  9037.     dc.l    446836,446433,446030,445628,445226,444824,444423,444022
  9038.     dc.l    443622,443221,442821,442422,442023,441624,441226,440828
  9039.     dc.l    440430,440033,439636,439239,438843,438447,438051,437656
  9040.     dc.l    437261,436867,436473,436079,435686,435293,434900,434508
  9041.     dc.l    434116,433724,433333,432942,432551,432161,431771,431382
  9042.     dc.l    430992,430604,430215,429827,429439,429052,428665,428278
  9043.     dc.l    427892,427506,427120,426735,426350,425965,425581,425197
  9044.     dc.l    424813,424430,424047,423665,423283,422901,422519,422138
  9045.     dc.l    421757,421377,420997,420617,420237,419858,419479,419101
  9046.     dc.l    418723,418345,417968,417591,417214,416838,416462,416086
  9047.     dc.l    415711,415336,414961,414586,414212,413839,413465,413092
  9048.     dc.l    412720,412347,411975,411604,411232,410862,410491,410121
  9049.     dc.l    409751,409381,409012,408643,408274,407906,407538,407170
  9050.     dc.l    406803,406436,406069,405703,405337,404971,404606,404241
  9051.     dc.l    403876,403512,403148,402784,402421,402058,401695,401333
  9052.     dc.l    400970,400609,400247,399886,399525,399165,398805,398445
  9053.     dc.l    398086,397727,397368,397009,396651,396293,395936,395579
  9054.     dc.l    395222,394865,394509,394153,393798,393442,393087,392733
  9055.     dc.l    392378,392024,391671,391317,390964,390612,390259,389907
  9056.     dc.l    389556,389204,388853,388502,388152,387802,387452,387102
  9057.     dc.l    386753,386404,386056,385707,385359,385012,384664,384317
  9058.     dc.l    383971,383624,383278,382932,382587,382242,381897,381552
  9059.     dc.l    381208,380864,380521,380177,379834,379492,379149,378807
  9060.     dc.l    378466,378124,377783,377442,377102,376762,376422,376082
  9061.     dc.l    375743,375404,375065,374727,374389,374051,373714,373377
  9062.     dc.l    373040,372703,372367,372031,371695,371360,371025,370690
  9063.     dc.l    370356,370022,369688,369355,369021,368688,368356,368023
  9064.     dc.l    367691,367360,367028,366697,366366,366036,365706,365376
  9065.     dc.l    365046,364717,364388,364059,363731,363403,363075,362747
  9066.     dc.l    362420,362093,361766,361440,361114,360788,360463,360137
  9067.     dc.l    359813,359488,359164,358840,358516,358193,357869,357547
  9068.     dc.l    357224,356902,356580,356258,355937,355616,355295,354974
  9069.     dc.l    354654,354334,354014,353695,353376,353057,352739,352420
  9070.     dc.l    352103,351785,351468,351150,350834,350517,350201,349885
  9071.     dc.l    349569,349254,348939,348624,348310,347995,347682,347368
  9072.     dc.l    347055,346741,346429,346116,345804,345492,345180,344869
  9073.     dc.l    344558,344247,343936,343626,343316,343006,342697,342388
  9074.     dc.l    342079,341770,341462,341154,340846,340539,340231,339924
  9075.     dc.l    339618,339311,339005,338700,338394,338089,337784,337479
  9076.     dc.l    337175,336870,336566,336263,335959,335656,335354,335051
  9077.     dc.l    334749,334447,334145,333844,333542,333242,332941,332641
  9078.     dc.l    332341,332041,331741,331442,331143,330844,330546,330247
  9079.     dc.l    329950,329652,329355,329057,328761,328464,328168,327872
  9080.     dc.l    327576,327280,326985,326690,326395,326101,325807,325513
  9081.     dc.l    325219,324926,324633,324340,324047,323755,323463,323171
  9082.     dc.l    322879,322588,322297,322006,321716,321426,321136,320846
  9083.     dc.l    320557,320267,319978,319690,319401,319113,318825,318538
  9084.     dc.l    318250,317963,317676,317390,317103,316817,316532,316246
  9085.     dc.l    315961,315676,315391,315106,314822,314538,314254,313971
  9086.     dc.l    313688,313405,313122,312839,312557,312275,311994,311712
  9087.     dc.l    311431,311150,310869,310589,310309,310029,309749,309470
  9088.     dc.l    309190,308911,308633,308354,308076,307798,307521,307243
  9089.     dc.l    306966,306689,306412,306136,305860,305584,305308,305033
  9090.     dc.l    304758,304483,304208,303934,303659,303385,303112,302838
  9091.     dc.l    302565,302292,302019,301747,301475,301203,300931,300660
  9092.     dc.l    300388,300117,299847,299576,299306,299036,298766,298497
  9093.     dc.l    298227,297958,297689,297421,297153,296884,296617,296349
  9094.     dc.l    296082,295815,295548,295281,295015,294749,294483,294217
  9095.     dc.l    293952,293686,293421,293157,292892,292628,292364,292100
  9096.     dc.l    291837,291574,291311,291048,290785,290523,290261,289999
  9097.     dc.l    289737,289476,289215,288954,288693,288433,288173,287913
  9098.     dc.l    287653,287393,287134,286875,286616,286358,286099,285841
  9099.     dc.l    285583,285326,285068,284811,284554,284298,284041,283785
  9100.     dc.l    283529,283273,283017,282762,282507,282252,281998,281743
  9101.     dc.l    281489,281235,280981,280728,280475,280222,279969,279716
  9102.     dc.l    279464,279212,278960,278708,278457,278206,277955,277704
  9103.     dc.l    277453,277203,276953,276703,276453,276204,275955,275706
  9104.     dc.l    275457,275209,274960,274712,274465,274217,273970,273722
  9105.     dc.l    273476,273229,272982,272736,272490,272244,271999,271753
  9106.     dc.l    271508,271263,271018,270774,270530,270286,270042,269798
  9107.     dc.l    269555,269312,269069,268826,268583,268341,268099,267857
  9108.  
  9109. xm_ct    dc    xm_arpeggio-xm_ct    ;0
  9110.     dc    xm_ret-xm_ct        ;1
  9111.     dc    xm_ret-xm_ct        ;2
  9112.     dc    xm_ret-xm_ct        ;3
  9113.     dc    xm_ret-xm_ct        ;4
  9114.      dc    xm_ret-xm_ct        ;5
  9115.     dc    xm_ret-xm_ct        ;6
  9116.     dc    xm_ret-xm_ct        ;7
  9117.     dc    xm_ret-xm_ct        ;8
  9118.     dc    xm_ret-xm_ct        ;9
  9119.     dc    xm_ret-xm_ct        ;A
  9120.      dc    xm_pjmp-xm_ct        ;B
  9121.      dc    xm_setvol-xm_ct        ;C
  9122.      dc    xm_pbrk-xm_ct        ;D
  9123.      dc    xm_ecmds-xm_ct        ;E
  9124.      dc    xm_spd-xm_ct        ;F
  9125.     dc    xm_sgvol-xm_ct        ;G
  9126.      dc    xm_ret-xm_ct        ;H
  9127.      dc    xm_ret-xm_ct        ;I
  9128.      dc    xm_ret-xm_ct        ;J
  9129.      dc    xm_keyoff-xm_ct        ;K
  9130.      dc    xm_setenvpos-xm_ct    ;L
  9131.      dc    xm_ret-xm_ct        ;M
  9132.      dc    xm_ret-xm_ct        ;N
  9133.      dc    xm_ret-xm_ct        ;O
  9134.      dc    xm_ret-xm_ct        ;P
  9135.      dc    xm_ret-xm_ct        ;Q
  9136.      dc    xm_srretrig-xm_ct    ;R
  9137.      dc    xm_ret-xm_ct        ;S
  9138.      dc    xm_tremor-xm_ct        ;T
  9139.      dc    xm_ret-xm_ct        ;U
  9140.      dc    xm_ret-xm_ct        ;V
  9141.      dc    xm_ret-xm_ct        ;W
  9142.      dc    xm_xfinesld-xm_ct    ;X
  9143.      dc    xm_ret-xm_ct        ;Y
  9144.      dc    xm_ret-xm_ct        ;Z
  9145.  
  9146. xm_cct    dc    xm_arpeggio-xm_cct    ;0
  9147.     dc    xm_slideup-xm_cct    ;1
  9148.     dc    xm_slidedwn-xm_cct    ;2
  9149.     dc    xm_tonep-xm_cct        ;3
  9150.     dc    xm_vibrato-xm_cct    ;4
  9151.     dc    xm_tpvsl-xm_cct        ;5
  9152.     dc    xm_vibvsl-xm_cct    ;6
  9153.     dc    xm_tremolo-xm_cct    ;7
  9154.     dc    xm_ret-xm_cct        ;8
  9155.     dc    xm_ret-xm_cct        ;9
  9156.     dc    xm_vslide-xm_cct    ;A
  9157.      dc    xm_ret-xm_cct        ;B
  9158.      dc    xm_ret-xm_cct        ;C
  9159.      dc    xm_ret-xm_cct        ;D
  9160.      dc    xm_cecmds-xm_cct    ;E
  9161.      dc    xm_ret-xm_cct        ;F
  9162.      dc    xm_ret-xm_cct        ;G
  9163.     dc    xm_gvslide-xm_cct    ;H
  9164.      dc    xm_ret-xm_cct        ;I
  9165.      dc    xm_ret-xm_cct        ;J
  9166.      dc    xm_ret-xm_cct        ;K
  9167.      dc    xm_ret-xm_cct        ;L
  9168.      dc    xm_ret-xm_cct        ;M
  9169.      dc    xm_ret-xm_cct        ;N
  9170.      dc    xm_ret-xm_cct        ;O
  9171.      dc    xm_ret-xm_cct        ;P
  9172.      dc    xm_ret-xm_cct        ;Q
  9173.      dc    xm_rretrig-xm_cct    ;R
  9174.      dc    xm_ret-xm_cct        ;S
  9175.      dc    xm_tremor-xm_cct    ;T
  9176.      dc    xm_ret-xm_cct        ;U
  9177.      dc    xm_ret-xm_cct        ;V
  9178.      dc    xm_ret-xm_cct        ;W
  9179.      dc    xm_ret-xm_cct        ;X
  9180.      dc    xm_ret-xm_cct        ;Y
  9181.      dc    xm_ret-xm_cct        ;Z
  9182.  
  9183. xm_ect    dc    xm_ret-xm_ect        ;0
  9184.     dc    xm_slideup-xm_ect    ;1
  9185.     dc    xm_slidedwn-xm_ect    ;2
  9186.     dc    xm_ret-xm_ect        ;3
  9187.     dc    xm_ret-xm_ect        ;4
  9188.     dc    xm_ret-xm_ect        ;5
  9189.     dc    xm_pattloop-xm_ect    ;6
  9190.     dc    xm_ret-xm_ect        ;7
  9191.     dc    xm_ret-xm_ect        ;8
  9192.     dc    xm_sretrig-xm_ect    ;9
  9193.     dc    xm_vslideup-xm_ect    ;A
  9194.      dc    xm_vslidedown2-xm_ect    ;B
  9195.      dc    xm_ncut-xm_ect        ;C
  9196.      dc    xm_ret-xm_ect        ;D
  9197.      dc    xm_pdelay-xm_ect    ;E
  9198.      dc    xm_ret-xm_ect        ;F
  9199.  
  9200. xm_cect    dc    xm_ret-xm_cect        ;0
  9201.     dc    xm_ret-xm_cect        ;1
  9202.     dc    xm_ret-xm_cect        ;2
  9203.     dc    xm_ret-xm_cect        ;3
  9204.     dc    xm_ret-xm_cect        ;4
  9205.     dc    xm_ret-xm_cect        ;5
  9206.     dc    xm_ret-xm_cect        ;6
  9207.     dc    xm_ret-xm_cect        ;7
  9208.     dc    xm_ret-xm_cect        ;8
  9209.     dc    xm_retrig-xm_cect    ;9
  9210.     dc    xm_ret-xm_cect        ;A
  9211.      dc    xm_ret-xm_cect        ;B
  9212.      dc    xm_ncut-xm_cect        ;C
  9213.      dc    xm_ndelay-xm_cect    ;D
  9214.      dc    xm_ret-xm_cect        ;E
  9215.      dc    xm_ret-xm_cect        ;F
  9216.  
  9217. xm_vct    dc    xm_ret-xm_vct        ;6
  9218.     dc    xm_ret-xm_vct        ;7
  9219.     dc    xm_vslidedown2-xm_vct    ;8
  9220.     dc    xm_vslideup-xm_vct    ;9
  9221.     dc    xm_svibspd-xm_vct    ;A
  9222.      dc    xm_ret-xm_vct        ;B
  9223.      dc    xm_ret-xm_vct        ;C
  9224.      dc    xm_ret-xm_vct        ;D
  9225.      dc    xm_ret-xm_vct        ;E
  9226.      dc    xm_ret-xm_vct        ;F
  9227.  
  9228. xm_cvct    dc    xm_vslidedown2-xm_cvct    ;6
  9229.     dc    xm_vslideup-xm_cvct    ;7
  9230.     dc    xm_ret-xm_cvct        ;8
  9231.     dc    xm_ret-xm_cvct        ;9
  9232.     dc    xm_ret-xm_cvct        ;A
  9233.      dc    xm_vibrato-xm_cvct    ;B
  9234.      dc    xm_ret-xm_cvct        ;C
  9235.      dc    xm_ret-xm_cvct        ;D
  9236.      dc    xm_ret-xm_cvct        ;E
  9237.      dc    xm_tonep-xm_cvct    ;F
  9238.  
  9239.  
  9240.    *************************
  9241.    *   Standard effects:   *
  9242.    *************************
  9243.  
  9244. ;!      0      Arpeggio
  9245. ;!      1  (*) Porta up
  9246. ;!      2  (*) Porta down
  9247. ;!      3  (*) Tone porta
  9248. ;-      4  (*) Vibrato
  9249. ;!      5  (*) Tone porta+Volume slide
  9250. ;-      6  (*) Vibrato+Volume slide
  9251. ;-      7  (*) Tremolo
  9252. ;*      8      Set panning
  9253. ;!      9      Sample offset
  9254. ;!      A  (*) Volume slide
  9255. ;!      B      Position jump
  9256. ;!      C      Set volume
  9257. ;!      D      Pattern break
  9258. ;!      E1 (*) Fine porta up
  9259. ;!      E2 (*) Fine porta down
  9260. ;-      E3     Set gliss control
  9261. ;-      E4     Set vibrato control
  9262. ;-      E5     Set finetune
  9263. ;-      E6     Set loop begin/loop
  9264. ;-      E7     Set tremolo control
  9265. ;!      E9     Retrig note
  9266. ;!      EA (*) Fine volume slide up
  9267. ;!      EB (*) Fine volume slide down
  9268. ;!      EC     Note cut
  9269. ;!      ED     Note delay
  9270. ;-      EE     Pattern delay
  9271. ;!      F      Set tempo/BPM
  9272. ;!      G      Set global volume
  9273. ;!      H  (*) Global volume slide
  9274. ;!         K      Key off
  9275. ;!      L      Set envelope position
  9276. ;*      P  (*) Panning slide
  9277. ;!      R  (*) Multi retrig note
  9278. ;-      T      Tremor
  9279. ;-      X1 (*) Extra fine porta up
  9280. ;-      X2 (*) Extra fine porta down
  9281. ;
  9282. ;      (*) = If the command byte is zero, the last nonzero byte for the
  9283. ;            command should be used.
  9284. ;
  9285. ;   *********************************
  9286. ;   *   Effects in volume column:   *
  9287. ;   *********************************
  9288. ;
  9289. ;   All effects in the volume column should work as the standard effects.
  9290. ;   The volume column is interpreted before the standard effects, so
  9291. ;   some standard effects may override volume column effects.
  9292. ;
  9293. ;   Value      Meaning
  9294. ;
  9295. ;      0       Do nothing
  9296. ;    $10-$50   Set volume Value-$10
  9297. ;      :          :        :
  9298. ;      :          :        :
  9299. ;!    $60-$6f   Volume slide down
  9300. ;!    $70-$7f   Volume slide up
  9301. ;!    $80-$8f   Fine volume slide down
  9302. ;!    $90-$9f   Fine volume slide up
  9303. ;-    $a0-$af   Set vibrato speed
  9304. ;-    $b0-$bf   Vibrato
  9305. ;*    $c0-$cf   Set panning
  9306. ;*    $d0-$df   Panning slide left
  9307. ;*    $e0-$ef   Panning slide right
  9308. ;!    $f0-$ff   Tone porta
  9309.  
  9310. ********** Protracker (Fasttracker player) **************
  9311.  
  9312. n_note        equ    0
  9313. n_cmd        equ    2
  9314. n_cmdlo        equ    3
  9315. n_start        equ    4
  9316. n_length    equ    8
  9317. n_loopstart    equ    10
  9318. n_replen    equ    14
  9319. n_period    equ    16
  9320. n_finetune    equ    18
  9321. n_volume    equ    19
  9322. n_dmabit    equ    20
  9323. n_toneportdirec    equ    22
  9324. n_toneportspeed    equ    23
  9325. n_wantedperiod    equ    24
  9326. n_vibratocmd    equ    26
  9327. n_vibratopos    equ    27
  9328. n_tremolocmd    equ    28
  9329. n_tremolopos    equ    29
  9330. n_wavecontrol    equ    30
  9331. n_glissfunk    equ    31
  9332. n_sampleoffset    equ    32
  9333. n_pattpos    equ    33
  9334. n_loopcount    equ    34
  9335. n_funkoffset    equ    35
  9336. n_wavestart    equ    36
  9337. n_reallength    equ    40
  9338.  
  9339. mtm_init
  9340.     move.l    s3m(a5),a0
  9341.     move.l    a0,mt_songdataptr
  9342.     lea    4(a0),a1
  9343.     move.l    a1,mname(a5)
  9344.  
  9345.     move.l    #mtm_periodtable,peris
  9346.     move    #1616,lowlim
  9347.     move    #45,upplim
  9348.     move    #126,octs
  9349.  
  9350.     moveq    #0,d0
  9351.     move.b    27(a0),d0
  9352.     addq.b    #1,d0
  9353.     move.b    d0,slene
  9354.     move    d0,positioneita(a5)
  9355.  
  9356.     moveq    #0,d1
  9357.     move.b    33(a0),d1
  9358.     move    d1,numchans(a5)
  9359.  
  9360.     moveq    #0,d0
  9361.     move.b    32(a0),d0
  9362.     lsl    #2,d0
  9363.     mulu    d1,d0
  9364.     move    d0,patlen
  9365.  
  9366.     move.l    a0,d0
  9367.     add.l    #66,d0
  9368.  
  9369.     moveq    #0,d1
  9370.     move.b    30(a0),d1            ; NOS
  9371.     mulu    #37,d1
  9372.     add.l    d1,d0
  9373.  
  9374.     move.l    d0,orderz
  9375.     add.l    #128,d0
  9376.     move.l    d0,tracks
  9377.  
  9378.     move    24(a0),d1            ; number of tracks
  9379.     iword    d1
  9380.     mulu    #192,d1
  9381.     add.l    d1,d0
  9382.  
  9383.     move.l    d0,sequ
  9384.  
  9385.     moveq    #0,d1
  9386.     move.b    26(a0),d1            ; last pattern saved
  9387.     addq    #1,d1
  9388.     lsl    #6,d1
  9389.     add.l    d1,d0
  9390.  
  9391.     moveq    #0,d1
  9392.     move    28(a0),d1            ; length of comment field
  9393.     iword    d1
  9394.     add.l    d1,d0
  9395.  
  9396.     lea    66(a0),a2            ; sample infos
  9397.  
  9398.     moveq    #0,d7
  9399.     move.b    30(a0),d7            ; NOS
  9400.     subq    #1,d7
  9401.  
  9402.     lea    mt_sampleinfos(pc),a1
  9403. .loop    move.l    d0,(a1)+
  9404.     lea    22(a2),a3
  9405.     tlword    (a3)+,d1
  9406.     add.l    d1,d0
  9407.     lsr.l    #1,d1
  9408.     move    d1,(a1)+
  9409.  
  9410.     lea    26(a2),a3
  9411.     tlword    (a3)+,d1
  9412.     lsr.l    #1,d1
  9413.     move    d1,(a1)+            ; rep offset
  9414.  
  9415.     lea    30(a2),a3
  9416.     tlword    (a3)+,d2
  9417.     lsr.l    #1,d2
  9418.     sub.l    d1,d2    
  9419.     move    d2,(a1)+            ; rep length
  9420.  
  9421.     clr.b    (a1)+                ; no finetune
  9422.     move.b    35(a2),(a1)+            ; volume
  9423.  
  9424.     lea    37(a2),a2
  9425.     dbf    d7,.loop
  9426.  
  9427.     or.b    #2,$bfe001
  9428.     move.b    #6,mt_speed
  9429.     clr.b    mt_counter
  9430.     clr.b    mt_songpos
  9431.     clr    mt_patternpos
  9432.  
  9433.     move    #2,fformat            ; unsigned data
  9434.     move    #125,tempo
  9435.     move.l    #14317056/4,clock        ; Clock constant
  9436.  
  9437.     lea    34(a0),a2
  9438.     lea    pantab(a5),a0
  9439.     move.l    a0,a1
  9440.     moveq    #7,d0
  9441. .ll    clr.l    (a1)+
  9442.     dbf    d0,.ll
  9443.  
  9444.     move    numchans(a5),d0
  9445.     subq    #1,d0
  9446.     moveq    #0,d5
  9447.     moveq    #0,d6
  9448. .lop    move.b    (a2)+,d1
  9449.     cmp.b    #8,d1
  9450.     blo.b    .vas
  9451.     move.b    #-1,(a0)+
  9452.     addq    #1,d5
  9453.     bra.b    .je
  9454. .vas    move.b    #1,(a0)+
  9455.     addq    #1,d6
  9456. .je    dbf    d0,.lop
  9457.  
  9458.     cmp    d5,d6
  9459.     bls.b    .k
  9460.     move    d6,d5
  9461. .k    move    d5,maxchan(a5)
  9462.  
  9463.     lea    mt_chan1temp(pc),a0
  9464.     move    #44*8-1,d0
  9465. .cl    clr.l    (a0)+
  9466.     dbf    d0,.cl
  9467.  
  9468.     moveq    #0,d0
  9469.     rts
  9470.  
  9471. orderz    dc.l    0
  9472. tracks    dc.l    0
  9473. sequ    dc.l    0
  9474. slene    dc    0
  9475. patlen    dc    0
  9476. upplim    dc    0
  9477. lowlim    dc    0
  9478. peris    dc.l    0
  9479. octs    dc    0
  9480.  
  9481. mt_init    lea    data,a5
  9482.     move.l    s3m(a5),a0
  9483.     move.l    a0,mname
  9484.     move.l    a0,mt_songdataptr
  9485.     move.l    a0,a1
  9486.     moveq    #0,d0
  9487.     move.b    950(a1),d0
  9488.     move.b    d0,slene
  9489.     move    d0,positioneita
  9490.  
  9491.     move    #256,d0
  9492.     mulu    numchans(a5),d0
  9493.     move    d0,patlen
  9494.  
  9495.     move    #113,upplim
  9496.     move    #856,lowlim
  9497.     move.l    #mt_periodtable,peris
  9498.     move    #36*2,octs
  9499.  
  9500.     lea    952(a1),a1
  9501.     moveq    #127,d0
  9502.     moveq    #0,d1
  9503. mtloop    move.l    d1,d2
  9504.     subq    #1,d0
  9505. mtloop2    move.b    (a1)+,d1
  9506.     cmp.b    d2,d1
  9507.     bgt.b    mtloop
  9508.     dbra    d0,mtloop2
  9509.     addq.b    #1,d2
  9510.             
  9511.     lea    mt_sampleinfos(pc),a1
  9512.     asl    #8,d2
  9513.     mulu    numchans(a5),d2
  9514.  
  9515.     add.l    #1084,d2
  9516.     add.l    a0,d2
  9517.     move.l    d2,a2
  9518.     moveq    #30,d0
  9519. mtloop3    move.l    a2,(a1)+
  9520.     moveq    #0,d1
  9521.     move    42(a0),d1
  9522.     move    d1,(a1)+
  9523.     asl.l    #1,d1
  9524.     add.l    d1,a2
  9525.  
  9526.     move    46(a0),(a1)+
  9527.     move    48(a0),(a1)+
  9528.     move    44(a0),(a1)+            ; finetune and volume
  9529.  
  9530.     add.l    #30,a0
  9531.     dbra    d0,mtloop3
  9532.  
  9533.     or.b    #2,$bfe001
  9534.     move.b    #6,mt_speed
  9535.     clr.b    mt_counter
  9536.     clr.b    mt_songpos
  9537.     clr    mt_patternpos
  9538.  
  9539.     move    #1,fformat
  9540.     move    #125,tempo
  9541.     move.l    #14187580/4,clock        ; Clock constant
  9542.  
  9543.     lea    pantab(a5),a0
  9544.     move.l    a0,a1
  9545.     moveq    #7,d0
  9546. .ll    clr.l    (a1)+
  9547.     dbf    d0,.ll
  9548.  
  9549.     move    numchans(a5),d0
  9550.     subq    #1,d0
  9551.     moveq    #0,d1
  9552. .lop    tst    d1
  9553.     beq.b    .vas
  9554.     cmp    #3,d1
  9555.     beq.b    .vas
  9556. .oik    move.b    #-1,(a0)+
  9557.     bra.b    .je
  9558. .vas    move.b    #1,(a0)+
  9559. .je    addq    #1,d1
  9560.     and    #3,d1
  9561.     dbf    d0,.lop
  9562.  
  9563.     lea    mt_chan1temp(pc),a0
  9564.     move    #44*8-1,d0
  9565. .cl    clr.l    (a0)+
  9566.     dbf    d0,.cl
  9567.  
  9568.     moveq    #0,d0
  9569.     rts
  9570.  
  9571.     endb    a5
  9572. mt_music
  9573.     movem.l    d0-d4/a0-a6,-(sp)
  9574.     addq.b    #1,mt_counter
  9575.     move.b    mt_counter(pc),d0
  9576.     cmp.b    mt_speed(pc),d0
  9577.     blo.b    mt_nonewnote
  9578.     clr.b    mt_counter
  9579.     tst.b    mt_pattdeltime2
  9580.     beq.b    mt_getnewnote
  9581.     bsr.b    mt_nonewallchannels
  9582.     bra    mt_dskip
  9583.  
  9584. mt_nonewnote
  9585.     bsr.b    mt_nonewallchannels
  9586.     bra    mt_nonewposyet
  9587.  
  9588. mt_nonewallchannels
  9589.     move    numchans,d7
  9590.     subq    #1,d7
  9591.     lea    cha0,a5
  9592.     lea    mt_chan1temp(pc),a6
  9593. .loo    move    d7,-(sp)
  9594.     bsr    mt_checkefx
  9595.     move    (sp)+,d7
  9596.     lea    mChanBlock_SIZE(a5),a5
  9597.     lea    44(a6),a6            ; Size of MT_chanxtemp
  9598.     dbf    d7,.loo
  9599.     rts
  9600.  
  9601. mt_getnewnote
  9602.     move.l    mt_songdataptr(pc),a0
  9603.     lea    12(a0),a3
  9604.     lea    952(a0),a2    ;pattpo
  9605.     lea    1084(a0),a0    ;patterndata
  9606.     moveq    #0,d0
  9607.     moveq    #0,d1
  9608.     move.b    mt_songpos(pc),d0
  9609.     move.b    (a2,d0),d1
  9610.     asl.l    #8,d1
  9611.     mulu    numchans,d1
  9612.     add    mt_patternpos(pc),d1
  9613.     clr    mt_dmacontemp
  9614.  
  9615.     cmp    #mtMTM,mtype
  9616.     bne.b    .ei
  9617.     moveq    #0,d1
  9618. .ei
  9619.     move    numchans,d7
  9620.     subq    #1,d7
  9621.     lea    cha0,a5
  9622.     lea    mt_chan1temp(pc),a6
  9623. .loo    move    d7,-(sp)
  9624.  
  9625.     tst.l    (a6)
  9626.     bne.b    .mt_plvskip
  9627.     bsr    mt_pernop
  9628. .mt_plvskip
  9629.     bsr.b    getnew
  9630.  
  9631.     bsr    mt_playvoice
  9632.     move    (sp)+,d7
  9633.     lea    mChanBlock_SIZE(a5),a5
  9634.     lea    44(a6),a6            ; Size of MT_chanxtemp
  9635.     dbf    d7,.loo
  9636.  
  9637.     bra    mt_setdma
  9638.  
  9639. getnew    cmp    #mtMOD,mtype
  9640.     bne.b    .mtm
  9641.     move.l    (a0,d1.l),(a6)
  9642.     addq.l    #4,d1
  9643.     rts
  9644.  
  9645. .mtm    move.l    mt_songdataptr(pc),a0
  9646.     move.l    orderz(pc),a2
  9647.     moveq    #0,d0
  9648.     move.b    mt_songpos(pc),d0
  9649.     move.b    (a2,d0),d0
  9650.  
  9651.     lsl    #6,d0                ; 32 channels * word
  9652.     move.l    sequ(pc),a2
  9653.     add    d1,d0
  9654.     move.b    (a2,d0),d2
  9655.     lsl    #8,d2
  9656.     move.b    1(a2,d0),d2
  9657.     move    d2,d0
  9658.     beq.b    .zero
  9659.     iword    d0
  9660.     move.l    tracks(pc),a2
  9661.     subq    #1,d0
  9662.     mulu    #192,d0
  9663.  
  9664.     moveq    #0,d2
  9665.     move    mt_patternpos(pc),d2
  9666.     divu    numchans,d2
  9667.     lsr    #2,d2
  9668.     mulu    #3,d2
  9669.     add.l    d2,d0
  9670.  
  9671.     moveq    #0,d2
  9672.     move.b    (a2,d0.l),d2
  9673.     lsr    #2,d2
  9674.     beq.b    .huu
  9675.     move.l    peris(pc),a1
  9676.     subq    #1,d2
  9677.     add    d2,d2
  9678.     move    (a1,d2),d2
  9679.  
  9680. .huu    clr.l    (a6)
  9681.     or    d2,(a6)
  9682.  
  9683.     moveq    #0,d2
  9684.     move.b    (a2,d0.l),d2
  9685.     lsl    #8,d2
  9686.     move.b    1(a2,d0.l),d2
  9687.     and    #$3f0,d2
  9688.     lsr    #4,d2
  9689.     move.b    d2,d3
  9690.     and    #$10,d3
  9691.     or.b    d3,(a6)
  9692.     lsl.b    #4,d2
  9693.     or.b    d2,2(a6)
  9694.  
  9695.     moveq    #0,d2
  9696.     move.b    1(a2,d0.l),d2
  9697.     lsl    #8,d2
  9698.     move.b    2(a2,d0.l),d2
  9699.     and    #$fff,d2
  9700.     or    d2,2(a6)
  9701.  
  9702.     addq.l    #2,d1
  9703.     rts
  9704.  
  9705. .zero    clr.l    (a6)
  9706.     addq.l    #2,d1
  9707.     rts
  9708.  
  9709. mt_playvoice
  9710.     moveq    #0,d2
  9711.     move.b    n_cmd(a6),d2
  9712.     and.b    #$f0,d2
  9713.     lsr.b    #4,d2
  9714.     move.b    (a6),d0
  9715.     and.b    #$f0,d0
  9716.     or.b    d0,d2
  9717.     tst.b    d2
  9718.     beq    mt_setregs
  9719.     moveq    #0,d3
  9720.     lea    mt_sampleinfos(pc),a1
  9721.     move    d2,d4
  9722.     subq    #1,d4
  9723.     mulu    #12,d4
  9724.     move.l    (a1,d4.l),n_start(a6)
  9725.     move    4(a1,d4.l),n_length(a6)
  9726.     move    4(a1,d4.l),n_reallength(a6)
  9727.     move.b    10(a1,d4.l),n_finetune(a6)
  9728.     move.b    11(a1,d4.l),n_volume(a6)
  9729.     move    6(a1,d4.l),d3 ; get repeat
  9730.     tst    d3
  9731.     beq.b    mt_noloop
  9732.     tst    8(a1,d4.l)
  9733.     beq.b    mt_noloop
  9734.     move.l    n_start(a6),d2    ; get start
  9735.     asl    #1,d3
  9736.     add.l    d3,d2        ; add repeat
  9737.     move.l    d2,n_loopstart(a6)
  9738.     move.l    d2,n_wavestart(a6)
  9739.     move    6(a1,d4.l),d0    ; get repeat
  9740.     add    8(a1,d4.l),d0    ; add replen
  9741.     move    d0,n_length(a6)
  9742.     move    8(a1,d4.l),n_replen(a6)    ; save replen
  9743.     moveq    #0,d0
  9744.     move.b    n_volume(a6),d0
  9745.     move    d0,mVolume(a5)    ; set volume
  9746.     bra.b    mt_setregs
  9747.  
  9748. mt_noloop
  9749.     move.l    n_start(a6),d2
  9750.     move.l    d2,n_loopstart(a6)
  9751.     move.l    d2,n_wavestart(a6)
  9752.     move    8(a1,d4.l),n_replen(a6)    ; save replen
  9753.     moveq    #0,d0
  9754.     move.b    n_volume(a6),d0
  9755.     move    d0,mVolume(a5)    ; set volume
  9756. mt_setregs
  9757.     move    (a6),d0
  9758.     and    #$fff,d0
  9759.     beq    mt_checkmoreefx    ; if no note
  9760.     move    2(a6),d0
  9761.     and    #$ff0,d0
  9762.     cmp    #$e50,d0
  9763.     beq.b    mt_dosetfinetune
  9764.     move.b    2(a6),d0
  9765.     and.b    #$f,d0
  9766.     cmp.b    #3,d0    ; toneportamento
  9767.     beq.b    mt_chktoneporta
  9768.     cmp.b    #5,d0
  9769.     beq.b    mt_chktoneporta
  9770.     cmp.b    #9,d0    ; sample offset
  9771.     bne.b    mt_setperiod
  9772.     bsr    mt_checkmoreefx
  9773.     bra.b    mt_setperiod
  9774.  
  9775. mt_dosetfinetune
  9776.     bsr    mt_setfinetune
  9777.     bra.b    mt_setperiod
  9778.  
  9779. mt_chktoneporta
  9780.     bsr    mt_settoneporta
  9781.     bra    mt_checkmoreefx
  9782.  
  9783. mt_setperiod
  9784.     movem.l    d0-d1/a0-a1,-(sp)
  9785.     move    (a6),d1
  9786.     and    #$fff,d1
  9787.     move.l    peris(pc),a1
  9788.     moveq    #0,d0
  9789.     move    octs(pc),d7
  9790.     lsr    #1,d7
  9791. mt_ftuloop
  9792.     cmp    (a1,d0),d1
  9793.     bhs.b    mt_ftufound
  9794.     addq.l    #2,d0
  9795.     dbra    d7,mt_ftuloop
  9796. mt_ftufound
  9797.     moveq    #0,d1
  9798.     move.b    n_finetune(a6),d1
  9799.     mulu    octs(pc),d1
  9800.     add.l    d1,a1
  9801.     move    (a1,d0),n_period(a6)
  9802.     movem.l    (sp)+,d0-d1/a0-a1
  9803.  
  9804.     move    2(a6),d0
  9805.     and    #$ff0,d0
  9806.     cmp    #$ed0,d0 ; notedelay
  9807.     beq    mt_checkmoreefx
  9808.  
  9809.     btst    #2,n_wavecontrol(a6)
  9810.     bne.b    mt_vibnoc
  9811.     clr.b    n_vibratopos(a6)
  9812. mt_vibnoc
  9813.     btst    #6,n_wavecontrol(a6)
  9814.     bne.b    mt_trenoc
  9815.     clr.b    n_tremolopos(a6)
  9816. mt_trenoc
  9817.     move.l    n_start(a6),(a5)    ; set start
  9818.     moveq    #0,d0
  9819.     move    n_length(a6),d0
  9820.     add.l    d0,d0
  9821.     move.l    d0,mLength(a5)        ; set length
  9822.     move    n_period(a6),d0
  9823.     lsl    #2,d0
  9824.     move    d0,mPeriod(a5)        ; set period
  9825.  
  9826.     clr.b    mOnOff(a5)        ; turn on
  9827.     clr.l    mFPos(a5)        ; retrig
  9828.     bra    mt_checkmoreefx
  9829.  
  9830.  
  9831. mt_setdma
  9832.     move    numchans,d7
  9833.     subq    #1,d7
  9834.     lea    cha0,a5
  9835.     lea    mt_chan1temp(pc),a6
  9836. .loo    move    d7,-(sp)
  9837.     bsr    setreg
  9838.     move    (sp)+,d7
  9839.     lea    mChanBlock_SIZE(a5),a5
  9840.     lea    44(a6),a6            ; Size of MT_chanxtemp
  9841.     dbf    d7,.loo
  9842.  
  9843. mt_dskip
  9844.     moveq    #4,d0
  9845.     mulu    numchans,d0
  9846.     add    d0,mt_patternpos
  9847.     move.b    mt_pattdeltime,d0
  9848.     beq.b    mt_dskc
  9849.     move.b    d0,mt_pattdeltime2
  9850.     clr.b    mt_pattdeltime
  9851. mt_dskc    tst.b    mt_pattdeltime2
  9852.     beq.b    mt_dska
  9853.     subq.b    #1,mt_pattdeltime2
  9854.     beq.b    mt_dska
  9855.  
  9856.     moveq    #4,d0
  9857.     mulu    numchans,d0
  9858.     sub    d0,mt_patternpos
  9859.  
  9860. mt_dska    tst.b    mt_pbreakflag
  9861.     beq.b    mt_nnpysk
  9862.     sf    mt_pbreakflag
  9863.     moveq    #0,d0
  9864.     move.b    mt_pbreakpos(pc),d0
  9865.     clr.b    mt_pbreakpos
  9866.     lsl    #2,d0
  9867.     mulu    numchans,d0    
  9868.     move    d0,mt_patternpos
  9869. mt_nnpysk
  9870.     move    patlen(pc),d0
  9871.     cmp    mt_patternpos(pc),d0
  9872.     bhi.b    mt_nonewposyet
  9873. mt_nextposition    
  9874.     moveq    #0,d0
  9875.     move.b    mt_pbreakpos(pc),d0
  9876.     lsl    #2,d0
  9877.     mulu    numchans,d0
  9878.     move    d0,mt_patternpos
  9879.     clr.b    mt_pbreakpos
  9880.     clr.b    mt_posjumpflag
  9881.     addq.b    #1,mt_songpos
  9882.     and.b    #$7f,mt_songpos
  9883.  
  9884.     moveq    #0,d1
  9885.     move.b    mt_songpos(pc),d1
  9886.     st    PS3M_poscha
  9887.     move    d1,PS3M_position
  9888.  
  9889.     cmp.b    slene(pc),d1
  9890.     blo.b    mt_nonewposyet
  9891.     clr.b    mt_songpos
  9892.     st    PS3M_break
  9893. mt_nonewposyet    
  9894.     tst.b    mt_posjumpflag
  9895.     bne.b    mt_nextposition
  9896.     movem.l    (sp)+,d0-d4/a0-a6
  9897.     rts
  9898.  
  9899.  
  9900. setreg    move.l    n_loopstart(a6),mLStart(a5)
  9901.     moveq    #0,d0
  9902.     move    n_replen(a6),d0
  9903.     add.l    d0,d0
  9904.     move.l    d0,mLLength(a5)
  9905.     cmp.l    #2,mLLength(a5)
  9906.     bls.b    .eloo
  9907.     st    mLoop(a5)
  9908.     tst.b    mOnOff(a5)
  9909.     beq.b    .ok
  9910.     clr.b    mOnOff(a5)
  9911.     clr.l    mFPos(a5)
  9912. .ok    rts
  9913. .eloo    clr.b    mLoop(a5)
  9914.     rts
  9915.  
  9916.  
  9917. mt_checkefx
  9918.     bsr    mt_updatefunk
  9919.     move    n_cmd(a6),d0
  9920.     and    #$fff,d0
  9921.     beq.b    mt_pernop
  9922.     move.b    n_cmd(a6),d0
  9923.     and.b    #$f,d0
  9924.     beq.b    mt_arpeggio
  9925.     cmp.b    #1,d0
  9926.     beq    mt_portaup
  9927.     cmp.b    #2,d0
  9928.     beq    mt_portadown
  9929.     cmp.b    #3,d0
  9930.     beq    mt_toneportamento
  9931.     cmp.b    #4,d0
  9932.     beq    mt_vibrato
  9933.     cmp.b    #5,d0
  9934.     beq    mt_toneplusvolslide
  9935.     cmp.b    #6,d0
  9936.     beq    mt_vibratoplusvolslide
  9937.     cmp.b    #$e,d0
  9938.     beq    mt_e_commands
  9939. setback    move    n_period(a6),d2
  9940.     lsl    #2,d2
  9941.     move    d2,mPeriod(a5)
  9942.     cmp.b    #7,d0
  9943.     beq    mt_tremolo
  9944.     cmp.b    #$a,d0
  9945.     beq    mt_volumeslide
  9946. mt_return2
  9947.     rts
  9948.  
  9949. mt_pernop
  9950.     move    n_period(a6),d2
  9951.     lsl    #2,d2
  9952.     move    d2,mPeriod(a5)
  9953.     rts
  9954.  
  9955. mt_arpeggio
  9956.     moveq    #0,d0
  9957.     move.b    mt_counter(pc),d0
  9958.     divs    #3,d0
  9959.     swap    d0
  9960.     cmp    #0,d0
  9961.     beq.b    mt_arpeggio2
  9962.     cmp    #2,d0
  9963.     beq.b    mt_arpeggio1
  9964.     moveq    #0,d0
  9965.     move.b    n_cmdlo(a6),d0
  9966.     lsr.b    #4,d0
  9967.     bra.b    mt_arpeggio3
  9968.  
  9969. mt_arpeggio1
  9970.     moveq    #0,d0
  9971.     move.b    n_cmdlo(a6),d0
  9972.     and.b    #15,d0
  9973.     bra.b    mt_arpeggio3
  9974.  
  9975. mt_arpeggio2
  9976.     move    n_period(a6),d2
  9977.     bra.b    mt_arpeggio4
  9978.  
  9979. mt_arpeggio3
  9980.     asl    #1,d0
  9981.     moveq    #0,d1
  9982.     move.b    n_finetune(a6),d1
  9983.     mulu    octs(pc),d1
  9984.     move.l    peris(pc),a0
  9985.     add.l    d1,a0
  9986.     moveq    #0,d1
  9987.     move    n_period(a6),d1
  9988.     move    octs(pc),d7
  9989.     lsr    #1,d7
  9990.     subq    #1,d7
  9991. mt_arploop
  9992.     move    (a0,d0),d2
  9993.     cmp    (a0),d1
  9994.     bhs.b    mt_arpeggio4
  9995.     addq.l    #2,a0
  9996.     dbra    d7,mt_arploop
  9997.     rts
  9998.  
  9999. mt_arpeggio4
  10000.     lsl    #2,d2
  10001.     move    d2,mPeriod(a5)
  10002.     rts
  10003.  
  10004. mt_fineportaup
  10005.     tst.b    mt_counter
  10006.     bne    mt_return2
  10007.     move.b    #$f,mt_lowmask
  10008. mt_portaup
  10009.     moveq    #0,d0
  10010.     move.b    n_cmdlo(a6),d0
  10011.     and.b    mt_lowmask(pc),d0
  10012.     move.b    #$ff,mt_lowmask
  10013.     sub    d0,n_period(a6)
  10014.     move    n_period(a6),d0
  10015.     and    #$fff,d0
  10016.     cmp    upplim(pc),d0
  10017.     bpl.b    mt_portauskip
  10018.     and    #$f000,n_period(a6)
  10019.     move    upplim(pc),d0
  10020.     or    d0,n_period(a6)
  10021. mt_portauskip
  10022.     move    n_period(a6),d0
  10023.     and    #$fff,d0
  10024.     lsl    #2,d0
  10025.     move    d0,mPeriod(a5)
  10026.     rts    
  10027.  
  10028. mt_fineportadown
  10029.     tst.b    mt_counter
  10030.     bne    mt_return2
  10031.     move.b    #$f,mt_lowmask
  10032. mt_portadown
  10033.     clr    d0
  10034.     move.b    n_cmdlo(a6),d0
  10035.     and.b    mt_lowmask(pc),d0
  10036.     move.b    #$ff,mt_lowmask
  10037.     add    d0,n_period(a6)
  10038.     move    n_period(a6),d0
  10039.     and    #$fff,d0
  10040.     cmp    lowlim(pc),d0
  10041.     bmi.b    mt_portadskip
  10042.     and    #$f000,n_period(a6)
  10043.     move    lowlim(pc),d0
  10044.     or    d0,n_period(a6)
  10045. mt_portadskip
  10046.     move    n_period(a6),d0
  10047.     and    #$fff,d0
  10048.     lsl    #2,d0
  10049.     move    d0,mPeriod(a5)
  10050.     rts
  10051.  
  10052. mt_settoneporta
  10053.     move.l    a0,-(sp)
  10054.     move    (a6),d2
  10055.     and    #$fff,d2
  10056.     moveq    #0,d0
  10057.     move.b    n_finetune(a6),d0
  10058.     mulu    octs(pc),d0
  10059.     move.l    peris(pc),a0
  10060.     add.l    d0,a0
  10061.     moveq    #0,d0
  10062. mt_stploop
  10063.     cmp    (a0,d0),d2
  10064.     bhs.b    mt_stpfound
  10065.     addq    #2,d0
  10066.     cmp    octs(pc),d0
  10067.     blo.b    mt_stploop
  10068.     move    octs(pc),d0
  10069.     subq    #2,d0
  10070. mt_stpfound
  10071.     move.b    n_finetune(a6),d2
  10072.     and.b    #8,d2
  10073.     beq.b    mt_stpgoss
  10074.     tst    d0
  10075.     beq.b    mt_stpgoss
  10076.     subq    #2,d0
  10077. mt_stpgoss
  10078.     move    (a0,d0),d2
  10079.     move.l    (sp)+,a0
  10080.     move    d2,n_wantedperiod(a6)
  10081.     move    n_period(a6),d0
  10082.     clr.b    n_toneportdirec(a6)
  10083.     cmp    d0,d2
  10084.     beq.b    mt_cleartoneporta
  10085.     bge    mt_return2
  10086.     move.b    #1,n_toneportdirec(a6)
  10087.     rts
  10088.  
  10089. mt_cleartoneporta
  10090.     clr    n_wantedperiod(a6)
  10091.     rts
  10092.  
  10093. mt_toneportamento
  10094.     move.b    n_cmdlo(a6),d0
  10095.     beq.b    mt_toneportnochange
  10096.     move.b    d0,n_toneportspeed(a6)
  10097.     clr.b    n_cmdlo(a6)
  10098. mt_toneportnochange
  10099.     tst    n_wantedperiod(a6)
  10100.     beq    mt_return2
  10101.     moveq    #0,d0
  10102.     move.b    n_toneportspeed(a6),d0
  10103.     tst.b    n_toneportdirec(a6)
  10104.     bne.b    mt_toneportaup
  10105. mt_toneportadown
  10106.     add    d0,n_period(a6)
  10107.     move    n_wantedperiod(a6),d0
  10108.     cmp    n_period(a6),d0
  10109.     bgt.b    mt_toneportasetper
  10110.     move    n_wantedperiod(a6),n_period(a6)
  10111.     clr    n_wantedperiod(a6)
  10112.     bra.b    mt_toneportasetper
  10113.  
  10114. mt_toneportaup
  10115.     sub    d0,n_period(a6)
  10116.     move    n_wantedperiod(a6),d0
  10117.     cmp    n_period(a6),d0
  10118.     blt.b    mt_toneportasetper
  10119.     move    n_wantedperiod(a6),n_period(a6)
  10120.     clr    n_wantedperiod(a6)
  10121.  
  10122. mt_toneportasetper
  10123.     move    n_period(a6),d2
  10124.     move.b    n_glissfunk(a6),d0
  10125.     and.b    #$f,d0
  10126.     beq.b    mt_glissskip
  10127.     moveq    #0,d0
  10128.     move.b    n_finetune(a6),d0
  10129.     mulu    octs(pc),d0
  10130.     move.l    peris(pc),a0
  10131.     add.l    d0,a0
  10132.     moveq    #0,d0
  10133. mt_glissloop
  10134.     cmp    (a0,d0),d2
  10135.     bhs.b    mt_glissfound
  10136.     addq    #2,d0
  10137.     cmp    octs(pc),d0
  10138.     blo.b    mt_glissloop
  10139.     move    octs(pc),d0
  10140.     subq    #2,d0
  10141. mt_glissfound
  10142.     move    (a0,d0),d2
  10143. mt_glissskip
  10144.     lsl    #2,d2
  10145.     move    d2,mPeriod(a5) ; set period
  10146.     rts
  10147.  
  10148. mt_vibrato
  10149.     move.b    n_cmdlo(a6),d0
  10150.     beq.b    mt_vibrato2
  10151.     move.b    n_vibratocmd(a6),d2
  10152.     and.b    #$f,d0
  10153.     beq.b    mt_vibskip
  10154.     and.b    #$f0,d2
  10155.     or.b    d0,d2
  10156. mt_vibskip
  10157.     move.b    n_cmdlo(a6),d0
  10158.     and.b    #$f0,d0
  10159.     beq.b    mt_vibskip2
  10160.     and.b    #$f,d2
  10161.     or.b    d0,d2
  10162. mt_vibskip2
  10163.     move.b    d2,n_vibratocmd(a6)
  10164. mt_vibrato2
  10165.     move.b    n_vibratopos(a6),d0
  10166.     lea    mt_vibratotable(pc),a4
  10167.     lsr    #2,d0
  10168.     and    #$1f,d0
  10169.     moveq    #0,d2
  10170.     move.b    n_wavecontrol(a6),d2
  10171.     and.b    #3,d2
  10172.     beq.b    mt_vib_sine
  10173.     lsl.b    #3,d0
  10174.     cmp.b    #1,d2
  10175.     beq.b    mt_vib_rampdown
  10176.     move.b    #255,d2
  10177.     bra.b    mt_vib_set
  10178. mt_vib_rampdown
  10179.     tst.b    n_vibratopos(a6)
  10180.     bpl.b    mt_vib_rampdown2
  10181.     move.b    #255,d2
  10182.     sub.b    d0,d2
  10183.     bra.b    mt_vib_set
  10184. mt_vib_rampdown2
  10185.     move.b    d0,d2
  10186.     bra.b    mt_vib_set
  10187. mt_vib_sine
  10188.     move.b    0(a4,d0),d2
  10189. mt_vib_set
  10190.     move.b    n_vibratocmd(a6),d0
  10191.     and    #15,d0
  10192.     mulu    d0,d2
  10193.     lsr    #7,d2
  10194.     move    n_period(a6),d0
  10195.     tst.b    n_vibratopos(a6)
  10196.     bmi.b    mt_vibratoneg
  10197.     add    d2,d0
  10198.     bra.b    mt_vibrato3
  10199. mt_vibratoneg
  10200.     sub    d2,d0
  10201. mt_vibrato3
  10202.     lsl    #2,d0
  10203.     move    d0,mPeriod(a5)
  10204.     move.b    n_vibratocmd(a6),d0
  10205.     lsr    #2,d0
  10206.     and    #$3c,d0
  10207.     add.b    d0,n_vibratopos(a6)
  10208.     rts
  10209.  
  10210. mt_toneplusvolslide
  10211.     bsr    mt_toneportnochange
  10212.     bra    mt_volumeslide
  10213.  
  10214. mt_vibratoplusvolslide
  10215.     bsr.b    mt_vibrato2
  10216.     bra    mt_volumeslide
  10217.  
  10218. mt_tremolo
  10219.     move.b    n_cmdlo(a6),d0
  10220.     beq.b    mt_tremolo2
  10221.     move.b    n_tremolocmd(a6),d2
  10222.     and.b    #$f,d0
  10223.     beq.b    mt_treskip
  10224.     and.b    #$f0,d2
  10225.     or.b    d0,d2
  10226. mt_treskip
  10227.     move.b    n_cmdlo(a6),d0
  10228.     and.b    #$f0,d0
  10229.     beq.b    mt_treskip2
  10230.     and.b    #$f,d2
  10231.     or.b    d0,d2
  10232. mt_treskip2
  10233.     move.b    d2,n_tremolocmd(a6)
  10234. mt_tremolo2
  10235.     move.b    n_tremolopos(a6),d0
  10236.     lea    mt_vibratotable(pc),a4
  10237.     lsr    #2,d0
  10238.     and    #$1f,d0
  10239.     moveq    #0,d2
  10240.     move.b    n_wavecontrol(a6),d2
  10241.     lsr.b    #4,d2
  10242.     and.b    #3,d2
  10243.     beq.b    mt_tre_sine
  10244.     lsl.b    #3,d0
  10245.     cmp.b    #1,d2
  10246.     beq.b    mt_tre_rampdown
  10247.     move.b    #255,d2
  10248.     bra.b    mt_tre_set
  10249. mt_tre_rampdown
  10250.     tst.b    n_vibratopos(a6)
  10251.     bpl.b    mt_tre_rampdown2
  10252.     move.b    #255,d2
  10253.     sub.b    d0,d2
  10254.     bra.b    mt_tre_set
  10255. mt_tre_rampdown2
  10256.     move.b    d0,d2
  10257.     bra.b    mt_tre_set
  10258. mt_tre_sine
  10259.     move.b    0(a4,d0),d2
  10260. mt_tre_set
  10261.     move.b    n_tremolocmd(a6),d0
  10262.     and    #15,d0
  10263.     mulu    d0,d2
  10264.     lsr    #6,d2
  10265.     moveq    #0,d0
  10266.     move.b    n_volume(a6),d0
  10267.     tst.b    n_tremolopos(a6)
  10268.     bmi.b    mt_tremoloneg
  10269.     add    d2,d0
  10270.     bra.b    mt_tremolo3
  10271. mt_tremoloneg
  10272.     sub    d2,d0
  10273. mt_tremolo3
  10274.     bpl.b    mt_tremoloskip
  10275.     clr    d0
  10276. mt_tremoloskip
  10277.     cmp    #$40,d0
  10278.     bls.b    mt_tremolook
  10279.     move    #$40,d0
  10280. mt_tremolook
  10281.     move    d0,mVolume(a5)
  10282.     move.b    n_tremolocmd(a6),d0
  10283.     lsr    #2,d0
  10284.     and    #$3c,d0
  10285.     add.b    d0,n_tremolopos(a6)
  10286.     rts
  10287.  
  10288. mt_sampleoffset
  10289.     moveq    #0,d0
  10290.     move.b    n_cmdlo(a6),d0
  10291.     beq.b    mt_sononew
  10292.     move.b    d0,n_sampleoffset(a6)
  10293. mt_sononew
  10294.     move.b    n_sampleoffset(a6),d0
  10295.     lsl    #7,d0
  10296.     cmp    n_length(a6),d0
  10297.     bge.b    mt_sofskip
  10298.     sub    d0,n_length(a6)
  10299.     lsl    #1,d0
  10300.     add.l    d0,n_start(a6)
  10301.     rts
  10302. mt_sofskip
  10303.     move    #1,n_length(a6)
  10304.     rts
  10305.  
  10306. mt_volumeslide
  10307.     move.b    n_cmdlo(a6),d0
  10308.     lsr.b    #4,d0
  10309.     tst.b    d0
  10310.     beq.b    mt_volslidedown
  10311. mt_volslideup
  10312.     add.b    d0,n_volume(a6)
  10313.     cmp.b    #$40,n_volume(a6)
  10314.     bmi.b    mt_vsuskip
  10315.     move.b    #$40,n_volume(a6)
  10316. mt_vsuskip
  10317.     move.b    n_volume(a6),d0
  10318.     move.b    d0,mVolume+1(a5)
  10319.     rts
  10320.  
  10321. mt_volslidedown
  10322.     moveq    #$f,d0
  10323.     and.b    n_cmdlo(a6),d0
  10324. mt_volslidedown2
  10325.     sub.b    d0,n_volume(a6)
  10326.     bpl.b    mt_vsdskip
  10327.     clr.b    n_volume(a6)
  10328. mt_vsdskip
  10329.     move.b    n_volume(a6),d0
  10330.     move    d0,mVolume(a5)
  10331.     rts
  10332.  
  10333. mt_positionjump
  10334.     move.b    n_cmdlo(a6),d0
  10335.     cmp.b    mt_songpos(pc),d0
  10336.     bhi.b    .e
  10337.     st    PS3M_break
  10338.  
  10339. .e    subq.b    #1,d0
  10340.     move.b    d0,mt_songpos
  10341. mt_pj2    clr.b    mt_pbreakpos
  10342.     st     mt_posjumpflag
  10343.     st    PS3M_poscha
  10344.     rts
  10345.  
  10346. mt_volumechange
  10347.     moveq    #0,d0
  10348.     move.b    n_cmdlo(a6),d0
  10349.     cmp.b    #$40,d0
  10350.     bls.b    mt_volumeok
  10351.     moveq    #$40,d0
  10352. mt_volumeok
  10353.     move.b    d0,n_volume(a6)
  10354.     move    d0,mVolume(a5)
  10355.     rts
  10356.  
  10357. mt_patternbreak
  10358.     moveq    #0,d0
  10359.     move.b    n_cmdlo(a6),d0
  10360.     move.l    d0,d2
  10361.     lsr.b    #4,d0
  10362.     mulu    #10,d0
  10363.     and.b    #$f,d2
  10364.     add.b    d2,d0
  10365.     cmp.b    #63,d0
  10366.     bhi.b    mt_pj2
  10367.     move.b    d0,mt_pbreakpos
  10368.     st    mt_posjumpflag
  10369.     st    PS3M_poscha
  10370.     rts
  10371.  
  10372. mt_setspeed
  10373.     moveq    #0,d0
  10374.     move.b    3(a6),d0
  10375.     bne.b    .e
  10376.     st    PS3M_break
  10377.     st    PS3M_poscha
  10378.     rts
  10379. .e    clr.b    mt_counter
  10380.     cmp    #32,d0
  10381.     bhs.b    mt_settempo
  10382.     move.b    d0,mt_speed
  10383.     rts
  10384.  
  10385. mt_settempo
  10386.     move.l    d1,-(sp)
  10387.     move.l    mrate,d1
  10388.     move.l    d1,d2
  10389.     lsl.l    #2,d1
  10390.     add.l    d2,d1
  10391.     add    d0,d0
  10392.     divu    d0,d1
  10393.  
  10394.     addq    #1,d1
  10395.     and    #~1,d1
  10396.     move    d1,bytesperframe
  10397.     move.l    (sp)+,d1
  10398.     rts
  10399.  
  10400. mt_checkmoreefx
  10401.     bsr    mt_updatefunk
  10402.     move.b    2(a6),d0
  10403.     and.b    #$f,d0
  10404.     cmp.b    #$9,d0
  10405.     beq    mt_sampleoffset
  10406.     cmp.b    #$b,d0
  10407.     beq    mt_positionjump
  10408.     cmp.b    #$d,d0
  10409.     beq    mt_patternbreak
  10410.     cmp.b    #$e,d0
  10411.     beq.b    mt_e_commands
  10412.     cmp.b    #$f,d0
  10413.     beq.b    mt_setspeed
  10414.     cmp.b    #$c,d0
  10415.     beq    mt_volumechange
  10416.  
  10417.     cmp    #mtMOD,mtype
  10418.     beq    mt_pernop
  10419.  
  10420. ; MTM runs these also in set frames
  10421.  
  10422.     cmp.b    #1,d0
  10423.     beq    mt_portaup
  10424.     cmp.b    #2,d0
  10425.     beq    mt_portadown
  10426.     cmp.b    #3,d0
  10427.     beq    mt_toneportamento
  10428.     cmp.b    #4,d0
  10429.     beq    mt_vibrato
  10430.     cmp.b    #5,d0
  10431.     beq    mt_toneplusvolslide
  10432.     cmp.b    #6,d0
  10433.     beq    mt_vibratoplusvolslide
  10434.     bra    mt_pernop
  10435.  
  10436.  
  10437. mt_e_commands
  10438.     move.b    n_cmdlo(a6),d0
  10439.     and.b    #$f0,d0
  10440.     lsr.b    #4,d0
  10441. ;    beq.b    mt_filteronoff
  10442.     cmp.b    #1,d0
  10443.     beq    mt_fineportaup
  10444.     cmp.b    #2,d0
  10445.     beq    mt_fineportadown
  10446.     cmp.b    #3,d0
  10447.     beq.b    mt_setglisscontrol
  10448.     cmp.b    #4,d0
  10449.     beq    mt_setvibratocontrol
  10450.     cmp.b    #5,d0
  10451.     beq    mt_setfinetune
  10452.     cmp.b    #6,d0
  10453.     beq    mt_jumploop
  10454.     cmp.b    #7,d0
  10455.     beq    mt_settremolocontrol
  10456.     cmp.b    #9,d0
  10457.     beq    mt_retrignote
  10458.     cmp.b    #$a,d0
  10459.     beq    mt_volumefineup
  10460.     cmp.b    #$b,d0
  10461.     beq    mt_volumefinedown
  10462.     cmp.b    #$c,d0
  10463.     beq    mt_notecut
  10464.     cmp.b    #$d,d0
  10465.     beq    mt_notedelay
  10466.     cmp.b    #$e,d0
  10467.     beq    mt_patterndelay
  10468.     cmp.b    #$f,d0
  10469.     beq    mt_funkit
  10470.     rts
  10471.  
  10472. mt_filteronoff
  10473.     move.b    n_cmdlo(a6),d0
  10474.     and.b    #1,d0
  10475.     asl.b    #1,d0
  10476.     and.b    #$fd,$bfe001
  10477.     or.b    d0,$bfe001
  10478.     rts    
  10479.  
  10480. mt_setglisscontrol
  10481.     move.b    n_cmdlo(a6),d0
  10482.     and.b    #$f,d0
  10483.     and.b    #$f0,n_glissfunk(a6)
  10484.     or.b    d0,n_glissfunk(a6)
  10485.     rts
  10486.  
  10487. mt_setvibratocontrol
  10488.     move.b    n_cmdlo(a6),d0
  10489.     and.b    #$f,d0
  10490.     and.b    #$f0,n_wavecontrol(a6)
  10491.     or.b    d0,n_wavecontrol(a6)
  10492.     rts
  10493.  
  10494. mt_setfinetune
  10495.     move.b    n_cmdlo(a6),d0
  10496.     and.b    #$f,d0
  10497.     move.b    d0,n_finetune(a6)
  10498.     rts
  10499.  
  10500. mt_jumploop
  10501.     tst.b    mt_counter
  10502.     bne    mt_return2
  10503.     move.b    n_cmdlo(a6),d0
  10504.     and.b    #$f,d0
  10505.     beq.b    mt_setloop
  10506.     tst.b    n_loopcount(a6)
  10507.     beq.b    mt_jumpcnt
  10508.     subq.b    #1,n_loopcount(a6)
  10509.     beq    mt_return2
  10510. mt_jmploop
  10511.     move.b    n_pattpos(a6),mt_pbreakpos
  10512.     st    mt_pbreakflag
  10513.     rts
  10514.  
  10515. mt_jumpcnt
  10516.     move.b    d0,n_loopcount(a6)
  10517.     bra.b    mt_jmploop
  10518.  
  10519. mt_setloop
  10520.     move    mt_patternpos(pc),d0
  10521.     lsr    #4,d0
  10522.     move.b    d0,n_pattpos(a6)
  10523.     rts
  10524.  
  10525. mt_settremolocontrol
  10526.     move.b    n_cmdlo(a6),d0
  10527.     and.b    #$f,d0
  10528.     lsl.b    #4,d0
  10529.     and.b    #$f,n_wavecontrol(a6)
  10530.     or.b    d0,n_wavecontrol(a6)
  10531.     rts
  10532.  
  10533. mt_retrignote
  10534.     move.l    d1,-(sp)
  10535.     moveq    #0,d0
  10536.     move.b    n_cmdlo(a6),d0
  10537.     and.b    #$f,d0
  10538.     beq.b    mt_rtnend
  10539.     moveq    #0,d1
  10540.     move.b    mt_counter(pc),d1
  10541.     bne.b    mt_rtnskp
  10542.     move    (a6),d1
  10543.     and    #$fff,d1
  10544.     bne.b    mt_rtnend
  10545.     moveq    #0,d1
  10546.     move.b    mt_counter(pc),d1
  10547. mt_rtnskp
  10548.     divu    d0,d1
  10549.     swap    d1
  10550.     tst    d1
  10551.     bne.b    mt_rtnend
  10552. mt_doretrig
  10553.     move.l    n_start(a6),(a5)    ; set start
  10554.     moveq    #0,d1
  10555.     move    n_length(a6),d1
  10556.     add.l    d1,d1
  10557.     move.l    d1,mLength(a5)        ; set length
  10558.     clr.b    mOnOff(a5)        ; turn on
  10559.     clr.l    mFPos(a5)        ; retrig
  10560.  
  10561.     move.l    n_loopstart(a6),mLStart(a5)
  10562.     moveq    #0,d1
  10563.     move    n_replen(a6),d1
  10564.     add.l    d1,d1
  10565.     move.l    d1,mLLength(a5)
  10566.     cmp.l    #2,mLLength(a5)
  10567.     bls.b    .eloo
  10568.     st    mLoop(a5)
  10569.     move.l    (sp)+,d1
  10570.     rts
  10571. .eloo    clr.b    mLoop(a5)
  10572.  
  10573. mt_rtnend
  10574.     move.l    (sp)+,d1
  10575.     rts
  10576.  
  10577. mt_volumefineup
  10578.     tst.b    mt_counter
  10579.     bne    mt_return2
  10580.     moveq    #$f,d0
  10581.     and.b    n_cmdlo(a6),d0
  10582.     bra    mt_volslideup
  10583.  
  10584. mt_volumefinedown
  10585.     tst.b    mt_counter
  10586.     bne    mt_return2
  10587.     moveq    #0,d0
  10588.     move.b    n_cmdlo(a6),d0
  10589.     and.b    #$f,d0
  10590.     bra    mt_volslidedown2
  10591.  
  10592. mt_notecut
  10593.     moveq    #$f,d0
  10594.     and.b    n_cmdlo(a6),d0
  10595.     cmp.b    mt_counter(pc),d0
  10596.     bne    mt_return2
  10597.     clr.b    n_volume(a6)
  10598.     clr    mVolume(a5)
  10599.     rts
  10600.  
  10601. mt_notedelay
  10602.     moveq    #$f,d0
  10603.     and.b    n_cmdlo(a6),d0
  10604.     cmp.b    mt_counter(pc),d0
  10605.     bne    mt_return2
  10606.     move    (a6),d0
  10607.     beq    mt_return2
  10608.  
  10609.     move    n_period(a6),d0
  10610.     lsl    #2,d0
  10611.     move    d0,mPeriod(a5)        ; set period
  10612.     move.l    d1,-(sp)
  10613.     bra    mt_doretrig
  10614.  
  10615. mt_patterndelay
  10616.     tst.b    mt_counter
  10617.     bne    mt_return2
  10618.     moveq    #$f,d0
  10619.     and.b    n_cmdlo(a6),d0
  10620.     tst.b    mt_pattdeltime2
  10621.     bne    mt_return2
  10622.     addq.b    #1,d0
  10623.     move.b    d0,mt_pattdeltime
  10624.     rts
  10625.  
  10626. mt_funkit
  10627.     tst.b    mt_counter
  10628.     bne    mt_return2
  10629.     move.b    n_cmdlo(a6),d0
  10630.     lsl.b    #4,d0
  10631.     and.b    #$f,n_glissfunk(a6)
  10632.     or.b    d0,n_glissfunk(a6)
  10633.     tst.b    d0
  10634.     beq    mt_return2
  10635. mt_updatefunk
  10636.     movem.l    a0/d1,-(sp)
  10637.     moveq    #0,d0
  10638.     move.b    n_glissfunk(a6),d0
  10639.     lsr.b    #4,d0
  10640.     beq.b    mt_funkend
  10641.     lea    mt_funktable(pc),a0
  10642.     move.b    (a0,d0),d0
  10643.     add.b    d0,n_funkoffset(a6)
  10644.     btst    #7,n_funkoffset(a6)
  10645.     beq.b    mt_funkend
  10646.     clr.b    n_funkoffset(a6)
  10647.  
  10648.     move.l    n_loopstart(a6),d0
  10649.     moveq    #0,d1
  10650.     move    n_replen(a6),d1
  10651.     add.l    d1,d0
  10652.     add.l    d1,d0
  10653.     move.l    n_wavestart(a6),a0
  10654.     addq.l    #1,a0
  10655.     cmp.l    d0,a0
  10656.     blo.b    mt_funkok
  10657.     move.l    n_loopstart(a6),a0
  10658. mt_funkok
  10659.     move.l    a0,n_wavestart(a6)
  10660.     moveq    #-1,d0
  10661.     sub.b    (a0),d0
  10662.     move.b    d0,(a0)
  10663. mt_funkend
  10664.     movem.l    (sp)+,a0/d1
  10665.     rts
  10666.  
  10667.  
  10668. mt_funktable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  10669.  
  10670. mt_vibratotable    
  10671.     dc.b   0, 24, 49, 74, 97,120,141,161
  10672.     dc.b 180,197,212,224,235,244,250,253
  10673.     dc.b 255,253,250,244,235,224,212,197
  10674.     dc.b 180,161,141,120, 97, 74, 49, 24
  10675.  
  10676. mt_periodtable
  10677. ; tuning 0, normal
  10678.     dc    856,808,762,720,678,640,604,570,538,508,480,453
  10679.     dc    428,404,381,360,339,320,302,285,269,254,240,226
  10680.     dc    214,202,190,180,170,160,151,143,135,127,120,113
  10681. ; tuning 1
  10682.     dc    850,802,757,715,674,637,601,567,535,505,477,450
  10683.     dc    425,401,379,357,337,318,300,284,268,253,239,225
  10684.     dc    213,201,189,179,169,159,150,142,134,126,119,113
  10685. ; tuning 2
  10686.     dc    844,796,752,709,670,632,597,563,532,502,474,447
  10687.     dc    422,398,376,355,335,316,298,282,266,251,237,224
  10688.     dc    211,199,188,177,167,158,149,141,133,125,118,112
  10689. ; tuning 3
  10690.     dc    838,791,746,704,665,628,592,559,528,498,470,444
  10691.     dc    419,395,373,352,332,314,296,280,264,249,235,222
  10692.     dc    209,198,187,176,166,157,148,140,132,125,118,111
  10693. ; tuning 4
  10694.     dc    832,785,741,699,660,623,588,555,524,495,467,441
  10695.     dc    416,392,370,350,330,312,294,278,262,247,233,220
  10696.     dc    208,196,185,175,165,156,147,139,131,124,117,110
  10697. ; tuning 5
  10698.     dc    826,779,736,694,655,619,584,551,520,491,463,437
  10699.     dc    413,390,368,347,328,309,292,276,260,245,232,219
  10700.     dc    206,195,184,174,164,155,146,138,130,123,116,109
  10701. ; tuning 6
  10702.     dc    820,774,730,689,651,614,580,547,516,487,460,434
  10703.     dc    410,387,365,345,325,307,290,274,258,244,230,217
  10704.     dc    205,193,183,172,163,154,145,137,129,122,115,109
  10705. ; tuning 7
  10706.     dc    814,768,725,684,646,610,575,543,513,484,457,431
  10707.     dc    407,384,363,342,323,305,288,272,256,242,228,216
  10708.     dc    204,192,181,171,161,152,144,136,128,121,114,108
  10709. ; tuning -8
  10710.     dc    907,856,808,762,720,678,640,604,570,538,508,480
  10711.     dc    453,428,404,381,360,339,320,302,285,269,254,240
  10712.     dc    226,214,202,190,180,170,160,151,143,135,127,120
  10713. ; tuning -7
  10714.     dc    900,850,802,757,715,675,636,601,567,535,505,477
  10715.     dc    450,425,401,379,357,337,318,300,284,268,253,238
  10716.     dc    225,212,200,189,179,169,159,150,142,134,126,119
  10717. ; tuning -6
  10718.     dc    894,844,796,752,709,670,632,597,563,532,502,474
  10719.     dc    447,422,398,376,355,335,316,298,282,266,251,237
  10720.     dc    223,211,199,188,177,167,158,149,141,133,125,118
  10721. ; tuning -5
  10722.     dc    887,838,791,746,704,665,628,592,559,528,498,470
  10723.     dc    444,419,395,373,352,332,314,296,280,264,249,235
  10724.     dc    222,209,198,187,176,166,157,148,140,132,125,118
  10725. ; tuning -4
  10726.     dc    881,832,785,741,699,660,623,588,555,524,494,467
  10727.     dc    441,416,392,370,350,330,312,294,278,262,247,233
  10728.     dc    220,208,196,185,175,165,156,147,139,131,123,117
  10729. ; tuning -3
  10730.     dc    875,826,779,736,694,655,619,584,551,520,491,463
  10731.     dc    437,413,390,368,347,328,309,292,276,260,245,232
  10732.     dc    219,206,195,184,174,164,155,146,138,130,123,116
  10733. ; tuning -2
  10734.     dc    868,820,774,730,689,651,614,580,547,516,487,460
  10735.     dc    434,410,387,365,345,325,307,290,274,258,244,230
  10736.     dc    217,205,193,183,172,163,154,145,137,129,122,115
  10737. ; tuning -1
  10738.     dc    862,814,768,725,684,646,610,575,543,513,484,457
  10739.     dc    431,407,384,363,342,323,305,288,272,256,242,228
  10740.     dc    216,203,192,181,171,161,152,144,136,128,121,114
  10741.  
  10742.  
  10743. mtm_periodtable
  10744. ; Tuning 0, Normal
  10745.     dc    1616,1524,1440,1356,1280,1208,1140,1076,1016,960,907
  10746.     dc    856,808,762,720,678,640,604,570,538,508,480,453
  10747.     dc    428,404,381,360,339,320,302,285,269,254,240,226
  10748.     dc    214,202,190,180,170,160,151,143,135,127,120,113
  10749.     dc    107,101,95,90,85,80,75,71,67,63,60,56
  10750.     dc    53,50,48,45
  10751.  
  10752. ; Tuning 1
  10753.     dc    1604,1514,1430,1348,1274,1202,1134,1070,1010,954,900
  10754.     dc    850,802,757,715,674,637,601,567,535,505,477,450
  10755.     dc    425,401,379,357,337,318,300,284,268,253,239,225
  10756.     dc    213,201,189,179,169,159,150,142,134,126,119,113
  10757.     dc    106,100,94,89,84,80,75,71,67,63,59,56
  10758.     dc    53,50,47,45
  10759.  
  10760. ; Tuning 2
  10761.     dc    1592,1504,1418,1340,1264,1194,1126,1064,1004,948,894
  10762.     dc    844,796,752,709,670,632,597,563,532,502,474,447
  10763.     dc    422,398,376,355,335,316,298,282,266,251,237,224
  10764.     dc    211,199,188,177,167,158,149,141,133,125,118,112
  10765.     dc    105,99,94,88,83,79,74,70,66,62,59,56
  10766.     dc    53,50,47,44
  10767.  
  10768. ; Tuning 3
  10769.     dc    1582,1492,1408,1330,1256,1184,1118,1056,996,940,888
  10770.     dc    838,791,746,704,665,628,592,559,528,498,470,444
  10771.     dc    419,395,373,352,332,314,296,280,264,249,235,222
  10772.     dc    209,198,187,176,166,157,148,140,132,125,118,111
  10773.     dc    104,99,93,88,83,78,74,70,66,62,59,55
  10774.     dc    52,49,47,44
  10775.  
  10776. ; Tuning 4
  10777.     dc    1570,1482,1398,1320,1246,1176,1110,1048,990,934,882
  10778.     dc    832,785,741,699,660,623,588,555,524,495,467,441
  10779.     dc    416,392,370,350,330,312,294,278,262,247,233,220
  10780.     dc    208,196,185,175,165,156,147,139,131,124,117,110
  10781.     dc    104,98,92,87,82,78,73,69,65,62,58,55
  10782.     dc    52,49,46,44
  10783.  
  10784. ; Tuning 5
  10785.     dc    1558,1472,1388,1310,1238,1168,1102,1040,982,926,874
  10786.     dc    826,779,736,694,655,619,584,551,520,491,463,437
  10787.     dc    413,390,368,347,328,309,292,276,260,245,232,219
  10788.     dc    206,195,184,174,164,155,146,138,130,123,116,109
  10789.     dc    103,97,92,87,82,77,73,69,65,61,58,54
  10790.     dc    52,49,46,43
  10791.  
  10792. ; Tuning 6
  10793.     dc    1548,1460,1378,1302,1228,1160,1094,1032,974,920,868
  10794.     dc    820,774,730,689,651,614,580,547,516,487,460,434
  10795.     dc    410,387,365,345,325,307,290,274,258,244,230,217
  10796.     dc    205,193,183,172,163,154,145,137,129,122,115,109
  10797.     dc    102,97,91,86,81,77,72,68,64,61,57,54
  10798.     dc    51,48,46,43
  10799.  
  10800. ; Tuning 7
  10801.     dc    1536,1450,1368,1292,1220,1150,1086,1026,968,914,862
  10802.     dc    814,768,725,684,646,610,575,543,513,484,457,431
  10803.     dc    407,384,363,342,323,305,288,272,256,242,228,216
  10804.     dc    204,192,181,171,161,152,144,136,128,121,114,108
  10805.     dc    102,96,91,85,81,76,72,68,64,60,57,54
  10806.     dc    51,48,45,43
  10807.  
  10808. ; Tuning -8
  10809.     dc    1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960
  10810.     dc    907,856,808,762,720,678,640,604,570,538,508,480
  10811.     dc    453,428,404,381,360,339,320,302,285,269,254,240
  10812.     dc    226,214,202,190,180,170,160,151,143,135,127,120
  10813.     dc    113,107,101,95,90,85,80,75,71,67,63,60
  10814.     dc    56,53,50,48
  10815.  
  10816. ; Tuning -7
  10817.     dc    1700,1604,1514,1430,1350,1272,1202,1134,1070,1010,954
  10818.     dc    900,850,802,757,715,675,636,601,567,535,505,477
  10819.     dc    450,425,401,379,357,337,318,300,284,268,253,238
  10820.     dc    225,212,200,189,179,169,159,150,142,134,126,119
  10821.     dc    112,106,100,94,89,84,79,75,71,67,63,60
  10822.     dc    56,53,50,47
  10823.  
  10824. ; Tuning -6
  10825.     dc    1688,1592,1504,1418,1340,1264,1194,1126,1064,1004,948
  10826.     dc    894,844,796,752,709,670,632,597,563,532,502,474
  10827.     dc    447,422,398,376,355,335,316,298,282,266,251,237
  10828.     dc    223,211,199,188,177,167,158,149,141,133,125,118
  10829.     dc    112,105,99,94,89,84,79,75,70,66,63,59
  10830.     dc    56,53,50,47
  10831.  
  10832. ; Tuning -5
  10833.     dc    1676,1582,1492,1408,1330,1256,1184,1118,1056,996,940
  10834.     dc    887,838,791,746,704,665,628,592,559,528,498,470
  10835.     dc    444,419,395,373,352,332,314,296,280,264,249,235
  10836.     dc    222,209,198,187,176,166,157,148,140,132,125,118
  10837.     dc    111,105,99,93,88,83,78,74,70,66,62,59
  10838.     dc    55,52,49,47
  10839.  
  10840. ; Tuning -4
  10841.     dc    1664,1570,1482,1398,1320,1246,1176,1110,1048,988,934
  10842.     dc    881,832,785,741,699,660,623,588,555,524,494,467
  10843.     dc    441,416,392,370,350,330,312,294,278,262,247,233
  10844.     dc    220,208,196,185,175,165,156,147,139,131,123,117
  10845.     dc    110,104,98,93,87,82,78,73,69,65,62,58
  10846.     dc    55,52,49,46
  10847.  
  10848. ; Tuning -3
  10849.     dc    1652,1558,1472,1388,1310,1238,1168,1102,1040,982,926
  10850.     dc    875,826,779,736,694,655,619,584,551,520,491,463
  10851.     dc    437,413,390,368,347,328,309,292,276,260,245,232
  10852.     dc    219,206,195,184,174,164,155,146,138,130,123,116
  10853.     dc    109,103,97,92,87,82,77,73,69,65,61,58
  10854.     dc    55,52,49,46
  10855.  
  10856. ; Tuning -2
  10857.     dc    1640,1548,1460,1378,1302,1228,1160,1094,1032,974,920
  10858.     dc    868,820,774,730,689,651,614,580,547,516,487,460
  10859.     dc    434,410,387,365,345,325,307,290,274,258,244,230
  10860.     dc    217,205,193,183,172,163,154,145,137,129,122,115
  10861.     dc    108,102,97,91,86,81,77,72,68,64,61,57
  10862.     dc    54,51,48,46
  10863.  
  10864. ; Tuning -1
  10865.     dc    1628,1536,1450,1368,1292,1220,1150,1086,1026,968,914
  10866.     dc    862,814,768,725,684,646,610,575,543,513,484,457
  10867.     dc    431,407,384,363,342,323,305,288,272,256,242,228
  10868.     dc    216,203,192,181,171,161,152,144,136,128,121,114
  10869.     dc    108,102,96,91,85,81,76,72,68,64,60,57
  10870.     dc    54,51,48,45
  10871.  
  10872. mt_chan1temp    ds.b    44*32
  10873.  
  10874. mt_sampleinfos
  10875.     ds    31*12
  10876.  
  10877. mt_songdataptr    dc.l 0
  10878.  
  10879. mt_speed    dc.b 6
  10880. mt_tempo    dc.b 0
  10881. mt_counter    dc.b 0
  10882. mt_songpos    dc.b 0
  10883. mt_pbreakpos    dc.b 0
  10884. mt_posjumpflag    dc.b 0
  10885. mt_pbreakflag    dc.b 0
  10886. mt_lowmask    dc.b 0
  10887. mt_pattdeltime    dc.b 0
  10888. mt_pattdeltime2    dc.b 0
  10889.  
  10890. mt_patternpos    dc 0
  10891. mt_dmacontemp    dc 0
  10892.  
  10893.  
  10894.  
  10895. ; PLAYING PROCESSES
  10896. ; ­­­­­­­­­­­­­­­­­
  10897.  
  10898.     section    system,code
  10899. syss3mPlay
  10900.     movem.l    d0-a6,-(sp)
  10901.     lea    data,a5
  10902.     basereg    data,a5
  10903.     
  10904.     lea    $dff000,a6
  10905.     move    #$f,$96(a6)
  10906.  
  10907.     move.l    4.w,a6
  10908.  
  10909.     ifne    allocchans
  10910.     moveq    #-1,d0
  10911.     CALL    AllocSignal
  10912.     move.b    d0,sigbit(a5)
  10913.     bmi    exiz
  10914.  
  10915.     lea    allocport(a5),a1
  10916.     move.b    d0,15(a1)
  10917.     move.l    a1,-(sp)
  10918.     suba.l    a1,a1
  10919.     CALL    FindTask
  10920.     move.l    (sp)+,a1
  10921.     move.l    d0,16(a1)
  10922.     lea    reqlist(a5),a0
  10923.     move.l    a0,(a0)
  10924.     addq.l    #4,(a0)
  10925.     clr.l    4(a0)
  10926.     move.l    a0,8(a0)
  10927.  
  10928.     lea    allocreq(a5),a1
  10929.     lea    audiodev(a5),a0
  10930.     moveq    #0,d0
  10931.     moveq    #0,d1
  10932.     CALL    OpenDevice
  10933.     tst.b    d0
  10934.     bne    exiz
  10935.     st.b    audioopen(a5)
  10936.  
  10937.     endc
  10938.  
  10939.     lea    lev4int(a5),a1
  10940.     moveq    #INTB_AUD0,d0
  10941.     CALL    SetIntVector
  10942.     move.l    d0,olev4(a5)
  10943.  
  10944.     move.l    _GFXBase(a5),a2
  10945.     move.l    a2,-(sp)
  10946.  
  10947.     move.b    PowerSupplyFrequency(a6),d0
  10948.     cmp.b    #60,d0
  10949.     beq.b    .NTSC
  10950.  
  10951. .PAL    move.l    #3546895,audiorate(a5)
  10952.     move.l    #1773447,timer(a5)
  10953.     bra.b    .qw
  10954.  
  10955. .NTSC    move    gb_DisplayFlags(a2),d0
  10956.     btst    #4,d0                ; REALLY_PAL
  10957.     bne.b    .PAL                ; Just to be sure
  10958.  
  10959.     move.l    #3579545,audiorate(a5)
  10960.     move.l    #1789773,timer(a5)
  10961. .qw
  10962.     move.l    timer(a5),d0
  10963.     divu    #250,d0                ; 100 Hz
  10964.     move    d0,thi(a5)
  10965.  
  10966.     move.l    audiorate(a5),d0
  10967.     move.l    mixingrate(a5),d1
  10968.     divu    d1,d0
  10969.     move.l    audiorate(a5),d1
  10970.     divu    d0,d1
  10971.     swap    d1
  10972.     clr    d1
  10973.     swap    d1
  10974.     move.l    d1,mrate(a5)
  10975.  
  10976.     move.l    audiorate(a5),d0
  10977.     divu    d1,d0
  10978.     swap    d0
  10979.     clr    d0
  10980.     swap    d0
  10981.     move.l    d0,mixingperiod(a5)
  10982.  
  10983.     lsl.l    #8,d1                ; 8-bit fraction
  10984.     move.l    d1,d0
  10985.     moveq    #100,d1
  10986.     jsr    divu_32
  10987.     move.l    d0,mrate50(a5)            ;In fact vblankfrequency
  10988.  
  10989.     moveq    #8,d3
  10990.     lea    cianame(a5),a1
  10991.     move.b    #'a',3(a1)
  10992. openciares
  10993.     moveq    #0,d0
  10994.     CLIB    Exec,OpenResource
  10995.     move.l    d0,ciares(a5)
  10996.     beq.b    tryCIAB
  10997.     move.l    d0,a6
  10998.     lea    timerinterrupt(a5),a1
  10999.     moveq    #0,d0
  11000.     CALL    AddICRVector
  11001.     tst.l    d0
  11002.     beq.b    gottimer
  11003.     addq.l    #4,d3
  11004.     lea    timerinterrupt(a5),a1
  11005.     moveq    #1,d0
  11006.     CALL    AddICRVector
  11007.     tst.l    d0
  11008.     beq.b    gottimer
  11009. tryCIAB
  11010.     lea    cianame(a5),a1
  11011.     cmp.b    #'a',3(a1)
  11012.     bne    exits
  11013.     addq.b    #1,3(a1)
  11014.     moveq    #0,d3
  11015.     bra.b    openciares
  11016.  
  11017. ciaaddr        dc.l    $bfd500,$bfd700,$bfe501,$bfe701
  11018.  
  11019. gottimer
  11020.     lea    craddr+8(a5),a6
  11021.     move.l    ciaaddr(pc,d3),d0
  11022.     move.l    d0,(a6)
  11023.     sub    #$100,d0
  11024.     move.l    d0,-(a6)
  11025.     moveq    #2,d3
  11026.     btst    #9,d0
  11027.     bne.b    timerB
  11028.     subq.b    #1,d3
  11029.     add    #$100,d0
  11030. timerB
  11031.     add    #$900,d0
  11032.     move.l    d0,-(a6)
  11033.     move.l    d0,a0
  11034.     and.b    #%10000000,(a0)
  11035.     move.b    d3,timeropen(a5)
  11036.     moveq    #0,d0
  11037.  
  11038.     move.l    craddr+4(a5),a1
  11039.     move.b    tlo(a5),(a1)
  11040.     move.b    thi(a5),$100(a1)
  11041.     move.b    #$11,(a0)            ; Continuous, force load
  11042.  
  11043.     move.l    mixingperiod(a5),d0
  11044.  
  11045.     lea    $dff000,a6
  11046.     move.l    buffSize(a5),d1
  11047.     lsr.l    #1,d1
  11048.     move    d1,$a4(a6)
  11049.     move    d1,$b4(a6)
  11050.     move    d1,$c4(a6)
  11051.     move    d1,$d4(a6)
  11052.     move    d0,$a6(a6)
  11053.     move    d0,$b6(a6)
  11054.     move    d0,$c6(a6)
  11055.     move    d0,$d6(a6)
  11056.  
  11057.     movem.l    buff1(a5),a0-a3
  11058.     moveq    #64,d1
  11059.  
  11060.     move    pmode(a5),d0
  11061.     subq    #1,d0
  11062.     bne.b    .nosurround
  11063.  
  11064.     moveq    #32,d2
  11065.  
  11066.     move.l    a0,$a0(a6)
  11067.     move.l    a1,$b0(a6)
  11068.     move.l    a0,$c0(a6)
  11069.     move.l    a1,$d0(a6)
  11070.     move    d1,$a8(a6)
  11071.     move    d1,$b8(a6)
  11072.     move    d2,$c8(a6)
  11073.     move    d2,$d8(a6)
  11074.     bra    .ohiis
  11075.  
  11076. .nosurround
  11077.     subq    #1,d0
  11078.     bne.b    .nostereo
  11079.  
  11080.     move.l    a0,$a0(a6)
  11081.     move.l    a1,$b0(a6)
  11082.     move.l    a1,$c0(a6)
  11083.     move.l    a0,$d0(a6)
  11084.     move    d1,$a8(a6)
  11085.     move    d1,$b8(a6)
  11086.     move    d1,$c8(a6)
  11087.     move    d1,$d8(a6)
  11088.     bra    .ohiis
  11089.  
  11090. .nostereo
  11091.     subq    #1,d0
  11092.     bne.b    .nomono
  11093.  
  11094.     move.l    a0,$a0(a6)
  11095.     move.l    a1,$b0(a6)
  11096.     move.l    a0,$c0(a6)
  11097.     move.l    a1,$d0(a6)
  11098.     move    d1,$a8(a6)
  11099.     move    d1,$b8(a6)
  11100.     move    d1,$c8(a6)
  11101.     move    d1,$d8(a6)
  11102.     bra.b    .ohiis
  11103.  
  11104. .nomono
  11105.  
  11106. ; REAL SURROUND
  11107.  
  11108.     subq    #1,d0
  11109.     bne.b    .bit14
  11110.  
  11111.     move.l    a0,$a0(a6)
  11112.     move.l    a2,$b0(a6)
  11113.     move.l    a3,$c0(a6)
  11114.     move.l    a1,$d0(a6)
  11115.  
  11116.     move    d1,$a8(a6)
  11117.     move    d1,$b8(a6)
  11118.     move    d1,$c8(a6)
  11119.     move    d1,$d8(a6)
  11120.     bra.b    .ohiis
  11121.  
  11122.  
  11123. ; 14-BIT STEREO
  11124.  
  11125. .bit14    moveq    #1,d2
  11126.  
  11127.     move.l    a0,$a0(a6)
  11128.     move.l    a1,$b0(a6)
  11129.     move.l    a3,$c0(a6)
  11130.     move.l    a2,$d0(a6)
  11131.     move    d1,$a8(a6)
  11132.     move    d1,$b8(a6)
  11133.     move    d2,$c8(a6)
  11134.     move    d2,$d8(a6)
  11135.  
  11136. .ohiis    jsr    FinalInit
  11137.  
  11138.     lea    $dff000,a6
  11139.     move    #$80,$9c(a6)
  11140.     move    #$c080,$9a(a6)
  11141.     move    #$820f,$96(a6)
  11142.     clr.l    playpos
  11143.  
  11144. syncz    move.l    (sp),a6
  11145.     CALL    WaitTOF
  11146.  
  11147.     lea    $dff000,a6
  11148.     jsr    play
  11149.  
  11150.     tst    PS3M_eject
  11151.     beq.b    syncz
  11152.  
  11153. exits    lea    $dff000,a6
  11154.     move    #$f,$96(a6)
  11155.     clr    $a8(a6)
  11156.     clr    $b8(a6)
  11157.     clr    $c8(a6)
  11158.     clr    $d8(a6)
  11159.     move    #$80,$9c(a6)
  11160.     move    #$80,$9a(a6)
  11161.  
  11162.     addq.l    #4,sp                ; Flush GFXbase
  11163.  
  11164.     move.l    olev4(a5),a1
  11165.     moveq    #INTB_AUD0,d0
  11166.     CLIB    Exec,SetIntVector
  11167.  
  11168. exiz    lea    data,a5
  11169.     moveq    #0,d0
  11170.     move.b    timeropen(a5),d0
  11171.     beq.b    rem1
  11172.     move.l    ciares(a5),a6
  11173.     lea    timerinterrupt(a5),a1
  11174.     subq.b    #1,d0
  11175.     CALL    RemICRVector
  11176.  
  11177. rem1    move.l    4.w,a6
  11178.     tst.b    audioopen(a5)
  11179.     beq.b    rem2
  11180.     lea    allocreq(a5),a1
  11181.     CALL    CloseDevice
  11182.  
  11183. rem2    moveq    #0,d0
  11184.     move.b    sigbit(a5),d0
  11185.     bmi.b    rem3
  11186.     CALL    FreeSignal
  11187.  
  11188. rem3    CALL    Forbid
  11189.     clr    PS3M_wait(a5)
  11190.     movem.l    (sp)+,d0-a6
  11191.     moveq    #0,d0            ;No error code
  11192.     rts
  11193.  
  11194. *************
  11195.  
  11196.     section    killer,code
  11197. s3mPlay    movem.l    d0-a6,-(sp)
  11198.     lea    data,a5
  11199.     move    $dff002,-(sp)        ;Old DMAs
  11200.  
  11201.     move.l    _GFXBase(a5),a6
  11202.     move.l    34(a6),-(sp)        ;Old view
  11203.     move.l    a6,-(sp)
  11204.     sub.l    a1,a1
  11205.     CALL    LoadView
  11206.     CALL    WaitTOF
  11207.     CALL    WaitTOF
  11208.  
  11209.     lea    $dff000,a6
  11210.     wb
  11211.     move    $1c(a6),d1
  11212. .irqs    move    $1e(a6),d0        ;Wait for all IRQs to finish...
  11213.     and    d1,d0            ;before killing the system...
  11214.     bne.b    .irqs            ;Over safety you might think, but...
  11215.  
  11216.     move    #$7ff,$96(a6)        ;Disable DMAs
  11217.     move    #$8200,$96(a6)        ;Enable master DMA
  11218.     move    $1c(a6),-(sp)        ;Old IRQs
  11219.     move    #$7fff,$9a(a6)        ;Disable IRQs
  11220.  
  11221.     move.l    4.w,a6
  11222.     move.b    PowerSupplyFrequency(a6),d0
  11223.     cmp.b    #60,d0
  11224.     beq.b    .NTSC
  11225.     move.l    #3546895,audiorate(a5)
  11226.     bra.b    .qw
  11227. .NTSC
  11228.     move.l    #3579545,audiorate(a5)
  11229. .qw
  11230.     move.l    audiorate(a5),d0
  11231.     move.l    mixingrate(a5),d1
  11232.     divu    d1,d0
  11233.     move.l    audiorate(a5),d1
  11234.     divu    d0,d1
  11235.     swap    d1
  11236.     clr    d1
  11237.     swap    d1
  11238.     move.l    d1,mrate(a5)
  11239.  
  11240.     move.l    audiorate(a5),d0
  11241.     divu    d1,d0
  11242.  
  11243.     swap    d0
  11244.     clr    d0
  11245.     swap    d0
  11246.     move.l    d0,mixingperiod(a5)
  11247.  
  11248.     lsl.l    #8,d1                ; 8-bit fraction
  11249.     move.l    d1,d0
  11250.     move.l    4.w,a6
  11251.     moveq    #0,d1
  11252.     move.b    VBlankFrequency(a6),d1
  11253.     jsr    divu_32
  11254.     move.l    d0,mrate50(a5)            ;In fact vblank frequency
  11255.  
  11256.     movem.l    buff1(a5),a0-a3
  11257.     move.l    mixingperiod(a5),d0
  11258.  
  11259.     lea    $dff000,a6
  11260.     move.l    buffSize(a5),d1
  11261.     lsr.l    #1,d1
  11262.     move    d1,$a4(a6)
  11263.     move    d1,$b4(a6)
  11264.     move    d1,$c4(a6)
  11265.     move    d1,$d4(a6)
  11266.     move    d0,$a6(a6)
  11267.     move    d0,$b6(a6)
  11268.     move    d0,$c6(a6)
  11269.     move    d0,$d6(a6)
  11270.  
  11271.     moveq    #64,d1
  11272.  
  11273.     move    pmode(a5),d0
  11274.     subq    #1,d0
  11275.     bne.b    .nosurround
  11276.  
  11277.     moveq    #32,d2
  11278.  
  11279.     move.l    a0,$a0(a6)
  11280.     move.l    a1,$b0(a6)
  11281.     move.l    a0,$c0(a6)
  11282.     move.l    a1,$d0(a6)
  11283.     move    d1,$a8(a6)
  11284.     move    d1,$b8(a6)
  11285.     move    d2,$c8(a6)
  11286.     move    d2,$d8(a6)
  11287.     bra    .ohiis
  11288.  
  11289. .nosurround
  11290.     subq    #1,d0
  11291.     bne.b    .nostereo
  11292.  
  11293.     move.l    a0,$a0(a6)
  11294.     move.l    a1,$b0(a6)
  11295.     move.l    a1,$c0(a6)
  11296.     move.l    a0,$d0(a6)
  11297.     move    d1,$a8(a6)
  11298.     move    d1,$b8(a6)
  11299.     move    d1,$c8(a6)
  11300.     move    d1,$d8(a6)
  11301.     bra.b    .ohiis
  11302.  
  11303. .nostereo
  11304.     subq    #1,d0
  11305.     bne.b    .nomono
  11306.  
  11307.     move.l    a0,$a0(a6)
  11308.     move.l    a1,$b0(a6)
  11309.     move.l    a0,$c0(a6)
  11310.     move.l    a1,$d0(a6)
  11311.     move    d1,$a8(a6)
  11312.     move    d1,$b8(a6)
  11313.     move    d1,$c8(a6)
  11314.     move    d1,$d8(a6)
  11315.     bra.b    .ohiis
  11316.  
  11317. .nomono
  11318.  
  11319. ; REAL SURROUND!
  11320.  
  11321.     subq    #1,d0
  11322.     bne.b    .bit14
  11323.  
  11324.     move.l    a0,$a0(a6)
  11325.     move.l    a1,$b0(a6)
  11326.     move.l    a2,$c0(a6)
  11327.     move.l    a3,$d0(a6)
  11328.     move    d1,$a8(a6)
  11329.     move    d1,$b8(a6)
  11330.     move    d1,$c8(a6)
  11331.     move    d1,$d8(a6)
  11332.     bra.b    .ohiis
  11333.  
  11334.  
  11335. ; 14-BIT STEREO
  11336.  
  11337. .bit14    moveq    #1,d2
  11338.  
  11339.     move.l    a0,$a0(a6)
  11340.     move.l    a1,$b0(a6)
  11341.     move.l    a3,$c0(a6)
  11342.     move.l    a2,$d0(a6)
  11343.     move    d1,$a8(a6)
  11344.     move    d1,$b8(a6)
  11345.     move    d2,$c8(a6)
  11346.     move    d2,$d8(a6)
  11347.  
  11348. .ohiis    move.l    4.w,a6
  11349.     moveq    #0,d0
  11350.     btst    d0,AttnFlags+1(a6)
  11351.     beq.b    .no68010
  11352.  
  11353.     Push    a5
  11354.     lea    liko(pc),a5
  11355.     CALL    Supervisor
  11356.     Pull    a5
  11357. .no68010
  11358.     move.l    d0,vbrr(a5)
  11359.  
  11360.     Push    a5
  11361.     jsr    FinalInit
  11362.     Pull    a5
  11363.  
  11364.     lea    $dff000,a6
  11365.     move.l    vbrr(a5),a0
  11366.     move.l    $70(a0),olev4(a5)
  11367.     move.l    #lev4,$70(a0)
  11368.     move.l    $6c(a0),olev3(a5)
  11369.     move.l    #lev3,$6c(a0)
  11370.     move    #$800f,$96(a6)
  11371.  
  11372.     move    #$80+$20,$9c(a6)
  11373.     move    #$c080+$20,$9a(a6)
  11374.  
  11375. sync    move    #4,$180(a6)
  11376.     jsr    play
  11377.  
  11378.     lea    $dff000,a6
  11379.     move    #$5a,$180(a6)
  11380.     btst    #6,$bfe001
  11381.     bne.b    sync
  11382.  
  11383. exitz    move    #$f00,$180(a6)
  11384.     move    #$7fff,$9a(a6)        ;Restore system status
  11385.     move    #$7ff,$96(a6)
  11386.     move    #$7fff,$9c(a6)        ;Clear possible IRQ-requests (4 safety)
  11387.  
  11388.     move.l    vbrr(a5),a0
  11389.     move.l    olev4(a5),$70(a0)    ;Restore IRQ-vectors
  11390.     move.l    olev3(a5),$6c(a0)
  11391.  
  11392. .q    btst    #6,$bfe001
  11393.     beq.b    .q
  11394.  
  11395.     move    (sp)+,d7        ;Old IRQs
  11396.  
  11397.     move.l    (sp)+,a6        ;Old gfxbase
  11398.     move.l    (sp)+,a1        ;Old view
  11399.  
  11400.     lea    $dff000,a0
  11401.     move    #$fff,$180(a0)        ;!!! debug color
  11402.  
  11403.     or    #$8000,d7
  11404.     and    #~$780,d7        ;And off Audio IRQs (for safety again)
  11405.     move    d7,$9a(a0)        ;Old IRQs
  11406.  
  11407.     move    (sp)+,d7        ;Old DMAs
  11408.     or    #$8000,d7
  11409.     and    #~$f,d7            ;And off Audio DMAs (convenience...)
  11410.     move    d7,$96(a0)
  11411.  
  11412.     clr    $a8(a0)            ;Volumes down...
  11413.     clr    $b8(a0)
  11414.     clr    $c8(a0)
  11415.     clr    $d8(a0)
  11416.  
  11417.     move    #$ff,$180(a0)        ;!!! debug color2
  11418.  
  11419.     CALL    LoadView        ;Old view
  11420.     move.l    38(a6),d3        ;Old Copper1
  11421.     move.l    d3,$dff080        ;Set old Copper
  11422.     move    d3,$dff088        ;Trigger
  11423.  
  11424.     movem.l    (sp)+,d0-a6
  11425.     moveq    #0,d0            ;No error code
  11426.     move    #$f0,$dff000        ;Safe! (Hopefully...)
  11427.     rts
  11428. liko
  11429.     ifeq    disable020
  11430.     MOVEC    VBR,d0
  11431.     endc
  11432.     rte
  11433.  
  11434.  
  11435. *******
  11436.  
  11437. ;*** Datas ***
  11438.  
  11439.  
  11440.     section    datas,data
  11441. data
  11442.  
  11443. lev4int        dc.l    0,0
  11444.         dc.b    NT_INTERRUPT,127
  11445.         dc.l    l4name
  11446.         dc.l    playpos
  11447.         dc.l    slev4
  11448.  
  11449. timerinterrupt     dc.l    0,0
  11450.         dc.b    NT_INTERRUPT,127
  11451.         dc.l    timerint
  11452.         dc.l    playpos
  11453.         dc.l    lev6server
  11454.  
  11455. vbrr        dc.l    0
  11456. olev4        dc.l    0
  11457. olev3        dc.l    0
  11458. vtabaddr    dc.l    0
  11459. playpos        dc.l    0
  11460. bufpos        dc.l    0
  11461. buffSize    dc.l    BUFFER
  11462. buffSizeMask    dc.l    BUFFER-1
  11463.  
  11464. bytesperframe    dc    0
  11465. bytes2do    dc    0
  11466. todobytes    dc    0
  11467. bytes2music    dc    0
  11468.     ifne    debug
  11469. kalas        dc.l    $c70000
  11470.     endc
  11471.  
  11472. mixad1        dc.l    0
  11473. mixad2        dc.l    0
  11474. cbufad        dc.l    0
  11475. opt020        dc    0
  11476.  
  11477. mixingrate    dc.l    16000
  11478. mixingperiod    dc.l    0
  11479. vboost        dc.l    0
  11480. pmode        dc    SURROUND
  11481. system        dc    DISABLED
  11482.  
  11483. PS3M_play    dc    0
  11484. PS3M_break    dc    0
  11485. PS3M_poscha    dc    0
  11486. PS3M_position    dc    0
  11487. PS3M_master    dc    64
  11488. PS3M_eject    dc    0
  11489. PS3M_wait    dc    0
  11490. PS3M_cont    dc    0
  11491. PS3M_paused    dc    0
  11492. PS3M_initialized dc    0
  11493. PS3M_reinit    dc    0
  11494.  
  11495. audiorate    dc.l    0
  11496. mrate        dc.l    0
  11497. mrate50        dc.l    0
  11498.  
  11499. slen        dc    0
  11500. pats        dc    0
  11501. inss        dc    0
  11502.  
  11503. samples        dc.l    0
  11504. patts        dc.l    0
  11505.  
  11506. fformat        dc    0
  11507. sflags        dc    0
  11508.  
  11509. rows        dc    63
  11510. pbrkrow        dc    0
  11511. pjmpflag    dc    0
  11512. pbrkflag    dc    0
  11513. spd        dc    6
  11514. tempo        dc    125
  11515.  
  11516. cn        dc    0
  11517. pdelaycnt    dc    0
  11518.  
  11519. chans        dc    0
  11520. numchans    dc    0
  11521. maxchan        dc    0
  11522. mtype        dc    0            
  11523. clock        dc.l    0            ; 14317056/4 for S3Ms
  11524. globalVol    dc    0
  11525.  
  11526. pos        dc    0
  11527. plen        dc    0
  11528. ppos        dc.l    0
  11529.  
  11530. divtabs        ds.l    16
  11531.  
  11532. c0        ds.b    s3mChanBlock_SIZE*32
  11533.  
  11534. cha0        ds.b    mChanBlock_SIZE*32
  11535.  
  11536. pantab        ds.b    32            ;channel panning infos
  11537.  
  11538.  
  11539. s3m        dc.l    0
  11540. s3mlen        dc.l    0
  11541.  
  11542. buff1        dc.l    0
  11543. buff2        dc.l    0
  11544. buff3        dc.l    0
  11545. buff4        dc.l    0
  11546. buff14        dc.l    0
  11547. vtab        dc.l    0
  11548. dtab        dc.l    0
  11549. dtabsize    dc.l    0
  11550.  
  11551. frate        dc.l    16000
  11552. fboost        dc.l    0
  11553. fpmode        dc    SURROUND
  11554. fstate        dc    DISABLED
  11555. forced        dc    0    ; Bits:
  11556.                 ; 0 mixing rate
  11557.                 ; 1 volume boost
  11558.                 ; 2 playing mode
  11559.                 ; 3 system state
  11560.  
  11561. segment        dc.l    0
  11562. errorcode    dc.l    0
  11563. params        dc    0
  11564. bann        dc    0
  11565.  
  11566. config        dc.l    0
  11567. conlen        dc.l    0
  11568.  
  11569. buhku        dc.l    0,0
  11570. lock        dc.l    0
  11571.  
  11572. loadtags    dc.l    RTFI_OkText,loadtext
  11573.         dc.l    RTFI_Flags,0
  11574.         dc.l    0
  11575.  
  11576. diretags    dc.l    RTFI_Dir,0
  11577.         dc.l    0
  11578.  
  11579.  
  11580. reqptr        dc.l    0
  11581. variable    dc.l    0
  11582. noconf        dc    0
  11583. ssnpos        dc    0
  11584. tyhja        dc.l    0
  11585.  
  11586. tags        dc.l    RT_ReqPos,2
  11587.         dc.l    RTEZ_Flags,4
  11588.         dc.l    RTEZ_DefaultResponse
  11589. defaultresponse    dc.l    1
  11590.         dc.l    RTEZ_ReqTitle,winname
  11591.         dc.l    RT_Underscore,'_'
  11592.         dc.l    $8000000f,textattr
  11593.         dc.l    0
  11594.  
  11595. ltags        dc.l    RT_ReqPos,2
  11596.         dc.l    RTGL_Min,4000
  11597.         dc.l    RTGL_Max,56000
  11598.         dc.l    0
  11599.  
  11600. ltags2        dc.l    RT_ReqPos,2
  11601.         dc.l    RTGL_Min,0
  11602.         dc.l    RTGL_Max,8
  11603.         dc.l    0
  11604.  
  11605. mname        dc.l    0
  11606. var        dc.l    fname
  11607.  
  11608. XpkTags        dc.l    XPK_InName
  11609. XpkFN        dc.l    0
  11610.         dc.l    XPK_GetOutBuf
  11611. XpkTo        dc.l    0
  11612.         dc.l    XPK_GetOutBufLen
  11613. XpkFlen        dc.l    0
  11614.         dc.l    XPK_OutMemType
  11615. XpkMem        dc.l    2
  11616.         dc.l    XPK_PassThru,1
  11617.         dc.l    0
  11618.  
  11619.  
  11620. thi        dc.b    0
  11621. tlo        dc.b    0
  11622. timer        dc.l    0
  11623. ciares        dc.l    0
  11624. craddr        dc.l    0,0,0
  11625. timeropen    dc.b    0
  11626.         even
  11627.  
  11628. audioopen    dc.b    0
  11629. sigbit        dc.b    -1
  11630.  
  11631. dat        dc    $f00
  11632.  
  11633. allocport    dc.l    0,0
  11634.         dc.b    4,0
  11635.         dc.l    0
  11636.         dc.b    0,0
  11637.         dc.l    0
  11638. reqlist    dc.l    0,0,0
  11639.         dc.b    5,0
  11640.  
  11641. allocreq    dc.l    0,0
  11642.         dc    127
  11643.         dc.l    0
  11644.         dc.l    allocport
  11645.         dc    68
  11646.         dc.l    0,0,0
  11647.         dc    0
  11648.         dc.l    dat
  11649.         dc.l    1,0,0,0,0,0,0
  11650.         dc    0
  11651.  
  11652. xmsign        dc.b    'Extended Module:'
  11653. title7        dc.b    'Select module(s) to play:',0
  11654. title6        dc.b    'Select module(s) to add:',0
  11655. retry        dc.b    'Retry|Abort|Cancel',0
  11656. winname        VERNUM
  11657.         dc.b    0
  11658. scrname        VERNUM
  11659.         dc.b    ' - Copyright © 1994-96 Jarno Paananen',0
  11660. time        dc.b    '00:00',0
  11661. playr        dc.b    'Play',0
  11662. add        dc.b    'Add',0
  11663.  
  11664. overtxt        dc.b    'Current settings:',10
  11665.         dc.b    '­­­­­­­­­­­­­­­­­',10
  11666.         dc.b    'Mixing rate: %ld',10
  11667.         dc.b    'Volume boost: %ld',10
  11668.         dc.b    'Playing mode: %s',10
  11669.         dc.b    'System: %s',10
  11670.         dc.b    'Buffer size: %ldkB',10,10
  11671.         dc.b    'Change:',0
  11672.  
  11673. overgad        dc.b    '_Rate|_Boost|_Mode|_System|_Buffer|to _Defaults|_Exit',0
  11674.  
  11675. mratetitle    dc.b    'Mixing rate:',0
  11676. vboosttitle    dc.b    'Volume boost:',0
  11677. playmode    dc.b    'Select play mode:',0
  11678. killer        dc.b    'Select system state:',0
  11679.  
  11680. pmodeg        dc.b    '_Surround|S_tereo|_Mono|_Real Surround|_14-bit|Cancel',0
  11681. killerg        dc.b    '_Disabled|_Enabled|Cancel',0
  11682.  
  11683. _XpkName     dc.b    'xpkmaster.library',0
  11684. _DiskFontName     dc.b    'diskfont.library',0
  11685.         even
  11686. fontname    dc.b    'topaz.font'
  11687.         ds.b    16
  11688.  
  11689. loadtext    dc.b    'Load',0
  11690.  
  11691. alkutext    dc.b 10
  11692.         dc.b 'PS3M - The S3M Player',10
  11693.         dc.b '­­­­­­­­­­­­­­­­­­­­­',10
  11694.         VER
  11695.         sVER
  11696.         dc.b 'Copyright © 1994-96 Jarno Paananen',10
  11697.         dc.b '­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­',10,10
  11698.         dc.b 'A Sahara Surfers (tm) Production!',10
  11699.         dc.b '­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­',10,10
  11700.         dc.b 'All rights reserved',10,10
  11701.         dc.b '- Dedicated to Anna, Kausti and',10
  11702.         dc.b 'my lovely Maarit',10
  11703.         ifne beta
  11704.         dc.b 10,'BETA VERSION FOR INTERNAL USE ONLY!',10
  11705.         dc.b 'DO _NOT_ DISTRIBUTE!',10
  11706.         endc
  11707.         dc.b 0
  11708.  
  11709. alkutext2    dc.b    10
  11710.         dc.b    'To contact me:',10
  11711.         dc.b    '­­­­­­­­­­­­­­',10
  11712.         dc.b    'Preferably via Internet:',10
  11713.         dc.b    'p153737@cc.tut.fi',10
  11714.         dc.b    'jarno.paananen@research.nokia.com',10
  11715.         dc.b    'or jpaana@freenet.hut.fi',10,10
  11716.         dc.b    'Or snail me at:',10
  11717.         dc.b    'J.Paananen',10
  11718.         dc.b    'Insinöörinkatu 60 A31',10
  11719.         dc.b    'FIN-33720 Tampere',10
  11720.         dc.b    'Finland',10
  11721.         dc.b    'Europe ;)',10,10
  11722.         dc.b    'Or by phone: +358-31-3174235',10
  11723.         dc.b    '(18-22 EET, please!)',10,0
  11724.  
  11725. outofmemory    dc.b    'Out of memory',0
  11726. initerror    dc.b    'Initialization error',10
  11727.         dc.b    '(Is it a module?)',0
  11728.  
  11729. errorgadget    dc.b    'Understood',0
  11730.  
  11731. infos        dc.b    '%ld-channel %s module:',10
  11732.         dc.b    '%s (%s)',10,10
  11733.         dc.b    'Mixing rate: %ld',10
  11734.         dc.b    'Volume boost: %ld',10
  11735.         dc.b    'Playing mode: %s',10
  11736.         dc.b    'System: %s',10
  11737.         dc.b    'Using %s mixing routines',0
  11738.  
  11739. ssn        dc.b    10
  11740.         rept    16
  11741.         dc.b    '%-32.32s Len: %6.6ld',10
  11742.         endr
  11743.         dc.b    0
  11744.  
  11745. ssn1        dc.b    '_<<|_Exit|_>>',0
  11746. ssn2        dc.b    ' |_Exit|_>>',0
  11747. ssn3        dc.b    '_<<|_Exit| ',0
  11748. ssn4        dc.b    ' |_Exit| ',0
  11749.  
  11750. contta        dc.b    '_Ok',0
  11751. contta2        dc.b    '_Ok|_Contact|_Quit',0
  11752. contta3        dc.b    '_Ok|_Sample names|_Mod Info|_Contact',0
  11753. contta4        dc.b    '_Ok|_Contact',0
  11754. timerint     dc.b    'PS3M-Lev6',0
  11755. l4name        dc.b    'PS3M-Lev4',0
  11756.  
  11757. cianame        dc.b    'ciax.resource',0
  11758. audiodev     dc.b    'audio.device',0
  11759.  
  11760. pro        dc.b    'Protracker',0
  11761. fast        dc.b    'Fasttracker',0
  11762. st3        dc.b    'Scream Tracker ]I[',0
  11763. mtm        dc.b    'Multitracker',0
  11764. xm        dc.b    'Fasttracker ][ XM',0
  11765. configname    dc.b    'S:PS3M.config',0
  11766. defaultsection    dc.b    '[defaults]',0
  11767. directory    dc.b    'directory',0
  11768. mxrate        dc.b    'rate',0
  11769. boost        dc.b    'boost',0
  11770. sstate        dc.b    'system',0
  11771. plmode        dc.b    'mode',0
  11772. bsize        dc.b    'buffersize',0
  11773. banner        dc.b    'banner',0
  11774. font        dc.b    'font',0
  11775. on        dc.b    'on',0
  11776. off        dc.b    'off',0
  11777. m000        dc.b    '000/010',0
  11778. m020        dc.b    '020+',0
  11779. surr        dc.b    'surround',0
  11780. ster        dc.b    'stereo',0
  11781. mon        dc.b    'mono',0
  11782. real        dc.b    'real surround',0
  11783. stereo14    dc.b    '14-bit stereo',0
  11784. channelsection    dc.b    '[channels]',0
  11785. tunesection    dc.b    '[tunes]',0
  11786.  
  11787.         even
  11788.  
  11789. playtags    dc.l    RTFI_OkText,playr
  11790.         dc.l    RTFI_Flags,FREQF_MULTISELECT!FREQF_PATGAD
  11791.         dc.l    RT_TextAttr,textattr
  11792.         dc.l    0
  11793.  
  11794. addtags        dc.l    RTFI_OkText,add
  11795.         dc.l    RTFI_Flags,FREQF_MULTISELECT!FREQF_PATGAD
  11796.         dc.l    RT_TextAttr,textattr
  11797.         dc.l    0
  11798.  
  11799. textattr    dc.l    fontname
  11800. fontsize    dc    8,0
  11801.  
  11802. task        dc.l    0
  11803.  
  11804. positioneita    dc    1
  11805. signaali    dc.l    -1
  11806. progpos        dc    0
  11807. program        dc.l    0
  11808. maxfile        dc    0
  11809. topbor        dc    0
  11810. bar        dc    0
  11811. wbscr        dc.l    0
  11812. windowptr     dc.l    0
  11813. rast        dc.l    0
  11814. winpoin        dc.l    0
  11815. fontaddr    dc.l    0
  11816. _IntBase    dc.l    0
  11817. _GFXBase     dc.l    0
  11818. _DOSBase     dc.l    0
  11819. _PPBase     dc.l    0
  11820. _RTBase     dc.l    0
  11821. _XpkBase    dc.l    0
  11822. _DiskFontBase    dc.l    0
  11823. zoomstate    dc    0
  11824. dates        dc.l    0,0
  11825. fifties        dc.l    0
  11826.  
  11827. dates2        dc.l    0,0
  11828. fifties2     dc.l    0
  11829.  
  11830. oldsec        dc.l    0
  11831. paivita        dc    0
  11832.  
  11833. timethisfar     dc.l 0
  11834.  
  11835. winstr    dc    0,0,240,82
  11836.     dc.b    0,1
  11837.     dc.l    CLOSEWINDOW!GADGETUP!MOUSEBUTTONS!NEWSIZE!INTUITICKS
  11838.     dc.l    WINDOWDEPTH!WINDOWCLOSE!WINDOWDRAG!ACTIVATE!NOCAREREFRESH!SMART_REFRESH!RMBTRAP
  11839.     dc.l    0,0,winname,0,0,0,0
  11840.     dc    WBENCHSCREEN
  11841.  
  11842. ******* Gadgets *******
  11843.  
  11844.  
  11845. gvolume    dc.l    position
  11846.     dc    55,-39,165,10,GADGHNONE!GRELBOTTOM,RELVERIFY
  11847.     dc    PROPGADGET
  11848.     dc.l    vbor,0,0,0,propspecial
  11849.     dc    0
  11850.     dc.l    0
  11851.  
  11852. position
  11853.     dc.l    dummy3
  11854.     dc    55,-59,165,10,GADGHNONE!GRELBOTTOM,RELVERIFY
  11855.     dc    PROPGADGET
  11856.     dc.l    vbor2,0,0,0,propspecial2
  11857.     dc    0
  11858.     dc.l    0
  11859.  
  11860. dummy3    dc.l    dummy4
  11861.     dc    54,-60,1,1,GADGHNONE!GRELBOTTOM,0,1
  11862.     dc.l    bgr,0,0,0,0
  11863.     dc    0
  11864.     dc.l    0
  11865.  
  11866. dummy4    dc.l    Name
  11867.     dc    54,-40,1,1,GADGHNONE!GRELBOTTOM,0,1
  11868.     dc.l    bgr,0,0,0,0
  11869.     dc    0
  11870.     dc.l    0
  11871.  
  11872. vtext    dc.b    1,0,1,0
  11873.     dc    3,3
  11874.     dc.l    textattr,teksti3,vtext2
  11875.  
  11876. vtext2    dc.b    2,0,0,0
  11877.     dc    4,2
  11878.     dc.l    textattr,teksti3,0
  11879.  
  11880.  
  11881. vtext3    dc.b    1,0,1,0
  11882.     dc    3,3
  11883.     dc.l    textattr,teksti2,vtext4
  11884.  
  11885. vtext4    dc.b    2,0,0,0
  11886.     dc    4,2
  11887.     dc.l    textattr,teksti2,0
  11888.  
  11889. vbor    dc    0,0
  11890.     dc.b    2,0,0,1
  11891.     dc.l    lines,0
  11892.  
  11893. vbor2    dc    0,0
  11894.     dc.b    2,0,0,1
  11895.     dc.l    lines,0
  11896.  
  11897. lines    dc    0,11
  11898.  
  11899. propspecial
  11900.     dc    AUTOKNOB!FREEHORIZ!PROPBORDERLESS!PROPNEWLOOK
  11901.     dc    -1,0
  11902.     dc    $ffff/64,-1
  11903.     dc.l    0,0,0
  11904.  
  11905. propspecial2
  11906.     dc    AUTOKNOB!FREEHORIZ!PROPBORDERLESS!PROPNEWLOOK
  11907. nyky    dc    0,0
  11908. positioosa
  11909.     dc    -1,-1
  11910.     dc.l    0,0,0
  11911.  
  11912. Name    dc.l    PosGad
  11913.     dc    20,-80,200,12,GADGHCOMP!GRELBOTTOM,1,1
  11914.     dc.l    Namegr,0,Namet3,0,0
  11915.     dc    0
  11916.     dc.l    0
  11917.  
  11918. PosGad    dc.l    Mute
  11919.     dc    20,-60,30,11,GADGHCOMP!GRELBOTTOM,1,1
  11920.     dc.l    gr,0,vtext3,0,0
  11921.     dc    0
  11922.     dc.l    0
  11923.  
  11924. Mute    dc.l    Pause
  11925.     dc    20,-40,30,11,GADGHCOMP!GRELBOTTOM,$101,1
  11926.     dc.l    gr,0,vtext,0,0
  11927.     dc    0
  11928.     dc.l    0
  11929.  
  11930. Pause    dc.l    Play
  11931.     dc    46,-20,28,13,12,$101,1
  11932.     dc.l    pausegr,0,0,0,0
  11933.     dc    0
  11934.     dc.l    0
  11935.  
  11936. Play    dc.l    Eject
  11937.     dc    16,-20,28,13,12,1,1
  11938.     dc.l    playgr,0,0,0,0
  11939.     dc    0
  11940.     dc.l    0
  11941.  
  11942. Eject    dc.l    Next
  11943.     dc    76,-20,28,13,12,1,1
  11944.     dc.l    Ejectgr,0,0,0,0
  11945.     dc    0
  11946.     dc.l    0
  11947.  
  11948. Next    dc.l    Prev
  11949.     dc    136,-20,28,13,12,1,1
  11950.     dc.l    nextgr,0,0,0,0
  11951.     dc    0
  11952.     dc.l    0
  11953.  
  11954. Prev    dc.l    Prefs
  11955.     dc    106,-20,28,13,12,1,1
  11956.     dc.l    prevgr,0,0,0,0
  11957.     dc    0
  11958.     dc.l    0
  11959.  
  11960. Prefs    dc.l    Prg
  11961.     dc    166,-20,28,13,12,1,1
  11962.     dc.l    prefsgr,0,0,0,0
  11963.     dc    0
  11964.     dc.l    0
  11965.  
  11966. Prg    dc.l    0
  11967.     dc    196,-20,28,13,12,1,1
  11968.     dc.l    Prggr,0,0,0,0
  11969.     dc    0
  11970.     dc.l    0
  11971.  
  11972. Namet3    dc.b    1,0,1,0
  11973.     dc    4,2
  11974.     dc.l    textattr,nimi,0
  11975.  
  11976. Namegr    dc    0,0
  11977.     dc.b    2,0,1,3
  11978.     dc.l    Namexy,Namegr2
  11979. Namexy    dc    0,11
  11980.     dc    0,0
  11981.     dc    200,0
  11982.  
  11983. Namegr2    dc    0,0
  11984.     dc.b    1,0,1,3
  11985.     dc.l    Namexy2,0
  11986.  
  11987. Namexy2    dc    200,1
  11988.     dc    200,11
  11989.     dc    1,11
  11990.  
  11991. gr    dc    0,0
  11992.     dc.b    2,0,1,3
  11993.     dc.l    xy,gr2
  11994. xy    dc    0,11
  11995.     dc    0,0
  11996.     dc    29,0
  11997.  
  11998. gr2    dc    0,0
  11999.     dc.b    1,0,1,3
  12000.     dc.l    xy2,0
  12001.  
  12002. xy2    dc    29,1
  12003.     dc    29,11
  12004.     dc    1,11
  12005.  
  12006. bgr    dc    0,0
  12007.     dc.b    2,0,1,3
  12008.     dc.l    bxy,bgr2
  12009. bxy    dc    0,11
  12010.     dc    0,0
  12011.     dc    166,0
  12012.  
  12013. bgr2    dc    0,0
  12014.     dc.b    1,0,1,3
  12015.     dc.l    bxy2,0
  12016.  
  12017. bxy2    dc    166,1
  12018.     dc    166,11
  12019.     dc    1,11
  12020.  
  12021. Ejectgr    dc    0,0,28,13,2
  12022.     dc.l    Ejectim
  12023.     dc.b    3,0
  12024.     dc.l    0
  12025.  
  12026. prevgr    dc    0,0,28,13,2
  12027.     dc.l    previm
  12028.     dc.b    3,0
  12029.     dc.l    0
  12030.  
  12031. playgr    dc    0,0,28,13,2
  12032.     dc.l    playim
  12033.     dc.b    3,0
  12034.     dc.l    0
  12035.  
  12036. nextgr    dc    0,0,28,13,2
  12037.     dc.l    nextim
  12038.     dc.b    3,0
  12039.     dc.l    0
  12040.  
  12041. pausegr    dc    0,0,28,13,2
  12042.     dc.l    pauseim
  12043.     dc.b    3,0
  12044.     dc.l    0
  12045.  
  12046. prefsgr    dc    0,0,28,13,2
  12047.     dc.l    prefsim
  12048.     dc.b    3,0
  12049.     dc.l    0
  12050.  
  12051. Prggr    dc    0,0,28,13,2
  12052.     dc.l    Prgim
  12053.     dc.b    3,0
  12054.     dc.l    0
  12055.  
  12056. texture    dc    $5555,$aaaa
  12057. otextu    dc    0
  12058.  
  12059. Nametx    dc.b    "Name",0
  12060. teksti2    dc.b    'Pos',0
  12061. teksti3    dc.b    'Vol',0
  12062. nimi    dcb.b    24,' '
  12063.     dc.b    0
  12064.  
  12065.     even
  12066.  
  12067. *************** Chip datas ****************
  12068.  
  12069.     section chip,data_c
  12070.  
  12071. Ejectim    dc.l $10,$30,$30,$30,$F0030,$3FC030,$FFF030,$30,$FFF030
  12072.     dc.l $30,$30,$30,$7FFFFFF0,$FFFFFFE0,$C0000000,$C0000000,$C0000000,$C0000000
  12073.     dc.l $C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$80000000,$37070
  12074.  
  12075. previm    dc.l $10,$30,$30,$1C71C30,$1CF3C30,$1DF7C30,$1FFFC30,$1DF7C30,$1CF3C30
  12076.     dc.l $1C71C30,$30,$30,$7FFFFFF0,$FFFFFFE0,$C0000000,$C0000000,$C0000000,$C0000000
  12077.     dc.l $C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$80000000,$43AA8
  12078.  
  12079. playim    dc.l $10,$30,$30,$3C0030,$3F0030,$3FC030,$3FF030,$3FC030,$3F0030
  12080.     dc.l $3C0030,$30,$30,$7FFFFFF0,$FFFFFFE0,$C0000000,$C0000000,$C0000000,$C0000000
  12081.     dc.l $C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$80000000,$10
  12082.  
  12083. nextim    dc.l $10,$30,$30,$38E3830,$3CF3830,$3EFB830,$3FFF830,$3EFB830,$3CF3830
  12084.     dc.l $38E3830,$30,$30,$7FFFFFF0,$FFFFFFE0,$C0000000,$C0000000,$C0000000,$C0000000
  12085.     dc.l $C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$80000000,$10
  12086.  
  12087. pauseim    dc.l $10,$30,$30,$39C030,$39C030,$39C030,$39C030,$39C030,$39C030
  12088.     dc.l $39C030,$30,$30,$7FFFFFF0,$FFFFFFE0,$C0000000,$C0000000,$C0000000,$C0000000
  12089.     dc.l $C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$80000000,$34F18
  12090.  
  12091. prefsim    dc.l $10,$30,$30,$1F8030,$39C030,$1C030,$38030,$60030,$30
  12092.     dc.l $60030,$30,$30,$7FFFFFF0,$FFFFFFE0,$C0000000,$C0000000,$C0000000,$C0000000
  12093.     dc.l $C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$80000000,$10
  12094.  
  12095. Prgim    dc.l $10,$30,$7800030,$4400030,$45E3C30,$7914430,$4104430,$4103C30,$4100430
  12096.     dc.l $3830,$30,$30,$7FFFFFF0,$FFFFFFE0,$C0000000,$C0000000,$C0000000,$C0000000
  12097.     dc.l $C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$C0000000,$80000000,$34F18
  12098.  
  12099. *********** BSS **************
  12100.  
  12101.  
  12102.     section    bsss,bss
  12103. tbuf        ds    1024*4
  12104. tbuf2        ds    1024*4
  12105.  
  12106. xm_patts    ds.l    256
  12107. xm_insts    ds.l    128
  12108.  
  12109. vars        ds.b    256
  12110. tempstr        ds.b    128
  12111. fname        ds.b    128
  12112. fname2        ds.b    128
  12113. fname3        ds.b    128
  12114. btitle        ds.b    128
  12115.     END
  12116.  
  12117.