123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- ;------------------------------------------------------------------------
- ;- Written by: Neviksti
- ;- If you use my code, please share your creations with me
- ;- as I am always curious :)
- ;------------------------------------------------------------------------
- ;----------------------------------------------------------------------------
- ; InitSNES -- my "standard" initialization of SNES memory and registers
- ;----------------------------------------------------------------------------
- .MACRO InitSNES
- 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
|