I've found a little more on reading and writing:

For the BM the only signal to decide between read or write is by sending a Read/Seek Command or a Write/Seek Command. The Data field for these is formatted as bit 12 selects Head 0 or 1 and bits 11-0 select the track.

Also the SDK translates LBA's for head 1 in reverse track order per zone. E.g. for zone 0 on head 0 the first block is on track 0 of 146 tracks for the zone. For the corresponding zone on head 1 the first block starts at track 146. (This would reduce head movement for transfers spanning zones)

Also, also: the disk type field (byte 5 of System Data) is divided into a high nibble and a low nibble. The low nibble is the Disk Type 0-7 of the SDK, but the high nibble signifies something else. The IPL will only accept high nibble values of 1,2 or 3 and the game code will only accept a value of 1. This could possibly designate single density / double density disks. The whole byte is sent as data for the controller's Set Disk Type Command.