.module Scroll ;------------------------------------------------------------------------------- ;@doc:routine ; ; === Scroll.Up === ; ; Scrolls the text viewport up one line. ; ;@doc:end ;------------------------------------------------------------------------------- Up.Routine push hl push de push bc push af call Viewport.TextIsFullScreen jp z,Scroll.Up.FullScreen call Viewport.TextIsFullWidth jp z,Scroll.Up.FullWidth Scroll.Up.Subregion ld a,(Bounds.MinX) ld c,a ld a,(Bounds.MaxX) sub c inc a ld b,a - push bc call Scroll.Up.Column pop bc inc c djnz - jp Scroll.Up.Exit Scroll.Up.Column ; In: C = column to clear. ; Scroll column on video buffer. ld a,(Bounds.MinY) ld e,a ld a,(Bounds.MaxY) sub e jr z,++ push ix add a,a ld b,a add a,a add a,b ld b,a push bc ld a,(Bounds.MinY) call ATimes72 ld de,(Lcd.Buffer) add hl,de ld d,0 ld e,c srl e add hl,de push hl pop ix pop bc ld de,12 bit 0,c ld hl,$F00F jr z,+ ld hl,$0FF0 + ; H = Column mask. ; L = Inverted mask. - ld a,(ix+0) and l ld (ix+0),a ld a,(ix+12*6) and h or (ix+0) ld (ix+0),a add ix,de djnz - pop ix ++ ; Clear bottom cell. ld a,(Bounds.MaxY) call ATimes72 ld de,(Lcd.Buffer) add hl,de ld d,0 ld e,c srl e add hl,de ld de,12 push bc ld a,(Vdu.Text.BackgroundColour) bit 6,a ld b,6 jr nz,Scroll.Up.BlackColumn Scroll.Up.WhiteColumn bit 0,c ld c,$0F jr z,+ ld c,$F0 + - ld a,(hl) and c ld (hl),a add hl,de djnz - jr Scrolled.Up.Column Scroll.Up.BlackColumn bit 0,c ld c,$F0 jr z,+ ld c,$0F + - ld a,(hl) or c ld (hl),a add hl,de djnz - Scrolled.Up.Column pop bc ; Scroll column on text buffer. ld a,(Bounds.MinY) ld e,a ld a,(Bounds.MaxY) sub e jr z,+ push ix ld b,a push bc ld a,(Bounds.MinY) call ATimes24 ld de,Text.Buffer add hl,de ld b,0 add hl,bc push hl pop ix pop bc ld de,24 - ld a,(ix+24) ld (ix+0),a add ix,de djnz - pop ix + ; Clear bottom cell. ld a,(Bounds.MaxY) call ATimes24 ld de,Text.Buffer add hl,de ld b,0 add hl,bc ld (hl),' ' ret Scroll.Up.FullWidth ; Scroll video buffer. ld a,(Bounds.MinY) ld b,a ld a,(Bounds.MaxY) sub b jr z,+ call ATimes72 push hl ld a,(Bounds.MinY) call ATimes72 ld de,(Lcd.Buffer) add hl,de push hl ld de,12*6 add hl,de pop de pop bc ldir + ; Clear bottom row. ld a,(Bounds.MaxY) call ATimes72 ld de,(Lcd.Buffer) add hl,de ld d,h ld e,l inc de ld bc,12*6-1 ld a,(Vdu.Text.BackgroundColour) add a,a add a,a sbc a,a ld (hl),a ldir ; Scroll text buffer. ld a,(Bounds.MinY) ld b,a ld a,(Bounds.MaxY) sub b jr z,+ call ATimes24 push hl ld a,(Bounds.MinY) call ATimes24 ld de,Text.Buffer add hl,de push hl ld de,24 add hl,de pop de pop bc ldir + ; Clear bottom row. ld a,(Bounds.MaxY) call ATimes24 ld de,Text.Buffer add hl,de ld d,h ld e,l inc de ld bc,24-1 ld (hl),' ' ldir jr Scroll.Up.Exit Scroll.Up.FullScreen ; Scroll graphics buffer up. ld hl,(Lcd.Buffer) ld de,12*6 add hl,de ld de,(Lcd.Buffer) ld bc,720-12*6 ldir ; Clear bottom row. ld hl,(Lcd.Buffer) ld de,720-12*6 add hl,de ld d,h \ ld e,l inc de ld bc,12*6-1 ld a,(Vdu.Text.BackgroundColour) add a,a add a,a sbc a,a ld (hl),a ldir ; Scroll text buffer up. ld hl,Text.Buffer+24 ld de,Text.Buffer ld bc,24*10-24 ldir ; Clear bottom row. ld hl,Text.Buffer+24*9 ld de,Text.Buffer+24*9+1 ld bc,23 ld (hl),' ' ldir Scroll.Up.Exit pop af pop bc pop de pop hl jp Modes.Scroll.Up.Exit ;------------------------------------------------------------------------------- ;@doc:routine ; ; === Vdu.Text.Scroll.Down === ; ; Scrolls the text viewport down one line. ; ;@doc:end ;------------------------------------------------------------------------------- Down.Routine push af push hl push de push bc ; Scroll entire screen v up six pixels. ld hl,(Lcd.Buffer) ld de,719 add hl,de push hl ld de,-(12*6) add hl,de pop de ld bc,12*(60-6) lddr ; Blank out top six rows. ld hl,(Lcd.Buffer) ld d,h \ ld e,l inc de ld bc,(12*6)-1 ld a,(BackgroundColour) or a jr z,+ ld a,$FF + ld (hl),a ldir ; Scroll buffer ^ one row. ld hl,Buffer+239-24 ld de,Buffer+239 ld bc,24*(10-1) lddr ; Blank out top row. ld hl,Buffer ld de,Buffer+1 ld bc,24-1 ld (hl),' ' ldir ld a,(WriteToLcdEnabled) or a call nz,Lcd.Copy pop bc pop de pop hl pop af ret .endmodule