123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- ; This file is part of the snescom-asm demo - a demo of how to build a SNES program.
- ; See http://bisqwit.iki.fi/source/snescom.html for details.
- #include "memmap.i65"
- #define TILE_ADDR_REG_VAL(addr, scsize) \
- (((addr & $FC00) >> 8) + scsize)
- #define BMAP_ADDR_REG_VAL(addr, addr2) \
- (((addr & $F000) >> 12) | (((addr2 & $F000) >> 12) << 4))
- ; NMI - called once per screen refresh (or something like that)
- NMI_ROUTINE:
- sep #$20 : .as
- lda $4210
- rtl
- ; IRQ - called when triggered (which is..?)
- IRQ_ROUTINE:
- sep #$20 : .as
- lda $4211 ;Acknowledge irq
- rtl
- ; To be called regularly - updated screen contents
- ; Sends the palette structure to PPU
- PaletteDMA:
- .xl : .as
- lda #$00 : sta $4300 ;dma type
- lda #$22 : sta $4301 ;address $2122
-
- lda #^(PALETTE_ADDRESS) : sta $4304
- ldx #!(PALETTE_ADDRESS) : stx $4302
-
- ldx #512 : stx $4305 ; size: 16*2*16 bytes.
-
- lda #$00 : sta $2121 ;Write CGRAM address (0)
-
- lda #$01 : sta $420B ;Activate dma 0
- rts
- ; Sends the video buffer contents to PPU
- VRAMdma:
- sty $2116 ;Write VRAM address
-
- sty $4302 : sta $4304 ;Write DMA address
- stx $4305 ;Write size
-
- lda #$80 : sta $2115 ;PPU programming
-
- lda #$01 : sta $4300 ;dma type
- lda #$18 : sta $4301 ;address $2118
-
- lda #$01 : sta $420B ;Activate DMA 0
- rts
- ; Jumped to from snesheader.a65 - when the game is reseted.
- RESET_GAME:
- rep #$30 : .al : .xl
-
- lda #$0400 : tcd
- ldx #$03FE : txs
-
- sep #$20 : .as
-
- pha
- plb
-
- lda #$01
- sta $420D ; set "fast" mode
-
- ; Next initialize screen
-
- jsr InitializeScreen
- jsr InitializeIRQ
-
- sep #$20 : .as
-
- ;lda #$17
- lda #$03
- sta $212C ; put screens on
- sta $212D ; put screens on
-
- lda #$00: sta $2121
- lda #$E0: sta $2122
- lda #$7C: sta $2122
-
- jmp @GAME_MAIN
- InitializeIRQ:
- sep #$20 : .as
-
- lda #$B1 : sta $4200
- ldx #0 : stx $4207
- ldx #211 : stx $4209
-
- sei
- lda $4211
- - lda $4210 ;: bpl -
-
- rts
-
- InitializeScreen:
- rep #$10 : .xl
- sep #$20 : .as
-
- lda #$00 : sta $2101
-
- ldx #$0000 : stx $2102
-
- lda #$09 : sta $2105 ; select screen mode 1.
- lda #$00 : sta $2106
-
- lda #TILE_ADDR_REG_VAL(BG1_TILE_ADDR, 0) : sta $2107
- lda #TILE_ADDR_REG_VAL(BG2_TILE_ADDR, 0) : sta $2108
- lda #TILE_ADDR_REG_VAL(BG3_TILE_ADDR, 0) : sta $2109
- lda #TILE_ADDR_REG_VAL(BG4_TILE_ADDR, 0) : sta $210A
-
- lda #BMAP_ADDR_REG_VAL(BG1_BMAP_ADDR, BG2_BMAP_ADDR) : sta $210B
- lda #BMAP_ADDR_REG_VAL(BG3_BMAP_ADDR, BG4_BMAP_ADDR) : sta $210C
-
- ; Set scrolling to 0,0 to all bgs
- lda #$00 : sta $210D : sta $210D
- lda #$00 : sta $210E : sta $210E
- lda #$00 : sta $210F : sta $210F
- lda #$00 : sta $2110 : sta $2110
- lda #$00 : sta $2111 : sta $2111
- lda #$00 : sta $2112 : sta $2112
- lda #$00 : sta $2113 : sta $2113
- lda #$00 : sta $2114 : sta $2114
- rts
|