Skip to navigation

Elite on the BBC Micro and NES

Version analysis of PIXEL2

This code appears in the following versions (click to see it in the source code):

Code variations between these versions are shown below.

Name: PIXEL2 Type: Subroutine Category: Drawing pixels Summary: Draw a stardust particle relative to the screen centre
Draw a point (X1, Y1) from the middle of the screen with a size determined by a distance value. Used to draw stardust particles.
Arguments: X1 The x-coordinate offset Y1 The y-coordinate offset (positive means up the screen from the centre, negative means down the screen) ZZ The distance of the point (further away = smaller point)
.PIXEL2 LDA X1 \ Fetch the x-coordinate offset into A

Code variation 1 of 3A variation in the labels only

Tap on a block to expand it, and tap it again to revert.

BPL PX1 \ If the x-coordinate offset is positive, jump to PX1 \ to skip the following negation EOR #%01111111 \ The x-coordinate offset is negative, so flip all the CLC \ bits apart from the sign bit and add 1, to convert it ADC #1 \ from a sign-magnitude number to a signed number .PX1
BPL PX21 \ If the x-coordinate offset is positive, jump to PX21 \ to skip the following negation EOR #%01111111 \ The x-coordinate offset is negative, so flip all the CLC \ bits apart from the sign bit and add 1, to convert it ADC #1 \ from a sign-magnitude number to a signed number .PX21
 EOR #%10000000         \ Set X = X1 + 128
 TAX                    \
                        \ So X is now the offset converted to an x-coordinate,
                        \ centred on x-coordinate 128

 LDA Y1                 \ Fetch the y-coordinate offset into A and clear the
 AND #%01111111         \ sign bit, so A = |Y1|

Code variation 2 of 3A variation in the labels only

Tap on a block to expand it, and tap it again to revert.

CMP #96 \ If |Y1| >= 96 then it's off the screen (as 96 is half BCS PX4 \ the screen height), so return from the subroutine (as \ PX4 contains an RTS)
CMP #96 \ If |Y1| >= 96 then it's off the screen (as 96 is half BCS PXR1 \ the screen height), so return from the subroutine (as \ PXR1 contains an RTS)
 LDA Y1                 \ Fetch the y-coordinate offset into A

Code variation 3 of 3A variation in the labels only

Tap on a block to expand it, and tap it again to revert.

BPL PX2 \ If the y-coordinate offset is positive, jump to PX2 \ to skip the following negation EOR #%01111111 \ The y-coordinate offset is negative, so flip all the ADC #1 \ bits apart from the sign bit and subtract 1, to negate \ it to a positive number, i.e. A is now |Y1| .PX2
BPL PX22 \ If the y-coordinate offset is positive, jump to PX22 \ to skip the following negation EOR #%01111111 \ The y-coordinate offset is negative, so flip all the ADC #1 \ bits apart from the sign bit and add 1, to convert it \ from a sign-magnitude number to a signed number .PX22
 STA T                  \ Set A = 97 - Y1
 LDA #97                \
 SBC T                  \ So if Y is positive we display the point up from the
                        \ centre at y-coordinate 97, while a negative Y means
                        \ down from the centre

                        \ Fall through into PIXEL to draw the stardust at the
                        \ screen coordinates in (X, A)