We all know that the Atari is an incredibly
versatile machine but there are some tasks that most people believe
it cannot do. I would like to take a couple of these 'impossible'
tasks and prove that the Atari is even more versatile than you
thought.
Everyone should know that display lists can be
mixed horizontally by building a new display list but ask many
experts if you can combine different graphics modes vertically
across the screen and they will say it can't be done. The program
GRAPHDEM here proves that it is possible to mix Graphics 8 and 9 in
this way and there is no reason why you cannot amend it to include
graphics 10 or 11.
A CONSISTENT MODE
Both programs presented here use a graphics 8
screen as it is one of the most consistent graphics modes as far as
DMA is concerned. In fact every scan line uses the same amount of
DMA with the exception of the two lms scan lines. The first Ims scan
line is two machine cycles ahead of a normal scan line while the
second is three cycles ahead. We have to take account of the
differences in our timing loop. All graphics modes are, in fact,
more consistent than text modes.
GRAPHDEM
This program generates a screen consisting of a
margin of Graphics 8 down the left hand side of the screen with the
rest of the screen in Graphics 9. To add further variety, the normal
4 line Graphics 0 text window is retained. One use of this
arrangement is the ability to draw graphs in 16 intensities neatly
labelled with 40 column text.
The technique is performed by changing the GTIA
selection in PRIOR ($D01B) at a particular point during every scan
line. We end up with every scan line comprising 32 pixels of
Graphics 8 followed by the rest of the screen in Graphics 9. We can
access these from Basic by fooling the OS into thinking that we are
in either Graphics 8 or 9 (subroutines GR8 and GR9) and then drawing
to the relevant section of the screen.
The DLI used is provided in source form with this
article and obviously by increasing or decreasing the delay between
changes to PRIOR we may increase or decrease the proportions in
which the screen is split between the two modes. Obvious other
applications are graphs such as pie charts and so on whilst graphic
adventures could be drawn in Graphics 9 with text or status
information down the side in Graphics 8. There are many other
applications where labelling is required.
One immediate question which arises is is whether
it would be possible to do the same with ANTIC, that is, on a single
scan line, change between ANTIC #E and ANTIC #F display mode.
Unfortunately it doesn't look like this is possible as according to
the Hardware Manuals, ANTIC's Display List Instruction Register (IR)
cannot be directly accessed by the programmer.
PLAYDEM
For the second example I would like to quote from De Re
Atari, page 5-8 under the section Applications of Display List Interrupts.
"Of course, no two sections of the player can be on the same
horizontal line, so two incarnations of the player cannot be on the same
horizontal line."
This statement is completely incorrect and is disproved
by the program PLAYDEM. By using a very precise timing loop, the program
allows two incarnations of player 0 to be present in separate halves of
the screen. The first incarnation can take horizontal positions 0 to 122,
while the second incarnation can take horizontal positions 123 to 255. If
either incarnation is outside of this range it will not be visible.
The timing loop is contained within a DLI and the source
listing is provided. The timing involved every scan line requires waiting
until the first incarnation has been displayed before altering the
player's horizontal position. Obviously this technique could quite easily
be extended to all of the players (by using NOPs within the timing loop).
It would also be possible to change PMBASE as well and thus have
completely independent incarnations of each player as long as they are
within certain screen bounds.
To position these incarnations of player 0, the
horizontal position for the first incarnation should be stored in location
203 and the horizontal position for the second in 204. In the program I
have also displayed all the other players and missiles and the playfield
to prove that there is no cheating!!
This is, obviously, a very powerful technique and it is
feasible that in a game such as PAC-MAN we could generate all the ghosts
from merely one player.
GraphDem
DLI source code
1000 *=$0600
1010 PHA
1020 TXA
1030 PHA
1040 TYA
1050 PHA
1060 LDA #$00
1070 LDY #$40
1080 LDX #$A0 ; loop over 160 scans
1090 LOOP
1100 STA $D40A
1110 STA $D01B ; disable GTIA
1120 CPX #$A0
1130 BEQ SKIP1 ; first lms ?
1140 NOP
1150 SKIP1
1160 CPX #$42 ; second lms ?
1170 BEQ SKIP2
1180 STA $CB ; three cycle delay !
1190 SKIP2
1200 STA $CB ; three cycle delay !
1210 NOP
1220 NOP
1230 NOP
1240 NOP
1250 STY $D01B ; enable GTIA #9
1260 DEX
1270 BNE LOOP
1280 STA $D40A
1290 STA $D01B ; disable GTIA
1300 PLA
1310 TAY
1320 PLA
1330 TAX
1340 PLA
1350 RTI
PlayDem
DLI source code
1000 *=$0600
1010 PHA
1020 TXA
1030 PHA
1040 LDX #$C0 ; loop over 192 scans
1050 LOOP
1060 LDA $CB ; first position
1070 STA $D40A
1080 STA $D000
1090 CPX #$C0 ; first lms ?
1100 BEQ SKIP1
1110 NOP
1120 SKIP1
1130 CPX #$62 ; second lms ?
1140 BEQ SKIP2
1150 LDA $CC ; three cycle delay !
1160 SKIP2
1170 LDA $CC ; second position
1180 NOP
1190 NOP
1200 NOP
1210 NOP
1220 NOP
1230 STA $D000
1240 DEX
1250 BNE LOOP
1260 PLA
1270 TAX
1280 PLA
1290 RTI
top