Fine Scrolling

by J.S.Masters, Howick, New Zealand

 

Issue 9

May/Jun 84

Next Article >>

<< Prev Article

 

This article broadly introduces Fine Scrolling but some prior knowledge of Display Lists and screen memory is needed. It is recommended that the listing is studied alongside the article.

Scrolling allows you to use the screen as a window to move across a picture much larger than the television could normally accommodate. To do this on other computers, you would have to move thousands of bytes but on the Atari only a couple of addresses need to be changed to manipulate the screen area in RAM. This results in quick motion and is easily programmed but there is a problem in that characters or graphics blocks jump across the screen to give very coarse motion.

Atari, being the machine it is, provides an answer to this problem by having two registers which enable fine scrolling. HSCROL at 54276 ($D404) allows horizontal scrolling and VSCROL at 54277 ($D405) allows vertical scrolling. These registers can only contain numbers in the range 0 to 15 and therefore can only scroll 16 colour clocks horizontally or 16 scan lines vertically. To get continuous fine scrolling of a whole picture, you must first execute fine scrolling until it reaches its limit, then reset the register to zero and execute a coarse scroll.

In order to write a scrolling program, the display list must be altered. Firstly we must find the start of the display list.

10 DL=PEEK(560)+256*PEEK(561)

The next step is to enable the horizontal or vertical scroll and also let the display list know where to find the area of display memory in RAM which holds the picture to be scrolled. Note that for horizontal scrolling RAM must be allocated so that each line is wider than the TV screen. We must change the third byte of the display list and every 3 after it by adding to the ANTIC mode number, 16 to enable horizontal scrolling, 32 to enable vertical scrolling plus 64 to indicate a Load Memory Scan instruction. For example, to enable both horizontal and vertical scrolling in Graphics 2.

20 FOR I=DL+3 TO DL+37 STEP 3: POKE I,119: NEXT I

Then by POKEing DL+4 and DL+5 and every 3 after them with the low and high address of the display memory of each line, the display is ready for scrolling.

30 LO=0: HI=PEEK(106)-20
40 FOR I=DL+4 TO DL+37 STEP 3
50 POKE I,LO: POKE I+1,HI
60 HI=HI+1: NEXT I

To draw a picture in the display memory, you must POKE values directly into the appropriate area as in the accompanying program.

To actually implement the scroll is quite easy. For coarse horizontal scrolling, increment (or decrement) the low address byte (i.e. DL+4,DL+7 etc.) of every mode line. For coarse vertical scrolling, change it by the length in bytes of the whole line. In order to achieve fine scrolling, change the relevant scroll register between changing the address byte.

The accompanying program demonstrates fine horizontal scrolling. It scrolls a terrain across the screen in a continuous loop. The terrain is about 12 screens wide and takes approximately 37.4 seconds for one cycle. It is drawn with a custom Graphics 2 character set as bit mapped graphics take up too much memory. A small spaceship flies above the landscape to show how player-missile graphics are not affected by the scrolling. To ensure smooth flicker-free movement, the scrolling is done in the Vertical Blank Interrupt as it is not possible to achieve such good results in Basic.

After the program is typed in, save it before running it in case you have made a mistake. Upon execution, the new display list will be set up, the PM image will be drawn and lastly the terrain will be drawn. The latter takes quite a while as there is so much of it, but when finished it will all scroll smoothly across your screen.

This article and program first appeared in Inside Info, the journal of Atari Computer Enthusiasts (N.S.W). Used with permission.

AtariLister - requires Java

top