A key part of my firmware development is this parallel-port-based digital I/O interface. It plugs into the PC's printer port.
It has a few key features:


Win32 doesn't allow direct manipulation of hardware so you must use a device driver to "talk" to the parallel port.
I use Port95NT to control the parallel port from C++/C#. Port95NT is a commonly-used driver (by Scientific Software Tools, but sadly long-since discontinued) that allows this access via a simple user-mode DLL.
Details about Port95NT, including an installer and my C++ and C# wrapper classes, can be found on my Port95NT page.

Alternately, the parallel port is SUPER easy to control with LabVIEW, and has the bonus of not needing for additional drivers like Port95NT - just point an Out Port at 0x378 and write a byte to it! (I used LabVIEW to do my early prototyping before moving to C++, then C#, for more precise control).


Here's a picture of the thing in action:

The disconnected board at right is a MCP2515-based CAN node.
I used the DB25 I/O interface to explore the chip's functionality via its SPI interface.
I find that it's MUCH easier to develop chip-controlling code in C (MSVC) on the PC then port it to firmware.


Here's a drawing of the thing:

The "I/O interface" at left is a standardized (by me) pinout that allows for easy swapping of various target boards.
The "BSLA daughterboard" allows me to plug my El Cheapo Logic Analyzer directly into the interface board.