I better be more specific about this before I get corrected for generalizing...
you created a block of memory called an IOPB and told the controller where it was. The
controller would go out to memory and get the command, etc. The cpu could either
"poll" the controller for status or set up and respond to an interrupt that
signified completion of the command.
The floppy interface for the bit slice was pretty well abstracted in that the cpu wrote
commands to I/O ports and the data off disk was dma'd to and from memory. You told it
what to do, where to put it, and how much to data. The cpu didn't have to do anything
else except wait for completion of the operation.