============================================================================== STANDARD TELEVISION INTERFACE CIRCUIT (STIC) ============================================================================== If the CP-1600 is the brain of the Intellivision, then the STIC chip (AY-3-8900) is heart. The STIC chip provide all the display functions of the Intellivision, as well as the sole timebase in the machine. Note: The files "interrupts.txt", "graphics_mem.txt" and "memory_map.txt" contain some details that may not be covered here. Most notably, I do not cover interrupts and interrupt timing issues here. ------------------------------------------------------------------------------ FEATURES OVERVIEW ------------------------------------------------------------------------------ The STIC provides a 167 x 105 pixel field (NTSC) or 168 x 104 pixel field (PAL) on which to place movable objects (MOBs). The visible portion of this field is 159 x 96 pixels. The STIC provides 8 Movable Objects (MOBs) which may be placed anywhere on the display. It also provides a 20 x 12 matrix of 8x8 background cards which may be used to display scenery or other game information. The MOBs are individually programmable, allowing the shape, color, X and Y magnification, and other attributes to be selectable on a MOB by MOB basis. Further, the STIC can compute collision information (called "interaction") for the MOBs. MOBs can interact with other MOBs, background cards and the screen border. Interaction can be turned on or off on a per-MOB basis as well. The STIC offers multiple modes for displaying background cards, including Color Stack mode, Colored Squares mode, and Foreground/Background mode. ------------------------------------------------------------------------------ COLOR PALETTE ------------------------------------------------------------------------------ The STIC offers a 16-color palette. This palette is divided into two ranges: The Primary Color Set and the Pastel Color Set. The colors are assigned numbers as follows. Primary Color Set Pastel Color Set ------------------------ ----------------------------- 0 Black 4 Dark Green 8 Grey 12 Pink 1 Blue 5 Green 9 Cyan 13 Light Blue 2 Red 6 Yellow 10 Orange 14 Yellow-Green 3 Tan 7 White 11 Brown 15 Purple The Primary Color Set is available for most purposes. The Pastel Color Set can only be used in more limited circumstances. These restrictions will be noted in the descriptions below. ------------------------------------------------------------------------------ STIC REGISTER SUMMARY ------------------------------------------------------------------------------ This is a brief summary of the STIC register set. The operation of these registers will be described in detail below. Note that the STIC registers are only available during the VBLANK interval, or when the display is blanked. ADDRESSES DESCRIPTION ----------------- ---------------------------------------------- $0000 - $0007 MOB X-position registers $0008 - $000F MOB Y-position registers $0010 - $0017 MOB Attribute registers $0018 - $001F MOB Collision registers $0020 Display enable $0021 Mode select $0022 - $0027 reserved $0028 - $002B Color Stack 0 through 3 $002C Display border color $002D - $002F reserved $0030 Horizontal Delay register $0031 Vertical Delay register $0032 Border extension (bit 0=left; bit 1=top) $0033 - $007F Reserved ------------------------------------------------------------------------------ THE OBJECT FIELD VS. THE DISPLAYED AREA. ------------------------------------------------------------------------------ The STIC provides 8 movable objects. These objects may be placed anywhere on a 167 x 105 pixel field (NTSC) or 168 x 104 pixel field (PAL). This field is larger than the actual display. (Recall, the display is 159 x 96.) By default, the object field relates to the displayed area like so: +--------------------------------------------+ | OBJECT FIELD outer area | | +---------------------------------------+| | | DISPLAYED AREA of object field || | | || | | || | | || | | || | | || | | || | | || | | || | | || | | || | +---------------------------------------+| +--------------------------------------------+ Notice that the Object Field starts above and to the left of the displayed area. By default, the object field starts 8 pixels to the left of the display and 8 pixels above the display. The right edges of the object field and the displayed area touch each other. The upper left corner of a MOB can be placed anywhere in the object field. Because most MOBs are 8x8 pictures, this arrangement allows MOBs to slide smoothly off the edges of the screen. In contrast, the 20x12 matrix of background cards is restricted to the 159 x 96 area in the lower-right corner of the object field. (Or rather, more exactly, the 20x12 matrix starts 8 rows below and 8 columns to the right of the object field.) This corresponds to the default displayed area. The remaining portion of the object field is blank -- that is, it is filled in with the background color, as defined by the given display mode. Notice that I keep saying "default" in the above discussion when referring to the displayed areas. It is possible to move the object field relative to the displayed area. This is done using the "horizontal delay" and "vertical delay" registers. The effect of these registers is to move the object field to the right or downwards relative to the displayed area. At the maximum "delay", the object field has the following orientation relative to teh displayed area: +--------------------------------------------+ |+---------------------------------------+ | || | | || | | || | | || | | || | | || | | || | | || | | || | | || | | || DISPLAYED AREA of object field | | |+---------------------------------------+ | | OBJECT FIELD outer area | +--------------------------------------------+ Note that all background cards and MOBs move with the object field. Thus, the delay registers will cause the blank areas to the top and left of the screen to become visible. Depending on the application, this may or may not be desirable. The STIC offers two additional control bits, the Border Extension bits in location $0032, which address this need. These work by reducing the displayed area along the top edge or left edge. When one is set, an 8-pixel wide area along the corresponding edge is blocked out -- that is, the area is filled with the border color. As a result, the blank areas of the object field are never visible; rather, only the background-card filled areas are visible. The displayed area affected by these bits is indicated with "//", "\\" and "XX" below: +--------------------------------------------+ |+---------------------------------------+ | ||XX\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| | ||XX\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| | ||// | | ||// | | ||// | | ||// | | ||// | | ||// | | ||// | | ||// | | ||// DISPLAYED AREA of object field | | |+---------------------------------------+ | | OBJECT FIELD outer area | +--------------------------------------------+ The net effect of the delay registers and border extension registers is to provide a complete mechanism for smoothly scrolling the screen around. Combined with careful programming, the illusion of an infinitely large object field can be produced. MOB coordinates are specified relative to the object field, not the displayed area. Also, a MOB with an X coordinate of 0 behaves as if it is disabled. (Y coordinate of 0 is not special, however.) Thus, with the default display area, the smallest coordinate position where a single pixel of an 8x8 MOB is visible is (1, 1). An 8x8 MOB in that position will have a single pixel of the lower right corner of the MOB is visible in the upper left corner of the screen. ------------------------------------------------------------------------------ MOB CONTROLS ------------------------------------------------------------------------------ The STIC provides 3 registers for controlling each MOB, and a 4th register for reading its collision (or "interaction") status. The registers are laid out as follows: X Register: Address = $0000 + MOB # 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ | ?? | ?? | ?? | X |VISB|INTR| X Coordinate | | | | |SIZE| | | (0 to 255) | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ Y Register: Address = $0008 + MOB # 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ | ?? | ?? | Y | X | Y | Y |YRES| Y Coordinate | | | |FLIP|FLIP|SIZ4|SIZ2| | (0 to 127) | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ A Register: Address = $0010 + MOB # 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ |PRIO| FG |GRAM| GRAM/GROM Card # (0 to 255) | FG Color | | |bit3|GROM| (bits 9, 10 ignored for GRAM) | Bits 0-2 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ C Register: Address = $0018 + MOB # 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ | ?? | ?? | ?? | ?? |COLL|COLL|COLL|COLL|COLL|COLL|COLL|COLL|COLL|COLL| | | | | |BORD| BG |MOB7|MOB6|MOB5|MOB4|MOB3|MOB2|MOB1|MOB0| +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ Notice that there are a variety of flag bits packed into each of the registers. The various flag bits affect the MOBs as follows: INTR If set, this MOB will interact with other MOBs, background cards and the screen borders. If clear, it will not interact. For two MOBs to interact, both of their INTR bits must be set. VISB If set, the MOB is visible onscreen. If clear, it is not visible. The MOB does not need to be visible in order to interact with other MOBs, background cards or the screen border. PRIO If set, the MOB appears behind background cards. If clear, the MOB appears in front of background cards. This ordering applies to the visible pixels of the MOB only. MOBs are first ordered according to their number, with MOB #0 being visible over MOB #1 and so on. The PRIO bit does not affect MOB-to-MOB priority ordering. XSIZE Controls the magnification of the MOB along the X axis. If clear, the MOB is displayed at normal width (8 pixels). If set, the MOB is displayed at double width (16 pixels). YRES These three bits controls the size and magnification of the YSIZ2 MOB along the Y axis. To explain their interaction, consult YSIZ4 the following table. Note that MOBs display with half-pixels vertically, so the displayed height is given in terms of card pixels. YRES YSIZ4 YSIZ2 MOB Resolution Displayed height 0 0 0 8 x 8 4 pixels 0 0 1 8 x 8 8 pixels 0 1 0 8 x 8 16 pixels 0 1 1 8 x 8 32 pixels 1 0 0 8 x 16 8 pixels 1 0 1 8 x 16 16 pixels 1 1 0 8 x 16 32 pixels 1 1 1 8 x 16 64 pixels When YRES is set, the MOB takes its picture information from two consecutive card bitmaps. The upper half always comes from an even numbered card, and the lower half always comes from an odd numbered card. Bit #3 in the A register (the least-significant bit of the card number) is ignored when YRES is set. When both YSIZ4 and YSIZ2 are clear, the MOB is displayed using half-pixels vertically. That is, they have double the vertical resolution of background cards. The displayed heights above are in terms of full pixels. XFLIP Display the horizontal mirror image of the MOB. YFLIP Display the vertical mirror image of the MOB. GRAM/ If set, the bitmap image comes from GRAM. Otherwise, it GROM comes from GROM. CARD # Determines the card # displayed. This field combines with the GRAM/GROM bit to create a 9-bit card # field. This allows addressing all 320 pictures contained in GROM and GRAM. Some of these bits are ignored in certain circumstances, though: Bits 9 and 10 of the attribute register (bits 7 and 6 of the card #) are ignored when the bitmap comes from GRAM, or when the display is in Foreground/Background mode. (This means that only 128 of the 320 pictures are available when the display is in FGBG mode. GROM cards #64 - #255 are unavailable in FGBG mode.) Bit 3 of the attribute register (bit 0 of the card number) is ignored if the YRES bit is set. Bits that are ignored by the hardware may be used by programs to store flags or other information. COLL Set when the MOB interacts with the display borders. BORD COLL Set when the MOB interacts with a set pixel in a background BG card. Note that colored-squares colors 0 through 6 are treated as "set", and color 7 is treated as "clear". COLL Set when the MOB interacts with one of the other MOBs 0 through MOBn 7. Note that a MOB *never* interacts with itself, so its self-collision bit will *never* be set under any circumstance. All 10 collision bits are "sticky", meaning that once set by an interaction, they remain set until the CPU clears them. They will remain set even if the INTR bit is subsequently cleared. The CPU may also artifically set collision bits by writing to the collision registers, although bit #N for MOB #N will never read as 1 even if the CPU tries to set it. Also, writing a new value in bit #X for MOB #Y will not automatically change the value for bit #Y for MOB #X. ------------------------------------------------------------------------------ BACKGROUND CARDS: Color Stack Mode ------------------------------------------------------------------------------ The STIC offers two primary modes for displaying background cards: Color Stack Mode and Foreground/Background mode. Color Stack Mode is set by READING from the STIC Mode Select at location $0021 during VBLANK. The background cards are stored in BACKTAB at locations $200 - $2EF. The cards are stored in raster order. That is, the first row is stored at $200 - $213, the next row is at $214 - $227, and so on. In Color Stack mode, each card specifies the following: -- The Card # to display from GROM or GRAM. All 320 pictures are available. -- The foreground color of the card. The 8 primary colors are available to GROM cards, and all 16 colors are available to GRAM cards. -- Whether to advance the Color Stack. This information is packed into the cards like so: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +----+-----+----+----+----+----+----+----+----+----+----+----+----+----+ |Adv.|FG |GRAM| GRAM/GROM Card # | FG Color | |col |Bit3/|GROM| (0-255 for GROM, 0-63 for GRAM) | Bits 0-2 | |stck| | | | | +----+-----+----+----+----+----+----+----+----+----+----+----+----+----+ The Color Stack is a 4-entry table of colors. These specify the background color for the background cards. The color stack is reset to position 0 when displaying the first card on the screen. The stack is advanced when reaching a card whose color-stack advance bit is set. The advance bit will display the next color stack color starting with the card which advanced the stack. The Color Stack is really a circular entity. Once all 4 color stack entries have been cycled through, the STIC goes back to the first entry. Notes: -- Bit #3 of the foreground color must be 0 when selecting a card from GROM. This is because Bits 11 and 12 are used to select Colored Squares mode, as discussed in the next section. -- Bits 9 and 10 of the card number are ignored for cards coming from GRAM. Thus, these bits may be used for storing other status for pictures coming from GRAM. -- Pixels that are "on" in the background cards will interact with MOBs. Pixels that are "off" will not. Color doesn't matter. -- Bits 14 and 15 are ignored by the STIC and can be used by your program to store whatever information you'd like. This is true in all display modes -- these bits are not physically connected to the STIC. ------------------------------------------------------------------------------ BACKGROUND CARDS: Colored Squares Mode ------------------------------------------------------------------------------ Colored Squares mode isn't really a display mode, per se, but rather a special way of displaying individual cards in Color Stack mode. To display colored squares, the STIC must be set in Color Stack mode. Color Stack Mode is set by READING from the STIC Mode Select at location $0021 during VBLANK. To display a given card in Colored Squares mode, set bit 12 to 1, and bit 11 to 0. This causes the card to be displayed as a Colored Squares card rather than a Color Stack card. In Colored Squares mode, the other bits of the card are interpreted as follows: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ |Pix3| 1 | 0 | Pix. 3 | Pix. 2 color | Pix. 1 color | Pix. 0 color | |Bit2| | | bit 0-1 | (0-7) | (0-7) | (0-7) | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ The four pixels are displayed within an 8x8 card like so: +-----+-----+ |Pixel|Pixel| | 0 | 1 | +-----+-----+ |Pixel|Pixel| | 2 | 3 | +-----+-----+ Notes: -- Colors 0 through 6 display directly from the Primary Color Set. -- Color 7 actually displays the current color on the top of the color-stack. -- Colors 0 through 6 behave as "on" pixels that will interact with MOBs. Color 7 behaves as "off" pixels and does not interact with MOBs. -- Bits 14 and 15 are ignored by the STIC and can be used by your program to store whatever information you'd like. This is true in all display modes -- these bits are not physically connected to the STIC. ------------------------------------------------------------------------------ BACKGROUND CARDS: Foreground/Background Mode ------------------------------------------------------------------------------ Foreground/Background (FGBG) mode is a more flexible display mode than Color Stack in some ways, although it can be more restrictive in others. Foreground/Background mode is selected by WRITING to the STIC Mode Select at location $0021 during VBLANK. In FGBG mode, the contents of the color stack are ignored. Rather, the STIC reads the foreground and background color information directly from each card's information in BACKTAB. In this mode, each card specifies the following: -- Foreground color. These are restricted to the primary color set. -- Background color. All 16 colors are available. -- Card #. Only GROM cards #0 - #63 and GRAM cards #0 - #63 are available. GROM cards #64 - #255 are unavailable. These card numbers are also not available to MOBs in this mode (!). The display word is formatted as follows in FGBG mode: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+----+----+----+----+----+----+ |BG |BG |GRAM|BG |BG | GRAM/GROM Card # | FG Color | |Bit2|Bit3|GROM|Bit1|Bit0| (0 - 63) | Bits 0-2 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+