Z80 port map
Some infos from User:kyuusaku
The decode mask for reading ports is always $0C. The one for writes is indicated for each case.
|$00||Clear sound code from 68k to $00||$0C|
|$08||Set $F000~$F7FF bank||Enable NMIs||$1C|
|$09||Set $E000~$EFFF bank|
|$0A||Set $C000~$DFFF bank|
|$0B||Set $8000~$BFFF bank|
|$0C||See SDRD1||Reply to 68k||$0C|
|$18||See address $08||Disable NMIs||$1C|
SNK used an obscure feature of the Z80: when accessing ports, the entire address bus is set, not only the lower 8 bits.
The banks can then be chosen by putting the bank number in A, the port number in C and doing IN A,(C). This is handled by NEO-ZMC in cartridges.
Some sound drivers use port $C0 (and others ?) in their code. Since only SDA2 and SDA3 are used for port decoding, port $C0 maps to a mirror of port $00. It's believed to be a remnant of some development tool.