Memory mapped registers: Difference between revisions
m (→REG_DIPSW) |
|||
(3 intermediate revisions by the same user not shown) | |||
Line 513: | Line 513: | ||
|Like REG_VRAMMOD. | |Like REG_VRAMMOD. | ||
|[[68k interrupts|Interrupt]] acknowledge. | |[[68k interrupts|Interrupt]] acknowledge. | ||
{{8BitRegister|Unused|5|Ack VBlank|1|Ack | {{8BitRegister|Unused|5|Ack VBlank IRQ|1|Ack timer IRQ|1|Ack IRQ3|1}} | ||
|- | |- | ||
|$3C000E | |$3C000E | ||
Line 716: | Line 716: | ||
|} | |} | ||
=== | ===Misc=== | ||
{| class="regdef" | {| class="regdef" | ||
Line 830: | Line 830: | ||
|? | |? | ||
|MapVectorTable(!(byteValue == 0xFF)); | |MapVectorTable(!(byteValue == 0xFF)); | ||
| | |rowspan="4"|[[NEO-MGA]] | ||
|- | |- | ||
|$FF016F | |$FF016F | ||
Line 837: | Line 837: | ||
|? | |? | ||
|Enable/disable writes to the [[68k memory map|upload zone]] ($E00000) | |Enable/disable writes to the [[68k memory map|upload zone]] ($E00000) | ||
|- | |- | ||
|$FF0181 | |$FF0181 | ||
| | |REG_CDIRQ_EN | ||
|Byte | |Byte | ||
|? | |? | ||
| | |Bit 0: Enable CD drive interrupt | ||
|- | |- | ||
|$FF0183 | |$FF0183 |
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)
|
? |
- Address: $300000
- Decode mask: $FE0001
- Handled by: NEO-C1
REG_DIPSW
Read | Write | ||||||||||||||||||
Hardware DIPs (active low)
|
Kick watchdog |
- Address: $300001
- Decode mask: $FE0081 (not sure for write)
- Handled by: NEO-F0 (read), NEO-B1 (write)
REG_SYSTYPE
Read | Write | ||||||||||||||||||
|
? |
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
|
? |
- Address: $320001
- Decode mask: $FE0001
- Handled by: NEO-F0
REG_P2CNT
Read | Write | ||||||||||||||||||
Joypad port 2 inputs (active low)
|
? |
- Address: $340000
- Decode mask: $FE0001
- Handled by: NEO-C1
REG_STATUS_B
Read | Write | ||||||||||||||||||
Aux inputs (lower bits active low)
|
? |
- Address: $380000
- Decode mask: $FE0001
- Handled by: NEO-C1
REG_POUTPUT
Read | Write | ||||||||||||||||||
? | Joypad ports outputs
|
- Address: $380001
- Decode mask: $FE0071
- Handled by: NEO-D0
REG_CRDBANK
Read | Write | ||||||||||||||||||
? |
|
- Address: $380011
- Decode mask: $FE0071
- Handled by: NEO-D0
REG_SLOT
Read | Write | ||||||||||||||||||
? |
(Mirror of REG_POUTPUT on the AES) |
- Address: $380021
- Decode mask: $FE00F1
- Handled by: NEO-F0
REG_LEDLATCHES
Read | Write | ||||||||||||||||||
? |
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
|
- 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 |
|
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.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$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
CD drive
Address | Name | Size | Read | Write | Handled by | ||||||||||||||||||||||||||||||||||||
$FF0161 | REG_CDDINPUT | Byte |
|
? | NEO-MGA | ||||||||||||||||||||||||||||||||||||
$FF0163 | REG_CDDOUTPUT | Byte | ? |
|
NEO-MGA | ||||||||||||||||||||||||||||||||||||
$FF0165 | REG_CDDCTRL | Byte | ? |
|
NEO-MGA | ||||||||||||||||||||||||||||||||||||
$FF0167 | REG_CDDSTAT | Byte | CD drive status lines.
|
|
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.
| |||||||||||||||||||||||||||||||||||
$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
|
? | ||||||||||||||||||||||||||||||||||
$FF0108 | ? | Word | ? | CDM3-2 BIOS writes $5555 | ? | ||||||||||||||||||||||||||||||||||
$FF010C | ? | Word | ? | CDM3-2 BIOS writes $5555 and reads | ? | ||||||||||||||||||||||||||||||||||
$FF011C | REG_CDCONFIG | Word |
|
? | 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 ? | ? |