|
|
;------------------------------------------------------------------------ ;- Standard SNES initialization routine, originally by Neviksti ;------------------------------------------------------------------------
.MACRO InitializeSNES sei ;disable interrupts clc ;switch to native mode xce
REP #$38 ; mem/A = 16 bit, X/Y = 16 bit ;decimal mode off
LDX #$1FFF ;Setup the stack TXS ;Transfer Index X to Stack Pointer Register
;do the rest of the initialization in a routine JSL $008000
SEP #$20 ; mem/A = 8 bit .ENDM
;----------------------------------------------------------------------------
.BANK 0 SLOT 0 .ORG 0 .SECTION "InitializeSNESCode" FORCE
InitializeSNES: PHK ;set Data Bank = Program Bank PLB
LDA #$0000 ;set Direct Page = $0000 TCD ;Transfer Accumulator to Direct Register
LDX $1FFD ;we clear all the mem at one point ... STX $4372 ;so save the return address in a place that won't get overwritten LDX $1FFF STX $4374
SEP #$20 ; mem/A = 8 bit REP #$10
LDA #$8F STA $2100 ;turn screen off for now, set brightness to normal
LDX #$2101 _Loop00: ;regs $2101-$210C STZ $00,X ;set Sprite,Character,Tile sizes to lowest, and set addresses to $0000 INX CPX #$210D BNE _Loop00
_Loop01: ;regs $210D-$2114 STZ $00,X ;Set all BG scroll values to $0000 STZ $00,X INX CPX #$2115 BNE _Loop01
LDA #$80 ;reg $2115 STA $2115 ; Initialize VRAM transfer mode to word-access, increment by 1
STZ $2116 ;regs $2117-$2117 STZ $2117 ;VRAM address = $0000
;reg $2118-$2119 ;VRAM write register... don't need to initialize
STZ $211A ;clear Mode7 setting
LDX #$211B _Loop02: ;regs $211B-$2120 STZ $00,X ;clear out the Mode7 matrix values STZ $00,X INX CPX #$2121 BNE _Loop02
;reg $2121 - Color address, doesn't need initilaizing ;reg $2122 - Color data, is initialized later
LDX #$2123 _Loop03: ;regs $2123-$2133 STZ $00,X ;turn off windows, main screens, sub screens, color addition, INX ;fixed color = $00, no super-impose (external synchronization), CPX #$2134 ;no interlaced mode, normal resolution BNE _Loop03
;regs $2134-$2136 - multiplication result, no initialization needed ;reg $2137 - software H/V latch, no initialization needed ;reg $2138 - Sprite data read, no initialization needed ;regs $2139-$213A - VRAM data read, no initialization needed ;reg $213B - Color RAM data read, no initialization needed ;regs $213C-$213D - H/V latched data read, no initialization needed
STZ $213E ;reg $213E - might not be necesary, but selects PPU master/slave mode ;reg $213F - PPU status flag, no initialization needed
;reg $2140-$2143 - APU communication regs, no initialization required
;reg $2180 - read/write WRAM register, no initialization required ;reg $2181-$2183 - WRAM address, no initialization required
;reg $4016-$4017 - serial JoyPad read registers, no need to initialize
STZ $4200 ;reg $4200 - disable timers, NMI,and auto-joyread
LDA #$FF STA $4201 ;reg $4201 - programmable I/O write port, initalize to allow reading at in-port
;regs $4202-$4203 - multiplication registers, no initialization required ;regs $4204-$4206 - division registers, no initialization required
;regs $4207-$4208 - Horizontal-IRQ timer setting, since we disabled this, it is OK to not init ;regs $4209-$420A - Vertical-IRQ timer setting, since we disabled this, it is OK to not init
STZ $420B ;reg $420B - turn off all general DMA channels STZ $420C ;reg $420C - turn off all H-MA channels
STZ $420D ;reg $420D - ROM access time to slow (2.68Mhz)
LDA $4210 ;reg $4210 - NMI status, reading resets
;reg $4211 - IRQ status, no need to initialize ;reg $4212 - H/V blank and JoyRead status, no need to initialize ;reg $4213 - programmable I/O inport, no need to initialize
;reg $4214-$4215 - divide results, no need to initialize ;reg $4216-$4217 - multiplication or remainder results, no need to initialize
;regs $4218-$421f - JoyPad read registers, no need to initialize
;regs $4300-$437F ;no need to intialize because DMA was disabled above ;also, we're not sure what all of the registers do, so it is better to leave them at ;their reset state value
JSR ClearVRAM ;Reset VRAM JSR ClearPalette ;Reset colors
;**** clear Sprite tables ********
STZ $2102 ;sprites initialized to be off the screen, palette 0, character 0 STZ $2103 LDX #$0080 LDA #$F0 _Loop08: STA $2104 ;set X = 240 STA $2104 ;set Y = 240 STZ $2104 ;set character = $00 STZ $2104 ;set priority=0, no flips DEX BNE _Loop08
LDX #$0020 _Loop09: STZ $2104 ;set size bit=0, x MSB = 0 DEX BNE _Loop09
;**** clear WRAM ********
STZ $2181 ;set WRAM address to $000000 STZ $2182 STZ $2183
LDX #$8008 STX $4300 ;Set DMA mode to fixed source, BYTE to $2180 LDX #wram_fill_byte STX $4302 ;Set source offset LDA #:wram_fill_byte STA $4304 ;Set source bank LDX #$0000 STX $4305 ;Set transfer size to 64k bytes LDA #$01 STA $420B ;Initiate transfer
LDA #$01 ;now set the next 64k bytes STA $420B ;Initiate transfer
PHK ;make sure Data Bank = Program Bank PLB
CLI ;enable interrupts again
LDX $4372 ;get our return address... STX $1FFD LDA $4374 STA $1FFF RTL
wram_fill_byte: .db $00
;---------------------------------------------------------------------------- ; ClearVRAM -- Sets every byte of VRAM to zero ; In: None ; Out: None ; Modifies: flags ;---------------------------------------------------------------------------- ClearVRAM: pha phx php
REP #$30 ; mem/A = 8 bit, X/Y = 16 bit SEP #$20
LDA #$80 STA $2115 ;Set VRAM port to word access LDX #$1809 STX $4300 ;Set DMA mode to fixed source, WORD to $2118/9 LDX #$0000 STX $2116 ;Set VRAM port address to $0000 STX $0000 ;Set $00:0000 to $0000 (assumes scratchpad ram) STX $4302 ;Set source address to $xx:0000 LDA #$00 STA $4304 ;Set source bank to $00 LDX #$FFFF STX $4305 ;Set transfer size to 64k-1 bytes LDA #$01 STA $420B ;Initiate transfer
STZ $2119 ;clear the last byte of the VRAM
plp plx pla RTS
;---------------------------------------------------------------------------- ; ClearPalette -- Reset all palette colors to zero ; In: None ; Out: None ; Modifies: flags ;---------------------------------------------------------------------------- ClearPalette: PHX PHP REP #$30 ; mem/A = 8 bit, X/Y = 16 bit SEP #$20
STZ $2121 LDX #$0100 ClearPaletteLoop: STZ $2122 STZ $2122 DEX BNE ClearPaletteLoop
PLP PLX RTS
.ENDS
|