tb1/tb1_snes/level_1.s
2013-01-25 17:21:10 -05:00

348 lines
6.5 KiB
ArmAsm

; Level 1
; Page zero locations
joypad1 = $0000
joypad2 = $0001
shipx = $0002
.setcpu "65816"
.segment "STARTUP"
;================================================
; LEVEL 1
;================================================
level_1:
sep #$20 ; mem/A = 8 bit
.a8
rep #$10 ; X/Y = 16 bit
.i16
;==========================
; Setup Background
;==========================
; we want the BG1 Tilemap to start at VRAM $f000
; Format is
; aaaa aass a is shifted by 10 for address
; ss = size of screen in tiles 00 = 32x32
;
; 0111 1000
lda #$78 ; BG1 Tilemap starts at VRAM $f000/2
sta $2107 ; bg1 src
; we want the BG2 Tilemap to start at VRAM $d000
; Format is
; aaaa aass a is shifted by 10 for address
; ss = size of screen in tiles 10 = 32x64
;
; 0110 1010
lda #$6a ; BG2 Tilemap starts at VRAM $d000/2
sta $2108 ; bg2 src
; aaaa bbbb a= BG2 tiles, b= BG1 tiles
; bbbb<<13
; 0000 0000
; our BG1 tiles are stored starting in VRAM $0000
lda #$32 ; bg2 tile data starts at VRAM 5000/2
sta $210b ; bg1 tile data starts at VRAM 4000/2
;===============================
; Load Level1 Background Palette
;===============================
stz $2121 ; start with color 0
ldy #(16*2) ; we have 16 colors
lda #^level1_background_palette
ldx #.LOWORD(level1_background_palette)
jsr svmw_load_palette
;======================
; Load Level1 Tile Data
;======================
ldx #$2000 ;
stx $2116 ; set adddress for VRAM read/write
; multiply by 2, so 0x4000
lda #^level1_background_tile_data
ldx #.LOWORD(level1_background_tile_data)
ldy #1824 ; Copy 57 tiles, which are 32 bytes each
; 8x8 tile with 4bpp
; (57*32) = 1824 = ????
jsr svmw_load_vram
;===================================
; Load Level1 Tile Map
;===================================
ldx #$7800 ;
stx $2116 ; set adddress for VRAM read/write
; multiply by 2, so 0xe000
lda #^level1_background_tilemap
ldx #.LOWORD(level1_background_tilemap)
ldy #$0700 ; 32x28 = 896 * 2 = 0x700
jsr svmw_load_vram
;===============================
; Load Level1 Star Palette
;===============================
lda #16
sta $2121 ; start with color 16
ldy #(16*2) ; we have 16 colors
lda #^star_background_palette
ldx #.LOWORD(star_background_palette)
jsr svmw_load_palette
;======================
; Load Level1 Star Data
;======================
ldx #$3000 ;
stx $2116 ; set adddress for VRAM read/write
; multiply by 2, so 0x4000
lda #^star_background_tile_data
ldx #.LOWORD(star_background_tile_data)
ldy #$4420 ; Copy 545 tiles, which are 32 bytes each
; 8x8 tile with 4bpp
; (545*32) = 17,440 = 0x4420
jsr svmw_load_vram
;===================================
; Load Level1 Star Tile Map
;===================================
ldx #$6800 ;
stx $2116 ; set adddress for VRAM read/write
; multiply by 2, so 0xd000
lda #^star_background_tilemap
ldx #.LOWORD(star_background_tilemap)
ldy #$1000 ; 32x64 = 2048 * 2 = 0x1000
jsr svmw_load_vram
;==========================
; Setup Sprite
;==========================
; Load Palette for our sprite
; Sprite Palettes start at color 128
lda #128 ; start with color 128
sta $2121 ;
ldy #(16*2) ; we have 16 colors
lda #^level1_pal0_palette
ldx #.LOWORD(level1_pal0_palette)
jsr svmw_load_palette
;=========================
; Load sprite data to VRAM
;=========================
lda #$80 ; increment after writing $2119
sta $2115
ldx #$0000 ;
stx $2116 ; set adddress for VRAM read/write
; multiply by 2, so 0x0000
lda #^level1_pal0_data
ldx #.LOWORD(level1_pal0_data)
ldy #$0800 ; 32 bytes * 64 tiles
jsr svmw_load_vram
; Init sprites to be offscreen
jsr svmw_move_sprites_offscreen
; Set our sprite active
; assume 544 byte sprite table in $0200
sep #$20 ; mem/A = 8 bit
.a8
lda #104
sta $0200 ; set sprite 0 X to 0
lda #192 ; set sprite 0 Y to 100
sta $0201
; Xxxxxxxxx yyyyyyy cccccccc vhoo pppN
;
stz $0202 ; set sprite 0
; 0010 0000
; no flip, priority 2, N=0 palette=0 (128)
lda #$20
sta $0203
; X high bit = 0 for sprite 0
; sprite size = 0 (smaller)
lda #%01010110
sta $0400
; Enable sprite
; sssnnbbb
; sss = size (16x16 and 32x32 in our case)
; nn = name
; bbb = base selection
lda #%01100000
sta $2101
jsr svmw_transfer_sprite
;======================
; Setup the Video Modes
;======================
level1_setup_video:
sep #$20 ; mem/A = 8 bit
.a8
rep #$10 ; X/Y = 16 bit
.i16
lda #$01 ; 8x8 tiles, Mode 1
sta $2105
lda #$13 ; Enable BG1,BG2, and sprites
sta $212c
stz $212d ; disable subscreen
lda #$00 ; Disable NMI (VBlank Interrupt) and joypads
sta $4200 ;
;==========================
; Setup VBLANK routine
;==========================
ldx #level1_vblank
stx vblank_vector
lda #$81 ; Enable NMI (VBlank Interrupt) and joypads
sta $4200 ;
jsr svmw_fade_in
; lda #$0f
; sta $2100 ; Turn on screen, full Brightness
; init vars
lda #104
sta shipx
level1_loop:
wai ; wait for interrupt
; handle keypress
lda joypad1
check_left:
bit #$02
beq check_right
dec shipx
bpl check_right
stz shipx
check_right:
bit #$01
beq no_keypress
inc shipx
no_keypress:
; update OAM
lda shipx
sta $0200 ; set sprite 0 X to shipx
bra level1_loop
;=============================
; Level 1 VBLank Routine
;=============================
level1_vblank:
php ; save status register
rep #$30 ; Set A/mem=16 bits, X/Y=16 bits (to push all 16 bits)
.a16 ; tell assembler the A is 16-bits
phb ; save b
pha ; save A
phx ; save X
phy ; save Y
phd ; save zero page
sep #$20 ; A/mem=8 bit
.a8
l1_joypad_read:
lda $4212 ; get joypad status
and #$01 ; if joy is not ready
bne l1_joypad_read ; wait
lda $4219 ; read joypad (BYSTudlr)
sta joypad1
lda $4218 ; read joypad (AXLRiiii)
sta joypad2
done_joypad:
;=======================================
; Update the sprite info structure (OAM)
;=======================================
jsr svmw_transfer_sprite
done_vblank:
lda $4210 ; Clear NMI flag
rep #$30 ; A/Mem=16 bits, X/Y=16 bits
.a16
pld ; restore saved vaules from stack
ply
plx
pla
plb
plp
rti ; return from interrupt
;============================================================================
; Sprite Data
;============================================================================
.segment "HIGHROM"
; sprite data
.include "level1_pal0.sprites"
.include "level1_background.tiles"
.include "star_background.tiles"