These days the standard way to do this is to use a USB UART adapter, or a USB-connected Arduino, an Ethernet-connected Raspberry Pi, etc. -- they have GPIO ports, both analog and digital, as well as I2C, SPI, etc etc. There are enormous numbers of options for motor controllers and sensors available off the shelf. You can bit bang all you want from your desktop computer, via this interface!
The problem is the bandwidth you get from such solutions. I could push 3.5 megabytes per second thru my Amiga interface, the USB->RS232 limits me to about 32 kilobytes per second.