home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings2 / listing5n.s < prev    next >
Text File  |  1977-12-31  |  26KB  |  804 lines

  1.  
  2. ; Listing5n.s    KOMBINATION VON 3 COPPER-EFFEKTEN + BILD IN 8 FARBEN MIT
  3. ;        $dff102 und Bitplanepointer-EFFEKTEN
  4.  
  5.  
  6.     SECTION    CIPundCOP,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  11.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  16.                 ; des Betriebssystemes
  17.  
  18. ;    POINTEN AUF UNSERE BITPLANES
  19.  
  20.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse unserer PIC
  21.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  22.                 ; Pointer der Copperlist
  23.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  24.                 ; für den DBRA - Zyklus
  25. POINTBP:
  26.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  27.                 ; Adresse ins richtige Word der Copperlist
  28.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  29.  
  30.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  31.                 ; Plane in das richtige Word in der Copperlist
  32.     swap    d0        ; vertauscht erneut die 2 Word von d0
  33.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, -> nächstes Plane
  34.  
  35.     addq.w    #8,a1        ; zu den nächsten Bplpointers in der Cop
  36.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1=n. bitplanes)
  37.  
  38.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  39.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  40.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  41.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  42.  
  43.     bsr.w    mt_init     ; Inizialisiert Musik-Routine
  44.  
  45. mouse:
  46.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  47.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  48.  
  49.     bsr.w    BewegeCopper    ; Roter Bylken unter $FF
  50.     bsr.s    CopperLinkRech    ; Routine für links-rechts Scroll
  51.     BSR.w    scrollcolors    ; Zyklisches scrollen der Farben
  52.     bsr.w    ScrollPlanes    ; Rauf-und Runterscrollen des Bildes
  53.     bsr.w    Wellen        ; Wellen mit dem $dff102
  54.     bsr.w    mt_music    ; Spielt die Musik
  55.  
  56. Warte:
  57.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  58.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  59.  
  60.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  61.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  62.  
  63.     bsr.w    mt_end        ; Beendet die Musikroutine
  64.  
  65.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  66.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  67.  
  68.     move.l    4.w,a6
  69.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  70.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  71.                 ; (Libraries werden geöffnet UND geschlossen!)
  72.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  73.     rts
  74.  
  75. ; DATEN
  76.  
  77. GfxName:
  78.     dc.b    "graphics.library",0,0    
  79.  
  80. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  81.     dc.l    0    ; ab hier werden die Offsets gemacht
  82.  
  83. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  84.     dc.l    0    ; Betriebssystemes
  85.  
  86. ; **************************************************************************
  87. ; *        HORIZONTAL LAUFENDER BALKEN    (Listing3h.s)           *
  88. ; **************************************************************************
  89.  
  90. CopperLinkRech:
  91.     CMPI.W    #85,FlagRechts    ; GehRechts 85 Mal ausgeführt?
  92.     BNE.S    GehRechts    ; wenn nicht, wiederhole nochmal
  93.                 ; wenn es aber 85 Mal ausgeführt wurde,
  94.                 ; dann geh weiter
  95.  
  96.     CMPI.W    #85,FlagLinks    ; GehLinks 85 Mal ausgeführt?
  97.     BNE.S    GehLinks    ; wenn nicht, wiederhole nochmal
  98.  
  99.     CLR.W    FlagRechts    ; Die Routine GehLinks wurde 85 Mal ausge-
  100.     CLR.W    FlagLinks    ; führt, also ist zu diesem Zeitpunkt der
  101.                 ; graue Balken zurückgekommen und der Rechts-
  102.                 ; GehLinks 85 Mal, etcetera.
  103.     RTS            ; ZURÜCK ZUM MOUSE-LOOP
  104.  
  105. GehRechts:            ; Diese Routine bewegt den Balken nach RECHTS
  106.     lea    CopBar+1,A0    ; Wir geben in A0 die Adresse des ersten XX-
  107.                 ; Wertes des ersten Wait, das sich genau 1 Byte
  108.                 ; nach CopBar befindet
  109.  
  110.     move.w    #29-1,D2    ; wir müßen 29 Wait verändern (verwenden ein DBRA)
  111. RechtsLoop:
  112.     addq.b    #2,(a0)        ; zählen 2 zu der X-Koordinate des Wait dazu
  113.     ADD.W    #16,a0        ; gehen zum nächsten Wait, das zu ändern ist
  114.     dbra    D2,RechtsLoop    ; Zyklus wird d2-Mal durchlaufen
  115.     addq.w    #1,FlagRechts    ; vermerken, daß wir ein weiteres Mal GehRechts
  116.                 ; ausgeführt haben
  117.                 ; GehRechts: in FlagRechts steht die Anzahl,
  118.                 ; wie oft wir GehRechts ausgeführt haben
  119.     RTS            ; Zurück zum Mouse-Loop
  120.  
  121.  
  122. GehLinks:            ; diese Routine bewegt den Balken nach LINKS
  123.     lea    CopBar+1,A0
  124.     move.w    #29-1,D2    ; wir müßen 29 Wait verändern
  125. LinksLoop:
  126.     subq.b    #2,(a0)       ; ziehen der X-Koordinate des Wait 2 ab
  127.     ADD.W    #16,a0       ; gehen zum nächsten Wait über, das zu verändern ist
  128.     dbra    D2,LinksLoop ; Zyklus wird d2-Mal durchgeführt
  129.     addq.w    #1,FlagLinks ; Zählen 1 zur Anzahl dazu, wie oft diese Routine
  130.                 ; GehLinks ausgeführt wurde
  131.     RTS            ; Zurück zum Mouse-Loop
  132.  
  133. FlagRechts:        ; In diesem Word wird die Anzahl festgehalten,
  134.     dc.w    0    ; wie oft GehRechts ausgeführt wurde
  135.  
  136. FlagLinks:        ; In diesem Word wird die Anzahl festgehalten,
  137.     dc.w    0    ; wie oft GehLinks ausgeführt wurde
  138.  
  139. ; **************************************************************************
  140. ; *        ROTER BALKEN UNTER Zeile $FF (LISTING3f.s)           *
  141. ; **************************************************************************
  142.  
  143. BewegeCopper:
  144.     LEA    BALKEN,a0   ; in a0 kommt die Adresse von Balken
  145.     TST.B    RAUFRUNTER2 ; Müßen wir steigen oder sinken? Wenn RaufRunter
  146.                 ; auf 0 steht (wenn TST also BEQ liefert), dann
  147.                 ; springen wir auf GEHRUNTER, wenn es hingegen
  148.                 ; auf $FF ist (TST also nicht eintrifft), fahren
  149.     beq.w    GEHRUNTER2  ; wir fort und führen somit den "steigenden" Teil
  150.                 ; aus
  151.  
  152.     cmpi.b    #$0a,(a0)    ; sind wir bei Zeile $0a+$ff angekommen?
  153.     beq.s    SetzRunter2    ; wenn ja, sind wir oben angekommen und
  154.     subq.b    #1,(a0)        ; müßen runter
  155.     subq.b    #1,8(a0)
  156.     subq.b    #1,8*2(a0) ; nun ändern wir die anderen Wait: der
  157.     subq.b    #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
  158.     subq.b    #1,8*4(a0) ; 8 Byte
  159.     subq.b    #1,8*5(a0)
  160.     subq.b    #1,8*6(a0)
  161.     subq.b    #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
  162.     subq.b    #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
  163.     subq.b    #1,8*9(a0) ; wollen.
  164.     rts
  165.  
  166.  
  167. SetzRunter2:
  168.     clr.b    RAUFRUNTER2    ; Setzt RAUFRUNTER auf 0, beim TST.B RAUFRUNTER
  169.     rts            ; wird das BEQ zu Routine GEHRUNTER verzweigen,
  170.                 ; und der Balken wird sinken
  171.  
  172. GEHRUNTER2:
  173.     cmpi.b    #$2c,8*9(a0)    ; sind wir bei Zeile $2c angekommen?
  174.     beq.s    SetzRauf2    ; wenn ja, sind wir untern und müßen wieder
  175.     addq.b    #1,(a0)        ; steigen
  176.     addq.b    #1,8(a0)
  177.     addq.b    #1,8*2(a0) ; nun ändern wir die anderen Wait: der
  178.     addq.b    #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
  179.     addq.b    #1,8*4(a0) ; 8 Byte
  180.     addq.b    #1,8*5(a0)
  181.     addq.b    #1,8*6(a0)
  182.     addq.b    #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
  183.     addq.b    #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
  184.     addq.b    #1,8*9(a0) ; wollen.
  185.     rts
  186.  
  187. SetzRauf2:
  188.     move.b    #$ff,RAUFRUNTER2; Wenn das Label nicht auf NULL ist,
  189.     rts            ; bedeutet es, daß wir steigen müßen
  190.  
  191. RAUFRUNTER2:
  192.     dc.b    0,0
  193.  
  194. ; **************************************************************************
  195. ; *        ZYKLISCHES SCROLLEN DER FARBEN (LISTING3E.s)           *
  196. ; **************************************************************************
  197.  
  198. Scrollcolors:
  199.     move.w    col2,col1    ; col2 kommt in col1
  200.     move.w    col3,col2    ; col3 kommt in col2
  201.     move.w    col4,col3    ; col4 kommt in col3
  202.     move.w    col5,col4    ; col5 kommt in col4
  203.     move.w    col6,col5    ; col6 kommt in col5
  204.     move.w    col7,col6    ; col7 kommt in col6
  205.     move.w    col8,col7    ; col8 kommt in col7
  206.     move.w    col9,col8    ; col9 kommt in col8
  207.     move.w    col10,col9    ; col10 kommt in col9
  208.     move.w    col11,col10    ; col11 kommt in col10
  209.     move.w    col12,col11    ; col12 kommt in col11
  210.     move.w    col13,col12    ; col13 kommt in col12
  211.     move.w    col14,col13    ; col14 kommt in col13
  212.     move.w    col1,col14    ; col1 kommt in col14
  213.     rts
  214.  
  215. ; **************************************************************************
  216. ; *    SCROLL NACH OBEN UND UNTEN DES BILDEN    (aus Listing5g.s)       *
  217. ; **************************************************************************
  218.  
  219. ScrollPlanes:
  220.     LEA    BPLPOINTERS,A1    ; Mit diesen 4 Anweisungen holen wir aus der
  221.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  222.     swap    d0        ; gerade pointet und geben diesen Wert
  223.     move.w    6(a1),d0    ; in d0
  224.  
  225.     TST.B    RaufRunter3    ; Müßen wir nach oben oder unten?
  226.  
  227.     beq.w    GehRunter3
  228.     cmp.l    #PIC-(40*18),d0 ; sind wir weit genug OBEN?
  229.     beq.s    SetzRunter3    ; wenn ja, sind wir am Ende und müßen runter
  230.     sub.l    #40,d0        ; subtrahieren 40, also 1 Zeile, dadurch
  231.                 ; wandert das Bild nach UNTEN
  232.     bra.s    Ende3
  233.  
  234.  
  235. SetzRunter3:
  236.     clr.b    RaufRunter3    ; Durch Löschen von RaufRunter wird das TST
  237.     bra.s    Ende3
  238.  
  239. GehRunter3:
  240.     cmpi.l    #PIC+(40*130),d0; sind wir weit genug UNTEN?
  241.     beq.s    SetzRauf3    ; wenn ja, sind wir am unteren Ende und
  242.                 ; müßen wieder rauf            
  243.     add.l    #40,d0        ; Addieren 40, also 1 Zeile, somit scrollt
  244.                 ; das Bild nach OBEN
  245.     bra.s    Ende3
  246.  
  247. SetzRauf3:
  248.     move.b    #$ff,RaufRunter3; Wenn das Label nicht auf NULL steht,
  249.     rts            ; bedeutet das, daß wir rauf müßen
  250.     
  251. Ende3:                ; POINTEN DIE BITPLANEPOINTER AN
  252.     LEA    BPLPOINTERS,A1    ; POINTER in der COPPERLIST
  253.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier: 3)
  254.  
  255. POINTBP2:
  256.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Adress des Pl.
  257.     swap    d0        ; vertauscht die 2 Word von d0 (1234 > 3412)
  258.     move.w    d0,2(a1)    ; kopiert das höherw. Word der Adresse des Pl.
  259.     swap    d0        ; vertauscht die 2 Word von d0 (3412 > 1234)
  260.     ADD.L    #40*256,d0    ; + Länge Bitplane -> nächstes Bitplane
  261.     addq.w    #8,a1        ; zu den nächsten bplpointers in der Cop
  262.     dbra    d1,POINTBP2    ; Wiederhole D1 Mal POINTBP (D1=n. bitplanes)
  263.     rts
  264.  
  265. RaufRunter3:
  266.     dc.b    0,0
  267.  
  268. ; **************************************************************************
  269. ; *    WELLENEFFEKT MITTELS MODULO $dff102 (LISTING5H.S)           *
  270. ; **************************************************************************
  271.  
  272. Wellen:
  273.     LEA    Con1Effekt+8,A0 ; Adresse Quellword in a0
  274.     LEA    Con1Effekt,A1    ; Adresse Zielword in a1
  275.     MOVEQ    #19,D2        ; 45 BPLCON1 sind in COPLIST zu ändern
  276. Vertausche:
  277.     MOVE.W    (A0),(A1)    ; kopiert zwei Word - scroll!
  278.     ADDQ.W    #8,A0        ; nächstes Word-Paar
  279.     ADDQ.W    #8,A1        ; nächstes Word-Paar
  280.     DBRA    D2,Vertausche ; wiederhole "Vertausche" die richtige Anzahl mal
  281.  
  282.     MOVE.W    Con1Effekt,LetzterWert    ; um den Zyklus unendlich fortlaufen zu
  283.     RTS                ; lassen kopieren wir den ersten Wert
  284.  
  285. ; **************************************************************************
  286. ; *        ROUTINE ZUM ABSPIELEN VON SOUNDTRACKER/PROTRACKER       *
  287. ; **************************************************************************
  288.  
  289.     include "music.s" ; Routine, die zu 100% auf allen Amigas funktioniert
  290.  
  291. ; **************************************************************************
  292. ; *                SUPER COPPERLIST               *
  293. ; **************************************************************************
  294.  
  295.     SECTION GRAPHIC,DATA_C
  296.  
  297. COPPERLIST:
  298.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  299.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  300.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  301.     dc.w    $13e,$0000
  302.  
  303.     dc.w    $8e,$2c81    ; DiwStrt    Register mit Standartwerten)
  304.     dc.w    $90,$2cc1    ; DiwStop
  305.     dc.w    $92,$0038    ; DdfStart
  306.     dc.w    $94,$00d0    ; DdfStop
  307.     dc.w    $102,0        ; BplCon1
  308.     dc.w    $104,0        ; BplCon2
  309.     dc.w    $108,0        ; Bpl1Mod
  310.     dc.w    $10a,0        ; Bpl2Mod
  311.  
  312. ; das BPLCON0 ($dff100) für einen Bildschirm mit 3 Bitplanes: (8 Farben)
  313.  
  314.             ; 5432109876543210
  315.     dc.w    $100,%0011001000000000    ; bits 13 und 12 an!! (3 = %011)
  316.  
  317. ;    Wir lassen die Bitplanes direkt anpointen, indem wir die Register
  318. ;    $dff0e0 und folgende hier in der Copperlist einfügen. Die
  319. ;    Adressen der Bitplanes werden dann von der Routine POINTBP
  320. ;    automatisch eingetragen
  321.  
  322. BPLPOINTERS:
  323.     dc.w $e0,$0000,$e2,$0000    ; erstes Bitplane - BPL0PT
  324.     dc.w $e4,$0000,$e6,$0000    ; zweites Bitplane - BPL1PT
  325.     dc.w $e8,$0000,$ea,$0000    ; drittes Bitplane - BPL2PT
  326.  
  327. ;    Die 8 Farben des Bildes werden hier definiert:
  328.  
  329.     dc.w    $0180,$000    ; color0
  330.     dc.w    $0182,$070    ; color1
  331.     dc.w    $0184,$0f0    ; color2
  332.     dc.w    $0186,$0c0    ; color3
  333.     dc.w    $0188,$090    ; color4
  334.     dc.w    $018a,$030    ; color5
  335.     dc.w    $018c,$070    ; color6
  336.     dc.w    $018e,$040    ; color7
  337.  
  338. ;    Der Effekt aus Listing3e.s, weiter nach oben verschoben
  339.  
  340.     dc.w    $2c07,$fffe    ; warten auf Zeile 154 ($9a in hexadezimal)
  341.     dc.w    $180        ; Register COLOR0
  342. col1:
  343.     dc.w    $0f0        ; WERT DES COLOR 0 (wird verändert)
  344.     dc.w    $2d07,$fffe    ; warten auf Zeile 155 (wird nicht verändert)
  345.     dc.w    $180        ; Register COLOR0 (wird nicht verändert)
  346. col2:
  347.     dc.w    $0d0        ; WERT DES COLOR 0 (will be modified)
  348.     dc.w    $2e07,$fffe    ; warten auf Zeile 156 (not modified, ecc.)
  349.     dc.w    $180        ; Register COLOR0
  350. col3:
  351.     dc.w    $0b0        ; WERT DES COLOR 0
  352.     dc.w    $2f07,$fffe    ; warten auf Zeile 157
  353.     dc.w    $180        ; Register COLOR0
  354. col4:
  355.     dc.w    $090        ; WERT DES COLOR 0
  356.     dc.w    $3007,$fffe    ; warten auf Zeile 158
  357.     dc.w    $180        ; Register COLOR0
  358. col5:
  359.     dc.w    $070        ; WERT DES COLOR 0
  360.     dc.w    $3107,$fffe    ; warten auf Zeile 159
  361.     dc.w    $180        ; Register COLOR0
  362. col6:
  363.     dc.w    $050        ; WERT DES COLOR 0
  364.     dc.w    $3207,$fffe    ; warten auf Zeile 160
  365.     dc.w    $180        ; Register COLOR0
  366. col7:
  367.     dc.w    $030        ; WERT DES COLOR 0
  368.     dc.w    $3307,$fffe    ; warten auf Zeile 161
  369.     dc.w    $180        ; color0... (nun habt ihr schon verstanden,
  370. col8:                ; ab hier kann ich´s mir sparen!)
  371.     dc.w    $030
  372.     dc.w    $3407,$fffe    ; Zeile 162
  373.     dc.w    $180
  374. col9:
  375.     dc.w    $050
  376.     dc.w    $3507,$fffe    ; Zeile 163
  377.     dc.w    $180
  378. col10:
  379.     dc.w    $070
  380.     dc.w    $3607,$fffe    ; Zeile 164
  381.     dc.w    $180
  382. col11:
  383.     dc.w    $090
  384.     dc.w    $3707,$fffe    ; Zeile 165
  385.     dc.w    $180
  386. col12:
  387.     dc.w    $0b0
  388.     dc.w    $3807,$fffe    ; Zeile 166
  389.     dc.w    $180
  390. col13:
  391.     dc.w    $0d0
  392.     dc.w    $3907,$fffe    ; Zeile 167
  393.     dc.w    $180
  394. col14:
  395.     dc.w    $0f0
  396.     dc.w    $3a07,$fffe    ; Zeile 168
  397.  
  398.     dc.w    $0180,$000    ; color0    ; reale Farben des Bildes
  399.     dc.w    $0182,$475    ; color1
  400.     dc.w    $0184,$fff    ; color2
  401.     dc.w    $0186,$ccc    ; color3
  402.     dc.w    $0188,$999    ; color4
  403.     dc.w    $018a,$232    ; color5
  404.     dc.w    $018c,$777    ; color6
  405.     dc.w    $018e,$444    ; color7
  406.  
  407. ;    Coppereffekt der Wellen mit dem $dff102 aus Listing5h.s, "geschmälert"
  408.  
  409.     DC.W    $102
  410. CON1EFFEKT:
  411.     dc.w    $000
  412.     DC.W    $4007,$FFFE,$102,$00
  413.     DC.W    $4407,$FFFE,$102,$11
  414.     DC.W    $4807,$FFFE,$102,$11
  415.     DC.W    $4C07,$FFFE,$102,$22
  416.     DC.W    $5007,$FFFE,$102,$33
  417.     DC.W    $5407,$FFFE,$102,$44
  418.     DC.W    $5807,$FFFE,$102,$66
  419.     DC.W    $5C07,$FFFE,$102,$66
  420.     DC.W    $6007,$FFFE,$102,$77
  421.     DC.W    $6407,$FFFE,$102,$77
  422.     DC.W    $6807,$FFFE,$102,$77
  423.     DC.W    $6C07,$FFFE,$102,$66
  424.     DC.W    $7007,$FFFE,$102,$66
  425.     DC.W    $7407,$FFFE,$102,$55
  426.     DC.W    $7807,$FFFE,$102,$33
  427.     DC.W    $7C07,$FFFE,$102,$22
  428.     DC.W    $8007,$FFFE,$102,$11
  429.     DC.W    $8407,$FFFE,$102,$11
  430.     DC.W    $8807,$FFFE,$102,$00
  431.     DC.W    $8C07,$FFFE,$102
  432. LETZTERWERT:
  433.     DC.W    $00
  434.  
  435. ;    EFFEKT AUS Listing3h.s
  436.  
  437.     dc.w    $9007,$fffe    ; warten auf Anfang der Zeile
  438.     dc.w    $180,$000    ; Grau auf Minimum, oder SCHWARZ!
  439. CopBar:
  440.     dc.w    $9031,$fffe    ; Wait, das wir verändern ($9033,$9035,$9037..)
  441.     dc.w    $180,$100    ; Farbe Rot
  442.     dc.w    $9107,$fffe    ; Wait, das wir nicht verändern (Beginn Zeile)
  443.     dc.w    $180,$111    ; Farbe GRAU (Beginnt beim Anfang der Zeile und
  444.     dc.w    $9131,$fffe    ; geht bis zu diesem Wait, das wir nicht ändern
  445.     dc.w    $180,$200    ; danach beginnt das ROT
  446.  
  447. ;    FIXE WAIT    (dann Grau)    - zu ändernde WAIT (gefolgt von Rot)
  448.  
  449.     dc.w    $9207,$fffe,$180,$120,$9231,$fffe,$180,$301 ; Zeile 3
  450.     dc.w    $9307,$fffe,$180,$230,$9331,$fffe,$180,$401 ; Zeile 4
  451.     dc.w    $9407,$fffe,$180,$240,$9431,$fffe,$180,$502 ; Zeile 5
  452.     dc.w    $9507,$fffe,$180,$350,$9531,$fffe,$180,$603 ; ....
  453.     dc.w    $9607,$fffe,$180,$360,$9631,$fffe,$180,$703
  454.     dc.w    $9707,$fffe,$180,$470,$9731,$fffe,$180,$803
  455.     dc.w    $9807,$fffe,$180,$580,$9831,$fffe,$180,$904
  456.     dc.w    $9907,$fffe,$180,$690,$9931,$fffe,$180,$a04
  457.     dc.w    $9a07,$fffe,$180,$7a0,$9a31,$fffe,$180,$b04
  458.     dc.w    $9b07,$fffe,$180,$8b0,$9b31,$fffe,$180,$c05
  459.     dc.w    $9c07,$fffe,$180,$9c0,$9c31,$fffe,$180,$d05
  460.     dc.w    $9d07,$fffe,$180,$ad0,$9d31,$fffe,$180,$e05
  461.     dc.w    $9e07,$fffe,$180,$be0,$9e31,$fffe,$180,$f05
  462.     dc.w    $9f07,$fffe,$180,$cf0,$9f31,$fffe,$180,$e05
  463.     dc.w    $a007,$fffe,$180,$be0,$a031,$fffe,$180,$d05
  464.     dc.w    $a107,$fffe,$180,$ad0,$a131,$fffe,$180,$c05
  465.     dc.w    $a207,$fffe,$180,$9c0,$a231,$fffe,$180,$b04
  466.     dc.w    $a307,$fffe,$180,$8b0,$a331,$fffe,$180,$a04
  467.     dc.w    $a407,$fffe,$180,$7a0,$a431,$fffe,$180,$904
  468.     dc.w    $a507,$fffe,$180,$690,$a531,$fffe,$180,$803
  469.     dc.w    $a607,$fffe,$180,$580,$a631,$fffe,$180,$703
  470.     dc.w    $a707,$fffe,$180,$470,$a731,$fffe,$180,$603
  471.     dc.w    $a807,$fffe,$180,$360,$a831,$fffe,$180,$502
  472.     dc.w    $a907,$fffe,$180,$250,$a931,$fffe,$180,$402
  473.     dc.w    $aa07,$fffe,$180,$140,$aa31,$fffe,$180,$301
  474.     dc.w    $ab07,$fffe,$180,$130,$ab31,$fffe,$180,$202
  475.     dc.w    $ac07,$fffe,$180,$120,$ac31,$fffe,$180,$103
  476.     dc.w    $ad07,$fffe,$180,$111,$ad31,$fffe,$180,$004
  477.  
  478.     dc.w    $ae07,$fffe
  479.     dc.w    $180,$002
  480.     dc.w    $af07,$fffe
  481.     dc.w    $180,$003
  482.  
  483. ;    Zylinder-Spiegel-Effekt aus Listing3g.s (+neudefinition der Farben)
  484.  
  485.     dc.w    $0182,$235    ; color1
  486.     dc.w    $0184,$99e    ; color2
  487.     dc.w    $0186,$88c    ; color3
  488.     dc.w    $0188,$659    ; color4
  489.     dc.w    $018a,$122    ; color5
  490.     dc.w    $018c,$337    ; color6
  491.     dc.w    $018e,$224    ; color7
  492.  
  493.     dc.w    $b007,$fffe
  494.     dc.w    $180,$004    ; Color0
  495.     dc.w    $102,$011    ; bplcon1
  496.     dc.w    $108,-40*7    ; Bpl1Mod - Spiegel 5 Mal halbiert
  497.     dc.w    $10a,-40*7    ; Bpl2Mod
  498.     dc.w    $b307,$fffe
  499.  
  500.     dc.w    $180,$006    ; Color0
  501.     dc.w    $102,$022    ; bplcon1
  502.     dc.w    $108,-40*6    ; Bpl1Mod - Spiegel 4 Mal halbiert
  503.     dc.w    $10a,-40*6    ; Bpl2Mod
  504.  
  505.     dc.w    $b607,$fffe
  506.  
  507.     dc.w    $0182,$245    ; color1
  508.     dc.w    $0184,$9cf    ; color2
  509.     dc.w    $0186,$89c    ; color3
  510.     dc.w    $0188,$669    ; color4
  511.     dc.w    $018a,$132    ; color5
  512.     dc.w    $018c,$347    ; color6
  513.     dc.w    $018e,$234    ; color7
  514.  
  515.     dc.w    $180,$008    ; Color0
  516.     dc.w    $102,$033    ; bplcon1
  517.     dc.w    $108,-40*5    ; Bpl1Mod - Spiegel 3 Mal halbiert
  518.     dc.w    $10a,-40*5    ; Bpl2Mod
  519.  
  520.     dc.w    $bb07,$fffe
  521.  
  522.     dc.w    $180,$00a    ; Color0
  523.     dc.w    $102,$044    ; bplcon1
  524.     dc.w    $108,-40*4    ; Bpl1Mod - Spiegel 2 Mal halbiert
  525.     dc.w    $10a,-40*4    ; Bpl2Mod
  526.  
  527.     dc.w    $c307,$fffe
  528.  
  529.     dc.w    $0182,$355    ; color1
  530.     dc.w    $0184,$abf    ; color2
  531.     dc.w    $0186,$9ac    ; color3
  532.     dc.w    $0188,$779    ; color4
  533.     dc.w    $018a,$232    ; color5
  534.     dc.w    $018c,$457    ; color6
  535.     dc.w    $018e,$344    ; color7
  536.     dc.w    $180,$00c    ; Color0
  537.     dc.w    $102,$055    ; bplcon1
  538.     dc.w    $108,-40*3    ; Bpl1Mod - Spiegel halbiert
  539.     dc.w    $10a,-40*3    ; Bpl2Mod
  540.  
  541.     dc.w    $d007,$fffe
  542.  
  543.     dc.w    $180,$00e    ; Color0
  544.     dc.w    $102,$066    ; bplcon1
  545.     dc.w    $108,-40*2    ; Bpl1Mod - Spiegel normal
  546.     dc.w    $10a,-40*2    ; Bpl2Mod
  547.  
  548.     dc.w    $d607,$fffe
  549.     dc.w    $0182,$465    ; color1
  550.     dc.w    $0184,$cdf    ; color2
  551.     dc.w    $0186,$bbc    ; color3
  552.     dc.w    $0188,$889    ; color4
  553.     dc.w    $018a,$232    ; color5
  554.     dc.w    $018c,$557    ; color6
  555.     dc.w    $018e,$444    ; color7
  556.  
  557.     dc.w    $180,$00f    ; Color0
  558.     dc.w    $102,$077    ; bplcon1
  559.     dc.w    $108,-40    ; Bpl1Mod - FLOOD, Zeilen wiederholt, für
  560.     dc.w    $10a,-40    ; Bpl2Mod - Vergrößerungseffekt in der Mitte
  561.  
  562.     dc.w    $da07,$fffe
  563.  
  564.     dc.w    $0182,$355    ; color1
  565.     dc.w    $0184,$abf    ; color2
  566.     dc.w    $0186,$9ac    ; color3
  567.     dc.w    $0188,$779    ; color4
  568.     dc.w    $018a,$232    ; color5
  569.     dc.w    $018c,$457    ; color6
  570.     dc.w    $018e,$344    ; color7
  571.     dc.w    $180,$00e    ; Color0
  572.     dc.w    $102,$066    ; bplcon1
  573.     dc.w    $108,-40*2    ; Bpl1Mod - Spiegel normal
  574.     dc.w    $10a,-40*2    ; Bpl2Mod
  575.  
  576.     dc.w    $e007,$fffe
  577.  
  578.     dc.w    $0182,$245    ; color1
  579.     dc.w    $0184,$9cf    ; color2
  580.     dc.w    $0186,$89c    ; color3
  581.     dc.w    $0188,$669    ; color4
  582.     dc.w    $018a,$132    ; color5
  583.     dc.w    $018c,$347    ; color6
  584.     dc.w    $018e,$234    ; color7
  585.     dc.w    $180,$00c    ; Color0
  586.     dc.w    $102,$055    ; bplcon1
  587.     dc.w    $108,-40*3    ; Bpl1Mod - Spiegel halbiert
  588.     dc.w    $10a,-40*3    ; Bpl2Mod
  589.  
  590.     dc.w    $ed07,$fffe
  591.  
  592.     dc.w    $180,$00a    ; Color0
  593.     dc.w    $102,$044    ; bplcon1
  594.     dc.w    $108,-40*4    ; Bpl1Mod - Spiegel 2 Mal halbiert
  595.     dc.w    $10a,-40*4    ; Bpl2Mod
  596.  
  597.     dc.w    $f507,$fffe
  598.  
  599.     dc.w    $0182,$235    ; color1
  600.     dc.w    $0184,$99e    ; color2
  601.     dc.w    $0186,$88c    ; color3
  602.     dc.w    $0188,$659    ; color4
  603.     dc.w    $018a,$122    ; color5
  604.     dc.w    $018c,$337    ; color6
  605.     dc.w    $018e,$224    ; color7
  606.     dc.w    $180,$008    ; Color0
  607.     dc.w    $102,$033    ; bplcon1
  608.     dc.w    $108,-40*5    ; Bpl1Mod - Spiegel 3 Mal halbiert
  609.     dc.w    $10a,-40*5    ; Bpl2Mod
  610.  
  611.     dc.w    $fa07,$fffe
  612.  
  613.     dc.w    $180,$006    ; Color0
  614.     dc.w    $102,$022    ; bplcon1
  615.     dc.w    $108,-40*6    ; Bpl1Mod - Spiegel 4 Mal halbiert
  616.     dc.w    $10a,-40*6    ; Bpl2Mod
  617.  
  618.     dc.w    $fd07,$fffe
  619.  
  620.     dc.w    $180,$004    ; Color0
  621.     dc.w    $102,$011    ; bplcon1
  622.     dc.w    $108,-40*7    ; Bpl1Mod - Spiegel 5 Mal halbiert
  623.     dc.w    $10a,-40*7    ; Bpl2Mod
  624.  
  625.     dc.w    $ff07,$fffe
  626.  
  627.     dc.w    $180,$002    ; Color0
  628.     dc.w    $102,$000    ; bplcon1
  629.     dc.w    $108,-40    ; Stoppt das Bild um zu vermeiden, daß Bytes
  630.     dc.w    $10a,-40    ; vor dem RAW angezeigt werden
  631.  
  632. ;    Effekt aus Listing3f.s
  633.  
  634.     dc.w    $ffdf,$fffe    ; ACHTUNG! WAIT am Ende der Zeile $FF!
  635.                 ; die Wait nach dieser Zeile befinden sich
  636.                 ; unter $FF, starten aber bei $00!!
  637.  
  638.     dc.w    $0107,$FFFE    ; ein fixer, grüner Balken unter der Zeile $FF!
  639.     dc.w    $180,$010
  640.     dc.w    $0207,$FFFE
  641.     dc.w    $180,$020
  642.     dc.w    $0307,$FFFE
  643.     dc.w    $180,$030
  644.     dc.w    $0407,$FFFE
  645.     dc.w    $180,$040
  646.     dc.w    $0507,$FFFE
  647.     dc.w    $180,$030
  648.     dc.w    $0607,$FFFE
  649.     dc.w    $180,$020
  650.     dc.w    $0707,$FFFE
  651.     dc.w    $180,$010
  652.     dc.w    $0807,$FFFE
  653.     dc.w    $180,$000
  654.  
  655. BALKEN:
  656.     dc.w    $0907,$FFFE    ; Warte auf Zeile $79
  657.     dc.w    $180,$300    ; Beginne die rote Zeile: Rot auf 3
  658.     dc.w    $0a07,$FFFE    ; nächste Zeile
  659.     dc.w    $180,$600    ; Rot auf 6
  660.     dc.w    $0b07,$FFFE
  661.     dc.w    $180,$900    ; Rot auf 9
  662.     dc.w    $0c07,$FFFE
  663.     dc.w    $180,$c00    ; Rot auf 12
  664.     dc.w    $0d07,$FFFE
  665.     dc.w    $180,$f00    ; Rot auf 15 (Maximum)
  666.     dc.w    $0e07,$FFFE
  667.     dc.w    $180,$c00    ; Rot auf 12
  668.     dc.w    $0f07,$FFFE
  669.     dc.w    $180,$900    ; Rot auf 9
  670.     dc.w    $1007,$FFFE
  671.     dc.w    $180,$600    ; Rot auf 6
  672.     dc.w    $1107,$FFFE
  673.     dc.w    $180,$300    ; Rot auf 3
  674.     dc.w    $1207,$FFFE
  675.     dc.w    $180,$000    ; Farbe Schwarz
  676.  
  677.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  678.  
  679.  
  680. ; **************************************************************************
  681. ; *            BILD IN 8 FARBEN 320x256               *
  682. ; **************************************************************************
  683.  
  684.     dcb.b    40*98,0     ; leergefegter Raum
  685.  
  686. PIC:
  687.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im
  688.                     ; RAW - Format
  689.  
  690.     dcb.b    40*8,0        ; wie oben
  691.  
  692. ; **************************************************************************
  693. ; *                PROTRACKER-MUSIK               *
  694. ; **************************************************************************
  695.  
  696. mt_data:
  697.     incbin    "mod.purple-shades"
  698.  
  699.     end
  700.  
  701. ; **************************************************************************
  702. Dieses Listing ist nichts  anderes  als  ein  Zusammenschluß  von  einigen
  703. Listings,  wie  ihr  gesehen habt. Die Unterschiede sind zwei:
  704.  
  705. 1) Ich habe den Welleneffekt von 45 Wait auf 20 verkürzen  müßen,  um  ihn
  706. zwischen  die  anderen  Effekte  zu  bekommen. 
  707.  
  708. 2) Ich habe die Palette des Bildes oben verändert, so daß es aussieht, als
  709. ob das Bild in die ScrollColors eintreten würde. Weiters habe ich hier und
  710. da die Farben verändert, um die SUPERCOPPERLIST zu verschönern und ...  zu
  711. verlängern!!
  712.  
  713. Die wirkliche Neuigkeit ist das Einfügen einer Musikroutine! Zuerst einmal
  714. folgendes: ich habe das Einbinden dieser Routine mit "INCLUDE" dem  wahren
  715. "Einsetzen" (abtippen, reinkopieren) vorgezogen. Dieses Include erlaubt es
  716. mir, außenstehende Listings praktisch einzufügen. Schauen wir nun, wie wir
  717. unsere Wunder noch mit einem bißchen Musik auf die Sprünge helfen können.
  718. Als erstes ist zu beachten, daß das Musikstück in einem speziellen  Format
  719. vorliegen  muß, dem PROTRACKER-Format. Und nicht etwa digitalisierte Musik
  720. etc. Es gibt viele Programme, mit denen man Musik komponieren kann, das am
  721. meisten  verwendete  ist  der  Protracker, kompatibel mit Soundtracker und
  722. Noisetracker. Sie speichern das  Stück  im  MOD-Format  ab,  oft  beginnen
  723. solche  Musikstücke auch mit dem Kürzel MOD. Es ist aber nicht gesagt, daß
  724. unbedingt immer Protracker verwendet wurde: bei einigen Spielen, vor allem
  725. älteren,   wurden   oft   MED,   OCTAMED,  FUTURE-COMPOSER,  SOUNDMONITOR,
  726. OKTALYZER..., verwendet, aber in diesen Fällen muß eine eigene Routine für
  727. diese  Formate  das Abspielen übernehmen. Meistens erhält man zusammen mit
  728. dem Programm auch die REPLAY-Routine,
  729. die im Programm eingebaut werden kann.
  730. Heutzutage verwenden 99%  der  Amiga-Produktionen  Protracker-Format  oder
  731. deren Untersorten, also einem Format, das nach eigenen Regeln und Gesetzen
  732. die "Noten" speichert und komprimiert.
  733. Ich habe diesem Kurs diese Routine mitgegeben, die  Protracker  problemlos
  734. spielt, sie ist kompatibel zu Soundtracker und Noisetracker. Des  weiteren
  735. habe  ich  sie modifiziert, daß sie kompatibel zu 68020+ Prozessoren, auch
  736. mit  eingeschalteter   Cache,   ist.   Im   Orginalzustand   hatte   diese
  737. ReplayRoutine  einige  Probleme  bei schnelleren Prozessoren und so verlor
  738. sie manchmal einige Noten... Aber  jetzt  singt  die  "music.s"  auch  auf
  739. A4000ern ohne Schwierigkeiten.
  740. Um sie einzufügen, könnt ihr entweder den "I"-Befehl verwenden,  oder  sie
  741. in  einen  anderen  Buffer  laden  und  dann  ins  Listing  kopieren.  Ich
  742. persönlich ziehe es aber vor, Platz zu sparen, deswegen verwende  ich  die
  743. "Include"-Direktive des ASMONE. Somit wird das Listing assembliert, als ob
  744. die Routine wirklich händisch eingebaut worden wäre, nur  sparen  wir  uns
  745. die  Länge  dieser  Routine  selbst,  ca  21 kB. Stellt euch z.B. vor, ihr
  746. hättet sieben Listings, denen ihr allen diese Routine unterjubeln wollt:
  747.  
  748.     Listing1.s    12234 bytes
  749.     Listing2.s    23523 bytes
  750.     Listing3.s    29382 bytes
  751.     Listing4.s    78343 bytes
  752.     Listing5.s    10482 bytes
  753.     Listing6.s    14925 bytes
  754.     Listing7.s    29482 bytes
  755.  
  756. Zusammen sind  sie  ca.  200k  groß,  nachdem  wir  aber  jeden  21kB  der
  757. Replay-Routine  dazugezählt haben, würden sie insgesamt 300kB verbrauchen!
  758. Aber wenn ich nur die Zeile
  759.  
  760.     include "music.s"
  761.  
  762. schreibe,  dann  ist  die Vergrößerung des Listings nur ein paar Byte, das
  763. Resultat aber das gleiche. Der einzige Schwachpunkt ist, daß man sich, wie
  764. beim  INCBIN,  in  der  selben  Directory befinden muß, wo sich auch diese
  765. Routine befindet. Ansonsten muß man den vollständigen Pfad schreiben:
  766.  
  767.     include "df0:sorgenti2/music.s"
  768.  
  769. Einmal  eingefügt,  sei  es  nun  mit  dem  Include  oder mittels direktem
  770. Einfügen von Hand, braucht man sie nur  mehr  zum  Funktionieren  bringen.
  771. GANZ  EINFACH!  Nur  mt_init  vor  dem Mouse-Loop aufrufen, damit wird sie
  772. initialisiert, dann "mt_music" bei JEDEM FRAME ausführen, und dann  mt_end
  773. am  Ende  vor  dem Aussteigen aufrufen. Damit wird die Routine beendet und
  774. sie gibt die Audio-Kanäle wieder frei.
  775.  
  776.     bsr.w    mt_init        ; Inizialisiert Musik-Routine
  777.  
  778. mouse:
  779.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  780.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  781.  
  782.     bsr.w    MeineGrafikRoutine
  783.     bsr.w    mt_music    ; Spielt die Musik
  784.  
  785.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  786.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  787.  
  788.     bsr.s    mt_end        ; Beendet die Musikroutine
  789.  
  790. Das Musikstück muß natürlich geladen werden, einfach mit dem INCBIN unter
  791. dem Label "mt_data":
  792.  
  793. mt_data:
  794.     incbin    "mod.purple-shades"
  795.  
  796. Die im Kurs enthaltene Musik ist von HI-LITE der VISION FACTORY, ein
  797. Stück, das schon  einige Jahre auf dem Buckel hat, ich ahbe sie gewählt,
  798. weil sie nur 13 kB lang ist. Wenn ihr etwas Eigenes spielen lassen wollt,
  799. dann einfach mit dem Incbin reinholen:
  800.  
  801. mt_data:
  802.     incbin    "df1:modules/mod.MyMusic"    ; zum Beispiel!
  803.  
  804.