If you are compiling using Z88DK, I have a modified version of the C runtime that does just that! It moves your program from where it loaded back down to location zero. So you can use bigger programs, even bigger if your data isn't part of the binary (such as malloc()ed memory).- Lastly, while this update does support RevB, it is not recommended for daily driving. This is because the RevB ROM is 8k, pushing the ORG of homebrew to a higher address, unlike the 4k ROM. That makes all homebrew incompatible with the 8k rom. The only "blanket" solution would be to have an intermediate loader that uses self-modifying code to move itself and download the requested file into the appropriate RAM. While this is doable, it's not justifiable to add additional maintenance to a hobby project. A second option is to have a duplicate copy of all homebrew for the 8k ORG starting address. What this means is that your mileage will vary if you choose to use the 8k RevB ROM.
See https://github.com/agmsmith/z88dk/tree/nabu_bare and in particular the C runtime nabu_crt0.asm has the relocation magic. I made changes to nabu.cfg added a new "bare" target that does the relocation and removes all libraries. The "default" target does what it did before.
So if you use something like zcc +nabu -subtype=bare -create-app -compiler=sdcc you get no libraries at all and the magic relocation to location zero. That means no stdout, default Z88DK TMS9918A graphics libraries, and so on. Though the linker does include code for math and strings, but only if you use them. I just use my customised version of DJ Sures' NABU-LIB for everything. Great for writing huge game programs, like #NthPongWars!
So, should I put in a pull request to submit my changes to Z88DK? Let me know if you think they'll be useful to other people.