|
|
Line 2: |
Line 2: |
|
| |
|
| '''iNES Mapper 005''' refers to [[ExROM]] boards, which use the [[MMC5]] mapper. | | '''iNES Mapper 005''' refers to [[ExROM]] boards, which use the [[MMC5]] mapper. |
|
| |
| Many ExROM games have more than one 8 KB page of PRG RAM. Byte 8 of the [[iNES#.NES format|file's header]] should indicate how many pages are present, but ROM images in the wild that use this mapper may not have byte 8 set correctly.
| |
|
| |
| Here are Disch's original notes:
| |
| ========================
| |
| = Mapper 005 =
| |
| ========================
| |
|
| |
| aka
| |
| --------------------------
| |
| MMC5
| |
| ExROM
| |
|
| |
|
| |
|
| |
| Example Games:
| |
| --------------------------
| |
| Castlevania 3
| |
| Just Breed
| |
| Uncharted Waters
| |
| Romance of the 3 Kingdoms 2
| |
| Laser Invasion
| |
| Metal Slader Glory
| |
| Uchuu Keibitai SDF
| |
| Shin 4 Nin Uchi Mahjong - Yakuman Tengoku
| |
| Bandit Kings of Ancient China
| |
|
| |
| Test ROM Notes:
| |
| ---------------------------
| |
| - Bandit Kings of Ancient China writes PRG-RAM through the $8000+ ROM area. Failure to emulate this causes
| |
| corruption when the background is restored on the world map.
| |
| - Uchuu Keibitai SDF is the only known game to use split screen mode (during the intro, where it shows ship
| |
| stats)
| |
| - Shin 4 Nin Uchi Mahjong uses the extra PCM channel ($5011) as well as the other extra sound
| |
| - Uncharted Waters does PRG-RAM swapping
| |
| - Just Breed uses ExAttribute mode everywhere, as well as the extra sound.
| |
|
| |
|
| |
| General Notes:
| |
| ---------------------------
| |
| MMC5 is the infamous juggernaut mapper. It does a whole slew of neat tricks, making it far more powerful
| |
| than any other mapper around. Though despite it's apparent complexity, it's suprisingly straightforward to
| |
| emulate (that doesn't mean it's easy, though).
| |
|
| |
| It's a shame that the only real games to use this mapper were a ton of really, really terrible Koei strategy
| |
| games. Such a waste.
| |
|
| |
|
| |
| RAM Notes:
| |
| ----------------------------
| |
| MMC5 can address up to 64k PRG-RAM! This is significantly more than the usual 8k. When emulating, it's
| |
| easiest just to give MMC5 games a full 64k, since the header doesn't really provide a decent way to indicate
| |
| how much PRG-RAM actually exists.
| |
|
| |
| In addition to PRG-RAM, the MMC5 itself has a full 1k of 'ExRAM' which can be accessed by both the CPU and
| |
| PPU. This ExRAM can be used for many things... from plain vanilla WRAM, to an extra nametable, to a seperate
| |
| split screen, to extending normal attribute tables.
| |
|
| |
|
| |
| This document's organization:
| |
| ---------------------------
| |
| Since there are so many registers for this mapper, and it has so many features, registers will be listed and
| |
| outlined as the features are explained... and the overall registers section will be extremely brief --
| |
| serving primarily as a very quick reference or checklist.
| |
|
| |
| Misc Modes and Setup:
| |
| ---------------------------
| |
|
| |
| $5102: [.... ..AA] PRG-RAM Protect A
| |
| $5103: [.... ..BB] PRG-RAM Protect B
| |
| To allow writing to PRG-RAM you must set these regs to the following values:
| |
| A=%10
| |
| B=%01
| |
| Any other values will prevent PRG-RAM writing.
| |
|
| |
| $5104: [.... ..XX] ExRAM mode
| |
| %00 = Extra Nametable mode ("Ex0")
| |
| %01 = Extended Attribute mode ("Ex1")
| |
| %10 = CPU access mode ("Ex2")
| |
| %11 = CPU read-only mode ("Ex3")
| |
|
| |
|
| |
| CHR Setup:
| |
| ---------------------------
| |
| The MMC5 has two sets of CHR regs. One set is used for sprites, the other is used for BG. The MMC5
| |
| carefully watches what tiles are being fetched and when (or has some other way of syncing with the NES
| |
| somehow), which allows it to tell when the NES is fetching BG tiles, and when it's fetching sprite tiles.
| |
| As such, it can use different regs accordingly, allowing games to basically have 12k of CHR "active" at once
| |
| instead of the usual 8k! This means you can have a full 512 tiles exclusively for sprites, and have an
| |
| additional 256 tiles for the BG!
| |
|
| |
| CHR Mode Select Reg:
| |
| $5101: [.... ..CC]
| |
| %00 = 8k Mode
| |
| %01 = 4k Mode
| |
| %10 = 2k Mode
| |
| %11 = 1k Mode
| |
|
| |
| 'High' CHR Reg:
| |
| $5130 [.... ..HH] (see below)
| |
|
| |
| 'A' Regs:
| |
| $5120 - $5127
| |
| 'B' Regs:
| |
| $5128 - $512B
| |
|
| |
| When in 8x16 sprite mode, both sets of registers are used. The 'A' set is used for sprite tiles, and the
| |
| 'B' set is used for BG. This makes it so that sprites can have a full 8k of CHR available, without having
| |
| to share any of the tiles with the BG (since the BG uses it's own 4k of CHR, designated by the 'B' set). It
| |
| is unsure what you will get when reading CHR via $2007.
| |
|
| |
| When in 8x8 sprite mode, only one set is used for both BG and sprites. Either 'A' or 'B', depending on which
| |
| set is written to last. If 'B' is used, $1000-1FFF always mirrors $0000-0FFF (making the 'B' set pretty
| |
| worthless with 8x8 sprites)
| |
|
| |
|
| |
| 'A' Set (sprites):
| |
| $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00
| |
| +---------------------------------------------------------------+
| |
| C=%00: | $5127 |
| |
| +---------------------------------------------------------------+
| |
| C=%01: | $5123 | $5127 |
| |
| +-------------------------------+-------------------------------+
| |
| C=%10: | $5121 | $5123 | $5125 | $5127 |
| |
| +---------------+---------------+---------------+---------------+
| |
| C=%11: | $5120 | $5121 | $5122 | $5123 | $5124 | $5125 | $5126 | $5127 |
| |
| +-------+-------+-------+-------+-------+-------+-------+-------+
| |
|
| |
| 'B' Set (BG):
| |
| $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00
| |
| +-------------------------------+
| |
| C=%00: | $512B* |
| |
| +-------------------------------+
| |
| C=%01: | $512B |
| |
| +-------------------------------+ $1xxx always mirrors $0xxx
| |
| C=%10: | $5129 | $512B |
| |
| +---------------+---------------+
| |
| C=%11: | $5128 | $5129 | $512A | $512B |
| |
| +-------+-------+-------+-------+
| |
|
| |
| * $512B in 8k mode is an 8k page number, but only the first half of the 8k page is used.
| |
|
| |
| (It is not clear that the above is always true. It seems that neither nintendulator nor fceux actually obey this, and some demos fail if this behavior is emulated. A proposed revision would be as follows: )
| |
|
| |
| 'B' Set (BG):
| |
| $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00
| |
| +-------------------------------+-------------------------------+
| |
| C=%00: | $512B |
| |
| +-------------------------------+-------------------------------+
| |
| C=%01: | $512B | $512B |
| |
| +-------------------------------+-------------------------------+
| |
| C=%10: | $5129 | $512B | $5129 | $512B |
| |
| +---------------+---------------+---------------+---------------+
| |
| C=%11: | $5128 | $5129 | $512A | $512B | $5128 | $5129 | $512A | $512B |
| |
| +-------+-------+-------+-------+-------+-------+-------+-------+
| |
|
| |
| Note that unlike most other mappers, these CHR pages are in *actual* sizes. IE: when in 4k mode, registers
| |
| contain 4k page numbers. But when in 2k mode, register contain 2k page numbers.
| |
|
| |
| CHR Regs are actually 10 bits wide, not just 8. When you write to the regs, the value written is the low 8
| |
| bits, and the high 2 bits are copied from $5130. Example:
| |
|
| |
| LDA #$00
| |
| STA $5130 ; high bits = 0
| |
| LDA #$20
| |
| STA $5127 ; $5127 now = $020
| |
|
| |
| LDA #$02
| |
| STA $5130
| |
| LDA #$41
| |
| STA $5123 ; $5123 now = $241
| |
| ; and $5127 still = $020 (not $220)
| |
|
| |
| $5130 has an additional role in ExAttribute mode.
| |
|
| |
|
| |
|
| |
| PRG/RAM Setup:
| |
| ---------------------------
| |
|
| |
|
| |
| $5100: [.... ..PP] PRG Mode Select:
| |
| %00 = 32k
| |
| %01 = 16k
| |
| %10 = 16k+8k
| |
| %11 = 8k
| |
|
| |
| $5113: [.... .PPP] (simplified, but technically inaccurate -- see below)
| |
| 8k PRG-RAM page @ $6000
| |
|
| |
| $5114-5117: [RPPP PPPP]
| |
| R = ROM select (0=select RAM, 1=select ROM) **unused in $5117**
| |
| P = PRG page
| |
|
| |
| The high bit allows the game to select between ROM and RAM. This allows the game to put PRG-RAM anywhere
| |
| between $6000-DFFF (but no higher, since $5117 always selects ROM)
| |
|
| |
| Only RAM can be swapped to $6000-7FFF.
| |
| $5117 always selects ROM, never RAM (ROM always at $E000-FFFF).
| |
|
| |
| $6000 $8000 $A000 $C000 $E000
| |
| +-------+-------------------------------+
| |
| P=%00: | $5113 | <<$5117>> |
| |
| +-------+-------------------------------+
| |
| P=%01: | $5113 | <$5115> | <$5117> |
| |
| +-------+---------------+-------+-------+
| |
| P=%10: | $5113 | <$5115> | $5116 | $5117 |
| |
| +-------+---------------+-------+-------+
| |
| P=%11: | $5113 | $5114 | $5115 | $5116 | $5117 |
| |
| +-------+-------+-------+-------+-------+
| |
|
| |
|
| |
| Technically, $5113 should look something like:
| |
| [.... .CPP]
| |
| C = Chip select
| |
| P = 8k PRG-RAM page on selected chip
| |
|
| |
| MMC5 can address two seperate RAM chips, each up to 32k in size.
| |
|
| |
| This detail can impact how RAM is mirrored across pages if the chip sizes are less than 32k. For example,
| |
| Uncharted Waters has two 8k chips (only 16k total -- but on two seperate chips), so it uses selects pages
| |
| $00 and $04, rather than $00 and $01 like you may expect. This is because bit 2 is the chip select, and
| |
| the 8k on each chip is mirrored to every page on that chip... that is... $00-$03 would all select the first
| |
| 8k.
| |
|
| |
| Note that no commercial games rely on this mirroring -- therefore you can take the easy way out and simply give
| |
| all MMC5 games 64k PRG-RAM.
| |
|
| |
|
| |
| Mirroring:
| |
| ---------------------------
| |
| $5105: [DDCC BBAA]
| |
|
| |
|
| |
| MMC5 allows each NT slot to be configured:
| |
| [ A ][ B ]
| |
| [ C ][ D ]
| |
|
| |
| Values can be the following:
| |
| %00 = NES internal NTA
| |
| %01 = NES internal NTB
| |
| %10 = use ExRAM as NT
| |
| %11 = Fill Mode
| |
|
| |
|
| |
| For example... some typical mirroring setups would be:
| |
| ( D C B A)
| |
| Horz: $50 (%01 01 00 00)
| |
| Vert: $44 (%01 00 01 00)
| |
| 1ScA: $00 (%00 00 00 00)
| |
| 1ScB: $55 (%01 01 01 01)
| |
|
| |
|
| |
| ExRAM can act as a 3rd nametable here... but only in Ex0 or Ex1 (see $5104 above). If in Ex2 or Ex3, the PPU
| |
| will get $00 when it attempts to read from the nametable. Note that while ExRAM can be used as a nametable
| |
| in Ex1, it's probably a bad idea, since ExRAM is also used for Extended attributes in that mode. Therefore,
| |
| when using ExRAM as a nametable, you should stick to Ex0.
| |
|
| |
| Fill Mode is a virtual nametable. It is not a full nametable, but rather, as the PPU attempts to read it,
| |
| the MMC5 will feed it a specific tile -- thus appearing as though there's a full nametable filled with a
| |
| single tile. The tile can be configured by the game with the following regs:
| |
|
| |
| $5106: [TTTT TTTT] Fill Tile
| |
| $5107: [.... ..AA] Fill Attribute bits
| |
|
| |
|
| |
|
| |
| Extended Attribute Mode:
| |
| ---------------------------
| |
| When in Ex1 mode (see $5104 above), ordinary attribute tables and BG CHR regs are ignored, and instead, each
| |
| byte in ExRAM coresponds with an onscreen tile, and assigns that tile a 4k CHR page (allowing you to choose
| |
| from 16k tiles instead of 256) and its own attribute bits (allowing each 8x8 tile to have it's own palette,
| |
| rather than having the normal 16x16 blocks).
| |
|
| |
| Bytes in ExRAM:
| |
| [AACC CCCC]
| |
| A = Attribute bits
| |
| C = 4k CHR Page
| |
|
| |
| Additionally... $5130 is used directly as the high 2 bits of CHR for every on-screen BG tile when in this
| |
| mode. It effectively selects a 256k block for BG to use (in addition to its normal use with CHR swapping).
| |
| $5130's runtime value affects all BG tiles, therefore changing $5130 will immediately swap all on-screen BG
| |
| when in this mode. Therefore, if/when you change $5130 to swap CHR for sprites, you must write to $5130
| |
| again with the desired value for the BG.
| |
|
| |
| Sprites are unaffected by this mode and still use the normal CHR regs.
| |
|
| |
| Which tile uses which byte in ExRAM depends on its position in the nametable. Scrolling is irrelevent. The
| |
| tile at $2000 always uses the first byte in ExRAM, $2001 uses the second, etc. $2400, $2800, and $2C00 also
| |
| use the first byte of ExRAM.
| |
|
| |
|
| |
| CPU Accessing ExRAM:
| |
| ---------------------------
| |
| ExRAM can be accessed by the CPU via $5C00-$5FFF. Whether or not you can read or write depends on the
| |
| current mode (see $5104):
| |
|
| |
| Mode Readable Writable
| |
| -------------------------
| |
| Ex0 no *
| |
| Ex1 no *
| |
| Ex2 yes yes
| |
| Ex3 yes no
| |
|
| |
| In Ex0 and Ex1, ExRAM can only be written DURING RENDERING (insane, I know). If a game attempts to write
| |
| outside of rendering, $00 is written instead of the desired value. Writes have absolutely no effect in Ex3.
| |
|
| |
| Attempting to read when not readable will return open bus.
| |
|
| |
|
| |
|
| |
|
| |
| 8 * 8 -> 16 Multiplier:
| |
| ---------------------------
| |
| MMC5 has a nifty multiplier, similar to the SNES's.
| |
|
| |
| on write:
| |
| $5205: multiplicand
| |
| $5206: multiplier
| |
|
| |
| on read:
| |
| $5205: low 8 bits of product
| |
| $5206: high 8 bits of product
| |
|
| |
| Basic functionality is, you write two values you want multiplied to $5205 and $5206, then read the product
| |
| back. Multiplication is unsigned. There is no noticable delay -- that is, the product can be read back
| |
| right after writing.
| |
|
| |
|
| |
|
| |
|
| |
| Split Screen:
| |
| ---------------------------
| |
| A unique feature to MMC5 is its ability to split the screen vertically down the middle. However due to some
| |
| limitations that couldn't be avoided, it ended up not being that useful of a feature.
| |
|
| |
| Note: Split screen mode is only allowed in Ex0 or Ex1. When in Ex2 and Ex3, it is always disabled. I do
| |
| not know whether or not the split is affected by Extended Attributes when in Ex1. Judging by the $5202, I
| |
| would assume it isn't, but that's a total guess.
| |
|
| |
| $5200: [ER.T TTTT] Split control
| |
| E = Enable (0=split mode disabled, 1=split mode enabled)
| |
| R = Right side (0=split will be on left side, 1=split will be on right)
| |
| T = tile number to split at
| |
|
| |
| $5201: [YYYY YYYY] Split Y scroll
| |
|
| |
| $5202: [CCCC CCCC] 4k CHR Page for split
| |
|
| |
|
| |
| 34 BG tiles are fetched per scanline. MMC5 performs the split by watching which BG tile is being fetched,
| |
| and if it is within the split region, replacing the normal NT data with the split screen data according to
| |
| the absolute screen position of the tile (i.e., ignoring the coarse horizontal and vertical scroll output
| |
| as part of the VRAM address for the fetch). Since it operates on a per-tile basis... fine horizontal
| |
| scrolling "carries into" the split region. Setting the horizontal scroll to 1-7 will result in the split
| |
| being moved to the left 1-7 pixels, however when you scroll to 8, the split will "snap" back to its normal
| |
| position.
| |
|
| |
|
| |
| Left Split:
| |
| Tiles 0 to T-1 are the split.
| |
| Tiles T and on are rendered normally.
| |
|
| |
| Right Split:
| |
| Tiles 0 to T-1 are rendered normally.
| |
| Tiles T and on are the split.
| |
|
| |
|
| |
| There is no coarse horizontal scrolling of any kind for the split. Right-side splits will always show the
| |
| right-hand side of the nametable, and left-hand splits will always show the left-hand side of the nametable.
| |
| Coarse horizontal scrolling can still be used for the non-split region.
| |
|
| |
| ExRAM is always used as the nametable in split screen mode.
| |
|
| |
| Vertical scrolling for the split operates like normal vertical scrolling. 0-239 are valid scroll values,
| |
| whereas 240-255 will display Attribute table data as NT data for the first few scanlines. The split nametable
| |
| will wrap so that the top of the nametable will appear below as you scroll (just as if vertical mirroring
| |
| were employed).
| |
|
| |
| $5202 selects (yet another) CHR page to use for the BG. This page is used for the split region only.
| |
|
| |
|
| |
|
| |
|
| |
| IRQ Operation:
| |
| ---------------------------
| |
| MMC5 has a scanline counter for IRQs, however it is significantly more sophisticated than MMC3's, and doesn't
| |
| suffer from the same restrictions. It is also a bit easier to use.
| |
|
| |
| Write:
| |
| $5203: [IIII IIII] IRQ Target
| |
| $5204: [E... ....] IRQ Enable (0=disabled, 1=enabled)
| |
|
| |
| Read:
| |
| $5204: [PI.. ....]
| |
| P = IRQ currently pending
| |
| I = "In Frame" signal
| |
|
| |
| Reading $5204 will clear the pending flag (acknowledging the IRQ).
| |
|
| |
|
| |
|
| |
| Basic operation:
| |
| 1) Write the desired scanline number to $5203
| |
| 2) Enable IRQs by setting $5204.7
| |
|
| |
| IRQ will then trip on the given scanline number (provided PPU rendering is enabled). The only thing to
| |
| note here is that this behavior changes drastically if you turn the PPU off mid-frame... and that an IRQ will
| |
| never occur when the target scanline number is 0 or greater than (?or equal to?) $F0.
| |
|
| |
| The "In Frame" signal will read back as set when the PPU is rendering (during scanlines 0-239). Though
| |
| it's actual behavior and how it interacts with the IRQ counter is a bit more complex.
| |
|
| |
|
| |
|
| |
| Detailed Operation:
| |
|
| |
| The IRQ counter is an up counter, rather than a down counter (like MMC3). Every time the MMC5 detects a
| |
| scanline, it does the following:
| |
|
| |
| - If In Frame Signal is clear...
| |
| a) Set In Frame signal
| |
| b) Reset IRQ counter to 0
| |
| c) Clear IRQ pending flag (automatically acknowledging IRQ)
| |
|
| |
| - otherwise...
| |
| a) Increment IRQ counter
| |
| b) If IRQ counter now equals the trigger value, raise IRQ pending flag
| |
|
| |
| Note that the IRQ pending flag is raised *regardless* of whether or not IRQs are enabled. However, this will
| |
| only trigger an IRQ on the 6502 if both this flag *and* the IRQ enable flag is set. Therefore IRQs must
| |
| still be enabled for this to have an effect, however the pending flag can still be read back as set via $5204
| |
| even when IRQs are disabled.
| |
|
| |
| Also note that the IRQ counter is compared after it is incremented. This is why a trigger value of 0 will
| |
| never trigger an IRQ.
| |
|
| |
| At any time when the MMC5 detects that the PPU is inactive, the In Frame signal is automatically cleared.
| |
| The MMC5 will detect this after rendering for the frame is complete, and as soon as the PPU is turned off via
| |
| $2001. This is why turning off the PPU mid-frame will disrupt IRQs -- since the In Frame signal being
| |
| cleared will reset the IRQ counter next scanline.
| |
|
| |
| HOW the MMC5 detects scanlines is still unknown. One theory is that it looks for the two dummy nametable
| |
| fetches at the end of the scanline. Or perhaps it counts the number of fetches the PPU performs. Nobody
| |
| knows for sure.
| |
|
| |
| The IRQ will trip at the *start* of the desired scanline. Or, more precisely, near the very end of the
| |
| previous scanline (closest I can figure is dot 336). That is... if the trigger line is set to 1, the IRQ
| |
| will trip on dot 336 of scanline 0.
| |
|
| |
| I am unsure whether or not the last rendered scanline (239) is detected by the MMC5. I would assume it is,
| |
| which would mean a trigger value of $F0 would trip an IRQ at the end of rendering. Trigger values above $F0
| |
| will never be reached, since rendering stops before then, and the in-frame signal would automatically clear.
| |
|
| |
|
| |
|
| |
|
| |
| Sound:
| |
| ---------------------------
| |
| The MMC5 also has 3 additional sound channels! (Will the list of features ever stop?!?!). Unfortunately,
| |
| due to the NES being dumbed down, these can only be heard on a Famicom (or a modified NES).
| |
|
| |
| There are 2 additional Pulse channels, and 1 additional PCM channel.
| |
|
| |
| Registers for them are as follows:
| |
|
| |
| Write:
| |
| $5000-5003: Regs for Pulse 1
| |
| $5004-5007: Regs for Pulse 2
| |
| $5010: PCM Unknown (no games use this part of the PCM)
| |
| $5011: PCM output
| |
| $5015: [.... ..BA] Enable flags for Pulse 1 (A), 2 (B) (0=disable, 1=enable)
| |
|
| |
| Read:
| |
| $5015 [.... ..BA] Length status for Pulse 1 (A), 2 (B)
| |
|
| |
|
| |
| Pulse channels behave identically to the native NES pulse channels, only they lack a sweep unit. Rather than
| |
| going into details on their function, I recommend you pick up blargg's apu reference.
| |
|
| |
| $5000-5007 operate just as $4000-4007 do
| |
| $5015 operates just as $4015 does (for reads and writes)
| |
|
| |
|
| |
| Nobody knows exactly how the PCM channel of the MMC5 works. The patent documentation is unclear, and no
| |
| games seem to use it apart from $5011. $5010 likely does *something*... but nobody knows what.
| |
|
| |
| $5011 operates exactly like $4011, only it is 8 bits wide instead of 7. Games *do* use this register to
| |
| output sound.
| |
|
| |
|
| |
| Powerup:
| |
| ---------------------------
| |
| Games seem to expect $5117 to be $FF on powerup (last PRG page swapped in). Additionally, Romance of the 3
| |
| Kingdoms 2 seems to expect it to be in 8k PRG mode ($5100 = $03).
| |
|
| |
|
| |
|
| |
| Register Overview:
| |
| ---------------------------
| |
| Due to the massive number of registers on this mapper, this section will be brief. Registers were all
| |
| covered in detail in the sections above -- this is just to recap them all:
| |
|
| |
|
| |
| Writable Regs:
| |
| $5000-5003: Sound, Pulse 1
| |
| $5004-5007: Sound, Pulse 2
| |
| $5010-5011: Sound, PCM
| |
| $5015: Sound, General
| |
| $5100: PRG Mode Select
| |
| $5101: CHR Mode Select
| |
| $5102-5103: PRG-RAM Write protect
| |
| $5104: ExRAM Mode
| |
| $5105: Mirroring Mode
| |
| $5106: Fill Tile
| |
| $5107: Fill Attribute
| |
| $5113: PRG-RAM reg
| |
| $5114-5117: PRG regs
| |
| $5120-5127: CHR regs 'A'
| |
| $5128-512B: CHR regs 'B'
| |
| $5130: CHR high bits
| |
| $5200: Split Screen control
| |
| $5201: Split Screen V Scroll
| |
| $5202: Split Screen CHR Page
| |
| $5203: IRQ Trigger
| |
| $5204: IRQ Control
| |
| $5205-5206: 8*8->16 Multiplier
| |
| $5C00-5FFF: ExRAM CPU Access
| |
|
| |
|
| |
| Readable Regs:
| |
| $5015: Sound Status
| |
| $5204: IRQ Status
| |
| $5205-5206: 8*8->16 Multiplier Product
| |
| $5C00-5FFF: ExRAM CPU Access
| |