quickdev16/snes/monitor/routines/memoryclear.asm
David Voswinkel a7270acdf1 o add monitor
2009-07-20 19:05:40 +02:00

160 lines
3.3 KiB
NASM

/*
;partially clears wram to predefined value
;in: a,8bit: number of word to clear memory with.
; x,16bit: target word adress in wram bank $7e
; y,16bit: transfer length
;how to use:
rep #$31
sep #$20
lda.b #0 ;clear word: $0000
ldy.w #$200
ldx.w #PaletteBuffer&$ffff
jsr ClearWRAM
*/
ClearWRAM:
php
phb
sep #$20
pha
lda.b #$80
pha
plb
pla
REP #$31 ; mem/A = 8 bit, X/Y = 16 bit
and.w #$7 ;calculate adress of clear pattern word(8 entries max)
asl a
adc.w #ClearWramBytePatterns
sta.w $4312 ;dma source
SEP #$20
lda.b #(:ClearWramBytePatterns+BaseAdress>>16)
STA $4314 ;Set source bank to $00
stx.w $2181 ;store target wram adress in bank $7e
stz.w $2183 ;bank $7e
LDX #$800a
STX $4310 ;Set DMA mode to fixed source, WORD to $2180
sty.w $4315 ;Set transfer size
LDA #$02
STA $420B ;Initiate transfer
plb
plp
RTS
;byte patterns to clear wram with.(8 entries max)
ClearWramBytePatterns:
.dw 0 ;zeros
.dw $eaea ;nops
.dw $2480 ;bg3 tilemap clear word
.dw $00c9 ;oam buffer
.dw $2907 ;bg1 tilemap clear
;clears whole vram
ClearVRAM:
pha
phx
php
REP #$30 ; mem/A = 8 bit, X/Y = 16 bit
SEP #$20
LDA #$80
sta.w $2100 ;set blanking active
stz.w $4200 ;disable irqs
STA $2115 ;Set VRAM port to word access
LDX #$1809
STX $4310 ;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 $4312 ;Set source address to $xx:0000
LDA #$00
STA $4314 ;Set source bank to $00
LDX #$FFFF
STX $4315 ;Set transfer size to 64k-1 bytes
LDA #$02
STA $420B ;Initiate transfer
STZ $2119 ;clear the last byte of the VRAM
lda.b ScreenBrightness
sta.w $2100 ;reenable screen and irqs
lda.b InterruptEnableFlags
sta.w $4200
plp
plx
pla
RTS
;copy random data to wram
;in: TempBuffer0-2 - source pointer
; x - wram bank $7e target
; y - transfer length
DmaToWRAM:
php
phb
sep #$20
pha
lda.b #$80
pha
plb
pla
REP #$31 ; mem/A = 8 bit, X/Y = 16 bit
lda.b TempBuffer
sta.w $4312 ;dma source
SEP #$20
lda.b TempBuffer+2
STA $4314 ;Set source bank to $00
stx.w $2181 ;store target wram adress in bank $7e
stz.w $2183 ;bank $7e
LDX #$8002
STX $4310 ;Set DMA mode to inc source, WORD to $2180
sty.w $4315 ;Set transfer size
LDA #$02
STA $420B ;Initiate transfer
plb
plp
RTS
;uploads 1 hirom bank to ram bank $7f
ROMToWRAM:
php
phb
sep #$20
pha
lda.b #$80
pha
plb
pla
REP #$31 ; mem/A = 8 bit, X/Y = 16 bit
stz.w $4315 ;Set transfer size
stz.w $4312 ;dma source
stz.w $2181 ;$7f0000
SEP #$20
lda.b #$c0
STA $4314 ;Set source bank to $00
lda.b #1
sta.w $2183 ;bank $7e
LDX #$8002
STX $4310 ;Set DMA mode to inc source, WORD to $2180
LDA #$02
STA $420B ;Initiate transfer
plb
plp
RTS