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

  1.  
  2. ; Lezione4c.s    ZUSAMMENSCHLUß VON 3 COPPEREFFEKTEN + BILD IN 8 FARBEN
  3.  
  4.  
  5.  
  6.  SECTION CIPundCOP,CODE    ; auch Fast ist  OK
  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, öffnet Bibliothek
  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 (immer auf $26 nach
  17.                 ; GfxBase)
  18.  
  19. ;******************************************************************************
  20. ;HIER LASSEN WIR UNSERE BPLPOINTS IN DER COPPELIST UNSERE BITPLANES ANPOINTEN 
  21. ;******************************************************************************
  22.  
  23.     MOVE.L    #PIC,d0     ; in d0 kommt die Adresse von unserer PIC
  24.              ; bzw. wo ihr erstes Bitplane beginnt
  25.  
  26.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  27.                 ; Pointer der Copperlist
  28.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  29.                 ; für den DBRA - Zyklus
  30. POINTBP:
  31.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  32.                 ; Adresse ins richtige Word der Copperlist
  33.     swap    d0            ; vertauscht die 2 Word in d0 ( 1234 > 3412)
  34.  
  35.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  36.                 ; Plane in das richtige Word in der Copperlist
  37.     swap    d0            ; vertauscht erneut die 2 Word von d0
  38.                ; damit wird die orginale Adresse wieder hergestellt
  39.     ADD.L    #40*256,d0 ; Zählen 10240 zu D0 dazu, somit zeigen wir
  40.                ; auf das zweite Bitplane (befindet sich direkt
  41.                ; nach dem ersten), wir zählen praktisch die Länge
  42.                ; eines Plane dazu
  43.                ; In den nächsten Durchgängen werden wir dann auf
  44.                ; das dritte, vierte... Bitplane zeigen
  45.  
  46.     addq.w    #8,a1        ; a1 enthält nun die Adresse der nächsten
  47.                 ; bplpointers in der  Copperlist, die es
  48.                 ; einzutragen gilt
  49.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1=num of bitpls)
  50.  
  51.  
  52.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  53.                     ; (deren Adresse)
  54.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  55.  
  56.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  57.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  58.  
  59. mouse:
  60.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  61.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  62.  
  63.     bsr.w    BewegeCopper    ; Roter Balken unter Zeile $ff
  64.     bsr.w    CopperLinkRech    ; Routine für Links/Rechts-Scroll
  65.     BSR.w    scrollcolors    ; Zyklisches Fließen der Farben
  66.  
  67. Warte:
  68.     cmpi.b    #$ff,$dff006    ; Sind wir noch auf Zeile 255?
  69.     beq.s    Warte        ; Wenn ja, geh nicht weiter, warte auf die
  70.                 ; nächste Zeile, ansonsten wird BewegeCopper
  71.                 ; noch einmal ausgeführt
  72.  
  73.  
  74.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  75.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  76.  
  77.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  78.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  79.  
  80.     move.l    4.w,a6
  81.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  82.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  83.                 ; (Libraries werden geöffnet UND geschlossen!)
  84.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  85.     rts
  86.  
  87.  
  88. ; DATEN
  89.  
  90.  
  91.  
  92. GfxName:
  93.     dc.b    "graphics.library",0,0    
  94.  
  95. GfxBase:       ; Hier hinein kommt die Basisadresse der graphics.library,
  96.     dc.l    0  ; ab hier werden die Offsets gemacht
  97.  
  98.  
  99.  
  100. OldCop:            ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  101.     dc.l    0   ; Betriebssystemes
  102.  
  103.  
  104. ; **************************************************************************
  105. ; *        BALKEN MIT HORIZONTALEM SCROLL  (LISTING3h.s)           *
  106. ; **************************************************************************
  107.  
  108.  
  109. CopperLinkRech:
  110.     CMPI.W    #85,FlagRechts        ; GehRechts 85 Mal ausgeführt?
  111.     BNE.S    GehRechts        ; wenn nicht, wiederhole nochmal
  112.                     ; wenn es aber 85 Mal ausgeführt wurde,
  113.                     ; dann geh weiter
  114.  
  115.     CMPI.W    #85,FlagLinks    ; GehLinks 85 Mal ausgeführt?
  116.     BNE.S    GehLinks    ; wenn nicht, wiederhole nochmal
  117.  
  118.     CLR.W    FlagRechts    ; Die Routine GehLinks wurde 85 Mal ausge-
  119.     CLR.W    FlagLinks    ; führt, also ist zu diesem Zeitpunkt der
  120.                 ; graue Balken zurückgekommen und der Rechts-
  121.                 ; Links-Zyklus ist fertig. Wir löschen die
  122.                 ; zwei Falgs und steigen aus: beim nächsten
  123.                 ; FRAME wird GehRechts ausgeführt,nach 85 Frame
  124.                 ; GehLinks 85 Mal, etcetera.
  125.     RTS            ; ZURÜCK ZUM MOUSE-LOOP
  126.  
  127. GehRechts:            ; Diese Routine bewegt den Balken nach RECHTS
  128.     lea    CopBar+1,A0    ; Wir geben in A0 die Adresse des ersten XX-
  129.                 ; Wertes des ersten Wait, das sich genau 1 Byte
  130.                 ; nach CopBar befindet
  131.  
  132.     move.w    #29-1,D2     ; wir müßen 29 Wait verändern (verwenden ein DBRA)
  133. RechtsLoop:
  134.     addq.b    #2,(a0)        ; zählen 2 zu der X-Koordinate des Wait dazu
  135.     ADD.W    #16,a0        ; gehen zum nächsten Wait, das zu ändern ist
  136.     dbra    D2,RechtsLoop    ; Zyklus wird d2-Mal durchlaufen
  137.     addq.w    #1,FlagRechts   ; vermerken,daß wir ein weiteres Mal GehRechts 
  138.                 ; ausgeführt haben
  139.                 ; GehRechts: in FlagRechts steht die Anzahl,
  140.                 ; wie oft wir GehRechts ausgeführt haben
  141.     RTS            ; Zurück zum Mouse-Loop
  142.  
  143.  
  144. GehLinks:            ; diese Routine bewegt den Balken nach LINKS
  145.     lea    CopBar+1,A0
  146.     move.w    #29-1,D2    ; wir müßen 29 Wait verändern
  147. LinksLoop:
  148.     subq.b    #2,(a0)       ; ziehen der X-Koordinate des Wait 2 ab
  149.     ADD.W    #16,a0       ; gehen zum nächsten Wait über, das zu verändern ist
  150.     dbra    D2,LinksLoop  ; Zyklus wird d2-Mal durchgeführt
  151.     addq.w    #1,FlagLinks  ; Zählen 1 zur Anzahl dazu, wie oft diese Routine
  152.                 ; GehLinks ausgeführt wurde
  153.     RTS            ; Zurück zum Mouse-Loop
  154.  
  155. FlagRechts:        ; In diesem Word wird die Anzahl festgehalten,
  156.     dc.w    0    ; wie oft  GehRechts ausgeführt wurde
  157.  
  158. FlagLinks:        ; In diesem Word wird die Anzahl festgehalten,
  159.     dc.w    0    ; wie oft  GehLinks ausgeführt wurde
  160.  
  161.  
  162. ; **************************************************************************
  163. ; *        ROTER BALKEN UNTER ZEILE $FF  (Listing3f.s)           *
  164. ; **************************************************************************
  165.  
  166. BewegeCopper:
  167.     LEA    BALKEN,a0    ; in a0 kommt die Adresse von Balken
  168.     TST.B    RAUFRUNTER    ; oben angekommen?
  169.     beq.w    GEHRUNTER
  170.  
  171.     cmpi.b    #$0a,(a0)    ; sind wir bei Zeile $0a+$ff angekommen?
  172.     beq.s    SetzRunter    ; wenn ja, sind wir oben angekommen und
  173.     subq.b    #1,(a0)        ; müßen runter
  174.     subq.b    #1,8(a0)
  175.     subq.b    #1,8*2(a0)    ; nun ändern wir die anderen Wait: der
  176.     subq.b    #1,8*3(a0)    ; Abstand zwischen einem und dem anderen beträgt
  177.     subq.b    #1,8*4(a0)    ; 8 Byte
  178.     subq.b    #1,8*5(a0)
  179.     subq.b    #1,8*6(a0)
  180.     subq.b    #1,8*7(a0)    ; hier müßen wir alle 9 Wait des roten Balken
  181.     subq.b    #1,8*8(a0)    ; ändern, wenn wir ihn steigen und sinken lassen
  182.     subq.b    #1,8*9(a0)    ; wollen.
  183.     rts
  184.  
  185.  
  186.  
  187. SetzRunter:
  188.     clr.b    RAUFRUNTER    ; Setzt RAUFRUNTER auf 0, beim TST.B RAUFRUNTER
  189.     rts            ; wird das BEQ zu Routine GEHRUNTER verzweigen,
  190.                 ; und der Balken wird sinken
  191.  
  192.  
  193. GEHRUNTER:
  194.     cmpi.b    #$2c,8*9(a0)    ; sind wir bei Zeile $2c angekommen?
  195.     beq.s    SetzRauf    ; wenn ja, sind wir untern und müßen wieder
  196.     addq.b    #1,(a0)         ; steigen
  197.     addq.b    #1,8(a0)
  198.     addq.b    #1,8*2(a0)    ; nun ändern wir die anderen Wait: der
  199.     addq.b    #1,8*3(a0)    ; Abstand zwischen einem und dem anderen beträgt
  200.     addq.b    #1,8*4(a0)    ; 8 Byte
  201.     addq.b    #1,8*5(a0)
  202.     addq.b    #1,8*6(a0)
  203.     addq.b    #1,8*7(a0)    ; hier müßen wir alle 9 Wait des roten Balken
  204.     addq.b    #1,8*8(a0)    ; ändern, wenn wir ihn steigen und sinken lassen
  205.     addq.b    #1,8*9(a0)    ; wollen.
  206.     rts
  207.  
  208. SetzRauf:
  209.     move.b    #$ff,RAUFRUNTER ; Wenn das Label nicht auf NULL ist,
  210.     rts            ; bedeutet es, daß wir steigen müßen
  211.  
  212. RAUFRUNTER:
  213.     dc.b    0,0
  214.  
  215. ; **************************************************************************
  216. ; *        ZYKLISCHES FLIEßEN DER FARBEN (Listing3e.s)           *
  217. ; **************************************************************************
  218.  
  219. Scrollcolors:
  220.     move.w    col2,col1    ; col2 kommt in col1
  221.     move.w    col3,col2    ; col3 kommt in col2
  222.     move.w    col4,col3    ; col4 kommt in col3
  223.     move.w    col5,col4    ; col5 kommt in col4
  224.     move.w    col6,col5    ; col6 kommt in col5
  225.     move.w    col7,col6    ; col7 kommt in col6
  226.     move.w    col8,col7    ; col8 kommt in col7
  227.     move.w    col9,col8    ; col9 kommt in col8
  228.     move.w    col10,col9    ; col10 kommt in col9
  229.     move.w    col11,col10    ; col11 kommt in col10
  230.     move.w    col12,col11    ; col12 kommt in col11
  231.     move.w    col13,col12    ; col13 kommt in col12
  232.     move.w    col14,col13    ; col14 kommt in col13
  233.     move.w    col1,col14    ; col1 kommt in col14
  234.     rts
  235.  
  236.  
  237. ; **************************************************************************
  238. ; *                SUPER COPPERLIST               *
  239. ; **************************************************************************
  240.  
  241.     SECTION GRAPHIC,DATA_C
  242.  
  243. COPPERLIST:
  244.  
  245.     ; Wir lassen die Sprites auf 0 pointen, ansonsten gasen sie nur
  246.     ; wie verrückt herum und stören!!
  247.  
  248.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000
  249.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  250.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  251.     dc.w    $13e,$0000
  252.  
  253.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  254.     dc.w    $90,$2cc1    ; DiwStop
  255.     dc.w    $92,$0038    ; DdfStart
  256.     dc.w    $94,$00d0    ; DdfStop
  257.     dc.w    $102,0        ; BplCon1
  258.     dc.w    $104,0        ; BplCon2
  259.     dc.w    $108,0        ; Bpl1Mod
  260.     dc.w    $10a,0        ; Bpl2Mod
  261.  
  262. ; Das BPLCON0 für einen Bildschirm mit 3 Bitplanes: (8 Farben)
  263.  
  264.             ; 5432109876543210
  265.     dc.w    $100,%0011001000000000  ; Bts 13 und 12 an!! (3 = %011)
  266.  
  267.  
  268. ;    Wir lassen die Bitplanes direkt anpointen, indem wir die Register
  269. ;    $dff0e0 und folgende hier in der Copperlist einfügen. Die
  270. ;    Adressen der Bitplanes werden dann von der Routine POINTBP
  271. ;    automatisch eingetragen
  272.  
  273.  
  274. BPLPOINTERS:
  275.     dc.w $e0,$0000,$e2,$0000    ; bitplane 1 - BPL0PT
  276.     dc.w $e4,$0000,$e6,$0000    ; bitplane 2 - BPL1PT
  277.     dc.w $e8,$0000,$ea,$0000    ; bitplane 3 - BPL2PT
  278.  
  279. ;    Der Effekt von Listing3e.s, nur weiter HINAUF versetzt
  280.  
  281.     dc.w    $3a07,$fffe    ; warten auf Zeile 154 ($9a in Hexadezimal)
  282.     dc.w    $180        ; REGISTER COLOR0
  283. col1:
  284.     dc.w    $0f0        ; Wert von COLOR 0 (das verändert wird)
  285.     dc.w    $3b07,$fffe    ; warten auf Zeile 155 (wird nicht verändert)
  286.     dc.w    $180        ; REGISTER COLOR0 (wird nicht verändert)
  287. col2:
  288.     dc.w    $0d0         ; Wert von COLOR 0 (wird verändert)
  289.     dc.w    $3c07,$fffe  ; warten auf Zeile 156 (wird nicht verändert,ecc.)
  290.     dc.w    $180         ; REGISTER COLOR0
  291. col3:
  292.     dc.w    $0b0        ; Wert von COLOR 0
  293.     dc.w    $3d07,$fffe    ; warten auf Zeile 157
  294.     dc.w    $180        ; REGISTER COLOR0
  295. col4:
  296.     dc.w    $090        ; Wert von COLOR 0
  297.     dc.w    $3e07,$fffe    ; warten auf Zeile 158
  298.     dc.w    $180        ; REGISTER COLOR0
  299. col5:
  300.     dc.w    $070        ; Wert von COLOR 0
  301.     dc.w    $3f07,$fffe    ; warten auf Zeile 159
  302.     dc.w    $180        ; REGISTER COLOR0
  303. col6:
  304.     dc.w    $050        ; Wert von COLOR 0
  305.     dc.w    $4007,$fffe    ; warten auf Zeile 160
  306.     dc.w    $180        ; REGISTER COLOR0
  307. col7:
  308.     dc.w    $030        ; Wert von COLOR 0
  309.     dc.w    $4107,$fffe    ; warten auf Zeile 161
  310.     dc.w    $180        ; color0... (nun habt ihr schon verstanden,
  311. col8:                ; ab hier gebe ich keinen Kommentar mehr!)
  312.     dc.w    $030
  313.     dc.w    $4207,$fffe    ; Zeile 162
  314.     dc.w    $180
  315. col9:
  316.     dc.w    $050
  317.     dc.w    $4307,$fffe    ;  Zeile 163
  318.     dc.w    $180
  319. col10:
  320.     dc.w    $070
  321.     dc.w    $4407,$fffe    ;  Zeile 164
  322.     dc.w    $180
  323. col11:
  324.     dc.w    $090
  325.     dc.w    $4507,$fffe    ;  Zeile 165
  326.     dc.w    $180
  327. col12:
  328.     dc.w    $0b0
  329.     dc.w    $4607,$fffe    ;  Zeile 166
  330.     dc.w    $180
  331. col13:
  332.     dc.w    $0d0
  333.     dc.w    $4707,$fffe    ;  Zeile 167
  334.     dc.w    $180
  335. col14:
  336.     dc.w    $0f0
  337.     dc.w    $4807,$fffe    ;  Zeile 168
  338.  
  339.  
  340.     dc.w    $180,$0000    ; Wir beschließen, den Bildschirm unter
  341.                 ; dem Effekt Schwarz zu färben
  342.  
  343.     dc.w    $0180,$000    ; color0
  344.     dc.w    $0182,$550    ; color1    ; wir verändern die Farbe der
  345.     dc.w    $0184,$ff0    ; color2    ; COMMODORE-Schrift! GELB!
  346.     dc.w    $0186,$cc0    ; color3
  347.     dc.w    $0188,$990    ; color4
  348.     dc.w    $018a,$220    ; color5
  349.     dc.w    $018c,$770    ; color6
  350.     dc.w    $018e,$440    ; color7
  351.  
  352.     dc.w    $7007,$fffe    ; Wir warten das Ende des COMMODORE-
  353.                 ; Schriftzuges ab
  354.  
  355. ;    Die 8 Farben des Bildes sind hier definiert:
  356.  
  357.     dc.w    $0180,$000    ; Color0
  358.     dc.w    $0182,$475    ; Color1
  359.     dc.w    $0184,$fff    ; Color2
  360.     dc.w    $0186,$ccc    ; Color3
  361.     dc.w    $0188,$999    ; Color4
  362.     dc.w    $018a,$232    ; Color5
  363.     dc.w    $018c,$777    ; Color6
  364.     dc.w    $018e,$444    ; Color7
  365.  
  366. ;    Effekt aus Listing3h.s
  367.  
  368.     dc.w    $9007,$fffe    ; Warten auf den Beginn der Zeile
  369.     dc.w    $180,$000    ; Grau auf Minimum, also SCHWARZ!
  370. CopBar:
  371.     dc.w    $9031,$fffe ; Wait, das geändert wird ($9033,$9035,$9037...)
  372.     dc.w    $180,$100   ; Farbe Rot, die immer weiter rechts beginnen
  373.                 ; wird, vorangegangen vom Grau, das dementsprechend
  374.                 ; fortschreiten wird
  375.     dc.w    $9107,$fffe  ; Wait, das nicht geändert wird (Beginn der Zeile)
  376.     dc.w    $180,$111    ; Farbe GRAU (startet beim Beginn der Zeile bis
  377.     dc.w    $9131,$fffe  ; zu diesem WAIT, das wir nicht ändern werden...
  378.     dc.w    $180,$200    ; danach beginnt das ROT
  379.  
  380. ;        FIXE WAIT (dann Grau)-VERÄNDERB. WAIT (gefolgt vom Rot)
  381.  
  382.     dc.w    $9207,$fffe,$180,$222,$9231,$fffe,$180,$300 ; Zeile 3
  383.     dc.w    $9307,$fffe,$180,$333,$9331,$fffe,$180,$400 ; Zeile 4
  384.     dc.w    $9407,$fffe,$180,$444,$9431,$fffe,$180,$500 ; Zeile 5
  385.     dc.w    $9507,$fffe,$180,$555,$9531,$fffe,$180,$600 ; ....
  386.     dc.w    $9607,$fffe,$180,$666,$9631,$fffe,$180,$700
  387.     dc.w    $9707,$fffe,$180,$777,$9731,$fffe,$180,$800
  388.     dc.w    $9807,$fffe,$180,$888,$9831,$fffe,$180,$900
  389.     dc.w    $9907,$fffe,$180,$999,$9931,$fffe,$180,$a00
  390.     dc.w    $9a07,$fffe,$180,$aaa,$9a31,$fffe,$180,$b00
  391.     dc.w    $9b07,$fffe,$180,$bbb,$9b31,$fffe,$180,$c00
  392.     dc.w    $9c07,$fffe,$180,$ccc,$9c31,$fffe,$180,$d00
  393.     dc.w    $9d07,$fffe,$180,$ddd,$9d31,$fffe,$180,$e00
  394.     dc.w    $9e07,$fffe,$180,$eee,$9e31,$fffe,$180,$f00
  395.     dc.w    $9f07,$fffe,$180,$fff,$9f31,$fffe,$180,$e00
  396.     dc.w    $a007,$fffe,$180,$eee,$a031,$fffe,$180,$d00
  397.     dc.w    $a107,$fffe,$180,$ddd,$a131,$fffe,$180,$c00
  398.     dc.w    $a207,$fffe,$180,$ccc,$a231,$fffe,$180,$b00
  399.     dc.w    $a307,$fffe,$180,$bbb,$a331,$fffe,$180,$a00
  400.     dc.w    $a407,$fffe,$180,$aaa,$a431,$fffe,$180,$900
  401.     dc.w    $a507,$fffe,$180,$999,$a531,$fffe,$180,$800
  402.     dc.w    $a607,$fffe,$180,$888,$a631,$fffe,$180,$700
  403.     dc.w    $a707,$fffe,$180,$777,$a731,$fffe,$180,$600
  404.     dc.w    $a807,$fffe,$180,$666,$a831,$fffe,$180,$500
  405.     dc.w    $a907,$fffe,$180,$555,$a931,$fffe,$180,$400
  406.     dc.w    $aa07,$fffe,$180,$444,$aa31,$fffe,$180,$301
  407.     dc.w    $ab07,$fffe,$180,$333,$ab31,$fffe,$180,$202
  408.     dc.w    $ac07,$fffe,$180,$222,$ac31,$fffe,$180,$103
  409.     dc.w    $ad07,$fffe,$180,$113,$ad31,$fffe,$180,$004
  410.  
  411.     dc.w    $ae07,$FFFE    ; nächste Zeile
  412.     dc.w    $180,$006    ; Blau auf 6
  413.     dc.w    $b007,$FFFE    ; überspringe 2 Zeilen
  414.     dc.w    $180,$007    ; Blau auf 7
  415.     dc.w    $b207,$FFFE    ; überspringe 2 Zeilen
  416.     dc.w    $180,$008    ; Blau auf 8
  417.     dc.w    $b507,$FFFE    ; überspringe 3 Zeilen
  418.     dc.w    $180,$009    ; Blau auf 9
  419.     dc.w    $b807,$FFFE    ; überspringe 3 Zeilen
  420.     dc.w    $180,$00a    ; Blau auf 10
  421.     dc.w    $bb07,$FFFE    ; überspringe 3 Zeilen
  422.     dc.w    $180,$00b    ; Blau auf 11
  423.     dc.w    $be07,$FFFE    ; überspringe 3 Zeilen
  424.     dc.w    $180,$00c    ; Blau auf 12
  425.     dc.w    $c207,$FFFE    ; überspringe 4 Zeilen
  426.     dc.w    $180,$00d    ; Blau auf 13
  427.     dc.w    $c707,$FFFE    ; überspringe 7 Zeilen
  428.     dc.w    $180,$00e    ; Blau auf 14
  429.     dc.w    $ce07,$FFFE    ; überspringe 6 Zeilen
  430.     dc.w    $180,$00f    ; Blau auf 15
  431.     dc.w    $d807,$FFFE    ; überspringe 10 Zeilen
  432.     dc.w    $180,$11F    ; helle auf...
  433.     dc.w    $e807,$FFFE    ; überspringe 16 Zeilen
  434.     dc.w    $180,$22F    ; helle auf...
  435.  
  436. ;    Effekt von Listing3f.s
  437.  
  438.     dc.w    $ffdf,$fffe    ; ACHTUNG! WAIT AM ENDE DER ZEILE FF!
  439.                 ; die folgenden Wait sind unter der Zeile
  440.                 ; $FF und starten wieder bei $00!!
  441.  
  442.     dc.w    $0107,$FFFE    ; Ein fixer, grüner Balken UNTER der Zeile $FF!
  443.     dc.w    $180,$010
  444.     dc.w    $0207,$FFFE
  445.     dc.w    $180,$020
  446.     dc.w    $0307,$FFFE
  447.     dc.w    $180,$030
  448.     dc.w    $0407,$FFFE
  449.     dc.w    $180,$040
  450.     dc.w    $0507,$FFFE
  451.     dc.w    $180,$030
  452.     dc.w    $0607,$FFFE
  453.     dc.w    $180,$020
  454.     dc.w    $0707,$FFFE
  455.     dc.w    $180,$010
  456.     dc.w    $0807,$FFFE
  457.     dc.w    $180,$000
  458.  
  459. BALKEN:
  460.     dc.w    $0907,$FFFE    ; Warte auf Zeile $79
  461.     dc.w    $180,$300    ; Beginne roten Balken: Rot auf 3
  462.     dc.w    $0a07,$FFFE    ; nächste Zeile
  463.     dc.w    $180,$600    ; Rot auf 6
  464.     dc.w    $0b07,$FFFE
  465.     dc.w    $180,$900    ; Rot auf 9
  466.     dc.w    $0c07,$FFFE
  467.     dc.w    $180,$c00    ; Rot auf 12
  468.     dc.w    $0d07,$FFFE
  469.     dc.w    $180,$f00    ; Rot auf 15 (Maximum)
  470.     dc.w    $0e07,$FFFE
  471.     dc.w    $180,$c00    ; Rot auf 12
  472.     dc.w    $0f07,$FFFE
  473.     dc.w    $180,$900    ; Rot auf 9
  474.     dc.w    $1007,$FFFE
  475.     dc.w    $180,$600    ; Rot auf 6
  476.     dc.w    $1107,$FFFE
  477.     dc.w    $180,$300    ; Rot auf 3
  478.     dc.w    $1207,$FFFE
  479.     dc.w    $180,$000    ; Farbe SCHWARZ
  480.  
  481.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  482.  
  483.  
  484. ; **************************************************************************
  485. ; *            BILD IN 8 FARBEN  320x256               *
  486. ; **************************************************************************
  487.  
  488. ;    Erinnert euch, die Directory auszuwählen, in der das Bild zu
  489. ;    finden ist, in diesem Fall: "V df0:LISTINGS2"
  490.  
  491. PIC:
  492.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild imRAW
  493.                     ; Format, das zuvor mit dem
  494.                     ; KEFCON konvertiert wurde, es
  495.                     ; besteht aus drei Bitplanes
  496.                     ; nacheinander
  497.  
  498.     end
  499.  
  500.  
  501. In diesem Beispiel gibt´s nichts Neues, aber wir haben viele der bis jetzt
  502. kennengelernten  Effekte  vereint:  Listing3h.s, Listing3f.s, Listing3e.s.
  503. Und das einfach dadurch, daß wir die einzelnen Routinen in  einen  anderen
  504. Buffer geladen haben, rauskopiert und hier eingesetzt. Dann noch das Stück
  505. Copperlist  dazu  und  alles  ist  getan.  Die  Routinen  werden   einfach
  506. nacheinander  aufgerufen,  aber bei der Copperlist ist eine ganz bestimmte
  507. Ordnung einzuhalten, ansonsten überlappen sich die einzelnen  Effekte.  So
  508. mußte ich zum Beispiel den Effekt aus Listing3f.s weiter hinauf versetzen,
  509. während  ich  die  anderen  zwei  lassen  konnte,  wo  sie waren.  Im
  510. synchronisiertem Loop braucht man dann nur noch die Routinen aufzurufen:
  511.  
  512.     bsr.w    BewegeCopper    ; Roter Balken unter Zeile $ff
  513.     bsr.w    CopperLinkRech    ; Routine für Links/Rechts-Scroll
  514.     BSR.w    scrollcolors    ; Zyklisches Fließen der Farben
  515.  
  516. Es  kommt  oft vor, daß die Routinen einzeln programmiert werden, und erst
  517. später zusammengefügt werden, wie in diesem Beispiel. Es ist von  Vorteil,
  518. wenn man lernt, Grafikdemos zu zerlegen und wieder zusammenzustellen, denn
  519. ein guter Teil der Programmierung  besteht  aus  solcher  Tätigkeit.  Jede
  520. Routine  kann  dann  in anderen Listings wiederwerwendet werden, indem man
  521. einfache Änderungen anbringt: so wird der  Programmierer  von  TEAM17  für
  522. jedes  seiner  Spiele  die  gleiche  Joystick-Routine verwendet haben, das
  523. Gleiche  gilt  für  die  Routine,  die  von  Diskette    ladet,    und    der
  524. Programmteil,  der  die  Figuren  am Screen bewegt, wird auch jedesmal nur
  525. mehr oder weniger verändert und abgeleitet werden. Jede Routine,  die  ihr
  526. auscodiert  oder  irgendwo  findet kann euch oft nützlich sein, sei es nun
  527. als Beispiel oder daß ihr sie richtig in eure Programme einbaut. Wenn  ihr
  528. alle  nötigen  für  ein  Spiel  separat  beiseite  habt, z.B. Diskladen.s,
  529. Joystick.s, Spielemusik.s, ... , dann wird  sich  das  Spieleprogrammieren
  530. auf  das  zusammenkopieren beschränken. Es würde den Aufdecken des Tischen
  531. gleichen: Messer, Gabel, Teller, Serviette, alles kommt an  seinen  Platz.
  532. Ihr  müßt  nur  mehr  ein Puzzle zusammenstellen, aber auch das setzt eine
  533. Mindestkompetenz in der Programmierung voraus. Manchmal kommt es vor,  daß
  534. bei  Demos oder Spielen alles passt, aber man den Verdacht nicht los wird,
  535. daß die Routinen nicht selbst geschrieben wurden, sondern entweder kopiert
  536. oder  hergegeben  wurden. Aber wenn das Spiel funktioniert, wen kratzt´s ?
  537. Es wird immer ein schönes Spiel sein, aber ähnlich mit einem anderen, eine
  538. Art  Kreuzung.  Wenn jemand aber eine Routine selbst ausprogrammiert, dann
  539. erkennt man  das  sofort,  entweder  weil  sie  besser  gemacht  ist  oder
  540. schlechter.  Also  sind  die besten und die schlechtesten Spiele "ehrlich"
  541. programmiert. Aber laßt im Moment die Ehre beiseite, ihr lernt  noch,  und
  542. ich    glaube    nicht,    daß    ihr    jetzt    schon    bereit    seid,    die
  543. Amiga-Programmierung zu innovieren! Also demontiert und schweißt zusammen,
  544. was  euch  der  Kurs  bietet,  denn  es  gibt  nichts  besseres,  als das.
  545. Hauptsache, ihr geht dann nicht mit MEINEN Routinen rum und  erzählt,  daß
  546. ihr  sie  ganz  alleine codiert habt. Wenn ihr den Kurs beendet habt, dann
  547. könnt ihr eure eigenen erstellen, und, wer weiß, einige gute Erleuchtungen
  548. haben, und die innovativen Ideen umsetzen. Assembler setzt keine Grenzen.
  549.  
  550.  
  551.