home *** CD-ROM | disk | FTP | other *** search
/ ftp.elysium.pl / ftp.elysium.pl.tar / ftp.elysium.pl / docs / programming / VIC-Artikel < prev   
Text File  |  2008-03-11  |  130KB  |  2,625 lines

  1.  
  2.                 Der MOS 6567/6569 Videocontroller (VIC-II)
  3.                     und seine Anwendung im Commodore 64
  4.  
  5.                             von Christian Bauer
  6.                      <bauec002@goofy.zdv.uni-mainz.de>
  7.  
  8.                                 18.Nov.1995
  9.  
  10.  
  11.  
  12. Inhalt
  13. ------
  14.  
  15. 1. Einleitung
  16. 2. Die Architektur des Commodore 64
  17. 2.1. ▄bersicht
  18. 2.2. 6510 Prozessor
  19. 2.3. 6567/6569 Grafikchip
  20. 2.4. Speicher
  21. 2.4.1. Speicheraufteilung aus Sicht des 6510
  22. 2.4.2. Speicheraufteilung aus Sicht des VIC
  23. 2.4.3. Speicherzugriff von 6510 und VIC
  24. 3. Funktionsweise des VIC
  25. 3.1. Blockbild
  26. 3.2. Register
  27. 3.3. Farbpalette
  28. 3.4. Bildaufbau und Ausma▀e des Bildausschnittes
  29. 3.5. Bad Lines
  30. 3.6. Speicherzugriff
  31. 3.6.1. Die X-Koordinaten
  32. 3.6.2. Zugriffsarten
  33. 3.6.3. Timing einer Rasterzeile
  34. 3.7. Text-/Bitmapdarstellung
  35. 3.7.1. Idle-Zustand/Display-Zustand
  36. 3.7.2. VC und RC
  37. 3.7.3. Grafikmodi
  38. 3.7.3.1 Standard-Textmodus (ECM/BMM/MCM=0/0/0)
  39. 3.7.3.2 Multicolor-Textmodus (ECM/BMM/MCM=0/0/1)
  40. 3.7.3.3 Standard-Bitmap-Modus (ECM/BMM/MCM=0/1/0)
  41. 3.7.3.4 Multicolor-Bitmap-Modus (ECM/BMM/MCM=0/1/1)
  42. 3.7.3.5 ECM-Textmodus (ECM/BMM/MCM=1/0/0)
  43. 3.7.3.6 Ungⁿltiger Textmodus (ECM/BMM/MCM=1/0/1)
  44. 3.7.3.7 Ungⁿltiger Bitmap-Modus 1 (ECM/BMM/MCM=1/1/0)
  45. 3.7.3.8 Ungⁿltiger Bitmap-Modus 2 (ECM/BMM/MCM=1/1/1)
  46. 3.7.3.9 Idle-Zustand
  47. 3.8. Sprites
  48. 3.8.1. Speicherzugriff und Darstellung
  49. 3.8.2. PrioritΣt und Kollisionserkennung
  50. 3.9. Die Rahmenstufe
  51. 3.10. Display Enable
  52. 3.11. Lightpen
  53. 3.12. VIC-Interrupts
  54. 3.13. DRAM-Refresh
  55. 3.14. Effekte/Anwendungen
  56. 3.14.1. Hyperscreen
  57. 3.14.2. FLD
  58. 3.14.3. FLI
  59. 3.14.4. Linecrunch
  60. 3.14.5. Verdoppelte Textzeilen
  61. 3.14.6. DMA-Delay
  62. 3.14.7. Sprite-Stretching
  63. 4. Die Adressen 0 und 1 und der $de00-Bereich
  64.  
  65. Anhang A: Literaturverzeichnis
  66.  
  67.  
  68.  
  69. 1. Einleitung
  70. -------------
  71.  
  72. Dieser Artikel ist der Versuch, die Ergebnisse der zahlreichen
  73. Untersuchungen ⁿber den Grafikchip "6567/6569 Video Interface Controller
  74. (VIC-II)" (im folgenden einfach "VIC" genannt), der im legendΣren Commodore
  75. 64 zum Einsatz kommt, zu ordnen und damit eine umfassende Referenz ⁿber
  76. dessen spezifizierte und nicht spezifizierte Eigenschaften zur Verfⁿgung zu
  77. stellen. Er richtet sich erster Linie an C64-Programmierer und Autoren von
  78. C64-Emulationen, allerdings sollte die Lektⁿre auch fⁿr "Au▀enstehende",
  79. die sich fⁿr Hardwaredesign und -programmierung und die Ausnutzung eines
  80. Computers bis zum letzten Bit interessieren, aufschlu▀reich sein. Aus
  81. diesem Grund wurden auch einige Grundlagen mit aufgenommen, die fⁿr
  82. erfahrene C64-Programmierer ein alter Hut sind (z.B. die
  83. Speicheraufteilung).
  84.  
  85. Die Beschreibung der nicht spezifizierten Eigenschaften basiert auf
  86. Messungen, die Marko MΣkelΣ, Andreas Boose, Pasi Ojala, Wolfgang Lorenz und
  87. ich (und zahlreiche Ungenannte) im Laufe der letzten Jahre vorgenommen
  88. haben. Dabei werden auch interne Register und AblΣufe im VIC angesprochen.
  89. Da die Innenschaltung des VIC nicht zur Verfⁿgung steht, kann es sich dabei
  90. natⁿrlich nur um Spekulationen handeln, aber es wurde in allen FΣllen ein
  91. Modell gewΣhlt, das die beobachteten PhΣnomene mit dem geringsten
  92. Schaltungsaufwand erklΣrt. So wurde z.B. beim VideomatrixzΣhler (VC) einem
  93. Modell mit zwei einfachen ZΣhlern einem aufwendigeren mit einem
  94. +40-Addierer der Vorzug gegeben.
  95.  
  96. Obwohl einige Messungen mit einem Oszilloskop direkt am Chip stattfanden,
  97. beruhen die meisten Erkenntnisse jedoch auf Testprogrammen auf dem C64 und
  98. deren Vergleich mit der Implementierung in Einzelzyklusemulationen wie
  99. "Frodo-II".
  100.  
  101.  
  102. 2. Die Architektur des Commodore 64
  103. -----------------------------------
  104.  
  105. Dieses Kapitel behandelt den grundlegenden Hardwareaufbau des C64 und die
  106. Anbindung des VIC an den Rest des Systems.
  107.  
  108. 2.1. ▄bersicht
  109. --------------
  110.  
  111. Der C64 besteht im Wesentlichen aus folgenden Baugruppen:
  112.  
  113.  ╖ 6510 8-Bit Mikroprozessor
  114.  ╖ 6567/6569 VIC-II Grafikchip
  115.  ╖ 6581 SID Soundchip
  116.  ╖ Zwei 6526 CIA I/O-Chips
  117.  ╖ 64KB DRAM (64K*8 Bit) als Hauptspeicher
  118.  ╖ 0,5KB SRAM (1K*4 Bit) als Farb-RAM
  119.  ╖ 16KB ROM (16K*8 Bit) fⁿr Betriebssystem und Basic-Interpreter
  120.  ╖ 4KB ROM (4K*8 Bit) als Zeichengenerator
  121.  
  122. Die meisten Chips sind in NMOS-Technologie gefertigt.
  123.  
  124. 2.2. 6510 Prozessor
  125. -------------------
  126.  
  127. Der 6510-Mikroprozessor [1] besitzt einen 8-Bit-Daten- und 16-Bit-Adressbus
  128. und ist zum bekannten 6502 binΣrkompatibel. Er verfⁿgt ⁿber zwei externe
  129. Interruptm÷glichkeiten (eine nicht maskierbare (IRQ) und eine maskierbare
  130. (NMI)) und als Besonderheit einen 6 Bit breiten bidirektionalen I/O-Port.
  131. Er wird im C64 mit einer Taktfrequenz von ca. 1MHz betrieben.
  132.  
  133. Wichtige Signale:
  134.  
  135. °2     Prozessortakt Ausgang
  136.        Dieses Taktsignal ist die Grundlage des gesamten Bus-Timing. Seine
  137.        Frequenz betrΣgt 1022,7 kHz (NTSC-Rechner) bzw. 985,248 kHz
  138.        (PAL-Rechner). Eine Periode dieses Signals entspricht einem
  139.        Taktzyklus, der aus zwei Phasen besteht: WΣhrend der ersten
  140.        Taktphase ist °2 Low, wΣhrend der zweiten Phase Hight (daher auch
  141.        der Name °2 fⁿr "Phase 2"). Der 6510 greift nur wΣhrend der zweiten
  142.        Taktphase auf den Bus zu, der VIC normalerweise wΣhrend der ersten
  143.        Phase.
  144.  
  145. R/W    Dieses Signal zeigt einen Lese- (R/W High) oder Schreibzugriff (R/W
  146.        Low) an.
  147.  
  148. IRQ    Ist dieser Eingang auf Low-Pegel, wird eine Interruptbearbeitung
  149.        ausgel÷st, sofern der Interrupt ⁿber ein Bit im Statusregister
  150.        freigegeben wurde. Die Unterbrechung erfolgt frⁿhestens nach zwei
  151.        Taktzyklen beim Erreichen des nΣchsten Befehls. Mit diesem Pin kann
  152.        der VIC einen Interrupt im Prozessor ausl÷sen.
  153.  
  154. RDY    Ist diese Leitung wΣhrend eines Lesezugriffs Low, hΣlt der Prozessor
  155.        an und gibt auf Adre▀leitungen die Adresse, auf die zugegriffen
  156.        werden sollte, aus. Bei Schreibzugriffen wird das Signal ignoriert.
  157.        Im C64 wird RDY benutzt, um den Prozessor anzuhalten, wenn der VIC
  158.        fⁿr den Zeichenzeiger- und Spritedatenzugriff zusΣtzliche Buszyklen
  159.        ben÷tigt. Es ist direkt mit dem Signal BA des VIC verbunden.
  160.  
  161. AEC    Mit diesem Pin werden die Adre▀leitungen hochohmig geschaltet. Dies
  162.        dient dazu, den Prozessoradre▀bus bei Zugriffen des VIC lahmzulegen.
  163.        Das Signal ist mit dem Ausgang AEC des VIC verbunden.
  164.  
  165. P0-P5  Dies ist der eingebaute 6-Bit-I/O-Port. Jede Leitung kann einzeln
  166.        als Ein- oder Ausgang programmiert werden. Dazu sind ein
  167.        Datenrichtungsregister bei Adresse 0 und ein Datenregister bei
  168.        Adresse 1 prozessorintern in den Adre▀raum eingeblendet. Daher
  169.        sollte man annehmen, da▀ der Prozessor nicht auf die RAM-Adressen 0
  170.        und 1 zugreifen kann (sie werden ja vom I/O-Port ⁿberlagert), aber
  171.        dazu spΣter mehr...
  172.  
  173. 2.3. 6567/6569 Grafikchip
  174. -------------------------
  175.  
  176. Die Grafikchips der 656*-Reihe von MOS Technologies wurden ursprⁿnglich fⁿr
  177. den Einsatz in Videospielen und Grafikterminals entwickelt. Da der Absatz
  178. in diesen MΣrkten jedoch eher bescheiden war, entschlo▀ sich Commodore, als
  179. sie eigene Heimcomputer planten, die Chips dafⁿr zu verwenden.
  180.  
  181. Im C64 fand der "Video Interface Controller II (VIC-II)" [2] Verwendung,
  182. der 3 textbasierte (40╫25 Zeichen mit je 8╫8 Pixeln) und 2 bitmapbasierte
  183. (320╫200 Pixel) Videomodi beherrscht, ⁿber 8 Hardwaresprites und eine feste
  184. Palette von 16 Farben verfⁿgt und bis zu 16KB dynamisches RAM verwalten
  185. kann (inklusive der Erzeugung von RAS und CAS und dem Refresh des RAM).
  186. Au▀erdem besitzt er noch einen Eingang fⁿr Lichtgriffel und die
  187. M÷glichkeit, Interrupts auszul÷sen.
  188.  
  189. Zwei VIC-Typen kommen im C64 vor: Der 6567 in NTSC-Rechnern und der 6569 in
  190. PAL-Rechnern. Von beiden Typen gibt es mehrere Maskenrevisionen, wovon
  191. allerdings bis auf den 6567R56A die Unterschiede relativ belanglos sind.
  192. In neueren C64-Versionen kommen die gleichwertigen Bausteine 8562 (NTSC)
  193. und 8565 (PAL) zum Einsatz. Im folgenden ist aber immer von 6567/6569 die
  194. Rede. Alle Aussagen lassen sich auf die 856*-Chips ⁿbertragen. Es gibt
  195. au▀erdem noch den 6566, der zum Anschlu▀ an statisches RAM entworfen wurde,
  196. aber fⁿr den C64 keine Rolle spielt.
  197.  
  198. Wichtige Signale:
  199.  
  200. A0-A13  Der 14-Bit-Videoadre▀bus, mit dem der VIC 16KB Speicher adressieren
  201.         kann. Dabei sind die Adre▀bits A0-A5 und A8-A13 jeweils paarweise
  202.         (d.h. A0/A8, A1/A9 etc.) auf einem Pin gemultiplext. Die Bits
  203.         A6-A11 sind (zusΣtzlich) als einzelne Leitungen ausgefⁿhrt.
  204.  
  205. D0-D11  Ein 12 Bit breiter Datenbus, ⁿber den der VIC auf den Speicher
  206.         zugreift. Die unteren 8 Bit sind mit dem Hauptspeicher und dem
  207.         Prozessordatenbus verbunden, die oberen 4 Bit mit einem besonderen
  208.         4 Bit breiten statischen Speicher (1024 Adressen, A0-A9), in dem
  209.         Farbinformationen gespeichert werden, dem Farb-RAM.
  210.  
  211. IRQ     Dieser Ausgang ist an den IRQ-Eingang des Prozessors angeschlossen
  212.         und gibt dem VIC die M÷glichkeit, Interrupts zu erzeugen. Der VIC
  213.         hat vier Interruptm÷glichkeiten: Beim Erreichen einer bestimmten
  214.         Rasterzeile (Rasterinterrupt), bei der Kollision von zwei Sprites
  215.         untereinander, bei der Kollision von Sprites mit Grafikdaten und
  216.         bei einer negativen Flanke am Lichtgriffel-Eingang.
  217.  
  218. BA      Mit diesem Signal zeigt der VIC an, da▀ der Bus fⁿr den Prozessor
  219.         in der zweiten Taktphase (°2 High) zu Verfⁿgung steht.
  220.         Normalerweise ist BA High, da der VIC meistens nur wΣhrend der
  221.         ersten Phase zugreift. Fⁿr die Zeichenzeiger- und
  222.         Spritedatenzugriffe ben÷tigt der VIC den Bus jedoch auch wΣhrend
  223.         der zweiten Phase. In diesem Fall geht BA drei Zyklen bevor der VIC
  224.         zugreift auf Low, danach bleibt AEC auch wΣhrend der zweiten Phase
  225.         Low und der VIC greift zu. Warum drei Zyklen? Wie bereits
  226.         beschrieben, ist BA mit der RDY-Leitung des Prozessors verbunden,
  227.         aber diese Leitung wird nur bei Lesezugriffen abgefragt, der
  228.         Prozessor kann bei Schreibzugriffen nicht unterbrochen werden.
  229.         Allerdings fⁿhrt der 6510 nie mehr als drei Schreibzugriffe
  230.         hintereinander aus (siehe dazu [5]).
  231.  
  232. AEC     Dieser Pin ist mit den gleichnamigen Signal des Prozessors
  233.         verbunden (siehe dort). Es gibt den Status der Daten- und
  234.         Adre▀bustreiber des VIC wieder. Bei High befinden sie sich im
  235.         Tri-State. Normalerweise ist AEC wΣhrend der ersten Taktphase (°2
  236.         Low) Low und wΣhrend der zweiten Phase High, entsprechend dem
  237.         Schema, da▀ der VIC wΣhrend der ersten Phase auf den Speicher
  238.         zugreift und der 6510 wΣhrend der zweiten Phase. Wenn der VIC auch
  239.         wΣhrend der zweiten Taktphase zugreift, bleibt AEC Low.
  240.  
  241. LP      Dieser Eingang ist fⁿr den Anschlu▀ eines Lichtgriffels vorgesehen.
  242.         Bei einer negativen Flanke wird die aktuelle Position des
  243.         Rasterstrahls in den Registern LPX und LPY gelatcht. Da dieser Pin
  244.         im C64 eine Leitung der Tastaturmatrix mitbenutzt, lΣ▀t er sich
  245.         auch per Software ansprechen.
  246.  
  247. °IN     Hier liegt der Pixeltakt von 8,18 MHz (NTSC) bzw. 7,88 MHz (PAL)
  248.         an, der aus der Quarzfrequenz gewonnen wird. Pro Bustaktzyklus (°2)
  249.         werden acht Pixel ausgegeben.
  250.  
  251. °0      Aus dem Pixeltakt an °IN erzeugt der VIC durch Teilung durch acht
  252.         den Systemtakt von 1,023 MHz (NTSC) bzw. 0,985 MHz (PAL), der an
  253.         diesem Pin ausgegeben wird und an den Prozessor geht. Dieser
  254.         erzeugt daraus das Signal °2.
  255.  
  256. 2.4. Speicher
  257. -------------
  258.  
  259. Fⁿr die Grafik spielen drei Speicherbereiche im C64 eine Rolle:
  260.  
  261.  ╖ Die 64KB Hauptspeicher
  262.  ╖ Das 1K*4 Bit Farb-RAM
  263.  ╖ Das 4KB Zeichengenerator-ROM (Char-ROM)
  264.  
  265. In den folgenden beiden Kapiteln wird dargestellt, wie sich diese
  266. Speicherbereiche den Adre▀raum aus Sicht der CPU und des VIC teilen.
  267. Anschlie▀end wird auf die Grundlagen des Speicherzugriffs und des
  268. DRAM-Handling eingegangen.
  269.  
  270. 2.4.1 Speicheraufteilung aus Sicht des 6510
  271. -------------------------------------------
  272.  
  273. Der 6510 kann mit seinen 16 Adre▀leitungen 64KB linear adressieren. Mit
  274. Hilfe eines speziellen PAL-Bausteins im C64 k÷nnen ⁿber die Leitungen des
  275. 6510-I/O-Ports und ⁿber Steuersignale am Erweiterungsport viele
  276. verschiedene Speicherkonfigurationen eingestellt werden (siehe dazu [3]).
  277. Hier soll jedoch nur die Standardeinstellung beschrieben werden. Die
  278. anderen Konfigurationen Σndern die Lage der verschiedenen Bereiche nicht,
  279. sondern blenden nur zusΣtzliche Bereiche des Hauptspeichers ein.
  280.  
  281. Hier also die Speicherkarte aus Sicht des 6510:
  282.  
  283.  
  284.                              Der Bereich von $d000-$e000 bei
  285.                                   CHAREN=1     CHAREN=0
  286.  
  287.  $ffff +--------------+  /$e000 +----------+  +----------+
  288.        |  Kernal-ROM  | /       |  I/O  2  |  |          |
  289.  $e000 +--------------+/  $df00 +----------+  |          |
  290.        |I/O, Char-ROM |         |  I/O  1  |  |          |
  291.  $d000 +--------------+\  $de00 +----------+  |          |
  292.        |     RAM      | \       |  CIA  2  |  |          |
  293.  $c000 +--------------+  \$dd00 +----------+  |          |
  294.        |  Basic-ROM   |         |  CIA  1  |  |          |
  295.  $a000 +--------------+   $dc00 +----------+  | Char-ROM |
  296.        |              |         | Farb-RAM |  |          |
  297.        .     RAM      .         |          |  |          |
  298.        .              .   $d800 +----------+  |          |
  299.        |              |         |   SID-   |  |          |
  300.  $0002 +--------------+         | Register |  |          |
  301.        | I/O-Port DR  |   $d400 +----------+  |          |
  302.  $0001 +--------------+         |   VIC-   |  |          |
  303.        | I/O-Port DDR |         | Register |  |          |
  304.  $0000 +--------------+   $d000 +----------+  +----------+
  305.  
  306.  
  307. Die 64KB Hautpspeicher stehen im Prinzip linear zur Verfⁿgung, aber sie
  308. sind an verschiedenen Stellen von ROM- und Register-Bereichen ⁿberlagert.
  309. Ein Schreibzugriff auf einen ROM-Bereich speichert das Byte im
  310. "darunterliegenden" RAM. Bei Adresse $0000 und $0001 liegen
  311. Datenrichtungsregister und Datenregister des 6510-I/O-Ports.
  312.  
  313. Im Bereich von $d000-$dfff erscheinen wahlweise die Register der I/O-Chips
  314. und das Farb-RAM oder das Zeichengenerator-ROM, je nach Zustand des Signals
  315. CHAREN (dies ist Bit 2 des 6510-I/O-Ports). Das Farb-RAM ist im
  316. Adre▀bereich $d800-$dbff untergebracht und mit den unteren 4 Datenbits
  317. verbunden. Die oberen 4 Datenbits sind offen und liefern beim Lesen
  318. "zufΣllige" Werte. Die beiden mit "I/O 1" und "I/O 2" bezeichneten Bereiche
  319. sind fⁿr Erweiterungskarten reserviert und normalerweise ebenfalls offen,
  320. ein Lesezugriff liefert auch hier "zufΣllige" Daten (das diese Daten gar
  321. nicht so zufΣllig sind, wird in Kapitel 4 noch ausfⁿhrlich erklΣrt. Ein
  322. Lesen von offenen Adressen liefert nΣmlich auf vielen C64 das zuletzt vom
  323. VIC gelesene Byte zurⁿck!).
  324.  
  325. Die 47 Register des VIC sind ab $d000 in den Adre▀raum eingeblendet.
  326. Aufgrund der unvollstΣndigen Dekodierung wiederholen sie sich alle 64 Bytes
  327. im Bereich von $d000-$d3ff.
  328.  
  329. 2.4.2 Speicheraufteilung aus Sicht des VIC
  330. ------------------------------------------
  331.  
  332. Der VIC besitzt nur 14 Adre▀leitungen, kann also nur 16KB Speicher
  333. adressieren. Er kann trotzdem auf die kompletten 64KB Hauptspeicher
  334. zugreifen, denn die 2 fehlenden oberen Adre▀bits werden von einem der
  335. CIA-I/O-Chips zur Verfⁿgung gestellt (es sind dies die invertierten Bits 0
  336. und 1 von Port A der CIA 2). Damit kann jeweils eine von 4 16KB-BΣnken fⁿr
  337. den VIC eingestellt werden.
  338.  
  339. Die (erweiterte) Speicherlandschaft aus Sicht des VIC sieht so aus:
  340.  
  341.  
  342.  $ffff +----------+   --
  343.        |          |
  344.        |          |
  345.        |          |
  346.        |   RAM    | Bank 3
  347.        |          |
  348.        |          |
  349.        |          |
  350.  $c000 +----------+   --
  351.        |          |
  352.        |   RAM    |
  353.        |          |
  354.  $a000 +----------+ Bank 2
  355.        | Char-ROM |
  356.  $9000 +----------+
  357.        |   RAM    |
  358.  $8000 +----------+   --
  359.        |          |
  360.        |          |
  361.        |          |
  362.        |   RAM    | Bank 1
  363.        |          |
  364.        |          |
  365.        |          |
  366.  $4000 +----------+   --
  367.        |          |
  368.        |   RAM    |
  369.        |          |
  370.  $2000 +----------+ Bank 0
  371.        | Char-ROM |
  372.  $1000 +----------+
  373.        |   RAM    |
  374.  $0000 +----------+   --
  375.  
  376.  
  377. Das Char-ROM wird in den BΣnken 0 und 2 jeweils an den VIC-Adressen
  378. $1000-$1fff eingeblendet (in Bank 2 erscheint es in dem Diagramm oben an
  379. Adresse $9000, aber der VIC wei▀ ja nichts von den beiden Adre▀bits, die
  380. noch fⁿr ihn erzeugt werden. Aus seiner Sicht ist das Char-ROM auch in Bank
  381. 2 an $1000-$1fff).
  382.  
  383. Der aufmerksame Leser wird bereits bemerkt haben, da▀ das Farb-RAM
  384. nirgendwo auftaucht, aber erinnern wir uns: Der VIC besitzt einen
  385. 12-Bit-Datenbus dessen obere 4 Bit mit dem Farb-RAM verbunden sind.
  386. ▄berhaupt dienen die oberen 4 Bit des VIC-Datenbus nur dazu, das Farb-RAM
  387. auszulesen. Das Farb-RAM wird ⁿber die unteren 10 Bit des VIC-Adre▀busses
  388. adressiert und steht daher in allen BΣnken an allen Adressen zur Verfⁿgung.
  389.  
  390. 2.4.3 Speicherzugriff von 6510 und VIC
  391. --------------------------------------
  392.  
  393. 6510 und VIC beruhen beide auf einem recht einfachen, festverdrahteten
  394. Design. Beide Chips fⁿhren in JEDEM Taktzyklus einen Speicherzugriff aus,
  395. auch wenn dies gar nicht notwendig ist. Wenn z.B. der Prozessor in einem
  396. Taktzyklus mit einer internen Operation wie der Indexadressierung
  397. beschΣftigt ist, die eigentlich keinen Zugriff erforden wⁿrde, wird
  398. trotzdem ein Lesezugriff ausgefⁿhrt, dessen Ergebnis verworfen wird. Der
  399. VIC greift nur lesend auf den Speicher zu, der 6510 lesend und schreibend.
  400.  
  401. Es gibt keine Waitstates, keine internen Caches und keine aufwendigen
  402. Zugriffsprotokolle auf den Bus, wie sie bei modernen Prozessoren ⁿblich
  403. sind. Jeder Zugriff wird in einem einzigen Zyklus ausgefⁿhrt.
  404.  
  405. Der VIC erzeugt die Taktfrequenzen des Systembus und die RAS- und
  406. CAS-Signale fⁿr den Zugriff auf das dynamische RAM (auch fⁿr den
  407. Prozessor). Er hat daher die primΣre Kontrolle ⁿber den Bus und kann den
  408. Prozessor gelegentlich "betΣuben", wenn er zusΣtzliche Zyklen fⁿr
  409. Speicherzugriffe ben÷tigt. Au▀erdem sorgt der VIC fⁿr den Refresh des DRAM,
  410. indem er in jeder Rasterzeile aus 5 Refresh-Adressen liest.
  411.  
  412. Die Aufteilung der Zugriffe zwischen 6510 und VIC ist zunΣchst einmal
  413. statisch: Jeder Taktzyklus (eine Periode des °2-Signals) ist in zwei Phasen
  414. aufgeteilt. In der ersten Phase (°2 Low) greift der VIC zu, in der zweiten
  415. Phase (°2 High) der Prozessor. Das AEC-Signal schwingt parallel zu °2 mit.
  416. So k÷nnten 6510 und VIC beide abwechselnd den Speicher benutzen, ohne sich
  417. gegenseitig zu st÷ren.
  418.  
  419. Jedoch ben÷tigt der VIC manchmal mehr Zyklen, als dieses Schema ihm
  420. zuteilen wⁿrde. Das ist dann der Fall, wenn der VIC auf die Zeichenzeiger
  421. und auf die Sprite-Daten zugreift. Im ersten Fall werden 40, im zweiten
  422. Fall pro Sprite 2 zusΣtzliche Zyklen ben÷tigt. Dann geht BA 3 Zyklen bevor
  423. der VIC den Bus komplett ⁿbernimmt auf Low (3 Zyklen sind die maximale
  424. Anzahl aufeinanderfolgender Schreibzugriffe beim 6510) und nach 3 Zyklen
  425. bleibt AEC wΣhrend der zweiten Taktphase Low, damit der VIC seine Adressen
  426. anlegen kann.
  427.  
  428. Das folgende Diagramm illustriert den Vorgang der Busⁿbernahme:
  429.  
  430.        _ _ _ _ _ _ _ _ _ _ _ _ _    _ _ _ _ _ _ _ _ _ _ _ _ _
  431.  °2   _ _ _ _ _ _ _ _ _ _ _ _ _ ..._ _ _ _ _ _ _ _ _ _ _ _ _
  432.       ______________                       __________________
  433.  BA                 ____________...________
  434.        _ _ _ _ _ _ _ _ _ _                  _ _ _ _ _ _ _ _ _
  435.  AEC  _ _ _ _ _ _ _ _ _ _ ______..._________ _ _ _ _ _ _ _ _
  436.  
  437.  Chip VPVPVPVPVPVPVPVpVpVpVVVVVV...VVVVVVVVVPVPVPVPVPVPVPVP
  438.  
  439.            1       |  2  |       3        |       4
  440.         Normale    |▄ber-|  VIC hat den   |  VIC gibt den
  441.       BusaktivitΣt |nahme| Bus ⁿbernommen | Bus wieder frei
  442.  
  443.  
  444. Die Zeile "Chip" gibt an, welcher Baustein gerade auf den Bus zugreift (es
  445. findet ja, wie gesagt in jedem Zyklus ein Zugriff statt). "V" steht fⁿr den
  446. VIC, "P" fⁿr den 6510. Die mit "p" gekennzeichneten Zugriffe des Prozessors
  447. werden nur ausgefⁿhrt, wenn sie Schreibzugriffe sind. Der erste
  448. "p"-Lesezugriff hΣlt den 6510 an, spΣtestens nach dem dritten "p", da ja
  449. beim 6510 h÷chstens 3 Schreibzugriffe aufeinanderfolgen k÷nnen. Bei einem
  450. "p"-Lesezugriff werden aber trotzdem die Prozessoradressen auf den Bus
  451. gegeben, denn AEC ist ja noch High.
  452.  
  453. Das Diagramm beschreibt den normalen Verlauf der Busⁿbernahme. Durch
  454. geeignetes VerΣndern des VIC-Registers $d011 ist es m÷glich, eine
  455. Busⁿbernahme zu au▀erordentlichen Zeitpunkten zu erzwingen. Dies sowie das
  456. komplette Bus-Timing einer VIC-Rasterzeile werden in Kapitel 3 erlΣutert.
  457.  
  458.  
  459. 3. Funktionsweise des VIC
  460. -------------------------
  461.  
  462. Dieses Kapitel beschΣftigt sich mit den einzelnen Funktionsgruppen im VIC,
  463. deren Arbeitsweise und Zusammenspiel und deren nicht spezifiziertem
  464. Verhalten und den Einblicken, die dadurch in die internen AblΣufe im VIC
  465. gewonnen werden k÷nnen.
  466.  
  467. 3.1. Blockbild
  468. --------------
  469.  
  470. Das folgende Blockschaltbild gibt eine ▄bersicht ⁿber den inneren Aufbau
  471. des VIC und die unabhΣngig voneinander arbeitenden Funktionsgruppen:
  472.  
  473.  
  474.  IRQ <---------------------------------+
  475.                                        |
  476.             +---------------+ +-----------------+
  477.             | RefreshzΣhler | | Interrupt-Logik |<----------------------+
  478.         +-+ +---------------+ +-----------------+                       |
  479.         |S|    |               ^                                        |
  480.   A     |p|    v               |                                        |
  481.   d     |e|   +-+    +------------+  +-------+                          |
  482.   r     |i|   |A|    |RasterzΣhler|->| VC/RC |                          |
  483.   .     |c|   |d| +->|    X/Y     |  +-------+                          |
  484.   + <==>|h|   |r| |  +------------+      |                              |
  485.   D     |e|   |e| |     | | |            |                              |
  486.   a     |r|   |▀|<--------+--------------+   +-----------------------+  |
  487.   t     |i|   |g|===========================>|40╫12 Bit Videomatrix-/|  |
  488.   e     |n|<=>|e| |     |   |                |       Farbzeile       |  |
  489.   n     |t|   |n| |     |   |                +-----------------------+  |
  490.         |e|   |e| |     |   |                            ||             |
  491.         |r|   |r| |     |   | +----------------+         ||             |
  492.  BA  <--|f|   |a|============>|8╫24 Bit Sprite-|         ||             |
  493.         |a|   |t|<----+ |   | |  datenpuffer   |         ||             |
  494.  AEC <--|c|   |o| |   | v   | +----------------+         ||             |
  495.         |e|   |r| | +-----+ |         ||                 ||             |
  496.         +-+   +-+ | |MC0-7| |         \/                 \/             |
  497.                   | +-----+ |  +--------------+   +--------------+      |
  498.                   |         |  | Spritedaten- |   | Grafikdaten- |      |
  499.         +---------------+   |  |  sequenzer   |   |  sequenzer   |      |
  500.  RAS <--|               |   |  +--------------+   +--------------+      |
  501.  CAS <--| Takterzeugung |   |              |         |                  |
  502.  °0  <--|               |   |              v         v                  |
  503.         +---------------+   |       +-----------------------+           |
  504.                 ^           |       |          MUX          |           |
  505.                 |           |       | SpriteprioritΣten und |-----------+
  506.  °IN -----------+           |       |  Kollisionserkennung  |
  507.                             |       +-----------------------+
  508.    VC: Video Counter,       |                   |
  509.        VideomatrixzΣhler    |                   v
  510.    RC: Row Counter,         |            +-------------+
  511.        ZeilenzΣhler         +----------->| Rahmenstufe |
  512.    MC: MOB Data Counter,    |            +-------------+
  513.        SpritedatenzΣhler    |                   |
  514.                             v                   v
  515.                     +----------------+  +---------------+
  516.                     | Sync-Erzeugung |  | Farberzeugung |<-------- °COLOR
  517.                     +----------------+  +---------------+
  518.                                    |      |
  519.                                    v      v
  520.                                  Videoausgang
  521.                                (S/LUM und COLOR)
  522.  
  523.  
  524. Die Baugruppe fⁿr die Lightpen-Funktionen ist nicht dargestellt.
  525.  
  526. Wie man sieht, kommt dem "RasterzΣhler X/Y" eine zentrale Aufgabe zu.
  527. Logisch, denn sΣmtliche Darstellungen am Bildschirm und alle Buszugriffe
  528. orientieren sich darⁿber.
  529.  
  530. Wichtig ist, zu bemerken, da▀ sowohl bei den Sprites als auch bei der
  531. Grafik die Funktionen fⁿr die Darstellung und die dafⁿr n÷tigen
  532. Speicherzugriffe getrennt voneinander sind. Zwischen den beiden steht
  533. jeweils ein Datenpuffer, der die gelesenen Grafikdaten aufnimmt und fⁿr die
  534. Verwendung durch die Schaltkreise zur Darstellung zwischenspeichert. Im
  535. normalen Betrieb des VIC ist die Funktion der beiden Kreise so aufeinander
  536. abgestimmt, da▀ sie wie ein einziger Funktionsblock wirken. Man kann jedoch
  537. durch geeignete Programmierung die Kreise voneinander entkoppeln und z.B.
  538. Grafik darstellen lassen, ohne da▀ vorher Daten gelesen wurden (in diesem
  539. Fall werden die noch im Puffer stehenden Daten angezeigt).
  540.  
  541. 3.2. Register
  542. -------------
  543.  
  544. Der VIC besitzt 47 Schreib-/Leseregister zur Steuerung seiner Funktionen
  545. durch den Prozessor:
  546.  
  547.  #| Adr.  |Bit7|Bit6|Bit5|Bit4|Bit3|Bit2|Bit1|Bit0| Funktion
  548. --+-------+----+----+----+----+----+----+----+----+------------------------
  549.  0| $d000 |                  M0X                  | X-Koordinate Sprite 0
  550. --+-------+---------------------------------------+------------------------
  551.  1| $d001 |                  M0Y                  | Y-Koordinate Sprite 0
  552. --+-------+---------------------------------------+------------------------
  553.  2| $d002 |                  M1X                  | X-Koordinate Sprite 1
  554. --+-------+---------------------------------------+------------------------
  555.  3| $d003 |                  M1Y                  | Y-Koordinate Sprite 1
  556. --+-------+---------------------------------------+------------------------
  557.  4| $d004 |                  M2X                  | X-Koordinate Sprite 2
  558. --+-------+---------------------------------------+------------------------
  559.  5| $d005 |                  M2Y                  | Y-Koordinate Sprite 2
  560. --+-------+---------------------------------------+------------------------
  561.  6| $d006 |                  M3X                  | X-Koordinate Sprite 3
  562. --+-------+---------------------------------------+------------------------
  563.  7| $d007 |                  M3Y                  | Y-Koordinate Sprite 3
  564. --+-------+---------------------------------------+------------------------
  565.  8| $d008 |                  M4X                  | X-Koordinate Sprite 4
  566. --+-------+---------------------------------------+------------------------
  567.  9| $d009 |                  M4Y                  | Y-Koordinate Sprite 4
  568. --+-------+---------------------------------------+------------------------
  569. 10| $d00a |                  M5X                  | X-Koordinate Sprite 5
  570. --+-------+---------------------------------------+------------------------
  571. 11| $d00b |                  M5Y                  | Y-Koordinate Sprite 5
  572. --+-------+---------------------------------------+------------------------
  573. 12| $d00c |                  M6X                  | X-Koordinate Sprite 6
  574. --+-------+---------------------------------------+------------------------
  575. 13| $d00d |                  M6Y                  | Y-Koordinate Sprite 6
  576. --+-------+---------------------------------------+------------------------
  577. 14| $d00e |                  M7X                  | X-Koordinate Sprite 7
  578. --+-------+---------------------------------------+------------------------
  579. 15| $d00f |                  M7Y                  | Y-Koordinate Sprite 7
  580. --+-------+----+----+----+----+----+----+----+----+------------------------
  581. 16| $d010 |M7X8|M6X8|M5X8|M4X8|M3X8|M2X8|M1X8|M0X8| MSBs der X-Koordinaten
  582. --+-------+----+----+----+----+----+----+----+----+------------------------
  583. 17| $d011 |RST8| ECM| BMM| DEN|RSEL|    YSCROLL   | Steuerregister 1
  584. --+-------+----+----+----+----+----+--------------+------------------------
  585. 18| $d012 |                 RASTER                | RasterzΣhler
  586. --+-------+---------------------------------------+------------------------
  587. 19| $d013 |                  LPX                  | Lichtgriffel X
  588. --+-------+---------------------------------------+------------------------
  589. 20| $d014 |                  LPY                  | Lichtgriffel Y
  590. --+-------+----+----+----+----+----+----+----+----+------------------------
  591. 21| $d015 | M7E| M6E| M5E| M4E| M3E| M2E| M1E| M0E| Sprite angeschaltet
  592. --+-------+----+----+----+----+----+----+----+----+------------------------
  593. 22| $d016 |  - |  - | RES| MCM|CSEL|    XSCROLL   | Steuerregister 2
  594. --+-------+----+----+----+----+----+----+----+----+------------------------
  595. 23| $d017 |M7YE|M6YE|M5YE|M4YE|M3YE|M2YE|M1YE|M0YE| Sprite Y-Expansion
  596. --+-------+----+----+----+----+----+----+----+----+------------------------
  597. 24| $d018 |VM13|VM12|VM11|VM10|CB13|CB12|CB11|  - | Speicherzeiger
  598. --+-------+----+----+----+----+----+----+----+----+------------------------
  599. 25| $d019 | IRQ|  - |  - |  - | ILP|IMMC|IMBC|IRST| Interruptregister
  600. --+-------+----+----+----+----+----+----+----+----+------------------------
  601. 26| $d01a |  - |  - |  - |  - | ELP|EMMC|EMBC|ERST| Interrupt angeschaltet
  602. --+-------+----+----+----+----+----+----+----+----+------------------------
  603. 27| $d01b |M7DP|M6DP|M5DP|M4DP|M3DP|M2DP|M1DP|M0DP| Sprite-Daten-PrioritΣt
  604. --+-------+----+----+----+----+----+----+----+----+------------------------
  605. 28| $d01c |M7MC|M6MC|M5MC|M4MC|M3MC|M2MC|M1MC|M0MC| Sprite Multicolor
  606. --+-------+----+----+----+----+----+----+----+----+------------------------
  607. 29| $d01d |M7XE|M6XE|M5XE|M4XE|M3XE|M2XE|M1XE|M0XE| Sprite X-Expansion
  608. --+-------+----+----+----+----+----+----+----+----+------------------------
  609. 30| $d01e | M7M| M6M| M5M| M4M| M3M| M2M| M1M| M0M| Sprite-Sprite-Kollision
  610. --+-------+----+----+----+----+----+----+----+----+------------------------
  611. 31| $d01f | M7D| M6D| M5D| M4D| M3D| M2D| M1D| M0D| Sprite-Daten-Kollision
  612. --+-------+----+----+----+----+----+----+----+----+------------------------
  613. 32| $d020 |  - |  - |  - |  - |         EC        | Rahmenfarbe
  614. --+-------+----+----+----+----+-------------------+------------------------
  615. 33| $d021 |  - |  - |  - |  - |        B0C        | Hintergrundfarbe 0
  616. --+-------+----+----+----+----+-------------------+------------------------
  617. 34| $d022 |  - |  - |  - |  - |        B1C        | Hintergrundfarbe 1
  618. --+-------+----+----+----+----+-------------------+------------------------
  619. 35| $d023 |  - |  - |  - |  - |        B2C        | Hintergrundfarbe 2
  620. --+-------+----+----+----+----+-------------------+------------------------
  621. 36| $d024 |  - |  - |  - |  - |        B3C        | Hintergrundfarbe 3
  622. --+-------+----+----+----+----+-------------------+------------------------
  623. 37| $d025 |  - |  - |  - |  - |        MM0        | Sprite Multicolor 0
  624. --+-------+----+----+----+----+-------------------+------------------------
  625. 38| $d026 |  - |  - |  - |  - |        MM1        | Sprite Multicolor 1
  626. --+-------+----+----+----+----+-------------------+------------------------
  627. 39| $d027 |  - |  - |  - |  - |        M0C        | Farbe Sprite 0
  628. --+-------+----+----+----+----+-------------------+------------------------
  629. 40| $d028 |  - |  - |  - |  - |        M1C        | Farbe Sprite 1
  630. --+-------+----+----+----+----+-------------------+------------------------
  631. 41| $d029 |  - |  - |  - |  - |        M2C        | Farbe Sprite 2
  632. --+-------+----+----+----+----+-------------------+------------------------
  633. 42| $d02a |  - |  - |  - |  - |        M3C        | Farbe Sprite 3
  634. --+-------+----+----+----+----+-------------------+------------------------
  635. 43| $d02b |  - |  - |  - |  - |        M4C        | Farbe Sprite 4
  636. --+-------+----+----+----+----+-------------------+------------------------
  637. 44| $d02c |  - |  - |  - |  - |        M5C        | Farbe Sprite 5
  638. --+-------+----+----+----+----+-------------------+------------------------
  639. 45| $d02d |  - |  - |  - |  - |        M6C        | Farbe Sprite 6
  640. --+-------+----+----+----+----+-------------------+------------------------
  641. 46| $d02e |  - |  - |  - |  - |        M7C        | Farbe Sprite 7
  642. --+-------+----+----+----+----+-------------------+------------------------
  643.  
  644. Hinweise:
  645.  
  646.  ╖ Die mit '-' gekennzeichneten Bits sind unbelegt. Beim Lesen liefern sie
  647.    eine "1"
  648.  ╖ Die VIC-Register wiederholen sich im Bereich $d000-$d3ff alle 64 Bytes,
  649.    d.h. Register 0 ist an Adresse $d000, $d040, $d080 etc. verfⁿgbar
  650.  ╖ Die nicht belegten Adressen $d02f-$d03f liefern beim Lesen den Wert $ff,
  651.    ein Schreibzugriff ist ohne Wirkung
  652.  ╖ Die Register $d01e und $d01f sind nicht beschreibbar und werden bei
  653.    einem Lesezugriff automatisch gel÷scht
  654.  ╖ Das RES-Bit (Bit 5) von Register $d016 ist bei den bisher untersuchten
  655.    VIC 6567/6569 ohne Funktion. Beim 6566 dient dieses Bit dazu, den VIC zu
  656.    stoppen.
  657.  ╖ Bit 7 in Register $d011 (RST8) ist Bit 8 von Register $d012. Beide
  658.    zusammen werden im folgenden mit "RASTER" bezeichnet. Ein Schreibzugriff
  659.    in diese Bits legt die Vergleichszeile fⁿr den Rasterinterrupt fest
  660.    (siehe Kapitel 3.12.).
  661.  ╖ Bis auf das DEN-Bit in Register $d011 wirken alle RegisterΣnderungen im
  662.    allgemeinen sofort. So kann z.B. die Rahmenfarbe mit Register $d020
  663.    mitten im Bild geΣndert werden.
  664.  
  665. 3.3. Farbpalette
  666. ----------------
  667.  
  668. Der VIC besitzt eine fest vorgegebene Palette von 16 Farben, die ⁿber 4 Bit
  669. kodiert sind:
  670.  
  671.   0 schwarz
  672.   1 wei▀
  673.   2 rot
  674.   3 cyan
  675.   4 lila
  676.   5 grⁿn
  677.   6 blau
  678.   7 gelb
  679.   8 orange
  680.   9 braun
  681.  10 hellrot
  682.  11 dunkelgrau
  683.  12 mittelgrau
  684.  13 hellgrⁿn
  685.  14 hellblau
  686.  15 hellgrau
  687.  
  688. 3.4. Bildaufbau und Ausma▀e des Bildausschnittes
  689. ------------------------------------------------
  690.  
  691. Wie bei der Ansteuerung von Kathodenstrahlr÷hren ⁿblich baut der VIC das
  692. Videobild zeilenweise auf. Die Zeilenzahl und die Anzahl Taktzyklen pro
  693. Zeile sind bei jedem VIC-Typ konstant. Der VIC arbeitet zeichenbasiert,
  694. jedes Zeichen besteht aus einer Matrix von 8╫8 Pixeln, entsprechend eine
  695. Textzeile aus 8 Pixelzeilen. In den textbasierten Modi werden 40╫25
  696. Textzeichen dargestellt, in den Bitmap-Modi 320╫200 oder 160╫200 Pixel.
  697.  
  698. Die Angabe einer Position auf dem Bildschirm erfolgt in diesem Artikel
  699. durch die Nummer der Rasterzeile als Y-Koordinate (RASTER, Register
  700. $d011/$d012) und eine X-Koordinate entsprechend dem
  701. Sprite-Koordinatensystem. Bei der Angabe des Zeitpunktes eines
  702. VIC-Speicherzugriffs oder einer internen Operation im VIC werden die
  703. Rasterzeilennummer als Y-Koordinate und die Nummer des Taktzyklus innerhalb
  704. der Zeile als X-Koordinate benutzt. Wie bereits erwΣhnt, kommen auf einen
  705. Taktzyklus 8 Pixel, die Angabe einer Sprite-X-Koordinate ist also achtmal
  706. so genau wie die der Zyklusnummer.
  707.  
  708. Die Grafikdarstellung findet in einem nicht verschieblichen Fenster in der
  709. Mitte des sichtbaren Bildbereiches statt, dem "Anzeigefenster". Der Bereich
  710. au▀erhalb des Anzeigefensters bildet den Bildschirmrahmen und wird in der
  711. Rahmenfarbe (EC, Register $d020) dargestellt. Man kann den Rahmen mit einem
  712. Trick auch ganz oder teilweise ausschalten; dann erkennt man, da▀ das
  713. Anzeigefenster Teil einer "Anzeigespalte" ist, die sich aus der
  714. geradlinigen Erweiterung nach oben und unten ergibt. Damit kann man auch
  715. den Rahmen in einen oberen/unteren und einen linken/rechten Rahmen
  716. aufteilen. der sichtbare Bildbereich ist horizontal und vertikal von
  717. Austastlⁿcken umgeben, in denen die Videoausgabe abgeschaltet ist und in
  718. denen der Rasterstrahl an den Anfang der nΣchsten Zeile bzw. an den Anfang
  719. des Bildes zurⁿckkehrt
  720.  
  721. Die folgende Abbildung (nicht ma▀stΣblich) illustriert den letzten Absatz:
  722.  
  723.  
  724.                Sichtbare Pixel/Zeile
  725.      ____________________|___________________
  726.     /                                        \
  727.  
  728. +------------------------------------------------+  <- Rasterzeile 0 (6569)
  729. |       .                                .       |
  730. |       .     Vertikale Austastlⁿcke     .       |
  731. |       .                                .       |
  732. +---+---+--------------------------------+---+---+  \
  733. |   |   |                                |   |   |  |
  734. |   |   |         oberer Rahmen          |   |   |  |
  735. |   |   |                                |   |   |  |
  736. | h |   +--------------------------------+   | h |  |
  737. | o |   |                                |   | o |  |
  738. | r |   |                                |   | r |  |
  739. | i |   |                                |   | i |  |
  740. | z |   |                                |   | z |  |
  741. | o | l |                                | r | o |  |
  742. | n | i |                                | e | n |  |
  743. | t | n |                                | c | t |  |
  744. | a | k |                                | h | a |  |
  745. | l | e |                                | t | l |  |
  746. | e | r |                                | e | e |  |
  747. |   |   |         Anzeigefenster         | r |   |  |- Sichtbare Zeilen
  748. | A | R |                                |   | A |  |
  749. | u | a |                                | R | u |  |
  750. | s | h |                                | a | s |  |
  751. | t | m |                                | h | t |  |
  752. | a | e |                                | m | a |  |
  753. | s | n |                                | e | s |  |
  754. | t |   |                                | n | t |  |
  755. | l |   |                                |   | l |  |
  756. | ⁿ |   |                                |   | ⁿ |  |
  757. | c |   |                                |   | c |  |
  758. | k |   |                                |   | k |  |
  759. | e |   +--------------------------------+   | e |  |
  760. |   |   |                                |   |   |  |
  761. |   |   |         unterer Rahmen         |   |   |  | <- Rasterzeile 0 (6567)
  762. |   |   |                                |   |   |  |
  763. +---+---+--------------------------------+---+---+  /
  764. |       .                                .       |
  765. |       .     Vertikale Austastlⁿcke     .       |
  766. |       .                                .       |
  767. +------------------------------------------------+
  768.  
  769.       ^ \________________________________/
  770.       |                 |
  771.       |           Anzeigespalte
  772.       |
  773.  X-Koordinate 0
  774.  
  775.  
  776. ▄ber die Bits RSEL und CSEL in den Registern $d011 und $d016 lassen sich
  777. fⁿr die H÷he und Breite des Anzeigefensters jeweils zwei verschiedene Werte
  778. einstellen:
  779.  
  780.  RSEL| H÷he des Anzeigefensters | Erste Zeile | Letzte Zeile
  781.  ----+--------------------------+-------------+-------------
  782.    0 | 24 Textzeilen/192 Pixel  |   55 ($37)  |  246 ($f6)
  783.    1 | 25 Textzeilen/200 Pixel  |   51 ($33)  |  250 ($fa)
  784.  
  785.  CSEL| Breite des Anzeigefensters | Erste X-Koo. | Letzte X-Koo.
  786.  ----+----------------------------+--------------+--------------
  787.    0 | 38 Zeichen/304 Pixel       |   31 ($1f)   |  334 ($14e)
  788.    1 | 40 Zeichen/320 Pixel       |   24 ($18)   |  343 ($157)
  789.    
  790. Bei RSEL=0 werden der obere und untere Rahmen um jeweils 4 Pixel in das
  791. Anzeigefenster hinein verbreitert, bei CSEL=0 der linke Rahmen um 7 Pixel
  792. und der rechte um 9 Pixel. Die Position der Grafik im Anzeigefenster und
  793. deren Aufl÷sung Σndert sich dabei nicht, RSEL/CSEL schalten nur Start und
  794. Ende der Rahmendarstellung um. Auch die Gr÷▀e der Videomatrix bleibt
  795. konstant bei 40╫25 Zeichen.
  796.  
  797. Mit XSCROLL/YSCROLL (Bits 0-2 der Register $d011 und $d016) kann man die
  798. Position der Grafik innerhalb des Anzeigefensters pixelweise um bis zu
  799. jeweils 7 Pixel nach rechts und unten verschieben. Damit lΣ▀t sich weiches
  800. Scrolling realisieren. Die Position des Anzeigefensters selbst Σndert sich
  801. dabei nicht. Um die Grafik bⁿndig mit dem Fenster zu halten, sind bei 25
  802. Zeilen/40 Spalten als X/YSCROLL die Werte 3 und 0, bei 24 Zeilen/38 Spalten
  803. jeweils 7 zu wΣhlen.
  804.  
  805. Die Ausma▀e der Videodarstellung bei den verschiedenen VIC-Typen sind wie
  806. folgt:
  807.  
  808.           | Video- | Anzahl | Sichtbare | Zyklen/ |  Sichtbare
  809.     Typ   |  norm  | Zeilen |   Zeilen  |  Zeile  | Pixel/Zeile
  810.  ---------+--------+--------+-----------+---------+------------
  811.  6567R56A | NTSC-M |   262  |    234    |    64   |     411
  812.   6567R8  | NTSC-M |   263  |    235    |    65   |     418
  813.    6569   |  PAL-B |   312  |    284    |    63   |     403
  814.  
  815.           |  Erste   |  Letzte  |              |    Erste   |   Letzte
  816.           | V-Blank- | V-Blank- | Erste X-Koo. |  sichtbare | sichtbare
  817.     Typ   |  Zeile   |  Zeile   | einer Zeile  |    X-Koo.  |   X-Koo.
  818.  ---------+----------+----------+--------------+------------+-----------
  819.  6567R56A |     13   |    40    |  412 ($19c)  | 488 ($1e8) | 388 ($184)
  820.   6567R8  |     13   |    40    |  412 ($19c)  | 489 ($1e9) | 396 ($18c)
  821.    6569   |    300   |    15    |  404 ($194)  | 480 ($1e0) | 380 ($17c)
  822.  
  823. Wer sich bei den ersten und letzten sichtbaren X-Koordinaten wundert, da▀
  824. scheinbar die erste Koordinate nach der letzten liegt: Dies kommt daher,
  825. da▀ als Referenzpunkt fⁿr den Beginn einer Rasterzeile das Auftreten des
  826. Raster-IRQ gewΣhlt wurde, das aber nicht mit der X-Koordinate 0
  827. zusammenfΣllt, sondern mit der unter "Erste X-Koo. einer Zeile"
  828. angegebenen. Die X-Koordinaten laufen innerhalb der Zeile bis $1ff (beim
  829. 6569 nur bis $1f7), dann erst kommt X-Koordinate 0. Bei der ErklΣrung des
  830. Aufbaus einer Rasterzeile wird dies noch genauer erklΣrt.
  831.  
  832. 3.5. Bad Lines
  833. --------------
  834.  
  835. Wie schon erwΣhnt, ben÷tigt der VIC beim Zugriff auf die Zeichenzeiger
  836. (d.h. die Zeichencodes einer Textzeile aus der Videomatrix) 40 zusΣtzliche
  837. Buszyklen, denn die 63-65 dem VIC pro Rasterzeile fⁿr einen transparenten
  838. (vom Prozessor unbemerkten) Zugriff wΣhrend der ersten Taktphase zur
  839. Verfⁿgung stehenden Zyklen reichen nicht aus, um fⁿr die 40 Zeichen einer
  840. Zeile die Zeichenzeiger und auch noch die Pixeldaten der Zeichen aus dem
  841. Speicher zu lesen.
  842.  
  843. Aus diesem Grund benutzt der VIC wΣhrend der ersten Pixelzeile jeder
  844. Textzeile den in Kapitel 2.4.3. beschriebenen Mechanismus, um den Prozessor
  845. fⁿr 40-43 Zyklen zu "betΣuben", um die Zeichenzeiger lesen zu k÷nnen. Die
  846. Rasterzeilen, in denen dies geschieht, werden gew÷hnlich "Bad Lines"
  847. genannt ("Bad", weil sie den Prozessor anhalten und den Rechner damit
  848. langsamer machen und zu Problemen fⁿhren, wenn es auf das genaue Timing
  849. eines Programms ankommt, wie bei der Datenⁿbertragung zum
  850. Diskettenlaufwerk).
  851.  
  852. Der Zeichenzeigerzugriff findet auch in den Bitmap-Modi statt, denn dort
  853. werden die Daten der Videomatrix fⁿr die Farbinformation benutzt.
  854.  
  855. Normalerweise ist innerhalb des Anzeigefensters beginnend mit der ersten
  856. Zeile der Grafik jede achte Rasterzeile eine Bad Line, jeweils die ersten
  857. Rasterzeilen jeder Textzeile. Daher ist die Position der Bad Lines vom
  858. YSCROLL abΣngig. Wie sich noch zeigen wird, basiert der gesamte
  859. Grafikaufbau und das Zugriffsschema auf den Grafikspeicher auf der Position
  860. der Bad Lines.
  861.  
  862. Aus diesem Grund ist es notwendig, eine allgemeinere Definition
  863. einzufⁿhren, nΣmlich die des "Bad-Line-Zustands":
  864.  
  865.  Ein Bad-Line-Zustand liegt in einem beliebigen Taktzyklus vor, wenn an der
  866.  negativen Flanke von °0 zu Beginn des Zyklus RASTER >= $30 und RASTER <=
  867.  $f7 und die unteren drei Bits von RASTER mit YSCROLL ⁿbereinstimmen und in
  868.  einem beliebigen Zyklus von Rasterzeile $30 das DEN-Bit gesetzt war.
  869.  
  870. Diese Definition ist w÷rtlich zu nehmen. Man kann durch VerΣndern von
  871. YSCROLL mehrfach innerhalb einer beliebigen Rasterzeile im Bereich $30-$f7
  872. einen Bad-Line-Zustand erzeugen und wieder wegnehmen und damit jede
  873. Rasterzeile innerhalb des Anzeigefensters ganz oder teilweise zur Bad Line
  874. machen oder die anderen Funktionen ausl÷sen oder unterdrⁿcken, die mit dem
  875. Auftreten des Bad-Line-Zustands zusammenhΣngen. Ist YSCOLL=0 tritt in
  876. Rasterzeile $30 ein Bad-Line-Zustand auf, sobald das DEN-Bit (Register
  877. $d011, Bit 4) gesetzt wird (fⁿr nΣheres ⁿber das DEN-Bit, siehe Kapitel
  878. 3.10.).
  879.  
  880. Die folgenden drei Kapitel beschreiben die Funktionsgruppen, die zur
  881. Darstellung der Grafik benutzt werden. In Kapitel 3.6. geht es um das
  882. Speicherinterface, mit dem die Grafikdaten gelesen werden, und das Timing
  883. der Zugriffe innerhalb einer Rasterzeile. Kapitel 3.7. handelt von der
  884. Anzeigestufe, die die Daten der Text- und Bitmap-Grafik in Farben umsetzt
  885. und die Adressen fⁿr den Speicherzugriff erzeugt, Kapitel 3.8. behandelt
  886. die Sprites und ihre Adre▀erzeugung.
  887.  
  888. 3.6. Speicherzugriff/Timing einer Rasterzeile
  889. ---------------------------------------------
  890.  
  891. 3.6.1. Die X-Koordinaten
  892. ------------------------
  893.  
  894. Bevor das Timing der Speicherzugriffe innerhalb einer Rasterzeile erlΣutert
  895. wird, soll noch kurz darauf eingegangen werden, woher die angegebenen
  896. X-Koordinaten stammen. Der VIC besitzt nΣmlich zum RASTER-Register, das die
  897. aktuelle Y-Koordinate angibt, kein passendes Gegenstⁿck fⁿr die X-Achse,
  898. man kann die X-Koordinate also nicht einfach direkt mit dem Prozessor
  899. auslesen. Jedoch zΣhlt der VIC intern die X-Koordinaten sehr wohl mit, denn
  900. die horizontale Sprite-Positionierung basiert ja darauf und bei einem
  901. Impuls am Lichtgriffel-Eingang LP wird die aktuelle X-Position im Register
  902. LPX ($d013) gelatcht.
  903.  
  904. Die Bestimmung der absoluten X-Koordinaten von Ereignissen innerhalb einer
  905. Rasterzeile ist nicht trivial, denn man kann nicht einfach z.B. ein Sprite
  906. an eine definierte X-Koordinate bringen und aus den Textzeichen, die an der
  907. gleichen X-Position dargestellt werden, auf die X-Koordinate der zu diesen
  908. Textzeichen geh÷renden Speicherzugriffe schlie▀en. Der Speicherzugriff und
  909. die Darstellung sind getrennte Funktionsgruppen und die gelesenen
  910. Grafikdaten werden nicht direkt auf dem Bildschirm ausgegeben (es besteht
  911. eine Verz÷gerung von 12 Pixeln).
  912.  
  913. Daher wurde anders vorgegangen und eine einzige X-Koordinate mit Hilfe des
  914. LPX-Registers in ihrer absoluten Position innerhalb der Rasterzeile
  915. bestimmt und die anderen X-Koordinaten relativ dazu ermittelt. Dazu wurde
  916. der IRQ-Ausgang des VIC mit dem LP-Eingang verbunden und der VIC auf einen
  917. Rasterzeileninterrupt programmiert. Weil die negative Flanke von IRQ als
  918. Beginn einer Rasterzeile festgelegt wurde, konnte so die absolute
  919. X-Position des Rasterzeilenbeginns ermittelt werden. Die Position der
  920. negativen Flanke von BA wΣhrend einer Bad Line wurde ebenfalls mit dieser
  921. Methode bestimmt und die so erhaltene Position war mit dem relativen
  922. Abstand von IRQ und BA zueinander konsistent. Auf der Grundlage dieser
  923. beiden Messungen wurden die X-Koordinaten aller anderen Ereignisse
  924. innerhalb einer Rasterzeile relativ dazu bestimmt (siehe [4]). Jetzt erst
  925. wurden die Sprite-X-Koordinaten herangezogen, um den Zeitpunkt der
  926. Bilderzeugung der Textzeichen bestimmen zu k÷nnen.
  927.  
  928. Dabei wird natⁿrlich implizit angenommen, da▀ die LPX-Koordinaten mit den
  929. Sprite-X-Koordinaten ⁿbereinstimmen. Es gibt jedoch keinen Hinweis darauf
  930. und somit auch keinen Grund zur Annahme, da▀ sie es nicht tΣten (eine
  931. ▄bereinstimmung der Koordinaten wΣre auch schaltungstechnisch die
  932. einfachste L÷sung).
  933.  
  934. 3.6.2. Zugriffsarten
  935. --------------------
  936.  
  937. Der VIC erzeugt zwei Arten von Grafik, die Zugriffe auf den Speicher
  938. erfordern: Die Text-/Bitmapgrafik (auch oft "Hintergrundgrafik" oder
  939. einfach "Grafik" genannt) und die Spritegrafik. Beide erfordern Zugriffe
  940. auf jeweils zwei getrennte Speicherbereiche.
  941.  
  942. Fⁿr die Text-/Bitmapgrafik:
  943.  
  944.  ╖ Die Videomatrix, ein 1000 Adressen (40╫25 mit je 12 Bit) gro▀er Bereich,
  945.    der sich mit den Bits VM10-VM13 aus Register $d018 in 1KB-Schritten
  946.    innerhalb des 16KB-Adre▀raums des VIC verschieben lΣ▀t. Dort sind in den
  947.    Textmodi die Zeichencodes und deren Farbe und in den Bitmap-Modi die
  948.    Farbinformationen fⁿr 8╫8-Pixel-Blocks abgelegt. Das Farb-RAM ist Teil
  949.    der Videomatrix, es liefert die oberen 4 Bit der 12-Bit-Matrix. Die aus
  950.    der Videomatrix gelesenen Daten werden in einem internen Puffer des VIC,
  951.    der 40╫12 Byte Videomatrix-/Farbzeile gespeichert.
  952.  
  953.  ╖ Den Zeichengenerator bzw. die Bitmap, ein 2048 Bytes (Bitmap: 8192
  954.    Bytes) gro▀er Bereich, der sich mit den Bits CB11-CB13 (Bitmap: nur
  955.    CB13) aus Register $d018 in 2KB-Schritten (Bitmap: 8KB-Schritte)
  956.    innerhalb des VIC-Adre▀raums verschieben lΣ▀t. Dort sind in den Textmodi
  957.    die Pixeldaten der Zeichen und in den Bitmap-Modi die Bitmap
  958.    gespeichert. Der Zeichengenerator hat zunΣchst einmal nichts mit dem
  959.    Char-ROM zu tun. Das Char-ROM enthΣlt lediglich vorgefertigte Bitmuster,
  960.    die als Zeichengenerator dienen k÷nnen, aber man kann den
  961.    Zeichengenerator auch im normalen RAM unterbringen.
  962.  
  963. Fⁿr die Sprites:
  964.  
  965.  ╖ Die Spritedatenzeiger, 8 Bytes hinter dem Ende der Videomatrix, die fⁿr
  966.    jedes Sprite einen von 256 64-Byte-Blocks innerhalb des VIC-Adre▀raums
  967.    fⁿr die Spritedaten auswΣhlen.
  968.  
  969.  ╖ Die Spritedaten, ein 63 Byte gro▀er Bereich, der die Pixeldaten der
  970.    Sprites enthΣlt und fⁿr jedes Sprite einzeln mit Hilfe des
  971.    Spritedatenzeigers in 64-Byte-Schritten verschoben werden kann.
  972.  
  973. Entsprechend macht der VIC 4 verschiedene Arten von Grafikzugriffen:
  974.  
  975. 1. Auf die Videomatrix ("c-Zugriff", 12 Bit breit).
  976. 2. Auf die Pixeldaten, also Zeichengenerator oder Bitmap ("g-Zugriff", 8
  977.    Bit breit).
  978. 3. Auf die Spritedatenzeiger ("p-Zugriff", 8 Bit breit).
  979. 4. Auf die Spritedaten ("s-Zugriff", 8 Bit breit).
  980.  
  981. Daⁿberhinaus fⁿhrt der VIC noch zwei weitere Arten von Zugriffen durch:
  982.  
  983. 5. Zugriffe zum Refresh des dynamischen RAM, 5 Lesezugriffe pro
  984.    Rasterzeile.
  985.  
  986. 6. Idle-Zugriffe. Wie beschrieben, greift der VIC in jeder ersten Taktphase
  987.    zu, obwohl es einige Zyklen gibt, in denen gerade kein anderer der oben
  988.    beschriebenen Zugriffe ansteht. In diesem Fall fⁿhrt der VIC einen
  989.    Idle-Zugriff aus, einen Lesezugriff von Videoadresse $3fff (also je nach
  990.    Bank an Adresse $3fff, $7fff, $bfff oder $ffff), desen Ergebnis
  991.    verworfen wird.
  992.  
  993. 3.6.3. Timing einer Rasterzeile
  994. -------------------------------
  995.  
  996. Die Abfolge der VIC-Speicherzugriffe innerhalb einer Rasterzeile ist fest
  997. vorgegeben, unabhΣngig vom Grafikmodus und fⁿr jede Rasterzeile gleich. Als
  998. Zeilenbeginn wurde die negative Flanke von IRQ bei einem Rasterinterrupt
  999. festgelegt (dies ist auch der Zeitpunkt, an dem das RASTER-Register erh÷ht
  1000. wird). Rasterzeile 0 bildet allerdings eine Ausnahme: Dort finden IRQ und
  1001. Erh÷hen (bzw. Nullsetzen) von RASTER einen Zyklus spΣter statt als in allen
  1002. anderen Zeilen. Der Einfachheit halber wird hier jedoch von konstanten
  1003. ZeilenlΣngen ausgegangen und der Beginn von Rasterzeile 0 als einen Zyklus
  1004. vor dem Auftreten des IRQ definiert.
  1005.  
  1006. Hier zunΣchst die Timing-Diagramme, die ErklΣrung folgt danach:
  1007.  
  1008.  
  1009. 6569, Bad Line, keine Sprites:
  1010.  
  1011. Zykl-# 6                   1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6
  1012.        3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 1
  1013.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
  1014.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
  1015.        __
  1016.    IRQ   ________________________________________________________________________________________________________________________________
  1017.        ________________________                                                                                      ____________________
  1018.     BA                         ______________________________________________________________________________________
  1019.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _                                                                                 _ _ _ _ _ _ _ _ _ _
  1020.    AEC _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _________________________________________________________________________________ _ _ _ _ _ _ _ _ _
  1021.  
  1022.    VIC i 3 i 4 i 5 i 6 i 7 i r r r r rcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcg i i 0 i 1 i 2 i 3
  1023.   6510  x x x x x x x x x x x x X X X                                                                                 x x x x x x x x x x
  1024.  
  1025. Grafik                      |===========01020304050607080910111213141516171819202122232425262728293031323334353637383940=========
  1026.  
  1027. X-Koo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  1028.        1111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111
  1029.        89999aaaabbbbccccddddeeeeff0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff000011112222333344445555666677778888999
  1030.        c048c048c048c048c048c048c04048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048
  1031.  
  1032.  
  1033. 6569, keine Bad Line, keine Sprites (gekⁿrzt):
  1034.  
  1035. Zykl-# 6                   1 1 1 1 1 1 1 1 1 1 |5 5 5 5 5 5 5 6 6 6 6
  1036.        3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 |3 4 5 6 7 8 9 0 1 2 3 1
  1037.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _
  1038.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _
  1039.        __                                      |
  1040.    IRQ   ______________________________________|________________________
  1041.        ________________________________________|________________________
  1042.     BA                                         |
  1043.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _
  1044.    AEC _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ 
  1045.                                                |
  1046.    VIC i 3 i 4 i 5 i 6 i 7 i r r r r r g g g g |g g g i i 0 i 1 i 2 i 3
  1047.   6510  x x x x x x x x x x x x x x x x x x x x| x x x x x x x x x x x x
  1048.                                                |
  1049. Grafik                      |===========0102030|7383940=========
  1050.                                                |
  1051. X-Koo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\|\\\\\\\\\\\\\\\\\\\\\\\\
  1052.        1111111111111111111111111110000000000000|111111111111111111111111
  1053.        89999aaaabbbbccccddddeeeeff0000111122223|344445555666677778888999
  1054.        c048c048c048c048c048c048c04048c048c048c0|c048c048c048c048c048c048
  1055.  
  1056.  
  1057. 6567R56A, Bad Line, Sprites 5-7 in dieser Rasterzeile aktiv, Sprite 0 in
  1058. der nΣchsten (gekⁿrzt):
  1059.  
  1060. Zykl-# 6                   1 1 1 1 1 1 1 1 1 1 |5 5 5 5 5 5 5 6 6 6 6 6
  1061.        4 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 |3 4 5 6 7 8 9 0 1 2 3 4 1
  1062.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _ _
  1063.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ 
  1064.        __                                      |
  1065.    IRQ   ______________________________________|__________________________
  1066.        ____                  __                |    __          __________
  1067.     BA     __________________  ________________|____  __________
  1068.         _ _ _ _ _             _ _ _ _          |     _ _ _ _     _ _ _ _ _
  1069.    AEC _ _ _ _ _ _____________ _ _ _ __________|_____ _ _ _ _____ _ _ _ _ 
  1070.                                                |
  1071.    VIC i 3 i 4 i 5sss6sss7sssr r r r rcgcgcgcgc|gcgcg i i i 0sss1 i 2 i 3 
  1072.   6510  x x X X X             x X X X          |     x X X X     x x x x x
  1073.                                                |
  1074. Grafik                      |===========0102030|7383940===========
  1075.                                                |
  1076. X-Koo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\|\\\\\\\\\\\\\\\\\\\\\\\\\\
  1077.        1111111111111111111111111110000000000000|11111111111111111111111111
  1078.        999aaaabbbbccccddddeeeeffff0000111122223|3444455556666777788889999a
  1079.        48c048c048c048c048c048c048c048c048c048c0|c048c048c048c048c048c048c0
  1080.  
  1081.  
  1082. 6567R8, keine Bad Line, Sprites 2-7 in dieser Rasterzeile aktiv, Sprites
  1083. 0-4 in der nΣchsten (gekⁿrzt):
  1084.  
  1085. Zykl-# 6                   1 1 1 1 1 1 1 1 1 1 |5 5 5 5 5 5 5 6 6 6 6 6 6
  1086.        5 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 |3 4 5 6 7 8 9 0 1 2 3 4 5 1
  1087.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _ _ _
  1088.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _
  1089.        __                                      |
  1090.    IRQ   ______________________________________|____________________________
  1091.                              __________________|________
  1092.     BA ______________________                  |        ____________________
  1093.                               _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _
  1094.    AEC _______________________ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ ______________
  1095.                                                |
  1096.    VIC ss3sss4sss5sss6sss7sssr r r r r g g g g |g g g i i i i 0sss1sss2sss3s
  1097.   6510                        x x x x x x x x x| x x x x X X X
  1098.                                                |
  1099. Grafik                      |===========0102030|7383940============
  1100.                                                |
  1101. X-Koo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\|\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  1102.        1111111111111111111111111110000000000000|1111111111111111111111111111
  1103.        999aaaabbbbccccddddeeeeffff0000111122223|344445555666677778888889999a
  1104.        48c048c048c048c048c048c048c048c048c048c0|c048c048c048c048c04cccc04c80
  1105.  
  1106.  
  1107. In der Zeile "Zykl-#" ist die Nummer des Taktzyklus innerhalb der
  1108. Rasterzeile aufgetragen. Die Zeile beginnt mit Zyklus 1 und besteht beim
  1109. 6569 aus 63, beim 6567R56A aus 64 und beim 6567R8 aus 65 Zyklen. Zur
  1110. ▄bersicht wurden noch der letzte Zyklus der vorangehenden und der erste
  1111. Zyklus der nΣchsten Rasterzeile in jedes Diagramm mit aufgenommen.
  1112.  
  1113. Die Zeilen "°0", "IRQ", "BA" und "AEC" geben den Zustand der gleichnamigen
  1114. Bussignale wieder. In der ersten Phase jedes Zyklus ist °0 Low, in der
  1115. zweiten Phase High.
  1116.  
  1117. Die Symbole in den Zeilen "VIC" und "6510" geben an, welche Art von Zugriff
  1118. VIC bzw. 6510 in der jeweiligen Taktphase durchfⁿhren (fⁿr eine ErklΣrung
  1119. der verschiedenen Zugriffsarten des VIC siehe Kapitel 3.6.2.):
  1120.  
  1121.   c  Zugriff auf die Videomatrix und das Farb-RAM (c-Zugriff)
  1122.   g  Zugriff auf den Zeichengenerator oder die Bitmap (g-Zugriff)
  1123.  0-7 Lesen des Spritedatenzeigers fⁿr Sprite 0-7 (p-Zugriff)
  1124.   s  Lesen der Spritedaten (s-Zugriff)
  1125.   r  DRAM-Refresh
  1126.   i  Idle-Zugriff
  1127.  
  1128.   x  Schreib- oder Lesezugriff des Prozessors
  1129.   X  Evtl. Schreibzugriff des Prozessors, der erste Lesezugriff stoppt den
  1130.      Prozessor (BA ist Low und damit auch RDY)
  1131.  
  1132. Die Zeile "X-Koo." enthΣlt die X-Koordinaten des Beginns jeder Taktphase
  1133. (daher die "\\\" als Gedankenstⁿtze) und die Zeile "Grafik" ist eine
  1134. Projektion des 40-Spalten-Anzeigefensters und des Rahmens auf diese
  1135. Koordinaten, zum Ausrichten von Sprites. Dies entspricht jedoch NICHT dem
  1136. Signal am Videoausgang des VIC. Aus der "Grafik"-Zeile kann man auch nicht
  1137. ablesen, wann die Rahmenstufe den Rahmen erzeugt. Dies geschieht ca. 8
  1138. Pixel spΣter als in der "Grafik"-Zeile angegeben.
  1139.  
  1140. Um beim Programmieren die Zugriffe des Prozessors innerhalb der Rasterzeile
  1141. zeitlich bestimmen zu k÷nnen, orientiert man sich am besten an den
  1142. g-Zugriffen des VIC, indem man vom 6510 ein Byte im Grafikspeicher Σndert
  1143. und am Bildschirm beobachtet, an welchem Zeichen die ─nderung frⁿhestens
  1144. wirksam wird. Der Schreibzugriff des Prozessors mu▀ dann in Taktphase
  1145. direkt davor erfolgt sein. Dann kann man mit Hilfe der Diagramme ermitteln,
  1146. in welchem Taktzyklus der Zugriff stattfand und alle weiteren Zugriffe des
  1147. Prozessors relativ dazu einfach abzΣhlen.
  1148.  
  1149. 3.7. Text-/Bitmapdarstellung
  1150. ----------------------------
  1151.  
  1152. 3.7.1. Idle-Zustand/Display-Zustand
  1153. -----------------------------------
  1154.  
  1155. Die Text-/Bitmap-Anzeigelogik im VIC befindet sich zu jedem Zeitpunkt in
  1156. einem von zwei ZustΣnden: Dem Idle-Zustand oder dem Display-Zustand.
  1157.  
  1158. Im Idle-Zustand finden nur g-Zugriffe statt. Der Zugriff erfolgt immer an
  1159. Videoadresse $3fff ($39ff bei gesetztem ECM-Bit in Register $d016). Die
  1160. 8 Bits jedes gelesenen Bytes werden vom Sequenzer in 8 Pixel umgewandelt.
  1161. Ein "0"-Bit stellt die Hintergrundfarbe in Register $d021 dar, ein "1"-Bit
  1162. gibt ein schwarzes Pixel. Bis auf das ECM-Bit ist dieses Verhalten
  1163. unabhΣngig vom Anzeigemodus.
  1164.  
  1165. Im Display-Zustand finden c- und g-Zugriffe statt, die Adressen und die
  1166. Interpretation der Daten sind vom gewΣhlten Anzeigemodus abhΣngig.
  1167.  
  1168. Der ▄bergang vom Idle- in den Display-Zustand erfolgt, sobald ein
  1169. Bad-Line-Zustand auftritt (siehe Kapitel 3.5.). Der ▄bergang vom Display-
  1170. in den Idle-Zustand erfolgt in Zyklus 58 einer Zeile, wenn der RC (siehe
  1171. nΣchstes Kapitel) den Wert 7 hat und kein Bad-Line-Zustand vorliegt.
  1172.  
  1173. Solange an Register $d011 innerhalb des Bildes keine VerΣnderungen
  1174. vorgenommen werden, befindet sich die Anzeigelogik innerhalb des
  1175. Anzeigefensters im Display-Zustand und au▀erhalb davon im Idle-Zustand.
  1176. Wenn man bei einem 25-Zeilen-Anzeigefenster einen anderen YSCROLL als 3
  1177. einstellt und in $3fff einen Wert ungleich Null ablegt, kann man am oberen
  1178. bzw. unteren Rand des Fensters die Streifen sehen, die der Sequenzer im
  1179. Idle-Zustand produziert.
  1180.  
  1181. In [4] werden sowohl die Idle-Zugriffe als auch die g-Zugriffe wΣhrend des
  1182. Idle-Zustand als "idle bus cycle" bezeichnet. Beide PhΣnomene haben jedoch
  1183. nichts miteinander zu tun. Die in den Diagrammen in [4] mit "+"
  1184. gekennzeichneten Zugriffe sind normale g-Zugriffe. Der Begriff
  1185. "Idle-Zugriff" wird in diesem Artikel ausschlie▀lich fⁿr die in den
  1186. Diagrammen in Kapitel 3.6.3. mit "i" gekennzeichneten Zugriffe benutzt,
  1187. nicht jedoch fⁿr die g-Zugriffe wΣhrend des Idle-Zustands.
  1188.  
  1189. 3.7.2. VC und RC
  1190. ----------------
  1191.  
  1192. Das vielleicht wichtigste Ergebnis der VIC-Untersuchungen ist die
  1193. Entschlⁿsselung der Funktionsweise der internen Register "VC" und "RC" des
  1194. VIC. Mit ihrer Hilfe erzeugt der VIC die Adressen fⁿr den Zugriff auf
  1195. Videomatrix und Zeichengenerator/Bitmap.
  1196.  
  1197. Genaugenommen sind es drei Register:
  1198.  
  1199.  ╖ "VC" (Video Counter) ist ein 10-Bit-ZΣhler, der mit dem Wert aus VCBASE
  1200.    geladen werden kann.
  1201.  ╖ "VCBASE" (Video Counter Base) ist ein 10-Bit-Datenregister mit
  1202.    L÷scheingang, das mit dem Wert aus VC geladen werden kann.
  1203.  ╖ "RC" (Row Counter) ist ein 3-Bit-ZΣhler mit L÷scheingang.
  1204.  
  1205. Au▀erdem gibt es noch einen 6-Bit-ZΣhler mit L÷scheingang, der die Position
  1206. innerhalb der internen 40╫12 Bit Videomatrix-/Farbzeile angibt, an der
  1207. gelesene Zeichenzeiger abgelegt bzw. von dort wieder gelesen werden, und
  1208. den ich hier mit "VMLI" (Video Matrix Line Index) bezeichnen m÷chte.
  1209.  
  1210. Diese drei Register verhalten sich nach folgenden Regeln:
  1211.  
  1212. 1. Irgendwo einmal au▀erhalb des Bereiches der Rasterzeilen $30-$f7 (also
  1213.    au▀erhalb des Bad-Line-Bereiches) wird VCBASE auf Null gesetzt.
  1214.    Vermutlich geschieht dies in Rasterzeile 0, der genaue Zeitpunkt ist
  1215.    nicht zu bestimmen, er spielt aber auch keine Rolle.
  1216.  
  1217. 2. In der ersten Phase von Zyklus 14 jeder Zeile wird VC mit VCBASE geladen
  1218.    (VCBASE->VC) und VMLI gel÷scht. Wenn zu diesem Zeitpunkt ein
  1219.    Bad-Line-Zustand vorliegt, wird zusΣtzlich RC auf Null gesetzt.
  1220.  
  1221. 3. Liegt in den Zyklen 12-54 ein Bad-Line-Zustand vor, wird BA auf Low
  1222.    gelegt und die c-Zugriffe gestartet. Einmal gestartet, findet in der
  1223.    zweiten Phase jedes Taktzyklus im Bereich 15-54 ein c-Zugriff statt. Die
  1224.    gelesenen Daten werden in der Videomatrix-/Farbzeile an der durch VMLI
  1225.    angegebenen Position abgelegt. Bei jedem g-Zugriff im Display-Zustand
  1226.    werden diese Daten ebenfalls an der durch VMLI spezifizierten Position
  1227.    wieder intern gelesen.
  1228.  
  1229. 4. Nach jedem g-Zugriff im Display-Zustand werden VC und VMLI erh÷ht.
  1230.  
  1231. 5. In der ersten Phase von Zyklus 58 wird geprⁿft, ob RC=7 ist. Wenn ja,
  1232.    geht die Videologik in den Idle-Zustand und VCBASE wird mit VC geladen
  1233.    (VC->VCBASE). Ist die Videologik danach im Display-Zustand (liegt ein
  1234.    Bad-Line-Zustand vor, ist dies immer der Fall), wird RC erh÷ht.
  1235.  
  1236. Im Normalfall sorgen diese Regeln dafⁿr, da▀ VC innerhalb des
  1237. Anzeigefensters die 1000 Adressen der Videomatrix einmal durchzΣhlt und RC
  1238. innerhalb jeder Textzeile die 8 Pixelzeilen einer Textzeile. Das Verhalten
  1239. von VC und RC wird ma▀geblich vom (Nicht-)Auftreten des Bad-Line-Zustandes
  1240. bestimmt und da man mit dem Prozessor ⁿber YSCROLL diesen beinflussen
  1241. kann, kann man so auch VC und RC in bestimmten Grenzen steuern.
  1242.  
  1243. 3.7.3 Grafikmodi
  1244. ----------------
  1245.  
  1246. Der Grafikdatensequenzer beherrscht 7 verschiedene Grafikmodi. Im
  1247. Display-Zustand wΣhlen die Bits ECM, BMM und MCM (Extended Color Mode, Bit
  1248. Map Mode und Multi Color Mode) in den Registern $d011 und $d016 einen von 6
  1249. Modi aus (von den 8 m÷glichen Bitkombinationen sind 3 "ungⁿltig" und
  1250. erzeugen die gleiche Ausgabe, nΣmlich nur die Farbe Schwarz), im
  1251. Idle-Zustand erfolgt die Darstellung unabhΣngig von ECM/BMM/MCM immer auf
  1252. die gleiche Art.
  1253.  
  1254. Der Sequenzer gibt die Grafikdaten in jeder Rasterzeile im Bereich der
  1255. Anzeigespalte aus, sofern das vertikale Rahmenflipflop gel÷scht ist (siehe
  1256. Kapitel 3.9.). Au▀erhalb der Anzeigespalte und bei gel÷schtem Flipflop wird
  1257. die letzte aktuelle Hintergrundfarbe dargestellt (dieser Bereich ist
  1258. normalerweise vom Rahmen ⁿberdeckt). Kernstⁿck des Sequenzers ist ein
  1259. 8-Bit-Schieberegister, das mit jedem Pixel um 1 Bit weitergeschoben und
  1260. nach jedem g-Zugriff mit den gelesenen Pixeldaten geladen wird. Mit XSCROLL
  1261. aus Register $d016 lΣ▀t sich das Laden des Schieberegisters um 0-7 Pixel
  1262. verz÷gern und dadurch die Anzeige um bis zu 7 Pixel nach rechts
  1263. verschieben.
  1264.  
  1265. Der Adre▀generator fⁿr die Text-/Bitmap-Zugriffe (c- und g-Zugriffe)
  1266. besitzt bei den g-Zugriffen im wesentlichen 3 Modi (die c-Zugriffe erfolgen
  1267. immer nach dem selben Adre▀schema). Im Display-Zustand wΣhlt das BMM-Bit
  1268. entweder Zeichengenerator-Zugriffe (BMM=0) oder Bitmap-Zugriffe (BMM=1)
  1269. aus, im Idle-Zustand erfolgen die g-Zugriffe immer an Videoadresse $3fff.
  1270. Bei gesetztem ECM-Bit schaltet der Adre▀generator bei den g-Zugriffen die
  1271. Adre▀leitungen 9 und 10 immer auf Low, bei ansonsten gleichem Adre▀schema
  1272. (z.B. erfolgen dann die g-Zugriffe im Idle-Zustand an Adresse $39ff).
  1273.  
  1274. Die 9 Grafikmodi werden nun einzeln behandelt und die erzeugten Adressen
  1275. und die Interpretation der gelesenen Daten bei c- und g-Zugriffen
  1276. beschrieben. Um das Nachschlagen zu erleichtern, wurden bei jedem Modus die
  1277. Adressen explizit hingeschrieben, obwohl z.B. die c-Zugriffe immer gleich
  1278. ablaufen.
  1279.  
  1280. 3.7.3.1 Standard-Textmodus (ECM/BMM/MCM=0/0/0)
  1281. ----------------------------------------------
  1282.  
  1283. In diesem Modus (wie in allen Textmodi) liest der VIC aus der Videomatrix
  1284. 8-Bit-Zeichenzeiger, die die Adresse der Punktmatrix des Zeichens im
  1285. Zeichengenerator angibt. Damit ist ein Zeichensatz von 256 Zeichen
  1286. verfⁿgbar, die jeweils aus 8╫8 Pixeln bestehen, die in 8
  1287. aufeinanderfolgenden Bytes im Zeichengenerator abgelegt sind. Mit den Bits
  1288. VM10-13 und CB11-13 aus Register $d018 lassen sich Videomatrix und
  1289. Zeichengenerator im Speicher verschieben.
  1290.  
  1291. Im Standard-Textmodus entspricht jedes Bit im Zeichengenerator direkt einem
  1292. Pixel auf dem Bildschirm. Die Vordergrundfarbe ist fⁿr jedes Zeichen im
  1293. Farbnybble aus der Videomatrix angegeben, die Hintergrundfarbe wird global
  1294. durch Register $d021 festgelegt.
  1295.  
  1296. c-Zugriff
  1297.  
  1298.  Adressen
  1299.  
  1300.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1301.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1302.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1303.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1304.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1305.  
  1306.  Daten
  1307.  
  1308.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1309.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1310.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1311.  |     Farbe von     | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
  1312.  |     "1"-Pixeln    |    |    |    |    |    |    |    |    |
  1313.  +-------------------+----+----+----+----+----+----+----+----+
  1314.  
  1315. g-Zugriff
  1316.  
  1317.  Adressen
  1318.  
  1319.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1320.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1321.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1322.  |CB13|CB12|CB11| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1323.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1324.  
  1325.  Daten
  1326.  
  1327.  +----+----+----+----+----+----+----+----+
  1328.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1329.  +----+----+----+----+----+----+----+----+
  1330.  |         8 Pixel (1 Bit/Pixel)         |
  1331.  |                                       |
  1332.  | "0": Hintergrundfarbe 0 ($d021)       |
  1333.  | "1": Farbe aus Bits 8-11 der c-Daten  |
  1334.  +---------------------------------------+
  1335.  
  1336. 3.7.3.2 Multicolor-Textmodus (ECM/BMM/MCM=0/0/1)
  1337. ------------------------------------------------
  1338.  
  1339. Dieser Modus erm÷glicht es, auf Kosten der horizontalen Aufl÷sung
  1340. vierfarbige Zeichen darzustellen. Ist Bit 11 der c-Daten Null, wird das
  1341. Zeichen wie im Standard-Textmodus dargestellt, wobei aber nur die Farben
  1342. 0-7 fⁿr den Vordergrund zur Verfⁿgung stehen. Ist Bit 11 gesetzt, bilden
  1343. jeweils zwei horizontal benachbarte Bits der Punktmatrix ein Pixel. Dadurch
  1344. ist die Aufl÷sung des Zeichens auf 4╫8 reduziert (die Pixel sind doppelt so
  1345. breit, die Gesamtbreite der Zeichen Σndert sich also nicht).
  1346.  
  1347. Interessant ist, da▀ nicht nur die Bitkombination "00", sondern auch "01"
  1348. fⁿr die SpriteprioritΣt und -kollisionserkennung zum "Hintergrund" gezΣhlt
  1349. wird.
  1350.  
  1351. c-Zugriff
  1352.  
  1353.  Adressen
  1354.  
  1355.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1356.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1357.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1358.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1359.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1360.  
  1361.  Daten
  1362.  
  1363.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1364.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1365.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1366.  | MC-|   Farbe von  | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
  1367.  |Flag|  "11"-Pixeln |    |    |    |    |    |    |    |    |
  1368.  +----+--------------+----+----+----+----+----+----+----+----+
  1369.  
  1370. g-Zugriff
  1371.  
  1372.  Adressen
  1373.  
  1374.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1375.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1376.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1377.  |CB13|CB12|CB11| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1378.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1379.  
  1380.  Daten
  1381.  
  1382.  +----+----+----+----+----+----+----+----+
  1383.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1384.  +----+----+----+----+----+----+----+----+
  1385.  |         8 Pixel (1 Bit/Pixel)         |
  1386.  |                                       | MC-Flag = 0
  1387.  | "0": Hintergrundfarbe 0 ($d021)       |
  1388.  | "1": Farbe aus Bits 8-10 der c-Daten  |
  1389.  +---------------------------------------+
  1390.  |         4 Pixel (2 Bit/Pixel)         |
  1391.  |                                       |
  1392.  | "00": Hintergrundfarbe 0 ($d021)      | MC-Flag = 1
  1393.  | "01": Hintergrundfarbe 1 ($d022)      |
  1394.  | "10": Hintergrundfarbe 2 ($d023)      |
  1395.  | "11": Farbe aus Bits 8-10 der c-Daten |
  1396.  +---------------------------------------+
  1397.  
  1398. 3.7.3.3 Standard-Bitmap-Modus (ECM/BMM/MCM=0/1/0)
  1399. -------------------------------------------------
  1400.  
  1401. In diesem Modus (wie in allen Bitmap-Modi) liest der VIC die Grafikdaten
  1402. aus einer 320╫200-Bitmap, in der jedes Bit direkt einem Punkt auf dem
  1403. Bildschirm entspricht. Die Daten aus der Videomatrix werden fⁿr die
  1404. Farbinformation benutzt. Da die Videomatrix weiterhin nur eine 40╫25-Matrix
  1405. ist, k÷nnen die Farben nur fⁿr Bl÷cke von 8╫8 Pixeln individuell bestimmt
  1406. werden (also eine Art YC-8:1-Format). Da die Entwickler des VIC-II den
  1407. Bitmap-Modus mit sowenig zusΣtzlichem Schaltungsaufwand wie m÷glich
  1408. realisieren wollten (der VIC-I hatte noch keinen Bitmap-Modus), ist die
  1409. Bitmap etwas ungew÷hnlich im Speicher abgelegt: Im Gegensatz zu modernen
  1410. Videochips, die die Bitmap linear aus dem Speicher lesen, bilden beim VIC
  1411. jeweils 8 aufeinanderfolgende Bytes einen 8╫8-Pixelblock auf dem
  1412. Bildschirm. Mit den Bits VM10-13 und CB13 aus Register $d018 lassen sich
  1413. Videomatrix und Bitmap im Speicher verschieben.
  1414.  
  1415. Im Standard-Bitmap-Modus entspricht jedes Bit in der Bitmap direkt einem
  1416. Pixel auf dem Bildschirm. Fⁿr jedem 8╫8-Block k÷nnen Vorder- und
  1417. Hintergrundfarbe beliebig eingestellt werden.
  1418.  
  1419. c-Zugriff
  1420.  
  1421.  Adressen
  1422.  
  1423.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1424.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1425.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1426.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1427.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1428.  
  1429.  Daten
  1430.  
  1431.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1432.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1433.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1434.  |     unbenutzt     |     Farbe von     |     Farbe von     |
  1435.  |                   |     "1"-Pixeln    |     "0"-Pixeln    |
  1436.  +-------------------+-------------------+-------------------+
  1437.  
  1438. g-Zugriff
  1439.  
  1440.  Adressen
  1441.  
  1442.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1443.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1444.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1445.  |CB13| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1446.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1447.  
  1448.  Daten
  1449.  
  1450.  +----+----+----+----+----+----+----+----+
  1451.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1452.  +----+----+----+----+----+----+----+----+
  1453.  |         8 Pixel (1 Bit/Pixel)         |
  1454.  |                                       |
  1455.  | "0": Farbe aus Bits 0-3 der c-Daten   |
  1456.  | "1": Farbe aus Bits 4-7 der c-Daten   |
  1457.  +---------------------------------------+
  1458.  
  1459. 3.7.3.4 Multicolor-Bitmap-Modus (ECM/BMM/MCM=0/1/1)
  1460. ---------------------------------------------------
  1461.  
  1462. ─hnlich wie beim Multicolor-Textmodus bilden auch in diesem Modus jeweils
  1463. zwei benachbarte Bits ein (doppelt so breites) Pixel. Die Aufl÷sung
  1464. reduziert sich damit auf 160╫200 Pixel.
  1465.  
  1466. Genau wie beim Multicolor-Textmodus wird die Bitkombination "01" fⁿr die
  1467. SpriteprioritΣt und -kollisionserkennung zum "Hintergrund" gezΣhlt.
  1468.  
  1469. c-Zugriff
  1470.  
  1471.  Adressen
  1472.  
  1473.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1474.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1475.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1476.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1477.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1478.  
  1479.  Daten
  1480.  
  1481.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1482.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1483.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1484.  |     Farbe von     |     Farbe von     |     Farbe von     |
  1485.  |    "11-Pixeln"    |    "01"-Pixeln    |    "10"-Pixeln    |
  1486.  +-------------------+-------------------+-------------------+
  1487.  
  1488. g-Zugriff
  1489.  
  1490.  Adressen
  1491.  
  1492.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1493.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1494.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1495.  |CB13| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1496.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1497.  
  1498.  Daten
  1499.  
  1500.  +----+----+----+----+----+----+----+----+
  1501.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1502.  +----+----+----+----+----+----+----+----+
  1503.  |         4 Pixel (2 Bit/Pixel)         |
  1504.  |                                       |
  1505.  | "00": Hintergrundfarbe 0 ($d021)      |
  1506.  | "01": Farbe aus Bits 4-7 der c-Daten  |
  1507.  | "10": Farbe aus Bits 0-3 der c-Daten  |
  1508.  | "11": Farbe aus Bits 8-11 der c-Daten |
  1509.  +---------------------------------------+
  1510.  
  1511. 3.7.3.5 ECM-Textmodus (ECM/BMM/MCM=1/0/0)
  1512. -----------------------------------------
  1513.  
  1514. Dieser Textmodus entspricht dem Standard-Textmodus, erlaubt es aber, fⁿr
  1515. jedes einzelne Zeichen eine von vier Hintergrundfarben auszuwΣhlen. Die
  1516. Auswahl geschieht ⁿber die oberen beiden Bit des Zeichenzeigers. Dadurch
  1517. reduziert sich der Zeichenvorrat allerdings von 256 auf 64 Zeichen.
  1518.  
  1519. c-Zugriff
  1520.  
  1521.  Adressen
  1522.  
  1523.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1524.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1525.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1526.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1527.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1528.  
  1529.  Daten
  1530.  
  1531.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1532.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1533.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1534.  |     Farbe von     |Wahl des | D5 | D4 | D3 | D2 | D1 | D0 |
  1535.  |     "1"-Pixeln    |Hintergr.|    |    |    |    |    |    |
  1536.  +-------------------+---------+----+----+----+----+----+----+
  1537.  
  1538. g-Zugriff
  1539.  
  1540.  Adressen
  1541.  
  1542.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1543.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1544.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1545.  |CB13|CB12|CB11|  0 |  0 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1546.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1547.  
  1548.  Daten
  1549.  
  1550.  +----+----+----+----+----+----+----+----+
  1551.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1552.  +----+----+----+----+----+----+----+----+
  1553.  |         8 Pixel (1 Bit/Pixel)         |
  1554.  |                                       |
  1555.  | "0": Je nach Bits 6/7 der c-Daten     |
  1556.  |      00: Hintergrundfarbe 0 ($d021)   |
  1557.  |      01: Hintergrundfarbe 1 ($d022)   |
  1558.  |      10: Hintergrundfarbe 2 ($d023)   |
  1559.  |      11: Hintergrundfarbe 3 ($d024)   |
  1560.  | "1": Farbe aus Bits 8-11 der c-Daten  |
  1561.  +---------------------------------------+
  1562.  
  1563. 3.7.3.6 Ungⁿltiger Textmodus (ECM/BMM/MCM=1/0/1)
  1564. ------------------------------------------------
  1565.  
  1566. Das gleichzeitige Setzen der ECM- und MCM-Bits wΣhlt keinen der
  1567. "offiziellen" Grafikmodi des VIC, sondern erzeugt nur schwarze Pixel.
  1568. Nichtsdestotrotz erzeugt der Grafikdatensequenzer auch in diesem Modus
  1569. intern gⁿltige Grafikdaten, die die Spritekollisionserkennung triggern
  1570. k÷nnen. ▄ber den Umweg der Spritekollisionen kann man die erzeugten Daten
  1571. auch auslesen (sehen kann man nichts, das Bild ist schwarz). Man kann so
  1572. allerdings nur Vordergrund- und Hintergrundpixel unterscheiden, die
  1573. Farbinformation lΣ▀t sich aus den Spritekollisionen nicht gewinnen.
  1574.  
  1575. Die erzeugte Grafik entspricht der des Multicolor-Textmodus, allerdings ist
  1576. der Zeichenvorrat genau wie im ECM-Modus auf 64 Zeichen eingeschrΣnkt.
  1577.  
  1578. c-Zugriff
  1579.  
  1580.  Adressen
  1581.  
  1582.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1583.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1584.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1585.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1586.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1587.  
  1588.  Daten
  1589.  
  1590.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1591.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1592.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1593.  | MC-|        unbenutzt       | D5 | D4 | D3 | D2 | D1 | D0 |
  1594.  |Flag|                        |    |    |    |    |    |    |
  1595.  +----+------------------------+----+----+----+----+----+----+
  1596.  
  1597. g-Zugriff
  1598.  
  1599.  Adressen
  1600.  
  1601.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1602.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1603.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1604.  |CB13|CB12|CB11|  0 |  0 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1605.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1606.  
  1607.  Daten
  1608.  
  1609.  +----+----+----+----+----+----+----+----+
  1610.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1611.  +----+----+----+----+----+----+----+----+
  1612.  |         8 Pixel (1 Bit/Pixel)         |
  1613.  |                                       | MC-Flag = 0
  1614.  | "0": Hintergrund                      |
  1615.  | "1": Vordergrund                      |
  1616.  +---------------------------------------+
  1617.  |         4 Pixel (2 Bit/Pixel)         |
  1618.  |                                       |
  1619.  | "00": Hintergrund                     | MC-Flag = 1
  1620.  | "01": Hintergrund                     |
  1621.  | "10": Vordergrund                     |
  1622.  | "11": Vordergrund                     |
  1623.  +---------------------------------------+
  1624.  
  1625. 3.7.3.7 Ungⁿltiger Bitmap-Modus 1 (ECM/BMM/MCM=1/1/0)
  1626. -----------------------------------------------------
  1627.  
  1628. Dieser Modus erzeugt nur ebenfalls nur ein schwarzes Bild, die Pixel lassen
  1629. sich allerdings auch hier mit dem Spritekollisionstrick auslesen.
  1630.  
  1631. Der Aufbau der Grafik ist im Prinzip wie im Standard-Bitmap-Modus, aber die
  1632. Bits 9 und 10 der g-Adressen sind wegen dem gesetzten ECM-Bit immer Null,
  1633. entsprechend besteht auch die Grafik - grob gesagt - aus vier
  1634. "Abschnitten", die jeweils viermal wiederholt dargestellt werden.
  1635.  
  1636. c-Zugriff
  1637.  
  1638.  Adressen
  1639.  
  1640.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1641.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1642.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1643.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1644.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1645.  
  1646.  Daten
  1647.  
  1648.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1649.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1650.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1651.  |                         unbenutzt                         |
  1652.  +-----------------------------------------------------------+
  1653.  
  1654. g-Zugriff
  1655.  
  1656.  Adressen
  1657.  
  1658.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1659.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1660.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1661.  |CB13| VC9| VC8|  0 |  0 | VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1662.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1663.  
  1664.  Daten
  1665.  
  1666.  +----+----+----+----+----+----+----+----+
  1667.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1668.  +----+----+----+----+----+----+----+----+
  1669.  |         8 Pixel (1 Bit/Pixel)         |
  1670.  |                                       |
  1671.  | "0": Hintergrund                      |
  1672.  | "1": Vordergrund                      |
  1673.  +---------------------------------------+
  1674.  
  1675. 3.7.3.8 Ungⁿltiger Bitmap-Modus 2 (ECM/BMM/MCM=1/1/1)
  1676. -----------------------------------------------------
  1677.  
  1678. Der letzte ungⁿltige Modus liefert auch ein schwarzes Bild, das sich jedoch
  1679. genauso mit Hilfe der Sprite-Grafik-Kollisionen "abtasten" lΣ▀t.
  1680.  
  1681. Der Aufbau der Grafik ist im Prinzip wie im Multicolor-Bitmap-Modus, aber
  1682. die Bits 9 und 10 der g-Adressen sind wegen dem gesetzten ECM-Bit immer
  1683. Null, was sich in der Darstellung genauso wie beim ersten ungⁿltigen
  1684. Bitmap-Modus wiederspiegelt. Die Bitkombination "01" wird wie gewohnt zum
  1685. Hintergrund gezΣhlt.
  1686.  
  1687. c-Zugriff
  1688.  
  1689.  Adressen
  1690.  
  1691.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1692.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1693.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1694.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1695.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1696.  
  1697.  Daten
  1698.  
  1699.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1700.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1701.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1702.  |                         unbenutzt                         |
  1703.  +-----------------------------------------------------------+
  1704.  
  1705. g-Zugriff
  1706.  
  1707.  Adressen
  1708.  
  1709.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1710.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1711.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1712.  |CB13| VC9| VC8|  0 |  0 | VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1713.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1714.  
  1715.  Daten
  1716.  
  1717.  +----+----+----+----+----+----+----+----+
  1718.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1719.  +----+----+----+----+----+----+----+----+
  1720.  |         4 Pixel (2 Bit/Pixel)         |
  1721.  |                                       |
  1722.  | "00": Hintergrund                     |
  1723.  | "01": Hintergrund                     |
  1724.  | "10": Vordergrund                     |
  1725.  | "11": Vordergrund                     |
  1726.  +---------------------------------------+
  1727.  
  1728. 3.7.3.9 Idle-Zustand
  1729. --------------------
  1730.  
  1731. Im Idle-Zustand liest der VIC Grafikdaten von Adresse $3fff (bzw. $39ff bei
  1732. gesetztem ECM-Bit) und stellt sie wie im Standard-Textmodus dar, wobei aber
  1733. die Farbe von "1"-Pixeln immer schwarz ist.
  1734.  
  1735. Obwohl die Grafik im Idle-Zustand unabhΣngig von den ECM/BMM/MCM-Bits immer
  1736. wie ein "Standard"-Modus aussieht (also 1 Bit/Pixel), ist das MCM-Bit nicht
  1737. gΣnzlich ohne Wirkung. Es schaltet nΣmlich weiterhin die Logik zur
  1738. SpriteprioritΣt/-kollisionserkennung zwischen Standard- und
  1739. Multicolor-Modus um. Im Klartext: Ist das MCM-Bit im Idle-Modus gesetzt,
  1740. verhΣlt sich die SpriteprioritΣtslogik wie im Multicolor-Modus. Sie fa▀t
  1741. jeweils zwei benachbarte Pixel zusammen und betrachtet die Bitkombinationen
  1742. "00" und "01" als Hintergrund und "10" und "11" als Vordergrund, obwohl die
  1743. Idle-Grafik im Aussehen unverΣndert bleibt.
  1744.  
  1745. g-Zugriff (ECM=0)
  1746.  
  1747.  Adressen
  1748.  
  1749.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1750.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1751.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1752.  |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |
  1753.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1754.  
  1755.  Daten
  1756.  
  1757.  +----+----+----+----+----+----+----+----+
  1758.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1759.  +----+----+----+----+----+----+----+----+
  1760.  |         8 Pixel (1 Bit/Pixel)         |
  1761.  |                                       |
  1762.  | "0": Hintergrundfarbe 0 ($d021)       |
  1763.  | "1": Schwarz                          |
  1764.  +---------------------------------------+
  1765.  
  1766. g-Zugriff (ECM=1)
  1767.  
  1768.  Adressen
  1769.  
  1770.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1771.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1772.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1773.  |  1 |  1 |  1 |  0 |  0 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |
  1774.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1775.  
  1776.  Daten
  1777.  
  1778.  +----+----+----+----+----+----+----+----+
  1779.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1780.  +----+----+----+----+----+----+----+----+
  1781.  |         8 Pixel (1 Bit/Pixel)         |
  1782.  |                                       |
  1783.  | "0": Hintergrundfarbe 0 ($d021)       |
  1784.  | "1": Schwarz                          |
  1785.  +---------------------------------------+
  1786.  
  1787. 3.8. Sprites
  1788. ------------
  1789.  
  1790. ZusΣtzlich zu der Text-/Bitmapgrafik kann der VIC acht unabhΣngige, 24╫21
  1791. Pixel gro▀e, frei bewegliche Objekte darstellen, die "Sprites" (in [2]
  1792. "MOBs" genannt (Moveable Object Blocks)).
  1793.  
  1794. Die Sprites k÷nnen beliebig auf dem Bildschirm positioniert werden, man
  1795. kann sie mit den Bits in Register $d015 (MxE) einzeln ein- und ausschalten,
  1796. sie mit Register $d017/$d01d in X- und/oder Y-Richtung um den Faktor 2
  1797. vergr÷▀ern (bei gleicher Aufl÷sung von 24╫21 Pixeln), mit Register $d01c
  1798. (MxMC) den Standard- oder Multicolor-Darstellungmodus wΣhlen, mit Register
  1799. $d01b (MxDP) die AnzeigeprioritΣt in Bezug zur Text-/Bitmapgrafik festlegen
  1800. und jedem Sprite eine eigene Farbe zuordnen (Register $d027-$d02e).
  1801. Au▀erdem besitzt der VIC die M÷glichkeit, Kollisionen zwischen Sprites
  1802. untereinander oder zwischen Sprites und der Text-/Bitmapgrafik zu erkennen
  1803. und ggf. einen Interrupt auszul÷sen (siehe 3.11).
  1804.  
  1805. Die Position der linken oberen Ecke eines Sprites wird mit den zugeh÷rigen
  1806. Koordinatenregistern angegeben (MxX, MxY). Fⁿr die Y-Koordinate stehen
  1807. 8 Bit, fⁿr die X-Koordinate 9 Bit zur Verfⁿgung (die h÷chsten Bits aller
  1808. Sprite-X-Koordinaten sind in Register $d010 gesammelt).
  1809.  
  1810. 3.8.1. Speicherzugriff und Darstellung
  1811. --------------------------------------
  1812.  
  1813. Die zur Darstellung von 24╫21 Pixeln notwendigen 63 Bytes an Spritedaten
  1814. sind linear im Speicher abgelegt: Jeweil 3 aufeinanderfolgende Bytes bilden
  1815. eine Zeile des Sprites.
  1816.  
  1817. Diese 63 Bytes lassen sich in 64-Byte-Schritten innerhalb des
  1818. 16KB-Adre▀raumes des VIC verschieben. Dazu liest der VIC in jeder
  1819. Rasterzeile fⁿr jedes Sprite aus den letzten 8 Bytes der Videomatrix einen
  1820. Spritedatenzeiger (p-Zugriff), der bei den Spritedatenzugriffen
  1821. (s-Zugriffe) die oberen 8 Bits der Adresse bildet. Die unteren 6 Bits
  1822. stammen aus einem SpritedatenzΣhler (MC0-MC7, fⁿr jedes Sprite einen), der
  1823. fⁿr die Sprites eine Σhnliche Aufgabe ⁿbernimmt wie der VC fⁿr die
  1824. Videomatrix. Da die p-Zugriffe in jeder Rasterzeile stattfinden und nicht
  1825. nur dann, wenn das jeweilige Sprite gerade dargestellt wird, kann man durch
  1826. Σndern des Spritedatenzeigers das Aussehen eines Sprites mitten innerhalb
  1827. der Darstellung Σndern.
  1828.  
  1829. Wenn fⁿr ein Sprite s-Zugriffe notwendig sind, finden diese innerhalb der
  1830. Rasterzeile in den drei Halbzyklen direkt nach dem zu dem jeweiligen Sprite
  1831. geh÷renden p-Zugriff statt. Der VIC benutzt dazu ebenfalls die BA- und
  1832. AEC-Signale (wie in den Bad Lines), um in der zweiten Taktphase auf den Bus
  1833. zugreifen zu k÷nnen. Auch in diesem Fall geht BA drei Zyklen vor dem
  1834. eigentlichen Zugriff auf Low. Die s-Zugriffe finden in jeder Rasterzeile
  1835. statt, in der das Sprite sichtbar ist (bei den Sprites 0-2 jeweils in der
  1836. Zeile davor, siehe die Timing-Diagramme in Kapitel 3.6.3.), fⁿr jedes
  1837. Sprite in festgelegten Zyklen innerhalb der Zeile.
  1838.  
  1839. Wie die Text- und Bitmap-Grafik, so besitzen auch die Sprites einen
  1840. Standard-Modus und einen Multicolor-Modus. Im Standardmodus entspricht
  1841. jedes Bit direkt einem Pixel auf dem Bildschirm. Ein "0" Pixel ist
  1842. transparent und lΣ▀t die darunterliegende Grafik durchscheinen, ein "1"
  1843. Pixel stellt die zum jeweiligen Sprite geh÷rende Spritefarbe aus den
  1844. Registern $d027-$d02e dar. Im Multicolor-Modus bilden je zwei benachbarte
  1845. Bits ein Pixel, wodurch die Aufl÷sung des Sprites auf 12╫21 sinkt (die
  1846. Pixel werden doppelt so breit).
  1847.  
  1848. Au▀erdem lassen sich die Sprites in X- und Y-Richtung getrennt in ihrer
  1849. Ausdehung auf dem Bildschirm verdoppeln (X-/Y-Expansion). Dabei wird jedes
  1850. Sprite-Pixel einfach doppelt so breit und/oder hoch dargestellt, die
  1851. Aufl÷sung Σndert sich nicht. Ein Pixel eines X-expandierten
  1852. Multicolor-Sprites ist also insgesamt viermal so breit wie ein Pixel eines
  1853. nicht-expandierten Standard-Sprites. Obwohl beide Expansionen Σhnlich
  1854. aussehen, sind sie doch auf vollkommen verschiedene Weise im VIC
  1855. implementiert. Die X-Expansion weist einfach den Spritedatensequenzer an,
  1856. die Pixel mit halber Frequenz auszugeben. Die Y-Expansion hingegen bewirkt,
  1857. da▀ der Sprite-Adre▀generator in je zwei aufeinanderfolgenden Zeilen von
  1858. denselben Adressen liest, so da▀ jede Spritezeile doppelt ausgegeben wird.
  1859.  
  1860. Zu jedem Sprite geh÷rt ein eigener Spritedatensequenzer, dessen Kernstⁿck
  1861. ein 24-Bit-Schieberegister ist. Darⁿberhinaus geh÷ren zu jedem Sprite noch
  1862. zwei Register:
  1863.  
  1864.  ╖ "MC" (MOB Data Counter) ist ein 6-Bit-ZΣhler, der mit dem Wert aus
  1865.    MCBASE geladen werden kann.
  1866.  ╖ "MCBASE" (MOB Data Counter Base) ist ein 6-Bit-ZΣhler mit L÷scheingang
  1867.  
  1868. Au▀erdem gibt es pro Sprite noch ein Expansions-Flipflop, da▀ die
  1869. Y-Expansion steuert.
  1870.  
  1871. Die Darstellung eines Sprites geschieht nach den folgenden Regeln (die
  1872. Zyklusangaben gelten nur fⁿr den 6569):
  1873.  
  1874. 1. Das Expansions-Flipflop ist gesetzt, solange das zum jeweiligen Sprite
  1875.    geh÷rende Bit MxYE in Register $d017 gel÷scht ist.
  1876.  
  1877. 2. In der ersten Phase von Zyklus 55 wird das Expansions-Flipflop
  1878.    invertiert, wenn das MxYE-Bit gesetzt ist.
  1879.  
  1880. 3. In den ersten Phasen von Zyklus 55 und 56 wird fⁿr jedes Sprite geprⁿft,
  1881.    ob das entsprechende MxE-Bit in Register $d015 gesetzt und die
  1882.    Y-Koordinate des Sprites (ungerade Register $d001-$d00f) gleich den
  1883.    unteren 8 Bits von RASTER ist. Ist dies der Fall und der DMA fⁿr das
  1884.    Sprite noch ausgeschaltet, wird der DMA angeschaltet, MCBASE gel÷scht
  1885.    und, wenn das MxYE-Bit gesetzt ist, das Expansions-Flipflop gel÷scht.
  1886.  
  1887. 4. In der ersten Phase von Zyklus 58 wird fⁿr jedes Sprite MC mit MCBASE
  1888.    geladen (MCBASE->MC) und geprⁿft, ob der DMA fⁿr das Sprite angeschaltet
  1889.    und die Y-Koordinate des Sprites gleich den unteren 8 Bits von RASTER
  1890.    ist. Ist dies der Fall, wird die Darstellung des Sprites angeschaltet.
  1891.  
  1892. 5. Ist der DMA fⁿr ein Sprite angeschaltet, finden in den entsprechenden,
  1893.    fⁿr jedes Sprite festgelegten Zyklen (siehe die Diagramme in Kapitel
  1894.    3.6.3.) drei aufeinanderfolgende s-Zugriffe statt (die p-Zugriffe finden
  1895.    immer statt, auch wenn das Sprite abgeschaltet ist). Die gelesenen Daten
  1896.    des ersten Zugriffes werden in den oberen 8 Bit des Schieberegisters
  1897.    gespeichert, die des zweiten in den mittleren 8 Bit und die des dritten
  1898.    in den unteren 8 Bit. Nach jedem s-Zugriff wird der MC um 1 erh÷ht.
  1899.  
  1900. 6. Ist die Sprite-Darstellung fⁿr ein Sprite angeschaltet, wird, sobald die
  1901.    aktuelle X-Koordinate des Rasterstrahls mit der X-Koordinate des Sprites
  1902.    (gerade Register $d000-$d00e und $d010) ⁿbereinstimmt, mit jedem Pixel
  1903.    das Schieberegister um ein Bit nach links geschoben und das
  1904.    "herausgefallene" Bit dargestellt. Ist das zum Sprite geh÷rige MxXE-Bit
  1905.    aus Register $d01d gesetzt, wird nur jedes zweite Pixel geschoben und
  1906.    das Sprite erscheint doppelt so breit. Wenn das Sprite im
  1907.    Multicolor-Modus ist, werden jeweils zwei Bits zu einem Pixel
  1908.    zusammengefa▀t.
  1909.  
  1910. 7. In der ersten Phase von Zyklus 15 wird geprⁿft, ob das
  1911.    Expansions-Flipflop gesetzt ist. Wenn ja, wird MCBASE um 2 erh÷ht.
  1912.  
  1913. 8. In der ersten Phase von Zyklus 16 wird geprⁿft, ob das
  1914.    Expansions-Flipflop gesetzt ist. Wenn ja, wird MCBASE um 1 erh÷ht.
  1915.    Dann wird geprⁿft, ob MCBASE auf 63 steht und bei positivem Vergleich
  1916.    der DMA fⁿr das jeweilige Sprite abgeschaltet.
  1917.  
  1918. Dadurch, da▀ der Test in Punkt 3. gegen Ende der Rasterzeile gemacht wird,
  1919. mⁿssen die in den Registern angegebenen Sprite-Y-Koordinate um 1 kleiner
  1920. als die gewⁿnschte Y-Position der ersten Sprite-Zeile sein, da die
  1921. Darstellung der Sprites erst in der folgenden Zeile beginnt, nachdem die
  1922. ersten Spritedaten gelesen wurden (sofern das Sprite nicht ⁿber die
  1923. X-Koordinate $164 (Zyklus 58, siehe Punkt 4.) hinaus positioniert wird).
  1924.  
  1925. Sprites lassen sich vertikal "wiederverwenden": Wenn man wΣhrend oder nach
  1926. erfolgter Darstellung eines Sprites dessen Y-Koordinate auf eine spΣtere
  1927. Rasterzeile setzt, so da▀ die in Punkt 1. und 2. genannten Vergleiche
  1928. nochmal ansprechen, wird das Sprite ab dieser Y-Koordinate noch einmal
  1929. dargestellt (wobei man natⁿrlich X-Koordinate und den Spritedatenzeiger
  1930. beliebig Σndern kann). So ist es m÷glich, mehr als 8 Sprites auf dem
  1931. Bildschirm erscheinen zu lassen.
  1932.  
  1933. Horizontal ist dies nicht m÷glich. Nach 24 dargestellten Pixeln ist das
  1934. Schieberegister leergelaufen und auch wenn man die X-Koordinate innerhalb
  1935. der Zeile so Σndert, da▀ der Vergleich von Punkt 4. erneut anspricht,
  1936. werden keine Spritedaten mehr angezeigt. Man kann also innerhalb einer
  1937. Rasterzeile nur maximal 8 Sprites gleichzeitig darstellen.
  1938.  
  1939. Hier noch einmal das Schema der p- und s-Zugriffe im ▄berblick:
  1940.  
  1941. p-Zugriff
  1942.  
  1943.  Adressen
  1944.  
  1945.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1946.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1947.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1948.  |VM13|VM12|VM11|VM10|  1 |  1 |  1 |  1 |  1 |  1 |  1 |  Spr.-Nummer |
  1949.  +----+----+----+----+----+----+----+----+----+----+----+--------------+
  1950.  
  1951.  Daten
  1952.  
  1953.  +----+----+----+----+----+----+----+----+
  1954.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1955.  +----+----+----+----+----+----+----+----+
  1956.  | MP7| MP6| MP5| MP4| MP3| MP2| MP1| MP0|
  1957.  +----+----+----+----+----+----+----+----+
  1958.  
  1959. s-Zugriff
  1960.  
  1961.  Adressen
  1962.  
  1963.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1964.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1965.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1966.  | MP7| MP6| MP5| MP4| MP3| MP2| MP1| MP0| MC5| MC4| MC3| MC2| MC1| MC0|
  1967.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1968.  
  1969.  Daten
  1970.  
  1971.  +----+----+----+----+----+----+----+----+
  1972.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1973.  +----+----+----+----+----+----+----+----+
  1974.  |         8 Pixel (1 Bit/Pixel)         |
  1975.  |                                       | MxMC = 0
  1976.  | "0": Transparent                      |
  1977.  | "1": Spritefarbe ($d027-$d02e)        |
  1978.  +---------------------------------------+
  1979.  |         4 Pixel (2 Bit/Pixel)         |
  1980.  |                                       |
  1981.  | "00": Transparent                     | MxMC = 1
  1982.  | "01": Sprite Multicolor 0 ($d025)     |
  1983.  | "10": Spritefarbe ($d027-$d02e)       |
  1984.  | "11": Sprite Multicolor 1 ($d026)     |
  1985.  +---------------------------------------+
  1986.  
  1987. 3.8.2. PrioritΣt und Kollisionserkennung
  1988. ----------------------------------------
  1989.  
  1990. Sobald sich mehrere Grafikelemente (Sprites und Text-/Bitmapgrafik) auf dem
  1991. Bildschirm ⁿberlappen, mu▀ entschieden werden, welches Element im
  1992. Vordergrund dargestellt werden soll. Dazu wird jedem Element eine PrioritΣt
  1993. zugeordnet und nur das Element mit der h÷chsten PrioritΣt dargestellt.
  1994.  
  1995. Die Sprites haben untereinander eine feste Rangfolge: Sprite 0 hat die
  1996. h÷chste und Sprite 7 die niedrigste PrioritΣt. Wenn sich zwei Sprites
  1997. ⁿberlappen, wird das Sprite mit der h÷heren Nummer nur dort dargestellt, wo
  1998. das andere Sprite ein transparentes Pixel hat.
  1999.  
  2000. Die PrioritΣt der Sprites zur Text-/Bitmapgrafik lΣ▀t sich in gewissen
  2001. Grenzen regeln. ZunΣchst einmal mu▀ man bei der Text-/Bitmapgrafik zwischen
  2002. Vordergrund- und Hintergrundpixeln unterscheiden. Welche Bitkombinationen
  2003. zum Vorder- oder Hintergrund geh÷ren, entscheidet das MCM-Bit in Register
  2004. $d016 unabhΣngig von Zustand des Grafikdatensequenzers und von den BMM- und
  2005. ECM-Bits in Register $d011:
  2006.  
  2007.              | MCM=0 |   MCM=1
  2008.  ------------+-------+-----------
  2009.  Bit/Pixel   |   1   |     2
  2010.  Pixel/Byte  |   8   |     4
  2011.  Hintergrund |  "0"  | "00", "01"
  2012.  Vordergrund |  "1"  | "10", "11"
  2013.  
  2014. Im Multicolor-Modus (MCM=1) geh÷ren also die Bitkombinationen "00" und "01"
  2015. zum Hintergrund und "10" und "11" zum Vordergrund, wΣhrend im
  2016. Standard-Modus (MCM=0) einfach gel÷schte Pixel zum Hintergrund und gesetzte
  2017. zum Vordergrund geh÷ren. Es sollte noch bemerkt werden, da▀ dies auch fⁿr
  2018. die im Idle-Zustand erzeugte Grafik gilt, obwohl diese unabhΣngig vom
  2019. MCM-Bit immer mit 1 Bit/Pixel dargestellt wird.
  2020.  
  2021. Mit den MxDP-Bits aus Register $d01b lΣ▀t sich nun fⁿr jedes Sprite
  2022. getrennt angeben, ob es vor oder hinter den Vordergrundpixeln dargestellt
  2023. wird (die Tabelle in [2] ist falsch):
  2024.  
  2025.  PrioritΣt   |    MxDP=0   |    MxDP=1
  2026.  ------------+-------------+------------
  2027.  H÷chste     |   Sprite x  | Vordergrund
  2028.  Mittlere    | Vordergrund |   Sprite x
  2029.  Niedrigste  | Hintergrund | Hintergrund
  2030.  
  2031. Auch hier werden die Grafikelemente, die eine niedrigere PrioritΣt als ein
  2032. darⁿberliegendes Sprite haben, nur an den Stellen sichtbar, wo das Sprite
  2033. ein transparentes Pixel hat.
  2034.  
  2035. Gleichzeitig mit der PrioritΣtsvergabe ist der VIC in der Lage, Kollisionen
  2036. zwischen Sprites untereinander und zwischen Sprites und Vordergrundpixeln
  2037. der Text-/Bitmapgrafik zu erkennen.
  2038.  
  2039. Eine Kollision zwischen Sprites untereinander wird erkannt, sobald beim
  2040. Bildaufbau zwei oder mehrere Spritedatensequenzer gleichzeitig ein
  2041. nicht-transparentes Pixel ausgeben (dies kann auch irgendwo au▀erhalb des
  2042. sichtbaren Bildausschnittes geschehen). In diesem Fall werden im Register
  2043. $d01e die MxM-Bits aller betroffenen Sprites gesetzt und (falls erlaubt,
  2044. siehe Kapitel 3.12.) ein Interrupt ausgel÷st. Die Bits bleiben gesetzt, bis
  2045. das Register vom Prozessor gelesen wird und werden durch den Lesezugriff
  2046. automatisch gel÷scht.
  2047.  
  2048. Eine Kollision zwischen Sprites und anderen Grafikdaten wird erkannt,
  2049. sobald beim Bildaufbau ein oder mehrere Spritedatensequenzer ein
  2050. nicht-transparentes Pixel und der Grafikdatensequenzer ein Vordergrundpixel
  2051. ausgeben. In diesem Fall werden im Register $d01f die MxD-Bits der
  2052. betroffenen Sprites gesetzt und (fall erlaubt, siehe Kapitel 3.12.) ein
  2053. Interrupt ausgel÷st. Wie bei der Sprite-Sprite-Kollision bleiben die Bits
  2054. gesetzt, bis das Register vom Prozessor ausgelesen wird.
  2055.  
  2056. Wenn das vertikale Rahmenflipflop gesetzt ist (also normalerweise innerhalb
  2057. des oberen/unteren Rahmens, siehe nΣchstes Kapitel), ist der Ausgang des
  2058. Grafikdatensequenzers abgeschaltet und l÷st keine Kollisionen aus.
  2059.  
  2060. 3.9. Die Rahmenstufe
  2061. --------------------
  2062.  
  2063. Der VIC benutzt zwei Flipflops, um den Rahmen um das Anzeigefenster
  2064. herum zu erzeugen: Ein Haupt-Rahmenflipflop und ein vertikales
  2065. Rahmenflipflop.
  2066.  
  2067. Das Haupt-Rahmenflipflop steuert die Darstellung des Rahmens. Ist es
  2068. gesetzt, stellt der VIC die in Register $d020 angegeben Farbe dar, sonst
  2069. die Farbe, die der PrioritΣtsmultiplexer vom Grafik- oder
  2070. Spritedatensequenzer durchschaltet. Der Rahmen ⁿberlagert also sowohl die
  2071. Text-/Bitmapgrafik als auch die Sprites. Er hat die h÷chste
  2072. AnzeigeprioritΣt.
  2073.  
  2074. Das vertikale Rahmenflipflop dient zur Unterstⁿtzung bei der Darstellung
  2075. des oberen/unteren Rahmens. Ist es gesetzt, kann das Haupt-Rahmenflipflop
  2076. nicht gel÷scht werden. Au▀erdem steuert das vertikale Rahmenflipflop den
  2077. Ausgang des Grafikdatensequenzers. Dieser liefert nur bei gesetztem
  2078. Flipflop Daten, ansonsten stellt er die Hintergrundfarbe dar.
  2079.  
  2080. Zu jedem der beiden Flipflops geh÷ren 2╫2 Komparatoren. Diese Komparatoren
  2081. vergleichen die X-/Y-Position des Rasterstrahls mit einem von zwei
  2082. festverdrahteten Werten (je nach Zustand der CSEL/RSEL-Bits) um die
  2083. Flipflops zu steuern. Die Vergleiche fallen nur dann positiv aus, wenn der
  2084. jeweilige Wert genau erreicht wird. Es findet kein Vergleich mit einem
  2085. Intervall statt.
  2086.  
  2087. Die horizontalen Vergleichswerte:
  2088.  
  2089.         |   CSEL=0   |   CSEL=1
  2090.  -------+------------+-----------
  2091.  Links  |  31 ($1f)  |  24 ($18)
  2092.  Rechts | 335 ($14f) | 344 ($158)
  2093.  
  2094. Und die vertikalen:
  2095.  
  2096.        |   RSEL=0  |  RSEL=1
  2097.  ------+-----------+----------
  2098.  Oben  |  55 ($37) |  51 ($33)
  2099.  Unten | 247 ($f7) | 251 ($fb)
  2100.  
  2101. Die Flipflops werden nach den folgenden Regeln geschaltet:
  2102.  
  2103. 1. Erreicht die X-Koordinate den rechten Vergleichswert, wird das
  2104.    Haupt-Rahmenflipflop gesetzt.
  2105. 2. Erreicht die Y-Koordinate den unteren Vergleichswert in Zyklus 63, wird
  2106.    das vertikale Rahmenflipflop gesetzt.
  2107. 3. Erreicht die Y-Koordinate den oberern Vergleichswert in Zyklus 63 und
  2108.    ist das DEN-Bit in Register $d011 gesetzt, wird das vertikale
  2109.    Rahmenflipflop gel÷scht.
  2110. 4. Erreicht die X-Koordinate den linken Vergleichswert und die Y-Koordinate
  2111.    den unteren, wird das vertikale Rahmenflipflop gesetzt.
  2112. 5. Erreicht die X-Koordinate den linken Vergleichswert und die Y-Koordinate
  2113.    den oberen und ist das DEN-Bit in Register $d011 gesetzt, wird das
  2114.    vertikale Rahmenflipflop gel÷scht.
  2115. 6. Erreicht die X-Koordinate den linken Vergleichswert und ist das
  2116.    vertikale Rahmenflipflop gel÷scht, wird das Haupt-Flipflop gel÷scht.
  2117.  
  2118. Die Y-Koordinate wird also ein- oder zweimal innerhalb jeder Rasterzeile
  2119. geprⁿft: In Zyklus 63 und wenn die X-Koordinate den linken Vergleichswert
  2120. erreicht.
  2121.  
  2122. Man kann durch geeignetes Umschalten der CSEL/RSEL-Bits verhindern, da▀
  2123. einer oder mehrere der Vergleichswerte erreicht werden und damit den Rahmen
  2124. ganz oder teilweise abschalten (siehe 3.14.1.).
  2125.  
  2126. 3.10. Display Enable
  2127. --------------------
  2128.  
  2129. Das DEN-Bit (Display Enable, Register $d011, Bit 4) dient dazu, die
  2130. Text-/Bitmapgrafik ein- oder auszuschalten. Im normalen Betrieb ist es
  2131. gesetzt. Das Bit hat Auswirkungen auf zwei Funktionen des VIC: Die Bad
  2132. Lines und die vertikale Rahmenstufe:
  2133.  
  2134.  - Ein Bad-Line-Zustand kann nur auftreten, wenn irgendwann in Rasterzeile
  2135.    $30 das DEN-Bit wenigstens einen Zyklus lang gesetzt war (siehe Kapitel
  2136.    3.5.).
  2137.  - Ist das DEN-Bit gel÷scht, wird der Reset-Eingang des vertikalen
  2138.    Rahmenflipflops deaktiviert (siehe Kapitel 3.9.). Der obere/untere
  2139.    Rahmen wird dann nicht abgeschaltet.
  2140.  
  2141. Normalerweise bewirkt das L÷schen des DEN-Bits also, da▀ keine Bad Lines
  2142. (und damit auch keine c- und g-Zugriffe) auftreten und der ganze Bildschirm
  2143. die Rahmenfarbe annimt.
  2144.  
  2145. 3.11. Lightpen
  2146. --------------
  2147.  
  2148. Bei einer negativen Flanke am LP-Eingang wird die aktuelle Position des
  2149. Rasterstrahls in den Registern LPX ($d013) und LPY ($d014) gelatcht. LPX
  2150. enthΣlt die oberen 8 Bit (von 9) der X-Position und LPY die unteren 8 Bit
  2151. (ebenfalls von 9) der Y-Position. Daher ist die horizontale Aufl÷sung des
  2152. Lightpens auf 2 Pixel begrenzt.
  2153.  
  2154. Es wird pro Bild nur eine einzige negative Flanke an LP registriert. Treten
  2155. mehrere Flanken an LP auf, werden alle nachfolgenden ignoriert. Erst in der
  2156. nΣchsten vertikalen Austastlⁿcke wird die Triggerung wieder freigegeben.
  2157.  
  2158. Da der LP-Eingang des VIC wie alle Leitungen der Joystick-Ports an die
  2159. Tastaturmatrix angeschlossen ist, lΣ▀t er sich auch per Software steuern.
  2160. Dazu dient Bit 4 von Port B von CIA-A ($dc01/$dc03). Dies gibt die
  2161. M÷glichkeit, die aktuelle X-Position des Rasterstrahls durch Ausl÷sen einer
  2162. LP-Flanke und anschlie▀endem Lesen von LPX zu ermitteln (der VIC besitzt
  2163. kein Register, aus dem man die X-Position direkt auslesen k÷nnte). Damit
  2164. kann man z.B. Rasterinterrupt-Routinen zyklusgenau synchronisieren.
  2165.  
  2166. Die Werte, die man im LPX-Register enthΣlt kann man aus den
  2167. Sprite-Koordinaten der Timing-Diagramme in Kapitel 3.6.3. ermitteln. Man
  2168. mu▀ sich jeweils am Ende des Zyklus, in dem die LP-Leitung gesetzt wird,
  2169. orientieren. Triggert man LP z.B. in Zyklus 20, so erhΣlt man in LPX den
  2170. Wert $1e, der der Sprite-Koordinate $03c entspricht (LPX enthΣlt die oberen
  2171. 8 Bit der 9-Bit-X-Koordinate).
  2172.  
  2173. Der VIC kann auch zusΣtzlich einen Interrupt beim Auftreten einer negativen
  2174. Flanke am LP-Pin ausl÷sen (siehe nΣchstes Kapitel), ebenfalls nur einmal
  2175. pro Strahldurchlauf.
  2176.  
  2177. 3.12. VIC-Interrupts
  2178. --------------------
  2179.  
  2180. Der VIC besitzt die M÷glichkeit, beim Auftreten bestimmter Ereignisse einen
  2181. Interrupt fⁿr den Prozessor zu erzeugen. Dazu dient der IRQ-Ausgang, der
  2182. direkt mit dem IRQ-Eingang des 6510 verbunden ist. Die VIC-Interrupts sind
  2183. daher mit dem I-Flag im Statusregister des Prozessors maskierbar.
  2184.  
  2185. Im VIC gibt es vier Interruptquellen. Zu jeder Quelle geh÷rt ein Bit im
  2186. Interrupt-Latch (Register $d019) und ein Bit im Interrupt-Enable-Register
  2187. (Register $d01a). Beim Auftreten eines Interrupts wird das entsprechende
  2188. Bit im Latch gesetzt. Um es zu l÷schen, mu▀ der Prozessor dort "von Hand"
  2189. eine "1" hineinschreiben, der VIC l÷scht das Latch nicht selbsttΣtig.
  2190.  
  2191. Wenn mindestens ein Latch-Bit und das zugeh÷rige Bit im Enable-Register
  2192. gesetzt sind, wird die IRQ-Leitung auf Low gelegt und damit der Interrupt
  2193. im Prozessor ausgel÷st. Mit den Enable-Bits lassen sich also die vier
  2194. Interruptquellen getrennt ein- und ausschalten. Da der VIC - wie
  2195. beschrieben - das Latch nicht selbst l÷scht, mu▀ dies der Prozessor tun,
  2196. bevor er das I-Flag l÷scht bzw. aus dem Interrupt zurⁿckkehrt, denn sonst
  2197. wird sofort wieder ein Interrupt ausgel÷st (der IRQ-Eingang des 6510 ist
  2198. pegelgetriggert).
  2199.  
  2200. Die folgende Tabelle beschreibt die vier Interruptquellen und ihre Bits in
  2201. den Latch- und Enable-Registern:
  2202.  
  2203.  Bit|Name| Ausl÷ser
  2204.  ---+----+----------------------------------------------------------------
  2205.   0 | RST| Erreichen einer bestimmten Rasterzeile. Die Zeile wird durch
  2206.     |    | Schreiben in Register $d012 und $d011, Bit 7 festgelegt und vom
  2207.     |    | VIC intern fⁿr den Vergleich gespeichert. Der Test auf das
  2208.     |    | Erreichen der Interrupt-Rasterzeile findet in jeder Rasterzeile
  2209.     |    | in Zyklus 0 (in Zeile 0 in Zyklus 1) statt.
  2210.   1 | MBC| Kollision von mindestens einem Sprite mit der Text-/Bitmapgrafik
  2211.     |    | (ein Spritedatensequenzer liefert zum selben Zeitpunkt ein
  2212.     |    | nicht-transparentes Pixel an dem der Grafikdatensequenzer ein
  2213.     |    | Vordergrundpixel ausgibt)
  2214.   2 | MMC| Kollision von zwei oder mehr Sprites (zwei Spritedatensequenzer
  2215.     |    | liefern gleichzeitig nicht-transparente Pixel)
  2216.   3 | LP | Negative Flanke am LP-Eingang (Lightpen)
  2217.  
  2218. Bei den MBC- und MMC-Interrupts l÷st jeweils nur die erste Kollision einen
  2219. Interrupt aus (d.h. wenn die Kollisionsregister $d01e bzw. $d01f vor der
  2220. Kollision den Inhalt Null hatten). Um nach einer Kollision weitere
  2221. Interrupts auszul÷sen, mu▀ das betreffende Register erst durch Auslesen
  2222. gel÷scht werden.
  2223.  
  2224. Das Bit 7 im Latch $d019 gibt den invertierten Zustand des IRQ-Ausgangs des
  2225. VIC wieder.
  2226.  
  2227. 3.13. DRAM-Refresh
  2228. ------------------
  2229.  
  2230. In jeder Rasterzeile fⁿhrt der VIC fⁿnf Lesezugriffe zum Refresh des
  2231. dynamischen RAM durch. Es wird ein 8-Bit RefreshzΣhler (REF) zur Erzeugung
  2232. von 256 DRAM-Zeilenadressen benutzt. Der ZΣhler wird in Rasterzeile 0 mit
  2233. $ff gel÷scht und nach jedem Refresh-Zugriff um 1 verringert.
  2234.  
  2235. Der VIC greift also in Zeile 0 auf die Adressen $3fff, $3ffe, $3ffd, $3ffc
  2236. und $3ffb zu, in Zeile 1 auf $3ffa, $3ff9, $3ff8, $3ff7 und $3ff6 usw.
  2237.  
  2238.  Refresh-Adressen
  2239.  
  2240.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  2241.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  2242.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  2243.  |  1 |  1 |  1 |  1 |  1 |  1 |REF7|REF6|REF5|REF4|REF3|REF2|REF1|REF0|
  2244.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  2245.  
  2246. 3.14. Effekte/Anwendungen
  2247. -------------------------
  2248.  
  2249. In den folgenden Abschnitten sollen einige grafische Effekte beschrieben
  2250. werden, die sich durch die Anwendung der in den Kapiteln zuvor
  2251. beschriebenen Funktionsweise des VIC erzielen lassen.
  2252.  
  2253. 3.14.1. Hyperscreen
  2254. -------------------
  2255.  
  2256. Wie in Kapitel 3.9. erlΣutert, erzeugt der VIC den Bildschirmrahmen durch
  2257. das Vergleichen der Strahlkoordinaten mit Start- und Stoppositionen, die
  2258. sich durch die CSEL/RSEL-Bits auswΣhlen lassen. Der Rahmen wird also nicht
  2259. grundsΣtzlich innerhalb eines bestimmten Koordinatenbereichs dargestellt,
  2260. sondern bei bestimmten Koordinaten ein- und ausgeschaltet. Sorgt man nun
  2261. durch geeignetes Umschalten von CSEL/RSEL dafⁿr, da▀ der
  2262. Koordinatenvergleich niemals anspricht, so wird der Rahmen z.B. nicht
  2263. eingeschaltet und man kann auch die Grafik im Randbereich sehen, die
  2264. normalerweise durch den Rahmen ⁿberdeckt wird. Diese Technik wird als
  2265. "Hyperscreen" oder "╓ffnen des Rahmens" bezeichnet.
  2266.  
  2267. Allerdings beschrΣnkt sich die im Randbereich darstellbare Grafik
  2268. hauptsΣchlich auf Sprites, da der Grafikdatensequenzer in diesem Bereich im
  2269. Idle-Zustand ist, da au▀erhalb der Y-Koordinaten $30-$f7 keine Bad Lines
  2270. auftreten k÷nnen (siehe Kapitel 3.5.). Man kann aber auch mit der im
  2271. Idle-Zustand erzeugten Grafik etwas sinnvolles darstellen.
  2272.  
  2273. Um den oberen/unteren Rahmen auszuschalten, geht man wie folgt vor:
  2274.  
  2275. 1. Irgendwo in der oberen HΣlte des Bildschirms setzt man das RSEL-Bit und
  2276.    schaltet damit auf den 25-Zeilen-Rahmen.
  2277. 2. Nun wartet man, bis RASTER einen Wert im Bereich 248-250 erreicht hat.
  2278.    Das vertikale Rahmenflipflop ist noch gel÷scht, denn bei RSEL=1 spricht
  2279.    der Komparator erst in Rasterzeile 251 an.
  2280. 3. Jetzt l÷scht man das RSEL-Bit. Der Komparator wird umgeschaltet und
  2281.    setzt das vertikale Flipflop nun bei Zeile 247. Diese Zeile ist aber
  2282.    schon vorbei und der VIC "vergi▀t" deshalb, den vertikalen Rahmen
  2283.    einzuschalten.
  2284. 4. Nach Rasterzeile 251 setzt man das RSEL-Bit wieder und wiederholt das
  2285.    Ganze bei Punkt 2.
  2286.  
  2287. Wenn man den oberen/unteren Rahmen mit dieser Methode ÷ffnet, bleibt aber
  2288. weiterhin der linke/rechte Rahmen in dem "freigewordenen" Bereich aktiv.
  2289. Schaltet man im Bereich der Rasterzeilen 52-54 von RSEL=0 auf RSEL=1, so
  2290. wird der Rahmen nicht mehr ausgeschaltet und ⁿberdeckt den gesamten
  2291. Bildschirm (dies entspricht der Darstellung bei gel÷schtem DEN-Bits, jedoch
  2292. mit dem Unterschied, da▀ Bad Lines stattfinden), was aber wenig sinnvoll
  2293. ist.
  2294.  
  2295. Der linke/rechte Rahmen lΣ▀t sich mit dem CSEL-Bit auf eine Σhnliche Weise
  2296. abschalten. Das Timing ist jedoch wesentlich kritischer. Hat man beim
  2297. vertikalen Rahmen noch 4 Rasterzeilen Zeit fⁿr die Umschaltung, so mu▀ beim
  2298. horizontalen Rahmen der Wechsel CSEL=1 nach CSEL=0 auf den Zyklus genau
  2299. erfolgen, und zwar in Zyklus 56. Ganz analog lΣ▀t sich das Abschalten des
  2300. horizontalen Rahmens verhindern, indem man in Zyklus 17 von CSEL=0 auf
  2301. CSEL=1 schaltet.
  2302.  
  2303. Will man den linken/rechten Rahmen im oberen/unteren Randbereich ÷ffnen, so
  2304. mu▀ man entweder damit anfangen, bevor das vertikale Rahmenflipflop gesetzt
  2305. wird, also noch au▀erhalb des oberen/unteren Rahmens, oder den
  2306. oberen/unteren Rahmen ebenfalls ÷ffnen, denn das Haupt-Rahmenflipflop kann
  2307. nur gel÷scht werden, wenn auch das vertikale Flipflop gel÷scht ist.
  2308. Vergleicht man beide Methoden, kann man sich auch davon ⁿberzeugen, da▀ das
  2309. vertikale Flipflop den Ausgang des Grafikdatensequenzers steuert: Bei der
  2310. ersten Methode ist im freigewordenen oberen/unteren Rahmenbereich nur die
  2311. Hintergrundfarbe sichtbar, bei der zweiten Methode wird die Grafik des
  2312. Idle-Zustands dargestellt.
  2313.  
  2314. 3.14.2. FLD
  2315. -----------
  2316.  
  2317. Beim Aufbau der Grafik nach Textzeilen orientiert sich der VIC
  2318. ausschlie▀lich am Auftreten der Bad Lines: Eine Bad Line gibt das
  2319. "Startsignal" fⁿr die Darstellung einer Textzeile. Durch geeignetes ─ndern
  2320. von YSCROLL (in Register $d011) kann man den Bad-Line-Zustand unterdrⁿcken
  2321. (siehe 3.5.) und beliebig verz÷gern. Man kann so genau steuern, in welchen
  2322. Rasterzeilen Bad Lines auftreten sollen und damit, ab welchen Rasterzeilen
  2323. der VIC jeweils eine Textzeile darstellen soll. So lΣ▀t sich der Abstand
  2324. zwischen zwei Textzeilen beliebig vergr÷▀ern, wenn man die nΣchste Bad Line
  2325. nur lange genug zurⁿckhΣlt. Dieser Effekt wird als "Flexible Line Distance"
  2326. (FLD) bezeichnet.
  2327.  
  2328. LΣ▀t man z.B. im ganzen Bildschirm nur drei Bad Lines bei den Rasterzeilen
  2329. $50, $78 und $a0 zu, so stellt der VIC auch nur drei Textzeilen jeweils an
  2330. diesen Positionen dar. Dazwischen ist der Sequenzer im Idle-Zustand.
  2331.  
  2332. Verz÷gert man nur das Auftreten der ersten Bad Line, kann man die komplette
  2333. Grafikdarstellung um gro▀e Distanzen nach unten scrollen, ohne auch nur ein
  2334. Byte im Grafikspeicher zu verschieben.
  2335.  
  2336. 3.14.3. FLI
  2337. -----------
  2338.  
  2339. Anstatt wie beim FLD-Effekt das Auftreten der Bad Lines zu verz÷gern, kann
  2340. man auch kⁿnstlich zusΣtzliche Bad Lines erzeugen, bevor der VIC die
  2341. aktuelle Textzeile beendet hat. Besonders interessant ist dies in den
  2342. Bitmap-Modi, denn dort werden die Daten aus der Videomatrix (die ja in den
  2343. Bad Lines gelesen werden) fⁿr die Farbinformation ben÷tigt, weshalb in den
  2344. Bitmap-Modi normalerweise nur einzelne 8╫8-Pixelbl÷cke individuell
  2345. eingefΣrbt werden k÷nnen. Macht man jedoch durch geeignetes ─ndern von
  2346. YSCROLL jede Rasterzeile zur Bad Line, liest der VIC in jeder Rasterzeile
  2347. aus der Videomatrix und holt damit auch fⁿr jede Rasterzeile neue
  2348. Farbinformationen.
  2349.  
  2350. Dadurch ist man nun in der Lage, innerhalb der 4╫8 Pixel eines Blocks im
  2351. Multicolor-Modus jedes Pixel einzeln einzufΣrben. Dieser durch Software
  2352. erzeugte, neue Grafikmodus wird als "Flexible Line Interpretation" (FLI)
  2353. bezeichnet und stellt vermutlich das herausragendste Beispiel
  2354. "unkonventioneller" VIC-Programmierung dar.
  2355.  
  2356. Ein Problem gibt es allerdings: Wenn man eine neue Bad Line erzeugt, noch
  2357. bevor die aktuelle Textzeile beendet wurde, wird VCBASE nicht erh÷ht (siehe
  2358. 3.7.2.). Der VIC liest also von den gleichen Adressen aus der Videomatrix,
  2359. wie in der Zeile zuvor. Da man die Videomatrix mit dem Prozessor nicht
  2360. schnell genug Σndern kann, mu▀ man mit den Bits VM10-VM13 aus Register
  2361. $d018 die Basisadresse der Videomatrix umschalten (das Farb-RAM lΣ▀t sich
  2362. leider nicht umschalten, daher ist die Farbwahl der Pixel nicht vollkommen
  2363. frei).
  2364.  
  2365. Au▀erdem darf man den Zugriff auf $d011 zum Erzeugen der Bad Lines erst ab
  2366. Zyklus 14 jeder Rasterzeile machen, denn sonst wird der RC in jeder Zeile
  2367. gel÷scht und die Darstellung der Bitmap nicht wie gewⁿnscht. Dies hat aber
  2368. auch zur Folge, da▀ die ersten drei c-Zugriffe des VIC in jeder Zeile keine
  2369. gⁿltigen Daten liefern, denn der erste c-Zugriff in Zyklus 15 erfordert,
  2370. da▀ BA schon in Zyklus 12 auf Low gegangen sein mu▀, damit AEC in Zyklus 15
  2371. Low bleibt (AEC bleibt prinzipiell immer erst drei Zyklen nach der
  2372. negativen Flanke von BA auf Low, dies lΣ▀t sich nicht umgehen). Da aber die
  2373. Bad Line erst in Zyklus 14 erzeugt wurde, ist zwar in Zyklus 15 beim ersten
  2374. c-Zugriff BA auf Low, aber AEC ist High und damit sind auch die internen
  2375. Datenbustreiber D0-D7 des VIC geschlossen und da der Chip in NMOS gefertigt
  2376. ist, liest er den Wert $ff und nicht die Videomatrix-Daten (die
  2377. Datenbustreiber D8-D11 sind allerdings offen, jedoch wird dies in Kapitel
  2378. 3.14.6. noch nΣher erlΣutert), was am rechten Bildrand als 24 Pixel breite,
  2379. hellgraue Streifen sichtbar wird.
  2380.  
  2381. In der Praxis legt man im Speicher acht Videomatrizen an, die nach
  2382. folgendem Schema benutzt werden: In der ersten Rasterzeile die erste Zeile
  2383. der ersten Matrix, in der zweiten Zeile die erste Zeile der zweiten Matrix,
  2384. usw..., in der achten Zeile die erste Zeile der achten Matrix, in der
  2385. neunten Zeile die zweite Zeile der ersten Matrix, usw. Mit diesen acht
  2386. Matrizen kann man eine komplette Bitmap zeilenweise abdecken.
  2387.  
  2388. Vom FLI-Modus gibt es noch einige Abarten, z.B. AFLI (Advanced FLI), das
  2389. den Standard-Bitmap-Modus benutzt und Farbmischungen durch Σhnlich
  2390. gefΣrbte, nebeneinanderliegende Pixel simuliert, und IFLI (Interlaced FLI),
  2391. das in einer Art Interlace-Verfahren abwechselnd zwei Halbbilder darstellt.
  2392.  
  2393. 3.14.4. Linecrunch
  2394. ------------------
  2395.  
  2396. Die Manipulation von YSCROLL bietet noch mehr M÷glichkeiten, auf Bad Lines
  2397. Einflu▀ zu nehmen. Man kann auch eine Bad Line vor ihrer korrekten
  2398. Beendigung abbrechen, indem man durch ─nderung an YSCROLL den
  2399. Bad-Line-Zustand innerhalb einer angefangenen Bad Line vor Zyklus 14 wieder
  2400. wegnimmt. Das hat mehrere Konsequenzen:
  2401.  
  2402.  - Der Grafikdaten-Sequenzer geht in den Display-Zustand, es wird also
  2403.    Grafik dargestellt.
  2404.  - Der RC wird nicht zurⁿckgesetzt. Wenn man gleich die erste Bad Line
  2405.    eines Bilds auf diese Art abbricht, steht der RC noch von der letzten
  2406.    Zeile des vorigen Bildes auf 7.
  2407.  - In Zyklus 58 der Zeile ist RC immer noch 7, darum geht der Sequenzer in
  2408.    den Idle-Zustand und VCBASE wird mit VC geladen. Da der Sequenzer aber
  2409.    innerhalb der Zeile im Display-Zustand war, wurde VC nach jedem
  2410.    g-Zugriff erh÷ht, also ist VCBASE jetzt effektiv um 40 erh÷ht worden.
  2411.    Der RC macht keinen ▄berlauf, er bleibt auf 7.
  2412.  
  2413. Mit diesem Verfahren hat man also die Darstellung einer Textzeile auf deren
  2414. letzte Rasterzeile reduziert, denn weil VCBASE um 40 erh÷ht wird, geht der
  2415. VIC anschlie▀end zur nΣchsten Zeile ⁿber. Daher wird dieser Effekt als
  2416. "Linecrunch" bezeichnet: Man kann damit einzelne Textzeilen "wegcrunchen".
  2417.  
  2418. Wenn man nun in jeder Rasterzeile so vorgeht, so steht der RC immer auf 7
  2419. und es finden keine c-Zugriffe statt, aber VCBASE wird in jeder Zeile um 40
  2420. erh÷ht. Dies fⁿhrt irgendwann dazu, da▀ VCBASE die 1000-Byte-Grenze der
  2421. Videomatrix ⁿberschreitet und der VIC auch die letzten, normalerweise
  2422. unsichtbaren 24 Byte der Matrix darstellt (in denen u.a. die
  2423. Spritedatenzeiger abgelegt sind) und bei Erreichen von 1024 wieder bei Null
  2424. anfΣngt.
  2425.  
  2426. Dadurch, da▀ man ganze Textzeilen auf je eine Rasterzeile crunchen kann,
  2427. hat man eine M÷glichkeit, den Bildschirminhalt schnell um gro▀e Distanzen
  2428. nach oben zu scrollen, ohne den Grafikspeicher zu Σndern, Σhnlich wie man
  2429. ihn mit FLD nach unten scrollen kann. Der einzige st÷rende Nebeneffekt
  2430. dabei ist, da▀ sich die weggecrunchten Zeilen am oberen Bildschirmrand
  2431. ansammeln, was unsch÷n aussieht. Hier kann man aber durch Anwendung eines
  2432. der ungⁿltigen Grafikmodi recht praktisch im Bereich dieser Zeilen auf
  2433. schwarz schalten.
  2434.  
  2435. 3.14.5. Verdoppelte Textzeilen
  2436. ------------------------------
  2437.  
  2438. Normalerweise ist die Darstellung einer Textzeile nach 7 Rasterzeilen zu
  2439. Ende, denn dann ist RC=7 und in Zyklus 58 der letzten Zeile geht der
  2440. Sequenzer in den Idle-Zustand (siehe Kapitel 3.7.2.). Erzeugt man jetzt
  2441. aber einen Bad-Line-Zustand zwischen Zyklus 54-57 der letzten Zeile, so
  2442. bleibt der Sequenzer im Display-Zustand und der RC wird nochmals erh÷ht
  2443. (und lΣuft damit auf Null ⁿber). Dann beginnt der VIC in der nΣchsten Zeile
  2444. nochmal mit der Darstellung der vorigen Textzeile. Da keine neuen
  2445. Videomatrixdaten gelesen wurden, wird die vorige Textzeile einfach doppelt
  2446. dargestellt.
  2447.  
  2448. 3.14.6. DMA-Delay
  2449. -----------------
  2450.  
  2451. Die trickreichste Bad-Line-Manupulation besteht darin, innerhalb von Zyklus
  2452. 15-53 einer Rasterzeile des Anzeigefensters, innerhalb der der
  2453. Grafikdatensequenzer im Idle-Zustand ist, einen Bad-Line-Zustand zu
  2454. erzeugen, z.B. durch ─ndern von Register $d011 derart, da▀ YSCROLL gleich
  2455. den unteren drei Bit von RASTER ist.
  2456.  
  2457. Der VIC setzt dann sofort im nΣchsten Zyklus BA nach Low, geht in den
  2458. Display-Zustand und beginnt mit dem Lesen aus der Videomatrix (der
  2459. Prozessor ist nun angehalten, denn BA ist Low und er will den nΣchsten
  2460. Opcode lesen). Allerdings schwingt AEC erst noch drei Zyklen lang mit °2
  2461. mit, bevor es ebenfalls auf Low bleibt. Dieses Verhalten (AEC erst drei
  2462. Zyklen nach BA) ist im VIC festverdrahtet und lΣ▀t sich nicht umgehen.
  2463.  
  2464. Trotzdem greift der VIC auf die Videomatrix zu, oder versucht es zumindest,
  2465. denn solange AEC in der zweiten Taktphase noch High ist, sind die
  2466. Adre▀bustreiber und Datenbustreiber D0-D7 des VIC im Tri-State und der VIC
  2467. liest statt der Daten aus der Videomatrix in den ersten drei Zyklen den
  2468. Wert $ff an D0-D7. Die Datenleitungen D8-D13 des VIC haben allerdings
  2469. keinen Tri-State-Treiber und sind immer auf Eingang geschaltet. Allerdings
  2470. bekommt der VIC auch dort keine gⁿltigen Farb-RAM-Daten, denn da AEC High
  2471. ist, kontrolliert offiziell der 6510 noch den Bus und sofern dieser nicht
  2472. zufΣllig gerade den nΣchsten Opcode vom Farb-RAM lesen will, ist der
  2473. Chip-Select-Eingang des Farb-RAMs nicht aktiv. Stattdessen stellt ein 4-Bit
  2474. Analogschalter (!), U16, eine Verbindung zwischen den Datenbits D0-D3 des
  2475. Prozessors und den Datenbits D8-D13 des VIC her. Diese Verbindung besteht
  2476. immer bei AEC High und soll dem Prozessor ggf. den Zugriff auf das Farb-RAM
  2477. erm÷glichen. Lange Rede, kurzer Sinn: Der VIC liest in den ersten drei
  2478. Zyklen, nachdem BA auf Low gegangen ist als Zeichenzeiger $ff und als
  2479. Farbinformation die untersten 4 Bit des Opcodes nach dem Zugriff auf $d011.
  2480. Erst danach werden wieder regulΣre Videomatrixdaten gelesen.
  2481.  
  2482. Diese Daten werden ganz normal ab dem Anfang der internen
  2483. Videomatrix-/Farbzeile abgelegt und nach jedem nachfolgenden g-Zugriff (mit
  2484. dem Erzeugen der Bad Line wurde auch der Sequenzer in den Display-Zustand
  2485. geschaltet) wird VC erh÷ht. Die c- und g-Zugriffe werden bis Zyklus 54
  2486. fortgesetzt. Dadurch, da▀ mit den Zugriffen aber erst mitten in der Zeile
  2487. begonnen wurde, fanden weniger als 40 Zugriffe statt, also wurde auch VC
  2488. insgesamt um weniger als 40 in dieser Rasterzeile erh÷ht und hat keinen
  2489. durch 40 teilbaren Wert mehr, wie dies normalerweise am Ende einer
  2490. Rasterzeile immer der Fall ist. Aufgrund der Arbeitsweise des VC (siehe
  2491. Kapitel 3.7.2.) setzt sich diese "Verstimmung" in allen folgenden Zeilen
  2492. fort. Der ganze Bildinhalt erscheint dadurch nach rechts gerollt, und zwar
  2493. um soviele Zeichen, wieviele Zyklen der $d011-Zugriff nach Zyklus 14
  2494. gemacht wurde. Da die c-Zugriffe innerhalb der Zeile erst spΣter als in
  2495. einer normalen Bad Line einsetzen, wird dieses Verfahren als "DMA-Delay"
  2496. bezeichnet.
  2497.  
  2498. Damit ist es m÷glich, den kompletten Bildschirm um gro▀e Distanzen seitlich
  2499. zu verschieben (dies funktioniert mit Bitmap-Grafiken genauso wie mit
  2500. Textschirmen, denn der VC wird auch zum Zugriff auf die Bitmap-Daten
  2501. benutzt), ohne den Grafikspeicher mit dem Prozessor umkopieren zu mⁿssen.
  2502. Kombiniert man den DMA-Delay mit FLD und Linecrunch, ist es m÷glich,
  2503. bildschirmfⁿllende Grafiken ohne nennenswerten Rechenzeitverbrauch um fast
  2504. beliebig gro▀e Distanzen in alle Richtungen zu scrollen.
  2505.  
  2506. Das Experimentieren mit dem DMA-Delay (und mit Bad-Line-Effekten generell)
  2507. ist auch die beste Methode, die interne Funktionsweise des VIC,
  2508. insbesondere von RC und VC, zu ergrⁿnden und zu bestimmen, in welchen
  2509. Taktzyklen bestimmte VorgΣnge im VIC ablaufen.
  2510.  
  2511. Es sollte noch erwΣhnt werden, da▀ DMA-Delay nicht nur durch Manipulation
  2512. von YSCROLL, sondern auch mit dem DEN-Bit aus Register $d011 erzielt werden
  2513. kann. Dazu mu▀ man YSCROLL auf Null setzen, damit Rasterzeile $30 zur
  2514. ersten Bad Line wird und DEN mitten in Zeile $30 von gel÷scht auf gesetzt
  2515. schalten. Bad Lines k÷nnen nΣmlich nur auftreten, wenn in Zeile $30 das
  2516. DEN-Bit mindestens einen Zyklus lang gesetzt war, und wenn YSCROLL Null
  2517. ist, tritt in Zeile $30 der Bad-Line-Zustand ein, sobald DEN gesetzt ist.
  2518.  
  2519. 3.14.7 Sprite-Stretching
  2520. ------------------------
  2521.  
  2522. Da die Sprites einfacher aufgebaut sind als die Textgrafik, sind mit ihnen
  2523. nicht so viele besondere Effekte m÷glich, aber darunter ist ein sehr
  2524. interessanter Effekt, der die Funktionsweise der Sprite-Y-Expansion
  2525. ausnutzt: Durch ─ndern der MxYE-Bits in Register $d017 ist es nΣmlich nicht
  2526. nur m÷glich, fⁿr jede Spritezeile einzeln zu bestimmen, ob sie verdoppelt
  2527. werden soll, sondern man kann auch einzelne Zeilen drei- oder mehrmals
  2528. wiederholen lassen und damit ein Sprite oder Teile davon um beliebige
  2529. Faktoren vergr÷▀ern.
  2530.  
  2531. Dieser Effekt lΣ▀t sich wie folgt verstehen (siehe dazu Kapitel 3.8.1.):
  2532.  
  2533. Angenommen, wir befinden uns in Zyklus 55 einer Rasterzeile, in der Sprite
  2534. 0 angeschaltet ist und deren Y-Koordinate gleich der Y-Koordinate des
  2535. Sprites ist, also in der Zeile bevor das Sprite dargestellt wird. Das
  2536. M0YE-Bit sei gesetzt. Dann schaltet der VIC den DMA fⁿr Sprite 0 an und
  2537. l÷scht MCBASE und das Expansions-Flipflop. BA geht nach Low, damit der VIC
  2538. in Zyklus 58 und 59 in den zweiten Taktphasen zugreifen kann. In Zyklus 58
  2539. wird MC mit MCBASE geladen und dadurch ebenfalls gel÷scht, und der
  2540. p-Zugriff fⁿr das Sprite gemacht. Anschlie▀end werden die drei s-Zugriffe
  2541. ausgefⁿhrt und MC nach jedem Zugriff erh÷ht, steht also dann auf 3.
  2542.  
  2543. Nun wartet man auf Zyklus 16 der folgenden Zeile. Da das
  2544. Expansions-Flipflop gel÷scht ist, bleibt MCBASE weiterhin auf Null. Jetzt
  2545. l÷scht man zunΣchst das M0YE-Bit und setzt damit das Flipflop, setzt das
  2546. M0YE-Bit aber danach gleich wieder. In Zyklus 55 wird das Flipflop dann
  2547. invertiert, da M0YE wieder gesetzt ist, und ist nun also gel÷scht (hΣtte
  2548. man das M0YE-Bit nicht gel÷scht, wΣre das Flipflop nun gesetzt). Dies ist
  2549. aber genau der Zustand, in dem der VIC auch in Zyklus 55 der vorigen Zeile
  2550. war. Der VIC "glaubt" daher, sich erst in der ersten Rasterzeile einer
  2551. expandierten Spritezeile zu befinden und wird (da MC immer noch Null ist)
  2552. die erste Spritezeile noch zweimal aus dem Speicher lesen, insgesamt jetzt
  2553. also dreimal: Die erste Spritezeile wurde verdreifacht.
  2554.  
  2555. Ein weiterer interessanter Effekt lΣ▀t sich erzielen, wenn man genau wie
  2556. oben vorgeht, aber das M0YE-Bit nicht nach Zyklus 16 l÷scht, sondern in der
  2557. zweiten Phase von Zyklus 15. Dann wird MCBASE um 1 erh÷ht und die nΣchste
  2558. Spritezeile wird mit MC=1..3 aus dem Speicher gelesen, also ein Byte h÷her
  2559. als vorgesehen. Diese "Verstimmung" setzt sich komplett in der Darstellung
  2560. des Sprites fort. Daher wird auch die Bedingung MC=63 fⁿr das Abschalten
  2561. des Sprite-DMA in Zyklus 16 nicht erreicht und das Sprite wird effektiv
  2562. zweimal direkt hintereinander dargestellt. Erst nach Ende der zweiten
  2563. Darstellung steht MC auf 63 und der DMA wird abgeschaltet.
  2564.  
  2565.  
  2566. 4. Die Adressen 0 und 1 und der $de00-Bereich
  2567. ---------------------------------------------
  2568.  
  2569. Der Adre▀bereich $de00-$dfff des 6510 (siehe 2.4.1) ist fⁿr externe
  2570. Erweiterungen des C64 reserviert und normalerweise mit keinem anderen
  2571. Baustein (RAM, I/O) verbunden. Ein Lesezugriff von diesen Adressen liefert
  2572. scheinbar zufΣllige Daten. Dasselbe gilt fⁿr die oberen Nybbles der
  2573. Adressen $d800-$dbff (das Farb-RAM).
  2574.  
  2575. Auf einigen C64 sind diese Daten jedoch gar nicht "zufΣllig", sondern sind
  2576. vielmehr mit den Daten identisch, die der VIC in der ersten Phase des
  2577. Taktzyklus aus dem Speicher gelesen hat. Dieser Effekt ist jedoch nicht auf
  2578. allen GerΣten und nicht immer prΣzise nachvollziehbar.
  2579.  
  2580. Davon abgesehen, da▀ man dadurch die M÷glichkeit hat, das VIC-Timing allein
  2581. per Software zu vermessen (die Timing-Diagramme aus [4], auf denen auch die
  2582. Diagramme in diesem Artikel basieren, sind z.B. mit dieser Methode erstellt
  2583. worden), kann man den 6510 auch Programme im $de00-Bereich oder im Farb-RAM
  2584. ausfⁿhren lassen, wenn man den VIC eine derartige Grafik darstellen lΣ▀t,
  2585. da▀ der 6510 aus den vom VIC gelesenen Grafikdaten gⁿltige Opcodes erhΣlt.
  2586.  
  2587. Mit einem Σhnlichen Effekt kann man auch vom Prozessor aus die RAM-Adressen
  2588. 0 und 1 beschreiben. Diese sind eigentlich nicht zugΣnglich, da an diesen
  2589. Adressen prozessorintern das Datenrichtungsregister und das Datenregister
  2590. des 6510-I/O-Ports eingeblendet werden und bei einem Schreibzugriff die
  2591. Datenbustreiber im Tri-State bleiben. Allerdings wird die R/W-Leitung auf
  2592. Low gelegt (dies ist damit zu erklΣren, da▀ der I/O-Port erst nachtrΣglich
  2593. in das existierende Design des 6502 integriert wurde) und dadurch gelangt
  2594. das in der ersten Taktphase vom VIC gelesene Byte ins RAM. Will man also
  2595. einen bestimmten Wert an Adresse 0 oder 1 schreiben, so mu▀ man nur ein
  2596. beliebiges Byte an diese Adressen schreiben und dafⁿr sorgen, da▀ der VIC
  2597. in der Phase zuvor den gewⁿnschten Wert aus dem RAM gelesen hat.
  2598.  
  2599. Die Adressen 0 und 1 lassen sich natⁿrlich auch wieder vom Prozessor aus
  2600. lesen. Entweder ⁿber den $de00-Bereich oder mit Hilfe von
  2601. Spritekollisionen. Dabei lΣ▀t man den VIC eine Bitmap ab Adresse 0
  2602. darstellen und bewegt ein Sprite, das nur aus einem Pixel besteht, ⁿber die
  2603. einzelnen Bits der ersten beiden Bytes der Bitmap. Je nachdem, ob eine
  2604. Kollision registriert wurde oder nicht, kann man so den Zustand der
  2605. einzelnen Bits herausfinden und zu einem Byte zusammensetzen.
  2606.  
  2607.  
  2608. Anhang A: Literaturverzeichnis
  2609. ------------------------------
  2610.  
  2611. [1] Commodore Bⁿromaschinen GmbH, "Alles ⁿber den Commodore 64", Anhang L:
  2612.     "Datenblatt Mikroprozessor 6510", 1984
  2613.  
  2614. [2] dto., Anhang N: "6566/6567 Video Interface Controller (VIC-II) Chip
  2615.     Specifications"
  2616.  
  2617. [3] dto., Kapitel 5, Abschnitt "Speicherverwaltung beim Commodore 64",
  2618.     S.256-263
  2619.  
  2620. [4] Marko MΣkelΣ, "The memory accesses of the MOS 6569 VIC-II and MOS 8566
  2621.     VIC-IIe Video Interface Controller", 15.07.1994
  2622.  
  2623. [5] John West, Marko MΣkelΣ, "Documentation for the NMOS 65xx/85xx
  2624.     Instruction Set" (AKA: 64doc), 03.06.1994
  2625.