home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Assembler / dse-src6.dms / in.adf / BOUNCHSRCS.LZH / FX-replay.S < prev    next >
Encoding:
Text File  |  1987-05-18  |  13.0 KB  |  645 lines

  1. ************************************************************
  2. *                               *
  3. *                               *
  4. *      Sound Abspiel Routine zu Sound FX           *
  5. *                               *
  6. *           © 1988 LINEL Switzerland               *    
  7. *                               *    
  8. *                               *    
  9. *                               *
  10. ************************************************************
  11.  
  12. ;Einbau:
  13. ;    1.Sound FX laden
  14. ;    2.Song schreiben oder einladen
  15. ;    3.Sounddaten mit Save Datas abspeichern 
  16. ;    4.Sound FX verlassen und Seka laden
  17. ;    5.Source des Programms laden in den wir den Song einbauen
  18. ;      wollen.
  19. ;    6.Am Anfang des Programms 'bsr StartSound' einsetzen
  20. ;    7.Am Schluss des Programms 'bsr StopSound' einsetzen
  21. ;    8.Diesen AbspielSource laden
  22. ;    9.Das Label 'Laenge' auf die Laenge des Datenfiles setzen
  23. ;    10.Assemblieren
  24. ;    11.DatenFile mit 'ri' nach 'datas' laden
  25. ;    12.fertig
  26.  
  27. ;-------------------------------------------------
  28.     Laenge = 60000            ;Länge der Sounddaten
  29. ;-------------------------------------------------
  30.  
  31. Beispiel:
  32.     bsr.s    StartSound
  33.     bsr.s    Intro
  34.     bsr.L    StopSound
  35.     moveq    #0,d0
  36.     rts
  37. ;-------------------------------------------------
  38.  
  39. Intro:
  40.     move    d0,$dff180
  41.     addq    #1,d0
  42.     btst    #6,$bfe001
  43.     bne.s    Intro
  44.     rts
  45.  
  46. ;-------------------------------------------------
  47.  
  48. ;Ergebis in D0           0=alles Ok.        $ff = Timer nicht bekommen
  49.  
  50. StartSound:
  51.     movem.l    d1-d7/a0-a6,-(SP)
  52.     clr    ChipFlag        ;Flag fuer Daten im Chip
  53.     move.l    4,a6            ;ExecBase
  54.     move.l    SongPointer(pc),a1    ;Zeiger auf Daten
  55.     jsr    -534(A6)        ;TypeOfMem()
  56.     btst    #1,d0            ;Sind Daten im Chip ?
  57.     bne.s    ChipOK            ;ja ->
  58.     st    ChipFlag        ;Flag fuer AllocMemChip setzen
  59.     move.l    #Laenge,d0        ;wenn Fast Memory ->
  60.     addq.l    #4,d0            
  61.     moveq    #2,d1            ;Chip Speicher
  62.     jsr    -198(a6)        ;reservieren
  63.     moveq    #-1,d5            ;Fehlerflag
  64.     tst.l    d0            ;Speicher bekommen ?
  65.     beq.L    EndStart        ;wenn nicht -> Ende
  66.     move.l    d0,a1            ;Ziel
  67.     move.l    SongPointer(pc),a0    ;Quelle
  68.     move.l    #Laenge,d1
  69.     addq.l    #4,d1            ;Reserve
  70.     lsr.l    #2,d1            ;divu #4
  71.     subq    #1,d1            ;für dbf
  72. CopyMem:
  73.     move.l    (a0)+,(A1)+        ;Daten ins ChipMem
  74.     move    (a0),$dff180
  75.     dbf    d1,CopyMem        ;kopieren
  76.     move.l    d0,SongPointer
  77.  
  78. ChipOk:
  79.     move.l    SongPointer(pc),a0    ;Zeiger auf SongDaten
  80.     add    #60,a0            ;Laengentabelle ueberspringen
  81.     move.b    470(a0),AnzPat+1    ;Laenge des Sounds
  82.     move    4(A0),DelayValue     ;Geschwindigkeit
  83.     bsr    SongLen            ;Länge der Songdaten berechnen
  84.     add.l    d0,a0            ;Zur Adresse der Songstr.
  85.     add.w    #600,a0            ;Laenge der SongStr.
  86.     move.l    SongPointer(pc),a2
  87.     lea    Instruments(pc),a1    ;Tabelle auf Samples
  88.     moveq    #14,d7            ;15 Instrumente
  89. CalcIns:
  90.     move.l    a0,(A1)+        ;Startadresse des Instr.
  91.     add.l    (a2)+,a0        ;berechnen un speichern
  92.     dbf    d7,CalcIns
  93.  
  94.     lea    CiaaResource(pc),a1    ;'ciaa.resource'
  95.     moveq    #0,d0            ;Version egal
  96.     jsr    -498(A6)        ;OpenResource()
  97.     move.l    d0,CiaaBase        ;Resource Base speichern
  98.     move.l    d0,a6
  99.     bsr    PlayDisable        ;Sound DMA abschalten
  100.     lea    Interrupt(pc),a1    ;Sound Interupt Structure
  101.     moveq    #0,d0            ;TimerA
  102.     jsr    -6(A6)            ;installieren
  103.     move.l    d0,d5            ;ergebnis speichern
  104.     bsr    PlayInit        ;Loop Bereich setzen
  105.     bsr    PlayEnable        ;Player erlauben
  106.     bsr    InitTimer        ;Timer starten
  107.     moveq    #0,d0            ;Ergebnisregister loeschen
  108. EndStart:
  109.     tst.l    d5            ;ergebnis von Resource
  110.     sne    d0            ;ergebnis in d0 setzen 
  111.     movem.l    (SP)+,d1-d7/a0-a6
  112.     rts
  113.  
  114. ;-------------------------------------------------
  115. StopSound:
  116.     movem.l    d1-d7/a0-a6,-(SP)
  117.     move.l    4,a6            ;ExecBase
  118.     tst    ChipFlag        ;mussten wir Speicher reservieren ?
  119.     beq.s    NoFreeSong        
  120.     move.l    #Laenge,d0        ;Länge der Daten
  121.     addq.l    #4,d0            ;Reserve
  122.     move.l    SongPointer(pc),a1    ;Zeiger auf Daten
  123.     jsr    -210(a6)        ;FreeMem()
  124. NoFreeSong:
  125.     move.l    CiaaBase(pc),a6        ;Zeiger auf Ciaa Resource
  126.     lea    Interrupt(pc),a1    ;Zeiger auf Int. Strukture
  127.     moveq    #0,d0            ;Timer A
  128.     jsr    -12(A6)            ;Interupt entfernen
  129.     bsr    PlayDisable        ;Player sperren
  130.     moveq    #0,d0            ;Alles Ok    
  131.     movem.l    (SP)+,d1-d7/a0-a6
  132.     rts
  133. ;-------------------------------------------------
  134.  
  135. SongLen:
  136.     movem.l    d1-d7/a0-a6,-(SP)
  137.     move.l    SongPointer,a0
  138.     lea    532(A0),a0
  139.     move    AnzPat(pc),d2        ;wieviel Positions
  140.     subq    #1,d2            ;für dbf
  141.     moveq    #0,d1
  142.     moveq    #0,d0
  143. SongLenLoop:
  144.     move.b    (a0)+,d0        ;Patternnummer holen
  145.     cmp.b    d0,d1            ;ist es die höchste ?
  146.     bhi.s    LenHigher        ;nein!
  147.     move.b    d0,d1            ;ja
  148. LenHigher:
  149.     dbf    d2,SongLenLoop
  150.     move.l    d1,d0            ;Hoechste BlockNummer nach d0
  151.     addq    #1,d0            ;plus 1
  152.     mulu    #1024,d0        ;Laenge eines Block
  153.     movem.l    (SP)+,d1-d7/a0-a6
  154.     rts
  155.  
  156. ;-------------------------------------------------
  157.  
  158. Interrupt:
  159.     dc.l    0            ;letzter Node
  160.     dc.l    0            ;nächster Node
  161.     dc.b    2            ;Node Type = Interrupt
  162.     dc.b    0             ;Priorität
  163.     dc.l    InterruptName        ;Name
  164.     dc.l    0            ;Zeiger auf Daten
  165.     dc.l    IntCode            ;Interrupt Routine
  166.  
  167. ;-------------------------------------------------
  168.  
  169. InitTimer:
  170.     move.b    #%10000001,$bfee01    ;Timer starten
  171.     lea    DelayValue(pc),a1
  172.     move.b    1(a1),$bfe401        ;Timer A low
  173.     move.b    0(a1),$bfe501        ;Timer A high
  174.     rts
  175.  
  176. ;-------------------------------------------------
  177.  
  178. PlayInit:
  179.     lea    Instruments(pc),a0    ;Zeiger auf instr.Tabelle
  180.     moveq    #14,d7            ;15 Instrumente
  181. InitLoop:    
  182.     move.l    (A0)+,a1        ;Zeiger holen
  183.     clr.l    (A1)            ;erstes Longword löschen
  184.     dbf    d7,InitLoop
  185.     rts
  186.  
  187. ;-------------------------------------------------
  188.  
  189. PlayEnable:
  190.     lea    $dff000,a0        ;AMIGA
  191.     move.w    #-1,PlayLock        ;player zulassen
  192.     clr    $a8(A0)            ;Alle Voloumenregs. auf 0
  193.     clr    $b8(A0)
  194.     clr    $c8(a0)
  195.     clr    $d8(a0)
  196.     clr.w    Timer            ;zahler auf 0
  197.     clr.l    TrackPos        ;zeiger auf pos
  198.     clr.l    PosCounter        ;zeiger innehalb des pattern
  199.     rts
  200. ;-------------------------------------------------
  201.  
  202. PlayDisable:
  203.     lea    $dff000,a0        ;AMIGA
  204.     clr.w    PlayLock        ;player sperren
  205.     clr    $a8(a0)            ;volumen auf 0
  206.     clr    $b8(a0)
  207.     clr    $c8(a0)
  208.     clr    $d8(a0)
  209.     move.w    #$f,$96(A0)        ;dma sperren
  210.     rts
  211.  
  212. ;-------------------------------------------------
  213. IntCode:
  214.     bsr    PlaySong        ;Note spielen
  215.     moveq    #0,d0            ;kein Fehler
  216.     rts
  217.  
  218. ;-------------------------------------------------
  219.  
  220. ;hier werden 5 * effekte gespielt und einmal der song
  221.  
  222. PlaySong:                ;HauptAbspielRoutine
  223.     movem.l    d0-d7/a0-a6,-(SP)
  224.     addq.w    #1,Timer        ;zähler erhöhen
  225.     cmp.w    #6,Timer        ;schon 6?
  226.     bne.s    CheckEffects        ;wenn nicht -> effekte
  227.     clr.w    Timer            ;sonst zähler löschen
  228.     bsr     PlaySound        ;und sound spielen
  229. NoPlay:    movem.l    (SP)+,d0-d7/a0-a6
  230.     rts
  231.  
  232. ;-------------------------------------------------
  233. CheckEffects:
  234.     moveq    #3,d7            ;4 kanäle
  235.     lea    StepControl0,a4
  236.     lea    ChannelData0(pc),a6    ;zeiger auf daten für 0
  237.     lea    $dff0a0,a5        ;Kanal 0
  238. EffLoop:
  239.     movem.l    d7/a5,-(SP)
  240.     bsr.s    MakeEffekts        ;Effekt spielen
  241.     movem.l    (Sp)+,d7/a5
  242. NoEff:
  243.     add    #8,a4
  244.     add    #$10,a5            ;nächster Kanal
  245.     add    #22,a6            ;Nächste KanalDaten
  246.     dbf    d7,EffLoop
  247.     movem.l    (a7)+,d0-d7/a0-a6
  248.     rts
  249.  
  250. MakeEffekts:
  251.     move    (A4),d0
  252.     beq.s    NoStep
  253.     bmi.s    StepItUp
  254.     add    d0,2(A4)
  255.     move    2(A4),d0
  256.     move    4(A4),d1
  257.     cmp    d0,d1
  258.     bhi.s    StepOk
  259.     move    d1,d0
  260. StepOk:
  261.     move    d0,6(a5)
  262.     MOVE    D0,2(A4)
  263.     rts
  264.  
  265. StepItUp:
  266.     add    d0,2(A4)
  267.     move    2(A4),d0
  268.     move    4(A4),d1
  269.     cmp    d0,d1
  270.     blt.s    StepOk
  271.     move    d1,d0
  272.     bra.s    StepOk
  273.  
  274.  
  275.  
  276. NoStep:
  277.     move.b    2(a6),d0
  278.     and.b    #$0f,d0
  279.     cmp.b    #1,d0
  280.     beq    appreggiato
  281.     cmp.b    #2,d0
  282.     beq    pitchbend
  283.     cmp.b    #3,d0
  284.     beq    LedOn
  285.     cmp.b    #4,d0
  286.     beq    LedOff
  287.     cmp.b    #7,d0
  288.     beq.s    SetStepUp
  289.     cmp.b    #8,d0
  290.     beq.s    SetStepDown
  291.     rts
  292.  
  293. LedOn:
  294.     bset    #1,$bfe001
  295.     rts
  296. LedOff:
  297.     bclr    #1,$bfe001
  298.     rts
  299.  
  300. SetStepUp:
  301.     moveq    #0,d4
  302. StepFinder:
  303.     clr    (a4)
  304.     move    (A6),2(a4)
  305.     moveq    #0,d2
  306.     move.b    3(a6),d2
  307.     and    #$0f,d2
  308.     tst    d4
  309.     beq.s    NoNegIt
  310.     neg    d2
  311. NoNegIt:    
  312.     move    d2,(a4)
  313.     moveq    #0,d2
  314.     move.b    3(a6),d2
  315.     lsr    #4,d2
  316.     move    (a6),d0
  317.     lea    NoteTable,a0
  318.  
  319. StepUpFindLoop:
  320.     move    (A0),d1
  321.     cmp    #-1,d1
  322.     beq.s    EndStepUpFind
  323.     cmp    d1,d0
  324.     beq.s    StepUpFound
  325.     addq    #2,a0
  326.     bra.s    StepUpFindLoop
  327. StepUpFound:
  328.     lsl    #1,d2
  329.     tst    d4
  330.     bne.s    NoNegStep
  331.     neg    d2
  332. NoNegStep:
  333.     move    (a0,d2.w),d0
  334.     move    d0,4(A4)
  335.     rts
  336.  
  337. EndStepUpFind:
  338.     move    d0,4(A4)
  339.     rts
  340.     
  341. SetStepDown:
  342.     st    d4
  343.     bra.s    StepFinder
  344.  
  345.  
  346. StepControl0:
  347.     dc.l    0,0
  348. StepControl1:
  349.     dc.l    0,0
  350. StepControl2:
  351.     dc.l    0,0
  352. StepControl3:
  353.     dc.l    0,0
  354.  
  355.  
  356. appreggiato:
  357.     lea    ArpeTable,a0
  358.     moveq    #0,d0
  359.     move    Timer,d0
  360.     subq    #1,d0
  361.     lsl    #2,d0
  362.     move.l    (A0,d0.l),a0
  363.     jmp    (A0)
  364.  
  365. Arpe4:    lsl.l    #1,d0
  366.     clr.l    d1
  367.     move.w    16(a6),d1
  368.     lea.l    NoteTable,a0
  369. Arpe5:    move.w    (a0,d0.l),d2
  370.     cmp.w    (a0),d1
  371.     beq.s    Arpe6
  372.     addq.l    #2,a0
  373.     bra.s    Arpe5
  374.  
  375.  
  376.  
  377. Arpe1:    clr.l    d0
  378.     move.b    3(a6),d0
  379.     lsr.b    #4,d0
  380.     bra.s    Arpe4
  381.  
  382.  
  383. Arpe2:    clr.l    d0
  384.     move.b    3(a6),d0
  385.     and.b    #$0f,d0
  386.     bra.s    Arpe4
  387.  
  388. Arpe3:    move.w    16(a6),d2
  389.     
  390. Arpe6:    move.w    d2,6(a5)
  391.     rts
  392.  
  393.  
  394. pitchbend:
  395.     clr.l    d0
  396.     move.b    3(a6),d0
  397.     lsr.b    #4,d0
  398.     tst.b    d0
  399.     beq.s    pitch2
  400.     add.w    d0,(a6)
  401.     move.w    (a6),6(a5)
  402.     rts
  403. pitch2:    clr.l    d0
  404.     move.b    3(a6),d0
  405.     and.b    #$0f,d0
  406.     tst.b    d0
  407.     beq.s    pitch3
  408.     sub.w    d0,(a6)
  409.     move.w    (a6),6(a5)
  410. pitch3:    rts
  411.  
  412. ;-------------------------------------------------
  413.  
  414. PlaySound:
  415.     move.l    SongPointer(pc),a0    ;Zeiger auf SongFile
  416.     add    #60,a0            ;Laengentabelle ueberspringen
  417.     move.l    a0,a3
  418.     move.l    a0,a2
  419.     lea    600(A0),a0        ;Zeiger auf BlockDaten
  420.     add    #472,a2            ;zeiger auf Patterntab.
  421.     add    #12,a3            ;zeiger auf Instr.Daten
  422.     move.l    TrackPos(pc),d0        ;Postionzeiger
  423.     clr.l    d1
  424.     move.b    (a2,d0.l),d1        ;dazugehörige PatternNr. holen
  425.     moveq    #10,d7
  426.     lsl.l    d7,d1            ;*1024 / länge eines Pattern
  427.     add.l    PosCounter,d1        ;Offset ins Pattern
  428.     clr.w    DmaCon
  429.     lea    StepControl0,a4
  430.     lea    $dff0a0,a5        ;Zeiger auf Kanal0
  431.     lea    ChannelData0(pc),a6    ;Daten für Kanal0
  432.     moveq    #3,d7            ;4 Kanäle
  433. SoundHandleLoop:
  434.     bsr    PlayNote        ;aktuelle Note spielen
  435.     add    #8,a4
  436.     add.l    #$10,a5            ;nächster Kanal
  437.     add.l    #22,a6            ;nächste Daten
  438.     dbf    d7,SoundHandleLoop    ;4*
  439.     
  440.     move    DmaCon(pc),d0        ;DmaBits
  441.     bset    #15,d0            ;Clear or Set Bit setzen
  442.     move.w    d0,$dff096        ;DMA ein!
  443.  
  444.     move    #300,d0            ;Verzögern (genug für MC68030)
  445. Delay2:
  446.     dbf    d0,Delay2
  447.  
  448.     lea    ChannelData3(pc),a6
  449.     lea    $dff0d0,a5
  450.     moveq    #3,d7
  451. SetRegsLoop:
  452.     move.l    10(A6),(a5)        ;Adresse
  453.     move    14(A6),4(A5)        ;länge
  454. NoSetRegs:
  455.     sub    #22,a6            ;nächste Daten
  456.     sub    #$10,a5            ;nächster Kanal
  457.     dbf    d7,SetRegsLoop
  458.     tst    PlayLock
  459.     beq.s    NoEndPattern
  460.     add.l    #16,PosCounter        ;PatternPos erhöhen
  461.     cmp.l    #1024,PosCounter    ;schon Ende ?
  462.     blt.s    NoEndPattern
  463.  
  464.     clr.l    PosCounter        ;PatternPos löschen
  465.     addq.l    #1,TrackPos        ;Position erhöhen
  466. NoAddPos:
  467.     move.w    Anzpat(pc),d0        ;AnzahlPosition
  468.     move.l    TrackPos(pc),d1        ;Aktuelle Pos
  469.     cmp.w    d0,d1            ;Ende?
  470.     bne.s    NoEndPattern        ;nein!
  471.     clr.l    TrackPos        ;ja/ Sound von vorne
  472. NoEndPattern:
  473.     rts
  474.  
  475. PlayNote:
  476.     clr.l    (A6)
  477.     tst    PlayLock        ;Player zugellassen ?
  478.     beq.s    NoGetNote        ;
  479.     move.l    (a0,d1.l),(a6)        ;Aktuelle Note holen
  480. NoGetNote:
  481.     addq.l    #4,d1            ;PattenOffset + 4
  482.     clr.l    d2
  483.     cmp    #-3,(A6)        ;Ist Note = 'PIC' ?
  484.     beq    NoInstr2        ;wenn ja -> ignorieren
  485.     move.b    2(a6),d2        ;Instr Nummer holen    
  486.     and.b    #$f0,d2            ;ausmaskieren
  487.     lsr.b    #4,d2            ;ins untere Nibble
  488.     tst.b    d2            ;kein Intrument ?
  489.     beq.L    NoInstr2        ;wenn ja -> überspringen
  490.     
  491.     clr.l    d3
  492.     lea.l    Instruments(pc),a1    ;Instr. Tabelle
  493.     move.l    d2,d4            ;Instrument Nummer
  494.     subq    #1,d2
  495.     lsl    #2,d2            ;Offset auf akt. Instr.
  496.     mulu    #30,d4            ;Offset Auf Instr.Daten
  497.     move.l    (a1,d2.w),4(a6)        ;Zeiger auf akt. Instr.
  498.     move.w    (a3,d4.l),8(a6)        ;Instr.Länge
  499.     move.w    2(a3,d4.l),18(a6)    ;Volume
  500.     move.w    4(a3,d4.l),d3        ;Repeat
  501.     tst    d3            ;kein Repeat?
  502.     beq.s    NoRepeat        ;Nein!
  503.                     ;Doch!
  504.     
  505.     move.l    4(a6),d2        ;akt. Instr.
  506.     add.l    d3,d2            ;Repeat dazu
  507.     move.l    d2,10(a6)        ;Repeat Instr.
  508.     move.w    6(a3,d4),14(a6)        ;rep laenge
  509.     move.w    18(a6),d3         ;Volume in HardReg.
  510.     bra.s    NoInstr
  511.  
  512. NoRepeat:
  513.     move.l    4(a6),d2        ;Instrument    
  514.     add.l    d3,d2            ;rep Offset
  515.     move.l    d2,10(a6)        ;in Rep. Pos.
  516.     move.w    6(a3,d4.l),14(a6)    ;rep Laenge
  517.     move.w    18(a6),d3         ;Volume in Hardware
  518.  
  519. CheckPic:
  520. NoInstr:
  521.     move.b    2(A6),d2
  522.     and    #$0f,d2
  523.     cmp.b    #5,d2
  524.     beq.s    ChangeUpVolume
  525.     cmp.b    #6,d2
  526.     bne.L    SetVolume2
  527.     moveq    #0,d2
  528.     move.b    3(A6),d2
  529.     sub    d2,d3        
  530.     tst    d3
  531.     bpl    SetVolume2    
  532.     clr    d3
  533.     bra.L    SetVolume2
  534. ChangeUpVolume:
  535.     moveq    #0,d2
  536.     move.b    3(A6),d2
  537.     add    d2,d3
  538.     tst    d3
  539.     cmp    #64,d3
  540.     ble.L    SetVolume2
  541.     move    #64,d3
  542. SetVolume2:
  543.     move    d3,8(A5)
  544.     
  545. NoInstr2:
  546.     cmp    #-3,(A6)        ;Ist Note = 'PIC' ?
  547.     bne.s    NoPic        
  548.     clr    2(A6)            ;wenn ja -> Note auf 0 setzen
  549.     bra.s    NoNote    
  550. NoPic:
  551.     tst    (A6)            ;Note ?
  552.     beq.s    NoNote            ;wenn 0 -> nicht spielen
  553.     
  554.     clr    (a4)
  555.     move.w    (a6),16(a6)        ;eintragen
  556.     move.w    20(a6),$dff096        ;dma abschalten
  557.     move.l    d7,-(SP)
  558.     move    #300,d7            ;genug für MC68030
  559. Delay1:
  560.     dbf    d7,Delay1        ;delay
  561.     move.l    (SP)+,d7
  562.     cmp    #-2,(A6)        ;Ist es 'STP'
  563.     bne.s    NoStop            ;Nein!
  564.     clr    8(A5)
  565.     bra    Super
  566. NoStop:
  567.     move.l    4(a6),0(a5)        ;Intrument Adr.
  568.     move.w    8(a6),4(a5)        ;Länge
  569.     move.w    0(a6),6(a5)        ;Period
  570. Super:
  571.     move.w    20(a6),d0        ;DMA Bit
  572.     or.w    d0,DmaCon        ;einodern
  573. NoNote:
  574.     rts
  575.  
  576. ;-------------------------------------------------
  577. ArpeTable:
  578.     dc.l    Arpe1
  579.     dc.l    Arpe2
  580.     dc.l    Arpe3
  581.     dc.l    Arpe2
  582.     dc.l    Arpe1
  583.  
  584.  
  585. ChannelData0:
  586.     blk.l    5,0            ;Daten für Note
  587.     dc.w    1            ;DMA - Bit
  588. ChannelData1:    
  589.     blk.l    5,0            ;u.s.w
  590.     dc.w    2
  591. ChannelData2:    
  592.     blk.l    5,0            ;etc.
  593.     dc.w    4
  594. ChannelData3:    
  595.     blk.l    5,0            ;a.s.o
  596.     dc.w    8
  597. Instruments:
  598.     blk.l    15,0            ;Zeiger auf die 15 Instrumente
  599. PosCounter:
  600.     dc.l    0            ;Offset ins Pattern
  601. TrackPos:
  602.     dc.l    0            ;Position Counter
  603. Timer:
  604.     dc.w    0            ;Zähler 0-5
  605. DmaCon:
  606.     dc.w    0            ;Zwischenspeicher für DmaCon
  607. AnzPat:
  608.     dc.w    1            ;Anzahl Positions
  609. PlayLock:
  610.     dc.w    0            ;Flag fuer 'Sound erlaubt'
  611. DelayValue:
  612.     dc.w    14565
  613. SongPointer:
  614.     dc.l    LenghtTable
  615. ChipFlag:
  616.     dc.w    0
  617. CiaaBase:
  618.     dc.l    0
  619. InterruptName:
  620.     dc.b    "Chris's SoundInterrupt",0
  621. CiaaResource:
  622.     dc.b    'ciaa.resource',0
  623.  
  624.  
  625. even
  626.  
  627. Reserve:
  628.     dc.w    856,856,856,856,856,856,856,856,856,856,856,856
  629. NoteTable:
  630. dc.w    856,808,762,720,678,640,604,570,538,508,480,453   ;1.Okt
  631. dc.w    428,404,381,360,339,320,302,285,269,254,240,226   ;2.Okt
  632. dc.w    214,202,190,180,170,160,151,143,135,127,120,113      ;3.Okt
  633. dc.w    113,113,113,113,113,113,113,113,113,113,113,113      ;Reserve
  634.     dc.w    -1
  635.  
  636. LenghtTable:
  637.  
  638. Datas:
  639.     Songstr = lenghttable+60
  640.     
  641.     blk.b    Laenge,0        ;hierhin die Daten!!!
  642.  
  643. EndSongStr:
  644.  
  645.