Z80 port map: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
mNo edit summary
mNo edit summary
(5 intermediate revisions by 3 users not shown)
Line 1: Line 1:
Some infos from [[User:kyuusaku]]
The decode mask for '''reading''' ports is always $0C. The one for writes is indicated for each case.
{| class="regdef"
{| class="regdef"
|'''Number'''
|'''Address'''
|'''Read'''
|'''Read'''
|'''Write'''
|'''Write'''
|'''[[Memory_mapped_registers#Address_decode_masks|Decode mask]]'''
|-
|-
|$00
|$00
|Read sound code from 68k
|
|Clear sound code buffer
*Read sound code from {{Chipname|68k}}
*Acknowledge [[Z80 interrupts|NMI]]
|Clear sound code from 68k to $00
|rowspan="2"|$0C
|-
|-
|$04~$07
|$04-$07
|colspan="2"|[[YM2610]] I/O
|colspan="2"|[[YM2610]] I/O
|-
|-
|$08
|$08
|Set [[Z80 memory map|$F000~$F7FF]] bank
|Set [[Z80 memory map|$F000~$F7FF]] bank
|Enable NMI
|rowspan="4"|Enable NMIs
|rowspan="4"|$1C
|-
|-
|$09
|$09
|Set $E000~$EFFF bank
|Set $E000~$EFFF bank
|
|-
|-
|$0A
|$0A
|Set $C000~$DFFF bank
|Set $C000~$DFFF bank
|
|-
|-
|$0B
|$0B
|Set $8000~$BFFF bank
|Set $8000~$BFFF bank
|
|-
|-
|$0C
|$0C
|
|See {{Sig|SDRD1|SDRD1}}
|[[68k/Z80_communication|Reply]] to 68k
|[[68k/Z80_communication|Reply]] to 68k
|$0C
|-
|-
|$18
|$18
|
|See address $08
|Disable NMI
|Disable NMIs
|$1C
|}
|}


Bank selection is made by '''reading''' ports.
Note that the [[M1 ROM|Z80 ROM]] [[Z80 bankswitching|bank selection]] is done by '''reading''' ports.
 
SNK used an obscure feature of the Z80: when accessing ports, the entire address bus is set, not only the lower 8 bits.
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 B, the port number in C and doing IN A,(C).
The banks can then be chosen by putting the bank number in A, the port number in C and doing IN A,(C).
Or by putting the bank number in A and doing IN A,(Port). (to verify)
This is handled by {{Chipname|NEO-ZMC}} in cartridges.
 
 
Some [[sound driver]]s 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.


[[Category:Base system]]
[[Category:Base system]]
[[Category:Audio system]]

Revision as of 00:21, 14 May 2018

Some infos from User:kyuusaku

The decode mask for reading ports is always $0C. The one for writes is indicated for each case.

Address Read Write Decode mask
$00
  • Read sound code from 68k
  • Acknowledge NMI
Clear sound code from 68k to $00 $0C
$04-$07 YM2610 I/O
$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

Note that the Z80 ROM bank selection is done by reading ports.

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.