I'm working on a project that intends to implement a dynamically typed language on 8-bit systems. (That is, a CPU with 16-bit pointers and a maximum of 64 kB of RAM. Some language tricks are involved, which I can explain in more detail if you want. Development is at https://git.sr.ht/~jpivarski/zippy)
I'd like to test it in some realistic way during development, either by running (for example) a Z80 system in emulation or by connecting a hobby kit to my Linux computer (USB?), downloading compiled code to it, running it, and seeing the results in a window or little screen.
I've done enough research to know that SDCC is a good compiler—if I compile my no-libraries, no-malloc C code with that, then I'll find out if I'm using C features that are incompatible with these small systems. I've also found hundreds of emulators and hardware kits online, some do-it-yourself, others more pre-packaged (I'd want the latter).
However, I'm still confused about how to get started on a runtime system, in some basic ways. I've seen a lot of references to a CP/M operating system, but I don't think the device would need to have an operating system. I assume that my compiled C code would go into real or emulated ROM, and I'd have unrestricted 64 kB of address space to play with.
I understand that this depends on the whole architecture, not just the CPU, but any generic/reasonable architecture would be sufficient to determine whether I'm writing realistic code or not.
I guess I'm imagining a situation that's more like GP-GPU development: there's a device that I can load code into, that code computes something, using its RAM as a scratch-pad, and then returns results somehow, possibly as an emulated screen in a window, possibly a real screen that I look at.
What kinds of tools should I be looking for to get this kind of development experience (for both the emulated and real-hardware cases)? Do you have any suggestions of where to start?