Huh, well I notice all of the addresses you've found end with 8, which honestly is more than I've discovered lately. As for exactly why they'd all end in 8, it looks like there's some kind of alignment going on that I can't fully explain. I
think the game was originally coded in C, (this shouldn't be too hard to confirm, I just haven't done it yet), so I'm guessing the moos are part of a C "struct." I know the PlayStation can work with 8-byte floating point values (as well as words of 4 bytes and "half words" of 2 bytes), so all values stored in structs are likely "padded" to be able to fit the largest one. I think the stack pointer also needs to be 8-byte aligned, which is probably not relevant here*. Neither of those things can account for why the addresses wouldn't end in either 8
or 0, though, which is what I'd expect if they were actually 8-byte aligned and not 16-byte aligned. I'm also not sure why other values in memory don't follow that convention, other than the fact that they're presumably not in structs.
I still haven't worked out how memory for enemies is being allocated. I happened to discover pretty much by accident that there's a
bios call that allocates memory, listed in appendix B of
this document. That's lucky, because otherwise I probably would have taken much longer to realize that that was even a thing that
could exist (if you're curious, the Wikipedia article explains why that's not really a thing in modern programs). Is this how the memory for enemies is being allocated? I have no idea. In fact, I don't know if that's even slightly plausible. I'm definitely going to check, though, because it's probably a lot easier to check if that's happening than it is to work backwards until I find where the enemies' location in memory came from. In any event, I have a bunch more reading to do now.
Also, apologies if my weird ramblings are not especially helpful to anyone. I'm trying to outline my thinking in a way that someone could conceivably follow along (and also so I can remind myself what I'm doing), but my posts are definitely pretty unclear and disorganized. Everyone should feel free to ask me if there's something they'd
like to follow along with but can't due to my awkward "explanations."
*I should actually make sure the values I'm looking at are in fact stored in some kind of heap space (memory set aside for dynamic allocation) rather than on the stack (memory set aside for passing values "into" functions).