<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tauwasser.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tauwasser</id>
	<title>Tauwasser's Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tauwasser.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tauwasser"/>
	<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/view/Special:Contributions/Tauwasser"/>
	<updated>2026-05-27T17:01:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=153</id>
		<title>Sachen MMC1</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=153"/>
		<updated>2021-08-19T20:34:14Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Categorize into DMG as this page is apparently hard to find.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC1 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinouts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;350px&amp;quot; heights=&amp;quot;400px&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Image:Sachen MMC1 Pinout.png&lt;br /&gt;
Image:Sachen MMC1 Rom Pinout.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1+ROM&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 5%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 45%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|1, 36&lt;br /&gt;
|1&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|21, 35&lt;br /&gt;
|17&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|7&amp;amp;ndash;8, 26&lt;br /&gt;
|GND?&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply or unused pin.&lt;br /&gt;
|-&lt;br /&gt;
|18&amp;amp;ndash;20, 22&amp;amp;ndash;26&lt;br /&gt;
|14&amp;amp;ndash;16, 18&amp;amp;ndash;22&lt;br /&gt;
|D0&amp;amp;ndash;D7&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|25&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|2&amp;amp;ndash;6, 32, 7, 28, 30, 9, 33&amp;amp;ndash;34, 27&lt;br /&gt;
|13&amp;amp;ndash;9, 6&amp;amp;ndash;4, 29&amp;amp;ndash;28, 24, 27, 3, 30&amp;amp;ndash;31, 23&lt;br /&gt;
|A0&amp;amp;ndash;A15&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|40&amp;amp;ndash;37&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA0, RA1, RA4, RA6&lt;br /&gt;
|O&lt;br /&gt;
|Scrambled lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA7&lt;br /&gt;
|O&lt;br /&gt;
|Lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31, 17&amp;amp;ndash;10&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA14&amp;amp;ndash;RA21&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|NC&lt;br /&gt;
|N/A&lt;br /&gt;
|Not connected.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC1 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC1 has two modes of operation ''locked'' and ''unlocked''. It defaults to ''locked'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG bootstrap ROM. While ''locked'', the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x31 transitions of A15 from high to low. Starting on the last transition, RA7 will follow A7. All control signals are don't cares for this.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register]] and [[#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are six high address lines, two more landing pads (not bonded) visible and I/O lines numbered (15 next to trace with 13 visible traces) on the 1231 PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
== Integrated ROM ==&lt;br /&gt;
&lt;br /&gt;
The integrated ROM behaves as a regular ROM chip that's connected to the An resp. RAn address and Dn data lines.&lt;br /&gt;
Depending on the bonded ROM smaller ROMs may have an additional low-active CE line on RA17 or RA18.&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=152</id>
		<title>Sachen MMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=152"/>
		<updated>2021-08-19T20:33:53Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Categorize into DMG as this page is apparently hard to find.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC2 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinouts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;350px&amp;quot; heights=&amp;quot;400px&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Image:Sachen MMC2 Pinout.png&lt;br /&gt;
Image:Sachen MMC2 Rom PinoutA.png&lt;br /&gt;
Image:Sachen MMC2 Rom PinoutB.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC2&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC2+ROM A (MMC2+ROM B)&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 5%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 45%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1, 36 (34)&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|21, 38&lt;br /&gt;
|32 (30)&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|(30&amp;amp;ndash;31)&lt;br /&gt;
|NC?&lt;br /&gt;
|N/A&lt;br /&gt;
|Unused pin.&lt;br /&gt;
|-&lt;br /&gt;
|6&amp;amp;ndash;5, 37&amp;amp;ndash;36, 27&amp;amp;ndash;26, 16&amp;amp;ndash;15&lt;br /&gt;
|21&amp;amp;ndash;28&lt;br /&gt;
|D0&amp;amp;ndash;D7&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|29&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|35&amp;amp;ndash;32, 28, 25, 31&amp;amp;ndash;29, 24&amp;amp;ndash;23, 20, 17&lt;br /&gt;
|5&amp;amp;ndash;20&lt;br /&gt;
|A0&amp;amp;ndash;A15&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|4&amp;amp;ndash;2, 40&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA0, RA1, RA4, RA6&lt;br /&gt;
|O&lt;br /&gt;
|Scrambled lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|39&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA7&lt;br /&gt;
|O&lt;br /&gt;
|Lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|14&amp;amp;ndash;7&lt;br /&gt;
|35 (33)&lt;br /&gt;
|RA14&amp;amp;ndash;RA21 resp. RA19&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|34&amp;amp;ndash;33 (32&amp;amp;ndash;31)&lt;br /&gt;
|OPT1&amp;amp;ndash;OPT2&lt;br /&gt;
|I (PD)&lt;br /&gt;
|Option Input Pins&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|NC&lt;br /&gt;
|N/A&lt;br /&gt;
|Not connected.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC2 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
Sachen added a detection method for Game Boy Color to successfully perform the logo switch, since the Game Boy Color changed the way the logo is checked.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC2 has three modes of operation ''locked DMG'', ''locked CGB'' and ''unlocked''. It defaults to ''locked DMG'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG and CGB bootstrap ROMs. Because the DMG bootstrap copies the logo first and checks after displaying it, while the CGB bootstrap checks first and only afterwards uses the actual logo, Sachen devised a mechanism to detect a CGB using the fact that the CGB bootstrap writes to WRAM, while the DMG bootstrap doesn't.&lt;br /&gt;
&lt;br /&gt;
While in ''locked DMG'' and ''unlocked'' modes, RA7 will follow A7. While in ''locked CGB'' mode, the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x30 transitions of A15 from low to high to go from ''locked DMG'' mode to ''locked CGB'' mode. Starting on the last transition, RA7 will remain set.&lt;br /&gt;
Going from ''locked CGB'' mode to ''unlocked'' mode requires another 0x30 transitions of A15 from low to high. Starting on the last transition, RA7 will follow A7 again.&lt;br /&gt;
The MMC2 mapper will skip directly from ''locked DMG'' mode to ''locked CGB'' on a rising edge of CS. The A15 transition counter is reset when changing from ''locked DMG'' to ''locked CGB'' mode.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''.&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register|#Base ROM Bank Register]] and [[#ROM bank mask register|#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are eight high address lines on the SA8MBT6-2 w/o BAT PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
== Integrated ROM ==&lt;br /&gt;
&lt;br /&gt;
The integrated ROM behaves as a regular ROM chip that's connected to the An resp. RAn address and Dn data lines.&lt;br /&gt;
ROM chip enable behavior is: &amp;lt;pre&amp;gt;#ROM_CS = A15 or RA20 or OPT2&amp;lt;/pre&amp;gt;&lt;br /&gt;
The highest address line (RA18) will behave as follows: &amp;lt;pre&amp;gt;RA18 = MMC1_RA18 or OPT1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=151</id>
		<title>MMM01</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=151"/>
		<updated>2019-09-15T14:54:28Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Separate MBC1 Mode #WE */ -- --&amp;gt; mdash&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 can be used to address up to 64&amp;amp;nbsp;Mbit of ROM and 1&amp;amp;nbsp;Mbit of SRAM depending on the mode MMM01 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MMM01 Pinout.png|center|x500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;11&lt;br /&gt;
|D6&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|13&amp;amp;ndash;15&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|16, 29, 27, 21&amp;amp;ndash;17, 22&lt;br /&gt;
|RA22&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|26&amp;amp;ndash;23&lt;br /&gt;
|AA16&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: QFP80P900X900-32&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. D6..D0, A15..A13, {{Overline|RD}}, {{Overline|WR}}, {{Overline|CS}} are internally pulled down with ~50&amp;amp;nbsp;kΩ&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \_________/&lt;br /&gt;
    |   |        \-------- RAM Enable&lt;br /&gt;
    |   \----------------- Ram Bank #WE AA14..AA13&lt;br /&gt;
    \--------------------- Map Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Enable''': A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
* '''RAM Bank #WE''': Low-Active Write-Enable lines for the two least-significant RAM bank bits in [[#RAM Bank Register]]. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
* '''Map Enable''': Setting this bit will disable write access to special register bits and disable the forced ROM Address line masking. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
   \___/ \____________/&lt;br /&gt;
     |           \-------- ROM Bank RA18..RA14&lt;br /&gt;
     \-------------------- ROM Bank RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''ROM Bank RA18..RA14''': These bits select the lower ROM address lines. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14 based only on bits not masked by ROM Bank #WE/Mask RA18..RA15 in [[#Mode Register]].&lt;br /&gt;
* '''ROM Bank RA20..RA19''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \___/ \___/&lt;br /&gt;
    |   |     |     \----- RAM Bank AA14..AA13&lt;br /&gt;
    |   |     \----------- RAM Bank AA16..AA15&lt;br /&gt;
    |   \----------------- ROM Bank RA22..RA21&lt;br /&gt;
    \--------------------- MBC1 Mode #WE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Bank AA14..AA13''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. The MBC1 mode settings still apply, see [[#Mode Register]].&lt;br /&gt;
* '''RAM Bank AA16..AA15''': These bits select the upper RAM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''ROM Bank RA22..RA21''': These bits select the upper ROM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''MBC1 Mode #WE''': Low-Active Write Enable for MBC1 Mode in [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \_________/  |  |&lt;br /&gt;
    |      |       |  \--- MBC1 Mode&lt;br /&gt;
    |      |       \------ Unknown&lt;br /&gt;
    |      \-------------- ROM Bank #WE/Mask RA18..RA15&lt;br /&gt;
    \--------------------- Multiplexer for AA14..AA13 and RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''MBC1 Mode''': Selects the MBC1 operating mode. 0 for 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode and 1 for 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. Can only be written when '''MBC1 Mode #WE''' in [[#RAM Bank Register]] is reset.&lt;br /&gt;
* '''Unknown''': Setting or resetting this bit had no observable effect.&lt;br /&gt;
* '''ROM Bank #WE/Mask RA18..RA15''': Low-Active Write-Enable for RA18..RA15 in [[#ROM Bank Register]] as well as mask for zero-adjusting RA18..RA15. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''Multiplexer''': The multiplexer will switch the bits output to pins AA14..AA13 and RA20..RA19. Barring MBC1 Mode logic: when reset, pins will be driven from register contents; when set, pins will be driven from the other register, i.e. RA20..RA19 will be driven by [[#RAM Bank Register]] and AA14..AA13 will be driven by [[#ROM Bank Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
Operating the MMM01 can be quite complex and the register contents are not straightforward. This section will detail the programming model and give example configurations.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 has two modes of operation ''mapped'' and ''unmapped''. It defaults to ''unmapped'' after reset.&lt;br /&gt;
&lt;br /&gt;
In ''unmapped'' state, the upper ROM address lines RA22..RA15 are all forced to 1, meaning the ROM entry point will be in ROM bank 0x1FE with the only other accessible ROM bank being 0x1FF.&lt;br /&gt;
&lt;br /&gt;
This is used to lock write access to the upper bits of the known [[MBC1]] registers after base ROM and RAM banks and masks have been set up.&lt;br /&gt;
&lt;br /&gt;
The only way to ''unmap'' the mapper after ''mapping'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Programming Model ==&lt;br /&gt;
&lt;br /&gt;
All registers are live, e.g. Setting the RAM Bank #WE bits and subsequently writing to RAM Bank AA14..AA13 won't work -- no matter if in ''mapped'' of ''unmapped'' state. Therefore, there is a certain order in which registers are optimally written:&lt;br /&gt;
&lt;br /&gt;
# ROM Bank Register&lt;br /&gt;
# Mode Register&lt;br /&gt;
# RAM Register&lt;br /&gt;
# RAM Enable&lt;br /&gt;
&lt;br /&gt;
Not all of Nintendo's games that use MMM01 keep with this order. However, due to the individual games' sizes and use of RAM banks, this isn't noticeable when the games don't misbehave.&lt;br /&gt;
&lt;br /&gt;
Most Rom Address line changes cannot be observed in ''unmapped'' mode due to the mapper starting at ROM bank 0x1FE and 0x1FF (depending on A14) until ''mapped''.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 0: 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;0&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (common) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (uncommon) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is probably not the intended use case.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Remarks =&lt;br /&gt;
&lt;br /&gt;
== Unknown Bit ==&lt;br /&gt;
&lt;br /&gt;
There is an Unknown bit in [[#Mode Register]] whose use -- if any -- could not be determined through testing. It is definitely not ROM Bank RA14 #WE as RA14 can be written at all times -- hence there cannot be a single bank mapped to both regions. It might be part of ROM Bank RA14 Mask and an Engineer might have missed that the zero-adjustment logic means that this bit is not necessary.&lt;br /&gt;
&lt;br /&gt;
== SRAM Enable/Disable ==&lt;br /&gt;
&lt;br /&gt;
The most glaringly missing feature of MMM01 is an option to disable SRAM access for individual games. The Unknown bit in [[#Mode Register]] does not provide for this either. The only commercial cartridge containing MMM01 and SRAM is Momotarou Collection 2 and it tries to sacrifice one SRAM bank to make sure that one game has no chance of deleting the other's save file. However, the PCB only has one 64 KiB SRAM and the RAM address lines are all unconnected.&lt;br /&gt;
&lt;br /&gt;
Having to spend 64&amp;amp;nbsp;kBit to ''disable'' SRAM access seems like a waste considering a simple OR-gate could have stopped SRAM access.&lt;br /&gt;
&lt;br /&gt;
== Separate MBC1 Mode #WE ==&lt;br /&gt;
&lt;br /&gt;
The MBC1 Mode #WE stands out as being separated from mapping logic. Instead, if its #WE is not deasserted, it can be freely written even in mapped mode. However, the address line multiplexing for 16&amp;amp;nbsp;Mbit and 4&amp;amp;nbsp;Mbit does not switch with the mode setting&amp;amp;mdash;which given a fixed ROM/SRAM wiring on the cartridge&amp;amp;mdash;would need to be done in order for a hypothetical 16&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit mode to be feasible.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MMM01 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(6 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(22 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(16 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MMM01;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MMM01 is&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r    : std_logic_vector(3 downto 0);&lt;br /&gt;
signal ram_bank_we_n_r : std_logic_vector(1 downto 0);&lt;br /&gt;
signal latch_r         : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_r      : std_logic_vector(8 downto 0);&lt;br /&gt;
signal ram_bank_r      : std_logic_vector(3 downto 0);&lt;br /&gt;
signal mode_we_n_r     : std_logic_vector(6 downto 6);&lt;br /&gt;
signal mode_r          : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_we_n_r : std_logic_vector(4 downto 1);&lt;br /&gt;
signal mux_r           : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_int          : std_logic_vector(4 downto 0);&lt;br /&gt;
signal aa_int          : std_logic_vector(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_lo           : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ra_mask         : std_logic_vector(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
alias rom_bank_r_lo : std_logic_vector(4 downto 0) is rom_bank_r(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A(15) = '0' and RD_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
ra_lo &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
         rom_bank_r_lo;&lt;br /&gt;
&lt;br /&gt;
ra_mask &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
           rom_bank_we_n_r &amp;amp; &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ra_int &amp;lt;= &amp;quot;00000&amp;quot; when (A(14) = '0') else&lt;br /&gt;
          ra_lo   when ((ra_lo and not(ra_mask)) /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
          &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
aa_int &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
          ram_bank_r(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
AA(16 downto 15) &amp;lt;= ram_bank_r(3 downto 2);&lt;br /&gt;
AA(14 downto 13) &amp;lt;= aa_int when (mux_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(22 downto 21) &amp;lt;= &amp;quot;11&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(8 downto 7);&lt;br /&gt;
&lt;br /&gt;
RA(20 downto 19) &amp;lt;= &amp;quot;11&amp;quot;   when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    aa_int when (mux_r = &amp;quot;1&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= (ra_lo and ra_mask) or (ra_int and not(ra_mask));&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
		ram_bank_we_n_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
		latch_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_we_n_r &amp;lt;= D(5 downto 4);&lt;br /&gt;
			latch_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(6 downto 0) &amp;lt;= &amp;quot;0000000&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(0) &amp;lt;= D(0);&lt;br /&gt;
		&lt;br /&gt;
		for i in rom_bank_we_n_r'range loop&lt;br /&gt;
			if (rom_bank_we_n_r(i) = '0') then&lt;br /&gt;
				rom_bank_r_lo(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			rom_bank_r(6 downto 5) &amp;lt;= D(6 downto 5);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		rom_bank_r(8 downto 7) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in ram_bank_we_n_r'range loop&lt;br /&gt;
			if (ram_bank_we_n_r(i) = '0') then&lt;br /&gt;
				ram_bank_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_r(3 downto 2) &amp;lt;= D(3 downto 2);&lt;br /&gt;
			rom_bank_r(8 downto 7) &amp;lt;= D(5 downto 4);&lt;br /&gt;
			mode_we_n_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
		rom_bank_we_n_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		mux_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in mode_we_n_r'range loop&lt;br /&gt;
			if (mode_we_n_r(i) = '0') then&lt;br /&gt;
				mode_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;1&amp;quot;) then&lt;br /&gt;
			rom_bank_we_n_r &amp;lt;= D(5 downto 2);&lt;br /&gt;
			mux_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=150</id>
		<title>MMM01</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=150"/>
		<updated>2019-09-15T14:53:22Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* SRAM Enable/Disable */ sp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 can be used to address up to 64&amp;amp;nbsp;Mbit of ROM and 1&amp;amp;nbsp;Mbit of SRAM depending on the mode MMM01 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MMM01 Pinout.png|center|x500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;11&lt;br /&gt;
|D6&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|13&amp;amp;ndash;15&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|16, 29, 27, 21&amp;amp;ndash;17, 22&lt;br /&gt;
|RA22&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|26&amp;amp;ndash;23&lt;br /&gt;
|AA16&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: QFP80P900X900-32&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. D6..D0, A15..A13, {{Overline|RD}}, {{Overline|WR}}, {{Overline|CS}} are internally pulled down with ~50&amp;amp;nbsp;kΩ&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \_________/&lt;br /&gt;
    |   |        \-------- RAM Enable&lt;br /&gt;
    |   \----------------- Ram Bank #WE AA14..AA13&lt;br /&gt;
    \--------------------- Map Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Enable''': A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
* '''RAM Bank #WE''': Low-Active Write-Enable lines for the two least-significant RAM bank bits in [[#RAM Bank Register]]. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
* '''Map Enable''': Setting this bit will disable write access to special register bits and disable the forced ROM Address line masking. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
   \___/ \____________/&lt;br /&gt;
     |           \-------- ROM Bank RA18..RA14&lt;br /&gt;
     \-------------------- ROM Bank RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''ROM Bank RA18..RA14''': These bits select the lower ROM address lines. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14 based only on bits not masked by ROM Bank #WE/Mask RA18..RA15 in [[#Mode Register]].&lt;br /&gt;
* '''ROM Bank RA20..RA19''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \___/ \___/&lt;br /&gt;
    |   |     |     \----- RAM Bank AA14..AA13&lt;br /&gt;
    |   |     \----------- RAM Bank AA16..AA15&lt;br /&gt;
    |   \----------------- ROM Bank RA22..RA21&lt;br /&gt;
    \--------------------- MBC1 Mode #WE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Bank AA14..AA13''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. The MBC1 mode settings still apply, see [[#Mode Register]].&lt;br /&gt;
* '''RAM Bank AA16..AA15''': These bits select the upper RAM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''ROM Bank RA22..RA21''': These bits select the upper ROM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''MBC1 Mode #WE''': Low-Active Write Enable for MBC1 Mode in [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \_________/  |  |&lt;br /&gt;
    |      |       |  \--- MBC1 Mode&lt;br /&gt;
    |      |       \------ Unknown&lt;br /&gt;
    |      \-------------- ROM Bank #WE/Mask RA18..RA15&lt;br /&gt;
    \--------------------- Multiplexer for AA14..AA13 and RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''MBC1 Mode''': Selects the MBC1 operating mode. 0 for 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode and 1 for 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. Can only be written when '''MBC1 Mode #WE''' in [[#RAM Bank Register]] is reset.&lt;br /&gt;
* '''Unknown''': Setting or resetting this bit had no observable effect.&lt;br /&gt;
* '''ROM Bank #WE/Mask RA18..RA15''': Low-Active Write-Enable for RA18..RA15 in [[#ROM Bank Register]] as well as mask for zero-adjusting RA18..RA15. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''Multiplexer''': The multiplexer will switch the bits output to pins AA14..AA13 and RA20..RA19. Barring MBC1 Mode logic: when reset, pins will be driven from register contents; when set, pins will be driven from the other register, i.e. RA20..RA19 will be driven by [[#RAM Bank Register]] and AA14..AA13 will be driven by [[#ROM Bank Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
Operating the MMM01 can be quite complex and the register contents are not straightforward. This section will detail the programming model and give example configurations.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 has two modes of operation ''mapped'' and ''unmapped''. It defaults to ''unmapped'' after reset.&lt;br /&gt;
&lt;br /&gt;
In ''unmapped'' state, the upper ROM address lines RA22..RA15 are all forced to 1, meaning the ROM entry point will be in ROM bank 0x1FE with the only other accessible ROM bank being 0x1FF.&lt;br /&gt;
&lt;br /&gt;
This is used to lock write access to the upper bits of the known [[MBC1]] registers after base ROM and RAM banks and masks have been set up.&lt;br /&gt;
&lt;br /&gt;
The only way to ''unmap'' the mapper after ''mapping'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Programming Model ==&lt;br /&gt;
&lt;br /&gt;
All registers are live, e.g. Setting the RAM Bank #WE bits and subsequently writing to RAM Bank AA14..AA13 won't work -- no matter if in ''mapped'' of ''unmapped'' state. Therefore, there is a certain order in which registers are optimally written:&lt;br /&gt;
&lt;br /&gt;
# ROM Bank Register&lt;br /&gt;
# Mode Register&lt;br /&gt;
# RAM Register&lt;br /&gt;
# RAM Enable&lt;br /&gt;
&lt;br /&gt;
Not all of Nintendo's games that use MMM01 keep with this order. However, due to the individual games' sizes and use of RAM banks, this isn't noticeable when the games don't misbehave.&lt;br /&gt;
&lt;br /&gt;
Most Rom Address line changes cannot be observed in ''unmapped'' mode due to the mapper starting at ROM bank 0x1FE and 0x1FF (depending on A14) until ''mapped''.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 0: 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;0&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (common) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (uncommon) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is probably not the intended use case.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Remarks =&lt;br /&gt;
&lt;br /&gt;
== Unknown Bit ==&lt;br /&gt;
&lt;br /&gt;
There is an Unknown bit in [[#Mode Register]] whose use -- if any -- could not be determined through testing. It is definitely not ROM Bank RA14 #WE as RA14 can be written at all times -- hence there cannot be a single bank mapped to both regions. It might be part of ROM Bank RA14 Mask and an Engineer might have missed that the zero-adjustment logic means that this bit is not necessary.&lt;br /&gt;
&lt;br /&gt;
== SRAM Enable/Disable ==&lt;br /&gt;
&lt;br /&gt;
The most glaringly missing feature of MMM01 is an option to disable SRAM access for individual games. The Unknown bit in [[#Mode Register]] does not provide for this either. The only commercial cartridge containing MMM01 and SRAM is Momotarou Collection 2 and it tries to sacrifice one SRAM bank to make sure that one game has no chance of deleting the other's save file. However, the PCB only has one 64 KiB SRAM and the RAM address lines are all unconnected.&lt;br /&gt;
&lt;br /&gt;
Having to spend 64&amp;amp;nbsp;kBit to ''disable'' SRAM access seems like a waste considering a simple OR-gate could have stopped SRAM access.&lt;br /&gt;
&lt;br /&gt;
== Separate MBC1 Mode #WE ==&lt;br /&gt;
&lt;br /&gt;
The MBC1 Mode #WE stands out as being separated from mapping logic. Instead, if its #WE is not deasserted, it can be freely written even in mapped mode. However, the address line multiplexing for 16&amp;amp;nbsp;Mbit and 4&amp;amp;nbsp;Mbit does not switch with the mode setting -- which given a fixed ROM/SRAM wiring on the cartridge -- would need to be done in order for a hypothetical 16&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit mode to be feasible.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MMM01 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(6 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(22 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(16 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MMM01;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MMM01 is&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r    : std_logic_vector(3 downto 0);&lt;br /&gt;
signal ram_bank_we_n_r : std_logic_vector(1 downto 0);&lt;br /&gt;
signal latch_r         : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_r      : std_logic_vector(8 downto 0);&lt;br /&gt;
signal ram_bank_r      : std_logic_vector(3 downto 0);&lt;br /&gt;
signal mode_we_n_r     : std_logic_vector(6 downto 6);&lt;br /&gt;
signal mode_r          : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_we_n_r : std_logic_vector(4 downto 1);&lt;br /&gt;
signal mux_r           : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_int          : std_logic_vector(4 downto 0);&lt;br /&gt;
signal aa_int          : std_logic_vector(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_lo           : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ra_mask         : std_logic_vector(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
alias rom_bank_r_lo : std_logic_vector(4 downto 0) is rom_bank_r(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A(15) = '0' and RD_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
ra_lo &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
         rom_bank_r_lo;&lt;br /&gt;
&lt;br /&gt;
ra_mask &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
           rom_bank_we_n_r &amp;amp; &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ra_int &amp;lt;= &amp;quot;00000&amp;quot; when (A(14) = '0') else&lt;br /&gt;
          ra_lo   when ((ra_lo and not(ra_mask)) /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
          &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
aa_int &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
          ram_bank_r(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
AA(16 downto 15) &amp;lt;= ram_bank_r(3 downto 2);&lt;br /&gt;
AA(14 downto 13) &amp;lt;= aa_int when (mux_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(22 downto 21) &amp;lt;= &amp;quot;11&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(8 downto 7);&lt;br /&gt;
&lt;br /&gt;
RA(20 downto 19) &amp;lt;= &amp;quot;11&amp;quot;   when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    aa_int when (mux_r = &amp;quot;1&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= (ra_lo and ra_mask) or (ra_int and not(ra_mask));&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
		ram_bank_we_n_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
		latch_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_we_n_r &amp;lt;= D(5 downto 4);&lt;br /&gt;
			latch_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(6 downto 0) &amp;lt;= &amp;quot;0000000&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(0) &amp;lt;= D(0);&lt;br /&gt;
		&lt;br /&gt;
		for i in rom_bank_we_n_r'range loop&lt;br /&gt;
			if (rom_bank_we_n_r(i) = '0') then&lt;br /&gt;
				rom_bank_r_lo(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			rom_bank_r(6 downto 5) &amp;lt;= D(6 downto 5);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		rom_bank_r(8 downto 7) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in ram_bank_we_n_r'range loop&lt;br /&gt;
			if (ram_bank_we_n_r(i) = '0') then&lt;br /&gt;
				ram_bank_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_r(3 downto 2) &amp;lt;= D(3 downto 2);&lt;br /&gt;
			rom_bank_r(8 downto 7) &amp;lt;= D(5 downto 4);&lt;br /&gt;
			mode_we_n_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
		rom_bank_we_n_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		mux_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in mode_we_n_r'range loop&lt;br /&gt;
			if (mode_we_n_r(i) = '0') then&lt;br /&gt;
				mode_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;1&amp;quot;) then&lt;br /&gt;
			rom_bank_we_n_r &amp;lt;= D(5 downto 2);&lt;br /&gt;
			mux_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=149</id>
		<title>MMM01 Games</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=149"/>
		<updated>2019-05-01T19:54:14Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Settings */ spell out settings and mistake in code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
This page lists games that use Nintendo's [[MMM01]], their ROM layout and the configuration settings they use per game.&lt;br /&gt;
&lt;br /&gt;
= Momotarou Collection 2 =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Momotarou Collection 2 (Japan)''' (2B589E58D8821C59B7AF702723361DB5)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MC-SFCN-01'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Momotarou Dengeki 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Momotarou Gaiden&lt;br /&gt;
|0x20&amp;amp;ndash;0x2F&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ROM banks 0x30&amp;amp;ndash;0x3D are unused and filled with 0xFF.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
Code at 3E:3A0F resp. 3E:3A2C depending on the game.&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Gaiden ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 20   -01  00000&lt;br /&gt;
    5FFF &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    7FFF &amp;lt;= 21   -0 1000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    1FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
Resulting configuration:&lt;br /&gt;
&lt;br /&gt;
    R0: SRAM Enable | AA Mask 0x03&lt;br /&gt;
    R1: RA 0x20&lt;br /&gt;
    R2: AA 0x00 | MBC1 Mode #WE deasserted&lt;br /&gt;
    R3: RA Mask 0x20 | MBC1 Mode 16 MBit/64 kBit (*)&lt;br /&gt;
&lt;br /&gt;
(*) Code disables access to MBC1 Mode register before writing it. Therefore setting MBC1 Mode to 4 MBit/256 kBit fails here.&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Dengeki 2 ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 00   -00  00000&lt;br /&gt;
    5FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    7FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    1FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
Resulting configuration:&lt;br /&gt;
&lt;br /&gt;
    R0: SRAM Enable | AA Mask 0x03&lt;br /&gt;
    R1: RA 0x00&lt;br /&gt;
    R2: AA 0x01 | MBC1 Mode #WE asserted&lt;br /&gt;
    R3: MBC1 Mode 4 MBit/256 kBit&lt;br /&gt;
&lt;br /&gt;
= Taito Variety Pack =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Taito Variety Pack (Japan)''' (FC84B2E016917D5B0E7DE412D9F8C269)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-M-PEAN-10'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Taito) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-602)''' (D57F73C47ACA3E22F4EA2143469AB20E)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
This is the [[#Taito Variety Pack]] released by Mani in China with a different menu.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Tomy) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-603)''' (D9293475642991E942AC11262D8E5927)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Ganbaruga&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Esparks&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Raijinou&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Zoids&lt;br /&gt;
|0x14&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x18&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Ganbaruga ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Raijinou ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Zoids ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Esparks ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (irem) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-604)''' (203FD4178EE332D1B2CF24504716C885)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|R-Type 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Ninja Spirit&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Ganso!! Yancha-Maru&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Match-Mania&lt;br /&gt;
|0x14&amp;amp;ndash;0x15&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x16&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== R-Type 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ninja Spirit ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ganso!! Yancha-Maru ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Match-Mania ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 3C   -0 1111 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Hudson) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-605)''' (3EB5EBDA098635B2DA0021F46A959DE4)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M13'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|GB Genjin&lt;br /&gt;
|0x00&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bomber Boy&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Milon Castle&lt;br /&gt;
|0x18&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Boukenjima 2&lt;br /&gt;
|0x20&amp;amp;ndash;0x27&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x28&amp;amp;ndash;0x3D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Boukenjima 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 20   -01  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== GB Genjin ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 20   -0 1000 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Bomber Boy ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Milon Castle ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 18   -00  11000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=148</id>
		<title>MMM01</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=148"/>
		<updated>2019-05-01T19:28:45Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* SRAM Enable/Disable */ clarify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 can be used to address up to 64&amp;amp;nbsp;Mbit of ROM and 1&amp;amp;nbsp;Mbit of SRAM depending on the mode MMM01 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MMM01 Pinout.png|center|x500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;11&lt;br /&gt;
|D6&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|13&amp;amp;ndash;15&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|16, 29, 27, 21&amp;amp;ndash;17, 22&lt;br /&gt;
|RA22&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|26&amp;amp;ndash;23&lt;br /&gt;
|AA16&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: QFP80P900X900-32&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. D6..D0, A15..A13, {{Overline|RD}}, {{Overline|WR}}, {{Overline|CS}} are internally pulled down with ~50&amp;amp;nbsp;kΩ&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \_________/&lt;br /&gt;
    |   |        \-------- RAM Enable&lt;br /&gt;
    |   \----------------- Ram Bank #WE AA14..AA13&lt;br /&gt;
    \--------------------- Map Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Enable''': A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
* '''RAM Bank #WE''': Low-Active Write-Enable lines for the two least-significant RAM bank bits in [[#RAM Bank Register]]. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
* '''Map Enable''': Setting this bit will disable write access to special register bits and disable the forced ROM Address line masking. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
   \___/ \____________/&lt;br /&gt;
     |           \-------- ROM Bank RA18..RA14&lt;br /&gt;
     \-------------------- ROM Bank RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''ROM Bank RA18..RA14''': These bits select the lower ROM address lines. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14 based only on bits not masked by ROM Bank #WE/Mask RA18..RA15 in [[#Mode Register]].&lt;br /&gt;
* '''ROM Bank RA20..RA19''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \___/ \___/&lt;br /&gt;
    |   |     |     \----- RAM Bank AA14..AA13&lt;br /&gt;
    |   |     \----------- RAM Bank AA16..AA15&lt;br /&gt;
    |   \----------------- ROM Bank RA22..RA21&lt;br /&gt;
    \--------------------- MBC1 Mode #WE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Bank AA14..AA13''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. The MBC1 mode settings still apply, see [[#Mode Register]].&lt;br /&gt;
* '''RAM Bank AA16..AA15''': These bits select the upper RAM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''ROM Bank RA22..RA21''': These bits select the upper ROM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''MBC1 Mode #WE''': Low-Active Write Enable for MBC1 Mode in [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \_________/  |  |&lt;br /&gt;
    |      |       |  \--- MBC1 Mode&lt;br /&gt;
    |      |       \------ Unknown&lt;br /&gt;
    |      \-------------- ROM Bank #WE/Mask RA18..RA15&lt;br /&gt;
    \--------------------- Multiplexer for AA14..AA13 and RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''MBC1 Mode''': Selects the MBC1 operating mode. 0 for 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode and 1 for 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. Can only be written when '''MBC1 Mode #WE''' in [[#RAM Bank Register]] is reset.&lt;br /&gt;
* '''Unknown''': Setting or resetting this bit had no observable effect.&lt;br /&gt;
* '''ROM Bank #WE/Mask RA18..RA15''': Low-Active Write-Enable for RA18..RA15 in [[#ROM Bank Register]] as well as mask for zero-adjusting RA18..RA15. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''Multiplexer''': The multiplexer will switch the bits output to pins AA14..AA13 and RA20..RA19. Barring MBC1 Mode logic: when reset, pins will be driven from register contents; when set, pins will be driven from the other register, i.e. RA20..RA19 will be driven by [[#RAM Bank Register]] and AA14..AA13 will be driven by [[#ROM Bank Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
Operating the MMM01 can be quite complex and the register contents are not straightforward. This section will detail the programming model and give example configurations.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 has two modes of operation ''mapped'' and ''unmapped''. It defaults to ''unmapped'' after reset.&lt;br /&gt;
&lt;br /&gt;
In ''unmapped'' state, the upper ROM address lines RA22..RA15 are all forced to 1, meaning the ROM entry point will be in ROM bank 0x1FE with the only other accessible ROM bank being 0x1FF.&lt;br /&gt;
&lt;br /&gt;
This is used to lock write access to the upper bits of the known [[MBC1]] registers after base ROM and RAM banks and masks have been set up.&lt;br /&gt;
&lt;br /&gt;
The only way to ''unmap'' the mapper after ''mapping'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Programming Model ==&lt;br /&gt;
&lt;br /&gt;
All registers are live, e.g. Setting the RAM Bank #WE bits and subsequently writing to RAM Bank AA14..AA13 won't work -- no matter if in ''mapped'' of ''unmapped'' state. Therefore, there is a certain order in which registers are optimally written:&lt;br /&gt;
&lt;br /&gt;
# ROM Bank Register&lt;br /&gt;
# Mode Register&lt;br /&gt;
# RAM Register&lt;br /&gt;
# RAM Enable&lt;br /&gt;
&lt;br /&gt;
Not all of Nintendo's games that use MMM01 keep with this order. However, due to the individual games' sizes and use of RAM banks, this isn't noticeable when the games don't misbehave.&lt;br /&gt;
&lt;br /&gt;
Most Rom Address line changes cannot be observed in ''unmapped'' mode due to the mapper starting at ROM bank 0x1FE and 0x1FF (depending on A14) until ''mapped''.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 0: 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;0&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (common) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (uncommon) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is probably not the intended use case.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Remarks =&lt;br /&gt;
&lt;br /&gt;
== Unknown Bit ==&lt;br /&gt;
&lt;br /&gt;
There is an Unknown bit in [[#Mode Register]] whose use -- if any -- could not be determined through testing. It is definitely not ROM Bank RA14 #WE as RA14 can be written at all times -- hence there cannot be a single bank mapped to both regions. It might be part of ROM Bank RA14 Mask and an Engineer might have missed that the zero-adjustment logic means that this bit is not necessary.&lt;br /&gt;
&lt;br /&gt;
== SRAM Enable/Disable ==&lt;br /&gt;
&lt;br /&gt;
The most glaringly missing feature of MMM01 is an option to disable SRAM access for individual games. The Unknown bit in [[#Mode Register]] does not provide for this either. The only commercial cartridge containing MMM01 and SRAM is Momotarou Collection 2 and it tries to sacrifices one SRAM bank to make sure that one game has no chance of deleting the other's save file. However, the PCB only has one 64 KiB SRAM and the RAM address lines are all unconnected.&lt;br /&gt;
&lt;br /&gt;
Having to spend 64&amp;amp;nbsp;kBit to ''disable'' SRAM access seems like a waste considering a simple OR-gate could have stopped SRAM access.&lt;br /&gt;
&lt;br /&gt;
== Separate MBC1 Mode #WE ==&lt;br /&gt;
&lt;br /&gt;
The MBC1 Mode #WE stands out as being separated from mapping logic. Instead, if its #WE is not deasserted, it can be freely written even in mapped mode. However, the address line multiplexing for 16&amp;amp;nbsp;Mbit and 4&amp;amp;nbsp;Mbit does not switch with the mode setting -- which given a fixed ROM/SRAM wiring on the cartridge -- would need to be done in order for a hypothetical 16&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit mode to be feasible.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MMM01 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(6 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(22 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(16 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MMM01;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MMM01 is&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r    : std_logic_vector(3 downto 0);&lt;br /&gt;
signal ram_bank_we_n_r : std_logic_vector(1 downto 0);&lt;br /&gt;
signal latch_r         : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_r      : std_logic_vector(8 downto 0);&lt;br /&gt;
signal ram_bank_r      : std_logic_vector(3 downto 0);&lt;br /&gt;
signal mode_we_n_r     : std_logic_vector(6 downto 6);&lt;br /&gt;
signal mode_r          : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_we_n_r : std_logic_vector(4 downto 1);&lt;br /&gt;
signal mux_r           : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_int          : std_logic_vector(4 downto 0);&lt;br /&gt;
signal aa_int          : std_logic_vector(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_lo           : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ra_mask         : std_logic_vector(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
alias rom_bank_r_lo : std_logic_vector(4 downto 0) is rom_bank_r(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A(15) = '0' and RD_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
ra_lo &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
         rom_bank_r_lo;&lt;br /&gt;
&lt;br /&gt;
ra_mask &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
           rom_bank_we_n_r &amp;amp; &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ra_int &amp;lt;= &amp;quot;00000&amp;quot; when (A(14) = '0') else&lt;br /&gt;
          ra_lo   when ((ra_lo and not(ra_mask)) /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
          &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
aa_int &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
          ram_bank_r(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
AA(16 downto 15) &amp;lt;= ram_bank_r(3 downto 2);&lt;br /&gt;
AA(14 downto 13) &amp;lt;= aa_int when (mux_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(22 downto 21) &amp;lt;= &amp;quot;11&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(8 downto 7);&lt;br /&gt;
&lt;br /&gt;
RA(20 downto 19) &amp;lt;= &amp;quot;11&amp;quot;   when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    aa_int when (mux_r = &amp;quot;1&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= (ra_lo and ra_mask) or (ra_int and not(ra_mask));&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
		ram_bank_we_n_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
		latch_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_we_n_r &amp;lt;= D(5 downto 4);&lt;br /&gt;
			latch_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(6 downto 0) &amp;lt;= &amp;quot;0000000&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(0) &amp;lt;= D(0);&lt;br /&gt;
		&lt;br /&gt;
		for i in rom_bank_we_n_r'range loop&lt;br /&gt;
			if (rom_bank_we_n_r(i) = '0') then&lt;br /&gt;
				rom_bank_r_lo(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			rom_bank_r(6 downto 5) &amp;lt;= D(6 downto 5);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		rom_bank_r(8 downto 7) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in ram_bank_we_n_r'range loop&lt;br /&gt;
			if (ram_bank_we_n_r(i) = '0') then&lt;br /&gt;
				ram_bank_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_r(3 downto 2) &amp;lt;= D(3 downto 2);&lt;br /&gt;
			rom_bank_r(8 downto 7) &amp;lt;= D(5 downto 4);&lt;br /&gt;
			mode_we_n_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
		rom_bank_we_n_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		mux_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in mode_we_n_r'range loop&lt;br /&gt;
			if (mode_we_n_r(i) = '0') then&lt;br /&gt;
				mode_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;1&amp;quot;) then&lt;br /&gt;
			rom_bank_we_n_r &amp;lt;= D(5 downto 2);&lt;br /&gt;
			mux_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=147</id>
		<title>MMM01 Games</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=147"/>
		<updated>2019-05-01T17:40:52Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Momotarou Dengeki 2 */ fix register writes for dengeki 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
This page lists games that use Nintendo's [[MMM01]], their ROM layout and the configuration settings they use per game.&lt;br /&gt;
&lt;br /&gt;
= Momotarou Collection 2 =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Momotarou Collection 2 (Japan)''' (2B589E58D8821C59B7AF702723361DB5)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MC-SFCN-01'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Momotarou Dengeki 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Momotarou Gaiden&lt;br /&gt;
|0x20&amp;amp;ndash;0x2F&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ROM banks 0x30&amp;amp;ndash;0x3D are unused and filled with 0xFF.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Gaiden ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 20   -01  00000&lt;br /&gt;
    5FFF &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    7FFF &amp;lt;= 21   -0 1000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    1FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Dengeki 2 ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 00   -00  00000&lt;br /&gt;
    5FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    7FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    1FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
= Taito Variety Pack =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Taito Variety Pack (Japan)''' (FC84B2E016917D5B0E7DE412D9F8C269)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-M-PEAN-10'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Taito) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-602)''' (D57F73C47ACA3E22F4EA2143469AB20E)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
This is the [[#Taito Variety Pack]] released by Mani in China with a different menu.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Tomy) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-603)''' (D9293475642991E942AC11262D8E5927)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Ganbaruga&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Esparks&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Raijinou&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Zoids&lt;br /&gt;
|0x14&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x18&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Ganbaruga ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Raijinou ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Zoids ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Esparks ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (irem) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-604)''' (203FD4178EE332D1B2CF24504716C885)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|R-Type 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Ninja Spirit&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Ganso!! Yancha-Maru&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Match-Mania&lt;br /&gt;
|0x14&amp;amp;ndash;0x15&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x16&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== R-Type 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ninja Spirit ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ganso!! Yancha-Maru ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Match-Mania ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 3C   -0 1111 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Hudson) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-605)''' (3EB5EBDA098635B2DA0021F46A959DE4)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M13'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|GB Genjin&lt;br /&gt;
|0x00&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bomber Boy&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Milon Castle&lt;br /&gt;
|0x18&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Boukenjima 2&lt;br /&gt;
|0x20&amp;amp;ndash;0x27&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x28&amp;amp;ndash;0x3D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Boukenjima 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 20   -01  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== GB Genjin ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 20   -0 1000 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Bomber Boy ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Milon Castle ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 18   -00  11000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=146</id>
		<title>MMM01 Games</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=146"/>
		<updated>2019-05-01T17:39:23Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Mani 4-in-1 (Hudson) */ fix rom list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
This page lists games that use Nintendo's [[MMM01]], their ROM layout and the configuration settings they use per game.&lt;br /&gt;
&lt;br /&gt;
= Momotarou Collection 2 =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Momotarou Collection 2 (Japan)''' (2B589E58D8821C59B7AF702723361DB5)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MC-SFCN-01'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Momotarou Dengeki 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Momotarou Gaiden&lt;br /&gt;
|0x20&amp;amp;ndash;0x2F&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ROM banks 0x30&amp;amp;ndash;0x3D are unused and filled with 0xFF.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Gaiden ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 20   -01  00000&lt;br /&gt;
    5FFF &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    7FFF &amp;lt;= 21   -0 1000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    1FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Dengeki 2 ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 00   -00  00000&lt;br /&gt;
    5FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    7FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    7FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
= Taito Variety Pack =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Taito Variety Pack (Japan)''' (FC84B2E016917D5B0E7DE412D9F8C269)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-M-PEAN-10'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Taito) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-602)''' (D57F73C47ACA3E22F4EA2143469AB20E)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
This is the [[#Taito Variety Pack]] released by Mani in China with a different menu.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Tomy) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-603)''' (D9293475642991E942AC11262D8E5927)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Ganbaruga&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Esparks&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Raijinou&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Zoids&lt;br /&gt;
|0x14&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x18&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Ganbaruga ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Raijinou ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Zoids ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Esparks ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (irem) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-604)''' (203FD4178EE332D1B2CF24504716C885)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|R-Type 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Ninja Spirit&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Ganso!! Yancha-Maru&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Match-Mania&lt;br /&gt;
|0x14&amp;amp;ndash;0x15&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x16&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== R-Type 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ninja Spirit ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ganso!! Yancha-Maru ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Match-Mania ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 3C   -0 1111 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Hudson) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-605)''' (3EB5EBDA098635B2DA0021F46A959DE4)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M13'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|GB Genjin&lt;br /&gt;
|0x00&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bomber Boy&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Milon Castle&lt;br /&gt;
|0x18&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Boukenjima 2&lt;br /&gt;
|0x20&amp;amp;ndash;0x27&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x28&amp;amp;ndash;0x3D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Boukenjima 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 20   -01  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== GB Genjin ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 20   -0 1000 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Bomber Boy ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Milon Castle ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 18   -00  11000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=145</id>
		<title>MMM01 Games</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01_Games&amp;diff=145"/>
		<updated>2019-05-01T17:38:09Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: add documentation for MMM01 games&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
This page lists games that use Nintendo's [[MMM01]], their ROM layout and the configuration settings they use per game.&lt;br /&gt;
&lt;br /&gt;
= Momotarou Collection 2 =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Momotarou Collection 2 (Japan)''' (2B589E58D8821C59B7AF702723361DB5)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MC-SFCN-01'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Momotarou Dengeki 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Momotarou Gaiden&lt;br /&gt;
|0x20&amp;amp;ndash;0x2F&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ROM banks 0x30&amp;amp;ndash;0x3D are unused and filled with 0xFF.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Gaiden ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 20   -01  00000&lt;br /&gt;
    5FFF &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    7FFF &amp;lt;= 21   -0 1000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    1FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
=== Momotarou Dengeki 2 ===&lt;br /&gt;
&lt;br /&gt;
    3FFF &amp;lt;= 00   -00  00000&lt;br /&gt;
    5FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    7FFF &amp;lt;= 01   -0 0000 01&lt;br /&gt;
    1FFF &amp;lt;= 3A   -0 11 1010&lt;br /&gt;
    7FFF &amp;lt;= 7A   -1 11 1010&lt;br /&gt;
&lt;br /&gt;
= Taito Variety Pack =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Taito Variety Pack (Japan)''' (FC84B2E016917D5B0E7DE412D9F8C269)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-M-PEAN-10'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Taito) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-602)''' (D57F73C47ACA3E22F4EA2143469AB20E)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
This is the [[#Taito Variety Pack]] released by Mani in China with a different menu.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Sagaia&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Chase H.Q.&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bubble Bobble&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Elevator Action&lt;br /&gt;
|0x18&amp;amp;ndash;0x1B&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x1C&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Bubble Bobble ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 70   -11  10000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Elevator Action ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 78   -11  11000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Chase H.Q. ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 68   -11  01000 &lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00 &lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00 &lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000 &lt;br /&gt;
&lt;br /&gt;
=== Sagaia ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 60   -11  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 70   -1 1100 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Tomy) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-603)''' (D9293475642991E942AC11262D8E5927)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Ganbaruga&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Esparks&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Raijinou&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Zoids&lt;br /&gt;
|0x14&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x18&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Ganbaruga ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Raijinou ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Zoids ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Esparks ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (irem) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-604)''' (203FD4178EE332D1B2CF24504716C885)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M11'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|R-Type 2&lt;br /&gt;
|0x00&amp;amp;ndash;0x07&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Ninja Spirit&lt;br /&gt;
|0x08&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Ganso!! Yancha-Maru&lt;br /&gt;
|0x10&amp;amp;ndash;0x13&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Match-Mania&lt;br /&gt;
|0x14&amp;amp;ndash;0x15&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x1E&amp;amp;ndash;0x1F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x16&amp;amp;ndash;0x1D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== R-Type 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ninja Spirit ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 08   -00  01000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Ganso!! Yancha-Maru ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 38   -0 1110 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Match-Mania ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 14   -00  10100&lt;br /&gt;
    6000 &amp;lt;= 3C   -0 1111 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
= Mani 4-in-1 (Hudson) =&lt;br /&gt;
&lt;br /&gt;
ROM: '''Mani 4 in 1 (China) (DMG-605)''' (3EB5EBDA098635B2DA0021F46A959DE4)&lt;br /&gt;
&lt;br /&gt;
PCB: '''DMG-MMM-BEAN-M13'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:1em auto; width: 50%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Base Bank&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | ROM&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; | Banks Used&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|GB Genjin&lt;br /&gt;
|0x00&amp;amp;ndash;0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|Bomber Boy&lt;br /&gt;
|0x10&amp;amp;ndash;0x17&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Milon Castle&lt;br /&gt;
|0x18&amp;amp;ndash;0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|Match-Mania&lt;br /&gt;
|0x20&amp;amp;ndash;0x27&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|Menu&lt;br /&gt;
|0x3E&amp;amp;ndash;0x3F&lt;br /&gt;
|}&lt;br /&gt;
ROM banks 0x28&amp;amp;ndash;0x3D are unused and filled with 0x00.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Boukenjima 2 ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 20   -01  00000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== GB Genjin ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 00   -00  00000&lt;br /&gt;
    6000 &amp;lt;= 20   -0 1000 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Bomber Boy ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 10   -00  10000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
=== Milon Castle ===&lt;br /&gt;
&lt;br /&gt;
    2000 &amp;lt;= 18   -00  11000&lt;br /&gt;
    6000 &amp;lt;= 30   -0 1100 00&lt;br /&gt;
    4000 &amp;lt;= 40   -1 0000 00&lt;br /&gt;
    0000 &amp;lt;= 40   -1 00 0000&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=144</id>
		<title>MMM01</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=144"/>
		<updated>2019-05-01T16:05:24Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: correct pin 16 number&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 can be used to address up to 64&amp;amp;nbsp;Mbit of ROM and 1&amp;amp;nbsp;Mbit of SRAM depending on the mode MMM01 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MMM01 Pinout.png|center|x500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;11&lt;br /&gt;
|D6&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|13&amp;amp;ndash;15&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|16, 29, 27, 21&amp;amp;ndash;17, 22&lt;br /&gt;
|RA22&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|26&amp;amp;ndash;23&lt;br /&gt;
|AA16&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: QFP80P900X900-32&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. D6..D0, A15..A13, {{Overline|RD}}, {{Overline|WR}}, {{Overline|CS}} are internally pulled down with ~50&amp;amp;nbsp;kΩ&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \_________/&lt;br /&gt;
    |   |        \-------- RAM Enable&lt;br /&gt;
    |   \----------------- Ram Bank #WE AA14..AA13&lt;br /&gt;
    \--------------------- Map Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Enable''': A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
* '''RAM Bank #WE''': Low-Active Write-Enable lines for the two least-significant RAM bank bits in [[#RAM Bank Register]]. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
* '''Map Enable''': Setting this bit will disable write access to special register bits and disable the forced ROM Address line masking. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
   \___/ \____________/&lt;br /&gt;
     |           \-------- ROM Bank RA18..RA14&lt;br /&gt;
     \-------------------- ROM Bank RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''ROM Bank RA18..RA14''': These bits select the lower ROM address lines. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14 based only on bits not masked by ROM Bank #WE/Mask RA18..RA15 in [[#Mode Register]].&lt;br /&gt;
* '''ROM Bank RA20..RA19''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \___/ \___/&lt;br /&gt;
    |   |     |     \----- RAM Bank AA14..AA13&lt;br /&gt;
    |   |     \----------- RAM Bank AA16..AA15&lt;br /&gt;
    |   \----------------- ROM Bank RA22..RA21&lt;br /&gt;
    \--------------------- MBC1 Mode #WE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Bank AA14..AA13''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. The MBC1 mode settings still apply, see [[#Mode Register]].&lt;br /&gt;
* '''RAM Bank AA16..AA15''': These bits select the upper RAM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''ROM Bank RA22..RA21''': These bits select the upper ROM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''MBC1 Mode #WE''': Low-Active Write Enable for MBC1 Mode in [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \_________/  |  |&lt;br /&gt;
    |      |       |  \--- MBC1 Mode&lt;br /&gt;
    |      |       \------ Unknown&lt;br /&gt;
    |      \-------------- ROM Bank #WE/Mask RA18..RA15&lt;br /&gt;
    \--------------------- Multiplexer for AA14..AA13 and RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''MBC1 Mode''': Selects the MBC1 operating mode. 0 for 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode and 1 for 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. Can only be written when '''MBC1 Mode #WE''' in [[#RAM Bank Register]] is reset.&lt;br /&gt;
* '''Unknown''': Setting or resetting this bit had no observable effect.&lt;br /&gt;
* '''ROM Bank #WE/Mask RA18..RA15''': Low-Active Write-Enable for RA18..RA15 in [[#ROM Bank Register]] as well as mask for zero-adjusting RA18..RA15. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''Multiplexer''': The multiplexer will switch the bits output to pins AA14..AA13 and RA20..RA19. Barring MBC1 Mode logic: when reset, pins will be driven from register contents; when set, pins will be driven from the other register, i.e. RA20..RA19 will be driven by [[#RAM Bank Register]] and AA14..AA13 will be driven by [[#ROM Bank Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
Operating the MMM01 can be quite complex and the register contents are not straightforward. This section will detail the programming model and give example configurations.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 has two modes of operation ''mapped'' and ''unmapped''. It defaults to ''unmapped'' after reset.&lt;br /&gt;
&lt;br /&gt;
In ''unmapped'' state, the upper ROM address lines RA22..RA15 are all forced to 1, meaning the ROM entry point will be in ROM bank 0x1FE with the only other accessible ROM bank being 0x1FF.&lt;br /&gt;
&lt;br /&gt;
This is used to lock write access to the upper bits of the known [[MBC1]] registers after base ROM and RAM banks and masks have been set up.&lt;br /&gt;
&lt;br /&gt;
The only way to ''unmap'' the mapper after ''mapping'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Programming Model ==&lt;br /&gt;
&lt;br /&gt;
All registers are live, e.g. Setting the RAM Bank #WE bits and subsequently writing to RAM Bank AA14..AA13 won't work -- no matter if in ''mapped'' of ''unmapped'' state. Therefore, there is a certain order in which registers are optimally written:&lt;br /&gt;
&lt;br /&gt;
# ROM Bank Register&lt;br /&gt;
# Mode Register&lt;br /&gt;
# RAM Register&lt;br /&gt;
# RAM Enable&lt;br /&gt;
&lt;br /&gt;
Not all of Nintendo's games that use MMM01 keep with this order. However, due to the individual games' sizes and use of RAM banks, this isn't noticeable when the games don't misbehave.&lt;br /&gt;
&lt;br /&gt;
Most Rom Address line changes cannot be observed in ''unmapped'' mode due to the mapper starting at ROM bank 0x1FE and 0x1FF (depending on A14) until ''mapped''.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 0: 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;0&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (common) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (uncommon) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is probably not the intended use case.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Remarks =&lt;br /&gt;
&lt;br /&gt;
== Unknown Bit ==&lt;br /&gt;
&lt;br /&gt;
There is an Unknown bit in [[#Mode Register]] whose use -- if any -- could not be determined through testing. It is definitely not ROM Bank RA14 #WE as RA14 can be written at all times -- hence there cannot be a single bank mapped to both regions. It might be part of ROM Bank RA14 Mask and an Engineer might have missed that the zero-adjustment logic means that this bit is not necessary.&lt;br /&gt;
&lt;br /&gt;
== SRAM Enable/Disable ==&lt;br /&gt;
&lt;br /&gt;
The most glaringly missing feature of MMM01 is an option to disable SRAM access for individual games. The Unknown bit in [[#Mode Register]] does not provide for this either. The only commercial cartridge containing MMM01 and SRAM is Momotarou Collection 2 and it sacrifices one RAM bank to make sure that one game has no chance of deleting the other's save file.&lt;br /&gt;
&lt;br /&gt;
Having to spend 64&amp;amp;nbsp;kBit to ''disable'' SRAM access seems like a waste considering a simple OR-gate could have stopped SRAM access.&lt;br /&gt;
&lt;br /&gt;
== Separate MBC1 Mode #WE ==&lt;br /&gt;
&lt;br /&gt;
The MBC1 Mode #WE stands out as being separated from mapping logic. Instead, if its #WE is not deasserted, it can be freely written even in mapped mode. However, the address line multiplexing for 16&amp;amp;nbsp;Mbit and 4&amp;amp;nbsp;Mbit does not switch with the mode setting -- which given a fixed ROM/SRAM wiring on the cartridge -- would need to be done in order for a hypothetical 16&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit mode to be feasible.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MMM01 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(6 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(22 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(16 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MMM01;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MMM01 is&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r    : std_logic_vector(3 downto 0);&lt;br /&gt;
signal ram_bank_we_n_r : std_logic_vector(1 downto 0);&lt;br /&gt;
signal latch_r         : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_r      : std_logic_vector(8 downto 0);&lt;br /&gt;
signal ram_bank_r      : std_logic_vector(3 downto 0);&lt;br /&gt;
signal mode_we_n_r     : std_logic_vector(6 downto 6);&lt;br /&gt;
signal mode_r          : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_we_n_r : std_logic_vector(4 downto 1);&lt;br /&gt;
signal mux_r           : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_int          : std_logic_vector(4 downto 0);&lt;br /&gt;
signal aa_int          : std_logic_vector(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_lo           : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ra_mask         : std_logic_vector(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
alias rom_bank_r_lo : std_logic_vector(4 downto 0) is rom_bank_r(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A(15) = '0' and RD_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
ra_lo &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
         rom_bank_r_lo;&lt;br /&gt;
&lt;br /&gt;
ra_mask &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
           rom_bank_we_n_r &amp;amp; &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ra_int &amp;lt;= &amp;quot;00000&amp;quot; when (A(14) = '0') else&lt;br /&gt;
          ra_lo   when ((ra_lo and not(ra_mask)) /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
          &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
aa_int &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
          ram_bank_r(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
AA(16 downto 15) &amp;lt;= ram_bank_r(3 downto 2);&lt;br /&gt;
AA(14 downto 13) &amp;lt;= aa_int when (mux_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(22 downto 21) &amp;lt;= &amp;quot;11&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(8 downto 7);&lt;br /&gt;
&lt;br /&gt;
RA(20 downto 19) &amp;lt;= &amp;quot;11&amp;quot;   when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    aa_int when (mux_r = &amp;quot;1&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= (ra_lo and ra_mask) or (ra_int and not(ra_mask));&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
		ram_bank_we_n_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
		latch_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_we_n_r &amp;lt;= D(5 downto 4);&lt;br /&gt;
			latch_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(6 downto 0) &amp;lt;= &amp;quot;0000000&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(0) &amp;lt;= D(0);&lt;br /&gt;
		&lt;br /&gt;
		for i in rom_bank_we_n_r'range loop&lt;br /&gt;
			if (rom_bank_we_n_r(i) = '0') then&lt;br /&gt;
				rom_bank_r_lo(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			rom_bank_r(6 downto 5) &amp;lt;= D(6 downto 5);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		rom_bank_r(8 downto 7) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in ram_bank_we_n_r'range loop&lt;br /&gt;
			if (ram_bank_we_n_r(i) = '0') then&lt;br /&gt;
				ram_bank_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_r(3 downto 2) &amp;lt;= D(3 downto 2);&lt;br /&gt;
			rom_bank_r(8 downto 7) &amp;lt;= D(5 downto 4);&lt;br /&gt;
			mode_we_n_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
		rom_bank_we_n_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		mux_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in mode_we_n_r'range loop&lt;br /&gt;
			if (mode_we_n_r(i) = '0') then&lt;br /&gt;
				mode_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;1&amp;quot;) then&lt;br /&gt;
			rom_bank_we_n_r &amp;lt;= D(5 downto 2);&lt;br /&gt;
			mux_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=File:MMM01_Pinout.png&amp;diff=143</id>
		<title>File:MMM01 Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=File:MMM01_Pinout.png&amp;diff=143"/>
		<updated>2019-05-01T16:04:55Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Tauwasser uploaded a new version of File:MMM01 Pinout.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pinout for Nintendo's MMM01.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Game_Boy_Dumping_Misc&amp;diff=142</id>
		<title>Game Boy Dumping Misc</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Game_Boy_Dumping_Misc&amp;diff=142"/>
		<updated>2018-11-13T22:28:25Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: redump confirmed missing ル&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Nikkan Berutomo Club ==&lt;br /&gt;
&lt;br /&gt;
Nikkan Berutomo Club's name entry screen katakana contains ロ (katakana RO) twice, ル (katakana RU) is missing in right-most column.&lt;br /&gt;
Change 2:5163 to 0x83 to rectify this. Apparently the developers just screwed up.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=160px heights=144px&amp;gt;&lt;br /&gt;
DMG_Nikkan_Berutomo_Club_Name_Entry_Before.png|Before&lt;br /&gt;
DMG_Nikkan_Berutomo_Club_Name_Entry_After.png|After&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=141</id>
		<title>MMM01</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=141"/>
		<updated>2018-08-30T18:31:06Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Modes of Operation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 can be used to address up to 64&amp;amp;nbsp;Mbit of ROM and 1&amp;amp;nbsp;Mbit of SRAM depending on the mode MMM01 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MMM01 Pinout.png|center|x500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;11&lt;br /&gt;
|D6&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|13&amp;amp;ndash;15&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|15, 29, 27, 21&amp;amp;ndash;17, 22&lt;br /&gt;
|RA22&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|26&amp;amp;ndash;23&lt;br /&gt;
|AA16&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: QFP80P900X900-32&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. D6..D0, A15..A13, {{Overline|RD}}, {{Overline|WR}}, {{Overline|CS}} are internally pulled down with ~50&amp;amp;nbsp;kΩ&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \_________/&lt;br /&gt;
    |   |        \-------- RAM Enable&lt;br /&gt;
    |   \----------------- Ram Bank #WE AA14..AA13&lt;br /&gt;
    \--------------------- Map Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Enable''': A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
* '''RAM Bank #WE''': Low-Active Write-Enable lines for the two least-significant RAM bank bits in [[#RAM Bank Register]]. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
* '''Map Enable''': Setting this bit will disable write access to special register bits and disable the forced ROM Address line masking. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
   \___/ \____________/&lt;br /&gt;
     |           \-------- ROM Bank RA18..RA14&lt;br /&gt;
     \-------------------- ROM Bank RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''ROM Bank RA18..RA14''': These bits select the lower ROM address lines. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14 based only on bits not masked by ROM Bank #WE/Mask RA18..RA15 in [[#Mode Register]].&lt;br /&gt;
* '''ROM Bank RA20..RA19''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \___/ \___/&lt;br /&gt;
    |   |     |     \----- RAM Bank AA14..AA13&lt;br /&gt;
    |   |     \----------- RAM Bank AA16..AA15&lt;br /&gt;
    |   \----------------- ROM Bank RA22..RA21&lt;br /&gt;
    \--------------------- MBC1 Mode #WE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Bank AA14..AA13''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. The MBC1 mode settings still apply, see [[#Mode Register]].&lt;br /&gt;
* '''RAM Bank AA16..AA15''': These bits select the upper RAM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''ROM Bank RA22..RA21''': These bits select the upper ROM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''MBC1 Mode #WE''': Low-Active Write Enable for MBC1 Mode in [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \_________/  |  |&lt;br /&gt;
    |      |       |  \--- MBC1 Mode&lt;br /&gt;
    |      |       \------ Unknown&lt;br /&gt;
    |      \-------------- ROM Bank #WE/Mask RA18..RA15&lt;br /&gt;
    \--------------------- Multiplexer for AA14..AA13 and RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''MBC1 Mode''': Selects the MBC1 operating mode. 0 for 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode and 1 for 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. Can only be written when '''MBC1 Mode #WE''' in [[#RAM Bank Register]] is reset.&lt;br /&gt;
* '''Unknown''': Setting or resetting this bit had no observable effect.&lt;br /&gt;
* '''ROM Bank #WE/Mask RA18..RA15''': Low-Active Write-Enable for RA18..RA15 in [[#ROM Bank Register]] as well as mask for zero-adjusting RA18..RA15. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''Multiplexer''': The multiplexer will switch the bits output to pins AA14..AA13 and RA20..RA19. Barring MBC1 Mode logic: when reset, pins will be driven from register contents; when set, pins will be driven from the other register, i.e. RA20..RA19 will be driven by [[#RAM Bank Register]] and AA14..AA13 will be driven by [[#ROM Bank Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
Operating the MMM01 can be quite complex and the register contents are not straightforward. This section will detail the programming model and give example configurations.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 has two modes of operation ''mapped'' and ''unmapped''. It defaults to ''unmapped'' after reset.&lt;br /&gt;
&lt;br /&gt;
In ''unmapped'' state, the upper ROM address lines RA22..RA15 are all forced to 1, meaning the ROM entry point will be in ROM bank 0x1FE with the only other accessible ROM bank being 0x1FF.&lt;br /&gt;
&lt;br /&gt;
This is used to lock write access to the upper bits of the known [[MBC1]] registers after base ROM and RAM banks and masks have been set up.&lt;br /&gt;
&lt;br /&gt;
The only way to ''unmap'' the mapper after ''mapping'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Programming Model ==&lt;br /&gt;
&lt;br /&gt;
All registers are live, e.g. Setting the RAM Bank #WE bits and subsequently writing to RAM Bank AA14..AA13 won't work -- no matter if in ''mapped'' of ''unmapped'' state. Therefore, there is a certain order in which registers are optimally written:&lt;br /&gt;
&lt;br /&gt;
# ROM Bank Register&lt;br /&gt;
# Mode Register&lt;br /&gt;
# RAM Register&lt;br /&gt;
# RAM Enable&lt;br /&gt;
&lt;br /&gt;
Not all of Nintendo's games that use MMM01 keep with this order. However, due to the individual games' sizes and use of RAM banks, this isn't noticeable when the games don't misbehave.&lt;br /&gt;
&lt;br /&gt;
Most Rom Address line changes cannot be observed in ''unmapped'' mode due to the mapper starting at ROM bank 0x1FE and 0x1FF (depending on A14) until ''mapped''.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 0: 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;0&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (common) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (uncommon) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is probably not the intended use case.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Remarks =&lt;br /&gt;
&lt;br /&gt;
== Unknown Bit ==&lt;br /&gt;
&lt;br /&gt;
There is an Unknown bit in [[#Mode Register]] whose use -- if any -- could not be determined through testing. It is definitely not ROM Bank RA14 #WE as RA14 can be written at all times -- hence there cannot be a single bank mapped to both regions. It might be part of ROM Bank RA14 Mask and an Engineer might have missed that the zero-adjustment logic means that this bit is not necessary.&lt;br /&gt;
&lt;br /&gt;
== SRAM Enable/Disable ==&lt;br /&gt;
&lt;br /&gt;
The most glaringly missing feature of MMM01 is an option to disable SRAM access for individual games. The Unknown bit in [[#Mode Register]] does not provide for this either. The only commercial cartridge containing MMM01 and SRAM is Momotarou Collection 2 and it sacrifices one RAM bank to make sure that one game has no chance of deleting the other's save file.&lt;br /&gt;
&lt;br /&gt;
Having to spend 64&amp;amp;nbsp;kBit to ''disable'' SRAM access seems like a waste considering a simple OR-gate could have stopped SRAM access.&lt;br /&gt;
&lt;br /&gt;
== Separate MBC1 Mode #WE ==&lt;br /&gt;
&lt;br /&gt;
The MBC1 Mode #WE stands out as being separated from mapping logic. Instead, if its #WE is not deasserted, it can be freely written even in mapped mode. However, the address line multiplexing for 16&amp;amp;nbsp;Mbit and 4&amp;amp;nbsp;Mbit does not switch with the mode setting -- which given a fixed ROM/SRAM wiring on the cartridge -- would need to be done in order for a hypothetical 16&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit mode to be feasible.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MMM01 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(6 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(22 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(16 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MMM01;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MMM01 is&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r    : std_logic_vector(3 downto 0);&lt;br /&gt;
signal ram_bank_we_n_r : std_logic_vector(1 downto 0);&lt;br /&gt;
signal latch_r         : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_r      : std_logic_vector(8 downto 0);&lt;br /&gt;
signal ram_bank_r      : std_logic_vector(3 downto 0);&lt;br /&gt;
signal mode_we_n_r     : std_logic_vector(6 downto 6);&lt;br /&gt;
signal mode_r          : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_we_n_r : std_logic_vector(4 downto 1);&lt;br /&gt;
signal mux_r           : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_int          : std_logic_vector(4 downto 0);&lt;br /&gt;
signal aa_int          : std_logic_vector(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_lo           : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ra_mask         : std_logic_vector(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
alias rom_bank_r_lo : std_logic_vector(4 downto 0) is rom_bank_r(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A(15) = '0' and RD_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
ra_lo &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
         rom_bank_r_lo;&lt;br /&gt;
&lt;br /&gt;
ra_mask &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
           rom_bank_we_n_r &amp;amp; &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ra_int &amp;lt;= &amp;quot;00000&amp;quot; when (A(14) = '0') else&lt;br /&gt;
          ra_lo   when ((ra_lo and not(ra_mask)) /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
          &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
aa_int &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
          ram_bank_r(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
AA(16 downto 15) &amp;lt;= ram_bank_r(3 downto 2);&lt;br /&gt;
AA(14 downto 13) &amp;lt;= aa_int when (mux_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(22 downto 21) &amp;lt;= &amp;quot;11&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(8 downto 7);&lt;br /&gt;
&lt;br /&gt;
RA(20 downto 19) &amp;lt;= &amp;quot;11&amp;quot;   when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    aa_int when (mux_r = &amp;quot;1&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= (ra_lo and ra_mask) or (ra_int and not(ra_mask));&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
		ram_bank_we_n_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
		latch_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_we_n_r &amp;lt;= D(5 downto 4);&lt;br /&gt;
			latch_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(6 downto 0) &amp;lt;= &amp;quot;0000000&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(0) &amp;lt;= D(0);&lt;br /&gt;
		&lt;br /&gt;
		for i in rom_bank_we_n_r'range loop&lt;br /&gt;
			if (rom_bank_we_n_r(i) = '0') then&lt;br /&gt;
				rom_bank_r_lo(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			rom_bank_r(6 downto 5) &amp;lt;= D(6 downto 5);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		rom_bank_r(8 downto 7) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in ram_bank_we_n_r'range loop&lt;br /&gt;
			if (ram_bank_we_n_r(i) = '0') then&lt;br /&gt;
				ram_bank_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_r(3 downto 2) &amp;lt;= D(3 downto 2);&lt;br /&gt;
			rom_bank_r(8 downto 7) &amp;lt;= D(5 downto 4);&lt;br /&gt;
			mode_we_n_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
		rom_bank_we_n_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		mux_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in mode_we_n_r'range loop&lt;br /&gt;
			if (mode_we_n_r(i) = '0') then&lt;br /&gt;
				mode_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;1&amp;quot;) then&lt;br /&gt;
			rom_bank_we_n_r &amp;lt;= D(5 downto 2);&lt;br /&gt;
			mux_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=140</id>
		<title>MMM01</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=140"/>
		<updated>2018-08-30T18:30:42Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Modes of Operation */ add more info about unmapped state&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 can be used to address up to 64&amp;amp;nbsp;Mbit of ROM and 1&amp;amp;nbsp;Mbit of SRAM depending on the mode MMM01 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MMM01 Pinout.png|center|x500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;11&lt;br /&gt;
|D6&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|13&amp;amp;ndash;15&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|15, 29, 27, 21&amp;amp;ndash;17, 22&lt;br /&gt;
|RA22&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|26&amp;amp;ndash;23&lt;br /&gt;
|AA16&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: QFP80P900X900-32&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. D6..D0, A15..A13, {{Overline|RD}}, {{Overline|WR}}, {{Overline|CS}} are internally pulled down with ~50&amp;amp;nbsp;kΩ&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \_________/&lt;br /&gt;
    |   |        \-------- RAM Enable&lt;br /&gt;
    |   \----------------- Ram Bank #WE AA14..AA13&lt;br /&gt;
    \--------------------- Map Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Enable''': A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
* '''RAM Bank #WE''': Low-Active Write-Enable lines for the two least-significant RAM bank bits in [[#RAM Bank Register]]. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
* '''Map Enable''': Setting this bit will disable write access to special register bits and disable the forced ROM Address line masking. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
   \___/ \____________/&lt;br /&gt;
     |           \-------- ROM Bank RA18..RA14&lt;br /&gt;
     \-------------------- ROM Bank RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''ROM Bank RA18..RA14''': These bits select the lower ROM address lines. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14 based only on bits not masked by ROM Bank #WE/Mask RA18..RA15 in [[#Mode Register]].&lt;br /&gt;
* '''ROM Bank RA20..RA19''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \___/ \___/&lt;br /&gt;
    |   |     |     \----- RAM Bank AA14..AA13&lt;br /&gt;
    |   |     \----------- RAM Bank AA16..AA15&lt;br /&gt;
    |   \----------------- ROM Bank RA22..RA21&lt;br /&gt;
    \--------------------- MBC1 Mode #WE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Bank AA14..AA13''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. The MBC1 mode settings still apply, see [[#Mode Register]].&lt;br /&gt;
* '''RAM Bank AA16..AA15''': These bits select the upper RAM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''ROM Bank RA22..RA21''': These bits select the upper ROM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''MBC1 Mode #WE''': Low-Active Write Enable for MBC1 Mode in [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \_________/  |  |&lt;br /&gt;
    |      |       |  \--- MBC1 Mode&lt;br /&gt;
    |      |       \------ Unknown&lt;br /&gt;
    |      \-------------- ROM Bank #WE/Mask RA18..RA15&lt;br /&gt;
    \--------------------- Multiplexer for AA14..AA13 and RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''MBC1 Mode''': Selects the MBC1 operating mode. 0 for 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode and 1 for 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. Can only be written when '''MBC1 Mode #WE''' in [[#RAM Bank Register]] is reset.&lt;br /&gt;
* '''Unknown''': Setting or resetting this bit had no observable effect.&lt;br /&gt;
* '''ROM Bank #WE/Mask RA18..RA15''': Low-Active Write-Enable for RA18..RA15 in [[#ROM Bank Register]] as well as mask for zero-adjusting RA18..RA15. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''Multiplexer''': The multiplexer will switch the bits output to pins AA14..AA13 and RA20..RA19. Barring MBC1 Mode logic: when reset, pins will be driven from register contents; when set, pins will be driven from the other register, i.e. RA20..RA19 will be driven by [[#RAM Bank Register]] and AA14..AA13 will be driven by [[#ROM Bank Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
Operating the MMM01 can be quite complex and the register contents are not straightforward. This section will detail the programming model and give example configurations.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 has two modes of operation ''mapped'' and ''unmapped''. It defaults to ''unmapped'' after reset.&lt;br /&gt;
&lt;br /&gt;
In ''unmapped'' state, the upper ROM address lines RA22..RA15 are all forced to '1', meaning the ROM entry point will be in ROM bank 0x1FE with the only other accessible ROM bank being 0x1FF.&lt;br /&gt;
&lt;br /&gt;
This is used to lock write access to the upper bits of the known [[MBC1]] registers after base ROM and RAM banks and masks have been set up.&lt;br /&gt;
&lt;br /&gt;
The only way to ''unmap'' the mapper after ''mapping'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Programming Model ==&lt;br /&gt;
&lt;br /&gt;
All registers are live, e.g. Setting the RAM Bank #WE bits and subsequently writing to RAM Bank AA14..AA13 won't work -- no matter if in ''mapped'' of ''unmapped'' state. Therefore, there is a certain order in which registers are optimally written:&lt;br /&gt;
&lt;br /&gt;
# ROM Bank Register&lt;br /&gt;
# Mode Register&lt;br /&gt;
# RAM Register&lt;br /&gt;
# RAM Enable&lt;br /&gt;
&lt;br /&gt;
Not all of Nintendo's games that use MMM01 keep with this order. However, due to the individual games' sizes and use of RAM banks, this isn't noticeable when the games don't misbehave.&lt;br /&gt;
&lt;br /&gt;
Most Rom Address line changes cannot be observed in ''unmapped'' mode due to the mapper starting at ROM bank 0x1FE and 0x1FF (depending on A14) until ''mapped''.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 0: 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;0&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (common) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (uncommon) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is probably not the intended use case.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Remarks =&lt;br /&gt;
&lt;br /&gt;
== Unknown Bit ==&lt;br /&gt;
&lt;br /&gt;
There is an Unknown bit in [[#Mode Register]] whose use -- if any -- could not be determined through testing. It is definitely not ROM Bank RA14 #WE as RA14 can be written at all times -- hence there cannot be a single bank mapped to both regions. It might be part of ROM Bank RA14 Mask and an Engineer might have missed that the zero-adjustment logic means that this bit is not necessary.&lt;br /&gt;
&lt;br /&gt;
== SRAM Enable/Disable ==&lt;br /&gt;
&lt;br /&gt;
The most glaringly missing feature of MMM01 is an option to disable SRAM access for individual games. The Unknown bit in [[#Mode Register]] does not provide for this either. The only commercial cartridge containing MMM01 and SRAM is Momotarou Collection 2 and it sacrifices one RAM bank to make sure that one game has no chance of deleting the other's save file.&lt;br /&gt;
&lt;br /&gt;
Having to spend 64&amp;amp;nbsp;kBit to ''disable'' SRAM access seems like a waste considering a simple OR-gate could have stopped SRAM access.&lt;br /&gt;
&lt;br /&gt;
== Separate MBC1 Mode #WE ==&lt;br /&gt;
&lt;br /&gt;
The MBC1 Mode #WE stands out as being separated from mapping logic. Instead, if its #WE is not deasserted, it can be freely written even in mapped mode. However, the address line multiplexing for 16&amp;amp;nbsp;Mbit and 4&amp;amp;nbsp;Mbit does not switch with the mode setting -- which given a fixed ROM/SRAM wiring on the cartridge -- would need to be done in order for a hypothetical 16&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit mode to be feasible.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MMM01 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(6 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(22 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(16 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MMM01;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MMM01 is&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r    : std_logic_vector(3 downto 0);&lt;br /&gt;
signal ram_bank_we_n_r : std_logic_vector(1 downto 0);&lt;br /&gt;
signal latch_r         : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_r      : std_logic_vector(8 downto 0);&lt;br /&gt;
signal ram_bank_r      : std_logic_vector(3 downto 0);&lt;br /&gt;
signal mode_we_n_r     : std_logic_vector(6 downto 6);&lt;br /&gt;
signal mode_r          : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_we_n_r : std_logic_vector(4 downto 1);&lt;br /&gt;
signal mux_r           : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_int          : std_logic_vector(4 downto 0);&lt;br /&gt;
signal aa_int          : std_logic_vector(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_lo           : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ra_mask         : std_logic_vector(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
alias rom_bank_r_lo : std_logic_vector(4 downto 0) is rom_bank_r(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A(15) = '0' and RD_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
ra_lo &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
         rom_bank_r_lo;&lt;br /&gt;
&lt;br /&gt;
ra_mask &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
           rom_bank_we_n_r &amp;amp; &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ra_int &amp;lt;= &amp;quot;00000&amp;quot; when (A(14) = '0') else&lt;br /&gt;
          ra_lo   when ((ra_lo and not(ra_mask)) /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
          &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
aa_int &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
          ram_bank_r(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
AA(16 downto 15) &amp;lt;= ram_bank_r(3 downto 2);&lt;br /&gt;
AA(14 downto 13) &amp;lt;= aa_int when (mux_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(22 downto 21) &amp;lt;= &amp;quot;11&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(8 downto 7);&lt;br /&gt;
&lt;br /&gt;
RA(20 downto 19) &amp;lt;= &amp;quot;11&amp;quot;   when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    aa_int when (mux_r = &amp;quot;1&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= (ra_lo and ra_mask) or (ra_int and not(ra_mask));&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
		ram_bank_we_n_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
		latch_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_we_n_r &amp;lt;= D(5 downto 4);&lt;br /&gt;
			latch_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(6 downto 0) &amp;lt;= &amp;quot;0000000&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(0) &amp;lt;= D(0);&lt;br /&gt;
		&lt;br /&gt;
		for i in rom_bank_we_n_r'range loop&lt;br /&gt;
			if (rom_bank_we_n_r(i) = '0') then&lt;br /&gt;
				rom_bank_r_lo(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			rom_bank_r(6 downto 5) &amp;lt;= D(6 downto 5);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		rom_bank_r(8 downto 7) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in ram_bank_we_n_r'range loop&lt;br /&gt;
			if (ram_bank_we_n_r(i) = '0') then&lt;br /&gt;
				ram_bank_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_r(3 downto 2) &amp;lt;= D(3 downto 2);&lt;br /&gt;
			rom_bank_r(8 downto 7) &amp;lt;= D(5 downto 4);&lt;br /&gt;
			mode_we_n_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
		rom_bank_we_n_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		mux_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in mode_we_n_r'range loop&lt;br /&gt;
			if (mode_we_n_r(i) = '0') then&lt;br /&gt;
				mode_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;1&amp;quot;) then&lt;br /&gt;
			rom_bank_we_n_r &amp;lt;= D(5 downto 2);&lt;br /&gt;
			mux_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=139</id>
		<title>Sachen MMC1</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=139"/>
		<updated>2018-08-23T14:47:35Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Pinouts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC1 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinouts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;350px&amp;quot; heights=&amp;quot;400px&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Image:Sachen MMC1 Pinout.png&lt;br /&gt;
Image:Sachen MMC1 Rom Pinout.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1+ROM&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 5%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 45%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|1, 36&lt;br /&gt;
|1&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|21, 35&lt;br /&gt;
|17&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|7&amp;amp;ndash;8, 26&lt;br /&gt;
|GND?&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply or unused pin.&lt;br /&gt;
|-&lt;br /&gt;
|18&amp;amp;ndash;20, 22&amp;amp;ndash;26&lt;br /&gt;
|14&amp;amp;ndash;16, 18&amp;amp;ndash;22&lt;br /&gt;
|D0&amp;amp;ndash;D7&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|25&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|2&amp;amp;ndash;6, 32, 7, 28, 30, 9, 33&amp;amp;ndash;34, 27&lt;br /&gt;
|13&amp;amp;ndash;9, 6&amp;amp;ndash;4, 29&amp;amp;ndash;28, 24, 27, 3, 30&amp;amp;ndash;31, 23&lt;br /&gt;
|A0&amp;amp;ndash;A15&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|40&amp;amp;ndash;37&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA0, RA1, RA4, RA6&lt;br /&gt;
|O&lt;br /&gt;
|Scrambled lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA7&lt;br /&gt;
|O&lt;br /&gt;
|Lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31, 17&amp;amp;ndash;10&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA14&amp;amp;ndash;RA21&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|NC&lt;br /&gt;
|N/A&lt;br /&gt;
|Not connected.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC1 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC1 has two modes of operation ''locked'' and ''unlocked''. It defaults to ''locked'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG bootstrap ROM. While ''locked'', the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x31 transitions of A15 from high to low. Starting on the last transition, RA7 will follow A7. All control signals are don't cares for this.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register]] and [[#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are six high address lines, two more landing pads (not bonded) visible and I/O lines numbered (15 next to trace with 13 visible traces) on the 1231 PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
== Integrated ROM ==&lt;br /&gt;
&lt;br /&gt;
The integrated ROM behaves as a regular ROM chip that's connected to the An resp. RAn address and Dn data lines.&lt;br /&gt;
Depending on the bonded ROM smaller ROMs may have an additional low-active CE line on RA17 or RA18.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=138</id>
		<title>Sachen MMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=138"/>
		<updated>2018-08-23T14:47:34Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Pinouts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC2 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinouts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;350px&amp;quot; heights=&amp;quot;400px&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Image:Sachen MMC2 Pinout.png&lt;br /&gt;
Image:Sachen MMC2 Rom PinoutA.png&lt;br /&gt;
Image:Sachen MMC2 Rom PinoutB.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC2&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC2+ROM A (MMC2+ROM B)&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 5%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 45%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1, 36 (34)&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|21, 38&lt;br /&gt;
|32 (30)&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|(30&amp;amp;ndash;31)&lt;br /&gt;
|NC?&lt;br /&gt;
|N/A&lt;br /&gt;
|Unused pin.&lt;br /&gt;
|-&lt;br /&gt;
|6&amp;amp;ndash;5, 37&amp;amp;ndash;36, 27&amp;amp;ndash;26, 16&amp;amp;ndash;15&lt;br /&gt;
|21&amp;amp;ndash;28&lt;br /&gt;
|D0&amp;amp;ndash;D7&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|29&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|35&amp;amp;ndash;32, 28, 25, 31&amp;amp;ndash;29, 24&amp;amp;ndash;23, 20, 17&lt;br /&gt;
|5&amp;amp;ndash;20&lt;br /&gt;
|A0&amp;amp;ndash;A15&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|4&amp;amp;ndash;2, 40&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA0, RA1, RA4, RA6&lt;br /&gt;
|O&lt;br /&gt;
|Scrambled lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|39&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA7&lt;br /&gt;
|O&lt;br /&gt;
|Lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|14&amp;amp;ndash;7&lt;br /&gt;
|35 (33)&lt;br /&gt;
|RA14&amp;amp;ndash;RA21 resp. RA19&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|34&amp;amp;ndash;33 (32&amp;amp;ndash;31)&lt;br /&gt;
|OPT1&amp;amp;ndash;OPT2&lt;br /&gt;
|I (PD)&lt;br /&gt;
|Option Input Pins&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|NC&lt;br /&gt;
|N/A&lt;br /&gt;
|Not connected.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC2 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
Sachen added a detection method for Game Boy Color to successfully perform the logo switch, since the Game Boy Color changed the way the logo is checked.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC2 has three modes of operation ''locked DMG'', ''locked CGB'' and ''unlocked''. It defaults to ''locked DMG'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG and CGB bootstrap ROMs. Because the DMG bootstrap copies the logo first and checks after displaying it, while the CGB bootstrap checks first and only afterwards uses the actual logo, Sachen devised a mechanism to detect a CGB using the fact that the CGB bootstrap writes to WRAM, while the DMG bootstrap doesn't.&lt;br /&gt;
&lt;br /&gt;
While in ''locked DMG'' and ''unlocked'' modes, RA7 will follow A7. While in ''locked CGB'' mode, the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x30 transitions of A15 from low to high to go from ''locked DMG'' mode to ''locked CGB'' mode. Starting on the last transition, RA7 will remain set.&lt;br /&gt;
Going from ''locked CGB'' mode to ''unlocked'' mode requires another 0x30 transitions of A15 from low to high. Starting on the last transition, RA7 will follow A7 again.&lt;br /&gt;
The MMC2 mapper will skip directly from ''locked DMG'' mode to ''locked CGB'' on a rising edge of CS. The A15 transition counter is reset when changing from ''locked DMG'' to ''locked CGB'' mode.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''.&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register|#Base ROM Bank Register]] and [[#ROM bank mask register|#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are eight high address lines on the SA8MBT6-2 w/o BAT PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
== Integrated ROM ==&lt;br /&gt;
&lt;br /&gt;
The integrated ROM behaves as a regular ROM chip that's connected to the An resp. RAn address and Dn data lines.&lt;br /&gt;
ROM chip enable behavior is: &amp;lt;pre&amp;gt;#ROM_CS = A15 or RA20 or OPT2&amp;lt;/pre&amp;gt;&lt;br /&gt;
The highest address line (RA18) will behave as follows: &amp;lt;pre&amp;gt;RA18 = MMC1_RA18 or OPT1&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=137</id>
		<title>Sachen MMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=137"/>
		<updated>2018-08-23T14:45:06Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Pinouts */ add pinouts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC2 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinouts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;350px&amp;quot; heights=&amp;quot;400px&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Image:Sachen MMC2 Pinout.png&lt;br /&gt;
Image:Sachen MMC2 Rom PinoutA.png&lt;br /&gt;
Image:Sachen MMC2 Rom PinoutB.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC2&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC2+ROM A (MMC2+ROM B)&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 5%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 45%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1, 36 (34)&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|21, 38&lt;br /&gt;
|32 (30)&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|(30&amp;amp;ndash;31)&lt;br /&gt;
|NC?&lt;br /&gt;
|N/A&lt;br /&gt;
|Unused pin.&lt;br /&gt;
|-&lt;br /&gt;
|6&amp;amp;ndash;5, 37&amp;amp;ndash;36, 27&amp;amp;ndash;26, 16&amp;amp;ndash;15&lt;br /&gt;
|21&amp;amp;ndash;28&lt;br /&gt;
|D0&amp;amp;ndash;D7&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|29&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|35&amp;amp;ndash;32, 28, 25, 31&amp;amp;ndash;29, 24&amp;amp;ndash;23, 20, 17&lt;br /&gt;
|5&amp;amp;ndash;20&lt;br /&gt;
|A0&amp;amp;ndash;A15&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|4&amp;amp;ndash;2, 40&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA0, RA1, RA4, RA6&lt;br /&gt;
|O&lt;br /&gt;
|Scrambled lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|39&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA7&lt;br /&gt;
|O&lt;br /&gt;
|Lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|14&amp;amp;ndash;7&lt;br /&gt;
|35 (33)&lt;br /&gt;
|RA14&amp;amp;ndash;RA21 resp. RA19&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|34&amp;amp;ndash;33 (32&amp;amp;ndash;31)&lt;br /&gt;
|OPT1&amp;amp;ndash;OPT2&lt;br /&gt;
|I (PD)&lt;br /&gt;
|Option Input Pins&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC2 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
Sachen added a detection method for Game Boy Color to successfully perform the logo switch, since the Game Boy Color changed the way the logo is checked.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC2 has three modes of operation ''locked DMG'', ''locked CGB'' and ''unlocked''. It defaults to ''locked DMG'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG and CGB bootstrap ROMs. Because the DMG bootstrap copies the logo first and checks after displaying it, while the CGB bootstrap checks first and only afterwards uses the actual logo, Sachen devised a mechanism to detect a CGB using the fact that the CGB bootstrap writes to WRAM, while the DMG bootstrap doesn't.&lt;br /&gt;
&lt;br /&gt;
While in ''locked DMG'' and ''unlocked'' modes, RA7 will follow A7. While in ''locked CGB'' mode, the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x30 transitions of A15 from low to high to go from ''locked DMG'' mode to ''locked CGB'' mode. Starting on the last transition, RA7 will remain set.&lt;br /&gt;
Going from ''locked CGB'' mode to ''unlocked'' mode requires another 0x30 transitions of A15 from low to high. Starting on the last transition, RA7 will follow A7 again.&lt;br /&gt;
The MMC2 mapper will skip directly from ''locked DMG'' mode to ''locked CGB'' on a rising edge of CS. The A15 transition counter is reset when changing from ''locked DMG'' to ''locked CGB'' mode.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''.&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register|#Base ROM Bank Register]] and [[#ROM bank mask register|#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are eight high address lines on the SA8MBT6-2 w/o BAT PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
== Integrated ROM ==&lt;br /&gt;
&lt;br /&gt;
The integrated ROM behaves as a regular ROM chip that's connected to the An resp. RAn address and Dn data lines.&lt;br /&gt;
ROM chip enable behavior is: &amp;lt;pre&amp;gt;#ROM_CS = A15 or RA20 or OPT2&amp;lt;/pre&amp;gt;&lt;br /&gt;
The highest address line (RA18) will behave as follows: &amp;lt;pre&amp;gt;RA18 = MMC1_RA18 or OPT1&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC2_Rom_PinoutB.png&amp;diff=136</id>
		<title>File:Sachen MMC2 Rom PinoutB.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC2_Rom_PinoutB.png&amp;diff=136"/>
		<updated>2018-08-23T14:32:46Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Pinout for Sachen's MMC2 with integrated ROM variant B.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Pinout for Sachen's MMC2 with integrated ROM variant B.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC2_Rom_PinoutA.png&amp;diff=135</id>
		<title>File:Sachen MMC2 Rom PinoutA.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC2_Rom_PinoutA.png&amp;diff=135"/>
		<updated>2018-08-23T14:32:33Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Pinout for Sachen's MMC2 with integrated ROM variant A.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Pinout for Sachen's MMC2 with integrated ROM variant A.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC2_Pinout.png&amp;diff=134</id>
		<title>File:Sachen MMC2 Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC2_Pinout.png&amp;diff=134"/>
		<updated>2018-08-23T14:32:02Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Pinout for Sachen's MMC2.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Pinout for Sachen's MMC2.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=133</id>
		<title>Sachen MMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=133"/>
		<updated>2018-08-23T14:30:41Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Behavior */ document ROM behavior&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC2 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC2 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
Sachen added a detection method for Game Boy Color to successfully perform the logo switch, since the Game Boy Color changed the way the logo is checked.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC2 has three modes of operation ''locked DMG'', ''locked CGB'' and ''unlocked''. It defaults to ''locked DMG'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG and CGB bootstrap ROMs. Because the DMG bootstrap copies the logo first and checks after displaying it, while the CGB bootstrap checks first and only afterwards uses the actual logo, Sachen devised a mechanism to detect a CGB using the fact that the CGB bootstrap writes to WRAM, while the DMG bootstrap doesn't.&lt;br /&gt;
&lt;br /&gt;
While in ''locked DMG'' and ''unlocked'' modes, RA7 will follow A7. While in ''locked CGB'' mode, the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x30 transitions of A15 from low to high to go from ''locked DMG'' mode to ''locked CGB'' mode. Starting on the last transition, RA7 will remain set.&lt;br /&gt;
Going from ''locked CGB'' mode to ''unlocked'' mode requires another 0x30 transitions of A15 from low to high. Starting on the last transition, RA7 will follow A7 again.&lt;br /&gt;
The MMC2 mapper will skip directly from ''locked DMG'' mode to ''locked CGB'' on a rising edge of CS. The A15 transition counter is reset when changing from ''locked DMG'' to ''locked CGB'' mode.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''.&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register|#Base ROM Bank Register]] and [[#ROM bank mask register|#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are eight high address lines on the SA8MBT6-2 w/o BAT PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
== Integrated ROM ==&lt;br /&gt;
&lt;br /&gt;
The integrated ROM behaves as a regular ROM chip that's connected to the An resp. RAn address and Dn data lines.&lt;br /&gt;
ROM chip enable behavior is: &amp;lt;pre&amp;gt;#ROM_CS = A15 or RA20 or OPT2&amp;lt;/pre&amp;gt;&lt;br /&gt;
The highest address line (RA18) will behave as follows: &amp;lt;pre&amp;gt;RA18 = MMC1_RA18 or OPT1&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=132</id>
		<title>Sachen MMC1</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=132"/>
		<updated>2018-08-23T14:26:32Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Behavior */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC1 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinouts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;350px&amp;quot; heights=&amp;quot;400px&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Image:Sachen MMC1 Pinout.png&lt;br /&gt;
Image:Sachen MMC1 Rom Pinout.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1+ROM&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 5%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 45%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|1, 36&lt;br /&gt;
|1&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|21, 35&lt;br /&gt;
|17&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|7&amp;amp;ndash;8, 26&lt;br /&gt;
|GND?&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply or unused pin.&lt;br /&gt;
|-&lt;br /&gt;
|18&amp;amp;ndash;20, 22&amp;amp;ndash;26&lt;br /&gt;
|14&amp;amp;ndash;16, 18&amp;amp;ndash;22&lt;br /&gt;
|D0&amp;amp;ndash;D7&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|25&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|2&amp;amp;ndash;6, 32, 7, 28, 30, 9, 33&amp;amp;ndash;34, 27&lt;br /&gt;
|13&amp;amp;ndash;9, 6&amp;amp;ndash;4, 29&amp;amp;ndash;28, 24, 27, 3, 30&amp;amp;ndash;31, 23&lt;br /&gt;
|A0&amp;amp;ndash;A15&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|40&amp;amp;ndash;37&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA0, RA1, RA4, RA6&lt;br /&gt;
|O&lt;br /&gt;
|Scrambled lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA7&lt;br /&gt;
|O&lt;br /&gt;
|Lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31, 17&amp;amp;ndash;10&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA14&amp;amp;ndash;RA21&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC1 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC1 has two modes of operation ''locked'' and ''unlocked''. It defaults to ''locked'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG bootstrap ROM. While ''locked'', the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x31 transitions of A15 from high to low. Starting on the last transition, RA7 will follow A7. All control signals are don't cares for this.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register]] and [[#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are six high address lines, two more landing pads (not bonded) visible and I/O lines numbered (15 next to trace with 13 visible traces) on the 1231 PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
== Integrated ROM ==&lt;br /&gt;
&lt;br /&gt;
The integrated ROM behaves as a regular ROM chip that's connected to the An resp. RAn address and Dn data lines.&lt;br /&gt;
Depending on the bonded ROM smaller ROMs may have an additional low-active CE line on RA17 or RA18.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=131</id>
		<title>Sachen MMC1</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=131"/>
		<updated>2018-08-23T14:22:40Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Pinouts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC1 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinouts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;350px&amp;quot; heights=&amp;quot;400px&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Image:Sachen MMC1 Pinout.png&lt;br /&gt;
Image:Sachen MMC1 Rom Pinout.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1&lt;br /&gt;
!style=&amp;quot;width: 15%;&amp;quot; | Pin No. MMC1+ROM&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 5%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 45%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|1, 36&lt;br /&gt;
|1&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|21, 35&lt;br /&gt;
|17&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|7&amp;amp;ndash;8, 26&lt;br /&gt;
|GND?&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply or unused pin.&lt;br /&gt;
|-&lt;br /&gt;
|18&amp;amp;ndash;20, 22&amp;amp;ndash;26&lt;br /&gt;
|14&amp;amp;ndash;16, 18&amp;amp;ndash;22&lt;br /&gt;
|D0&amp;amp;ndash;D7&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|25&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|2&amp;amp;ndash;6, 32, 7, 28, 30, 9, 33&amp;amp;ndash;34, 27&lt;br /&gt;
|13&amp;amp;ndash;9, 6&amp;amp;ndash;4, 29&amp;amp;ndash;28, 24, 27, 3, 30&amp;amp;ndash;31, 23&lt;br /&gt;
|A0&amp;amp;ndash;A15&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|40&amp;amp;ndash;37&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA0, RA1, RA4, RA6&lt;br /&gt;
|O&lt;br /&gt;
|Scrambled lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA7&lt;br /&gt;
|O&lt;br /&gt;
|Lower ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|31, 17&amp;amp;ndash;10&lt;br /&gt;
|&amp;amp;mdash;&lt;br /&gt;
|RA14&amp;amp;ndash;RA21&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC1 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC1 has two modes of operation ''locked'' and ''unlocked''. It defaults to ''locked'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG bootstrap ROM. While ''locked'', the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x31 transitions of A15 from high to low. Starting on the last transition, RA7 will follow A7. All control signals are don't cares for this.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register]] and [[#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are six high address lines, two more landing pads (not bonded) visible and I/O lines numbered (15 next to trace with 13 visible traces) on the 1231 PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC1_Rom_Pinout.png&amp;diff=130</id>
		<title>File:Sachen MMC1 Rom Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC1_Rom_Pinout.png&amp;diff=130"/>
		<updated>2018-08-23T13:58:47Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Pinout for Sachen's MMC1 with integrated ROM.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Pinout for Sachen's MMC1 with integrated ROM.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC1_Pinout.png&amp;diff=129</id>
		<title>File:Sachen MMC1 Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=File:Sachen_MMC1_Pinout.png&amp;diff=129"/>
		<updated>2018-08-23T13:58:25Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Pinout for Sachen's MMC1.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Pinout for Sachen's MMC1.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=128</id>
		<title>Sachen MMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=128"/>
		<updated>2018-08-23T12:24:45Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: switch Header Scramble and Multi Memory Remap sections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC2 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC2 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
Sachen added a detection method for Game Boy Color to successfully perform the logo switch, since the Game Boy Color changed the way the logo is checked.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC2 has three modes of operation ''locked DMG'', ''locked CGB'' and ''unlocked''. It defaults to ''locked DMG'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG and CGB bootstrap ROMs. Because the DMG bootstrap copies the logo first and checks after displaying it, while the CGB bootstrap checks first and only afterwards uses the actual logo, Sachen devised a mechanism to detect a CGB using the fact that the CGB bootstrap writes to WRAM, while the DMG bootstrap doesn't.&lt;br /&gt;
&lt;br /&gt;
While in ''locked DMG'' and ''unlocked'' modes, RA7 will follow A7. While in ''locked CGB'' mode, the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x30 transitions of A15 from low to high to go from ''locked DMG'' mode to ''locked CGB'' mode. Starting on the last transition, RA7 will remain set.&lt;br /&gt;
Going from ''locked CGB'' mode to ''unlocked'' mode requires another 0x30 transitions of A15 from low to high. Starting on the last transition, RA7 will follow A7 again.&lt;br /&gt;
The MMC2 mapper will skip directly from ''locked DMG'' mode to ''locked CGB'' on a rising edge of CS. The A15 transition counter is reset when changing from ''locked DMG'' to ''locked CGB'' mode.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''.&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register|#Base ROM Bank Register]] and [[#ROM bank mask register|#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are eight high address lines on the SA8MBT6-2 w/o BAT PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=127</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=127"/>
		<updated>2018-02-15T23:20:15Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Is this real magic?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this popup??&lt;br /&gt;
Your edit was saved.&lt;br /&gt;
Derp&lt;br /&gt;
Narf&lt;br /&gt;
Hmm&lt;br /&gt;
Check console&lt;br /&gt;
Css magic?&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MediaWiki:Common.css&amp;diff=126</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MediaWiki:Common.css&amp;diff=126"/>
		<updated>2018-02-15T23:19:49Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: See if this does something&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.pintable td {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.pintable td:nth-child(4) {&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.wikitable &amp;gt; * &amp;gt; tr &amp;gt; td {&lt;br /&gt;
    padding: 0.2em 0.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc { float: right; }&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=125</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=125"/>
		<updated>2018-02-15T23:14:10Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this popup??&lt;br /&gt;
Your edit was saved.&lt;br /&gt;
Derp&lt;br /&gt;
Narf&lt;br /&gt;
Hmm&lt;br /&gt;
Check console&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=124</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=124"/>
		<updated>2018-02-15T23:07:43Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Mark Default Minor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this popup??&lt;br /&gt;
Your edit was saved.&lt;br /&gt;
Derp&lt;br /&gt;
Narf&lt;br /&gt;
Hmm&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=123</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=123"/>
		<updated>2018-02-15T23:04:08Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Zonk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this popup??&lt;br /&gt;
Your edit was saved.&lt;br /&gt;
Derp&lt;br /&gt;
Narf&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=122</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=122"/>
		<updated>2018-02-15T23:03:51Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Hurr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this popup??&lt;br /&gt;
Your edit was saved.&lt;br /&gt;
Derp&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=121</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=121"/>
		<updated>2018-02-15T22:57:43Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Your edit was saved.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this popup??&lt;br /&gt;
Your edit was saved.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=120</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=120"/>
		<updated>2018-02-15T22:55:40Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: adsada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this popup??&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=119</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=119"/>
		<updated>2018-02-15T22:52:25Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: sdasdasd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test&lt;br /&gt;
2&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=118</id>
		<title>User:Tauwasser/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=User:Tauwasser/Sandbox&amp;diff=118"/>
		<updated>2018-02-15T22:51:42Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Created page with &amp;quot;Test&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_Mappers&amp;diff=117</id>
		<title>Sachen Mappers</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_Mappers&amp;diff=117"/>
		<updated>2018-02-15T22:50:42Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: split pages up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Sachen manufactured unlicensed Game Boy and Game Boy Color games from ~2000 until 2007.&lt;br /&gt;
&lt;br /&gt;
Two Sachen Mappers are thought to exist. Both exist in a stand-alone variant -- just the mapper under glob top -- and an integrated variant -- mapper and ROM are under the same glob top on the PCB.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 30%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 50%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|[[Sachen MMC1]]&lt;br /&gt;
|MMC for mono 4B games.&lt;br /&gt;
|-&lt;br /&gt;
|[[Sachen MMC2]]&lt;br /&gt;
|MMC for mono/color 1B games.&lt;br /&gt;
&lt;br /&gt;
MMC for color 4B games.&lt;br /&gt;
&lt;br /&gt;
MMC for color 6B games.&lt;br /&gt;
&lt;br /&gt;
MMC for color 8B games.&lt;br /&gt;
&lt;br /&gt;
MMC for color 16B games.&lt;br /&gt;
&lt;br /&gt;
MMC for color 31B games.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 0x6000 - 0x7FFF ==&lt;br /&gt;
&lt;br /&gt;
Writing to the 0x6000-0x7FFF range did not affect mapping in any way. I did an exhaustive test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for (k= 0x0000; k &amp;lt; 0x2000; k++) {&lt;br /&gt;
	for (l = 0x00; l &amp;lt; 0x100u; l++) {&lt;br /&gt;
		// reset to base RB 0x00 with mask 0x00 here&lt;br /&gt;
&lt;br /&gt;
		// map RB 0x04 with mask 0xFC&lt;br /&gt;
		writeb(0x2000u, 0xFFu); // enable map regs&lt;br /&gt;
		writeb(0x0000u, 0x04u); // base RB&lt;br /&gt;
		writeb(0x4000u, 0xFCu); // mask&lt;br /&gt;
		writeb(0x6000 | k, l);  // see if this does anything&lt;br /&gt;
		writeb(0x2000u, 0x00u); // disable map regs&lt;br /&gt;
&lt;br /&gt;
		//check RB 0x00 - RB 0x04 against known hashes and report error&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 0xA000 - 0xBFFF ==&lt;br /&gt;
&lt;br /&gt;
Reading from this range produced no results.&lt;br /&gt;
&lt;br /&gt;
= Miscellaneous Information =&lt;br /&gt;
&lt;br /&gt;
Too bad Sachen screwed up (on 4B-007 at least) and actually writes the base RB to the mask register and the mask to the base RB register, thus all games having broken masking. But due to power-of-2 sizes of RBs and masks, it turns out that only a few extra RBs are mappable which shouldn't be instead of the games skipping ROM banks.&lt;br /&gt;
&lt;br /&gt;
I noticed that the Sachen logo check -- VRAM comparison of Sachen logo starting at 0x8010 -- was disabled in the mapped games. I also noticed that games do write to 0x0000-0x1FFF while being mapped, so this may have some effect. Technically, since A15..A6, A4, A1, A0 are connected, there might be many registers mapped. Initial tests show this not to be the case.&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=116</id>
		<title>Sachen MMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=116"/>
		<updated>2018-02-15T22:48:01Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: fix relative links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC2 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC2 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
Sachen added a detection method for Game Boy Color to successfully perform the logo switch, since the Game Boy Color changed the way the logo is checked.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC2 has three modes of operation ''locked DMG'', ''locked CGB'' and ''unlocked''. It defaults to ''locked DMG'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG and CGB bootstrap ROMs. Because the DMG bootstrap copies the logo first and checks after displaying it, while the CGB bootstrap checks first and only afterwards uses the actual logo, Sachen devised a mechanism to detect a CGB using the fact that the CGB bootstrap writes to WRAM, while the DMG bootstrap doesn't.&lt;br /&gt;
&lt;br /&gt;
While in ''locked DMG'' and ''unlocked'' modes, RA7 will follow A7. While in ''locked CGB'' mode, the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x30 transitions of A15 from low to high to go from ''locked DMG'' mode to ''locked CGB'' mode. Starting on the last transition, RA7 will remain set.&lt;br /&gt;
Going from ''locked CGB'' mode to ''unlocked'' mode requires another 0x30 transitions of A15 from low to high. Starting on the last transition, RA7 will follow A7 again.&lt;br /&gt;
The MMC2 mapper will skip directly from ''locked DMG'' mode to ''locked CGB'' on a rising edge of CS. The A15 transition counter is reset when changing from ''locked DMG'' to ''locked CGB'' mode.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''.&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register|#Base ROM Bank Register]] and [[#ROM bank mask register|#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are eight high address lines on the SA8MBT6-2 w/o BAT PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=115</id>
		<title>Sachen MMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC2&amp;diff=115"/>
		<updated>2018-02-15T22:31:22Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: split into own page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC2 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC2 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
Sachen added a detection method for Game Boy Color to successfully perform the logo switch, since the Game Boy Color changed the way the logo is checked.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC2 has three modes of operation ''locked DMG'', ''locked CGB'' and ''unlocked''. It defaults to ''locked DMG'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG and CGB bootstrap ROMs. Because the DMG bootstrap copies the logo first and checks after displaying it, while the CGB bootstrap checks first and only afterwards uses the actual logo, Sachen devised a mechanism to detect a CGB using the fact that the CGB bootstrap writes to WRAM, while the DMG bootstrap doesn't.&lt;br /&gt;
&lt;br /&gt;
While in ''locked DMG'' and ''unlocked'' modes, RA7 will follow A7. While in ''locked CGB'' mode, the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x30 transitions of A15 from low to high to go from ''locked DMG'' mode to ''locked CGB'' mode. Starting on the last transition, RA7 will remain set.&lt;br /&gt;
Going from ''locked CGB'' mode to ''unlocked'' mode requires another 0x30 transitions of A15 from low to high. Starting on the last transition, RA7 will follow A7 again.&lt;br /&gt;
The MMC2 mapper will skip directly from ''locked DMG'' mode to ''locked CGB'' on a rising edge of CS. The A15 transition counter is reset when changing from ''locked DMG'' to ''locked CGB'' mode.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''.&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register_2|#Base ROM Bank Register]] and [[#ROM bank mask register_2|#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are eight high address lines on the SA8MBT6-2 w/o BAT PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register_2|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register_2|#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=114</id>
		<title>Sachen MMC1</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Sachen_MMC1&amp;diff=114"/>
		<updated>2018-02-15T22:26:58Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: split into own page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sachen's MMC1 can be used to address up to 32 Mbit of ROM. It contains provisions for SRAM access.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
= Theory of Operation =&lt;br /&gt;
&lt;br /&gt;
Sachen's MMC1 mappers are used for multi-game N-in-1 cartridges. Individual game ROMs can be remapped so their address space logically starts at ROM bank 0x00 although the individual ROMs might be stored starting at another bank.&lt;br /&gt;
To avoid copyright infringement the game headers are scrambled and the mapper unscrambles them when the header region is read. The mapper also includes a mechanism to switch out the Nintendo logo with a custom logo while still passing the Game Boy Bootstrap logo check. All of these features are also used by various games as a copy-protection mechanism, e.g. ROM mapping, unscrambling and the logo in VRAM are checked to determine if the game is run from an original Sachen cartridge.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Sachen MMC1 has two modes of operation ''locked'' and ''unlocked''. It defaults to ''locked'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to display the Sachen logo instead of the Nintendo logo for the DMG bootstrap ROM. While ''locked'', the mapper will keep RA7 set.&lt;br /&gt;
&lt;br /&gt;
The unlock sequence is 0x31 transitions of A15 from high to low. Starting on the last transition, RA7 will follow A7. All control signals are don't cares for this.&lt;br /&gt;
&lt;br /&gt;
Other functionality seems to be unaffected by the lock register: switching banks and remapping work while ''locked''&lt;br /&gt;
&lt;br /&gt;
The only way to ''lock'' the mapper after ''unlocking'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Header Scramble ==&lt;br /&gt;
&lt;br /&gt;
Sachen chose to scramble the header of their games. When A8 is high, while A15..A9 are low, the mapper will perform the following map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RA0 &amp;lt;= A6&lt;br /&gt;
RA1 &amp;lt;= A4&lt;br /&gt;
RA4 &amp;lt;= A1&lt;br /&gt;
RA6 &amp;lt;= A0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When A8 is low or A15..A9 are not low, RAn lines will track their respective An line.&lt;br /&gt;
&lt;br /&gt;
== Multi Memory Remap ==&lt;br /&gt;
&lt;br /&gt;
Base ROM Bank and ROM Bank Mask Register are used for remapping 0x0000-0x7FFF to be based on a new base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The mapping function is: &amp;lt;pre&amp;gt;(rb &amp;amp; ~mask) | (mask &amp;amp; rb_base)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Memory Map =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x3FFF&amp;lt;/tt&amp;gt;: Mapped ROM bank #0&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x7FFF&amp;lt;/tt&amp;gt;: Mapped Switchable ROM bank&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;: Unmapped&lt;br /&gt;
&lt;br /&gt;
Mapped here means adjusted for absolute Base ROM bank.&lt;br /&gt;
&lt;br /&gt;
The RAn pins depend solely on A14, thus they will alias the &amp;lt;tt&amp;gt;0x0000-0x7FFF&amp;lt;/tt&amp;gt; region to &amp;lt;tt&amp;gt;0x8000-0xFFFF&amp;lt;/tt&amp;gt;. ROM is still only enabled when A15 is low, so no output is produced.&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: Base ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: ROM bank mask register&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
The ROM bank register is zero-adjusted, i.e. if 0x00 is written, 0x01 will be stored. Zero-adjustment is done on all 8 input bits D7..D0. This means, that ROM Bank 0x00 can only be mapped to 0x4000-0x7FFF when the attached ROM is smaller than 32 Mbit and thus aliases 0x80 to 0x00.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x01 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
      \___/      \-------- ROM Bank&lt;br /&gt;
        |&lt;br /&gt;
        \----------------- Map Enable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank bits switch the bank mapped to 0x4000-0x7FFF.&lt;br /&gt;
Map Enable bits are used to enable write access to the [[#Base ROM Bank Register]] and [[#ROM bank mask register]]. 0b11 means these registers can be written, other values will not grant write access.&lt;br /&gt;
&lt;br /&gt;
The width of this register is based off the fact that there are six high address lines, two more landing pads (not bonded) visible and I/O lines numbered (15 next to trace with 13 visible traces) on the 1231 PCB.&lt;br /&gt;
&lt;br /&gt;
== Base ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the base ROM bank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- Base ROM Bank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
== ROM bank mask register ==&lt;br /&gt;
&lt;br /&gt;
This register stores the ROM bank mask.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D7 D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
\_____________________/&lt;br /&gt;
                 \-------- ROM Bank Mask&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This register is writable without limitation when Map Enable in the [[#ROM Bank Register]] is 0b11.&lt;br /&gt;
Changes to this register take immediate effect.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MBC1&amp;diff=113</id>
		<title>MBC1</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MBC1&amp;diff=113"/>
		<updated>2017-06-23T20:30:31Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Mode Register */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MBC1 can be used to address up to 16&amp;amp;nbsp;Mbit of ROM and 256&amp;amp;nbsp;kbit of SRAM, depending on the mode MBC1 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MBC1 Pinout.png|center|x300px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;1&lt;br /&gt;
|D4&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|21&amp;amp;ndash;19&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|18&amp;amp;ndash;14&lt;br /&gt;
|RA18&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|7&amp;amp;ndash;6&lt;br /&gt;
|AA14&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM/RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: SOP127P1200X225-24&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
            \_________/&lt;br /&gt;
                 \-------- RAM Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
         \____________/&lt;br /&gt;
                 \-------- ROM Bank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank selects which bank is mapped to 0x4000-0x7FFF. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX XX XX D1 D0    0x00 @ reset&lt;br /&gt;
                  \___/&lt;br /&gt;
                    \----- RAM Bank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RAM Bank selects which bank is mapped to 0xA000-0xBFFF when in mode 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. When in mode 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit, it can be used to select the upper two ROM address lines.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX XX XX XX D0    0x00 @ reset&lt;br /&gt;
                      |&lt;br /&gt;
                      \--- Mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The mode bit switches between 16&amp;amp;nbsp;Mbit ROM/64&amp;amp;nbsp;kbit SRAM mode ('0') and 4&amp;amp;nbsp;Mbit ROM/256&amp;amp;nbsp;kbit SRAM mode ('1'). When in 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode, address lines AA14&amp;amp;ndash;AA13 switch according to A14. When in 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kbit mode, the upper address lines AA14&amp;amp;ndash;AA13 stay fixed regardless of A14.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MBC1 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(4 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(18 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(14 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MBC1;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MBC1 is&lt;br /&gt;
	&lt;br /&gt;
signal ram_enable_r : std_logic_vector(3 downto 0);&lt;br /&gt;
signal rom_bank_r   : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ram_bank_r   : std_logic_vector(1 downto 0);&lt;br /&gt;
signal mode_r       : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when ((A(15) = '0' and RD_N = '0') or RESET_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= &amp;quot;00000&amp;quot;    when (A(14) = '0' or RESET_N = '0') else&lt;br /&gt;
                    rom_bank_r when (rom_bank_r /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
                    &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
AA(14 downto 13) &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    ram_bank_r;&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= &amp;quot;00000&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram_bank_r &amp;lt;= D(1 downto 0);&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		mode_r &amp;lt;= D(0 downto 0);&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=112</id>
		<title>MMM01</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MMM01&amp;diff=112"/>
		<updated>2017-06-23T17:56:18Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: add mmm01 information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 can be used to address up to 64&amp;amp;nbsp;Mbit of ROM and 1&amp;amp;nbsp;Mbit of SRAM depending on the mode MMM01 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MMM01 Pinout.png|center|x500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;11&lt;br /&gt;
|D6&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|13&amp;amp;ndash;15&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|15, 29, 27, 21&amp;amp;ndash;17, 22&lt;br /&gt;
|RA22&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|26&amp;amp;ndash;23&lt;br /&gt;
|AA16&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: QFP80P900X900-32&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. D6..D0, A15..A13, {{Overline|RD}}, {{Overline|WR}}, {{Overline|CS}} are internally pulled down with ~50&amp;amp;nbsp;kΩ&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \_________/&lt;br /&gt;
    |   |        \-------- RAM Enable&lt;br /&gt;
    |   \----------------- Ram Bank #WE AA14..AA13&lt;br /&gt;
    \--------------------- Map Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Enable''': A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
* '''RAM Bank #WE''': Low-Active Write-Enable lines for the two least-significant RAM bank bits in [[#RAM Bank Register]]. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
* '''Map Enable''': Setting this bit will disable write access to special register bits and disable the forced ROM Address line masking. Can only be written when '''Map Enable''' is reset.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
   \___/ \____________/&lt;br /&gt;
     |           \-------- ROM Bank RA18..RA14&lt;br /&gt;
     \-------------------- ROM Bank RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''ROM Bank RA18..RA14''': These bits select the lower ROM address lines. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14 based only on bits not masked by ROM Bank #WE/Mask RA18..RA15 in [[#Mode Register]].&lt;br /&gt;
* '''ROM Bank RA20..RA19''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \___/ \___/ \___/&lt;br /&gt;
    |   |     |     \----- RAM Bank AA14..AA13&lt;br /&gt;
    |   |     \----------- RAM Bank AA16..AA15&lt;br /&gt;
    |   \----------------- ROM Bank RA22..RA21&lt;br /&gt;
    \--------------------- MBC1 Mode #WE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''RAM Bank AA14..AA13''': These bits select the middle ROM address lines '''or''' the lower RAM address lines depending on the multiplex setting in the [[#Mode Register]]. The MBC1 mode settings still apply, see [[#Mode Register]].&lt;br /&gt;
* '''RAM Bank AA16..AA15''': These bits select the upper RAM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''ROM Bank RA22..RA21''': These bits select the upper ROM address lines. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''MBC1 Mode #WE''': Low-Active Write Enable for MBC1 Mode in [[#Mode Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX D6 D5 D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
    | \_________/  |  |&lt;br /&gt;
    |      |       |  \--- MBC1 Mode&lt;br /&gt;
    |      |       \------ Unknown&lt;br /&gt;
    |      \-------------- ROM Bank #WE/Mask RA18..RA15&lt;br /&gt;
    \--------------------- Multiplexer for AA14..AA13 and RA20..RA19&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''MBC1 Mode''': Selects the MBC1 operating mode. 0 for 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode and 1 for 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. Can only be written when '''MBC1 Mode #WE''' in [[#RAM Bank Register]] is reset.&lt;br /&gt;
* '''Unknown''': Setting or resetting this bit had no observable effect.&lt;br /&gt;
* '''ROM Bank #WE/Mask RA18..RA15''': Low-Active Write-Enable for RA18..RA15 in [[#ROM Bank Register]] as well as mask for zero-adjusting RA18..RA15. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
* '''Multiplexer''': The multiplexer will switch the bits output to pins AA14..AA13 and RA20..RA19. Barring MBC1 Mode logic: when reset, pins will be driven from register contents; when set, pins will be driven from the other register, i.e. RA20..RA19 will be driven by [[#RAM Bank Register]] and AA14..AA13 will be driven by [[#ROM Bank Register]]. Can only be written when '''Map Enable''' in [[#RAM Enable Register]] is reset.&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
Operating the MMM01 can be quite complex and the register contents are not straightforward. This section will detail the programming model and give example configurations.&lt;br /&gt;
&lt;br /&gt;
== Modes of Operation ==&lt;br /&gt;
&lt;br /&gt;
Nintendo's MMM01 has two modes of operation ''mapped'' and ''unmapped''. It defaults to ''unmapped'' after reset.&lt;br /&gt;
&lt;br /&gt;
This is used to lock write access to the upper bits of the known [[MBC1]] registers after base ROM and RAM banks and masks have been set up.&lt;br /&gt;
&lt;br /&gt;
The only way to ''unmap'' the mapper after ''mapping'' is to reset it.&lt;br /&gt;
&lt;br /&gt;
== Programming Model ==&lt;br /&gt;
&lt;br /&gt;
All registers are live, e.g. Setting the RAM Bank #WE bits and subsequently writing to RAM Bank AA14..AA13 won't work -- no matter if in ''mapped'' of ''unmapped'' state. Therefore, there is a certain order in which registers are optimally written:&lt;br /&gt;
&lt;br /&gt;
# ROM Bank Register&lt;br /&gt;
# Mode Register&lt;br /&gt;
# RAM Register&lt;br /&gt;
# RAM Enable&lt;br /&gt;
&lt;br /&gt;
Not all of Nintendo's games that use MMM01 keep with this order. However, due to the individual games' sizes and use of RAM banks, this isn't noticeable when the games don't misbehave.&lt;br /&gt;
&lt;br /&gt;
Most Rom Address line changes cannot be observed in ''unmapped'' mode due to the mapper starting at ROM bank 0x1FE and 0x1FF (depending on A14) until ''mapped''.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 0: 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;0&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (common) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kBit (uncommon) ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;11&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix --&amp;gt; SRAM AA14..AA13 muxed&lt;br /&gt;
* R2: AA16..AA13, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is probably not the intended use case.&lt;br /&gt;
&lt;br /&gt;
== Map MBC1 Mode 1: 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit ==&lt;br /&gt;
&lt;br /&gt;
* R0: AA #WE = &amp;quot;00&amp;quot;&lt;br /&gt;
* R1: RA20..RA19 = fix&lt;br /&gt;
* R2: AA16..AA15, RA22..RA21 = fix, MBC Mode #WE = &amp;quot;1&amp;quot;&lt;br /&gt;
* R3: RA #WE = &amp;quot;0000&amp;quot;, Mode = &amp;quot;1&amp;quot;, Mux = &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Remarks =&lt;br /&gt;
&lt;br /&gt;
== Unknown Bit ==&lt;br /&gt;
&lt;br /&gt;
There is an Unknown bit in [[#Mode Register]] whose use -- if any -- could not be determined through testing. It is definitely not ROM Bank RA14 #WE as RA14 can be written at all times -- hence there cannot be a single bank mapped to both regions. It might be part of ROM Bank RA14 Mask and an Engineer might have missed that the zero-adjustment logic means that this bit is not necessary.&lt;br /&gt;
&lt;br /&gt;
== SRAM Enable/Disable ==&lt;br /&gt;
&lt;br /&gt;
The most glaringly missing feature of MMM01 is an option to disable SRAM access for individual games. The Unknown bit in [[#Mode Register]] does not provide for this either. The only commercial cartridge containing MMM01 and SRAM is Momotarou Collection 2 and it sacrifices one RAM bank to make sure that one game has no chance of deleting the other's save file.&lt;br /&gt;
&lt;br /&gt;
Having to spend 64&amp;amp;nbsp;kBit to ''disable'' SRAM access seems like a waste considering a simple OR-gate could have stopped SRAM access.&lt;br /&gt;
&lt;br /&gt;
== Separate MBC1 Mode #WE ==&lt;br /&gt;
&lt;br /&gt;
The MBC1 Mode #WE stands out as being separated from mapping logic. Instead, if its #WE is not deasserted, it can be freely written even in mapped mode. However, the address line multiplexing for 16&amp;amp;nbsp;Mbit and 4&amp;amp;nbsp;Mbit does not switch with the mode setting -- which given a fixed ROM/SRAM wiring on the cartridge -- would need to be done in order for a hypothetical 16&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kBit mode to be feasible.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MMM01 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(6 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(22 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(16 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MMM01;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MMM01 is&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r    : std_logic_vector(3 downto 0);&lt;br /&gt;
signal ram_bank_we_n_r : std_logic_vector(1 downto 0);&lt;br /&gt;
signal latch_r         : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_r      : std_logic_vector(8 downto 0);&lt;br /&gt;
signal ram_bank_r      : std_logic_vector(3 downto 0);&lt;br /&gt;
signal mode_we_n_r     : std_logic_vector(6 downto 6);&lt;br /&gt;
signal mode_r          : std_logic_vector(0 downto 0);&lt;br /&gt;
signal rom_bank_we_n_r : std_logic_vector(4 downto 1);&lt;br /&gt;
signal mux_r           : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_int          : std_logic_vector(4 downto 0);&lt;br /&gt;
signal aa_int          : std_logic_vector(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ra_lo           : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ra_mask         : std_logic_vector(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
alias rom_bank_r_lo : std_logic_vector(4 downto 0) is rom_bank_r(4 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A(15) = '0' and RD_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
ra_lo &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
         rom_bank_r_lo;&lt;br /&gt;
&lt;br /&gt;
ra_mask &amp;lt;= &amp;quot;11110&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
           rom_bank_we_n_r &amp;amp; &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ra_int &amp;lt;= &amp;quot;00000&amp;quot; when (A(14) = '0') else&lt;br /&gt;
          ra_lo   when ((ra_lo and not(ra_mask)) /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
          &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
aa_int &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
          ram_bank_r(1 downto 0);&lt;br /&gt;
&lt;br /&gt;
AA(16 downto 15) &amp;lt;= ram_bank_r(3 downto 2);&lt;br /&gt;
AA(14 downto 13) &amp;lt;= aa_int when (mux_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(22 downto 21) &amp;lt;= &amp;quot;11&amp;quot; when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(8 downto 7);&lt;br /&gt;
&lt;br /&gt;
RA(20 downto 19) &amp;lt;= &amp;quot;11&amp;quot;   when (latch_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    aa_int when (mux_r = &amp;quot;1&amp;quot;) else&lt;br /&gt;
                    rom_bank_r(6 downto 5);&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= (ra_lo and ra_mask) or (ra_int and not(ra_mask));&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
		ram_bank_we_n_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
		latch_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_we_n_r &amp;lt;= D(5 downto 4);&lt;br /&gt;
			latch_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(6 downto 0) &amp;lt;= &amp;quot;0000000&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
		&lt;br /&gt;
		rom_bank_r(0) &amp;lt;= D(0);&lt;br /&gt;
		&lt;br /&gt;
		for i in rom_bank_we_n_r'range loop&lt;br /&gt;
			if (rom_bank_we_n_r(i) = '0') then&lt;br /&gt;
				rom_bank_r_lo(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			rom_bank_r(6 downto 5) &amp;lt;= D(6 downto 5);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		rom_bank_r(8 downto 7) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in ram_bank_we_n_r'range loop&lt;br /&gt;
			if (ram_bank_we_n_r(i) = '0') then&lt;br /&gt;
				ram_bank_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;0&amp;quot;) then&lt;br /&gt;
			ram_bank_r(3 downto 2) &amp;lt;= D(3 downto 2);&lt;br /&gt;
			rom_bank_r(8 downto 7) &amp;lt;= D(5 downto 4);&lt;br /&gt;
			mode_we_n_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
		rom_bank_we_n_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		mux_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
&lt;br /&gt;
		for i in mode_we_n_r'range loop&lt;br /&gt;
			if (mode_we_n_r(i) = '0') then&lt;br /&gt;
				mode_r(i) &amp;lt;= D(i);&lt;br /&gt;
			end if;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		if (latch_r = &amp;quot;1&amp;quot;) then&lt;br /&gt;
			rom_bank_we_n_r &amp;lt;= D(5 downto 2);&lt;br /&gt;
			mux_r &amp;lt;= D(6 downto 6);&lt;br /&gt;
		end if;&lt;br /&gt;
&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=File:MMM01_Pinout.png&amp;diff=111</id>
		<title>File:MMM01 Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=File:MMM01_Pinout.png&amp;diff=111"/>
		<updated>2017-06-23T16:47:09Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Pinout for Nintendo's MMM01.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pinout for Nintendo's MMM01.&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MBC1&amp;diff=110</id>
		<title>MBC1</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MBC1&amp;diff=110"/>
		<updated>2017-06-22T19:20:43Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Removed superfluous RESET_N check in RAM_CS_N. RESET_N asynchronously resets ram_enable_r anyway.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MBC1 can be used to address up to 16&amp;amp;nbsp;Mbit of ROM and 256&amp;amp;nbsp;kbit of SRAM, depending on the mode MBC1 is set to.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MBC1 Pinout.png|center|x300px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|5V supply&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|5&amp;amp;ndash;1&lt;br /&gt;
|D4&amp;amp;ndash;D0&lt;br /&gt;
|I&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|21&amp;amp;ndash;19&lt;br /&gt;
|A15&amp;amp;ndash;A13&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|18&amp;amp;ndash;14&lt;br /&gt;
|RA18&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|7&amp;amp;ndash;6&lt;br /&gt;
|AA14&amp;amp;ndash;AA13&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM/RAM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|{{Overline|RAM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|RAM_CS&lt;br /&gt;
|O&lt;br /&gt;
|High-Active RAM Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: SOP127P1200X225-24&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x0000-0x1FFF&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x2000-0x3FFF&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x4000-0x5FFF&amp;lt;/tt&amp;gt;: RAM Bank register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0x6000-0x7FFF&amp;lt;/tt&amp;gt;: Mode register&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
            \_________/&lt;br /&gt;
                 \-------- RAM Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A value of 0x0A enables SRAM access, all other values disable SRAM access.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX D4 D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
         \____________/&lt;br /&gt;
                 \-------- ROM Bank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank selects which bank is mapped to 0x4000-0x7FFF. The written value is zero-adjusted before output on RA18&amp;amp;ndash;RA14.&lt;br /&gt;
&lt;br /&gt;
== RAM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX XX XX D1 D0    0x00 @ reset&lt;br /&gt;
                  \___/&lt;br /&gt;
                    \----- RAM Bank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RAM Bank selects which bank is mapped to 0xA000-0xBFFF when in mode 4&amp;amp;nbsp;MBit/256&amp;amp;nbsp;kbit. When in mode 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit, it can be used to select the upper two ROM address lines.&lt;br /&gt;
&lt;br /&gt;
== Mode Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX XX XX XX D0    0x00 @ reset&lt;br /&gt;
                     \/&lt;br /&gt;
                      \--- Mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The mode bit switches between 16&amp;amp;nbsp;Mbit ROM/64&amp;amp;nbsp;kbit SRAM mode ('0') and 4&amp;amp;nbsp;Mbit ROM/256&amp;amp;nbsp;kbit SRAM mode ('1'). When in 16&amp;amp;nbsp;Mbit/64&amp;amp;nbsp;kbit mode, address lines AA14&amp;amp;ndash;AA13 switch according to A14. When in 4&amp;amp;nbsp;Mbit/256&amp;amp;nbsp;kbit mode, the upper address lines AA14&amp;amp;ndash;AA13 stay fixed regardless of A14.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
&lt;br /&gt;
entity MBC1 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in  std_logic;&lt;br /&gt;
		RD_N     : in  std_logic;&lt;br /&gt;
		WR_N     : in  std_logic;&lt;br /&gt;
		CS_N     : in  std_logic;&lt;br /&gt;
		A        : in  std_logic_vector(15 downto 13);&lt;br /&gt;
		D        : in  std_logic_vector(4 downto 0);&lt;br /&gt;
		RA       : out std_logic_vector(18 downto 14);&lt;br /&gt;
		AA       : out std_logic_vector(14 downto 13);&lt;br /&gt;
		ROM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS_N : out std_logic;&lt;br /&gt;
		RAM_CS   : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MBC1;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MBC1 is&lt;br /&gt;
	&lt;br /&gt;
signal ram_enable_r : std_logic_vector(3 downto 0);&lt;br /&gt;
signal rom_bank_r   : std_logic_vector(4 downto 0);&lt;br /&gt;
signal ram_bank_r   : std_logic_vector(1 downto 0);&lt;br /&gt;
signal mode_r       : std_logic_vector(0 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_bank_r_clk   : std_logic;&lt;br /&gt;
signal mode_r_clk       : std_logic;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when ((A(15) = '0' and RD_N = '0') or RESET_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RAM_CS_N &amp;lt;= '0' when (CS_N = '0' and A(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) else&lt;br /&gt;
            '1';&lt;br /&gt;
RAM_CS &amp;lt;= not RAM_CS_N;&lt;br /&gt;
&lt;br /&gt;
RA(18 downto 14) &amp;lt;= &amp;quot;00000&amp;quot;    when (A(14) = '0' or RESET_N = '0') else&lt;br /&gt;
                    rom_bank_r when (rom_bank_r /= &amp;quot;00000&amp;quot;) else&lt;br /&gt;
                    &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
AA(14 downto 13) &amp;lt;= &amp;quot;00&amp;quot; when (A(14) = '0' and mode_r = &amp;quot;0&amp;quot;) else&lt;br /&gt;
                    ram_bank_r;&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A = &amp;quot;000&amp;quot; and WR_N = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;001&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_bank_r_clk &amp;lt;= '0' when (A = &amp;quot;010&amp;quot; and WR_N = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
mode_r_clk &amp;lt;= '0' when (A = &amp;quot;011&amp;quot; and WR_N = '0') else&lt;br /&gt;
              '1';&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= D(3 downto 0);&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= &amp;quot;00000&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		ram_bank_r &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(ram_bank_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram_bank_r &amp;lt;= D(1 downto 0);&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
end process ram_bank_p;&lt;br /&gt;
&lt;br /&gt;
mode_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	mode_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		mode_r &amp;lt;= &amp;quot;0&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(mode_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		mode_r &amp;lt;= D(0 downto 0);&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process mode_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MBC2&amp;diff=109</id>
		<title>MBC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MBC2&amp;diff=109"/>
		<updated>2017-06-09T04:21:59Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: I/O supply pins also supply core logic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MBC2 can be used to address up to 2&amp;amp;nbsp;Mbit of ROM and 512&amp;amp;times;4&amp;amp;nbsp;bit of internal RAM.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MBC2 Pinout.png|center|x300px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|I/O + logic 5V supply&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|I/O + logic Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|VCC_RAM&lt;br /&gt;
|PWR&lt;br /&gt;
|RAM supply&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|GND_RAM&lt;br /&gt;
|PWR&lt;br /&gt;
|RAM Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|12&amp;amp;ndash;9&lt;br /&gt;
|D3&amp;amp;ndash;D0&lt;br /&gt;
|I/O&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|20, 22&amp;amp;ndash;25, 8, 6&amp;amp;ndash;2&lt;br /&gt;
|A15&amp;amp;ndash;A14, A8&amp;amp;ndash;A0&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|16&amp;amp;ndash;19&lt;br /&gt;
|RA17&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: SOP127P1200X225-24&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. VCC and VCC_RAM both supply RAM -- probably depending on VCC voltage.&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0b00-- ---0 ---- ----&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0b00-- ---1 ---- ----&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
&lt;br /&gt;
Read-Write-Accessible Registers:&lt;br /&gt;
* &amp;lt;tt&amp;gt;0b10-- ---a aaaa aaaa&amp;lt;/tt&amp;gt;: Internal RAM&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
            \_________/&lt;br /&gt;
                 \-------- RAM Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A value of 0x0A enables RAM access, all other values disable RAM access.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
            \_________/&lt;br /&gt;
                 \-------- ROM Bank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank selects which bank is mapped to 0x4000-0x7FFF. The written value is zero-adjusted before output on RA17&amp;amp;ndash;RA14.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
When both {{Overline|RD}} and {{Overline|WR}} are low, MBC2 will drive 0x00 on D3..D0. The same is true for the reset state ({{Overline|RESET}} asserted). Therefore I modeled the behavior as belonging to the internal SRAM.&lt;br /&gt;
There might be a power-up bug with MBC2. Many games do not make use of 0xA000, maybe because there really is a problem at reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
use IEEE.numeric_std.all;&lt;br /&gt;
&lt;br /&gt;
entity MBC2 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in    std_logic;&lt;br /&gt;
		RD_N     : in    std_logic;&lt;br /&gt;
		WR_N     : in    std_logic;&lt;br /&gt;
		CS_N     : in    std_logic;&lt;br /&gt;
		A_HI     : in    std_logic_vector(15 downto 14);&lt;br /&gt;
		A        : in    std_logic_vector(8 downto 0);&lt;br /&gt;
		D        : inout std_logic_vector(3 downto 0);&lt;br /&gt;
		RA       : out   std_logic_vector(17 downto 14);&lt;br /&gt;
		ROM_CS_N : out   std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MBC2;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MBC2 is&lt;br /&gt;
&lt;br /&gt;
type ram_type is array(natural range &amp;lt;&amp;gt;) of std_logic_vector(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram : ram_type(0 to 511);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r : std_logic_vector(3 downto 0);&lt;br /&gt;
signal rom_bank_r   : std_logic_vector(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_clk          : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal ram_cs_n : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal A_HI_int : std_logic_vector(A_HI'range);&lt;br /&gt;
signal A_int    : std_logic_vector(A'range);&lt;br /&gt;
&lt;br /&gt;
signal RD_N_int : std_logic;&lt;br /&gt;
signal WR_N_int : std_logic;&lt;br /&gt;
signal CS_N_int : std_logic;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A_HI_int &amp;lt;= A_HI and RESET_N;&lt;br /&gt;
A_int    &amp;lt;= A    and RESET_N;&lt;br /&gt;
RD_N_int &amp;lt;= RD_N and RESET_N;&lt;br /&gt;
WR_N_int &amp;lt;= WR_N and RESET_N;&lt;br /&gt;
CS_N_int &amp;lt;= CS_N and RESET_N;&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A_HI_int(15) = '0' and RD_N_int = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
ram_cs_n &amp;lt;= '0' when ((CS_N_int = '0' and A_HI_int(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) or RESET_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RA &amp;lt;= &amp;quot;0000&amp;quot;     when (A_HI_int(14) = '0') else&lt;br /&gt;
      rom_bank_r when (rom_bank_r /= &amp;quot;0000&amp;quot;) else&lt;br /&gt;
      &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A_HI_int = &amp;quot;00&amp;quot; and A_int(8) = '0' and WR_N_int = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A_HI_int = &amp;quot;00&amp;quot; and A_int(8) = '1' and WR_N_int = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_clk &amp;lt;= not RD_N_int or WR_N_int or ram_cs_n;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_p : process (&lt;br /&gt;
	A_int,&lt;br /&gt;
	D,&lt;br /&gt;
	WR_N_int,&lt;br /&gt;
	RD_N_int,&lt;br /&gt;
	ram_cs_n,&lt;br /&gt;
	ram_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	-- default tri-state&lt;br /&gt;
	D &amp;lt;= &amp;quot;ZZZZ&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	-- read&lt;br /&gt;
	if (ram_cs_n = '0' and RD_N_int = '0' and WR_N_int /= '0') then&lt;br /&gt;
		-- write deasserted&lt;br /&gt;
		D &amp;lt;= ram(to_integer(unsigned(A_int)));&lt;br /&gt;
	elsif (ram_cs_n = '0' and RD_N_int = '0') then&lt;br /&gt;
		-- read and write asserted&lt;br /&gt;
		D &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	-- write&lt;br /&gt;
	if (rising_edge(ram_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram(to_integer(unsigned(A_int))) &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=MBC2&amp;diff=108</id>
		<title>MBC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=MBC2&amp;diff=108"/>
		<updated>2016-10-26T22:13:38Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: /* Behavior */ fix syntax error, fix rising_edge compound argument&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Nintendo's MBC2 can be used to address up to 2&amp;amp;nbsp;Mbit of ROM and 512&amp;amp;times;4&amp;amp;nbsp;bit of internal RAM.&lt;br /&gt;
&lt;br /&gt;
= Pinout =&lt;br /&gt;
&lt;br /&gt;
[[Image:MBC2 Pinout.png|center|x300px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable pintable&amp;quot; style=&amp;quot;margin:1em auto; width: 66%;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Pin No.&lt;br /&gt;
!style=&amp;quot;width: 20%;&amp;quot; | Name&lt;br /&gt;
!style=&amp;quot;width: 10%;&amp;quot; | Type&lt;br /&gt;
!style=&amp;quot;width: 60%;&amp;quot; | Comment&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|VCC&lt;br /&gt;
|PWR&lt;br /&gt;
|I/O 5V supply&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
|GND&lt;br /&gt;
|PWR&lt;br /&gt;
|I/O Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|VCC_RAM&lt;br /&gt;
|PWR&lt;br /&gt;
|RAM supply&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|GND_RAM&lt;br /&gt;
|PWR&lt;br /&gt;
|RAM Ground supply&lt;br /&gt;
|-&lt;br /&gt;
|12&amp;amp;ndash;9&lt;br /&gt;
|D3&amp;amp;ndash;D0&lt;br /&gt;
|I/O&lt;br /&gt;
|Data Bus&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|{{Overline|RD}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|{{Overline|WR}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|{{Overline|CS}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Chip Select&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|{{Overline|RESET}}&lt;br /&gt;
|I&lt;br /&gt;
|Low-Active Asynchronous Reset&lt;br /&gt;
|-&lt;br /&gt;
|20, 22&amp;amp;ndash;25, 8, 6&amp;amp;ndash;2&lt;br /&gt;
|A15&amp;amp;ndash;A14, A8&amp;amp;ndash;A0&lt;br /&gt;
|I&lt;br /&gt;
|Address Bus&lt;br /&gt;
|-&lt;br /&gt;
|16&amp;amp;ndash;19&lt;br /&gt;
|RA17&amp;amp;ndash;RA14&lt;br /&gt;
|O&lt;br /&gt;
|Upper ROM Address Lines&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|{{Overline|ROM_CS}}&lt;br /&gt;
|O&lt;br /&gt;
|Low-Active ROM Chip Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footprint: SOP127P1200X225-24&lt;br /&gt;
&lt;br /&gt;
Remarks: All I/O pins are protected via diodes to VCC/GND. VCC and VCC_RAM both supply RAM -- probably depending on VCC voltage.&lt;br /&gt;
&lt;br /&gt;
{{clear|both}}&lt;br /&gt;
&lt;br /&gt;
= Registers =&lt;br /&gt;
&lt;br /&gt;
Write-Accessible Registers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;0b00-- ---0 ---- ----&amp;lt;/tt&amp;gt;: RAM Enable register&lt;br /&gt;
* &amp;lt;tt&amp;gt;0b00-- ---1 ---- ----&amp;lt;/tt&amp;gt;: ROM Bank register&lt;br /&gt;
&lt;br /&gt;
Read-Write-Accessible Registers:&lt;br /&gt;
* &amp;lt;tt&amp;gt;0b10-- ---a aaaa aaaa&amp;lt;/tt&amp;gt;: Internal RAM&lt;br /&gt;
&lt;br /&gt;
== RAM Enable Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
            \_________/&lt;br /&gt;
                 \-------- RAM Enable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A value of 0x0A enables RAM access, all other values disable RAM access.&lt;br /&gt;
&lt;br /&gt;
== ROM Bank Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XX XX XX XX D3 D2 D1 D0    0x00 @ reset&lt;br /&gt;
            \_________/&lt;br /&gt;
                 \-------- ROM Bank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROM Bank selects which bank is mapped to 0x4000-0x7FFF. The written value is zero-adjusted before output on RA17&amp;amp;ndash;RA14.&lt;br /&gt;
&lt;br /&gt;
= Behavior =&lt;br /&gt;
&lt;br /&gt;
When both {{Overline|RD}} and {{Overline|WR}} are low, MBC2 will drive 0x00 on D3..D0. The same is true for the reset state ({{Overline|RESET}} asserted). Therefore I modeled the behavior as belonging to the internal SRAM.&lt;br /&gt;
There might be a power-up bug with MBC2. Many games do not make use of 0xA000, maybe because there really is a problem at reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
use IEEE.numeric_std.all;&lt;br /&gt;
&lt;br /&gt;
entity MBC2 is&lt;br /&gt;
	Port(&lt;br /&gt;
		RESET_N  : in    std_logic;&lt;br /&gt;
		RD_N     : in    std_logic;&lt;br /&gt;
		WR_N     : in    std_logic;&lt;br /&gt;
		CS_N     : in    std_logic;&lt;br /&gt;
		A_HI     : in    std_logic_vector(15 downto 14);&lt;br /&gt;
		A        : in    std_logic_vector(8 downto 0);&lt;br /&gt;
		D        : inout std_logic_vector(3 downto 0);&lt;br /&gt;
		RA       : out   std_logic_vector(17 downto 14);&lt;br /&gt;
		ROM_CS_N : out   std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity MBC2;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of MBC2 is&lt;br /&gt;
&lt;br /&gt;
type ram_type is array(natural range &amp;lt;&amp;gt;) of std_logic_vector(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram : ram_type(0 to 511);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r : std_logic_vector(3 downto 0);&lt;br /&gt;
signal rom_bank_r   : std_logic_vector(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal ram_enable_r_clk : std_logic;&lt;br /&gt;
signal rom_bank_r_clk   : std_logic;&lt;br /&gt;
signal ram_clk          : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal ram_cs_n : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal A_HI_int : std_logic_vector(A_HI'range);&lt;br /&gt;
signal A_int    : std_logic_vector(A'range);&lt;br /&gt;
&lt;br /&gt;
signal RD_N_int : std_logic;&lt;br /&gt;
signal WR_N_int : std_logic;&lt;br /&gt;
signal CS_N_int : std_logic;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Signal Assignments&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A_HI_int &amp;lt;= A_HI and RESET_N;&lt;br /&gt;
A_int    &amp;lt;= A    and RESET_N;&lt;br /&gt;
RD_N_int &amp;lt;= RD_N and RESET_N;&lt;br /&gt;
WR_N_int &amp;lt;= WR_N and RESET_N;&lt;br /&gt;
CS_N_int &amp;lt;= CS_N and RESET_N;&lt;br /&gt;
&lt;br /&gt;
ROM_CS_N &amp;lt;= '0' when (A_HI_int(15) = '0' and RD_N_int = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
ram_cs_n &amp;lt;= '0' when ((CS_N_int = '0' and A_HI_int(14) = '0' and ram_enable_r = x&amp;quot;A&amp;quot;) or RESET_N = '0') else&lt;br /&gt;
            '1';&lt;br /&gt;
&lt;br /&gt;
RA &amp;lt;= &amp;quot;0000&amp;quot;     when (A_HI_int(14) = '0') else&lt;br /&gt;
      rom_bank_r when (rom_bank_r /= &amp;quot;0000&amp;quot;) else&lt;br /&gt;
      &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ram_enable_r_clk &amp;lt;= '0' when (A_HI_int = &amp;quot;00&amp;quot; and A_int(8) = '0' and WR_N_int = '0') else&lt;br /&gt;
                    '1';&lt;br /&gt;
&lt;br /&gt;
rom_bank_r_clk &amp;lt;= '0' when (A_HI_int = &amp;quot;00&amp;quot; and A_int(8) = '1' and WR_N_int = '0') else&lt;br /&gt;
                  '1';&lt;br /&gt;
&lt;br /&gt;
ram_clk &amp;lt;= not RD_N_int or WR_N_int or ram_cs_n;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
-- Registers&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ram_enable_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	ram_enable_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(ram_enable_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram_enable_r &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_enable_p;&lt;br /&gt;
&lt;br /&gt;
rom_bank_p : process (&lt;br /&gt;
	RESET_N,&lt;br /&gt;
	rom_bank_r_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	if (RESET_N = '0') then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	elsif (rising_edge(rom_bank_r_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		rom_bank_r &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
end process rom_bank_p;&lt;br /&gt;
&lt;br /&gt;
ram_p : process (&lt;br /&gt;
	A_int,&lt;br /&gt;
	D,&lt;br /&gt;
	WR_N_int,&lt;br /&gt;
	RD_N_int,&lt;br /&gt;
	ram_cs_n,&lt;br /&gt;
	ram_clk&lt;br /&gt;
	)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
	-- default tri-state&lt;br /&gt;
	D &amp;lt;= &amp;quot;ZZZZ&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	-- read&lt;br /&gt;
	if (ram_cs_n = '0' and RD_N_int = '0' and WR_N_int /= '0') then&lt;br /&gt;
		-- write deasserted&lt;br /&gt;
		D &amp;lt;= ram(to_integer(unsigned(A_int)));&lt;br /&gt;
	elsif (ram_cs_n = '0' and RD_N_int = '0') then&lt;br /&gt;
		-- read and write asserted&lt;br /&gt;
		D &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	-- write&lt;br /&gt;
	if (rising_edge(ram_clk)) then&lt;br /&gt;
	&lt;br /&gt;
		ram(to_integer(unsigned(A_int))) &amp;lt;= D;&lt;br /&gt;
	&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
end process ram_p;&lt;br /&gt;
&lt;br /&gt;
end architecture Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Game_Boy_PCB_List&amp;diff=107</id>
		<title>Game Boy PCB List</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Game_Boy_PCB_List&amp;diff=107"/>
		<updated>2016-05-30T12:18:23Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: cat DMG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I distinguish between DMG PCBs and CGB PCBs, although obviously both kinds can be used in both hardware units. This distinction roughly corresponds to schedule 1 and schedule 2 PCBs licensed by Nintendo to 3rd parties like [http://www.sec.gov/Archives/edgar/containers/fix064/898441/000095000502000099/p14888ex10_33.txt 3DO] and [http://www.sec.gov/Archives/edgar/data/865570/000095015002001060/a85823exv10w4.txt THQ] and [http://www.sec.gov/Archives/edgar/containers/fix062/1132809/000095014801500958/v72115orex10-30.txt Bay Area Multimedia Inc. (BAM! Entertainment)].&lt;br /&gt;
&lt;br /&gt;
I don't own red carts, but know they exist.&lt;br /&gt;
&lt;br /&gt;
== DMG PCBs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code!! MBC !! !! ROM !! !! RAM !!&lt;br /&gt;
|-&lt;br /&gt;
|AAA||||||256k||QFP80P1350X1350-44||||&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:red;&amp;quot; |AAAC||||||256k||COB?||||&lt;br /&gt;
|-&lt;br /&gt;
| BBA||MBC1||SOP127P1200X225-24||512k||QFP80P1350X1350-44||||&lt;br /&gt;
|-&lt;br /&gt;
| BCA||MBC1||SOP127P1200X225-24||1M||QFP80P1350X1350-44||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN||MBC1||SOP127P1200X225-24||4M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN-M11||MBC1||SOP127P1200X225-24||2M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN-M13||MBC1||SOP127P1200X225-24||4M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN-M14||MBC1||SOP127P1200X225-24||2M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| BFAN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| M-BFAN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| DECN||MBC1||SOP127P1200X225-24||4M||SOP127P1440X280-32||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| DEDN||MBC1||SOP127P1200X225-24||4M||SOP127P1440X280-32||256k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| DFCN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| MC-DFCN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| DGCU||MBC1||SOP127P1200X225-24||16M||TSOP80P1176-44; TSOP-II||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| GDAN||MBC2||SOP127P1200X225-28||2M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| KECN||MBC3 w/X||QFP80P900X900-32||8M||SOP127P1440X280-32||64k||SOP127P1194X280-28&lt;br /&gt;
|-&lt;br /&gt;
| KFCN||MBC3 w/ X||QFP80P900X900-32||8M||SOP127P1440X280-32||64k||SOP127P1194X280-28&lt;br /&gt;
|-&lt;br /&gt;
| KFDN||MBC3 w/ X||QFP80P900X900-32||8M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| KGDU||MBC3 w/ X||QFP80P900X900-32||16M||TSOP80P1176-44; TSOP-II||256k||SOP127P1180X285-28&lt;br /&gt;
|-&lt;br /&gt;
| LFDN||MBC3 w/o X||QFP80P900X900-32||8M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| MHEU||MBC30 w/ X||TQFP80P900X900-32||32M||TSOP80P1176-44; TSOP-II||1M as 512k||SOP127P1410X305-32&lt;br /&gt;
|-&lt;br /&gt;
| M-PEAN||MMM01||QFP80P900X900-32||4M||SOP127P1440X280-32|||&lt;br /&gt;
|-&lt;br /&gt;
| M161-M01||74HC161A||SOP127P600X175-16||2M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| M161-M12||74HC161A||SOP127P600X175-16||2M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| MC-SFCN||MMM01||QFP80P900X900-32||8M||SOP127P1440X280-32||64k||SOP127P1180X285-28&lt;br /&gt;
|-&lt;br /&gt;
| MMM-BEAN-M11||MMM01||QFP80P900X900-32||4M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| MMM-BEAN-M13||MMM01||QFP80P900X900-32||8M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| TEDN||HuC1A||QFP80P900X900-32||4M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| TFDN||HuC1||QFP80P900X900-32||8M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| UEDT||HuC3||QFP50P900X900-48||4M||TSOP50P1440-32; TSOP-I||256k||TSOP55P1340-28; TSOP-I&lt;br /&gt;
|-&lt;br /&gt;
| UFDT||HuC3||QFP50P900X900-48||8M||TSOP50P1440-32; TSOP-I||256k||TSOP55P1340-28; TSOP-I&lt;br /&gt;
|-&lt;br /&gt;
| UGDU||HuC3||QFP50P900X900-48||16M||TSOP80P1176-44; TSOP-II||256k||TSOP55P1340-28; TSOP-I&lt;br /&gt;
|-&lt;br /&gt;
| DMG-AOMJ||TAMA5||SOP127P1200X300-28||512k||SOP127P1440X290-32||||&lt;br /&gt;
|-&lt;br /&gt;
| MGB-MGBD||MAC-GBD||QFP50P1600X1600-100||8M||TSOP50P1440-32; TSOP-I||1M||TSOP50P1340-32; TSOP-I&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CGB PCBs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code!!MBC!!!!ROM!!!!RAM!!!!FLASH!!&lt;br /&gt;
|-&lt;br /&gt;
| A02||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||256k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A03||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A04||MBC5||QFP80P900X900-32||4/8M||TSOP50P1440-32; TSOP-I||64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A06||MBC5||QFP80P900X900-32||4/8M||SOP127P1440X280-32||64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A07||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A08||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||64k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A09||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A10||MBC5||QFP80P900X900-32||4/8M||TSOP50P1440-32; TSOP-I||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A11||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||64k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A12||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k||SOP127P1194X315-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A13||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A14||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||1M||SOP127P1410X305-32||||&lt;br /&gt;
|-&lt;br /&gt;
| A15||MBC5||QFP80P900X900-32||2x32M||TSOP80P1176-44; TSOP-II||256k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A16||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||1M||SOP127P1410X305-32||||&lt;br /&gt;
|-&lt;br /&gt;
| A18||MBC5||QFP80P900X900-32||16M||SOP127P1603X300-44||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A20||G-MMC1||QFP40P1200X1200-80||||||1M||SOP127P1410X300-32||8M||TSOP50P2000-40&lt;br /&gt;
|-&lt;br /&gt;
| A32||MBC6||TQFP65P1400X1400-64||2/4/8M||SOP127P1440X280-32||256k||SOP127P1180X285-28||8M||TSOP50P2000-40&lt;br /&gt;
|-&lt;br /&gt;
| A40||MBC7||QFP65P1250X1250-56||4/8M||SOP127P1440X280-32||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A47||MBC7||QFP65P1250X1250-56||16/32M||TSOP80P1176-44; TSOP-II||||||||&lt;br /&gt;
|-&lt;br /&gt;
| Z01||MBC5||QFP80P900X900-32||32M||TSOP80P1176-44; TSOP-II||64k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| Z02||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||256k as 64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| Z03||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k as 64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| Z04||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k as 64k||SOP127P1194X315-28||||&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:red;&amp;quot; | B02||Altera CPLD||||8/16/32M||||1M||||||&lt;br /&gt;
|-&lt;br /&gt;
| B03-01||Altera CPLD||||16/32M||TSOP50P2000X119-56; TSOP-II||256k||TSOP50P1340-32; TSOP-I||||&lt;br /&gt;
|-&lt;br /&gt;
| B03-11||MBC5-D||QFP80P1350X1350-44||16/32M||TSOP50P2000X119-56; TSOP-II||256k||TSOP50P1340-32; TSOP-I||||&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:red;&amp;quot; |B04||MBC5-D||||64M||||1M||||||&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;color:red;&amp;quot; |F01||?||||32/64M||||||||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Game_Boy_PCB_List&amp;diff=106</id>
		<title>Game Boy PCB List</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Game_Boy_PCB_List&amp;diff=106"/>
		<updated>2016-05-30T11:46:08Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: Create List from Excel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I distinguish between DMG PCBs and CGB PCBs, although obviously both kinds can be used in both hardware units. This distinction roughly corresponds to schedule 1 and schedule 2 PCBs licensed by Nintendo to 3rd parties like [http://www.sec.gov/Archives/edgar/containers/fix064/898441/000095000502000099/p14888ex10_33.txt 3DO] and [http://www.sec.gov/Archives/edgar/data/865570/000095015002001060/a85823exv10w4.txt THQ] and [http://www.sec.gov/Archives/edgar/containers/fix062/1132809/000095014801500958/v72115orex10-30.txt Bay Area Multimedia Inc. (BAM! Entertainment)].&lt;br /&gt;
&lt;br /&gt;
== DMG PCBs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code!! MBC !! !! ROM !! !! RAM !!&lt;br /&gt;
|-&lt;br /&gt;
| AAA||||||256k||QFP80P1350X1350-44||||&lt;br /&gt;
|-&lt;br /&gt;
| AAAC||||||256k||COB?||||&lt;br /&gt;
|-&lt;br /&gt;
| BBA||MBC1||SOP127P1200X225-24||512k||QFP80P1350X1350-44||||&lt;br /&gt;
|-&lt;br /&gt;
| BCA||MBC1||SOP127P1200X225-24||1M||QFP80P1350X1350-44||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN||MBC1||SOP127P1200X225-24||4M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN-M11||MBC1||SOP127P1200X225-24||2M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN-M13||MBC1||SOP127P1200X225-24||4M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| BEAN-M14||MBC1||SOP127P1200X225-24||2M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| BFAN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| M-BFAN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| DECN||MBC1||SOP127P1200X225-24||4M||SOP127P1440X280-32||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| DEDN||MBC1||SOP127P1200X225-24||4M||SOP127P1440X280-32||256k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| DFCN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| MC-DFCN||MBC1||SOP127P1200X225-24||8M||SOP127P1440X280-32||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| DGCU||MBC1||SOP127P1200X225-24||16M||TSOP80P1176-44; TSOP-II||64k||SOP127P1200X260-28&lt;br /&gt;
|-&lt;br /&gt;
| GDAN||MBC2||SOP127P1200X225-28||2M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| KECN||MBC3 w/X||QFP80P900X900-32||8M||SOP127P1440X280-32||64k||SOP127P1194X280-28&lt;br /&gt;
|-&lt;br /&gt;
| KFCN||MBC3 w/ X||QFP80P900X900-32||8M||SOP127P1440X280-32||64k||SOP127P1194X280-28&lt;br /&gt;
|-&lt;br /&gt;
| KFDN||MBC3 w/ X||QFP80P900X900-32||8M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| KGDU||MBC3 w/ X||QFP80P900X900-32||16M||TSOP80P1176-44; TSOP-II||256k||SOP127P1180X285-28&lt;br /&gt;
|-&lt;br /&gt;
| LFDN||MBC3 w/o X||QFP80P900X900-32||8M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| MHEU||MBC30 w/ X||TQFP80P900X900-32||32M||TSOP80P1176-44; TSOP-II||1M as 512k||SOP127P1410X305-32&lt;br /&gt;
|-&lt;br /&gt;
| M-PEAN||MMM01||QFP80P900X900-32||4M||SOP127P1440X280-32|||&lt;br /&gt;
|-&lt;br /&gt;
| M161-M01||74HC161A||SOP127P600X175-16||2M||SOP127P1440X280-32||||&lt;br /&gt;
|-&lt;br /&gt;
| M161-M12||74HC161A||SOP127P600X175-16||2M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| MC-SFCN||MMM01||QFP80P900X900-32||8M||SOP127P1440X280-32||64k||SOP127P1180X285-28&lt;br /&gt;
|-&lt;br /&gt;
| MMM-BEAN-M11||MMM01||QFP80P900X900-32||4M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| MMM-BEAN-M13||MMM01||QFP80P900X900-32||8M||COB||||&lt;br /&gt;
|-&lt;br /&gt;
| TEDN||HuC1A||QFP80P900X900-32||4M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| TFDN||HuC1||QFP80P900X900-32||8M||SOP127P1440X280-32||256k||SOP127P1194X315-28&lt;br /&gt;
|-&lt;br /&gt;
| UEDT||HuC3||QFP50P900X900-48||4M||TSOP50P1440-32; TSOP-I||256k||TSOP55P1340-28; TSOP-I&lt;br /&gt;
|-&lt;br /&gt;
| UFDT||HuC3||QFP50P900X900-48||8M||TSOP50P1440-32; TSOP-I||256k||TSOP55P1340-28; TSOP-I&lt;br /&gt;
|-&lt;br /&gt;
| UGDU||HuC3||QFP50P900X900-48||16M||TSOP80P1176-44; TSOP-II||256k||TSOP55P1340-28; TSOP-I&lt;br /&gt;
|-&lt;br /&gt;
| DMG-AOMJ||TAMA5||SOP127P1200X300-28||512k||SOP127P1440X290-32||||&lt;br /&gt;
|-&lt;br /&gt;
| MGB-MGBD||MAC-GBD||QFP50P1600X1600-100||8M||TSOP50P1440-32; TSOP-I||1M||TSOP50P1340-32; TSOP-I&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CGB PCBs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code!!MBC!!!!ROM!!!!RAM!!!!FLASH!!&lt;br /&gt;
|-&lt;br /&gt;
| A02||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||256k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A03||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A04||MBC5||QFP80P900X900-32||4/8M||TSOP50P1440-32; TSOP-I||64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A06||MBC5||QFP80P900X900-32||4/8M||SOP127P1440X280-32||64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A07||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A08||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||64k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A09||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A10||MBC5||QFP80P900X900-32||4/8M||TSOP50P1440-32; TSOP-I||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A11||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||64k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A12||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k||SOP127P1194X315-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A13||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A14||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||1M||SOP127P1410X305-32||||&lt;br /&gt;
|-&lt;br /&gt;
| A15||MBC5||QFP80P900X900-32||2x32M||TSOP80P1176-44; TSOP-II||256k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| A16||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||1M||SOP127P1410X305-32||||&lt;br /&gt;
|-&lt;br /&gt;
| A18||MBC5||QFP80P900X900-32||16M||SOP127P1603X300-44||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A20||G-MMC1||QFP40P1200X1200-80||||||1M||SOP127P1410X300-32||8M||TSOP50P2000-40&lt;br /&gt;
|-&lt;br /&gt;
| A32||MBC6||TQFP65P1400X1400-64||2/4/8M||SOP127P1440X280-32||256k||SOP127P1180X285-28||8M||TSOP50P2000-40&lt;br /&gt;
|-&lt;br /&gt;
| A40||MBC7||QFP65P1250X1250-56||4/8M||SOP127P1440X280-32||||||||&lt;br /&gt;
|-&lt;br /&gt;
| A47||MBC7||QFP65P1250X1250-56||16/32M||TSOP80P1176-44; TSOP-II||||||||&lt;br /&gt;
|-&lt;br /&gt;
| Z01||MBC5||QFP80P900X900-32||32M||TSOP80P1176-44; TSOP-II||64k||SOP127P1180X285-28||||&lt;br /&gt;
|-&lt;br /&gt;
| Z02||MBC5||QFP80P900X900-32||2/4/8M||SOP127P1440X280-32||256k as 64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| Z03||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k as 64k||SOP127P1200X260-28||||&lt;br /&gt;
|-&lt;br /&gt;
| Z04||MBC5||QFP80P900X900-32||16/32/64M||TSOP80P1176-44; TSOP-II||256k as 64k||SOP127P1194X315-28||||&lt;br /&gt;
|-&lt;br /&gt;
| B02||Altera CPLD||||8/16/32M||||1M||||||&lt;br /&gt;
|-&lt;br /&gt;
| B03||MBC5-D||QFP80P1350X1350-44||16/32M||TSOP50P2000X119-56; TSOP-II||256k||TSOP50P1340-32; TSOP-I||||&lt;br /&gt;
|-&lt;br /&gt;
| B04||MBC5-D||||64M||||1M||||||&lt;br /&gt;
|-&lt;br /&gt;
| F01||?||||32/64M||||||||||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Game_Boy_Naming_Convention&amp;diff=105</id>
		<title>Game Boy Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Game_Boy_Naming_Convention&amp;diff=105"/>
		<updated>2016-05-30T10:58:51Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: some changes and additions thanks to Gekkio&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DMG PCB Naming Convention =&lt;br /&gt;
&lt;br /&gt;
DMG PCB codes follow the following convention:&lt;br /&gt;
&lt;br /&gt;
 DMG[-?[?]]-???[?][(?)]-NN&lt;br /&gt;
      |      |      |    \-- PCB revision&lt;br /&gt;
      |      |      \------- optional code in parentheses&lt;br /&gt;
      |      \-------------- mandatory three or four-letter descriptor&lt;br /&gt;
      \--------------------- one or two-letter optional part&lt;br /&gt;
&lt;br /&gt;
== Descriptor Codes ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; class=&amp;quot;unsortable&amp;quot; |MBC/Battery&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; class=&amp;quot;unsortable&amp;quot; |ROM Size&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; class=&amp;quot;unsortable&amp;quot; |RAM Size&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; class=&amp;quot;unsortable&amp;quot; |ROM Package&lt;br /&gt;
|-&lt;br /&gt;
| (none)&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| QFP&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| none&lt;br /&gt;
| 256kbit&lt;br /&gt;
| none&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| MBC1A/MBC1B/MBC1B1&lt;br /&gt;
| 512kbit&lt;br /&gt;
| -?&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| -&lt;br /&gt;
| 1Mbit&lt;br /&gt;
| 64kbit&lt;br /&gt;
| COB&lt;br /&gt;
|-&lt;br /&gt;
| D&lt;br /&gt;
| MBC1A/MBC1B/MBC1B1 + CR1616&lt;br /&gt;
| 2Mbit&lt;br /&gt;
| 256kbit&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| E&lt;br /&gt;
| -&lt;br /&gt;
| 4Mbit&lt;br /&gt;
| 512kbit&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| F&lt;br /&gt;
| -&lt;br /&gt;
| 8Mbit&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| G&lt;br /&gt;
| MBC2A + CR1616&lt;br /&gt;
| 16Mbit&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| H&lt;br /&gt;
| -&lt;br /&gt;
| 32Mbit&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| K&lt;br /&gt;
| MBC3/MBC3A/MBC3B w/ X + CR2025&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| L&lt;br /&gt;
| MBC3/MBC3A/MBC3B w/o X + CR2025&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| M&lt;br /&gt;
| MBC30 w/ X + CR2025&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| N&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| SOP&lt;br /&gt;
|-&lt;br /&gt;
| P&lt;br /&gt;
| MMM01&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| S&lt;br /&gt;
| MMM01 + CR1616&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| T&lt;br /&gt;
| HuC1/HuC1A + CR1616&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| TSOP I&lt;br /&gt;
|-&lt;br /&gt;
| U&lt;br /&gt;
| HuC3A + CR2025&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| TSOP II&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example, DMG-BEAN-02 is a PCB made for&lt;br /&gt;
* MBC1A/MBC1B/MBC1B1 (without battery)&lt;br /&gt;
* 256kbit of ROM&lt;br /&gt;
* no SRAM&lt;br /&gt;
* ROM chip package is a narrow SOIC (SOP)&lt;br /&gt;
&lt;br /&gt;
ROM and RAM sizes are maximum sizes, i.e. smaller memories will alias, while bigger memories will be inaccessible past the stated size.&lt;br /&gt;
&lt;br /&gt;
== PCB Revisions ==&lt;br /&gt;
&lt;br /&gt;
Numbers include&lt;br /&gt;
&lt;br /&gt;
*01&lt;br /&gt;
*02&lt;br /&gt;
*03&lt;br /&gt;
*10&lt;br /&gt;
*20&lt;br /&gt;
*SP&lt;br /&gt;
&lt;br /&gt;
Mostly minor routing differences if any. Sometimes additional components in 10, 20, SP.&lt;br /&gt;
First figure is major revision -- i.e. additional components, bigger changes -- while second figure is minor changes in masks only.&lt;br /&gt;
&lt;br /&gt;
== Optional Parts ==&lt;br /&gt;
&lt;br /&gt;
* DMG-MC-SFCN-01 Momotarou Collection 2&lt;br /&gt;
* DMG-M-PEAN-10 Taito Variety Pack&lt;br /&gt;
&lt;br /&gt;
MC = Momotarou Collection? MultiCart?&lt;br /&gt;
&lt;br /&gt;
Code in parentheses after descriptor is only ever K.&lt;br /&gt;
&lt;br /&gt;
* DMG-BEAN(K)-10 Xenon 2&lt;br /&gt;
* DMG-DECN(K)-02 Mogurania (Mole Mania)&lt;br /&gt;
&lt;br /&gt;
Working hypothesis: PCBs were made in Korea and to track failure rates, marked with (K)?&lt;br /&gt;
&lt;br /&gt;
= CGB PCB Naming Convention =&lt;br /&gt;
&lt;br /&gt;
CGB PCB codes follow the following convention:&lt;br /&gt;
&lt;br /&gt;
 DMG-?NN-NN&lt;br /&gt;
     |||  \-- PCB revision&lt;br /&gt;
     ||\----- PCB descriptor RAM/ROM size combination&lt;br /&gt;
     |\------ PCB descriptor MBC&lt;br /&gt;
     \------- PCB code&lt;br /&gt;
&lt;br /&gt;
== PCB Code ==&lt;br /&gt;
&lt;br /&gt;
*A: Production Cartridges&lt;br /&gt;
*B: Test Cartridges&lt;br /&gt;
*Z: Revisions of certain A?? variants. Sometimes routing changes.&lt;br /&gt;
&lt;br /&gt;
== PCB Descriptor ==&lt;br /&gt;
&lt;br /&gt;
Descriptors describe MBC and ROM/RAM size combinations only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; |Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; class=&amp;quot;unsortable&amp;quot; rowspan=&amp;quot;2&amp;quot; |MBC&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; class=&amp;quot;unsortable&amp;quot; colspan=&amp;quot;2&amp;quot; |RAM/ROM size combination&lt;br /&gt;
|-&lt;br /&gt;
! RAM sizes&lt;br /&gt;
! ROM sizes&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| MBC5 (w/ or w/o rumble)&lt;br /&gt;
| 4/8M&lt;br /&gt;
| 2/4k EEPROM or 1M SRAM&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| MBC5 (w/ rumble)&lt;br /&gt;
| 16/32/64M&lt;br /&gt;
| 64k&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| G-MMC1 (+ 8M FLASH)&lt;br /&gt;
| 2/4/8M&lt;br /&gt;
| 256k&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| MBC6 (+ 8M FLASH)&lt;br /&gt;
| 16/32/64M&lt;br /&gt;
| 256k&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| MBC7&lt;br /&gt;
| 4/8M&lt;br /&gt;
| -?&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| -&lt;br /&gt;
| -?&lt;br /&gt;
| -?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| -&lt;br /&gt;
| 2/4/8M&lt;br /&gt;
| 64k&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| -&lt;br /&gt;
| 16/32M&lt;br /&gt;
| 2/4k EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| -&lt;br /&gt;
| -?&lt;br /&gt;
| -?&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| -&lt;br /&gt;
| -?&lt;br /&gt;
| -?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Maybe actually hierarchy? I.e. second figure is sub-index in first figure MBC PCB designs?&lt;br /&gt;
&lt;br /&gt;
== PCB Revisions ==&lt;br /&gt;
&lt;br /&gt;
Numbers include&lt;br /&gt;
&lt;br /&gt;
*01&lt;br /&gt;
*10&lt;br /&gt;
&lt;br /&gt;
Never observed any major differences. Maybe minor solder mask differences?&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.tauwasser.eu/index.php?title=Game_Boy_Dumping_Misc&amp;diff=104</id>
		<title>Game Boy Dumping Misc</title>
		<link rel="alternate" type="text/html" href="https://wiki.tauwasser.eu/index.php?title=Game_Boy_Dumping_Misc&amp;diff=104"/>
		<updated>2016-04-23T12:02:21Z</updated>

		<summary type="html">&lt;p&gt;Tauwasser: cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Nikkan Berutomo Club ==&lt;br /&gt;
&lt;br /&gt;
Nikkan Berutomo Club (Japan) (SGB Enhanced) might be a bad dump. Name entry screen katakana contains ロ (katakana RO) twice, ル (katakana RU) is missing in right-most column.&lt;br /&gt;
Change 2:5163 to 0x83 to rectify this. Might indicate fixed global checksum and possibly other bad bits/bytes. Or maybe the original developers just forgot?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=160px heights=144px&amp;gt;&lt;br /&gt;
DMG_Nikkan_Berutomo_Club_Name_Entry_Before.png|Before&lt;br /&gt;
DMG_Nikkan_Berutomo_Club_Name_Entry_After.png|After&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DMG]]&lt;/div&gt;</summary>
		<author><name>Tauwasser</name></author>
		
	</entry>
</feed>