ANTIC

ANTIC chip on an Atari 130XE motherboard

Alphanumeric Television Interface Controller (ANTIC) is an LSI ASIC dedicated to generating 2D computer graphics to be shown on a television screen or computer display.

Under the direction of Jay Miner, the chip was designed in 1977–1978 by Joe Decuir, Francois Michel, and Steve Smith for the Atari 8-bit computers first released in 1979. The chip was patented by Atari, Inc. in 1981. ANTIC is also used in the 1982 Atari 5200 video game console, which shares most of the same hardware as the 8-bit computers.

For every frame of video, ANTIC reads instructions to define the background graphics (playfield in Atari parlance), then delivers a data stream to the companion CTIA or GTIA chip which adds color and overlays sprites (called player/missile graphics by Atari). Each ANTIC instruction corresponds to either blank scan lines or one of 14 graphics modes used for a horizontal band of the display. The height of each band depends on the mode. The instructions comprise a display list which specifies how the entire display is built from a stack of individual modes.

The display list specifies where the data for each row comes from. For character modes, the base address of the character bitmaps is stored in an on-chip register and can be changed. Display list instructions can enable horizontal and vertical fine scrolling and mark that an interrupt should occur. An interrupt allows arbitrary 6502 code to execute, usually to change display-related settings in the middle of a frame.

Atari computer magazine Antic was named after the chip.

Features

The list below describes ANTIC's inherent hardware capabilities meaning the intended functionality of the hardware by itself, not including results achieved by CPU-serviced interrupts or display kernels frequently driving register changes.

ANTIC uses DMA to read a program called the display list which specifies these playfield features:

Other register-based functions:

Versions

Listed by part number.

Atari, Inc. intended to combine functions of the ANTIC and GTIA chips in one integrated circuit to reduce production costs of Atari computers and 5200 consoles. Two such prototype circuits were being developed, but neither entered production.

Pinout

Atari ANTIC (C012296) pin-out
Pin namePin number(s)Description
A0 - A1513, 12, 11, 10, 28, 27, 26, 25, 24, 23, 16, 22, 17, 18, 19, 20Memory address I/O
AN0 – AN22, 3, 5ANTIC interface to CTIA/GTIA
D0 – D730, 31, 32, 33, 40, 39, 38, 37Data bus I/O
FØ035Fast phase 0 input clock
HALT9Halt output (suspends CPU while ANTIC reads memory)
LP4Light pen input
NMI7NMI interrupt output to CPU
RDY15Ready output. ANTIC pulls pin low to halt the CPU for horizontal blank syncing (WSYNC)
REF8RAM refresh output
RNMI6NMI interrupt input
RST36Reset ANTIC input
R/W14Read/write I/O direction
Vcc21Power +5 volts
Vss1Ground
Ø034Phase 0 clock output
Ø229Phase 2 input clock

Registers

The Atari 8-bit computers and the Atari 5200 console map the ANTIC chip to the $D4xxhex page.

ANTIC provides 15 Read/Write registers controlling Playfield display parameters, DMA for Player/Missile graphics, fine scrolling, light pen input, and interrupts. Hardware registers do not return the written values back when read. This problem is solved by Operating System Shadow registers implemented in regular RAM as places to store the last value written to registers. Operating System Shadow registers are copied from RAM to the hardware registers during the vertical blank. Therefore, any writes to hardware registers which have corresponding shadow registers will be overwritten by the value of the Shadow registers during the next vertical blank.

Some Write hardware registers do not have corresponding Shadow registers. They can be safely written by an application without the value being overwritten during the vertical blank. If the application needs to know the last state of the register then it is the responsibility of the application to remember what it wrote.

Operating System Shadow registers also exist for some Read registers where reading the value directly from hardware at an unknown stage in the display cycle may return inconsistent results.

NameDescriptionRead/WriteHex AddrDec AddrShadow NameShadow Hex AddrShadow Dec Addr
DMACTLDirect Memory Access ControlWrite$D40054272SDMCTL$022F559
CHACTLCharacter ControlWrite$D40154273CHART$02F3755
DLISTLDisplay List Pointer (low byte)Write$D40254274SDLSTL$0230560
DLISTHDisplay List Pointer (high byte)Write$D40354275SDLSTH$0231561
HSCROLHorizontal Fine ScrollWrite$D40454276
VSCROLVertical Fine ScrollWrite$D40554277
PMBASEPlayer/Missile Base AddressWrite$D40754279
CHBASECharacter Set Base AddressWrite$D40954281CHBAS$02F4756
WSYNCWait for Horizontal SyncWrite$D40A54282
VCOUNTVertical Line CounterRead$D40B54283
PENHLight Pen Horizontal PositionRead$D40C54284LPENH$0234564
PENVLight Pen Vertical PositionRead$D40D54285LPENV$0235565
NMIENNon-Maskable Interrupt (NMI) EnableWrite$D40E54286
NMIRESNon-Maskable Interrupt (NMI) ResetWrite$D40F54287
NMISTNon-Maskable Interrupt (NMI) StatusRead$D40F54287

In the individual register listings below the following legend applies:

Bit ValueDescription
0Bit must be 0
1Bit must be 1
?Bit may be either 0 or 1, and is used for a purpose.
-Bit is unused, or should not be expected to be a certain value
labelRefer to a later explanation for the purpose of the bit.

