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

  1.  
  2.  ASSEMBLERKURS - LEKTION 5
  3.  
  4. In dieser Lektion werden wir den horizontalen und  vertikalen  Scroll  von
  5. Bildern behandeln, weiters noch einige andere Spezialeffekte.
  6.  
  7. Beginnen   wir  mit  dem  horizontalen  Scroll  (Bild  links  oder  rechts
  8. schieben): der Amiga  besitzt  ein  spezielles  Register,  das  für  diese
  9. Aufgabe  zugeschnitten ist, das BPLCON1 ($dff102), das ein Bild jeweils um
  10. ein Pixel nach links oder rechts verschieben kann, bis  zu  einem  Maximum
  11. von  15 Pixel. Das wird durch den Copper erreicht, indem der Datentransfer
  12. der Bitplanes um ein Pixel  oder  mehr  verspätet.  Die  geraden  und  die
  13. ungeraden Bitplanes können auch separat voneinander verschoben werden. Die
  14. ungeraden  Bitplanes  werden  PLAYFIELD1  genannt  (1,3,5),  die   geraden
  15. PLAYFIELD2  (2,4,6).  Das  $dff102  ist  ein  Word lang, und in zwei Bytes
  16. unterteilt: das hochwertige, also das links ($xx00), das aus den Bits  von
  17. 15  bis  8 besteht. Es wird nicht verwendet, es muß auf 0 gelassen werden.
  18. Das niederwertige Byte ($00xx) kontrolliert den Scroll:
  19.  
  20.     $dff102, BPLCON1 - Bit Plane Control Register 1
  21.  
  22.     BITS        NAME-FUNKTION
  23.  
  24.     15    -    X
  25.     14    -    X
  26.     13    -    X
  27.     12    -    X
  28.     11    -    X
  29.     10    -    X
  30.     09    -    X
  31.     08    -    X
  32.     07    -    PF2H3\
  33.     06    -    PF2H2 \4 Bit zum Scroll der GERADEN PLANES
  34.     05    -    PF2H1 /                (Playfield 2)
  35.     04    -    PF2H0/
  36.     03    -    PF1H3\
  37.     02    -    PF1H2 \4 Bit zum Scroll der UNGERADEN PLANES
  38.     01    -    PF1H1 /                (Playfield 1)
  39.     00    -    PF1H0/
  40.  
  41. Auf dieses Word muß man  ähnlich  zugreifen  wie  bei  den  Farbregistern:
  42. während bei den Farbregistern auf drei Komponenten agiert werden muß, also
  43. auf RGB, so wird hier nur auf zwei zugegriffen, die jeweils von $0 bis  $f
  44. gehen, wie in etwa Grün und Blau des $dff180 (COLOR0):
  45.  
  46.     dc.w    $102,$00xy    ; BPLCON1 - wobei: X Scroll GERADE BITPLANES
  47.                            Y Scroll UNGERADE BITPLANES
  48.  
  49. Einige Beispiele: (für die Copperlist)
  50.  
  51.     dc.w    $102,$0000 ; BPLCON1 - Scroll NULL, normale Position
  52.     dc.w    $102,$0011 ; BPLCON1 - Scroll = 1 in beiden Playfield,
  53.                ; ich bewege also das ganze Bild
  54.     dc.w    $102,$0055 ; BPLCON1 - Scroll = 5 für das ganze Bild
  55.     dc.w    $102,$00FF ; "" Scroll auf Maximalwert (15) für das ganze Bild
  56.     dc.w    $102,$0030 ; "" Scroll = 3 nur für gerade Bitplanes
  57.     dc.w    $102,$00b0 ; "" Scroll = $B nur für ungerade Bitplanes
  58.     dc.w    $102,$003e ; "" Scroll = 3 für die geraden Bitplanes, $e
  59.                ;         für die ungeraden Bitplanes
  60.  
  61. Nicht Leichteres! Einfach den Wert des Scrolls bei jedem  Frame  wechseln,
  62. und  man  hat  einen  tollen Scroll des ganzen Bildschirmes mit einem MOVE
  63. erzeugt!!
  64.  
  65. Ladet Listing5a.s um in der Praxis zu sehen, was passiert.
  66.  
  67. In diesem Beispiel wird das BPLCON1 - $dff102 - am Anfang  der  Copperlist
  68. verändert,  deswegen  bewegt  sich  das  ganze  Bild. Es ist auch möglich,
  69. mehrere $dff102 in  verschiedenen  Zeilen  der  Copperlist  zu  verwenden,
  70. kombiniert  mit  einigen  Waits.  Was  daraus  entstehen kann, seht ihr in
  71. Listing 5b.s Dort werden  zwei  Scrolls  verwendet,  die  die  Schriftzüge
  72. "COMMODORE" und "AMIGA" unabhängig verschieben.
  73. Wird ein $dff102 pro Zeile gegeben,  dann  erzielt  man  die  allbekannten
  74. Welleneffekte der Bilder.
  75.  
  76. Schauen wir uns nun den vertikalen Scroll an. Die einfachste Art ist jene,
  77. einfach höher oder tiefen in die Bitplane-Pointers in  der  Copperlist  zu
  78. pointen.  Somit erscheint das Bild höher oder tiefer. Stellen wir uns vor,
  79. wir sehen das  Bild  durch  ein  quadratisches  Loch,  einer  Art  Fenster
  80. (Monitor):
  81.  
  82.      ---------------
  83.     |        | 1
  84.     |        | 2
  85.     |     AMIGA    | 3
  86.     |        | 4
  87.     |        | 5
  88.      ---------------
  89.  
  90. In diesem Fall sehen wir die Schrift AMIGA in der Mitte des Fensters,  und
  91. wir  haben  die  Bitplane-Pointers  auf 1 zeigen lassen, also dort, wo der
  92. Bildschirm beginnt. Da er also bei Zeile 1 anfängt, steht AMIGA auf  Zeile
  93. 3. Wenn wir nun aber auf 2 pointen, was passiert dann??
  94.  
  95.      ---------------
  96.     |        | 2
  97.     |     AMIGA    | 3
  98.     |        | 4
  99.     |        | 5
  100.     |        | 6
  101.      ---------------
  102.  
  103. Das passiert: AMIGA "steigt" um eine Zeile,  weil  das  Fenster  (Monitor)
  104. sinkt, oder anders ausgedrückt, der Pointer um eine Zeile tiefer angesetzt
  105. ist. Da Bewegungen relativ sind, wird ein Baum, den wir aus dem Zugfenster
  106. vorbeiziehen sehen, sich in Wirklichkeit ja nicht bewegen, diejenigen, die
  107. das tun sind wir im Zug. Hier geschieht das Gleiche.  Aber  wieviel müssen
  108. wir dazuzählen, um ein Bild rauf- oder runterzuscrollen? Um wieviel müssen
  109. die Bitplanepointer erhöht bzw. erniedrigt werden? Die Bytes einer  Zeile!
  110. Also 40, wenn das Pic in LOW RES 320x200 ist, oder 80 für ein Bild in HIGH
  111. RES 640x256. Schauen wir uns das Beispiel an:
  112.  
  113.     1234567890
  114.     ..........
  115.     ....++....
  116.     ...+..+...
  117.     ...++++...
  118.     ...+..+...
  119.     ...+..+...
  120.     ..........
  121.  
  122. Wir haben ein hypotetisches Bitplane mit 10 Bytes pro Zeile,  das  jeweils
  123. auf 0 (.) oder 1 (+) sein kann. Hier wird ein "A" dargestellt. Um dieses A
  124. nach oben zu scrollen, werden wir eine Zeile  "tiefer"  pointen,  also  10
  125. Bytes  weiter  unten.  Um  tiefer  zu  zeigen, müssen 10 BYTES DAZUGEZÄHLT
  126. werden (ADD.L #10,Pointer):
  127.  
  128.     1234567890
  129.     ....++....
  130.     ...+..+...
  131.     ...++++...
  132.     ...+..+...
  133.     ...+..+...
  134.     ..........
  135.     ..........
  136.  
  137. Auf die gleiche Art und Weise, um die Pic zum sinken  zu  bringen,  werden
  138. wir  eine  Zeile  weiter  oben  beginnen,  sie  zu zeichnen, also 10 Bytes
  139. weniger in der Adresse. (SUB.L #10,Pointer):
  140.  
  141.     1234567890
  142.     ..........
  143.     ..........
  144.     ....++....
  145.     ...+..+...
  146.     ...++++...
  147.     ...+..+...
  148.     ...+..+...
  149.   
  150. Um das in der Praxis zu  erreichen,  müssen  wir  uns  erinnern,  daß  die
  151. Pointer  in der Copperlist die Adresse der Planes beinhalten (und wir dann
  152. dementsprechned ändern), und diese Adresse in zwei Words  aufgeteilt  ist.
  153. Dieses  Problem  ist  recht  einfach zu bewältigen, wenn man einige kleine
  154. Änderungen in der Routine zum Anpointen der Bitplanes anbringt. Wir müssen
  155. die   Adresse   der  Bitplanes  aus  der  Copperlist  "holen"  (umgekehrte
  156. Operation), 40 dazu- oder wegzählen (für den Scroll, 80 bei  High-Res...),
  157. und dann diese neue Adresse wieder in die Copperlist einsetzen. Für diesen
  158. letzten Schritt kann auch die alte Routine dienen. Schaut euch Listing5c.s
  159. an, dort wird dieses System verwendet.
  160.  
  161. Nun  ladet  Listing5d.s,  in  dem  die  beiden Routinen für vertikalen und
  162. horizontalen Scroll gleichzeitig laufen.
  163.  
  164. In Listing5d2.s werdet ihr eine weitere  Anwendung  des  Horizontalscrolls
  165. zusammen  mit  dem  $dff102 (BPLCON1) finden, die Verzerrung während einer
  166. Bewegung.
  167.  
  168. Nun werden wir  die  wichtigsten  Register  für  Video-Spezialeffekte  des
  169. Amigas kennenlernen, und zwar die Modulo: $dff108 und $dff10a (BPL1MOD und
  170. BPL2MOD). Es gibt zwei Modulo-Register, damit sie  unabhängig  für  gerade
  171. und  ungerade  Planes  geändert  werden  könne.  Um auf unserem Bild mit 3
  172. Bitplanes operierne zu können, müssen wir  beide  Register  zu  Verwendung
  173. ziehen. 
  174. Ihr werdet bemerkt haben, daß bei einem Bild in LowRes  320x256  der  Beam
  175. alle  40  Bytes  eine  neue  Zeile  nimmt,  die  Daten  selbst  aber  alle
  176. hintereinander stehen. Genauso geht der Beam alle 80 in die nächste Zeile,
  177. wenn  es  sich  um  eine  Pic  in High-Res handelt. In der Tat wird dieses
  178. "Modul" automatisch zugewiesen, wenn das $dff100 (BPLCON0)  gesetzt  wird:
  179. wird  Low  Res  ausgewählt,  dann weiß der Copper, daß eine Zeile 40 Bytes
  180. lang ist, er nimmt also alle 40 Bytes eine neue.  Er  beginnt  also  links
  181. oben  am  Bildschirm, liest 40 Bytes und malt sie mit dem Beam hinauf. Die
  182. erste Zeile steht. Dann beginnt das  Spiel  von  vorne,  aber  eine  Zeile
  183. tiefer. Die nächsten 40 Bytes kommen an die Reihe. Und so weiter, bis alle
  184. 256 Zeilen durch sind. Im Speicher aber  liegen  diese  Daten  klarerweise
  185. alle nacheinander, da gibt´s kein quadratisches Bild! Der Speicher ist wie
  186. eine  Schnur,  auf  der  die  Bytes  wie  Perlen  aufgereiht  sind.  Keine
  187. quadratischen  Felder  mit  Bitplanes etc. Das stellen wir uns nur so vor.
  188. Stellt euch vor, ihr zerlegt die einzelnen Zeilen  des  Bildes  und  reiht
  189. dann alle 256 aneinander:
  190. genau so sieht´s aus!
  191. Wenn wir nun das Modulo auf 0 lassen, dann verändern wir  nichts,  und  es
  192. bleiben  die  Werte,  wie  sie  sich der Copper vorstellt: alle 40 bzw. 80
  193. Bytes eine neue Zeile. Den Wert, den wir in das Modulo geben, wird zu  den
  194. Bitplanepointers  am ENDE DER ZEILE DAZUGEZÄHLT, also wenn wir die 40 Byte
  195. erreicht haben. Somit können wir Bytes "überspringen", die nicht angezeigt
  196. werden.  Wenn  wir z.B. 40 an jedes Ende dazurechnen, dann wird nach jeder
  197. Zeile eine weitere übersprungen,  es  wird  also  eine  alle  zwei  Zeilen
  198. angezeigt:
  199.  
  200.   - NORMALES BILD -
  201.  
  202.  ....................    ; am Ende dieser Zeile überspringe ich 40 Bytes
  203.  .........+..........
  204.  ........+++.........    ; und zeige diese Zeile an, dann "springe" ich...
  205.  .......+++++........
  206.  ......+++++++.......    ; und zeige diese Zeile an, dann "springe" ich...
  207.  .......+++++........
  208.  ........+++.........    ; und zeige diese Zeile an, dann "springe" ich...
  209.  .........+..........
  210.  ....................    ; und zeige diese Zeile an, dann "springe" ich...
  211.  
  212. Das Ergebnis wird eine Anzeige jeder zweiten Zeile sein:
  213.  
  214.     - BILD Modulo 40 -
  215.  
  216.  ....................    ; am Ende dieser Zeile überspringe ich 40 Bytes
  217.  ........+++.........    ; und zeige diese Zeile an, dann "springe" ich...
  218.  ......+++++++.......    ; und zeige diese Zeile an, dann "springe" ich...
  219.  ........+++.........    ; und zeige diese Zeile an, dann "springe" ich...
  220.  ....................    ; und zeige diese Zeile an, dann "springe" ich...
  221.  ....................
  222.  ....................
  223.  ....................
  224.  ....................
  225.  
  226.  
  227. Das Bild wird zerquetscht erscheinen, nur die Hälfte lang.  Unter  anderem
  228. werden  wir auch Bytes "unter" unserem Bild anzeigen, da der Bildschirm ja
  229. immer  bei  Zeile  256  endet:  praktisch  werden  immer  nur  256  Zeilen
  230. angezeigt,  aber  da wir nur jede zweite anzeigen, wird die Gesamtzahl auf
  231. 512 Zeilen kommen. Ladet nochmal Listing2b.s und modifiziert die Modulo in
  232. der Copperlist:
  233.  
  234.     dc.w    $108,40     ; Bpl1Mod
  235.     dc.w    $10a,40     ; Bpl2Mod
  236.   
  237. Ihr wedet bemerken, daß das Bild wie erwartet nur die Hälfte so groß  ist,
  238. und  der  untere  Teil  des  Bildschirmes  mit  Bitplanes gefüllt ist, die
  239. "übrig" sind: es wird das zweiten Bitplane unter dem Ersten angezeigt, das
  240. Dritte  unter  dem Zweiten, während nach dem dritten Bitplane der Speicher
  241. angezeigt wird, wie er unter dem letzten Bitplane ist. Es  werden  einfach
  242. mehrere  angezeigt.  Probiert  zwei  Zeilen  zu überspringen, indem ihr 80
  243. Bytes überspringt und 40 anzeigt,...:
  244.  
  245.     dc.w    $108,40*2     ; Bpl1Mod
  246.     dc.w    $10a,40*2     ; Bpl2Mod
  247.  
  248. Die Pic ist nochmal halbiert worden, und  darunter  werden  weitere  Bytes
  249. erscheinen.  Ihr  werdet  eine Halbierung der Länge des Bildes alle Modulo
  250. 40*x feststellen. Wenn ihr ein Modulo wählt, das nicht 40 ist, dann werdet
  251. ihr  eine Art "fransen" verursachen, denn der Copper wird die Zeilen nicht
  252. mehr ab deren Anfang darstellen, sondern ab einem Punkt, der von Zeile  zu
  253. Zeile verschieden sein wird.
  254.  
  255. Haut  euch Listing5e.s rein, um eine schnelle Routine zu sehen, die 40 zum
  256. Modulo dazuzählt, um die Pic zu halbieren.
  257.  
  258. Die Moduli können außer positiv auch negativ sein. In diesem Fall wird die
  259. Zahl  am  Ende  der  angezeigten  Zeile  abgezogen.  Somit können komische
  260. Effekte erzielt werden: stellt euch vor, ihr setzt das Modulo auf -40. Der
  261. Copper  wird  also  40 Bytes lesen, die erste Zeile, sie anzeigen, dann 40
  262. Bytes zurückgehe, und nochmal dieselben anzeigen. Er wird  also  über  die
  263. ersten  40  Bytes  nie  darüber  hinaus  kommen. Wenn z.B. die erste Zeile
  264. vollständig schwarz ist, dann werden alle folgendne  Zeilen  auch  schwarz
  265. werden,  weil  sie die erste Zeile "kopieren". Wenn ein Punkt inmitten der
  266. ersten Zeile war, dann werden alle Zeilen diesen Punkt haben:
  267.  
  268.     ..........+........    ; Zeile 1 (immer neu gezeichnet:
  269.     ..........+........    ; Zeile 2  Modulo -40!)
  270.     ..........+........    ; Zeile 3
  271.     ..........+........    ; Zeile 4
  272.     ..........+........    ; Zeile 5
  273.     ..........+........    ; Zeile 6
  274.     ..........+........    ; Zeile 7
  275.     ..........+........    ; Zeile 8
  276.     ..........+........    ; Zeile 9
  277.     ..........+........    ; Zeile 10
  278.  
  279. So wird jede Farbe eine Art von "Schmelzeffekt" erzeugen, der bis zum Ende
  280. des  Screens  reichen  wird.  Dieser Effekt wurde viel in Spielen wie Full
  281. Contact, dem  Demomaker  von  Red-Sector  und  vielen  anderen  Programmen
  282. eingesetzt.
  283.  
  284. Sehen wir uns an, wie er in der Praxis funktioniert. Listing5f.s.
  285.  
  286. Sehr  eindrucksvoll und einfach zu erstellen, stimmt´s oder hab ich recht?
  287. Er wird auch FLOOD-Effekt genannt. Das Modulo wird am Ende jeder Zeile  zu
  288. den  Bitplane-Pointers  dazugezählt, diese "wandern" im Speicher herum, um
  289. das ganze Bild anzuzeigen. Wir addieren also eine negative Zahl, das einer
  290. Subtraktion  entspricht.  In diesem gegebenen Fall werden die Pointer nach
  291. dem Transfer einer jeden Zeile mit dem Wert X+40 bzw.  mit  X-40  geladen,
  292. und starten wieder ab diesem Wert X.
  293.  
  294. +---->->->--------+
  295. |          |
  296. |BPL POINTER=  X+ 0......................................39      
  297. |          |                     |
  298. |ANFANG ZEILE-+---xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx---+- LETZTES BYTE ->
  299. |    (X)   |   |                     |   |    (X+39)
  300. |          +---+                     +---+
  301. |          |
  302. | NÄCHST. Z.-+----xxxx[...]
  303. ^         |      |
  304. |         +-X+ 40  (Der Pointer ist nach dem Transfer die ganze Länge einer
  305. ^          |   Zeile durchgegangen (40 Bytes), und ist am 40sten
  306. |          |   stehengeblieben, das im Grunde nichts anderes ist als
  307. ^          |   das erste Byte der nächsten Zeile).
  308. |          +-> (Hier wird dem Pointer eines jeden Plane ein Wert
  309. |          |   ADDIERT, in unserem Fall "-40")
  310. |          +-> X=X+(-40) => X=X-40 => X=0 >-+
  311. |          |                |
  312. +----------<-<-<--+------------<-<-<---------------+
  313.  
  314. Gesehen? Grade dann, wenn der Pointer am Ende angekommen ist,  zählen  wir
  315. ihm  40  Bytes  weg,  und  er muß von vorne beginnen. Er zeigt die gleiche
  316. Zeile nochmals an.
  317.  
  318. Wir haben in Listing5f.s auch den "Spiegel-Effekt"  gesehen,  also  Modulo
  319. -80. Schauen wir ihn uns alleine in Listing5g.s an.
  320.  
  321. Nun   sehen   wir,   wie  die  Verwendung  von  vielen  $dff102  (BPLCON1)
  322. nacheinander in der Copperlist einen Welleneffekt erzeugen  können:  ladet
  323. Listing5h.s.
  324.  
  325. Sehen  wir uns nun eine spezielle Verwendung des Scrolls mit den Bitplanes
  326. an: Listing5i.s ist ein  sogenannter  GRAPHIC-SCANNER,  ein  Vorfahre  der
  327. GFX-RIPPER,  also  der  Programme,  die Bilder aus dem Speicher "stehlen".
  328. Dieses kurze Programm dient dazu, den Inhat der Chip-Ram  anzuzeigen,  mit
  329. allen sichtbaren Bildern, die sie enthält.
  330.  
  331. Noch ein Beispiel mit den Modulo in Listing5l.s, diemal um ein Bild in die
  332. Länge zu ziehen, anstatt es zu kürzen.
  333.  
  334. In Listing5m.s sehen wir eine andere Methode, um  Bilder  nach  oben  oder
  335. nach unten zu verschieben, diesmal durch verändern von DIWSTART ($dff08e).
  336. Die Register DIWSTART und DIWSTOP bestimmen den Anfang und  das  Ende  des
  337. "VideoFensters",   also   dem  rechteckigen  Teil  des  Bildschirmes,  der
  338. angezeigt wird. DIWSTART enthält die YYXX-Koordinaten  der  linken  oberen
  339. Ecke dieses "Fensters", DIWSTOP die Koordinaten res rechten, unteren:
  340.  
  341.     DIWSTART
  342.     o----------------
  343.     |        |
  344.     |        |
  345.     |        |
  346.     |        |
  347.     |        |
  348.     ----------------o
  349.               DIWSTOP
  350.  
  351. In diesen Registern kann man aber nicht alle beliebigen  Werte  einsetzen,
  352. denn   XX  und  YY  sind  Bytes,  und  bekanntlich  könne  Bytes  nur  256
  353. verschiedene Werte darstellen ($00-$FF). Schauen  wir  also,  wo  wir  das
  354. Video-Fenster mit DiwStart beginnen und es mit DiwStop beenden können.
  355.  
  356.     dc.w    $8e,$2c81     ; DiwStrt YY=$2c,     XX=$81
  357.     dc.w    $90,$2cc1     ; DiwStop YY=$2c(+$ff), XX=$c1(+$ff)
  358.  
  359. Das normale Videofenster hat diese Werte als  Standart  für  DIWSTART  und
  360. DIWSTOP; die vertikale Position YY funktioniert genau so wie beim Wait des
  361. Copper: wenn wir mit dem Copper eine Zeile über  $2c  abwarten,  und  dort
  362. Farbverläufe  herstellen, dann werden sie nicht sichtbar sein, weil sie zu
  363. hoch oben liegen. Das Gleiche gilt für Waits nach der Zeile $FF, die  dann
  364. bei  $00 wieder starten werden, also $FF+1. Der Bildschirm beginnt bei $2c
  365. und endet bei $2c nach $FF. Dadurch  werden  wie  erwartet  insgesamt  256
  366. Zeilen  angezeigt.  Für  einen  Bildschirm,  der  nur 200 Zeilen hoch ist,
  367. müßten wir folgendes DIWSTOP setzen:
  368.  
  369.     dc.w    $90,$f4c1     ; DiwStop YY=$2c(+$ff), XX=$f4
  370.  
  371. In der Tat ist $f4-$2c = 200. Wenn wir $00, $01... setzen, werden  wir die
  372. Zeile nach $FF meinen.
  373. Die Limits sind folgende: das DiwStart kann sich vertikal zwischen $00 und
  374. $FF  bewegen, also bis zur Zeile 200. Das Video-Fenster kann also nicht ab
  375. Zeile 201 oder mehr starten, immer früher.
  376. Für das DiwStop haben sich die Ingeneure eine Strategie  ausgedacht:  wenn
  377. der  Wert  unter  $80 (128) ist, dann warte Zeile $FF ab, $2c bezieht sich
  378. also auf $2c+$FF, also Zeile 256. Wenn die Zahl größer als $80  ist,  dann
  379. wird sie so wie sie ist genommen (auch weil  es  keine  Zeile  $80+$ff=383
  380. gibt!), und es wird wirklich die Zeile 129, 130, etc. abgewartet.
  381. DiwStart kann also bis maximal Zeile $FF gehen,  bei  NULL  startend,  das
  382. DiwStop  hingegen  kann  Zeile  $FF  überschreiten  und über das Limit des
  383. Bildschirmes hinausgehen, es kann aber nicht unter Zeile $80 gehen.
  384. Dieser Trick wurde angewandt, indem die Zahlen mit Bit 7  auf  NULL  (also
  385. bis  $80)  so  angesehen  hat, also ob sie ein hypotetisches Bit 8 gesetzt
  386. hätten ( die Zahlen nach $80 haben es gesetzt),  das  dann  alles  um  $FF
  387. erhöht.  Ist  dieses Bit aber nicht gesetzt, dann wird unser hypotetisches
  388. Geisterbit gelöscht und die Zahlen werden genommen wir sie kommen.
  389. Was die horizontalen Zeilen  angeht,  sie  können  jeden  belienigen  Wert
  390. zwischen  $00  und  $FF annehmen, also bis zur Position 256 (erinnert euch
  391. aber, daß der Bildschirm bei $81 und  nicht  bei  $00  beginnt,  also  bei
  392. 126!). DiwStop hingegen interpretiert ein $00 als ein 127, und das geht so
  393. weiter bis zum rechten Rand, denn es hat das "Geisterbit" immer auf 1,  es
  394. weren also immer $FF zu seinem XX-Wert dazugezählt.
  395. Schlußendlich kann man sagen, daß das DiwStart sich in jeder  Position  XX
  396. und  YY  positionieren  kann, mit jedem Wert zwischen $00 und $FF. DiwStop
  397. hingegen kann sich horizontal nach der Zeile $FF, vertikal von  der  Zeile
  398. $80  bis  $FF positionieren, danach starten die Zeilen wieder bei $00, $01
  399. usw., wie beim Wait nach $FF, deswegen ist ein $2c eigentlich $2c+$FF.
  400.  
  401. In  Listing5m2.s,  wird  dieses  Argument behandelt.
  402.  
  403. Als  Abschluß von LEKTION5 ladet Listing5n.s, das eine Zusammenfassung der
  404. vorherigen Listings ist, und dazu spielt es auch noch ein Lied.
  405.  
  406. Einmal dieses Listing verstanden, bleibt euch nichts  anderes  übrig,  als
  407. LEKTION6.TXT zu laden!
  408.  
  409.  
  410.