home *** CD-ROM | disk | FTP | other *** search
/ ftp.elysium.pl / ftp.elysium.pl.tar / ftp.elysium.pl / docs / programming / VIC-Article < prev    next >
Text File  |  2008-03-11  |  124KB  |  2,570 lines

  1.  
  2.                 The MOS 6567/6569 video controller (VIC-II)
  3.                   and its application in the Commodore 64
  4.  
  5.                             by Christian Bauer
  6.                      <bauec002@goofy.zdv.uni-mainz.de>
  7.  
  8.                                 30.May 1996
  9.  
  10.  
  11.  
  12. Contents
  13. --------
  14.  
  15. 1. Introduction
  16. 2. The architecture of the Commodore 64
  17. 2.1. Overview
  18. 2.2. 6510 processor
  19. 2.3. 6567/6569 graphics chip
  20. 2.4. Memory
  21. 2.4.1. Memory map as seen by the 6510
  22. 2.4.2. Memory map as seen by the VIC
  23. 2.4.3. Memory access of 6510 and VIC
  24. 3. Description of the VIC
  25. 3.1. Block diagram
  26. 3.2. Registers
  27. 3.3. Color palette
  28. 3.4. Display generation and display window dimensions
  29. 3.5. Bad Lines
  30. 3.6. Memory access
  31. 3.6.1. The X coordinates
  32. 3.6.2. Access types
  33. 3.6.3. Timing of a raster line
  34. 3.7. Text/bitmap display
  35. 3.7.1. Idle state/display state
  36. 3.7.2. VC and RC
  37. 3.7.3. Graphics modes
  38. 3.7.3.1. Standard text mode (ECM/BMM/MCM=0/0/0)
  39. 3.7.3.2. Multicolor text mode (ECM/BMM/MCM=0/0/1)
  40. 3.7.3.3. Standard bitmap mode (ECM/BMM/MCM=0/1/0)
  41. 3.7.3.4. Multicolor bitmap mode (ECM/BMM/MCM=0/1/1)
  42. 3.7.3.5. ECM text mode (ECM/BMM/MCM=1/0/0)
  43. 3.7.3.6. Invalid text mode (ECM/BMM/MCM=1/0/1)
  44. 3.7.3.7. Invalid bitmap mode 1 (ECM/BMM/MCM=1/1/0)
  45. 3.7.3.8. Invalid bitmap mode 2 (ECM/BMM/MCM=1/1/1)
  46. 3.7.3.9. Idle state
  47. 3.8. Sprites
  48. 3.8.1. Memory access and display
  49. 3.8.2. Priority and collision detection
  50. 3.9. The border units
  51. 3.10. Display Enable
  52. 3.11. Lightpen
  53. 3.12. VIC interrupts
  54. 3.13. DRAM refresh
  55. 3.14. Effects/applications
  56. 3.14.1. Hyperscreen
  57. 3.14.2. FLD
  58. 3.14.3. FLI
  59. 3.14.4. Linecrunch
  60. 3.14.5. Doubled text lines
  61. 3.14.6. DMA delay
  62. 3.14.7. Sprite stretching
  63. 4. The addresses 0 and 1 and the $de00 area
  64.  
  65. Appendix A: Bibliography
  66. Appendix B: Acknowledgments
  67.  
  68.  
  69.  
  70. 1. Introduction
  71. ---------------
  72.  
  73. This paper is an attempt to summarize the results of various people's
  74. examinations of the graphics chip "6567/6569 Video Interface Controller
  75. (VIC-II)" (simply called "VIC" in the following) used in the legendary
  76. Commodore 64, and to provide a complete reference to its specified and
  77. unspecified properties. It is primarily intended for C64 programmers and
  78. authors of C64 emulators, but should also be interesting to "outsiders"
  79. interested in hardware design and programming and hacking a computer up to
  80. the last bits. For this purpose, some general information (e.g. the C64
  81. memory map) already known to experienced C64 programmers has been included
  82. as well.
  83.  
  84. The description of the unspecified properties is based on tests done by
  85. Marko MΣkelΣ, Andreas Boose, Pasi Ojala, Wolfgang Lorenz and myself (not to
  86. mention numerous others) during the last years. It also covers internal
  87. registers and workings of the VIC. As no schematics of the VIC are
  88. available it can of course only be speculative, but in all cases a model
  89. has been chosen that explains the observed phenomena with the minimally
  90. required circuitry. E.g. for the video matrix counter (VC), a model with
  91. two simple counters was given preference to a more elaborate one with a +40
  92. adder.
  93.  
  94. Although some measurements have been done with an oscilloscope directly on
  95. the chip, most insights are based on test programs on the C64 and by
  96. comparing them with the implementation in single cycle emulations like
  97. "Frodo SC".
  98.  
  99.  
  100. 2. The architecture of the Commodore 64
  101. ---------------------------------------
  102.  
  103. This chapter gives an overview of the basic hardware architecture of the
  104. C64 and the integration of the VIC into the system.
  105.  
  106. 2.1. Overview
  107. -------------
  108.  
  109. The C64 basically consists of the following units:
  110.  
  111.  ╖ 6510 8 bit microprocessor
  112.  ╖ 6567/6569 VIC-II graphics chip
  113.  ╖ 6581 SID sound chip
  114.  ╖ Two 6526 CIA I/O chips
  115.  ╖ 64KB DRAM (64K*8 bit) main memory
  116.  ╖ 0.5KB SRAM (1K*4 bit) Color RAM
  117.  ╖ 16KB ROM (16K*8 bit) for operating system and BASIC interpreter
  118.  ╖ 4KB ROM (4K*8 bit) character generator
  119.  
  120. Most chips are manufactured in NMOS technology.
  121.  
  122. 2.2. 6510 processor
  123. -------------------
  124.  
  125. The 6510 microprocessor [1] has an 8 bit data bus and a 16 bit address bus
  126. and is object code compatible with the famous 6502. It has two external
  127. interrupt inputs (one maskable (IRQ) and one non-maskable (NMI)) and as a
  128. special feature a 6 bit wide bidirectional I/O port. It is clocked at 1MHz
  129. in the C64.
  130.  
  131. Important signals:
  132.  
  133. °2     Processor clock output
  134.        This clock signal is the reference for the complete bus timing. Its
  135.        frequency is 1022.7 kHz (NTSC models) or 985.248 kHz (PAL models).
  136.        One period of this signal corresponds to one clock cycle consisting
  137.        of two phases: °2 is low in the first phase and high in the second
  138.        phase (hence the name '°2' for "phase 2"). The 6510 only accesses
  139.        the bus in the second clock phase, the VIC normally only in the
  140.        first phase.
  141.  
  142. R/W    This signal flags a read (R/W high) or write (R/W low) access.
  143.  
  144. IRQ    If this input is held on low level, an interrupt sequence is
  145.        triggered unless interrupts are masked with the interrupt mask bit
  146.        in the status register. The interrupt sequence begins after two
  147.        or more clock cycles at the start of the next instruction. With this
  148.        pin, the VIC can trigger an interrupt in the processor. Interrupts
  149.        are only recognized if the RDY line is high.
  150.  
  151. RDY    If this line is low during a read access, the processor stops with
  152.        the address lines reflecting the current address being fetched. It
  153.        is ignored during write accesses. In the C64, RDY is used to stop
  154.        the processor if the VIC needs additional bus cycles for character
  155.        pointer and sprite data accesses. It is connected to the BA signal
  156.        on the VIC.
  157.  
  158. AEC    This pin tri-states the address lines. This is used for making the
  159.        processor address bus inactive during VIC accesses. The signal is
  160.        connected to the AEC output on the VIC.
  161.  
  162. P0-P5  This is the built-in 6 bit I/O port. Each line can be individually
  163.        programmed as input or output. A data direction register and a data
  164.        register are internally mapped to addresses 0 and 1, respectively.
  165.        You may therefore expect that the processor cannot access the RAM
  166.        addresses 0 and 1 (as they are overlayed by the I/O port), but more
  167.        on this later...
  168.  
  169. 2.3. 6567/6569 graphics chip
  170. ----------------------------
  171.  
  172. The 656* series graphics chip by MOS Technologies were originally designed
  173. to be used in video games and graphics terminals. But as the sales in these
  174. markets have been rather poor, Commodore decided to use the chips when they
  175. were planning to make their own home computers.
  176.  
  177. In the C64, the "Video Interface Controller II (VIC-II)" [2] has been used,
  178. featuring 3 text based (40x25 characters with 8x8 pixels each) and 2 bitmap
  179. based (320x200 pixels) video modes, 8 hardware sprites and a fixed palette
  180. of 16 colors. It can manage up to 16KB of dynamic RAM (including the
  181. generation of RAS and CAS and the RAM refresh) and also has a light pen
  182. input and interrupt possibilities.
  183.  
  184. Two VIC types appear in the C64: The 6567 in NTSC machines and the 6569 in
  185. PAL machines. There are several mask steppings of both types, but the
  186. differences are mostly neglectable with the exception of the 6567R56A.
  187. Newer C64 versions are bearing the functionally equivalent chips 8562
  188. (NTSC) and 8565 (PAL). In the following, only 6567/6569 will be mentioned,
  189. but all statements are applicable for the 856* chips. There is also a 6566
  190. designed to be connected to static RAM but this one was never used in C64s.
  191.  
  192. Important signals:
  193.  
  194. A0-A13  The 14 bit video address bus used by the VIC to address 16KB of
  195.         memory. The address bits A0-A5 and A8-A13 are multiplexed in pairs
  196.         (i.e. A0/A8, A1/A9 etc.) on one pin each. The bits A6-A11 are
  197.         (additionally) available on separate lines.
  198.  
  199. D0-D11  A 12 bit wide data bus over which the VIC accesses the memory. The
  200.         lower 8 bits are connected to the main memory and the processor
  201.         data bus, the upper 4 bits are connected to a special 4 bit wide
  202.         static memory (1024 addresses, A0-A9) used for storing color
  203.         information, the Color RAM.
  204.  
  205. IRQ     This output is wired to the IRQ input on the processor and makes it
  206.         possible for the VIC to trigger interrupts. The VIC has four
  207.         interrupt sources: On reaching a certain raster line (raster
  208.         interrupt), on the collision of two or more sprites, on the
  209.         collision of sprites with graphics data and on a negative edge on
  210.         the light pen input.
  211.  
  212. BA      With this signal, the VIC indicated that the bus is available to
  213.         the processor during the second clock phase (°2 high). BA is
  214.         normally high as the VIC accesses the bus mostly during the first
  215.         phase. But for the character pointer and sprite data accesses, the
  216.         VIC also needs the bus sometimes during the second phase. In this
  217.         case, BA goes low three cycles before the VIC access. After that,
  218.         AEC remains low during the second phase and the VIC performs the
  219.         accesses. Why three cycles? BA is connected to the RDY line of the
  220.         processor as mentioned, but this line is ignored on write accesses
  221.         (the CPU can only be interrupted on reads), and the 6510 never does
  222.         more than three writes in sequence (see [5]).
  223.  
  224. AEC     This pin is wired to the processor signal with the same name (see
  225.         there). It reflects the state of the data and address line drivers
  226.         of the VIC. If AEC is high, they are in tri-state. AEC is normally
  227.         low during the first clock phase (°2 low) and high during the
  228.         second phase so that the VIC can access the bus during the first
  229.         phase and the 6510 during the second phase. If the VIC also needs
  230.         the bus in the second phase, AEC remains low.
  231.  
  232. LP      This input is intended for connecting a light pen. On a negative
  233.         edge, the current position of the raster beam is latched to the
  234.         registers LPX and LPY. As this pin shares a line with the keyboard
  235.         matrix, it can also be accessed by software.
  236.  
  237. °IN     This is the feed for the pixel clock of 8.18 MHz (NTSC) or 7.88 MHz
  238.         (PAL) that is generated from the crystal frequency. Eight pixels
  239.         are displayed per bus clock cycle (°2).
  240.  
  241. °0      From the pixel clock on °IN, the VIC generates the system clock of
  242.         1.023 MHz (NTSC) or 0.985 MHz (PAL) by dividing °IN by eight. It is
  243.         available on this pin and fed into the processor which in turn
  244.         generated the signal °2 from it.
  245.  
  246. 2.4. Memory
  247. -----------
  248.  
  249. Three memory areas in the C64 are involved with the graphics:
  250.  
  251.  ╖ The 64KB main memory
  252.  ╖ The 1K*4 bit Color RAM
  253.  ╖ The 4KB character generator ROM (Char ROM)
  254.  
  255. In the following two sections it is explained how these memory areas share
  256. the address space as seen by the CPU and the VIC. After that, the basics of
  257. memory access and DRAM handling are mentioned.
  258.  
  259. 2.4.1 Memory map as seen by the 6510
  260. ------------------------------------
  261.  
  262. The 6510 can address 64KB linearly with its 16 address lines. With the aid
  263. of a special PAL chip in the C64, many different memory configurations can
  264. be used via the 6510 I/O port lines and control lines on the expansion
  265. port (see [3]). Only the standard configuration will be discussed here as
  266. the other configurations don't change the position of the different areas.
  267. They only map in additional areas of the main memory.
  268.  
  269. So this is the memory map as seen by the 6510:
  270.  
  271.  
  272.                                The area at $d000-$dfff with
  273.                                   CHAREN=1     CHAREN=0
  274.  
  275.  $ffff +--------------+  /$e000 +----------+  +----------+
  276.        |  Kernal ROM  | /       |  I/O  2  |  |          |
  277.  $e000 +--------------+/  $df00 +----------+  |          |
  278.        |I/O, Char ROM |         |  I/O  1  |  |          |
  279.  $d000 +--------------+\  $de00 +----------+  |          |
  280.        |     RAM      | \       |  CIA  2  |  |          |
  281.  $c000 +--------------+  \$dd00 +----------+  |          |
  282.        |  Basic ROM   |         |  CIA  1  |  |          |
  283.  $a000 +--------------+   $dc00 +----------+  | Char ROM |
  284.        |              |         |Color RAM |  |          |
  285.        .     RAM      .         |          |  |          |
  286.        .              .   $d800 +----------+  |          |
  287.        |              |         |   SID    |  |          |
  288.  $0002 +--------------+         |registers |  |          |
  289.        | I/O port DR  |   $d400 +----------+  |          |
  290.  $0001 +--------------+         |   VIC    |  |          |
  291.        | I/O port DDR |         |registers |  |          |
  292.  $0000 +--------------+   $d000 +----------+  +----------+
  293.  
  294.  
  295. Basically, the 64KB main memory can be accessed in a linear fashion, but
  296. they are overlaid by ROM and register areas at several positions. A write
  297. access to a ROM area will store the byte in the RAM lying "under" the ROM.
  298. The 6510 I/O port is mapped to addresses $0000 (for the data direction
  299. register) and $0001 (for the data register).
  300.  
  301. In the area at $d000-$dfff you can switch between the I/O chip registers
  302. and the Color RAM, or the character generator ROM, with the signal CHAREN
  303. (which is bit 2 of the 6510 I/O port). The Color RAM is mapped at
  304. $d800-$dbff and connected to the lower 4 data bits. The upper 4 bits are
  305. open and have "random" values on reading. The two areas named "I/O 1" and
  306. "I/O 2" are reserved for expansion cards and also open under normal
  307. circumstances. Hence, a read access will fetch "random" values here too (it
  308. will be explained in chapter 4 that these values are not really random.
  309. Reading from open addresses fetches the last byte read by the VIC on many
  310. C64s).
  311.  
  312. The 47 registers of the VIC are mapped in at $d000. Due to the incomplete
  313. address decoding, they are repeated every 64 bytes in the area $d000-$d3ff.
  314.  
  315. 2.4.2 Memory map as seen by the VIC
  316. -----------------------------------
  317.  
  318. The VIC has only 14 address lines, so it can only address 16KB of memory.
  319. It can access the complete 64KB main memory all the same because the 2
  320. missing address bits are provided by one of the CIA I/O chips (they are the
  321. inverted bits 0 and 1 of port A of CIA 2). With that you can select one of
  322. 4 16KB banks for the VIC at a time.
  323.  
  324. The (extended) memory map as seen by the VIC looks like this:
  325.  
  326.  
  327.  $ffff +----------+   --
  328.        |          |
  329.        |          |
  330.        |          |
  331.        |   RAM    | Bank 3
  332.        |          |
  333.        |          |
  334.        |          |
  335.  $c000 +----------+   --
  336.        |          |
  337.        |   RAM    |
  338.        |          |
  339.  $a000 +----------+ Bank 2
  340.        | Char ROM |
  341.  $9000 +----------+
  342.        |   RAM    |
  343.  $8000 +----------+   --
  344.        |          |
  345.        |          |
  346.        |          |
  347.        |   RAM    | Bank 1
  348.        |          |
  349.        |          |
  350.        |          |
  351.  $4000 +----------+   --
  352.        |          |
  353.        |   RAM    |
  354.        |          |
  355.  $2000 +----------+ Bank 0
  356.        | Char ROM |
  357.  $1000 +----------+
  358.        |   RAM    |
  359.  $0000 +----------+   --
  360.  
  361.  
  362. The Char ROM is mapped in at the VIC addresses $1000-$1fff in banks 0 and
  363. 2 (it appears at $9000 in the above diagram, but remember that the VIC
  364. doesn't know about the two address bits generated by the CIA. From the
  365. VIC's point of view, the Char ROM is at $1000-$1fff also in bank 2).
  366.  
  367. The attentive reader will already have noticed that the Color RAM doesn't
  368. appear anywhere. But as explained earlier, the VIC has a 12 bit data bus of
  369. which the upper 4 bits are connected with the Color RAM. Generally
  370. speaking, the sole purpose of the upper 4 bits of the VIC data bus is to
  371. read from the Color RAM. The Color RAM is addressed by the lower 10 bits of
  372. the VIC address bus and is therefore available in all banks at all
  373. addresses.
  374.  
  375. 2.4.3 Memory access of the 6510 and VIC
  376. ---------------------------------------
  377.  
  378. 6510 and VIC are both based on a relatively simple hard-wired design. Both
  379. chips make a memory access in EVERY clock cycle, even if that is not
  380. necessary at all. E.g if the processor is busy executing an internal
  381. operation like indexed addressing in one clock cycle, that really doesn't
  382. require an access to memory, it nevertheless performs a read and discards
  383. the read byte. The VIC only performs read accesses, while the 6510 performs
  384. both reads and writes.
  385.  
  386. There are no wait states, no internal caches and no sophisticated access
  387. protocols for the bus as seen with more modern processors. Every access is
  388. done in a single cycle.
  389.  
  390. The VIC generates the clock frequencies for the system bus and the RAS and
  391. CAS signals for accessing the dynamic RAM (for both the processor and the
  392. VIC). So it has primary control over the bus and may "stun" the processor
  393. sometime or another when it needs additional cycles for memory accesses.
  394. Besides this, the VIC takes care of the DRAM refresh by reading from 5
  395. refresh addresses in each raster line.
  396.  
  397. The division of accesses between 6510 and VIC is basically static: Each
  398. clock cycle (one period of the °2 signal) consists of two phases. The VIC
  399. accesses in the first phase (°2 low), the processor in the second phase (°2
  400. high). The AEC signal closely follows °2. That way the 6510 and VIC can
  401. both use the memory alternatively without disturbing each other.
  402.  
  403. However, the VIC sometimes needs more cycles than made available to it by
  404. this scheme. This is the case when the VIC accesses the character pointers
  405. and the sprite data. In the first case it needs 40 additional cycles, in
  406. the second case it needs 2 cycles per sprite. BA will then go low 3 cycles
  407. before the VIC takes over the bus completely (3 cycles is the maximum
  408. number of successive write accesses of the 6510). After 3 cycles, AEC stays
  409. low during the second clock phase so that the VIC can output its addresses.
  410.  
  411. The following diagram illustrates the process of the take-over:
  412.  
  413.        _ _ _ _ _ _ _ _ _ _ _ _ _    _ _ _ _ _ _ _ _ _ _ _ _ _
  414.  °2   _ _ _ _ _ _ _ _ _ _ _ _ _ ..._ _ _ _ _ _ _ _ _ _ _ _ _
  415.       ______________                       __________________
  416.  BA                 ____________...________
  417.        _ _ _ _ _ _ _ _ _ _                  _ _ _ _ _ _ _ _ _
  418.  AEC  _ _ _ _ _ _ _ _ _ _ ______..._________ _ _ _ _ _ _ _ _
  419.  
  420.  Chip VPVPVPVPVPVPVPVpVpVpVVVVVV...VVVVVVVVVPVPVPVPVPVPVPVP
  421.  
  422.            1       |  2  |       3        |       4
  423.          Normal    |Take-| VIC has taken  |  VIC releases
  424.       bus activity |over | over the bus   |    the bus
  425.  
  426.  
  427. The line "Chip" designates which chip is just accessing the bus (as said
  428. before, there is an access in every cycle). "V" stands for the VIC, "P" for
  429. the 6510. The cycles designated with "p" are accesses of the 6510 that are
  430. only performed if they are write accesses. The first "p" read access stops
  431. the 6510, at least after the third "p" as the 6510 never does more than 3
  432. write accesses in succession. On a "p" read access the processor addresses
  433. are still output on the bus because AEC is still high.
  434.  
  435. The diagram describes the normal process of a bus take-over. By
  436. appropriately modifying the VIC register $d011, it is possible to force a
  437. bus take-over at extraordinary times. This is explained in chapter 3 as
  438. well as the complete bus timing of a VIC raster line.
  439.  
  440.  
  441. 3. Description of the VIC
  442. -------------------------
  443.  
  444. This chapter is about the single function units in the VIC, their way of
  445. working and their unspecified behavior, and the insights into the internal
  446. functions of the VIC that can be gained by that.
  447.  
  448. 3.1. Block diagram
  449. ------------------
  450.  
  451. The following block diagram gives an overview over the internal structure
  452. of the VIC and the independently working function units:
  453.  
  454.  
  455.  IRQ <---------------------------------+
  456.                                        |
  457.             +---------------+ +-----------------+
  458.             |Refresh counter| | Interrupt logic |<----------------------+
  459.             +---------------+ +-----------------+                       |
  460.         +-+    |               ^                                        |
  461.   A     |M|    v               |                                        |
  462.   d     |e|   +-+    +--------------+  +-------+                        |
  463.   d     |m|   |A|    |Raster counter|->| VC/RC |                        |
  464.   r     |o|   |d| +->|      X/Y     |  +-------+                        |
  465.   . <==>|r|   |d| |  +--------------+      |                            |
  466.   +     |y|   |r| |     | | |              |                            |
  467.   d     | |   |.|<--------+----------------+ +------------------------+ |
  468.   a     |i|   |g|===========================>|40╫12 bit video matrix-/| |
  469.   t     |n|<=>|e| |     |   |                |       color line       | |
  470.   a     |t|   |n| |     |   |                +------------------------+ |
  471.         |e|   |e| |     |   |                            ||             |
  472.         |r|   |r| |     |   | +----------------+         ||             |
  473.  BA  <--|f|   |a|============>|8╫24 bit sprite |         ||             |
  474.         |a|   |t|<----+ |   | |  data buffers  |         ||             |
  475.  AEC <--|c|   |o| |   | v   | +----------------+         ||             |
  476.         |e|   |r| | +-----+ |         ||                 ||             |
  477.         +-+   +-+ | |MC0-7| |         \/                 \/             |
  478.                   | +-----+ |  +--------------+   +--------------+      |
  479.                   |         |  | Sprite data  |   |Graphics data |      |
  480.         +---------------+   |  |  sequencer   |   |  sequencer   |      |
  481.  RAS <--|               |   |  +--------------+   +--------------+      |
  482.  CAS <--|Clock generator|   |              |         |                  |
  483.  °0  <--|               |   |              v         v                  |
  484.         +---------------+   |       +-----------------------+           |
  485.                 ^           |       |          MUX          |           |
  486.                 |           |       | Sprite priorities and |-----------+
  487.  °IN -----------+           |       |  collision detection  |
  488.                             |       +-----------------------+
  489.    VC: Video Matrix Counter |                   |
  490.                             |                   v
  491.    RC: Row Counter          |            +-------------+
  492.                             +----------->| Border unit |
  493.    MC: MOB Data Counter     |            +-------------+
  494.                             |                   |
  495.                             v                   v
  496.                     +----------------+  +----------------+
  497.                     |Sync generation |  |Color generation|<-------- °COLOR
  498.                     +----------------+  +----------------+
  499.                                    |      |
  500.                                    v      v
  501.                                  Video output
  502.                                (S/LUM and COLOR)
  503.  
  504.  
  505. The lightpen unit is not shown.
  506.  
  507. As you can see, the "Raster counter X/Y" plays a central role. This is no
  508. surprise as the complete screen display and all bus accesses are
  509. synchronized by it.
  510.  
  511. It is important to note that the units for display and for the needed
  512. memory accesses are separate from each other for the sprites as well as for
  513. the graphics. There is a data buffer between the two units that holds the
  514. read graphics data and buffers it for the display circuits. In the normal
  515. operation of the VIC, the functions of the two units are so closely tied to
  516. each other that they appear like a single function block. By appropriate
  517. programming, however, you can decouple the circuits and e.g. display
  518. graphics without previously having read data (in this case, the data which
  519. are still in the buffer are displayed).
  520.  
  521. 3.2. Registers
  522. --------------
  523.  
  524. The VIC has 47 read/write registers for the processor to control its
  525. functions:
  526.  
  527.  #| Adr.  |Bit7|Bit6|Bit5|Bit4|Bit3|Bit2|Bit1|Bit0| Function
  528. --+-------+----+----+----+----+----+----+----+----+------------------------
  529.  0| $d000 |                  M0X                  | X coordinate sprite 0
  530. --+-------+---------------------------------------+------------------------
  531.  1| $d001 |                  M0Y                  | Y coordinate sprite 0
  532. --+-------+---------------------------------------+------------------------
  533.  2| $d002 |                  M1X                  | X coordinate sprite 1
  534. --+-------+---------------------------------------+------------------------
  535.  3| $d003 |                  M1Y                  | Y coordinate sprite 1
  536. --+-------+---------------------------------------+------------------------
  537.  4| $d004 |                  M2X                  | X coordinate sprite 2
  538. --+-------+---------------------------------------+------------------------
  539.  5| $d005 |                  M2Y                  | Y coordinate sprite 2
  540. --+-------+---------------------------------------+------------------------
  541.  6| $d006 |                  M3X                  | X coordinate sprite 3
  542. --+-------+---------------------------------------+------------------------
  543.  7| $d007 |                  M3Y                  | Y coordinate sprite 3
  544. --+-------+---------------------------------------+------------------------
  545.  8| $d008 |                  M4X                  | X coordinate sprite 4
  546. --+-------+---------------------------------------+------------------------
  547.  9| $d009 |                  M4Y                  | Y coordinate sprite 4
  548. --+-------+---------------------------------------+------------------------
  549. 10| $d00a |                  M5X                  | X coordinate sprite 5
  550. --+-------+---------------------------------------+------------------------
  551. 11| $d00b |                  M5Y                  | Y coordinate sprite 5
  552. --+-------+---------------------------------------+------------------------
  553. 12| $d00c |                  M6X                  | X coordinate sprite 6
  554. --+-------+---------------------------------------+------------------------
  555. 13| $d00d |                  M6Y                  | Y coordinate sprite 6
  556. --+-------+---------------------------------------+------------------------
  557. 14| $d00e |                  M7X                  | X coordinate sprite 7
  558. --+-------+---------------------------------------+------------------------
  559. 15| $d00f |                  M7Y                  | Y coordinate sprite 7
  560. --+-------+----+----+----+----+----+----+----+----+------------------------
  561. 16| $d010 |M7X8|M6X8|M5X8|M4X8|M3X8|M2X8|M1X8|M0X8| MSBs of X coordinates
  562. --+-------+----+----+----+----+----+----+----+----+------------------------
  563. 17| $d011 |RST8| ECM| BMM| DEN|RSEL|    YSCROLL   | Control register 1
  564. --+-------+----+----+----+----+----+--------------+------------------------
  565. 18| $d012 |                 RASTER                | Raster counter
  566. --+-------+---------------------------------------+------------------------
  567. 19| $d013 |                  LPX                  | Light pen X
  568. --+-------+---------------------------------------+------------------------
  569. 20| $d014 |                  LPY                  | Light pen Y
  570. --+-------+----+----+----+----+----+----+----+----+------------------------
  571. 21| $d015 | M7E| M6E| M5E| M4E| M3E| M2E| M1E| M0E| Sprite enabled
  572. --+-------+----+----+----+----+----+----+----+----+------------------------
  573. 22| $d016 |  - |  - | RES| MCM|CSEL|    XSCROLL   | Control register 2
  574. --+-------+----+----+----+----+----+----+----+----+------------------------
  575. 23| $d017 |M7YE|M6YE|M5YE|M4YE|M3YE|M2YE|M1YE|M0YE| Sprite Y expansion
  576. --+-------+----+----+----+----+----+----+----+----+------------------------
  577. 24| $d018 |VM13|VM12|VM11|VM10|CB13|CB12|CB11|  - | Memory pointers
  578. --+-------+----+----+----+----+----+----+----+----+------------------------
  579. 25| $d019 | IRQ|  - |  - |  - | ILP|IMMC|IMBC|IRST| Interrupt register
  580. --+-------+----+----+----+----+----+----+----+----+------------------------
  581. 26| $d01a |  - |  - |  - |  - | ELP|EMMC|EMBC|ERST| Interrupt enabled
  582. --+-------+----+----+----+----+----+----+----+----+------------------------
  583. 27| $d01b |M7DP|M6DP|M5DP|M4DP|M3DP|M2DP|M1DP|M0DP| Sprite data priority
  584. --+-------+----+----+----+----+----+----+----+----+------------------------
  585. 28| $d01c |M7MC|M6MC|M5MC|M4MC|M3MC|M2MC|M1MC|M0MC| Sprite multicolor
  586. --+-------+----+----+----+----+----+----+----+----+------------------------
  587. 29| $d01d |M7XE|M6XE|M5XE|M4XE|M3XE|M2XE|M1XE|M0XE| Sprite X expansion
  588. --+-------+----+----+----+----+----+----+----+----+------------------------
  589. 30| $d01e | M7M| M6M| M5M| M4M| M3M| M2M| M1M| M0M| Sprite-sprite collision
  590. --+-------+----+----+----+----+----+----+----+----+------------------------
  591. 31| $d01f | M7D| M6D| M5D| M4D| M3D| M2D| M1D| M0D| Sprite-data collision
  592. --+-------+----+----+----+----+----+----+----+----+------------------------
  593. 32| $d020 |  - |  - |  - |  - |         EC        | Border color
  594. --+-------+----+----+----+----+-------------------+------------------------
  595. 33| $d021 |  - |  - |  - |  - |        B0C        | Background color 0
  596. --+-------+----+----+----+----+-------------------+------------------------
  597. 34| $d022 |  - |  - |  - |  - |        B1C        | Background color 1
  598. --+-------+----+----+----+----+-------------------+------------------------
  599. 35| $d023 |  - |  - |  - |  - |        B2C        | Background color 2
  600. --+-------+----+----+----+----+-------------------+------------------------
  601. 36| $d024 |  - |  - |  - |  - |        B3C        | Background color 3
  602. --+-------+----+----+----+----+-------------------+------------------------
  603. 37| $d025 |  - |  - |  - |  - |        MM0        | Sprite multicolor 0
  604. --+-------+----+----+----+----+-------------------+------------------------
  605. 38| $d026 |  - |  - |  - |  - |        MM1        | Sprite multicolor 1
  606. --+-------+----+----+----+----+-------------------+------------------------
  607. 39| $d027 |  - |  - |  - |  - |        M0C        | Color sprite 0
  608. --+-------+----+----+----+----+-------------------+------------------------
  609. 40| $d028 |  - |  - |  - |  - |        M1C        | Color sprite 1
  610. --+-------+----+----+----+----+-------------------+------------------------
  611. 41| $d029 |  - |  - |  - |  - |        M2C        | Color sprite 2
  612. --+-------+----+----+----+----+-------------------+------------------------
  613. 42| $d02a |  - |  - |  - |  - |        M3C        | Color sprite 3
  614. --+-------+----+----+----+----+-------------------+------------------------
  615. 43| $d02b |  - |  - |  - |  - |        M4C        | Color sprite 4
  616. --+-------+----+----+----+----+-------------------+------------------------
  617. 44| $d02c |  - |  - |  - |  - |        M5C        | Color sprite 5
  618. --+-------+----+----+----+----+-------------------+------------------------
  619. 45| $d02d |  - |  - |  - |  - |        M6C        | Color sprite 6
  620. --+-------+----+----+----+----+-------------------+------------------------
  621. 46| $d02e |  - |  - |  - |  - |        M7C        | Color sprite 7
  622. --+-------+----+----+----+----+-------------------+------------------------
  623.  
  624. Notes:
  625.  
  626.  ╖ The bits marked with '-' are not connected and give "1" on reading
  627.  ╖ The VIC registers are repeated each 64 bytes in the area $d000-$d3ff,
  628.    i.e. register 0 appears on addresses $d000, $d040, $d080 etc.
  629.  ╖ The unused addresses $d02f-$d03f give $ff on reading, a write access is
  630.    ignored
  631.  ╖ The registers $d01e and $d01f cannot be written and are automatically
  632.    cleared on reading
  633.  ╖ The RES bit (bit 5) of register $d016 has no function on the VIC
  634.    6567/6569 examined as yet. On the 6566, this bit is used to stop the
  635.    VIC.
  636.  ╖ Bit 7 in register $d011 (RST8) is bit 8 of register $d012. Together they
  637.    are called "RASTER" in the following. A write access to these bits sets
  638.    the comparison line for the raster interrupt (see section 3.12.).
  639.  ╖ Apart from the DEN bit in register $d011, all register modifications
  640.    have an immediate effect. E.g. you can change the border color with
  641.    register $d020 in the middle of the screen.
  642.  
  643. 3.3. Color palette
  644. ------------------
  645.  
  646. The VIC has a hard-wired palette of 16 colors that are encoded with 4 bits:
  647.  
  648.   0 black
  649.   1 white
  650.   2 red
  651.   3 cyan
  652.   4 pink
  653.   5 green
  654.   6 blue
  655.   7 yellow
  656.   8 orange
  657.   9 brown
  658.  10 light red
  659.  11 dark gray
  660.  12 medium gray
  661.  13 light green
  662.  14 light blue
  663.  15 light gray
  664.  
  665. 3.4. Display generation and display window dimensions
  666. -----------------------------------------------------
  667.  
  668. As usual for controlling CRTs, the VIC builds the video frame line by line.
  669. The line number and the number of clock cycles per line are constant for
  670. every VIC type. The VIC works character-based, every character consists of
  671. a matrix of 8╫8 pixels, so a text line is made up of 8 pixel lines. 40╫25
  672. text characters are displayed in the text based modes, 320╫200 or 160╫200
  673. pixels in the bitmap modes.
  674.  
  675. In this article, the specification of a position on the screen is done with
  676. the raster line number as the Y coordinate (RASTER, register $d011/$d012)
  677. and a X coordinate that corresponds to the sprite coordinate system. When
  678. specifying the time of a VIC memory access or an internal operation in the
  679. VIC, the raster line number is used as Y coordinate and the number of the
  680. clock cycle within the line as X coordinate. As previously mentioned, 8
  681. pixels make a clock cycle, so the specification of a sprite X coordinate is
  682. eight times more precise than that of a cycle number.
  683.  
  684. The graphics are displayed in an unmovable window in the middle of the
  685. visible screen area, the "display window". The area outside the display
  686. window is covered by the screen border and is displayed in the border color
  687. (EC, register $d020). You can also turn off the border partially or
  688. completely with some little tweaking; then you see that the display window
  689. is part of a "display column" that is made up by the linear extension of
  690. the display window to the top and bottom. With that you can divide the
  691. border in an upper/lower border and a left/right border. The visible screen
  692. area is surrounded by blanking intervals in which the video signal is
  693. turned off and in which the raster beam returns to the start of the next
  694. line or the start of the frame, respectively.
  695.  
  696. The following figure (not in scale) illustrates the last paragraph:
  697.  
  698.  
  699.                 Visible pixels/line
  700.      ____________________|___________________
  701.     /                                        \
  702.  
  703. +------------------------------------------------+  <- Raster line 0 (6569)
  704. |       .                                .       |
  705. |       .   Vertical blanking interval   .       |
  706. |       .                                .       |
  707. +---+---+--------------------------------+---+---+  \
  708. |   |   |                                |   |   |  |
  709. | H |   |          Upper border          |   | H |  |
  710. | o |   |                                |   | o |  |
  711. | r |   +--------------------------------+   | r |  |
  712. | i |   |                                |   | i |  |
  713. | z |   |                                |   | z |  |
  714. | o |   |                                |   | o |  |
  715. | n |   |                                |   | n |  |
  716. | t |   |                                |   | t |  |
  717. | a |   |                                | r | a |  |
  718. | l | l |                                | i | l |  |
  719. |   | e |                                | g |   |  |
  720. | b | f |                                | h | b |  |
  721. | l | t |                                | t | l |  |
  722. | a |   |         Display window         |   | a |  |- Visible lines
  723. | n | b |                                | b | n |  |
  724. | k | o |                                | o | k |  |
  725. | i | r |                                | r | i |  |
  726. | n | d |                                | d | n |  |
  727. | g | e |                                | e | g |  |
  728. |   | r |                                | r |   |  |
  729. | i |   |                                |   | i |  |
  730. | n |   |                                |   | n |  |
  731. | t |   |                                |   | t |  |
  732. | e |   |                                |   | e |  |
  733. | r |   |                                |   | r |  |
  734. | v |   +--------------------------------+   | v |  |
  735. | a |   |                                |   | a |  |
  736. | l |   |          Lower border          |   | l |  | <- Raster line 0 (6567)
  737. |   |   |                                |   |   |  |
  738. +---+---+--------------------------------+---+---+  /
  739. |       .                                .       |
  740. |       .   Vertical blanking interval   .       |
  741. |       .                                .       |
  742. +------------------------------------------------+
  743.  
  744.       ^ \________________________________/
  745.       |                 |
  746.       |           Display column
  747.       |
  748.  X coordinate 0
  749.  
  750.  
  751. The height and width of the display window can each be set to two different
  752. values with the bits RSEL and CSEL in the registers $d011 and $d016:
  753.  
  754.  RSEL|  Display window height   | First line  | Last line
  755.  ----+--------------------------+-------------+----------
  756.    0 | 24 text lines/192 pixels |   55 ($37)  | 246 ($f6)
  757.    1 | 25 text lines/200 pixels |   51 ($33)  | 250 ($fa)
  758.  
  759.  CSEL|   Display window width   | First X coo. | Last X coo.
  760.  ----+--------------------------+--------------+------------
  761.    0 | 38 characters/304 pixels |   31 ($1f)   |  334 ($14e)
  762.    1 | 40 characters/320 pixels |   24 ($18)   |  343 ($157)
  763.  
  764. If RSEL=0 the upper and lower border are each extended by 4 pixels into the
  765. display window, if CSEL=0 the left border is extended by 7 pixels and the
  766. right one by 9 pixels. The position of the display window and its
  767. resolution do not change, RSEL/CSEL only switch the starting and ending
  768. position of the border display. The size of the video matrix also stays
  769. constantly at 40╫25 characters.
  770.  
  771. With XSCROLL/YSCROLL (bits 0-2 of registers $d011 and $d016), the position
  772. of the graphics inside the display window can be scrolled in single-pixel
  773. units up to 7 pixels to the right and to the bottom. This can be used for
  774. soft scrolling. The position of the display window itself doesn't change.
  775. To keep the graphics aligned with the window, X/YSCROLL have to be 3 and 0
  776. for 25 lines/40 columns and both 7 for 24 lines/38 columns.
  777.  
  778. The dimensions of the video display for the different VIC types are as
  779. follows:
  780.  
  781.           | Video  | # of  | Visible | Cycles/ |  Visible
  782.    Type   | system | lines |  lines  |  line   | pixels/line
  783.  ---------+--------+-------+---------+---------+------------
  784.  6567R56A | NTSC-M |  262  |   234   |   64    |    411
  785.   6567R8  | NTSC-M |  263  |   235   |   65    |    418
  786.    6569   |  PAL-B |  312  |   284   |   63    |    403
  787.  
  788.           | First  |  Last  |              |   First    |   Last
  789.           | vblank | vblank | First X coo. |  visible   |  visible
  790.    Type   |  line  |  line  |  of a line   |   X coo.   |   X coo.
  791.  ---------+--------+--------+--------------+------------+-----------
  792.  6567R56A |   13   |   40   |  412 ($19c)  | 488 ($1e8) | 388 ($184)
  793.   6567R8  |   13   |   40   |  412 ($19c)  | 489 ($1e9) | 396 ($18c)
  794.    6569   |  300   |   15   |  404 ($194)  | 480 ($1e0) | 380 ($17c)
  795.  
  796. If you are wondering why the first visible X coordinates seem to come after
  797. the last visible ones: This is because for the reference point to mark the
  798. beginning of a raster line, the occurrence of the raster IRQ has been
  799. chosen, which doesn't coincide with X coordinate 0 but with the coordinate
  800. given as "First X coo. of a line". The X coordinates run up to $1ff (only
  801. $1f7 on the 6569) within a line, then comes X coordinate 0. This is
  802. explained in more detail in the explanation of the structure of a raster
  803. line.
  804.  
  805. 3.5. Bad Lines
  806. --------------
  807.  
  808. As already mentioned, the VIC needs 40 additional bus cycles when fetching
  809. the character pointers (i.e. the character codes of one text line from the
  810. video matrix), because the 63-65 bus cycles available for transparent
  811. (unnoticed by the processor) access for the VIC during the first clock
  812. phases within a line are not sufficient to read both the character pointers
  813. and the pixel data for the characters from memory.
  814.  
  815. For this reason, the VIC uses the mechanism described in section 2.4.3. to
  816. "stun" the processor for 40-43 cycles during the first pixel line of each
  817. text line to read the character pointers. The raster lines in which this
  818. happens are usually called "Bad Lines" ("bad" because they stop the
  819. processor and thus slow down the computer and lead to problems if the
  820. precise timing of a program is essential, e.g. for the transmission of data
  821. to/from a floppy drive).
  822.  
  823. The character pointer access is also done in the bitmap modes, because the
  824. video matrix data is then used for color information.
  825.  
  826. Normally, every eighth line inside the display window, starting with the
  827. very first line of the graphics, is a Bad Line, i.e the first raster lines
  828. of each text line. So the position of the Bad Lines depends on the YSCROLL.
  829. As you will see later, the whole graphics display and memory access scheme
  830. depend completely on the position of the Bad Lines.
  831.  
  832. It is therefore necessary to introduce a more general definition, namely
  833. that of a "Bad Line Condition":
  834.  
  835.  A Bad Line Condition is given at any arbitrary clock cycle, if at the
  836.  negative edge of °0 at the beginning of the cycle RASTER >= $30 and RASTER
  837.  <= $f7 and the lower three bits of RASTER are equal to YSCROLL and if the
  838.  DEN bit was set during an arbitrary cycle of raster line $30.
  839.  
  840. This definition has to be taken literally. You can generate and take away a
  841. Bad Line condition multiple times within an arbitrary raster line in the
  842. range of $30-$f7 by modifying YSCROLL, and thus make every raster line
  843. within the display window completely or partially a Bad Line, or trigger or
  844. suppress all the other functions that are connected with a Bad Line
  845. Condition. If YSCROLL=0, a Bad Line Condition occurs in raster line $30 as
  846. soon as the DEN bit (register $d011, bit 4) is set (for more about the DEN
  847. bit, see section 3.10.).
  848.  
  849. The following three sections describe the function units that are used for
  850. displaying the graphics. Section 3.6. explains the the memory interface
  851. that is used to read the graphics data and the timing of the accesses
  852. within a raster line. Section 3.7. is about the display unit that converts
  853. the text and bitmap graphics data into colors and generates the addresses
  854. for the memory access. Section 3.8. covers the sprites and their address
  855. generation.
  856.  
  857. 3.6. Memory access
  858. ------------------
  859.  
  860. 3.6.1. The X coordinates
  861. ------------------------
  862.  
  863. Before explaining the timing of memory accesses within a raster line, we
  864. will quickly explain how to obtain the X coordinates. This is necessary
  865. because the VIC doesn't have a counterpart to the RASTER register (which
  866. gives the current Y coordinate) to hold the X coordinates, so you cannot
  867. simply read them with the processor. But the VIC surely keeps track of the
  868. X coordinates internally as the horizontal sprite positions are based on
  869. them, and a pulse at the lightpen input LP latches the current X position
  870. in the register LPX ($d013).
  871.  
  872. Determining the absolute X coordinates of events within a raster line is
  873. not trivial as you cannot e.g. simply put a sprite to a well-defined X
  874. coordinate and conclude from the text characters displayed at the same X
  875. position to the X coordinates of the memory accesses belonging to these
  876. characters. The memory access and the display are separate function units
  877. and the read graphics data is not immediately displayed on the screen
  878. (there is a delay of 12 pixels).
  879.  
  880. So a different approach has been taken: The absolute position of a single X
  881. coordinate within the raster line was measured with the LPX register and
  882. the other X coordinates were determined relative to this. To do that, the
  883. IRQ output of the VIC has been connected to the LP input and the VIC has
  884. been programmed for a raster line interrupt. As the negative edge of IRQ
  885. was defined to be the start of a raster line, the absolute X position of
  886. the line start could be determined. The position of the negative edge of BA
  887. during a Bad Line was also measured with this method and the result was
  888. consistent with the relative distance of IRQ and BA to each other. Based on
  889. these two measurements, the X coordinates of all other events within a
  890. raster line have been determined (see [4]). Not until now the sprite X
  891. coordinates were used to be able to determine the moment of the display
  892. generation of the text characters.
  893.  
  894. This of course implicitly assumes that the LPX coordinates are the same as
  895. the sprite X coordinates. There is, however, no indication and thus no
  896. reason to suppose that they don't (a direct correlation would also be the
  897. most simple solution in terms of circuit design).
  898.  
  899. 3.6.2. Access types
  900. -------------------
  901.  
  902. The VIC generates two kinds of graphics that require access to memory: The
  903. text/bitmap graphics (also often called "background graphics" or simply
  904. "graphics") and the sprite graphics. Both require accesses to two separated
  905. memory areas:
  906.  
  907. For the text/bitmap graphics:
  908.  
  909.  ╖ The video matrix; an area of 1000 video addresses (40╫25, 12 bits each)
  910.    that can be moved in 1KB steps within the 16KB address space of the VIC
  911.    with the bits VM10-VM13 of register $d018. It stores the character codes
  912.    and their color for the text modes and some of the color information of
  913.    8╫8 pixel blocks for the bitmap modes. The Color RAM is part of the
  914.    video matrix, it delivers the upper 4 bits of the 12 bit matrix. The
  915.    data read from the video matrix is stored in an internal buffer in the
  916.    VIC, the 40╫12 bit video matrix/color line.
  917.  
  918.  ╖ The character generator resp. the bitmap; an area of 2048 bytes (bitmap:
  919.    8192 bytes) that can be moved in 2KB steps (bitmap: 8KB steps) within
  920.    the VIC address space with the bits CB11-CB13 (bitmap: only CB13) of
  921.    register $d018. It stores the pixel data of the characters for the text
  922.    modes and the bitmap for the bitmap modes. The character generator has
  923.    basically nothing to do with the Char ROM. The Char ROM only contains
  924.    prepared bit patterns that can be used as character generator, but you
  925.    can also store the character generator in normal RAM to define your own
  926.    character images.
  927.  
  928. For the sprites:
  929.  
  930.  ╖ The sprite data pointers; 8 bytes after the end of the video matrix,
  931.    that select one out of 256 blocks of 64 bytes within the VIC address
  932.    space for each sprite.
  933.  
  934.  ╖ The sprite data; an area of 63 bytes containing the pixel data of the
  935.    sprites which can be moved in steps of 64 bytes with the sprite data
  936.    pointers independently for each sprite.
  937.  
  938. Corresponding to that, the VIC does 4 different kinds of graphics accesses:
  939.  
  940. 1. To the video matrix ("c-access", 12 bits wide).
  941. 2. To the pixel data, i.e. character generator or bitmap ("g-access", 8
  942.    bits wide).
  943. 3. To the sprite data pointers ("p-access", 8 bits wide).
  944. 4. To the sprite data ("s-access", 8 bits wide).
  945.  
  946. Moreover, the VIC does two additional types of accesses:
  947.  
  948. 5. Accesses for refreshing the dynamic RAM, 5 read accesses per raster
  949.    line.
  950.  
  951. 6. Idle accesses. As described, the VIC accesses in every first clock phase
  952.    although there are some cycles in which no other of the above mentioned
  953.    accesses is pending. In this case, the VIC does an idle access; a read
  954.    access to video address $3fff (i.e. to $3fff, $7fff, $bfff or $ffff
  955.    depending on the VIC bank) of which the result is discarded.
  956.  
  957. 3.6.3. Timing of a raster line
  958. ------------------------------
  959.  
  960. The sequence of VIC memory accesses within a raster line is hard-wired,
  961. independent of the graphics mode and the same for every raster line. The
  962. negative edge of IRQ on a raster interrupt has been used to define the
  963. beginning of a line (this is also the moment in which the RASTER register
  964. is incremented). Raster line 0 is, however, an exception: In this line, IRQ
  965. and incrementing (resp. resetting) of RASTER are performed one cycle later
  966. than in the other lines. But for simplicity we assume equal line lengths
  967. and define the beginning of raster line 0 to be one cycle before the
  968. occurrence of the IRQ.
  969.  
  970. First the timing diagrams, the explanation follows:
  971.  
  972.  
  973. 6569, Bad Line, no sprites:
  974.  
  975. Cycl-# 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
  976.        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
  977.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
  978.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
  979.        __
  980.    IRQ   ________________________________________________________________________________________________________________________________
  981.        ________________________                                                                                      ____________________
  982.     BA                         ______________________________________________________________________________________
  983.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _                                                                                 _ _ _ _ _ _ _ _ _ _
  984.    AEC _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _________________________________________________________________________________ _ _ _ _ _ _ _ _ _
  985.  
  986.    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
  987.   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
  988.  
  989. Graph.                      |===========01020304050607080910111213141516171819202122232425262728293031323334353637383940=========
  990.  
  991. X coo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  992.        1111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111
  993.        89999aaaabbbbccccddddeeeeff0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff000011112222333344445555666677778888999
  994.        c048c048c048c048c048c048c04048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c048
  995.  
  996.  
  997. 6569, no Bad Line, no sprites (abbreviated):
  998.  
  999. Cycl-# 6                   1 1 1 1 1 1 1 1 1 1 |5 5 5 5 5 5 5 6 6 6 6
  1000.        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
  1001.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _
  1002.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _
  1003.        __                                      |
  1004.    IRQ   ______________________________________|________________________
  1005.        ________________________________________|________________________
  1006.     BA                                         |
  1007.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _
  1008.    AEC _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ 
  1009.                                                |
  1010.    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
  1011.   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
  1012.                                                |
  1013. Graph.                      |===========0102030|7383940=========
  1014.                                                |
  1015. X coo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\|\\\\\\\\\\\\\\\\\\\\\\\\
  1016.        1111111111111111111111111110000000000000|111111111111111111111111
  1017.        89999aaaabbbbccccddddeeeeff0000111122223|344445555666677778888999
  1018.        c048c048c048c048c048c048c04048c048c048c0|c048c048c048c048c048c048
  1019.  
  1020.  
  1021. 6567R56A, Bad Line, sprites 5-7 active in this line, sprite 0 in the next
  1022. line (abbreviated):
  1023.  
  1024. Cycl-# 6                   1 1 1 1 1 1 1 1 1 1 |5 5 5 5 5 5 5 6 6 6 6 6
  1025.        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
  1026.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _ _
  1027.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ 
  1028.        __                                      |
  1029.    IRQ   ______________________________________|__________________________
  1030.        ____                  __                |    __          __________
  1031.     BA     __________________  ________________|____  __________
  1032.         _ _ _ _ _             _ _ _ _          |     _ _ _ _     _ _ _ _ _
  1033.    AEC _ _ _ _ _ _____________ _ _ _ __________|_____ _ _ _ _____ _ _ _ _ 
  1034.                                                |
  1035.    VIC i 3 i 4 i 5sss6sss7sssr r r r rcgcgcgcgc|gcgcg i i i 0sss1 i 2 i 3 
  1036.   6510  x x X X X             x X X X          |     x X X X     x x x x x
  1037.                                                |
  1038. Graph.                      |===========0102030|7383940===========
  1039.                                                |
  1040. X coo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\|\\\\\\\\\\\\\\\\\\\\\\\\\\
  1041.        1111111111111111111111111110000000000000|11111111111111111111111111
  1042.        999aaaabbbbccccddddeeeeffff0000111122223|3444455556666777788889999a
  1043.        48c048c048c048c048c048c048c048c048c048c0|c048c048c048c048c048c048c0
  1044.  
  1045.  
  1046. 6567R8, no Bad Line, sprites 2-7 active in this line, sprites 0-4 in the
  1047. next line (abbreviated):
  1048.  
  1049. Cycl-# 6                   1 1 1 1 1 1 1 1 1 1 |5 5 5 5 5 5 5 6 6 6 6 6 6
  1050.        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
  1051.         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _ _ _ _ _ _ _ _
  1052.     °0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _
  1053.        __                                      |
  1054.    IRQ   ______________________________________|____________________________
  1055.                              __________________|________
  1056.     BA ______________________                  |        ____________________
  1057.                               _ _ _ _ _ _ _ _ _| _ _ _ _ _ _ _
  1058.    AEC _______________________ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ ______________
  1059.                                                |
  1060.    VIC ss3sss4sss5sss6sss7sssr r r r r g g g g |g g g i i i i 0sss1sss2sss3s
  1061.   6510                        x x x x x x x x x| x x x x X X X
  1062.                                                |
  1063. Graph.                      |===========0102030|7383940============
  1064.                                                |
  1065. X coo. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\|\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  1066.        1111111111111111111111111110000000000000|1111111111111111111111111111
  1067.        999aaaabbbbccccddddeeeeffff0000111122223|344445555666677778888889999a
  1068.        48c048c048c048c048c048c048c048c048c048c0|c048c048c048c048c04cccc04c80
  1069.  
  1070.  
  1071. The line "Cycl-#" show the number of the clock cycle within the raster
  1072. line. The line starts with cycle 1 and consists of 63 cycles on the 6569,
  1073. of 64 cycles on the 6567R56A and of 65 cycles on the 6567R8. The last cycle
  1074. of the previous line and the first cycle of the next line have also been
  1075. included in the diagrams to make things clearer.
  1076.  
  1077. The lines "°0", "IRQ", "BA" and "AEC" reflect the state of the bus signals
  1078. with the same names. °0 is low in the first phase and high in the second
  1079. phase.
  1080.  
  1081. The symbols in the lines "VIC" and "6510" show what kind of access VIC and
  1082. 6510 do in the corresponding clock phase (for an explanation of the
  1083. different access types of the VIC see section 3.6.2.):
  1084.  
  1085.   c  Access to video matrix and Color RAM (c-access)
  1086.   g  Access to character generator or bitmap (g-access)
  1087.  0-7 Reading the sprite data pointer for sprite 0-7 (p-access)
  1088.   s  Reading the sprite data (s-access)
  1089.   r  DRAM refresh
  1090.   i  Idle access
  1091.  
  1092.   x  Read or write access of the processor
  1093.   X  Processor may do write accesses, stops on first read (BA is low and so
  1094.      is RDY)
  1095.  
  1096. The line "X coo." contains the X coordinates of the beginning of each clock
  1097. phase (thus the "\\\" as a reminder) and the line "Graph." is a projection
  1098. of the 40 column display window and the border to these coordinates, for
  1099. positioning sprites. However, this doesn't correspond to the signal on the
  1100. VIC video output. Also you cannot see from the "Graph." line when the
  1101. border unit generates the border. This happens approx. 8 pixels later than
  1102. shown in the "Graph." line.
  1103.  
  1104. To time the accesses of the processor within a raster line when
  1105. programming, it's best to use the VIC g-accesses for orientation by
  1106. changing a byte in graphics memory with the 6510 and watching on the screen
  1107. on which character the change is first visible. The write access of the
  1108. processor must then have occurred in the clock phase immediately before.
  1109. Then you can use the diagrams to determine the clock cycle in which the
  1110. access took place and count the other accesses relative to it.
  1111.  
  1112. 3.7. Text/bitmap display
  1113. ------------------------
  1114.  
  1115. 3.7.1. Idle state/display state
  1116. -------------------------------
  1117.  
  1118. The text/bitmap display logic in the VIC is in one of two states at any
  1119. time: The idle state and the display state.
  1120.  
  1121.  - In idle state, only g-accesses occur. The access is always to address
  1122.    $3fff ($39ff when the ECM bit in register $d016 is set). The 8 bits of
  1123.    each read byte are converted to 8 pixels by the sequencer. A "0" bit
  1124.    displays the background color in register $d021, a "1" bit gives a black
  1125.    pixel. With the exception of the ECM bit, this behavior is independent
  1126.    of the display mode.
  1127.  
  1128.  - In display state, c- and g-accesses take place, the addresses and
  1129.    interpretation of the data depend on the selected display mode.
  1130.  
  1131. The transition from idle to display mode occurs as soon as there is a Bad
  1132. Line Condition (see section 3.5.). The transition from display to idle
  1133. state occurs in cycle 58 of a line if the RC (see next section) contains
  1134. the value 7 and there is no Bad Line Condition.
  1135.  
  1136. As long as register $d011 is not modified in the middle of a frame, the
  1137. display logic is in display state within the display window and in idle
  1138. state outside of it. If you set a YSCROLL other than 3 in a 25 line display
  1139. window and store a value not equal to zero in $3fff you can see the stripes
  1140. generated by the sequencer in idle state on the upper or lower side of the
  1141. window.
  1142.  
  1143. In [4], idle accesses as well as g-accesses in idle state are called "idle
  1144. bus cycle". But the two phenomena are not the same. The accesses marked
  1145. with "+" in the diagrams of [4] are normal g-accesses. In this article, the
  1146. term "idle access" is only used for the accesses marked with "i" in the
  1147. diagrams in section 3.6.3., and not for the g-accesses during idle state.
  1148.  
  1149. 3.7.2. VC and RC
  1150. ----------------
  1151.  
  1152. Probably the most important result of the VIC examinations is the discovery
  1153. of the function of the internal registers "VC" and "RC" of the VIC. They
  1154. are used to generate the addresses for accessing the video matrix and the
  1155. character generator/bitmap.
  1156.  
  1157. Strictly speaking there are three registers:
  1158.  
  1159.  ╖ "VC" (video counter) is a 10 bit counter that can be loaded with the
  1160.    value from VCBASE.
  1161.  ╖ "VCBASE" (video counter base) is a 10 bit data register with reset input
  1162.    that can be loaded with the value from VC.
  1163.  ╖ "RC" (row counter) is a 3 bit counter with reset input.
  1164.  
  1165. Besides this, there is a 6 bit counter with reset input that keeps track of
  1166. the position within the internal 40╫12 bit video matrix/color line where
  1167. read character pointers are stored resp. read again. I will call this
  1168. "VMLI" (video matrix line index) here.
  1169.  
  1170. There four registers behave according to the following rules:
  1171.  
  1172. 1. Once somewhere outside of the range of raster lines $30-$f7 (i.e.
  1173.    outside of the Bad Line range), VCBASE is reset to zero. This is
  1174.    presumably done in raster line 0, the exact moment cannot be determined
  1175.    and is irrelevant.
  1176.  
  1177. 2. In the first phase of cycle 14 of each line, VC is loaded from VCBASE
  1178.    (VCBASE->VC) and VMLI is cleared. If there is a Bad Line Condition in
  1179.    this phase, RC is also reset to zero.
  1180.  
  1181. 3. If there is a Bad Line Condition in cycles 12-54, BA is set low and the
  1182.    c-accesses are started. Once started, one c-access is done in the second
  1183.    phase of every clock cycle in the range 15-54. The read data is stored
  1184.    in the video matrix/color line at the position specified by VMLI. These
  1185.    data is internally read from the position specified by VMLI as well on
  1186.    each g-access in display state.
  1187.  
  1188. 4. VC and VMLI are incremented after each g-access in display state.
  1189.  
  1190. 5. In the first phase of cycle 58, the VIC checks if RC=7. If so, the video
  1191.    logic goes to idle state and VCBASE is loaded from VC (VC->VCBASE). If
  1192.    the video logic is in display state afterwards (this is always the case
  1193.    if there is a Bad Line Condition), RC is incremented.
  1194.  
  1195. These rules normally see that VC counts all 1000 addresses of the video
  1196. matrix within the display frame and that RC counts the 8 pixel lines of
  1197. each text line. The behavior of VC and RC is largely determined by Bad Line
  1198. Conditions which you can control with the processor via YSCROLL, giving you
  1199. control of the VC and RC within certain limits.
  1200.  
  1201. 3.7.3 Graphics modes
  1202. --------------------
  1203.  
  1204. The graphics data sequencer is capable of 7 different graphics modes. In
  1205. display state, the bits ECM, BMM and MCM (Extended Color Mode, Bit Map Mode
  1206. and Multi Color Mode) in the registers $d011 and $d016 select one of 6
  1207. modes (of the 8 possible bit combinations, 3 are "invalid" and generate the
  1208. same output, the color black), in idle state, the display is always done in
  1209. the same way, independent of ECM/BMM/MCM.
  1210.  
  1211. The sequencer outputs the graphics data in every raster line in the area of
  1212. the display column as long as the vertical border flip-flop is reset (see
  1213. section 3.9.). Outside of the display column and if the flip-flop is set,
  1214. the last current background color is displayed (this area is normally
  1215. covered by the border). The heart of the sequencer is an 8 bit shift
  1216. register that is shifted by 1 bit every pixel and reloaded with new
  1217. graphics data after every g-access. With XSCROLL from register $d016 the
  1218. reloading can be delayed by 0-7 pixels, thus shifting the display up to 7
  1219. pixels to the right.
  1220.  
  1221. The address generator for the text/bitmap accesses (c- and g-accesses) has
  1222. basically 3 modes for the g-accesses (the c-accesses always follow the same
  1223. address scheme). In display state, the BMM bit selects either character
  1224. generator accesses (BMM=0) or bitmap accesses (BMM=1). In idle state, the
  1225. g-accesses are always done at video address $3fff. If the ECM bit is set,
  1226. the address generator always holds the address lines 9 and 10 low without
  1227. any other changes to the addressing scheme (e.g. the g-accesses in idle
  1228. state then occur at address $39ff).
  1229.  
  1230. The 9 graphics modes are now covered separately and the generated addresses
  1231. and the interpretation of the read data on c- and g-accesses is described.
  1232. For easy reference, the addresses are always given explicitly for every
  1233. mode although e.g. the c-accesses are always the same.
  1234.  
  1235. 3.7.3.1. Standard text mode (ECM/BMM/MCM=0/0/0)
  1236. -----------------------------------------------
  1237.  
  1238. In this mode (as in all text modes), the VIC reads 8 bit character pointers
  1239. from the video matrix that specify the address of the dot matrix of the
  1240. character in the character generator. A character set of 256 characters is
  1241. available, each consisting of 8╫8 pixels which are stored in 8 successive
  1242. bytes in the character generator. Video matrix and character generator can
  1243. be moved in memory with the bits VM10-VM13 and CB11-CB13 of register $d018.
  1244.  
  1245. In standard text mode, every bit in the character generator directly
  1246. corresponds to one pixel on the screen. The foreground color is given by
  1247. the color nybble from the video matrix for each character, the background
  1248. color is set globally with register $d021.
  1249.  
  1250. c-access
  1251.  
  1252.  Addresses
  1253.  
  1254.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1255.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1256.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1257.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1258.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1259.  
  1260.  Data
  1261.  
  1262.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1263.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1264.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1265.  |      Color of     | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
  1266.  |     "1" pixels    |    |    |    |    |    |    |    |    |
  1267.  +-------------------+----+----+----+----+----+----+----+----+
  1268.  
  1269. g-access
  1270.  
  1271.  Addresses
  1272.  
  1273.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1274.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1275.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1276.  |CB13|CB12|CB11| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1277.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1278.  
  1279.  Data
  1280.  
  1281.  +----+----+----+----+----+----+----+----+
  1282.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1283.  +----+----+----+----+----+----+----+----+
  1284.  |         8 pixels (1 bit/pixel)        |
  1285.  |                                       |
  1286.  | "0": Background color 0 ($d021)       |
  1287.  | "1": Color from bits 8-11 of c-data   |
  1288.  +---------------------------------------+
  1289.  
  1290. 3.7.3.2. Multicolor text mode (ECM/BMM/MCM=0/0/1)
  1291. -------------------------------------------------
  1292.  
  1293. This mode allows for displaying four-colored characters at the cost of
  1294. horizontal resolution. If bit 11 of the c-data is zero, the character is
  1295. displayed as in standard text mode with only the colors 0-7 available for
  1296. the foreground. If bit 11 is set, each two adjacent bits of the dot matrix
  1297. form one pixel. By this means, the resolution of a character of reduced to
  1298. 4╫8 (the pixels are twice as wide, so the total width of the characters
  1299. doesn't change).
  1300.  
  1301. It is interesting that not only the bit combination "00" but also "01" is
  1302. regarded as "background" for the sprite priority and collision detection.
  1303.  
  1304. c-access
  1305.  
  1306.  Addresses
  1307.  
  1308.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1309.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1310.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1311.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1312.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1313.  
  1314.  Data
  1315.  
  1316.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1317.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1318.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1319.  | MC |   Color of   | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
  1320.  |flag|  "11" pixels |    |    |    |    |    |    |    |    |
  1321.  +----+--------------+----+----+----+----+----+----+----+----+
  1322.  
  1323. g-access
  1324.  
  1325.  Addresses
  1326.  
  1327.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1328.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1329.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1330.  |CB13|CB12|CB11| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1331.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1332.  
  1333.  Data
  1334.  
  1335.  +----+----+----+----+----+----+----+----+
  1336.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1337.  +----+----+----+----+----+----+----+----+
  1338.  |         8 pixels (1 bit/pixel)        |
  1339.  |                                       | MC flag = 0
  1340.  | "0": Background color 0 ($d021)       |
  1341.  | "1": Color from bits 8-10 of c-data   |
  1342.  +---------------------------------------+
  1343.  |         4 pixels (2 bits/pixel)       |
  1344.  |                                       |
  1345.  | "00": Background color 0 ($d021)      | MC flag = 1
  1346.  | "01": Background color 1 ($d022)      |
  1347.  | "10": Background color 2 ($d023)      |
  1348.  | "11": Color from bits 8-10 of c-data  |
  1349.  +---------------------------------------+
  1350.  
  1351. 3.7.3.3. Standard bitmap mode (ECM/BMM/MCM=0/1/0)
  1352. -------------------------------------------------
  1353.  
  1354. In this mode (as in all bitmap modes), the VIC reads the graphics data from
  1355. a 320╫200 bitmap in which every bit corresponds to one pixel on the screen.
  1356. The data from the video matrix is used for color information. As the video
  1357. matrix is still only a 40╫25 matrix, you can only specify the colors for
  1358. blocks of 8╫8 pixels individually (sort of a YC 8:1 format). As the
  1359. designers of the VIC wanted to realize the bitmap mode with as little
  1360. additional circuitry as possible (the VIC-I didn't have a bitmap mode), the
  1361. arrangement of the bitmap in memory is somewhat weird: In contrast to
  1362. modern video chips that read the bitmap in a linear fashion from memory,
  1363. the VIC forms an 8╫8 pixel block on the screen from 8 successive bytes of
  1364. the bitmap. The video matrix and the bitmap can be moved in memory with the
  1365. bits VM10-VM13 and CB13 of register $d018.
  1366.  
  1367. In standard bitmap mode, every bit in the bitmap directly corresponds to
  1368. one pixel on the screen. Foreground and background color can be arbitrarily
  1369. set for every 8╫8 block.
  1370.  
  1371. c-access
  1372.  
  1373.  Addresses
  1374.  
  1375.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1376.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1377.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1378.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1379.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1380.  
  1381.  Data
  1382.  
  1383.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1384.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1385.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1386.  |       unused      |     Color of      |     Color of      |
  1387.  |                   |    "1" pixels     |    "0" pixels     |
  1388.  +-------------------+-------------------+-------------------+
  1389.  
  1390. g-access
  1391.  
  1392.  Addresses
  1393.  
  1394.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1395.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1396.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1397.  |CB13| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1398.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1399.  
  1400.  Data
  1401.  
  1402.  +----+----+----+----+----+----+----+----+
  1403.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1404.  +----+----+----+----+----+----+----+----+
  1405.  |         8 pixels (1 bit/pixel)        |
  1406.  |                                       |
  1407.  | "0": Color from bits 0-3 of c-data    |
  1408.  | "1": Color from bits 4-7 of c-data    |
  1409.  +---------------------------------------+
  1410.  
  1411. 3.7.3.4. Multicolor bitmap mode (ECM/BMM/MCM=0/1/1)
  1412. ---------------------------------------------------
  1413.  
  1414. Similar to the multicolor text mode, this mode also forms (twice as wide)
  1415. pixels by combining two adjacent bits. So the resolution is reduced to
  1416. 160╫200 pixels.
  1417.  
  1418. The bit combination "01" is also treated as "background" for the sprite
  1419. priority and collision detection, as in multicolor text mode.
  1420.  
  1421. c-access
  1422.  
  1423.  Addresses
  1424.  
  1425.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1426.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1427.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1428.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1429.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1430.  
  1431.  Data
  1432.  
  1433.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1434.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1435.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1436.  |     Color of      |     Color of      |     Color of      |
  1437.  |    "11 pixels"    |    "01" pixels    |    "10" pixels    |
  1438.  +-------------------+-------------------+-------------------+
  1439.  
  1440. g-access
  1441.  
  1442.  Addresses
  1443.  
  1444.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1445.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1446.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1447.  |CB13| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1448.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1449.  
  1450.  Data
  1451.  
  1452.  +----+----+----+----+----+----+----+----+
  1453.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1454.  +----+----+----+----+----+----+----+----+
  1455.  |         4 pixels (2 bits/pixel)       |
  1456.  |                                       |
  1457.  | "00": Background color 0 ($d021)      |
  1458.  | "01": Color from bits 4-7 of c-data   |
  1459.  | "10": Color from bits 0-3 of c-data   |
  1460.  | "11": Color from bits 8-11 of c-data  |
  1461.  +---------------------------------------+
  1462.  
  1463. 3.7.3.5. ECM text mode (ECM/BMM/MCM=1/0/0)
  1464. ------------------------------------------
  1465.  
  1466. This text mode is the same as the standard text mode, but it allows the
  1467. selection of one of four background colors for every single character. The
  1468. selection is done with the upper two bits of the character pointer. This,
  1469. however, reduces the character set from 256 to 64 characters.
  1470.  
  1471. c-access
  1472.  
  1473.  Addresses
  1474.  
  1475.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1476.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1477.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1478.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1479.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1480.  
  1481.  Data
  1482.  
  1483.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1484.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1485.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1486.  |     Color of      |Back.col.| D5 | D4 | D3 | D2 | D1 | D0 |
  1487.  |    "1" pixels     |selection|    |    |    |    |    |    |
  1488.  +-------------------+---------+----+----+----+----+----+----+
  1489.  
  1490. g-access
  1491.  
  1492.  Addresses
  1493.  
  1494.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1495.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1496.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1497.  |CB13|CB12|CB11|  0 |  0 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1498.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1499.  
  1500.  Data
  1501.  
  1502.  +----+----+----+----+----+----+----+----+
  1503.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1504.  +----+----+----+----+----+----+----+----+
  1505.  |         8 pixels (1 bit/pixel)        |
  1506.  |                                       |
  1507.  | "0": Depending on bits 6/7 of c-data  |
  1508.  |      00: Background color 0 ($d021)   |
  1509.  |      01: Background color 1 ($d022)   |
  1510.  |      10: Background color 2 ($d023)   |
  1511.  |      11: Background color 3 ($d024)   |
  1512.  | "1": Color from bits 8-11 of c-data   |
  1513.  +---------------------------------------+
  1514.  
  1515. 3.7.3.6. Invalid text mode (ECM/BMM/MCM=1/0/1)
  1516. ----------------------------------------------
  1517.  
  1518. Setting the ECM and MCM bits simultaneously doesn't select one of the
  1519. "official" graphics modes of the VIC but creates only black pixels.
  1520. Nevertheless, the graphics data sequencer internally generates valid
  1521. graphics data that can trigger sprite collisions even in this mode. By
  1522. using sprite collisions, you can also read out the generated data (but you
  1523. cannot see anything, the screen is black). You can, however, only
  1524. distinguish foreground and background pixels as you cannot get color
  1525. information from sprite collisions.
  1526.  
  1527. The generated graphics is similar to that of the multicolor text mode, but
  1528. the character set is limited to 64 characters as in ECM mode.
  1529.  
  1530. c-access
  1531.  
  1532.  Addresses
  1533.  
  1534.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1535.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1536.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1537.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1538.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1539.  
  1540.  Data
  1541.  
  1542.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1543.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1544.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1545.  | MC |         unused         | D5 | D4 | D3 | D2 | D1 | D0 |
  1546.  |flag|                        |    |    |    |    |    |    |
  1547.  +----+------------------------+----+----+----+----+----+----+
  1548.  
  1549. g-access
  1550.  
  1551.  Addresses
  1552.  
  1553.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1554.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1555.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1556.  |CB13|CB12|CB11|  0 |  0 | D5 | D4 | D3 | D2 | D1 | D0 | RC2| RC1| RC0|
  1557.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1558.  
  1559.  Data
  1560.  
  1561.  +----+----+----+----+----+----+----+----+
  1562.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1563.  +----+----+----+----+----+----+----+----+
  1564.  |         8 pixels (1 bit/pixel)        |
  1565.  |                                       | MC flag = 0
  1566.  | "0": Background                       |
  1567.  | "1": Foreground                       |
  1568.  +---------------------------------------+
  1569.  |         4 pixels (2 bits/pixel)       |
  1570.  |                                       |
  1571.  | "00": Background                      | MC flag = 1
  1572.  | "01": Background                      |
  1573.  | "10": Foreground                      |
  1574.  | "11": Foreground                      |
  1575.  +---------------------------------------+
  1576.  
  1577. 3.7.3.7. Invalid bitmap mode 1 (ECM/BMM/MCM=1/1/0)
  1578. --------------------------------------------------
  1579.  
  1580. This mode also only displays a black screen, but the pixels can also be
  1581. read out with the sprite collision trick.
  1582.  
  1583. The structure of the graphics is basically as in standard bitmap mode, but
  1584. the bits 9 and 10 of the g-addresses are always zero due to the set ECM bit
  1585. and so the graphics is - roughly said - made up of four "sections" that are
  1586. each repeated four times.
  1587.  
  1588. c-access
  1589.  
  1590.  Addresses
  1591.  
  1592.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1593.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1594.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1595.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1596.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1597.  
  1598.  Data
  1599.  
  1600.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1601.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1602.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1603.  |                           unused                          |
  1604.  +-----------------------------------------------------------+
  1605.  
  1606. g-access
  1607.  
  1608.  Addresses
  1609.  
  1610.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1611.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1612.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1613.  |CB13| VC9| VC8|  0 |  0 | VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1614.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1615.  
  1616.  Data
  1617.  
  1618.  +----+----+----+----+----+----+----+----+
  1619.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1620.  +----+----+----+----+----+----+----+----+
  1621.  |         8 pixels (1 bit/pixel)        |
  1622.  |                                       |
  1623.  | "0": Background                       |
  1624.  | "1": Foreground                       |
  1625.  +---------------------------------------+
  1626.  
  1627. 3.7.3.8. Invalid bitmap mode 2 (ECM/BMM/MCM=1/1/1)
  1628. --------------------------------------------------
  1629.  
  1630. The last invalid mode also creates a black screen but it can also be
  1631. "scanned" with sprite-graphics collisions.
  1632.  
  1633. The structure of the graphics is basically as in multicolor bitmap mode,
  1634. but the bits 9 and 10 of the g-addresses are always zero due to the set ECM
  1635. bit, with the same results as in the first invalid bitmap mode. As usual,
  1636. the bit combination "01" is part of the background.
  1637.  
  1638. c-access
  1639.  
  1640.  Addresses
  1641.  
  1642.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1643.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1644.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1645.  |VM13|VM12|VM11|VM10| VC9| VC8| VC7| VC6| VC5| VC4| VC3| VC2| VC1| VC0|
  1646.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1647.  
  1648.  Data
  1649.  
  1650.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1651.  | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1652.  +----+----+----+----+----+----+----+----+----+----+----+----+
  1653.  |                           unused                          |
  1654.  +-----------------------------------------------------------+
  1655.  
  1656. g-access
  1657.  
  1658.  Addresses
  1659.  
  1660.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1661.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1662.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1663.  |CB13| VC9| VC8|  0 |  0 | VC5| VC4| VC3| VC2| VC1| VC0| RC2| RC1| RC0|
  1664.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1665.  
  1666.  Data
  1667.  
  1668.  +----+----+----+----+----+----+----+----+
  1669.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1670.  +----+----+----+----+----+----+----+----+
  1671.  |         4 pixels (2 bits/pixel)       |
  1672.  |                                       |
  1673.  | "00": Background                      |
  1674.  | "01": Background                      |
  1675.  | "10": Foreground                      |
  1676.  | "11": Foreground                      |
  1677.  +---------------------------------------+
  1678.  
  1679. 3.7.3.9. Idle state
  1680. -------------------
  1681.  
  1682. In idle state, the VIC reads graphics data from address $3fff (resp. $39ff
  1683. if the ECM bit is set) and displays it as in standard text mode but with
  1684. the color of "1" pixels being always black.
  1685.  
  1686. Although the graphics in idle state always looks like a "standard" mode
  1687. (i.e. 1 bit/pixel) independent of the ECM/BMM/MCM bits, the MCM bit is not
  1688. completely inoperational. It still switches the sprite priority/collision
  1689. detection logic between standard mode and multicolor mode. In other words:
  1690. If the MCM bit is set in idle state, the sprite priority logic behaves as
  1691. in multicolor mode: It combines every 2 adjacent pixels and treats the bit
  1692. combinations "00" and "01" as background and "10" and "11" as foreground,
  1693. although the idle graphics doesn't change its appearance.
  1694.  
  1695. g-access (ECM=0)
  1696.  
  1697.  Addresses
  1698.  
  1699.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1700.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1701.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1702.  |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |
  1703.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1704.  
  1705.  Data
  1706.  
  1707.  +----+----+----+----+----+----+----+----+
  1708.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1709.  +----+----+----+----+----+----+----+----+
  1710.  |         8 pixels (1 bit/pixel)        |
  1711.  |                                       |
  1712.  | "0": Background color 0 ($d021)       |
  1713.  | "1": Black                            |
  1714.  +---------------------------------------+
  1715.  
  1716. g-access (ECM=1)
  1717.  
  1718.  Addresses
  1719.  
  1720.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1721.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1722.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1723.  |  1 |  1 |  1 |  0 |  0 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |  1 |
  1724.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1725.  
  1726.  Data
  1727.  
  1728.  +----+----+----+----+----+----+----+----+
  1729.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1730.  +----+----+----+----+----+----+----+----+
  1731.  |         8 pixels (1 bit/pixel)        |
  1732.  |                                       |
  1733.  | "0": Background color 0 ($d021)       |
  1734.  | "1": Black                            |
  1735.  +---------------------------------------+
  1736.  
  1737. 3.8. Sprites
  1738. ------------
  1739.  
  1740. Apart from the text/bitmap graphics, the VIC can display eight independent
  1741. 24╫21 pixels large, freely movable objects, the "sprites" (called "MOBs"
  1742. (Movable Object Blocks) in [2]).
  1743.  
  1744. The sprites can have an arbitrary position on the screen, you can switch
  1745. them on and off one at a time with the bits of register $d015 (MxE), expand
  1746. them by the factor 2 in X and/or Y direction with registers $d017/$d01d
  1747. (with the resolution still being 24╫21 pixels), choose between standard and
  1748. multicolor mode with register $d01c (MxMC), set the display priority with
  1749. respect to the text/bitmap graphics with register $d01b (MxDP) and assign a
  1750. different color to each sprite (registers $d027-$d02e). Besides, the VIC
  1751. has the ability to detect collisions between sprites among themselves or
  1752. between sprites and text/bitmap graphics and to trigger an interrupt on
  1753. such collisions (see 3.11.).
  1754.  
  1755. The position of the top left corner of a sprite is specified with the
  1756. coordinate registers (MxX, MxY) belonging to it. There are 8 bits for the Y
  1757. coordinate and 9 bits for the X coordinate (the most significant bits of
  1758. all sprites are collected in register $d010).
  1759.  
  1760. 3.8.1. Memory access and display
  1761. --------------------------------
  1762.  
  1763. The 63 bytes of sprite data necessary for displaying 24╫21 pixels are
  1764. stored in memory in a linear fashion: 3 adjacent bytes form one line of the
  1765. sprite.
  1766.  
  1767. These 63 bytes can be moved in steps of 64 bytes within the 16KB address
  1768. space of the VIC. For this, the VIC reads a sprite data pointer for each
  1769. sprite in every raster line from the very last 8 bytes of the video matrix
  1770. (p-access) that is used as the upper 8 bits of the address for sprite data
  1771. accesses (s-accesses). The lower 6 bits come from a sprite data counter
  1772. (MC0-MC7, one for each sprite) that plays a similar role for the sprites as
  1773. VC does for the video matrix. As the p-accesses are done in every raster
  1774. line and not only when the belonging sprite is just displayed, you can
  1775. change the appearance of a sprite in the middle of its display by changing
  1776. the sprite data pointer.
  1777.  
  1778. When s-accesses are necessary for a sprite, they are done in the three
  1779. half-cycles directly after the p-access belonging to the sprite within the
  1780. raster line. The VIC also uses the BA and AEC signals (as in the Bad Lines)
  1781. to access the bus in the second clock phase. BA will also go low three
  1782. cycles before the proper access in this case. The s-accesses are done in
  1783. every raster line in which the sprite is visible (for the sprites 0-2, it
  1784. is always in the line before, see the timing diagrams in section 3.6.3.),
  1785. for every sprite in statically assigned cycles within the line.
  1786.  
  1787. Like the text and bitmap graphics, the sprites also have a standard mode
  1788. and a multicolor mode. In standard mode, every bit directly corresponds to
  1789. one pixel on the screen. A "0" pixel is transparent and the underlying
  1790. graphics are visible below it, a "1" pixel is displayed in the sprite color
  1791. from registers $d027-$d02e belonging to the sprite in question. In
  1792. multicolor mode, two adjacent bits form one pixel, thus reducing the
  1793. resolution of the sprite to 12╫21 (the pixels are twice as wide).
  1794.  
  1795. Moreover, the sprites can be doubled in their size on the screen in X
  1796. and/or Y direction (X/Y expansion). For that, every sprite pixel simply
  1797. becomes twice as wide/tall, the resolution doesn't change. So a pixel of an
  1798. x-expanded multicolor sprite is four times as wide as a pixel of an
  1799. unexpanded standard sprite. Although both expansions look similar, they are
  1800. implemented completely differently in the VIC. The X expansion simply
  1801. instructs the sprite data sequencer to output pixels with half frequency.
  1802. But the Y expansion makes the sprite address generator read from the same
  1803. addresses in each two lines in sequence so that every sprite line is output
  1804. twice.
  1805.  
  1806. Every sprite has its own sprite data sequencer whose core is a 24 bit shift
  1807. register. Apart from that, there are two internal registers for every
  1808. sprite:
  1809.  
  1810.  ╖ "MC" (MOB Data Counter) is a 6 bit counter that can be loaded from
  1811.    MCBASE.
  1812.  ╖ "MCBASE" (MOB Data Counter Base) is a 6 bit counter with reset input.
  1813.  
  1814. Besides, there is one expansion flip flop per sprite that controls the
  1815. Y expansion.
  1816.  
  1817. The display of a sprite is done after the following rules (the cycle
  1818. numbers are only valid for the 6569):
  1819.  
  1820. 1. The expansion flip flip is set as long as the bit in MxYE in register
  1821.    $d017 corresponding to the sprite is cleared.
  1822.  
  1823. 2. If the MxYE bit is set in the first phase of cycle 55, the expansion
  1824.    flip flop is inverted.
  1825.  
  1826. 3. In the first phases of cycle 55 and 56, the VIC checks for every sprite
  1827.    if the corresponding MxE bit in register $d015 is set and the Y
  1828.    coordinate of the sprite (odd registers $d001-$d00f) match the lower 8
  1829.    bits of RASTER. If this is the case and the DMA for the sprite is still
  1830.    off, the DMA is switched on, MCBASE is cleared, and if the MxYE bit is
  1831.    set the expansion flip flip is reset.
  1832.  
  1833. 4. In the first phase of cycle 58, the MC of every sprite is loaded from
  1834.    its belonging MCBASE (MCBASE->MC) and it is checked if the DMA for the
  1835.    sprite is turned on and the Y coordinate of the sprite matches the lower
  1836.    8 bits of RASTER. If this is the case, the display of the sprite is
  1837.    turned on.
  1838.  
  1839. 5. If the DMA for a sprite is turned on, three s-accesses are done in
  1840.    sequence in the corresponding cycles assigned to the sprite (see the
  1841.    diagrams in section 3.6.3.). The p-accesses are always done, even if the
  1842.    sprite is turned off. The read data of the first access is stored in the
  1843.    upper 8 bits of the shift register, that of the second one in the middle
  1844.    8 bits and that of the third one in the lower 8 bits. MC is incremented
  1845.    by one after each s-access.
  1846.  
  1847. 6. If the sprite display for a sprite is turned on, the shift register is
  1848.    shifted left by one bit with every pixel as soon as the current X
  1849.    coordinate of the raster beam matches the X coordinate of the sprite
  1850.    (even registers $d000-$d00e), and the bits that "fall off" are
  1851.    displayed. If the MxXE bit belonging to the sprite in register $d01d is
  1852.    set, the shift is done only every second pixel and the sprite appears
  1853.    twice as wide. If the sprite is in multicolor mode, every two adjacent
  1854.    bits form one pixel.
  1855.  
  1856. 7. In the first phase of cycle 15, it is checked if the expansion flip flop
  1857.    is set. If so, MCBASE is incremented by 2.
  1858.  
  1859. 8. In the first phase of cycle 16, it is checked if the expansion flip flop
  1860.    is set. If so, MCBASE is incremented by 1. After that, the VIC checks if
  1861.    MCBASE is equal to 63 and turns of the DMA and the display of the sprite
  1862.    if it is.
  1863.  
  1864. As the test in rule 3 is done at the end of a raster line, the sprite Y
  1865. coordinates stored in the registers must be 1 less than the desired Y
  1866. position of the first sprite line, as the sprite display will not start
  1867. until the following line, after the first sprite data has been read (as
  1868. long as the sprite is not positioned to the right of sprite X coordinate
  1869. $164 (cycle 58, see rule 4)).
  1870.  
  1871. Sprites can be "reused" vertically: If you change the Y coordinate of a
  1872. sprite to a later raster line during or after its display has completed, so
  1873. that the comparisons mentioned in rules 1 and 2 will match again, the
  1874. sprite is displayed again at that Y coordinate (you may then of course
  1875. freely set a new X coordinate and sprite data pointer). It is therefore
  1876. possible to display more than 8 sprites on the screen.
  1877.  
  1878. This is not possible in the horizontal direction. After 24 displayed
  1879. pixels, the shift register has run empty and even if you change the X
  1880. coordinate within a line so that the comparison in rule 4 will match again,
  1881. no sprite data is displayed any more. So you can only display up to 8
  1882. sprites within one raster line at a time.
  1883.  
  1884. Once again an overview of the scheme of p- and s-accesses:
  1885.  
  1886. p-access
  1887.  
  1888.  Addresses
  1889.  
  1890.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1891.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1892.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1893.  |VM13|VM12|VM11|VM10|  1 |  1 |  1 |  1 |  1 |  1 |  1 |Sprite number |
  1894.  +----+----+----+----+----+----+----+----+----+----+----+--------------+
  1895.  
  1896.  Data
  1897.  
  1898.  +----+----+----+----+----+----+----+----+
  1899.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1900.  +----+----+----+----+----+----+----+----+
  1901.  | MP7| MP6| MP5| MP4| MP3| MP2| MP1| MP0|
  1902.  +----+----+----+----+----+----+----+----+
  1903.  
  1904. s-access
  1905.  
  1906.  Addresses
  1907.  
  1908.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1909.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1910.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1911.  | MP7| MP6| MP5| MP4| MP3| MP2| MP1| MP0| MC5| MC4| MC3| MC2| MC1| MC0|
  1912.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  1913.  
  1914.  Data
  1915.  
  1916.  +----+----+----+----+----+----+----+----+
  1917.  |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  1918.  +----+----+----+----+----+----+----+----+
  1919.  |         8 pixels (1 bit/pixel)        |
  1920.  |                                       | MxMC = 0
  1921.  | "0": Transparent                      |
  1922.  | "1": Sprite color ($d027-$d02e)       |
  1923.  +---------------------------------------+
  1924.  |         4 pixels (2 bits/pixel)       |
  1925.  |                                       |
  1926.  | "00": Transparent                     | MxMC = 1
  1927.  | "01": Sprite multicolor 0 ($d025)     |
  1928.  | "10": Sprite color ($d027-$d02e)      |
  1929.  | "11": Sprite multicolor 1 ($d026)     |
  1930.  +---------------------------------------+
  1931.  
  1932. 3.8.2. Priority and collision detection
  1933. ---------------------------------------
  1934.  
  1935. As soon as several graphics elements (sprites and text/bitmap graphics)
  1936. overlap on the screen, it has to be decided which element is displayed in
  1937. the foreground. To do this, every element has a priority assigned and only
  1938. the element with highest priority is displayed.
  1939.  
  1940. The sprites have a rigid hierarchy among themselves: Sprite 0 has the
  1941. highest and sprite 7 the lowest priority. If two sprites overlap, the
  1942. sprite with the higher number is displayed only where the other sprite has
  1943. a transparent pixel.
  1944.  
  1945. The priority of the sprites to the text/bitmap graphics can be controlled
  1946. within some limits. First of all, you have to distinguish the text/bitmap
  1947. graphics between foreground and background pixels. Which bit combinations
  1948. belong to the foreground or background is decided by the MCM bit in
  1949. register $d016 independently of the state of the graphics data sequencer
  1950. and of the BMM and ECM bits in register $d011:
  1951.  
  1952.              | MCM=0 |   MCM=1
  1953.  ------------+-------+-----------
  1954.  Bits/pixel  |   1   |     2
  1955.  Pixels/byte |   8   |     4
  1956.  Background  |  "0"  | "00", "01"
  1957.  Foreground  |  "1"  | "10", "11"
  1958.  
  1959. In multicolor mode (MCM=1), the bit combinations "00" and "01" belong to
  1960. the background and "10" and "11" to the foreground whereas in standard mode
  1961. (MCM=0), cleared pixels belong to the background and set pixels to the
  1962. foreground. It should be noted that this is also valid for the graphics
  1963. generated in idle state although these are always displayed with 1
  1964. bit/pixel, independently of the MCM bit.
  1965.  
  1966. With the MxDP bits from register $d01b, you can separately specify for each
  1967. sprite if it should be displayed in front of or behind the foreground
  1968. pixels (the table in [2] is wrong):
  1969.  
  1970.  MxDP=0:
  1971.  
  1972.        +-----------------------+
  1973.        |  Background graphics  |  low priority
  1974.      +-----------------------+ |
  1975.      |  Foreground graphics  |-+
  1976.    +-----------------------+ |
  1977.    |       Sprite x        |-+
  1978.  +-----------------------+ |
  1979.  |     Screen border     |-+
  1980.  |                       |   high priority
  1981.  +-----------------------+
  1982.  
  1983.  MxDP=1:
  1984.  
  1985.        +-----------------------+
  1986.        |  Background graphics  |  low priority
  1987.      +-----------------------+ |
  1988.      |       Sprite x        |-+
  1989.    +-----------------------+ |
  1990.    |  Foreground graphics  |-+
  1991.  +-----------------------+ |
  1992.  |     Screen border     |-+
  1993.  |                       |   high priority
  1994.  +-----------------------+
  1995.  
  1996. Of course, the graphics elements with lower priority than an overlayed
  1997. sprite are visible where the sprite has a transparent pixel.
  1998.  
  1999. If you choose one of the invalid video modes only the sprites will be
  2000. visible (fore- and background graphics will all become black, see sections
  2001. 3.7.3.6.-3.7.3.8.), but by setting the sprites to appear behind the
  2002. foreground graphics, the foreground graphics will actually become visible
  2003. as black pixels overlaying the sprite pixels.
  2004.  
  2005. Together with the priority management, the VIC has the ability to detect
  2006. collisions of sprites among themselves and of sprites and foreground pixels
  2007. of the text/bitmap graphics.
  2008.  
  2009. A collision of sprites among themselves is detected as soon as two or more
  2010. sprite data sequencers output a non-transparent pixel in the course of
  2011. display generation (this can also happen somewhere outside of the visible
  2012. screen area). In this case, the MxM bits of all affected sprites are set in
  2013. register $d01e and (if allowed, see section 3.12.), an interrupt is
  2014. generated. The bits remain set until the register is read by the processor
  2015. and are cleared automatically by the read access.
  2016.  
  2017. A collision of sprites and other graphics data is detected as soon as one
  2018. ore more sprite data sequencers output a non-transparent pixel and the
  2019. graphics data sequencer outputs a foreground pixel in the course of display
  2020. generation. In this case, the MxD bits of the affected sprites are set in
  2021. register $d01f and (if allowed, see section 3.12.), an interrupt is
  2022. generated. As with the sprite-sprite collision, the bits remain set until
  2023. the register is read by the processor.
  2024.  
  2025. If the vertical border flip flop is set (normally within the upper/lower
  2026. border, see next section), the output of the graphics data sequencer is
  2027. turned off and there are no collisions.
  2028.  
  2029. 3.9. The border unit
  2030. --------------------
  2031.  
  2032. The VIC uses two flip flops to generate the border around the display
  2033. window: A main border flip flop and a vertical border flip flop.
  2034.  
  2035. The main border flip flop controls the border display. If it is set, the
  2036. VIC displays the color stored in register $d020, otherwise it displays the
  2037. color that the priority multiplexer switches through from the graphics or
  2038. sprite data sequencer. So the border overlays the text/bitmap graphics as
  2039. well as the sprites. It has the highest display priority.
  2040.  
  2041. The vertical border flip flop is for auxiliary control of the upper/lower
  2042. border. If it is set, the main border flip flop cannot be reset. Apart from
  2043. that, the vertical border flip flop controls the output of the graphics
  2044. data sequencer. The sequencer only outputs data if the flip flop is
  2045. not set, otherwise it displays the background color. This was probably done
  2046. to prevent sprite-graphics collisions in the border area.
  2047.  
  2048. There are 2╫2 comparators belonging to each of the two flip flops. There
  2049. comparators compare the X/Y position of the raster beam with one of two
  2050. hardwired values (depending on the state of the CSEL/RSEL bits) to control
  2051. the flip flops. The comparisons only match if the values are reached
  2052. precisely. There is no comparison with an interval.
  2053.  
  2054. The horizontal comparison values:
  2055.  
  2056.        |   CSEL=0   |   CSEL=1
  2057.  ------+------------+-----------
  2058.  Left  |  31 ($1f)  |  24 ($18)
  2059.  Right | 335 ($14f) | 344 ($158)
  2060.  
  2061. And the vertical ones:
  2062.  
  2063.         |   RSEL=0  |  RSEL=1
  2064.  -------+-----------+----------
  2065.  Top    |  55 ($37) |  51 ($33)
  2066.  Bottom | 247 ($f7) | 251 ($fb)
  2067.  
  2068. The flip flops are switched according to the following rules:
  2069.  
  2070. 1. If the X coordinate reaches the right comparison value, the main border
  2071.    flip flop is set.
  2072. 2. If the Y coordinate reaches the bottom comparison value in cycle 63, the
  2073.    vertical border flip flop is set.
  2074. 3. If the Y coordinate reaches the top comparison value in cycle 63 and the
  2075.    DEN bit in register $d011 is set, the vertical border flip flop is
  2076.    reset.
  2077. 4. If the X coordinate reaches the left comparison value and the Y
  2078.    coordinate reaches the bottom one, the vertical border flip flop is set.
  2079. 5. If the X coordinate reaches the left comparison value and the Y
  2080.    coordinate reaches the top one and the DEN bit in register $d011 is set,
  2081.    the vertical border flip flop is reset.
  2082. 6. If the X coordinate reaches the left comparison value and the vertical
  2083.    border flip flop is not set, the main flip flop is reset.
  2084.  
  2085. So the Y coordinate is checked once or twice within each raster line: In
  2086. cycle 63 and if the X coordinate reaches the left comparison value.
  2087.  
  2088. By appropriate switching of the CSEL/RSEL bits you can prevent the
  2089. comparison values from being reached and thus turn off the border partly or
  2090. completely (see 3.14.1.).
  2091.  
  2092. 3.10. Display Enable
  2093. --------------------
  2094.  
  2095. The DEN bit (Display Enable, register $d011, bit 4) serves for switching on
  2096. and off the text/bitmap graphics. It is normally set. The bit affects two
  2097. functions of the VIC: The Bad Lines and the vertical border unit.
  2098.  
  2099.  - A Bad Line Condition can only occur if the DEN bit has been set for at
  2100.    least one cycle somewhere in raster line $30 (see section 3.5.).
  2101.  - If the DEN bit is cleared, the reset input of the vertical border flip
  2102.    flop is deactivated (see section 3.9.). Then the upper/lower border is
  2103.    not turned off.
  2104.  
  2105. So clearing the DEN bit will normally prevent Bad Lines (and thus c- and
  2106. g-accesses) from occuring and make the whole screen display the border
  2107. color.
  2108.  
  2109. 3.11. Lightpen
  2110. --------------
  2111.  
  2112. On a negative edge on the LP input, the current position of the raster beam
  2113. is latched in the registers LPX ($d013) and LPY ($d014). LPX contains the
  2114. upper 8 bits (of 9) of the X position and LPY the lower 8 bits (likewise of
  2115. 9) of the Y position. So the horizontal resolution of the light pen is
  2116. limited to 2 pixels.
  2117.  
  2118. Only one negative edge on LP is recognized per frame. If multiple edges
  2119. occur on LP, all following ones are ignored. The trigger is not released
  2120. until the next vertical blanking interval.
  2121.  
  2122. As the LP input of the VIC is connected to the keyboard matrix as are all
  2123. lines of the joystick ports, it can also be controlled by software. This is
  2124. done with bit 4 of port B of CIA A ($dc01/$dc03). This allows to determine
  2125. the current X position of the raster beam by triggering an LP edge and
  2126. reading from LPX afterwards (the VIC has no register that would allow
  2127. reading the X position directly). This can e.g. be used to synchronize
  2128. raster interrupt routines on exact cycles.
  2129.  
  2130. The values you get from the LPX register can be calculated from the sprite
  2131. coordinates of the timing diagrams in section 3.6.3. The reference point is
  2132. the end of the cycle in which the LP line is triggered. E.g. if you trigger
  2133. LP in cycle 20, you get the value $1e in LPX, corresponding to the sprite
  2134. coordinate $03c (LPX contains the upper 8 bits of the 9 bit X coordinate).
  2135.  
  2136. The VIC can also additionally trigger an interrupt on a negative edge on
  2137. the LP pin (see next section), likewise only once per frame.
  2138.  
  2139. 3.12. VIC interrupts
  2140. --------------------
  2141.  
  2142. The VIC has the possibility to generate interrupts for the processor when
  2143. certain events occur. This is done with the IRQ output that is directly
  2144. connected to the IRQ input of the 6510. The VIC interrupts are therefore
  2145. maskable with the I flag in the processor status register.
  2146.  
  2147. There are four interrupt sources in the VIC. Every source has a
  2148. corresponding bit in the interrupt latch (register $d019) and a bit in the
  2149. interrupt enable register ($d01a). When an interrupts occurs, the
  2150. corresponding bit in the latch is set. To clear it, the processor has to
  2151. write a "1" there "by hand". The VIC doesn't clear the latch on its own.
  2152.  
  2153. If at least one latch bit and the belonging bit in the enable register is
  2154. set, the IRQ line is held low and so the interrupt is triggered in the
  2155. processor. So the four interrupt sources can be independently enabled and
  2156. disabled with the enable bits. As the VIC - as described - doesn't clear
  2157. the interrupt latch by itself, the processor has to do it before the I
  2158. flag is cleared resp. before the processor returns from the interrupt
  2159. routine. Otherwise the interrupt will be triggered again immediately (the
  2160. IRQ input of the 6510 is state-sensitive).
  2161.  
  2162. The following table describes the four interrupt sources and their bits in
  2163. the latch and enable registers:
  2164.  
  2165.  Bit|Name| Trigger condition
  2166.  ---+----+-----------------------------------------------------------------
  2167.   0 | RST| Reaching a certain raster line. The line is specified by writing
  2168.     |    | to register $d012 and bit 7 of $d011 and internally stored by
  2169.     |    | the VIC for the raster compare. The test for reaching the
  2170.     |    | interrupt raster line is done in cycle 0 of every line (for line
  2171.     |    | 0, in cycle 1).
  2172.   1 | MBC| Collision of at least one sprite with the text/bitmap graphics
  2173.     |    | (one sprite data sequencer outputs non-transparent pixel at the
  2174.     |    | same time at which the graphics data sequencer outputs a
  2175.     |    | foreground pixel)
  2176.   2 | MMC| Collision of two or more sprites (two sprite data sequencers
  2177.     |    | output a non-transparent pixel at the same time)
  2178.   3 | LP | Negative edge on the LP input (lightpen)
  2179.  
  2180. For the MBC and MMC interrupts, only the first collision will trigger an
  2181. interrupt (i.e. if the collision registers $d01e resp. $d01f contained the
  2182. value zero before the collision). To trigger further interrupts after a
  2183. collision, the concerning register has to be cleared first by reading from
  2184. it.
  2185.  
  2186. The bit 7 in the latch $d019 reflects the inverted state of the IRQ output
  2187. of the VIC.
  2188.  
  2189. 3.13. DRAM refresh
  2190. ------------------
  2191.  
  2192. The VIC does five read accesses in every raster line for the refresh of the
  2193. dynamic RAM. An 8 bit refresh counter (REF) is used to generate 256 DRAM
  2194. row addresses. The counter is reset to $ff in raster line 0 and decremented
  2195. by 1 after each refresh access.
  2196.  
  2197. So the VIC will access addresses $3fff, $3ffe, $3ffd, $3ffc and $3ffb in
  2198. line 0, addresses $3ffa, $3ff9, $3ff8, $3ff7 and $3ff6 in line 1 etc.
  2199.  
  2200.  Refresh addresses
  2201.  
  2202.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  2203.  | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
  2204.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  2205.  |  1 |  1 |  1 |  1 |  1 |  1 |REF7|REF6|REF5|REF4|REF3|REF2|REF1|REF0|
  2206.  +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  2207.  
  2208. 3.14. Effects/applications
  2209. --------------------------
  2210.  
  2211. The following sections will describe some graphical effects that can be
  2212. achieved by applying the rules and mechanisms of the VIC described in the
  2213. previous sections.
  2214.  
  2215. 3.14.1. Hyperscreen
  2216. -------------------
  2217.  
  2218. As explained in section 3.9., the VIC generates the screen border by
  2219. comparing the beam coordinates with start and stop positions selected by
  2220. the CSEL/RSEL bits. So the border is basically not displayed within a
  2221. certain range of coordinates, but rather turned on and off at certain
  2222. coordinates. If you now make sure by appropriately switching CSEL/RSEL that
  2223. the coordinate comparison never matches, the border is e.g. never turned on
  2224. and you can see the graphics in the border area that is normally covered by
  2225. the border. The technique is called "hyperscreen" or "opening the border".
  2226.  
  2227. However, the graphics displayable in the border area is mainly limited to
  2228. sprites, as the graphics data sequencer is in idle state in this area as no
  2229. Bad Lines can occur outside of Y coordinates $30-$f7 (see section 3.5.).
  2230. But you can also do something sensible with the graphics generated in idle
  2231. state.
  2232.  
  2233. To turn off the upper/lower border, you proceed as follows:
  2234.  
  2235. 1. Somewhere in the upper part of the screen, you switch to 25-line-border
  2236.    by setting the RSEL bit.
  2237. 2. Now you wait until RASTER has reached a value in the range of 248-250.
  2238.    The vertical border flip flop is still cleared as the comparison value
  2239.    for RSEL=1 is raster line 251.
  2240. 3. Then you clear the RSEL bit. The comparator is switched and now sets the
  2241.    vertical flip flop at line 247. But this line is already passed and thus
  2242.    the VIC "forgets" to turn on the vertical border.
  2243. 4. After raster line 251 you set the RSEL bit again and repeat from step 2.
  2244.  
  2245. If you open the upper/lower border with this method, the left/right border
  2246. still remains active in the "opened up" area. If you switch from RSEL=0 to
  2247. RSEL=1 in the raster line range 52-54, the border is never turned off and
  2248. covers the whole screen (this is the same when the DEN bit is cleared, but
  2249. Bad Lines still occur). But this is not very sensible.
  2250.  
  2251. The left/right border can be turned of with the CSEL bit in a similar way.
  2252. However, the timing is much more critical. Whereas for the vertical border,
  2253. you have 4 raster lines time for the switch, for the horizontal border the
  2254. change from CSEL=1 to CSEL=0 has to be exactly in cycle 56. Likewise the
  2255. horizontal border can be prevented from turning off by switching from
  2256. CSEL=0 to CSEL=1 in cycle 17.
  2257.  
  2258. If you want to open the left/right border in the upper/lower border area,
  2259. you must either start with it before the vertical border flip flop is set
  2260. (i.e. outside of the upper/lower border), or also open the upper/lower
  2261. border, because the main border flip flop can only be reset if the vertical
  2262. flip flop is not set. If you compare both methods, you can verify that the
  2263. vertical flip flop controls the graphics data sequencer output: With the
  2264. first method, only the background color is visible in the opened up
  2265. upper/lower border area, whereas the second method displays the idle state
  2266. graphics there.
  2267.  
  2268. 3.14.2. FLD
  2269. -----------
  2270.  
  2271. When building the graphics out of text lines, the VIC orientates itself
  2272. exclusively by the occurrence of Bad Lines: A Bad Line gives the "start
  2273. signal" for the display of one text line. By appropriately changing YSCROLL
  2274. (in register $d011) you can suppress and arbitrarily delay the Bad Line
  2275. Condition (see 3.5.). So you can exactly control in which raster lines Bad
  2276. Lines should occur and thus from which raster lines the VIC should start to
  2277. display one text line each. The distance between two text lines can be
  2278. arbitrarily increased if only you hold back the next Bad Line long enough.
  2279. This effect is called "Flexible Line Distance" (FLD).
  2280.  
  2281. E.g. if you only allow three Bad Lines on the screen at raster lines $50,
  2282. $78 and $a0, the VIC will also only display three text lines at these
  2283. positions. The sequencer is in idle state in the lines between.
  2284.  
  2285. If you only delay the occurrence of the first Bad Line, you can scroll down
  2286. the complete graphics display by large distances without moving a single
  2287. byte in display memory.
  2288.  
  2289. 3.14.3. FLI
  2290. -----------
  2291.  
  2292. Instead of delaying the occurrence of Bad Lines as for the FLD effect, you
  2293. may also artificially create additional Bad Lines before the VIC has
  2294. completed the current text line. This is especially interesting for the
  2295. bitmap modes, as these use the data from the video matrix (which is read in
  2296. the Bad Lines) for color information, so normally only single 8╫8 pixel
  2297. blocks can be colored individually in bitmap modes. But if you make every
  2298. raster line a Bad Line by appropriately modifying YSCROLL, the VIC will
  2299. read from the video matrix in every line and so it will also read new color
  2300. information for every line.
  2301.  
  2302. This way, each of the 4╫8 pixels of a block in multicolor mode can have a
  2303. different color. This software-generated new graphics mode is called
  2304. "Flexible Line Interpretation" (FLI) and is probably the most outstanding
  2305. example of "unconventional" VIC programming.
  2306.  
  2307. There is however one problem: If you create a new Bad Line before the
  2308. current text line has been finished, VCBASE is not incremented (see
  2309. 3.7.2.). So the VIC reads from the same addresses in the video matrix as in
  2310. the previous line. As you cannot change the video matrix fast enough with
  2311. the processor, you have to switch the base address of the video matrix with
  2312. the bits VM10-VM13 of register $d018 (unfortunately the Color RAM cannot be
  2313. switched, so the color selection of the pixels is not completely free).
  2314.  
  2315. Besides, the access to $d011 to create the Bad Line may not happen until
  2316. cycle 14 of each raster line, or else the RC would be cleared in every line
  2317. and the bitmap display would not be as desired. But this also implies that
  2318. the first three c-accesses of the VIC in each line do not read valid data,
  2319. because the first c-access in cycle 15 requires that BA should already have
  2320. gone low in cycle 12 so that AEC can stay low in cycle 15 (AEC doesn't stay
  2321. low until three cycles after the negative edge of BA, there is no way
  2322. around that). But as the Bad Line was first created in cycle 14, it's true
  2323. that BA is low in cycle 15 on the first c-access, but AEC is high and so
  2324. the internal data bus drivers D0-D7 of the VIC are closed and as the chip
  2325. is manufactured in NMOS technology, it reads the value $ff and not the
  2326. video matrix data (the data bus drivers D8-D11 are indeed open, but this is
  2327. explained in section 3.14.6. in more detail) which is visible as 24 pixel
  2328. wide stripes on the left side of the screen.
  2329.  
  2330. Practically you store eight video matrices in memory that are used in the
  2331. following way: In the first raster line the first line of the first matrix,
  2332. in the second line the first line of the second matrix, etc..., in the
  2333. eighth line the first line of the eighth matrix, in the ninth line the
  2334. second line of the first matrix, etc. With these eight matrices you can
  2335. line-wise cover a complete bitmap.
  2336.  
  2337. There are several flavors of the FLI mode, such as AFLI (Advanced FLI)
  2338. which uses the standard bitmap mode and simulates color blends by similarly
  2339. colored adjacent pixels, and IFLI (Interlaced FLI) that alternates between
  2340. two frames in a sort of interlace mode.
  2341.  
  2342. 3.14.4. Linecrunch
  2343. ------------------
  2344.  
  2345. By manipulating YSCROLL, you have even more possibilities to control the
  2346. Bad Lines. You may also abort a Bad Line before its correct completion by
  2347. negating the Bad Line Condition within an already begun Bad Line before
  2348. cycle 14. This his several consequences:
  2349.  
  2350.  - The graphics data is in display state, so graphics are displayed.
  2351.  - The RC is not reset. If you abort the very first line of a frame this
  2352.    way, the RC is still at 7 from the last line of the previous frame.
  2353.  - In cycle 58 of the line the RC is still 7, so the sequencer goes to idle
  2354.    state and VCBASE is loaded from VC. But as the sequencer has been in
  2355.    display state within the line, VC has been incremented after every
  2356.    g-access, so VCBASE has now been effectively increased by 40. The RC
  2357.    doesn't overflow, it stays at 7.
  2358.  
  2359. With this procedure you have reduced the display of a text line to its last
  2360. raster line, because as VCBASE has been incremented by 40, the VIC
  2361. continues with the next line. This effect if therefore called "Linecrunch":
  2362. You can "crunch" single text lines with it.
  2363.  
  2364. If you now do this in every raster line, the RC will always stay at 7 and
  2365. there will be no c-accesses, but VCBASE is incremented by 40 in every line.
  2366. This eventually makes VCBASE cross the 1000 byte limit of the video matrix
  2367. and the VIC displays the last, normally invisible, 24 bytes of the matrix
  2368. (where also the sprite data pointers are stored). VCBASE wraps around to
  2369. zero when reaching 1024.
  2370.  
  2371. By crunching whole text lines to one raster line each you have the
  2372. possibility to quickly scroll the screen contents up by large distances
  2373. without moving bytes in the graphics memory, in a similar way as you can
  2374. scroll it down with FLD. The only disturbing side effect is that the
  2375. crunched lines pile up at the upper screen border, looking awkward. But
  2376. here you can use one of the invalid graphics modes to blank out these
  2377. lines.
  2378.  
  2379. 3.14.5. Doubled text lines
  2380. --------------------------
  2381.  
  2382. The display of a text line is normally finished after 8 raster lines,
  2383. because then RC=7 and in cycle 58 of the last line the sequencer goes to
  2384. idle state (see section 3.7.2.). But if you now assert a Bad Line Condition
  2385. between cycles 54-57 of the last line, the sequencer stays in display state
  2386. and the RC is incremented again (and thus overflows to zero). The VIC will
  2387. then in the next line start again with the display of the previous text
  2388. line. But as no new video matrix data has been read, the previous text line
  2389. is simply displayed twice.
  2390.  
  2391. 3.14.6. DMA delay
  2392. -----------------
  2393.  
  2394. The most sophisticated Bad Line manipulation is to create a Bad Line
  2395. Condition within cycles 15-53 of a raster line in the display window in
  2396. which the graphics data sequencer is in idle state, e.g. by modifying
  2397. register $d011 so that YSCROLL is equal to the lower three bits of RASTER.
  2398.  
  2399. The VIC will then set BA to low immediately in the next cycle, switch to
  2400. display state and start reading from the video matrix (the processor is now
  2401. stopped because BA is low and it wants to read the next opcode). However,
  2402. AEC still follows °2 for three cycles before also staying at low state.
  2403. This behavior (AEC not until three cycles after BA) is hardwired in the VIC
  2404. and cannot be avoided.
  2405.  
  2406. Nevertheless, the VIC accesses the video matrix, or at least it tries,
  2407. because as long as AEC is still high in the second clock phase, the address
  2408. and data bus drivers D0-D7 of the VIC are in tri-state and the VIC reads
  2409. the value $ff from D0-D7 instead of the data from the video matrix in the
  2410. first three cycles. The data lines D8-D13 of the VIC however don't have
  2411. tri-state drivers and are always set to input. But the VIC doesn't get
  2412. valid Color RAM data from there either, because as AEC is high, the 6510 is
  2413. still considered the bus master and unless it doesn't by chance want to
  2414. read the next opcode from the Color RAM, the chip select input of the Color
  2415. RAM is not active. Instead, a 4 bit analog (!) switch, U16, connects the
  2416. data bits D0-D3 of the processor with the data bits D8-D13. This connection
  2417. is always in place when AEC is high and should allow the processor to
  2418. access the Color RAM if desired. To make a long story short: In the first
  2419. three cycles after BA went low, the VIC reads $ff as character pointers and
  2420. as color information the lower 4 bits of the opcode after the access to
  2421. $d011. Not until then, regular video matrix data is read.
  2422.  
  2423. These data are stored just as usual at the start of the internal video
  2424. matrix/color line and VC is incremented after each following g-access (with
  2425. the generation of the Bad Line, the sequencer has also been put into
  2426. display state). The c- and g-accesses are continued until cycle 54. But as
  2427. the accesses started in the middle of a line, less than 40 accesses took
  2428. place so VC has been incremented by a total of less than 40 in this raster
  2429. line and no longer is a multiple of 40 as it normally always is at the end
  2430. of a raster line. Because of the working of VC (see section 3.7.2.), this
  2431. "misalignment" is continued for all following lines. So the whole screen
  2432. seems to be scrolled to the right by as much characters as the number of
  2433. cycles the $d011 access was done after cycle 14. As the c-accesses within
  2434. the line start later than in a normal Bad Line, this procedure is called
  2435. "DMA Delay".
  2436.  
  2437. With this, it is possible to scroll the complete screen sideways by large
  2438. distances (this also works with bitmap graphics as with text screens as the
  2439. VC is also used for accessing the bitmap data) without having to move the
  2440. graphics memory with the processor. If you now combine DMA Delay with FLD
  2441. and Linecrunch, you can scroll complete graphics screens without using much
  2442. computing time by almost arbitrarily large distances in all directions.
  2443.  
  2444. Experimenting with the DMA Delay (and with Bad Line effects in general) is
  2445. also the best method to discover the internal functions of the VIC,
  2446. especially of RC and VC, and to determine in which cycles certain things
  2447. are done inside the VIC.
  2448.  
  2449. It should also be mentioned that DMA Delay can not only be achieved by
  2450. manipulating YSCROLL but also with the DEN bit of register $d011. To do
  2451. this, you have to set YSCROLL to zero so that raster line $30 becomes a bad
  2452. line and switch DEN from reset to set in the middle of the line. This is
  2453. because Bad Line can only occur if the DEN bit has been set for at least
  2454. one cycle in line $30, and if YSCROLL is zero a Bad Line Condition will
  2455. occur in line $30 as soon as DEN is set.
  2456.  
  2457. 3.14.7 Sprite stretching
  2458. ------------------------
  2459.  
  2460. As the sprite circuitry is simpler than that for the text graphics, there
  2461. are not as many special effects possible with sprites, but among them is a
  2462. very interesting effect that takes advantage of the way the sprite Y
  2463. expansion works: By modifying the MxYE bits in register $d017 it is not
  2464. only possible to decide for every single sprite line if it should be
  2465. doubled, but you can also have single lines repeated three or more times
  2466. and so expand a sprite by arbitrary scaling factors.
  2467.  
  2468. This effect can be understood as follows (see section 3.8.1.):
  2469.  
  2470. Let's say that we are in cycle 55 of a raster line in which sprite 0 is
  2471. turned on and whose Y coordinate matches the Y coordinate of the sprite,
  2472. so we are in the line before the sprite is displayed. Suppose that the M0YE
  2473. bit is set. The VIC will then turn on the DMA for sprite 0 and clear MCBASE
  2474. and the expansion flip flop. BA goes to low state so that the VIC is able
  2475. to access in the second clock phases of cycles 58 and 59. In cycle 58, MC
  2476. is loaded from MCBASE and so cleared as well, and the p-access for the
  2477. sprite is done. Afterwards, the three s-accesses are carried out and MC is
  2478. incremented after each access so it now has the value 3.
  2479.  
  2480. Now you wait for cycle 16 of the following line. As the expansion flip flop
  2481. is reset, MCBASE still stays at zero. Then you first clear the M0YE bit and
  2482. thereby set the flip flop, but immediately set the M0YE again. The flip
  2483. flop is now inverted in cycle 55, because M0YE is set, and is thus reset
  2484. again (if the M0YE hadn't been cleared, the flip flop would now be set).
  2485. But this is exactly the same state in which the VIC was also in cycle 55 of
  2486. the previous line. So the VIC "thinks" that it is still in the first raster
  2487. line of an expanded sprite line and (as MC is still zero) and it will read
  2488. the first sprite line twice more from memory, three times in total: The
  2489. first sprite line has been tripled.
  2490.  
  2491. Another interesting effect can be achieved by proceeding exactly as
  2492. outlines above and not clearing the M0YE bit after cycle 16 but in the
  2493. second phase of cycle 15. MCBASE will then only be incremented by 1 and the
  2494. next sprite line is read from memory with MC=1..3, that is one byte higher
  2495. than normal. This "misalignment" is continued in the complete display of
  2496. the sprite. Therefore, the condition MC=63 for turning off the sprite DMA
  2497. in cycle 16 is also not met and the sprite is effectively displayed twice
  2498. in sequence. Not until the end of the second display, the DMA is turned off
  2499. when MC is 63.
  2500.  
  2501.  
  2502. 4. The addresses 0 and 1 and the $de00 area
  2503. -------------------------------------------
  2504.  
  2505. The address range $de00-$dfff of the 6510 (see 2.4.1.) is reserved for
  2506. external expansions of the C64 and normally not connected with any other
  2507. unit (RAM, I/O). A read access will fetch data that looks random at first
  2508. sight. The same is true for the upper nybbles of the addresses $d800-$dbff
  2509. (the Color RAM).
  2510.  
  2511. But on some C64, this data is not "random" at all but rather identical to
  2512. the data that the VIC has read from memory in the first phase of the clock
  2513. cycle. This effect is however not reproducible on all machines and not
  2514. always precisely.
  2515.  
  2516. Apart from the fact that this gives the possibility to measure the VIC
  2517. timing completely by software (the timing diagrams in [4] on which the
  2518. diagrams in this article are based, have e.g. been created with this
  2519. method), you can also make the 6510 execute programs in the $de00-area or
  2520. in the Color RAM if the VIC displays a graphics in such a way that the 6510
  2521. gets valid opcodes from the graphics data read by the VIC.
  2522.  
  2523. With a similar effect you can also write to RAM addresses 0 and 1 from the
  2524. processor. They are normally not available as the internal data direction
  2525. register and data register of the 6510 I/O port are mapped to these
  2526. addresses, and the data bus drivers stay in tri-state on a write access.
  2527. But the R/W line is set to low state (this can be explained as the I/O port
  2528. has been integrated afterwards into the existing design of the 6502) and so
  2529. the byte read by the VIC in the first clock phase is written to RAM. If you
  2530. want to write a certain value to addresses 0 or 1 you only have to write an
  2531. arbitrary value to these addresses and take care that the VIC read the
  2532. desired value from RAM in the clock phase before.
  2533.  
  2534. The addresses 0 and 1 can of course also be read by the processor. Either
  2535. with via the $de00-area of with the aid of sprite collisions. For this, you
  2536. make the VIC display a bitmap starting at address 0 and move a sprite
  2537. consisting only of one pixel over the single bits of the first two bytes of
  2538. the bitmap. Depending on whether a collision has been detected or not, you
  2539. can find out the state of the single bits and put them together to one
  2540. byte.
  2541.  
  2542.  
  2543. Appendix A: Bibliography
  2544. ------------------------
  2545.  
  2546. [1] Commodore Business Machines, "C64 Programmers Reference Guide",
  2547.     Appendix L: "6510 microprocessor data sheet", 1984
  2548.  
  2549. [2] dto., Appendix N: "6566/6567 Video Interface Controller (VIC-II) Chip
  2550.     Specifications"
  2551.  
  2552. [3] dto., Chapter 5, Section "Memory management on the Commodore 64"
  2553.  
  2554. [4] Marko MΣkelΣ, "The memory accesses of the MOS 6569 VIC-II and MOS 8566
  2555.     VIC-IIe Video Interface Controller" (AKA: Pal timing), 15.07.1994
  2556.  
  2557. [5] John West, Marko MΣkelΣ, "Documentation for the NMOS 65xx/85xx
  2558.     Instruction Set" (AKA: 64doc), 03.06.1994
  2559.  
  2560.  
  2561. Appendix B: Acknowledgments
  2562. ---------------------------
  2563.  
  2564. I want to thank
  2565.  
  2566.  - Marko MΣkelΣ, Andreas Boose, Pasi Ojala and Wolfgang Lorenz for the
  2567.    amount of work they put into the examination of the VIC
  2568.  - Kaspar Jensen for proof-reading the English version of this document and
  2569.    for his suggestions
  2570.