Programming MMC1: Difference between revisions
(see also how to load CHR RAM) |
(→Quick setup for UNROM style: Split section about PRG banks and added how to make the code work everywhere with a 16-byte stub) |
||
Line 2: | Line 2: | ||
== Quick setup for UNROM style == | == Quick setup for UNROM style == | ||
If you are using the [[SGROM]] or [[SNROM]] board to provide an environment similar to [[Programming UNROM|UNROM]], with 8 KB of CHR RAM, a fixed PRG ROM bank at $C000, and a 16 KB switchable PRG ROM bank at $8000, do this in your init code: | If you are using the [[SGROM]] or [[SNROM]] board to provide an environment similar to [[Programming UNROM|UNROM]], with 8 KB of CHR RAM, a fixed PRG ROM bank at $C000, and a 16 KB switchable PRG ROM bank at $8000, do this in your init code after the mapper has been reset: | ||
<pre> | <pre> | ||
lda #$0E ; vertical mirroring, fixed $C000, 8 KB CHR pages | lda #$0E ; vertical mirroring, fixed $C000, 8 KB CHR pages | ||
sta $8000 ; (use $0F instead for horizontal mirroring) | sta $8000 ; (use $0F instead for horizontal mirroring) | ||
Line 18: | Line 16: | ||
</pre> | </pre> | ||
Games that use CHR RAM switch to another PRG bank before they [[CHR-ROM vs CHR-RAM#Switching to CHR RAM|copy tile data into CHR RAM]]. | |||
Then to switch PRG ROM banks, load the bank number into A and call this subroutine: | == PRG banks == | ||
Some revisions of the MMC1 IC might power up in a mode other than fixed-$C000, requiring that the vectors and the start of the [[init code]] be placed in all banks, much as in [[BxROM]] or [[AxROM]] or [[GxROM]]. | |||
Other revisions guarantee that the fixed bank is loaded at power on. | |||
To make sure your code works on all MMC1 revisions, put the following code in the last 16 bytes of each 16384 byte bank: | |||
<pre> | |||
reset_stub: | |||
sei | |||
cld | |||
ldx #$80 ; reset the mapper | |||
stx $E000 | |||
jmp reset ; must be in $C000-$FFED | |||
.addr nmiHandler, reset_stub, irqHandler | |||
</pre> | |||
Then to switch PRG ROM banks, load the bank number (0-15) into A and call this subroutine: | |||
<pre> | <pre> | ||
mmc1_load_prg_bank: | mmc1_load_prg_bank: | ||
Line 35: | Line 46: | ||
rts | rts | ||
</pre> | </pre> | ||
== See also == | == See also == | ||
* [[MMC1]] technical reference | * [[MMC1]] technical reference |
Revision as of 20:28, 6 June 2010
MMC1 was Nintendo's first ASIC mapper for the NES.
Quick setup for UNROM style
If you are using the SGROM or SNROM board to provide an environment similar to UNROM, with 8 KB of CHR RAM, a fixed PRG ROM bank at $C000, and a 16 KB switchable PRG ROM bank at $8000, do this in your init code after the mapper has been reset:
lda #$0E ; vertical mirroring, fixed $C000, 8 KB CHR pages sta $8000 ; (use $0F instead for horizontal mirroring) lsr a sta $8000 lsr a sta $8000 lsr a sta $8000 lsr a sta $8000
Games that use CHR RAM switch to another PRG bank before they copy tile data into CHR RAM.
PRG banks
Some revisions of the MMC1 IC might power up in a mode other than fixed-$C000, requiring that the vectors and the start of the init code be placed in all banks, much as in BxROM or AxROM or GxROM. Other revisions guarantee that the fixed bank is loaded at power on. To make sure your code works on all MMC1 revisions, put the following code in the last 16 bytes of each 16384 byte bank:
reset_stub: sei cld ldx #$80 ; reset the mapper stx $E000 jmp reset ; must be in $C000-$FFED .addr nmiHandler, reset_stub, irqHandler
Then to switch PRG ROM banks, load the bank number (0-15) into A and call this subroutine:
mmc1_load_prg_bank: sta $E000 lsr a sta $E000 lsr a sta $E000 lsr a sta $E000 lsr a sta $E000 rts
See also
- MMC1 technical reference