The VIC-II (Video Interface Chip II), specifically known as the MOS Technology 6567/6566/8562/8564 (NTSC versions), 6569/8565/8566 (PAL), is the microchip tasked with generating Y/C video signals (combined to composite video in the RF modulator) and DRAM refresh signals in the Commodore 64 and Commodore 128 home computers.
Succeeding the original MOS Technology VIC used in the VIC-20, the VIC-II was one of the key custom chips in the Commodore 64 (the other being the MOS Technology 6581 sound chip).
Development history The VIC-II chip was designed primarily by Albert Charpentier and Charles Winterble at MOS Technology, Inc. as a successor to the MOS Technology 6560 "VIC". The team at MOS Technology had previously failed to produce two graphics chips named MOS Technology 6562 for the Commodore TOI computer, and MOS Technology 6564 for the Color PET, due to memory speed constraints.
In order to construct the VIC-II, Charpentier and Winterble made a market survey of current home computers and video games, listing up the current features, and what features they wanted to have in the VIC-II. The idea of adding sprites came from the TI-99/4A computer and its TMS9918 graphics coprocessor. The idea to support collision detection came from the Mattel Intellivision. The Atari 800 was also mined for desired features, particularly bitmap mode, which was a desired goal of the MOS team as all of Commodore's principal home computer rivals had bitmap graphics while the VIC-20 only had redefinable characters. About 3/4 of the chip surface is used for the sprite functionality.
The chip was partly laid out using electronic design automation tools from Applicon (now a part of UGS Corp.), and partly laid out manually on vellum paper. The design was partly debugged by fabricating chips containing small subsets of the design, which could then be tested separately. This was easy since MOS Technology had both its research and development lab and semiconductor plant at the same location. The initial batch of test chips came out almost fully functional, with only one bad sprite. The chip was developed in 5 micrometer technology.
The work on the VIC-II was completed in November 1981 while Robert Yannes was simultaneously working on the SID chip. Both chips, like the Commodore 64, were finished in time for the Consumer Electronics Show in the first weekend of January 1982.
VIC-II features
16 KB address space for screen, character and sprite memory 320 × 200 pixels video resolution (160 × 200 in multi-color mode) 40 × 25 characters text resolution Three character display modes and two bitmap modes 16 colors Concurrent handling of 8 sprites per scanline, each of 24 × 21 pixels (12 × 21 multicolor) Raster interrupt (see details, below) Smooth scrolling Independent dynamic RAM refresh Bus mastering for a 6502-style system bus; CPU and VIC-II accessing the bus during alternating half-clock cycles (the VIC-II will halt the CPU when it needs extra cycles)
Technical details
Note that below register addresses are stated as seen by CPU in a C64. To yield the register numbers as usually given in data sheets (i. e. starting with 0), the leading "D0" should be omitted.
Programming
The VIC-II is programmed by manipulating its 47 control registers (up from 16 in the VIC), memory mapped to the range – in the C64 address space. Of all these registers, 34 deal exclusively with sprite control (sprites being called MOBs, from "Movable Object Blocks", in the VIC-II documentation). Like its predecessor, the VIC-II handles light pen input, and with help from the C64's standard character ROM, provided the original PETSCII character set from 1977 on a similarly dimensioned display as the 40-column PET series.
By reloading the VIC-II's control registers via machine code hooked into the raster interrupt routine (the scanline interrupt), one can program the chip to generate significantly more than 8 concurrent sprites (a process known as sprite multiplexing), and generally give every program-defined slice of the screen different scrolling, resolution and color properties. The hardware limitation of 8 sprites per scanline can be increased further by letting the sprites flicker rapidly on and off. Mastery of the raster interrupt is essential in order to unleash the VIC-II's capabilities. Many demos and some later games would establish a fixed "lock-step" between the CPU and the VIC-II so that the VIC registers could be manipulated at exactly the right moment, but the reliance on raster interrupts to ensure proper synchronization could be reduced and their overhead minimized.
Character graphics The C64 shipped with the PETSCII character set in a 4k ROM, but, like the VIC-20 before it, the actual data for the characters was read from memory at a specified location. This location is one of the VIC-II registers, which allowed programmers to construct their own characters sets by placing the appropriate data in memory; each character is an 8x8 grid, a byte representing 8 bits horizontally, so 8 bytes are required for a single character and thus the complete 256-character set uses a total of 2,048 bytes. Theoretically as many as eight character sets can be used if the entire 16k of video memory were filled.
In addition to charsets, the VIC-II also uses 1000 bytes to store the 25 lines of 40 characters per line, one byte for each character, which in power on default configuration sits at -. Color RAM is accessed as bits 8 to 11 of the video matrix; in the 64 and 128, it is located in I/O space at - and cannot be moved from that location. It contains the values for color 1 (color 3 in multicolor mode) of each character.
The character ROM is mapped into two of the VIC-II's four "windows", at - and -, although the CPU cannot see it there (the character ROM may be switched into - where it is visible to the CPU, but not the VIC-II). Thus graphics data or video buffers cannot be placed at - or - because the VIC-II will see the character ROM there instead. Because these areas of RAM could not be used by the VIC-II graphics chip, they were frequently used for music/sound effects (the SID chip). The C64 has the ability to have RAM and ROM at the same address in memory but the CPU would "see" one and the VIC-II chip would "see" the other.
In default high-resolution character mode, the foreground of each character may be set individually in the color RAM. In multicolor character mode, color 3 is limited to the first eight possible color values; the fourth bit is then used as a flag indicating if this character is to be displayed in high-resolution or multicolor, thus making it possible to mix both types on one screen. Colors 1 and 2 are set by the registers at and and are global for all characters.
If Extended Background Color Mode is used, the upper two bits of the character code are used to select one of four background color registers. This allows four different background colors on the screen, but at the expense of only allowing 64 different characters instead of 256. Because this is limiting, games seldom used it.
Bitmap mode Adding an all-points-addressable bitmap mode was one of the Commodore design team's primary goals, as the VIC-I lacked such a feature. However, in order to use as little additional circuitry as possible, they organized it in the same manner as character mode, i.e. 8x8 and 4x8 tiles. Bitmap graphics require an 8k page for the pixel data and each byte corresponds to one row of eight or four pixels. The next byte is the row underneath it and after the 8th row, returning to the top of the next tile.
In hi-res bitmaps, screen RAM is used to hold the foreground and background colors of each tile (high and low nibble of each byte). This is the only VIC-II mode that does not make any use of the color RAM at or the background color register at .
Multicolor bitmap mode allows three colors per tile (the fourth is the background color as set in ). Colors 1 and 2 are selected by the bits in screen RAM (same as hires bitmaps) and the third is from color RAM.
Despite the high level of color detail and all-points-addressable capabilities of bitmap mode, it is generally impractical for in-game graphics due to requiring a high amount of system resources (8k for the pixel data plus considerably more CPU cycles to modify each tile) and normally cannot be scrolled. Thus, it is most commonly seen on loader and sometimes title screens.
Sprites VIC-II sprites are either 24x21 monochrome or 12x21 multicolor. Similar to character graphics, the latter have one individual color for each sprite and two global ones. VIC-II has eight sprites, each of which uses 64 bytes of memory to store but, with certain limitations, it can display many more. Sprite multiplexing is a common method of getting more than eight on screen (although there still is a maximum of eight per scan line). The VIC-II scanline counter can be polled until the desired point is reached on screen, or a raster interrupt can be programmed to trigger at a certain scanline, after which the program quickly changes the sprite coordinates. This method can result in many additional sprites onscreen at once, often for a total of 16 to 24 or more. For a demo, though, the limit is considerably more flexible.
In theory the maximum number of different sprites visible at the same time is 256 (assuming the VIC-II's entire 16k page was filled). They are addressed by using a block number to refer to each sprite pattern in memory beginning with 0 and going to 255 ($FF) depending on their position in the video page. (if the second video bank (numbered as 0 1 2 and 3) is used, Block 0 would refer to the sprite stored at and Block 255 would be at ).
Each sprite may be double-sized vertically, horizontally or both. This does not increase the sprite resolution (it is still 24 pixels wide and 21 tall) but each pixel will be twice as wide and/or twice as tall.
Because the horizontal position register for each sprite is one byte and limited to a maximum value of 255, it alone cannot cover the entire 320 pixels of the VIC-II's screen area, so an additional register called the Most Significant Byte Flag provides a 9th position bit for all sprites.
and contain the Background and Sprite-to-Sprite Collision registers. The former is rarely used because it cannot provide information on the specific background object the sprite is touching.
contains the Sprite To Background priority register, which is used to govern whether a sprite moves behind or in front of background graphics. When a sprite enters the same space as another sprite, the lower-numbered ones will always pass over the higher numbered ones.
Scrolling In order to scroll a character screen, the VIC-II is set to 38-column and/or 24-line mode via the registers at and . This creates an off-screen buffer where the row of characters to be scrolled is placed. By adjusting the scroll bits in the above-mentioned registers, one row may be moved on-screen after which it repeats unless a new row is put in the buffer. Color RAM is scrolled simultaneous with screen RAM and works the same way.
VIC-II scrolling is a relatively complicated, CPU intensive task, although it is not uncommon for C64 game programmers to cheat by designing graphics so that the color RAM can remain static. Another standard trick is to use a section of the screen (perhaps the bottom or top 4 or 5 character rows) as a game status area to display score, lives, etc. reducing the amount of scrolling that has to be performed. Finally, it is often necessary to use the "double-buffering" technique to prevent screen tearing. Two 1k blocks of screen ram are reserved; one is displayed while another is written to, then during vblank they are quickly swapped through manipulation of the VIC-II registers. Unfortunately this cannot be done with color RAM.