WindowScrollUp

BLWindowScrollUp.bas

This subroutine specified rectangle of screen and scrolls it up by a character. You might be able to use it for games (though there are probably faster scrolly routines for that); but the aim here is to be able to scroll up part of the screen, so that you can split between text on a rectangle area and other information elsewhere - e.g. graphic adventures.

SUB BLWindowScrollUp(X as uByte, Y as uByte, Width as uByte, Height as uByte)
ASM
;Routine for printing and scrolling text in any
;window, anywhere on the screen.

;Main scrolling routine
BLWindowScrollUp:
EX AF, AF'
LD   A,(IX+11)  ;(ROWS) Store # of Lines in A'
EX AF,AF'

LD   HL,BLWindowScrollUpScreenTable    ;Start of address table
LD   C,(IX+7)   ;(Y) Move the "pointer" to the
LD   B,0         ;appropriate position in the table
ADD  HL,BC       ;and store it in (BLWindowScrollPOINT)
ADD  HL,BC
LD   (BLWindowScrollUpPOINT),HL  ;Pointer position stored
BLWindowScrollUpLOOP:

    LD   HL,(BLWindowScrollUpPOINT)
    LD   E,(HL)
    INC  HL
    LD   D,(HL)

    ;Address of start of screen line now in DE
    LD A,(IX+5) ;(X)
    ADD A,E
    LD E,A

    ;Address of left-hand side of window now in DE
    EX AF,AF'
    DEC  A
    JP   Z,BLWindowScrollUpBLANK     ;Quit this loop if we have
    EX AF,AF'
    INC  HL          ;Move the pointer to the next item
    LD   (BLWindowScrollUpPOINT),HL  ;in the table. Save position
    LD   C,(HL)
    INC  HL
    LD   B,(HL)      ;Start of next line down in BC
    LD   L,(IX+5)    ; (X)
    LD   H,0
    ADD  HL,BC
    ;HL now points to the screen address 8 pixels below
    ;the one held in DE
    LD   B,8         ;8 pixel lines to be transferred
    ;Now move 8 pixel lines up the screen by 8 pixels

    BLWindowScrollUpTRANS:
        LD A,B ; Save B
        LD   C,(IX+9) ;(Cols)
        LD   B,0
        PUSH HL
        PUSH DE          ;Save all registers
        LDIR             ;Transfer the line of pixels
        POP  DE
        POP  HL

        ;Move HL and DE down one pixel
        INC D
        INC H

        LD B,A ; Recover B

    DJNZ BLWindowScrollUpTRANS
    ;One line of characters has now been transferred

JP   BLWindowScrollUpLOOP        ;Back for next line of characters

;Scrolling finished. Now erase last character line
BLWindowScrollUpBLANK:
LD   C,8
LD   L,(IX+9) ; (COLS)
BLWindowScrollUpLOOP2:

    PUSH DE
    LD   B,L ;(IX+11) - Cols
    XOR  A
    BLWindowScrollUpLOOP3:
        LD   (DE),A
        INC E
    DJNZ BLWindowScrollUpLOOP3
    POP  DE
    INC D
    DEC C
    JR NZ, BLWindowScrollUpLOOP2

;DJNZ BLWindowScrollUpLOOP2
JP BLWindowScrollEnd

BLWindowScrollUpPOINT:  DEFW 0

BLWindowScrollUpScreenTable:
       DEFW 16384
       DEFW 16416
       DEFW 16448
       DEFW 16480
       DEFW 16512
       DEFW 16544
       DEFW 16576
       DEFW 16608
       DEFW 18432
       DEFW 18464
       DEFW 18496
       DEFW 18528
       DEFW 18560
       DEFW 18592
       DEFW 18624
       DEFW 18656
       DEFW 20480
       DEFW 20512
       DEFW 20544
       DEFW 20576
       DEFW 20608
       DEFW 20640
       DEFW 20672
       DEFW 20704

BLWindowScrollEnd:
END ASM
END SUB

Usage

BLWindowScrollUp(TopLeftXCoordinate, TopLeftYCoordinate, WidthInCharacters, HeightInCharacters)

The parameters are the X,Y print coordinates of the Top Left corner, width in characters, and height in characters.

Example in use:

REM Quick routine to fill the screen with crap so we can demonstrate scrolling.
SUB fillRubbish()
ASM
    LD DE,16384
    LD HL,0
    LD BC,6144
    LDIR
END ASM
END SUB

fillRubbish() ' Fill the screen with stuff.

'actual use demo here:

FOR n=1 to 10
BLWindowScrollUp(3,3,8,15)
BLWindowScrollUp(28,10,3,8)
PAUSE 10
NEXT n