Like most busses of its time, you had to write your own software to communicate between the cards.
The term device driver wasn't widespread at the time, but that is what you were writing.
The S-100 bus (IEEE696), with its standard 100-pin socket could support a number of different cards. While it was common to have a processor card, memory card and assorted I/O controller cards, it was possible to have co-existing processor cards.
The bus protocol is still available on the web, e.g. here, giving details of the bus pins and signals. There is still a thriving community of users and builders, where some more beginner-friendly information may be found.
The bus is split into sections:
Address
Status
Data
Control
DMA Control
Vectored interrupt
Utility
Controlling a card over the bus essentially meant claiming the role of Bus Master and then addressing the card you required. I/O cards could raise interrupts to gain the attention of the processor.
There were - still are - a large number of different processor cards available on the S-100. Each capable of running one or more operating systems. Exactly how you implemented the software to control another card on the bus would vary from OS to OS and CPU to CPU. I couldn't attempt to list them all here.
You state in your question that there are only a handful of OS today where you can write a driver. Not true, you can write drivers for any modern OS, it is just that some of them make it harder for you, and some device manufacturers won't tell you how to control their device.
There is a lot of information and open source code for S-100 out there. Learning from it will help you be able to write device drivers for modern kit.