home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / lektionen / lektion4.txt < prev    next >
Text File  |  1977-12-31  |  47KB  |  961 lines

  1.  
  2.  ASSEMBLERKURS - LEKTION 4
  3.  
  4. In diesem Kapitel lernen wir,  Bilder  in  verschiedenen  Auflösungen  mit
  5. einer  Copperlist  anzuzeigen.  Bis  jetzt konnten wir nur Farbe0 (COLOR0)
  6. verändern,  also  $dff180.  Damit   waren   wir   imstande,   Farbverläufe
  7. herzustellen,  aber  Bilder werden natürlich nicht mit WAIT angezeigt!! Um
  8. ein normales IFF-Bild  anzuzeigen,  die  z.B.  mit  Deluxe-Paint  erstellt
  9. wurde,  digitalisiert,  gescannt  oder  gerendert  wurde,  braucht es kein
  10. einziges Wait! Es reicht, dem Copper zu sagen, welche Auflösung  das  Bild
  11. hat  (Anzahl der Farben, Aüflösung Low-Res/ Hi-Res, Interlace oder nicht),
  12. und zwar mit dem Register $dff100, BPLCON1. Bis jetzt haben wir in  dieses
  13. Register  immer  den  Wert  $200  gegeben,  was  soviel  bedeutet wie: NUR
  14. HINTERGRUNDFARBE OHNE BILDER DARÜBER. Deswegen passiert auch nichts,  wenn
  15. wir in einer solchen Copperlist die Farbe 1, also $dff182, verändern: weil
  16. kein BITPLANE aktiviert ist, aber nur "Hintergrund", dessen Farbe nur  mit
  17. dem  $dff180 geändert werden kann. Nachdem wir die Auflösung (z.B. 320x200
  18. Pixel, wobei PIXEL  die  kleinen  Bildpunkte  sind,  aus  denen  ein  Bild
  19. besteht)  und  die  Anzahl  der  Farben  bestimmt haben, müssen wir in ein
  20. Register hineinschreiben, wo  unser  Bild  zu  finden  ist.  Das  ist  ein
  21. POINTERREGISTER,  wie das COP1LC, in ihm kommt die Adresse, wo das Bild zu
  22. finden ist, dessen Anfang. Danach müssen wir die PALETTE  bestimmen,  also
  23. welchen  Wert  jede  einzelne Farbe hat, z.B. Farbe0 Rot, Farbe1 Hellgrün,
  24. Farbe2 Dunkelblau... usw. Wird das nicht getan, dann erscheint unser  Bild
  25. in  "Falschfarben",  es  werden einfach die Farben genommen, die gerade da
  26. waren, und unser Bild  wird  dann  ziemlich  "außerirdisch"  anmuten.  Wir
  27. müssen  also  in  die Register den richtigen Wert eintragen, z.B. wenn ein
  28. Bild aus vier Farben besteht, könnte die Farbdefinition so aussehen:
  29.  
  30.     dc.w    $180,$xxx    ; color 0
  31.     dc.w    $182,$xxx    ; color 1
  32.     dc.w    $184,$xxx    ; color 2
  33.     dc.w    $186,$xxx    ; color 3
  34.  
  35. Dieses Stück Copperlist wird aber direkt schon vom KEFCON abgespeichert.
  36.  
  37. Es existieren auch noch andere Register, mit denen man die Dimensionen des
  38. Bildes  einstellen  kann,  um  ihr "SPEZIAL-DIMENSIONEN" zu verleihen, wie
  39. etwa OVERSCAN, das es größer erscheinen läßt, oder man kann auch  nur  ein
  40. Fensterchen  machen,  das nur einen Teil des Bildschirmes ausfüllt. Andere
  41. Spezial-Register sind  die  MODULA,  die  oft  in  "verlängerungseffekten"
  42. verwendet  werden. In den ersten Beispielen werden wir diese Register aber
  43. auf NULL bzw. ihrem Standartwert belassen, um ein Bild anzuzeigen.  Vorweg
  44. muß  einmal  klar  sein,  daß  ein  Unterschied  zwischen  einem  Bild  im
  45. IFF-Format, also dem Standartformat, wie es DPaint  verwendet,  und  einem
  46. REALEN  Bild  besteht.  Dieses reale Bild wird RAW oder BITMAP genannt, es
  47. liegt im Speicher und wird vom Copper angezeigt. Auf der Diskette ist  ein
  48. Programm  enthalten, das ein Bild von IFF in RAW konvertiert, unerläßlich,
  49. wenn man Bilder mit  dem  Copper  anzeigen  will.  Diese  Bilder  sind  in
  50. Wirklichkeit auch nur eine lange Reihe von 0 und 1, wie alle BINÄREN DATEN
  51. im Speicher. Wir haben schon gesehen, daß alle Daten im Speicher  aus  Bit
  52. besteht,  also  aus  Nullen und Einsen, oder Strom fließt und Strom fließt
  53. nicht, die einzig möglichen Zustände: aus Bequemlichkeit verwenden wir das
  54. Dezimal-  und  das  Hexadezimalsystem, aber die Wirklichkeit besteht immer
  55. aus Bit. Aber wie ist es dann möglich, ein Bild mit 32 Farben  anzuzeigen,
  56. wenn  es  nur  0  und  1 gibt??!! Wenn wir im Speicher eine Art Papier mit
  57. Kästchen hätten, und jedes Kästchen entweder Schwarz (Bit auf 1) oder Weiß
  58. (Bit  auf  0)  wäre,  dann  könnten  wir nur mit zwei Farben arbeiten, dem
  59. Schwarz  und  dem  Weiß.   Das   war   auf   den   alten   Computern   mit
  60. Monochrom-Monitor  der  Fall,  die  nur  die  Hintergrundfarbe (Bit auf 0)
  61. anzeigen konnten, auf der Schrift und Bilder (Bit auf 1) in einer  anderen
  62. Farbe dargestellt waren (meist grün).
  63. Mit dem Copper kann man auch in dieser Art arbeiten, mit zwei  Farben,  es
  64. muß  NUR  EIN EINZIGES BITPLANE eingeschaltet werden. Im Speicher brauchen
  65. wir dann noch das Bild in RAW, ähnlich dem Blatt Millimeterpapier, wie ich
  66. es  vorhin  beschrieben  habe,  mit  "angeschaltenen" und "abgeschaltenen"
  67. Punkten.  Bis  jetzt  müßte   noch   alles   Klar   sein,   es   ist   wie
  68. Schiffelversenken!!  Ein Schiffchen besteht also aus einer Reihe von Pixel
  69. (Punkten),  auf  die  gleiche  Art  und  Weise  kann  man  alles  mögliche
  70. darstellen:
  71.  
  72. EIN MÄNNCHEN                EIN FLUGZEUG (ich habe die
  73.                             Nullen weggelassen!)
  74.  
  75.                               11
  76. 000011100000          000001100000             1111
  77. 000001000000          000010010000             1111
  78. 000111111000          000010010000         111111111111111111111
  79. 000101101000          000111111000       1111111111111111111111111
  80. 000101101000          000100001000             1111
  81. 000011110000          000100001000             1111
  82. 000010010000                        111111
  83. 000010010000         EIN "A"                   11111111
  84. 000010010000
  85. 000110011000
  86.  
  87. Wenn eine  Figur,  ein  Bild  aber  größer  ist,  dann  ist  es  natürlich
  88. vorteilhafter,  sich  dieses  mit  einem  Malprogramm  zu zeichnen oder zu
  89. scannen, und dann mit dem KEFCON in RAW zu konvertieren (000101110100...).
  90. Um  die  Hintergrundfarbe zu definieren braucht man nur ein dc.w $180,$000
  91. (Schwarz) setzen, für die Farbe 1 ein dc.w $182,$0f0 (Grün).
  92. Bei mehrfarbigen  Bildern  besteht  der  Trick  darin:  die  verschiedenen
  93. Bitplanes,  also  Ebenen  aus  Bits  (0011010...) werden "überlagert", mit
  94. einer Art Transparenz, also wo zwei 1 übereinandertreffen, erscheint  eine
  95. Farbe,  wo  drei  1 übereinanderkommen wieder eine andere usw. All das muß
  96. aber nicht berechnet werden!! Es reicht, die Figur  mit  dem  IFFKonverter
  97. Kefcon  zu  laden, sie ein RAW zu konvertieren und abzuspeichern, dann die
  98. Anzahl der Farben und die Auflösung im $dff100  einstellen  (BPLCON1)  und
  99. dann  dem  Copper sagen, wohin wir das RAW-Bild im Speicher geladen haben.
  100. Danach noch die richtigen Farben einstellen,  die  u.a.  der  Kefcon  auch
  101. schon  (separat)  abspeichert,  und  das Bild erscheint ohne größere Mühe.
  102. Wichtig ist nur, die Prozedur klar im Kopf  zu  haben,  praktisch  gesehen
  103. braucht  es  ein  paar Minuten, ein Bild zu von IFF in RAW zu konvertieren
  104. und das Listing richtig zu modifizieren.
  105. Als Erstes stellen wir mal klar, was der  IFF-Konverter  tut  (in  unserem
  106. Fall  verwenden  wir  den  Kefkon,  ihr  könnt  ihn starten, indem ihr das
  107. ASMONE-Fenster herunterschiebt und unter  DOS  seinen  Namen  aufruft.  Es
  108. exisitieren neuere Konverter, mit mehr Optionen, viele davon meist unnütz,
  109. aber aus Platz- und Kompatibilitätsproblemen mit dem  Kick  1.3  habe  ich
  110. entschloßen,    diesen   beizulegen.   Weiters   ist   er   auch   mittels
  111. Hardware-Registern programmiert, und nicht  über  das  Betriebssystem,  er
  112. liegt also in der Linie mit der Kurs. Wenn ihr einen anderen IFF-Konverter
  113. verwenden wollt, dann bitte, aber zuerst lernt, mit diesem  umzugehen,  er
  114. wurde  verwendet,  um  glorreiche Spiele und Demos zu programmieren!). Wir
  115. haben gesehen, daß in Wirklichkeit ein Bild ein  Übereinander  von  Ebenen
  116. aus  Bit  ist,  desto mehr Ebenen (PLANES), desto mehr Farben, eine Ebene,
  117. zwei Farben (Vorder- und Hintergrund). Wir haben  auch  gesehen,  daß  zum
  118. Anzeigen  die  richtigen  Farben  (PALETTE)  notwendig  ist,  und auch die
  119. richtige Grafikauflösung im Register $dff100 (BPLCON1). Die Erschaffer des
  120. Amiga  haben  sich  ein eigenes Format ausgedacht, um Bilder abzuspeichern
  121. und von einem Programm ins andere zu verlegen: dieses Format für den Amiga
  122. ist  das  IFF  ILBM,  praktisch  gesehen  besteht  es  aus  Bitplanes, die
  123. komprimiert sind, um weniger Platz zu brauchen. Angehängt  ist  dann  noch
  124. die  Palette  und die Auflösung. Wenn ein Programm ein IFF-Bild lädt, dann
  125. entkomprimiert  es  die  Ebenen,  setzt  die  richtige  Palette   in   den
  126. Farb-Registern ein ($dff180, $dff182...), und setzt die richtige Auflösung
  127. ($dff100, BPLCON1). Auf die gleiche Art und Weise, wenn  es  ein  Bild  im
  128. Speicher  abspeichern  will, dann komprimiert es die Ebenen im IFF-Format,
  129. hängt Palette und den Rest an.
  130. Der IFF-Konverter tut  folgendes:  er  kann  ein  RAW  laden  und  in  IFF
  131. abspeichern,  vorausgesetzt,  er  bekommt  auch  die  richtige PALETTE und
  132. AUFLÖSUNG, oder er kann ein Bild in IFF laden und es als RAW  abspeichern,
  133. weiters  die  Palette  schon in Form von dc.b $180,... dc.b $182,..., also
  134. für die Copperlist vorbereitet, abspeichern.
  135. Bie anderen Computern werden verschiedene andere Formate  verwendet,  GIF,
  136. PCX  oder  TIFF  z.B. werden von den PC MSDOS verwendet. Außer daß sie die
  137. Ebenen anders komprimieren und Palette etc.  anders  anhängen,  haben  sie
  138. auch ein anderes Anzeigesystem. Es ist das CHUNKY, das recht nützlich ist,
  139. um 256 Farben anzuzeigen, aber weniger fähig als das des Amiga, SCROLLS zu
  140. verwalten,  und  ohne  die  Möglichkeit, Palette zu verändern, wie es beim
  141. Copper mit den Wait geht. Die möglichen Auflösungen des  "normalen"  Amiga
  142. (ohne AGA) sind:
  143.  
  144. 320x256 PIXEL, LOW-RES geannnt
  145. 640x256 PIXEL, HI-RES genannt
  146.  
  147. Das Bild kann auch länder sein (312 Zeilen in Overscan)  oder  doppelt  so
  148. lange  sein  (Interlace, produziert aber ein störendes Flickern). Auch die
  149. Breite kann ein bißchen vergrößert werden, wenn man Overscan einsetzt.
  150.  
  151. Die Bilder in Low-Res (320 Pixel breit) können maximal 32 Farben haben, es
  152. gibt aber noch zwei Spezialmethoden, EHB (Extra Half Bright) und HAM (Hold
  153. and Modify), die zwar jeweils 64 und 4096  Farben  anzeigen  können,  aber
  154. ihre  bestimmten  Granzen  haben.  Wir  werden  uns  später  genauer damit
  155. befassen. Die Biler in HIGH RES können maximal 16  Farben  darstellen  und
  156. besitzen keine Spezialmodi.
  157. Die meisten Spiele sind in Low-Res,  um  die  größere  Anzahl  von  Farben
  158. ausnutzen  zu  können  und  um Speicher zu sparen (der leider, früher oder
  159. später, ausgeht!), und  auch  wegen  der  größeren  Geschwindigkeit,  denn
  160. High-Res  bremst  die ganzen Operationen viel mehr als Low-Res, man muß ja
  161. auch größere Speicherstücke bewegen, da der  Bildschirm  doppelt  so  groß
  162. ist! 
  163. Analysieren wir die Technik, mit der  die  Farben  angezeigt  werden:  wie
  164. gesagt,  ist  die  maximal  darstellbare Anzahl der Farben 32 (Spetialmodi
  165. nicht mitgezählt); es ist möglich, eine Bildschirmauflösung von 2,  4,  8,
  166. 16  oder  32  Farben  zu  wählen.  Das  ist  so,  weil  die Anzahl von der
  167. übereinanderliegenden Ebenen bestimmt wird, und mit  jeder  "Ebene"  kommt
  168. ein Bit dazu, sie wird um ein Bit "Tiefer": mit einem Bit können wir nur 0
  169. und 1 aussagen, also zwei Farben, also wird eine Auflösung von 320x200  in
  170. zwei  Farben  nur  ein  Bitplane  besitzen. Wenn wir ein weiteres Bitplane
  171. dazufügen, dann werden die möglichen Farben 4, denn es  können  sich  vier
  172. verschiedene  Situationen  ergeben:  00,  01,  10,  11,  oder: alle beiden
  173. Bitplane auf NULL (Hintergrundfarbe), erstes Bitplane  auf  eins,  zweites
  174. auf  NULL,  (z.B.  Farbe1),  erstes  Bitplane  auf  0, zweites auf 1 (z.B.
  175. Farbe3) und  beide  Bitplane  auf  1  (Farbe3).  Wird  noch  ein  Bitplane
  176. dazugenommen, dann ergeben sich 8 mögliche Zustände:
  177. 000, 001, 010, 011, 100, 101, 110, 111 (3 BITPLANES=3 Bit pro Pixel=8 Mögl)
  178.  
  179. Noch ein Bitplane erhöht die Anzahl der Bits pro  Pixel  auf  4,  also  16
  180. Möglichkeiten:0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,
  181. 1101, 1110,1111. Das gleiche gilt für 5 Bit pro Plane, nun sind  wir  beim
  182. Maximum  angekommen,  32 Farben. Jedes Bitplane verdoppelt also die Anzahl
  183. der Farben:
  184.  
  185. 0 Bitplane = nur Hintergrund COLOR0 ($dff180) = 1 Farbe
  186. 1 Bitplane = 2  Farben
  187. 2 Bitplane = 4  Farben (2*2, oder 2 hoch 2)
  188. 3 Bitplane = 8  Farben (2*2*2, oder 2 hoch 3)
  189. 4 Bitplane = 16 Farben (2*2*2*2, oder 2 hoch 4)
  190. 5 Bitplane = 32 Farben (2*2*2*2*2, oder 2 hoch 5)
  191.  
  192. Der Amiga besitzt 32 Register für die 32 möglichen Farben in  LowRes,  die
  193. bei  COLOR0  starten  und  bis  COLOR31 gehen (Die Numerierung startet bei
  194. NULL, wie bei den Bits). COLOR0 ist das $dff180, es folgen die anderen:
  195.  
  196. $dff182 = COLOR1
  197. $dff184 = COLOR2
  198. $dff186 = COLOR3
  199. $dff188 = COLOR4
  200. $dff18a = COLOR5
  201. etc...
  202.  
  203. Z.B. wenn ein Pixel in einem LowRes Bild  mit  16  Farben  die  Farbe  des
  204. Hintergrundes  hat,  also  COLOR0,  die veränderbar ist, wenn man Register
  205. $dff180 verändert, dann werden alle vier Bits auf 0 sein:  0000.  Hat  ein
  206. Pixel hingegen die Farbe 15, COLOR15 genannt, dann werden alle Pixel auf 1
  207. stehen: 1111. Alle Farben, die dazwischen ligen, sind Kombinationen davon.
  208. Der  Amiga  1200/4000  hat  8 Bitplanes, was 256 Farben ergibt (2 hoch 8 =
  209. 256). Er besitzt das AGA-Chipset, das ihm diese höhere Anzahl erlaubt,  in
  210. Programmen  für AGA kann man auch 64 (6 Planes), 128 (7 Planes) und 256 (8
  211. Planes) Farben wählen. Eine Bildschirmseite wird auch  PLAYFIELD  genannt.
  212. Berechnen  wir  mal,  wieviel  Speicher  ein  Bild in 320*256 mit 2 Farben
  213. braucht:  jede  Zeile  hat  320  Pixel,  und  da  ein  Byte  aus   8   Bit
  214. zusammesgesetzt  ist, haben in einer Zeile 40 Bytes Platz (40*8=320). Also
  215. brauchen wir nur 40, also die Anzahl der Bytes pro Zeile, mit  der  Anzahl
  216. der  Zeilen  selbst  zu  multiplizieren,  also  256: 40 * 256 = 10240. Ein
  217. Bitplane in LowRes braucht also 10240 Bytes. Nun können wir auch ein  Bild
  218. mit 4 Farben berechnen, also mit 2 Bitplanes: 40*256*2=20480.
  219. Für ein Bild in LowRes  brauchen  wir  demzufolge  nur  40*256*Anzahl  der
  220. Bitplanes zu multiplizieren.
  221. Einmal festgestellt, daß in LowRes 40 Bytes pro Zeile Platz haben,  werden
  222. wir  nicht  lange  brauchen um zu erkennen, daß es in HighRes das doppelte
  223. sein wird, da es doppelt so breit ist...: es werden also 80 Byte pro Zeile
  224. nötig  sein, was folgende Rechnung ergibt: 80*256*Anzahl der Bitplane. Man
  225. kann als generelle Formel zu Berechnung der Größe diese nehmen:
  226.  
  227.     Bytes pro Zeile * Zeilen des Playfields * Anzahl der Bitplanes
  228.  
  229. Analysieren wir jetzt das BPLCON1, das Register, in dem die Auflösung  und
  230. die Anzahl der Farben festgehalten wird: ( Zusammenfassung mit "=C 100")
  231.  
  232.     $dff100 - BPLCON0
  233.  
  234.  Bit Plane Control Register 0   (1 Word, also 16 Bit, von 0 bis 15)
  235.  
  236.  NUMMER DES BIT         (Achtung:Bit auf 1 = ON, Bit auf 0 = OFF)
  237.  
  238.     15    -    HIRES    Hires (1=640x256 , 0=320x256)
  239.     14    -    BPU2    \
  240.     13    -    BPU1     ) 3 Bit zur Auswahl der Anzahl der Bitplanes
  241.     12    -    BPU0    /
  242.     11    -    HOMOD    Hold And Modify mode (HAM 4096 Farben)
  243.     10    -    DBLPF    Double playfield
  244.     09    -    COLOR    Composite video (für GENLOCK)
  245.     08    -    GAUD    Genlock audio
  246.     07    -    X
  247.     06    -    X
  248.     05    -    X
  249.     04    -    X
  250.     03    -    LPEN    Lightpen (Lichtgriffel)
  251.     02    -    LACE    Interlace (320x512 oder 640x512)
  252.     01    -    ERSY    External resync (Für den GENLOCK)
  253.     00    -    X
  254.     
  255. Dieses Register ist BITMAPPED, d.h. jedes einzelne Bit  hat  seine  eigene
  256. Bedeutung:
  257.  
  258. -  Bit  15  schaltet HIRES ein: damit werden 640 Pixel pro Zeile an Stelle
  259. der üblichen 320 dargestellt. Erinnert euch, DDFSTART/STOP auf  $003c  und
  260. $00d4  statt auf $0038 und $00d0 zu setzen, sonst werden die ersten Zeilen
  261. links nicht angezeigt! 
  262.  
  263. - Die Bit 14-12 dienen dazu, die ANZAHL der Bitplanes zu bestimmen,  nicht
  264. welche  PLANE.  Die Bits sind insgesamt 3, es ergeben sich also 6 mögliche
  265. Planes. Hier muß hineingeschrieben werden,  WIEVIELE  Planes  einschalten,
  266. richtig  als Zahl, und nicht auswählen, welche, Z.B.: ´3´, ´0´, ´6´. Mit 3
  267. Bit sind 8 Zahlen möglich, von 0 bis 7. ICH WIEDERHOLE: ARBEITET MIT EINER
  268. RICHTIGEN  ZAHL,  DIE  BINÄR DARGESTELLT IST, NICHT MIT DEN EINZELNEN BIT,
  269. DIE EIN- UND AUSZUSCHALTEN SIND, ZUM UNTERSCHIED MIT DEN ANDEREN BIT!
  270. (N.B.: Wenn ´0´ geschrieben wird, ist %000 gemeint, alle Planes aus, bei 
  271. ´101´ werden 5 eingeschalten; mit 6 Plane wird der HALF-BRIGHT Modus
  272. aktiviert.
  273.  
  274. - Bit 11 aktiviert  den  HAM-Modus.  Ein  Amiga  kann  damit  4096  Farben
  275. darstellen, ein Amiga mit AGA (1200/4000) 262144 Farben.
  276.  
  277. - Bit 10 aktiviert den DUAL-PLAYFIELD-Modus, einem speziellen Modus zu  2,
  278. 4  oder  6  Plane,  der es ermöglicht, zwei Screens zu jeweils 1, 2 oder 3
  279. Planes zu erzeugen. Diese werden Playfiled1 und  Playfield2  genannt,  sie
  280. sind   übereinandergelegt   und   transparent,   indem   sie   Farbe0  des
  281. darüberliegenden durchsichtig sein lassen. Es  ist  also  möglich,  einnen
  282. Parallel-Effekt  zu  schaffen,  ähnlich dem, wie wir ihn in vielen Spielen
  283. sehen. Z.B. könnte man ein Playfield  zu  3  Planes  (8  Farben)  für  das
  284. Speilfeld  verwenden,  und  ein anderes für den Hintergrund, das Berge und
  285. Täler darstellt, das langsamer scrollt (sich von einer Seite  zur  anderen
  286. bewegt),  und somit einen besseren Tiefeneindruck verleiht. Sobald das Bit
  287. gesetzt ist, bilden die ungeraden Planes (1,3,5) das  Playfield1  und  die
  288. geraden  (2,4,6)  das  zweite: die Hardware gruppiert die Planes auf diese
  289. Art und Weise um sie unabhängig voneinander zu machen, sofort nachdem  das
  290. Bit  DBF  gesetzt wurde. Wir werden in den nächsten Kapiteln sehen, daß es
  291. Register für Scrolls gibt und andere, die  Parameter  für  gerade/ungerade
  292. Planes  unterscheiden,  um  sie  unabhängig  voneinander  kontrollieren zu
  293. können! N.B.: Bei DualPlayField  ist  es  nur  möglich,  zwei  Screens  zu
  294. überlappen,   die   beide   auch  die  gleiche  Auflösung  besitzen,  z.B.
  295. Hires+Hires, Lowres.Lowres ...
  296.  
  297. - Bit 9 dient dazu, auch den FBAS-Videoausgang  zu  aktivieren,  der  sich
  298. neben  dem  RGB-Stecker  des  Amiga  befindet. Ich persönlich aktiviere es
  299. immer, somit können auch Leute meine Produktionen  anschauen,  die  keinen
  300. RGB-Monitor besitzen und diesen Ausgang verwenden. SETZT ES IMMER AUF 1.
  301.  
  302. - Bit 8 aktiviert  den  Audio  eines  eventuell  angeschlossenen  Genlock.
  303. Praktisch dient es zu gar nichts, überfliegen wir´s.
  304.  
  305. - Bit 7 wird nur  von  den  fortgeschritteneren  Chipsets  den  A1200/4000
  306. verwendet, auf normalen Amigas hat es keinen Einfluß. Erinnert euch, diese
  307. nicht verwendeten Bits immer auf NULL zu lassen, ansonsten  riskiert  ihr,
  308. daß   auf   A1200ern   und   4000ern   eure  Demos/Spiele/programme  nicht
  309. funktionieren.
  310.  
  311. - Bit 6 hat auf Standart-Amigas keine Funktion, auf 0 lassen.
  312.  
  313. - Bit 5 laßt ihr auf 0
  314.  
  315. - Bit 4 laßt ihr auf 0
  316.  
  317. - Bit 3 dient dazu, die Koordinaten der Lightpen  in  die  Register  VHPOS
  318. ($dff006)  und  VPOS ($dff004) des BEAM zu bekommen. Der Lichtgriffel wird
  319. auf dem Amiga fast nie verwendet, diese Option interessiert uns nicht.
  320.  
  321. - Bit 2 aktiviert das Interlace, das es erlaubt, doppelt so  viele  Zeilen
  322. darzustellen  als  normal (512). Der Nachteil ist ein Flackern. Wir werden
  323. später noch darüber reden.
  324.  
  325. - Bit 1 dient dazu, den Beam mit einem externen Gerät zu  synchronisieren,
  326. laßt es einfach auf 0.
  327.  
  328. - Bit 0 laßt ihr auf 0.
  329.  
  330. Das gesagt, machen wir einige Beispiele mit der Verwendung des $100 (BPLCON1):
  331.  
  332.       ; 5432109876543210
  333.  dc.w $100,%0100001000000000    ; ---> 4 Planes in Lowres (320x256)
  334.  dc.w $100,%1011001000000100    ; ---> 3 Planes in Hires+Interlace (640x512)
  335.  dc.w $100,%0110001000000100    ; ---> 6 Planes in HALF-BRIGHT Lowres+Lace
  336.  dc.w $100,%0110101000000000    ; ---> 6 Planes in HAM lowres (4096 colors)
  337.  dc.w $100,%0110011000000000    ; ---> DualPlayField 3+3 Plane in Lowres
  338.  dc.w $100,%1100011000000100    ; ---> DualPlayField 2+2 in Hires+interlace
  339.   
  340. In Lektion3 haben wir BPLCON1 in der Copperlist verwendet, indem  wir  ihm
  341. immer den Wert $200 gegeben haben:
  342.  
  343.     dc.w    $100,$200
  344.  
  345. Wir haben also nur das Bit 9 gesetzt, das, das den Genlock aktiviert:
  346.  
  347.              ;5432109876543210
  348.     dc.w    $100,%0000001000000000
  349.   
  350. Der Genlock ist ein Gerät, das es ermöglicht, Texte, Grafiken und  Bilder,
  351. die  mit  dem Amiga erzeugt wurden, über ein Fernseh/Videobild zu blenden.
  352. Wer also kein solches Genlock besitzt, wird keinen  Unterschied  bemerken,
  353. ob nun dieses Bit gesetzt ist oder nicht. Es zahlt sich aber aus, es immer
  354. einzuschalten, falls jemand unsere Copperlist mit einem Genlock  verwenden
  355. möchte,  und  weil  der alte Amiga 1000 einen Videoausgang für den Monitor
  356. hat. Wir hätten also das gleiche Resultat mit dc.w  $100,0  erhalten.  Wie
  357. ihr seht, sind die Bitplane auf NULL, es ist also nur die Hintergrundfarbe
  358. aktiviert, ohne Bilder darauf. Um die Bitplanes "einzuschalten"  müßt  ihr
  359. nur die Anzahl in binär eingeben, wieviele ihr verwenden wollt. Bit 12, 13
  360. und 14 sind dafür zuständig.
  361.  
  362. Um z.B. einen Screen mit 1 Bitplane (2 Farben): (320x256!)
  363.  
  364.            ; 5432109876543210
  365.     dc.w    $100,%0001001000000000  ; BPLCON0 - Bit 12 an!! (1 = %001)
  366.  
  367.                 *
  368.  
  369. Für einen Bildschirm mit 2 Bitplanes: (4 Farben)
  370.  
  371.             ; 5432109876543210
  372.     dc.w    $100,%0010001000000000  ; BPLCON0 - Bit 13 an!! (2 = %010)
  373.  
  374.                 *
  375.  
  376. Für einen Screen mit 3 Bitplanes: (8 Farben)
  377.  
  378.             ; 5432109876543210
  379.     dc.w    $100,%0011001000000000  ; Bits 13 e 12 an!! (3 = %011)
  380.  
  381.                 *
  382.  
  383. Für einen Schirm mit 4 Bitplanes: (16 Farben)
  384.  
  385.             ; 5432109876543210
  386.     dc.w    $100,%0100001000000000  ; BPLCON0 - Bit 14 an!! (4 = %100)
  387.  
  388.                 *
  389.  
  390. Für einen Bildschirm mit 5 Bitplanes: (32 Farben)
  391.  
  392.             ; 5432109876543210
  393.     dc.w    $100,%0101001000000000  ; Bits 14,12 an!! (5 = %101)
  394.  
  395.                 *
  396.  
  397. Für einen Screen mit 6 Bitplanes:(für Spezialmodi EHB und HAM 4096 Farben)
  398.  
  399.             ; 5432109876543210
  400.     dc.w    $100,%0110001000000000  ; Bits 14,13 an!! (6 = %110)
  401.  
  402. (Wenn in dieser Einstellung das Bit für HAM (Bit 11)  auf  1  steht,  dann
  403. wird  der  HAM-Modus  aktiviert,  ansonsten,  bei  Bit  auf  0, Extra Half
  404. Bright.)
  405.  
  406. Es reicht also, die Anzahl der erforderlichen Bitplanes in  die  drei  Bit
  407. 12,  13  und  14 dieses Registers zu geben. Wenn man einen Screen in Hires
  408. wünscht, 640 Pixel breit statt 320, dann wird das Bit 15  auf  1  gesetzt,
  409. das  ist das erste von Links. Man muß sich halt ERINNERN, daß die MAXIMALE
  410. ANZAHL der Planes in  HIRES  4  beträgt  (16  Farben),  und  daß  DFFSTART
  411. ($dff092) und DFFSTOP ($dff094) geändert werden müssen:
  412.  
  413.     dc.w    $92,$003c    ; DdfStart HIRES normal
  414.     dc.w    $94,$00d4    ; DdfStop HIRES normal
  415.  
  416. Das Gleiche gilt für das  Interlace  (Länge  512  statt  256  Zeilen),  es
  417. reicht, Bit 2 auf 1 zu setzen.
  418.  
  419. Einmal  das BPLCON1 richtig eingestellt, muß man dem Copper auch verraten,
  420. wo die "aktivierten" Bitplanes liegen. Um das zu tun, müssen wir  nur ihre
  421. Adressen in die dazu bestimmten Register schreiben:
  422.  
  423.     $dff0e0 = BPL0PT (Pointer (Zeiger) auf Bitplane 1)
  424.     $dff0e4 = BPL1PT (Pointer (Zeiger) auf Bitplane 2)
  425.     $dff0e8 = BPL2PT (Pointer (Zeiger) auf Bitplane 3)
  426.     $dff0ec = BPL3PT (Pointer (Zeiger) auf Bitplane 4)
  427.     $dff0f0 = BPL4PT (Pointer (Zeiger) auf Bitplane 5)
  428.     $dff0f4 = BPL5PT (Pointer (Zeiger) auf Bitplane 6)
  429.  
  430. Auch hier wird bei 0 gestartet, also kommt man bei 5 an, das  das  sechste
  431. Bitplane  definiert. Manchmal begegnet man auch der Bezeichnung BPL1PT für
  432. das Register $dff0e0,  also  erreicht  man  hier  6,  um  das  sechste  zu
  433. definieren.   Das  Help  des  ASMONE  startet  bei  NULL,  das  könnt  ihr
  434. nachprüfen, wenn ihr "=C 0e0" tippt.
  435. Um ein Bild anzuzeigen muß man also eine Copperlist anpeilen, die  richtig
  436. gesetzt  ist  und  die  richtigen  Farben  enthält,  dann muß man auch die
  437. Bitplanes POINTEN, also "daraufzeigen", "anpeilen", z.B. so:
  438.  
  439.     MOVE.L    #BITPLANE0,$dff0e0    ; Adresse von BITPLANE0 in BPL0PT
  440.     MOVE.L    #BITPLANE1,$dff0e4    ; BPL1PT
  441.     MOVE.L    #BITPLANE2,$dff0e8    ; BPL2PT
  442.     ...
  443.  
  444. Und das Bild wird wie von Geisterhand erscheinen. Die Bitplanes sind  aber
  445. in   der  Copperlist  direkt  angepeilt,  weil  sie  ja  bei  jedem  Frame
  446. neugeschrieben werden müssen.
  447.  
  448. Man darf aber nie vergessen, in die Copperlist  die  "Spezialregister"  zu
  449. geben,  die  wir  zur  Zeit  entweder  auf  NULL  oder  ihrem Standartwert
  450. belassen, ansonsten sind noch die Werte der Workbench  enthalten,  und  es
  451. kann   zu   Anzeigeproblemen  kommen.  Z.B.  hat  die  Workbench  1.3  die
  452. Modula-Register auf 0, Kick 2.0 hat hingegen andere Werte  darin:  Spiele,
  453. die  unter  1.3  gut  laufen, auf höheren Kickstarts aber Probleme mit der
  454. Darstellung der  Figuren  haben,  haben  oft  als  Grund  dafür,  daß  die
  455. Modula-Register  ($dff108  und  $dff10a)  nicht  gesetz wurden, somit beim
  456. kollaudieren funktionierten, auf Kick 2.0 aber alles verdrehen. Um  solche
  457. Probleme  zu  vermeiden,  sollten wir also immer alle Register definierne,
  458. auch jene, die wir nicht verwenden; die Register sind die folgenden:
  459.  
  460.     $dff08e - DIWSTRT, Anfang Videofenster - normal auf $2c81
  461.     $dff090 - DIWSTOP, Ende Videofenster - normal auf $2cc1
  462.     $dff092 - DDFSTRT, Data Fetch Start - normal auf $0038
  463.     $dff094 - DDFSTOP, Data Fetch Stop - normal auf $00d0
  464.     $dff102 - BPLCON1, Bitplane control 1 - normal auf $0000
  465.     $dff104 - BPLCON2, Bitplane control 2 - normal auf $0000
  466.     $dff108 - BPL1MOD, Modula gerade Bitplanes - normal auf $0000
  467.     $dff10A - BPL2MOD, Modula ungerade Bitplanes - normal auf $0000
  468.   
  469. Wir werden diese Register genauer behandeln, wenn wir  sie  verwenden,  um
  470. Spezialeffekte  zu  erzeugen,  im  Moment  erinnert  euch,  daß  ihr diese
  471. Register mit den Standartwerten immer an den Anfang der Copperlist  setzen
  472. müßt:
  473.  
  474. COPPERLIST:
  475.     dc.w    $8e,$2c81    ; DiwStrt
  476.     dc.w    $90,$2cc1    ; DiwStop
  477.     dc.w    $92,$0038    ; DdfStart * ACHTUNG: für HIRES 640x256 $003c
  478.     dc.w    $94,$00d0    ; DdfStop  * ACHTUNG: für HIRES 640x256 $00d4
  479.     dc.w    $102,0        ; BplCon1
  480.     dc.w    $104,0        ; BplCon2
  481.     dc.w    $108,0        ; Bpl1Mod
  482.     dc.w    $10a,0        ; Bpl2Mod
  483.  
  484.     dc.w    $100,xxxx    ; Bplcon0 - Definieren Auflösung und Farben
  485.  
  486. ;    An diese Stelle können wir die Farben des Bildes geben; dieses Stück
  487. ;    Copperlist speichert der IFF-Konverter KEFCON automatisch ab, mit
  488. ;    einem eigenen Namen, danach kann man es hier einfügen, indem man
  489. ;    das Cut&PASTE des Editors verwendet, indem man es zuerst in einen
  490. ;    anderen Buffer ladet, z.B.:
  491.  
  492.     dc.w $0180,$0010,$0182,$0111,$0184,$0022,$0186,$0222
  493.     dc.w $0188,$0333,$018a,$0043,$018c,$0333,$018e,$0154
  494.     dc.w $0190,$0444,$0192,$0455,$0194,$0165,$0196,$0655
  495.     dc.w $0198,$0376,$019a,$0666,$019c,$0387,$019e,$0766
  496.     dc.w $01a0,$0777,$01a2,$0598,$01a4,$0498,$01a6,$0877
  497.     dc.w $01a8,$0888,$01aa,$05a9,$01ac,$0988,$01ae,$0999
  498.     dc.w $01b0,$06ba,$01b2,$0a9a,$01b4,$0baa,$01b6,$07cb
  499.     dc.w $01b8,$0bab,$01ba,$0cbc,$01bc,$0dcd,$01be,$0eef
  500.  
  501. ;    Wie ihr seht, sind hier alle 32 Farbregister des Amiga definiert,
  502. ;    denn ich habe mit dem KEFCON ein Bild mit 32 Farben geladen und das
  503. ;    ist seine Palette, die zusammen mit dem RAW generiert wurde.
  504.  
  505. ;    Hier können eventuelle Videoeffekte mit Waits eingefügt werden...
  506.  
  507.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  508.  
  509. Diese Copperlist ist ausreichend, um ein Bild anzuzeigen. Beginnen wir nun
  510. mit  dem  ersten  Beispiel,  dem Anzeigen eines PLAYFIELD mit 3 Bitplanes,
  511. also 8 Farben. Im ersten Beispiel dieses Kurses zeigen wir  ein  schon  in
  512. RAW konvertiertes Bild an, das auf der Diskette enthalten ist: um ein Bild
  513. in den Speicher zu "laden" gibt  es  eine  Anweisung  des  ASMONE,  INCBIN
  514. genannt, die eben erlaubt, einen gewissen Daten-File von Diskette zu laden
  515. und an den Punkt im Speichers zu geben, an dem das Incbin steht. Wenn  wir
  516. z.B.  eine  Copperlist  vorbereiten  und als File abspeichern würden, dann
  517. könnten wir sie so Laden:
  518.  
  519. Copperlist:
  520.     incbin "Copper1"
  521.  
  522. Das Resultat ist das gleiche, als ob wir hier eine Serie  von  dc.w  geben
  523. würden,  die  identisch  mit  denen  im File Copper1 sind. In unserem Fall
  524. laden wir ein Bild unter das Label PIC:
  525.  
  526. PIC:
  527.     incbin "amiga.320*256*3"
  528.  
  529. Dieses Bild ist aber nicht in Textform vorhanden, sondern wirklich als
  530. Bytes, die die Bitplane ergeben: probiert es in einen Textbuffer zu laden
  531. und ihr werdet sehen, daß es sich nicht um einen Text handelt.
  532.  
  533. Wie ihr bemerkt habt, ist der Name so gegeben worden, daß er die
  534. Eigenschaften des Bildes selbst wiederspiegelt; es ist besser solche Namen
  535. zu vergeben, ansonsten riskiert man, zu vergessen, wie dieses Bild
  536. aufgebaut war, wieviele Bitplanes, die Dimensionen... Aus der Länge dieses
  537. Files kann man aber schließen, welche Auflösung und wieviele Bitplanes das
  538. Bild hat: es ist 30720 Bytes lang, also 40*256*3 (40 Bytes pro Zeile * 256
  539. Zeilen * 3 Bitplanes). Jetzt noch dem Copper sagen, daß das Bild unter dem
  540. Label PIC: steht, und das war´s auch schon.
  541.  
  542. Aber um die Bitplanes ohne Risiko anzupointen, muß man die Pointer in  die
  543. Copperlist  geben.  Diese  Pointer können jeweils ein Word enthalten, also
  544. eine  halbe  Adresse  (eine  Adresse  ist  ein  Longword  lang!  Beispiel:
  545. $00020000).  Wenn  wir  den  Prozessor  verwenden,  können  wir  auch zwei
  546. Register aus Word mit einem einzigen move.l laden
  547.  
  548.     MOVE.L    #BITPLANE00,$dff0e0 ; BPL0PT
  549.     MOVE.L    #BITPLANE01,$dff0e4 ; BPL1PT (2 Word weiter vorne als $dff0e0)
  550.  
  551. Aber in der Copperlist kann  ein  Move  bekanntlicherweise  nur  ein  Word
  552. verstellen:
  553.  
  554.     MOVE.W    #$123,$dff180   -->>   dc.w  $180,$123
  555.  
  556. Im Falle der Pointer zu den Bitplanes müssen wir also jede Adresse, die  ja
  557. 1 Longword lang ist, in zwei Words aufteilen, um so tun zu können:
  558.  
  559.     MOVE.W    #BITPL,$dff0e0    ; BPL0PTH (H=Hochwertiges Word der Adresse)
  560.     MOVE.W    #ANE00,$dff0e2    ; BPL0PTL (L=Niederwertiges Word der Adresse)
  561.     MOVE.W    #BITPL,$dff0e4    ; BPL1PTH
  562.     MOVE.W    #ANE01,$dff0e6    ; BPL1PTL
  563.  
  564.  BPLxPTH    = BitPLane x PoinTer High word , Pointer Hochweritges Word
  565.  BPLxPTL    = BitPLane x PoinTer Low word , Pointer Niederwertiges Word
  566.  
  567. Wir haben BITPLANE00 (1 Longword lang) in zwei Word  zerteilt,  BITPL  und
  568. ANE00,  und  somit  mit zwei MOVE.W, die für die Copperlist geeignet sind,
  569. das gleiche erzielt wie mit einem MOVE.L. In der Copperlist würde es  dann
  570. so aussehen:
  571.  
  572.     dc.w    $e0,BITPL    ; BPL0PTH \erstes Bitplane
  573.     dc.w    $e2,ANE00    ; BPL0PTL /
  574.  
  575.     dc.w    $e4,BITPL    ; BPL1PTH \zweites Bitplane
  576.     dc.w    $e6,ANE01    ; BPL1PTL /
  577.     
  578. (denn $dff0e0 wird in der Copperlist zu $e0, etc.)
  579.  
  580. Diese Spaltung nennt man Aufteilung eines  Longword  in  ein  hochwertiges
  581. Word  und  ein  niederwertiges  Word, wobei das hochwertige Word das links
  582. ist, das BITPL, das niederwertige hingegen  das  rechte,  bei  uns  ANE00.
  583. Machen wir ein Beispiel mit echten Adressen:
  584.  
  585. Das Bitplane0 befindet sich auf Adresse $23400, das Bitplane1 auf $25c00
  586.  
  587.     dc.w    $e0,$0002    \Erstes Bitplane (hochw. Word)     \$00023400
  588.     dc.w    $e2,$3400    /         (niederw. Word) /
  589.  
  590.     dc.w    $e4,$0002    \Zweites Bitplane (hochw. Word)   \$00025c00
  591.     dc.w    $e6,$5c00    /          (niederw. Word) /
  592.  
  593. Ihr  werdet  euch  schon  vorstellen, daß um die richtigen Adressen in die
  594. Copperlist zu geben,  zuerst  nötig  sei  zu  kontrollieren,  auf  welcher
  595. Adresse   das  Bild  liegt  und  dann  händisch  die  entsprechenden  Word
  596. austauschen. Aber es reicht eine kleine Routine zu einem  Dutzend  Zeilen,
  597. die  uns  diese  Arbeit  des  Teilens  der  Adressen  und das Einsetzen am
  598. richtigen Ort abnimmt. Diese Routine ermöglicht uns, jedes Bild  an  jedem
  599. Ort  im  Speicher anzupointen, egal wieviele Bitplanes es hat und wie groß
  600. es ist! Lediglich die Parameter müssen verändert werden. Der  Trick  liegt
  601. in  einem  Befehl  des  68000er, dem SWAP, das zwei Word in einem Longword
  602. vertauscht, und somit das Hochwertige niederwertig wird und umgekehrt:
  603.  
  604.     MOVE.L    #HUNDMAUS,d0    ; in d0 kommt das Longword HUNDMAUS
  605.  
  606.     SWAP    d0        ; Wir vertauschen die Words, wir haben in
  607.                 ; d0 MAUSHUND!!
  608.  
  609. Dieser Befehl funktioniert nur auf DATENREGISTERN.
  610. Auf die gleiche Weise wird $00023400 zu $34000002.
  611. Schauen wir uns die Routine an:
  612.  
  613.  
  614.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse von PIC, also
  615.                 ; wo dessen erstes Bitplane beginnt
  616.  
  617.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Pointer
  618.                 ; auf die Planes der COPPERLIST
  619.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  620.                 ; um den DBRA-Zyklus auszuführen
  621. POINTBP:
  622.     move.w    d0,6(a1)   ; kopiert das niederwertige Word der Adresse
  623.                ; des Plane ins richtige Word der Copperlist
  624.     swap    d0       ; vertauscht di 2 Word von d0 (z.B.: 1234 > 3412)
  625.                ; Das hochw. Word kommt an die Stelle des niederw.
  626.                ; Word, dadurch erlaubt es das Kopieren mit move.w!!
  627.     move.w  d0,2(a1)   ; kopiert das hochwertige Word der Adresse
  628.                ; des Plane in das richtige Word der Copperlist
  629.     swap    d0       ; Vertauscht die 2 Word von d0 (z.B.: 3412 > 1234)
  630.                ; es stellt also die richtige Adresse wieder her
  631.     ADD.L    #40*256,d0 ; Wir zählen 10240 zu D0 dazu, somit zeigen wir
  632.                ; auf das zweite Bitplane (es befindet sich nach
  633.                ; dem ersten), wir addieren also die Länge eines
  634.                ; Plane. In den nächsten Durchgängen werden wir
  635.                ; auf das dritte, das vierte etc. zeigen
  636.  
  637.     addq.w  #8,a1        ; a1 enthält nun die Adresse der nächsten
  638.                 ; Bplpointers in der Copperlist, die es
  639.                 ; einzusetzen gilt.
  640.     dbra    d1,POINTBP    ; Wiederhole D1 Mal POINTBP
  641.                 ; (D1=Num. of Bitplanes)
  642.  
  643. Wir verändern dieses Stück Copperlist:
  644.  
  645. BPLPOINTERS:
  646.     dc.w    $e0,$0000,$e2,$0000    ; erstes  Bitplane (BPL0PT)
  647.     dc.w    $e4,$0000,$e6,$0000    ; zweites Bitplane (BPL1PT)
  648.     dc.w    $e8,$0000,$ea,$0000    ; drittes Bitplane (BPL2PT)
  649.     
  650. Diese Routine tut nichts anderes als die Adresse des  Bitplane  zu  holen,
  651. und  dessen niederwertiges Word ins Word nach dem $e2 in die Copperlist zu
  652. kopieren, also dem Pointer auf das niederwertige Word dieser Adresse  (der
  653. sich  6 Bytes nach BPLPOINTERS befindet, ich habe dazu ein move.w d0,6(a1)
  654. verwendet, wobei in a1 die Adresse von  BPLPOINTERS  steht).  Nachdem  das
  655. niederwertige  Word  erledigt  ist,  vertauschen  wir  mit  dem  SWAP  das
  656. hochwertige Word mit dem niederwertigen,  und  ermöglichen  so  mit  einem
  657. weiteren move.w d0,2(a1) das Kopieren des höherwertigen Word an die Stelle
  658. nach  dem  $e0, also dem Pointer auf den hochwertigen Teil der Adresse des
  659. Bitplane.
  660. Jetzt haben wir das erste Bitplane ANGEPOINTET: (z.B. $23400)
  661.  
  662. BPLPOINTERS:
  663.     dc.w $00e0,$0002,$00e2,$3400    ; BPL0PT -erstes Bitplane *GEPOINTET*
  664.     dc.w $00e4,$0000,$00e6,$0000    ; BPL1PT - zweites Bitplane
  665.     dc.w $00e8,$0000,$00ea,$0000    ; BPL2PT - drittes Bitplane
  666.  
  667.             ^        ^
  668.             |        |
  669.           2(a1)          6(a1)    ; Bemerkt die Verwendung der Offset
  670.                     ; um die Word an der richtigen 
  671.                     ; Stelle einzufügen.
  672.  
  673. Bemerkung: mit dem move.w d0,x(a1) kopieren wir das niederwertige Word des
  674. Longwords in d0, weil die Kopie folgend abläuft:
  675.  
  676.     move.w    #HUNDMAUS,2(a1)    ; in Adresse 2(a1) kommt MAUS
  677.  
  678. Daraufhin stellen wir die Adresse mit einem weiteren SWAP wieder  her,  um
  679. mit  einem  ADD.L  #LÄNGEBITPLANE,d0  zum nächsten Plane zu schreiten. Mit
  680. einem addq.w #8,a1 gehen wir zu den Pointern für das zweite Bitplane über,
  681. denn  wenn  in  a1  die  Adresse  von  BPLPOINTERS  steht, und wir 8 Bytes
  682. dazuzählen (4 Words), dann kommen wir hier hin:
  683.  
  684. BPLPOINTERS:
  685.     dc.w $00e0,$0002,$00e2,$3400    ; BPL0PT -erstes Bitplane *GEPOINTET*
  686. a1ZEIGTHIERHER:
  687.     dc.w $00e4,$0000,$00e6,$0000    ; BPL1PT - zweites Bitplane
  688.     dc.w $00e8,$0000,$00ea,$0000    ; BPL2PT - drittes Bitplane
  689.     
  690. Wir wiederholen diese Routine mit einem "DBRA d1,label"-Zyklus, in unserem
  691. Fall  drei  Mal, um 3 Bitplanes anzupointen. (Wie ihr euch sicher erinnert
  692. muß beim DBRA-Zyklus die Anzahl der Durchgänge-1 eingegeben  werden,  weil
  693. der erste Durchgang nicht gezählt wird. In d1 steht hier deshalb auch 2.)
  694.  
  695. Diese  Routine  hat die klassische Struktur einer Routine, die Effekte mit
  696. dem Copper vor hat. Sie zu verstehen ist also fundamental.  Eine  ähnliche
  697. Routine  habt  ihr  schon  in  Listing3h.s  vorgefunden,  dort  wurde  ein
  698. DBRA-Loop dazu verwendet, um 29 Wait in der Copperlist zu verändern.
  699.  
  700. Ladet Listing4a.s um in der Praxis die Ausführung  dieser  BITPLANEPOINTER
  701. Routine zu sehen. Verwendet den Debug dazu.
  702.  
  703. Nun  fehlen  unserem  kleinen  Programm nur noch zwei "Verfeinerungen", um
  704. Probleme bei der Darstellung der Bilder zu vermeiden: zum einen  ein  paar
  705. Befehle um das AGA-Chipset auszuschalten, und somit die Kompatibilität mit
  706. den A1200 und  A4000  herzustellen,  zum  anderen  einige  Zeilen  in  der
  707. Copperlist, die die Sprites verschwinden läßt, die sonst ziellos durch die
  708. Gegend schwirren würden.  Um  das  AGA  abzuschalten  reichen  diese  zwei
  709. Zeilen:
  710.  
  711.     move.w    #0,$dff1fc        ; FMODE - deaktiviert das AGA
  712.     move.w    #$c00,$dff106        ; BPLCON3 - deaktiviert das AGA
  713.  
  714. Und wenn ihr unbedingt auf Nummer sicher gehen wollt, auch noch das:
  715. (Pallette Sprite)
  716.  
  717.     move.w    #$11,$dff10c        ; BPLCON4-Resetiert Sprite-Palette
  718.  
  719. Diese  paar  Zeilen  werden  nach  dem  Anpeilen  der   neuen   Copperlist
  720. ausgeführt.  Um die besoffenen Sprites zu stoppen, müssen wir ihre Pointer
  721. auf NULL zeigen lassen:
  722.  
  723.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000
  724.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  725.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  726.     dc.w    $13e,$0000
  727.  
  728. (Bemerkung: Die Register von  $dff120 bis $dff13e heißen SPR0PT, SPR1PT...
  729. SPR7PT)
  730.  
  731. Wir  werden  über  die  Sprites  später  noch  zu  reden kommen, im Moment
  732. schaffen wir sie einfach aus dem Weg, z.B. durch ein  CUT&PASTE,  mit  dem
  733. ihr   dieses  Stück  einfach  in  eure  Copperlist  einfügt.  Die  Sprites
  734. erschienen nicht, wenn wir alle Bitplanes ausgeschaltet hatten,  aber  ein
  735. einziger reicht, und sie werden lebendig.
  736.  
  737. Endlich könnt ihr in der Praxis sehen, wie ein Bild angezeigt wird.  Ladet
  738. Listing4b.s in einen beliebigen Buffer.
  739.  
  740. Habt  ihr  versucht,  Copppereffekte  beizumischen???  Ladet  das Beispiel
  741. Listing4c.s für eine Mischung mit einigen schon gesehenen Effekten.
  742.  
  743. Habt ihr nun die Wichtigkeit des WAIT in  einer  Copperlist  mit  Bitplane
  744. begriffen?  Es  ermöglicht uns, auch in jeder Zeile Farbe zu wechseln (und
  745. nicht nur das). Jetzt müßt ihr nur noch ein Bild anzeigen, das ihr gemacht
  746. habt,  und  es  mit  dem aus dem Kurs ersetzen. Dafür müßt ihr ein Bild in
  747. 320x256 Pixel in 8 Farben besitzen. Wenn ihr grade  keines  bei  der  Hand
  748. habt,  dann  kritzelt  mal schnell was zusammen, oder konvertiert ein Bild
  749. mit einem Utility wie ADPRO in dieses Format. Habt ihr mal dieses Bild  in
  750. IFF-Format  (auf  einer  formattierten  Diskette), mit dem Namen, der euch
  751. gefällt, z.B. "BILD", dann müßt ihr es in RAW konvertieren,  also  in  das
  752. REALE  Format  der  Bitplanes,  so, wie es der Copper lesen kann. Ladet es
  753. dazu mit dem IFF-Konverter auf dieser  Diskette,  dem  KEFCON,  der  viele
  754. Optionen  hat,  die  wir  aber erst nachher diskutieren werden. Lest diese
  755. Anweisungen bevor ihr ihn startet:
  756. Der Konverter ist in Hardware-Assembler programmiert, deshalb  unterstützt
  757. er  nicht  das  Multitasking,  un  man  kann sein Fenster nicht nach unten
  758. schieben, um die Lektion zu lesen, da sein Fenster eine eigene  Copperlist
  759. ist, und nicht die des Systemes. Es ist kompatibel zum AGA und macht keine
  760. Probleme (die guten, alten Programmierer!). Bereitet euch zuerst das  Bild
  761. auf einer formattierten Diskette vor, die ihr einlegen werdet, nachdem ihr
  762. den KEFCON von df0: gestartet habt (internes Disk Drive),  oder  vom  df1:
  763. (extern, wenn ihr eines habt).
  764. Einmal geladen, erscheint euch oben ein Menü mit  einigen  Optionen,  die,
  765. die uns aber interessieren sind: (ich mache euch ein Schema der "Knöpfe")
  766.  
  767.      ------          ----------
  768.     | SAVE |    | IFF ILBM |
  769.      ------      ----------
  770.  
  771.      ------         ----------
  772.     | LOAD |    | READ DIR |
  773.      ------      ----------
  774.  
  775.      ------
  776.     | QUIT |
  777.      ------ 
  778.  
  779.   -------------------------------------------
  780.  | HIER BEFINDET SICH EIN LÄNGLICHES FENSTER | - Hier kommt der Name
  781.   -------------------------------------------     des File hinein
  782.  
  783. LOAD, SAVE  und  QUITbedeuten  natürlich  LADE,  SPEICHERE  und  ENDE  DES
  784. PROGRAMMES. READ DIR dient dazu, im rechten Fenster die Liste der File auf
  785. der Diskette anzuzeigen, ihre Deirectory.
  786. IFF ILBM ist ein Knopf, der anzeigt, welchen Typ von  File  man  speichern
  787. oder  laden  kann,  in diesem Fall ist er genau richtig mit IFF ILBM, weil
  788. wir ein IFF-Bild laden müssen. Wenn wir später das Bild in RAW abspeichern
  789. wollen,  dann  müssen wir  nur auf diesen Knopf drücken, der zu "RAW NORM"
  790. wird. Das Bild wird nun als RAW gespeichert. Andere Formate sind u.a. auch
  791. "SPRITE"  und  "RAW  BLIT",  wir  werden  sie  in  den  nächsten  Kapiteln
  792. verwenden. Im Moment interessiert uns nur "RAW NORM" und  "COPPER",  wobie
  793. "COPPER"  die  Palette  der  Farben  direkt in einen Textfile mit den dc.w
  794. abspeichert, die wir dann gleich in unsere Copperlist einsetzen können!
  795. Um die Konvertierung zu vollziehen, klickt auf das längliche Fenster,  das
  796. sich   unten  befindet,  wo  dann  der  Schriftzug  "ALLOCATE  GFX-BUFFER"
  797. erscheinen wird und in "df0:" mutieren wird. Wenn ihr das  Bild  auf  df0:
  798. habt, dann laßt alles so, wie es ist, ansonsten gebt euren Drive ein, etwa
  799. df1: oder dh0: (HardDisk). Um die Directory zu lesen,  drückt  "READ  DIR"
  800. und  wählt  dann euer Bild aus und drückt "LOAD". Das Bild wird erscheinen
  801. und ihr könnt mit den Cursortasten rauf- und runterscrollen.
  802. Einmal  das  Bild  geladen,  erscheinen  dessen  Charakteristiken  in  dem
  803. länglichen  Fenster:  "Bitplane  $2800,  Total  $7800". Jedes Bitplane ist
  804. $2800 lang (oder 10240 in Dezimal, 40*256), und gesamt ist das  RAW  $7800
  805. lang,   oder   30720   (40*256*3).   Darüber   sind   auch   die   anderen
  806. Charakteristiken angegeben:
  807.  
  808.  WIDTH: 320 (BREITE), HEIGHT 256 (LÄNGE), DEPTH 3 (ANZAHL DER BITPLANES)
  809.  
  810. Nun klickt auf den Knopf "IFF-ILBM", bis er in "RAW NORM" ändert.  Um  die
  811. Pic  nun  in RAW zu speichern, klickt mit dem limken Mausknopf nochmal auf
  812. das  längliche  Fenster,  gebt  den  zu  speichernden  Namen   ein,   z.B.
  813. "df0:Bild.RAW" und drückt "SAVE". Das RAW, das mit INCBIN reingeholt wird,
  814. ist abgespeichert! Nun drückt solange auf den Knopf mit  "RAW  NORM",  bis
  815. "COPPER"  erscheint.  Wiederholt die Speicherprozedur, gebt dem File einen
  816. Namen, z.B.  "Bild.S"  und  drückt  erneut  "SAVE".  Nun  könnt  ihr  auch
  817. aussteigen,  das Bild wurde in RAW abgespeichert und die Palette als dc.w,
  818. wie wir sie dann reinholen können.
  819.  
  820. Um das Bild anzuzeigen, ladet Listing4b.s und macht  folgende  Änderungen:
  821. ändert  den  Namen  des  Bildes, den es zu laden gilt, indem ihr den Namen
  822. eures Bildes eingebt:
  823.  
  824. PIC:
  825.     incbin "amiga.320*200*3"
  826.  
  827. könnt ihr in
  828.  
  829. PIC:
  830.     incbin "df0:Bild.RAW"
  831.  
  832. ändern. Oder ihr schreibt "v df0:"in der Kommandozeile, und es reicht ein:
  833.  
  834. PIC:
  835.     incbin "Bild.RAW"
  836.  
  837. Für die Palette gibt es zwei Methoden: entwder ihr ladet "Bild.S" in einen
  838. anderen  Textbuffer und kopiert es dann mit Amiga+b+c+i in die Copperlist,
  839. oder ihr verwendetden "I"-Befehl des ASMONE, "INSERT". Er fügt einen  Text
  840. dort  ein,  wo  sich  gerade der Cursor befand, bevor ESC gedrückt und zur
  841. Kommandozeile gewechselt wurde. Wie ihr es  auch  angeht,  eliminiert  die
  842. alte Palette mit dem CUT (Ausschneiden) des Editor, Amiga+b zum auswählen,
  843. Amiga+x zum killen.
  844.  
  845. Hat funktioniert?? Ich hoffe schon, ansonsten bedeutet es, daß  ihr  einen
  846. Durchgang  falsch  gemacht  habt, und zur Strafe alles nochmal wiederholen
  847. müßt.
  848.  
  849. Um mit Freude am Werk zu bleiben, fahren wir fort, indem wir ein  Bild  in
  850. 32  Farben  darstellen.  Dazu  braucht  ihr  das  übliche Bild in 320*256,
  851. diesmal aber in 32 Farben (wenn ihr wirklich keines  habt,  dann  schmiert
  852. irgend  etwas  obszönes  mit  dem  DPaint zusammen). Konvertiert alles wie
  853. vorhin, und ihr werdet bemerken, daß  alles  nach  Plan  läuft:  "Bitplane
  854. $2800, Total $c800". In der Tat, jedes Bitplane ist immer noch $2800 lang,
  855. aber die Gesamtgröße ist klarerweise gewachsen, weil wir hier 5  Bitplanes
  856. (2^5=32)  haben,  und  5*$2800  =  $c800.  Speichert  in .RAW ab, dann die
  857. Palette, z.B. mit Namen wie "Bild32.RAW" und "Bild32.S".
  858.  
  859. Um es anzuzeigen, müßt ihr beim Listing4b.s die gleichen  zwei  Änderungen
  860. wie  vorhin  machen.  Ersetzt  die  alte  Palette mit der neuen (die jetzt
  861. länger sein wird als die mit nur 8 Farben!). Weiters müßt ihr  die  Anzahl
  862. der  Bitplanes  in  der Pointer-Routine ändern, um die fehlenden zwei auch
  863. noch einzubeziehen:
  864.  
  865.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse von PIC, also
  866.                 ; wo dessen erstes Bitplane beginnt
  867.  
  868.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Pointer
  869.                 ; auf die Planes der COPPERLIST
  870. **->    MOVEQ    #4,D1        ; Anzahl der Bitplanes -1 (hier sind es 5!!)
  871.                 ; um den DBRA-Zyklus auszuführen
  872. POINTBP:
  873.     ....
  874.  
  875. 1) Ändert das MOVEQ #2,D1 in MOVEQ #4,D1 ab, jetzt werden also statt  drei
  876. DBRA-Zyklen  fünf  durchlaufen  (5-1=4),  wir pointen fünf Planes an. Aber
  877. dann müssen auch die fehlenden Pointer in der Copperlist eingefügt werden:
  878.  
  879. BPLPOINTERS:
  880.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane (BPL0PT)
  881.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane (BPL1PT)
  882.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane (BPL2PT)
  883.     dc.w $ec,$0000,$ee,$0000    ;viertes bitplane (JETZT DAZUGEKOMMEN!)
  884.     dc.w $f0,$0000,$f2,$0000    ;fünftes bitplane (JETZT DAZUGEKOMMEN!)
  885.  
  886. Letzte und wichtigste Änderung: wir müssen nun fünf Planes  "einschalten",
  887. und nicht mehr nur drei. Eine Änderung an BPLCON1 muß her:
  888.  
  889.             ; 5432109876543210
  890.     dc.w    $100,%0101001000000000  ; bits 14,12 ani!! (5 = %101)
  891.  
  892. Assembliert alles und das Bild in 32 Farben müßte erscheinen.
  893.  
  894. Durch diese zwei Beispiele könnt ihr nun leicht erahnen, wie man Bilder zu
  895. 2, 4, 8 und 16 Farben anzeigt! Die Anzahl der Loops in der Pointer-Routine
  896. anpassen, und die richtigen Bits in $dff100 (BPLCON1) setzen.
  897.  
  898. Sehen wir nun, wie man ein Bild in EHB zu 64 Farben und eines  in  HAM  zu
  899. 4096 Farben anzeigt, indem man die zwei speziellen Grafikmodi anschaltet.
  900.  
  901. Starten  wir  bei  dem HAM-Bild: erstellt euch eine Pic in 320x256 in HAM,
  902. oder sucht eines der vielen HAM-Figuren, die  so  oft  auf  Disketten  mit
  903. "SEXY"-Inhalt  verwendet werden. Es wird meißt HAM verwendet, weil es sehr
  904. auf hohe Farbtreue ankommt, wenn man eine nackte Frau anzeigt. Ich glaube,
  905. es  ist  schöner  ein nacktes Girl anzuzeigen als eine Obstschale... Ladet
  906. das Ham-Bild wie nach Drehbuch mit dem KEFCON und speichert  sie  als  RAW
  907. und COPPERLIST.
  908. Leider hat der KEFCON einen Programmierfehler, denn  wenn  Figuren  mit  6
  909. Bitplanes  auf  A4000  geladen  werden,  seien  sie  nun  in HAM oder EHB,
  910. verursachen sie eine "Verwirrung" der Zahlen und Satzzeichen im Menü  (auf
  911. A500/2000/600  funkt´s  aber!),  deswegen  könnt ihr nur die Worte richtig
  912. lesen, aber das ist sicher kein Problem, da ihr ja nur auf  das  längliche
  913. Fenster  klicken  und  einen anderen Namen eigeben müßt. Einmal, z.B. .RAW
  914. und einmal .S für die Copperlist.
  915. Nun müßt ihr noch die fehlenden Pointer für Bitplane 6 in  der  Copperlist
  916. dazufügen,  und  die  Anzahl  der Zyklen in der Routine so ändern, daß sie
  917. sechs mal ausgeführt wird:
  918.  
  919. BPLPOINTERS:
  920.     dc.w $e0,$0000,$e2,$0000    ; erstes  Bitplane - BPL0PT
  921.     dc.w $e4,$0000,$e6,$0000    ; zweites Bitplane - BPL1PT
  922.     dc.w $e8,$0000,$ea,$0000    ; drittes Bitplane - BPL2PT
  923.     dc.w $ec,$0000,$ee,$0000    ; viertes Bitplane - BPL3PT
  924.     dc.w $f0,$0000,$f2,$0000    ; fünftes Bitplane - BPL4PT
  925.     dc.w $f4,$0000,$f6,$0000    ; sechstes Bitplane (JETZT DAZU!)
  926.  
  927.  
  928. **->    MOVEQ    #5,D1        ; Anzahl der Bitplanes -1 (hier sind es 6!!!!!)
  929.  
  930. POINTBP:
  931.     ...
  932.  
  933. Auch das BPLCON0:
  934.  
  935.       ; 5432109876543210
  936.  dc.w $100,%0110101000000000    ; ---> 6 Plane in HAM Lowres (4096 Farben)
  937.                 ; BIT 11 gesetzt = HAM!
  938.  
  939.  
  940. Die Funktion des HAM wird später näher betrachtet.
  941.  
  942.                 *
  943.  
  944. Um ein Bild in Extra Half Bright anzuzeigen, konvertiert ein  solches  mit
  945. dem KEFCON, laßt es mit dem INCBIN laden, ersetzt die Palette, pointet das
  946. sechste Bitplane an und setzt das Bit 11 von BPLCON0 auf 0:
  947.  
  948.       ; 5432109876543210
  949.  dc.w $100,%0110001000000000    ; ---> 6 Plane in EHB Lowres (64 Farben)
  950.   
  951. Bemerkung: Im EHB - Modus stehen zwar 64 Farben  zur  Verfügung,  aber  es
  952. können  nicht  alle  frei  verändert  werden:  der  Amiga  besitzt  nur 32
  953. Farbregister; die anderen 32  Farben  sind  gleich  mit  den  ersten,  nur
  954. dunkler, eine Art "Halbe Helligkeit", eben "HALF BRIGHT".
  955.  
  956. Nun,  wo wir wissen, wie man Bilder anzeigt, sehen wir uns die Effekte an,
  957. die wir mit den Scroll-Registern erzeugen können. Ladet  LEKTION5.TXT  mit
  958. "r".
  959.  
  960.  
  961.