Welp, finally got some time to hack up a little animation for
player0. It's just four frames right now, and I don't know that
the graphics are like I like them (looks a little like the guy has
the palsy when he moves), but the concept appears to be sound and I
thought I'd run it by the list. If you have comments or if it's
useful for the newbie FAQ, shoot away!
Basically I tried to keep the graphics down to 16 scans (single
scan resolution) so that it'd be easy to change frames. Add 16
decimal ($10) to the least significant byte of the address of the
first frame of your graphic to get to the second, $20 to get to the
third, etc. This method craps out after fifteen frames, of course,
without capturing the carry flag and messing with the most
significant byte, etc. But who wants more than fifteen frames (I
think the sixteenth would start dealing with page boundaries --
it's late)?
I used a little neat trick with AND and EOR (for someone of my vast
Stella programming experience it's neat, anyhow!) with SWCHA to
figure out if I needed to change frames so that the guy doesn't run
in place like 2600 Pac-Man. I also used some fancy AND'ing to make
sure the frames were increased every 8/60th (?? - every 8th frame
written to the NTSC screen) of a second. I had every the animation
on every 1/60th at first and, well, it gave me a good laugh. Poor
guy'd been hit by lightning or something.
Here's all the code you'd need to add to get this to work. Stick
it in your main kernel, and assign one byte to the variable
p0FrameCount (though I'm only using 3 bits so Thomas will probably
shoot me for sacrilege):
===============================
; let's see if we need to increase the frame counters
; by checking SWCHA. If D7-4 have a zero anywhere, player0
; has moved.
lda SWCHA
and #%11110000 ; get rid of D3-0 for now -- we're
just checking P0 now
eor #%11110000 ; swap 1s for 0s
beq dontIncreaseFrame ; if all 0's, skip frame increase
; if all we've got are 0's after anding and checking
SWCHA, p0 is about
; to move, and will need its framecount increased
lda p0FrameCount
adc #%00001000 ; ... increase the frame count
"by one frame" (16 dec, $10)
and #%00111000 ; but don't let it get over
"three frames" (48 dec, $30)
sta p0FrameCount ; put back into p0FrameCount
and #%00110000
adc #$08 ; #$08 is the least significant byte for the address of
; player0's first frame of animation
sta grp0lsb ; store in least significant
byte of the address for player0's graphics
dontIncreaseFrame
===============================
In this case, the lsb of the first frame of p0's animation is $08.
If yours is different, that line would change. Again, p0 needs to
be 15 scans tall (assuming one scan of #%00000000 in the 16th to
"zero him out" down the screen after he's painted & single scan
resolution) or less and you can have only eight frames of animation
or less.
Phew, enough ramble. So anyhow I feel sufficiently happy with the
way that I did that that I'm betting there's a better way. Go
ahead and bring me off of my high. :^) The attached demo shows
the code in context. P0 is moved by the first joystick, missile0
by the first joystick when the button's pressed. P1 is, um, in
"debug mode" and isn't completely hooked up yet. More fun to play
with graphics.
Had to split the screen draw logic into three parts to check for
p0 & p1 & one other item each scan line (can optimize that since
they move up and down 2 lines at a time). I check for m0 in part
1, m1 in part 2, and nothing (later the PF) in 3. This means the
missile changes height sometimes by one scan as things stand. Also
haven't bothered with timing yet, so make sure the little dude runs
in the right-hand side of the screen.
TIA!
Ruffin Bailey
http://myfreakinname.blogspot.com
Attachment:
withAnimation.asm
Description: Binary data