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

  1.  
  2. ; Listing4b.s    ANZEIGEN EINES BILDES IN 320*256 mit 3 Planes (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, Routine der EXEC, die Libraris
  13.                 ; öffnet, und als Resultat in d0 die Basisadr.
  14.                 ; derselben Bibliothek liefert, ab welcher
  15.                 ; die Offsets (Distanzen) zu machen sind
  16.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  17.     move.l    d0,a6
  18.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  19.                 ; des Betriebssystemes (immer auf $26 nach GfxBase)
  20.  
  21. ;******************************************************************************
  22. ;HIER LASSEN WIR UNSERE BPLPOINTERS IN DER COPPELIST UNSERE BITPLANES ANPOINTEN
  23. ;******************************************************************************
  24.  
  25.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse von unserer PIC
  26.                 ; bzw. wo ihr erstes Bitplane beginnt
  27.  
  28.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  29.                 ; Pointer der Copperlist
  30.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  31.                 ; für den DBRA - Zyklus
  32. POINTBP:
  33.     move.w    d0,6(a1)      ; kopiert das niederwertige Word der Plane-
  34.                   ; Adresse ins richtige Word der Copperlist
  35.     swap    d0          ; vertauscht die 2 Word in d0 (Z.B.: 1234 > 3412)
  36.                   ; dadurch kommt das hochwertige Word an die
  37.                   ; Stelle des niederwertigen, wodurch das
  38.                   ; kopieren mit dem Move.w ermöglicht wird!!
  39.     move.w    d0,2(a1)      ; kopiert das hochwertige Word der Adresse des 
  40.                   ; Plane in das richtige Word in der Copperlist
  41.     swap    d0       ; vertauscht erneut die 2 Word von d0 (3412 > 1234)
  42.                ; damit wird die orginale Adresse wieder hergestellt
  43.     ADD.L    #40*256,d0 ; Zählen 10240 zu D0 dazu, somit zeigen wir
  44.                ; auf das zweite Bitplane (befindet sich direkt
  45.                ; nach dem ersten), wir zählen praktisch die Länge
  46.                ; eines Plane dazu
  47.               ; In den nächsten Durchgängen werden wir dann auf das
  48.               ; dritte, vierte... Bitplane zeigen
  49.  
  50.     addq.w    #8,a1        ; a1 enthält nun die Adresse der nächsten
  51.                 ; bplpointers in der    Copperlist, die es
  52.                 ; einzutragen gilt
  53.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1=num of bitplanes)
  54.  
  55.  
  56.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  57.                     ; (deren Adresse)
  58.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  59.  
  60.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  61.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  62.  
  63. mouse:    
  64.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  65.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  66.  
  67.     move.l    OldCop(PC),$dff080     ; COP1LC - "Zeiger" auf die Orginal-COP
  68.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  69.  
  70.     move.l    4.w,a6
  71.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  72.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  73.                 ; (Libraries werden geöffnet UND geschlossen!)
  74.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  75.     rts
  76.  
  77. GfxName:
  78.     dc.b    "graphics.library",0,0    
  79.  
  80. GfxBase:         ; Hier hinein kommt die Basisadresse der graphics.library,
  81.     dc.l    0    ; ab hier werden die Offsets gemacht
  82.  
  83.  
  84.  
  85. OldCop:            ; Hier hinein kommt die Adresse der Orginal-Copperlist
  86.     dc.l    0    ; des Betriebssystemes
  87.  
  88.  
  89.     SECTION GRAPHIC,DATA_C
  90.  
  91. COPPERLIST:
  92.  
  93.     ; Die Sprites lassen wir auf NULL zeigen, also pointen, um sie zu 
  94.     ; eliminieren ansonsten geistern sie umher uns stören uns nur!!!
  95.  
  96.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000
  97.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  98.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  99.     dc.w    $13e,$0000
  100.  
  101.     dc.w    $8e,$2c81    ; DiwStrt    Register mit Standartwerten)
  102.     dc.w    $90,$2cc1    ; DiwStop
  103.     dc.w    $92,$0038    ; DdfStart
  104.     dc.w    $94,$00d0    ; DdfStop
  105.     dc.w    $102,0        ; BplCon1
  106.     dc.w    $104,0        ; BplCon2
  107.     dc.w    $108,0        ; Bpl1Mod
  108.     dc.w    $10a,0        ; Bpl2Mod
  109.  
  110. ; das BPLCON0 ($dff100) für einen Bildschirm mit 3 Bitplanes: (8 Farben)
  111.  
  112.             ; 5432109876543210
  113.     dc.w    $100,%0011001000000000    ; bits 13 und 12 an!! (3 = %011)
  114.  
  115. ;    Wir lassen die Bitplanes direkt anpointen, indem wir die Register
  116. ;    $dff0e0 und folgende hier in der Copperlist einfügen. Die
  117. ;    Adressen der Bitplanes werden dann von der Routine POINTBP
  118. ;    automatisch eingetragen
  119.  
  120. BPLPOINTERS:
  121.     dc.w $e0,$0000,$e2,$0000    ;erstes    Bitplane - BPL0PT
  122.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  123.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  124.  
  125. ;    Die 8 Farben des Bildes werden hier definiert:
  126.  
  127.     dc.w    $0180,$000    ; color0
  128.     dc.w    $0182,$475    ; color1
  129.     dc.w    $0184,$fff    ; color2
  130.     dc.w    $0186,$ccc    ; color3
  131.     dc.w    $0188,$999    ; color4
  132.     dc.w    $018a,$232    ; color5
  133.     dc.w    $018c,$777    ; color6
  134.     dc.w    $018e,$444    ; color7
  135.  
  136. ;    Fügt hier eventuelle WAIT-Effekte ein:
  137.  
  138.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  139.  
  140.  
  141. ;    Erinnert euch, die Directory auszuwählen, in der das Bild zu
  142. ;    finden ist, in diesem Fall: "V df0:LISTINGS2"
  143.  
  144.  
  145. PIC:
  146.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild imRAW
  147.                     ; Format, das zuvor mit dem
  148.                     ; KEFCON konvertiert wurde, es
  149.                     ; besteht aus drei Bitplanes
  150.                     ; nacheinander
  151.     end
  152.  
  153.  
  154.  
  155. Wie  ihr  gesehen  habt,  kommen  in diesem Listing keine synchronisierten
  156. Routinen  vor,  nur  Routinen,  die  die  Bitplanes  und  dir    Copperlist
  157. anpointen.  Als  erstes  versucht  mal,  die  Sprite-Pointer  mit  ";"  zu
  158. eliminieren:
  159.  
  160. ;    dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000
  161. ;    dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  162. ;    dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  163. ;    dc.w    $13e,$0000
  164.  
  165. Nun  werden  beim  Anzeigen  des  Bildes  manchmal  recht  flotte Streifen
  166. vorbeiziehen, das sind die entfesselten Sprites, die wild herumgasen.  Wir
  167. werden später lernen, sie zu zähmen.
  168.  
  169. Probiert  nun, vor dem Ende der Copperlist einige Wait einzufügen, und ihr
  170. werdet merken, wie bequem die Wait+Color sind, um HORIZONTALE FARBVERLÄUFE
  171. einzufügen,  oder Farbe zu wechseln. Und das alles GRATIS, d.h. einem Bild
  172. mit 8 Farben wie diesem können wir einen  Hintergrund  mit  hunderten  von
  173. Farben  verleihen,  oder  auch  die  Farben  selbst  ändern,  aus denen es
  174. besteht, wie etwa $182, $184, $186, $188, $18a, $18c, $18e!
  175.  
  176. Als  erste    "Verschönerung"    fügt    diesen    vorgefertigten    Teil    mit
  177. Farbverläufen  vor  das  Ende  der  Copperlist ein ($FFFF,$FFFE): Erinnert
  178. euch, daß ein Bock mit Amiga+b  ausgewählt  wird,  mit  Amiga+c  in  einen
  179. Textbuffer  kopiert,  und,  nachdem  ihr  den  Cursor  auf  die gewünschte
  180. Position gebracht habt, mit Amiga+i in den Text selbst hineinkopiert.
  181.  
  182.     dc.w    $a907,$FFFE    ; warte auf Zeile $a9
  183.     dc.w    $180,$001    ; sehr dunkles Blau
  184.     dc.w    $aa07,$FFFE    ; Zeile $aa
  185.     dc.w    $180,$002    ; ein bißchen helleres Blau
  186.     dc.w    $ab07,$FFFE    ; Zeile $ab
  187.     dc.w    $180,$003    ; ein bißchen helleres Blau
  188.     dc.w    $ac07,$FFFE    ; nächste Zeile
  189.     dc.w    $180,$004    ; ein bißchen helleres Blau
  190.     dc.w    $ad07,$FFFE    ; nächste Zeile
  191.     dc.w    $180,$005    ; ein bißchen helleres Blau
  192.     dc.w    $ae07,$FFFE    ; nächste Zeile
  193.     dc.w    $180,$006    ; Blau auf 6
  194.     dc.w    $b007,$FFFE    ; überspringe 2 Zeilen
  195.     dc.w    $180,$007    ; Blau auf 7
  196.     dc.w    $b207,$FFFE    ; überspringe 2 Zeilen
  197.     dc.w    $180,$008    ; Blau auf 8
  198.     dc.w    $b507,$FFFE    ; überspringe 3 Zeilen
  199.     dc.w    $180,$009    ; Blau auf 9
  200.     dc.w    $b807,$FFFE    ; überspringe 3 Zeilen
  201.     dc.w    $180,$00a    ; Blau auf 10
  202.     dc.w    $bb07,$FFFE    ; überspringe 3 Zeilen
  203.     dc.w    $180,$00b    ; Blau auf 11
  204.     dc.w    $be07,$FFFE    ; überspringe 3 Zeilen
  205.     dc.w    $180,$00c    ; Blau auf 12
  206.     dc.w    $c207,$FFFE    ; überspringe 4 Zeilen
  207.     dc.w    $180,$00d    ; Blau auf 13
  208.     dc.w    $c707,$FFFE    ; überspringe 7 Zeilen
  209.     dc.w    $180,$00e    ; Blau auf 14
  210.     dc.w    $ce07,$FFFE    ; überspringe 6 Zeilen
  211.     dc.w    $180,$00f    ; Blau auf 15
  212.     dc.w    $d807,$FFFE    ; überspringe 10 Zeilen
  213.     dc.w    $180,$11F    ; helle auf...
  214.     dc.w    $e807,$FFFE    ; überspringe 16 Zeilen
  215.     dc.w    $180,$22F    ; helle auf...
  216.     dc.w    $ffdf,$FFFE    ; ENDE DER NTSC-ZONE (Zeile $FF)
  217.     dc.w    $180,$33F    ; helle auf...
  218.     dc.w    $2007,$FFFE    ; Zeile $20+$FF = Zeile $1ff (287)
  219.     dc.w    $180,$44F    ; helle auf...
  220.  
  221.  
  222. Wir  haben  aus  dem  Nichts,  ohne   gegenproduktiven  Effekten,  einen
  223. Farbverlauf  erzeugt, der die Gesamtzahl der Farben am Schirm von 8 auf 27
  224. erhöht hat!!!! Wir fügen weitere 7 Farben hinzu, aber diesmal  ändern  wir
  225. nicht  den Hintergrund, $dff180, sondern sie anderen 7 Farben: Fügt dieses
  226. Stück Copper zwischen den Bitplane-Pointern und den  anderen  Farben  ein:
  227. (die andere Modifizierung könnt ihr ruhig bestehen lassen)
  228.  
  229.     dc.w    $0180,$000    ; color0
  230.     dc.w    $0182,$550    ; color1    ; wir verändern die Farbe der
  231.     dc.w    $0184,$ff0    ; color2    ; COMMODORE-Schrift! GELB!
  232.     dc.w    $0186,$cc0    ; color3
  233.     dc.w    $0188,$990    ; color4
  234.     dc.w    $018a,$220    ; color5
  235.     dc.w    $018c,$770    ; color6
  236.     dc.w    $018e,$440    ; color7
  237.  
  238.     dc.w    $7007,$fffe    ; Wir warten das Ende des COMMODORE-
  239.                 ; Schriftzuges ab
  240.  
  241. Mit  45  "dc.w",  die wir der Copperlist noch untergejubelt, haben wir ein
  242. harmloses 8-Farben-Picture in eine Picture mit 34 Farben  verwandelt,  und
  243. somit auch das Limit der 32 Farben der 5-Bitplane-Bilder überschritten!!!
  244.  
  245. Nur  durch  Programmierung der Copperlist in Assembler kann man die Grafik
  246. des Amiga vollständig nutzen: nun könntet  ihr  ein  Bild  in  320  Farben
  247. erstellen,  einfach  durch  zehnmaliges ändern der Palette eines 32-Farben
  248. Bildes, indem ihr ca. alle 25 Zeilen  ein  Wait+Palette  einfügt...  Jetzt
  249. geht  eucht  vielleicht  ein  Licht auf, wieso gewisse Spiele 64, 128 oder
  250. mehr Farben haben!! Sie haben ziemlich lange Copperlists, die  die  Farben
  251. auf verschiedenen Höhen am Bildschirm ändern!
  252.  
  253. Bringt  ein  paar  Änderungen  an,  das  tut immer gut, oder versucht, die
  254. Balken aus Lektion3 in den  Hintergrund  zu  bekommen.  Einfach  in  einen
  255. anderen  Textbuffer laden, Routine ausschneiden und einfügen. Wenn ihr das
  256. schafft, seid ih auf Zack.
  257.  
  258.  
  259.