DMACTL $D400 Write

SHADOW: SDMCTL $022F

Direct Memory Access (DMA) Control

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
--Display List DMAPlayer Missile ResolutionPlayer DMAMissile DMAPlayfield WidthPlayfield Width

DMACTL controls ANTIC's DMA behavior for the Playfield and Player-Missile (sprite) graphics.

Playfield Width bit values:

Playfield Width Bits [1:0]DescriptionSize
0 0 = $00Disable playfield
0 1 = $01Narrow playfield128 color clocks/256 high-res pixels
1 0 = $02Normal playfield160 color clocks/320 high-res pixels
1 1 = $03Wide playfield192 color clocks/384 high-res pixels

Also see Display List DMA bit regarding Playfield display.

Player/Missile DMA bits values:

Player/Missile DMA Bits [3:2]Description
0 0 = $00Disable Player and Missile DMA
0 1 = $04Enable Missile DMA
1 0 = $08Enable Player DMA
1 1 = $0CEnable Player and Missile DMA

ANTIC's Player/Missile DMA feature reads bytes from memory and delivering data to update CTIA/GTIA's GRAFP0, GRAFP1, GRAFP2, GRAFP3, and GRAFM graphics pattern registers relieving the CPU from creating Player/Missile (sprite) graphics. These bits turn on ANTIC's transmission of Player data and Missile data to CTIA/GTIA. CTIA/GTIA must also be configured to receive the data via its GRACTL register in order for Player/Missile DMA to function as expected.

When Player DMA is enabled, Missile DMA automatically occurs to keep the DMA timing consistent, but the data is not delivered to the Missile's GRAFM register.

