The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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 |
C | B | A | Right | Left | Down | Up |
|
?
|
- 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 |
Freeplay | Enable Multiplayer | Multiplayer ID code | 0: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
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
- Address: $320000
- Decode mask: $FE0001
- Handled by: NEO-C1
REG_STATUS_A
Read
|
Write
|
Switch inputs are active low
|
?
|
- 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 |
C | B | A | Right | Left | Down | Up |
|
?
|
- 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 P2 | Start P2 | Select P1 | Start 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 outputs | P1 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 data | Latch LED1 data | Latch 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 Strobe | RTC Clock | RTC DIN |
|
- Address: $380051
- Decode mask: $FE00F1
- Handled by: NEO-F0
REG_RESETCC1
- Address: $380061
- Decode mask: $FE00F1
- Handled by: NEO-I0
REG_RESETCC2
- Address: $380063
- Decode mask: $FE00F1
- Handled by: NEO-I0
REG_RESETCL1
- Address: $380065
- Decode mask: $FE00F1
- Handled by: NEO-I0
REG_RESETCL2
- 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 |
Auto animation speed (in frames) |
Timer interrupt mode | Timer interrupt enable | Disable auto animation | Unused |
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 IRQ | Ack timer IRQ | Ack 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 input | 4-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 0 | Signal 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 |
- |
MUTE | SBSO | SCOR | WFCK | EXCK |
|
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 21 | Vector 22 | Vector 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 ?
|
?
|