diff --git a/libsrc/atari/scroll.s b/libsrc/atari/scroll.s new file mode 100644 index 000000000..7aa37876d --- /dev/null +++ b/libsrc/atari/scroll.s @@ -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