Most of my brain "broke" when I was trying to figure out all the DMA parameters vs. the addresses you were transferring from vs. the sizes for OBJ/OAM vs. the format of the data vs. how the MMIO registers are actually accessed.
Page A-3 (I attached it earlier) is frustrating because it's easy to overlook things like how 4 bytes of data are per-sprite (not including X-loc MSB and large/size specifier) when on the left it's showing the indexes as incrementing by 1 (because, again: things are in words / 16-bits).
This, combined with (and I'm not sure I have the right to talk badly about this) good-yet-bad resources on sprites (two examples:
https://wiki.superfamicom.org/snes-sprites and
https://github.com/michielvoo/SNES/wiki/Sprites), none of which actually cover doing this with DMA in NMI... well... point is, it's obviously a neglected subject. The more I read that 2nd link the more things from 25 years ago "trickled back" into my mind, but nothing definitively came forth. Like I can't explain why the MMIO register model used there writes to $2103 before $2102, and there's some additional math being applied to the sprite index/offset (*2, maybe due to the fact that two 16-bit words represent data for a sprite?). Then there's
nocash's resource which talks about how $2102/2103 are
re-set at the start of VBlank (note the "Caution" part). This is all stuff that's new to me vs. when I last worked with sprites 25 years ago.
In short: there is no terse way for me to summarise what went through my mind when reviewing that dump of code vs. what the behaviour of the console is.