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
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