What is Mode 0?
Mode 0 is the first mode on the SNES, characterized by its offer of four layers, as opposed to the normal three Mode 1 offers you. However, there are two significant drawbacks: you only have four colors (3 actual colors plus transparency) per palette, and the layer 3 tilemap is halved to make room for layer 4. However, the latter drawback can be circumvented by sacrificing GFX slots (citation needed).
Thankfully, the first drawback does not apply on the sprite layer, so no worries about your sprites!
Applications of Mode 0
More interestingly, in the field of Super Mario World hacking, a few hacks and contest levels have used it, such as ASMWCP, LMPuny's work-in-progress SUPER MARIO BROS. Returns, idol and Katrina's Chocolate Level Design Contest 2018 entry lightest, and AnasMario130's Power Mario Contest entry Pyro-Blue's Fort.
Palette and Tilemap Distribution
As mentioned in the previous heading, Mode 0 can only offer you four colors per palette, including transparency. Each layer takes up 8 four-color palettes distributed in two rows each. Layer 1 takes up rows 0-1, layer 2 rows 2-3, layer 3 rows 4-5, and layer 4 rows 6-7.
As for the tilemap, it is 2bpp, but the size must be 4 KB. However, the arrangement for the tilemap is doubled, meaning that in a graphics editor like YY-Chr, you can have eight rows' worth of graphics instead of the usual four.
In Super Mario World, the tilemap distribution is different-- FG1 occupies tiles 0-FF, FG2 occupies tiles 100-1FF, BG1 occupies tiles 200-2FF, and FG3 occupies tiles 300-3FF.
How to Use Mode 0 in Super Mario World
1. First of all, please use one of the given codes in a level using UberASM Tool before proceeding:
Stationary Layer 4, by LMPuny
!base1 = $0000 !base2 = $0000 if read1($00FFD5) == $23 sa1rom !base1 = $3000 !base2 = $6000 endif init: LDA #$51 : STA $2109 LDA #$59 : STA $210A LDA #$44 : STA $210C STZ $3E LDA #$11 : STA $0D9D|!base2 LDA #$0E : STA $0D9E|!base2 REP #$20 : LDA $20 : CLC : ADC #$0080 : SEP #$20 STA $24 : XBA : STA $24 REP #$20 : LDA $24 CLC : ADC #$0070 : SEP #$20 STA $2114 : XBA : STA $2114 rtl
Automatically-Scrolling Layer 4, by LMPuny
!base1 = $0000 !base2 = $0000 if read1($00FFD5) == $23 sa1rom !base1 = $3000 !base2 = $6000 endif !Freespace = $60 ; change it to something else if you're already using it init: LDA #$51 : STA $2109 LDA #$59 : STA $210A LDA #$44 : STA $210C STZ $3E LDA #$11 : STA $0D9D|!base2 LDA #$0E : STA $0D9E|!base2 REP #$20 : LDA $20 : CLC : ADC #$0080 : SEP #$20 STA $24 : XBA : STA $24 REP #$20 : LDA $24 CLC : ADC #$0070 : SEP #$20 STA $2114 : XBA : STA $2114 main: ; Layer 4 V-Scroll = Layer 3 V-Scroll REP #$20 : LDA $24 : SEP #$20 STA $2114 : XBA : STA $2114 lda $9d ora $13d4|!base2 bne freeze rep #$20 inc $60 lda $!Freespace sep #$20 sta $2113 : xba : sta $2113 freeze: rtl
init: LDA #$51 : STA $2109 LDA #$59 : STA $210A LDA #$44 : STA $210C STZ $3E LDA #$11 : STA $0D9D|!base2 LDA #$0E : STA $0D9E|!base2 REP #$20 : LDA $20 : CLC : ADC #$0080 : SEP #$20 STA $24 : XBA : STA $24 REP #$20 : LDA $24 CLC : ADC #$0070 : SEP #$20 STA $2114 : XBA : STA $2114 main: ; Layer 4 H-Scroll = Layer 3 H-Scroll / 4 REP #$20 : LDA $22 : LSR A : LSR A : SEP #$20 STA $2113 : XBA : STA $2113 ; Layer 4 V-Scroll = Layer 3 V-Scroll REP #$20 : LDA $24 : SEP #$20 STA $2114 : XBA : STA $2114 RTL
Bugs so far:
- Layer 2 translucency doesn't work when set in LM. It must be done manually with this code under the init: label without an RTL at the end (the code for layer 3 is still unknown for now):
lda #$22 ; translucency for layer 2 sta $40 rep #$20 lda #%0001110100000010 sta $212C sta $212E sep #$20
2. Press Ctrl+F7 on a level to change Lunar Magic's graphics viewer mode to 2bpp.
3. Use the following 2bpp-trimmed SMW tileset for your Layer 4 levels by AnasMario130 (includes most of SMW's important animations and graphics, such as the cave tileset, coins, question blocks, etc.):
First Tileset: Cave
Second Tileset: Ghost Ship
ExAnimation in Mode 0 levels
ExAnimation in Mode 0 levels is not really difficult once you adapt to it, but it may seem tricky at first glance. The main reason for this is that even in LM's 2bpp graphics viewing mode, ExAnimation tiles are still rendered in 4bpp, thus becoming garbled. Also the size of the frames to be animated is condensed into 8x8 tiles according to the following arrangement:
ExAnimation Tile Explanation
780-781, 790-791, 7A0-7A1, 7B0-7B1: ?-block
782-783, 792-793, 7A2-7A3, 7B2-7B3: Coin
784-785: Used brown block
794-795, 7A4-7A5, 7B4-7B5, 7C4-7C5: Turning turnblock
786-787, 796-797: Boo animation 1
7A6-7A7, 7B6-7B7: Boo animation 2
7C0-7C1, 7D0-7D1, 7E0-7E1, 7F0-7F1: Note block
7CA-7CB, 7DA-7DB, 7EA-7EB, 7FA-7FB: Seaweed animation 1
7CC-7CD, 7DC-7DD: Muncher
7CE-7CF, 7DE-7DF, 7EE-7EF, 7FE-7FF: Seaweed animation 2
First Example for ExAnimation
We wanna animate the ?-block. How will we do it?
1. First of all, before animating anything, there is one important point to keep in mind: the destination tile for your ExAnimation tile in the ExAnimation window must be divided by 2 in hex, otherwise the destination will not be as expected. So for example, if your destination tile is EA, it should be divided by 2 in hex in a calculator, like your computer's built-in one or something else, to get 75. Put 75 instead in the destination tile text box.
For our example, the ?-block's final destination is at (60/2=)30. If we were to put 60 instead, the final destination would be at (60*2=)C0, which is not what we want.
2. For the ?-block you might expect the animation type to be 4 8x8s: line, but that is completely wrong! Since the frames are condensed in 8x8 tiles under the 8x8 Tile Editor window, it should be 2 8x8s: line instead. Refer to the ExAnimation tile explanation section for the ?-block and the 8x8 Tile Editor. The correct tiles to be input in the ExAnimation window are 780, 790, 7A0, and 7B0 and the type should be 2 8x8s: line.
Now, you just got your first 2bpp 0 animation set up! The same procedure goes for layer 3 ExAninimated tiles, except that you can directly put in your destination file (from 0x1C00-0x1DFF)!