dos33fsprogs/demos/trogdor/horiz_scroll_simple.s

92 lines
1.2 KiB
ArmAsm

;======================================
; do very simple horizontal scroll
;======================================
; screens to pan in $2000/$4000 to left
; A is times to scroll
horiz_pan:
sta pan_count_smc+1
pan_loop:
; how many times to scroll
lda #0
sta COUNT
pan_outer_outer_loop:
; do all 191 lines
ldx #191
pan_outer_loop:
; self-modify the PAGE1 high addresses
lda hposn_high,X
sta pil_smc1+2
sta pil_smc2+2
sta pil_smc4+2
;self modify the PAGE2 high addresses
eor #$60
sta pil_smc3+2
; self modify the PAGE1 LOW addresses
lda hposn_low,X
sta pil_smc2+1
sta pil_smc4+1
; self mofidy the PAGE1 LOW input addresses
sta pil_smc1+1
inc pil_smc1+1
clc
adc COUNT
sta pil_smc3+1
;=========================
; inner loop, from 0-39
ldy #0
pan_inner_loop:
; load in+1, store to in
; if completely unrolled, would save 1 cycle for store and
; 5 for the branch/loop
; 192*6=not a lot
pil_smc1:
lda $2000+1,Y ; 4
pil_smc2:
sta $2000,Y ; 5
iny ; 2
cpy #39 ; 2
bne pan_inner_loop ; 2/3
; for right edge, scroll in from PAGE2
pil_smc3:
lda $4000
pil_smc4:
sta $2000,Y
dex
cpx #$ff
bne pan_outer_loop
inc COUNT
lda COUNT
pan_count_smc:
cmp #39
bne pan_outer_outer_loop
rts