When enabled, Player/Missile DMA occurs on every scan line in the visible display—from scan line 8 to 247. Therefore, the Player/Missile data in the memory map (see ANTIC's PMBASE) above and below those scan line counts is unused and undisplayed.

Player/Missile Resolution bit values:

ANTIC DMA and Player/Missile pattern register updates occur on each scan line regardless of resolution. When Double line resolution is in effect the Player/Missile memory can be modified between the redundant DMA fetches thus changing the pattern sent to the GRAF* registers and producing apparent Single line resolution Player/Missiles.

Display List DMA bit values:

Playfield display requires that Display List DMA is enabled, and a Playfield width specified. If either value is zero, then no Playfield display is generated.

CHACTL $D401 Write

SHADOW: CHART $02F3

Character Control

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
-----Video ReflectVideo InverseVideo Blank

CHACTL controls character display.

Character control bit values do the following actions:

FeatureBits ValueDescription
Video Blank$01Inverse video characters display as blanks spaces.
Video Inverse$02Inverse video characters appear as inverse video. (default)
Video Reflect$04All characters are displayed vertically mirrored.

The CHACTL Video Inverse and Video Blank bits affect the display of characters in ANTIC Text Modes 2 and 3 which have the high bit set (characters $80 through $FF). Toggling the values of the CHACTL bits allow blinking or blanking these characters globally for the entire display.

Video Inverse and Video Blank enabled together result in reverse video characters displayed as an inverse blank space. Video Inverse and Video Blank bits work in ANTIC modes 2 and 3, and have no effect on the other text modes 4, 5, 6, and 7.

The Video Reflect bit affects all Text Modes. Video Reflect is useful for situations requiring mirroring effects without defining a new character set. An ideal use is card games displaying accurate card faces showing upside down suits. As this vertically mirrors the glyph data before it is used, the effect appears inconsistent for ANTIC Mode 3 descenders with glyph bytes 6 and 7 appearing at the bottom of the descender area.

DLISTL/DLISTH $D402/$D403 Write

SHADOW: SDLSTL/SDLSTH $0230/$0231

Display List Pointer

Bit 15Bit 14Bit 13Bit 12Bit 11Bit 10Bit 9Bit 8Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????????????

ANTIC begins executing the Display List pointed to by the 16-bit address in registers DLISTL/DLISTH (D402-D403hex/54274-54275dec). The address registers are updated during Display List execution by ANTIC's JMP (Jump) and JVB (Jump and wait for Vertical Blank). The address is also updated by the Operating System's Vertical Blank Interrupt (VBI) routine using the values in shadow registers SDLSTL/SDLSTH (0230-0231hex/560-561dec).

When the OS Vertical Blank Interrupt is enabled, direct updates to the ANTIC DLIST registers by the CPU or the ANTIC Jump instructions will be overwritten by the OS during the next Vertical Blank by the values in the shadow registers. Therefore, page flipping implemented by Display Lists that point to the next Display List in series will not operate as expected unless the Vertical Blank interrupt is disabled.

HSCROL $D404 Write

Horizontal Fine Scroll

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
————????

This register specifies the distance of the Horizontal fine scrolling shift in color clocks. Only the lowest 4 bits are significant. The value range of 16 color clocks allows ANTIC to shift Mode 2 Text four characters, and Mode 6 text two characters before a coarse scroll is needed.

When Horizontal scrolling is enabled for a mode line ANTIC fetches the next size increment greater than the current screen width to provide the buffer of data subject to the horizontal scrolling control. When displaying Narrow width ANTIC fetches the screen RAM needed for Normal width. Likewise, for Normal width ANTIC fetches the screen RAM needed for Wide.

ANTIC buffers the first few bytes read from screen memory that are sufficient to cover the 16 color clock range of movement. (Two to four bytes depending on display mode.) The HSCROL value specifies how many color clocks should be output from the buffered data beginning from the last (right most) color clock of the last buffered byte and progressing to the left. When HSCROL is 0 no color clocks are output from the buffer, so the first screen byte displayed is the first byte after the buffered data. As HSCROL increases more color clocks from the end (right side) of the buffered data are added to the left edge of the display causing the fine scroll shift to move the screen contents to the right.

ANTIC Mode F (high-resolution, 1/2 color clock pixels) can only be scrolled two pixels at a time, because HSCROL specifies color clocks.

ANTIC Modes using the alternate GTIA color interpretations must be scrolled by an entire GTIA pixel (two color clocks). Only even values should be used to ensure correct scrolling. Odd values of HSCROL will shift the pixel stream into a different state that GTIA will interpret as different colors.

Unlike many platforms Atari's horizontal scrolling is visually consistent and free from color "strobing" artifacts due to Atari's pixel size matching the color clock timing needed for accurate color.

VSCROL $D405 Write

Vertical Fine Scroll

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
————????

This register specifies the distance of the Vertical fine scrolling in scan lines. The lowest 4 bits are significant, however the Vertical scroll value should range from 0 to the ANTIC Mode line's scan line height - 1. Scrolling farther than the ANTIC Mode's number of scan lines results in lines of repeated data upsetting the fine scrolling continuity (though, this can also be used as an exploitable behavior).

The Vertical scrolling region is defined by setting the VS bit ($20) on a sequential series of ANTIC Mode Lines in the Display List. The first Mode line without the VS bit set becomes the end of the scrolling region and is used as a buffer line to supply the new information to scroll up into the bottom of the scrolling region.

The Vertical scroll value indicates the scan line number to begin the display in the first Mode line and is also used as the scan line number to end the display in the last Mode line (the line without the VS bit set).

Example: Given an eight scan line ANTIC Mode (Text Modes 2, 4, or 6) with the VS bit set on two adjacent Mode lines the scrolling region then consists of three Mode lines—the third line in the scrolling region is the first Mode line encountered without the VS bit set. When Vertical scrolling is not set in the Display List the three Modes lines would naturally result in 24 displayed scan lines. When the VS bits are set in the Display List Mode instructions as described and the VSCROL value is set to 2 then the first Mode line in the region begins displaying at scan line 2 showing scan lines 2 to 7 (six scan lines or 8 - VSCROL), the second Mode line is displayed completely (eight scan lines), and the final Mode line ends at scan line 2 showing scan lines 0 to 2 (three scan lines or VSCROL + 1). The total scan lines displayed in the scrolling region is then 6 + 8 + 3 = 17 scan lines.

Since fine scrolling is based on scan lines not pixel height, and scrolling region movement is done simply by skipping scan lines from the first Mode line and adding scan lines to the last Mode line, it is possible to use different graphics Modes within the scrolling region. This merely requires additional care when determining how many scan lines can be shifted for the current first and last Mode lines in the scrolling region.

Blank Mode lines cannot be contained within a scrolling region, because Blank Mode line instructions inherently do not have a Vertical Scroll Modifier bit. (Blank Mode line instructions specify the blank line count using the bits 7 through 5 that function as LMS, HS, and VS Modifiers for "regular" Playfield Mode instructions.) However, a Blank Mode instruction can be used to end a scrolling region and is still subject to the expected scan line height changes per the vertical scroll value.

PMBASE $D407 Write

Player Missile Base Address

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????

This specifies the page of the base address for Player/Missile graphics. When double line resolution P/M graphics are operating the PMBASE value must begin on a 1K boundary. When single line resolution P/M graphics are operating the PMBASE value must begin on a 2K boundary.

CHBASE $D409 Write

SHADOW: CHBAS $02F4

Character Base Address

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????

This specifies the page of the base address for the character set. ANTIC Modes 2, 3, 4, and 5 use 128 characters in the character set and require the CHBASE value begin on a 1K boundary. ANTIC Modes 6 and 7 use 64 characters, so the CHBASE value must begin on a 512 byte boundary.

The usual default value is $E0hex/224dec for the character set in ROM at $E000hex/57344dec.

WSYNC $D40A Write

Wait For Horizontal Sync

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????

This register allows programs to synchronize to the display. A write to this register halts the 6502 program through the end of the current scanline. This behavior is commonly used during Display List Interrupts to produce clean transitions/changes from one scanline to the next. The value written is unimportant.

VCOUNT $D40B Read

Vertical Line Counter

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????

This register tracks the scan line currently being generated. The value returned is the actual scan line divided by 2. Blank lines generated at the start of the display are included. The value for NTSC will range from 0 to 130 for NTSC, and 0 to 155 for PAL. This value is useful during Display List Interrupts to identify the vertical screen position.

PENH $D40C Read

SHADOW: LPENH $0234

Light Pen Horizontal Position

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????

This contains the horizontal color clock position when the light pen/light gun trigger is pressed. The shadow register is the recommended source for reading this information, since it will be updated during the vertical blank guaranteeing consistent and reliable results. Programs should avoid reading the hardware register directly unless the program is certain the register is read at a time insuring the value is valid. Light guns for the Atari function the same way as light pens with the addition of an optical magnifier allowing the screen to be read from a greater distance. The light pen/light gun input device requires a conventional CRT using a scanning electron beam. The light pen/light gun cannot work with modern LCD TVs and monitors.

PENV $D40D Read

SHADOW: LPENV $0235

Light Pen Vertical Position

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????

This contains the VCOUNT value captured when the light pen/light gun trigger is pressed. The shadow register is the recommended source for reading this information, since it will be updated during the vertical blank guaranteeing consistent and reliable results. Programs should avoid reading the hardware register directly unless the program is certain the register is read at a time insuring the value is valid. Light guns for the Atari function the same way as light pens with the addition of an optical magnifier allowing the screen to be read from a greater distance. The light pen/light gun input device requires a conventional CRT using a scanning electron beam. The light pen/light gun cannot work with modern LCD TVs and monitors.

NMIEN $D40E Write

Non-Maskable Interrupt (NMI) Enable

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
DLIVBIRESET-----

NMIEN enables Non-Maskable Interrupts. The bit values:

FeatureBits ValueDescription
Reset$20Enable Reset key interrupt
VBI$40Enable Vertical Blank Interrupt
DLI$80Enable Display List Interrupt

The Operation System sets NMIEN to the default $40hex/64dec during the power up routines. The NMI service routines first vector through $FFFAhex/65530dec which determines the cause and then transfers control to the interrupt service routine.

DLI:

If NMIEN's DLI bit is set when ANTIC encounters a Display List instruction with the DLI modifier bit set, then ANTIC triggers the DLI on the last scan line of that Display List instruction mode line.

The Operating System does not use DLIs, so the default address for the DLI vector (VDSLST, $0200hex/512dec) points to an RTI instruction in ROM. The application using DLIs must alter VDSLST to point to the desired DLI routine before enabling the DLI.

The 6502 Accumulator, X and Y register contents are not preserved before entry to the DLI routine. It is the responsibility of the DLI routine to save the state of the registers that will be used during the DLI routine, and then the last action is to restore the original values of the registers before exiting with an RTI instruction. Routines typically push the register values to the 6502 stack.

If multiple DLIs are used the first interrupt updates VDSLST to point to the address of the next interrupt, and so on for subsequent interrupts. The last Display List Interrupt routine on the screen points VDSLST back to the address of the first Display List Interrupt. Alternatively, a Vertical Blank Interrupt routine can be used to reset the VDSLST address to guarantee the DLIs remain in sync with the screen.

VBI:

When NMIEN's VBI bit is set, ANTIC will signals a Vertical Blank Interrupt at the end of processing the JVB (Jump vertical blank) at the end of the Display List. The Operating System uses the Vertical Blank to perform various housekeeping chores (among other things - updating timers, copying controller input values to their Shadow registers, and copying the contents of Shadow registers to the custom chips hardware registers.)

The OS jumps through VVBLKI ($0222hex/546dec) to begin the OS VBI Service Routine, and the OS VBI Routine exits with a jump through VVBLKD ($0224hex/548dec). By default VVBLKI points to the OS jump vector SYSVBV ($E45Fhex/58463dec) to begin the Vertical Blank Interrupt, and VVBLKD points to the OS jump vector XITVBV ($E462hex/58466dec).

User programs can insert execution of custom code either before (Immediate) or after (Deferred) the Operating System's Vertical Blank Interrupt routines. Since the OS Vertical Blank interrupt could be called while a user program is updating the vectors, the Operating system provides a routine, SETVBV ($E45Chex/58460dec), that will safely update the VVBLKI or VVBLKD vectors to point to a new routine:

When the CRITIC flag ($42hex/66dec) is non-zero execution of the Deferred Vertical Blank interrupt is suppressed regardless of the addresses in the vectors. The default value of CRITIC, 0, allows execution of both Immediate and Deferred Vertical Blank Interrupts.

NMIRES $D40F Write

Non-Maskable Interrupt (NMI) Reset

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
????????

Any value written to NMIRES resets the bits in NMIST which indicate the reason for the most recent Non-Maskable Interrupt. This is used by interrupt dispatch code in the Operating System and there would ordinarily not be a reason for a user program to write here.

NMIST $D40F Read

Non-Maskable Interrupt (NMI) Status

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
DLIVBIRESET-----

The Operating System's Non-Maskable Interrupt dispatch routine reads this register to determine the reason for the interrupt and so which service routine to execute.

The bit values:

Display list

The display list is the list of instructions directing ANTIC how to generate the display. The data processed by this Display List "program" is the screen memory. The output is the graphics display. The kinds of graphics in the output (text vs addressable pixels) is determined by the instructions in the Display List.

The display List and the display data are written into RAM by the CPU. ANTIC reads the display List instructions, screen memory, and character set information from RAM using a technique known as direct memory access (DMA). A BASIC or 6502 machine language program's job is to initialize the display—set up the display List instructions, organize screen memory (and character set if applicable), and then direct ANTIC to start the display. After this, ANTIC automatically takes care of generating the screen display. This allows the Atari 8-bit computers to produce complex, mixed-mode displays without direct CPU intervention. Other platforms, even those designed much later, cannot either mix graphics modes in one display, or do so without complex CPU interrupts.

ANTIC processes the instructions in the display List, reads the screen memory (and character set data if applicable), translates this information into a real-time stream of graphics data, and sends this data stream to the CTIA/GTIA chip which applies the color to the graphics pixels and outputs the video. Together the two chips provide 6 text and 8 graphics modes (14 total). The more advanced version, GTIA, adds three alternative color interpretations for each ANTIC graphics mode providing a total of 56 (14 times four) graphics modes. However, only the ANTIC graphics modes based on half-color clock pixels are capable of expressing the complete color palette provided by the new color interpretations, and of those modes the ones convenient for use are ANTIC modes 2 (OS Graphics mode 0 text) and ANTIC mode F (OS Graphics mode 8). Thus the reasonable number of unique graphics modes available using the inherent hardware capabilities of ANTIC + GTIA is 20–14 ANTIC modes + 3 additional color interpretations each for ANTIC modes 2 and F.

Display list instruction overview

The Atari display is built as a series of ANTIC instructions each describing a line of text or graphics mode progressively from the top to the bottom of the screen until the desired display area is filled. In effect, the screen is a vertical stack of ANTIC mode instructions. Different modes occupy different numbers of scan lines and use different amounts of RAM. Designing a display requires counting the scan lines of each Mode instruction and tracking the memory for each Mode line to prevent overrunning ANTIC or video standard limitations. (See the Limitations section).

Mixing multiple graphics modes in one display is done simply by providing different character or map mode instructions for the desired position on screen. For example, the Atari Operating System graphics modes 1 through 8 offer full screen display, or an option for a four-line text window at the bottom of the screen. This split screen feature is accomplished using the inherent capabilities of ANTIC and its Display List without any CPU interrupts or custom manipulation of the video hardware.

ANTIC has four types of instructions:

Map and Character mode instructions have additional modifiers that can be enabled with the instruction:

Instruction Execution

ANTIC begins executing the Display List pointed to by the 16-bit address in registers DLISTL/DLISTH ($D402-$D403hex/54274-54275dec). The address registers are incremented by ANTIC automatically as each instruction is executed. ANTIC can only update the lowest 10 bits of the address during the automatic increment limiting the display list to begin and end within a 1K address range.

The registers are also updated during Display List execution by ANTIC's JMP (Jump) and JVB (Jump and wait for Vertical Blank). These instructions load the full 16-bits of address, so can be used to circumvent the 1K Display List limitation.

The address is also updated by the Operating System's Vertical Blank Interrupt (VBI) routine using the values from Operation System shadow registers SDLSTL/SDLSTH ($0230-$0231hex/560-561dec). When the OS VBI routine is enabled direct updates to the ANTIC DLIST registers by the CPU or the ANTIC Jump instructions will be overwritten by the OS during the next Vertical Blank. Since VBI processing is the usual state of the system, most programs rely on this and only update the OS shadow registers (SDLSTL/SDLSTH $0230-$0231hex/560-561dec) to set the Display List.

Instruction Bytes

This legend applies to the instruction bit diagrams below:

Bit ValueDescription
0Bit must be 0
1Bit must be 1
?Bit may be either 0 or 1, and is used for a purpose.
—Bit is unused, or should not be expected to be a certain value
labelRefer to a later explanation for the purpose of the bit.

Instruction Bits:

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
DLILMSVSHSModeModeModeMode

Bits 7:4 are modifiers for Playfield Mode instructions in bits 3:0. Bit value 1 Enables the modifier, and 0 disables the modifier.

Mode 0 Instruction - Blank Lines

DLILinesLinesLinesModeModeModeMode
????0000

When Mode bits are all zero ANTIC performs no playfield DMA and displays one or more blank scan line(s) of the background color. For normal color interpretation modes the "background" is color register COLBK (D01Ahex/53274dec) OS Shadow COLOR4 (02C8hex/712dec), though this differs for the GTIA color interpretation modes. See discussion of COLBK on the GTIA page for more information.

The number of blank scan lines are specified by the value of Bits 4 through Bits 6 allowing a range from 0 through 7. ANTIC adds one to this value and displays the resulting number of scan lines. Instruction Values:

ANTIC InstructionScan Lines
00hex/0dec1 blank scan line.
10hex/16dec2 blank scan lines.
20hex/32dec3 blank scan lines.
30hex/48dec4 blank scan lines.
40hex/64dec5 blank scan lines.
50hex/80dec6 blank scan lines.
60hex/96dec7 blank scan lines.
70hex/112dec8 blank scan lines.

Blank lines are useful for delaying the start of the screen display until the electron beam has left the vertical overscan area at the top of the display. The Atari Operating System creates all its graphics modes beginning with three 70hex/112dec instructions (or 24 blank scan lines) for this purpose. Blank lines are also useful for partitioning parts of a custom display with different purposes (i.e. a border between a status display and the main graphics.)

Blank Mode lines cannot be contained within a scrolling region, because Blank Mode line instructions inherently do not have Fine Scrolling Modifier bits. However, a Blank Mode instruction can be used to end a vertical scrolling region and is still subject to the expected scan line height changes per the vertical scroll value.

The DLI modifier bit is available for blank line instructions. When the DLI bit is enabled a Display List Interrupt will be triggered during the last blank scan line of the instruction. Since playfield DMA does not occur during blank lines (only Display list DMA and Player/Missile DMA (if enabled) occurs) the blank lines can be used where Playfield graphics will not be needed giving more time for Display List Interrupt routines changing color registers or Player/Missile positions.

Mode 1 Instruction - Jump

DLILMSVSHSModeModeModeMode
0?000001

When Mode value is 1 ANTIC executes a Jump in its program (the Display List). The next two bytes in the Display List are loaded into ANTIC registers DLISTL/DLISTH ($D402-$D403hex/54274-54275dec) changing the execution point of the next instruction.

There are two kinds of Jumps:

  • 01hex/1dec JMP - Jump to address. This is used to load a new execution address in the middle of Display List execution, typically when the Display List must cross over a 1K boundary.
  • 41hex/65dec JVB - Jump to address and wait for Vertical Blank. (JMP + LMS bit set) This is used to end the Display List. The address used should be the starting address of the Display List.

The DLIST registers are also updated by the Operating System's Vertical Blank Interrupt (VBI) routine using the values in shadow registers SDLSTL/SDLSTH (0230-0231hex/560-561dec). When the OS VBI routine is enabled direct updates to the ANTIC DLIST registers by the CPU or the ANTIC Jump instructions will be overwritten by the OS during the next Vertical Blank. This implies that an ANTIC JVB (Jump and wait for Vertical Blank) instruction that specifies an invalid address (or a valid address that differs from the shadow SDLST value) has no real effect on the display.

The JVB's argument usually points to the beginning of the same Display List, but it can also point to another Display List, so that a chain of Display Lists is executed after consecutive vertical blanks. Of course, to give ANTIC control over the start of the next Display List the OS Vertical Blank interrupt must be disabled to prevent it overwriting ANTIC hardware registers with the shadow register values.

Modes 2 to F Instructions - Playfield Character and Map Modes

DLILMSVSHSModeModeModeMode
????????

The following is the list of ANTIC graphics mode instructions. For more detailed descriptions of each Mode see the Playfield Graphics Modes section.

ANTIC InstructionMode TypeBytes Per Mode Line (narrow/normal/wide)TV Scan Lines per Mode LineColor
2Character32/40/4881.5
3Character32/40/48101.5
4Character32/40/4885 (multi-color)
5Character32/40/48165 (multi-color)
6Character16/20/2485 (single-color)
7Character16/20/24165 (single-color)
8Map8/10/1284
9Map8/10/1242
AMap16/20/2444
BMap16/20/2422
CMap16/20/2412
DMap32/40/4824
EMap32/40/4814
FMap32/40/4811.5

The memory requirement for a Mode Line is determined by two factors:

The Horizontal Fine Scroll Modifier will change the memory requirement for the current Mode Line from the DMACTL-specified width to the next largest value.

Instruction modifiers

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
DLILMSVSHS????

Bits 7:4 are modifiers for Playfield Mode instructions in bits 3:0. Playfield Mode Instruction values range from $02 to $0F. Modifier bit value 1 Enables the modifier, and 0 disables the modifier.

Horizontal fine scroll

Bit4: position value $10, controls horizontal scrolling of the playfield mode.

When horizontal scrolling is enabled ANTIC retrieves more screen memory bytes than displayed in order to show partially scrolled display bytes at the beginning and end of the line. If the display is in Narrow mode ANTIC retrieves the number of screen bytes necessary for Normal mode. If the display is in Normal mode ANTIC retrieves the number of bytes needed for Wide screen mode. In Wide screen mode ANTIC does not retrieve any additional screen bytes. Scrolling in Wide screen will cause blank data to be shifted into the scrolled area; this occurs in the overscan area which is not visible on a normal NTSC/PAL display.

Vertical fine scroll

Bit5: position value $20, controls vertical scrolling of the Playfield mode.

The Vertical scrolling region in a display is defined by setting the VS bit ($20) on a sequential series of ANTIC Mode Lines in the Display List. The first Mode line without the VS bit set becomes the end of the scrolling region and is used as a buffer line to supply the new information to scroll up into the bottom of the scrolling region.

Load memory scan

Bit6: position value $40, loads a new address for the start of screen memory for the current Playfield mode line.

The LMS option loads ANTIC's screen memory scan address with the 16-bit value in the two bytes following the instruction. The Character or Map mode specified will begin displaying bytes from that address. The LMS option must appear in the first Playfield Mode Instruction line (not Blank Line) in the Display List to initialize ANTIC to begin reading at the start of screen memory. Most of the Operating System-generated full screen modes will have only that one occurrence of the LMS modifier present in the Display List. ANTIC will automatically increment its LMS address at the end of each mode line in preparation for the next line. As long as screen memory does not cross over a 4K boundary the LMS modifier is not needed on subsequent Playfield Mode Instructions.

Full screen displays using Playfield Map Modes E or F will have a second occurrence of the LMS modifier on a Map Instruction near the middle of the screen, since the full display requires more than 4K of screen memory. (Mode F displays include high res 320 pixel lines, and the GTIA display modes.)

Combining the Map and Character Mode instructions with the LMS bit makes it possible to set the screen memory address freely within the 64K address space independently for each display line. In other words, the screen memory does not have to be completely contiguous memory scanned sequentially towards higher addresses - only that a single Mode line must be provided with adequate sequential bytes of memory to meet the requirements of that Mode, width of the display, and Scrolling feature.

Display list interrupt

Bit7: position value $80, directs ANTIC to invoke a CPU-serviced interrupt on the last scan line of the Playfield Mode.

If ANTIC register NMIEN (D40Ehex/54286dec) has Bit7 ($80) set then on the last scanline of the Mode line an interrupt routine will be triggered which is vectored through address VDSLST (200hex/512dec).

The 6502 Accumulator, X and Y register contents are not preserved before entry to the DLI routine. The DLI routine must save the state of the registers used during the DLI, and then restore the original values of the registers before exiting with an RTI instruction.

Playfield graphics modes

The ANTIC chip allows a variety of different Playfield modes and widths. However, the original Atari Operating System included with the Atari 800/400 computers provides easy access to a limited subset of these graphics modes. ANTIC Playfield modes are exposed to users through Atari BASIC via the "GRAPHICS" command, and to some other languages, via similar system calls. Oddly, the modes not directly supported by the original OS and BASIC are modes most useful for games. The later version of the OS used in the Atari 8-bit XL/XE computers added support for most of these "missing" graphics modes.

The ANTIC chip uses a Display List and other settings to create these modes. Any graphics mode in the default GTIA color interpretation can be freely mixed without CPU intervention by changing instructions in the Display List.

The ANTIC screen geometry is not fixed. A hardware register can direct ANTIC to display narrow playfield (128 color clocks/256 hi-res pixels wide), normal width playfield (160 color clocks/320 hi-res pixels wide), and wide, overscan playfield (192 color clocks/384 hi-res pixels wide). While the Operating System's default height for graphics modes is 192 scan lines Antic can display vertical overscan up to 240 TV scan lines tall by creating a custom Display List.

Mode F produces colors through NTSC artifacting and works in a similar manner to the Apple II's graphics modes. The pixel resolution is 320 across but the color resolution half that, thus each group of two pixels will "blend" together to form a single color and four artifact colors may be generated this way. They will be tinted if the foreground and background color are set to something other than black/white/gray. The exact colors produced this way vary with different Atari 8-bit models and also between the CTIA and GTIA chips, thus undesirable artifact colors may result from running software that uses Mode F on a machine other than the one it was developed for. It was not possible to obtain artifact coloring on PAL machines and Mode F will be monochrome on them.

Mode F was not widely used by software due to its high memory requirements (8k) and inconsistent artifact colors that did not appear the same on every model of Atari 8-bit computer. Games that utilize it include Sierra graphical adventures such as Troll's Tale and Wizard and the Princess, Lode Runner, and the Ultima series.

The video display system was designed with careful consideration of NTSC display methods and limitations. The system CPU clock and video hardware are synchronized to one-half the NTSC clock frequency. Consequently, the pixel output of all display modes is based on the size of the NTSC color clock which is the minimum time needed to guarantee correct and consistent color regardless of the pixel's horizontal location on the screen. The result is accurate pixel size and coloring that does not display color "strobing" defects when horizontally scrolled. (Color strobing is unsightly hue changes in pixels based on horizontal position which is caused when signal changes do not align with the color clock and so do not provide the TV/monitor hardware adequate time to reach the correct color.)

Character Modes

Antic Text Mode
OS mode
Characters (or Bytes)
Per Mode Line
TV Scan Lines per Mode Line
Colors
Colors per Character Matrix
Characters in Font
Matrix Pixel Size
(Color Clocks × Scan Lines)
Bits Per Matrix Pixel
Matrix Map
(Color Clocks × Scan Lines)
Matrix Map
(Pixels × Pixels)
Notes
narrow
normal
wide
2032404881.511281⁄2 × 114 × 88 × 8High-res pixels. When the high bit of character is set (values $80 to $FF) the character data is displayed per the CHACTL setting.
3N/a324048101.511281⁄2 × 114 × 8⁄108 × 8High-res pixels. Lowercase characters are displayed 2 scan lines lower allowing descenders.
412 (XL OS)3240488541281 × 124 × 84 × 8Two bits per pixel allowing 4 colors inside one character matrix. When the high bit of the character is set a fifth color replaces one of the other four.
513 (XL OS)32404816541281 × 224 × 164 × 8Color same as above Antic Mode 4. Characters are twice as tall.
61162024851641 × 118 × 88 × 8One color per character matrix. The characters in each 64 character block are shown in a different color.
721620241651641 × 218 × 168 × 8Color same as above Antic Mode 6. Characters are twice as tall.

Glyph Rendering

All character sets use 8 sequential bytes to represent the character. Four types of character/glyph rendering of those bytes are available. Each Character Mode is associated to a specific rendering method:

  • Standard: ANTIC Mode 2. Based on the high resolution graphics modes each bit in the character glyph represents one pixel on screen that is 1/2 color clock wide. The background color is COLPF2 rather than COLBK used in other Character and Map modes. COLBK appears as a border around all four sides of the Playfield. 0 value bits in the character glyph show the background color. 1 value bits show the luminance value from COLPF1 based on the background (COLPF2) color. The character set uses 128 characters and requires 1024 bytes of RAM.
  • Descenders: ANTIC Mode 3. A modification of the Standard method. The method of pixel color display is the same. Each mode line is 10 scanlines tall, though the character glyph is still 8 bytes. Characters 00hex/0dec to 5Fhex/95dec display in the top 8 scan lines with two blank scan lines added at the bottom. Characters 60hex/96dec to 7Fhex/127dec begin with two blank scan lines at the top, and then display the glyph bytes in the bottom 8 scan lines. The first two bytes in the glyph are moved to the bottom two scan lines. This allows a properly designed character set to display true descenders. The character set uses 128 characters and requires 1024 bytes of RAM.
  • Single Color: ANTIC Modes 6 and 7. In these modes each bit in the character glyph represents one pixel that is one color clock wide. The background color is COLBK. Characters may be displayed in a choice of one of four colors. The six low bits of the character value identifies the glyph and the two high bits identify a color. Since the character value is reduced to six bits the character set uses 64 characters and requires 512 bytes of RAM. 0 value bits in the character glyph show the background color. 1 value bits in the glyph data shows one of four possible color choices based on the two high bits of the character value. Character value bits 7 and 6:
Character bits [7:6]Character RangeColor of Glyph pixels
0 0 = $00$00 – $3FCOLPF0
0 1 = $40$40 – $7FCOLPF1
1 0 = $80$80 - $BFCOLPF2
1 1 = $C0$C0 - $FFCOLPF3
  • Multi-Color: ANTIC Modes 4 and 5. In these character modes each pair of bits in the character glyph represents a pixel one color clock wide, thus a single byte of glyph information represents 4 pixels rather than the 8 pixels of other modes. The character set uses 128 characters and requires 1024 bytes of RAM. The background color is COLBK. This mode allows up to four colors (including the background) to be displayed in one character matrix. If the high bit of the character value is set (i.e. inverse video) then a fifth color, COLPF3, is displayed in place of the pixel bit pattern "11" that ordinarily shows COLPF2. The color choices based on the bit pairs of the character glyph:
Character bit 7Glyph bit pairColor of Glyph pixel
0/1 = $00/$800 0COLBK
0/1 = $00/$800 1COLPF0
0/1 = $00/$801 0COLPF1
0 = $001 1COLPF2
1 = $801 1COLPF3

Map Modes

Antic Map ModeOS ModePixels Per Mode Line (narrow/normal/wide)TV Scan Lines per Mode LineBytes per Mode Line (narrow/normal/wide)Bits per PixelColorsColor Clocks per Pixel
8332/40/4888/10/12244
9464/80/9648/10/12122
A564/80/96416/20/24242
B6128/160/192216/20/24121
C14 (XL OS)128/160/192116/20/24121
D7128/160/192232/40/48241
E15 (XL OS)128/160/192132/40/48241
F8256/320/384132/40/48111⁄21⁄2

GTIA Modes

GTIA modes are Antic Mode F displays with an alternate color interpretation option enabled via GTIA register PRIOR ($D01Bhex/53275dec) shadowed by GPRIOR ($026Fhex/623dec). The full color expression of these GTIA modes can also be engaged in Antic text modes 2 and 3, though these will also require a custom character set to achieve practical use of the colors. See GTIA for more information.

Antic Map ModeOS ModePixels Per Mode Line (narrow/normal/wide)TV Scan Lines per Mode LineBytes per Mode Line (narrow/normal/wide)Bits Per PixelColorsColor Clocks per PixelNotes
F964/80/96132/40/48416*216 shades of the background color.
F1064/80/96132/40/48492pixel indirection mode—uses all 9 Playfield and Player/Missile color registers for pixels.
F1164/80/96132/40/48416*215 color hues all in the same luminance set by the background, plus the background color.

See also

References

  1. ↑ Atari Home Computer Field Service Manual - 400/800 (PDF). Atari, Inc. pp. 1–8.
  2. ↑ Neubauer, Doug (2009-06-20). "The Atari Years". Doug Neubauer. Retrieved 2025-07-24.
  3. ↑ US patent 4296476, Mayer, Steven T.; Miner, Jay G.; Neubauer, Douglas G.; Decuir, Joseph C., "Data processing system with programmable graphics generator", issued 1981-10-20, assigned to Atari, Inc.
  4. ↑ Bisson, Gigi (May 1986). "Antic then and now. How the Atari community and this magazine grew up together". Antic. 5 (1): 16–17. ISSN 0745-2527. Retrieved 23 February 2023.
  5. ↑ Michael Current, "What are the SALLY, ANTIC, CTIA/GTIA, POKEY, and FREDDIE chips?", Atari 8-Bit Computers: Frequently Asked Questions
  6. 1 2 Boris, Dan. "Atari Chips". Dan B's Home Page. Archived from the original on 2020-02-05. Retrieved 2011-02-01.
  7. ↑ Vendel, Curt. "Atari 800XLCR". AtariMuseum.com. Archived from the original on 2011-09-13. Retrieved 2011-02-01.
  8. ↑ Vendel, Curt. "KERI Performance Tester". AtariMuseum.com. Archived from the original on 2011-09-13. Retrieved 2011-02-01.