|
Subject: Re: [stella] Playfield using "inx" vs "using SLEEP" From: "Andrew Davie" <atari2600@xxxxxxxxxxxxx> Date: Wed, 24 Aug 2005 09:33:11 -0400 |
Hi Fernando
Imagine we're the Atari, and we've just completed the section of code you
understand. Now we get to the bits you don't understand. Here's a
walkthrough of exactly what is happening... remember, we are mostly drawing
a single scanline *in synch* with the sweeping of the TV beam across the
television. And that this all happens in 76 cycles of 6507 time (228 colour
clocks of TIA time). What we're really interested with this sort of code is
where the TV beam *is* when the code executes. They are tightly locked, and
that is the magic to doing interesting things on the '2600.
sta WSYNC
OK, we've just restarted a brand new line. The 6507 was halted, but now the
TIA is drawing a new line, the 6507 is active again. And we're at cycle 0
in the sanline....
lda #%00000000
sta PF1
sta PF2
We've just cleared the playfield registers #1 and 2. That took 8 cycles of
6507 time -- 24 cycles of TIA time. So the TV beam is 24/228 of the way
across its horizontal line draw (but note: only 160 colour clocks are
visible -- the first 68 on any line are invisible, the 'horizontal blank'.
So at the moment, we are still well off the left of the visible screen...
that starts at TIA cycle 68 (or 6507 cycle 68/3 --> 22.666..)
Picture
lda #15
sta COLUPF
lda #%00010000
sta PF0
We've just changed the colour of the playfield, and written a pattern (just
one pixel on) to playfield 0.
Note that the current *horizontal position* of the TV beam can be exactly
determined, because we have executed *exactly* 2+3+3+2+3+2+3 cycles ( = 18
cycles of 6507 time since the start of this scanline). Remember, there are
76 cycles in each scanline. We're still operating *before* the TIA starts
drawing any visible colour clocks.
SLEEP 2 ; what?
The above simply does "something" that takes 2 cycles. It doesn't matter to
us what that is, all the macro does is ensure that the two cycles (no more,
no less) are used. So now we're on cycle #20 in the scanline. There
appears to be no particular reason for this; I would guess that the above
sleep could be omitted, and the following one changed to 27 with exactly the
same visual effect.
lda #0
sta COLUPF
And we set the playfield colour to black. So although the timing isn't
really THAT crucial in this situation, whoever wrote this code wanted the
playfield colour to be black between cycle #25 (20 +2 + 3)...
SLEEP 25 ; for what?
lda #15
sta COLUPF
... and cycle #55.
The sleep above guarantees 25 cycles after the colour is changed to black,
and it takes another 5 cycles to load and store the new colour. Since we
started at cycle #25, we end up at #55.
And then...
lda #%10000000
sta PF2
A pattern (a single pixel on) is written to playfield 2. If you go to the
'Programming for Newbies' tutorial on AtariAge, you should be able to find a
good timing diagram for the playfield, which clearly shows exactly when you
can write values to registers for asymmetric playfields and what happens.
If you don't know, an asymmetric playfield is where you modify the three
playfield registers as the scanline is drawing so that you get a full 40
pixels of playfield data, instead of the mirrored or duplicated 20 pixels.
When you are doing this, you have to wait until the data from a register has
completely displayed BEFORE you change the data for the 2nd use of that
register in the scanline display.
sta WSYNC
The above simply says "we're done with this scanline, halt till the start of
the next one". One should note that the playfield colour in this case is
still #15, so that will remain in effect in the next line until it is set to
black (which happens on 6507 cycle #25. In other words, I would expect to
see colour #15 on the left of the screen up until TIA clock 75 (ie: 8 pixels
at the left of screen), then black for 90 pixels, then colour #15 again for
the rest of the line.
inx
cpx #176
bne Picture
And that keeps us going until our line counter reaches 176.
Hope this helps. As always my timings may be wrong, but you get the idea, I
hope.
Cheers
A
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://stella.biglist.com
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [stella] Playfield using "inx" , Fernando Romo | Thread | Re: [stella] Playfield using "inx" , Fernando Romo |
| Re: [stella] stella charter, cybergoth | Date | Re: [stella] Status of Stellalist, Russ Perry Jr |
| Month |