How to BSAVE and BLOAD Multiple Screen Pages in SCREEN 0 (65749)
The information in this article applies to:
- Microsoft QuickBASIC 2.0, when used with:
- the operating system: MS-DOS
- Microsoft QuickBASIC 2.01, when used with:
- the operating system: MS-DOS
- Microsoft QuickBASIC 3.0, when used with:
- the operating system: MS-DOS
- Microsoft QuickBASIC 4.0, when used with:
- the operating system: MS-DOS
- Microsoft QuickBASIC 4.0b, when used with:
- the operating system: MS-DOS
- Microsoft QuickBASIC 4.5, when used with:
- the operating system: MS-DOS
- Microsoft Basic Professional Development System for MS-DOS 7.0
- Microsoft Basic Professional Development System for MS-DOS 7.1
- Microsoft BASIC Compiler for MS-DOS and OS/2 6.0
- Microsoft BASIC Compiler for MS-DOS and OS/2 6.0b
This article was previously published under Q65749 SUMMARY
The graphics GET and PUT statements cannot be used to store or draw
text screens in SCREEN mode 0 (zero). Therefore, it is necessary to go
directly to video memory, using the BSAVE and BLOAD statements, in
order to store and draw text mode (SCREEN 0) screens. This article
gives an explanation and an example of BSAVEing and BLOADing all eight
of the text mode SCREEN pages available on 256K EGA and VGA graphics
adapters. The code can be easily adapted for the number of video pages
supported by any adapter.
This information applies to Microsoft QuickBasic versions 2.00, 2.01,
3.00, 4.00, 4.00b, and 4.50 for MS-DOS; to Microsoft Basic Compiler
versions 6.00 and 6.00b for MS-DOS; and to Microsoft Basic
Professional Development System (PDS) versions 7.00 and 7.10 for
MS-DOS.
MORE INFORMATION
In text mode, the video pages, sometimes called video buffers, are
stored starting at address B800:0000 hex, where the portion before the
colon is the segment and the portion after is the offset. Each video
page buffer starts on a 4K boundary (or every &H1000 bytes = 1000 hex
= 4096 decimal). Therefore, saving video pages is a straightforward
process of changing to segment &HB800, starting at an offset of n*4096
(&H1000) bytes for each nth page, and BSAVEing 4K of memory to a file.
Note that you count pages from 0. Therefore, page 0 is at offset 0 *
4096, or offset 0, from segment B800 hex, so you start saving at
address B800:0000. To change the segment pointer used by the BSAVE
statement in Basic, use the DEF SEG statement. Because the BSAVE
statement has an "offset" parameter, it is simple to save multiple
pages by changing the offset parameter in the BSAVE statement with the
formula PageN%*4096, where PageN% is the current page (counting from
zero) being saved.
For more information about graphics programming and video page
buffers, see Chapter 3 of "Programmer's Guide to PC and PS/2 Video
Systems" by Richard Wilton (Microsoft Press, 1987).
Documentation Error
Wilton's book (mentioned above) contains a documentation error on Page
75 when discussing video pages. It incorrectly states the following:
...each page starts on a 1 KB (1024-byte) boundary
This should be corrected to say:
...each page starts on a 4 KB (4096-byte) boundary.
Note that Wilton's book uses "KB" as an abbreviation for kilobyte
(1024 bytes), whereas this Knowledge Base uses "K".
The next sentence in Wilton's book correctly states the following:
The four 80-by-25 pages thus start at B800:0000, B800:1000,
B800:2000, and B800:3000.
Code Example
The SLEEP statement in the following program should be replaced with
the statement INPUT X$ in order to run in QuickBasic 2.00, 2.01, 3.00,
or 4.00. (The SLEEP statement was first introduced in QuickBasic 4.00b
and Basic compiler 6.00.)
The SLEEP statement in the following program should be replaced with
the statement INPUT X$ in order to run in QuickBasic 2.00, 2.01, 3.00,
or 4.00. (The SLEEP statement was first introduced in QuickBasic 4.00b
and Basic compiler 6.00.)
FOR i% = 0 TO 7 ' If your EGA only supports 4 pages, use 3, not 7.
SCREEN 0, 0, i%, i% ' Initialize each screen page.
CLS
NEXT
FOR i% = 0 TO 7 ' If your EGA only supports 4 pages, use 3, not 7.
SCREEN 0, , i%, i% ' Cycle through the pages and write chars.
FOR j% = 1 TO 2000
PRINT CHR$(i% + 127); ' Print some colorful characters.
COLOR j% MOD 16
NEXT j%
filename$ = "page" + CHR$(i% + &H31) + ".pic"
DEF SEG = &HB800 ' Change segment to video memory.
BSAVE filename$, i% * &H1000, &H1000 ' Save the i%-th page.
DEF SEG ' Important: Move back to the default data segment!
LOCATE 10, 10: COLOR 23: PRINT "Hit any key for next page"
SLEEP
NEXT
WHILE INKEY$ <> "": WEND
FOR i% = 0 TO 7 ' If your EGA only supports 4 pages, use 3, not 7.
SCREEN 0, 0, i%, i%
CLS
COLOR 7
PRINT "hit any key to restore page "; i%;
SLEEP: WHILE INKEY$ <> "": WEND
filename$ = "page" + CHR$(i% + &H31) + ".pic"
DEF SEG = &HB800
BLOAD filename$, i% * &H1000
DEF SEG
SLEEP
NEXT i%
SCREEN 0, 0, 0, 0 ' Clean up before ending
KILL "page?.pic" ' and kill the picture files.
END
Modification Type: | Minor | Last Reviewed: | 8/16/2005 |
---|
Keywords: | KB65749 |
---|
|