You're quite right — some hasty testing in Sim Coupe reveals that it is much slower. I was imagining that POINT might go through some arcane paths with all the xos/yos/xrg/yrg stuff.

If you have the memory to spare, could you maybe skip over the problem by allocating a new screen that is never shown to the player, then in advance (maybe just after the level has been loaded?) plotting a colour at each position that represents what should happen when the ball is there? It'd mean you could cut yourself down to using a single POINT.

On 18 Sep 2008, at 15:37, Geoff Winkless wrote:

On Thu, 18 Sep 2008 13:26:15 +0100, "Thomas Harte"
<[EMAIL PROTECTED]> wrote:
Maybe something like the following to get the colour of the pixel at (x,
y):

10 LET A=IN 252 BAND 31
20 LET BASE=(A+1)*16384
30 LET ADDR = BASE + (x/2) + y*128
40 LET BYTE = PEEK(ADDR)
50 IF x BAND 1 THEN LET COL = BYTE/16 ELSE LET COL = BYTE BAND 15

I can't believe that would be any quicker (in fact I'd be amazed if it's
not slower) than POINT().

The way to improve the speed in a generic way is to write machine code that checks the edges of a bitmap you pass it and tests the appropriate points
on the screen.

The _fastest_ way is to write a specific set of checks based on the sprite
and the direction of movement.

Basically, let's say you figure out that if you're moving upwards you need to test pixels 2 to 6 on line 0 and pixels 1 and 7 on line 1. Your code for
"test-up" would therefore be

LD A, (IX+1) # pixels 2+3
OR A, (IX+2) # pixels 4+5
RET NZ
OR A, (IX+3) # pixels 6+7
INC I:IX (or whatever your assembler uses for that non-instruction)
OR A, (IX)   # pixels 0+1 line 1
AND &0F      # isolate rightmost pixels
RET NZ
OR A, (IX+3) # pixels 7+8 line 1
AND &f0      # isolate leftmost pixel
RET

IIRC if you call this with USR you get the value in A as the result (or is
it BC? Can't remember), so you can just

IF USR(upcode)<>0 THEN GOTO HIT

There are ways of passing parameters to USR functions, I can't remember how
though :( I'm also not sure if using IX is better than INCing H and L
(probably not)

The problem with POINT (or similar) is that it has to completely
recalculate the positions in memory for every check. That's slowed down even further because each time it has to access the values from BASIC's variable stack which (since it's all floating-point and they're stored in a non-optimal way) is ridiculously slow (it's a shame Andy Wright didn't see
fit to add integer variables like you get in BBC Basic, for example)

Geoff


Reply via email to