And something different for a change: Added road side stones to the story pages to make it look a bit neater.
Looks better in motion :)
It's actually pretty simple: We add a stone in front and one in the back. Store positions and update them every frame with different deltas.
Start with the position value variables:
MOVE_STONES
!byte 0
MOVE_STONE_POS_BACK
!byte 0
MOVE_STONE_POS_FRONT
!byte 0
...and the actual code.
STONE_BACK_DISTANCE = 20
STONE_FRONT_DISTANCE = 24
lda MOVE_STONES
bne +
jmp .NoStones
+
;background
ldy #19
lda SCREEN_LINE_OFFSET_TABLE_LO,y
sta ZEROPAGE_POINTER_1
sta ZEROPAGE_POINTER_2
lda SCREEN_LINE_OFFSET_TABLE_HI,y
sta ZEROPAGE_POINTER_1 + 1
clc
adc #( ( SCREEN_COLOR - SCREEN_CHAR ) >> 8 )
sta ZEROPAGE_POINTER_2 + 1
ldy MOVE_STONE_POS_BACK
-
lda #32
sta (ZEROPAGE_POINTER_1),y
tya
clc
adc #STONE_BACK_DISTANCE
tay
cpy #39
bcc -
lda MOVE_STONE_POS_BACK
clc
adc #1
-
cmp #STONE_BACK_DISTANCE
bcc +
sec
sbc #STONE_BACK_DISTANCE
jmp -
+
sta MOVE_STONE_POS_BACK
ldy MOVE_STONE_POS_BACK
-
lda #149
sta (ZEROPAGE_POINTER_1),y
lda #8
sta (ZEROPAGE_POINTER_2),y
tya
clc
adc #STONE_BACK_DISTANCE
tay
cpy
#39
bcc -
;foreground
ldy #22
lda SCREEN_LINE_OFFSET_TABLE_LO,y
sta ZEROPAGE_POINTER_1
sta ZEROPAGE_POINTER_2
lda SCREEN_LINE_OFFSET_TABLE_HI,y
sta ZEROPAGE_POINTER_1 + 1
clc
adc #( ( SCREEN_COLOR - SCREEN_CHAR ) >> 8 )
sta ZEROPAGE_POINTER_2 + 1
ldy MOVE_STONE_POS_FRONT
-
lda #32
sta (ZEROPAGE_POINTER_1),y
tya
clc
adc #STONE_FRONT_DISTANCE
tay
cpy #39
bcc -
lda MOVE_STONE_POS_FRONT
clc
adc #2
-
cmp #STONE_FRONT_DISTANCE
bcc +
sec
sbc #STONE_FRONT_DISTANCE
jmp -
+
sta MOVE_STONE_POS_FRONT
ldy MOVE_STONE_POS_FRONT
-
lda #148
sta (ZEROPAGE_POINTER_1),y
lda #9
sta (ZEROPAGE_POINTER_2),y
tya
clc
adc #STONE_FRONT_DISTANCE
tay
cpy #39
bcc -
.NoStones