You have to specify a spindle speed with an S code before the spindle will turn on with an M3 or M4.
It is really quite simple. M3/M5 and M8/M9 already have hal pins that they control directly. All you need to do is use a "net" command to connect those pins to your parallel port's hal pins.
The m3/m5 pin is:
motion.spindle-on
The m8/m9 pin is:
iocontrol.0.coolant-flood
The m7/m9 pin is:
iocontrol.0.coolant-mist
(M9 turns off both flood and mist.)
So if if 14 is the spindle for example you could connect them with a hal line like this:
net spindle-on <= motion.spindle-on => parport.0.pin-14-out
If pin 1 (parallel port pins are numbered 1-17, there is no pin 0) is the coolant flood.
net flood <= iocontrol.0.coolant-flood => parport.0.pin-01-out
It does seem that the documentation fails to explicitly state the relationship of those M-codes to those pins.
linuxcnc.org/docs/html/man/man9/motion.9.html
linuxcnc.org/docs/html/man/man1/iocontrol.1.html