I've been stewing on some frustration I was having while trying to implement device input the other day, feeling like the project has slowly veered off course. I really just wanted a content-addressable bytecode that transformed content-addressable data, and I already have that; working with device IO (and beyond) is sort of beyond the initial scope. However, I've become attached to the idea of a more complete computing environment. It feels like a conflict between outcomes. I'm not sure how to resolve the conflict, other than sleeping on it for a little while or trying to work through it... and I'm still in the mood to be working so I guess I'll try the former.
On the topic of devices, there was a missing piece that I wasn't considering earlier which was that the VM is going to need a way to actually manage virtual devices, not just "the CPU" interacting with its device slots. For example, the VM will need a way to handle connections, set vectors, and schedule polling (or perhaps simulation) intervals. This goes outside the scope of a specification in some ways, though implementing it will help contribute to how this is supposed to work in general.
---
Spent a few hours continuing to refactor cohost into neater sections, and then started implementing some additional threads for device listening. I have a simple set up now where running a Host spawns a second thread that blocks waiting for incoming device connections, first tested with sleep, and then stdin.read_line(). Next, I'll set it up with some sockets and start enabling device connections to come from other processes, in addition to fleshing out the needed opcodes and VM hooks for incoming device connections.