If not using asm80, I use ZMAC (
http://48k.ca/zmac.html) and the Altairz80 implementation of SIMH for the emulator.
I may have made a slight 'tweak' to the ZMAC sources to assemble some code I had - there was an incompatibility between my Z80 source code and an extended feature of ZMAC if I remember correctly.
ZMAC is written in 'C' and you get the source code for it to mess about with...
I have also written my own NASCOM emulator - so I also use ZEAP under NASSYS-3 running on my NASCOm emulator and then run the resultant code on my NASCOM emulator. Sad really
!
Equally sad (...) is ZASMB - which is a Z80 assembler written in Z80 assembler. It can assemble itself - so can be run under the same emulator that you are testing your code out on.
The thing to consider about your emulator is what I/O features you need. The AltairZ80 emulation is somewhat limited in this respect (if I remember correctly).
Of course, there are plenty of 'true' Z80 assemblers that will run under CP/M (on an emulator itself).
It all depends on what you want to do...
You could always run the Z80 assembler on your TRS80 of course! That was how a certain company developed the firmware for the SENSION.
Cross32 is also a very nice meta assembler. I converted the SENSION firmware source code from the TRS80 over to a PC running Cross16 (at the time).
https://www.mpeforth.com/software/cross-32-meta-assembler/
Dave