|
Subject: Re: [stella] Death Derby, new build From: Thomas Jentzsch <tjentzsch@xxxxxx> Date: Sun, 7 Oct 2001 10:52:19 +0100 |
Glenn Saunders wrote:
> In this build a lot of the stuff is laid out in memory, the sprites et. al.
Your demo is showing a lot of flickering crap at the top. I guess that
is intentional for now. When I tried to adjust this with Page-Up/Down in
z26, the flickering crap seems to move(!) further down. Can't explain
this, there seems something to be completely broken in your code.
> I actually have a car showing up, but I don't like the routines that handle
> the logic. Too much RAM and cycles.
I agree, but here optimizations will make the explanations quite
difficult.
I'm giving you the same suggestions, that I gave to Manuel (s. Gunfight
2600, Feb, 13. 2001).
The first step, you should try, is to use Y as THE universal rowcounter.
Try not to use Y for anything else, and do all loading of the graphics
(cars, later the pedestrians) with this rowcounter. That way you save a
lot of cycles during the kernel and some RAM space. You have a two-line
kernel, so let Y countdown every 2nd row.
The kernel code for the car could look like this:
P0Loop
TYA
SEC
SBC SpriteStart ; contains the line where the car starts+1
ADC #SPRITEHEIGHT ; assuming the height is constant (i.E. 8)
BCC .skipDraw
LDA (P0_CurrentFramePtr),Y
STA GRP0
.skipDraw:
This requires, that you must do some a bit more complicated setup
calculations for the pointers (i.E. P0_CurrentFramePtr).
Currently this pointer is directly pointing to CarRotation0..4. For the
code above, we must subtract the y-position, or: the value of the
rowcounter Y when the car is drawn (i.E. 50).
LDA #<CarRotation0
SEC
SBC #50
STA P0_CurrentFramePtr
LDA #>CarRotation0
SBC #0
STA P0_CurrentFramePtr+1
and
LDA #51
STA SpriteStart
And you have to arrange your data very carefully, if you want to avoid
additional cycles for crossing a page. If your kernel is 180 lines tall,
you countdown Y every 2nd line and the car can be displayed in every
row, then your data must be inside 256*n+180/2 and 256*(n+1)-1.
I hope, this makes sense to you. But my english is limited and here the
kernel is starting to get complex. Maybe Manuel can explain this better.
> I tried to use indirect addressing to set up pointers to the start of car
> sprite ROM in order to handle the rotations but I don't think I understand
> how to do this properly. I had to go back to hardcoding it to one car shape.
> Please assist :)
That's easier :)
Replace
LDX P0_CurrentRowCounter
LDA (P0_CurrentFramePtr,X) ; indexed, indirect
with
LDY P0_CurrentRowCounter
LDA (P0_CurrentFramePtr),Y ; indirect, indexed
Another tip:
InitializeTombstones
...
DEX
BPL InitializeTombstones ; replaces BNE
; remove the next 8 instructions
Have fun!
Thomas
_______________________________________________________
Thomas Jentzsch | *** Every bit is sacred ! ***
tjentzsch at web dot de |
-
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://www.biglist.com/lists/stella/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] Death Derby, new build, B. Watson | Thread | Re: [stella] Death Derby, new build, Manuel Polik |
| Re: [stella] Death Derby, new build, B. Watson | Date | [stella] Supercharger and the 7800, Oliver Scholz |
| Month |