Action 53 mapper: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(→‎$80: Mode: ok, wtf? fix end of table (which didn't show up on preview) and start to add rationales for the fixed banks)
(→‎$80: Mode: finish table)
Line 75: Line 75:
|}
|}


Here are some examples of how bank modes work, assuming the outer bank is set to $12 and inner bank is $07:
Here are some examples of how bank modes work, assuming the outer bank is set to $12 and inner bank is $07, along with which bits from the inner bank are used:


{| class="tabular"
{| class="tabular"
Line 82: Line 82:
| $00-$07 || 32 KiB || 32 KiB || $12 bottom (xxxx) || $12 top (xxxx)  
| $00-$07 || 32 KiB || 32 KiB || $12 bottom (xxxx) || $12 top (xxxx)  
|-
|-
| $08-$0B || Fixed $8000 || 32 KiB || $12 bottom (xxxx) || $12 top (xxx0)
| $08-$0B || Fixed $8000 || 32 KiB || $12 bottom (xxxx) || $12 top (xxx1)
|-
|-
| $0C-$0F || Fixed $C000 || 32 KiB || $12 top (xxx1) || $12 top (xxxx)
| $0C-$0F || Fixed $C000 || 32 KiB || $12 top (xxx1) || $12 top (xxxx)
Line 88: Line 88:
| $10-$17 || 32 KiB || 64 KiB || $13 bottom (xxx1) || $13 top (xxx1)
| $10-$17 || 32 KiB || 64 KiB || $13 bottom (xxx1) || $13 top (xxx1)
|-
|-
| $18-$1B || Fixed $8000 || 64 KiB || $12 bottom (xxxx) || $13 top
| $18-$1B || Fixed $8000 || 64 KiB || $12 bottom (xxxx) || $13 top (xx11)
|-
|-
| $1C-$1F || Fixed $C000 || 64 KiB || || $12 top (xxxx)
| $1C-$1F || Fixed $C000 || 64 KiB || $13 top (xx11) || $12 top (xxxx)
|-
|-
| $20-$27 || 32 KiB || 128 KiB || $13 bottom || $13 top
| $20-$27 || 32 KiB || 128 KiB || $13 bottom (xx11) || $13 top (xx11)
|-
|-
| $28-$2B || Fixed $8000 || 128 KiB || $12 bottom (xxxx) || $13 top
| $28-$2B || Fixed $8000 || 128 KiB || $12 bottom (xxxx) || $13 top (x111)
|-
|-
| $2C-$2F || Fixed $C000 || 128 KiB || || $12 top (xxxx)
| $2C-$2F || Fixed $C000 || 128 KiB || $13 top (x111) || $12 top (xxxx)
|-
|-
| $30-$37 || 32 KiB || 256 KiB || $17 bottom || $17 top
| $30-$37 || 32 KiB || 256 KiB || $17 bottom (x111) || $17 top (x111)
|-
|-
| $38-$3B || Fixed $8000 || 256 KiB || $12 bottom (xxxx) || $13 top
| $38-$3B || Fixed $8000 || 256 KiB || $12 bottom (xxxx) || $13 top (0111)
|-
|-
| $3C-$3F || Fixed $C000 || 256 KiB || || $12 top (xxxx)
| $3C-$3F || Fixed $C000 || 256 KiB || $13 top (0111) || $12 top (xxxx)
|}
|}



Revision as of 14:47, 3 October 2012

This is a sketch of a mapper that allows making a multicart of games that use multiple discrete mappers. As a random sample, it'd support 1943: The Battle of Midway/Valhalla (UNROM), 3-D Battles of Worldrunner (UNROM), Battle City (NROM-128), Battle Kid: Fortress of Peril (UOROM), Battle Tank (CNROM), Battleship (CNROM), Battletoads (AOROM), and Gekitotsu Yonku Battle (UNROM).

Registers

$5000-$5FFF
Register select
$8000-$FFFF
Register value

$5000: Register select

7654 3210
S       R
|       +- Select register
+--------- 0: User registers; 1: Supervisor registers

In a multicart, registers $00 and $01 change the bank within a game, and registers $80 and $81 remain constant throughout a given game's execution.

$00: CHR bank

