mirror of
https://github.com/deater/tb1.git
synced 2024-05-31 22:41:30 +00:00
snes: can now move ship left/right
This commit is contained in:
parent
db9e66cc86
commit
6d9412fdae
|
@ -1,2 +1,2 @@
|
||||||
.word $3851 ; Complement of checksum
|
.word $3fcf ; Complement of checksum
|
||||||
.word $c7ae ; Unsigned 16-bit sum of ROM
|
.word $c030 ; Unsigned 16-bit sum of ROM
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
|
; Level 1
|
||||||
|
|
||||||
; Page zero locations
|
; Page zero locations
|
||||||
ball_x = $0000
|
joypad1 = $0000
|
||||||
|
joypad2 = $0001
|
||||||
|
shipx = $0002
|
||||||
|
|
||||||
.setcpu "65816"
|
.setcpu "65816"
|
||||||
|
|
||||||
|
@ -16,20 +20,6 @@ level_1:
|
||||||
rep #$10 ; X/Y = 16 bit
|
rep #$10 ; X/Y = 16 bit
|
||||||
.i16
|
.i16
|
||||||
|
|
||||||
|
|
||||||
;==========================
|
|
||||||
; Setup VBLANK routine
|
|
||||||
;==========================
|
|
||||||
|
|
||||||
; sei ; disable interrupts
|
|
||||||
|
|
||||||
; lda #level1_vblank
|
|
||||||
; sta vblank_vector
|
|
||||||
|
|
||||||
; cli ; enable interrupts
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;==========================
|
;==========================
|
||||||
; Setup Background
|
; Setup Background
|
||||||
;==========================
|
;==========================
|
||||||
|
@ -123,38 +113,37 @@ level_1:
|
||||||
|
|
||||||
jsr svmw_load_vram
|
jsr svmw_load_vram
|
||||||
|
|
||||||
;
|
|
||||||
; Init sprites to be offscreen
|
; Init sprites to be offscreen
|
||||||
|
|
||||||
jsr svmw_move_sprites_offscreen
|
jsr svmw_move_sprites_offscreen
|
||||||
|
|
||||||
; Set our sprite active
|
; Set our sprite active
|
||||||
; assume 544 byte sprite table in $0000
|
; assume 544 byte sprite table in $0200
|
||||||
|
|
||||||
sep #$20 ; mem/A = 8 bit
|
sep #$20 ; mem/A = 8 bit
|
||||||
.a8
|
.a8
|
||||||
lda #104
|
lda #104
|
||||||
sta $0000 ; set sprite 0 X to 0
|
sta $0200 ; set sprite 0 X to 0
|
||||||
|
|
||||||
lda #192 ; set sprite 0 Y to 100
|
lda #192 ; set sprite 0 Y to 100
|
||||||
sta $0001
|
sta $0201
|
||||||
|
|
||||||
; Xxxxxxxxx yyyyyyy cccccccc vhoopppN
|
; Xxxxxxxxx yyyyyyy cccccccc vhoopppN
|
||||||
;
|
;
|
||||||
|
|
||||||
stz $0002 ; set sprite 0
|
stz $0202 ; set sprite 0
|
||||||
|
|
||||||
; 00000000
|
; 00000000
|
||||||
; no flip, priority 0, N=0 palette=0 (128)
|
; no flip, priority 0, N=0 palette=0 (128)
|
||||||
|
|
||||||
lda #$00
|
lda #$00
|
||||||
sta $0003
|
sta $0203
|
||||||
|
|
||||||
; X high bit = 0 for sprite 0
|
; X high bit = 0 for sprite 0
|
||||||
; sprite size = 0 (smaller)
|
; sprite size = 0 (smaller)
|
||||||
|
|
||||||
lda #%01010110
|
lda #%01010110
|
||||||
sta $0200
|
sta $0400
|
||||||
|
|
||||||
; Enable sprite
|
; Enable sprite
|
||||||
; sssnnbbb
|
; sssnnbbb
|
||||||
|
@ -181,29 +170,70 @@ level1_setup_video:
|
||||||
sta $2105
|
sta $2105
|
||||||
|
|
||||||
lda #$11 ; Enable BG1 and sprites
|
lda #$11 ; Enable BG1 and sprites
|
||||||
; lda #$01 ; Enable BG1
|
|
||||||
sta $212c
|
sta $212c
|
||||||
|
|
||||||
stz $212d ; disable subscreen
|
stz $212d ; disable subscreen
|
||||||
|
|
||||||
lda #$0f
|
|
||||||
sta $2100 ; Turn on screen, full Brightness
|
|
||||||
|
|
||||||
|
|
||||||
; lda #$81 ; Enable NMI (VBlank Intterupt) and joypads
|
lda #$00 ; Disable NMI (VBlank Interrupt) and joypads
|
||||||
; sta $4200 ;
|
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:
|
level1_loop:
|
||||||
|
|
||||||
; all work done in interrupt handler
|
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
|
bra level1_loop
|
||||||
|
|
||||||
|
|
||||||
;=============================
|
;=============================
|
||||||
; VBLank Routine
|
; Level 1 VBLank Routine
|
||||||
; All the action happens here
|
|
||||||
;=============================
|
;=============================
|
||||||
|
|
||||||
level1_vblank:
|
level1_vblank:
|
||||||
|
@ -221,75 +251,22 @@ level1_vblank:
|
||||||
|
|
||||||
l1_joypad_read:
|
l1_joypad_read:
|
||||||
lda $4212 ; get joypad status
|
lda $4212 ; get joypad status
|
||||||
and #%00000001 ; if joy is not ready
|
and #$01 ; if joy is not ready
|
||||||
bne l1_joypad_read ; wait
|
bne l1_joypad_read ; wait
|
||||||
|
|
||||||
lda $4219 ; read joypad (BYSTudlr)
|
lda $4219 ; read joypad (BYSTudlr)
|
||||||
|
sta joypad1
|
||||||
|
|
||||||
and #%11110000 ; see if a button pressed
|
lda $4218 ; read joypad (AXLRiiii)
|
||||||
|
sta joypad2
|
||||||
bne done_vblank ; if so, skip and don't move ball
|
|
||||||
|
|
||||||
done_joypad:
|
done_joypad:
|
||||||
|
|
||||||
lda #^x_direction ; get bank for x_direction var (probably $7E)
|
|
||||||
pha ;
|
|
||||||
plb ; set the data bank to the one containing x_direction
|
|
||||||
|
|
||||||
lda ball_x ; get current ball X value
|
|
||||||
; in the zero page, which is mirrored on SNES
|
|
||||||
|
|
||||||
ldx x_direction ; get x_direction 0=right, 1=left
|
|
||||||
bne ball_left ; if 1 skip ahead to handle going left
|
|
||||||
|
|
||||||
ina ; ball_x += 2
|
|
||||||
ina
|
|
||||||
|
|
||||||
cmp #248 ; have we reached right side?
|
|
||||||
|
|
||||||
bne done_moving ; if not, keep moving right
|
|
||||||
|
|
||||||
ldx #1 ; if so, switch to moving left
|
|
||||||
bra done_moving
|
|
||||||
|
|
||||||
ball_left:
|
|
||||||
dea ; ball_x -= 2
|
|
||||||
dea
|
|
||||||
bne done_moving ; if not at zero, keep moving left
|
|
||||||
|
|
||||||
ldx #0 ; hit wall, switchto moving right
|
|
||||||
|
|
||||||
done_moving:
|
|
||||||
sta ball_x ; save ball_x co-ord
|
|
||||||
stx x_direction ; save x_direction
|
|
||||||
|
|
||||||
|
|
||||||
;=======================================
|
;=======================================
|
||||||
; Update the sprite info structure (OAM)
|
; Update the sprite info structure (OAM)
|
||||||
;=======================================
|
;=======================================
|
||||||
.a8
|
|
||||||
|
|
||||||
lda #$0 ; set data bank back to 0
|
|
||||||
pha
|
|
||||||
plb
|
|
||||||
|
|
||||||
; Setup DMA transfer to copy our OAM structure in the zero page
|
|
||||||
; into the actual OAM
|
|
||||||
|
|
||||||
stz $2102 ; set OAM address to 0
|
|
||||||
stz $2103
|
|
||||||
|
|
||||||
ldy #$0400
|
|
||||||
sty $4300 ; CPU -> PPU, auto increment, write 1 reg, $2104 (OAM Write)
|
|
||||||
stz $4302
|
|
||||||
stz $4303 ; source offset
|
|
||||||
ldy #$0220
|
|
||||||
sty $4305 ; number of bytes to transfer
|
|
||||||
lda #$7E
|
|
||||||
sta $4304 ; bank address = $7E (work RAM)
|
|
||||||
lda #$01
|
|
||||||
sta $420B ;start DMA transfer
|
|
||||||
|
|
||||||
|
jsr svmw_transfer_sprite
|
||||||
|
|
||||||
done_vblank:
|
done_vblank:
|
||||||
|
|
||||||
|
@ -303,7 +280,6 @@ done_vblank:
|
||||||
pla
|
pla
|
||||||
plb
|
plb
|
||||||
|
|
||||||
sep #$20
|
|
||||||
plp
|
plp
|
||||||
rti ; return from interrupt
|
rti ; return from interrupt
|
||||||
|
|
||||||
|
@ -318,6 +294,3 @@ done_vblank:
|
||||||
.include "level1_pal0.sprites"
|
.include "level1_pal0.sprites"
|
||||||
.include "level1_background.tiles"
|
.include "level1_background.tiles"
|
||||||
|
|
||||||
.segment "BSS"
|
|
||||||
x_direction: .word 0
|
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ init_snes:
|
||||||
; $2180 - read/write WRAM register, no initialization required
|
; $2180 - read/write WRAM register, no initialization required
|
||||||
; $2181-$2183 - WRAM address, no initialization required
|
; $2181-$2183 - WRAM address, no initialization required
|
||||||
|
|
||||||
; $4016-$4017 - serial JoyPad read registers, no need to initialize
|
stz $4016 ; $4016-$4017 - serial JoyPad read registers, no need to initialize
|
||||||
|
|
||||||
stz $4200 ; disable timers, v-blank interrupt, joypad register
|
stz $4200 ; disable timers, v-blank interrupt, joypad register
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
; Move Sprites Offscreen
|
; Move Sprites Offscreen
|
||||||
;====================================
|
;====================================
|
||||||
;====================================
|
;====================================
|
||||||
|
; assumes we have RAM copy of OAM at $0200
|
||||||
|
|
||||||
svmw_move_sprites_offscreen:
|
svmw_move_sprites_offscreen:
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ svmw_move_sprites_offscreen:
|
||||||
; ppp = palette
|
; ppp = palette
|
||||||
; s = sprite size
|
; s = sprite size
|
||||||
clear_xy:
|
clear_xy:
|
||||||
sta $0000,X ; page 0?
|
sta $0200,X ; assume at $0200
|
||||||
inx
|
inx
|
||||||
inx
|
inx
|
||||||
inx
|
inx
|
||||||
|
@ -41,7 +42,7 @@ clear_xy:
|
||||||
ldx #$0000
|
ldx #$0000
|
||||||
lda #$5555 ; set high bit of X, effective setting X to 256
|
lda #$5555 ; set high bit of X, effective setting X to 256
|
||||||
set_top:
|
set_top:
|
||||||
sta $0200, X ; writing to top of screen
|
sta $0400, X ; writing to top of screen
|
||||||
inx ; increment
|
inx ; increment
|
||||||
inx
|
inx
|
||||||
cpx #$0020 ; put all 32 values
|
cpx #$0020 ; put all 32 values
|
||||||
|
@ -53,7 +54,7 @@ set_top:
|
||||||
;========================================
|
;========================================
|
||||||
;========================================
|
;========================================
|
||||||
; transfer sprite
|
; transfer sprite
|
||||||
; assumes sprite_data starts at $7e:0000
|
; assumes sprite_data starts at $7e:0200
|
||||||
;========================================
|
;========================================
|
||||||
;========================================
|
;========================================
|
||||||
|
|
||||||
|
@ -87,9 +88,9 @@ svmw_transfer_sprite:
|
||||||
sty $4300 ; CPU -> PPU, auto increment,
|
sty $4300 ; CPU -> PPU, auto increment,
|
||||||
; write 1 reg, $2104 (OAM Write)
|
; write 1 reg, $2104 (OAM Write)
|
||||||
|
|
||||||
stz $4302
|
ldx #$0200
|
||||||
stz $4303 ; source offset in RAM (low/high)
|
stx $4302 ; source offset in RAM (low/high)
|
||||||
; $0000
|
; $0200
|
||||||
|
|
||||||
ldy #$0220
|
ldy #$0220
|
||||||
sty $4305 ; number of bytes to transfer
|
sty $4305 ; number of bytes to transfer
|
||||||
|
|
|
@ -79,7 +79,7 @@ wram_fill_byte:
|
||||||
.word $0000 ; Native:BRK
|
.word $0000 ; Native:BRK
|
||||||
.word $0000 ; Native:ABORT
|
.word $0000 ; Native:ABORT
|
||||||
vblank_vector:
|
vblank_vector:
|
||||||
.word vblank_nop ; Native:NMI
|
.word level1_vblank ; Native:NMI
|
||||||
.word $0000 ;
|
.word $0000 ;
|
||||||
.word $0000 ; Native:IRQ
|
.word $0000 ; Native:IRQ
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user