Memory mapped registers: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
No edit summary
mNo edit summary
Line 1: Line 1:
==I/O registers==
==I/O registers==
Always read/written as bytes (?)
 
Odd/even infos and mirroring ranges aren't tested !
 
{| class="regdef"
{| class="regdef"
|'''Address'''
|'''Address'''
Line 8: Line 10:
|'''Handled by'''
|'''Handled by'''
|-
|-
|$300000
|$300000~$31FFFE, even bytes
|REG_P1CNT
|REG_P1CNT
|Player 1 controls or [[trackball]] data (active low)
|Player 1 controls or [[trackball]] data (active low)
Line 15: Line 17:
|[[NEO-C1]]
|[[NEO-C1]]
|-
|-
|$300001
|$300001~?, odd bytes
|REG_DIPSW
|REG_DIPSW
|[[Hardware DIPs]] (active low)
|[[Hardware DIPs]] (active low)
Line 22: Line 24:
|[[NEO-F0]] (read)
|[[NEO-F0]] (read)
|-
|-
|$300081
|$300081~?, odd bytes
|?
|?
|IN01 to D7 (test switch) and TYPE to D6, see [[NEO-F0]]
|IN01 to D7 (test switch) and TYPE to D6, see [[NEO-F0]]
Line 28: Line 30:
|[[NEO-F0]]
|[[NEO-F0]]
|-
|-
|$320000
|$320000~$33FFFE, even bytes
|REG_SOUND
|REG_SOUND
|[[68k/Z80 communication|Read Z80 reply code]]
|[[68k/Z80 communication|Read Z80 reply code]]
Line 34: Line 36:
||[[NEO-C1]]
||[[NEO-C1]]
|-
|-
|$320001
|$320001~?, odd bytes
|REG_STATUS_A  
|REG_STATUS_A  
|Switch inputs are active low
|Switch inputs are active low
Line 41: Line 43:
|[[NEO-F0]]
|[[NEO-F0]]
|-
|-
|$340000
|$340000~$37FFFE, even bytes
|REG_P2CNT
|REG_P2CNT
|Player 2 controls (active low)
|Player 2 controls (active low)
Line 48: Line 50:
|[[NEO-C1]]
|[[NEO-C1]]
|-
|-
|$380000
|$380000~$3BFFFE(?), even bytes
|REG_STATUS_B
|REG_STATUS_B
|Aux inputs (active low)
|Aux inputs (active low)
Line 55: Line 57:
|[[NEO-C1]]
|[[NEO-C1]]
|-
|-
|$380001
|$380001~?, odd bytes
|REG_POUTPUT
|REG_POUTPUT
|?
|?
Line 63: Line 65:
|[[NEO-D0]]
|[[NEO-D0]]
|-
|-
|$380011
|$380011~?, odd bytes
|REG_CRDBANK
|REG_CRDBANK
|?
|?
Line 69: Line 71:
|[[NEO-D0]]
|[[NEO-D0]]
|-
|-
|$380021
|$380021~?, odd bytes
|REG_SLOT
|REG_SLOT
|?
|?
Line 76: Line 78:
|[[NEO-F0]]
|[[NEO-F0]]
|-
|-
|$380031
|$380031~?, odd bytes
|REG_LEDLATCHES
|REG_LEDLATCHES
|?
|?
Line 83: Line 85:
|[[NEO-F0]]
|[[NEO-F0]]
|-
|-
|$380041
|$380041~?, odd bytes
|REG_LEDDATA
|REG_LEDDATA
|?
|?
Line 89: Line 91:
|[[NEO-F0]]
|[[NEO-F0]]
|-
|-
|$380051
|$380051~?, odd bytes
|REG_RTCCTRL
|REG_RTCCTRL
|?
|?
Line 95: Line 97:
|[[NEO-F0]]?
|[[NEO-F0]]?
|-
|-
|$380061
|$380061~?, odd bytes
|?
|?
|
|
Line 101: Line 103:
|[[NEO-I0]]
|[[NEO-I0]]
|-
|-
|$380063
|$380063~?, odd bytes
|?
|?
|
|
Line 107: Line 109:
||[[NEO-I0]]
||[[NEO-I0]]
|-
|-
|$380065
|$380065~?, odd bytes
|?
|?
|
|
Line 113: Line 115:
|[[NEO-I0]]
|[[NEO-I0]]
|-
|-
|$380067
|$380067~?, odd bytes
|?
|?
|
|
Line 119: Line 121:
|[[NEO-I0]]
|[[NEO-I0]]
|-
|-
|$3800D1
|$3800D1~?, odd bytes
|?
|?
|
|
Line 126: Line 128:
|?
|?
|-
|-
|$3800E1
|$3800E1~?, odd bytes
|?
|?
|?
|?
Line 132: Line 134:
|[[NEO-I0]]
|[[NEO-I0]]
|-
|-
|$3800E3
|$3800E3~?, odd bytes
|?
|?
|?
|?
Line 138: Line 140:
|[[NEO-I0]]
|[[NEO-I0]]
|-
|-
|$3800E5
|$3800E5~?, odd bytes
|?
|?
|?
|?
Line 144: Line 146:
|[[NEO-I0]]
|[[NEO-I0]]
|-
|-
|$3800E7
|$3800E7~?, odd bytes
|?
|?
|?
|?
Line 158: Line 160:
|'''Write'''
|'''Write'''
|-
|-
|$3A0001
|$3A0001~?, odd bytes
|REG_NOSHADOW
|REG_NOSHADOW
|Normal video output
|Normal video output
|-
|-
|$3A0011
|$3A0011~?, odd bytes
|REG_SHADOW
|REG_SHADOW
|[[Video DAC|Darken]] video output
|[[Video DAC|Darken]] video output
|-
|-
|$3A0003
|$3A0003~?, odd bytes
|REG_SWPBIOS
|REG_SWPBIOS
|Use the |BIOS [[Vector_table_swap|vector table]]
|Use the |BIOS [[Vector_table_swap|vector table]]
|-
|-
|$3A0013
|$3A0013~?, odd bytes
|REG_SWPROM
|REG_SWPROM
|Use the cart's vector table
|Use the cart's vector table
Line 178: Line 180:
|Enable writes to memory card (use REG_CRDUNLOCK2 too)
|Enable writes to memory card (use REG_CRDUNLOCK2 too)
|-
|-
|$3A0015
|$3A0015~?, odd bytes
|REG_CRDLOCK1
|REG_CRDLOCK1
|Disable writes to memory card
|Disable writes to memory card
|-
|-
|$3A0007
|$3A0007~?, odd bytes
|REG_CRDLOCK2
|REG_CRDLOCK2
|Disable writes to memory card
|Disable writes to memory card
|-
|-
|$3A0017
|$3A0017~?, odd bytes
|REG_CRDUNLOCK2
|REG_CRDUNLOCK2
|Enable writes to memory card (use REG_CRDUNLOCK1 too)   
|Enable writes to memory card (use REG_CRDUNLOCK1 too)   
|-
|-
|$3A0009
|$3A0009~?, odd bytes
|REG_CRDREGSEL
|REG_CRDREGSEL
|Enable "Register select" for memory card
|Enable "Register select" for memory card
|-
|-
|$3A0019
|$3A0019~?, odd bytes
|REG_CRDNORMAL
|REG_CRDNORMAL
|Disable "Register select" for memory card
|Disable "Register select" for memory card
|-
|-
|$3A000B
|$3A000B~?, odd bytes
|REG_BRDFIX
|REG_BRDFIX
|Use the embedded [[SFIX]] and [[SM1]] ROM
|Use the embedded [[SFIX]] and [[SM1]] ROM
|-
|-
|$3A001B
|$3A001B~?, odd bytes
|REG_CRTFIX
|REG_CRTFIX
|Use the cart's [[S ROM]] and [[M1 ROM]]
|Use the cart's [[S ROM]] and [[M1 ROM]]
|-
|-
|$3A000D
|$3A000D~?, odd bytes
|REG_SRAMLOCK
|REG_SRAMLOCK
|Write-protects [[backup RAM]] (MVS)
|Write-protects [[backup RAM]] (MVS)
|-
|-
|$3A001D
|$3A001D~?, odd bytes
|REG_SRAMULOCK
|REG_SRAMULOCK
|Unprotects backup RAM (MVS)
|Unprotects backup RAM (MVS)
|-
|-
|$3A000F
|$3A000F~?, odd bytes
|REG_PALBANK1
|REG_PALBANK1
|Use palette bank 1
|Use palette bank 1
|-
|-
|$3A001F
|$3A001F~?, odd bytes
|REG_PALBANK0
|REG_PALBANK0
|Use palette bank 0
|Use palette bank 0

Revision as of 21:40, 15 January 2016

I/O registers

Odd/even infos and mirroring ranges aren't tested !

Address Name Read Write Handled by
$300000~$31FFFE, even bytes REG_P1CNT Player 1 controls or trackball data (active low)
Bit 7 6 5 4 3 2 1 0
Def D CBARightLeftDownUp
? NEO-C1
$300001~?, odd bytes REG_DIPSW Hardware DIPs (active low)
Bit 7 6 5 4 3 2 1 0
Def Freeze FreeplayEnable Multiplayer configurationCommunication identification code0:Normal controller
1:Mahjong keyboard
0:One coin chute
1:Two coin chutes
Settings mode
Kick watchdog NEO-F0 (read)
$300081~?, odd bytes ? IN01 to D7 (test switch) and TYPE to D6, see NEO-F0 ? NEO-F0
$320000~$33FFFE, even bytes REG_SOUND Read Z80 reply code Send command to Z80 NEO-C1
$320001~?, odd bytes REG_STATUS_A Switch inputs are active low
Bit 7 6 5 4 3 2 1 0
Def NEC D4990 data bit NEC D4990 time pulse0 on 4SLOT 1 on 6SLOTCoin 4Coin 3ServiceCoin 2Coin 1
? NEO-F0
$340000~$37FFFE, even bytes REG_P2CNT Player 2 controls (active low)
Bit 7 6 5 4 3 2 1 0
Def D CBARightLeftDownUp
? NEO-C1
$380000~$3BFFFE(?), even bytes REG_STATUS_B Aux inputs (active low)
Bit 7 6 5 4 3 2 1 0
Def 0:AES
1:MVS
Memory card
write protected
Memory card
inserted if 00
Select P2Start P2Select P1Start P1
? NEO-C1
$380001~?, odd bytes REG_POUTPUT ? Joypad ports outputs
Bit 7 6 5 4 3 2 1 0
Def ? P2 outputsP1 outputs

MAME select_controller

NEO-D0
$380011~?, odd bytes REG_CRDBANK ?
Bit 7 6 5 4 3 2 1 0
Def Memory card bank selection
NEO-D0
$380021~?, odd bytes REG_SLOT ?
Bit 7 6 5 4 3 2 1 0
Def ? Slot #

(On home systems this address is a mirror of REG_POUTPUT)

NEO-F0
$380031~?, odd bytes REG_LEDLATCHES ? MAME set_output_latch
Bit 7 6 5 4 3 2 1 0
Def ? Latch LED2 dataLatch LED1 dataLatch EL panel data?

Data is latched on falling edge (1 to 0 transition)

NEO-F0
$380041~?, odd bytes REG_LEDDATA ? MAME set_output_data (for LEDs and EL panel) NEO-F0
$380051~?, odd bytes REG_RTCCTRL ? MAME upd4990a_control_16_w (Calendar)
Bit 7 6 5 4 3 2 1 0
Def D4990 StrobeD4990 ClockD4990 DIN
NEO-F0?
$380061~?, odd bytes ? Chute 1 coin counter -> High NEO-I0
$380063~?, odd bytes ? Chute 2 coin counter -> High NEO-I0
$380065~?, odd bytes ? Chute 1 coin lockout -> High NEO-I0
$380067~?, odd bytes ? Chute 2 coin lockout -> High NEO-I0
$3800D1~?, odd bytes ? Write to RTC

uPD4990AWrite(byteValue & 2, byteValue & 4, byteValue & 1);

?
$3800E1~?, odd bytes ? ? Chute 1 coin counter -> Low NEO-I0
$3800E3~?, odd bytes ? ? Chute 2 coin counter -> Low NEO-I0
$3800E5~?, odd bytes ? ? Chute 1 coin lockout -> Low NEO-I0
$3800E7~?, odd bytes ? ? Chute 2 coin lockout -> Low NEO-I0

System registers

Handled by a 74HC259 adressable latch on cart systems. Byte writes only.

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


Video registers

Handled by the GPUs. Byte writes only work on odd addresses and store the same data in the MSB and LSB.

Address Name Read Write
$3C0000 REG_VRAMADDR Read VRAM (address isn't changed) Sets VRAM address
$3C0002 REG_VRAMRW Read VRAM (address isn't changed) Write VRAM
$3C0004 REG_VRAMMOD Reads VRAM address modulo Sets VRAM address modulo (signed)
$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
-1: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 animation?
$3C0008 REG_TIMERHIGH Invalid MSBs of timer reload value.
$3C000A REG_TIMERLOW Invalid LSBs of timer reload value.
$3C000C REG_IRQACK Invalid Interrupt Acknowledge (byte !).
Bit 7 6 5 4 3 2 1 0
Def ? Ack VBlankAck HBlankAck IRQ3
$3C000E REG_TIMERSTOP Invalid Bit 0=1: Stop timer counter for 32 raster lines when in PAL mode


NeoGeo CD registers

NEO-MGA / LC8953 / LC98000 ?

Address Name Size Read Write Handled by
$FF0002 ? Word ? NeoRaine load_files, really interrupt mask ? ?
$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 ?
$FF000E ? Byte ? CDM3-2 BIOS writes $3F,$3C ?
$FF000F ? Byte ? NeoCDIRQUpdate(byteValue);

CDM3-2 BIOS writes $20,$10,$08,$04

?
$FF0011 ? Byte ? CDM3-2 BIOS writes $FE ?
$FF0017 ? Byte nNeoCDMode

CDM3-2 BIOS read/writes bit 0

?
$FF0061 ? Byte ? Bit 6: Execute DMA microcode LC8953
$FF0064~$FF0073 ? (Long)words ? Registers used by microcode (NeoRaine upload_param)
$FF007E~$FF008F ? Words ? Microcode (16x9bit instructions ?)
$FF0101 ? Byte nLC8951Register (4 LSB)

CDM3-2 BIOS writes low nibble

LC8951
$FF0103 ? Byte nLC8951Register value

CDM3-2 BIOS writes 0x10, CDZ writes 0x00 (start up init)

LC8951
$FF0105 ? Byte ? nActiveTransferArea = byteValue

upload_type_w

?
$FF0108 ? Word ? CDM3-2 BIOS writes $5555 ?
$FF010C ? Word ? CDM3-2 BIOS writes $5555 and reads ?
$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 ? Video output. 1=Enable 0=Disable
$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
$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
$FF0161 ? ? ? NeoCDCommsRead Status FIFO 10 values (4 bits) ?
$FF0163 ? ? ? NeoCDCommsWrite(byteValue) Command FIFO 10 values (4 bits) ?
$FF0165 ? ? ? NeoCDCommsControl(byteValue & 1, byteValue & 2); (clock,send) ?
$FF016D Byte ? MapVectorTable(!(byteValue == 0xFF)); ?
$FF016F REG_DISBLIRQ Byte ? Disable/enable interrupts nTransferWriteEnable = byteValue ?
$FF0181 Byte ? Enable/Disable (Reset) CD assy ?
$FF0183 REG_ENZ80 Byte ? Enable/Disable (Reset) Z80 ?
$FF0188 REG_CDDALEFTL Word See Reading CDDA sound levels No effect NEO-MGA
$FF018A REG_CDDARIGHTL
$FF01A1 ? Byte ? Upload zone 1MiB SPR DRAM bank selection ?
$FF01A3 ? Byte ? Upload zone 512KiB PCM DRAM bank selection ?
$FF01A7 ? Byte ? CDM3-2 BIOS writes ?
$FF01FC ? Word ? CDDA control ? ?
$FF01FE ? Word ? CD DA/data switch ? ?