'===========================================================================
' Subject: SCROLL SCREEN LEFT/RIGHT           Date: 12-08-93 (09:13)       
'  Author: Ray Carson                         Code: QB, QBasic, PDS        
'  Origin: QBTIPS_T.DOC                     Packet: TEXT.ABC
'===========================================================================
'> I know how to scroll the screen UP and DOWN by using
'> interrupts, but I can't find a way do make it scroll left
'> and right like in Lotus 1-2-3, etc...
'> If you know if it's possible, or how to do it, leave me a message
 
'The following code is slow in the IDE but is reasonably fast when
'compiled to an .EXE. You will lose characters that are scrolled off
'of the screen unless you put them into an array or if you are working
'with known data (arrays/fields) then just reprint. I Hope long lines
'don't get wrapped!
 
DEFINT A-Z      'SCROLL.BAS ~ Ray Carson ~ 1993
DECLARE SUB Scroll (UpperRow, LowerRow, Columns, Direction)
COLOR 15, 1: CLS
LOCATE 4, 2: PRINT CHR$(218); STRING$(76, CHR$(196)); CHR$(191);
LOCATE 8, 2: PRINT CHR$(192); STRING$(76, CHR$(196)); CHR$(217);
FOR X = 5 TO 7
    LOCATE X, 2: PRINT CHR$(179);
    LOCATE X, 79: PRINT CHR$(179);
NEXT
COLOR 14, 1
LOCATE 5, 32: PRINT "RC Software";
LOCATE 6, 32: PRINT "1113 Hillcrest";
LOCATE 7, 32: PRINT "Conroe, Texas 77301";
COLOR 2, 1
LOCATE 6, 10: PRINT "(409)756-6860";
LOCATE 6, 60: PRINT "(409)441-5096";
COLOR 20, 1: LOCATE 10, 35: PRINT "Press Key";
DO: LOOP UNTIL LEN(INKEY$)
CALL Scroll(5, 6, 10, 0)  ' Direction 0 = right
DO: LOOP UNTIL LEN(INKEY$)
CALL Scroll(5, 6, 10, -1) ' Direction -1 = left
COLOR 15, 1: LOCATE 10, 35: PRINT "  Done   ";
 
SUB Scroll (UpperRow, LowerRow, Columns, Direction)
 
    DEF SEG = 0
    Address = PEEK(1040) AND 48
    IF Address = 48 THEN
        DEF SEG = &HB000    'mono
    ELSE
        DEF SEG = &HB800    'color
    END IF
    FOR X = 1 TO Columns
        IF Direction = 0 THEN               'Right
            FOR Column = 79 TO 1 STEP -1    'move everything
                FOR Row = UpperRow TO LowerRow
                    Offset = ((Row - 1) * 80 + (Column - 1)) * 2
                    NewColumn = Column + 1
                    NewOffset = ((Row - 1) * 80 + (NewColumn - 1)) * 2
                    Char = PEEK(Offset)
                    Attr = PEEK(Offset + 1)
                    POKE NewOffset, Char
                    POKE NewOffset + 1, Attr
                    POKE Offset, 32
                NEXT
            NEXT
        END IF
        IF Direction = -1 THEN              'Left
            FOR Column = 2 TO 80            'move everything
                FOR Row = UpperRow TO LowerRow
                    Offset = ((Row - 1) * 80 + (Column - 1)) * 2
                    NewColumn = Column - 1
                    NewOffset = ((Row - 1) * 80 + (NewColumn - 1)) * 2
                    Char = PEEK(Offset)
                    Attr = PEEK(Offset + 1)
                    POKE NewOffset, Char
                    POKE NewOffset + 1, Attr
                    POKE Offset, 32
                NEXT
            NEXT
        END IF
    NEXT
 
END SUB
