I once re-created the entire Hack machine in Logisim, however, I found it too slow.
My main idea was to create a screen-driver: a piece of hardware that stopped the CPU whenever there was a write instruction to the screen memory, and used 16 additional clocks to draw the individual pixels (reading bit-by-bit of the register and setting the 16 pixels). Once it was done, it gave back the control to the CPU.
I could run a JACK application on this virtual machine; but it was super slow; it took many seconds just to draw a single line of the screen. So I recreated the whole thing in Digital. This was much, much better, Pong was quite playable, though not perfect.
SPOILER ALERT - HACK MACHINE IMPLEMENTATION!
Below is the screenshot I made.
The RAM (top right corner) has 3 components: RAM, SCREEN, KBD (keyboard). Whenever SCREEN is updated, the Screen driver (bottom right) kicks in.
The bottom right part is the Screen driver. The raw screen address is transformed into the GR-RAM address (the chip I used for graphic display). The transformation steps are SCR ADDR (the raw address), BASE PX ADDR (what the graphic chip needs), and ADJ PX ADDR (step-by-step incrementation to read the bits and address the individual pixels).
Below that (the middle part of the Screen driver), there is a similar mechanism to the program counter: it counts from 0 to 15. It increases the pixel address, so we can see the next bit of the register.
At the bottom part there is a flip-flop mechanism which turns off the CPU clock while the screen is refreshing (it's either CPU or SCR, showing whenever the clock is driving the one or the other). While the screen refreshes, the CPU stops, and when the Screen PC reaches 16 and wraps around to 0, it swaps back to the CPU.
For the keyboard I had to design a separate chip to make it work, because it was not entirely HACK-compatible... That's a different story that worth at last an entire page. :/