Memory mapped registers: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
No edit summary
 
(129 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{| border="1"
 
|Address
 
|Name
=Address decode masks=
|Size
 
|Read
Decode masks aren't verified !
|Write
 
Decode masks are used to know which register will be mapped to a given address, they can be seen as a sort of mirroring range notation.
 
A "1" bit means that the corresponding address bit is involved in decoding, a "0" means it's ignored.
 
For example, {{Reg|REG_P1CNT}}'s base is $300000 and its mask is $FE0001:
<pre>
BASE 00110000 00000000 00000000
MASK 11111110 00000000 00000001
    0011000x xxxxxxxx xxxxxxx0
</pre>
 
This means that it's also accessible at $300002, $300004, $300006... up to $31FFFE. The highest address is BASE OR (NOT MASK).
 
==Mirror guesser==
 
<div id="mirror-guesser"></div>
<div id="mguessresult"></div>
 
=Register descriptions=
 
==I/O registers==
 
===REG_P1CNT===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$300000
|[[Joypad]] port 1 inputs (active low)
|REG_P1CNT
|Byte
|Player 1 controls (active low)
{{8BitRegister|D|1|C|1|B|1|A|1|Right|1|Left|1|Down|1|Up|1}}
{{8BitRegister|D|1|C|1|B|1|A|1|Right|1|Left|1|Down|1|Up|1}}
|?
|?
|}
*Address: $300000
*Decode mask: $FE0001
*Handled by: {{Chipname|NEO-C1}}
<br clear=all>
----
===REG_DIPSW===
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$300001
|[[Hardware DIPs]] (active low) {{8BitRegister|Freeze game|1|Freeplay|1|Enable [[Multiplayer]]|1|Multiplayer ID code|2|0:Normal controller<br>1:Mahjong keyboard|1|0:1 coin chute<br>1:2 coin chutes|1|Settings mode|1}}
|REG_DIPSW
|Kick [[watchdog]]
|Byte
|}
|Dipswitches (active low)
 
{{8BitRegister|Freeze|1|Freeplay|1|Coin meters ?|3|Autofire|1|?|1|Test mode|1}}
*Address: $300001
|Kick watchdog
*Decode mask: $FE0081 (not sure for write)
*Handled by: {{Chipname|NEO-F0}} (read), {{Chipname|NEO-B1}} (write)
 
<br clear=all>
----
 
===REG_SYSTYPE===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|{{8BitRegister|[[Test button]]|1|[[NEO-F0|Type]]<br/>0: 2 slots<br/>1: 4 or 6 slots|1|?|6}}
|?
|}
 
Reads the unused [[Hardware DIPs|DSW2]] on {{PCB|MV4}} boards. Used for system ID on other boards.
 
*Address: $300081
*Decode mask: $FE0081
*Handled by: {{Chipname|NEO-F0}}
 
<br clear=all>
----
 
===REG_SOUND===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|[[68k/Z80 communication|Read Z80 reply code]]
|Send command to {{Chipname|Z80}}
|}
 
*Address: $320000
*Decode mask: $FE0001
*Handled by: {{Chipname|NEO-C1}}
 
<br clear=all>
----
 
===REG_STATUS_A ===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$300081
|Switch inputs are active low
{{8BitRegister|[[RTC]] data bit|1|RTC time pulse|1|0:4-SLOT<br>1:6-SLOT|1|[[Coin_switch|Coin-in]] 4|1|Coin-in 3|1|[[Service button]]|1|Coin-in 2|1|Coin-in 1|1}}
|?
|?
|Byte?
|}
 
*Address: $320001
*Decode mask: $FE0001
*Handled by: {{Chipname|NEO-F0}}
 
<br clear=all>
----
 
===REG_P2CNT===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|Joypad port 2 inputs (active low)
{{8BitRegister|D|1|C|1|B|1|A|1|Right|1|Left|1|Down|1|Up|1}}
|?
|?
|}
*Address: $340000
*Decode mask: $FE0001
*Handled by: {{Chipname|NEO-C1}}
<br clear=all>
----
===REG_STATUS_B===
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|Aux inputs (lower bits active low)
{{8BitRegister|0:AES<br>1:MVS|1|[[Memory card]]<br>write protected if 1|1|Memory card<br>inserted if 00|2|Select P2|1|Start P2|1|Select P1|1|Start P1|1|}}
|?
|?
|}
*Address: $380000
*Decode mask: $FE0001
*Handled by: {{Chipname|NEO-C1}}
<br clear=all>
----
===REG_POUTPUT===
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$320000
|?
|REG_SOUND
|Joypad ports [[Pinouts#joypad ports|outputs]]
|Byte
{{8BitRegister|?|2|P2 outputs|3|P1 outputs|3}}
|Out to Z80
|}
|In from Z80
 
*Address: $380001
*Decode mask: $FE0071
*Handled by: {{Chipname|NEO-D0}}
 
<br clear=all>
----
 
===REG_CRDBANK===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$320001
|REG_STATUS_A
|Byte
|{{8BitRegister|?|8}}
|?
|?
|{{8BitRegister| |5|Memory card bank selection|3}}
|}
*Address: $380011
*Decode mask: $FE0071
*Handled by: {{Chipname|NEO-D0}}
<br clear=all>
----
===REG_SLOT===
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$340000
|REG_P2CNT
|Byte
|Player 2 controls (active low)
{{8BitRegister|D|1|C|1|B|1|A|1|Right|1|Left|1|Down|1|Up|1}}
|?
|?
|{{8BitRegister|?|5|Slot #|3|}}
(Mirror of REG_POUTPUT on the AES)
|}
*Address: $380021
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-F0}}
<br clear=all>
----
===REG_LEDLATCHES===
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$380000
|REG_STATUS_B
|Byte
|{{8BitRegister|?|1|Memory card write protect|2|Memory card inserted|1|Select P2|1|Start P2|1|Select P1|1|Start P1|1|}}
|?
|?
|{{8BitRegister|?|2|Latch LED2 data|1|Latch LED1 data|1|Latch [[marquee]] data|1|?|3}}
LED data is latched on 1 to 0 transition.
|}
*Address: $380031
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-F0}}
<br clear=all>
----
===REG_LEDDATA===
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$380000
|?
|?
|Byte
|8-bit data for credits displays and the [[marquee]]. See [[MV-LED]].
|}
 
*Address: $380041
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-F0}}
 
<br clear=all>
----
 
===REG_RTCCTRL===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|?
|?
|MAME select_controller
|MAME upd4990a_control_16_w {{8BitRegister||5|[[RTC]] Strobe|1|RTC Clock|1|RTC DIN|1|}}
|}
 
*Address: $380051
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-F0}}
 
<br clear=all>
----
 
===REG_RESETCC1===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$380030
|?
|?
|Byte
|Any, [[coin counter]] 1 floats
|}
 
*Address: $380061
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}
 
<br clear=all>
----
 
===REG_RESETCC2===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|?
|?
|MAME set_output_latch
|Any, [[coin counter]] 2 floats
|}
 
*Address: $380063
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}
 
<br clear=all>
----
 
===REG_RESETCL1===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$380040
|?
|?
|Byte
|Any, [[coin lockout]] 1 floats
|}
 
*Address: $380065
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}
 
<br clear=all>
----
 
===REG_RESETCL2===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|?
|?
|MAME set_output_data
|Any, [[coin lockout]] 2 floats
|}
 
*Address: $380067
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}
 
<br clear=all>
----
 
===REG_SETCC1===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$380050
|?
|?
|Byte
|Any, coin counter 1 sinks current
|}
 
*Address: $3800E1
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}
 
<br clear=all>
----
 
===REG_SETCC2===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|?
|?
|MAME upd4990a_control_16_w
|Any, coin counter 2 sinks current
|}
 
*Address: $3800E3
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}
 
<br clear=all>
----
 
===REG_SETCL1===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|-
|$380001
|?
|?
|Byte
|Any, coin lockout 1 sinks current
|}
 
*Address: $3800E5
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}
 
<br clear=all>
----
 
===REG_SETCL2===
 
{|class="regdef" style="float:right; margin-left:16px; width:600px;"
|'''Read'''
|'''Write'''
|-
|?
|?
|Joypad ports outputs
|Any, coin lockout 2 sinks current
{{8BitRegister|?|2|P2 outputs|3|P1 outputs|3}}
|}
|}


*Address: $3800E7
*Decode mask: $FE00F1
*Handled by: {{Chipname|NEO-I0}}


==System registers==


{| border="1"
Data written doesn't matter. Odd byte writes only. Decode mask: $FE0001.
|Address
 
|Name
Registers go in pairs, bit 4 of the address is actually the data bit.
|Size
 
|Read
Handled by a 74HC259 addressable latch on cart systems.
|Write
 
{| class="regdef"
|'''Address'''
|'''Name'''
|'''Write'''
|-
|-
|$3A0001
|$3A0001
|REG_DISPENABL
|REG_NOSHADOW
|Byte
|Invalid
|Normal video output
|Normal video output
|-
|-
|$3A0011
|$3A0011
|REG_DISPDSABL
|REG_SHADOW
|Byte
|Invalid
|[[Video DAC|Darken]] video output
|[[Video DAC|Darken]] video output
|-
|-
|$3A0003
|$3A0003
|?
|REG_SWPBIOS
|Byte
|Use the |BIOS [[Vector_table_swap|vector table]]
|Invalid
|Use the [[BIOSes|BIOS]] vector table
|-
|-
|$3A0013
|$3A0013
|REG_SWPROM
|REG_SWPROM
|Byte
|Invalid
|Use the cart's vector table
|Use the cart's vector table
|-
|-
|See [[ASM Defines]].
|$3A0005
|
|REG_CRDUNLOCK1
|
|Enable writes to [[memory card]] (unused in CD systems)
|
|-
|
|$3A0015
|REG_CRDLOCK1
|Disable writes to memory card (unused in CD systems)
|-
|$3A0007
|REG_CRDLOCK2
|Disable writes to memory card (unused in CD systems)
|-
|$3A0017
|REG_CRDUNLOCK2
|Enable writes to memory card (unused in CD systems) 
|-
|$3A0009
|REG_CRDREGSEL
|Enable "Register select" for memory card
|-
|$3A0019
|REG_CRDNORMAL
|Disable "Register select" for memory card
|-
|-
|$3A000B
|$3A000B
|REG_BRDFIX
|REG_BRDFIX
|Byte
|Use the embedded [[SFIX ROM]] and [[SM1]] ROM
|Invalid
|Use the embeded fix tileset ([[SFIX]])
|-
|-
|$3A001B
|$3A001B
|REG_CRTFIX
|REG_CRTFIX
|Byte
|Use the cart's [[S ROM]] and [[M1 ROM]]
|Invalid
|Use the cart's fix tileset
|-
|-
|$3A000D
|$3A000D
|REG_SRAMLOCK
|REG_SRAMLOCK
|Byte
|Write-protects [[backup RAM]] (MVS)
|Invalid
|Write-protects the SRAM (MVS)
|-
|-
|$3A001D
|$3A001D
|REG_SRAMULOCK
|REG_SRAMUNLOCK
|Byte
|Unprotects backup RAM (MVS)
|Invalid
|Unprotects SRAM (MVS)
|-
|-
|$3A000F
|$3A000F
|REG_PALBANK1
|REG_PALBANK1
|Byte
|Use [[palette RAM|palette]] bank 1
|Invalid
|Use palette bank 1
|-
|-
|$3A001F
|$3A001F
|REG_PALBANK0
|REG_PALBANK0
|Byte
|Invalid
|Use palette bank 0
|Use palette bank 0
|}
|}


Needs translation:
==Video registers==


{| border="1"
Handled by the [[LSPC]]. Byte writes are only effective on even addresses and they store the same data in both bytes. Odd addresses aren't mapped ? Decode mask: $FE0001.
|Address
 
|Name
{| class="regdef"
|Size
|'''Address'''
|Read
|'''Name'''
|Write
|'''Read'''
|'''Write'''
|-
|-
|$3C0000
|$3C0000
|REG_VRAMADDR
|REG_VRAMADDR
|Word
|Read from [[VRAM]] (address doesn't change)
|Read VRAM (address isn't changed)
|Sets VRAM address
|Sets VRAM address
|-
|-
|$3C0002
|$3C0002
|REG_VRAMRW
|REG_VRAMRW
|Word
|Read from VRAM (address doesn't change)
|Read VRAM (address isn't changed)
|Write to VRAM (modulo is applied after)
|Write VRAM
|-
|-
|$3C0004
|$3C0004
|Word
|REG_VRAMMOD
|REG_VRAMINC
|Reads VRAM address modulo
|Reads VRAM address modulo
|Sets VRAM address modulo (signed)
|Sets VRAM address modulo
|-
|-
|$3C0006
|$3C0006
|Word
|REG_LSPCMODE
|REG_HBLANKCNT
|{{16BitRegister|Raster line counter.<br>See [[Display_timing#Vertical|Display timing]]|9|0|3|1:50Hz<br>0:60Hz ([[GPU|LSPC2]] only)|1|[[Auto animation]] counter|3}}
|15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|{{16BitRegister|Auto animation speed<br>(in frames)|8|[[Timer interrupt]]<br>mode|3|Timer interrupt enable|1|Disable auto animation|1|Unused|3}}
Compteur de ligne vidéo (format ?) ? 1:50Hz
Reset value: ????????00000---
0:60Hz Compteur d'animation auto
$00F8-$00FF : Vertical sync
$0100-$010F : Top border
$0110-$01EF : Active display
$01F0-$01FF : Bottom border Voir ce diagramme.
|15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Vitesse de l'animation auto
Recharger à chaque HBlank
Recharger à chaque VBlank
Prochaine interruption HBlank dans x lignes
Int.HBlank activée
Désactiver l'animation automatique ?
|-
|-
|$3C0008
|$3C0008
|Word
|REG_TIMERHIGH
|REG_HBLANKPOS
|Like REG_VRAMADDR.
|Invalid
|16 highest bits of the [[timer interrupt|timer]] reload value.
|Position (pixels) à laquelle l'interruption HBlank sera déclenchée (MSB)
|-
|-
|$3C000A
|$3C000A
|?
|REG_TIMERLOW
|Word
|Like REG_VRAMRW.
|Invalid
|16 lowest bits of the timer reload value.
|Position (pixels) à laquelle l'interruption HBlank sera déclenchée (LSB)
|-
|-
|$3C000C
|$3C000C
|REG_IRQACK
|REG_IRQACK
|Like REG_VRAMMOD.
|[[68k interrupts|Interrupt]] acknowledge.
{{8BitRegister|Unused|5|Ack VBlank IRQ|1|Ack timer IRQ|1|Ack IRQ3|1}}
|-
|$3C000E
|REG_TIMERSTOP
|Like REG_LSPCMODE.
|Bit 0=1: Stops timer counter during first and last 16 lines (32 total) when in PAL mode.
|}
==NeoGeo CD registers==
[[NEO-MGA]] / [[LC8953]] / [[LC98000]] ?
===CD drive===
{| class="regdef"
|'''Address'''
|'''Name'''
|'''Size'''
|'''Read'''
|'''Write'''
|'''Handled by'''
|-
|$FF0161
|REG_CDDINPUT
|Byte
|{{8BitRegister|-|3|CDCK input|1|4-bit bus from the [[CD drive]]|4}}
|?
|[[NEO-MGA]]
|-
|$FF0163
|REG_CDDOUTPUT
|Byte
|?
|{{8BitRegister|-|4|4-bit bus to the [[CD drive]]|4}}
|[[NEO-MGA]]
|-
|$FF0165
|REG_CDDCTRL
|Byte
|?
|{{8BitRegister|-|4|Must be 0|2|Signal selection<br>0:4-bit bus direction<br>1:HOCK output|1|State<br>Dir:0:Out 1:In<br>HOCK:0:Low 1:High|1}}
|[[NEO-MGA]]
|-
|$FF0167
|REG_CDDSTAT
|Byte
|[[CD drive]] status lines.{{8BitRegister|-|3|MUTE|1|SBSO|1|SCOR|1|WFCK|1|EXCK|1}}
|{{8BitRegister|-|7|EXCK|1}}
|[[NEO-MGA]]
|}
===Video===
{| class="regdef"
|'''Address'''
|'''Name'''
|'''Size'''
|'''Read'''
|'''Write'''
|'''Handled by'''
|-
|$FF0111
|REG_DISBLSPR
|Byte
|?
|1=Disable 0=Enable sprites
|rowspan="3"|[[NEO-GRC]]/[[NEO-OFC]]
|-
|$FF0115
|REG_DISBLFIX
|Byte
|?
|1=Disable 0=Enable fix layer
|-
|$FF0119
|REG_ENVIDEO
|Byte
|?
|1=Enable 0=Disable video output.
|}
===Memory===
{| class="regdef"
|'''Address'''
|'''Name'''
|'''Size'''
|'''Read'''
|'''Write'''
|'''Handled by'''
|-
|$FF01A1
|REG_SPRBANK
|Byte
|?
|Upload zone 1MiB SPR DRAM bank selection (2 LSBs).
|?
|-
|$FF01A3
|REG_PCMBANK
|Byte
|?
|Upload zone 512KiB PCM DRAM bank selection (1 LSB).
|?
|-
|$FF01A7
|REG_???BANK
|Byte
|Byte
|Invalid
|?
|Interrupt Acknowledge.
|$A00000 zone bank number. What is this ?
Obligatoire, sert de prévention anti-nesting.
|?
Toujours répondre correctement à la fin d'un interruption.
|-
|$FF0121
|REG_UPMAPSPR
|rowspan="8"|Byte
|rowspan="8"|?
|NeoSetSpriteSlot(1);
Set [[68k memory map|upload zone]] to SPR [[DRAM]]
|rowspan="8"|?
|-
|$FF0123
|REG_UPMAPPCM
|Set upload zone to PCM DRAM
|-
|$FF0127
|REG_UPMAPZ80
|Set upload zone to Z80 DRAM
|-
|$FF0129
|REG_UPMAPFIX
|Set upload zone to FIX DRAM
|-
|$FF0141
|REG_UPUNMAPSPR
|Unset SPR DRAM to upload zone
|-
|$FF0143
|REG_UPUNMAPPCM
|Unset PCM DRAM to upload zone
|-
|$FF0147
|REG_UPUNMAPZ80
|Unset Z80 DRAM to upload zone
|-
|$FF0149
|REG_UPUNMAPFIX
|Unset FIX DRAM to upload zone
|}
 
===DMA===


7 6 5 4 3 2 1 0
{| class="regdef"
  ACK VBlank ACK HBlank ACK IRQ3
|'''Address'''
|'''Name'''
|'''Size'''
|'''Read'''
|'''Write'''
|'''Handled by'''
|-
|-
|$3C000E
|$FF0061
$3C000F
|?
|?
|Byte
|?
|Bit 6: Execute DMA microcode
|rowspan="7"|[[LC8953]]
|-
|$FF0064~$FF0067
|REG_DMA_ADDR1
|Longword
|?
|Sets DMA source address.
|-
|$FF0068~$FF006B
|REG_DMA_ADDR2
|Longword
|?
|Sets DMA destination address.
|-
|$FF006C~$FF006F
|REG_DMA_VALUE
|Longword
|?
|Sets DMA value for filling.
|-
|$FF0070~$FF0073
|REG_DMA_COUNT
|Longword
|?
|Sets DMA length.
|-
|$FF007E
|REG_DMA_MODE
|Word
|?
|Sets DMA mode.
|-
|$FF007E~$FF008E
|?
|Words
|?
|Microcode (16x 9-bit opcodes)
|}
 
===Misc===
 
{| class="regdef"
|'''Address'''
|'''Name'''
|'''Size'''
|'''Read'''
|'''Write'''
|'''Handled by'''
|-
|$FF0002
|?
|Word
|?
|Enables Vector 22 interrupts. NeoRaine calls load_files.
|rowspan="8"|[[LC8953]]
|-
|$FF0004
|?
|Word
|?
|CDM3-2 BIOS writes 0,1,3,7
|-
|$FF0006
|?
|Word
|?
|CDM3-2 BIOS writes 0x71FF, CDZ writes 0x71FF
|-
|$FF0008
|?
|Word
|?
|CDM3-2 BIOS writes 0x0000, CDZ writes 0x0000
|-
|$FF000A
|?
|Word
|?
|CDM3-2 BIOS writes 0x7E40, CDZ writes 0x7E00
|-
|$FF000C
|?
|Word
|?
|Read and stored on vector 23 interrupt.
|-
|$FF000F
|?
|Byte
|?
|[[68k interrupts|Interrupt]] acknowledge.
{{8BitRegister|?|2|Vector 21|1|Vector 22|1|Vector 23|1|?|3}}
|-
|$FF0010/11
|?
|Byte
|?
|CDM3-2 BIOS writes $FE
|-
|$FF0017
|?
|Byte
|colspan="2"|CD mode, maybe CDDA mute ? Bit 0: 0=Audio 1=Data.
|?
|-
|$FF0101
|?
|Byte
|colspan="2"|LC8951 register address (4 LSB)
|rowspan="2"|[[LC89515]]
|-
|$FF0103
|?
|Byte
|colspan="2"|LC8951 register  value
|-
|$FF0105
|REG_TRANSAREA
|Byte
|?
|Set active transfer area
*0:Sprites
*1:ADPCM
*4:Z80
*5:Fix
|?
|-
|$FF0108
|?
|Word
|?
|CDM3-2 BIOS writes $5555
|?
|-
|$FF010C
|?
|Word
|?
|CDM3-2 BIOS writes $5555 and reads
|?
|-
|$FF011C
|REG_CDCONFIG
|Word
|{{16BitRegister|1|2|CD Mech<br>0:TOP/CDZ<br>1:FRONT|1|Lid Status<br>(Opposite on CDZ)|1|Configuration<br>jumpers|4|?|8}}
|?
|[[NEO-CDD boards|NEO-CDD board]]
|-
|$FF016D
|
|Byte
|?
|MapVectorTable(!(byteValue == 0xFF));
|rowspan="4"|[[NEO-MGA]]
|-
|$FF016F
|REG_UPLOAD_EN
|Byte
|?
|Enable/disable writes to the [[68k memory map|upload zone]] ($E00000)
|-
|$FF0181
|REG_CDIRQ_EN
|Byte
|?
|Bit 0: Enable CD drive interrupt
|-
|$FF0183
|REG_Z80RST
|Byte
|?
|?
|Certains émulateurs traitent cette adresse de la même façon que $3C000A.
|Active-low Z80 RESET ($0/$FF)
MAME ne s'en occupe pas. Aucun jeu n'en dépend.
|La même chose.
|}
|}


NeoGeo CD only (from NeoCD's source):
===CDDA===


$FF011C (word): read: return 0xff | (region_code << 8);
{| class="regdef"
$FF0002 (word)
|'''Address'''
$FF007E,$FF008f (word) dma_mode
|'''Name'''
$FF0105 (byte) upload_type_w
|'''Size'''
$FF0111 (byte) spr_disable
|'''Read'''
$FF0115 (byte) fix_disable
|'''Write'''
$FF0119 (byte) video_enable
|'''Handled by'''
$FF016F (byte) disable_irq_w
|-
$FF0183 (byte) z80_enable
|$FF0188
|REG_CDDALEFTL
|rowspan="2"|Word
|rowspan="2"|See [[Reading CDDA sound levels]]
|rowspan="2"|No effect
|rowspan="2"|[[NEO-MGA]]
|-
|$FF018A
|REG_CDDARIGHTL
|-
|$FF01FC
|?
|Word
|?
|CDDA control ?
|?
|-
|$FF01FE
|?
|Word
|?
|CD music/data switch ?
|?
|}


[[Category:CPUs]]
[[Category:Base system]]
[[Category:Code]]
[[Category:Code]]

Latest revision as of 08:55, 9 October 2023


Address decode masks

Decode masks aren't verified !

Decode masks are used to know which register will be mapped to a given address, they can be seen as a sort of mirroring range notation.

A "1" bit means that the corresponding address bit is involved in decoding, a "0" means it's ignored.

For example, REG_P1CNT's base is $300000 and its mask is $FE0001:

BASE 00110000 00000000 00000000
MASK 11111110 00000000 00000001
     0011000x xxxxxxxx xxxxxxx0

This means that it's also accessible at $300002, $300004, $300006... up to $31FFFE. The highest address is BASE OR (NOT MASK).

Mirror guesser

Register descriptions

I/O registers

REG_P1CNT

Read Write
Joypad port 1 inputs (active low)
Bit 7 6 5 4 3 2 1 0
Def D CBARightLeftDownUp
?
  • Address: $300000
  • Decode mask: $FE0001
  • Handled by: NEO-C1



REG_DIPSW

Read Write
Hardware DIPs (active low)
Bit 7 6 5 4 3 2 1 0
Def Freeze game FreeplayEnable MultiplayerMultiplayer ID code0:Normal controller
1:Mahjong keyboard
0:1 coin chute
1:2 coin chutes
Settings mode
Kick watchdog
  • Address: $300001
  • Decode mask: $FE0081 (not sure for write)
  • Handled by: NEO-F0 (read), NEO-B1 (write)



REG_SYSTYPE

Read Write
Bit 7 6 5 4 3 2 1 0
Def Test button Type
0: 2 slots
1: 4 or 6 slots
?
?

Reads the unused DSW2 on MV4 boards. Used for system ID on other boards.

  • Address: $300081
  • Decode mask: $FE0081
  • Handled by: NEO-F0



REG_SOUND

Read Write
Read Z80 reply code Send command to Z80
  • Address: $320000
  • Decode mask: $FE0001
  • Handled by: NEO-C1



REG_STATUS_A

Read Write
Switch inputs are active low
Bit 7 6 5 4 3 2 1 0
Def RTC data bit RTC time pulse0:4-SLOT
1:6-SLOT
Coin-in 4Coin-in 3Service buttonCoin-in 2Coin-in 1
?
  • Address: $320001
  • Decode mask: $FE0001
  • Handled by: NEO-F0



REG_P2CNT

Read Write
Joypad port 2 inputs (active low)
Bit 7 6 5 4 3 2 1 0
Def D CBARightLeftDownUp
?
  • Address: $340000
  • Decode mask: $FE0001
  • Handled by: NEO-C1



REG_STATUS_B

Read Write
Aux inputs (lower bits active low)
Bit 7 6 5 4 3 2 1 0
Def 0:AES
1:MVS
Memory card
write protected if 1
Memory card
inserted if 00
Select P2Start P2Select P1Start P1
?
  • Address: $380000
  • Decode mask: $FE0001
  • Handled by: NEO-C1



REG_POUTPUT

Read Write
? Joypad ports outputs
Bit 7 6 5 4 3 2 1 0
Def ? P2 outputsP1 outputs
  • Address: $380001
  • Decode mask: $FE0071
  • Handled by: NEO-D0



REG_CRDBANK

Read Write
?
Bit 7 6 5 4 3 2 1 0
Def Memory card bank selection
  • Address: $380011
  • Decode mask: $FE0071
  • Handled by: NEO-D0



REG_SLOT

Read Write
?
Bit 7 6 5 4 3 2 1 0
Def ? Slot #

(Mirror of REG_POUTPUT on the AES)

  • Address: $380021
  • Decode mask: $FE00F1
  • Handled by: NEO-F0



REG_LEDLATCHES

Read Write
?
Bit 7 6 5 4 3 2 1 0
Def ? Latch LED2 dataLatch LED1 dataLatch marquee data?

LED data is latched on 1 to 0 transition.

  • Address: $380031
  • Decode mask: $FE00F1
  • Handled by: NEO-F0



REG_LEDDATA

Read Write
? 8-bit data for credits displays and the marquee. See MV-LED.
  • Address: $380041
  • Decode mask: $FE00F1
  • Handled by: NEO-F0



REG_RTCCTRL

Read Write
? MAME upd4990a_control_16_w
Bit 7 6 5 4 3 2 1 0
Def RTC StrobeRTC ClockRTC DIN
  • Address: $380051
  • Decode mask: $FE00F1
  • Handled by: NEO-F0



REG_RESETCC1

Read Write
? Any, coin counter 1 floats
  • Address: $380061
  • Decode mask: $FE00F1
  • Handled by: NEO-I0



REG_RESETCC2

Read Write
? Any, coin counter 2 floats
  • Address: $380063
  • Decode mask: $FE00F1
  • Handled by: NEO-I0



REG_RESETCL1

Read Write
? Any, coin lockout 1 floats
  • Address: $380065
  • Decode mask: $FE00F1
  • Handled by: NEO-I0



REG_RESETCL2

Read Write
? Any, coin lockout 2 floats
  • Address: $380067
  • Decode mask: $FE00F1
  • Handled by: NEO-I0



REG_SETCC1

Read Write
? Any, coin counter 1 sinks current
  • Address: $3800E1
  • Decode mask: $FE00F1
  • Handled by: NEO-I0



REG_SETCC2

Read Write
? Any, coin counter 2 sinks current
  • Address: $3800E3
  • Decode mask: $FE00F1
  • Handled by: NEO-I0



REG_SETCL1

Read Write
? Any, coin lockout 1 sinks current
  • Address: $3800E5
  • Decode mask: $FE00F1
  • Handled by: NEO-I0



REG_SETCL2

Read Write
? Any, coin lockout 2 sinks current
  • Address: $3800E7
  • Decode mask: $FE00F1
  • Handled by: NEO-I0

System registers

Data written doesn't matter. Odd byte writes only. Decode mask: $FE0001.

Registers go in pairs, bit 4 of the address is actually the data bit.

Handled by a 74HC259 addressable latch on cart systems.

Address Name Write
$3A0001 REG_NOSHADOW Normal video output
$3A0011 REG_SHADOW Darken video output
$3A0003 REG_SWPBIOS BIOS vector table
$3A0013 REG_SWPROM Use the cart's vector table
$3A0005 REG_CRDUNLOCK1 Enable writes to memory card (unused in CD systems)
$3A0015 REG_CRDLOCK1 Disable writes to memory card (unused in CD systems)
$3A0007 REG_CRDLOCK2 Disable writes to memory card (unused in CD systems)
$3A0017 REG_CRDUNLOCK2 Enable writes to memory card (unused in CD systems)
$3A0009 REG_CRDREGSEL Enable "Register select" for memory card
$3A0019 REG_CRDNORMAL Disable "Register select" for memory card
$3A000B REG_BRDFIX Use the embedded SFIX ROM and SM1 ROM
$3A001B REG_CRTFIX Use the cart's S ROM and M1 ROM
$3A000D REG_SRAMLOCK Write-protects backup RAM (MVS)
$3A001D REG_SRAMUNLOCK Unprotects backup RAM (MVS)
$3A000F REG_PALBANK1 Use palette bank 1
$3A001F REG_PALBANK0 Use palette bank 0

Video registers

Handled by the LSPC. Byte writes are only effective on even addresses and they store the same data in both bytes. Odd addresses aren't mapped ? Decode mask: $FE0001.

Address Name Read Write
$3C0000 REG_VRAMADDR Read from VRAM (address doesn't change) Sets VRAM address
$3C0002 REG_VRAMRW Read from VRAM (address doesn't change) Write to VRAM (modulo is applied after)
$3C0004 REG_VRAMMOD Reads VRAM address modulo Sets VRAM address modulo
$3C0006 REG_LSPCMODE
Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Def Raster line counter.
See Display timing
01:50Hz
0:60Hz (LSPC2 only)
Auto animation counter
Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Def Auto animation speed
(in frames)
Timer interrupt
mode
Timer interrupt enableDisable auto animationUnused

Reset value: ????????00000---

$3C0008 REG_TIMERHIGH Like REG_VRAMADDR. 16 highest bits of the timer reload value.
$3C000A REG_TIMERLOW Like REG_VRAMRW. 16 lowest bits of the timer reload value.
$3C000C REG_IRQACK Like REG_VRAMMOD. Interrupt acknowledge.
Bit 7 6 5 4 3 2 1 0
Def Unused Ack VBlank IRQAck timer IRQAck IRQ3
$3C000E REG_TIMERSTOP Like REG_LSPCMODE. Bit 0=1: Stops timer counter during first and last 16 lines (32 total) when in PAL mode.

NeoGeo CD registers

NEO-MGA / LC8953 / LC98000 ?

CD drive

Address Name Size Read Write Handled by
$FF0161 REG_CDDINPUT Byte
Bit 7 6 5 4 3 2 1 0
Def - CDCK input4-bit bus from the CD drive
? NEO-MGA
$FF0163 REG_CDDOUTPUT Byte ?
Bit 7 6 5 4 3 2 1 0
Def - 4-bit bus to the CD drive
NEO-MGA
$FF0165 REG_CDDCTRL Byte ?
Bit 7 6 5 4 3 2 1 0
Def - Must be 0Signal selection
0:4-bit bus direction
1:HOCK output
State
Dir:0:Out 1:In
HOCK:0:Low 1:High
NEO-MGA
$FF0167 REG_CDDSTAT Byte CD drive status lines.
Bit 7 6 5 4 3 2 1 0
Def - MUTESBSOSCORWFCKEXCK
Bit 7 6 5 4 3 2 1 0
Def - EXCK
NEO-MGA

Video

Address Name Size Read Write Handled by
$FF0111 REG_DISBLSPR Byte ? 1=Disable 0=Enable sprites NEO-GRC/NEO-OFC
$FF0115 REG_DISBLFIX Byte ? 1=Disable 0=Enable fix layer
$FF0119 REG_ENVIDEO Byte ? 1=Enable 0=Disable video output.

Memory

Address Name Size Read Write Handled by
$FF01A1 REG_SPRBANK Byte ? Upload zone 1MiB SPR DRAM bank selection (2 LSBs). ?
$FF01A3 REG_PCMBANK Byte ? Upload zone 512KiB PCM DRAM bank selection (1 LSB). ?
$FF01A7 REG_???BANK Byte ? $A00000 zone bank number. What is this ? ?
$FF0121 REG_UPMAPSPR Byte ? NeoSetSpriteSlot(1);

Set upload zone to SPR DRAM

?
$FF0123 REG_UPMAPPCM Set upload zone to PCM DRAM
$FF0127 REG_UPMAPZ80 Set upload zone to Z80 DRAM
$FF0129 REG_UPMAPFIX Set upload zone to FIX DRAM
$FF0141 REG_UPUNMAPSPR Unset SPR DRAM to upload zone
$FF0143 REG_UPUNMAPPCM Unset PCM DRAM to upload zone
$FF0147 REG_UPUNMAPZ80 Unset Z80 DRAM to upload zone
$FF0149 REG_UPUNMAPFIX Unset FIX DRAM to upload zone

DMA

Address Name Size Read Write Handled by
$FF0061 ? Byte ? Bit 6: Execute DMA microcode LC8953
$FF0064~$FF0067 REG_DMA_ADDR1 Longword ? Sets DMA source address.
$FF0068~$FF006B REG_DMA_ADDR2 Longword ? Sets DMA destination address.
$FF006C~$FF006F REG_DMA_VALUE Longword ? Sets DMA value for filling.
$FF0070~$FF0073 REG_DMA_COUNT Longword ? Sets DMA length.
$FF007E REG_DMA_MODE Word ? Sets DMA mode.
$FF007E~$FF008E ? Words ? Microcode (16x 9-bit opcodes)

Misc

Address Name Size Read Write Handled by
$FF0002 ? Word ? Enables Vector 22 interrupts. NeoRaine calls load_files. LC8953
$FF0004 ? Word ? CDM3-2 BIOS writes 0,1,3,7
$FF0006 ? Word ? CDM3-2 BIOS writes 0x71FF, CDZ writes 0x71FF
$FF0008 ? Word ? CDM3-2 BIOS writes 0x0000, CDZ writes 0x0000
$FF000A ? Word ? CDM3-2 BIOS writes 0x7E40, CDZ writes 0x7E00
$FF000C ? Word ? Read and stored on vector 23 interrupt.
$FF000F ? Byte ? Interrupt acknowledge.
Bit 7 6 5 4 3 2 1 0
Def ? Vector 21Vector 22Vector 23?
$FF0010/11 ? Byte ? CDM3-2 BIOS writes $FE
$FF0017 ? Byte CD mode, maybe CDDA mute ? Bit 0: 0=Audio 1=Data. ?
$FF0101 ? Byte LC8951 register address (4 LSB) LC89515
$FF0103 ? Byte LC8951 register value
$FF0105 REG_TRANSAREA Byte ? Set active transfer area
  • 0:Sprites
  • 1:ADPCM
  • 4:Z80
  • 5:Fix
?
$FF0108 ? Word ? CDM3-2 BIOS writes $5555 ?
$FF010C ? Word ? CDM3-2 BIOS writes $5555 and reads ?
$FF011C REG_CDCONFIG Word
Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Def 1 CD Mech
0:TOP/CDZ
1:FRONT
Lid Status
(Opposite on CDZ)
Configuration
jumpers
?
? NEO-CDD board
$FF016D Byte ? MapVectorTable(!(byteValue == 0xFF)); NEO-MGA
$FF016F REG_UPLOAD_EN Byte ? Enable/disable writes to the upload zone ($E00000)
$FF0181 REG_CDIRQ_EN Byte ? Bit 0: Enable CD drive interrupt
$FF0183 REG_Z80RST Byte ? Active-low Z80 RESET ($0/$FF)

CDDA

Address Name Size Read Write Handled by
$FF0188 REG_CDDALEFTL Word See Reading CDDA sound levels No effect NEO-MGA
$FF018A REG_CDDARIGHTL
$FF01FC ? Word ? CDDA control ? ?
$FF01FE ? Word ? CD music/data switch ? ?