7654 3210
   M   BB
   |   ++- Set CHR RAM A14-A13
   +------ Set CIRAM A10 if H/V mirroring is disabled

$01: Inner bank

7654 3210
   M BBBB
   | ++++- Set current PRG ROM bank
   +------ Set CIRAM A10 if H/V mirroring is disabled

$80: Mode

7654 3210
  SS PPMM
  || ||++- Nametable mirroring mode
  || ++--- PRG bank mode
  ++------ PRG outer bank size
Mirroring modes
Mode Effect
0 1-screen lower bank
1 1-screen upper bank
2 Vertical (and ignore writes to bit 4 of registers $00 and $01)
3 Horizontal (and ignore writes to bit 4 of registers $00 and $01)
PRG bank mode
Mode Effect
0, 1 Current 32 KiB bank in $8000-$FFFF
2 Bottom half of outer bank in $8000-$BFFF and current bank in $C000-$FFFF
3 Current bank in $8000-$BFFF and top half of outer bank in $C000-$FFFF
PRG outer bank size
Mode Effect
0 A20-A15 controlled by outer bank (32 KiB)
1 A20-A16 controlled by outer bank (64 KiB)
2 A20-A17 controlled by outer bank (128 KiB)
3 A20-A18 controlled by outer bank (256 KiB)

Here are some examples of how bank modes work, assuming the outer bank is set to $12 and inner bank is $07, along with which bits from the inner bank are used:

Mode value PRG bank mode Outer bank size Bank in $8000-$BFFF Bank in $C000-$FFFF
$00-$07 32 KiB 32 KiB $12 bottom (xxxx) $12 top (xxxx)
$08-$0B Fixed $8000 32 KiB $12 bottom (xxxx) $12 top (xxx1)
$0C-$0F Fixed $C000 32 KiB $12 top (xxx1) $12 top (xxxx)
$10-$17 32 KiB 64 KiB $13 bottom (xxx1) $13 top (xxx1)
$18-$1B Fixed $8000 64 KiB $12 bottom (xxxx) $13 top (xx11)
$1C-$1F Fixed $C000 64 KiB $13 top (xx11) $12 top (xxxx)
$20-$27 32 KiB 128 KiB $13 bottom (xx11) $13 top (xx11)
$28-$2B Fixed $8000 128 KiB $12 bottom (xxxx) $13 top (x111)
$2C-$2F Fixed $C000 128 KiB $13 top (x111) $12 top (xxxx)
$30-$37 32 KiB 256 KiB $17 bottom (x111) $17 top (x111)
$38-$3B Fixed $8000 256 KiB $12 bottom (xxxx) $13 top (0111)
$3C-$3F Fixed $C000 256 KiB $13 top (0111) $12 top (xxxx)

$81: Outer bank

7654 3210
  BB BBBB
  ++-++++- Set outer PRG ROM bank

Configurations

NROM-128 (#0)
Outer bank size 0, PRG mode 2 or 3, mirroring H or V, select $01
NROM-256 (#0)
Outer bank size 0, PRG mode 0, mirroring H or V, select $01
CNROM (#3)
Outer bank size 0, PRG mode 0, mirroring H or V, select $00
BNROM (#34)
Outer bank size 1-3, PRG mode 0, mirroring H or V, select $01
BNROM oversize (#34 as emulated)
Outer bank size 0, PRG mode 0, mirroring H or V, select $81, and modify bus-conflict-avoidance table for position within multicart
UNROM (common) (#2)
Outer bank size 1-3, PRG mode 3, mirroring H or V, select $01
UNROM (Crazy Climber and MGC 2011) (#180)
Outer bank size 1-3, PRG mode 2, mirroring H or V, select $01
AOROM (#7)
Outer bank size 1-3, PRG mode 0, mirroring 1-screen, select $01

Implementation notes

A CPLD requires at least one macrocell per bit of state, plus more macrocells for more complex operations. This mapper requires 20 bits of state, which leaves plenty of breathing room in a 36-cell CPLD for mapper logic.

  • Register select: 2 bits
  • Register $00: 6 bits (D4 is directed to register 0)
  • Register $01: 4 bits (D4 is directed to register 0)
  • Register $80: 6 bits
  • Register $81: 2 bits (D4 is directed to register 0)