CHAPTER 15 DISPLAY LISTS The program which runs the ANTIC chip is called the display list. Much like a microprocessor, the ANTIC chip has a program counter, called the display list counter. The display list counter is a 16 bit register. However, the six most significant bits are semi-fixed. These bits can only be changed with a jump instruction. The result of this is that the display list counter cannot cross a 1K memory boundary (i.e. $A3FF to $A400) without using a jump instruction. The ANTIC chip finds the address of the display list in DLISTL [$D402 (54274)] and DLISTH [$D403 (54275)]. SDLSTL [$0230 (560)] and SDLSTH [$0231 (561)] are the shadow registers for DLISTL and DLISTH. The ANTIC 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