In my case I decided the hardware environment was going to be hosted inside Unreal Engine:
https://i.imgur.com/5MDfwKg.png
It's crazy easy to get CP/M running on just about anything with Z80 CPU emulation, and some glue logic to handle reading bytes from a keyboard I/O port, and sending them to a terminal, and reading/writing sectors from a block device. I had to write a VT100 emulator for UE4 but that doesn't take too much work.
WordStar:
https://i.imgur.com/rIY1he8.png
A telnet client (complete with ZMODEM) for accessing BBS's on the Internet:
https://i.imgur.com/aSc9VGL.png
Zork I and Rogue:
If it doesn't, there's a bug in my emulator, end of story. I have had to implement all kinds of things to make various software work correctly, and there's probably still more to do.
In other words, it was like the UNIX of the microcomputer world.
In contrast to CP/M. It requires a block device of some kind (i.e. a disk drive), and a console of some kind (typically, but not necessarily, a serial terminal).
While some applications did route around the BIOS and BDOS in CP/M, most did not. CP/M was quite portable across a crazy range of hardware. Porting a CP/M BIOS is a nice engineering and assembly language challenge for anyone willing to take it on, depending on their hardware environment.
Today, anyone with a Z80 chip, a RAM chip, and some paperclips to wire it all together can get a device that will run Wordstar. That flexibility makes CP/M very popular with retro enthusiasts today. It's easy to find dongle sized computers for $50 running CP/M on eBay. It's also easy to find full through hole kits of parts and PC boards to make your own. Or, grab a Z80 CPU and Peripheral manual, a copy of KiCad, some parts and breadboards and go to town. Having your creating run Wordstar beats blinking LEDs any day of the week.