]> git.sur5r.net Git - cc65/commitdiff
full-screen scroll routine (up and down)
authorcpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 23 Jun 2000 22:10:25 +0000 (22:10 +0000)
committercpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 23 Jun 2000 22:10:25 +0000 (22:10 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@119 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/atari/scroll.s [new file with mode: 0644]

diff --git a/libsrc/atari/scroll.s b/libsrc/atari/scroll.s
new file mode 100644 (file)
index 0000000..7aa3787
--- /dev/null
@@ -0,0 +1,164 @@
+;
+; Christian Groessler, June 2000
+;
+; void __fastcall__ scroll (signed char numlines);
+; numlines > 0  scrolls up
+; numlines < 0  scrolls down
+;
+
+       .include        "atari.inc"
+       .importzp       tmp1,tmp4,ptr1,ptr2
+       .import         mul40,_clrscr
+       .export         _scroll
+
+.proc  _scroll
+
+       cmp     #0
+       beq     jmpfin
+;      cmp     #$80
+;      bcc     up
+       bpl     up
+
+;scroll down
+       eor     #$ff
+       clc
+       adc     #1              ; make positive
+       sta     tmp1
+
+       cmp     #24             ; scroll >= the whole screen?
+       bcc     down_ok
+       jmp     _clrscr
+
+down_ok:lda    SAVMSC
+       clc
+       adc     #<(40*23)
+       sta     ptr1
+       sta     ptr2
+       lda     SAVMSC+1
+       adc     #>(40*23)
+       sta     ptr1+1          ; point to last line on screen
+       sta     ptr2+1
+
+       lda     tmp1
+       jsr     mul40
+       sta     tmp4
+       lda     ptr2
+       sec
+       sbc     tmp4
+       sta     ptr2
+       stx     tmp4
+       lda     ptr2+1
+       sbc     tmp4
+       sta     ptr2+1
+
+       lda     #24             ; # of lines on screen
+       sec
+       sbc     tmp1            ; # of lines to move
+       tax
+
+       ;very simple, could be improved
+
+scrold:        ldy     #39             ; # of chars on a line - 1
+copy_d:        lda     (ptr2),y
+       sta     (ptr1),y
+       dey
+       bpl     copy_d
+       lda     ptr1
+       sec
+       sbc     #40
+       sta     ptr1
+       bcs     u1
+       dec     ptr1+1
+u1:    lda     ptr2
+       sec
+       sbc     #40
+       sta     ptr2
+       bcs     u2
+       dec     ptr2+1
+u2:    dex
+       bne     scrold
+
+       ; fill new scrolled in lines with space
+
+       ldx     tmp1            ; # of new lines
+fild:  lda     #0
+       ldy     #39
+fill_d:        sta     (ptr1),y
+       dey
+       bpl     fill_d
+       dex
+jmpfin:        beq     finish
+       lda     ptr1
+       sec
+       sbc     #40
+       sta     ptr1
+       bcs     u3
+       dec     ptr1+1
+u3:    jmp     fild
+
+;scroll up
+up:    sta     tmp1            ; # of lines to scroll
+       cmp     #24             ; scroll >= the whole screen?
+       bcc     up_ok
+       jmp     _clrscr
+
+       ;multiply by 40 (xsize)
+up_ok: jsr     mul40
+       clc
+       adc     SAVMSC          ; add start of screen mem
+       sta     ptr2
+       txa
+       adc     SAVMSC+1
+       sta     ptr2+1
+       lda     SAVMSC+1
+       sta     ptr1+1
+       lda     SAVMSC
+       sta     ptr1
+       lda     #24             ; # of lines on screen
+       sec
+       sbc     tmp1            ; # of lines to move
+       tax
+
+       ;very simple, could be improved
+
+scroll:        ldy     #39             ; # of chars on a line - 1
+copy_l:        lda     (ptr2),y
+       sta     (ptr1),y
+       dey
+       bpl     copy_l
+       lda     #40
+       clc
+       adc     ptr1
+       sta     ptr1
+       bcc     l1
+       inc     ptr1+1
+l1:    lda     #40
+       clc
+       adc     ptr2
+       sta     ptr2
+       bcc     l2
+       inc     ptr2+1
+l2:    dex
+       bne     scroll
+
+       ; fill new scrolled in lines with space
+
+       ldx     tmp1            ; # of new lines
+fill:  lda     #0
+       ldy     #39
+fill_l:        sta     (ptr1),y
+       dey
+       bpl     fill_l
+       dex
+       beq     finish
+       lda     #40
+       clc
+       adc     ptr1
+       sta     ptr1
+       bcc     l3
+       inc     ptr1+1
+l3:    jmp     fill
+
+finish:        rts
+
+.endproc