I gutted it last night and turned it into tinylife instead - still 512 bytes, plenty of which is wasted on input processing, which I dropped in right at the end.
http://www.glost.eclipse.co.uk/gfoot/gp2x/tinylife.zip
B = reset, X = pause, A = slow, Start = quit (in true GPH/Microsoft style)
It doesn't exec the menu on exit, but hey, it's not a .gpe so it doesn't appear on the menu anyway. Wrap it in a script if you like.
I was expecting it to run quite slowly, but I'm now vaguely impressed with the memory access bandwidth etc, using cached memory at least.
There's nothing particularly groundbreaking here - the LCRNG code might be interesting though, as you can do it in a single instruction on ARM. The values of A and B came from wikipedia. Luckily the values are such that the whole parameter block can be overlaid on the elf and program headers, so the storage cost is pretty much zero.
The random number processing is perhaps a bit over the top - even with good A and B values, LCRNGs tend to give poor randomness in the lower bits, and with this kind of filling-the-screen-with-random-pixels code you start seeing visible patterns if you use the bottom 10 bits or so.
I initially jumped through a few hoops to get reasonably good results - picking four high bits and spreading them out to bits 0, 8, 16 and 24 of a word to write - which gives a nice random snowstorm when you hold down B. I tried just using bits 0,8,16,24 directly, and the results were terrible; you can also embed a shift in the same instruction, so I tried shifting it 6 or 7 bits to the right, getting some improvement. In the end I added an eor between high and low bits to shake things up a bit, which costs another instruction but gives a good quality snowstorm.