Hello, I just wanted to document this neat little trick here. For changing the colour of one of the 16 stars on screen randomly in Defender they do the following:
* Table of stars @ $AF9D to $AFDC * Format of each star is a 4 byte entry * 00 & 01 - address on screen * 02 - ## where both nibbles match and are a value from 00 to 77 the even or odd pixel will be used at the proper time * 03 - starts with a value of 00, I think it is ignored so the stars can change their colours a little quicker see the ANDB #$3C @ $E0F6 * Change stars colours LDB <MA0DF ;E0F4: D6 DF B=($A0DF) = Random value ANDB #$3C **;E0F6: C4 3C B can't be more then $3C (# of stars table entries) and force it to be a multiple of 4 * Cool * $3C = 00111100 LDX #MAF9D ;E0F8: 8E AF 9D point at the list of stars ABX ;E0FB: 3A move the pointer to certain entry in the table LDA $02,X ;E0FC: A6 02 A = stars pixels colour byte value ADDA #$11 ;E0FE: 8B 11 increment each nibble ANDA #$77 ;E100: 84 77 make sure it's between 00 and 77 STA $02,X ;E102: A7 02 save the new colour value
What makes this code neat?
Well they get a random number to choose which star will change its colour (first line above). Normally you would do an AND #$0F so you have a value between 0 and 15 (your 16 entries) then you shift the value to the left two times which multiplies your value by 4.
That would mean your code would look like this:
ANDB #$0F ASLB ASLB
See the Defender code listing above to do the same thing faster they just used ANDB #$3C which does both things at the same time. It limits the random number to a value between 0 and $3C but also makes it a multiple of 4. Sweet
The two ASLB instructions requires 2 CPU cycles each, 4 cycles total aren’t much but this is used 60 times a second and is another example of some cool programming used in the game.
See you next time…