home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Sound / Tracker / DC-DB212.LHA / sources / DBM0player.s
Encoding:
Text File  |  1997-04-06  |  63.1 KB  |  4,398 lines

  1. ;----------------- DIGI Booster PRO By Tap & Walt ----------------
  2. ;             player v 2.12 pure code                     ;
  3. ;             by Tap - Tomasz Piasta                      ;
  4. ;-----------------------------------------------------------------
  5. ; NOTE: If anybody wants to make a Digi Booster pro deliplayer
  6. ;       please contact me first.
  7. ;
  8. ;       If you want to use this player in commercial or shareware
  9. ;       products you have to register.
  10.  
  11.     incdir    include:
  12.     include    lvo/exec_lib.i
  13.     include lvo/gadtools_lib.i
  14.     include    lvo/ahi_lib.i
  15.     include    devices/ahi.i
  16.     include    "utility/hooks.i"
  17.  
  18.  
  19. Open        equ    -30
  20. Close        equ     -36
  21. Read        equ    -42
  22. ModeRead    equ    1005
  23.  
  24. Lock        =-84
  25. UnLock        =-90
  26. Examine        =-102
  27. ExNext        =-108
  28. AccesRead    =-2
  29.  
  30. Write        equ -48
  31. ModeWrite    equ 1006    
  32.  
  33. s:
  34.     move.l    4.w,a6
  35.     lea    DosName,a1
  36.     moveq    #0,d0
  37.     jsr    _LVOOpenLibrary(a6)
  38.     move.l    d0,DosBase
  39.  
  40.     move.l    4.w,a6
  41.     lea    ReqName,a1
  42.     moveq    #0,d0
  43.     jsr    _LVOOpenLibrary(a6)
  44.     move.l    d0,ReqBase
  45.  
  46.     move.l    #NM,ReadName
  47.     jsr    DBM0
  48.  
  49.     cmp.w    #1,LoadModError
  50.     beq.w    .WASERROR
  51.  
  52.     clr.w    SongPos
  53.     clr.w    PattPos
  54.     clr.w    FirstTrack
  55.     clr.w    PattPos
  56.     clr.b    count
  57.     moveq    #0,d0
  58.     move.w    GeneralSpeed,d0
  59.     move.b    d0,Orgtemp
  60.     bset    #1,$bfe001
  61.     move.b    Orgtemp,count
  62.     move.w    GeneralTempo,CiaTempo
  63.  
  64.     lea    Channel1+PANPOS,a0
  65.     moveq    #128/2-1,d7
  66. .SetPan
  67.     move.l    #$4000,(a0)
  68.     lea    ChanArea(a0),a0
  69.     move.l    #$c000,(a0)
  70.     lea    ChanArea(a0),a0
  71.     dbf    d7,.SetPan
  72.  
  73. .retry
  74.     jsr    ahi_initstart
  75.     tst.l    d0
  76.     beq.s    .ok
  77.     bsr    OpenAhiError
  78.     cmp.w    #1,d0
  79.     beq.s    .retry
  80.     clr.l    AhiBase
  81.     bra    .end
  82. .ok
  83.     move.b    #6,Temp
  84. .Loop:
  85.     move.l    DosBase,a6
  86.     moveq    #1,d1
  87.     jsr    -198(a6)
  88.     btst    #6,$bfe001
  89.     bne.s    .Loop
  90.  
  91.     jsr    Ahi_End
  92. .END
  93.     jsr    FreeModule
  94. .WASERROR
  95.     rts
  96.  
  97. DOSName:    dc.b    "dos.library",0
  98. reqname:    dc.b    'reqtools.library',0
  99.         even
  100. DosBase:    dc.l    0
  101. ReqBase:    dc.l    0
  102. ReadName:    dc.l    0
  103.  
  104. GeneralTempo:    dc.w    125
  105. GeneralSpeed:    dc.w    6
  106. InstrNum:    dc.w    1
  107. FirstTrack:    dc.w    0
  108. ActualTrack:    dc.w    0
  109. TrackNumber:    dc.w    0
  110.  
  111. INSNUM:        dc.w    0
  112. PATNUM:        dc.w    0
  113. SNGNUM:        dc.w    0
  114. SMPNUM:        dc.w    0
  115.  
  116. OrdNum:        dc.w    0
  117.  
  118. OrdNum0:    dc.w    0
  119. OrdNum1:    dc.w    0
  120. OrdNum2:    dc.w    0
  121. OrdNum3:    dc.w    0
  122. OrdNum4:    dc.w    0
  123.  
  124. ActualSong:    dc.w    0
  125.  
  126. FileHandle:    dc.l    0
  127. LoadModError:    dc.w    0
  128. Mode16BitEn:    dc.w    0
  129.  
  130. PP_LENG:    dc.w    0
  131. PP_ADR:        dc.l    0
  132.  
  133. NoLoopEnable:    dc.w    0
  134. MIXITENABLE:    dc.w    0
  135.  
  136. playenable:    dc.w    0
  137. stopenable:    dc.w    0
  138.  
  139. OrgTemp:    dc.b    0
  140. SPAHIENABLE    dc.b    0
  141. PlayPattEn:    dc.w    0
  142. OldSPos:    dc.w    0
  143. EditEnable:    dc.w    0
  144. ACTCHAN:    dc.w    0
  145.         even
  146.     
  147. FreeModule:
  148.     lea    Channel1+OnOffChanA,a0
  149.     moveq    #128-1,d7
  150. .onoff    bclr    #0,(a0)
  151.     lea    ChanArea(a0),a0
  152.     dbf    d7,.onoff
  153.  
  154.     bsr    FreeSong
  155.     bsr    FreeSamples
  156.     rts
  157.  
  158. FreeSong:
  159.     move.l    #1024-1,d7
  160.     lea    PattAdresses,a5
  161.     lea    PattLens,a4
  162.     moveq    #0,d6
  163.     move.w    TrackNumber,d6
  164.     mulu    #6,d6
  165. FreePatts
  166.     move.l    4,a6
  167.  
  168.     moveq    #0,d5
  169.     move.w    (a4)+,d5
  170.     mulu    d6,d5
  171.     move.l    d5,d0
  172.  
  173.     move.l    (a5),a1        ;adres zajetej pamieci
  174.     tst.l    (a5)+
  175.     beq.s    FreePattsDone
  176.  
  177.     subq.l    #8,a1
  178.     addq.l    #8,d0
  179.     jsr    -210(a6)
  180.     clr.l    -4(a5)
  181. ;    clr.w    -2(a4)
  182.     dbf    d7,FreePatts
  183. FreePattsDone
  184.  
  185.  
  186.     lea    SongOrders,a1
  187.     move.l    #1024-1,d7
  188. MMMCLR1    clr.w    (a1)+
  189.     dbf    d7,MMMCLR1
  190.  
  191.     lea    SongOrders0,a1
  192.     move.l    #[1024+1-1]*5,d7
  193. MMMCLR11
  194.     clr.w    (a1)+
  195.     dbf    d7,MMMCLR11
  196.  
  197.     bsr    ClrModName
  198.  
  199.     lea    SongNameBuffer,a1
  200.     move.w    #42-1,d7
  201. MMMCLR6    clr.b    (a1)+
  202.     dbf    d7,MMMCLR6
  203.  
  204.     lea    SongNameBuffer0,a1
  205.     move.w    #44*5-1,d7
  206. MMMCLR66
  207.     clr.b    (a1)+
  208.     dbf    d7,MMMCLR66
  209.  
  210.     clr.w    PATNUM
  211.     clr.w    ORDNUM
  212.     clr.w    ORDNUM0
  213.     clr.w    ORDNUM1
  214.     clr.w    ORDNUM2
  215.     clr.w    ORDNUM3
  216.     clr.w    ORDNUM4
  217.     clr.w    ActualSong
  218.     move.w    #64,GlobalVol
  219.  
  220.     clr.w    FirstTrack
  221.     rts
  222.  
  223.  
  224. ClrModName:
  225.     lea    ModNameBuffer,a1
  226.     move.w    #42-1,d7
  227. MMMCLR4    clr.b    (a1)+
  228.     dbf    d7,MMMCLR4
  229.     rts
  230.  
  231.  
  232.  
  233. FreeSamples:
  234.     move.l    #255-1,d7
  235.     lea    AHI_Samples,a5
  236. FreeSampleLoop
  237.     move.l    4,a6
  238.     move.l    (a5),a1            ;adres zajetej pamieci
  239.     move.l    4(a5),d0
  240.  
  241.     clr.l    8(a5)
  242.     clr.l    12(a5)
  243.     clr.l    4(a5)
  244.  
  245.     tst.l    (a5)
  246.     beq.s    FreeSamMKL
  247.  
  248.     cmp.l    #0,Ahi_Sound0
  249.     beq.s    .8bit
  250.     add.l    d0,d0
  251. .8bit
  252.  
  253.     clr.l    (a5)
  254.     subq.l    #8,a1
  255.     addq.l    #8,d0
  256.     jsr    -210(a6)
  257. FreeSamMKL
  258.     lea    16(a5),a5
  259.     dbf    d7,FreeSampleLoop
  260.  
  261.     lea    SamVol,a1
  262.     move.l    #256-1,d7
  263. MMMCLR2    clr.b    (a1)+
  264.     dbf    d7,MMMCLR2
  265.  
  266.     lea    samfin,a1
  267.     move.l    #256-1,d7
  268. MMMCLR3    move.l    #8363,(a1)+
  269.     dbf    d7,MMMCLR3
  270.  
  271.     lea    InstrNames,a1
  272.     move.l    #30*256/4-1,d7
  273. MMMCLR5    clr.l    (a1)+
  274.     dbf    d7,MMMCLR5
  275.  
  276.     lea    VolEnvelope,a1
  277.     move.l    #134*256/4-1,d7
  278. MMMCLR7    clr.l    (a1)+
  279.     dbf    d7,MMMCLR7
  280.  
  281.     lea    SampleType,a1
  282.     move.l    #256*2-1,d7
  283. MMMCLR8    clr.b    (a1)+
  284.     dbf    d7,MMMCLR8
  285.  
  286.     lea    LoopTab,a1
  287.     move.l    #256-1,d7
  288. MMMCLR9    clr.b    (a1)+
  289.     dbf    d7,MMMCLR9
  290.  
  291.     bsr    makeinstr
  292.  
  293.     clr.w    INSNUM
  294.     move.w    #64,GlobalVol
  295.  
  296.     tst.w    CANDO
  297.     beq.s    CANTDO
  298.     move.l    #AHIST_M8S,AHI_Sound0
  299.     clr.w    Mode16biten
  300. CANTDO
  301.     rts
  302.  
  303. CANDO:    dc.w    0
  304.  
  305. MakeInstr:
  306.     lea    Instruments,a0
  307.     move.l    #256-1,d7
  308.     moveq    #0,d0
  309. .mi
  310.     move.w    d0,(a0)+
  311.     addq    #1,d0
  312.     dbf    d7,.mi
  313.     rts
  314.  
  315. ChooseReqTitle:
  316.     dc.b    "Digi Booster 2.12 player Request",0
  317.     even
  318.  
  319. RT_TagBase        equ    $80000000
  320. RTEZ_ReqTitle        equ     (RT_TagBase+20)
  321. RTEZ_DefaultResponse    equ     (RT_TagBase+23)
  322. RT_Underscore        equ     (RT_TagBase+11)
  323. RT_ReqPos        equ     (RT_TagBase+3)
  324. REQPOS_CENTERSCR    equ     2
  325. rtEZRequestA        equ    -66
  326.  
  327. ChooseReqTags:
  328.     dc.l    RTEZ_ReqTitle,ChooseReqTitle
  329.     dc.l    RTEZ_DefaultResponse,1
  330.     dc.l    RT_Underscore,'_'
  331.     dc.l    RT_ReqPos,REQPOS_CENTERSCR
  332.     dc.l    0,0
  333.  
  334.  
  335. OpenChooseReq:
  336.     move.l    ReqBase,a6
  337.     lea    ChooseReqTags,a0
  338.     move.l    #0,a3
  339.     move.l    #0,a4
  340.     jsr    rtEZRequestA(a6)
  341.     rts
  342.  
  343. NotEnoughMemoryError
  344.     movem.l    d0-a6,-(sp)
  345.     move.l    #NoMemoryText,a1
  346.     move.l    #AboutOKText,a2
  347.     bsr    OpenChooseReq
  348.     movem.l    (sp)+,d0-a6
  349.     rts
  350.  
  351. NotEnoughForConvert
  352.     movem.l    d0-a6,-(sp)
  353.     move.l    #NoMemForConvert,a1
  354.     move.l    #AboutOKText,a2
  355.     bsr    OpenChooseReq
  356.     movem.l    (sp)+,d0-a6
  357.     rts
  358.  
  359. ReadError:
  360.     movem.l    d0-a6,-(sp)
  361.     move.l    #ReadErrorText,a1
  362.     move.l    #AboutOKText,a2
  363.     bsr    OpenChooseReq
  364.     movem.l    (sp)+,d0-a6
  365.     rts
  366.  
  367.  
  368. OpenAhiError:
  369.     movem.l    d1-a6,-(sp)
  370.     move.l    #OpenAhiErrorText,a1
  371.     move.l    #OpenAhiErrorAskText,a2
  372.     bsr    OpenChooseReq
  373.     movem.l    (sp)+,d1-a6
  374.     rts
  375.  
  376. OpenAhiError2:
  377.     movem.l    d1-a6,-(sp)
  378.     move.l    #OpenAhiErrorText2,a1
  379.     move.l    #AboutOKText,a2
  380.     bsr    OpenChooseReq
  381.     movem.l    (sp)+,d1-a6
  382.     rts
  383.  
  384.  
  385.  
  386. ReadErrorTEXT:
  387.     dc.b    " Read Error! ",10
  388.     dc.b    0
  389.     even
  390.  
  391. NoMemForConvert:
  392.     dc.b    "Sorry! There is no memory to",10
  393.     dc.b    "convert samples to 16 bit!!!",10
  394.     dc.b    0
  395.     even
  396.  
  397. NoMemoryTEXT:
  398.     dc.b    " Not Enough Memory! ",10
  399.     dc.b    0
  400.     even
  401.  
  402. OpenAhiErrorTEXT:
  403.     dc.b    " Can't open AHI.device !",10
  404.     dc.b    0
  405.     even
  406.  
  407. OpenAhiErrorTEXT2:
  408.     dc.b    " Can't open AHI.device !",10
  409.     dc.b    "       Try again.",10
  410.     dc.b    0
  411.     even
  412.  
  413. OpenAhiErrorASKTEXT:
  414.     dc.b    "_Retry |_Cancel",0
  415.     even
  416.  
  417. AboutOKText:
  418.     dc.b    "_OK",0
  419.     even
  420.  
  421.  
  422.  
  423. ConvertAllTo16BIT:
  424.     movem.l    d0-a6,-(sp)
  425.     cmp.l    #0,Ahi_Sound0
  426.     beq.s    .no16bitmode
  427.  
  428.     move.w    #0,Mode16biten
  429.     move.l    #0,Ahi_Sound0
  430. ;    jsr    FreeSampleBuffer
  431.     move.w    #1,Mode16biten
  432.     move.l    #1,Ahi_Sound0
  433.  
  434.  
  435.     move.l    #255-1,d6
  436.     moveq    #0,d7
  437. .loop
  438.     movem.l    d0-d6/a0-a6,-(sp)
  439.     bsr    ConvertTO16BIT
  440.     movem.l    (sp)+,d0-d6/a0-a6
  441.  
  442.     cmp.w    #-1,d7
  443.     beq.s    NotMem
  444.  
  445.     dbf    d6,.loop
  446.  
  447. .no16bitmode
  448.     movem.l    (sp)+,d0-a6
  449.     rts
  450.  
  451. NotMem:
  452.     jsr    NotEnoughForConvert
  453.  
  454. ;    move.w    #0,Mode16BitEn
  455. ;    move.l    #AHIST_M8S,AHI_Sound0
  456. ;    jsr    ConvertAllTO8bit
  457.  
  458.     movem.l    (sp)+,d0-a6
  459.     rts
  460.  
  461. ConvertTO16BIT:
  462.     lea    SampleType,a6
  463.     tst.b    (a6,d6.w)
  464.     bne.s    .juzjest16bit
  465.     move.b    #1,(a6,d6.w)
  466.     move.l    d6,d7
  467.     lsl.w    #4,d7
  468.     lea    AHI_Samples,a5
  469.     move.l    4(a5,d7.w),d0
  470.     tst.l    d0
  471.     beq.s    .juzjest16bit
  472.  
  473.     movem.l    d1-a6,-(sp)
  474.     move.l    4,a6
  475.     add.l    d0,d0
  476.     addq.l    #8,d0
  477.     move.l    #$10001,d1
  478.     jsr    -198(a6)
  479.     movem.l    (sp)+,d1-a6
  480.     tst.l    d0
  481.     beq    .allocerror
  482.     addq.l    #8,d0
  483.  
  484.     movem.l    d0-a6,-(sp)
  485.     move.l    (a5,d7.w),a2
  486.     move.l    d0,a3
  487.     move.l    4(a5,d7.w),d6
  488. .expandto16
  489.     move.b    (a2)+,(a3)+
  490.     clr.b    (a3)+
  491.     subq.l    #1,d6
  492.     tst.l    d6
  493.     bgt.s    .expandto16
  494.     movem.l    (sp)+,d0-a6
  495.  
  496.     movem.l    d0-a6,-(sp)
  497.     move.l    (a5,d7.w),a1
  498.     move.l    4(a5,d7.w),d0
  499.     subq.l    #8,a1
  500.     addq.l    #8,d0
  501.     move.l    4,a6
  502.     jsr    -210(a6)
  503.     movem.l    (sp)+,d0-a6
  504.  
  505.     move.l    d0,(a5,d7.w)
  506.  
  507. .juzjest16bit
  508.     moveq    #0,d7
  509.     rts
  510.  
  511. .allocerror
  512.     clr.b    (a6,d6.w)
  513.     moveq    #-1,d7
  514.     rts
  515.  
  516.  
  517.  
  518. ; ------------------------- read DBM0
  519. DBM0:    move.l    dosbase,a6
  520.     move.l    ReadName(pc),d1
  521.     move.l    #ModeRead,d2
  522.     jsr    open(a6)
  523.  
  524.     tst.l    d0
  525.     beq.w    RM_ReadError
  526.     move.l    d0,filehandle
  527.  
  528.     clr.w    DBM0_DONE1
  529.     clr.w    DBM0_DONE2
  530.  
  531.     lea    MODBUFFER,a5
  532.     move.l    filehandle,d1
  533.     move.l    a5,d2
  534.     move.l    #8,d3
  535.     jsr    read(a6)
  536.     cmp.l    #-1,d0
  537.     beq.w    RM_ReadError
  538.  
  539. ; ----------- read hunks
  540. .mainloop
  541.     move.l    DosBase,a6
  542.     move.l    filehandle,d1
  543.     move.l    a5,d2
  544.     move.l    #8,d3
  545.     jsr    read(a6)
  546.     cmp.l    #-1,d0
  547.     beq.w    DBM0_ReadError
  548.  
  549.     lea    Headers,a0
  550. .loop
  551.     move.l    (a0)+,d0
  552.     move.l    (a0)+,a1
  553.  
  554.     cmp.l    #-1,d0
  555.     beq.s    .notfound
  556.     cmp.l    (a5),d0
  557.     bne.s    .loop
  558.     addq.w    #1,DBM0_DONE1
  559.     jsr    (a1)
  560.     cmp.w    #0,LoadModError
  561.     bne.s    .done
  562.     cmp.w    #7,DBM0_DONE1
  563.     beq.w    .done
  564.     bra.s    .mainloop
  565.  
  566. .notfound
  567.     move.l    DosBase,a6
  568.     move.l    filehandle,d1
  569.     move.l    a5,d2
  570.     move.l    4(a5),d3
  571.     tst.l    d3
  572.     beq.s    .zero
  573.     jsr    read(a6)
  574.     cmp.l    #-1,d0
  575.     beq.w    DBM0_ReadError
  576. .zero
  577.     addq.w    #1,DBM0_DONE2
  578.     cmp.w    #10,DBM0_DONE2
  579.     beq.s    .done
  580.     bra.w    .mainloop
  581.  
  582. .done
  583.     move.l    DosBase,a6
  584.     move.l    filehandle,d1
  585.     jsr    close(a6)
  586.  
  587.     movem.l    d0-a6,-(sp)
  588.     bsr    ConvertAllTo16BIT
  589. ;    jsr    ChangeMM_MAIN
  590.     movem.l    (sp)+,d0-a6
  591.     rts
  592.  
  593.  
  594. HEADERS:
  595.     dc.b    "NAME"
  596.     dc.l    DBM0_ReadName
  597.  
  598.     dc.b    "INFO"
  599.     dc.l    DBM0_ReadInfo
  600.  
  601.     dc.b    "SONG"
  602.     dc.l    DBM0_ReadSong
  603.  
  604.     dc.b    "INST"
  605.     dc.l    DBM0_ReadInst
  606.  
  607.     dc.b    "PATT"
  608.     dc.l    DBM0_ReadPatt
  609.  
  610.     dc.b    "SMPL"
  611.     dc.l    DBM0_ReadSmpl
  612.  
  613.     dc.b    "VENV"
  614.     dc.l    DBM0_ReadVenv
  615.  
  616.     dc.l    -1
  617.  
  618. DBM0_DONE1:
  619.     dc.w    0
  620. DBM0_DONE2:
  621.     dc.w    0
  622.  
  623. DBM0_ReadError:
  624.     moveq    #-1,d0
  625.     jsr    ReadError
  626.     move.w    #2,LoadModError
  627.     rts
  628.  
  629.  
  630. DBM0_ReadName:
  631.     move.l    filehandle,d1
  632.     move.l    a5,d2
  633.     move.l    4(a5),d3
  634.     jsr    read(a6)
  635.     cmp.l    #-1,d0
  636.     beq.w    DBM0_ReadError
  637.  
  638.     move.l    a5,a6
  639.     lea    ModNameBuffer,a4
  640.     moveq    #42-1,d7
  641. .copyname
  642.     move.b    (a6)+,(a4)+
  643.     dbf    d7,.copyname
  644.     moveq    #0,d0
  645.     rts
  646.  
  647. DBM0_ReadInfo:
  648.     move.l    filehandle,d1
  649.     move.l    a5,d2
  650.     move.l    4(a5),d3
  651.     jsr    read(a6)
  652.     cmp.l    #-1,d0
  653.     beq.w    DBM0_ReadError
  654.  
  655.     move.w    (a5),InsNum
  656.     move.w    2(a5),SmpNum
  657.     move.w    4(a5),SngNum
  658.     move.w    6(a5),PatNum
  659.     subq    #1,InsNum
  660.     subq    #1,SmpNum
  661.     subq    #1,SngNum
  662.     subq    #1,PatNum
  663.     clr.l    AHI_CHAN
  664.     move.w    8(a5),AHI_CHAN+2
  665.     move.w    8(a5),TrackNumber
  666.     moveq    #0,d0
  667.     rts
  668.  
  669.  
  670.  
  671.  
  672. DBM0_ReadSong:
  673.     move.l    DosBase,a6
  674.     move.l    filehandle,d1
  675.     move.l    a5,d2
  676.     move.l    #46,d3
  677.     jsr    read(a6)
  678.     cmp.l    #-1,d0
  679.     beq.w    DBM0_ReadError
  680.  
  681.     move.l    a5,a6
  682.     lea    SongNameBuffer,a4
  683.     moveq    #42-1,d7
  684. .copyname
  685.     move.b    (a6)+,(a4)+
  686.     dbf    d7,.copyname
  687.     moveq    #0,d0
  688.  
  689.     move.l    DosBase,a6
  690.     move.l    filehandle,d1
  691.     move.l    #SongOrders,d2
  692.     moveq    #0,d3
  693.     move.w    44(a5),d3
  694.     subq    #1,d3
  695.     move.w    d3,OrdNum
  696.     addq    #1,d3
  697.     add.w    d3,d3
  698.     jsr    read(a6)
  699.     cmp.l    #-1,d0
  700.     beq.w    DBM0_ReadError
  701.  
  702.     move.w    SngNum,d7
  703.     tst.w    d7
  704.     beq.w    .notmore
  705.     subq    #1,d7
  706.  
  707.  
  708.     lea    SongNameBuffer1,a2
  709.     lea    OrdNum1,a3
  710.     lea    SongOrders1,a4
  711. .more
  712.     move.l    DosBase,a6
  713.     move.l    filehandle,d1
  714.     move.l    a5,d2
  715.     move.l    #46,d3
  716.     jsr    read(a6)
  717.     cmp.l    #-1,d0
  718.     beq.w    DBM0_ReadError
  719.  
  720.     movem.l    d0-a6,-(sp)
  721.     move.l    a5,a6
  722.     lea    (a2),a4
  723.     moveq    #42-1,d6
  724. .copyname2
  725.     move.b    (a6)+,(a4)+
  726.     dbf    d6,.copyname2
  727.     movem.l    (sp)+,d0-a6
  728.  
  729.     move.l    DosBase,a6
  730.     move.l    filehandle,d1
  731.     move.l    a4,d2
  732.     moveq    #0,d3
  733.     move.w    44(a5),d3
  734.     subq    #1,d3
  735.     move.w    d3,(a3)
  736.     addq    #1,d3
  737.     add.w    d3,d3
  738.     jsr    read(a6)
  739.     cmp.l    #-1,d0
  740.     beq.w    DBM0_ReadError
  741.  
  742.     addq    #2,a3
  743.     add.l    #44,a2
  744.     add.l    #1025*2,a4
  745.  
  746.     dbf    d7,.more
  747. .notmore
  748.     moveq    #0,d0
  749.     rts
  750.  
  751.  
  752.  
  753.  
  754.  
  755. DBM0_ReadInst:
  756.     move.w    InsNum,d7
  757.     moveq    #0,d6
  758. .instloop
  759.     addq    #1,d6
  760.  
  761.     move.l    DosBase,a6
  762.     move.l    filehandle,d1
  763.     move.l    a5,d2
  764.     move.l    #50,d3
  765.     jsr    read(a6)
  766.     cmp.l    #-1,d0
  767.     beq.w    DBM0_ReadError
  768.  
  769.     lea    InstrNames,a6
  770.     move.l    d6,d5
  771.     mulu    #30,d5
  772.     add.w    d5,a6
  773.     moveq    #30-1,d4
  774.     lea    (a5),a4
  775. .copyname
  776.     move.b    (a4)+,(a6)+
  777.     dbf    d4,.copyname
  778.  
  779.     lea    Instruments,a6
  780.     move.l    d6,d5
  781.     add.w    d5,d5
  782.     move.w    30(a5),(a6,d5.w)
  783.  
  784.     lea    SamVol,a6
  785.     move.w    32(a5),d4
  786.     move.b    d4,-1(a6,d6.w)
  787.  
  788.     lea    SamFin,a6
  789.     move.l    d6,d5
  790.     lsl.w    #2,d5
  791.     move.l    34(a5),(a6,d5.w)
  792.  
  793.     lea    Ahi_Samples,a6
  794.     move.l    d6,d5
  795.     lsl.w    #4,d5
  796.     move.l    38(a5),8(a6,d5.w)
  797.     move.l    42(a5),12(a6,d5.w)
  798.  
  799.     lea    LoopTab,a6
  800.     move.l    46(a5),d5
  801.     move.b    d5,(a6,d6.w)
  802.  
  803.     dbf    d7,.instloop
  804.     moveq    #0,d0
  805.     rts
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812. DBM0_ReadVenv:
  813.     move.l    DosBase,a6
  814.     move.l    filehandle,d1
  815.     move.l    a5,d2
  816.     move.l    #2,d3
  817.     jsr    read(a6)
  818.     cmp.l    #-1,d0
  819.     beq.w    DBM0_ReadError
  820.  
  821.     move.w    (a5),d7
  822.     beq.s    .exit
  823.     subq    #1,d7
  824. .venvloop
  825.     move.l    DosBase,a6
  826.     move.l    filehandle,d1
  827.     move.l    a5,d2
  828.     move.l    #2,d3
  829.     jsr    read(a6)
  830.     cmp.l    #-1,d0
  831.     beq.w    DBM0_ReadError
  832.  
  833.     lea    VolEnvelope,a0
  834.     moveq    #0,d6
  835.     move.w    (a5),d6
  836.     subq    #1,d6
  837.     mulu    #134,d6
  838.     add.l    d6,a0
  839.     move.l    a0,d2
  840.  
  841.     move.l    DosBase,a6
  842.     move.l    filehandle,d1
  843.     move.l    #134,d3
  844.     jsr    read(a6)
  845.     cmp.l    #-1,d0
  846.     beq.w    DBM0_ReadError
  847.  
  848.     dbf    d7,.venvloop
  849. .exit
  850.     moveq    #0,d0
  851.     rts
  852.  
  853.  
  854.  
  855. DBM0_ReadPatt:
  856.     move.l    4.w,a6
  857.     moveq    #0,d0
  858.     move.w    TrackNumber,d0
  859.     mulu    #8,d0
  860.     mulu    #256,d0
  861.     addq.l    #8,d0
  862.     move.l    #$10001,d1
  863.     jsr    -198(a6)
  864.     tst.l    d0
  865.     beq    DBM0_ReadError
  866.     addq.l    #8,d0
  867.     move.l    d0,PP_ADR
  868.  
  869.  
  870.     lea    PATTLENS,a3
  871.     lea    PATTAdresses,a4
  872.  
  873.     moveq    #0,d5
  874.     move.w    PATNUM,d5
  875. .onepatt
  876.     move.l    DosBase,a6
  877.     move.l    filehandle,d1
  878.     move.l    a5,d2
  879.     move.l    #6,d3
  880.     jsr    read(a6)
  881.     cmp.l    #-1,d0
  882.     beq.w    DBM0_ReadError
  883.  
  884.  
  885.     moveq    #0,d0
  886.     move.w    (a5),d0
  887. ;    addq    #1,d0
  888.     move.w    d0,(a3)+
  889.     moveq    #0,d1
  890.     move.w    TrackNumber,d1
  891.     mulu    #6,d1
  892.     mulu    d0,d1
  893.     move.l    d0,d6
  894.  
  895. ; ----------- alloc do rozpakowanego
  896.     move.l    4,a6
  897.     move.l    d1,d0
  898.     addq.l    #8,d0
  899.     move.l    #$10001,d1
  900.     jsr    -198(a6)
  901.     tst.l    d0
  902.     beq    RM_AllocError
  903.     addq.l    #8,d0
  904.     move.l    d0,(a4)+
  905.  
  906.  
  907.     move.l    DosBase,a6
  908.     move.l    filehandle,d1
  909.     move.l    PP_ADR,d2
  910.     move.l    2(a5),d3
  911.     jsr    read(a6)
  912.     cmp.l    #-1,d0
  913.     beq.w    DBM0_ReadError
  914.  
  915.     movem.l    d0-a6,-(sp)
  916.     move.l    PP_ADR,a0
  917.     move.l    -4(a4),a2
  918.     moveq    #0,d4
  919.     moveq    #0,d5
  920.     move.w    TrackNumber,d4        ; tracks
  921.     move.w    -2(a3),d5        ; rows
  922.     subq    #1,d5
  923.     bsr    DEPACKPATT
  924.     movem.l    (sp)+,d0-a6
  925.  
  926.     dbf    d5,.onepatt
  927.  
  928.  
  929.     move.l    4.w,a6
  930.  
  931.     moveq    #0,d0
  932.     move.w    TrackNumber,d0
  933.     mulu    #8,d0
  934.     mulu    #256,d0
  935.  
  936.     move.l    PP_ADR,a1        ;adres zajetej pamieci
  937.     subq.l    #8,a1
  938.     addq.l    #8,d0
  939.     jsr    -210(a6)
  940.  
  941.  
  942.  
  943.     moveq    #0,d0
  944.     rts
  945.  
  946.  
  947.  
  948.  
  949. DBM0_ReadSmpl:
  950.     move.w    SmpNum,d7
  951.     moveq    #0,d6
  952.  
  953. .readsample
  954.     move.l    DosBase,a6
  955.     move.l    filehandle,d1
  956.     move.l    a5,d2
  957.     move.l    #8,d3
  958.     jsr    read(a6)
  959.     cmp.l    #-1,d0
  960.     beq.w    DBM0_ReadError
  961.  
  962.     addq    #1,d6
  963.     move.l    4(a5),d3
  964.     tst.l    d3
  965.     beq.w    .doloop
  966.  
  967.     move.l    (a5),d0
  968.  
  969.  
  970.     btst    #0,d0
  971.     bne.s    .8bit
  972.  
  973.     add.l    d3,d3
  974.     lea    SampleType,a6
  975.     move.b    #1,(a6,d6.w)
  976.     lea    256(a6),a6
  977.     move.b    #1,(a6,d6.w)
  978.     move.l    #AHIST_M16S,AHI_Sound0
  979.     move.w    #1,Mode16BitEn
  980. .8bit
  981.  
  982.  
  983.     move.l    d3,d0
  984.     addq.l    #8,d0
  985.     move.l    #$10001,d1
  986.     move.l    4,a6
  987.     jsr    -198(a6)
  988.     tst.l    d0
  989.     beq    RM_AllocErrorDBM0SAM
  990.     addq.l    #8,d0
  991.  
  992.     move.l    d6,d5
  993.     lsl.w    #4,d5
  994.  
  995.     lea    Ahi_samples,a6
  996.     tst.l    4(a5)
  997.     beq.s    .qw
  998.     move.l    d0,(a6,d5.w)
  999. .qw
  1000.     move.l    4(a5),4(a6,d5.w)
  1001. **
  1002.  
  1003.     move.l    DosBase,a6
  1004.     move.l    filehandle,d1
  1005.     move.l    d0,d2
  1006.     jsr    read(a6)
  1007.     cmp.l    #-1,d0
  1008.     beq.w    DBM0_ReadError
  1009. .doloop
  1010.     dbf    d7,.readsample
  1011.  
  1012.  
  1013.  
  1014.     moveq    #0,d0
  1015.     rts
  1016.  
  1017.  
  1018.  
  1019.  
  1020. DEPACKPATT:
  1021.     mulu    #6,d4
  1022.     moveq    #0,d2
  1023.     moveq    #0,d3
  1024. .depackloop
  1025.     moveq    #0,d0
  1026.     move.b    (a0)+,d0
  1027.     tst.b    d0
  1028.     beq.w    .NextPos
  1029.  
  1030.     subq    #1,d0
  1031.     mulu    #6,d0
  1032.     add.l    d3,d0
  1033.  
  1034.     moveq    #0,d1
  1035.     move.b    (a0)+,d1
  1036.  
  1037.     btst    #0,d1
  1038.     beq.s    .notakenuta
  1039.     move.b    (a0)+,0(a2,d0.l)
  1040. .notakenuta
  1041.     btst    #1,d1
  1042.     beq.s    .notakenum
  1043.     move.b    (a0)+,1(a2,d0.l)
  1044. .notakenum
  1045.     btst    #2,d1
  1046.     beq.s    .notakeeffcom1
  1047.     move.b    (a0)+,2(a2,d0.l)
  1048. .notakeeffcom1
  1049.     btst    #3,d1
  1050.     beq.s    .notakeeffpar1
  1051.     move.b    (a0)+,3(a2,d0.l)
  1052. .notakeeffpar1
  1053.     btst    #4,d1
  1054.     beq.s    .notakeeffcom2
  1055.     move.b    (a0)+,4(a2,d0.l)
  1056. .notakeeffcom2
  1057.     btst    #5,d1
  1058.     beq.s    .notakeeffpar2
  1059.     move.b    (a0)+,5(a2,d0.l)
  1060. .notakeeffpar2
  1061.     bra.s    .depackloop
  1062.  
  1063. .NextPos:
  1064.     addq    #1,d2
  1065.     move.l    d2,d3
  1066.     mulu    d4,d3
  1067.  
  1068.     cmp.w    d2,d5
  1069.     bge.s    .depackloop
  1070.     rts
  1071.  
  1072.  
  1073.  
  1074. ; -------------------------------------------------------
  1075.  
  1076. RM_ReadError:
  1077.     moveq    #0,d7
  1078.     move.w    #1,LoadModError
  1079.     jsr    ReadError
  1080.     rts
  1081.  
  1082. RM_AllocErrorDBM0SAM
  1083.     moveq    #0,d7
  1084.     move.w    #1,LoadModError
  1085.     jsr    NotEnoughMemoryError
  1086.     move.l    #AHIST_M8S,AHI_Sound0
  1087.     move.w    #0,Mode16BitEn
  1088.     rts
  1089.  
  1090. RM_AllocError:
  1091.     moveq    #0,d7
  1092.     move.w    #1,LoadModError
  1093.     jsr    NotEnoughMemoryError
  1094.     rts
  1095.  
  1096. RM_AllocSamError:
  1097.     clr.l    (a4)
  1098.     clr.l    4(a4)
  1099.     clr.l    8(a4)
  1100.     clr.l    12(a4)
  1101.     moveq    #0,d7
  1102.     move.w    #1,LoadModError
  1103.     jsr    NotEnoughMemoryError
  1104.     rts
  1105.  
  1106. ; -------------------------------------------------------
  1107.  
  1108.  
  1109. ;    Section    code,code_p
  1110.  
  1111. ChanArea    equ    108
  1112.  
  1113.  
  1114. ;SamBuffAdr:    equ    0    ; 4
  1115. ;SamRep1:    equ    4    ; 4
  1116. ;SamRep2:    equ    8    ; 4
  1117. ;ChangeAdr:    equ    12    ; 1
  1118. ;MixDon:    equ    13    ; 1
  1119.  
  1120.  
  1121. VolA:        equ    0    ; 2
  1122. SlideVolOldA    equ    2    ; 1
  1123. OldGlobalVolA    equ    3    ; 1
  1124.  
  1125. VolB:        equ    4    ; 2
  1126. SlideVolOldB    equ    6    ; 1
  1127. OldGlobalVolB    equ    7    ; 1
  1128.  
  1129. OLDVolA:    equ    8    ; 2
  1130. OLDVolB:    equ    10    ; 2
  1131.  
  1132. SlideSamOffset    equ    12    ; 2
  1133. OldSlideOffsetA    equ    14    ; 1
  1134. OldSlideOffsetB    equ    15    ; 1
  1135.  
  1136. MainVol:    equ    16    ; 2
  1137.  
  1138. ReplaceEnable    equ    18    ; 1
  1139. OFFenable    equ    19    ; 1
  1140. SamOffsetA    equ    20    ; 1
  1141. SamOffsetB    equ    21    ; 1
  1142. RetraceCntA    equ    22    ; 1
  1143. RetraceCntB    equ    23    ; 1
  1144. OldInstrNumA:    equ    24    ; 1
  1145. OldInstrNumB:    equ    25    ; 1
  1146.  
  1147. OrgPeriod    equ    26    ; 2
  1148. MainPeriod:    equ    28    ; 2
  1149. OldPeriod:    equ    30    ; 2
  1150.  
  1151. PlayPointer    equ    32    ; 1
  1152. Oldd0        equ    34    ; 2
  1153. Oldd1        equ    36    ; 2
  1154. Oldd2        equ    38    ; 2
  1155. Oldd3        equ    40    ; 2
  1156. Oldd4        equ    42    ; 2
  1157. Oldd5        equ    44    ; 2
  1158. Oldd6        equ    46    ; 2
  1159. loopsdataschanA    equ    48    ; 4
  1160. loopsdataschanB    equ    52    ; 4
  1161. BACKWDenable:    equ    56    ; 1
  1162. EqNewSamA    equ    57    ; 1
  1163. EqNewSamB    equ    58    ; 1
  1164. MainDTALEN:    equ    60    ; 2
  1165. PortUpOldValA    equ    62    ; 1
  1166. PortUpOldValB    equ    63    ; 1
  1167. PortDownOldValA    equ    64    ; 1
  1168. PortDownOldValB    equ    65    ; 1
  1169. VibratoDatasA    equ    66    ; 4
  1170. VibratoDatasB    equ    70    ; 4
  1171. GlissandoDatasA    equ    74    ; 6
  1172. GlissandoDatasB    equ    80    ; 6
  1173.  
  1174. NoteDelayPeriodA    equ    86    ; 2
  1175. NoteDelayInstrNumA    equ    88    ; 2
  1176. NoteDelayPeriodB    equ    90    ; 2
  1177. NoteDelayInstrNumB    equ    92    ; 2
  1178.  
  1179. PanPos        equ    94    ; 4
  1180. OnOffChanA    equ    98    ; 1
  1181. OnOffChanB    equ    99    ; 1
  1182. OrgPeriodARP    equ    100    ; 2
  1183. NoteCount    equ    102    ; 2
  1184. VolEnvTime    equ    104    ; 2
  1185. VolEnvOff    equ    106    ; 1
  1186. VolEnvMode    equ    107    ; 1
  1187.  
  1188.  
  1189. ;----------------------------------------------
  1190.  
  1191.  
  1192. ahibase:    dc.l    0
  1193. ahi_ctrl:    dc.l    0
  1194.  
  1195. ahi_ctrltags:
  1196.         dc.l    AHIC_Play,1
  1197.         dc.l    TAG_DONE
  1198. ahi_tags
  1199.         dc.l    AHIA_MixFreq
  1200. ahi_freq
  1201.         dc.l    32000
  1202.         dc.l    AHIA_Channels
  1203. ahi_chan:
  1204.         dc.l    8
  1205.         dc.l    AHIA_Sounds,1
  1206.         dc.l    AHIA_AudioID
  1207. ahi_audioid
  1208.         dc.l    $00020004    ; 2 pan, 4 stereo, 6 mono   8 8bit pan
  1209.         dc.l    AHIA_SoundFunc,SoundFunc
  1210.         dc.l    AHIA_PlayerFunc,PlayerFunc
  1211.         dc.l    AHIA_PlayerFreq,50
  1212.         dc.l    AHIA_MinPlayerFreq,32*2/5
  1213.         dc.l    AHIA_MaxPlayerFreq,255*2/5
  1214.         dc.l    TAG_DONE
  1215.  
  1216. ahi_sound0:
  1217.         dc.l    AHIST_M8S
  1218. ahi_sta    dc.l    0            ; start
  1219. ahi_len    dc.l    -1                ; len
  1220.  
  1221. AHI_VOLBOOST:
  1222.         dc.l    Ahiet_MasterVolume
  1223. AHIBoost
  1224.         dc.l    $10000
  1225.         dc.l    TAG_DONE
  1226.  
  1227.  
  1228. PlayerFunc:
  1229.         blk.b    MLN_SIZE
  1230.         dc.l    mmusic
  1231.         dc.l    0
  1232.         dc.l    0
  1233.  
  1234. SoundFunc:
  1235.         blk.b    MLN_SIZE
  1236.         dc.l    soundfunc2
  1237.         dc.l    0
  1238.         dc.l    0
  1239.  
  1240. RecordFunc:
  1241.         blk.b    MLN_SIZE
  1242.         dc.l    RecordFuncS
  1243.         dc.l    0
  1244.         dc.l    0
  1245.  
  1246.     STRUCTURE RecordData,0
  1247.     BYTE    signal
  1248.     BYTE    pad
  1249.     ULONG    signalflag
  1250.     APTR    AHIbuffer1
  1251.     APTR    AHIbuffer2
  1252.     ULONG    bufferlen
  1253.     ULONG    AHIcount
  1254.     ULONG    offs
  1255.     APTR    AHItask
  1256.     LABEL    RecordData_SIZEOF
  1257.  
  1258.  
  1259. *    A0 - (struct Hook *)
  1260. *    A2 - (struct AHIAudioCtrl *)
  1261. *    A1 - (struct AHIRecordMessage *)
  1262. *The message (AHIRecordMessage) is filled as follows:
  1263. *    ahirm_Type - Always AHIST_S16S at the moment, but you *must*
  1264. *        check this, since it may change in the future!
  1265. *    ahirm_Buffer - Pointer to the samples. The buffer is valid
  1266. *        until next time the Hook is called.
  1267. *    ahirm_Length - Number of sample FRAMES in buffer.
  1268. *        To get the size in bytes, multiply by 4 if ahiim_Type is
  1269. *        AHIST_S16S.
  1270.  
  1271.  
  1272. RecordFuncS:
  1273.     movem.l    d2-d7/a2-a6,-(sp)
  1274.  
  1275.  
  1276. ;    lea    RecordStruct,a1
  1277.  
  1278.     move.l    a2,-(sp)
  1279. * Check if we know the sample format
  1280.     cmp.l    #AHIST_S16S,ahirm_Type(a1)
  1281.     bne.b    .X5$                ; Unknown format!
  1282.  
  1283.     move.l    h_Data(a0),a0            ; Get pointer to RecordData structure
  1284.     move.l    ahirm_Length(a1),d0        ; Sample frames in buffer
  1285.     move.l    ahirm_Buffer(a1),a1        ; The samples themselves
  1286.     move.l    AHIbuffer1(a0),a2            ; Our own buffer
  1287.     add.l    offs(a0),a2
  1288.  
  1289.  
  1290.     cmp.l    AHIcount(a0),d0            ; Will all samples fit in our buffer?
  1291.     bls.b    .X3$                ; Branch if yes.
  1292.  
  1293. ; Fill buffer until it's full
  1294.     move.l    AHIcount(a0),d1            ; Number of samples left
  1295.     beq.b    .X2$                ; Buffer already full? Skip 1st pass.
  1296.     sub.l    d1,d0                ; d0 = # of samples in second pass.
  1297. .X1$
  1298.     move.l    (a1)+,(a2)+            ; Move both left & right word
  1299.     subq.l    #1,d1                ; We can't use dbf/dbra here.
  1300.     bne.b    .X1$
  1301. .X2$
  1302.     move.l    AHIbuffer2(a0),a2            ; Swap pointers to 1st and 2nd buffer
  1303.     move.l    AHIbuffer1(a0),AHIbuffer2(a0)
  1304.     move.l    a2,AHIbuffer1(a0)
  1305.     move.l    bufferlen(a0),AHIcount(a0)        ; Init count
  1306.     clr.l    offs(a0)
  1307.     movem.l    d0/a0-a1/a6,-(sp)
  1308.     move.l    4.w,a6
  1309.     move.l    AHItask(a0),a1
  1310.     move.l    signalflag(a0),d0
  1311.     jsr    _LVOSignal(a6)            ; Tell main task buffer is ready
  1312.     movem.l    (sp)+,d0/a0-a1/a6
  1313.  
  1314. * Now fill the rest of the new buffer and exit.
  1315.  
  1316. .X3$
  1317.     sub.l    d0,AHIcount(a0)            ; Update count
  1318.     move.l    d0,d1
  1319.     lsl.l    #2,d1
  1320.     add.l    d1,offs(a0)
  1321. .X4$
  1322.     move.l    (a1)+,(a2)+            ; Move both left & right word
  1323.     subq.l    #1,d0
  1324.     bne.b    .X4$
  1325. .X5$
  1326.     move.l    (sp)+,a2
  1327.     moveq    #0,d0
  1328.  
  1329.  
  1330.     movem.l    (sp)+,d2-d7/a2-a6
  1331.     rts
  1332.  
  1333.  
  1334. ;in:
  1335. * a0        struct Hook *                  
  1336. * a1        struct AHISoundMessage *         
  1337. * a2        struct AHIAudioCtrl *           
  1338.  
  1339.  
  1340. soundfunc2:
  1341.     movem.l    d2-d4/a6,-(sp)
  1342.     moveq    #0,d0
  1343.     move.w    ahism_Channel(a1),d0
  1344.     lea    ahi_channels,a0
  1345.     lsl.w    #2,d0
  1346.     move.w    2(a0,d0.w),d1
  1347.     and.w    #$00ff,d1
  1348.     move.w    (a0,d0.w),d7
  1349.     lsl.l    #4,d1
  1350.  
  1351.  
  1352.     lea    ahi_samples,a0
  1353.     move.l    (a0,d1.w),d2            ;sample start
  1354.     cmp.l    #0,Ahi_Sound0
  1355.     beq.s    .no16bit_1
  1356.     lsr.l    #1,d2
  1357. .no16bit_1
  1358.  
  1359.     tst.w    NoLoopEnable
  1360.     beq.s    .noloop1
  1361.     moveq    #0,d3
  1362.     bra.s    .noloop2
  1363. .noloop1
  1364.  
  1365.     add.l    8(a0,d7.w),d2            ;repeat start
  1366.     move.l    12(a0,d7.w),d3            ;repeat length
  1367.  
  1368. .noloop2
  1369.  
  1370.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1371. ;----------------------------
  1372.     lea    LoopTab,a0
  1373.     move.w    d7,d1
  1374.     moveq    #0,d7
  1375.     lsr.w    #4,d1
  1376.     btst    #1,(a0,d1.w)
  1377.     beq.s    .nopingpong
  1378.     moveq    #0,d4
  1379.     lea    ahi_channels,a0
  1380.     move.b    2(a0,d0.w),d4
  1381.     subq.w    #1,d4
  1382.     muls    #-1,d4
  1383.     move.b    d4,2(a0,d0.w)
  1384.     moveq    #1,d7
  1385. .nopingpong
  1386. ;----------------------------
  1387.  
  1388.     lsr.l    #2,d0                ; chnnum
  1389.     moveq    #0,d1                ;sample bank
  1390.  
  1391.     tst.l    d3
  1392.     beq.w    .length_0
  1393.  
  1394.     tst.w    d7                ; gdy ping pong loop
  1395.     bne.w    .pingpongproc
  1396.  
  1397.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1398.     bgt.w    .length_ok
  1399.     cmp.l    #512,d3
  1400.     bge.w    .length_ok
  1401.  
  1402.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1403.     bne.s    .16bitproc
  1404.  
  1405. .8bitproc:
  1406.     movem.l    d0-d1/d4-a2,-(sp)
  1407.  
  1408.     lea    SamBuff,a0
  1409.     mulu    #1024+[16],d0
  1410.     add.w    d0,a0
  1411.  
  1412.     cmp.l    (a0),d2
  1413.     bne.s    .notakedata
  1414.     cmp.l    4(a0),d3
  1415.     beq.s    .takedata
  1416. .notakedata
  1417.     move.l    d2,(a0)
  1418.     move.l    d3,4(a0)
  1419.  
  1420.     add.l    #16,a0
  1421.     move.l    d2,a1
  1422.     move.l    a0,d2
  1423.     move.l    d2,-8(a0)
  1424.  
  1425.     move.l    d3,d7
  1426.     move.l    #1024,d6
  1427.     divu    d7,d6
  1428.     and.l    #$ffff,d6
  1429.     move.l    d7,d3
  1430.     mulu    d6,d3
  1431.     move.l    d3,-4(a0)
  1432.  
  1433.     subq    #1,d6
  1434.     subq    #1,d7
  1435.     move.l    a1,d4
  1436.     move.l    d7,d5
  1437. .makebuffloopM
  1438.     move.l    d4,a1
  1439.     move.l    d5,d7
  1440. .makebuff
  1441.     move.b    (a1)+,(a0)+
  1442.     dbf    d7,.makebuff
  1443.     dbf    d6,.makebuffloopM
  1444.     bra.s    .makebuffdone
  1445. .takedata
  1446.     move.l    8(a0),d2
  1447.     move.l    12(a0),d3
  1448. .makebuffdone
  1449.     movem.l    (sp)+,d0-d1/d4-a2
  1450.     bra.w    .length_ok
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456. .16bitproc:
  1457.     cmp.l    #512/2,d3
  1458.     bge.w    .length_ok
  1459.  
  1460.     movem.l    d0-d1/d4-a2,-(sp)
  1461.  
  1462.     lea    SamBuff,a0
  1463.     mulu    #1024+[16],d0
  1464.     add.w    d0,a0
  1465.  
  1466.     cmp.l    (a0),d2
  1467.     bne.s    .notakedata16
  1468.     cmp.l    4(a0),d3
  1469.     beq.s    .takedata16
  1470. .notakedata16
  1471.     move.l    d2,(a0)
  1472.     move.l    d3,4(a0)
  1473.  
  1474.     add.l    #16,a0
  1475.     move.l    d2,a1
  1476.     add.l    d2,a1
  1477.     move.l    a0,d2
  1478.     move.l    d2,-8(a0)
  1479.  
  1480.     move.l    d3,d7
  1481.     move.l    #1024/2,d6
  1482.     divu    d7,d6
  1483.     and.l    #$ffff,d6
  1484.     move.l    d7,d3
  1485.     mulu    d6,d3
  1486.     move.l    d3,-4(a0)
  1487.  
  1488.     subq    #1,d6
  1489.     subq    #1,d7
  1490.     move.l    a1,d4
  1491.     move.l    d7,d5
  1492. .makebuffloopM16
  1493.     move.l    d4,a1
  1494.     move.l    d5,d7
  1495. .makebuff16
  1496.     move.w    (a1)+,(a0)+
  1497.     dbf    d7,.makebuff16
  1498.     dbf    d6,.makebuffloopM16
  1499.     bra.s    .makebuffdone16
  1500. .takedata16
  1501.     move.l    8(a0),d2
  1502.     move.l    12(a0),d3
  1503. .makebuffdone16
  1504.     cmp.l    #0,Ahi_Sound0
  1505.     beq.s    .no16bit_2
  1506.     lsr.l    #1,d2
  1507. .no16bit_2
  1508.     movem.l    (sp)+,d0-d1/d4-a2
  1509.     bra.w    .length_ok
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515. .pingpongproc:
  1516.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1517.     bgt.w    .length_ok
  1518.     cmp.l    #512/2,d3            ; ping pong musi miec parzyste
  1519.     bge.w    .length_ok
  1520.  
  1521.  
  1522.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1523.     bne.w    .16bitprocpp
  1524.  
  1525.  
  1526. .8bitproc_pp:
  1527.     movem.l    d0-d1/d4-a2,-(sp)
  1528.  
  1529.     lea    SamBuff,a0
  1530.     mulu    #1024+[16],d0
  1531.     add.w    d0,a0
  1532.  
  1533.     cmp.l    (a0),d2
  1534.     bne.s    .notakedata_pp
  1535.     cmp.l    4(a0),d3
  1536.     beq.s    .takedata_pp
  1537. .notakedata_pp
  1538.     move.l    d2,(a0)
  1539.     move.l    d3,4(a0)
  1540.  
  1541.     add.l    #16,a0
  1542.     move.l    d2,a1
  1543.     move.l    a0,d2
  1544.     move.l    d2,-8(a0)
  1545.  
  1546.     move.l    d3,d7
  1547.     move.l    #1024,d6
  1548.     divu    d7,d6
  1549.     and.l    #$ffff,d6
  1550.     move.l    d7,d3
  1551.     mulu    d6,d3
  1552.     move.l    d3,-4(a0)
  1553.  
  1554.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1555.  
  1556.     subq    #1,d6
  1557.     subq    #1,d7
  1558.     move.l    a1,d4
  1559.     move.l    d7,d5
  1560. .makebuffloopM_pp
  1561.     move.l    d4,a1
  1562.     move.l    d5,d7
  1563. .makebuff_pp
  1564.     move.b    (a1)+,(a0)+
  1565.     dbf    d7,.makebuff_pp
  1566.  
  1567.  
  1568. ;    move.l    d4,a1
  1569.     move.l    d5,d7
  1570. .makebuff_pp2
  1571.     move.b    -(a1),(a0)+
  1572.     dbf    d7,.makebuff_pp2
  1573.  
  1574.  
  1575.     dbf    d6,.makebuffloopM_pp
  1576.     bra.s    .makebuffdone_pp
  1577. .takedata_pp
  1578.     move.l    8(a0),d2
  1579.     move.l    12(a0),d3
  1580. .makebuffdone_pp
  1581.     movem.l    (sp)+,d0-d1/d4-a2
  1582.  
  1583.     moveq    #0,d4
  1584.     bra.w    .length_ok
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.  
  1592. .16bitprocpp:
  1593.     cmp.l    #512/2/2,d3
  1594.     bge.w    .length_ok
  1595.  
  1596.     movem.l    d0-d1/d4-a2,-(sp)
  1597.  
  1598.     lea    SamBuff,a0
  1599.     mulu    #1024+[16],d0
  1600.     add.w    d0,a0
  1601.  
  1602.     cmp.l    (a0),d2
  1603.     bne.s    .notakedata16pp
  1604.     cmp.l    4(a0),d3
  1605.     beq.s    .takedata16pp
  1606. .notakedata16pp
  1607.     move.l    d2,(a0)
  1608.     move.l    d3,4(a0)
  1609.  
  1610.     add.l    #16,a0
  1611.     move.l    d2,a1
  1612.     add.l    d2,a1
  1613.     move.l    a0,d2
  1614.     move.l    d2,-8(a0)
  1615.  
  1616.     move.l    d3,d7
  1617.     move.l    #1024/2,d6
  1618.     divu    d7,d6
  1619.     and.l    #$ffff,d6
  1620.     move.l    d7,d3
  1621.     mulu    d6,d3
  1622.     move.l    d3,-4(a0)
  1623.  
  1624.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1625.  
  1626.     subq    #1,d6
  1627.     subq    #1,d7
  1628.     move.l    a1,d4
  1629.     move.l    d7,d5
  1630. .makebuffloopM16pp
  1631.  
  1632.  
  1633.     move.l    d4,a1
  1634.     move.l    d5,d7
  1635. .makebuff16pp
  1636.     move.w    (a1)+,(a0)+
  1637.     dbf    d7,.makebuff16pp
  1638.  
  1639. ;    move.l    d4,a1
  1640.     move.l    d5,d7
  1641. .makebuff16pp2
  1642.     move.w    -(a1),(a0)+
  1643.     dbf    d7,.makebuff16pp2
  1644.  
  1645.  
  1646.     dbf    d6,.makebuffloopM16pp
  1647.     bra.s    .makebuffdone16pp
  1648. .takedata16pp
  1649.     move.l    8(a0),d2
  1650.     move.l    12(a0),d3
  1651. .makebuffdone16pp
  1652.     cmp.l    #0,Ahi_Sound0
  1653.     beq.s    .no16bit_2pp
  1654.     lsr.l    #1,d2
  1655. .no16bit_2pp
  1656.     movem.l    (sp)+,d0-d1/d4-a2
  1657.  
  1658.     moveq    #0,d4
  1659.     bra.w    .length_ok
  1660.  
  1661.  
  1662.  
  1663.  
  1664.  
  1665. .length_0
  1666.     moveq    #AHI_NOSOUND,d1
  1667. .length_ok
  1668.  
  1669.     lea    SampleOffsets,a6
  1670.  
  1671.     cmp.l    #AHI_NOSOUND,d1
  1672.     bne.s    .nozero
  1673.     cmp.l    (a6,d0.w*4),d2
  1674.     beq.s    .nozero
  1675.  
  1676. ; --------------------------------------- ;
  1677.     lea    SampleOffsetsFT,a6
  1678.     tst.b    (a6,d0.w)
  1679.     beq.s    .okft1
  1680.     clr.b    (a6,d0.w)
  1681.     bra.s    .nozero
  1682. .okft1
  1683. ; ^-------------------------------------- ;
  1684.  
  1685.     lea    SampleOffsets,a6
  1686.     move.l    #0,(a6,d0.w*4)            ;start
  1687. .nozero
  1688.  
  1689.     cmp.l    #0,(a6,d0.w*4)    
  1690.     beq.s    .zero
  1691.  
  1692.     lea    SampleOffsetsFT,a6
  1693.     tst.b    (a6,d0.w)
  1694.     beq.s    .okft2
  1695.     clr.b    (a6,d0.w)
  1696.     bra.s    .zero
  1697. .okft2
  1698. ; ^-------------------------------------- ;
  1699.     lea    SampleOffsets,a6
  1700.     move.l    d2,(a6,d0.w*4)            ;start
  1701. .zero
  1702.  
  1703.  
  1704.     tst.b    d4
  1705.     beq.s    .nopingpong2
  1706.  
  1707.     subq.l    #1,d3
  1708.     add.l    d3,d2
  1709.     subq.l    #1,d2
  1710.     not.l    d3
  1711.     bra.s    .yapingpong
  1712. .nopingpong2
  1713.     tst.w    d7
  1714.     beq.s    .yapingpong
  1715.     cmp.l    #0,(a6,d0.w*4)    
  1716.     beq.s    .yapingpong
  1717.     add.l    d3,(a6,d0.w*4)            ;start
  1718. .yapingpong
  1719.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1720.     move.l    ahibase(pc),a6
  1721.     jsr    _LVOAHI_SetSound(a6)
  1722.  
  1723.     movem.l    (sp)+,d2-d4/a6
  1724. .exit    rts
  1725.  
  1726.  
  1727. lastinstrnum:    dc.w    0
  1728.  
  1729. mmusic:
  1730.     movem.l    d0-a6,-(sp)
  1731.  
  1732.     jsr    db_music
  1733.  
  1734. ;       cmp.w    #1,MIXITENABLE
  1735. ;    bne.s    .ominit
  1736. ;    moveq    #0,d0
  1737. ;    move.w    EndSongPos,d0
  1738. ;    cmp.w    SOngPos,d0
  1739. ;    bne.s    .ominit
  1740. ;
  1741. ;
  1742. ;    moveq    #0,d0
  1743. ;    move.w    SongPos,d0
  1744. ;    add.w    d0,d0
  1745. ;    lea    SongOrders,a0
  1746. ;    move.w    (a0,d0.w),d0
  1747. ;    add.w    d0,d0
  1748. ;    lea    PattLens,a0
  1749. ;    move.w    (a0,d0.w),d0
  1750. ;    subq    #1,d0
  1751. ;
  1752. ;    moveq    #0,d1
  1753. ;    move.w    PattPos,d1
  1754. ;    cmp.w    d0,d1
  1755. ;    bne.s    .ominit
  1756. ;    move.w    #1,StopITNOW
  1757. ;.ominit
  1758.     tst.w    StopEnable
  1759.     beq.s    No_clr_volumes
  1760.     bsr    stop_play
  1761. No_clr_volumes
  1762.     movem.l    (sp)+,d0-a6
  1763.     rts
  1764.  
  1765. clr_volumes:
  1766.     moveq    #0,d0
  1767.     moveq    #0,d1
  1768.     move.w    TrackNumber,d7
  1769.     subq    #1,d7
  1770. init_vols
  1771.     movem.l    d0-a6,-(sp)
  1772.     jsr    ahi_volume
  1773.     movem.l    (sp)+,d0-a6
  1774.     addq    #1,d0
  1775.     dbf    d7,init_vols
  1776.     rts
  1777.  
  1778. stop_play:
  1779.     clr.w    StopEnable
  1780.     moveq    #0,d0
  1781.     moveq    #0,d1
  1782.     move.w    TrackNumber,d7
  1783.     subq    #1,d7
  1784. clr_vols
  1785.     movem.l    d0-a6,-(sp)
  1786.     moveq    #AHISF_IMM,d4
  1787.     moveq    #AHI_NOSOUND,d1
  1788.     move.l    ahibase,a6
  1789.     move.l    ahi_ctrl,a2
  1790.     jsr    _LVOAHI_SetSound(a6)
  1791.     movem.l    (sp)+,d0-a6
  1792.     addq    #1,d0
  1793.     dbf    d7,clr_vols
  1794.     rts
  1795.  
  1796.  
  1797. FreeShortSamBuff:
  1798.     movem.l    d0-a6,-(sp)
  1799.     lea    SamBuff,a0
  1800.     moveq    #32-1,d7
  1801. .freeshortsambuffloop
  1802.     clr.l    (a0)
  1803.     clr.l    4(a0)
  1804.     add.l    #1024+16,a0
  1805.     dbf    d7,.freeshortsambuffloop
  1806.     movem.l    (sp)+,d0-a6
  1807.     rts
  1808.  
  1809.  
  1810. ahi_init:
  1811. .retry    jsr    ahi_initmain
  1812.     tst.l    d0
  1813.     beq.s    .ok
  1814.     jsr    OpenAhiError2
  1815.     bra    .retry
  1816. .ok    rts
  1817.  
  1818.  
  1819. ahi_initstart:
  1820.     jsr    ahi_initmain
  1821.     rts
  1822.  
  1823. ahi_initmain:
  1824.     OPENAHI    1
  1825.     move.l    d0,ahibase
  1826.     beq.w    ahi_eror_at_start
  1827.  
  1828.     move.l    d0,a6
  1829.     lea    ahi_tags(pc),a1
  1830.     jsr    _LVOAHI_AllocAudioA(a6)
  1831.     move.l    d0,ahi_ctrl
  1832.     beq.w    ahi_eror
  1833.  
  1834.     move.l    d0,a2
  1835.     moveq    #0,d0                ;Load module as one sound!
  1836.     moveq    #AHIST_SAMPLE,d1
  1837.     lea    ahi_sound0(pc),a0
  1838.     jsr    _LVOAHI_LoadSound(a6)
  1839.     tst.l    d0
  1840.     bne.w    ahi_eror_allocaudio_ok
  1841.  
  1842.     lea    ahi_ctrltags(pc),a1
  1843.     jsr    _LVOAHI_ControlAudioA(a6)
  1844.     tst.l    d0
  1845.     bne.w    ahi_eror_allocaudio_ok
  1846.  
  1847.     move.w    CiaTempo,d7
  1848.     and.l    #$ffff,d7
  1849.     lsl.w    #1,d7
  1850.     divu    #5,d7
  1851.     and.l    #$ffff,d7
  1852.     move.l    d7,afreq
  1853.  
  1854.     move.l    ahibase(pc),a6
  1855.     lea    atags(pc),a1
  1856.     move.l    ahi_ctrl(pc),a2
  1857.     jsr    _LVOAHI_ControlAudioA(a6)
  1858.  
  1859.     move.l    ahibase,a6
  1860.     move.l    #AHI_VOLBOOST,a0
  1861.     move.l    ahi_ctrl,a2
  1862.     jsr    _LVOAHI_Seteffect(a6)
  1863.  
  1864.     moveq    #0,d0
  1865.     rts
  1866.  
  1867. ahi_eror_at_start:
  1868.     moveq    #-1,d0
  1869.     rts
  1870.  
  1871. ahi_eror:
  1872.     CLOSEAHI
  1873.     moveq    #-1,d0
  1874.     rts
  1875.  
  1876.  
  1877. ahi_eror_allocaudio_ok:
  1878.     bsr    ahi_end
  1879.     moveq    #-1,d0
  1880.     rts
  1881.  
  1882. ahi_end:
  1883.     move.l    ahibase(pc),d0
  1884.     beq.b    .exit
  1885.     move.l    d0,a6
  1886.     move.l    ahi_ctrl(pc),a2
  1887.     jsr    _LVOAHI_FreeAudio(a6)
  1888.  
  1889.     CLOSEAHI
  1890. .exit
  1891.     rts
  1892.  
  1893.  
  1894. db_init:
  1895.     move.w    GeneralTempo,CiaTempo
  1896.     moveq    #0,d0
  1897.     move.w    GeneralSpeed,d0
  1898.     move.b    d0,Orgtemp
  1899.  
  1900.     move.l    4.w,a6    
  1901.     move.w    296(a6),d0    
  1902.  
  1903. MC68000:
  1904.     btst    #0,d0
  1905.     beq.s    MC68010
  1906.     move.b    #1,OldCPU
  1907. MC68010:
  1908.     btst    #1,d0
  1909.     beq.s    MC68020
  1910.     clr.b    OldCPU
  1911. MC68020:
  1912.     btst    #2,d0
  1913.     beq.s    MC68030
  1914.     clr.b    OldCPU
  1915. MC68030:
  1916.     btst    #3,d0
  1917.     beq.s    MC68040
  1918.     clr.b    OldCPU
  1919. MC68040:
  1920.     clr.w    SongPos
  1921.     clr.w    PattPos
  1922.     clr.b    count
  1923.  
  1924.     bset    #1,$bfe001
  1925.     move.b    Orgtemp,count
  1926.     rts
  1927.  
  1928.  
  1929. SongPos:    dc.w    0
  1930. PattPos:    dc.w    0
  1931. OldPattPos:    dc.w    0
  1932.  
  1933. OldCPU:        dc.b    0
  1934. temp:        dc.b    0
  1935. count:        dc.b    0
  1936. count2:        dc.b    0
  1937. JMPEN:        dc.b    0
  1938. PauseEn:    dc.b    0
  1939. hisam:        dc.b    0
  1940.         even
  1941.  
  1942. PauseVBL:    dc.w    0
  1943. OldDepAdr:    dc.l    0
  1944. ;modDIGI:    dc.l    0
  1945. channelenable:    dc.w    0
  1946. MixPeriodA:    dc.w    0
  1947. MixPeriodB:    dc.w    0
  1948. leng:        dc.w    0
  1949. what:        dc.w    0
  1950. CiaTempo:    dc.w    0
  1951. CiaChanged:    dc.w    0
  1952. GlobalVol:    dc.w    64
  1953.  
  1954. ; ------------------- Paremeters --------------
  1955. MainVolValue:    dc.w    64    ; 0-64
  1956.  
  1957.  
  1958. db_music:
  1959. ; free a0,a2,a3,
  1960.  
  1961.     move.b    count2(pc),d7
  1962.     cmp.b    temp(pc),d7
  1963.     blt.s    .NoNewPos
  1964.     clr.b    count2
  1965. .NoNewPos
  1966.  
  1967.  
  1968.     lea    SamVol,a4
  1969.  
  1970.  
  1971.     tst.b    temp
  1972.     beq.w    DepackDone
  1973.  
  1974.     move.b    count(pc),d7
  1975.     cmp.b    temp(pc),d7
  1976.     blt    DepackDone
  1977.  
  1978.     moveq    #0,d6
  1979.     moveq    #0,d7
  1980.     move.w    OrdNum,d7
  1981.     move.w    SongPos(pc),d6
  1982.     cmp.w    d6,d7
  1983.     bge.s    NoRepeatSong
  1984.     clr.w    SongPos
  1985.     clr.w    PattPos
  1986.     move.l    PattAdresses,a1
  1987. NoRepeatSong:
  1988.  
  1989.     moveq    #0,d7
  1990.     move.w    SongPos(pc),d7
  1991.     lea    SongOrders,a0
  1992.     add.w    d7,d7
  1993.     move.w    (a0,d7.w),d7
  1994.     lsl.w    #2,d7
  1995.     lea    PattAdresses,a1
  1996.     move.l    (a1,d7.w),a1
  1997.  
  1998. ;    tst.b    PackEnable(a5)
  1999. ;    bne.s    DepackPattern
  2000.  
  2001.     moveq    #0,d7
  2002.     move.w    PattPos(pc),d7
  2003.     moveq    #0,d6
  2004.     move.w    TrackNumber,d6
  2005.     mulu    #6,d6
  2006.     mulu    d6,d7
  2007.     add.w    d7,a1
  2008.  
  2009.     lea    UnPackedData,a6
  2010.     move.l    a1,-(sp)
  2011.     moveq    #0,d7
  2012.     move.w    TrackNumber,d7
  2013.     mulu    #6,d7
  2014.     lsr.w    #2,d7
  2015.     subq    #1,d7
  2016. CopyDataLoop
  2017.     move.l    (a1)+,(a6)+
  2018.     dbf    d7,CopyDataLoop
  2019.     move.l    (sp)+,a1
  2020.  
  2021. DepackDone
  2022.  
  2023. DB_musicMAIN:
  2024.  
  2025.     lea    UnPackedData,a1
  2026.  
  2027. ***************
  2028.     tst.b    SPAHIENABLE
  2029.     bne.s    ominplaykey
  2030. ***************
  2031.  
  2032.     moveq    #0,d6
  2033.     moveq    #0,d0
  2034.     lea    Channel1,a6
  2035.     moveq    #0,d7
  2036.     move.w    TrackNumber,d7
  2037.     subq    #1,d7
  2038. channelsloopM:
  2039.     movem.l    d0/d7/a6,-(sp)
  2040.     bsr    playvoice
  2041.     movem.l    (sp)+,d0/d7/a6
  2042.     lea    ChanArea(a6),a6
  2043.     addq    #1,d0
  2044.     dbf    d7,ChannelsLoopM
  2045.  
  2046. ***************
  2047.     bra.s    noominplaykey
  2048. ominplaykey
  2049.     clr.b    SPAHIENABLE
  2050. noominplaykey
  2051. ***************
  2052.  
  2053.  
  2054.     move.w    SongPos,OldSPos
  2055.  
  2056.  
  2057.     lea    channel1,a6
  2058.     bsr    MIXCHAN
  2059.  
  2060.     tst.b    temp
  2061.     beq.w    No_new
  2062.  
  2063.     tst.w    PauseVBL
  2064.     beq.s    NoPause
  2065.     move.b    #1,PauseEn
  2066.     subq.w    #1,PauseVBL
  2067. NoPause:
  2068.  
  2069.     move.b    count(pc),d7
  2070.     cmp.b    temp(pc),d7
  2071.     blt.s    NoNEWPos
  2072.     clr.b    count
  2073.  
  2074.     tst.w    PauseVBL
  2075.     bne.s    DoPAUSE
  2076.  
  2077.     addq.w    #1,pattpos
  2078.     clr.b    PauseEn
  2079.  
  2080.     tst.b    temp
  2081.     beq.s    NoNewPos
  2082.  
  2083.     move.l    a0,-(sp)
  2084.     moveq    #0,d7
  2085.     move.w    SongPos(pc),d7
  2086.     lea    SongOrders,a0
  2087.     add.w    d7,d7
  2088.     move.w    (a0,d7.w),d7
  2089.     lsl.w    #1,d7
  2090.     lea    PattLens,a0
  2091.     move.w    (a0,d7.w),d7
  2092.     move.l    (sp)+,a0
  2093.  
  2094.     moveq    #0,d3
  2095.     move.w    PattPos,d3
  2096.     cmp.w    d7,d3
  2097.     blt.s    NoNewPos
  2098. .newpos
  2099.     clr.w    PattPos
  2100.     addq.w    #1,SongPos
  2101. NoNewPos:
  2102.  
  2103. DoPAUSE
  2104.     addq.b    #1,count
  2105.     addq.b    #1,count2
  2106. *
  2107.     tst.w    PlayPattEn
  2108.     beq.s    .ok
  2109.     move.w    OldSpos,d7
  2110.     cmp.w    SongPos,d7
  2111.     beq.s    .ok
  2112.     move.w    d7,SongPos
  2113. .ok
  2114. *
  2115. No_NEW
  2116.     rts
  2117.  
  2118. playvoice:
  2119.     moveq    #0,d1
  2120.     move.w    MainVol(a6),d1
  2121.     cmp.l    #$40*256,d1
  2122.     ble.s    .okV1
  2123.     move.l    #$40*256,d1
  2124. .okV1
  2125.     move.l    d0,-(sp)
  2126.     moveq    #0,d0
  2127.     move.w    GlobalVol,d0
  2128.  
  2129.     cmp.w    #$40,d0
  2130.     ble.s    .okV2
  2131.     moveq    #$40,d0
  2132. .okV2
  2133.     mulu    d0,d1
  2134.     move.l    (sp)+,d0
  2135.     divu    #64,d1
  2136.     and.l    #$ffff,d1
  2137.     lsl.l    #2,d1
  2138.     bsr    ahi_volume
  2139.  
  2140.     moveq    #0,d1
  2141.     move.w    MainPeriod(a6),d1
  2142.     bsr    ahi_period
  2143.     move.w    MainPeriod(a6),OldPeriod(a6)
  2144.  
  2145.     movem.l    d0-a6,-(sp)
  2146.     move.l    LastFreq,d2
  2147.  
  2148.     moveq    #0,d3
  2149.     move.w    CiaTempo,d3
  2150.  
  2151.     divu    #50,d2
  2152.     and.l    #$ffff,d2
  2153.     mulu    #125,d2
  2154.     divu    d3,d2
  2155.     and.l    #$ffff,d2
  2156.  
  2157.     lea    SampleOffsets,a4
  2158.     cmp.l    #0,(a4,d0.w*4)
  2159.     beq.w    .zero
  2160.  
  2161.  
  2162.     lea    ahi_channels,a3
  2163.     move.b    2(a3,d0.w*4),d4
  2164.  
  2165.     lea    LoopTab,a5
  2166.     moveq    #0,d1
  2167.     move.w    OldD1(a6),d1
  2168.     lsr.w    #2,d1
  2169.     addq    #1,d1
  2170.     btst    #1,(a5,d1.w)
  2171.     beq.s    .nopingpong
  2172.     eor.b    #1,d4
  2173. .nopingpong
  2174.  
  2175.     tst.b    d4
  2176.     beq.s    .add
  2177.     sub.l    d2,(a4,d0.w*4)            ;start
  2178.     bra.s    .zero
  2179. .add
  2180.     add.l    d2,(a4,d0.w*4)            ;start
  2181. .zero
  2182.     movem.l    (sp)+,d0-a6
  2183.  
  2184.  
  2185.  
  2186.  
  2187.     moveq    #0,d1
  2188.     move.w    OldD1(a6),d1
  2189.     bsr    ahi_sample
  2190.     rts
  2191.  
  2192. ahi_volume:
  2193.     movem.l    d0-d3/a0-a2/a6,-(sp)
  2194.     move.l    ahibase,a6
  2195.  
  2196.     lea    Channel1+PANPOS,a2
  2197.     moveq    #0,d2
  2198.     move.w    d0,d2
  2199.     mulu    #ChanArea,d2
  2200.     move.l    (a2,d2.w),d2
  2201.  
  2202.     movem.l    d0-a6,-(sp)
  2203.     moveq    #AHISF_IMM,d3
  2204.     move.l    ahi_ctrl,a2
  2205.     jsr    _LVOAHI_SetVol(a6)
  2206.     movem.l    (sp)+,d0-a6
  2207.  
  2208.     movem.l    (sp)+,d0-d3/a0-a2/a6
  2209.     rts
  2210.  
  2211. LastFreq:    dc.l    0
  2212.  
  2213. ahi_period:
  2214.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2215.  
  2216. ;    tst.b    OffEnable(a6)
  2217. ;    beq.w    .exit
  2218.  
  2219.     tst.l    d1
  2220.     beq.b    .exit
  2221.  
  2222.     move.l    #3546895*4,d2
  2223.     divu.l    d1,d2
  2224.     move.l    d2,d1
  2225.  
  2226.     move.l    d1,LastFreq
  2227.  
  2228.  
  2229.     moveq    #0,d7
  2230.     move.w    Mainperiod(a6),d7
  2231.     cmp.w    OldPeriod(a6),d7
  2232.     beq.s    .nonote
  2233.  
  2234.     cmp.l    #262142,d1
  2235.     ble.s    .ok
  2236.     clr.b    OffEnable(a6)
  2237.     moveq    #AHISF_IMM,d4
  2238.     moveq    #AHI_NOSOUND,d1
  2239.     move.l    ahibase,a6
  2240.     move.l    ahi_ctrl,a2
  2241.     jsr    _LVOAHI_SetSound(a6)
  2242.     bra.s    .exit
  2243. ;    move.l    #262142,d1
  2244. .ok
  2245.  
  2246.     move.l    ahibase,a6
  2247.     moveq    #AHISF_IMM,d2
  2248.     move.l    ahi_ctrl,a2
  2249.     jsr    _LVOAHI_SetFreq(a6)
  2250. .exit
  2251. .nonote
  2252.  
  2253.     movem.l    (sp)+,d0-d2/a0-a2/a6
  2254.     rts
  2255.  
  2256.  
  2257. ahi_sample:
  2258.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2259.  
  2260.     tst.b    OffEnable(a6)
  2261.     beq.w    .exit
  2262.     clr.b    OffEnable(a6)
  2263.  
  2264.     moveq    #0,d3
  2265.     cmp.w    #$e40,Oldd2(a6)
  2266.     beq.w    .playmain
  2267.     cmp.w    #$e40,Oldd6(a6)
  2268.     beq.w    .playmain
  2269.  
  2270.     move.w    Oldd2(a6),d2
  2271.     lsr.w    #8,d2
  2272.     cmp.b    #3,d2
  2273.     beq.w    .exit
  2274.     cmp.b    #5,d2
  2275.     beq.w    .exit
  2276.     move.w    Oldd6(a6),d6
  2277.     lsr.w    #8,d6
  2278.     cmp.b    #3,d6
  2279.     beq.w    .exit
  2280.     cmp.b    #5,d6
  2281.     beq.w    .exit
  2282.  
  2283. ; ---------------------- calc sam offset
  2284.     moveq    #0,d4
  2285.     moveq    #0,d7
  2286.     move.b    SamOffsetA(a6),d7
  2287.     lsl.w    #8,d7
  2288.     lsl.l    #8,d7
  2289.  
  2290.     cmp.b    #$9,d2
  2291.     bne.s    .nosamoffset1
  2292.     add.l    d7,d4
  2293.     moveq    #0,d7
  2294.     move.w    OldD2(a6),d7
  2295.     and.w    #$00ff,d7
  2296.     lsl.w    #8,d7
  2297.     add.l    d7,d4
  2298.     lsr.w    #8,d7
  2299.     tst.w    d7
  2300.     beq.s    .nosend1
  2301.     move.w    d7,SlideSamOffset(a6)
  2302. .nosend1
  2303.     moveq    #0,d7
  2304. .nosamoffset1
  2305.     cmp.b    #$9,d6
  2306.     bne.s    .nosamoffset2
  2307.     add.l    d7,d4
  2308.     moveq    #0,d7
  2309.     move.w    OldD6(a6),d7
  2310.     and.w    #$00ff,d7
  2311.     lsl.w    #8,d7
  2312.     add.l    d7,d4
  2313.     move.l    d4,d7
  2314.     lsr.l    #8,d7
  2315.     tst.w    d7
  2316.     beq.s    .nosend2
  2317.     move.w    d7,SlideSamOffset(a6)
  2318. .nosend2
  2319. .nosamoffset2
  2320.  
  2321.     moveq    #0,d4
  2322.     move.w    SlideSamOffset(a6),d4
  2323.     lsl.l    #8,d4
  2324. ; --------------------------------------
  2325.  
  2326.  
  2327.     lea    Instruments,a0
  2328.     move.l    d1,d7
  2329.     lsl.w    #2,d7
  2330.     add.l    #16,d7
  2331.     and.l    #$ffff,d7
  2332.  
  2333.     lsr.l    #1,d1
  2334.     moveq    #0,d2
  2335.     move.w    2(a0,d1.w),d2
  2336.  
  2337. ; -------------------------------- do sample cursora
  2338.     cmp.w    InstrNum,d2
  2339.     bne.s    .notthis
  2340.     move.w    d0,ACTCHAN
  2341. .notthis
  2342. ; ----------------------------------------------------
  2343.  
  2344.     subq    #1,d2
  2345.     lsl.l    #2,d2
  2346.     move.l    d2,d1
  2347.  
  2348.     move.l    d1,d2
  2349.     addq.l    #4,d2
  2350.     lsr.l    #2,d2
  2351.     lea    ahi_channels,a0
  2352.     move.l    d2,(a0,d0.l*4)            ;store instr for each channel
  2353.     move.w    d7,(a0,d0.l*4)
  2354.  
  2355.     addq.l    #4,d1
  2356.     lsl.l    #2,d1
  2357.  
  2358.     lea    ahi_samples,a0
  2359.     move.l    (a0,d1.l),d2            ;start
  2360.  
  2361.     cmp.l    #0,Ahi_Sound0
  2362.     beq.s    .no16bit_1
  2363.     lsr.l    #1,d2
  2364. .no16bit_1
  2365.  
  2366.     add.l    d4,d2
  2367.     move.l    4(a0,d1.l),d3            ;length
  2368.  
  2369.     move.l    d7,d1
  2370.  
  2371.  
  2372.     sub.l    d4,d3
  2373.     bgt.s    .NieWyszlo1            ; gdy po dodaniu offsetu end<0 offsam
  2374.  
  2375.     tst.l    12(a0,d1.l)            ; ale gdy sampl jest zapetlony gra go
  2376.     beq.s    .ONEshotSample1
  2377.     move.l    (a0,d1.l),d2
  2378.     cmp.l    #0,Ahi_Sound0
  2379.     beq.s    .no16bit_2
  2380.     lsr.l    #1,d2
  2381. .no16bit_2
  2382.     add.l    8(a0,d1.l),d2
  2383.     move.l    12(a0,d1.l),d3
  2384.     bra.s    .WyszloZapetlenieDONE
  2385. .ONEshotSample1
  2386.     moveq    #AHI_NOSOUND,d1
  2387.     moveq    #AHISF_IMM,d4
  2388.     bra.w    .length_ok
  2389. .NieWyszlo1
  2390.  
  2391.     tst.l    12(a0,d1.l)
  2392.     beq.s    .ONEshotSample2
  2393.     move.l    8(a0,d1.l),d3
  2394.     add.l    12(a0,d1.l),d3
  2395.     sub.l    d4,d3
  2396.     bgt.s    .NieWyszlo2            ; gdy po dodaniu offsetu end<0 offsam
  2397.     move.l    (a0,d1.l),d2
  2398.     cmp.l    #0,Ahi_Sound0
  2399.     beq.s    .no16bit_3
  2400.     lsr.l    #1,d2
  2401. .no16bit_3
  2402.     add.l    8(a0,d1.l),d2
  2403.     move.l    12(a0,d1.l),d3
  2404. .NieWyszlo2
  2405.  
  2406. .ONEshotSample2
  2407.  
  2408. .WyszloZapetlenieDONE
  2409.  
  2410. ; ------------- test backward
  2411.     move.w    Oldd2(a6),d7
  2412.     lsr.w    #4,d7
  2413.     cmp.b    #$e3,d7
  2414.     beq.s    .backwd
  2415.     move.w    Oldd6(a6),d7
  2416.     lsr.w    #4,d7
  2417.     cmp.b    #$e3,d7
  2418.     bne.s    .no_backwd
  2419. .backwd
  2420.     add.l    d3,d2
  2421.     not.l    d3
  2422. .no_backwd
  2423. ; ----------------------------
  2424.  
  2425. .playmain
  2426.     moveq    #0,d1                ;sample bank
  2427.     moveq    #AHISF_IMM,d4
  2428.  
  2429.     lea    SampleOffsets,a6
  2430.     move.l    d2,(a6,d0.w*4)            ;start
  2431.  
  2432.  
  2433.  
  2434.     lea    SampleOffsetsFT,a6
  2435.     move.b    #1,(a6,d0.w)
  2436.  
  2437.  
  2438.     tst.l    d3
  2439.     bne.b    .length_ok            ;length=0 means "no sound"
  2440.     moveq    #AHI_NOSOUND,d1
  2441. .length_ok
  2442.  
  2443.     lea    SampleOffsets,a6
  2444.     cmp.l    #AHI_NOSOUND,d1
  2445.     bne.s    .nozero
  2446.     move.l    #0,(a6,d0.w*4)            ;start
  2447.     lea    SampleOffsetsFT,a6
  2448.     clr.b    (a6,d0.w)
  2449. .nozero
  2450.  
  2451.     move.l    ahibase,a6
  2452.     move.l    ahi_ctrl,a2
  2453.     jsr    _LVOAHI_SetSound(a6)
  2454.  
  2455. .exit    movem.l    (sp)+,d0-d2/a0-a2/a6
  2456.     rts
  2457.  
  2458. MIXCHAN:
  2459.  
  2460.     moveq    #0,d7
  2461.     move.w    TrackNumber,d7
  2462.     subq    #1,d7
  2463.  
  2464. ChannelsLoop:
  2465.     move.l    d7,-(sp)
  2466.     move.w    Oldd0(a6),d0
  2467.     move.w    Oldd1(a6),d1
  2468.     move.w    Oldd2(a6),d2
  2469.     move.w    Oldd6(a6),d6
  2470.     bsr    mainPROC
  2471.     move.w    d0,Oldd0(a6)
  2472.     move.w    d1,Oldd1(a6)
  2473.     move.w    d2,Oldd2(a6)
  2474.     move.w    d6,Oldd6(a6)
  2475.     lea    ChanArea(a6),a6
  2476.     lea    6(a1),a1
  2477.     move.l    (sp)+,d7
  2478.     dbf    d7,ChannelsLoop
  2479.     rts
  2480.  
  2481.  
  2482.  
  2483. ************* finetunes **********************************************
  2484.  
  2485. FINETUNES:
  2486.     movem.l    d1-a6,-(sp)
  2487.     lea    SamFin,a2
  2488.     moveq    #0,d4
  2489.     moveq    #0,d3
  2490.     add.w    d7,d7
  2491.     move.l    (a2,d7.w),d4
  2492.     tst.w    d0
  2493.     beq.s    .fintdone
  2494.  
  2495.     move.l    #3579545,d1
  2496.     divu    d0,d1
  2497.     and.l    #$ffff,d1
  2498. .ok8
  2499.     lsl.l    #8,d4
  2500.     beq.s    .ok7
  2501.     move.l    #8363,d2
  2502.     divu    d2,d4
  2503. .ok7    and.l    #$ffff,d4
  2504.  
  2505.     mulu    d4,d1
  2506.     lsr.l    #8,d1
  2507.  
  2508.     move.l    #3579545,d0
  2509.     tst.l    d1
  2510.     bne.s    .ok9
  2511.     moveq    #1,d1
  2512. .ok9
  2513.     divu.l    d1,d0
  2514.  
  2515. .fintdone
  2516.     movem.l    (sp)+,d1-a6
  2517.     move.w    d0,OrgPeriod(a6)
  2518.     rts
  2519.  
  2520. ; -------------- main procedure ----------------------------
  2521. mainPROC:
  2522.     move.w    OldVolA(a6),VolA(a6)
  2523.     move.w    OldVolB(a6),VolB(a6)
  2524.  
  2525.     tst.b    Temp
  2526.     beq.w    Old_data
  2527.  
  2528.     addq.w    #1,NoteCount(a6)
  2529.  
  2530.     move.b    count(pc),d7
  2531.     cmp.b    temp(pc),d7
  2532.     blt    old_data
  2533.  
  2534.     tst.b    PauseEn
  2535.     bne.w    oldperiod_1
  2536.  
  2537.     moveq    #0,d3
  2538.  
  2539.     tst.b    (a1)
  2540.     beq.w    oldperiod_1
  2541.  
  2542.     cmp.b    #$1f,(a1)
  2543.     bne.s    .novolenvoff
  2544.     addq.b    #1,VolEnvOff(a6)
  2545.     bra.w    oldInstrNum_1
  2546. .novolenvoff
  2547.  
  2548.     clr.w    NoLoopEnable
  2549.     clr.w    OldPeriod(a6)
  2550.  
  2551.     clr.w    VibratoDatasA(a6)
  2552.     clr.w    VibratoDatasB(a6)
  2553.  
  2554.     move.w    2(a1),d7
  2555.     cmp.w    #$ed0,d7
  2556.     beq.s    .ClrEnvDatas
  2557.     and.w    #$fff0,d7
  2558.     cmp.w    #$ed0,d7
  2559.     beq.s    .NoClrEnvDatas
  2560.  
  2561.     move.w    4(a1),d7
  2562.     cmp.w    #$ed0,d7
  2563.     beq.s    .ClrEnvDatas
  2564.     and.w    #$fff0,d7
  2565.     cmp.w    #$ed0,d7
  2566.     beq.s    .NoClrEnvDatas
  2567. .ClrEnvDatas
  2568.     clr.b    VolEnvOff(a6)
  2569.     clr.b    VolEnvMode(a6)
  2570.     clr.w    VolEnvTime(a6)
  2571. .NoClrEnvDatas
  2572.     move.b    #1,OffEnable(a6)
  2573.     move.b    #1,EqNewSamA(a6)
  2574.  
  2575.     moveq    #0,d0
  2576.     move.b    (a1),d0
  2577.  
  2578.     move.l    a3,-(sp)
  2579.     lea    Periods,a3
  2580.     moveq    #0,d3
  2581.     move.b    d0,d3
  2582.     lsr.b    #4,d3
  2583.     subq.b    #1,d3
  2584.     mulu    #24,d3
  2585.     and.b    #$0f,d0
  2586.     add.w    d0,d0
  2587.     add.w    d3,d0
  2588.     move.w    (a3,d0.w),d0
  2589.     move.l    (sp)+,a3
  2590.  
  2591.     move.w    2(a1),d7
  2592.     and.w    #$ff00,d7
  2593.     cmp.w    #$300,d7
  2594.     bne.s    NoClrGliss_1
  2595.     clr.w    GlissandoDatasA+4(a6)
  2596. NoClrGliss_1
  2597.     move.w    4(a1),d7
  2598.     and.w    #$ff00,d7
  2599.     cmp.w    #$300,d7
  2600.     bne.s    NoClrGliss_2
  2601.     clr.w    GlissandoDatasB+4(a6)
  2602. NoClrGliss_2
  2603.  
  2604.     cmp.b    #$18,2(a1)
  2605.     beq.s    .NoClrSlideOffset
  2606.     cmp.b    #$18,4(a1)
  2607.     beq.s    .NoClrSlideOffset
  2608.     cmp.w    #$0900,2(a1)
  2609.     beq.s    .NoClrSlideOffset
  2610.     cmp.w    #$0900,4(a1)
  2611.     beq.s    .NoClrSlideOffset
  2612.     clr.w    SlideSamOffset(a6)
  2613. .NoClrSlideOffset
  2614.  
  2615.     move.w    d0,OrgPeriodARP(a6)
  2616.     moveq    #0,d7
  2617.     move.b    1(a1),d7
  2618.     tst.w    d7
  2619.     bne.s    .notakeold
  2620.     moveq    #0,d7
  2621.     move.b    OldInstrNumA(a6),d7
  2622.     moveq    #0,d1
  2623.     move.b    d7,d1
  2624.     subq    #1,d1
  2625.     lsl.w    #2,d1
  2626. .notakeold
  2627.     add.w    d7,d7
  2628.     bsr    FINETUNES
  2629.  
  2630. *********************************************************************
  2631.  
  2632.  
  2633. oldperiod_1:
  2634.     tst.b    1(a1)
  2635.     beq.w    oldInstrNum_1
  2636.     moveq    #0,d1
  2637.     move.b    1(a1),d1
  2638.     move.b    d1,OldInstrNumA(a6)
  2639.     subq    #1,d1
  2640.     moveq    #0,d2
  2641.  
  2642.     move.b    (a4,d1.w),d2
  2643.     lsl.w    #8,d2
  2644.     move.w    d2,VolA(a6)
  2645.     lsl.w    #2,d1
  2646. oldInstrNum_1
  2647.  
  2648.     move.w    2(a1),d2
  2649.     move.w    4(a1),d6
  2650.  
  2651.     cmp.w    #$1400,d2
  2652.     bne.s    .onkeyoff1
  2653.     move.w    #$e40,d2
  2654. .onkeyoff1
  2655.     cmp.w    #$1400,d6
  2656.     bne.s    .onkeyoff2
  2657.     move.w    #$e40,d6
  2658. .onkeyoff2
  2659.  
  2660.  
  2661.     move.l    a5,-(sp)
  2662.     bsr    EffectCommandsA2
  2663.     bsr    EffectCommandsB2
  2664.     move.l    (sp)+,a5
  2665.  
  2666.  
  2667.     tst.b    OnOffChanA(a6)
  2668.     beq.s    No_Stop1
  2669.     move.w    #$e40,d2
  2670.     move.b    #1,OffEnable(a6)
  2671. No_Stop1:
  2672.  
  2673. old_data:
  2674.  
  2675.     move.b    temp(pc),d7
  2676.     subq    #1,d7
  2677.     cmp.b    count(pc),d7
  2678.     bne.s    no_CLReff
  2679.     move.w    d2,d7
  2680.     lsr.w    #8,d7
  2681.     cmp.b    #8,d7
  2682.     beq.s    no_CLReff1
  2683.     cmp.b    #3,d7
  2684.     beq.s    no_CLReff1
  2685.     cmp.b    #4,d7
  2686.     beq.s    no_CLReff1
  2687.     cmp.b    #5,d7
  2688.     beq.s    CLReffSP1
  2689.     TST.b    d7
  2690.     beq.s    no_CLReff1
  2691.  
  2692.     move.w    d2,d7
  2693.     lsr.w    #4,d7
  2694.     cmp.w    #$ec,d7
  2695.     beq.s    no_CLReff1
  2696.     cmp.w    #$e9,d7
  2697.     beq.s    no_CLReff1
  2698.     cmp.w    #$ed,d7
  2699.     beq.s    no_CLReff1
  2700.     moveq    #0,d2
  2701.     bra.s    no_CLReff1
  2702. CLReffSP1:
  2703.     move.w    #$0300,d2
  2704. no_CLReff1
  2705.     move.w    d6,d7
  2706.     lsr.w    #8,d7
  2707.     cmp.b    #3,d7
  2708.     beq.s    no_CLReff2
  2709.     cmp.b    #4,d7
  2710.     beq.s    no_CLReff2
  2711.     cmp.b    #5,d7
  2712.     beq.s    CLReffSP2
  2713.     TST.b    d7
  2714.     beq.s    no_CLReff2
  2715.  
  2716.     move.w    d6,d7
  2717.     lsr.w    #4,d7
  2718.     cmp.w    #$ec,d7
  2719.     beq.s    no_CLReff2
  2720.     cmp.w    #$e9,d7
  2721.     beq.s    no_CLReff2
  2722.     cmp.w    #$ed,d7
  2723.     beq.s    no_CLReff2
  2724.  
  2725.     moveq    #0,d6
  2726.     bra.s    no_CLReff2
  2727. CLReffSP2:
  2728.     move.w    #$0300,d6
  2729. no_CLReff2
  2730.  
  2731. no_CLReff
  2732.  
  2733.  
  2734.     move.l    a5,-(sp)
  2735.     bsr    EffectCommandsA
  2736.     bsr    EffectCommandsB
  2737.     move.l    (sp)+,a5
  2738.  
  2739.     move.w    d0,GlissandoDatasA+2(a6)
  2740.     move.w    d0,GlissandoDatasB+2(a6)
  2741.  
  2742.  
  2743. ; -----------------------------------
  2744.     bsr    VolumeEnvelope
  2745. ; -----------------------------------
  2746.  
  2747.     move.w    VolA(a6),OldVolA(a6)
  2748.     move.w    VolB(a6),OldVolB(a6)
  2749.  
  2750.  
  2751.     tst.w    d0
  2752.     beq    nothing
  2753.  
  2754.     move.w    d0,MainPeriod(a6)
  2755.     move.w    VolA(a6),d3
  2756.     tst.w    d7
  2757.     bne.s    .onim
  2758.     move.w    d3,MainVol(a6)
  2759. .onim
  2760.     rts
  2761. nothing:
  2762.     tst.w    MainPeriod(a6)
  2763.     beq.s    nostopperiod
  2764.     move.w    #-1,MainPeriod(a6)
  2765. nostopperiod
  2766.     rts
  2767.  
  2768.  
  2769.  
  2770. ;- - - - - - - - - - - -  envelopes
  2771. VolumeEnvelope:
  2772.     movem.l    d0-d6/a0-a6,-(sp)
  2773.  
  2774.  
  2775.     tst.w    d0
  2776.     beq.w    .noenvelope
  2777.  
  2778.     move.l    d1,d0
  2779.     lsr.l    #2,d0
  2780.     lea    VolEnvelope,a0
  2781.     mulu    #134,d0
  2782.     add.w    d0,a0
  2783.  
  2784.     tst.b    VolEnvOff(a6)
  2785.     beq.s    .doenvelope
  2786.     btst.b    #0,(a0)        ; vol env points
  2787.     bne.s    .doenvelope
  2788.     clr.b    VolEnvOff(a6)
  2789.     clr.w    VolA(a6)
  2790.     bra.w    .noenvelope
  2791. .doenvelope
  2792.  
  2793.     btst    #0,(a0)
  2794.     beq.w    .noenvelope
  2795.  
  2796.  
  2797.     lea    6(a0),a1
  2798.     moveq    #0,d0
  2799.     moveq    #0,d1
  2800.     moveq    #0,d2
  2801.     moveq    #0,d3
  2802.     moveq    #0,d4
  2803.     moveq    #0,d5
  2804.     move.b    1(a0),d4    ; vol env points
  2805.     tst.w    d4
  2806.     beq.w    .noenvelope
  2807.  
  2808.     addq.w    #1,VolEnvTime(a6)
  2809.  
  2810. ;-------- envelope loop -------------
  2811.  
  2812.     btst    #1,VolEnvMode(a6)
  2813.     bne.s    .noloop
  2814.  
  2815.     btst    #2,(a0)
  2816.     beq.s    .noloop
  2817.  
  2818.     move.b    4(a0),d5    ; 2nd loop point
  2819.     lsl.w    #2,d5
  2820.     move.w    (a1,d5.w),d0
  2821.     cmp.w    VolEnvTime(a6),d0
  2822.     bgt.w    .noloop
  2823.  
  2824.     tst.b    VolEnvOff(a6)
  2825.     bne.s    .setloop
  2826.  
  2827.     move.b    3(a0),d5    ; 1st loop point
  2828.     lsl.w    #2,d5
  2829.     move.w    (a1,d5.w),VolEnvTime(a6)
  2830.     bra.s    .noloop
  2831. .setloop
  2832.     bset    #1,VolEnvMode(a6)
  2833.     tst.b    VolEnvOff(a6)
  2834.     beq.s    .noloop
  2835.     subq.b    #1,VolEnvOff(a6)
  2836. .noloop
  2837.  
  2838. ;-------- envelope sustain1 -------------
  2839.  
  2840.     btst    #0,VolEnvMode(a6)
  2841.     bne.s    .nosustain1
  2842.  
  2843.     btst    #1,(a0)
  2844.     beq.s    .nosustain1
  2845.  
  2846.     move.b    2(a0),d5    ; sustain1 point 
  2847.     lsl.w    #2,d5
  2848.     move.w    (a1,d5.w),d0
  2849.  
  2850.     addq    #1,d0
  2851.     cmp.w    VolEnvTime(a6),d0
  2852.     bne.w    .nosustain1
  2853.  
  2854.     tst.b    VolEnvOff(a6)
  2855.     bne.s    .setsustain1
  2856.  
  2857.     move.w    (a1,d5.w),VolEnvTime(a6)
  2858.     bra.s    .nosustain1
  2859. .setsustain1
  2860.     bset    #0,VolEnvMode(a6)
  2861.     tst.b    VolEnvOff(a6)
  2862.     beq.s    .nosustain1
  2863.     subq.b    #1,VolEnvOff(a6)
  2864. .nosustain1
  2865.  
  2866. ;-------- envelope sustain2 -------------
  2867.  
  2868.     btst    #2,VolEnvMode(a6)
  2869.     bne.s    .nosustain2
  2870.  
  2871.     btst    #3,(a0)
  2872.     beq.s    .nosustain2
  2873.  
  2874.     move.b    5(a0),d5    ; sustain2 point
  2875.     lsl.w    #2,d5
  2876.     move.w    (a1,d5.w),d0
  2877.  
  2878.     addq    #1,d0
  2879.     cmp.w    VolEnvTime(a6),d0
  2880.     bne.w    .nosustain2
  2881.  
  2882.     tst.b    VolEnvOff(a6)
  2883.     bne.s    .setsustain2
  2884.  
  2885.     move.w    (a1,d5.w),VolEnvTime(a6)
  2886.     bra.s    .nosustain2
  2887. .setsustain2
  2888.     bset    #2,VolEnvMode(a6)
  2889.     tst.b    VolEnvOff(a6)
  2890.     beq.s    .nosustain2
  2891.     subq.b    #1,VolEnvOff(a6)
  2892. .nosustain2
  2893.  
  2894. ;---------------------------------------
  2895.  
  2896.  
  2897.  
  2898. .getpoint
  2899.     move.w    (a1),d0
  2900.     cmp.w    VolEnvTime(a6),d0
  2901.     blt.s    .nextpoint
  2902.     tst.w    VolEnvTime(a6)
  2903.     beq.s    .firstpoint
  2904.     bra.s    .thispoint
  2905. .nextpoint
  2906.     addq    #4,a1
  2907.     dbf    d4,.getpoint
  2908.     subq    #1,VolEnvTime(a6)
  2909.     subq    #4,a1
  2910. .thispoint
  2911.     subq    #4,a1
  2912. .firstpoint
  2913.     move.w    (a1),d0        ; time
  2914.     move.w    4(a1),d1
  2915.  
  2916.     moveq    #0,d2
  2917.     moveq    #0,d3
  2918.  
  2919.     move.w    2(a1),d2    ; vol
  2920.     move.w    6(a1),d3
  2921.  
  2922.  
  2923.     sub.w    d2,d3
  2924.     ext.l    d3
  2925.     asl.l    #8,d3
  2926.     sub.w    d0,d1
  2927.     beq.s    .nodiv1
  2928.     divs    d1,d3
  2929. .nodiv1
  2930.     and.l    #$ffff,d3
  2931.     ext.l    d3
  2932.  
  2933.     moveq    #0,d0
  2934.     move.w    (a1),d0            ; time
  2935.     moveq    #0,d1
  2936.     move.w    VolEnvTime(a6),d1
  2937.     tst.l    d3
  2938.     bge.s    .ok1
  2939.     move.w    4(a1),d0        ; time
  2940.     moveq    #0,d5
  2941.     move.w    6(a1),d5
  2942.     lsl.w    #8,d5
  2943.     bra.s    .ok2
  2944. .ok1
  2945.     moveq    #0,d5
  2946.     move.w    2(a1),d5
  2947.     lsl.w    #8,d5
  2948. .ok2
  2949.  
  2950.     sub.w    d0,d1
  2951.     bne.s    .niezero        ; gdy rowne zero czas na envelopa
  2952.     move.w    6(a1),d3        ; dobiegl konca (przesyla koncowa
  2953.     lsl.w    #8,d3            ; glosnosc)
  2954.     bra.s    .envelopefinished
  2955. .niezero
  2956.     muls    d1,d3
  2957.     add.w    d5,d3
  2958. .envelopefinished
  2959.  
  2960.     moveq    #0,d4
  2961.     move.w    VolA(a6),d4
  2962.     divu    #64,d4
  2963.     and.l    #$ffff,d4
  2964.     mulu    d3,d4
  2965.     lsr.l    #8,d4
  2966.     move.w    d4,MainVol(a6)
  2967.  
  2968.  
  2969. ;    move.l    muj,a5
  2970. ;    move.w    d4,(a5)+
  2971. ;    move.l    a5,muj
  2972.  
  2973.     moveq    #1,d7
  2974.     bra.s    .envelopedone
  2975. .noenvelope
  2976.     moveq    #0,d7
  2977. .envelopedone
  2978.     movem.l    (sp)+,d0-d6/a0-a6
  2979. ;- - - - - - - - - - - -  envelopes end
  2980.     rts
  2981.  
  2982.  
  2983. ;muj:    dc.l    huj
  2984.  
  2985. ; --------------------------- EffectCommands ---------------------------
  2986.  
  2987. EffectCommandsA2:
  2988. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan A
  2989.  
  2990.     move.w    d2,d7
  2991.     beq    EffComA2exit
  2992.     lsr.w    #8,d7
  2993.     clr.b    channelenable
  2994.     move.w    d2,d3
  2995.  
  2996.     cmp.b    #8,d7
  2997.     beq    Pannings2
  2998.  
  2999.     lea    SamoffsetA(a6),a5
  3000.     cmp.b    #9,d7
  3001.     beq    SampleOffset
  3002.  
  3003.     cmp.b    #$b,d7
  3004.     beq    SongRepeat
  3005.  
  3006.     lea    VolA(a6),a5
  3007.     cmp.b    #$c,d7
  3008.     beq    SetVolume
  3009.  
  3010.     cmp.b    #$10,d7
  3011.     beq    SetGlobalVolume
  3012.  
  3013.     cmp.b    #$15,d7
  3014.     beq    SetEnvelopePos
  3015.  
  3016.     lea    Hex(pc),a5
  3017.     cmp.b    #$d,d7
  3018.     beq    PattBreak
  3019.  
  3020.     cmp.b    #$f,d7
  3021.     beq    SetTempo
  3022.  
  3023.     lea    OldSlideOffsetA(a6),a5
  3024.     cmp.b    #$18,d7
  3025.     beq    SlideOffset
  3026.  
  3027. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan A
  3028.  
  3029.     cmp.w    #$e00,d3
  3030.     beq.w    OffFilter
  3031.  
  3032.     cmp.w    #$e01,d3
  3033.     beq.w    OnFilter
  3034.  
  3035.     cmp.w    #$e50,d3
  3036.     beq.w    OffChannelA
  3037.  
  3038.     cmp.w    #$e51,d3
  3039.     beq.w    OnChannelA
  3040.  
  3041.     move.w    d2,d7
  3042.     lsr.w    #4,d7
  3043.     move.w    d2,d3
  3044.  
  3045.     cmp.b    #$e1,d7
  3046.     beq.w    FineSlideUp
  3047.  
  3048.     cmp.b    #$e2,d7
  3049.     beq.w    FineSlideDown
  3050.  
  3051.     cmp.b    #$e4,d7
  3052.     beq.w    TurnOffSam
  3053.  
  3054.     lea    loopsdataschanA(a6),a5
  3055.     cmp.b    #$e6,d7
  3056.     beq.w    Loops
  3057.  
  3058.     lea    SamOffsetA(a6),a5
  3059.     cmp.b    #$e7,d7
  3060.     beq    offsets
  3061.  
  3062.     cmp.b    #$e8,d7
  3063.     beq    pannings
  3064.  
  3065.     lea    VolA(a6),a5
  3066.     cmp.b    #$ea,d7
  3067.     beq    FineVolUp
  3068.  
  3069.     cmp.b    #$eb,d7
  3070.     beq    FineVolDown
  3071.  
  3072.     cmp.b    #$ee,d7
  3073.     beq    Pause
  3074.  
  3075. EffComA2exit
  3076.     rts
  3077.  
  3078. EffectCommandsB2:
  3079. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan B
  3080.  
  3081.     move.w    d6,d7
  3082.     beq    EffComB2exit
  3083.     lsr.w    #8,d7
  3084.     move.b    #1,channelenable
  3085.     move.w    d6,d3
  3086.  
  3087.     cmp.b    #8,d7
  3088.     beq    Pannings2
  3089.  
  3090.     lea    SamoffsetB(a6),a5
  3091.     cmp.b    #9,d7
  3092.     beq    SampleOffset
  3093.  
  3094.     cmp.b    #$b,d7
  3095.     beq    SongRepeat
  3096.  
  3097.     lea    VolA(a6),a5
  3098.     cmp.b    #$c,d7
  3099.     beq    SetVolume
  3100.  
  3101.     cmp.b    #$10,d7
  3102.     beq    SetGlobalVolume
  3103.  
  3104.     cmp.b    #$15,d7
  3105.     beq    SetEnvelopePos
  3106.  
  3107.     lea    Hex(pc),a5
  3108.     cmp.b    #$d,d7
  3109.     beq    PattBreak
  3110.  
  3111.     cmp.b    #$f,d7
  3112.     beq    SetTempo
  3113.  
  3114.     lea    OldSlideOffsetB(a6),a5
  3115.     cmp.b    #$18,d7
  3116.     beq    SlideOffset
  3117.  
  3118. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan B
  3119.  
  3120.     cmp.w    #$e00,d3
  3121.     beq.w    OffFilter
  3122.  
  3123.     cmp.w    #$e01,d3
  3124.     beq.w    OnFilter
  3125.  
  3126.     cmp.w    #$e50,d3
  3127.     beq.w    OffChannelA
  3128.  
  3129.     cmp.w    #$e51,d3
  3130.     beq.w    OnChannelA
  3131.  
  3132.     move.w    d6,d7
  3133.     lsr.w    #4,d7
  3134.     move.w    d6,d3
  3135.  
  3136.     cmp.b    #$e1,d7
  3137.     beq.w    FineSlideUp
  3138.  
  3139.     cmp.b    #$e2,d7
  3140.     beq.w    FineSlideDown
  3141.  
  3142.     cmp.b    #$e4,d7
  3143.     beq.w    TurnOffSam
  3144.  
  3145.     lea    loopsdataschanB(a6),a5
  3146.     cmp.b    #$e6,d7
  3147.     beq.w    Loops
  3148.  
  3149.     lea    SamOffsetA(a6),a5
  3150.     cmp.b    #$e7,d7
  3151.     beq    offsets
  3152.  
  3153.     cmp.b    #$e8,d7
  3154.     beq    pannings
  3155.  
  3156.     lea    VolA(a6),a5
  3157.     cmp.b    #$ea,d7
  3158.     beq    FineVolUp
  3159.  
  3160.     cmp.b    #$eb,d7
  3161.     beq    FineVolDown
  3162.  
  3163.     cmp.b    #$ee,d7
  3164.     beq    Pause
  3165.  
  3166. EffComB2exit
  3167.     rts
  3168.  
  3169.  
  3170.  
  3171.  
  3172. EffectCommandsA:
  3173. ; effects 0xx 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan A
  3174.     move.w    d2,d7
  3175.     beq    EffComAexit
  3176.     lsr.w    #8,d7
  3177.     clr.b    channelenable
  3178.     move.w    d2,d3
  3179.  
  3180.     lea    OrgPeriodARP(a6),a5
  3181.     tst.b    d7
  3182.     beq.w    Arpeggio
  3183.  
  3184.     cmp.b    #1,d7
  3185.     beq.w    PortUp
  3186.  
  3187.     cmp.b    #2,d7
  3188.     beq.w    PortDown
  3189.  
  3190.     lea    GlissandoDatasA(a6),a5
  3191.     cmp.b    #3,d7
  3192.     beq.w    Glissando
  3193.  
  3194.     lea    VibratoDatasA(a6),a5
  3195.     cmp.b    #4,d7
  3196.     beq.w    Vibrato
  3197.  
  3198.     cmp.b    #5,d7
  3199.     beq.w    SlideVolGliss
  3200.  
  3201.     cmp.b    #6,d7
  3202.     beq.w    SlideVolVib
  3203.  
  3204.     lea    VolA(a6),a5
  3205.     cmp.b    #$a,d7
  3206.     beq    SlideVolume
  3207.  
  3208.     lea    OldGlobalVolA(a6),a5
  3209.     cmp.b    #$11,d7
  3210.     beq    SlideGlobalVolume
  3211.  
  3212. ; effects E9x, ECx EDx chan A
  3213.  
  3214.     move.w    d2,d7
  3215.     lsr.w    #4,d7
  3216.     move.w    d2,d3
  3217.  
  3218.     lea    RetraceCntA(a6),a5
  3219.     cmp.b    #$e9,d7
  3220.     beq.w    Retrace
  3221.  
  3222.     lea    VolA(a6),a5
  3223.     cmp.b    #$ec,d7
  3224.     beq    CutSample
  3225.  
  3226.     lea    NoteDelayPeriodA(a6),a5
  3227.     cmp.b    #$ed,d7
  3228.     beq    DelaySample
  3229. EffComAexit
  3230.     rts
  3231.  
  3232.  
  3233. EffectCommandsB:
  3234. ; effects 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan B
  3235.     move.w    d6,d7
  3236.     beq    EffComBexit
  3237.     lsr.w    #8,d7
  3238.     move.b    #1,channelenable
  3239.     move.w    d6,d3
  3240.  
  3241.     lea    OrgPeriodARP(a6),a5
  3242.     tst.b    d7
  3243.     beq.w    Arpeggio
  3244.  
  3245.     cmp.b    #1,d7
  3246.     beq.w    PortUp
  3247.  
  3248.     cmp.b    #2,d7
  3249.     beq.w    PortDown
  3250.  
  3251.     lea    GlissandoDatasB(a6),a5
  3252.     cmp.b    #3,d7
  3253.     beq.w    Glissando
  3254.  
  3255.     lea    VibratoDatasB(a6),a5
  3256.     cmp.b    #4,d7
  3257.     beq.w    Vibrato
  3258.  
  3259.     cmp.b    #5,d7
  3260.     beq.w    SlideVolGliss
  3261.  
  3262.     cmp.b    #6,d7
  3263.     beq.w    SlideVolVib
  3264.  
  3265.     lea    VolB(a6),a5    ; musi byc B
  3266.     cmp.b    #$a,d7
  3267.     beq    SlideVolume
  3268.  
  3269.     lea    OldGlobalVolB(a6),a5
  3270.     cmp.b    #$11,d7
  3271.     beq    SlideGlobalVolume
  3272. ; effects E9x, ECx, EDx chan B
  3273.  
  3274.     move.w    d6,d7
  3275.     lsr.w    #4,d7
  3276.     move.w    d6,d3
  3277.  
  3278.     lea    RetraceCntB(a6),a5
  3279.     cmp.b    #$e9,d7
  3280.     beq.w    Retrace
  3281.  
  3282.     lea    VolA(a6),a5
  3283.     cmp.b    #$ec,d7
  3284.     beq    CutSample
  3285.  
  3286.     lea    NoteDelayPeriodB(a6),a5
  3287.     cmp.b    #$ed,d7
  3288.     beq    DelaySample
  3289. EffComBexit
  3290.     rts
  3291.  
  3292. ;------------------------------ effects -------------------------------------
  3293. TurnOffSam:
  3294.     move.b    #1,OffEnable(a6)
  3295.     rts
  3296.  
  3297. SetEnvelopePos:
  3298.     moveq    #0,d7
  3299.     move.b    d3,d7
  3300.     move.w    d7,VolEnvTime(a6)
  3301.     moveq    #0,d3
  3302.     rts
  3303.  
  3304.  
  3305. ;looppattpos    (a5)      0OFS
  3306. ;loopsongpos    1(a5)     1OFS
  3307. ;loophowmany    2(a5)     2OFS
  3308.  
  3309. _0OFS    equ    0
  3310. _1OFS    equ    2
  3311. _2OFS    equ    1
  3312.  
  3313. loops:
  3314.     cmp.w    #$e60,d3
  3315.     bne.s    no_loop
  3316.     tst.b    _2OFS(a5)
  3317.     bne.s    loops_done
  3318.     moveq    #0,d7
  3319.     move.w    pattpos(pc),d7
  3320.     move.b    d7,(a5)
  3321.  
  3322.     move.w    songpos(pc),_1OFS(a5)
  3323.  
  3324.     bra.s    loops_done
  3325. no_loop
  3326.     tst.b    _2OFS(a5)
  3327.     beq.s    storehowmany
  3328.     subq.b    #1,_2OFS(a5)
  3329.     bne.s    no_done
  3330.     clr.b    (a5)
  3331.     clr.w    _1OFS(a5)
  3332.     clr.b    _2OFS(a5)
  3333.     bra.s    loops_done
  3334. no_done
  3335.     moveq    #0,d7
  3336.     move.b    (a5),d7
  3337.     subq.w    #1,d7
  3338.     move.w    d7,PattPos
  3339.  
  3340.     move.w    _1OFS(a5),songpos
  3341.     bra.s    loops_done
  3342. storehowmany
  3343.     and.b    #$0f,d3
  3344.     move.b    d3,_2OFS(a5)
  3345.  
  3346.     moveq    #0,d7
  3347.     move.b    (a5),d7
  3348.     subq.w    #1,d7
  3349.     move.w    d7,PattPos
  3350.  
  3351.     move.w    _1OFS(a5),songpos
  3352. loops_done
  3353.     rts
  3354.  
  3355. Pause:
  3356.     tst.b    PauseEn
  3357.     bne.s    no_pause
  3358.  
  3359.     moveq    #0,d7
  3360.     move.b    d3,d7
  3361.     and.b    #$0f,d7
  3362.     beq.s    No_pause
  3363.     moveq    #0,d3
  3364.     move.b    Temp(pc),d3
  3365.     mulu    d3,d7
  3366.     addq.w    #1,d7
  3367.     move.w    d7,PauseVBL
  3368. no_pause
  3369.     rts
  3370.  
  3371. SongRepeat:
  3372.     move.w    #-1,pattpos
  3373.     moveq    #0,d7
  3374.     move.b    d3,d7
  3375.     cmp.w    #1024,d7
  3376.     blt.s    songrep_ok
  3377.     move.w    #1024,d7
  3378. songrep_ok
  3379.     move.w    d7,songpos
  3380.     rts
  3381.  
  3382. PattBreak:
  3383.     moveq    #0,d7
  3384.     move.b    d3,d7
  3385.     cmp.w    #99,d7
  3386.     blt.s    patt_ok
  3387.     move.w    #99,d7
  3388. patt_ok
  3389.     cmp.w    #-1,pattpos
  3390.     beq.s    NoAddSP
  3391.     move.l    d0,-(sp)
  3392.     moveq    #0,d0
  3393.     move.w    OrdNum,d0
  3394.     cmp.w    SongPos,d0
  3395.     bne.s    .skip1
  3396.     clr.w    SongPos
  3397.     bra.s    .skip2
  3398. .skip1
  3399.     addq.w    #1,songpos
  3400. .skip2
  3401.     move.l    (sp)+,d0
  3402. NoAddSP
  3403.     move.l    d0,-(sp)
  3404.     moveq    #0,d0
  3405.     move.b    (a5,d7.w),d0
  3406.     move.w    d0,pattpos
  3407.     subq.w    #1,pattpos
  3408.     move.l    (sp)+,d0
  3409.     rts
  3410.  
  3411. SampleOffset:
  3412.     tst.b    d3
  3413.     bne.w    .nozero
  3414.  
  3415. .nozero
  3416.     moveq    #0,d7
  3417.     move.b    (a5),d7
  3418.     lsl.w    #8,d7
  3419.     lsl.l    #8,d7
  3420.     and.w    #$00ff,d3
  3421.     lsl.w    #8,d3
  3422.     add.w    d3,d7
  3423.     tst.b    channelenable
  3424.     bne.s    SamOffsChanB
  3425. ;    add.l    d7,(a2,d1.w)
  3426.     rts
  3427. SamOffsChanB
  3428. ;    add.l    d7,124(a2,d5.w)
  3429.     rts
  3430.  
  3431.  
  3432. offsets:
  3433.     move.b    d3,d7
  3434.     and.b    #$0f,d7
  3435.     move.b    d7,(a5)
  3436.     rts
  3437.  
  3438.  
  3439.  
  3440. pannings:
  3441.     moveq    #0,d7
  3442.     move.b    d3,d7
  3443.     and.b    #$0f,d7
  3444.     mulu    #4369,d7
  3445.     lea    PANPOS(a6),a5
  3446.     move.l    d7,(a5)
  3447.     rts
  3448.  
  3449. pannings2:
  3450.     moveq    #0,d7
  3451.     move.b    d3,d7
  3452.     mulu    #257,d7
  3453.     lea    PANPOS(a6),a5
  3454.     move.l    d7,(a5)
  3455.     rts
  3456.  
  3457. ;SlidePan:
  3458. ;    tst.b    d3
  3459. ;    bne.s    NoOldSlidePan
  3460. ;    move.b    2(a5),d3
  3461. ;NoOldSlidePan
  3462. ;    move.b    d3,2(a5)
  3463. ;
  3464. ;    moveq    #0,d7
  3465. ;    move.b    d3,d7
  3466. ;    cmp.w    #$10,d7
  3467. ;    blt.s    Voldown
  3468. ;
  3469. ;    and.b    #$0f,d7
  3470. ;    cmp.b    #$0f,d7
  3471. ;    beq.s    FineVol
  3472. ;    move.b    d3,d7
  3473. ;    and.b    #$f0,d7
  3474. ;    cmp.b    #$f0,d7
  3475. ;    beq.s    FineVol
  3476. ;
  3477. ;    move.b    d3,d7
  3478. ;    lsr.b    #4,d7
  3479. ;    add.b    d7,VolA(a6)
  3480. ;    cmp.b    #64,VolA(a6)
  3481. ;    blt.s    Voldone
  3482. ;    move.b    #64,VolA(a6)
  3483. ;    rts
  3484. ;Voldown
  3485. ;    and.b    #$f0,d7
  3486. ;
  3487. ;    sub.b    d3,VolA(a6)
  3488. ;    tst.b    VolA(a6)
  3489. ;    bgt.s    Voldone
  3490. ;    clr.b    VolA(a6)
  3491. ;Voldone:rts
  3492.  
  3493.  
  3494.  
  3495. SetTempo:
  3496.     moveq    #0,d7
  3497.     move.b    d3,d7
  3498.     tst.w    d7
  3499.     beq.s    .Set
  3500.     cmp.w    #$1f,d7
  3501.     bgt.s    Cia_temp
  3502. .Set
  3503.     move.b    d3,temp
  3504.     move.b    d3,orgtemp
  3505.     move.b    d3,count
  3506.     rts
  3507. Cia_temp
  3508.  
  3509. SetAHItempo:
  3510.     move.w    d7,CiaTempo
  3511.     and.l    #$ffff,d7
  3512.     lsl.w    #1,d7
  3513.     divu    #5,d7
  3514.     and.l    #$ffff,d7
  3515.     move.l    d7,afreq
  3516.  
  3517.     movem.l    d0-a6,-(sp)
  3518.     move.l    ahibase(pc),a6
  3519.     lea    atags(pc),a1
  3520.     move.l    ahi_ctrl(pc),a2
  3521.     jsr    _LVOAHI_ControlAudioA(a6)
  3522.     movem.l    (sp)+,d0-a6
  3523.     rts
  3524. atags
  3525.     dc.l    AHIA_PlayerFreq
  3526. afreq    dc.l    50
  3527.     dc.l    TAG_DONE
  3528.  
  3529.  
  3530. OffChannelA:
  3531.     bset    #0,OnOffChanA(a6)
  3532.     rts
  3533. OnChannelA:
  3534.     bclr    #0,OnOffChanA(a6)
  3535.     rts
  3536. OffChannelB:
  3537.     bset    #0,OnOffChanB(a6)
  3538.     rts
  3539. OnChannelB:
  3540.     bclr    #0,OnOffChanB(a6)
  3541.     rts
  3542.  
  3543. OffFilter:
  3544.     bclr    #1,$bfe001
  3545.     rts
  3546. OnFilter:
  3547.     bset    #1,$bfe001
  3548.     rts
  3549.  
  3550.  
  3551.  
  3552. Retrace:
  3553.     cmp.b    #1,count
  3554.     bne.s    retrno_2
  3555.     clr.b    (a5)
  3556. retrno_2
  3557.     moveq    #0,d7
  3558.     move.b    d3,d7
  3559.     and.b    #$0f,d7
  3560.     subq.b    #1,d7
  3561.     cmp.b    (a5),d7
  3562.     bne.s    retrno_1
  3563.  
  3564.     tst.b    channelenable
  3565.     beq.s    retr_chan_a
  3566. ;    move.l    (a0,d5.w),124(a2,d5.w)    ; adres sampla
  3567.     move.b    #1,OffEnable(a6)
  3568.     bra.s    retr_chan_b
  3569. retr_chan_a
  3570.     move.b    #1,OffEnable(a6)
  3571. ;    move.l    (a0,d1.w),(a2,d1.w)    ; adres sampla
  3572. retr_chan_b
  3573.     clr.b    (a5)
  3574.     rts
  3575. retrno_1
  3576.     addq.b    #1,(a5)
  3577. no_retrace_1
  3578.     rts
  3579.  
  3580. cutsample:
  3581.     moveq    #0,d7
  3582.     move.b    d3,d7
  3583.     and.b    #$0f,d7
  3584.     beq.s    .doit
  3585.     cmp.b    count(pc),d7
  3586.     bne.s    no_cut_sam
  3587.  
  3588.  
  3589.     moveq    #0,d7
  3590.     move.b    count,d7
  3591.     cmp.b    temp(pc),d7
  3592.     beq.s    no_cut_sam
  3593.  
  3594. .doit    clr.w    (a5)
  3595. no_cut_sam:
  3596.     rts
  3597.  
  3598.  
  3599. delaysample:
  3600.     moveq    #0,d7
  3601.     move.b    d3,d7
  3602.     and.b    #$0f,d7
  3603.     beq.s    no_delay_sam
  3604.  
  3605.     clr.b    OffEnable(a6)
  3606.  
  3607.     moveq    #0,d7
  3608.     move.b    count2,d7
  3609.     bne.s    .nostore
  3610.     move.w    d0,(a5)
  3611.     move.w    d1,2(a5)
  3612. .nostore
  3613.     move.w    OldD0(a6),d0
  3614.     move.w    OldD1(a6),d1
  3615.  
  3616.     moveq    #0,d7
  3617.     move.b    d3,d7
  3618.     and.b    #$0f,d7
  3619.  
  3620.     cmp.b    count2(pc),d7
  3621.     bne.s    no_delay_sam
  3622.     move.w    (a5),d0
  3623.     move.w    2(a5),d1
  3624.     clr.w    OldPeriod(a6)
  3625.     move.b    #1,OffEnable(a6)
  3626.  
  3627.     clr.b    VolEnvOff(a6)
  3628.     clr.b    VolEnvMode(a6)
  3629.     clr.w    VolEnvTime(a6)
  3630. no_delay_sam:
  3631.     rts
  3632.  
  3633. ; ------------- arpeggio -------------
  3634. arplist:
  3635.     dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  3636. Arpeggio:
  3637.     movem.l    d2/a6,-(sp)
  3638.     bsr    ArpeggioMain
  3639.     movem.l    (sp)+,d2/a6
  3640.     move.l    d1,d7
  3641.     lsr.w    #1,d7
  3642.     addq    #2,d7
  3643.     bsr    FINETUNES
  3644.  
  3645.     move.w    d0,VibratoDatasA(a6)
  3646.     move.w    d0,VibratoDatasB(a6)
  3647.     rts
  3648.  
  3649. ArpeggioMain:
  3650.     moveq    #0,d7
  3651.     move.b    count(pc),d7
  3652.     subq.b    #1,d7
  3653.  
  3654.     move.b    arplist(pc,d7.w),d7
  3655.     beq.s    arp0
  3656.     cmp.b    #2,d7
  3657.     beq.s    arp2
  3658.  
  3659. arp1:    moveq    #0,d2
  3660.     move.b    d3,d2
  3661.     lsr.b    #4,d2
  3662.     bra.s    arpdo
  3663.  
  3664. arp2:    moveq    #0,d2
  3665.     move.b    d3,d2
  3666.     and.b    #$f,d2
  3667. arpdo:
  3668.     asl.w    #1,d2
  3669.     move.w    (a5),d7
  3670.     lea    periods,a6
  3671.     moveq    #12*7,d3
  3672. arp3:    cmp.w    (a6)+,d7
  3673.     bge.s    arpfound
  3674.     dbf    d3,arp3
  3675. arp0:
  3676.     tst.b    channelenable
  3677.     bne.s    ARP_chanB1
  3678.     move.w    (a5),d0
  3679.     rts
  3680. ARP_chanB1
  3681.     move.w    (a5),d0
  3682.     rts
  3683. arpfound:
  3684.     add.w    d2,a6
  3685.     cmp.l    #PeriodsEnd,a6
  3686.     ble.s    ArpOk1
  3687.     move.l    #PeriodsEnd,a6
  3688.     moveq    #0,d2
  3689.     bra.s    ArpOk2
  3690. ArpOk1    sub.w    d2,a6
  3691. ArpOk2    tst.b    channelenable
  3692.     bne.s    ARP_chanB2
  3693.     move.w    -2(a6,d2.w),d0
  3694.     rts
  3695. ARP_chanB2
  3696.     move.w    -2(a6,d2.w),d0
  3697.     rts
  3698.  
  3699. ; ------------- portamento up -------------
  3700.  
  3701. PortUp:
  3702.     moveq    #0,d7
  3703.     move.b    d3,d7
  3704.  
  3705.     tst.b    channelenable
  3706.     bne.s    PortUp_chan_b
  3707.     
  3708. PortUp_chan_a
  3709.     tst.b    d7
  3710.     bne.s    NoOldPortUpA
  3711.     move.b    PortUpOldValA(a6),d7
  3712. NoOldPortUpA
  3713.     move.b    d7,PortUpOldValA(a6)
  3714.  
  3715.     move.b    d7,d3
  3716.     and.b    #$f0,d7
  3717.     cmp.b    #$f0,d7
  3718.     beq.w    FineSU
  3719.     move.b    d3,d7
  3720.  
  3721.     lsl.w    #2,d7
  3722.     sub.w    d7,d0
  3723. ;    cmp.w    #113,d0
  3724. ;    bge.s    PortUpOkA
  3725. ;    move.w    #113,d0
  3726. ;PortUpOkA
  3727.     move.w    d0,VibratoDatasA(a6)
  3728.     move.w    d0,VibratoDatasB(a6)
  3729.     rts
  3730.  
  3731. PortUp_chan_b
  3732.     tst.b    d7
  3733.     bne.s    NoOldPortUpB
  3734.     move.b    PortUpOldValB(a6),d7
  3735. NoOldPortUpB
  3736.     move.b    d7,PortUpOldValB(a6)
  3737.     move.b    d7,d3
  3738.     and.b    #$f0,d7
  3739.     cmp.b    #$f0,d7
  3740.     beq.w    FineSU
  3741.     move.b    d3,d7
  3742.  
  3743.     lsl.w    #2,d7
  3744.     sub.w    d7,d0
  3745.  
  3746. ;    cmp.w    #113,d0
  3747. ;    bge.s    PortUpOkB
  3748. ;    move.w    #113,d0
  3749. ;PortUpOkB
  3750. ;    rts
  3751.  
  3752.     move.w    d0,VibratoDatasA(a6)
  3753.     move.w    d0,VibratoDatasB(a6)
  3754. NoPortUp:
  3755.     rts
  3756.  
  3757. ; ------------- portamento down -------------
  3758. PortDown:
  3759.     moveq    #0,d7
  3760.     move.b    d3,d7
  3761.  
  3762.     tst.b    channelenable
  3763.     bne.s    PortDown_chan_b
  3764. PortDown_chan_a
  3765.     tst.b    d7
  3766.     bne.s    NoOldPortDownA
  3767.     move.b    PortDownOldValA(a6),d7
  3768. NoOldPortDownA
  3769.     move.b    d7,PortDownOldValA(a6)
  3770.     move.b    d7,d3
  3771.     and.b    #$f0,d7
  3772.     cmp.b    #$f0,d7
  3773.     beq.w    FineSD
  3774.     move.b    d3,d7
  3775.  
  3776.     lsl.w    #2,d7
  3777.     add.w    d7,d0
  3778. ;    cmp.w    #856,d0
  3779. ;    ble.s    PortDownOkA
  3780. ;    move.w    #856,d0
  3781. ;PortDownOkA
  3782.     move.w    d0,VibratoDatasA(a6)
  3783.     move.w    d0,VibratoDatasB(a6)
  3784.     rts
  3785.  
  3786. PortDown_chan_b
  3787.     tst.b    d7
  3788.     bne.s    NoOldPortDownB
  3789.     move.b    PortDownOldValB(a6),d7
  3790. NoOldPortDownB
  3791.     move.b    d7,PortDownOldValB(a6)
  3792.     move.b    d7,d3
  3793.     and.b    #$f0,d7
  3794.     cmp.b    #$f0,d7
  3795.     beq.w    FineSD
  3796.     move.b    d3,d7
  3797.  
  3798.     lsl.w    #2,d7
  3799.     add.w    d7,d0
  3800. ;    cmp.w    #856,d0
  3801. ;    ble.s    PortDownOkB
  3802. ;    move.w    #856,d0
  3803. ;PortDownOkB
  3804.     move.w    d0,VibratoDatasA(a6)
  3805.     move.w    d0,VibratoDatasB(a6)
  3806. noPortDown:
  3807.     rts
  3808.  
  3809. ; --------------- set global volume  -------------
  3810. SetGlobalVolume:
  3811.     moveq    #0,d7
  3812.     move.b    d3,d7
  3813.     move.w    d7,GlobalVol
  3814.     rts
  3815. ; ------------- slide global volume  -------------
  3816. SlideGlobalVolume:
  3817.     tst.b    d3
  3818.     bne.s    .NoOldSlideVol
  3819.     move.b    (a5),d3    ; Old SlideVolValue
  3820. .NoOldSlideVol
  3821.     move.b    d3,(a5)
  3822.  
  3823.     moveq    #0,d7
  3824.     move.b    d3,d7
  3825.     cmp.w    #$10,d7
  3826.     blt.s    .Voldown
  3827.  
  3828.     moveq    #0,d7
  3829.     move.b    d3,d7
  3830.     lsr.b    #4,d7
  3831.     add.w    d7,GlobalVol
  3832.     cmp.w    #64,GlobalVol
  3833.     blt.s    .Voldone
  3834.     move.w    #64,GlobalVol
  3835.     rts
  3836. .Voldown
  3837.     moveq    #0,d7
  3838.     move.b    d3,d7
  3839.     sub.w    d7,GlobalVol
  3840.     tst.w    GlobalVol
  3841.     bgt.s    .Voldone
  3842.     clr.w    GlobalVol
  3843. .Voldone:
  3844.     rts
  3845.  
  3846. ; ------------- slide offset -------------
  3847. SlideOffset:
  3848.     tst.b    d3
  3849.     bne.s    .NoOldSlide
  3850.     move.b    (a5),d3    ; Old SlideOffset
  3851. .NoOldSlide
  3852.     move.b    d3,(a5)
  3853.  
  3854.     moveq    #0,d7
  3855.     move.b    d3,d7
  3856.     cmp.w    #$10,d7
  3857.     blt.s    .down
  3858.  
  3859.     moveq    #0,d7
  3860.     move.b    d3,d7
  3861.     lsr.b    #4,d7
  3862.     add.w    d7,SlideSamOffset(a6)
  3863.     rts
  3864. .down
  3865.     moveq    #0,d7
  3866.     move.b    d3,d7
  3867.     sub.w    d7,SlideSamOffset(a6)
  3868.     tst.w    SlideSamOffset(a6)
  3869.     bgt.s    .done
  3870.     clr.w    SlideSamOffset(a6)
  3871. .done:
  3872.     rts
  3873.  
  3874. ; --------------- set volume  -------------
  3875. SetVolume:
  3876.     moveq    #0,d7
  3877.     move.b    d3,d7
  3878.     lsl.w    #8,d7
  3879.     move.w    d7,(a5)
  3880.     rts
  3881.  
  3882. ; --------------- slide volume up -------------
  3883. SlideVolume:
  3884.     tst.b    d3
  3885.     bne.s    NoOldSlideVol
  3886.     move.b    2(a5),d3    ; Old SlideVolVolue
  3887. NoOldSlideVol
  3888.     move.b    d3,2(a5)
  3889.  
  3890.     moveq    #0,d7
  3891.     move.b    d3,d7
  3892.     cmp.w    #$10,d7
  3893.     blt.s    Voldown
  3894.  
  3895.     and.b    #$0f,d7
  3896.     cmp.b    #$0f,d7
  3897.     beq.s    FineVol
  3898.     move.b    d3,d7
  3899.     and.b    #$f0,d7
  3900.     cmp.b    #$f0,d7
  3901.     beq.s    FineVol
  3902.  
  3903.     moveq    #0,d7
  3904.     move.b    d3,d7
  3905.     lsr.b    #4,d7
  3906.     lsl.w    #8,d7
  3907.     add.w    d7,VolA(a6)
  3908.     cmp.w    #64*256,VolA(a6)
  3909.     blt.s    Voldone
  3910.     move.w    #64*256,VolA(a6)
  3911.     rts
  3912. Voldown
  3913. ;    and.b    #$f0,d7
  3914.  
  3915.     moveq    #0,d7
  3916.     move.b    d3,d7
  3917.     lsl.w    #8,d7
  3918.     sub.w    d7,VolA(a6)
  3919.     tst.w    VolA(a6)
  3920.     bgt.s    Voldone
  3921.     clr.w    VolA(a6)
  3922. Voldone:rts
  3923.  
  3924.  
  3925. FineVol:
  3926.     cmp.b    #$0f,d7
  3927.     beq.s    .FineUp
  3928.     moveq    #0,d7
  3929.     move.b    d3,d7
  3930.     and.b    #$0f,d7
  3931.     add.w    #$eb0,d7
  3932.     move.w    d7,d3
  3933.     bsr    FineVolDown
  3934.     rts
  3935. .FineUp:
  3936.     moveq    #0,d7
  3937.     move.b    d3,d7
  3938.     lsr.b    #4,d7
  3939.     add.w    #$ea0,d7
  3940.     move.w    d7,d3
  3941.     bsr    FineVolUp
  3942.     rts
  3943.  
  3944. FineSU:
  3945.     moveq    #0,d7
  3946.     move.b    d3,d7
  3947.     and.b    #$0f,d7
  3948. ;    add.w    #$ea0,d7
  3949.     move.w    d7,d3
  3950.     bsr    FineSlideUp
  3951.     rts
  3952. FineSD:
  3953.     moveq    #0,d7
  3954.     move.b    d3,d7
  3955.     and.b    #$0f,d7
  3956. ;    add.w    #$eb0,d7
  3957.     move.w    d7,d3
  3958.     bsr    FineSlideDown
  3959.     rts
  3960.  
  3961.  
  3962. ; --------------- fine slide down -------------
  3963. FineSlideDown:
  3964.     move.w    d3,d7
  3965.     and.w    #$000f,d7
  3966.     lsl.w    #2,d7
  3967.  
  3968.     tst.b    channelenable
  3969.     bne.s    FineSlideDownB
  3970.  
  3971.     add.w    d7,d0
  3972. ;    cmp.w    #856,d0
  3973. ;    ble.s    FineSlideDownOkA
  3974. ;    move.w    #856,d0
  3975. ;FineSlideDownOkA
  3976.     moveq    #0,d2
  3977.  
  3978.     move.w    d0,VibratoDatasA(a6)
  3979.     move.w    d0,VibratoDatasB(a6)
  3980.     rts
  3981.  
  3982. FineSlideDownB
  3983.     add.w    d7,d0
  3984. ;    cmp.w    #856,d0
  3985. ;    ble.s    FineSlideDownOkB
  3986. ;    move.w    #856,d0
  3987. ;FineSlideDownOkB
  3988.     moveq    #0,d6
  3989.     move.w    d0,VibratoDatasA(a6)
  3990.     move.w    d0,VibratoDatasB(a6)
  3991.     rts
  3992.  
  3993. ; --------------- fine slide up -------------
  3994. FineSlideUp:
  3995.     move.w    d3,d7
  3996.     and.w    #$000f,d7
  3997.     lsl.w    #2,d7
  3998.  
  3999.     tst.b    channelenable
  4000.     bne.s    FineSlideUpB
  4001.  
  4002.     sub.w    d7,d0
  4003. ;    cmp.w    #113,d0
  4004. ;    bge.s    FineSlideUpOkA
  4005. ;    move.w    #113,d0
  4006. ;FineSlideUpOkA
  4007.     moveq    #0,d2
  4008.     move.w    d0,VibratoDatasA(a6)
  4009.     move.w    d0,VibratoDatasB(a6)
  4010.     rts
  4011.  
  4012. FineSlideUpB
  4013.     sub.w    d7,d0
  4014.  
  4015. ;    cmp.w    #113,d0
  4016. ;    bge.s    FineSlideUpOkB
  4017. ;    move.w    #113,d0
  4018. ;FineSlideUpOkB
  4019.     moveq    #0,d6
  4020.     move.w    d0,VibratoDatasA(a6)
  4021.     move.w    d0,VibratoDatasB(a6)
  4022.     rts
  4023.  
  4024. ; --------------- fine volume up  -------------
  4025. FineVolUp:
  4026.     move.w    d3,d7
  4027.     and.w    #$000f,d7
  4028.     lsl.w    #8,d7
  4029.     add.w    d7,VolA(a6)
  4030.     cmp.w    #64*256,VolA(a6)
  4031.     blt.s    FVUOK
  4032.     move.w    #64*256,VolA(a6)
  4033. FVUOK
  4034.     tst.b    channelenable
  4035.     bne.s    FVUClrVolB
  4036.     moveq    #0,d2
  4037.     rts
  4038. FVUClrVolB
  4039.     moveq    #0,d6
  4040.     rts
  4041.  
  4042.  
  4043. ; --------------- fine volume down  -------------
  4044. FineVolDown:
  4045.     move.w    d3,d7
  4046.     and.w    #$000f,d7
  4047.     lsl.w    #8,d7
  4048.     sub.w    d7,VolA(a6)
  4049.     tst.w    VolA(a6)
  4050.     bge.s    FVDOK
  4051.     clr.w    VolA(a6)
  4052. FVDOK
  4053.     tst.b    channelenable
  4054.     bne.s    FVDClrVolB
  4055.     moveq    #0,d2
  4056.     rts
  4057. FVDClrVolB
  4058.     moveq    #0,d6
  4059. NoFVD    rts
  4060.  
  4061.  
  4062. ; ------------- glissando -------------
  4063.  
  4064. ;GlissOldValue:         (a5)
  4065. ;GlissEnable:        1(a5)
  4066. ;GlissOldPeriod:    2(a5)
  4067. ;GlissNewPeriod:    4(a5)
  4068.  
  4069. Glissando:
  4070.     move.w    d3,d7
  4071.     tst.b    d3
  4072.     bne.s    NoOLDgliss
  4073.     move.b    (a5),d3
  4074. NoOLDgliss
  4075.  
  4076.     cmp.b    #1,count
  4077.     bne.s    NoStore
  4078.     move.b    d3,(a5)
  4079. NoStore
  4080.     lea    GlissandoDatasA(a6),a5
  4081.  
  4082.     tst.w    2(a5)
  4083.     beq.w    GlissRTS
  4084.  
  4085. ;    tst.b    channelenable
  4086. ;    bne.s    GlissOK1B
  4087.  
  4088. GlissOK1A:
  4089.     tst.w    4(a5)
  4090.     bne.s    GlissOk2
  4091.     move.w    d0,d7
  4092.     move.w    d0,4(a5)
  4093.     move.w    2(a5),d0
  4094.     clr.b    1(a5)
  4095.     cmp.w    d0,d7
  4096.     beq.s    ClrNP
  4097.     bge.w    GlissRTS
  4098.     move.b    #1,1(a5)
  4099.     rts
  4100.  
  4101. ;GlissOK1B:
  4102. ;    tst.w    4(a5)
  4103. ;    bne.s    GlissOk2
  4104. ;    move.w    d4,d7
  4105. ;    move.w    d4,4(a5)
  4106. ;    move.w    2(a5),d4
  4107. ;    clr.b    1(a5)
  4108. ;    cmp.w    d4,d7
  4109. ;    beq.s    ClrNP
  4110. ;    bge.s    GlissRTS
  4111. ;    move.b    #1,1(a5)
  4112. ;    rts
  4113.  
  4114. ClrNP:    clr.w    4(a5)
  4115.     rts
  4116.  
  4117. GlissOk2:
  4118.     move.w    d3,d7
  4119.     and.w    #$0ff,d7
  4120.     tst.w    4(a5)
  4121.     beq.s    Glissrts
  4122.     tst.b    1(a5)
  4123.     bne.s    Glisssub
  4124.     lsl.w    #2,d7
  4125.     add.w    d7,2(a5)
  4126.     move.w    4(a5),d7
  4127.     cmp.w    2(a5),d7
  4128.     bgt.s    GlissOK3
  4129.     move.w    4(a5),2(a5)
  4130.     clr.w    4(a5)
  4131. GlissOK3:
  4132. ;    tst.b    channelenable
  4133. ;    bne.s    GlissChanB
  4134. ;GlissChanA
  4135.     move.w    2(a5),d0
  4136.     move.w    d0,VibratoDatasA(a6)
  4137.     move.w    d0,VibratoDatasB(a6)
  4138.     rts
  4139.  
  4140. ;GlissChanB
  4141. ;    move.w    2(a5),d0
  4142. ;    rts
  4143.  
  4144. Glisssub:
  4145.     lsl.w    #2,d7
  4146.     sub.w    d7,2(a5)
  4147.     move.w    4(a5),d7
  4148.     cmp.w    2(a5),d7
  4149.     blt.s    GlissOK3
  4150.     move.w    4(a5),2(a5)
  4151.     clr.w    4(a5)
  4152.     bra.s    GlissOK3
  4153.  
  4154. Glissrts:
  4155.     rts
  4156.  
  4157. SlideVolGliss:
  4158.     and.w    #$00ff,d3
  4159.     add.w    #$a00,d3
  4160.     tst.b    channelenable
  4161.     bne.s    SlideChanB
  4162.     lea    VolA(a6),a5
  4163.     bra.s    DoSlideChan
  4164. SlideChanB
  4165.     lea    VolB(a6),a5
  4166. DoSlideChan
  4167.     bsr    SlideVolume
  4168.  
  4169.     move.w    #$0300,d3
  4170.     tst.b    channelenable
  4171.     bne.s    GlissBChan
  4172.     lea    GlissandoDatasA(a6),a5
  4173.     tst.w    d2
  4174.     bne.s    .ok
  4175.     move.w    #$0300,d2
  4176. .ok
  4177.     bra.s    DoGlissChan
  4178. GlissBChan
  4179.     tst.w    d6
  4180.     bne.s    .ok
  4181.     move.w    #$0300,d6
  4182. .ok
  4183.     lea    GlissandoDatasB(a6),a5
  4184. DoGlissChan
  4185.     bra    Glissando
  4186.  
  4187.  
  4188. SlideVolVib:
  4189.     and.w    #$00ff,d3
  4190.     add.w    #$a00,d3
  4191.     tst.b    channelenable
  4192.     bne.s    SlideChanBV
  4193.     lea    VolA(a6),a5
  4194.     bra.s    DoSlideChanV
  4195. SlideChanBV
  4196.     lea    VolB(a6),a5
  4197. DoSlideChanV
  4198.     bsr    SlideVolume
  4199.  
  4200.     move.w    #$0400,d3
  4201.     tst.b    channelenable
  4202.     bne.s    VibBChan
  4203.     lea    VibratoDatasA(a6),a5
  4204.     tst.w    d2
  4205.     bne.s    .ok
  4206.     move.w    #$0400,d2
  4207. .ok
  4208.     bra.s    DoVibChan
  4209. VibBChan
  4210.     lea    VibratoDatasB(a6),a5
  4211.     tst.w    d6
  4212.     bne.s    .ok
  4213.     move.w    #$0400,d6
  4214. .ok
  4215. DoVibChan
  4216.     bra    Vibrato
  4217.  
  4218.  
  4219.  
  4220.  
  4221. ;VibPeriod    (a5)
  4222. ;VibValue    2(a5)
  4223. ;ViboldValue    3(a5)
  4224.  
  4225. Vibrato:
  4226.     movem.l    d2/d5,-(sp)
  4227.  
  4228.     move.w    d0,d2
  4229. ;    tst.b    channelenable
  4230. ;    bne.s    VibCHANB1
  4231. ;    move.w    d0,d2
  4232. ;VibCHANB1
  4233.     bsr    VibratoMain
  4234. ;    tst.b    channelenable
  4235. ;    bne.s    VibCHANB2
  4236. ;    move.w    d2,d0
  4237. ;    bra.s    VibMainDone
  4238. ;VibCHANB2
  4239.     move.w    d2,d0
  4240. VibMainDone
  4241.     movem.l    (sp)+,d2/d5
  4242.     rts
  4243.  
  4244. VibratoMain:
  4245.     move.b    Count(pc),d7
  4246.     cmp.b    Temp(pc),d7
  4247.     bne.s    NoNewPeriod
  4248.     tst.w    (a5)
  4249.     bne.s    NoNewPeriod
  4250.     move.w    d2,(a5)
  4251. NoNewPeriod
  4252.     move.w    (a5),d2
  4253.     move.b    temp(pc),d7
  4254.     subq    #1,d7
  4255.     cmp.b    count(pc),d7
  4256.     bne.s    DoVibrato
  4257.     clr.w    (a5)
  4258.     rts
  4259. DoVibrato
  4260.     move.b    d3,d5
  4261.     and.b    #$0f,d5
  4262.     bne.s    NoNew1
  4263.     move.b    3(a5),d5
  4264.     and.b    #$0f,d5
  4265.     add.b    d5,d3
  4266. NoNew1
  4267.     move.b    d3,d5
  4268.     and.b    #$f0,d5
  4269.     bne.s    NoNew2
  4270.     move.b    3(a5),d5
  4271.     and.b    #$f0,d5
  4272.     add.b    d5,d3
  4273. NoNew2
  4274.     move.w    d3,-(sp)
  4275.  
  4276.     move.b    d3,3(a5)
  4277.  
  4278.     move.b    d3,d7
  4279.     move.b    2(a5),d3
  4280.     lsr.w    #2,d3
  4281.     and.w    #$1f,d3
  4282.     moveq    #0,d5
  4283.     move.b    VibSin(pc,d3.w),d5
  4284.     mulu    #5,d5
  4285.     divu    #3,d5
  4286.     and.l    #$ffff,d5
  4287.  
  4288.     move.b    d7,d3
  4289.     and.w    #$f,d3
  4290.     mulu    d3,d5
  4291.     lsr.w    #7,d5
  4292.  
  4293.     tst.b    2(a5)
  4294.     bmi.s    VibSub
  4295.     add.w    d5,d2
  4296.     bra.s    VibNext
  4297. VibSub:
  4298.     sub.w    d5,d2
  4299. VibNext:
  4300.     move.w    d2,d5
  4301.     move.b    d7,d5
  4302.     lsr.w    #2,d5
  4303.     and.w    #$3c,d5
  4304.     add.b    d5,2(a5)
  4305.     move.w    (sp)+,d3
  4306.     rts
  4307.  
  4308. VibSin:
  4309.     dc.b    $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  4310.     dc.b    $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  4311.  
  4312. Hex:
  4313.  dc.b    0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,10,11,12,13,14,15,16,17,18,19
  4314.  dc.b    0,0,0,0,0,0,20,21,22,23,24,25,26,27,28,29,0,0,0,0,0,0,30,31
  4315.  dc.b    32,33,34,35,36,37,38,39,0,0,0,0,0,0,40,41,42,43,44,45,46,47
  4316.  dc.b    48,49,0,0,0,0,0,0,50,51,52,53,54,55,56,57,58,59,0,0,0,0,0,0
  4317.  dc.b    60,61,62,63,64,65,66,67,68,69,0,0,0,0,0,0
  4318.  dc.b    70,71,72,73,74,75,76,77,78,79,0,0,0,0,0,0
  4319.  dc.b    80,81,82,83,84,85,86,87,88,89,0,0,0,0,0,0
  4320.  dc.b    90,91,92,93,94,95,96,97,98,99,0,0,0,0,0,0
  4321.  even
  4322.  
  4323.  
  4324. PERIODS:
  4325.  dc.w    856*16,808*16,762*16,720*16,678*16,640*16,604*16,570*16,538*16,508*16,480*16,453*16
  4326.  dc.w    856*8,808*8,762*8,720*8,678*8,640*8,604*8,570*8,538*8,508*8,480*8,453*8
  4327.  dc.w    856*4,808*4,762*4,720*4,678*4,640*4,604*4,570*4,538*4,508*4,480*4,453*4
  4328.  dc.w    428*4,404*4,381*4,360*4,339*4,320*4,302*4,285*4,269*4,254*4,240*4,226*4
  4329.  dc.w    214*4,202*4,190*4,180*4,170*4,160*4,151*4,143*4,135*4,127*4,120*4,113*4
  4330.  dc.w    214*2,202*2,190*2,180*2,170*2,160*2,151*2,143*2,135*2,127*2,120*2,113*2
  4331.  dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  4332.  dc.w    214/2,202/2,190/2,180/2,170/2,160/2,151/2,143/2,135/2,127/2,120/2,113/2
  4333. PERIODSEND:
  4334.  
  4335.  
  4336.  
  4337.     SECTION    DATA,BSS_p
  4338.  
  4339. UnPackedData:    ds.l    128*6
  4340. PattAdresses:    ds.l    1024
  4341. PATTLENS:    ds.w    1024
  4342.  
  4343. SAMVOL:        ds.b    256
  4344. Instruments:    ds.w    256
  4345. SampleType:    ds.b    256    ; 0-8bit ; 1-16bit
  4346.         ds.b    256    ; original
  4347. LoopTab:    ds.b    256
  4348. SAMFIN:        ds.l    256
  4349. SONGORDERS:    ds.w    1024+1
  4350.  
  4351. SONGORDERS0:    ds.w    1024+1
  4352. SONGORDERS1:    ds.w    1024+1
  4353. SONGORDERS2:    ds.w    1024+1
  4354. SONGORDERS3:    ds.w    1024+1
  4355. SONGORDERS4:    ds.w    1024+1
  4356.  
  4357. ahi_samples    ds.b    (4*4)*256
  4358. ModNameBuffer:    ds.b    44
  4359. SongNameBuffer:    ds.b    44
  4360.  
  4361. SongNameBuffer0:ds.b    44
  4362. SongNameBuffer1:ds.b    44
  4363. SongNameBuffer2:ds.b    44
  4364. SongNameBuffer3:ds.b    44
  4365. SongNameBuffer4:ds.b    44
  4366.  
  4367. InstrNames:    ds.b    256*30
  4368.  
  4369.  
  4370. VolEnvelope:    ds.b    [[32*4]+6]*256    ; 1 - type / 2 - point number
  4371.  
  4372. SamBuff:    ds.b    32*(1024+16)
  4373.  
  4374. SampleOffsets    ds.l    128+2
  4375. SampleOffsetsFT    ds.b    128+2
  4376.  
  4377.  
  4378. ; Channels
  4379. Channel1:    ds.b    ChanArea*128
  4380. ahi_channels    ds.l    128
  4381.  
  4382.  
  4383.  
  4384. MODBUFFER:
  4385.     ds.b    128*128-1572
  4386.     ds.b    1572
  4387. Tap_Buffer1:
  4388.     ds.b    2048
  4389. TAP_Buffer2:
  4390.     ds.b    2048
  4391. PackedPattLen:
  4392.     ds.w    1
  4393.  
  4394.     SECTION    NAME,DATA_p
  4395.  
  4396. NM:    dc.b    'dh2:1.dbm',0
  4397.     even
  4398.