Typed in by Lance Ewing
Note: There seems to be two different VIC chips that were used in different models of the VIC 20. These are the 6560 and the 6561. Their functionality appears to be the same so I will only refer to the 6561.
The Video Interface Chip, or VIC as it is normally called, is the second most important silicon chip in the VIC 20 microcomputer. It comes second only to the 6502A microprocessor itself.
The VIC is a specially constructed input-output chip (I/O) that has a large variety of functions but it's major function is, as its name suggests, the production of the video output signal.
The VIC appears to the microprocessor, and the user, as an addressable block of RAM of 16 locations, $9000-$900F. Each of these locations can be filled or copied, as applies to any other locations that are actually available, with the actions of the VIC being dependant on the values that are placed in the 16 locations.
___________________ | | not used -|1 40|- +5V | | Composite colour -|2 39|- Clock-in phase-1 | | Sync. & luminance -|3 38|- Clock-in phase-2 | | READ/WRITE -|4 37|- Light pen | | VD11 -|5 36|- Clock-out. Not used. | | VD10 -|6 35|- Clock-out phase-1 | | VD9 -|7 34|- A13 | | VD8 -|8 33|- A12 | | D7 -|9 32|- A11 | | D6 -|10 31|- A10 | | D5 -|11 30|- A9 | | D4 -|12 29|- A8 | | D3 -|13 28|- A7 | | D2 -|14 27|- A6 | | D1 -|15 26|- A5 | | D0 -|16 25|- A4 | | POT X -|17 24|- A3 | | POT Y -|18 23|- A2 | | Composite sound -|19 22|- A1 | | GND -|20 21|- A0 |___________________| Pin 1: Not connected. Pin 2: The composite colour line of the video output. Pin 3: The syncronisation and luminance line of the video output. Pin 4: The video read/write line that is at logic 1 when data is being read from the colour or video RAM. Pins 5-8: The lines of the special colour data bus. Pins 9-16: The eight lines of the ordinary data bus. Pin 17: The input line for potentiometer X. Pin 18: The input line for potentiometer Y. Pin 19: The composite sound line of the audio output. Pin 20: GND Pins 21-34: The 14 address lines of the VIC. Pin 35. The clock-out line that becomes the external time base for the 6502A microprocessor. Pin 36: The system phase-2 clock-out line. Not connected. Pin 37: Light pen input line. Pin 38: Clock-in line from the master clock - phase-2 time. Pin 39: Clock-in line from the master clock - phase-1 time. Pin 40: +5V.THE RELATIONSHIP BETWEEN THE MICROPROCESSOR AND THE VIC
A13 = "BLOCK 4" 14 line address bus a 13 lower address line ____________________________________________________ | > | | __________________________________________ | __|____|__ __|____|__ | | $9000 |__________| | | $9001 |__________| | | . | . | | | . | . | 6502A | | . | . | VIC chip | | . | . | | | . |__________| | | $900E |__________| |__________| $900F |__________| | |_____________________________________________| | | < > | |___________________________________________________| 8 line data bus The above diagram shows the relationship between the microprocessor and the VIC as being the normal one of 'microprocessor and memory linked by address and data buses' but this applies only in system phase-2 time. The timing signals in the VIC 20 are somewhat complicated but they can be explained in quite simple terms. The master clokc generates a two phase output at 1.1082 Mhs. The signals are then used as the 'external time base' for the VIC so that the actions that take place on the VIC can be timed correctly. The VIC in turn reproduces the two phase timing signal on one of its output lines which is then used as the 'external time base' for the 6502A microprocessor. However the final stage has not as yet been reached as the 6502A microprocessor in its turn reproduces the timing signals on one of its output lines so that the timing signals can be used as 'chip select' lines for the RAM chips and I/O chips, but of course not the VIC. Overall, in system phase-2 time the 6502A microprocessor is in communication with its memory, whilst in system phase-1 time, it is the VIC that is linked with the memory. The following memory can be addressed by the VIC chip: -Video RAM -Colour RAM -Character RAM/ROM The 14 line address line can address 16K of memory. The VIC chip uses different addresses to the rest of the computer. The table below illustrates the differing addresses for the memory blocks the VIC chip can access: VIC chip addresses Ordinary addresses memory 0 32768 Unreversed Character ROM 1024 33792 Reversed Character ROM 2048 34816 Unreversed upper/lower case ROM 3072 35840 Reversed upper/lower case ROM 4096 36864 VIC and VIA chips 5120 37888 Colour memory 6144 38912 Reserved for expansion 7168 39936 Reserved for expansion 8192 0 System memory 9216 1024 Reserved for expansion 12288 4096 Program 15360 7168 Screen
The VIC 20 system uses a display of 22 characters per line and has 23 lines. Therefore the video RAM has to be 506 locations in size. In practice with 512 locations allocated there are always siz locations that are unused. The system variable $0288, decimal 648, is used by the operation system to hold the high byte of the current base address of the video RAM and in an unexpanded VIC 20 the value in this location is 30 which corresponds to the base address of $1E00. Interesting effects can be obtained by altering the value of this location.
The different locations are used to hold the appropriate foreground colour for each character area of the display on the TV screen. There is, therefore, a direct correspondence between the locations of the video RAM, the character table and the colour RAM.
In the VIC 20 system there are eight foreground colours and each colour has its own representation for the lower three bits of the locations of colour RAM.
eg. If the value of the three bits is '000' then the colour for that character area will be black.
The colours and their representations are:
BLACK 000 WHITE 001 RED 010 CYAN 011 PURPLE 100 GREEN 101 BLUE 110 YELLOW 111 The fourth bit (bit 3) of each location is used to indicate if multicolour is to be used (discussed later). It is interesting to note that the VIC has a special four line data bus that links the colour RAM to the VIC itself that is used solely to convey the colour data to the VIC. The address of Colour RAM can be determined by looking at Bit 7 of location $9002. If this bit is 1, colour memory starts at location 38400. If this bit is 0, colour memory starts at location 37888. Use the following formula: C = 37888 + 4 * ( PEEK ( 36866 ) AND 128 ) THE INTERNAL REGISTERS OF THE VIC CR0: $9000 - decimal 36864. Usual value decimal 12. A dual function register. Function 1: Bit 7 selects insterface scan mode for the TV. Function 2: Bits 0-6 determine the distance from the left hand side of the TV picture to the first column of characters. Note: On most modern TV sets the effect of selecting the interface scan mode is to produce a light rippling on the screen. CR1: $9001 - decimal 36865. Usual value decimal 38. A single function register. All the bits of this register are used to determine the distance from the top of the TV picture to the first line of characters. CR2: $9002 - decimal 36866. Usual value decimal 150. A dual function register. The first seven bits fo this register determine the number of columns in the TV display. Normally this will be the expected value of 22. Bit 7 of this register is used to hold the value for line 9 of the address for the video RAM. On an unexpanded VIC 20 as the address of the Video RAM is $1E00 and therefore this bit 7 is set, however when the video RAM is moved to $1000 then bit 7 becomes reset. Note: Bit 7 of this register also indicates where the Colour RAM starts. If this bit is 1, colour memory starts at location 38400. If this bit is 0, colour memory starts at location 37888. Use the following formula: C = 37888 + 4 * ( PEEK ( 36866 ) AND 128 ) CR3: $9003 - decimal 36867. Usual value 174. A triple function register. Bit 7 holds the lowest bit of TV raster counter and is therefore alternately set and reset. Bits 1-6 of this register determine the number of rows in the TV display. The value of these bits will normally be 23. Bit 0 is very special as it controls whether normal sized characters or double sized characters are to be displayed. The normal size for a character is 8*8 pixels and is slected by bit 0 being reset, however double sized characters, 16*8 pixels, can be selected by having this bit set. The facility for being able to use double sized characters is not very useful on an unexpanded VIC 20 as there is insufficient RAM to define a reasonable number of double sized characters. CR4: $9004 - 36868. No usual value. This register, together with bit 7 of CR3, forms the TV raster counter. On a 625 line TV this register will count between 0 and 255, and the whole counter between 0 and 311. CR5: $9005 - 36869. Usual value 240. A dual function register. Bits 4-7 holds the values of the topmost four address lines for the Video RAM and bits 0-3 the corresponding values for the character table. Of all these values bits 0 & 7 have a special significance, as whenver this bit is set the memory slected will be in 'block 0', i.e. from $0000- $1FFF, and when reset in 'block 4', i.e. from $8000-$9FFF. In normal operation of a VIC20 this register holds the value 240 decimal and this leads to the Video RAM being situated at $1E00 and the character table at $8000. These addresses are found as follows: Video RAM - bit 7 is set, thereby addressing 'block 0'. -Address lines A12, A11, A10, and A9 are all set and the full address is $1E00 as A13, A14, and A15 are reset for 'block 0'. Character table - bit 3 is reset, thereby addressing 'block 4'. -Address lines A12, A11 and A10 are all reset and the full address is $8000 as A15 is set and A13 and A14 are reset for 'block 4'. CR6: $9006 - 36870. Usual value 0. This register is used in conjunction with the light pen and holds the horizontal postion. CR7: $9007 - 36871. Usual value 1. The vertical position of the light pen. CR8: $9008 - 36872. Usual value 255. The counter for potentiometer 1. CR9: $9009 - 36873. Usual value 255. The counter for potentiometer 2. CRA: $900A - 36874. Usual value 0. This register controls 'speaker-1'. Bit 7 is the on/off control bit, whilst bits 0-6 select the actual note. Speaker 1 has an alto voice. CRB: $900B - 36875. Usual value 0. This register controls 'speaker-2', the tenor voice. CRC: $900C - 36876. Usual value 0. This register controls 'speaker-3', the soprano voice. CRD: $900D - 36877. Usual value 0. This register controls 'speaker-4', the noise voice. CRE: $900E - 36878. Usual value 0. A dual purpose register. Bits 0-3 form the counter for the volume control of the four speakers. When all the bits are reset the volume control is off and when all the bits are set the volume control is fully on. Bits 4-7 hold the users slection of the auxiliary colour which is only used when multicolour is switched on (discussed later). CRF: $900F - 36879. Usual value 27. This is the main colour selecting register of the VIC and has three distinct functions. Bits 0-2 are used to hold the border colour. In the VIC 20 there are eight colours that can be border colours and these are: 0 - 000 Black 1 - 001 White 2 - 010 Red 3 - 011 Cyan 4 - 100 Purple 5 - 101 Green 6 - 110 Blue 7 - 111 Yellow These border colours can be selected by putting the required value into the bits 0-2 of control register CRF. Bit 3 is the reverse field control bit. At any time the state of this bit can be changed to reverse the whole display. Bits 4-7 hold the background colour for the display. There are 16 possible colours and the following tble fives the colours together with their codes. Note that these codes are the same for the auxiliary colours as used in the multicolour mode. 0 - 0000 Black 1 - 0001 White 2 - 0010 Red 3 - 0011 Cyan 4 - 0100 Purple 5 - 0101 Green 6 - 0110 Blue 7 - 0111 Yellow 8 - 1000 Orange 9 - 1001 Light orange 10 - 1010 Pink 11 - 1011 Light cyan 12 - 1100 Light purple 13 - 1101 Light green 14 - 1110 Light blue 15 - 1111 Light yellow CHARACTER TABLE MEMORY The standard character table generator of the VIC 20 is a 4K ROM chip that occupies the block of memory from $8000-$8FFF. This ROM holds the 8x8 matrix representations of all the characters that can be displayed on the TV screen. A single character requires 8 locations, each holding 8 bits, in order to have all its points defined. In the VIC 20 system there are a possible 128 different characters and the first 1K of the 4K ROM holds the straight forward representations for each character. The second 1K holds the 'inverse' representations. 8000-83FF 32768-33791 Upper case and graphics 8400-87FF 33792-34815 Reversed upper case and graphics 8800-8BFF 34816-35839 Upper and lower case 8C00-8FFF 35840-36863 Reversed upper and lower case In order to get lower case letters it has been necessary to have another 2K of representations of the characters. Once again the first 1K holds the straight forward representations and the second 1K holds the 'inverted' representations as shown in the memory map above. In the VIC 20 it is possible to change the area of memory that is used to hold the character table and to change the character representations from the normal 8x8 matrix to one of 8x16. The second feature is the double height character mode referred to in the discussion of the VIC registers themselves. The first block of character memory - upper case and graphics - occupies the ROM locations 32768-34815. The second block - lower and upper case - occupies the ROM locations 34816-36863. Characters are displayed as patterns of dots. Each character position on the screen is composed of an 8x8 sqaure of dots (pixels). Character memory contains the information which tells the computer which dots to turn on or off for a particular character. If a bit is 1, the dot is on (displayed in character colour). If it is 0, the dot is off (displayed in background colour). Therefore, to cover 64 dots, each character representation takes 8 bytes of memory. eg. The character "A" 128 64 32 16 8 4 2 1 0 0 0 1 1 0 0 0 24 0 0 1 0 0 1 0 0 36 0 1 0 0 0 0 1 0 66 0 1 1 1 1 1 1 0 126 0 1 0 0 0 0 1 0 66 0 1 0 0 0 0 1 0 66 0 1 0 0 0 0 1 0 66 0 0 0 0 0 0 0 0 0 As mentioned earlier, the screen codes act as pointers into character memory. The screen code for A is 1. Its 8 bytes of data is therefore stored at 32768 + (8*1) = 32776. So the values 24, 36, 66, 126, 66, 66, 66, 0 are stored from 32776 to 32783. In general, to find the starting address of the representation of a character with screen code X use: 32768 + (8*X) for character set 1 34816 + (8*X) for character set 2 You can change from one character set to the other from the keyboard by using the CBM and shift key, or by changing the value of the character memory pointer - byte 36869. Its value is normally 240 (upper case and graphics) or 242 (upper case and lower case). DESIGNING YOUR OWN CHARACTERS Since the built in character sets are in ROM you cannot directly change them. However, as you have seen, the character memory pointer can be changed. So the secret to using a character set you design yourself is to change the pointer to point to your character set. First, however, you must design your characters. This is usually done with a piece of graph paper representing the 8x8 matrix. Fill in the squares you want and then calculate the values as shown above for the character "A". It is usual to copy some of the built in character set into RAM and then change those characters you wish to. ACCESSING BOTH CUSTOM AND BUILT-IN CHARACTER SETS If you have redesigned most of the characters in your custom character set, displaying understandable messages can be a problem. One solution to this makes use of the fact that the VIC chip sees addresses differently to the rest of the computer. If you place the custom character set at 7168-7679, then printing RVSON within a string will cause the VIC chip to access the unreversed character set in ROM when printing that string. The reasons for this are as follows: The VIC chip can only access 16384 bytes, which it sees as a contiguous block from 0 to 16383. To it the location of the custom character set is 15360. Since RVS ON sets the high bit of a character's screen code, all reversed characters have screen codes of 128 up. To access a character with code 128 the VIC chip goes to location 15360 + (128*8) = 16384. Since the VIC chip cannot access 16384 the address "overflows" and wraps around to 0, which the VIC chip sees as the address of the start of character ROM. This just happens to be the location of the unreversed straight forward, every day representations. HIGH RESOLUTION GRAPHICS MOS 6560/6561 VIC-I Video Interface Circuit documentation This document is Copyright . 1995-1996 Marko Mäkelä. This document may be reproduced in whole, provided that everything, including this copyright message, is included. Any updated versions of this file will be available from http://www.funet.fi/pub/cbm/documents/chipdata/. The 6560 pinout and most of the register map were quoted from the Commodore VIC-20 Programmer's Reference Guide, and the register map and other parts of this document were enhanced with the results got by measuring the 6560-101 and 6561-101 chips. Thanks to Miguel Gordillo for his help in measuring the NTSC-M screen size. Comparison of the known VIC-20 video chips (summary) Chip 6560-101 6561-101 System NTSC-M PAL-B Cycles/line 65 71 Lines/frame 261 312 - interlaced 525 - Crystal 14318181 Hz 4433618 Hz Bus clock crystal/14 crystal/4 Screen width 210 233 Screen height 233 284 - interlaced ? - ^ needs to be measured 6560 pinout (according to the Programmer's Reference Guide): 1 nc 2 comp colour 3 sync&lumin 4 r/w 5-16 db11-db0 17 dotx 18 dot y 19 comp snd 20 vss 21-34 a0-a13 35 pPhi1 36 pPhi2 37 option 38 Phi2 in 39 Phi1 in 40 Vdd 9000 ABBBBBBB 9001 CCCCCCCC 9002 HDDDDDDD 9003 GEEEEEEF 9004 GGGGGGGG 9005 HHHHIIII 9006 JJJJJJJJ 9007 KKKKKKKK 9008 LLLLLLLL 9009 MMMMMMMM 900A NRRRRRRR 900B OSSSSSSS 900C PTTTTTTT 900D QUUUUUUU 900E WWWWVVVV 900F XXXXYZZZ A: interlace mode (6560-101 only): 0=off, 1=on In this mode, the videochip will draw 525 interlaced lines of 65 cycles per line, instead of the 261 non-interlaced lines in the normal mode. This bit has no effect on the 6561-101. B: screen origin X (4 pixels granularity) 6560-101: at 22 chars/line, the suitable range is 1 to 8 With 22 chars/line, the value 8 will show only 6 pixels of the rightmost column 6561-101: at 22 chars/line, the suitable range is 5 to 19 With 22 chars/line, the value 20 will show only 5 pixels of the rightmost column Both: If the value B+2*D is greater than CYCLES_PER_LINE-4, the picture will mix up. With the value 0, there is some disturbance on the screen bottom. C: screen origin Y (2 lines granularity) 6560-101: suitable range is 14 to 130=(261-1)/2, which will display one raster line of text. 6561-101: suitable range is 14 to 155=312/2-1 Both: No wraparound D: number of video columns 6560 range: 0-26 makes sense, >31 will be interpreted as 31. 6561-101: 0-29 makes sense, >32 will be interpreted as 32. E: number of video rows (0-63) 6560-101 practical range: 0-29; at C=14, >=30 gives 29 1/8 6561-101 practical range: 0-35; at C=14, >=36 gives 35. F: character size (1=8x16, 0=8x8) G: current raster line ($9004=raster counter b8-b1, $9003 bit 7 = b0) Vertical blank is on lines 0 through 27. H: screen memory location ($9005:7-4 = b13-b10, $9002:7 = b9 of screen and colour memory) I: character memory location (b13-b10) * Note that b13 is connected to the inverse of A15 on the Vic-20. J: light pen X K: light pen Y L: paddle X M: paddle Y N: bass switch, R: freq f=Phi2/256/(255-$900a) NTSC: Phi2=14318181/14 Hz O: alto switch, S: freq f=Phi2/128/(255-$900b) PAL: Phi2=4433618/4 Hz P: soprano switch, T: freq f=Phi2/64/(255-$900c) Q: noise switch, U: freq f=Phi2/32/(255-$900d) W: auxiliary colour V: volume control X: screen colour Y: reverse mode Z: border colour multicolour (character colour b7=1) 00 = screen colour 01 = character colour 10 = border colour 11 = auxiliary colour Colour codes: 0 black 1 white 2 red 3 cyan 4 purple 5 green 6 blue 7 yellow 8 orange 9 light orange a pink b light cyan c light purple d light green e light blue f light yellow Video timing As the dot clock on the VIC-I is only 4 times the bus clock, the video chip has time to read 2 bytes for every 8 pixels it outputs. All memory accesses are performed without blocking the processor, using the interleaved bus. The basic video timing is very simple. For every character the VIC-I is about to display, it first fetches the character code and colour, then the character appearance (from the character generator memory). The character codes are read on every raster line, thus making every line a "bad line". When the raster beam is outside of the text window, the videochip reads from $001c for most time. (Some videochips read from $181c instead.) The address occasionally varies, but it might also be due to a flaky bus. (By reading from unconnected address space, such as $9100-$910f, you can read the data fetched by the videochip on the previous clock cycle.)