What I have so far is a background and a moving sprite. This is how I made the background.
I have the background nametable like so:
Code: Select all
background:
.db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ;;row 1
.db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ;;
.db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ;;row 2
.db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ;;
.
.
.
.db $1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1 ;;row 29
.db $1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1 ;; THE FLOOR
.db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ;;row 30
.db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ;
Code: Select all
LoadBackground:
LDA $2002
LDA #$20
STA $2006
LDA #$00
STA $2006
LDA #$00
STA pointerLo
LDA #HIGH(background)
STA pointerHi
LDX #$00
LDY #$00
BGOutsideLoop:
BGInsideLoop:
LDA [pointerLo], Y
STA $2007
INY
CPY #$00
BNE BGInsideLoop
INC pointerHi
INX
CPX #$04
BNE BGOutsideLoop
Code: Select all
CollisionData:
.db %00000000, %00000000, %00000000, %00000000 ;row1(air)
.db %00000000, %00000000, %00000000, %00000000 ;row 2(air)
.
.
.
.db %11111111, %11111111, %11111111, %11111111 ;row29(floor)
.db %00000000, %00000000, %00000000, %00000000 ; row30(air)
Then I have CollisionData copied to RAM like this:
Code: Select all
LoadColData:
LDA coltab
STA pointerLo
LDX #$00
LoadColDataLoop:
LDA CollisionData, x
STA pointerLo, x
INX
CPX #$78
BNE LoadColDataLoop
Code: Select all
coltab .rs $78 ; 120 bytes, 1 bit per background tile (0 air, 1 solid)
Now for the gravity, I want to look up in the CollisionData table if the tile underneth the sprite is solid or not. I have gotten this far:
Code: Select all
LDX MarioX ; Sprite X-pos.
LDY MarioY ; Sprite Y-pos.
;Calculating Y-tile number
TYA
LSR A
LSR A
LSR A ; divide by 8
INC A
INC A ; add 2 rows, to get under the sprite
;Calculating X-tile number
TXA
LSR A
LSR A
LSR A ; divide by 8
$2000 + (32*SpriteY) + 32 + SpriteX
But it seams like I then would need to calculate som 16bit numbers or something.
So the question is basically what do I do next.