I post this in the gcc forum, since this is written in gcc assembly (.S) and the non-gcc weanies wouldn't know what to do with it (don't tell anyone in the other forum I called them a weanie).
I converted my C version to assembly and gained over 40 bytes (now I have to figure out what to do with the extra space).
I have not tested my new version much, yet, so buyer beware. The 4AvrBootloaderBuddy was updated also to be compatible with the new version (and also now has an EEprom-Saver(tm) write routine. no, not really (tm)).
This version will (presumably) work in whatever version of winavr/gcc you have (as opposed to my C version). It will compile to the same size on any avr <=64k that has bootloader support (but have not tried them all).
The new version is now 'safe' from out of control applications (no cage required). The bootloader is protected with the IVSEL bit, and the spm instruction (only 1 in bootloader) is also 'protected'.
I also put a small jump table at the end of the bootloader, to access 3 functions (hex2ascii, sendchar, and do_spm), and 1 rjmp for application jumping into the bootloader (had to try making a jump table, so it is not entirely necessary).
I'm not an asm expert, but there is enough info on the internet to find out most things I didn't understand (I have about 20 tabs open in the browser on various pages like libc/binutils/gcc/etc).
Bootloaders have been done to death, but maybe there is some ideas in there that would help someone.