Had a lot of (slightly masochistic) fun programming the Z80 back in the day on my MSX2 machine.
I didn't have an assembler, so I wrote my code by taking the opcodes from a table, calculating offsets etc., then turning them into DATA-lines in an MSX-Basic program, which POKEd the code into RAM, then CALL into the starting address.