INES Mapper 067: Difference between revisions
m (refile, add cat:nescartdb, fix bitmaps) |
(→Registers: I misread d800 vs f800 in Krzysiobal's notes) |
||
(14 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:iNES Mappers | {{DEFAULTSORT:067}}[[Category:iNES Mappers]][[Category:in NesCartDB]][[Category:ASIC mappers]][[Category:Mappers with cycle IRQs]] | ||
'''iNES Mapper 067''' represents the | '''iNES Mapper 067''' represents the [[Sunsoft 3 pinout|Sunsoft-3]] mapper, used in ''Fantasy Zone II'' (J), ''Mito Koumon II - Sekai Manyuu Ki'', and the [[Vs. System]] game ''Vs. Platoon''. | ||
== Overview == | |||
* PRG ROM size: Hardware supports at most 256 KiB | |||
* PRG ROM bank size: 16 KiB | |||
* PRG RAM: Unused, but mapper IC provides RAM enables. | |||
* CHR bank size: 2 KiB | |||
* CHR ROM size: Hardware supports at most 128 KiB | |||
* Nametable [[mirroring]]: Controlled by mapper (Horizontal, Vertical, 1-screen) | |||
* Subject to [[bus conflict]]s: No | |||
== Banks == | |||
* CPU $8000-$BFFF: 16 KiB switchable PRG ROM bank | |||
* CPU $C000-$FFFF: 16 KiB PRG ROM bank, fixed to the last bank | |||
* PPU $0000-$07FF: 2 KiB switchable CHR bank | |||
* PPU $0800-$0FFF: 2 KiB switchable CHR bank | |||
* PPU $1000-$17FF: 2 KiB switchable CHR bank | |||
* PPU $1800-$1FFF: 2 KiB switchable CHR bank | |||
== Registers == | == Registers == | ||
=== | === Interrupt Acknowledge ($8000) === | ||
Mask: $8800 | |||
Any write to this address or any of its mirrors acknowledges a pending IRQ. | |||
=== CHR bank | === CHR bank 0…3 ($8800..$BFFF) === | ||
Mask: $F800 | |||
Note that the hardware only has six pins for CHR banking, for a limit of 128KB of CHR. | |||
= | {| class="wikitable" | ||
! Write to CPU address | |||
! 2KB CHR bank affected | |||
|- | |||
| $8800 || $0000-$07FF | |||
|- | |||
| $9800 || $0800-$07FF | |||
|- | |||
| $A800 || $1000-$07FF | |||
|- | |||
| $B800 || $1800-$07FF | |||
|} | |||
=== IRQ load ($C800, write twice) === | === IRQ load ($C800, write twice) === | ||
Write the high then low byte of a 16-bit CPU cycle count, much like [[PPU registers|PPUADDR]]. This directly affects the current count, not a reload value. | Mask: $F800 | ||
Write the high then low byte of a 16-bit CPU cycle count, much like [[PPU registers|PPUADDR]]. This directly affects the current count, not a reload value. The write state is reset by writing to the register at $D800. | |||
=== IRQ enable ($D800) === | === IRQ enable ($D800) === | ||
Mask: $F800 | |||
7 bit 0 | 7 bit 0 | ||
...P .... | ...P .... | ||
Line 27: | Line 58: | ||
While bit 4 is true, the 16-bit count decreases by 1 every CPU cycle. | While bit 4 is true, the 16-bit count decreases by 1 every CPU cycle. | ||
Whenever the count wraps from $0000 to $FFFF, the mapper asserts an IRQ and pauses itself. | Whenever the count wraps from $0000 to $FFFF, the mapper asserts an IRQ and pauses itself. | ||
Writes | Writes reset a latch such that the next $C800 write goes to the ''high'' byte of the count. | ||
Despite previous notes, writes to this register do not acknowledge the IRQ. | |||
If counting is enabled, the External IRQ pin is also capable of asserting an IRQ. No existing hardware uses this functionality. | |||
=== Mirroring ($E800) === | === Mirroring ($E800) === | ||
Mask: $F800 | |||
7 bit 0 | 7 bit 0 | ||
.... ..MM | .... ..MM | ||
|| | || | ||
++- Nametable mirroring (0 | ++- Nametable mirroring (0=vertical, 1=horizontal, 2=1scA, 3=1scB) | ||
aka connect VRAM A10 to (0=PPU A10, 1=PPU A11, 2=Gnd, 3=Vcc) | |||
=== PRG bank ($F800) === | === PRG bank ($F800) === | ||
Mask: $F800 | |||
7 bit 0 | |||
...X PPPP | |||
| |||| | |||
| ++++- select a 16 KiB CHR ROM bank at CPU $8000-$BFFF. $C000-$FFFF is fixed to the last bank of PRG ROM. | |||
+------ 1 bit latch, present but unused. Could be combined with an external OR gate to increase PRG capacity to 512KB. | |||
== IRQ Operation == | |||
$C800 is a write-twice register (similar to $2005 and $2006). The first write sets the '''high''' 8 bits of the | |||
IRQ counter, and the second write sets the '''low''' 8 bits. This directly changes the actual IRQ counter – not | |||
a reload value. | |||
In addition to enabling/disabling counting, any write to $D800 will reset the toggle so that the next write to $C800 will be the first write. | |||
The IRQ counter, when enabled, counts down every CPU cycle. When it wraps ($0000→FFFF), it disables | |||
itself and triggers an IRQ. | |||
==References== | |||
* [http://www.romhacking.net/documents/362/ Disch's Mapper Notes] | |||
Latest revision as of 19:22, 18 February 2020
iNES Mapper 067 represents the Sunsoft-3 mapper, used in Fantasy Zone II (J), Mito Koumon II - Sekai Manyuu Ki, and the Vs. System game Vs. Platoon.
Overview
- PRG ROM size: Hardware supports at most 256 KiB
- PRG ROM bank size: 16 KiB
- PRG RAM: Unused, but mapper IC provides RAM enables.
- CHR bank size: 2 KiB
- CHR ROM size: Hardware supports at most 128 KiB
- Nametable mirroring: Controlled by mapper (Horizontal, Vertical, 1-screen)
- Subject to bus conflicts: No
Banks
- CPU $8000-$BFFF: 16 KiB switchable PRG ROM bank
- CPU $C000-$FFFF: 16 KiB PRG ROM bank, fixed to the last bank
- PPU $0000-$07FF: 2 KiB switchable CHR bank
- PPU $0800-$0FFF: 2 KiB switchable CHR bank
- PPU $1000-$17FF: 2 KiB switchable CHR bank
- PPU $1800-$1FFF: 2 KiB switchable CHR bank
Registers
Interrupt Acknowledge ($8000)
Mask: $8800
Any write to this address or any of its mirrors acknowledges a pending IRQ.
CHR bank 0…3 ($8800..$BFFF)
Mask: $F800
Note that the hardware only has six pins for CHR banking, for a limit of 128KB of CHR.
Write to CPU address | 2KB CHR bank affected |
---|---|
$8800 | $0000-$07FF |
$9800 | $0800-$07FF |
$A800 | $1000-$07FF |
$B800 | $1800-$07FF |
IRQ load ($C800, write twice)
Mask: $F800
Write the high then low byte of a 16-bit CPU cycle count, much like PPUADDR. This directly affects the current count, not a reload value. The write state is reset by writing to the register at $D800.
IRQ enable ($D800)
Mask: $F800
7 bit 0 ...P .... | +------ 0: Pause counter; 1: Count
While bit 4 is true, the 16-bit count decreases by 1 every CPU cycle. Whenever the count wraps from $0000 to $FFFF, the mapper asserts an IRQ and pauses itself. Writes reset a latch such that the next $C800 write goes to the high byte of the count.
Despite previous notes, writes to this register do not acknowledge the IRQ.
If counting is enabled, the External IRQ pin is also capable of asserting an IRQ. No existing hardware uses this functionality.
Mirroring ($E800)
Mask: $F800
7 bit 0 .... ..MM || ++- Nametable mirroring (0=vertical, 1=horizontal, 2=1scA, 3=1scB) aka connect VRAM A10 to (0=PPU A10, 1=PPU A11, 2=Gnd, 3=Vcc)
PRG bank ($F800)
Mask: $F800
7 bit 0 ...X PPPP | |||| | ++++- select a 16 KiB CHR ROM bank at CPU $8000-$BFFF. $C000-$FFFF is fixed to the last bank of PRG ROM. +------ 1 bit latch, present but unused. Could be combined with an external OR gate to increase PRG capacity to 512KB.
IRQ Operation
$C800 is a write-twice register (similar to $2005 and $2006). The first write sets the high 8 bits of the IRQ counter, and the second write sets the low 8 bits. This directly changes the actual IRQ counter – not a reload value.
In addition to enabling/disabling counting, any write to $D800 will reset the toggle so that the next write to $C800 will be the first write.
The IRQ counter, when enabled, counts down every CPU cycle. When it wraps ($0000→FFFF), it disables itself and triggers an IRQ.