Screen save/rest 1/2

 BBS: Inland Empire Archive
Date: 10-14-92 (22:42)             Number: 395
From: MARK BUTLER                  Refer#: NONE
  To: ALL                           Recvd: NO  
Subj: Screen save/rest 1/2           Conf: (2) Quik_Bas
 Hi all, I had been fooling around with text mode screen save/restore
 routines and discovered something kinda neat. In the book "Microsoft
 QuickBASIC Programmer's Toolbox" there are two routines in 'C' to do
 this; 'MoveBytes' and 'MoveWords'. I looked the C code over and noticed
 that both make use of QuickC's "_movedata" funtion so I wondered "why
 bother to make a linkable C routine? Why not just link in the asm-based
 MOVEDATA.OBJ from MLIBCE.LIB directly?" (which was really all J. C.
 Craig's code seemed to be doing in the first place). Well, I fooled with
 it and found that it would work just fine. In the below 2 snippets the
 first is a simple text screen save/restore demo in Basic. The second is
 a debug script for movedata.obj. To run this demo create a QLB from
 movedata.obj or compile the program linking in movedata.obj.

==========================8< Cut Here 8<=============================

 DECLARE SUB DrawBox (Uprow, Ltcol, Lorow, Rtcol)
 DECLARE SUB MoveData CDECL (BYVAL fromseg, BYVAL fromoff, BYVAL_
 destseg, BYVAL destoff, BYVAL nbytes)
 DECLARE SUB RestScrn (Scr())
 DECLARE SUB SaveScrn (Scr())

'*** create an array to hold all the text mode screen elements
 DIM SHARED Scr(4000)

'*** print some junk to the screen
    COLOR 7, 1
    FOR i = 1 TO 13
        FOR ch = 33 TO 176
            PRINT CHR$(ch);
        NEXT ch
    NEXT i

'*** save the current screen
    SaveScrn Scr()

'*** draw a white window box with black text
    COLOR 0, 7
    DrawBox 10, 10, 14, 70
    LOCATE 12, 15
    PRINT "Press any key to remove window non-destructively"
    COLOR 7, 0

'*** wait until a key is pressed

'*** restore the original screen
    RestScrn Scr()

 SUB DrawBox (Uprow, Ltcol, Lorow, Rtcol) STATIC
     Wide = (Rtcol - Ltcol) - 1
     LOCATE Uprow, Ltcol
     PRINT CHR$(201); STRING$(Wide, CHR$(205)); CHR$(187);
     FOR i = Uprow + 1 TO Lorow - 1
         LOCATE i, Ltcol
         PRINT CHR$(186); SPACE$(Wide); CHR$(186);
     NEXT i
     LOCATE Lorow, Ltcol
     PRINT CHR$(200); STRING$(Wide, CHR$(205)); CHR$(188);

 SUB RestScrn (Scr())
    DEF SEG = &H40
    equip = PEEK(&H10)
    IF (equip AND 48) = 48 THEN
        destseg = &HB000
        destseg = &HB800
    END IF
    destoff = 0
    fromseg = VARSEG(Scr(0))
    fromoff = VARPTR(Scr(0))
    nbytes = 4000
    MoveData fromseg, fromoff, destseg, destoff, nbytes

 SUB SaveScrn (Scr())
    DEF SEG = &H40
    equip = PEEK(&H10)
    IF (equip AND 48) = 48 THEN
        fromseg = &HB000
        fromseg = &HB800
    END IF
    fromoff = 0
    destseg = VARSEG(Scr(0))
    destoff = VARPTR(Scr(0))
    nbytes = 4000
    MoveData fromseg, fromoff, destseg, destoff, nbytes
==========================8< Cut Here 8<=============================

 The next message contains a debug script for MOVEDATA.OBJ

 >>> continued in the next message

--- PPoint 1.35
 * Origin: Terminal Oasis, Portland OR (1:105/330.5)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET