Note: Most of the register names come from neogeo_spex.pdf
I/O registers
Always read/written as bytes (?)
Address
|
Name
|
Read
|
Write
|
Handled by
|
$300000
|
REG_P1CNT
|
Player 1 controls (active low)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
D |
C | B | A | Right | Left | Down | Up |
|
?
|
NEO-C1
|
$300001
|
REG_DIPSW
|
Dipswitches (active low)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
Freeze |
Freeplay | Multiplayer configuration | Autofire | ? | Test mode |
|
Kick watchdog
|
NEO-F0 (read)
|
$300081
|
?
|
Read only
|
?
|
?
|
$320000
|
REG_SOUND
|
Send command to Z80
|
Read Z80 reply code
|
NEO-D0 ?
|
$320001
|
REG_STATUS_A
|
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
? |
|
?
|
?
|
$340000
|
REG_P2CNT
|
Player 2 controls (active low)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
D |
C | B | A | Right | Left | Down | Up |
|
?
|
NEO-C1
|
$380000
|
REG_STATUS_B
|
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
? |
Memory card write protect | Memory card inserted | Select P2 | Start P2 | Select P1 | Start P1 |
|
?
|
NEO-C1
|
$380001
|
REG_POUTPUT
|
?
|
Joypad ports outputs
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
? |
P2 outputs | P1 outputs |
MAME select_controller
|
NEO-D0
|
$380011
|
?
|
?
|
Write only, after a write to $3A0019
|
?
|
$380021
|
REG_SLOT
|
?
|
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
? |
Slot # |
|
NEO-F0?
|
$380030(1?)
|
?
|
?
|
MAME set_output_latch (LED marquee ?)
|
NEO-F0?
|
$380040(1?)
|
?
|
?
|
MAME set_output_data (LED marquee ?)
|
NEO-F0?
|
$380050(1?)
|
?
|
?
|
MAME upd4990a_control_16_w (Calendar)
|
NEO-F0?
|
$380061
|
?
|
?
|
Base address for writes (used by the MVS BIOS)
|
?
|
$380065
|
?
|
?
|
Write only (used by the MVS BIOS)
|
?
|
$380067
|
?
|
?
|
Write only (used by the MVS BIOS)
|
?
|
System registers
Handled by a 74HC259 adressable latch on cart systems. Byte writes only.
Address
|
Name
|
Write
|
$3A0001
|
REG_DISPENABL
|
Normal video output
|
$3A0011
|
REG_DISPDSABL
|
Darken video output
|
$3A0003
|
?
|
Use the BIOS vector table
|
$3A0013
|
REG_SWPROM
|
Use the cart's vector table
|
$3A0005
|
REG_CRDUNLOCK1
|
Allow /WE to pass through to memory card when low
|
$3A0015
|
REG_CRDLOCK1
|
Don't allow /WE to pass through to memory card
|
$3A0007
|
REG_CRDLOCK2
|
Don't allow /WE to pass through to memory card
|
$3A0017
|
REG_CRDUNLOCK1
|
Allow /WE to pass through to memory card when high
|
$3A0009
|
?
|
?
|
$3A0019
|
?
|
?
|
$3A000B
|
REG_BRDFIX
|
Use the embeded fix tileset (SFIX)
|
$3A001B
|
REG_CRTFIX
|
Use the cart's fix tileset
|
$3A000D
|
REG_SRAMLOCK
|
Write-protects SRAM (MVS)
|
$3A001D
|
REG_SRAMULOCK
|
Unprotects SRAM (MVS)
|
$3A000F
|
REG_PALBANK1
|
Use palette bank 1
|
$3A001F
|
REG_PALBANK0
|
Use palette bank 0
|
Video registers
Handled by the GPUs.
Address
|
Name
|
Size
|
Read
|
Write
|
$3C0000
|
REG_VRAMADDR
|
Word
|
Read VRAM (address isn't changed)
|
Sets VRAM address
|
$3C0002
|
REG_VRAMRW
|
Word
|
Read VRAM (address isn't changed)
|
Write VRAM
|
$3C0004
|
REG_VRAMMOD
|
Word
|
Reads VRAM address modulo
|
Sets VRAM address modulo (signed)
|
$3C0006
|
REG_HBLANKCNT
|
Word
|
|
Bit |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
Auto animation speed (in frames) |
Raster interrupt mode | Raster interrupt enable | Disable auto animation | ? |
|
$3C0008
|
REG_HBLANKPOS
|
Word
|
Invalid
|
MSB of RLI position (number of pixels)
|
$3C000A
|
?
|
Word
|
Invalid
|
LSB of RLI position (number of pixels)
|
$3C000C
|
REG_IRQACK
|
Byte
|
Invalid
|
Interrupt Acknowledge.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
? |
Ack VBlank | Ack HBlank | Ack IRQ3 |
|
$3C000E
$3C000F
|
?
|
?
|
Some emulators treat these locations like $3C000A.
|
NeoGeo CD registers
NEO-MGA / LC8953 / LC98000 ?
Address
|
Name
|
Size
|
Read
|
Write
|
Handled by
|
$FF0002
|
?
|
Word
|
?
|
NeoRaine load_files
|
?
|
$FF0004
|
?
|
Word
|
?
|
CDM3-2 BIOS writes 0,1,3,7
|
?
|
$FF000E
|
?
|
Byte
|
?
|
CDM3-2 BIOS writes $3F,$3C
|
?
|
$FF000F
|
?
|
Byte
|
?
|
CDM3-2 BIOS writes $20,$10,$08,$04
|
?
|
$FF0011
|
?
|
Byte
|
?
|
CDM3-2 BIOS writes $FE
|
?
|
$FF0017
|
?
|
Byte
|
CDM3-2 BIOS read/writes bit 0
|
?
|
$FF0061
|
?
|
Byte
|
?
|
Bit4: Run microcode ?
|
LC8953
|
$FF0064~$FF0070
|
?
|
(Long)words
|
?
|
Registers used by microcode (NeoRaine upload_param)
|
$FF007E~$FF008F
|
?
|
Words
|
?
|
Microcode (16x9bit instructions ?)
|
$FF0101
|
?
|
Byte
|
?
|
CDM3-2 BIOS writes low nibble
|
?
|
$FF0103
|
?
|
Byte
|
CDM3-2 BIOS: sequential read/writes
|
?
|
$FF0105
|
?
|
Byte
|
?
|
upload_type_w
|
?
|
$FF0108
|
?
|
Word
|
?
|
CDM3-2 BIOS writes $5555
|
?
|
$FF010C
|
?
|
Word
|
?
|
CDM3-2 BIOS writes $5555 and reads
|
?
|
$FF0111
|
?
|
Byte
|
?
|
Enable/disable sprites
|
NEO-GRC/NEO-OFC
|
$FF0115
|
?
|
Byte
|
?
|
Enable/disable fix layer
|
$FF0119
|
?
|
Byte
|
?
|
Enable/disable video output
|
$FF011C
|
?
|
Word
|
Bit |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Def |
1 |
0 | CD lid switch | Configuration jumpers | ? |
|
?
|
NEO-CDD board
|
$FF0121
|
REG_UPMAPSPR
|
Byte
|
|
Route upload zone to SPR DRAM
|
?
|
$FF0123
|
REG_UPMAPPCM
|
|
Route upload zone to PCM DRAM
|
$FF0127
|
REG_UPMAPZ80
|
|
Route upload zone to Z80 DRAM
|
$FF0129
|
REG_UPMAPFIX
|
|
Route upload zone to FIX DRAM
|
$FF0141
|
REG_UPUNMAPSPR
|
|
Unroute SPR DRAM to upload zone
|
$FF0143
|
REG_UPUNMAPPCM
|
|
Unroute PCM DRAM to upload zone
|
$FF0147
|
REG_UPUNMAPZ80
|
|
Unroute Z80 DRAM to upload zone
|
$FF0149
|
REG_UPUNMAPFIX
|
|
Unroute FIX DRAM to upload zone
|
$FF016F
|
?
|
Byte
|
?
|
Disable/enable interrupts
|
?
|
$FF0183
|
?
|
Byte
|
?
|
Enable/disable(reset) Z80
|
?
|
$FF0188
|
REG_CDDALEFTL
|
Word
|
See Reading CDDA sound levels
|
?
|
NEO-MGA
|
$FF018A
|
REG_CDDARIGHTL
|
$FF01A1
|
?
|
Byte
|
?
|
Upload zone 1MiB SPR DRAM bank selection
|
?
|
$FF01A3
|
?
|
Byte
|
?
|
Upload zone 1MiB PCM DRAM bank selection
|
?
|
$FF01A7
|
?
|
Byte
|
?
|
CDM3-2 BIOS writes
|
?
|
$FF01FC
|
?
|
Word
|
?
|
CDDA control ?
|
?
|
$FF01FE
|
?
|
Word
|
?
|
CD DA/data switch ?
|
?
|