Sorry to say it, but it is your code's fault.

This line is the problem:
:0→{T+L₄}ʳ→{P+L₅}ʳThe value left in hl after storing a number to a
constant pointer is the original value you stored. But when storing a 2-byte number to a
non-constant pointer, the value left in hl is pointer+1.
And now I feel really, really dumb. I should have remembered to check that.
Thanks, Runer, and I'm glad to hear this isn't Axe's fault.