--- /dev/null
+;
+; 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