User:Zzo38/Mapper D: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
No edit summary
(userspace mapper drafts should not use mainspace categories)
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
This mapper is designed to be possible to write a game that can run on both this mapper and the [[MMC5]], even though most of the features of MMC5 aren't needed.
This mapper is designed to be possible to write a game that can run on both this mapper and the [[MMC5]], even though most of the features of MMC5 aren't needed.
(The main reason for inventing this is so that a game can be written using 64K RAM and 256K ROM, can be emulated using existing emulators without modifying it, and can be easily made into a cartridge using discrete logic components.)


==Registers==
==Registers==
There are two (write-only) registers, and the address of the registers is as follows:
There are two (write-only) registers. Canonically they're mapped at $5113 and $5115, but they respond to writes at any address matching this pattern:
  [..01 .... .... .?..]
  [..01 .... .... .?..]
Where the question mark selects the register.
Where the question mark selects the register.
There will be bus conflicts if you write the register using the addresses which are in the ROM ($9000-$9FFF or $D000-$DFFF), and writes to mirrors of internal RAM at $1000-$1FFF also trigger this register (you shouldn't ordinarily do this).


Register 0 is the RAM bank register. All the bits are used to select a 8K RAM bank at $6000-$7FFF. (Assume 64K RAM if the [[NES 2.0]] header isn't present.)
=== $5113: PRG RAM bank ===
Register 0 is the RAM bank register. All the bits are used to select a 8K RAM bank at $6000-$7FFF. (According to Disch's notes, assume 64K RAM if the [[NES 2.0]] header isn't present.)


=== $5115: PRG ROM bank ===
Register 1 is the ROM bank register. All bits except for the highest and lowest bit select a 16K ROM bank at $8000-$BFFF.
Register 1 is the ROM bank register. All bits except for the highest and lowest bit select a 16K ROM bank at $8000-$BFFF.
 
<pre>
The last PRG ROM bank is fixed at $C000-$FFFF.
7654 3210
 
|||| ||||
There will be bus conflicts if you write the register using the addresses which are in the ROM, so don't do that.
|||| |||+- Always 0
|+++-+++-- Select 16K PRG ROM bank at $8000-$BFFF
+--------- Always 1
</pre>


==Using MMC5 as this mapper==
==Using MMC5 as this mapper==
Line 31: Line 39:


In addition, you shouldn't write to $1000-$1FFF since that is both RAM and registers in this mapper, but is RAM only for MMC5; it mirrors the $0000-$07FF RAM internally in the console unit but due to this reason, don't try to write to there.
In addition, you shouldn't write to $1000-$1FFF since that is both RAM and registers in this mapper, but is RAM only for MMC5; it mirrors the $0000-$07FF RAM internally in the console unit but due to this reason, don't try to write to there.
{{DEFAULTSORT:Zzo38 Mapper D}}
<!-- [[Category:Discrete logic mappers]][[Category:Mappers with large PRG RAM]] -->

Latest revision as of 01:38, 23 March 2018

This mapper is designed to be possible to write a game that can run on both this mapper and the MMC5, even though most of the features of MMC5 aren't needed.

(The main reason for inventing this is so that a game can be written using 64K RAM and 256K ROM, can be emulated using existing emulators without modifying it, and can be easily made into a cartridge using discrete logic components.)

Registers

There are two (write-only) registers. Canonically they're mapped at $5113 and $5115, but they respond to writes at any address matching this pattern:

[..01 .... .... .?..]

Where the question mark selects the register. There will be bus conflicts if you write the register using the addresses which are in the ROM ($9000-$9FFF or $D000-$DFFF), and writes to mirrors of internal RAM at $1000-$1FFF also trigger this register (you shouldn't ordinarily do this).

$5113: PRG RAM bank

Register 0 is the RAM bank register. All the bits are used to select a 8K RAM bank at $6000-$7FFF. (According to Disch's notes, assume 64K RAM if the NES 2.0 header isn't present.)

$5115: PRG ROM bank

Register 1 is the ROM bank register. All bits except for the highest and lowest bit select a 16K ROM bank at $8000-$BFFF.

7654 3210
|||| ||||
|||| |||+- Always 0
|+++-+++-- Select 16K PRG ROM bank at $8000-$BFFF
+--------- Always 1

Using MMC5 as this mapper

If you want to write a program which works both with MMC5 and with the mapper described here, there are a few things to do.

One is to initialize the MMC5 registers. All initializations must be in the last 8K bank at $E000-$FFFF. The assignments listed below should work (I hope):

  • $5100: $01
  • $5101: $00
  • $5102: $01
  • $5103: $02
  • $5105: Set according to mirroring bit in header
  • $5200: $00
  • $5204: $00

Now when writing to the registers of this mapper, you must use:

  • $5113 for accessing register 0
  • $5115 for accessing register 1, and the high bit of the data must be set

In addition, you shouldn't write to $1000-$1FFF since that is both RAM and registers in this mapper, but is RAM only for MMC5; it mirrors the $0000-$07FF RAM internally in the console unit but due to this reason, don't try to write to there.