[some of this file was lost...]
chip also has a memory scan counter. This register scans the display
buffer for data to be interpreted and displayed. Once loaded, the
memory scan counter's 4 most significant bits are fixed. The result
is that the memory scan counter cannot cross a 4K memory boundary
(i.e. $AFFF to $B000) without being reloaded.
DISPLAY LIST INSTRUCTIONS
There are three basic instructions in the display list. The type of
instruction is determined by bits 0,1,2 and 3 of an instruction byte.
The other four bits give auxilliary parameters for the instruction.
Bit 7 always enables a display list interrupts (DLIs).
Display list instruction format
7 6 5 4 3 2 1 0
-----------------
|I|n|n|n|0|0|0|0|
-----------------
\ / \ /
--- ------
| |
| 0 = display blank lines
|
0-7 = number of blank lines (1-8)
7 6 5 4 3 2 1 0
-----------------
|I|W| | |0|0|0|1|
-----------------
| \ /
| ------
| |
| 1 = jump (3 byte instruction)
|
0 = jump and display one blank line
1 = jump and wait for vertical blank
7 6 5 4 3 2 1 0
-----------------
|I|R|H|V|M|M|M|M|
-----------------
| | | | \ /
| | | | ------
| | | | |
| | | | 2-F = display one line of graphics in
| | | | ANTIC mode 2-F
| | | 1 = horizontal scroll enabled
| | |
| | 1 = vertical scroll enabled
| |
| 1 = reload memory scan counter with next two bytes
|
1 = display list interrupt, all instructions
In the display instruction, the ANTIC mode is different from the CIO
graphics mode. However, each CIO graphics mode uses a particular
ANTIC mode. Below are descriptions of the ANTIC modes with their
associated graphics (CIO) modes.
ANTIC MODE 2 (Graphics 0)
Uses 8 pixel by 8 pixel characters, 40 characters horizontal, 8 TV
scan lines vertical. Only one color can be displayed at a time.
ANTIC MODE 3
8 X 10 pixel, Graphics 0 type characters. This mode requires a custom
character set. The advantage is that it allows true decenders. The
custom C-set is still 8 X 8 pixels. Lower-case letters with decenders
have the bottom row of pixels put on the top row.
Lower-case "y" for ANTIC mode 3
C-set Display
---------- ----------
| XXXXX | | |
| | | |
| | | |
| XX XX | | XX XX |
| XX XX | | XX XX |
| XX XX | | XX XX |
| XXXXX | | XXXXX |
| XX | | XX |
---------- | XXXXX |
| |
----------
ANTIC MODE 4 (graphics 12 on XL and XE)
This mode has characters the same size as graphics 0. However, the
characters are only 4 X 8 pixels. This gives only half the horizontal
resolution of graphics 0. The advantage is that up to four colors of
"graphics 0" characters can be displayed at once. This mode also
requires a custom C-set. Below is a comparison of the normal C-set to
one which works with the ANTIC 4 mode.
Upper-case "A" for ANTIC modes 2 and 4
mode 2 mode 4
---------- ----------
| | | |
| XX | | yy |
| XXXX | | yy |
| XX XX | |xx zz |
| XX XX | |xx zz |
| XXXXXX | |xxyyzz |
| XX XX | |xx zz |
| | | |
---------- ----------
xx, yy and zz represent two bit binary numbers, controlling one pixel
each. These numbers determine which color register a pixel is
assigned to: (COLOR0, COLOR1, COLOR2 or COLOR3).
ANTIC mode 5
Antic mode five is identical to ANTIC mode 4 except the characters are
displayed twice as tall. This makes only 12 lines on the screen.
ANTIC MODE 6 (Graphics 1)
This mode uses 8 X 8 pixel characters except they are displayed twice
as wide as in ANTIC mode 2. There are 3 colors available at once but
only one case (upper or lower) can be displayed at a time. The data
base variable CHBAS [$02F4 (756)] controls the character, [$E0 (224) =
upper-case, $E2 (226) = lower-case]
The color/character is controlled by either the color statement or the
ATASCII number of the character printed. Control characters are
controlled by COLOR0, upper-case characters by COLOR1 and lower-case
characters by COLOR2. Remember that all characters print as
upper-case alpha characters, but of different colors.
ANTIC MODE 7 (Graphics 2)
This mode is identical to mode 6 except the characters are displayed
twice as tall. This results in only 12 lines possible on the screen.
ANTIC MODE 8 (Graphics 3)
This is the first graphics (non-character) mode. This mode, as other
non-character graphics modes do, uses data in the display buffer as a
bit map to be displayed.
A command to display in mode 8 will cause the ANTIC chip to read the
next 10 bytes in the display buffer. Each pair of bits will control
one pixel as in mode 4. However, the pixels are blocks the same size
as a Graphics 0 (ANTIC 2) characters.
ANTIC MODE 9 (Graphics 4)
This is similar to ANTIC mode 8 except each byte controls 8 pixels
(instead of 4) and only one color can be displayed at a time. The
pixels are also half the size of those in ANTIC mode 8.
ANTIC MODE A (Graphics 5)
This mode uses 20 bytes per line/command. As in ANTIC mode 8, each
pair of bits controls one pixel. The result is that the pixels are
the same size as in ANTIC mode 9 but four colors can be displayed at
once.
ANTIC MODE B (Graphics 6)
As in mode A, there are 8 pixels per byte and only one color. The
pixels are half the size as in mode A.
ANTIC MODE C
Like mode B except the pixels are half as tall (only one T.V. line).
ANTIC MODE D (Graphics 7)
40 Bytes per line, each byte controls 4 pixels. The pixels are 1/4 as
large as in ANTIC mode 8 (Graphics 3).
ANTIC MODE E (Graphics 15 on XL and XE)
Like mode D except the pixels are half as tall (one T.V. line). Antic
mode E is sometimes called Graphics 7.5
ANTIC mode F (Graphics 8, 9, 10 and 11)
This is the highest resolution mode. Pixels are 1/8 the size of ANTIC
mode 8 or mode 2 characters. It uses 40 bytes per line, each byte
controlling 8 pixels, unless the GTIA chip intervenes. Only one color
can be displayed at a time.
DISPLAY LIST EXAMPLES
When CIO opens a channel to the screen, it sets up the proper display
list for the ANTIC chip. The following are the things CIO must handle
when setting up the display list.
Display list duties as used by CIO
display a certain number of blank lines at the top of the screen.
Load the memory scan counter with the address of the display data
buffer.
Display the required number of lines in the required ANTIC mode.
Set up a jump instruction if the display list crosses a 1K memory
boundary.
Set up a reload-memory-scan-counter instruction if the display data
buffer crosses a 4K memory boundary.
CIO assumes that the display data buffer will butt against an 8K
memory boundary. If a program causes the display buffer to cross a 4K
boundary (by changing RAMTOP [$006A (106)] to point to an address
which is not at an 8K boundary) the screen will be scrambled. This is
not usually a problem if the graphics mode doesn't require a large
block of memory.
SAMPLE DISPLAY LIST
Below is an example of a Graphics 0 display list as CIO would set it
up.
Display list for Graphics 0
assuming BASIC starts at $A000
address instruction explanation
Dec. Hex.
$9C20 112 $70 \
112 $70 >---- 24 blank lines (8 each command)
112 $70 /
66 $42 ----- load memory scan counter with
$9C24 64 $40 \__ next two bytes and display one line
156 $9C / \ of ANTIC 2 characters
2 $02 -\ |
2 $02 | \- address of display data buffer
2 $02 |
2 $02 \--- 2nd ANTIC 2 instruction
- ---
2 $02 ----- 24th ANTIC 2 instruction
65 $41 \
32 $20 >---- jump back to start of list
156 $9C /
$9C40 ??? ?? first byte of display data buffer
--- --
$9FFF ??? ?? last byte of buffer
$A000 start of ROM
A display list for a higher resolution graphics mode would require
more instructions and might cross a 1K boundary. It would then
include a jump instruction to cross the boundary.
MULTIPLE DISPLAYS
It is possible to set up multiple displays and use one at a time. The
technique of changing from one display to another is called page
flipping. Below is the simplest way to set up two displays.
setting up two displays
Call a graphics mode through CIO or by using a BASIC GRAPHICS
command.
Store the display list pointers, SDLSTL and SDLSTH, and the CIO screen
pointer, SAVMSC [$0058,2 (88)].
Move the start-of-ROM pointer, RAMTOP [$006A (106)] to below the
current display list. RAMTOP is a one byte pointer so it changes in
increments of one page (256 bytes).
make another graphics call as in the first step.
store the new display list pointer and CIO screen pointer.
This will set up two displays, each with it's own display list. If
the displays are in the same graphics mode, or you will not make any
changes in the displays with CIO commands, (PLOT, PRINT, etc.) you can
flip between the two simply by changing the display list pointer.
If the screens are in the same graphics mode and you want to change
which one to do CIO commands to, Change the CIO screen pointer, SAVMSC
[$0058,2 (88)]. This way, you can display one screen while drawing on
the other.
If you want to do CIO commands to screens of different graphics modes,
you will have the move RAMTOP and do a graphics call to change
screens.
If your manipulation of RAMTOP causes the display data buffer to cross
a 4K boundary, the screen may be scrambled.
DISPLAY LIST INTERRUPTS
DLIs are not used by the operating system. However, other programs
can initiate and use them. Use the following steps to set up display
list interrupts.
Setting up DLIs
Set bit 7 of the display list instruction for the line before you want
the interrupt to occur. (The interrupt routine should set WSYNC and
wait for the next line to execute.)
Set bit 7 of NMIEN [$D40E (54286)] to enable DLIs.
Set the DLI routine vector, VDSLST [$0200,2 (512)] to point to your
machine language DLI routine.
Your DLI routine should set WSYNC [$D40A (54282)]. STA WSYNC will do.
THis will cause the 6502 to wait for the next horizontal sync. This
will keep the DLI routine from changing something in the middle of a
T.V. line.
The DLI routine must end with an RTI instruction.
SCROLLING
Scrolling is controlled by a combination of scroll position registers,
and changing the memory scan counter. Basically, course scrolling is
done by reloading the memory scan counter and fine scrolling is done
by changing the scroll registers.
VERTICAL SCROLLING
Vertical scrolling is very simple. Follow the steps below to set up
vertical scrolling of graphics.
Steps to use vertical scrolling
Set bit 4 of the first byte of the display list instruction for each
line to be scrolled.
Put the number of T.V. lines to offset the graphics vertically in the
vertical scroll register, VSCROL [$D405 (54277)]
The vertical scroll register can offset the graphics upward by 0 - 7
T.V. lines in the 24 line graphics modes (ANTIC modes 2 and 4). In 12
line graphics modes (ANTIC modes 5 and 7) it can vertically offset the
graphics by 0 - 15 T.V. lines. To offset the graphics an 8th (or
16th) line, the scroll register is reset to 0 and the memory scan
counter is reloaded with the address of the next line of graphics in
the display data buffer. If the entire screen is being scrolled, the
load-memory-scan-counter command (near the beginning of the display
list) is changed to point to the address of the second line of
graphics.
HORIZONTAL SCROLLING
Horizontal scrolling works much like vertical scrolling. It is
enabled by setting bit 5 of the instruction for each line to be
scrolled. The horizontal scroll register, HSCROL [$D404 (54276)],
sets the offset. The small difference is that graphics are moved
twice as far per change (two graphics 8 pixels instead of one). Also,
when HSCROL = 0 the graphics are offset beyond the left edge of the
screen by 16 color clocks (32 Graphics 8 pixels). When HSCROL = 15,
the graphics line is shifted one color clock (2 Graphics 8 pixels) to
the left of the screen.
The big difference is that the memory scan counter gets messed up.
This means that you must use a reload-memory-scan-counter command for
each line of graphics. This is a major modification of the display
list. It will require you to move and build the list yourself.
The advantage of this is that you can have a scrolling window in a
large graphics map. The technique is to move the window by reloading
the memory scan counter, then fine scrolling to the invisible bytes
beyond the edges of the screen.
useful data base variables and OS equates
SAVMSC $0058,2 (88): pointer to current screen for CIO commands
RAMTOP $006A (106): start-of-ROM pointer (MSB only)
VDSLST $0200,2 (512): DLI vector
RAMSIZ $02E4 (740): permanent start-of-ROM pointer (MSB only)
DLISTL $D402 (54274): display list pointer low byte
DLISTH $D403 (54275): " high byte
HSCROL $D404 (54276): horizontal scroll register
VSCROL $D405 (54277): vertical scroll register
NMIEN $D40E (54286): NMI enable (DLIs)
Shadow registers
SDLSTL $0230 (560): DLISTL
SDLSTH $0231 (561): DLISTH