This subroutine specified rectangle of screen and scrolls up just the colour attributes 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. This then is an addendum for windowScrollUP.bas, and can be called with it - probably less useful in its own right. Note that it leaves the last line attributes untouched - it can't know inherently what colour to paint this section.
SUB BLAttrWindowScrollUp (X AS UBYTE, Y AS UBYTE, Width AS UBYTE, Height AS UBYTE) REM Routine, acting as a pair to BLWindowScrollUp.bas that moves the attributes up - and leaves the last ATTR line untouched (no way) ASM LD H,58h ; $5800 = 22528 = Attr start LD L,(IX+5) ; HL now contains correct column, but top row. LD A,(IX+7) ; Y CP 8 JR C, BLAttrWindowScrollUpGotRightThird INC H CP 16 JR C, BLAttrWindowScrollUpGotRightThird INC H BLAttrWindowScrollUpGotRightThird: AND 7 RRCA RRCA RRCA ; Three right rotates - same as 5 left rotates = A=A*32 ADD A,L LD L,A ; HL now points to correct row, top left corner. LD D,H LD E,L ; Copy HL to DE LD BC,32 ADD HL,BC ; Point HL at one row down. LD C,(IX+9) ; width LD B,(IX+11) ; Height DEC B ; (We don't scroll past the end) BLAttrWindowScrollUpHeightLoop: PUSH BC ; Save our width and height PUSH HL LD B,0 BLAttrWindowScrollUpWidthLoop: LDIR ; A one instruction width loop :P POP DE ; Last run's source is now our destination LD H,D LD L,E ; Copy into HL LD BC,32 ADD HL,BC ; Move HL down one row POP BC ; get our counters back DJNZ BLAttrWindowScrollUpHeightLoop ; Dec height, and if we haven't run out of rows, go do another one. END ASM END SUB
BLAttrWindowScrollUp(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 of use:
REM Put something on screen: FOR n=1 to 12 PRINT INK RND *7; PAPER RND * 7; "01234567890123456789012345678901"; PRINT INK RND *7; PAPER RND * 7; "0ABCDEFGHI0KLMNOPQRS0UVWXYZABC0D"; NEXT n REM Scroll it slowly: FOR n=1 TO 10 BLAttrWindowScrollUp (3,3,8,15) BLAttrWindowScrollUp (28,10,3,8) PAUSE 100 NEXT n