home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / music / octa_88.lzh / 42550H.S next >
Text File  |  1993-03-06  |  39KB  |  1,755 lines

  1. ****************************************************************************
  2. *                        CCC  OO  DDD  EEEE                                *
  3. *                       C    O  O D  D E                                   *
  4. *                       C    O  O D  D EEE                                 *
  5. *                       C    O  O D D  E                                   *
  6. *                        CCC  OO  DD   EEEEs  STe REPLAY-ROUTINE           *
  7. *                                                                          *
  8. *   Based on:   WizzCat´s ProTracker-replayroutine                         *
  9. *               Amiga ProTracker replayroutine                             *
  10. *                                                                          *
  11. *   Features:   Soundchip running on 50 kHz                                *
  12. *               Updating sound at 25 kHz                                   *
  13. *               Do not use timer A                                         *
  14. *               Uses hardware for some volumecontrol                       *
  15. *                                                                          *
  16. *--------------------------------------------------------------------------*
  17. *                                                                          *
  18. *   Thanx to:   WizzCat, Blade                                             *
  19. *                                                                          *
  20. *--------------------------------------------------------------------------*
  21. *                                                                          *
  22. * The following commands exists on the Amiga ProTracker 2.3A. Thouse with  *
  23. * the"✓"-tecknet is supported by this replay                               *
  24. *                                                                          *
  25. *                                                                          *
  26. *        Protracker V2.3A Effect Commands                                  *
  27. *--------------------------------------------------------------------------*
  28. * ✓ 0 - Normal play or Arpeggio        0xy : x-first halfnote add,y-second *
  29. * ✓ 1 - Slide Up                       1xx : upspeed                       *
  30. * ✓ 2 - Slide Down                     2xx : downspeed                     *
  31. * ✓ 3 - Tone Portamento                3xx : up/down speed                 *
  32. * ✓ 4 - Vibrato                        4xy : x-speed,   y-depth            *
  33. * ✓ 5 - Tone Portamento+Volume Slide   5xy : x-upspeed, y-downspeed        *
  34. * ✓ 6 - Vibrato + Volume Slide         6xy : x-upspeed, y-downspeed        *
  35. * ✓ 7 - Tremolo                        7xy : x-speed,   y-depth            *
  36. * ✓ 8 - NOT USED                                                           *
  37. * ✓ 9 - Set SampleOffset               9xx : offset ($23 -> $2300)         *
  38. * ✓ A - VolumeSlide                    Axy : x-upspeed, y-downspeed        *
  39. * ✓ B - Position Jump                  Bxx : songposition                  *
  40. * ✓ C - Set Volume                     Cxx : volume, $00-$40               *
  41. * ✓ D - Pattern Break                  Dxx : break position in next patt   *
  42. * ✓ E - E-Commands                     Exy : see below...                  *
  43. * ✓ F - Set Speed                      Fxx : speed($00-$1F)/tempo($20-$FF) *
  44. *                                          OBS tempo supportas ej          *
  45. *--------------------------------------------------------------------------*
  46. * ✓ E0- Set Filter                     E0x : 0-filter on,1-filter off Hehe *
  47. * ✓ E1- FineSlide Up                   E1x : value                         *
  48. * ✓ E2- FineSlide Down                 E2x : value                         *
  49. *   E3- Glissando Control              E3x : 0-off, 1-on (use with tonep.) *
  50. *   E4- Set Vibrato Waveform           E4x : 0-sine, 1-ramp down, 2-square *
  51. *   E5- Set Loop                       E5x : set loop point                *
  52. *   E6- Jump to Loop                   E6x : jump to loop, play x times    *
  53. *   E7- Set Tremolo Waveform           E7x : 0-sine, 1-ramp down. 2-square *
  54. *   E8- NOT USED                                                           *
  55. *   E9- Retrig Note                    E9x : retrig from note + x vblanks  *
  56. * ✓ EA- Fine VolumeSlide Up            EAx : add x to volume               *
  57. * ✓ EB- Fine VolumeSlide Down          EBx : subtract x from volume        *
  58. *   EC- NoteCut                        ECx : cut from note + x vblanks     *
  59. *   ED- NoteDelay                      EDx : delay note x vblanks          *
  60. *   EE- PatternDelay                   EEx : delay pattern x notes         *
  61. *   EF- Invert Loop                    EFx : speed                         *
  62. *--------------------------------------------------------------------------*
  63. ****************************************************************************
  64.  
  65.  
  66. INC    EQU 9371195            ; 3579546/25033*65536
  67.  
  68.  
  69.     move.l    a7,a5
  70.     move.l    4(a5),a5
  71.     move.l    $c(a5),d0
  72.     add.l    $14(a5),d0
  73.     add.l    $1c(a5),d0
  74.     add.l    #$100,d0
  75.     move.l    d0,-(sp)
  76.     move.l    a5,-(sp)
  77.     move.w    #0,-(sp)
  78.     move.w    #$4a,-(sp)
  79.     trap    #1            ; Registrera programet
  80.     add.l    #12,sp
  81.  
  82.     move.l    #300000,-(sp)
  83.     move.w    #$48,-(sp)
  84.     trap    #1            ; Begär minne för musik
  85.     addq.l    #6,sp
  86.     tst.l    d0
  87.     beq    fel
  88.     move.l    d0,datagrejer
  89.     add.l    #300000,d0
  90.     move.l    d0,workspc
  91.  
  92.     lea    superfastfinetune,a0
  93.     moveq    #125-1,d0
  94.     moveq    #0,d1        ; Rensa buffern
  95. rensasuperfastfinetune:
  96.     move.l    d1,(a0)+
  97.     move.l    d1,(a0)+
  98.     dbra    d0,rensasuperfastfinetune
  99.  
  100.     lea    superfastfinetune,a0
  101.     moveq    #36-1,d0
  102.     moveq    #0,d1        ; Skriv dit superfast finetune
  103.     lea    mt_PeriodTable,a1
  104. monteraintalenisuperfastfinetune:
  105.     move.w    (a1)+,d2
  106.     move.b    d1,0(a0,d2.w)
  107.     addq.w    #2,d1
  108.     dbra    d0,monteraintalenisuperfastfinetune
  109.  
  110.  
  111.     lea    buffrar,a0
  112.     move.l    #sample,d0
  113.     moveq    #0,d1
  114.     moveq    #3-1,d2
  115. keloop: move.w    d1,d3
  116.     mulu    #1004*2,d3
  117.     add.l    d0,d3
  118.     move.l    d3,(a0)+
  119.     addq.w    #1,d1
  120.     dbra    d2,keloop
  121.     move.l    #sample,(a0)+
  122.  
  123.     move.l    datagrejer,d0
  124.     add.l    #$3b6,d0
  125.     move.l    d0,set1+2
  126.     addq.l    #1,d0
  127.     move.l    d0,set2+2
  128.  
  129.     clr.l    -(sp)
  130.     move.w    #$20,-(sp)
  131.     trap    #1        ; Super
  132.     addq.l    #6,sp
  133.  
  134.     move.b    $484,keyclick
  135.     bclr.b    #0,$484
  136.     move.l    $408,controlc
  137.     move.l    #controlleramera,$408
  138.     move.l    $70.w,oldtima
  139.     move.l    $70.w,jumptooldvbl+2
  140.  
  141. loopmajor:
  142.     pea    infotext
  143.     move.w    #9,-(sp)
  144.     trap    #1        ; Skriv ut infotext
  145.     addq.l    #6,sp
  146.  
  147.  
  148.     pea    matain
  149.     move.w    #10,-(sp)
  150.     trap    #1        ; Mata in filnamn
  151.     addq.l    #6,sp
  152.  
  153.     jsr    musoff        ; Musik av
  154.  
  155.     move.l    #320000,laslangd
  156.     move.l    datagrejer,lasbuffer
  157.     move.l    #musiknamn,filnamn
  158.     jsr    ladda            ; Ladda musik
  159.  
  160.     move.w    #6,speed    ; Återställ alla variabler
  161.     clr.w    counter
  162.     clr.b    songpos
  163.     clr.b    break
  164.     clr.w    pattpos
  165.     lea    sample,a0
  166.     move.w    #252*3-1,d0
  167. clearplay:
  168.     clr.w    (a0)+
  169.     dbra    d0,clearplay
  170.     move.l    #sample,samplepek
  171.         lea     wiz1lc,a0
  172.         moveq   #8-1,d0
  173. resetwiz:                ; Sluta spela instrument
  174.         move.l    #dummy,(a0)+
  175.     move.l    #$514,(a0)+
  176.     move.l    #$1f4,(a0)+
  177.     move.l    #$454,(a0)+
  178.         move.w    #$651c,(a0)+
  179.         dbra    d0,resetwiz
  180.         lea     aud1lc,a0
  181.         moveq   #8-1,d0
  182. resetaud:
  183.         move.l  #dummy,(a0)+
  184.     move.w    #$320,(a0)+
  185.     move.w    #$358,(a0)+
  186.     move.w    #$40,(a0)+
  187.     clr.l    (a0)+
  188.     clr.l    (a0)+
  189.         dbra    d0,resetaud
  190.         lea     voice1,a0
  191.         moveq   #8-1,d0
  192. resetvoice:
  193.     clr.l    (a0)+
  194.     move.l    #dummy,(a0)+
  195.     move.w    #$320,(a0)+
  196.     move.l    dummy,(a0)+
  197.     move.w    #$1f4,(a0)+
  198.     move.w    #$358,(a0)+
  199.     move.w    #$40,(a0)+
  200.     addq.l    #2,a0
  201.     clr.w    (a0)+
  202.     clr.l    (a0)+
  203.     move.l    #itab0,(a0)+
  204.     move.l    #$1f4,(a0)+
  205.     clr.l    (a0)+
  206.     dbra    d0,resetvoice
  207.  
  208.  
  209.     pea    spelatext
  210.     move.w    #9,-(sp)
  211.     trap    #1        ; Skriv ut spelatext
  212.     addq.l    #6,sp
  213.     move.l    datagrejer,-(sp)
  214.     move.w    #9,-(sp)
  215.     trap    #1        ; Skriv ut sångnamnet
  216.     addq.l    #6,sp
  217.  
  218.     jsr    muson        ; Musik på
  219.  
  220.     bra    loopmajor
  221.  
  222. fel:    illegal
  223.  
  224. ;------------------------------- Cut here ------------------------------;
  225.  
  226. controlleramera:
  227.     movem.l d0-d7/a0-a6,-(sp)
  228.     move.l    datagrejer,-(sp)
  229.     move.w    #$49,-(sp)
  230.     trap    #1        ; Släpp minne
  231.     addq.l    #6,sp
  232.  
  233.     move.w    #$FFF,$ff8240
  234.  
  235.     move.w    #'',-(sp)
  236.     move.w    #2,-(sp)
  237.     move.w    #3,-(sp)
  238.     trap    #13        ; Ta bort kursorn
  239.     addq.l    #6,sp
  240.     move.w    #'f',-(sp)
  241.     move.w    #2,-(sp)
  242.     move.w    #3,-(sp)
  243.     trap    #13
  244.     addq.l    #6,sp
  245.  
  246.     move.b    keyclick,$484
  247.     jsr    musoff        ; Musik av
  248.  
  249.     move.l    controlc,$408
  250.     movem.l (sp)+,d0-d7/a0-a6
  251.     move.l    controlc,-(sp)    ; Hoppa till tidigare registrerad rutin
  252.     rts
  253.  
  254. ladda:    clr.w    -(sp)            ; Läser in en fil
  255.     move.l    filnamn,-(sp)
  256.     move.w    #$3d,-(sp)
  257.     trap    #1            ; Öppna fil
  258.     addq.l    #8,sp
  259.     tst.l    d0
  260.     bmi    loopmajor
  261.     move.w    d0,handle
  262.  
  263.     move.l    lasbuffer,-(sp)
  264.     move.l    laslangd,-(sp)
  265.     move.w    handle,-(sp)
  266.     move.w    #$3f,-(sp)
  267.     trap    #1            ; Läs fil
  268.     lea    12(sp),sp
  269.  
  270.     move.w    handle,-(sp)
  271.     move.w    #$3e,-(sp)
  272.     trap    #1            ; Stäng fil
  273.     addq.l    #4,sp
  274.  
  275.     rts
  276.  
  277. ;---------------------------------------------------- Interrupts on/off --
  278. muson    jsr    incrcal         ; Calculate tonetables
  279.     bsr    vol            ; Calculate volume tables
  280.  
  281.     jsr    init            ; Initialize music
  282.     jsr    prepare         ; Prepare samples
  283.  
  284.     move.l    datagrejer,d0
  285.     nop
  286.     nop
  287.  
  288.     move    #$2700,sr
  289.  
  290.     move.l    $70,oldtima
  291.     move.l    #stereo,$70
  292.  
  293.     move.w    #$7ff,$ffff8924.w
  294.  
  295.     move.b    #3,$FF8921            ; Frequency
  296.  
  297.     lea    $FF8907,a0
  298.  
  299.     move.l    #sample,d0
  300.     move.b    d0,(a0)
  301.     lsr.w    #8,d0
  302.     move.l    d0,-5(a0)
  303.  
  304.     move.l    #sample+(1004*3*2),d0
  305.     move.b    d0,12(a0)
  306.     lsr.w    #8,d0
  307.     move.l    d0,7(a0)
  308.  
  309.     clr.l    $466
  310.     move    #$2300,sr
  311. sdf:    tst.l    $466
  312.     beq.s    sdf
  313.  
  314.     move.b    #3,$FF8901        ; Start DMA
  315.  
  316.     rts
  317.  
  318. musoff    move    #$2700,sr
  319.  
  320.     move.l    oldtima,$70    ; Restore everything
  321.  
  322.     clr.b    $FF8901         ; Stop DMA
  323.  
  324.     move    #$2300,sr
  325.     rts
  326.  
  327. oldtima DC.L 0
  328.  
  329. ;------------------------------------------------------ Increment-table --
  330. incrcal:lea    stab0,a0
  331.     move.w    #$30,d1
  332.     move.w    #$039F-$30,d0
  333.     move.l    #INC,d2
  334.  
  335. recalc    swap    d2
  336.     moveq    #0,d3
  337.     move.w    d2,d3
  338.     divu    d1,d3
  339.     move.w    d3,d4
  340.     swap    d4
  341.  
  342.     swap    d2
  343.     move.w    d2,d3
  344.     divu    d1,d3
  345.     move.w    d3,d4
  346.     move.l    d4,(a0)+
  347.  
  348.     addq.w    #1,d1
  349.     dbra    d0,recalc
  350.     rts
  351.  
  352. itab0:    DS.L $30
  353. stab0:    DS.L $03A0-$30
  354.  
  355. ;---------------------------------------- Räkna ut volymkontrollbuffern --
  356.  
  357. vol:    moveq    #64,d0
  358.     lea    vtabend,a0
  359.     moveq    #64,d3
  360. .ploop:    move.w    #255,d1
  361. .mloop:    move.w    d1,d2
  362.     ext.w    d2
  363.     muls    d0,d2
  364.     divs    d3,d2            ; <---- Master volume
  365.     move.b    d2,-(a0)
  366.     dbra    d1,.mloop
  367.     dbra    d0,.ploop
  368.     rts
  369.  
  370. vtab:    ds.b    65*256            ; Volymtabell
  371. vtabend:
  372.  
  373. ;-------------------------------------------------------- DMA interrupt --
  374.  
  375. stereo
  376.     movem.l d0-d7/a0-a6,-(sp)
  377.  
  378.     clr.w    $ff8240
  379.  
  380.     move.w    righthardvol,$ffff8922.w
  381. väntainhögerhårdvaruvolym:
  382.     cmp.w    #$7ff,$ffff8924.w
  383.     bne.s    väntainhögerhårdvaruvolym
  384.  
  385.     move.w    lefthardvol,$ffff8922.w
  386.  
  387.     addq.w    #1,vantapasam
  388.     move.w    vantapasam,d0
  389.     cmp.w    #2,d0
  390.     bls.s    ejborjaom
  391.     clr.w    vantapasam
  392. ejborjaom:
  393.     move.w    vantapasam,d0
  394.     add.w    d0,d0
  395.     add.w    d0,d0
  396.     lea    buffrar,a0
  397.     move.l    (a0,d0.w),samplepek
  398.     addq.w    #4,d0
  399.     move.l    (a0,d0.w),d1
  400.     move.b    $ffff8909.w,ultradummy+1
  401.     move.b    $ffff890b.w,ultradummy+2
  402.     move.b    $ffff890d.w,ultradummy+3
  403.     move.l    ultradummy,d0
  404.     cmp.l    d1,d0
  405.     bgt.s    hejhopp
  406.     cmp.l    samplepek,d0
  407.     bls.s    hejhopp
  408.     subq.w    #1,vantapasam
  409.     jmp    ejspeladennagang
  410. hejhopp:
  411.  
  412.     jsr    music
  413.  
  414.     moveq    #0,d0
  415.     moveq    #0,d4
  416.     move.w    aud3vol,d6
  417.     move.w    aud2vol,d7
  418.     and.w    #$FF,d7
  419.     and.w    #$FF,d6
  420.     cmp.w    d7,d6
  421.     ble.s    sätt2anhögst
  422.     move.w    #$ff,$ffff8240.w
  423.     mulu    #64,d7
  424.     divu    d6,d7
  425.     lsl.w    #8,d7
  426.     lea    vtab,a3
  427.     add.w    d7,a3
  428.     movea.l wiz3lc,a0
  429.     move.l    wiz3pos,d0
  430.     add.w    d6,d6
  431.     bne.s    intedummy1
  432.     move.w    #$FFF,$ffff8240.w
  433.     lea    dummy,a0
  434.     moveq    #0,d0
  435. intedummy1:
  436.     lea    hardvolumesetright,a6
  437.     move.w    #%10100000000,d7
  438.     or.w    (a6,d6.w),d7
  439.     move.w    d7,righthardvol        ; Sätt hårdvaruvolym höger
  440.     move.w    wiz3frc,d1
  441.     move.w    aud3per,d7
  442.     movea.l wiz2lc,a1
  443.     move.l    wiz2pos,d4
  444.     move.w    wiz2frc,d5
  445.     move.w    aud2per,d6
  446.     clr.w    first
  447.     bra.s    satt3anhögst
  448. sätt2anhögst:
  449.     move.w    #$f0f,$ffff8240.w
  450.     mulu    #64,d6
  451.     divu    d7,d6
  452.     lsl.w    #8,d6
  453.     lea    vtab,a3
  454.     add.w    d6,a3
  455.     movea.l wiz2lc,a0
  456.     move.l    wiz2pos,d0
  457.     add.w    d7,d7
  458.     bne.s    intedummy2
  459.     move.w    #$FFF,$ffff8240.w
  460.     lea    dummy,a0
  461.     moveq    #0,d0
  462. intedummy2:
  463.     lea    hardvolumesetright,a6
  464.     move.w    #%10100000000,d6
  465.     or.w    (a6,d7.w),d6
  466.     move.w    d6,righthardvol        ; Sätt hårdvaruvolym höger
  467.     move.w    wiz2frc,d1
  468.     move.w    aud2per,d7
  469.     movea.l wiz3lc,a1
  470.     move.l    wiz3pos,d4
  471.     move.w    wiz3frc,d5
  472.     move.w    aud3per,d6
  473.     move.w    #1,first
  474. satt3anhögst:
  475.  
  476.     lea    itab0,a5
  477.     clr.w    extraoffsetadded1
  478.     cmp.l    #$8000,d0
  479.     blt.s    inteenkonstigoffset2
  480.     sub.l    #$8000,d0
  481.     add.l    #$8000,a0
  482.     move.w    #1,extraoffsetadded1
  483. inteenkonstigoffset2:
  484.     add.w    d7,d7
  485.     add.w    d7,d7
  486.     move.w    0(a5,d7.w),d2
  487.     movea.w 2(a5,d7.w),a4
  488.     lea    itab0,a5
  489.     move.w    d6,d7
  490.     clr.w    extraoffsetadded2
  491.     cmp.l    #$8000,d4
  492.     blt.s    inteenkonstigoffset3
  493.     sub.l    #$8000,d4
  494.     add.l    #$8000,a1
  495.     move.w    #1,extraoffsetadded2
  496. inteenkonstigoffset3:
  497.     add.w    d7,d7
  498.     add.w    d7,d7            ; 8
  499.     move.w    0(a5,d7.w),d6        ; 14
  500.     movea.w 2(a5,d7.w),a5        ; 14
  501.     move.l    samplepek,a6        ; 20
  502.     moveq    #0,d3            ; 4
  503.     moveq    #0,d7
  504.  
  505.  
  506.  
  507.     rept    502
  508.     add.w    a4,d1
  509.     addx.w    d2,d0
  510.     add.w    a5,d5
  511.     addx.w    d6,d4
  512.     move.b    0(a0,d0.l),d3
  513.     move.b    0(a1,d4.l),d7
  514.     add.b    0(a3,d7.w),d3
  515.     move.w    d3,(a6)+
  516.     move.w    d3,(a6)+
  517.     endr
  518.  
  519.  
  520.  
  521.     tst.w    extraoffsetadded1
  522.     beq.s    inteensubattgöra2
  523.     sub.l    #$8000,a0
  524.     add.l    #$8000,d0
  525. inteensubattgöra2:
  526.     tst.w    extraoffsetadded2
  527.     beq.s    inteensubattgöra3
  528.     sub.l    #$8000,a1
  529.     add.l    #$8000,d4
  530. inteensubattgöra3:
  531.  
  532.     tst.w    first
  533.     beq.s    nonononono
  534.     move.w    #$F00,$ffff8240.w
  535.     cmp.l    wiz2len,d0
  536.     blt.s    .ok2
  537.     sub.l    wiz2rpt,d0
  538. .ok2    move.l    d0,wiz2pos
  539.     move.w    d1,wiz2frc
  540.     cmp.l    wiz3len,d4
  541.     blt.s    .ok3
  542.     sub.l    wiz3rpt,d4
  543. .ok3    move.l    d4,wiz3pos
  544.     move.w    d5,wiz3frc
  545.     bra.s    jaajjaja
  546. nonononono:
  547.     move.w    #$F0,$ffff8240.w
  548.     cmp.l    wiz3len,d0
  549.     blt.s    .ok22
  550.     sub.l    wiz3rpt,d0
  551. .ok22    move.l    d0,wiz3pos
  552.     move.w    d1,wiz3frc
  553.     cmp.l    wiz2len,d4
  554.     blt.s    .ok32
  555.     sub.l    wiz2rpt,d4
  556. .ok32    move.l    d4,wiz2pos
  557.     move.w    d5,wiz2frc
  558. jaajjaja:
  559.  
  560.  
  561.     moveq    #0,d0
  562.     moveq    #0,d4
  563.     move.w    aud4vol,d6
  564.     move.w    aud1vol,d7
  565.     and.w    #$FF,d7
  566.     and.w    #$FF,d6
  567.     cmp.w    d7,d6
  568.     ble.s    sätt1anhögst
  569.     move.w    #$ff,$ffff8240.w
  570.     mulu    #64,d7
  571.     divu    d6,d7
  572.     lsl.w    #8,d7
  573.     lea    vtab,a3
  574.     add.w    d7,a3
  575.     movea.l wiz4lc,a0
  576.     move.l    wiz4pos,d0
  577.     add.w    d6,d6
  578.     bne.s    intedummy3
  579.     move.w    #$FFF,$ffff8240.w
  580.     lea    dummy,a0
  581.     moveq    #0,d0
  582. intedummy3:
  583.     lea    hardvolumesetright,a6
  584.     move.w    #%10101000000,d7
  585.     or.w    (a6,d6.w),d7
  586.     move.w    d7,lefthardvol        ; Sätt hårdvaruvolym vänster
  587.     move.w    wiz4frc,d1
  588.     move.w    aud4per,d7
  589.     movea.l wiz1lc,a1
  590.     move.l    wiz1pos,d4
  591.     move.w    wiz1frc,d5
  592.     move.w    aud1per,d6
  593.     clr.w    first
  594.     bra.s    satt4anhögst
  595. sätt1anhögst:
  596.     move.w    #$f0f,$ffff8240.w
  597.     mulu    #64,d6
  598.     divu    d7,d6
  599.     lsl.w    #8,d6
  600.     lea    vtab,a3
  601.     add.w    d6,a3
  602.     movea.l wiz1lc,a0
  603.     move.l    wiz1pos,d0
  604.     add.w    d7,d7
  605.     bne.s    intedummy4
  606.     move.w    #$FFF,$ffff8240.w
  607.     lea    dummy,a0
  608.     moveq    #0,d0
  609. intedummy4:
  610.     lea    hardvolumesetright,a6
  611.     move.w    #%10101000000,d6
  612.     or.w    (a6,d7.w),d6
  613.     move.w    d6,lefthardvol        ; Sätt hårdvaruvolym vänster
  614.     move.w    wiz1frc,d1
  615.     move.w    aud1per,d7
  616.     movea.l wiz4lc,a1
  617.     move.l    wiz4pos,d4
  618.     move.w    wiz4frc,d5
  619.     move.w    aud4per,d6
  620.     move.w    #1,first
  621. satt4anhögst:
  622.  
  623.     lea    itab0,a5
  624.     clr.w    extraoffsetadded1
  625.     cmp.l    #$8000,d0
  626.     blt.s    inteenkonstigoffset1
  627.     sub.l    #$8000,d0
  628.     add.l    #$8000,a0
  629.     move.w    #1,extraoffsetadded1
  630. inteenkonstigoffset1:
  631.     add.w    d7,d7
  632.     add.w    d7,d7
  633.     move.w    0(a5,d7.w),d2
  634.     movea.w 2(a5,d7.w),a4
  635.     lea    itab0,a5
  636.     move.w    d6,d7
  637.     clr.w    extraoffsetadded2
  638.     cmp.l    #$8000,d4
  639.     blt.s    inteenkonstigoffset4
  640.     sub.l    #$8000,d4
  641.     add.l    #$8000,a1
  642.     move.w    #1,extraoffsetadded2
  643. inteenkonstigoffset4:
  644.     add.w    d7,d7
  645.     add.w    d7,d7            ; 8
  646.     move.w    0(a5,d7.w),d6        ; 14
  647.     movea.w 2(a5,d7.w),a5        ; 14
  648.     move.l    samplepek,a6        ; 20
  649.     moveq    #0,d3            ; 4
  650.     moveq    #0,d7
  651.  
  652.  
  653.  
  654.     rept    502
  655.     add.w    a4,d1
  656.     addx.w    d2,d0
  657.     add.w    a5,d5
  658.     addx.w    d6,d4
  659.     move.b    0(a0,d0.l),d3
  660.     move.b    0(a1,d4.l),d7
  661.     add.b    0(a3,d7.w),d3
  662.     move.b    d3,(a6)
  663.     move.b    d3,2(a6)
  664.     addq.w    #4,a6
  665.     endr
  666.  
  667.  
  668.  
  669.     tst.w    extraoffsetadded1
  670.     beq.s    inteensubattgöra1
  671.     sub.l    #$8000,a0
  672.     add.l    #$8000,d0
  673. inteensubattgöra1:
  674.     tst.w    extraoffsetadded2
  675.     beq.s    inteensubattgöra4
  676.     sub.l    #$8000,a1
  677.     add.l    #$8000,d4
  678. inteensubattgöra4:
  679.  
  680.     tst.w    first
  681.     beq.s    nonononono2
  682.     move.w    #$F00,$ffff8240.w
  683.     cmp.l    wiz1len,d0
  684.     blt.s    .ok1
  685.     sub.l    wiz1rpt,d0
  686. .ok1    move.l    d0,wiz1pos
  687.     move.w    d1,wiz1frc
  688.     cmp.l    wiz4len,d4
  689.     blt.s    .ok4
  690.     sub.l    wiz4rpt,d4
  691. .ok4    move.l    d4,wiz4pos
  692.     move.w    d5,wiz4frc
  693.     bra.s    jaajjaja2
  694. nonononono2:
  695.     move.w    #$F0,$ffff8240.w
  696.     cmp.l    wiz4len,d0
  697.     blt.s    .ok12
  698.     sub.l    wiz4rpt,d0
  699. .ok12    move.l    d0,wiz4pos
  700.     move.w    d1,wiz4frc
  701.     cmp.l    wiz1len,d4
  702.     blt.s    .ok42
  703.     sub.l    wiz1rpt,d4
  704. .ok42    move.l    d4,wiz1pos
  705.     move.w    d5,wiz1frc
  706. jaajjaja2:
  707.  
  708.  
  709.  
  710.  
  711. ejspeladennagang:
  712.     movem.l (sp)+,d0-d7/a0-a6
  713.     move.w    #$FFF,$ff8240
  714. jumptooldvbl:
  715.     jmp    $12345678
  716.  
  717. ;-------------------------------------------- Hardware-registers & data --
  718.  
  719. lefthardvol:
  720.     dc.w    %10101000000
  721. righthardvol:
  722.     dc.w    %10100000000
  723. first:    dc.w    0
  724.  
  725. voice1:    DS.W 10
  726.     DC.W $01    ; Till för dmacon
  727.     DS.W 3
  728.     dc.l    itab0
  729.     dc.l    0
  730.     dc.l    0
  731. voice2    DS.W 10
  732.     DC.W $02
  733.     DS.W 3
  734.     dc.l    itab0
  735.     dc.l    0
  736.     dc.l    0
  737. voice3    DS.W 10
  738.     DC.W $04
  739.     DS.W 3
  740.     dc.l    itab0
  741.     dc.l    0
  742.     dc.l    0
  743. voice4    DS.W 10
  744.     DC.W $08
  745.     DS.W 3
  746.     dc.l    itab0
  747.     dc.l    0
  748.     dc.l    0
  749. voice5    DS.W 10
  750.     DC.W $10
  751.     DS.W 3
  752.     dc.l    itab0
  753.     dc.l    0
  754.     dc.l    0
  755. voice6    DS.W 10
  756.     DC.W $20
  757.     DS.W 3
  758.     dc.l    itab0
  759.     dc.l    0
  760.     dc.l    0
  761. voice7    DS.W 10
  762.     DC.W $40
  763.     DS.W 3
  764.     dc.l    itab0
  765.     dc.l    0
  766.     dc.l    0
  767. voice8    DS.W 10
  768.     DC.W $80
  769.     DS.W 3
  770.     dc.l    itab0
  771.     dc.l    0
  772.     dc.l    0
  773.  
  774. wiz1lc: DC.L sample        ; Innehåller data om hur sampling skall skrivas till buffern
  775. wiz1len:DC.L 0            ; Längd
  776. wiz1rpt:DC.L 0            ; Repetition
  777. wiz1pos:DC.L 0            ; Vart ligger i dma-buffern
  778. wiz1frc:DC.W 0            ; Vilken frekvens spelar vi på?
  779.  
  780. wiz2lc: DC.L sample
  781. wiz2len:DC.L 0
  782. wiz2rpt:DC.L 0
  783. wiz2pos:DC.L 0
  784. wiz2frc:DC.W 0
  785.  
  786. wiz3lc: DC.L sample
  787. wiz3len:DC.L 0
  788. wiz3rpt:DC.L 0
  789. wiz3pos:DC.L 0
  790. wiz3frc:DC.W 0
  791.  
  792. wiz4lc: DC.L sample
  793. wiz4len:DC.L 0
  794. wiz4rpt:DC.L 0
  795. wiz4pos:DC.L 0
  796. wiz4frc:DC.W 0
  797.  
  798. wiz5lc: DC.L sample
  799. wiz5len:DC.L 0
  800. wiz5rpt:DC.L 0
  801. wiz5pos:DC.L 0
  802. wiz5frc:DC.W 0
  803.  
  804. wiz6lc: DC.L sample
  805. wiz6len:DC.L 0
  806. wiz6rpt:DC.L 0
  807. wiz6pos:DC.L 0
  808. wiz6frc:DC.W 0
  809.  
  810. wiz7lc: DC.L sample
  811. wiz7len:DC.L 0
  812. wiz7rpt:DC.L 0
  813. wiz7pos:DC.L 0
  814. wiz7frc:DC.W 0
  815.  
  816. wiz8lc: DC.L sample
  817. wiz8len:DC.L 0
  818. wiz8rpt:DC.L 0
  819. wiz8pos:DC.L 0
  820. wiz8frc:DC.W 0
  821.  
  822. aud1lc: DC.L dummy        ; Vart skall vi hämta samplingen någonstans?
  823. aud1len:DC.W 0            ; Längd på den
  824. aud1per:DC.W 0            ; Frekvens
  825. aud1vol:DC.W 0            ; Volym på samplingen
  826. aud1off:DC.W 0            ; Sampleoffsetten
  827.     DS.W 3
  828.  
  829. aud2lc: DC.L dummy
  830. aud2len:DC.W 0
  831. aud2per:DC.W 0
  832. aud2vol:DC.W 0
  833. aud2off:DC.W 0
  834.     DS.W 3
  835.  
  836. aud3lc: DC.L dummy
  837. aud3len:DC.W 0
  838. aud3per:DC.W 0
  839. aud3vol:DC.W 0
  840. aud3off:DC.W 0
  841.     DS.W 3
  842.  
  843. aud4lc: DC.L dummy
  844. aud4len:DC.W 0
  845. aud4per:DC.W 0
  846. aud4vol:DC.W 0
  847. aud4off:DC.W 0
  848.     DS.W 3
  849.  
  850. aud5lc: DC.L dummy
  851. aud5len:DC.W 0
  852. aud5per:DC.W 0
  853. aud5vol:DC.W 0
  854. aud5off:DC.W 0
  855.     DS.W 3
  856.  
  857. aud6lc: DC.L dummy
  858. aud6len:DC.W 0
  859. aud6per:DC.W 0
  860. aud6vol:DC.W 0
  861. aud6off:DC.W 0
  862.     DS.W 3
  863.  
  864. aud7lc: DC.L dummy
  865. aud7len:DC.W 0
  866. aud7per:DC.W 0
  867. aud7vol:DC.W 0
  868. aud7off:DC.W 0
  869.     DS.W 3
  870.  
  871. aud8lc: DC.L dummy
  872. aud8len:DC.W 0
  873. aud8per:DC.W 0
  874. aud8vol:DC.W 0
  875. aud8off:DC.W 0
  876.     DS.W 3
  877.  
  878. dmactrl:DC.W 0
  879.  
  880. dummy:    DS.B 2000
  881.  
  882. samplepek:
  883.     DC.L sample
  884.  
  885. sample: DS.W 1004*3*2
  886. samdummy:
  887.     dc.l    0
  888. vantapasam:
  889.     dc.w    -1
  890. buffrar:ds.l    4
  891.  
  892. ;========================================================= EMULATOR END ==
  893.  
  894. prepare:
  895.     move.l    workspc,a6
  896.     movea.l samplestarts,a0
  897.     movea.l end_of_samples,a1
  898.  
  899. tostack move.w    -(a1),-(a6)
  900.     cmpa.l    a0,a1            ; Move all samples to stack
  901.     bgt.s    tostack
  902.  
  903.     lea    samplestarts,a2
  904.     move.l    datagrejer,a1          ; Module
  905.     movea.l (a2),a0         ; Start of samples
  906.     movea.l a0,a5            ; Save samplestart in a5
  907.  
  908.     moveq    #30,d7
  909.  
  910. roop    move.l    a0,(a2)+        ; Sampleposition
  911.  
  912.     tst.w    $2A(a1)
  913.     beq.s    samplok         ; Len=0 -> no sample
  914.  
  915.     tst.w    $2E(a1)         ; Test repstrt
  916.     bne.s    repne            ; Jump if not zero
  917.  
  918.  
  919. repeq    move.w    $2A(a1),d0        ; Length of sample
  920.     move.w    d0,d4
  921.     subq.w    #1,d0
  922.  
  923.     movea.l a0,a4
  924. fromstk move.w    (a6)+,(a0)+        ; Move all samples back from stack
  925.     dbra    d0,fromstk
  926.  
  927.     bra.s    rep
  928.  
  929.  
  930.  
  931. repne    move.w    $2E(a1),d0
  932.     move.w    d0,d4
  933.     subq.w    #1,d0
  934.  
  935.     movea.l a6,a4
  936. get1st    move.w    (a4)+,(a0)+        ; Fetch first part
  937.     dbra    d0,get1st
  938.  
  939.     adda.w    $2A(a1),a6        ; Move a6 to next sample
  940.     adda.w    $2A(a1),a6
  941.  
  942.  
  943.  
  944. rep    movea.l a0,a5
  945.     moveq    #0,d1
  946. toosmal movea.l a4,a3
  947.     move.w    $30(a1),d0
  948.     subq.w    #1,d0
  949. moverep move.w    (a3)+,(a0)+        ; Repeatsample
  950.     addq.w    #2,d1
  951.     dbra    d0,moverep
  952.     cmp.w    #1000,d1         ; Must be > 1000
  953.     blt.s    toosmal
  954.  
  955.     move.w    #1000/2-1,d2
  956. last13200
  957.     move.w    (a5)+,(a0)+        ; Safety 1000 bytes
  958.     dbra    d2,last13200
  959.  
  960. done    add.w    d4,d4
  961.  
  962.     move.w    d4,$2A(a1)        ; length
  963.     move.w    d1,$30(a1)        ; Replen
  964.     clr.w    $2E(a1)
  965.  
  966. samplok lea    $1E(a1),a1
  967.     dbra    d7,roop
  968.  
  969.     cmp.l    workspc,a0
  970.     bgt.s    .nospac
  971.  
  972.  
  973.  
  974.     rts
  975.  
  976. .nospac illegal
  977.  
  978. end_of_samples    DC.L 0
  979.  
  980. ;------------------------------------------------------ Main replayrout --
  981. init    move.l    datagrejer,a0
  982.     lea    $03B8(a0),a1
  983.  
  984.     moveq    #$7F,d0
  985.     moveq    #0,d1
  986. loop    move.l    d1,d2
  987.     subq.w    #1,d0
  988. lop2    move.b    (a1)+,d1
  989.     cmp.b    d2,d1
  990.     bgt.s    loop
  991.     dbra    d0,lop2
  992.     addq.b    #1,d2
  993.  
  994.     lea    samplestarts,a1
  995.     asl.l    #8,d2
  996.     asl.l    #2,d2
  997.     add.l    #$043C,d2
  998.     add.l    a0,d2
  999.     movea.l d2,a2
  1000.     move.l    a2,a4
  1001.     moveq    #0,d5
  1002.  
  1003.     moveq    #$1E,d0
  1004. lop3    clr.l    (a2)
  1005.     move.l    a2,(a1)+
  1006.     moveq    #0,d1
  1007.     move.w    42(a0),d1
  1008.     add.l    d1,d1
  1009.     adda.l    d1,a2
  1010.     add.l    d1,d5
  1011.     adda.l    #$1E,a0
  1012.     dbra    d0,lop3
  1013.  
  1014. lldd:    move.b    (a4),d6
  1015.     asr.b    #1,d6            ; Dela ner samplingen så att vi kan
  1016.     move.b    d6,(a4)+        ; spela med den utan volymkontroll
  1017.     subq.l    #1,d5            ; om vi vill
  1018.     bne.s    lldd
  1019.  
  1020.     move.l    a2,end_of_samples    ;
  1021.     rts
  1022.  
  1023.  
  1024.  
  1025. music:    addq.w    #$01,counter        ; Dax att gå fram ett steg i patternet?
  1026.     move.w    counter(pc),d0
  1027.     cmp.w    speed(pc),d0
  1028.     blt    nonew            ; Nix, fortsätt att spela på instrumenten
  1029.     clr.w    counter         ; Jepp, rensa
  1030.     bra    getnew            ; Fix och trixa med kommandon mm
  1031.  
  1032. nonew:    lea    voice1(pc),a4    ; a4 Pekare till ? 
  1033.     lea    aud1lc(pc),a3    ; a3 Pekare till sampling och div data om den
  1034.     bsr    checkcom    ; Testa kommandon
  1035.     lea    voice2(pc),a4
  1036.     lea    aud2lc(pc),a3
  1037.     bsr    checkcom
  1038.     lea    voice3(pc),a4
  1039.     lea    aud3lc(pc),a3
  1040.     bsr    checkcom
  1041.     lea    voice4(pc),a4
  1042.     lea    aud4lc(pc),a3
  1043.     bsr    checkcom
  1044.     bra    endread         ; Gör slut på't
  1045.  
  1046. arpeggio:            ; Kommando 0, arpeggio
  1047.     moveq    #0,d0
  1048.     move.w    counter(pc),d0
  1049.     divs    #$03,d0
  1050.     swap    d0
  1051.     tst.w    d0
  1052.     beq.s    arp2
  1053.     cmp.w    #$02,d0
  1054.     beq.s    arp1
  1055.  
  1056.     moveq    #0,d0
  1057.     move.b    $03(a4),d0
  1058.     lsr.b    #4,d0
  1059.     bra.s    arp3
  1060.  
  1061. arp1:    moveq    #0,d0
  1062.     move.b    $03(a4),d0
  1063.     and.b    #$0F,d0
  1064.     bra.s    arp3
  1065.  
  1066. arp2:    move.w    $10(a4),d2
  1067.     bra.s    arp4
  1068.  
  1069. arp3:    add.w    d0,d0
  1070.     moveq    #0,d1
  1071.     move.w    $10(a4),d1
  1072.     lea    periods,a0
  1073.     moveq    #$24,d4
  1074. arploop:move.w    0(a0,d0.w),d2
  1075.     cmp.w    (a0),d1
  1076.     bge.s    arp4
  1077.     addq.l    #2,a0
  1078.     dbra    d4,arploop
  1079.     rts
  1080.  
  1081. arp4:    move.w    d2,$06(a3)
  1082.     rts
  1083.                 ; Fixa nästa position och tolka den
  1084. getnew:    move.l    datagrejer,a0
  1085.     lea    $43c(a0),a0
  1086.     lea    -$043C+$0C(a0),a2
  1087.     lea    -$043C+$03B8(a0),a1
  1088.  
  1089.  
  1090.     moveq    #0,d0
  1091.     move.l    d0,d1
  1092.     move.b    songpos(pc),d0        ; d0 vart i songen vi ligger
  1093.     move.b    0(a1,d0.w),d1        ; Vilket pattern skall spelas nu?
  1094.     asl.l    #8,d1            ; *  2048
  1095. tre7:    asl.l    #2,d1
  1096.     add.w    pattpos(pc),d1        ; Addera vart i patternet vi ligger just nu
  1097.     clr.w    dmacon            ; Ingen dmacon =  inga nya anslag än då länge
  1098.  
  1099.     lea    aud1lc(pc),a3        ; Pekare till samplingsdata
  1100.     lea    voice1(pc),a4        ; Pekare till voiceinfon
  1101.     bsr    playvoice        ; Spela kanal
  1102.     lea    aud2lc(pc),a3        ; Gör samma sak för resten av kanalerna
  1103.     lea    voice2(pc),a4
  1104.     bsr.s    playvoice
  1105.     lea    aud3lc(pc),a3
  1106.     lea    voice3(pc),a4
  1107.     bsr.s    playvoice
  1108.     lea    aud4lc(pc),a3
  1109.     lea    voice4(pc),a4
  1110.     bsr.s    playvoice
  1111.     bra    setdma
  1112.                 ; Spela en kanal
  1113. playvoice:
  1114.     move.l    0(a0,d1.l),(a4) ; Hämta in kanalen till voice
  1115.     addq.l    #4,d1        ; nästa kanal i d1
  1116.     moveq    #0,d2
  1117.     move.b    $02(a4),d2
  1118.     and.b    #$F0,d2     ; Plocka ut om det finns någon instrument-data
  1119.     lsr.b    #4,d2
  1120.     move.b    (a4),d0
  1121.     and.b    #$F0,d0
  1122.     or.b    d0,d2
  1123.     tst.b    d2        ; d2 vilket instrument 0-$1f
  1124.     beq    setregs     ; Inget nytt instrument?
  1125.     moveq    #0,d3
  1126.     lea    samplestarts(pc),a1    ; Pekare till tabellen över vart samplingarna börjar i minnet
  1127.     move.l    d2,d4        ; d2 Instrument till d4
  1128.     subq.l    #$01,d2
  1129.     asl.l    #2,d2
  1130.     mulu    #$1E,d4        ; Rätt offset för modulinstrumenten
  1131.     move.l    0(a1,d2.l),$04(a4)    ; Pekare till sampling till voice
  1132.     move.w    0(a2,d4.l),$08(a4)    ; Längden på samplingen i bytes +22
  1133.  
  1134.     move.w    $02(a2,d4.l),$12(a4)    ; Finetune + volym till voice    +24
  1135.                     ; Ingen looping här
  1136.     move.l    $04(a4),$0A(a4)        ; Loopbörjan till voice
  1137.     move.w    $06(a2,d4.l),$0E(a4)    ; Looplängd till voice
  1138.     move.l    $04(a2,d4.l),32(a4)    ; Looplängd till voice
  1139.     move.w    $12(a4),$08(a3)     ; voice-volym till aud
  1140. setregs:move.w    (a4),d0
  1141.     and.w    #$0FFF,d0        ; Finns det någon tonangivelse?
  1142.     beq    checkcom2        ; Nix, kolla om det finns kommandon
  1143.     move.b    $02(a4),d0        ; Effectkommando 3? (Slida till angiven ton?)
  1144.     and.b    #$0F,d0
  1145.     cmp.b    #$03,d0
  1146.     bne.s    setperiod        ; Nix
  1147.     bsr    setmyport        ; Jepp, slida på
  1148.     bra    checkcom2        ; Testa flera kommandon oxo
  1149.  
  1150. setperiod:            ; Sätt frekvensen på kanalen
  1151.     move.w    (a4),d0
  1152.     and.w    #$0FFF,d0
  1153.     lea    superfastfinetune,a6
  1154.     moveq    #0,d6
  1155.     move.b    (a6,d0.w),d6
  1156.     moveq    #0,d7
  1157.     move.b    $12(a4),d7    ; Finetunen
  1158.     mulu    #36*2,d7
  1159.     add.w    d6,d7
  1160.     add.l    #mt_PeriodTable,d7
  1161.     move.l    d7,a6
  1162.     move.w    (a6),$10(a4)
  1163.  
  1164.     move.w    $14(a4),d0
  1165.     move.w    d0,dmactrl
  1166.     clr.b    $1B(a4)
  1167.  
  1168.     clr.l    -132(a3)        ; Återstarta samplingen vid 0
  1169.  
  1170.     move.l    $04(a4),(a3)
  1171.     move.w    $08(a4),$04(a3)
  1172.     move.w    $10(a4),$06(a3)
  1173.     move.w    $14(a4),d0
  1174.     or.w    d0,dmacon
  1175.     bra    checkcom2
  1176.  
  1177. setdma: move.w    dmacon,d0
  1178.     move.w    dmacon2,d7
  1179.  
  1180.     btst    #0,d0            ;-------------------
  1181.     beq    wz_nch1         ;
  1182.     btst    #0,d7
  1183.     bne.s    intesättafrekviwiz1
  1184.     move.l    aud1lc(pc),wiz1lc    ; Sätt Wizcats uppspelare
  1185. intesättafrekviwiz1:
  1186.     moveq    #0,d1            ; med data
  1187.     moveq    #0,d2            ;
  1188.     move.w    aud1len(pc),d1        ;
  1189.     move.l    voice1+32(pc),d2    ;
  1190.     add.l    d2,d1            ;
  1191.     move.l    d1,wiz1len        ;
  1192.     move.l    d2,wiz1rpt        ;
  1193.  
  1194. wz_nch1:btst    #1,d0            ;
  1195.     beq    wz_nch2         ;
  1196.     btst    #1,d7
  1197.     bne.s    intesättafrekviwiz2
  1198.     move.l    aud2lc(pc),wiz2lc    ;
  1199. intesättafrekviwiz2:
  1200.     moveq    #0,d1            ;
  1201.     moveq    #0,d2            ;
  1202.     move.w    aud2len(pc),d1        ;
  1203.     move.l    voice2+32(pc),d2    ;
  1204.     add.l    d2,d1            ;
  1205.     move.l    d1,wiz2len        ;
  1206.     move.l    d2,wiz2rpt        ;
  1207.  
  1208. wz_nch2:btst    #2,d0            ;
  1209.     beq    wz_nch3         ;
  1210.     btst    #2,d7
  1211.     bne.s    intesättafrekviwiz3
  1212.     move.l    aud3lc(pc),wiz3lc    ;
  1213. intesättafrekviwiz3:
  1214.     moveq    #0,d1            ;
  1215.     moveq    #0,d2            ;
  1216.     move.w    aud3len(pc),d1        ;
  1217.     move.l    voice3+32(pc),d2    ;
  1218.     add.l    d2,d1            ;
  1219.     move.l    d1,wiz3len        ;
  1220.     move.l    d2,wiz3rpt        ;
  1221.  
  1222.  
  1223. wz_nch3:btst    #3,d0            ;
  1224.     beq    wz_nch4         ;
  1225.     btst    #3,d7
  1226.     bne.s    intesättafrekviwiz4
  1227.     move.l    aud4lc(pc),wiz4lc    ;
  1228. intesättafrekviwiz4:
  1229.     moveq    #0,d1            ;
  1230.     moveq    #0,d2            ;
  1231.     move.w    aud4len(pc),d1        ;
  1232.     move.l    voice4+32(pc),d2    ;
  1233.     add.l    d2,d1            ;
  1234.     move.l    d1,wiz4len        ;
  1235.     move.l    d2,wiz4rpt        ;
  1236.  
  1237.  
  1238. wz_nch4:clr.w    dmacon2
  1239.     addi.w    #$10,pattpos
  1240.     cmpi.w    #$0400,pattpos
  1241.     bne.s    endread
  1242. nex:    clr.w    pattpos
  1243.     clr.b    break
  1244.     addq.b    #1,songpos
  1245.     andi.b    #$7F,songpos
  1246.     move.b    songpos(pc),d1
  1247. set1:    cmp.b    $12345678,d1        ;$03B6
  1248.     bne.s    endread
  1249. set2:    move.b    $12345678,songpos     ;$03B7
  1250. endread:tst.b    break
  1251.     bne.s    nex
  1252.     rts
  1253.  
  1254. setmyport:
  1255.     move.w    (a4),d2
  1256.     and.w    #$0FFF,d2
  1257.     move.w    d2,$18(a4)
  1258.     move.w    $10(a4),d0
  1259.     clr.b    $16(a4)
  1260.     cmp.w    d0,d2
  1261.     beq.s    clrport
  1262.     bge.s    rt
  1263.     move.b    #$01,$16(a4)
  1264.     rts
  1265.  
  1266. clrport:clr.w    $18(a4)
  1267. rt:    rts
  1268.  
  1269. myport: move.b    $03(a4),d0
  1270.     beq.s    myslide
  1271.     move.b    d0,$17(a4)
  1272.     clr.b    $03(a4)
  1273. myslide:tst.w    $18(a4)
  1274.     beq.s    rt
  1275.     moveq    #0,d0
  1276.     move.b    $17(a4),d0
  1277.     tst.b    $16(a4)
  1278.     bne.s    mysub
  1279.     add.w    d0,$10(a4)
  1280.     move.w    $18(a4),d0
  1281.     cmp.w    $10(a4),d0
  1282.     bgt.s    myok
  1283.     move.w    $18(a4),$10(a4)
  1284.     clr.w    $18(a4)
  1285.  
  1286. myok:    move.w    $10(a4),$06(a3)
  1287.     rts
  1288.  
  1289. mysub:    sub.w    d0,$10(a4)
  1290.     move.w    $18(a4),d0
  1291.     cmp.w    $10(a4),d0
  1292.     blt.s    myok
  1293.     move.w    $18(a4),$10(a4)
  1294.     clr.w    $18(a4)
  1295.     move.w    $10(a4),$06(a3)
  1296.     rts
  1297.  
  1298. vib:
  1299.     move.b    $03(a4),d0
  1300.     beq.s    vi
  1301.     move.b    d0,$1A(a4)
  1302.  
  1303. vi:    move.b    $1B(a4),d0
  1304.     lea    sin(pc),a1
  1305.     lsr.w    #$02,d0
  1306.     and.w    #$1F,d0
  1307.     moveq    #0,d2
  1308.     move.b    0(a1,d0.w),d2
  1309.     move.b    $1A(a4),d0
  1310.     and.w    #$0F,d0
  1311.     mulu    d0,d2
  1312.     lsr.w    #$06,d2
  1313.     move.w    $10(a4),d0
  1314.     tst.b    $1B(a4)
  1315.     bmi.s    vibmin
  1316.     add.w    d2,d0
  1317.     bra.s    vib2
  1318.  
  1319. vibmin: sub.w    d2,d0
  1320. vib2:    move.w    d0,$06(a3)
  1321.     move.b    $1A(a4),d0
  1322.     lsr.w    #$02,d0
  1323.     and.w    #$3C,d0
  1324.     add.b    d0,$1B(a4)
  1325.     rts
  1326.  
  1327. nopp:    move.w    $10(a4),$06(a3)
  1328.     rts
  1329.  
  1330. checkcom:
  1331.     move.w    $02(a4),d0    ; Är det ett effectkommando på den här kanalen?
  1332.     and.w    #$0FFF,d0
  1333.     beq.s    nopp        ; Nix
  1334.     move.b    $02(a4),d0    ; Jepp, hämta in vilket
  1335.     and.b    #$0F,d0     ; Plocka ut vilket kommando det är
  1336.     tst.b    d0        ; Inget här betyder arpeggio
  1337.     beq    arpeggio
  1338.     cmp.b    #$01,d0     ; Effectkommando 1, slida upp tonen
  1339.     beq    portup
  1340.     cmp.b    #$02,d0     ; Effectkommando 2, slida ner tonen
  1341.     beq    portdown
  1342.     cmp.b    #$03,d0     ; Effectkommando 3, slida mot ny not
  1343.     beq    myport
  1344.     cmp.b    #$04,d0     ; Effectkommando 4, Vibrato
  1345.     beq    vib
  1346.     cmp.b    #$05,d0     ; Effectkommando 5, Tone+vol slide
  1347.     beq    port_toneslide
  1348.     cmp.b    #$06,d0     ; Effectkommando 6, Vibrato+vol slide
  1349.     beq    vib_toneslide
  1350.     cmp.b    #$0E,d0
  1351.     beq    setallEcommands
  1352. SetBack:move.w    $10(a4),$06(a3) ; flytta period till aud
  1353.     CMP.B    #7,D0        ; Effectkommando 7, Tremolo
  1354.     BEQ    mt_Tremolo
  1355.     cmp.b    #$0A,d0     ; Effectkommando A, slida volymen
  1356.     beq    volslide
  1357. ret2:    rts            ; Slutjobbat
  1358.  
  1359. mt_Tremolo:            ; n_tremolocmd +32
  1360.     move.b    3(a4),d0    ; n_termolopos +33
  1361.     beq.s    mt_Tremolo2    ; n_wavecontrol +34
  1362.     move.b    32(a4),d2
  1363.     and.b    #$0F,d0
  1364.     beq.s    mt_treskip
  1365.     and.b    #$F0,d2
  1366.     or.b    d0,d2
  1367. mt_treskip:
  1368.     move.b    3(a4),d0
  1369.     and.b    #$F0,d0
  1370.     beq.s    mt_treskip2
  1371.     and.b    #$0F,d2
  1372.     or.b    d0,d2
  1373. mt_treskip2:
  1374.     move.b    d2,32(a4)
  1375. mt_Tremolo2:
  1376.     move.b    33(a4),D0
  1377.     lea    sin(pc),a6    ; a4 -> a6!
  1378.     lsr.w    #2,d0
  1379.     and.w    #$001F,d0
  1380.     moveq    #0,d2
  1381.     move.b    34(a4),d2
  1382.     lsr.b    #4,d2
  1383.     and.b    #$03,d2
  1384.     beq.s    mt_tre_sine
  1385.     lsl.b    #3,d0
  1386.     cmp.b    #1,d2
  1387.     beq.s    mt_tre_rampdown
  1388.     move.b    #255,d2
  1389.     bra.s    mt_tre_set
  1390. mt_tre_rampdown:
  1391.     tst.b    33(a4)
  1392.     bpl.s    mt_tre_rampdown2
  1393.     move.b    #255,d2
  1394.     sub.b    d0,d2
  1395.     bra.s    mt_tre_set
  1396. mt_tre_rampdown2:
  1397.     move.b    d0,d2
  1398.     bra.s    mt_tre_set
  1399. mt_tre_sine:
  1400.     move.b    0(a6,d0.w),d2
  1401. mt_tre_set:
  1402.     move.b    32(a4),d0
  1403.     and.w    #15,d0
  1404.     mulu    d0,d2
  1405.     lsr.w    #6,d2
  1406.     moveq    #0,d0
  1407.     move.b    13(a4),d0    ; Volym
  1408.     tst.b    33(a4)
  1409.     bmi.s    mt_TremoloNeg
  1410.     add.w    d2,d0
  1411.     bra.s    mt_Tremolo3
  1412. mt_TremoloNeg:
  1413.     sub.w    d2,d0
  1414. mt_Tremolo3:
  1415.     bpl.s    mt_TremoloSkip
  1416.     clr.w    d0
  1417. mt_TremoloSkip:
  1418.     cmp.w    #$40,d0
  1419.     bls.s    mt_TremoloOk
  1420.     moveq    #$40,d0
  1421. mt_TremoloOk:
  1422.     move.w    d0,8(a3)
  1423.     move.b    32(a4),d0
  1424.     lsr.w    #2,d0
  1425.     and.w    #$003C,d0
  1426.     add.b    d0,33(a4)
  1427.     rts
  1428.  
  1429. volslide:            ; Kommando A
  1430.     moveq    #0,d0
  1431.     move.b    $03(a4),d0    ; Ta reda på om den skall slida upp eller ner volymen
  1432.     lsr.b    #4,d0
  1433.     tst.b    d0
  1434.     beq.s    voldown
  1435. mt_VolSlideUp:
  1436.     add.b    d0,$13(a4)    ; Slida upp volymen så mycket som anges
  1437.     cmpi.b    #$40,$13(a4)    ; full volym redan?
  1438.     bmi.s    vol2
  1439.     move.b    #$40,$13(a4)    ; Sätt full volym
  1440. vol2:    move.w    $12(a4),$08(a3) ; Sätt volymen till aud
  1441.     rts
  1442.  
  1443. voldown:moveq    #0,d0        ; Tona ner volymen    A
  1444.     move.b    $03(a4),d0
  1445.     and.b    #$0F,d0
  1446. mt_VolSlideDown2:
  1447.     sub.b    d0,$13(a4)    ; Minska volymen
  1448.     bpl.s    vol3
  1449.     clr.b    $13(a4)     ; Sätt till 0
  1450. vol3:    move.w    $12(a4),$08(a3) ; Sätt volymen till aud
  1451.     rts
  1452.  
  1453. portup: moveq    #0,d0        ; Kommando 1
  1454.     move.b    $03(a4),d0    ; Hämta antal slidsteg
  1455. portupfast:
  1456.     sub.w    d0,$10(a4)    ; Slida upp tonen
  1457.     move.w    $10(a4),d0
  1458.     and.w    #$0FFF,d0
  1459.     cmp.w    #$71,d0     ; Hösta tonen redan?
  1460.     bpl.s    por2
  1461.     andi.w    #$F000,$10(a4)
  1462.     ori.w    #$71,$10(a4)    ; Sätt högsta ton isf
  1463. por2:    move.w    $10(a4),d0
  1464.     and.w    #$0FFF,d0
  1465.     move.w    d0,$06(a3)    ; Ny period (ton = period)
  1466.     rts
  1467.  
  1468. port_toneslide:
  1469.     bsr    myslide
  1470.     bra.s    volslide
  1471.  
  1472. vib_toneslide:
  1473.     bsr    vi
  1474.     bra.s    volslide
  1475.  
  1476. portdown:
  1477.     clr.w    d0
  1478.     move.b    $03(a4),d0
  1479. portdownfast:
  1480.     add.w    d0,$10(a4)
  1481.     move.w    $10(a4),d0
  1482.     and.w    #$0FFF,d0
  1483.     cmp.w    #$0358,d0
  1484.     bmi.s    por3
  1485.     andi.w    #$F000,$10(a4)
  1486.     ori.w    #$0358,$10(a4)
  1487. por3:    move.w    $10(a4),d0
  1488.     and.w    #$0FFF,d0
  1489.     move.w    d0,$06(a3)
  1490.     rts
  1491.  
  1492. checkcom2:        ; Fler kommandon...
  1493.     move.b    $02(a4),d0
  1494.     and.b    #$0F,d0
  1495.     cmp.b    #$09,d0        ; Effectkommando 9, sample offset
  1496.     beq.s    setsampleoffset
  1497.     cmp.b    #$0D,d0     ; Effectkommando D, hoppa till nästa pattern
  1498.     beq.s    pattbreak
  1499.     cmp.b    #$0B,d0     ; Effectkommando B, hoppa till angivet pattern
  1500.     beq.s    posjmp
  1501.     cmp.b    #$0C,d0     ; Effectkommando C, sätt volym
  1502.     beq.s    setvol
  1503.     cmp.b    #$0E,d0
  1504.     beq    setallEcommands
  1505.     cmp.b    #$0F,d0     ; Effectkommando F, sätt fart
  1506.     beq    setspeed
  1507.     rts
  1508.  
  1509.  
  1510. setsampleoffset:
  1511.     move.w    dmacon,d7
  1512.     move.w    20(a4),d0
  1513.     and.w    d0,d7
  1514.     bne.s    redansattgöringemer
  1515.     or.w    d0,dmacon
  1516.     or.w    d0,dmacon2
  1517. redansattgöringemer:
  1518.     moveq    #0,d0
  1519.     moveq    #0,d7
  1520.     move.b    $03(a4),d0
  1521.     beq.s    inteennysampleoffset
  1522.     move.b    d0,12(a3)
  1523. inteennysampleoffset:
  1524.     move.b    12(a3),D0
  1525.     beq.s    skitidethärihuvudtaget
  1526.     lsl.l    #8,d0            ; * 256
  1527.     move.w    4(a3),d7
  1528.     cmp.l    d7,d0
  1529.     bge.s    skitidethärihuvudtaget
  1530.     move.l    d0,-132(a3)
  1531. skitidethärihuvudtaget:
  1532.     rts
  1533.  
  1534.  
  1535. pattbreak:            ; Kommando D, nästa pattern
  1536.     st    break
  1537.     rts
  1538.  
  1539. posjmp: move.b    $03(a4),d0    ; Kommando B, hoppa till angivet pattern
  1540.     subq.b    #$01,d0
  1541.     move.b    d0,songpos    ; Lägg det nya pattert i songpos
  1542.     st    break
  1543.     rts
  1544.  
  1545. setvol: moveq    #0,d0        ; Kommando C, sätt volym
  1546.     move.b    $03(a4),d0
  1547.     cmp.w    #$40,d0     ; Full volym?
  1548.     bmi.s    vol4
  1549.     move.b    #$40,$03(a4)    ; Sätt full volym
  1550. vol4:    move.w    $02(a4),$08(a3) ; Sätt volym i aud
  1551.     move.b    $03(a4),$13(a4) ; Sätt volym i voice
  1552.     rts
  1553.  
  1554. setspeed:            ; Kommando F, sätt fart
  1555.     move.b    $03(a4),d0
  1556.     beq.s    rts2
  1557.     move.w    d0,speed    ; Sätt fart
  1558.     clr.w    counter     ; Rensa counter
  1559. rts2:    rts
  1560.  
  1561. setallEcommands:
  1562.     moveq    #0,d0
  1563.     move.b    $03(a4),d0
  1564.     lsr.b    #4,d0
  1565.     cmp.b    #1,d0
  1566.     beq.s    mt_FinePortaUp
  1567.     cmp.b    #2,d0
  1568.     beq    mt_FinePortaDown
  1569.     cmp.b    #$A,d0
  1570.     beq.s    mt_VolumeFineUp
  1571.     cmp.b    #$B,D0
  1572.     beq.s    mt_VolumeFineDown
  1573.     bra    SetBack
  1574.  
  1575. mt_VolumeFineUp:
  1576.     tst.w    counter
  1577.     bne    ret2
  1578.     moveq    #0,d0
  1579.     move.b    3(a4),d0
  1580.     and.b    #$F,d0
  1581.     bra    mt_VolSlideUp
  1582.  
  1583. mt_VolumeFineDown:
  1584.     tst.w    counter
  1585.     bne    ret2
  1586.     moveq    #0,d0
  1587.     move.b    3(a4),d0
  1588.     and.b    #$0F,d0
  1589.     bra    mt_VolSlideDown2
  1590.  
  1591.  
  1592. mt_FinePortaUp:
  1593.     tst.w    counter
  1594.     bne    ret2
  1595.     moveq    #0,d0
  1596.     move.b    3(a4),d0
  1597.     and.b    #$F,d0
  1598.     bra    portupfast
  1599.  
  1600. mt_FinePortaDown:
  1601.     tst.w    counter
  1602.     bne    ret2
  1603.     moveq    #0,d0
  1604.     move.b    3(a4),d0
  1605.     and.b    #$F,d0
  1606.     bra    portdownfast
  1607.  
  1608.  
  1609. extraoffsetadded1:
  1610.     dc.w    0
  1611. extraoffsetadded2:
  1612.     dc.w    0
  1613.  
  1614. ultradummy:
  1615.     dc.l    0
  1616. handle: dc.w    0
  1617. filnamn:dc.l    0
  1618. lasbuffer:
  1619.     dc.l    0
  1620. laslangd:
  1621.     dc.l    0
  1622. controlc:
  1623.     dc.l    0
  1624.  
  1625.  
  1626.     CNOP    0,4
  1627.  
  1628. sin    DC.B $00,$18,$31,$4A,$61,$78,$8D,$A1,$B4,$C5,$D4,$E0,$EB,$F4,$FA,$FD
  1629.     DC.B $FF,$FD,$FA,$F4,$EB,$E0,$D4,$C5,$B4,$A1,$8D,$78,$61,$4A,$31,$18
  1630.  
  1631. periods DC.W $0358,$0328,$02FA,$02D0,$02A6,$0280,$025C,$023A,$021A,$01FC,$01E0
  1632.     DC.W $01C5,$01AC,$0194,$017D,$0168,$0153,$0140,$012E,$011D,$010D,$FE
  1633.     DC.W $F0,$E2,$D6,$CA,$BE,$B4,$AA,$A0,$97,$8F,$87
  1634.     DC.W $7F,$78,$71,$00,$00
  1635.  
  1636. speed    DC.W $06
  1637. counter DC.W $00
  1638. songpos DC.B $00
  1639. break    DC.B $00
  1640. pattpos DC.W $00
  1641.  
  1642. dmacon:        DC.W $00
  1643. dmacon2:    dc.w $00
  1644. samplestarts:    DS.L $1F
  1645.  
  1646. superfastfinetune:
  1647.     ds.b    1000
  1648. mt_PeriodTable:
  1649. ; Tuning 0, Normal
  1650.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1651.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1652.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1653. ; Tuning 1
  1654.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1655.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1656.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1657. ; Tuning 2
  1658.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1659.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1660.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1661. ; Tuning 3
  1662.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1663.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1664.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1665. ; Tuning 4
  1666.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1667.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1668.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1669. ; Tuning 5
  1670.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1671.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1672.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1673. ; Tuning 6
  1674.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1675.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1676.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1677. ; Tuning 7
  1678.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1679.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1680.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1681. ; Tuning -8
  1682.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1683.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1684.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1685. ; Tuning -7
  1686.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1687.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1688.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1689. ; Tuning -6
  1690.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1691.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1692.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1693. ; Tuning -5
  1694.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1695.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1696.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1697. ; Tuning -4
  1698.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1699.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1700.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1701. ; Tuning -3
  1702.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1703.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1704.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1705. ; Tuning -2
  1706.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1707.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1708.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1709. ; Tuning -1
  1710.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1711.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1712.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1713.  
  1714.  
  1715. hardvolumesetright:    ; 10*lg(x/64)+20
  1716.     dc.w    0,2,5,7,8,9,10,10        ; 0-7
  1717.     dc.w    11,11,12,12,13,13,13,14        ; 8-15
  1718.     dc.w    14,14,14,15,15,15,15,16        ; 16-23
  1719.     dc.w    16,16,16,16,16,17,17,17        ; 24-31
  1720.     dc.w    17,17,17,18,18,18,18,18        ; 32-39
  1721.     dc.w    18,18,18,18,18,18,19,19        ; 40-47
  1722.     dc.w    19,19,19,19,19,19,19,19        ; 48-55
  1723.     dc.w    19,19,20,20,20,20,20,20        ; 56-63
  1724.     dc.w    20                ; 64
  1725.  
  1726.  
  1727. datagrejer:
  1728.     dc.l    0
  1729. workspc dc.l    0
  1730.  
  1731. keyclick:
  1732.     dc.b    0
  1733. infotext:
  1734.     dc.b    'bacpEeqw'
  1735.     dc.b    10,13
  1736.     dc.b    'Wellcome to COD∈replay!!!!!!!!',10,13
  1737.     dc.b    'Uppdating the sound with 25 kHz but the soundchip',10,13
  1738.     dc.b    'works with 50 kHz!!! Useing the hardware for',10,13
  1739.     dc.b    'some volumecontrol. ',10,13,10,13
  1740.     dc.b    'Without timer A!!!!!!',10,13,10,13
  1741.     dc.b    10,13,10,13,10,13
  1742.     dc.b    '(Max ≈ 250 kb)',10,13
  1743.     dc.b    'Modules name: ',0
  1744.  
  1745. matain: dc.b    50,0
  1746. musiknamn:
  1747.     ds.b    80
  1748.  
  1749. spelatext:
  1750.     dc.b    10,13,10,13,10,13,'fNow playing: ',0
  1751.  
  1752.     even
  1753.  
  1754.     END
  1755.