2/ Write direct to an LPT port (buffered) - I do it on XP3 very often. I may still even have buffered / decoded LPT IO pcbs somewhere.
That gives you 8in (and/or op) plus a few LPT control lines. 378h - 37Fh , 278h - 27Fh
3/ Write direct to a serial port. 3F8 , 2F8 , 3E8 , 2E8. You get about 2-3 in / 2-3 op lines. Or make up a simple command to IO decoder. I may even have some
of those around.
If your "old PC" has these ports onboard, it's not at all a bad way to go.
You will need to use a device driver like GiveIO to be able to use them on WinNT (XP, etc.).
This is what I did for the somewhat more elaborate project I did back in college:
The ribbon cable coming in from the left is a parallel port from the PC, which was running, some old (already, at the time) motherboard with a Duron 1.6GHz CPU I think, and WinXP. On Win98, straight IO from user-land can be done, but on NT you need to ask the OS "pretty please". Installation and use is straightforward.
For logging, of course, you'd just be polling the inputs, and checking for state change. Or if you don't mind a little logic, an external latch to hold the trigger state, then a read-and-clear-latch operation from the PC would allow more freedom, since, keep in mind, we're talking a multitasking OS here, so you can't assume your program will be running on time, every single millisecond.
Tim