Note: I hope this question is on topic. I'm not sure where else to put it.
There are several tutorials available online for writing emulators/simulators. Unfortunately they all seem to focus on microprocessors, often with the intention of playing video games. The problem is that these guides are not too useful if you are interested in emulating/simulating computers from before the '70s.
In particular, there is never any discussion about punched cards (reading and writing), paper or magnetic tape, or line printers. (I'm not at all criticizing the tutorials for this; the omission is entirely sensible.) The core functionality of early computers can be emulated/simulated without too much effort, but any large, interesting program is going to have some sort of interface. The manuals for the devices can't tell you how best to reconcile the differences between modern and old IO conventions. Should card decks be stored as binary files with the bit patterns corresponding to actual punched-card encoding? Or should they simply be text files whose characters get converted just before being processed? What if the machine supports an extended character set?
Examples of computers that aren't too complicated in essence but have troubling IO conventions are the IBM 7090 and the LGP-30.
Are there any good resources for dealing with early computer IO?
_(or the equivalent with line-printer overprinting) by a single
≤. This is what compiler lexers had to do for input streams.