Using half of zero-page for IO (and then dedicating 1/4 of that to a string printing interface) is a somewhat odd design choice. Most nontrivial 6502 software leans heavily on zero page (since there are very few registers and shorter/faster instructions for zero-page memory access).
Simulating something that looks like a serial port (transmit/receive/status registers) would seem more natural, peripheral-wise.