Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; constants
- SPRITES = $0200
- MAX_SPRITES = 10
- ; joypad buttons
- A = %10000000
- B = %01000000
- SELECT = %00100000
- START = %00010000
- UP = %00001000
- DOWN = %00000100
- LEFT = %00000010
- RIGHT = %00000001
- ; zero page variables
- .enum $0000
- nmis .dsb 1
- in_nmi .dsb 1
- joypad_1 .dsb 1
- joypad_1_old .dsb 1
- joypad_1_pressed .dsb 1
- joypad_1_released .dsb 1
- sprite_x .dsb 10
- sprite_y .dsb 10
- sprite_tile .dsb 10
- sprite_attrib .dsb 10
- sprite_moving .dsb 10
- sprite_was_moving .dsb 10
- sprite_dir .dsb 10
- sprite_frame .dsb 10
- sprite_delay .dsb 10
- index .dsw 1
- .ende
- ; ines header
- .db "NES",$1a
- .db $01
- .db $01
- .db $00
- .dsb 9,$00
- .base $c000
- ; reset vector
- reset:
- sei
- cld
- ldx #$40
- stx $4017
- ldx #$ff
- txs
- inx
- stx $2000
- stx $2001
- stx $4010
- - bit $2002
- bpl -
- - lda #$00
- sta $0000,x
- sta $0100,x
- sta $0300,x
- sta $0400,x
- sta $0500,x
- sta $0600,x
- sta $0700,x
- lda #$fe
- sta $0200, x
- inx
- bne -
- - bit $2002
- bpl -
- load_palettes:
- lda $2002
- lda #$3f
- sta $2006
- ldx #$00
- stx $2006
- - lda palette,x
- sta $2007
- inx
- cpx #$20
- bne -
- ; load title screen bg
- ldx #<title_bg
- ldy #>title_bg
- jsr draw_nametable
- lda #%10001000
- sta $2000
- lda #%00011110
- sta $2001
- jsr init_sprites
- jsr init_player
- main_loop:
- jsr read_joypad
- lda joypad_1_pressed
- and #START
- beq +
- lda #$00
- sta sprite_moving+1
- + jmp main_loop
- wait_for_vblank:
- inc nmis
- - lda nmis
- bne -
- rts
- init_sprites:
- ldx #$00
- lda #$FE
- - sta sprite_y,x
- inx
- cpx #MAX_SPRITES
- bne -
- rts
- update_sprites:
- ldx #$00
- - lda sprite_y,x
- cmp #$EF
- beq update_next_sprite
- lda sprite_moving,x
- bne move_sprite
- ; sprite isn't moving, set tile to static frame based on direction
- ldy sprite_dir,x
- lda static_frame,y
- sta sprite_tile,x
- jmp update_next_sprite
- move_sprite:
- ldy sprite_dir,x
- ; horizontal position change
- lda movement_x,y
- clc
- adc sprite_x,x
- sta sprite_x,x
- ; vertical position change
- lda movement_y,y
- clc
- adc sprite_y,x
- sta sprite_y,x
- ; cycle animation frames
- lda sprite_delay,x
- cmp #$08
- beq delay_done
- inc sprite_delay,x
- jmp update_tile
- delay_done:
- lda #$00
- sta sprite_delay,x
- ; update frame
- lda sprite_frame,x
- cmp #$02
- beq reset_frame
- inc sprite_frame,x
- jmp update_tile
- reset_frame:
- lda #$00
- sta sprite_frame,x
- update_tile:
- ldy sprite_dir,x
- lda static_frame,y
- clc
- adc sprite_frame,x
- sta sprite_tile,x
- update_next_sprite:
- inx
- cpx #MAX_SPRITES
- bne -
- rts
- copy_sprite_data:
- ldx #$00
- ldy #$00
- - lda sprite_y,x
- cmp #$EF
- beq copy_next_sprite
- ; transfer sprite data from variables to oam copy
- sta SPRITES,y
- iny
- lda sprite_tile,x
- sta SPRITES,y
- iny
- lda sprite_attrib,x
- sta SPRITES,y
- iny
- lda sprite_x,x
- sta SPRITES,y
- iny
- copy_next_sprite:
- inx
- cpx #MAX_SPRITES
- bne -
- rts
- read_joypad:
- lda joypad_1
- sta joypad_1_old
- lda #%01111111
- sta joypad_1
- sta $4016
- asl a
- sta $4016
- - lda $4016
- and #$03
- cmp #$01
- ror joypad_1
- bcs -
- lda joypad_1_old
- eor #$FF
- and joypad_1
- sta joypad_1_pressed
- lda joypad_1
- eor #$FF
- and joypad_1_old
- sta joypad_1_released
- rts
- ; temporary, just get some sprites on screen
- init_player:
- lda #$10
- sta sprite_x
- sta sprite_y
- lda #$01
- sta sprite_tile
- lda #$20
- sta sprite_x+1
- sta sprite_y+1
- lda #$00
- sta sprite_tile+1
- sta sprite_dir+1
- lda #$03
- sta sprite_dir+1
- lda #$01
- sta sprite_moving+1
- rts
- ; nmi routine
- nmi:
- pha
- txa
- pha
- tya
- pha
- lda in_nmi
- bne +
- jsr update_sprites
- jsr copy_sprite_data
- ; oam transfer from copy ($0200)
- lda #$00
- sta $2003
- lda #$02
- sta $4014
- + lda #$00
- sta nmis
- pla
- tay
- pla
- tax
- pla
- rti
- ; irq unused
- irq:
- rti
- ; bg/sprite palette data
- palette:
- .db $38,$18,$08,$0f,$38,$1a,$29,$0f,$38,$01,$11,$0f,$38,$00,$10,$20
- .db $38,$18,$26,$0f,$38,$02,$37,$0f,$38,$15,$27,$0f,$38,$18,$27,$20
- static_frame:
- .db $00,$03,$06,$09
- movement_x:
- .db $00,$01,$00,$01
- movement_y:
- .db $FF,$00,$01,$00
- .include "nametables.asm"
- ; interrupt vectors
- .org $fffa
- .dw nmi
- .dw reset
- .dw irq
- ; chr-rom
- .incbin "tiles.chr"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement